From 1f7201fbd3284099be65da457463295e45af0ad9 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 1 Oct 2025 08:58:24 -0500 Subject: [PATCH 001/134] fix(server): Revert update libmimalloc path (#22345) (#22526) * Revert "fix(server): update libmimalloc path (#22345)" This reverts commit 38226fd24041b2e97a0c77124cf4f946824d0a99. * add comments --- server/bin/start.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server/bin/start.sh b/server/bin/start.sh index dc34e8f0bc..0afff4c3a8 100755 --- a/server/bin/start.sh +++ b/server/bin/start.sh @@ -1,12 +1,13 @@ #!/usr/bin/env bash echo "Initializing Immich $IMMICH_SOURCE_REF" -lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3" -if [ -f "$lib_path" ]; then - export LD_PRELOAD="$lib_path" -else - echo "skipping libmimalloc - path not found $lib_path" -fi +# TODO: Update to mimalloc v3 when verified memory isn't released issue is fixed +# lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.3" +# if [ -f "$lib_path" ]; then +# export LD_PRELOAD="$lib_path" +# else +# echo "skipping libmimalloc - path not found $lib_path" +# fi export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/jellyfin-ffmpeg/lib" SERVER_HOME="$(readlink -f "$(dirname "$0")/..")" From b3f38301bf1c87de82a58277e0a894056b8516da Mon Sep 17 00:00:00 2001 From: Guillermo Date: Wed, 1 Oct 2025 16:03:22 +0200 Subject: [PATCH 002/134] fix: missing email button padding (#22529) Signed-off-by: Guillermo Guirao Aguilar --- server/src/emails/album-update.email.tsx | 4 ++-- server/src/emails/components/button.component.tsx | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/emails/album-update.email.tsx b/server/src/emails/album-update.email.tsx index 3bed3a5b36..6fd2abb055 100644 --- a/server/src/emails/album-update.email.tsx +++ b/server/src/emails/album-update.email.tsx @@ -29,8 +29,8 @@ export const AlbumUpdateEmail = ({ - New media has been added to {albumName}, -
check it out! + New media has been added to {albumName}. +
Check it out!
); diff --git a/server/src/emails/components/button.component.tsx b/server/src/emails/components/button.component.tsx index b490e36650..a1fc4636cc 100644 --- a/server/src/emails/components/button.component.tsx +++ b/server/src/emails/components/button.component.tsx @@ -1,12 +1,12 @@ import React from 'react'; -import { Button, ButtonProps } from '@react-email/components'; +import { Button, ButtonProps, Text } from '@react-email/components'; export const ImmichButton = ({ children, ...props }: ButtonProps) => ( ); From 7a4bfc21c9aaede150bc31a51b9cedac178decc0 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 1 Oct 2025 12:30:52 -0400 Subject: [PATCH 003/134] fix(docs): open graph tags (#22542) --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index fd550806f8..d5bd02ca14 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -7,7 +7,7 @@ const prism = require('prism-react-renderer'); const config = { title: 'Immich', tagline: 'High performance self-hosted photo and video backup solution directly from your mobile phone', - url: 'https://immich.app', + url: 'https://docs.immich.app', baseUrl: '/', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', From 7dbdc7a63501f1c67e738e8b60cb9542c9fb0314 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 1 Oct 2025 17:06:22 -0400 Subject: [PATCH 004/134] chore: remove warning banner (#22547) --- docs/docusaurus.config.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index d5bd02ca14..70e0189a00 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -65,11 +65,6 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ - announcementBar: { - id: 'site_announcement_immich', - content: `⚠️ The project is under very active development. Expect bugs and changes. Do not use it as the only way to store your photos and videos!`, - isCloseable: false, - }, docs: { sidebar: { autoCollapseCategories: false, From 83e783bbc26ee77532dbdcc0316888aee3e7d462 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 1 Oct 2025 16:13:38 -0500 Subject: [PATCH 005/134] chore: update readme (#22548) Removed disclaimer section and replaced it with a warning. --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 459cda481c..7f1a05a9a0 100644 --- a/README.md +++ b/README.md @@ -38,12 +38,11 @@ ภาษาไทย

-## Disclaimer -- ⚠️ The project is under **very active** development. -- ⚠️ Expect bugs and breaking changes. -- ⚠️ **Do not use the app as the only way to store your photos and videos.** -- ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos! +> [!WARNING] +> ⚠️ Always follow [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) backup plan for your precious photos and videos! +> + > [!NOTE] > You can find the main documentation, including installation guides, at https://immich.app/. From 1618902ebd9df102bfa9ff7c94e40e356030eabc Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 1 Oct 2025 17:14:51 -0400 Subject: [PATCH 006/134] chore: remove warnings (#22549) --- docs/docs/install/upgrading.md | 4 +--- docs/docs/partials/_server-backup.md | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/docs/install/upgrading.md b/docs/docs/install/upgrading.md index 305e61af57..da95222911 100644 --- a/docs/docs/install/upgrading.md +++ b/docs/docs/install/upgrading.md @@ -4,9 +4,7 @@ sidebar_position: 95 # Upgrading -:::danger Read the release notes -Immich is currently under heavy development, which means you can expect [breaking changes][breaking] and bugs. You should read the release notes prior to updating and take special care when using automated tools like [Watchtower][watchtower]. - +:::tip Breaking changes You can see versions that had breaking changes [here][breaking]. ::: diff --git a/docs/docs/partials/_server-backup.md b/docs/docs/partials/_server-backup.md index 34c93d78a1..34e09670e9 100644 --- a/docs/docs/partials/_server-backup.md +++ b/docs/docs/partials/_server-backup.md @@ -1,7 +1,6 @@ Now that you have imported some pictures, you should setup server backups to preserve your memories. You can do so by following our [backup guide](/administration/backup-and-restore.md). -:::danger -Immich is still under heavy development _and_ handles very important data. -It is essential that you set up good backups, and test them. +:::info +A 3-2-1 backup strategy is still crucial. The team has the responsibility to ensure that the application doesn’t cause loss of your precious memories; however, we cannot guarantee that hard drives will not fail, or an electrical event causes unexpected shutdown of your server/system, leading to data loss. Therefore, we still encourage users to follow best practices when safeguarding their data. Keep multiple copies of your most precious data: at least two local copies and one copy offsite in cold storage. ::: From e4234af3b3bd32f5dd12a2b0808158339deded43 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:19:34 +0000 Subject: [PATCH 007/134] chore: version v2.0.0 --- cli/package.json | 2 +- docs/static/archived-versions.json | 4 ++++ e2e/package.json | 2 +- machine-learning/pyproject.toml | 2 +- mobile/android/fastlane/Fastfile | 4 ++-- mobile/ios/fastlane/Fastfile | 2 +- mobile/openapi/README.md | 2 +- mobile/pubspec.yaml | 2 +- open-api/immich-openapi-specs.json | 2 +- open-api/typescript-sdk/package.json | 2 +- open-api/typescript-sdk/src/fetch-client.ts | 2 +- server/package.json | 2 +- web/package.json | 2 +- 13 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cli/package.json b/cli/package.json index d2ae9063b4..5927435086 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@immich/cli", - "version": "2.2.94", + "version": "2.2.95", "description": "Command Line Interface (CLI) for Immich", "type": "module", "exports": "./dist/index.js", diff --git a/docs/static/archived-versions.json b/docs/static/archived-versions.json index cd3d8e079a..61e6fa2a67 100644 --- a/docs/static/archived-versions.json +++ b/docs/static/archived-versions.json @@ -1,4 +1,8 @@ [ + { + "label": "v2.0.0", + "url": "https://docs.v2.0.0.archive.immich.app" + }, { "label": "v1.144.1", "url": "https://docs.v1.144.1.archive.immich.app" diff --git a/e2e/package.json b/e2e/package.json index 38b9ac949a..d787b741fd 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "immich-e2e", - "version": "1.144.1", + "version": "2.0.0", "description": "", "main": "index.js", "type": "module", diff --git a/machine-learning/pyproject.toml b/machine-learning/pyproject.toml index 3eee4a5e2d..93e8bb3898 100644 --- a/machine-learning/pyproject.toml +++ b/machine-learning/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "immich-ml" -version = "1.144.1" +version = "2.0.0" description = "" authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }] requires-python = ">=3.10,<4.0" diff --git a/mobile/android/fastlane/Fastfile b/mobile/android/fastlane/Fastfile index 25a366957e..f359e3b614 100644 --- a/mobile/android/fastlane/Fastfile +++ b/mobile/android/fastlane/Fastfile @@ -35,8 +35,8 @@ platform :android do task: 'bundle', build_type: 'Release', properties: { - "android.injected.version.code" => 3019, - "android.injected.version.name" => "1.144.1", + "android.injected.version.code" => 3020, + "android.injected.version.name" => "2.0.0", } ) upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') diff --git a/mobile/ios/fastlane/Fastfile b/mobile/ios/fastlane/Fastfile index cd3310e9a2..71d56a98f9 100644 --- a/mobile/ios/fastlane/Fastfile +++ b/mobile/ios/fastlane/Fastfile @@ -22,7 +22,7 @@ platform :ios do path: "./Runner.xcodeproj", ) increment_version_number( - version_number: "1.144.1" + version_number: "2.0.0" ) increment_build_number( build_number: latest_testflight_build_number + 1, diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 84140a882d..47277a15bb 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -3,7 +3,7 @@ Immich API This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 1.144.1 +- API version: 2.0.0 - Generator version: 7.8.0 - Build package: org.openapitools.codegen.languages.DartClientCodegen diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b0b6399b67..6e143c448d 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -2,7 +2,7 @@ name: immich_mobile description: Immich - selfhosted backup media file on mobile phone publish_to: 'none' -version: 1.144.1+3019 +version: 2.0.0+3020 environment: sdk: '>=3.8.0 <4.0.0' diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 9c5e6c6c60..996eeef87e 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -9858,7 +9858,7 @@ "info": { "title": "Immich", "description": "Immich API", - "version": "1.144.1", + "version": "2.0.0", "contact": {} }, "tags": [], diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index ed568efac5..563cdd50fe 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@immich/sdk", - "version": "1.144.1", + "version": "2.0.0", "description": "Auto-generated TypeScript SDK for the Immich API", "type": "module", "main": "./build/index.js", diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 2a786c33f8..ab885eb9c5 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1,6 +1,6 @@ /** * Immich - * 1.144.1 + * 2.0.0 * DO NOT MODIFY - This file has been generated using oazapfts. * See https://www.npmjs.com/package/oazapfts */ diff --git a/server/package.json b/server/package.json index e503989eac..a75da664a4 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "immich", - "version": "1.144.1", + "version": "2.0.0", "description": "", "author": "", "private": true, diff --git a/web/package.json b/web/package.json index 4b9a301e8b..aa8989f851 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "immich-web", - "version": "1.144.1", + "version": "2.0.0", "license": "GNU Affero General Public License version 3", "type": "module", "scripts": { From 9b938d89540921a73d2e17813a712869890c911f Mon Sep 17 00:00:00 2001 From: Kenny at FUTO Date: Wed, 1 Oct 2025 17:24:21 -0500 Subject: [PATCH 008/134] feat(docs): add one-click install docs page (#22553) * feat(docs): add one-click install docs page --- docs/docs/install/one-click.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/docs/install/one-click.md diff --git a/docs/docs/install/one-click.md b/docs/docs/install/one-click.md new file mode 100644 index 0000000000..977b00fec3 --- /dev/null +++ b/docs/docs/install/one-click.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 65 +--- + +# One-Click [Cloud Service] + +:::note +This version of Immich is provided via cloud service provider's one-click marketplaces. Hosting costs are set by the cloud service providers. +Support for these are provided by the individual cloud service providers. + +**Please report issues to the corresponding [Github Repository][github].** +::: + +## Installation + +Simply goto the providers marketplace and choose Immich, then follow the provided instructions. + +## One-Click Immich marketplace providers + +### DigitalOcean + +https://marketplace.digitalocean.com/apps/immich + +### Vultr + +https://www.vultr.com/marketplace/apps/immich + +## Issues + +For issues, open an issue on the associated [GitHub Repository][github]. + +[github]: https://github.com/imagegenius/docker-immich/ From 00ce6354f0c55d78e966ef00320caa8d8e4f4446 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:17:40 +0000 Subject: [PATCH 009/134] chore(deps): update node.js to v22.20.0 (#22496) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/.nvmrc | 2 +- cli/.nvmrc | 2 +- cli/package.json | 2 +- docs/.nvmrc | 2 +- docs/package.json | 2 +- e2e/.nvmrc | 2 +- e2e/package.json | 2 +- mise.toml | 2 +- open-api/typescript-sdk/.nvmrc | 2 +- open-api/typescript-sdk/package.json | 2 +- server/.nvmrc | 2 +- server/package.json | 2 +- web/.nvmrc | 2 +- web/package.json | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/.nvmrc b/.github/.nvmrc index e2228113dd..442c7587a9 100644 --- a/.github/.nvmrc +++ b/.github/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/cli/.nvmrc b/cli/.nvmrc index e2228113dd..442c7587a9 100644 --- a/cli/.nvmrc +++ b/cli/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/cli/package.json b/cli/package.json index 5927435086..ce2dab0bd4 100644 --- a/cli/package.json +++ b/cli/package.json @@ -68,6 +68,6 @@ "micromatch": "^4.0.8" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" } } diff --git a/docs/.nvmrc b/docs/.nvmrc index e2228113dd..442c7587a9 100644 --- a/docs/.nvmrc +++ b/docs/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/docs/package.json b/docs/package.json index 151fe42e25..d984427622 100644 --- a/docs/package.json +++ b/docs/package.json @@ -57,6 +57,6 @@ "node": ">=20" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" } } diff --git a/e2e/.nvmrc b/e2e/.nvmrc index e2228113dd..442c7587a9 100644 --- a/e2e/.nvmrc +++ b/e2e/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/e2e/package.json b/e2e/package.json index d787b741fd..1f9b7d197c 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -52,6 +52,6 @@ "vitest": "^3.0.0" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" } } diff --git a/mise.toml b/mise.toml index 2f98f2e9d5..2008fa5e4a 100644 --- a/mise.toml +++ b/mise.toml @@ -1,5 +1,5 @@ [tools] -node = "22.19.0" +node = "22.20.0" flutter = "3.35.4" pnpm = "10.15.1" diff --git a/open-api/typescript-sdk/.nvmrc b/open-api/typescript-sdk/.nvmrc index e2228113dd..442c7587a9 100644 --- a/open-api/typescript-sdk/.nvmrc +++ b/open-api/typescript-sdk/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 563cdd50fe..5497923a22 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -28,6 +28,6 @@ "directory": "open-api/typescript-sdk" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" } } diff --git a/server/.nvmrc b/server/.nvmrc index e2228113dd..442c7587a9 100644 --- a/server/.nvmrc +++ b/server/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/server/package.json b/server/package.json index a75da664a4..e2845b82ef 100644 --- a/server/package.json +++ b/server/package.json @@ -161,7 +161,7 @@ "vitest": "^3.0.0" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" }, "overrides": { "sharp": "^0.34.3" diff --git a/web/.nvmrc b/web/.nvmrc index e2228113dd..442c7587a9 100644 --- a/web/.nvmrc +++ b/web/.nvmrc @@ -1 +1 @@ -22.19.0 +22.20.0 diff --git a/web/package.json b/web/package.json index aa8989f851..e7edd4e108 100644 --- a/web/package.json +++ b/web/package.json @@ -107,6 +107,6 @@ "vitest": "^3.0.0" }, "volta": { - "node": "22.19.0" + "node": "22.20.0" } } From 5ece0e5e5653733adc67ce94ffdc378deb0f70e1 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:04:59 +0530 Subject: [PATCH 010/134] fix: do not delete asset on share (#22578) fix: do not delete local asset on share Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/lib/repositories/asset_media.repository.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mobile/lib/repositories/asset_media.repository.dart b/mobile/lib/repositories/asset_media.repository.dart index bfcf7060e0..28a4ad661a 100644 --- a/mobile/lib/repositories/asset_media.repository.dart +++ b/mobile/lib/repositories/asset_media.repository.dart @@ -8,6 +8,7 @@ import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/asset.entity.dart' as asset_entity; import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/extensions/platform_extensions.dart'; import 'package:immich_mobile/extensions/response_extensions.dart'; import 'package:immich_mobile/repositories/asset_api.repository.dart'; import 'package:immich_mobile/utils/hash.dart'; @@ -72,6 +73,7 @@ class AssetMediaRepository { // TODO: make this more efficient Future shareAssets(List assets, BuildContext context) async { final downloadedXFiles = []; + final tempFiles = []; for (var asset in assets) { final localId = (asset is LocalAsset) @@ -82,6 +84,9 @@ class AssetMediaRepository { if (localId != null) { File? f = await AssetEntity(id: localId, width: 1, height: 1, typeInt: 0).originFile; downloadedXFiles.add(XFile(f!.path)); + if (CurrentPlatform.isIOS) { + tempFiles.add(f); + } } else if (asset is RemoteAsset) { final tempDir = await getTemporaryDirectory(); final name = asset.name; @@ -95,6 +100,7 @@ class AssetMediaRepository { await tempFile.writeAsBytes(res.bodyBytes); downloadedXFiles.add(XFile(tempFile.path)); + tempFiles.add(tempFile); } else { _log.warning("Asset type not supported for sharing: $asset"); continue; @@ -113,9 +119,9 @@ class AssetMediaRepository { downloadedXFiles, sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)), ).then((result) async { - for (var file in downloadedXFiles) { + for (var file in tempFiles) { try { - await File(file.path).delete(); + await file.delete(); } catch (e) { _log.warning("Failed to delete temporary file: ${file.path}", e); } From 950f268cb00681df218549fb2f6f909b84febbe6 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:08:54 +0530 Subject: [PATCH 011/134] fix: remove new timeline version check (#22584) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/lib/widgets/settings/beta_timeline_list_tile.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart index 326d6c49d1..1fefb3dcfa 100644 --- a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart +++ b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart @@ -1,12 +1,10 @@ import 'package:auto_route/auto_route.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/auth.provider.dart'; -import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/services/app_settings.service.dart'; @@ -16,10 +14,9 @@ class BetaTimelineListTile extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final betaTimelineValue = ref.watch(appSettingsServiceProvider).getSetting(AppSettingsEnum.betaTimeline); - final serverInfo = ref.watch(serverInfoProvider); final auth = ref.watch(authProvider); - if (!auth.isAuthenticated || (serverInfo.serverVersion.minor < 136 && kReleaseMode)) { + if (!auth.isAuthenticated) { return const SizedBox.shrink(); } From a2b25b7a74a9d749b972601b0f4c0d87136285d4 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:11:14 +0530 Subject: [PATCH 012/134] fix: show only owned assets in places and map (#22585) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/lib/domain/services/asset.service.dart | 4 +-- .../lib/domain/services/timeline.service.dart | 3 ++- .../repositories/remote_asset.repository.dart | 6 +++-- .../repositories/timeline.repository.dart | 25 +++++++++++++------ .../bottom_sheet/map_bottom_sheet.widget.dart | 8 +++++- .../infrastructure/asset.provider.dart | 17 ++++++++----- 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/mobile/lib/domain/services/asset.service.dart b/mobile/lib/domain/services/asset.service.dart index 84f675f68b..7f8ade313c 100644 --- a/mobile/lib/domain/services/asset.service.dart +++ b/mobile/lib/domain/services/asset.service.dart @@ -84,8 +84,8 @@ class AssetService { return 1.0; } - Future> getPlaces() { - return _remoteAssetRepository.getPlaces(); + Future> getPlaces(String userId) { + return _remoteAssetRepository.getPlaces(userId); } Future<(int local, int remote)> getAssetCounts() async { diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart index ab623720b7..bf354847c3 100644 --- a/mobile/lib/domain/services/timeline.service.dart +++ b/mobile/lib/domain/services/timeline.service.dart @@ -59,7 +59,8 @@ class TimelineFactory { TimelineService fromAssets(List assets) => TimelineService(_timelineRepository.fromAssets(assets)); - TimelineService map(LatLngBounds bounds) => TimelineService(_timelineRepository.map(bounds, groupBy)); + TimelineService map(String userId, LatLngBounds bounds) => + TimelineService(_timelineRepository.map(userId, bounds, groupBy)); } class TimelineService { diff --git a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart index 092bb728d9..be55c21afc 100644 --- a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart @@ -81,9 +81,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository { .getSingleOrNull(); } - Future> getPlaces() { + Future> getPlaces(String userId) { final asset = Subquery( - _db.remoteAssetEntity.select()..orderBy([(row) => OrderingTerm.desc(row.createdAt)]), + _db.remoteAssetEntity.select() + ..where((row) => row.ownerId.equals(userId)) + ..orderBy([(row) => OrderingTerm.desc(row.createdAt)]), "asset", ); diff --git a/mobile/lib/infrastructure/repositories/timeline.repository.dart b/mobile/lib/infrastructure/repositories/timeline.repository.dart index 14ffafa646..05928d938f 100644 --- a/mobile/lib/infrastructure/repositories/timeline.repository.dart +++ b/mobile/lib/infrastructure/repositories/timeline.repository.dart @@ -431,12 +431,16 @@ class DriftTimelineRepository extends DriftDatabaseRepository { return query.map((row) => row.readTable(_db.remoteAssetEntity).toDto()).get(); } - TimelineQuery map(LatLngBounds bounds, GroupAssetsBy groupBy) => ( - bucketSource: () => _watchMapBucket(bounds, groupBy: groupBy), - assetSource: (offset, count) => _getMapBucketAssets(bounds, offset: offset, count: count), + TimelineQuery map(String userId, LatLngBounds bounds, GroupAssetsBy groupBy) => ( + bucketSource: () => _watchMapBucket(userId, bounds, groupBy: groupBy), + assetSource: (offset, count) => _getMapBucketAssets(userId, bounds, offset: offset, count: count), ); - Stream> _watchMapBucket(LatLngBounds bounds, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { + Stream> _watchMapBucket( + String userId, + LatLngBounds bounds, { + GroupAssetsBy groupBy = GroupAssetsBy.day, + }) { if (groupBy == GroupAssetsBy.none) { // TODO: Support GroupAssetsBy.none throw UnsupportedError("GroupAssetsBy.none is not supported for _watchMapBucket"); @@ -455,7 +459,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository { ), ]) ..where( - _db.remoteExifEntity.inBounds(bounds) & + _db.remoteAssetEntity.ownerId.equals(userId) & + _db.remoteExifEntity.inBounds(bounds) & _db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) & _db.remoteAssetEntity.deletedAt.isNull(), ) @@ -469,7 +474,12 @@ class DriftTimelineRepository extends DriftDatabaseRepository { }).watch(); } - Future> _getMapBucketAssets(LatLngBounds bounds, {required int offset, required int count}) { + Future> _getMapBucketAssets( + String userId, + LatLngBounds bounds, { + required int offset, + required int count, + }) { final query = _db.remoteAssetEntity.select().join([ innerJoin( @@ -479,7 +489,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository { ), ]) ..where( - _db.remoteExifEntity.inBounds(bounds) & + _db.remoteAssetEntity.ownerId.equals(userId) & + _db.remoteExifEntity.inBounds(bounds) & _db.remoteAssetEntity.visibility.equalsValue(AssetVisibility.timeline) & _db.remoteAssetEntity.deletedAt.isNull(), ) diff --git a/mobile/lib/presentation/widgets/bottom_sheet/map_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/map_bottom_sheet.widget.dart index dc5fdbe78d..ac3772a02b 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/map_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/map_bottom_sheet.widget.dart @@ -5,6 +5,7 @@ import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_shee import 'package:immich_mobile/presentation/widgets/map/map.state.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; +import 'package:immich_mobile/providers/user.provider.dart'; class MapBottomSheet extends StatelessWidget { const MapBottomSheet({super.key}); @@ -32,8 +33,13 @@ class _ScopedMapTimeline extends StatelessWidget { return ProviderScope( overrides: [ timelineServiceProvider.overrideWith((ref) { + final user = ref.watch(currentUserProvider); + if (user == null) { + throw Exception('User must be logged in to access archive'); + } + final bounds = ref.watch(mapStateProvider).bounds; - final timelineService = ref.watch(timelineFactoryProvider).map(bounds); + final timelineService = ref.watch(timelineFactoryProvider).map(user.id, bounds); ref.onDispose(timelineService.dispose); return timelineService; }), diff --git a/mobile/lib/providers/infrastructure/asset.provider.dart b/mobile/lib/providers/infrastructure/asset.provider.dart index 102e6aa60c..4b51ce33bd 100644 --- a/mobile/lib/providers/infrastructure/asset.provider.dart +++ b/mobile/lib/providers/infrastructure/asset.provider.dart @@ -3,6 +3,7 @@ import 'package:immich_mobile/domain/services/asset.service.dart'; import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; +import 'package:immich_mobile/providers/user.provider.dart'; final localAssetRepository = Provider( (ref) => DriftLocalAssetRepository(ref.watch(driftProvider)), @@ -19,9 +20,13 @@ final assetServiceProvider = Provider( ), ); -final placesProvider = FutureProvider>( - (ref) => AssetService( - remoteAssetRepository: ref.watch(remoteAssetRepositoryProvider), - localAssetRepository: ref.watch(localAssetRepository), - ).getPlaces(), -); +final placesProvider = FutureProvider>((ref) { + final assetService = ref.watch(assetServiceProvider); + final auth = ref.watch(currentUserProvider); + + if (auth == null) { + return Future.value(const []); + } + + return assetService.getPlaces(auth.id); +}); From 108662345754630c8fc4115ebb54d89178f6a018 Mon Sep 17 00:00:00 2001 From: gablilli <167802854+gablilli@users.noreply.github.com> Date: Thu, 2 Oct 2025 17:42:14 +0200 Subject: [PATCH 013/134] chore: replace immich.app/docs with docs.immich.app globally (#22428) * fix: es * fix(readme): fix docs link * fix(readme): fix main readme's docs link * fix: main readme * fix: replace immich.app/docs with docs.immich.app globally --- README.md | 12 ++++++------ cli/README.md | 2 +- docker/docker-compose.dev.yml | 10 +++++----- docker/docker-compose.prod.yml | 2 +- docker/docker-compose.yml | 4 ++-- docker/example.env | 2 +- docker/hwaccel.ml.yml | 2 +- docker/hwaccel.transcoding.yml | 2 +- mobile/README.md | 2 +- readme_i18n/README_ar_JO.md | 8 ++++---- readme_i18n/README_ca_ES.md | 8 ++++---- readme_i18n/README_de_DE.md | 12 ++++++------ readme_i18n/README_es_ES.md | 10 +++++----- readme_i18n/README_fr_FR.md | 8 ++++---- readme_i18n/README_it_IT.md | 12 ++++++------ readme_i18n/README_ja_JP.md | 8 ++++---- readme_i18n/README_ko_KR.md | 12 ++++++------ readme_i18n/README_nl_NL.md | 10 +++++----- readme_i18n/README_pt_BR.md | 12 ++++++------ readme_i18n/README_ru_RU.md | 12 ++++++------ readme_i18n/README_sv_SE.md | 8 ++++---- readme_i18n/README_th_TH.md | 12 ++++++------ readme_i18n/README_tr_TR.md | 8 ++++---- readme_i18n/README_uk_UA.md | 12 ++++++------ readme_i18n/README_vi_VN.md | 12 ++++++------ readme_i18n/README_zh_CN.md | 12 ++++++------ server/src/services/database.service.ts | 10 +++++----- server/src/services/storage.service.ts | 2 +- .../components/admin-settings/AuthSettings.svelte | 2 +- .../lib/components/admin-settings/MapSettings.svelte | 2 +- .../admin-settings/StorageTemplateSettings.svelte | 4 ++-- web/src/lib/components/layouts/ErrorLayout.svelte | 2 +- .../onboarding-page/onboarding-backup.svelte | 2 +- .../onboarding-storage-template.svelte | 2 +- .../lib/modals/AuthDisableLoginConfirmModal.svelte | 2 +- web/src/lib/modals/HelpAndFeedbackModal.svelte | 2 +- 36 files changed, 122 insertions(+), 122 deletions(-) diff --git a/README.md b/README.md index 7f1a05a9a0..0b9b008bca 100644 --- a/README.md +++ b/README.md @@ -49,14 +49,14 @@ ## Links -- [Documentation](https://immich.app/docs) -- [About](https://immich.app/docs/overview/introduction) -- [Installation](https://immich.app/docs/install/requirements) +- [Documentation](https://docs.immich.app/) +- [About](https://docs.immich.app/overview/introduction) +- [Installation](https://docs.immich.app/install/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Features](#features) -- [Translations](https://immich.app/docs/developer/translations) -- [Contributing](https://immich.app/docs/overview/support-the-project) +- [Translations](https://docs.immich.app/developer/translations) +- [Contributing](https://docs.immich.app/overview/support-the-project) ## Demo @@ -105,7 +105,7 @@ Access the demo [here](https://demo.immich.app). For the mobile app, you can use ## Translations -Read more about translations [here](https://immich.app/docs/developer/translations). +Read more about translations [here](https://docs.immich.app/developer/translations). Translation status diff --git a/cli/README.md b/cli/README.md index 8fa2ace483..ae82e131f4 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,6 +1,6 @@ A command-line interface for interfacing with the self-hosted photo manager [Immich](https://immich.app/). -Please see the [Immich CLI documentation](https://immich.app/docs/features/command-line-interface). +Please see the [Immich CLI documentation](https://docs.immich.app/features/command-line-interface). # For developers diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index bd41ed8d62..eba1f632c1 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -1,5 +1,5 @@ # -# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose +# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose # # Make sure to use the docker-compose.yml of the current release: # @@ -8,8 +8,8 @@ # The compose file on main may not be compatible with the latest release. # For development see: -# - https://immich.app/docs/developer/setup -# - https://immich.app/docs/developer/troubleshooting +# - https://docs.immich.app/developer/setup +# - https://docs.immich.app/developer/troubleshooting name: immich-dev @@ -55,8 +55,8 @@ services: IMMICH_BUILD_IMAGE_URL: https://github.com/immich-app/immich/pkgs/container/immich-server IMMICH_THIRD_PARTY_SOURCE_URL: https://github.com/immich-app/immich/ IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues - IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://immich.app/docs - IMMICH_THIRD_PARTY_SUPPORT_URL: https://immich.app/docs/community-guides + IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://docs.immich.app + IMMICH_THIRD_PARTY_SUPPORT_URL: https://docs.immich.app/community-guides ulimits: nofile: soft: 1048576 diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index dcdfc72c82..e27012cf56 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -1,5 +1,5 @@ # -# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose +# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose # # Make sure to use the docker-compose.yml of the current release: # diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c3ded93ba9..b4ff05f366 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,5 +1,5 @@ # -# WARNING: To install Immich, follow our guide: https://immich.app/docs/install/docker-compose +# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose # # Make sure to use the docker-compose.yml of the current release: # @@ -36,7 +36,7 @@ services: # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} - # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration + # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration # file: hwaccel.ml.yml # service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable volumes: diff --git a/docker/example.env b/docker/example.env index 0450dc0805..6d6fd1e3fe 100644 --- a/docker/example.env +++ b/docker/example.env @@ -1,4 +1,4 @@ -# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables +# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=./library diff --git a/docker/hwaccel.ml.yml b/docker/hwaccel.ml.yml index 111202d022..c95ac7ee4c 100644 --- a/docker/hwaccel.ml.yml +++ b/docker/hwaccel.ml.yml @@ -4,7 +4,7 @@ # you can inline the config for a backend by copying its contents # into the immich-machine-learning service in the docker-compose.yml file. -# See https://immich.app/docs/features/ml-hardware-acceleration for info on usage. +# See https://docs.immich.app/features/ml-hardware-acceleration for info on usage. services: armnn: diff --git a/docker/hwaccel.transcoding.yml b/docker/hwaccel.transcoding.yml index 60ee7e8fa3..0857faf465 100644 --- a/docker/hwaccel.transcoding.yml +++ b/docker/hwaccel.transcoding.yml @@ -4,7 +4,7 @@ # you can inline the config for a backend by copying its contents # into the immich-microservices service in the docker-compose.yml file. -# See https://immich.app/docs/features/hardware-transcoding for more info on using hardware transcoding. +# See https://docs.immich.app/features/hardware-transcoding for more info on using hardware transcoding. services: cpu: {} diff --git a/mobile/README.md b/mobile/README.md index 436b0a4c34..59b2d9340c 100644 --- a/mobile/README.md +++ b/mobile/README.md @@ -84,4 +84,4 @@ Below is how your code needs to be structured: ## Contributing -Please refer to the [architecture](https://immich.app/docs/developer/architecture/) for contributing to the mobile app! +Please refer to the [architecture](https://docs.immich.app/developer/architecture/) for contributing to the mobile app! diff --git a/readme_i18n/README_ar_JO.md b/readme_i18n/README_ar_JO.md index 4e7ba99dd2..b2c195cd3e 100644 --- a/readme_i18n/README_ar_JO.md +++ b/readme_i18n/README_ar_JO.md @@ -46,13 +46,13 @@ ## محتوى -- [الوثائق الرسمية](https://immich.app/docs) +- [الوثائق الرسمية](https://docs.immich.app) - [خريطة الطريق](https://github.com/orgs/immich-app/projects/1) - [تجريبي](#demo) - [سمات](#features) -- [مقدمة](https://immich.app/docs/overview/introduction) -- [تعليمات التحميل](https://immich.app/docs/install/requirements) -- [قواعد المساهمة](https://immich.app/docs/overview/support-the-project) +- [مقدمة](https://docs.immich.app/overview/introduction) +- [تعليمات التحميل](https://docs.immich.app/install/requirements) +- [قواعد المساهمة](https://docs.immich.app/overview/support-the-project) ## توثيق diff --git a/readme_i18n/README_ca_ES.md b/readme_i18n/README_ca_ES.md index 0b8dd5999b..5efcf51aaf 100644 --- a/readme_i18n/README_ca_ES.md +++ b/readme_i18n/README_ca_ES.md @@ -44,13 +44,13 @@ ## Contingut -- [Documentació oficial](https://immich.app/docs) +- [Documentació oficial](https://docs.immich.app) - [Mapa de ruta](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Funcionalitats](#funcionalitats) -- [Introducció](https://immich.app/docs/overview/introduction) -- [Instal·lació](https://immich.app/docs/install/requirements) -- [Directrius de contribució](https://immich.app/docs/overview/support-the-project) +- [Introducció](https://docs.immich.app/overview/introduction) +- [Instal·lació](https://docs.immich.app/install/requirements) +- [Directrius de contribució](https://docs.immich.app/overview/support-the-project) ## Documentació diff --git a/readme_i18n/README_de_DE.md b/readme_i18n/README_de_DE.md index d24818b881..e54a1f0f71 100644 --- a/readme_i18n/README_de_DE.md +++ b/readme_i18n/README_de_DE.md @@ -50,14 +50,14 @@ ## Inhalt -- [Offizielle Dokumentation](https://immich.app/docs) -- [Über Immich](https://immich.app/docs/overview/introduction) -- [Installation](https://immich.app/docs/install/requirements) +- [Offizielle Dokumentation](https://docs.immich.app) +- [Über Immich](https://docs.immich.app/overview/introduction) +- [Installation](https://docs.immich.app/install/requirements) - [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Funktionen](#funktionen) -- [Übersetzungen](https://immich.app/docs/developer/translations) -- [Beitragsrichtlinien](https://immich.app/docs/overview/support-the-project) +- [Übersetzungen](https://docs.immich.app/developer/translations) +- [Beitragsrichtlinien](https://docs.immich.app/overview/support-the-project) ## Demo @@ -107,7 +107,7 @@ Die Web-Demo kannst Du unter https://demo.immich.app finden. Für die Handy-App ## Übersetzungen -Mehr zum Thema Übersetzungen kannst du [hier](https://immich.app/docs/developer/translations) erfahren. +Mehr zum Thema Übersetzungen kannst du [hier](https://docs.immich.app/developer/translations) erfahren. Translation status diff --git a/readme_i18n/README_es_ES.md b/readme_i18n/README_es_ES.md index 00417c9188..0b4da86f71 100644 --- a/readme_i18n/README_es_ES.md +++ b/readme_i18n/README_es_ES.md @@ -45,13 +45,13 @@ ## Contenido -- [Documentación oficial](https://immich.app/docs) +- [Documentación oficial](https://docs.immich.app) - [Hoja de ruta](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Funciones](#funciones) -- [Introducción](https://immich.app/docs/overview/introduction) -- [Instalación](https://immich.app/docs/install/requirements) -- [Directrices para contribuir](https://immich.app/docs/overview/support-the-project) +- [Introducción](https://docs.immich.app/overview/introduction) +- [Instalación](https://docs.immich.app/install/requirements) +- [Directrices para contribuir](https://docs.immich.app/overview/support-the-project) ## Documentación @@ -99,7 +99,7 @@ contraseña: demo ## Traducciones -Lea mas acerca de las traducciones [acá](https://immich.app/docs/developer/translations). +Lea mas acerca de las traducciones [acá](https://docs.immich.app/developer/translations). Translation status diff --git a/readme_i18n/README_fr_FR.md b/readme_i18n/README_fr_FR.md index e1d4fb1cbc..ae565571f8 100644 --- a/readme_i18n/README_fr_FR.md +++ b/readme_i18n/README_fr_FR.md @@ -45,13 +45,13 @@ ## Sommaire -- [Documentation officielle](https://immich.app/docs) +- [Documentation officielle](https://docs.immich.app) - [Feuille de route](https://github.com/orgs/immich-app/projects/1) - [Démo](#démo) - [Fonctionnalités](#fonctionnalités) -- [Introduction](https://immich.app/docs/overview/introduction) -- [Installation](https://immich.app/docs/install/requirements) -- [Contribution](https://immich.app/docs/overview/support-the-project) +- [Introduction](https://docs.immich.app/overview/introduction) +- [Installation](https://docs.immich.app/install/requirements) +- [Contribution](https://docs.immich.app/overview/support-the-project) ## Documentation diff --git a/readme_i18n/README_it_IT.md b/readme_i18n/README_it_IT.md index 5a368fe1f9..656b392616 100644 --- a/readme_i18n/README_it_IT.md +++ b/readme_i18n/README_it_IT.md @@ -49,14 +49,14 @@ ## Link utili -- [Documentazione](https://immich.app/docs) -- [Informazioni](https://immich.app/docs/overview/introduction) -- [Installazione](https://immich.app/docs/install/requirements) +- [Documentazione](https://docs.immich.app) +- [Informazioni](https://docs.immich.app/overview/introduction) +- [Installazione](https://docs.immich.app/install/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Funzionalità](#funzionalità) -- [Traduzioni](https://immich.app/docs/developer/translations) -- [Contribuire](https://immich.app/docs/overview/support-the-project) +- [Traduzioni](https://docs.immich.app/developer/translations) +- [Contribuire](https://docs.immich.app/overview/support-the-project) ## Demo @@ -106,7 +106,7 @@ Per l’app mobile puoi usare `https://demo.immich.app` come `Server Endpoint UR ## Traduzioni -Scopri di più sulle traduzioni [qui](https://immich.app/docs/developer/translations). +Scopri di più sulle traduzioni [qui](https://docs.immich.app/developer/translations). Stato traduzioni diff --git a/readme_i18n/README_ja_JP.md b/readme_i18n/README_ja_JP.md index 60dd0f3ed7..a6fa4953af 100644 --- a/readme_i18n/README_ja_JP.md +++ b/readme_i18n/README_ja_JP.md @@ -44,13 +44,13 @@ ## コンテンツ -- [公式ドキュメント](https://immich.app/docs) +- [公式ドキュメント](https://docs.immich.app) - [ロードマップ](https://github.com/orgs/immich-app/projects/1) - [デモ](#デモ) - [機能](#機能) -- [紹介](https://immich.app/docs/overview/introduction) -- [インストール](https://immich.app/docs/install/requirements) -- [コントリビューションガイド](https://immich.app/docs/overview/support-the-project) +- [紹介](https://docs.immich.app/overview/introduction) +- [インストール](https://docs.immich.app/install/requirements) +- [コントリビューションガイド](https://docs.immich.app/overview/support-the-project) ## ドキュメント diff --git a/readme_i18n/README_ko_KR.md b/readme_i18n/README_ko_KR.md index 031e2fd9ca..f4feb29fcc 100644 --- a/readme_i18n/README_ko_KR.md +++ b/readme_i18n/README_ko_KR.md @@ -50,14 +50,14 @@ ## 링크 -- [문서](https://immich.app/docs) -- [소개](https://immich.app/docs/overview/introduction) -- [설치](https://immich.app/docs/install/requirements) +- [문서](https://docs.immich.app) +- [소개](https://docs.immich.app/overview/introduction) +- [설치](https://docs.immich.app/install/requirements) - [로드맵](https://immich.app/roadmap) - [데모](#데모) - [기능](#기능) -- [번역](https://immich.app/docs/developer/tranlations) -- [기여](https://immich.app/docs/overview/support-the-project) +- [번역](https://docs.immich.app/developer/tranlations) +- [기여](https://docs.immich.app/overview/support-the-project) ## 데모 @@ -104,7 +104,7 @@ ## 번역 -번역에 대한 자세한 정보는 [이곳](https://immich.app/docs/developer/translations)에서 확인하세요. +번역에 대한 자세한 정보는 [이곳](https://docs.immich.app/developer/translations)에서 확인하세요. 번역 현황 diff --git a/readme_i18n/README_nl_NL.md b/readme_i18n/README_nl_NL.md index 46692bc612..0400442bb4 100644 --- a/readme_i18n/README_nl_NL.md +++ b/readme_i18n/README_nl_NL.md @@ -45,13 +45,13 @@ ## Inhoud -- [Officiële documentatie](https://immich.app/docs) +- [Officiële documentatie](https://docs.immich.app) - [Toekomstplannen](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Functies](#functies) -- [Introductie](https://immich.app/docs/overview/introduction) -- [Installatie](https://immich.app/docs/install/requirements) -- [Richtlijnen voor bijdragen](https://immich.app/docs/overview/support-the-project) +- [Introductie](https://docs.immich.app/overview/introduction) +- [Installatie](https://docs.immich.app/install/requirements) +- [Richtlijnen voor bijdragen](https://docs.immich.app/overview/support-the-project) ## Documentatie @@ -102,7 +102,7 @@ Je kunt de demo [hier](https://demo.immich.app/) bekijken. Voor de mobiele app k ## Vertalingen -Je kunt [hier](https://immich.app/docs/developer/translations) meer over vertalingen lezen. +Je kunt [hier](https://docs.immich.app/developer/translations) meer over vertalingen lezen. ## Repository activiteit diff --git a/readme_i18n/README_pt_BR.md b/readme_i18n/README_pt_BR.md index 2320e8fd6f..240fe4d2e2 100644 --- a/readme_i18n/README_pt_BR.md +++ b/readme_i18n/README_pt_BR.md @@ -55,14 +55,14 @@ ## Links -- [Documentação](https://immich.app/docs) -- [Sobre](https://immich.app/docs/overview/introduction) -- [Instalação](https://immich.app/docs/install/requirements) +- [Documentação](https://docs.immich.app) +- [Sobre](https://docs.immich.app/overview/introduction) +- [Instalação](https://docs.immich.app/install/requirements) - [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Demonstração](#demonstração) - [Funcionalidades](#funcionalidades) -- [Traduções](https://immich.app/docs/developer/translations) -- [Diretrizes de Contribuição](https://immich.app/docs/overview/support-the-project) +- [Traduções](https://docs.immich.app/developer/translations) +- [Diretrizes de Contribuição](https://docs.immich.app/overview/support-the-project) ## Demonstração @@ -115,7 +115,7 @@ Acesse a demonstração [aqui](https://demo.immich.app). No aplicativo para disp ## Traduções Leia mais sobre as traduções -[aqui](https://immich.app/docs/developer/translations). +[aqui](https://docs.immich.app/developer/translations). Status da tradução diff --git a/readme_i18n/README_ru_RU.md b/readme_i18n/README_ru_RU.md index be97259acc..d774fae84c 100644 --- a/readme_i18n/README_ru_RU.md +++ b/readme_i18n/README_ru_RU.md @@ -51,14 +51,14 @@ ## Содержание -- [Официальная документация](https://immich.app/docs) -- [Введение](https://immich.app/docs/overview/introduction) -- [Установка](https://immich.app/docs/install/requirements) +- [Официальная документация](https://docs.immich.app) +- [Введение](https://docs.immich.app/overview/introduction) +- [Установка](https://docs.immich.app/install/requirements) - [План разработки](https://github.com/orgs/immich-app/projects/1) - [Демо](#demo) - [Возможности](#features) -- [Перевод](https://immich.app/docs/developer/translations) -- [Гид по участию и поддержке проекта](https://immich.app/docs/overview/support-the-project) +- [Перевод](https://docs.immich.app/developer/translations) +- [Гид по участию и поддержке проекта](https://docs.immich.app/overview/support-the-project) ## Демо @@ -107,7 +107,7 @@ ## Перевод -Всё про перевод проекта [Здесь](https://immich.app/docs/developer/translations). +Всё про перевод проекта [Здесь](https://docs.immich.app/developer/translations). Translation status diff --git a/readme_i18n/README_sv_SE.md b/readme_i18n/README_sv_SE.md index daa68b9874..24c08fa8df 100644 --- a/readme_i18n/README_sv_SE.md +++ b/readme_i18n/README_sv_SE.md @@ -46,13 +46,13 @@ ## Innehåll -- [Officiell Dokumentation](https://immich.app/docs) +- [Officiell Dokumentation](https://docs.immich.app) - [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Funktioner](#features) -- [Introduktion](https://immich.app/docs/overview/introduction) -- [Installation](https://immich.app/docs/install/requirements) -- [Riktlinjer för Bidrag](https://immich.app/docs/overview/support-the-project) +- [Introduktion](https://docs.immich.app/overview/introduction) +- [Installation](https://docs.immich.app/install/requirements) +- [Riktlinjer för Bidrag](https://docs.immich.app/overview/support-the-project) ## Dokumentation diff --git a/readme_i18n/README_th_TH.md b/readme_i18n/README_th_TH.md index bdb6db868d..8d34261281 100644 --- a/readme_i18n/README_th_TH.md +++ b/readme_i18n/README_th_TH.md @@ -52,14 +52,14 @@ ## ลิงก์ -- [คู่มือ](https://immich.app/docs) -- [เกี่ยวกับ](https://immich.app/docs/overview/introduction) -- [การติดตั้ง](https://immich.app/docs/install/requirements) +- [คู่มือ](https://docs.immich.app) +- [เกี่ยวกับ](https://docs.immich.app/overview/introduction) +- [การติดตั้ง](https://docs.immich.app/install/requirements) - [โรดแมป](https://immich.app/roadmap) - [สาธิต](#สาธิต) - [คุณสมบัติ](#คุณสมบัติ) -- [การแปลภาษา](https://immich.app/docs/developer/translations) -- [สนับสนุนโพรเจกต์](https://immich.app/docs/overview/support-the-project) +- [การแปลภาษา](https://docs.immich.app/developer/translations) +- [สนับสนุนโพรเจกต์](https://docs.immich.app/overview/support-the-project) ## สาธิต @@ -106,7 +106,7 @@ ## การแปลภาษา -อ่านเพิ่มเติมเกี่ยวกับการแปล [ที่นี่](https://immich.app/docs/developer/translations) +อ่านเพิ่มเติมเกี่ยวกับการแปล [ที่นี่](https://docs.immich.app/developer/translations) สถานะการแปล diff --git a/readme_i18n/README_tr_TR.md b/readme_i18n/README_tr_TR.md index 6285ab55a2..930d750b88 100644 --- a/readme_i18n/README_tr_TR.md +++ b/readme_i18n/README_tr_TR.md @@ -44,13 +44,13 @@ ## Content -- [Resmi Belgeler](https://immich.app/docs) +- [Resmi Belgeler](https://docs.immich.app) - [Yol Haritası](https://github.com/orgs/immich-app/projects/1) - [Demo](#demo) - [Özellikler](#özellikler) -- [Giriş](https://immich.app/docs/overview/introduction) -- [Kurulum](https://immich.app/docs/install/requirements) -- [Katkı Sağlama Rehberi](https://immich.app/docs/overview/support-the-project) +- [Giriş](https://docs.immich.app/overview/introduction) +- [Kurulum](https://docs.immich.app/install/requirements) +- [Katkı Sağlama Rehberi](https://docs.immich.app/overview/support-the-project) ## Belgeler diff --git a/readme_i18n/README_uk_UA.md b/readme_i18n/README_uk_UA.md index 33687bbc50..f236d49091 100644 --- a/readme_i18n/README_uk_UA.md +++ b/readme_i18n/README_uk_UA.md @@ -50,14 +50,14 @@ ## Посилання -- [Документація](https://immich.app/docs) -- [Про проєкт](https://immich.app/docs/overview/introduction) -- [Встановлення](https://immich.app/docs/install/requirements) +- [Документація](https://docs.immich.app) +- [Про проєкт](https://docs.immich.app/overview/introduction) +- [Встановлення](https://docs.immich.app/install/requirements) - [Дорожня карта](https://immich.app/roadmap) - [Демо](#демо) - [Функції](#функції) -- [Переклади](https://immich.app/docs/developer/translations) -- [Гід для розробки проєкту](https://immich.app/docs/overview/support-the-project) +- [Переклади](https://docs.immich.app/developer/translations) +- [Гід для розробки проєкту](https://docs.immich.app/overview/support-the-project) ## Демо @@ -106,7 +106,7 @@ ## Переклади -Більше про переклади [тут](https://immich.app/docs/developer/translations). +Більше про переклади [тут](https://docs.immich.app/developer/translations). Статус перекладів diff --git a/readme_i18n/README_vi_VN.md b/readme_i18n/README_vi_VN.md index fd04bd9fa1..f74e7c3771 100644 --- a/readme_i18n/README_vi_VN.md +++ b/readme_i18n/README_vi_VN.md @@ -52,14 +52,14 @@ ## Liên kết -- [Tài liệu](https://immich.app/docs) -- [Giới thiệu](https://immich.app/docs/overview/introduction) -- [Cài đặt](https://immich.app/docs/install/requirements) +- [Tài liệu](https://docs.immich.app) +- [Giới thiệu](https://docs.immich.app/overview/introduction) +- [Cài đặt](https://docs.immich.app/install/requirements) - [Lộ trình](https://immich.app/roadmap) - [Demo](#demo) - [Tính năng](#Tính-năng) -- [Dịch thuật](https://immich.app/docs/developer/translations) -- [Đóng góp](https://immich.app/docs/overview/support-the-project) +- [Dịch thuật](https://docs.immich.app/developer/translations) +- [Đóng góp](https://docs.immich.app/overview/support-the-project) ## Demo @@ -106,7 +106,7 @@ Truy cập bản demo [tại đây](https://demo.immich.app). Đối với ứng ## Dịch thuật -Đọc thêm về dịch thuật [tại đây](https://immich.app/docs/developer/translations). +Đọc thêm về dịch thuật [tại đây](https://docs.immich.app/developer/translations). Tình trạng dịch thuật diff --git a/readme_i18n/README_zh_CN.md b/readme_i18n/README_zh_CN.md index 5151e35379..c95631db89 100644 --- a/readme_i18n/README_zh_CN.md +++ b/readme_i18n/README_zh_CN.md @@ -54,14 +54,14 @@ ## 目录 -- [官方文档](https://immich.app/docs) -- [项目总览](https://immich.app/docs/overview/introduction) -- [安装教程](https://immich.app/docs/install/requirements) +- [官方文档](https://docs.immich.app) +- [项目总览](https://docs.immich.app/overview/introduction) +- [安装教程](https://docs.immich.app/install/requirements) - [路线图](https://immich.app/roadmap) - [在线演示](#示例) - [功能特性](#功能特性) -- [多语言](https://immich.app/docs/developer/translations) -- [贡献者](https://immich.app/docs/overview/support-the-project) +- [多语言](https://docs.immich.app/developer/translations) +- [贡献者](https://docs.immich.app/overview/support-the-project) ## 示例 @@ -110,7 +110,7 @@ ## 多语言 -关于翻译的更多信息请参见[此处](https://immich.app/docs/developer/translations)。 +关于翻译的更多信息请参见[此处](https://docs.immich.app/developer/translations)。 翻译进度 diff --git a/server/src/services/database.service.ts b/server/src/services/database.service.ts index 758198a197..2ff0e0ca27 100644 --- a/server/src/services/database.service.ts +++ b/server/src/services/database.service.ts @@ -22,7 +22,7 @@ const messages = { The ${name} extension version is ${version}, which means it is a nightly release. Please run 'DROP EXTENSION IF EXISTS ${extension}' and switch to a release version. - See https://immich.app/docs/guides/database-queries for how to query the database.`, + See https://docs.immich.app/guides/database-queries for how to query the database.`, outOfRange: ({ name, version, range }: OutOfRangeArgs) => `The ${name} extension version is ${version}, but Immich only supports ${range}. Please change ${name} to a compatible version in the Postgres instance.`, @@ -32,20 +32,20 @@ const messages = { If the Postgres instance already has ${name} installed, Immich may not have the necessary permissions to activate it. In this case, please run 'CREATE EXTENSION IF NOT EXISTS ${extension} CASCADE' manually as a superuser. - See https://immich.app/docs/guides/database-queries for how to query the database.`, + See https://docs.immich.app/guides/database-queries for how to query the database.`, updateFailed: ({ name, extension, availableVersion }: UpdateFailedArgs) => `The ${name} extension can be updated to ${availableVersion}. Immich attempted to update the extension, but failed to do so. This may be because Immich does not have the necessary permissions to update the extension. Please run 'ALTER EXTENSION ${extension} UPDATE' manually as a superuser. - See https://immich.app/docs/guides/database-queries for how to query the database.`, + See https://docs.immich.app/guides/database-queries for how to query the database.`, dropFailed: ({ name, extension }: DropFailedArgs) => `The ${name} extension is no longer needed, but could not be dropped. This may be because Immich does not have the necessary permissions to drop the extension. Please run 'DROP EXTENSION ${extension};' manually as a superuser. - See https://immich.app/docs/guides/database-queries for how to query the database.`, + See https://docs.immich.app/guides/database-queries for how to query the database.`, restartRequired: ({ name, availableVersion }: RestartRequiredArgs) => `The ${name} extension has been updated to ${availableVersion}. Please restart the Postgres instance to complete the update.`, @@ -55,7 +55,7 @@ const messages = { If ${name} ${installedVersion} is compatible with Immich, please ensure the Postgres instance has this available.`, deprecatedExtension: (name: string) => `DEPRECATION WARNING: The ${name} extension is deprecated and support for it will be removed very soon. - See https://immich.app/docs/install/upgrading#migrating-to-vectorchord in order to switch to the VectorChord extension instead.`, + See https://docs.immich.app/install/upgrading#migrating-to-vectorchord in order to switch to the VectorChord extension instead.`, }; @Injectable() diff --git a/server/src/services/storage.service.ts b/server/src/services/storage.service.ts index b983c34f62..50dffd5465 100644 --- a/server/src/services/storage.service.ts +++ b/server/src/services/storage.service.ts @@ -15,7 +15,7 @@ import { BaseService } from 'src/services/base.service'; import { JobOf, SystemFlags } from 'src/types'; import { ImmichStartupError } from 'src/utils/misc'; -const docsMessage = `Please see https://immich.app/docs/administration/system-integrity#folder-checks for more information.`; +const docsMessage = `Please see https://docs.immich.app/administration/system-integrity#folder-checks for more information.`; @Injectable() export class StorageService extends BaseService { diff --git a/web/src/lib/components/admin-settings/AuthSettings.svelte b/web/src/lib/components/admin-settings/AuthSettings.svelte index d7b73430e3..dbc96ac02a 100644 --- a/web/src/lib/components/admin-settings/AuthSettings.svelte +++ b/web/src/lib/components/admin-settings/AuthSettings.svelte @@ -86,7 +86,7 @@ {#snippet children({ message })} {#snippet children({ message })} {:else if tag === 'implications-link'} {#snippet children({ message })} {#snippet children({ message })} - {message} + {message} {/snippet}

diff --git a/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte b/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte index 35d6ae2e83..7199decfd9 100644 --- a/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte +++ b/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte @@ -19,7 +19,7 @@ {#snippet children({ message })} {$t('official_immich_resources')}

- +

{$t('documentation')} From ca8a6e5f9502a3d65f3009210aa18e2464c2c483 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 2 Oct 2025 11:25:40 -0500 Subject: [PATCH 014/134] fix: show activity in shared albunm (#22589) --- .../repositories/remote_album.repository.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mobile/lib/infrastructure/repositories/remote_album.repository.dart b/mobile/lib/infrastructure/repositories/remote_album.repository.dart index 5dfe4ac9b3..22d4715c1e 100644 --- a/mobile/lib/infrastructure/repositories/remote_album.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_album.repository.dart @@ -62,7 +62,7 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository { .toDto( assetCount: row.read(assetCount) ?? 0, ownerName: row.read(_db.userEntity.name)!, - isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 2, + isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 0, ), ) .get(); @@ -107,7 +107,7 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository { .toDto( assetCount: row.read(assetCount) ?? 0, ownerName: row.read(_db.userEntity.name)!, - isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 2, + isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 0, ), ) .getSingleOrNull(); @@ -305,8 +305,9 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository { .readTable(_db.remoteAlbumEntity) .toDto( ownerName: row.read(_db.userEntity.name)!, - isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 2, + isShared: row.read(_db.remoteAlbumUserEntity.userId.count(distinct: true))! > 0, ); + return album; }).watchSingleOrNull(); } From 7dc9cb121f5f6a061db7be447f23994da7d3a1cd Mon Sep 17 00:00:00 2001 From: Kenny at FUTO Date: Thu, 2 Oct 2025 11:26:59 -0500 Subject: [PATCH 015/134] fix(docs): one-click doc fixes (#22554) Co-authored-by: Alex --- docs/docs/install/one-click.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/install/one-click.md b/docs/docs/install/one-click.md index 977b00fec3..53fcb20d21 100644 --- a/docs/docs/install/one-click.md +++ b/docs/docs/install/one-click.md @@ -5,7 +5,7 @@ sidebar_position: 65 # One-Click [Cloud Service] :::note -This version of Immich is provided via cloud service provider's one-click marketplaces. Hosting costs are set by the cloud service providers. +This version of Immich is provided via cloud service providers' one-click marketplaces. Hosting costs are set by the cloud service providers. Support for these are provided by the individual cloud service providers. **Please report issues to the corresponding [Github Repository][github].** @@ -13,7 +13,7 @@ Support for these are provided by the individual cloud service providers. ## Installation -Simply goto the providers marketplace and choose Immich, then follow the provided instructions. +Go to the provider's marketplace and choose Immich, then follow the provided instructions. ## One-Click Immich marketplace providers @@ -29,4 +29,4 @@ https://www.vultr.com/marketplace/apps/immich For issues, open an issue on the associated [GitHub Repository][github]. -[github]: https://github.com/imagegenius/docker-immich/ +[github]: https://github.com/immich-app/immich/ From 28958ba48a8936b345b1bfcb70de59cc3370f155 Mon Sep 17 00:00:00 2001 From: Yaros Date: Thu, 2 Oct 2025 18:35:43 +0200 Subject: [PATCH 016/134] fix(mobile): compass button overlaps status bar (#22330) * fix(mobile): compass button overlaps status bar * fix(mobile): disable rotation for map --------- Co-authored-by: Alex --- mobile/lib/presentation/widgets/map/map.widget.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/presentation/widgets/map/map.widget.dart b/mobile/lib/presentation/widgets/map/map.widget.dart index 1d285f0441..c1d5bf6464 100644 --- a/mobile/lib/presentation/widgets/map/map.widget.dart +++ b/mobile/lib/presentation/widgets/map/map.widget.dart @@ -185,6 +185,8 @@ class _Map extends StatelessWidget { initialCameraPosition: initialLocation == null ? const CameraPosition(target: LatLng(0, 0), zoom: 0) : CameraPosition(target: initialLocation, zoom: MapUtils.mapZoomToAssetLevel), + compassEnabled: false, + rotateGesturesEnabled: false, styleString: style, onMapCreated: onMapCreated, onStyleLoadedCallback: onMapReady, From 2594cd47ab072ee6ca5826931c18a7b29ba44963 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Thu, 2 Oct 2025 15:19:14 -0500 Subject: [PATCH 017/134] fix: shrink age view to fit and not overflow (#22405) Co-authored-by: Alex --- .../bottom_sheet/sheet_people_details.widget.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet/sheet_people_details.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet/sheet_people_details.widget.dart index fee34bca1b..64f22eca92 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet/sheet_people_details.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet/sheet_people_details.widget.dart @@ -11,8 +11,8 @@ import 'package:immich_mobile/providers/infrastructure/people.provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/services/api.service.dart'; -import 'package:immich_mobile/utils/people.utils.dart'; import 'package:immich_mobile/utils/image_url_builder.dart'; +import 'package:immich_mobile/utils/people.utils.dart'; class SheetPeopleDetails extends ConsumerStatefulWidget { const SheetPeopleDetails({super.key}); @@ -158,11 +158,14 @@ class _PeopleAvatar extends StatelessWidget { maxLines: 1, ), if (person.birthDate != null) - Text( - formatAge(person.birthDate!, assetFileCreatedAt), - textAlign: TextAlign.center, - style: context.textTheme.bodyMedium?.copyWith( - color: context.textTheme.bodyMedium?.color?.withAlpha(175), + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + formatAge(person.birthDate!, assetFileCreatedAt), + textAlign: TextAlign.center, + style: context.textTheme.bodyMedium?.copyWith( + color: context.textTheme.bodyMedium?.color?.withAlpha(175), + ), ), ), ], From 3af0f0c8ad1d7e202de34b6c26cffc0a6d2e52e4 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 2 Oct 2025 15:22:14 -0500 Subject: [PATCH 018/134] chore: post release tasks (#22587) --- mobile/ios/Runner.xcodeproj/project.pbxproj | 18 +++++++++--------- mobile/ios/Runner/Info.plist | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 09f749bcd2..6403a0ab4b 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -705,7 +705,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -849,7 +849,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -879,7 +879,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -913,7 +913,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -956,7 +956,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -996,7 +996,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -1035,7 +1035,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1079,7 +1079,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1120,7 +1120,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 227; + CURRENT_PROJECT_VERSION = 230; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist index f32980bb38..e9912f260c 100644 --- a/mobile/ios/Runner/Info.plist +++ b/mobile/ios/Runner/Info.plist @@ -80,7 +80,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.144.0 + 2.0.0 CFBundleSignature ???? CFBundleURLTypes @@ -107,7 +107,7 @@ CFBundleVersion - 227 + 230 FLTEnableImpeller ITSAppUsesNonExemptEncryption From 60b1faac0f7f6afc25038e83e500b670119f645c Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 3 Oct 2025 09:18:17 +0530 Subject: [PATCH 019/134] chore: clean auth-user entity on reset (#22583) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../lib/infrastructure/repositories/sync_stream.repository.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart index f4720fb110..3f74fe25d1 100644 --- a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart +++ b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart @@ -51,6 +51,7 @@ class SyncStreamRepository extends DriftDatabaseRepository { await _db.remoteAssetEntity.deleteAll(); await _db.remoteExifEntity.deleteAll(); await _db.stackEntity.deleteAll(); + await _db.authUserEntity.deleteAll(); await _db.userEntity.deleteAll(); await _db.userMetadataEntity.deleteAll(); }); From 3c5a12576299a081cd56033a1b09d2ac017b4f7b Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 3 Oct 2025 08:27:28 -0500 Subject: [PATCH 020/134] fix: mitigate database lock scenario when running full sync in splash screen page (#22608) --- mobile/lib/pages/common/splash_screen.page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/pages/common/splash_screen.page.dart b/mobile/lib/pages/common/splash_screen.page.dart index 5147ba8f45..3b81368cd4 100644 --- a/mobile/lib/pages/common/splash_screen.page.dart +++ b/mobile/lib/pages/common/splash_screen.page.dart @@ -64,7 +64,7 @@ class SplashScreenPageState extends ConsumerState { if (Store.isBetaTimelineEnabled) { bool syncSuccess = false; await Future.wait([ - backgroundManager.syncLocal(full: true), + backgroundManager.syncLocal(), backgroundManager.syncRemote().then((success) => syncSuccess = success), ]); From 212649edf92edd8066b339c2049bda4692bb6351 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 3 Oct 2025 19:06:44 +0530 Subject: [PATCH 021/134] fix: improve sync backup error indicator (#22527) * fix: improve sync indicator error * prefer backup disabled icon before error --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- mobile/lib/domain/utils/background_sync.dart | 14 ++- .../lib/pages/backup/drift_backup.page.dart | 4 - .../drift_backup_album_selection.page.dart | 1 - .../backup/drift_backup_options.page.dart | 1 - .../lib/pages/common/splash_screen.page.dart | 1 - .../providers/app_life_cycle.provider.dart | 1 - .../providers/background_sync.provider.dart | 13 ++- .../widgets/common/immich_sliver_app_bar.dart | 104 ++++++++++-------- 8 files changed, 81 insertions(+), 58 deletions(-) diff --git a/mobile/lib/domain/utils/background_sync.dart b/mobile/lib/domain/utils/background_sync.dart index b2f2fe54e1..38e249b9f1 100644 --- a/mobile/lib/domain/utils/background_sync.dart +++ b/mobile/lib/domain/utils/background_sync.dart @@ -6,11 +6,12 @@ import 'package:immich_mobile/utils/isolate.dart'; import 'package:worker_manager/worker_manager.dart'; typedef SyncCallback = void Function(); +typedef SyncCallbackWithResult = void Function(T result); typedef SyncErrorCallback = void Function(String error); class BackgroundSyncManager { final SyncCallback? onRemoteSyncStart; - final SyncCallback? onRemoteSyncComplete; + final SyncCallbackWithResult? onRemoteSyncComplete; final SyncErrorCallback? onRemoteSyncError; final SyncCallback? onLocalSyncStart; @@ -156,15 +157,18 @@ class BackgroundSyncManager { debugLabel: 'remote-sync', ); return _syncTask! - .then((result) => result ?? false) - .whenComplete(() { - onRemoteSyncComplete?.call(); - _syncTask = null; + .then((result) { + final success = result ?? false; + onRemoteSyncComplete?.call(success); + return success; }) .catchError((error) { onRemoteSyncError?.call(error.toString()); _syncTask = null; return false; + }) + .whenComplete(() { + _syncTask = null; }); } diff --git a/mobile/lib/pages/backup/drift_backup.page.dart b/mobile/lib/pages/backup/drift_backup.page.dart index 5a2cab8dd6..2e7c3e946c 100644 --- a/mobile/lib/pages/backup/drift_backup.page.dart +++ b/mobile/lib/pages/backup/drift_backup.page.dart @@ -49,9 +49,6 @@ class _DriftBackupPageState extends ConsumerState { ref.read(driftBackupProvider.notifier).updateSyncing(true); syncSuccess = await ref.read(backgroundSyncProvider).syncRemote(); - ref - .read(driftBackupProvider.notifier) - .updateError(syncSuccess == true ? BackupError.none : BackupError.syncFailed); ref.read(driftBackupProvider.notifier).updateSyncing(false); if (mounted) { @@ -94,7 +91,6 @@ class _DriftBackupPageState extends ConsumerState { if (syncSuccess == false) { Logger("DriftBackupPage").warning("Remote sync did not complete successfully, skipping backup"); - backupNotifier.updateError(BackupError.syncFailed); return; } await backupNotifier.startBackup(currentUser.id); diff --git a/mobile/lib/pages/backup/drift_backup_album_selection.page.dart b/mobile/lib/pages/backup/drift_backup_album_selection.page.dart index d49f71ce52..cae9f0a408 100644 --- a/mobile/lib/pages/backup/drift_backup_album_selection.page.dart +++ b/mobile/lib/pages/backup/drift_backup_album_selection.page.dart @@ -120,7 +120,6 @@ class _DriftBackupAlbumSelectionPageState extends ConsumerState { _resumeBackup(backupProvider), ]); } else { - backupProvider.updateError(BackupError.syncFailed); await backgroundManager.hashAssets(); } diff --git a/mobile/lib/providers/app_life_cycle.provider.dart b/mobile/lib/providers/app_life_cycle.provider.dart index 29de09fd33..3b51874ab5 100644 --- a/mobile/lib/providers/app_life_cycle.provider.dart +++ b/mobile/lib/providers/app_life_cycle.provider.dart @@ -161,7 +161,6 @@ class AppLifeCycleNotifier extends StateNotifier { _resumeBackup(), ]); } else { - _ref.read(driftBackupProvider.notifier).updateError(BackupError.syncFailed); await _safeRun(backgroundManager.hashAssets(), "hashAssets"); } diff --git a/mobile/lib/providers/background_sync.provider.dart b/mobile/lib/providers/background_sync.provider.dart index e6e83b64df..a61cd93022 100644 --- a/mobile/lib/providers/background_sync.provider.dart +++ b/mobile/lib/providers/background_sync.provider.dart @@ -1,12 +1,21 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/utils/background_sync.dart'; +import 'package:immich_mobile/providers/backup/drift_backup.provider.dart'; import 'package:immich_mobile/providers/sync_status.provider.dart'; final backgroundSyncProvider = Provider((ref) { final syncStatusNotifier = ref.read(syncStatusProvider.notifier); + final backupProvider = ref.read(driftBackupProvider.notifier); + final manager = BackgroundSyncManager( - onRemoteSyncStart: syncStatusNotifier.startRemoteSync, - onRemoteSyncComplete: syncStatusNotifier.completeRemoteSync, + onRemoteSyncStart: () { + syncStatusNotifier.startRemoteSync(); + backupProvider.updateError(BackupError.none); + }, + onRemoteSyncComplete: (isSuccess) { + syncStatusNotifier.completeRemoteSync(); + backupProvider.updateError(isSuccess == true ? BackupError.none : BackupError.syncFailed); + }, onRemoteSyncError: syncStatusNotifier.errorRemoteSync, onLocalSyncStart: syncStatusNotifier.startLocalSync, onLocalSyncComplete: syncStatusNotifier.completeLocalSync, diff --git a/mobile/lib/widgets/common/immich_sliver_app_bar.dart b/mobile/lib/widgets/common/immich_sliver_app_bar.dart index 23d64ecfcd..90c213599c 100644 --- a/mobile/lib/widgets/common/immich_sliver_app_bar.dart +++ b/mobile/lib/widgets/common/immich_sliver_app_bar.dart @@ -162,48 +162,32 @@ class _ProfileIndicator extends ConsumerWidget { } } +const double _kBadgeWidgetSize = 30.0; + class _BackupIndicator extends ConsumerWidget { const _BackupIndicator(); @override Widget build(BuildContext context, WidgetRef ref) { - const widgetSize = 30.0; - final hasError = ref.watch(driftBackupProvider.select((state) => state.error != BackupError.none)); - final indicatorIcon = hasError - ? Icon( - Icons.warning_rounded, - size: 12, - color: context.colorScheme.error, - semanticLabel: 'backup_controller_page_backup'.tr(), - ) - : _getBackupBadgeIcon(context, ref); - final badgeBackground = hasError ? context.colorScheme.errorContainer : context.colorScheme.surfaceContainer; + final indicatorIcon = _getBackupBadgeIcon(context, ref); return InkWell( onTap: () => context.pushRoute(const DriftBackupRoute()), borderRadius: const BorderRadius.all(Radius.circular(12)), child: Badge( - label: Container( - width: widgetSize / 2, - height: widgetSize / 2, - decoration: BoxDecoration( - color: badgeBackground, - border: Border.all(color: context.colorScheme.outline.withValues(alpha: .3)), - borderRadius: BorderRadius.circular(widgetSize / 2), - ), - child: indicatorIcon, - ), + label: indicatorIcon, backgroundColor: Colors.transparent, alignment: Alignment.bottomRight, isLabelVisible: indicatorIcon != null, offset: const Offset(-2, -12), - child: Icon(Icons.backup_rounded, size: widgetSize, color: context.primaryColor), + child: Icon(Icons.backup_rounded, size: _kBadgeWidgetSize, color: context.primaryColor), ), ); } Widget? _getBackupBadgeIcon(BuildContext context, WidgetRef ref) { final backupStateStream = ref.watch(settingsProvider).watch(Setting.enableBackup); + final hasError = ref.watch(driftBackupProvider.select((state) => state.error != BackupError.none)); final isDarkTheme = context.isDarkTheme; final iconColor = isDarkTheme ? Colors.white : Colors.black; final isUploading = ref.watch(driftBackupProvider.select((state) => state.uploadItems.isNotEmpty)); @@ -215,42 +199,76 @@ class _BackupIndicator extends ConsumerWidget { final backupEnabled = snapshot.data ?? false; if (!backupEnabled) { - return Icon( - Icons.cloud_off_rounded, - size: 9, - color: iconColor, - semanticLabel: 'backup_controller_page_backup'.tr(), + return _BadgeLabel( + Icon( + Icons.cloud_off_rounded, + size: 9, + color: iconColor, + semanticLabel: 'backup_controller_page_backup'.tr(), + ), + ); + } + + if (hasError) { + return _BadgeLabel( + Icon( + Icons.warning_rounded, + size: 12, + color: context.colorScheme.error, + semanticLabel: 'backup_controller_page_backup'.tr(), + ), + backgroundColor: context.colorScheme.errorContainer, ); } if (isUploading) { - return Container( - padding: const EdgeInsets.all(3.5), - child: Theme( - data: context.themeData.copyWith( - progressIndicatorTheme: context.themeData.progressIndicatorTheme.copyWith(year2023: true), - ), - child: CircularProgressIndicator( - strokeWidth: 2, - strokeCap: StrokeCap.round, - valueColor: AlwaysStoppedAnimation(iconColor), - semanticsLabel: 'backup_controller_page_backup'.tr(), + return _BadgeLabel( + Container( + padding: const EdgeInsets.all(3.5), + child: Theme( + data: context.themeData.copyWith( + progressIndicatorTheme: context.themeData.progressIndicatorTheme.copyWith(year2023: true), + ), + child: CircularProgressIndicator( + strokeWidth: 2, + strokeCap: StrokeCap.round, + valueColor: AlwaysStoppedAnimation(iconColor), + semanticsLabel: 'backup_controller_page_backup'.tr(), + ), ), ), ); } - return Icon( - Icons.check_outlined, - size: 9, - color: iconColor, - semanticLabel: 'backup_controller_page_backup'.tr(), + return _BadgeLabel( + Icon(Icons.check_outlined, size: 9, color: iconColor, semanticLabel: 'backup_controller_page_backup'.tr()), ); }, ); } } +class _BadgeLabel extends StatelessWidget { + final Widget indicator; + final Color? backgroundColor; + + const _BadgeLabel(this.indicator, {this.backgroundColor}); + + @override + Widget build(BuildContext context) { + return Container( + width: _kBadgeWidgetSize / 2, + height: _kBadgeWidgetSize / 2, + decoration: BoxDecoration( + color: backgroundColor ?? context.colorScheme.surfaceContainer, + border: Border.all(color: context.colorScheme.outline.withValues(alpha: .3)), + borderRadius: BorderRadius.circular(_kBadgeWidgetSize / 2), + ), + child: indicator, + ); + } +} + class _SyncStatusIndicator extends ConsumerStatefulWidget { const _SyncStatusIndicator(); From d59f8e68be7fd7129c3ce46728a35f8960a6258c Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 3 Oct 2025 08:47:48 -0500 Subject: [PATCH 022/134] fix: bottom navigation bar overlay sheet info (#22610) --- .../presentation/widgets/asset_viewer/bottom_sheet.widget.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart index 2586789beb..39f8e5ae69 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart @@ -186,6 +186,7 @@ class _AssetDetailBottomSheet extends ConsumerWidget { color: context.textTheme.bodyMedium?.color?.withAlpha(155), ), ), + const SizedBox(height: 64), ], ); } From 2e16a88f386a950ab5a7672a54f5432e5bb71c8a Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 3 Oct 2025 19:37:16 +0530 Subject: [PATCH 023/134] fix: respect storage indicator setting (#22596) * fix: respect storage indicator size setting * remove black bar on the bottom of the setting scaffold page --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- mobile/lib/pages/common/settings.page.dart | 11 +++-------- .../widgets/images/thumbnail_tile.widget.dart | 6 +++--- .../presentation/widgets/timeline/timeline.state.dart | 4 ++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/mobile/lib/pages/common/settings.page.dart b/mobile/lib/pages/common/settings.page.dart index b23c420971..0fe2ccec09 100644 --- a/mobile/lib/pages/common/settings.page.dart +++ b/mobile/lib/pages/common/settings.page.dart @@ -141,14 +141,9 @@ class SettingsSubPage extends StatelessWidget { @override Widget build(BuildContext context) { context.locale; - return SafeArea( - bottom: true, - top: false, - right: true, - child: Scaffold( - appBar: AppBar(centerTitle: false, title: Text(section.title).tr()), - body: section.widget, - ), + return Scaffold( + appBar: AppBar(centerTitle: false, title: Text(section.title).tr()), + body: section.widget, ); } } diff --git a/mobile/lib/presentation/widgets/images/thumbnail_tile.widget.dart b/mobile/lib/presentation/widgets/images/thumbnail_tile.widget.dart index a0163a7220..5359391261 100644 --- a/mobile/lib/presentation/widgets/images/thumbnail_tile.widget.dart +++ b/mobile/lib/presentation/widgets/images/thumbnail_tile.widget.dart @@ -16,7 +16,7 @@ class ThumbnailTile extends ConsumerWidget { this.asset, { this.size = kThumbnailResolution, this.fit = BoxFit.cover, - this.showStorageIndicator, + this.showStorageIndicator = false, this.lockSelection = false, this.heroOffset, super.key, @@ -25,7 +25,7 @@ class ThumbnailTile extends ConsumerWidget { final BaseAsset? asset; final Size size; final BoxFit fit; - final bool? showStorageIndicator; + final bool showStorageIndicator; final bool lockSelection; final int? heroOffset; @@ -55,7 +55,7 @@ class ThumbnailTile extends ConsumerWidget { : const BoxDecoration(); final bool storageIndicator = - showStorageIndicator ?? ref.watch(settingsProvider.select((s) => s.get(Setting.showStorageIndicator))); + ref.watch(settingsProvider.select((s) => s.get(Setting.showStorageIndicator))) && showStorageIndicator; return Stack( children: [ diff --git a/mobile/lib/presentation/widgets/timeline/timeline.state.dart b/mobile/lib/presentation/widgets/timeline/timeline.state.dart index b3aec23f7f..1e1d4130f7 100644 --- a/mobile/lib/presentation/widgets/timeline/timeline.state.dart +++ b/mobile/lib/presentation/widgets/timeline/timeline.state.dart @@ -14,7 +14,7 @@ class TimelineArgs { final double maxHeight; final double spacing; final int columnCount; - final bool? showStorageIndicator; + final bool showStorageIndicator; final bool withStack; final GroupAssetsBy? groupBy; @@ -23,7 +23,7 @@ class TimelineArgs { required this.maxHeight, this.spacing = kTimelineSpacing, this.columnCount = kTimelineColumnCount, - this.showStorageIndicator, + this.showStorageIndicator = false, this.withStack = false, this.groupBy, }); From 27665801e9eeb1b52c0e3a12199796d8b9b445f0 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 3 Oct 2025 20:05:56 +0530 Subject: [PATCH 024/134] fix: do not run multiple engines on cold startup (#22518) fix: do not run multiple engines on app startup Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- .../kotlin/app/alextran/immich/ImmichApp.kt | 10 ++- .../immich/background/BackgroundEngineLock.kt | 65 ++++++++++--------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt index 5a3b0e1f3d..4474c63e09 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/ImmichApp.kt @@ -1,8 +1,11 @@ package app.alextran.immich import android.app.Application +import android.os.Handler +import android.os.Looper import androidx.work.Configuration import androidx.work.WorkManager +import app.alextran.immich.background.BackgroundEngineLock import app.alextran.immich.background.BackgroundWorkerApiImpl class ImmichApp : Application() { @@ -17,6 +20,11 @@ class ImmichApp : Application() { // As a workaround, we also run a backup check when initializing the application ContentObserverWorker.startBackupWorker(context = this, delayMilliseconds = 0) - BackgroundWorkerApiImpl.enqueueBackgroundWorker(this) + Handler(Looper.getMainLooper()).postDelayed({ + // We can only check the engine count and not the status of the lock here, + // as the previous start might have been killed without unlocking. + if (BackgroundEngineLock.connectEngines > 0) return@postDelayed + BackgroundWorkerApiImpl.enqueueBackgroundWorker(this) + }, 5000) } } diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt index d8afe32b5c..504267a4e5 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/background/BackgroundEngineLock.kt @@ -8,43 +8,46 @@ import java.util.concurrent.atomic.AtomicInteger private const val TAG = "BackgroundEngineLock" class BackgroundEngineLock(context: Context) : BackgroundWorkerLockApi, FlutterPlugin { - private val ctx: Context = context.applicationContext + private val ctx: Context = context.applicationContext - companion object { + companion object { - private var engineCount = AtomicInteger(0) + private var engineCount = AtomicInteger(0) - private fun checkAndEnforceBackgroundLock(ctx: Context) { - // work manager task is running while the main app is opened, cancel the worker - if (BackgroundWorkerPreferences(ctx).isLocked() && - engineCount.get() > 1 && - BackgroundWorkerApiImpl.isBackgroundWorkerRunning() - ) { - Log.i(TAG, "Background worker is locked, cancelling the background worker") - BackgroundWorkerApiImpl.cancelBackgroundWorker(ctx) - } - } + val connectEngines: Int + get() = engineCount.get() + + private fun checkAndEnforceBackgroundLock(ctx: Context) { + // work manager task is running while the main app is opened, cancel the worker + if (BackgroundWorkerPreferences(ctx).isLocked() && + connectEngines > 1 && + BackgroundWorkerApiImpl.isBackgroundWorkerRunning() + ) { + Log.i(TAG, "Background worker is locked, cancelling the background worker") + BackgroundWorkerApiImpl.cancelBackgroundWorker(ctx) + } } + } - override fun lock() { - BackgroundWorkerPreferences(ctx).setLocked(true) - checkAndEnforceBackgroundLock(ctx) - Log.i(TAG, "Background worker is locked") - } + override fun lock() { + BackgroundWorkerPreferences(ctx).setLocked(true) + checkAndEnforceBackgroundLock(ctx) + Log.i(TAG, "Background worker is locked") + } - override fun unlock() { - BackgroundWorkerPreferences(ctx).setLocked(false) - Log.i(TAG, "Background worker is unlocked") - } + override fun unlock() { + BackgroundWorkerPreferences(ctx).setLocked(false) + Log.i(TAG, "Background worker is unlocked") + } - override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { - checkAndEnforceBackgroundLock(binding.applicationContext) - engineCount.incrementAndGet() - Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount") - } + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + checkAndEnforceBackgroundLock(binding.applicationContext) + engineCount.incrementAndGet() + Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount") + } - override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - engineCount.decrementAndGet() - Log.i(TAG, "Flutter engine detached. Attached Engines count: $engineCount") - } + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + engineCount.decrementAndGet() + Log.i(TAG, "Flutter engine detached. Attached Engines count: $engineCount") + } } From 3f6b0f31274ce3570df7583dc1aa26d5454ad9f8 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 3 Oct 2025 09:37:51 -0500 Subject: [PATCH 025/134] fix: album selector in favorite view (#22612) --- .../widgets/album/album_selector.widget.dart | 2 +- .../favorite_bottom_sheet.widget.dart | 46 ++++++++++++++++++- .../widgets/timeline/timeline.widget.dart | 2 +- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/mobile/lib/presentation/widgets/album/album_selector.widget.dart b/mobile/lib/presentation/widgets/album/album_selector.widget.dart index f79b4bd7b1..bffe3d3941 100644 --- a/mobile/lib/presentation/widgets/album/album_selector.widget.dart +++ b/mobile/lib/presentation/widgets/album/album_selector.widget.dart @@ -512,7 +512,7 @@ class _AlbumList extends ConsumerWidget { } return SliverPadding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: const EdgeInsets.only(left: 16.0, right: 16, bottom: 64), sliver: SliverList.builder( itemBuilder: (_, index) { final album = albums[index]; diff --git a/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart index c7a0fbab40..b2502127d4 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; +import 'package:immich_mobile/domain/models/album/album.model.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart'; @@ -15,9 +18,12 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/trash_action_b import 'package:immich_mobile/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/unstack_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart'; +import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; +import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; class FavoriteBottomSheet extends ConsumerWidget { const FavoriteBottomSheet({super.key}); @@ -27,9 +33,42 @@ class FavoriteBottomSheet extends ConsumerWidget { final multiselect = ref.watch(multiSelectProvider); final isTrashEnable = ref.watch(serverInfoProvider.select((state) => state.serverFeatures.trash)); + Future addAssetsToAlbum(RemoteAlbum album) async { + final selectedAssets = multiselect.selectedAssets; + if (selectedAssets.isEmpty) { + return; + } + + final remoteAssets = selectedAssets.whereType(); + final addedCount = await ref + .read(remoteAlbumProvider.notifier) + .addAssets(album.id, remoteAssets.map((e) => e.id).toList()); + + if (selectedAssets.length != remoteAssets.length) { + ImmichToast.show( + context: context, + msg: 'add_to_album_bottom_sheet_some_local_assets'.t(context: context), + ); + } + + if (addedCount != remoteAssets.length) { + ImmichToast.show( + context: context, + msg: 'add_to_album_bottom_sheet_already_exists'.t(args: {"album": album.name}), + ); + } else { + ImmichToast.show( + context: context, + msg: 'add_to_album_bottom_sheet_added'.t(args: {"album": album.name}), + ); + } + + ref.read(multiSelectProvider.notifier).reset(); + } + return BaseBottomSheet( - initialChildSize: 0.25, - maxChildSize: 0.4, + initialChildSize: 0.4, + maxChildSize: 0.7, shouldCloseOnMinExtent: false, actions: [ const ShareActionButton(source: ActionSource.timeline), @@ -52,6 +91,9 @@ class FavoriteBottomSheet extends ConsumerWidget { const UploadActionButton(source: ActionSource.timeline), ], ], + slivers: multiselect.hasRemote + ? [const AddToAlbumHeader(), AlbumSelector(onAlbumSelected: addAssetsToAlbum)] + : [], ); } } diff --git a/mobile/lib/presentation/widgets/timeline/timeline.widget.dart b/mobile/lib/presentation/widgets/timeline/timeline.widget.dart index 83e679b8c1..e8832173a1 100644 --- a/mobile/lib/presentation/widgets/timeline/timeline.widget.dart +++ b/mobile/lib/presentation/widgets/timeline/timeline.widget.dart @@ -36,7 +36,7 @@ class Timeline extends StatelessWidget { this.showStorageIndicator = false, this.withStack = false, this.appBar = const ImmichSliverAppBar(floating: true, pinned: false, snap: false), - this.bottomSheet = const GeneralBottomSheet(minChildSize: 0.18), + this.bottomSheet = const GeneralBottomSheet(minChildSize: 0.23), this.groupBy, this.withScrubber = true, this.snapToMonth = true, From 295e406a174578c6b93231efb6cfab547817f658 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Fri, 3 Oct 2025 17:10:09 +0200 Subject: [PATCH 026/134] chore(web): update translations (#22486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/az/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/kn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ml/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/ Translation: Immich/immich Co-authored-by: Arthur Bols Co-authored-by: Ben Kim Co-authored-by: César Gómez Co-authored-by: DR Co-authored-by: DevServs Co-authored-by: Emil Friis Osmann Co-authored-by: Fjuro Co-authored-by: Godwin T Co-authored-by: Hristo T Co-authored-by: Hurricane-32 Co-authored-by: Jozef Gaal Co-authored-by: KecskeTech Co-authored-by: Kiril Panayotov Co-authored-by: Liviu Roman Co-authored-by: Lorenzo Co-authored-by: Marcelo Popper Costa Co-authored-by: Matjaž T Co-authored-by: Miryusif Rahimov Co-authored-by: Msaood Co-authored-by: Mārtiņš Bruņenieks Co-authored-by: Pedro Vendeira Co-authored-by: PontusÖsterlindh Co-authored-by: Rahees Co-authored-by: Sandeep R Co-authored-by: Sylvain Pichon Co-authored-by: TV Box Co-authored-by: Tino Altmann Co-authored-by: User 123456789 Co-authored-by: Vegard Fladby Co-authored-by: anton garcias Co-authored-by: chamdim Co-authored-by: longlarry Co-authored-by: pyccl Co-authored-by: swever Co-authored-by: தமிழ்நேரம் Co-authored-by: 안세훈 --- i18n/ar.json | 2 + i18n/az.json | 19 +- i18n/bg.json | 6 +- i18n/ca.json | 3 +- i18n/cs.json | 1 + i18n/da.json | 2 + i18n/de.json | 1 + i18n/el.json | 2 + i18n/es.json | 5 +- i18n/fr.json | 2 +- i18n/he.json | 7 +- i18n/hu.json | 4 +- i18n/it.json | 19 +- i18n/kn.json | 5 +- i18n/ko.json | 28 +- i18n/lv.json | 81 +- i18n/ml.json | 2190 +++++++++++++++++++++++++++++++++++++-- i18n/nb_NO.json | 512 ++++----- i18n/nl.json | 15 +- i18n/pl.json | 1 + i18n/pt.json | 80 +- i18n/pt_BR.json | 1 + i18n/ro.json | 3 +- i18n/ru.json | 8 +- i18n/sk.json | 3 +- i18n/sl.json | 1 + i18n/sv.json | 2 + i18n/ta.json | 22 +- i18n/tr.json | 8 +- i18n/zh_Hant.json | 1 + i18n/zh_SIMPLIFIED.json | 1 + 31 files changed, 2600 insertions(+), 435 deletions(-) diff --git a/i18n/ar.json b/i18n/ar.json index 5d43f61777..a94c920bec 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -28,6 +28,7 @@ "add_to_album": "إضافة إلى ألبوم", "add_to_album_bottom_sheet_added": "تمت الاضافة الى {album}", "add_to_album_bottom_sheet_already_exists": "موجود مسبقا في {album}", + "add_to_album_bottom_sheet_some_local_assets": "لا يمكن إضافة بعض الأصول المحلية إلى الألبوم", "add_to_album_toggle": "تبديل التحديد لـ{album}", "add_to_albums": "إضافة الى البومات", "add_to_albums_count": "إضافه إلى البومات ({count})", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "قم بتشغيل النسخ الاحتياطي المقدمة", "backup_controller_page_uploading_file_info": "تحميل معلومات الملف", "backup_err_only_album": "لا يمكن إزالة الألبوم الوحيد", + "backup_error_sync_failed": "فشل المزامنة. لا يمكن معالجة النسخ الاحتياطي.", "backup_info_card_assets": "أصول", "backup_manual_cancelled": "ملغي", "backup_manual_in_progress": "قيد التحميل حاول مره اخرى", diff --git a/i18n/az.json b/i18n/az.json index d0e97ca356..53e7f55db6 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -1,8 +1,8 @@ { "about": "Haqqında", "account": "Hesab", - "account_settings": "Hesab parametrləri", - "acknowledge": "Aydındır", + "account_settings": "Hesab Parametrləri", + "acknowledge": "Təsdiq et", "action": "Əməliyyat", "action_common_update": "Yenilə", "actions": "Əməliyyatlar", @@ -16,8 +16,8 @@ "add_a_title": "Başlıq əlavə et", "add_birthday": "Doğum günü əlavə et", "add_endpoint": "Son nöqtə əlavə et", - "add_exclusion_pattern": "İstisna nümunəsi əlavə et", - "add_import_path": "Import yolunu əlavə et", + "add_exclusion_pattern": "Çıxarma nümunəsi əlavə et", + "add_import_path": "İdxal yolu əlavə et", "add_location": "Məkan əlavə et", "add_more_users": "Daha çox istifadəçi əlavə et", "add_partner": "Partnyor əlavə et", @@ -25,20 +25,21 @@ "add_photos": "Şəkillər əlavə et", "add_tag": "Etiket əlavə et", "add_to": "Bura əlavə et…", - "add_to_album": "Albom əlavə et", + "add_to_album": "Alboma əlavə et", "add_to_album_bottom_sheet_added": "{album} albomuna əlavə edildi", "add_to_album_bottom_sheet_already_exists": "Artıq {album} albomunda var", + "add_to_album_bottom_sheet_some_local_assets": "Bəzi lokal resurslar alboma əlavə edilə bilmədi", "add_to_album_toggle": "{album} üçün seçimi dəyişin", "add_to_albums": "Albomlara əlavə et", - "add_to_albums_count": "Albomlara əlavə et ({count})", + "add_to_albums_count": "({count}) albomlarına əlavə et", "add_to_shared_album": "Paylaşılan alboma əlavə et", "add_url": "URL əlavə et", "added_to_archive": "Arxivə əlavə edildi", "added_to_favorites": "Sevimlilələrə əlavə edildi", "added_to_favorites_count": "{count, number} şəkil sevimlilələrə əlavə edildi", "admin": { - "add_exclusion_pattern_description": "İstisna şablonlarını əlavə edin. *, ** və ? ilə Globbing dəstəklənir. Məs.: \"Raw\" adlanan hər hansısa bir qovluqda bütün faylları saymamaq üçün \"**/Raw/**\"-dan istifadə edin. \".tif\" ilə bitən bütün faylları saymamaq üçün \"**/*.tif\"-dən istifadə edin. Faylı mütləq yoldan istifadə etməklə saymamaq istəyirsinizsə \"/path/to/ignore/**\"-dan istifadə edin.", - "admin_user": "Admin İstifadəçi", + "add_exclusion_pattern_description": "Çıxarma nümunələri əlavə et. *, ** və ? istifadə edilərək globbing dəstəklənir. Hər hansı bir \"Raw\" adlı qovluqdakı bütün faylları görməməzlikdən gəlmək üçün **/Raw/** istifadə et. “.tif” ilə bitən bütün faylları görməməzlikdən gəlmək üçün **/*.tif istifadə et. Tam yolu görməməzlikdən gəlmək üçün /path/to/ignore/** istifadə et.", + "admin_user": "İdarəçi İstifadəçi", "asset_offline_description": "Bu xarici kitabxana varlığı diskdə artıq tapılmadı və zibil qutusuna köçürüldü. Əgər fayl kitabxana içərisində köçürülübsə, zaman şkalanızı yeni uyğun gələn varlıq üçün yoxlayın. Varlığı yenidən qaytarmaq üçün aşağıda verilmiş fayl yolunun Immich tərəfindən əlçatan olduğundan əmin olduqdan sonra kitabxananı skan edin.", "authentication_settings": "Səlahiyyətləndirmə parametrləri", "authentication_settings_description": "Şifrə, OAuth və digər səlahiyyətləndirmə parametrləri", @@ -76,7 +77,7 @@ "image_thumbnail_title": "Önizləmə parametrləri", "job_concurrency": "{job}paralellik", "job_created": "Tapşırıq yaradıldı", - "job_not_concurrency_safe": "Bu tapşırıq parallel fəaliyyət üçün uyğun deyil", + "job_not_concurrency_safe": "Bu iş eyni vaxtda icra üçün təhlükəsiz deyil.", "job_settings": "Tapşırıq parametrləri", "job_settings_description": "Parallel şəkildə fəaliyyət göstərən tapşırıqları idarə et", "job_status": "Tapşırıq statusu", diff --git a/i18n/bg.json b/i18n/bg.json index e78b139d7b..a0ab4d0a80 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -28,6 +28,7 @@ "add_to_album": "Добави към албум", "add_to_album_bottom_sheet_added": "Добавено в {album}", "add_to_album_bottom_sheet_already_exists": "Вече е в {album}", + "add_to_album_bottom_sheet_some_local_assets": "Някои локални файлове не успяха да се добавят към албума", "add_to_album_toggle": "Сменете избора за {album}", "add_to_albums": "Добавяне в албуми", "add_to_albums_count": "Добавяне в албуми ({count})", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Включи архивиране в активен режим", "backup_controller_page_uploading_file_info": "Инфо за архивирания файл", "backup_err_only_album": "Не може да се премахне единствения албум", + "backup_error_sync_failed": "Синхронизацията е неуспешна. Резервното копие не може да се обработи.", "backup_info_card_assets": "обекта", "backup_manual_cancelled": "Отменено", "backup_manual_in_progress": "Върви архивиране. Опитай след малко", @@ -1235,7 +1237,7 @@ "local": "Локално", "local_asset_cast_failed": "Не може да се предава обект, който още не е качен на сървъра", "local_assets": "Локални обекти", - "local_media_summary": "Обобщение на локалните медийни файлове", + "local_media_summary": "Обобщение на локалните файлове", "local_network": "Локална мрежа", "local_network_sheet_info": "Приложението ще се свърже със сървъра на този URL, когато устройството е свързано към зададената Wi-Fi мрежа", "location_permission": "Разрешение за местоположение", @@ -1344,7 +1346,7 @@ "missing": "Липсващи", "model": "Модел", "month": "Месец", - "monthly_title_text_date_format": "MMMM y", + "monthly_title_text_date_format": "MMMM г", "more": "Още", "move": "Премести", "move_off_locked_folder": "Извади от заключената папка", diff --git a/i18n/ca.json b/i18n/ca.json index 0e3d674557..5f3267f7ca 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -34,7 +34,7 @@ "add_to_albums_count": "Afegir als àlbums ({count})", "add_to_shared_album": "Afegir a un àlbum compartit", "add_url": "Afegir URL", - "added_to_archive": "Afegit als arxivats", + "added_to_archive": "Afegir a l'arxiu", "added_to_favorites": "Afegit als preferits", "added_to_favorites_count": "{count, number} afegits als preferits", "admin": { @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Activa la còpia de seguretat", "backup_controller_page_uploading_file_info": "S'està pujant la informació del fitxer", "backup_err_only_album": "No es pot eliminar l'únic àlbum", + "backup_error_sync_failed": "Sincronització malament, No es pot fer backup.", "backup_info_card_assets": "elements", "backup_manual_cancelled": "Cancel·lat", "backup_manual_in_progress": "La pujada ja està en curs. Torneu-ho a provar més tard", diff --git a/i18n/cs.json b/i18n/cs.json index ceebc9f401..4382629f89 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Povolit zálohování na popředí", "backup_controller_page_uploading_file_info": "Informace o nahraném souboru", "backup_err_only_album": "Nelze odstranit jediné vybrané album", + "backup_error_sync_failed": "Synchronizace selhala. Nelze zpracovat zálohu.", "backup_info_card_assets": "položek", "backup_manual_cancelled": "Zrušeno", "backup_manual_in_progress": "Nahrávání již probíhá. Zkuste to znovu později", diff --git a/i18n/da.json b/i18n/da.json index 61891e7ef8..c7aabf2b3c 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -28,6 +28,7 @@ "add_to_album": "Tilføj 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_some_local_assets": "Nogle lokale elementer kunne ikke føjes til albummet", "add_to_album_toggle": "Skift selektion for {album}", "add_to_albums": "Tilføj til albummer", "add_to_albums_count": "Tilføj til albummer({count})", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Slå sikkerhedskopiering til", "backup_controller_page_uploading_file_info": "Uploader filinformation", "backup_err_only_album": "Kan ikke slette det eneste album", + "backup_error_sync_failed": "Synkroniseringen mislykkedes. Sikkerhedskopieringen kunne ikke behandles.", "backup_info_card_assets": "objekter", "backup_manual_cancelled": "Annulleret", "backup_manual_in_progress": "Upload er allerede undervejs. Prøv igen efter noget tid", diff --git a/i18n/de.json b/i18n/de.json index 4af1675ffc..69e36be8e9 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Sicherung im Vordergrund einschalten", "backup_controller_page_uploading_file_info": "Informationen", "backup_err_only_album": "Das einzige Album kann nicht entfernt werden", + "backup_error_sync_failed": "Synchronisierung fehlgeschlagen. Backup kann nicht verarbeitet werden.", "backup_info_card_assets": "Elemente", "backup_manual_cancelled": "Abgebrochen", "backup_manual_in_progress": "Sicherung läuft bereits. Bitte versuche es später erneut", diff --git a/i18n/el.json b/i18n/el.json index 6e2f543c1f..6492ea0370 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -28,6 +28,7 @@ "add_to_album": "Προσθήκη σε άλμπουμ", "add_to_album_bottom_sheet_added": "Προστέθηκε στο {album}", "add_to_album_bottom_sheet_already_exists": "Ήδη στο {album}", + "add_to_album_bottom_sheet_some_local_assets": "Ορισμένοι τοπικά στοιχεία δεν μπόρεσαν να προστεθούν στο άλμπουμ", "add_to_album_toggle": "Εναλλαγή επιλογής για το {album}", "add_to_albums": "Προσθήκη στα άλμπουμ", "add_to_albums_count": "Προσθήκη στα άλμπουμ ({count})", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Ενεργοποίηση δημιουργίας αντιγράφου ασφαλείας στο προσκήνιο", "backup_controller_page_uploading_file_info": "Μεταφόρτωση πληροφοριών αρχείου", "backup_err_only_album": "Δεν είναι δυνατή η αφαίρεση του μοναδικού άλμπουμ", + "backup_error_sync_failed": "Ο συγχρονισμός απέτυχε. Δεν είναι δυνατή η επεξεργασία του αντιγράφου ασφαλείας.", "backup_info_card_assets": "στοιχεία", "backup_manual_cancelled": "Ακυρώθηκε", "backup_manual_in_progress": "Μεταφόρτωση σε εξέλιξη. Δοκιμάστε αργότερα", diff --git a/i18n/es.json b/i18n/es.json index d2cd6924c4..626ae0540c 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Activar la copia de seguridad", "backup_controller_page_uploading_file_info": "Subiendo información del archivo", "backup_err_only_album": "No se puede eliminar el único álbum", + "backup_error_sync_failed": "Sincronización falló. No es posible procesar la copia de seguridad.", "backup_info_card_assets": "elementos", "backup_manual_cancelled": "Cancelado", "backup_manual_in_progress": "Subida ya en progreso. Vuelve a intentarlo más tarde", @@ -1088,7 +1089,7 @@ "folders": "Carpetas", "folders_feature_description": "Explorar la vista de carpetas para las fotos y los videos en el sistema de archivos", "forgot_pin_code_question": "¿Olvidaste tu código PIN?", - "forward": "Reenviar", + "forward": "Avanzar", "gcast_enabled": "Google Cast", "gcast_enabled_description": "Esta funcionalidad carga recursos externos desde Google para poder funcionar.", "general": "General", @@ -1905,7 +1906,7 @@ "skip_to_content": "Saltar al contenido", "skip_to_folders": "Ir a las carpetas", "skip_to_tags": "Ir a las etiquetas", - "slideshow": "Diapositivas", + "slideshow": "Pase de diapositivas", "slideshow_settings": "Ajustes de diapositivas", "sort_albums_by": "Ordenar álbumes por…", "sort_created": "Fecha de creación", diff --git a/i18n/fr.json b/i18n/fr.json index d5b6e10ba8..df0e9d1cc0 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -599,7 +599,7 @@ "backup_controller_page_turn_on": "Activer la sauvegarde au premier plan", "backup_controller_page_uploading_file_info": "Envoi des informations du fichier", "backup_err_only_album": "Impossible de retirer le seul album", - "backup_error_sync_failed": "Échec de la synchronisation. Impossible de démarrer la sauvegarde.", + "backup_error_sync_failed": "Échec de la synchronisation. Impossible d'exécuter la sauvegarde.", "backup_info_card_assets": "éléments", "backup_manual_cancelled": "Annulé", "backup_manual_in_progress": "Envoi déjà en cours. Réessayez plus tard", diff --git a/i18n/he.json b/i18n/he.json index 5f71e2c8a8..8138679cdd 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -28,9 +28,10 @@ "add_to_album": "הוספה לאלבום", "add_to_album_bottom_sheet_added": "נוסף ל {album}", "add_to_album_bottom_sheet_already_exists": "כבר ב {album}", + "add_to_album_bottom_sheet_some_local_assets": "לא ניתן היה להוסיף חלק מהקבצים המקומיים לאלבום", "add_to_album_toggle": "החלפת מצב בחירה עבור {album}", "add_to_albums": "הוספה לאלבומים", - "add_to_albums_count": "Add to albums ({count})", + "add_to_albums_count": "הוסף ({count}) לאלבום", "add_to_shared_album": "הוספה לאלבום משותף", "add_url": "הוספת קישור", "added_to_archive": "נוסף לארכיון", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "הפעל גיבוי חזית", "backup_controller_page_uploading_file_info": "מעלה מידע על הקובץ", "backup_err_only_album": "לא ניתן להסיר את האלבום היחיד", + "backup_error_sync_failed": "הסינכרון נכשל. לא ניתן להשלים את הגיבוי.", "backup_info_card_assets": "תמונות", "backup_manual_cancelled": "בוטל", "backup_manual_in_progress": "העלאה כבר בתהליך. נסה אחרי זמן מה", @@ -753,6 +755,7 @@ "create_user": "צור משתמש", "created": "נוצר", "created_at": "נוצר", + "creating_linked_albums": "יוצר אלבומים מקושרים...", "crop": "חתוך", "curated_object_page_title": "דברים", "current_device": "מכשיר נוכחי", @@ -1500,7 +1503,7 @@ "permission_onboarding_permission_limited": "הרשאה מוגבלת. כדי לתת ליישום לגבות ולנהל את כל אוסף הגלריה שלך, הענק הרשאה לתמונות וסרטונים בהגדרות.", "permission_onboarding_request": "היישום דורש הרשאה כדי לראות את התמונות והסרטונים שלך.", "person": "אדם", - "person_age_months": "בגיל {months, plural, one {חודש #} other {# חודשים}}", + "person_age_months": "{months, plural, one {חודש #} other {# חודשים}}", "person_age_year_months": "בגיל שנה ו{months, plural, one {חודש #} other {# חודשים}}", "person_age_years": "בגיל {years, plural, other {# שנים}}", "person_birthdate": "נולד בתאריך {date}", diff --git a/i18n/hu.json b/i18n/hu.json index f000e89517..081bc12f99 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -28,6 +28,7 @@ "add_to_album": "Felvétel albumba", "add_to_album_bottom_sheet_added": "Hozzáadva a(z) \"{album}\" albumhoz", "add_to_album_bottom_sheet_already_exists": "Már benne van a(z) \"{album}\" albumban", + "add_to_album_bottom_sheet_some_local_assets": "Néhány helyi elem nem adható hozzá az albumhoz", "add_to_album_toggle": "{album} kijelölésének váltása", "add_to_albums": "Hozzáadás albumokhoz", "add_to_albums_count": "Hozzáadás albumokhoz ({count})", @@ -175,7 +176,7 @@ "map_settings_description": "Térkép beállítások kezelése", "map_style_description": "Egy style.json térképtémára mutató URL cím", "memory_cleanup_job": "Memória takarítás", - "memory_generate_job": "Emlék generálása", + "memory_generate_job": "Emlékek generálása", "metadata_extraction_job": "Metaadatok kinyerése", "metadata_extraction_job_description": "Metaadat információk (pl. GPS, arcok és felbontás) kinyerése minden elemből", "metadata_faces_import_setting": "Arc importálás engedélyezése", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Előtérben mentés bekapcsolása", "backup_controller_page_uploading_file_info": "Fájl információk feltöltése", "backup_err_only_album": "Az utolsó albumot nem tudod törölni", + "backup_error_sync_failed": "A szinkronizálás nem sikerült. A biztonsági mentés nem elkészíthető.", "backup_info_card_assets": "elemek", "backup_manual_cancelled": "Megszakítva", "backup_manual_in_progress": "Feltöltés már folyamatban. Próbáld meg később", diff --git a/i18n/it.json b/i18n/it.json index a86dd78ca6..3f8d90eacc 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -177,7 +177,7 @@ "map_style_description": "URL per un tema della mappa style.json", "memory_cleanup_job": "Pulizia dei vecchi Ricordi", "memory_generate_job": "Generazione dei Ricordi", - "metadata_extraction_job": "Estrazione Metadata", + "metadata_extraction_job": "Estrazione Metadati", "metadata_extraction_job_description": "Estrai informazioni dai metadati di ciascuna risorsa, come coordinate GPS, volti e risoluzione", "metadata_faces_import_setting": "Abilita l'importazione dei volti", "metadata_faces_import_setting_description": "Importa i volti dai dati EXIF dell'immagine e dai file sidecar", @@ -308,11 +308,11 @@ "transcoding_acceleration_rkmpp": "RKMPP (Solo per SOC Rockchip)", "transcoding_acceleration_vaapi": "VAAPI", "transcoding_accepted_audio_codecs": "Codifiche audio accettate", - "transcoding_accepted_audio_codecs_description": "Seleziona quali codifiche audio non devono essere trascodificate. Solo usato per alcune politiche di trascodifica.", + "transcoding_accepted_audio_codecs_description": "Seleziona quali codifiche audio non devono essere transcodificate. Solo usato per alcune politiche di transcodifica.", "transcoding_accepted_containers": "Contenitori accettati", "transcoding_accepted_containers_description": "Seleziona quali formati non hanno bisogno di essere remuxati in MP4. Usato solo per certe politiche di transcodifica.", "transcoding_accepted_video_codecs": "Codifiche video accettate", - "transcoding_accepted_video_codecs_description": "Seleziona quali codifiche video non devono essere trascodificate. Usato solo per alcune politiche di trascodifica.", + "transcoding_accepted_video_codecs_description": "Seleziona quali codifiche video non devono essere transcodificate. Usato solo per alcune politiche di transcodifica.", "transcoding_advanced_options_description": "Impostazioni che la maggior parte degli utenti non dovrebbero cambiare", "transcoding_audio_codec": "Codifica Audio", "transcoding_audio_codec_description": "Opus è l'opzione con la qualità più alta, ma è meno compatibile con dispositivi o software vecchi.", @@ -345,7 +345,7 @@ "transcoding_reference_frames": "Frame di riferimento", "transcoding_reference_frames_description": "Il numero di frame da prendere in considerazione nel comprimere un determinato frame. Valori più alti migliorano l'efficienza di compressione, ma rallentano la codifica. 0 imposta questo valore automaticamente.", "transcoding_required_description": "Solo video che non sono in un formato accettato", - "transcoding_settings": "Impostazioni Trascodifica Video", + "transcoding_settings": "Impostazioni Transcodifica Video", "transcoding_settings_description": "Gestisci quali video transcodificare e come processarli", "transcoding_target_resolution": "Risoluzione desiderata", "transcoding_target_resolution_description": "Risoluzioni più elevate possono preservare più dettagli ma richiedono più tempo per la codifica, producono file di dimensioni maggiori e possono ridurre la reattività dell'applicazione.", @@ -356,11 +356,11 @@ "transcoding_tone_mapping": "Mappatura della tonalità", "transcoding_tone_mapping_description": "Tenta di preservare l'aspetto dei video HDR quando convertiti in SDR. Ciascun algoritmo fa diversi compromessi per colore, dettaglio e luminosità. Hable conserva il dettaglio, Mobius conserva il colore e Reinhard conserva la luminosità.", "transcoding_transcode_policy": "Politica di transcodifica", - "transcoding_transcode_policy_description": "Politica che determina quando un video deve essere trascodificato. I video HDR verranno sempre trascodificati (eccetto quando la trascodifica è disabilitata).", + "transcoding_transcode_policy_description": "Politica che determina quando un video deve essere transcodificato. I video HDR verranno sempre transcodificati (eccetto quando la transcodifica è disabilitata).", "transcoding_two_pass_encoding": "Codifica a due passaggi", - "transcoding_two_pass_encoding_setting_description": "Trascodifica in due passaggi per produrre video codificati migliori. Quando il bitrate massimo è abilitato (necessario affinché funzioni con H.264 e HEVC), questa modalità utilizza un intervallo di bitrate basato sul bitrate massimo e ignora CRF. Per VP9, CRF può essere utilizzato se il bitrate massimo è disabilitato.", + "transcoding_two_pass_encoding_setting_description": "Transcodifica in due passaggi per produrre video codificati migliori. Quando il bitrate massimo è abilitato (necessario affinché funzioni con H.264 e HEVC), questa modalità utilizza un intervallo di bitrate basato sul bitrate massimo e ignora CRF. Per VP9, CRF può essere utilizzato se il bitrate massimo è disabilitato.", "transcoding_video_codec": "Codec video", - "transcoding_video_codec_description": "VP9 ha alta efficienza e compatibilità web, ma richiede più tempo per la trascodifica. HEVC ha prestazioni simili, ma una minore compatibilità web. H.264 è ampiamente compatibile e veloce da transcodificare, ma produce file molto più grandi. AV1 è il codec più efficiente, ma non è supportato sui dispositivi più vecchi.", + "transcoding_video_codec_description": "VP9 ha alta efficienza e compatibilità web, ma richiede più tempo per la transcodifica. HEVC ha prestazioni simili, ma una minore compatibilità web. H.264 è ampiamente compatibile e veloce da transcodificare, ma produce file molto più grandi. AV1 è il codec più efficiente, ma non è supportato sui dispositivi più vecchi.", "trash_enabled_description": "Abilita Funzionalità Cestino", "trash_number_of_days": "Numero di giorni", "trash_number_of_days_description": "Numero di giorni per cui mantenere gli asset nel cestino prima di rimuoverli definitivamente", @@ -388,8 +388,8 @@ "version_check_implications": "La funzione di controllo della versione fa uso di una comunicazione periodica con github.com", "version_check_settings": "Controllo Versione", "version_check_settings_description": "Abilita/disabilita la notifica per nuove versioni", - "video_conversion_job": "Trascodifica video", - "video_conversion_job_description": "Trascodifica video per maggiore compatibilità con browser e dispositivi" + "video_conversion_job": "Transcodifica video", + "video_conversion_job_description": "Transcodifica video per maggiore compatibilità con browser e dispositivi" }, "admin_email": "Email Amministratore", "admin_password": "Password Amministratore", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Attiva backup", "backup_controller_page_uploading_file_info": "Caricamento informazioni file", "backup_err_only_album": "Non è possibile rimuovere l'unico album", + "backup_error_sync_failed": "Sincronizzazione non riuscita. Impossibile elaborare il backup.", "backup_info_card_assets": "risorse", "backup_manual_cancelled": "Annullato", "backup_manual_in_progress": "Caricamento già in corso. Riprova più tardi", diff --git a/i18n/kn.json b/i18n/kn.json index 388f06704c..111c802a1e 100644 --- a/i18n/kn.json +++ b/i18n/kn.json @@ -8,11 +8,13 @@ "actions": "ಕ್ರಿಯೆಗಳು", "active": "ಸಕ್ರಿಯ", "activity": "ಚಟುವಟಿಕೆ", + "activity_changed": "ಚಟುವಟಿಕೆ {enabled, select, true{ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ} other {ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ}}", "add": "ಸೇರಿಸಿ", "add_a_description": "ವಿವರಣೆಯನ್ನು ಸೇರಿಸಿ", "add_a_location": "ಸ್ಥಳವನ್ನು ಸೇರಿಸಿ", "add_a_name": "ಹೆಸರನ್ನು ಸೇರಿಸಿ", "add_a_title": "ಶೀರ್ಷಿಕೆಯನ್ನು ಸೇರಿಸಿ", + "add_birthday": "ಜನ್ಮದಿನ ಸೇರಿಸಿ", "add_endpoint": "ಎಂಡ್‌ಪಾಯಿಂಟ್ ಸೇರಿಸಿ", "add_exclusion_pattern": "ಹೊರಗಿಡುವಿಕೆ ಮಾದರಿಯನ್ನು ಸೇರಿಸಿ", "add_import_path": "ಆಮದು ಮಾರ್ಗವನ್ನು ಸೇರಿಸಿ", @@ -22,5 +24,6 @@ "add_path": "ಹಾದಿಯನ್ನು ಸೇರಿಸಿ", "add_photos": "ಫೋಟೋಗಳನ್ನು ಸೇರಿಸಿ", "add_to": "ಸೇರಿಸಿ…", - "add_to_album": "ಆಲ್ಬಮ್‌ಗೆ ಸೇರಿಸಿ" + "add_to_album": "ಆಲ್ಬಮ್‌ಗೆ ಸೇರಿಸಿ", + "add_to_album_bottom_sheet_added": "{album}ಗೆ ಸೇರಿಸಿದೆ" } diff --git a/i18n/ko.json b/i18n/ko.json index 3707501ec8..0c01c03263 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -8,7 +8,7 @@ "actions": "작업", "active": "활성", "activity": "활동", - "activity_changed": "활동이 {enabled, select, true {활성화} other {비활성화}}되었습니다.", + "activity_changed": "활동이 {enabled, select, true {활성화} other {비활성화}}되었습니다", "add": "추가", "add_a_description": "설명 추가", "add_a_location": "위치 추가", @@ -34,15 +34,15 @@ "add_to_albums_count": "여러 앨범에 추가 ({count})", "add_to_shared_album": "공유 앨범에 추가", "add_url": "URL 추가", - "added_to_archive": "보관함으로 이동되었습니다.", - "added_to_favorites": "즐겨찾기에 추가되었습니다.", + "added_to_archive": "보관함으로 이동되었습니다", + "added_to_favorites": "즐겨찾기에 추가되었습니다", "added_to_favorites_count": "즐겨찾기에 항목 {count, number}개 추가됨", "admin": { "add_exclusion_pattern_description": "*, **, ? 등의 glob 패턴을 사용할 수 있습니다. 예를 들어 \"Raw\" 폴더 내 모든 파일을 제외하려면 \"**/Raw/**\"를, .tif 파일을 제외하려면 \"**/*.tif\", 특정한 절대 경로를 제외하려면 \"/path/to/ignore/**\" 처럼 사용합니다.", "admin_user": "관리자", "asset_offline_description": "이 항목은 외부 라이브러리에 등록되었으나 디스크에서 찾을 수 없어 휴지통으로 이동했습니다. 파일이 라이브러리 경로 내에서 이동된 경우 타임라인에서 새로 인식된 항목이 있는지 확인해보세요. 이 항목을 복원하려면 아래 경로에 Immich가 접근할 수 있는지 확인하고 라이브러리를 다시 스캔하세요.", "authentication_settings": "인증 설정", - "authentication_settings_description": "비밀번호, OAuth 및 기타 인증 설정을 관리합니다.", + "authentication_settings_description": "비밀번호, OAuth 및 기타 인증 설정을 관리합니다", "authentication_settings_disable_all": "모든 로그인 수단을 비활성화하시겠습니까? 더이상 로그인할 수 없습니다.", "authentication_settings_reenable": "다시 활성화하려면 서버 명령어를 사용하세요.", "background_task_job": "백그라운드 작업", @@ -50,7 +50,7 @@ "backup_database_enable_description": "데이터베이스 덤프 활성화", "backup_keep_last_amount": "보관할 이전 덤프 수", "backup_onboarding_1_description": "개는 클라우드나 다른 물리적 위치에 보관합니다.", - "backup_onboarding_2_description": "개는 서로 다른 로컬 장치에 보관하고,", + "backup_onboarding_2_description": "다른 기기의 로컬 사본. 메인 파일과 로컬 백업을 포함합니다.", "backup_onboarding_3_description": "개의 데이터 사본을 만듭니다.", "backup_onboarding_description": "소중한 데이터를 안전하게 보호하기 위해 3-2-1 백업 전략 사용을 권장합니다. Immich를 백업할 때 업로드한 사진 및 동영상뿐 아니라 데이터베이스도 함께 보관해야 한다는 점을 잊지 마세요.", "backup_onboarding_footer": "Immich 백업에 대한 자세한 내용은 공식 문서를 참조하세요.", @@ -59,10 +59,10 @@ "backup_settings": "데이터베이스 덤프 설정", "backup_settings_description": "데이터베이스 덤프 주기와 보관 기간을 설정합니다.", "cleared_jobs": "작업 중단: {job}", - "config_set_by_file": "설정이 구성 파일을 통해 관리되고 있습니다.", + "config_set_by_file": "설정이 구성 파일을 통해 관리되고 있습니다", "confirm_delete_library": "{library} 라이브러리를 삭제하시겠습니까?", "confirm_delete_library_assets": "이 라이브러리를 삭제하시겠습니까? Immich에서 {count, plural, one {항목 #개가} other {항목 #개가}} 삭제되며 되돌릴 수 없습니다. 원본 파일은 디스크에 남아 있습니다.", - "confirm_email_below": "계속하려면 아래에 \"{email}\"을(를) 입력하세요.", + "confirm_email_below": "계속하려면 아래에 \"{email}\"을(를) 입력하세요", "confirm_reprocess_all_faces": "모든 얼굴을 다시 처리하시겠습니까? 이름이 지정된 인물도 초기화됩니다.", "confirm_user_password_reset": "{user}님의 비밀번호를 초기화하시겠습니까?", "confirm_user_pin_code_reset": "{user}님의 PIN 코드를 초기화하시겠습니까?", @@ -71,7 +71,7 @@ "cron_expression_description": "Cron 표현식으로 스캔 주기를 설정합니다. 자세한 내용은 다음을 참조하세요, Crontab Guru", "cron_expression_presets": "Cron 표현식 프리셋", "disable_login": "로그인 비활성화", - "duplicate_detection_job_description": "기계 학습으로 유사한 이미지를 감지합니다. 스마트 검색이 활성화되어 있어야 합니다.", + "duplicate_detection_job_description": "기계 학습으로 유사한 이미지를 감지합니다. 스마트 검색이 활성화되어 있어야 합니다", "exclusion_pattern_description": "라이브러리 스캔에서 제외할 파일이나 폴더 규칙을 설정합니다. 폴더에 원하지 않는 파일(RAW 파일 등)이 함께 존재하는 경우 유용합니다.", "external_library_management": "외부 라이브러리 관리", "face_detection": "얼굴 감지", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "활성화", "backup_controller_page_uploading_file_info": "파일 정보 업로드 중", "backup_err_only_album": "유일한 앨범은 삭제할 수 없습니다.", + "backup_error_sync_failed": "동기화에 실패했습니다. 백업을 진행할 수 없습니다.", "backup_info_card_assets": "항목", "backup_manual_cancelled": "취소됨", "backup_manual_in_progress": "업로드가 이미 진행 중입니다. 잠시 후 다시 시도하세요", @@ -1092,6 +1093,7 @@ "gcast_enabled": "구글 캐스트", "gcast_enabled_description": "이 기능은 Google의 외부 리소스를 사용하여 실행됩니다.", "general": "일반", + "geolocation_instruction_location": "GPS 좌표가 포함된 항목을 클릭해 위치를 사용하거나, 지도에서 직접 위치를 선택하세요", "get_help": "도움 얻기", "get_wifiname_error": "Wi-Fi 이름을 가져올 수 없습니다. 필수 권한이 부여되었는지, Wi-Fi 네트워크에 연결되어 있는지 확인하세요.", "getting_started": "시작하기", @@ -1387,20 +1389,25 @@ "no_assets_message": "여기를 클릭해 첫 사진을 업로드하세요.", "no_assets_to_show": "표시할 항목 없음", "no_cast_devices_found": "캐스트 기기 없음", + "no_checksum_local": "체크섬이 없습니다. 로컬 항목을 불러올 수 없습니다", + "no_checksum_remote": "체크섬이 없습니다. 외부 항목을 불러올 수 없습니다", "no_duplicates_found": "비슷한 항목이 없습니다.", "no_exif_info_available": "EXIF 정보 없음", "no_explore_results_message": "더 많은 사진을 업로드하여 탐색 기능을 사용하세요.", "no_favorites_message": "즐겨찾기에서 사진과 동영상을 빠르게 찾기", "no_libraries_message": "외부 라이브러리로 다른 경로의 사진과 동영상을 확인하세요.", + "no_local_assets_found": "체크섬에 맞는 로컬 항목을 찾을 수 없습니다", "no_locked_photos_message": "잠금 폴더의 사진 및 동영상은 숨겨지며 라이브러리를 탐색할 때 표시되지 않습니다.", "no_name": "이름 없음", "no_notifications": "알림 없음", "no_people_found": "일치하는 인물 없음", "no_places": "장소 없음", + "no_remote_assets_found": "체크섬에 맞는 외부 항목을 찾을 수 없습니다", "no_results": "결과 없음", "no_results_description": "동의어 또는 더 일반적인 단어를 사용해 보세요.", "no_shared_albums_message": "앨범을 만들어 주변 사람들과 사진 및 동영상을 공유하세요.", "no_uploads_in_progress": "진행 중인 업로드 없음", + "not_available": "없음", "not_in_any_album": "앨범에 없음", "not_selected": "선택되지 않음", "note_apply_storage_label_to_previously_uploaded assets": "참고: 이전에 업로드한 항목에도 스토리지 레이블을 적용하려면 다음을 실행합니다,", @@ -1435,6 +1442,8 @@ "open_the_search_filters": "검색 필터 열기", "options": "옵션", "or": "또는", + "organize_into_albums": "앨범으로 정리하기", + "organize_into_albums_description": "현재 동기화 설정을 사용하여 기존 사진을 앨범으로 정리합니다", "organize_your_library": "라이브러리 정리", "original": "원본", "other": "기타", @@ -1576,6 +1585,7 @@ "purchase_server_description_2": "서포터 배지", "purchase_server_title": "서버", "purchase_settings_server_activated": "서버 제품 키는 관리자가 제어합니다.", + "query_asset_id": "쿼리 항목 ID", "queue_status": "전체 {total}, {count} 대기 중", "rating": "등급", "rating_clear": "등급 초기화", @@ -1663,6 +1673,7 @@ "restore_user": "사용자 복원", "restored_asset": "항목이 복원되었습니다.", "resume": "재개", + "resume_paused_jobs": "재개 {count, plural, one {# 일시 중지된 작업} other {# 일시 중지된 작업}}", "retry_upload": "다시 시도", "review_duplicates": "비슷한 항목 확인", "review_large_files": "용량이 큰 파일 확인", @@ -1756,6 +1767,7 @@ "select_user_for_sharing_page_err_album": "앨범을 생성하지 못했습니다.", "selected": "선택됨", "selected_count": "{count, plural, other {#개 선택됨}}", + "selected_gps_coordinates": "선택한 GPS 좌표", "send_message": "메시지 전송", "send_welcome_email": "환영 이메일 전송", "server_endpoint": "서버 엔드포인트", diff --git a/i18n/lv.json b/i18n/lv.json index 941d1c59f7..db02cea147 100644 --- a/i18n/lv.json +++ b/i18n/lv.json @@ -65,9 +65,13 @@ "duplicate_detection_job_description": "Analizēt failus ar mašīnmācīšanos, lai noteiktu līdzīgus attēlus. Šī funkcija izmanto viedo meklēšanu", "external_library_management": "Ārējo bibliotēku pārvaldība", "face_detection": "Seju noteikšana", + "face_detection_description": "Atpazīt attēlos sejas, izmantojot mašīnmācīšanos. Video gadījumā tiek ņemta vērā tikai sīktēls. \"Atsvaidzināt\" atkārtoti apstrādā visus attēlus. \"Atiestatīt\" izdzēš visus pašreizējos seju datus. \"Trūkstošie\" ierindo attēlus, kas vēl nav apstrādāti. Pēc seju noteikšanas pabeigšanas atrastās sejas tiek ierindotas seju atpazīšanai, grupējot tās pēc esošas vai jauns personas.", + "facial_recognition_job_description": "Grupēt atpazītās sejas pēc cilvēkiem. Šis solis tiek veikts pēc seju noteikšanas pabeigšanas. \"Atiestatīt\" atkārtoti sagrupē visas sejas. \"Trūkstošie\" ierindo sejas, kurām nav piešķirta persona.", "image_format": "Formāts", "image_format_description": "WebP veido mazākus failus nekā JPEG, taču to kodēšana ir lēnāka.", - "image_fullsize_enabled_description": "Ģenerēt pilna izmēra attēlu formātiem, kas nav piemēroti izmantošanai tīmeklī. Ja ir iespējota opcija \"Priekšroka iegultajam priekšskatījumam\", tiks izmantoti iegultie priekšskatījumi bez konvertēšanas. Neietekmē tīmeklim draudzīgus formātus, piemēram, JPEG.", + "image_fullsize_description": "Pilnizmēra attēls ar noņemtiem metadatiem, ko izmanto, kad attēls ir tuvināts", + "image_fullsize_enabled": "Iespējot pilnizmēra attēlu ģenerēšanu", + "image_fullsize_enabled_description": "Ģenerēt pilnizmēra attēlu formātiem, kas nav piemēroti izmantošanai tīmeklī. Ja ir iespējota opcija \"Priekšroka iegultajam priekšskatījumam\", tiks izmantoti iegultie priekšskatījumi bez konvertēšanas. Neietekmē tīmeklim draudzīgus formātus, piemēram, JPEG.", "image_fullsize_quality_description": "Pilnizmēra attēlu kvalitāte no 1-100. Augstāka vērtība dos labāku kvalitāti, taču faili būs lielāka izmēra.", "image_fullsize_title": "Pilnizmēra attēlu iestatījumi", "image_prefer_embedded_preview": "Priekšroka iegultajam priekšskatījumam", @@ -92,15 +96,24 @@ "library_scanning_enable_description": "Iespējot periodisku bibliotēku skenēšanu", "library_settings": "Ārējā bibliotēka", "library_settings_description": "Ārējo bibliotēku iestatījumu pārvaldība", + "library_tasks_description": "Pārbaudīt ārējās bibliotēkas, lai atrastu jaunus un/vai mainītus failus", "library_watching_settings": "Bibliotēku uzraudzīšana (EKSPERIMENTĀLA)", "library_watching_settings_description": "Automātiski uzraudzīt, vai ir mainīti faili", + "machine_learning_availability_checks_enabled": "Iespējot pieejamības pārbaudes", "machine_learning_clip_model": "CLIP modelis", "machine_learning_duplicate_detection": "Dublikātu noteikšana", + "machine_learning_duplicate_detection_enabled": "Iespējot dublikātu noteikšanu", + "machine_learning_duplicate_detection_enabled_description": "Ja šī funkcija ir atspējota, joprojām tiks izlaisti identiski faili.", + "machine_learning_enabled": "Iespējot mašīnmācīšanos", + "machine_learning_enabled_description": "Ja funkcija ir atspējota, tiks atspējotas visas ML funkcijas neatkarīgi no zemāk esošajiem iestatījumiem.", "machine_learning_facial_recognition": "Seju atpazīšana", "machine_learning_facial_recognition_model": "Seju atpazīšanas modelis", + "machine_learning_facial_recognition_setting": "Iespējot seju atpazīšanu", "machine_learning_settings": "Mašīnmācīšanās iestatījumi", "machine_learning_settings_description": "Mašīnmācīšanās funkciju un iestatījumu pārvaldība", "machine_learning_smart_search": "Viedā meklēšana", + "machine_learning_smart_search_enabled": "Iespējot viedo meklēšanu", + "machine_learning_smart_search_enabled_description": "Ja funkcija ir atspējota, attēli netiks kodēti viedai meklēšanai.", "machine_learning_url_description": "Mašīnmācīšanās servera URL. Ja ir norādīts vairāk nekā viens URL, katrs serveris, sākot no pirmā līdz pēdējam, tiks pārbaudīts pa vienam, līdz kāds no tiem atbildēs veiksmīgi. Serveri, kas neatbild, tiks īslaicīgi ignorēti, līdz tie atkal būs pieejami tiešsaistē.", "manage_concurrency": "Vienlaicīgas darbības pārvaldība", "manage_log_settings": "Žurnāla iestatījumu pārvaldība", @@ -114,10 +127,14 @@ "map_settings": "Karte", "map_settings_description": "Kartes iestatījumu pārvaldība", "map_style_description": "URL uz style.json kartes tēmu", + "memory_generate_job": "Atmiņu ģenerēšana", "metadata_extraction_job": "Metadatu iegūšana", + "metadata_extraction_job_description": "iegūt metadatu informāciju no katra faila, piemēram, GPS, sejas un izšķirtspēju", + "metadata_faces_import_setting_description": "Importēt sejas no attēla EXIF datiem un blakusfailiem", "metadata_settings": "Metadatu iestatījumi", "metadata_settings_description": "Metadatu iestatījumu pārvaldība", "migration_job": "Migrācija", + "migration_job_description": "Pārvietot failu un seju sīktēlus uz jaunāko mapju struktūru", "nightly_tasks_cluster_faces_setting_description": "Veikt sejas atpazīšanu jaunatklātajām sejām", "nightly_tasks_cluster_new_faces_setting": "Sagrupēt jaunās sejas", "nightly_tasks_database_cleanup_setting": "Datubāzes apkopes uzdevumi", @@ -176,10 +193,15 @@ "server_settings_description": "Servera iestatījumu pārvaldība", "server_welcome_message": "Sveiciena ziņa", "server_welcome_message_description": "Ziņojums, kas tiek parādīts pieslēgšanās lapā.", + "sidecar_job": "Blakusfailu metadati", + "sidecar_job_description": "Atklāt vai sinhronizēt blakusfailu metadatus no failu sistēmas", + "slideshow_duration_description": "Katra attēla rādīšanas ilgums sekundēs", "smart_search_job_description": "Analizēt failus ar mašīnmācīšanos lai sagatavotu datus viedajai meklēšanai", "storage_template_date_time_sample": "Laika paraugs {date}", "storage_template_migration": "Krātuves veidņu migrācija", - "storage_template_migration_job": "Krātuves veidņu migrācijas uzdevums", + "storage_template_migration_description": "Piemēro pašreizējo {template} iepriekš augšupielādētajiem failiem", + "storage_template_migration_info": "Krātuves veidne pārveidos visus failu paplašinājumus uz mazajiem burtiem. Veidnes izmaiņas attieksies tikai uz jauniem failiem. Lai veidni piemērotu ar atpakaļejošu efektu iepriekš augšupielādētiem failiem, palaidiet {job}.", + "storage_template_migration_job": "Krātuves veidņu migrācijas uzdevumu", "storage_template_path_length": "Aptuvenais ceļa garuma ierobežojums: {length, number}/{limit, number}", "storage_template_settings": "Krātuves veidne", "system_settings": "Sistēmas iestatījumi", @@ -247,7 +269,7 @@ "age_years": "{years, plural, zero {# gadu} one {# gads} other {# gadi}}", "album_added": "Albums pievienots", "album_added_notification_setting_description": "Saņemt e-pasta paziņojumu, kad tevi pievieno kopīgam albumam", - "album_cover_updated": "Albuma attēls atjaunināts", + "album_cover_updated": "Albuma vāciņš atjaunināts", "album_delete_confirmation_description": "Ja šis albums tiek kopīgots, citi lietotāji vairs nevarēs tam piekļūt.", "album_deleted": "Albums dzēsts", "album_info_card_backup_album_excluded": "NEIEKĻAUTS", @@ -328,6 +350,7 @@ "automatic_endpoint_switching_title": "Automātiska URL pārslēgšana", "autoplay_slideshow": "Automātiska slaidrādes atskaņošana", "back": "Atpakaļ", + "background_backup_running_error": "Pašlaik darbojas dublēšana fonā, nevar uzsākt manuālu dublēšanu", "background_options": "Fona opcijas", "backup": "Dublēšana", "backup_album_selection_page_albums_device": "Albumi ierīcē ({count})", @@ -376,7 +399,7 @@ "backup_controller_page_remainder": "Atlikums", "backup_controller_page_remainder_sub": "Atlikušie fotoattēli un videoklipi, kurus dublēt no atlases", "backup_controller_page_server_storage": "Servera krātuve", - "backup_controller_page_start_backup": "Sākt Dublēšanu", + "backup_controller_page_start_backup": "Sākt dublēšanu", "backup_controller_page_status_off": "Automātiskā priekšplāna dublēšana ir izslēgta", "backup_controller_page_status_on": "Automātiskā priekšplāna dublēšana ir ieslēgta", "backup_controller_page_storage_format": "{used} no {total} tiek izmantots", @@ -393,20 +416,22 @@ "backup_manual_title": "Augšupielādes statuss", "backup_options_page_title": "Dublēšanas iestatījumi", "backup_settings_subtitle": "Pārvaldīt augšupielādes iestatījumus", - "backward": "Atpakaļejoši", + "backward": "Atpakaļejoša", "biometric_auth_enabled": "Ieslēgta biometriskā autentifikācija", "biometric_locked_out": "Biometriskā autentifikācija tev ir bloķēta", "biometric_no_options": "Nav pieejamas biometriskās autentifikācijas iespējas", "biometric_not_available": "Biometriskā autentifikācija šajā ierīcē nav pieejama", "birthdate_saved": "Dzimšanas datums veiksmīgi saglabāts", "birthdate_set_description": "Dzimšanas datums tiek izmantots, lai aprēķinātu šīs personas vecumu fotogrāfijas uzņemšanas brīdī.", + "blurred_background": "Izpludināts fons", "bugs_and_feature_requests": "Kļūdas un funkciju pieprasījumi", "build": "Būvējums", "build_image": "Būvējuma attēls", + "buy": "Iegādāties Immich", "cache_settings_clear_cache_button": "Iztīrīt kešatmiņu", "cache_settings_clear_cache_button_title": "Iztīra aplikācijas kešatmiņu. Tas būtiski ietekmēs lietotnes veiktspēju, līdz kešatmiņa būs pārbūvēta.", "cache_settings_duplicated_assets_clear_button": "NOTĪRĪT", - "cache_settings_duplicated_assets_subtitle": "Fotoattēli un videoklipi, kurus lietotne ir iekļāvusi melnajā sarakstā", + "cache_settings_duplicated_assets_subtitle": "Fotoattēli un videoklipi, kurus lietotne ir iekļāvusi ignorējamo sarakstā", "cache_settings_duplicated_assets_title": "Dublicētie faili ({count})", "cache_settings_statistics_album": "Bibliotēkas sīktēli", "cache_settings_statistics_full": "Pilni attēli", @@ -418,10 +443,14 @@ "cache_settings_tile_title": "Lokālā Krātuve", "cache_settings_title": "Kešdarbes iestatījumi", "camera": "Fotokamera", + "camera_brand": "Fotokameras zīmols", + "camera_model": "Fotokameras modelis", "cancel": "Atcelt", + "cancel_search": "Atcelt meklēšanu", "canceled": "Atcelts", "canceling": "Atceļ", "cannot_merge_people": "Nevar apvienot personas", + "cannot_undo_this_action": "Šo darbību nevar atcelt!", "cast": "Pārraidīt", "cast_description": "Konfigurēt pieejamos pārraides galamērķus", "change_date": "Mainīt datumu", @@ -432,6 +461,7 @@ "change_name": "Mainīt nosaukumu", "change_name_successfully": "Vārds veiksmīgi nomainīts", "change_password": "Nomainīt paroli", + "change_password_description": "Vai nu šī ir pirmā reize, kad pieslēdzaties sistēmai, vai arī ir iesniegts pieprasījums mainīt paroli. Lūdzu, ievadiet jauno paroli zemāk.", "change_password_form_confirm_password": "Apstiprināt Paroli", "change_password_form_description": "Sveiki {name},\n\nŠī ir pirmā reize, kad pierakstāties sistēmā, vai arī ir iesniegts pieprasījums mainīt paroli. Lūdzu, zemāk ievadiet jauno paroli.", "change_password_form_new_password": "Jauna Parole", @@ -445,7 +475,9 @@ "city": "Pilsēta", "clear": "Notīrīt", "clear_all": "Notīrīt visu", + "clear_all_recent_searches": "Notīrīt visas pēdējās meklēšanas", "clear_file_cache": "Notīrīt failu kešatmiņu", + "clear_message": "Notīrīt paziņojumu", "clear_value": "Notīrīt vērtību", "client_cert_dialog_msg_confirm": "Labi", "client_cert_enter_password": "Ievadi paroli", @@ -462,10 +494,14 @@ "color": "Krāsa", "color_theme": "Krāsu tēma", "comment_deleted": "Komentārs dzēsts", + "comment_options": "Komentāru iespējas", + "comments_and_likes": "Komentāri un tīkšķi", + "comments_are_disabled": "Komentāri ir atslēgti", "common_create_new_album": "Izveidot jaunu albumu", "common_server_error": "Lūdzu, pārbaudiet tīkla savienojumu, pārliecinieties, vai serveris ir sasniedzams un aplikācijas/servera versijas ir saderīgas.", "completed": "Pabeigts", "confirm": "Apstiprināt", + "confirm_admin_password": "Administratora paroles apstiprinājums", "confirm_new_pin_code": "Apstiprināt jauno PIN kodu", "confirm_password": "Apstiprināt paroli", "confirm_tag_face": "Vai vēlies atzīmēt šo seju kā {name}?", @@ -482,6 +518,8 @@ "copy_error": "Kopēšanas kļūda", "copy_to_clipboard": "Kopēt starpliktuvē", "country": "Valsts", + "cover": "Aizpildīts ekrāns", + "covers": "Vāciņi", "create": "Izveidot", "create_album": "Izveidot albumu", "create_album_page_untitled": "Bez nosaukuma", @@ -490,6 +528,7 @@ "create_link_to_share": "Izveidot kopīgošanas saiti", "create_new": "IZVEIDOT JAUNU", "create_new_person": "Izveidot jaunu personu", + "create_new_person_hint": "Piesaistīt izvēlētos failus jaunai personai", "create_new_user": "Izveidot jaunu lietotāju", "create_shared_album_page_share_add_assets": "PIEVIENOT AKTĪVUS", "create_shared_album_page_share_select_photos": "Fotoattēlu Izvēle", @@ -544,6 +583,8 @@ "details": "INFORMĀCIJA", "direction": "Secība", "discord": "Discord", + "discover": "Atklāt", + "discovered_devices": "Atrastās ierīces", "display_order": "Attēlošanas secība", "display_original_photos": "Rādīt oriģinālās fotogrāfijas", "documentation": "Dokumentācija", @@ -556,6 +597,8 @@ "download_error": "Lejupielādes kļūda", "download_failed": "Lejupielāde neizdevās", "download_finished": "Lejupielāde pabeigta", + "download_include_embedded_motion_videos": "Iegultie videoklipi", + "download_include_embedded_motion_videos_description": "Iekļaut video, kas iebūvēti kustīgos fotoattēlos, kā atsevišķu failu", "download_notfound": "Lejupielāde nav atrasta", "download_paused": "Lejupielāde nopauzēta", "download_settings": "Lejupielāde", @@ -607,6 +650,7 @@ "enter_your_pin_code_subtitle": "Ievadi savu PIN kodu, lai piekļūtu slēgtajai mapei", "error": "Kļūda", "error_change_sort_album": "Neizdevās nomainīt albuma kārtošanas secību", + "error_loading_image": "Kļūda, ielādējot attēlu", "error_loading_partners": "Kļūda, ielādējot partnerus: {error}", "error_saving_image": "Kļūda: {error}", "errors": { @@ -640,7 +684,8 @@ "unable_to_save_date_of_birth": "Neizdevās saglabāt dzimšanas datumu", "unable_to_scan_libraries": "Bibliotēku skenēšana neizdevās", "unable_to_scan_library": "Bibliotēkas skenēšana neizdevās", - "unable_to_trash_asset": "Neizdevās pārvietot failu uz atkritni" + "unable_to_trash_asset": "Neizdevās pārvietot failu uz atkritni", + "unable_to_update_album_cover": "Nevar atjaunināt albuma vāciņu" }, "exif": "Exif", "exif_bottom_sheet_description": "Pievienot Aprakstu...", @@ -712,6 +757,10 @@ "hashed_assets": "Faili ar jaucējvērtībām", "hashing": "Veido jaucējvērtības", "header_settings_field_validator_msg": "Vērtība nevar būt tukša", + "header_settings_header_name_input": "Galvenes lauks", + "header_settings_header_value_input": "Galvenes vērtība", + "headers_settings_tile_subtitle": "Norādiet starpniekservera galvenes, kuras lietotnei jānosūta ar katru tīkla pieprasījumu", + "headers_settings_tile_title": "Pielāgotas starpniekservera galvenes", "hide_all_people": "Paslēpt visas personas", "hide_gallery": "Paslēpt galeriju", "hide_named_person": "Paslēpt personu {name}", @@ -742,7 +791,7 @@ "ignore_icloud_photos_description": "iCloud uzglabātās fotogrāfijas netiks augšupielādētas Immich serverī", "image": "Attēls", "image_saved_successfully": "Attēls saglabāts", - "image_viewer_page_state_provider_download_started": "Lejupielāde Uzsākta", + "image_viewer_page_state_provider_download_started": "Lejupielāde uzsākta", "image_viewer_page_state_provider_download_success": "Lejupielāde izdevās", "image_viewer_page_state_provider_share_error": "Kopīgošanas Kļūda", "immich_logo": "Immich logo", @@ -908,6 +957,7 @@ "network_requirement_photos_upload": "Izmantot mobilo datu pārraidi, lai dublētu fotoattēlus", "network_requirement_videos_upload": "Izmantot mobilo datu pārraidi, lai dublētu video", "network_requirements": "Tīkla prasības", + "network_requirements_updated": "Tīkla prasības ir mainījušās, atiestata dublēšanas rindu", "networking_settings": "Tīkla iestatījumi", "networking_subtitle": "Pārvaldīt servera galapunktu iestatījumus", "never": "nekad", @@ -928,8 +978,12 @@ "no_archived_assets_message": "Arhivē fotoattēlus un videoklipus, lai paslēptu tos no Fotoattēli skata", "no_assets_message": "NOKLIKŠĶINIET, LAI AUGŠUPIELĀDĒTU SAVU PIRMO FOTOATTĒLU", "no_assets_to_show": "Nav uzrādāmo aktīvu", + "no_cast_devices_found": "Nav atrasta neviena pārraides ierīce", + "no_checksum_local": "Nav pieejama kontrolsumma - nevar iegūt vietējos failus", + "no_checksum_remote": "Nav pieejama kontrolsumma - nevar iegūt attālo failu", "no_duplicates_found": "Dublikāti netika atrasti.", "no_exif_info_available": "Nav pieejama exif informācija", + "no_explore_results_message": "Augšupielādē vairāk fotogrāfiju, lai iepazītu savu kolekciju.", "no_name": "Nav nosaukuma", "no_notifications": "Nav paziņojumu", "no_places": "Nav atrašanās vietu", @@ -1172,13 +1226,14 @@ "search_page_your_activity": "Jūsu aktivitāte", "search_page_your_map": "Jūsu Karte", "search_people": "Meklēt personas", + "search_rating": "Meklēt pēc vērtējuma...", "search_result_page_new_search_hint": "Jauns Meklējums", "search_settings": "Meklēt iestatījumos", "search_state": "Meklēt pēc štata...", "search_suggestion_list_smart_search_hint_1": "Viedā meklēšana pēc noklusējuma ir iespējota, lai meklētu metadatos, izmanto sintaksi ", "search_suggestion_list_smart_search_hint_2": "m:jūsu-meklēšanas-frāze", "search_type": "Meklēšanas veids", - "search_your_photos": "Meklēt Jūsu fotoattēlus", + "search_your_photos": "Meklēt fotoattēlos", "second": "Sekunde", "see_all_people": "Skatīt visas personas", "select_album_cover": "Izvēlieties albuma vāciņu", @@ -1200,6 +1255,8 @@ "server_privacy": "Servera privātums", "server_stats": "Servera statistika", "server_version": "Servera versija", + "set_as_album_cover": "Iestatīt kā albuma vāciņu", + "set_as_profile_picture": "Iestatīt kā profila attēlu", "set_date_of_birth": "Iestatīt dzimšanas datumu", "setting_image_viewer_help": "Detaļu skatītājs vispirms ielādē mazo sīktēlu, pēc tam ielādē vidēja lieluma priekšskatījumu (ja iespējots), visbeidzot ielādē oriģinālu (ja iespējots).", "setting_image_viewer_original_subtitle": "Iespējot sākotnējā pilnas izšķirtspējas attēla (liels!) ielādi. Atspējot, lai samazinātu datu lietojumu (gan tīklā, gan ierīces kešatmiņā).", @@ -1227,7 +1284,7 @@ "setup_pin_code": "Uzstādīt PIN kodu", "share": "Kopīgot", "share_add_photos": "Pievienot fotoattēlus", - "share_assets_selected": "{count} izvēlēti", + "share_assets_selected": "{count} atlasīti", "share_dialog_preparing": "Notiek sagatavošana...", "shared": "Kopīgots", "shared_album_activities_input_disable": "Komentāri atslēgti", @@ -1317,7 +1374,9 @@ "sort_title": "Nosaukums", "source": "Pirmkods", "stack": "Apvienot kaudzē", + "start": "Sākt", "start_date": "Sākuma datums", + "start_date_before_end_date": "Sākuma datumam jābūt pirms beigu datuma", "state": "Štats", "status": "Statuss", "stop_photo_sharing": "Beigt kopīgot jūsu fotogrāfijas?", @@ -1386,6 +1445,7 @@ "unlimited": "Neierobežots", "unnamed_album": "Albums bez nosaukuma", "unsaved_change": "Nesaglabāta izmaiņa", + "unselect_all": "Atcelt visu atlasi", "unstack": "At-Stekot", "updated_at": "Atjaunināts", "updated_password": "Parole ir atjaunināta", @@ -1426,6 +1486,7 @@ "version_history": "Versiju vēsture", "version_history_item": "{version} uzstādīta {date}", "video": "Videoklips", + "video_hover_setting_description": "Atskaņot video sīktēlu, kad peles kursors atrodas virs objekta. Pat ja funkcija ir atspējota, atskaņošanu var sākt, uzvirzot kursoru uz atskaņošanas ikonas.", "videos": "Videoklipi", "view": "Apskatīt", "view_album": "Skatīt Albumu", diff --git a/i18n/ml.json b/i18n/ml.json index 1ef0b46e66..0c85d53bd3 100644 --- a/i18n/ml.json +++ b/i18n/ml.json @@ -1,87 +1,2135 @@ { - "about": "വിഷയത്തെക്കുറിച്ച്", + "about": "കുറിച്ച്", "account": "അക്കൗണ്ട്", - "account_settings": "അക്കൗണ്ട് സെറ്റിംഗ്സ്", + "account_settings": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ", "acknowledge": "അംഗീകരിക്കുക", - "action": "ആക്ഷന്‍", - "action_common_update": "പുതുക്കുക", + "action": "പ്രവർത്തനം", + "action_common_update": "അപ്ഡേറ്റ് ചെയ്യുക", "actions": "പ്രവർത്തികൾ", - "active": "സജീവമായവ", - "activity": "പ്രവർത്തനങ്ങൾ", + "active": "സജീവം", + "activity": "പ്രവർത്തനം", + "activity_changed": "പ്രവർത്തനം {enabled, select, true {പ്രവർത്തനക്ഷമമാക്കി} other {നിർജ്ജീവമാക്കി}}", "add": "ചേർക്കുക", - "add_a_description": "ഒരു വിവരണം ചേർക്കുക", - "add_a_location": "ഒരു സ്ഥലം ചേർക്കുക", - "add_a_name": "ഒരു പേര് ചേർക്കുക", - "add_a_title": "ഒരു ശീർഷകം ചേർക്കുക", + "add_a_description": "വിവരണം ചേർക്കുക", + "add_a_location": "സ്ഥാനം ചേർക്കുക", + "add_a_name": "പേര് ചേർക്കുക", + "add_a_title": "ശീർഷകം ചേർക്കുക", "add_birthday": "ജന്മദിനം ചേർക്കുക", - "add_endpoint": "എൻഡ്പോയിന്റ് ചേർക്കുക", - "add_exclusion_pattern": "ഒഴിവാക്കാനുള്ള മാതൃക ചേർക്കുക", - "add_import_path": "ഇറക്കുമതി ചെയ്യുക", - "add_location": "സ്ഥലനാമം ചേര്‍ക്കുക", - "add_more_users": "കൂടുതല്‍ ഉപയോക്താക്കളെ ചേര്‍ക്കുക", - "add_partner": "പങ്കാളിയെ ചേര്‍ക്കുക", - "add_path": "പാത ചേര്‍ക്കുക", - "add_photos": "ചിത്രങ്ങള്‍ ചേര്‍ക്കുക", - "add_tag": "ടാഗ് ചേര്‍ക്കുക", - "add_to": "ചേര്‍ക്കുക…", - "add_to_album": "ആല്‍ബത്തിലേക്ക് ചേര്‍ക്കുക", - "add_to_album_bottom_sheet_added": "{album} - ലേക്ക് ചേര്‍ത്തു", - "add_to_album_bottom_sheet_already_exists": "{album} ആൽബത്തിൽ ഇപ്പോള്‍ തന്നെ ഉണ്ട്", - "add_to_albums": "ആൽബങ്ങളിൽ ചേർക്കുക", - "add_to_albums_count": "ആൽബങ്ങളിൽ ചേർക്കുക ({count})", + "add_endpoint": "എൻഡ്‌പോയിന്റ് ചേർക്കുക", + "add_exclusion_pattern": "ഒഴിവാക്കൽ പാറ്റേൺ ചേർക്കുക", + "add_import_path": "ഇമ്പോർട്ട് പാത്ത് ചേർക്കുക", + "add_location": "സ്ഥാനം ചേർക്കുക", + "add_more_users": "കൂടുതൽ ഉപയോക്താക്കളെ ചേർക്കുക", + "add_partner": "പങ്കാളിയെ ചേർക്കുക", + "add_path": "പാത്ത് ചേർക്കുക", + "add_photos": "ഫോട്ടോകൾ ചേർക്കുക", + "add_tag": "ടാഗ് ചേർക്കുക", + "add_to": "...ലേക്ക് ചേർക്കുക", + "add_to_album": "ആൽബത്തിലേക്ക് ചേർക്കുക", + "add_to_album_bottom_sheet_added": "{album} എന്നതിലേക്ക് ചേർത്തു", + "add_to_album_bottom_sheet_already_exists": "{album}-ൽ ഇതിനകം തന്നെയുണ്ട്", + "add_to_album_bottom_sheet_some_local_assets": "ചില പ്രാദേശിക അസറ്റുകൾ ആൽബത്തിലേക്ക് ചേർക്കാൻ കഴിഞ്ഞില്ല", + "add_to_album_toggle": "{album}-നുള്ള തിരഞ്ഞെടുപ്പ് ടോഗിൾ ചെയ്യുക", + "add_to_albums": "ആൽബങ്ങളിലേക്ക് ചേർക്കുക", + "add_to_albums_count": "ആൽബങ്ങളിലേക്ക് ചേർക്കുക ({count})", "add_to_shared_album": "പങ്കിട്ട ആൽബത്തിലേക്ക് ചേർക്കുക", - "add_url": "URL ചേര്‍ക്കുക", - "added_to_archive": "ചരിത്രരേഖയായി (ആര്‍ക്കൈവ്) ചേര്‍ത്തിരിക്കുന്നു", - "added_to_favorites": "ഇഷ്ടപ്പെട്ടവയിലേക്ക് ചേര്‍ത്തു", - "added_to_favorites_count": "{count, number} ഇഷ്ടപ്പെട്ടവയിലേക്ക് ചേര്‍ത്തു", + "add_url": "URL ചേർക്കുക", + "added_to_archive": "ആർക്കൈവിലേക്ക് ചേർത്തു", + "added_to_favorites": "പ്രിയപ്പെട്ടവയിലേക്ക് ചേർത്തു", + "added_to_favorites_count": "{count, number} എണ്ണം പ്രിയപ്പെട്ടവയിലേക്ക് ചേർത്തു", "admin": { - "add_exclusion_pattern_description": "ഒഴിവാക്കൽ ചിഹ്നങ്ങള്‍ ചേർക്കുക. *, **, ? എന്നിവ ഉപയോഗിച്ചുള്ള ഗ്ലോബിംഗ് പിന്തുണയ്ക്കുന്നു. \"Raw\" എന്ന് പേരുള്ള ഏതെങ്കിലും ഡയറക്ടറിയിലെ എല്ലാ ഫയലുകളും അവഗണിക്കാൻ, \"**/Raw/**\" ഉപയോഗിക്കുക. \".tif\" ൽ അവസാനിക്കുന്ന എല്ലാ ഫയലുകളും അവഗണിക്കാൻ, \"**/*.tif\" ഉപയോഗിക്കുക. ഒരു പരിപൂർണ്ണമായ പാത അവഗണിക്കാൻ, \"/path/to/ignore/**\" ഉപയോഗിക്കുക.", - "admin_user": "ഭരണാധികാരി", - "asset_offline_description": "ഈ പുറത്തുള്ള ശേഖരത്തിലെ വസ്തുക്കള്‍ ഇനി ഡിസ്കിൽ കാണുന്നില്ല, അവയെ ട്രാഷിലേക്ക് നീക്കിയിരിക്കുന്നു. ഫയൽ ലൈബ്രറിക്കുള്ളിൽ നിന്ന് നീക്കിയിട്ടുണ്ടെങ്കിൽ, പുതിയ അനുബന്ധ വസ്തുവിനായി നിങ്ങളുടെ സമയക്രമം (ടൈംലൈന്‍) പരിശോധിക്കുക. ഈ വസ്തു പുനഃസ്ഥാപിക്കാൻ, താഴെയുള്ള ഫയൽ പാത്ത് ഇമ്മിച്ചിന് എത്തിപ്പെടാന്‍ കഴിയുമെന്ന് ഉറപ്പാക്കുകയും ശേഖരം പുനഃപരിശോധിക്കുകയും (സ്കാൻ) ചെയ്യുക.", - "authentication_settings": "ആധികാരികതാ സജ്ജീകരണങ്ങൾ", - "authentication_settings_description": "പാസ്സ്‌വേര്‍ഡ്‌, OAuth തുടങ്ങിയ സജ്ജീകരണങ്ങള്‍", - "authentication_settings_disable_all": "എല്ലാ പ്രവേശന (ലോഗിൻ) രീതികളും പ്രവർത്തനരഹിതമാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? പ്രവേശനങ്ങള്‍ പൂർണ്ണമായും പ്രവർത്തനരഹിതമാക്കപ്പെടും.", - "background_task_job": "പശ്ചാത്തല പ്രവര്‍ത്തികള്‍", - "backup_database": "ഡാറ്റാബേസ് ഡംമ്പ് ഉണ്ടാക്കുക", - "backup_database_enable_description": "ഡാറ്റാബേസ് ഡമ്പുകൾ പ്രാപ്തമാക്കുക", - "backup_keep_last_amount": "പഴയ ഡാറ്റാബേസ് ഡമ്പുകൾ എത്രയെണ്ണം സൂക്ഷിക്കണം", - "backup_settings": "ഡാറ്റാബേസ് ഡമ്പ് ക്രമീകരണങ്ങള്‍", - "backup_settings_description": "ഡാറ്റാബേസ് ഡമ്പ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക.", - "cleared_jobs": "{job} - ന്‍റെ ജോലികള്‍ മായ്ച്ചിരിക്കുന്നു", - "config_set_by_file": "ക്രമീകരണങ്ങള്‍ ഇപ്പോള്‍ ഒരു ക്രമീകരണ ഫയല്‍ വഴിയാണ് നിശ്ചയിക്കുന്നത്", - "confirm_delete_library": "{library} മായ്ച്ചു കളയണം എന്നുറപ്പാണോ?", - "confirm_delete_library_assets": "ഈ ശേഖരം ഇല്ലാതാക്കണം എന്ന് ഉറപ്പാണോ? ഇത് ഇമ്മിച്ചിൽ നിന്ന് {count, plural, one {# contained asset} other {all # contained assets}} ഇല്ലാതാക്കും, ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല. ഫയലുകൾ ഡിസ്കിൽ തന്നെ തുടരും.", - "confirm_email_below": "തീര്‍ച്ചപ്പെടുത്താന്‍ {email} താഴെ കൊടുക്കുക", - "confirm_reprocess_all_faces": "എല്ലാ മുഖങ്ങളും വീണ്ടും കണ്ടെത്തണം എന്ന് ഉറപ്പാണോ? ഇത് ഇതിനകം പേരു ചേര്‍ത്ത മുഖങ്ങളെയും ആളുകളെയും മായ്ക്കും.", - "confirm_user_password_reset": "{user} എന്ന ഉപയോക്താവിന്‍റെ പാസ്സ്‌വേര്‍ഡ്‌ പുനഃക്രമീകരിക്കണം എന്നുറപ്പാണോ?", - "confirm_user_pin_code_reset": "{user} എന്ന ഉപയോക്താവിന്‍റെ PIN പുനഃക്രമീകരിക്കണം എന്നുറപ്പാണോ?", - "create_job": "ജോലി സൃഷ്ടിക്കുക", - "cron_expression": "ക്രോണ്‍ (cron) പ്രയോഗശൈലി", - "cron_expression_description": "ക്രോൺ ഫോർമാറ്റ് ഉപയോഗിച്ച് സ്കാനിംഗ് ഇടവേള സജ്ജമാക്കുക. കൂടുതൽ വിവരങ്ങൾക്ക് Crontab Guru സന്ദര്‍ശിക്കുക", - "cron_expression_presets": "മുന്‍കൂട്ടി തയ്യാര്‍ ചെയ്ത ക്രോണ്‍ പ്രവര്‍ത്തനശൈലികള്‍", - "disable_login": "ലോഗിന്‍ തടയുക", - "duplicate_detection_job_description": "സമാനമായ ചിത്രങ്ങൾ കണ്ടെത്താൻ വസ്തുവഹകളില്‍ യന്ത്രപഠനം പ്രവർത്തിപ്പിക്കുക. ഇത് സ്മാർട്ട് സര്‍ച്ചിനെ ആശ്രയിക്കുന്നു", - "exclusion_pattern_description": "നിങ്ങളുടെ ലൈബ്രറി സ്കാൻ ചെയ്യുമ്പോൾ ഫയലുകളും ഫോൾഡറുകളും അവഗണിക്കാൻ ഒഴിവാക്കല്‍ മാതൃകകള്‍ നിങ്ങളെ അനുവദിക്കുന്നു. RAW ഫയലുകൾ പോലുള്ള നിങ്ങൾക്ക് ഇറക്കുമതി ചെയ്യാൻ താൽപ്പര്യമില്ലാത്ത ഫയലുകൾ അടങ്ങിയ ഫോൾഡറുകൾ ഉണ്ടെങ്കിൽ ഇത് ഉപയോഗപ്രദമാണ്.", - "external_library_management": "ബാഹ്യമായശേഖരങ്ങളുടെ നിയന്ത്രണം", - "face_detection": "മുഖങ്ങള്‍ കണ്ടെത്തുക", - "face_detection_description": "യന്ത്രപഠനം ഉപയോഗിച്ച് വസ്തുക്കളിലെ മുഖങ്ങൾ കണ്ടെത്തുക. വീഡിയോകൾക്ക്, തംബ്‌നെയിൽ മാത്രമേ പരിഗണിക്കൂ. \"Refresh\" എല്ലാ വസ്തുക്കളും (വീണ്ടും) പ്രോസസ്സ് ചെയ്യുന്നു. കൂടാതെ \"Reset\" നിലവിലുള്ള എല്ലാ മുഖളും വിവരങ്ങളും മായ്‌ക്കുന്നു. \"Missing\" ഇതുവരെ ക്രമീകരിക്കാത്ത വസ്തുക്കളെ വരിയിലേക്ക് നിർത്തുന്നു. മുഖം തിരിച്ചറിയൽ പൂർത്തിയായ ശേഷം കണ്ടെത്തിയ മുഖങ്ങൾ മുഖം തിരിച്ചറിയലിനായി ക്യൂവിൽ നിർത്തും, അവയെ നിലവിലുള്ളതോ പുതിയതോ ആയ ആളുകളിലേക്ക് ഗ്രൂപ്പുചെയ്യും.", - "facial_recognition_job_description": "കണ്ടെത്തിയ മുഖങ്ങളെ ആളുകളുടെ കൂട്ടം ആക്കുക. മുഖം കണ്ടെത്തല്‍ ഘട്ടത്തിനു ശേഷമേ ഇത് ഉണ്ടാകൂ. \"Reset\" വീണ്ടും കൂട്ടങ്ങളെ ഉണ്ടാക്കും. \"Missing\" ആളെ നിയോഗിക്കാത്ത മുഖങ്ങളെ വരിയിലേക്ക് ചേര്‍ക്കുന്നു.", - "failed_job_command": "{job} എന്ന ജോലിക്ക് വേണ്ടിയുള്ള ആജ്ഞ {command} പരാജയപ്പെട്ടിരിക്കുന്നു", - "force_delete_user_warning": "മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിനെയും എല്ലാ വസ്തുക്കളേയും ഉടനടി നീക്കം ചെയ്യും. ഇത് പഴയപടിയാക്കാനോ ഫയലുകൾ വീണ്ടെടുക്കാനോ കഴിയില്ല.", - "image_format": "ഘടന", - "image_format_description": "WebP ഉണ്ടാക്കാന്‍ സമയം എടുക്കും എങ്കിലും JPEG ഫയലുകളെക്കാള്‍ ചെറുതായിരിക്കും.", - "image_fullsize_description": "അധികവിവരങ്ങള്‍ ഒഴിവാക്കിയ ചിത്രം, വലുതാക്കി കാണിക്കുമ്പോള്‍ ഉപയോഗിക്കപ്പെടുന്നു", - "image_fullsize_enabled": "പൂര്‍ണ വലുപ്പത്തില്‍ ഉള്ള ചിത്രങ്ങള്‍ ഉണ്ടാക്കാന്‍പ്രാപ്തമാക്കുക", - "image_fullsize_quality_description": "1 മുതൽ 100 വരെയുള്ള പൂർണ്ണ വലുപ്പത്തിലുള്ള ഇമേജ് നിലവാരം. ഉയർന്നതാണ് നല്ലത്, പക്ഷേ വലിയ ഫയലുകൾ ഉത്പാദിപ്പിക്കുന്നു.", - "image_fullsize_title": "പൂർണ്ണ വലുപ്പത്തിലുള്ള ഇമേജ് ക്രമീകരണങ്ങൾ", - "image_quality": "ഗുണനിലവാരം", + "add_exclusion_pattern_description": "ഒഴിവാക്കൽ പാറ്റേണുകൾ ചേർക്കുക. *, **, ? എന്നിവ ഉപയോഗിച്ചുള്ള ഗ്ലോബിംഗ് പിന്തുണയ്ക്കുന്നു. \"Raw\" എന്ന് പേരുള്ള ഏതെങ്കിലും ഡയറക്ടറിയിലെ എല്ലാ ഫയലുകളും ഒഴിവാക്കാൻ, \"**/Raw/**\" ഉപയോഗിക്കുക. \".tif\"-ൽ അവസാനിക്കുന്ന എല്ലാ ഫയലുകളും ഒഴിവാക്കാൻ, \"**/*.tif\" ഉപയോഗിക്കുക. ഒരു കേവല പാത്ത് ഒഴിവാക്കാൻ, \"/path/to/ignore/**\" ഉപയോഗിക്കുക.", + "admin_user": "അഡ്മിൻ ഉപയോക്താവ്", + "asset_offline_description": "ഈ എക്സ്റ്റേണൽ ലൈബ്രറി അസറ്റ് ഇപ്പോൾ ഡിസ്കിൽ ലഭ്യമല്ല, അത് ട്രാഷിലേക്ക് മാറ്റിയിരിക്കുന്നു. ഫയൽ ലൈബ്രറിക്കുള്ളിൽ നീക്കിയിട്ടുണ്ടെങ്കിൽ, പുതിയ അനുബന്ധ അസറ്റിനായി നിങ്ങളുടെ ടൈംലൈൻ പരിശോധിക്കുക. ഈ അസറ്റ് പുനഃസ്ഥാപിക്കാൻ, താഴെയുള്ള ഫയൽ പാത Immich-ന് ആക്സസ് ചെയ്യാൻ കഴിയുമെന്ന് ഉറപ്പാക്കുകയും ലൈബ്രറി സ്കാൻ ചെയ്യുകയും ചെയ്യുക.", + "authentication_settings": "പ്രാമാണീകരണ ക്രമീകരണങ്ങൾ", + "authentication_settings_description": "പാസ്‌വേഡ്, OAuth, മറ്റ് പ്രാമാണീകരണ ക്രമീകരണങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യുക", + "authentication_settings_disable_all": "എല്ലാ ലോഗിൻ രീതികളും പ്രവർത്തനരഹിതമാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ലോഗിൻ പൂർണ്ണമായും പ്രവർത്തനരഹിതമാകും.", + "authentication_settings_reenable": "വീണ്ടും പ്രവർത്തനക്ഷമമാക്കാൻ, ഒരു സെർവർ കമാൻഡ് ഉപയോഗിക്കുക.", + "background_task_job": "പശ്ചാത്തല ജോലികൾ", + "backup_database": "ഡാറ്റാബേസ് ഡംപ് ഉണ്ടാക്കുക", + "backup_database_enable_description": "ഡാറ്റാബേസ് ഡംപുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "backup_keep_last_amount": "സൂക്ഷിക്കേണ്ട പഴയ ഡംപുകളുടെ എണ്ണം", + "backup_onboarding_1_description": "ക്ലൗഡിലോ മറ്റൊരു ഭൗതിക സ്ഥാനത്തോ ഉള്ള ഓഫ്‌സൈറ്റ് പകർപ്പ്.", + "backup_onboarding_2_description": "വിവിധ ഉപകരണങ്ങളിലെ പ്രാദേശിക പകർപ്പുകൾ. ഇതിൽ പ്രധാന ഫയലുകളും ആ ഫയലുകളുടെ പ്രാദേശിക ബാക്കപ്പും ഉൾപ്പെടുന്നു.", + "backup_onboarding_3_description": "യഥാർത്ഥ ഫയലുകൾ ഉൾപ്പെടെ നിങ്ങളുടെ ഡാറ്റയുടെ ആകെ പകർപ്പുകൾ. ഇതിൽ 1 ഓഫ്‌സൈറ്റ് പകർപ്പും 2 പ്രാദേശിക പകർപ്പുകളും ഉൾപ്പെടുന്നു.", + "backup_onboarding_description": "നിങ്ങളുടെ ഡാറ്റ പരിരക്ഷിക്കാൻ 3-2-1 ബാക്കപ്പ് തന്ത്രം ശുപാർശ ചെയ്യുന്നു. സമഗ്രമായ ഒരു ബാക്കപ്പ് പരിഹാരത്തിനായി, നിങ്ങൾ അപ്‌ലോഡ് ചെയ്ത ഫോട്ടോകളുടെ/വീഡിയോകളുടെ പകർപ്പുകളും Immich ഡാറ്റാബേസും സൂക്ഷിക്കേണ്ടതാണ്.", + "backup_onboarding_footer": "Immich ബാക്കപ്പ് ചെയ്യുന്നതിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്കായി, ദയവായി ഡോക്യുമെന്റേഷൻ പരിശോധിക്കുക.", + "backup_onboarding_parts_title": "ഒരു 3-2-1 ബാക്കപ്പിൽ ഉൾപ്പെടുന്നവ:", + "backup_onboarding_title": "ബാക്കപ്പുകൾ", + "backup_settings": "ഡാറ്റാബേസ് ഡംപ് ക്രമീകരണങ്ങൾ", + "backup_settings_description": "ഡാറ്റാബേസ് ഡംപ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക.", + "cleared_jobs": "{job}-നുള്ള ജോലികൾ ക്ലിയർ ചെയ്തു", + "config_set_by_file": "കോൺഫിഗറേഷൻ നിലവിൽ ഒരു കോൺഫിഗറേഷൻ ഫയൽ വഴിയാണ് സജ്ജീകരിച്ചിരിക്കുന്നത്", + "confirm_delete_library": "{library} ലൈബ്രറി ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "confirm_delete_library_assets": "ഈ ലൈബ്രറി ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് Immich-ൽ നിന്ന് {count, plural, one {അതിലുള്ള ഒരു അസറ്റ്} other {അതിലുള്ള എല്ലാ # അസറ്റുകളും}} ഇല്ലാതാക്കും, ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല. ഫയലുകൾ ഡിസ്കിൽ തന്നെ തുടരും.", + "confirm_email_below": "സ്ഥിരീകരിക്കുന്നതിന്, താഴെ \"{email}\" എന്ന് ടൈപ്പ് ചെയ്യുക", + "confirm_reprocess_all_faces": "എല്ലാ മുഖങ്ങളും വീണ്ടും പ്രോസസ്സ് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് പേരുള്ള ആളുകളെയും നീക്കം ചെയ്യും.", + "confirm_user_password_reset": "{user}-ന്റെ പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "confirm_user_pin_code_reset": "{user}-ന്റെ പിൻ കോഡ് റീസെറ്റ് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "create_job": "ജോലി ഉണ്ടാക്കുക", + "cron_expression": "ക്രോൺ എക്സ്പ്രഷൻ", + "cron_expression_description": "ക്രോൺ ഫോർമാറ്റ് ഉപയോഗിച്ച് സ്കാനിംഗ് ഇടവേള സജ്ജീകരിക്കുക. കൂടുതൽ വിവരങ്ങൾക്കായി ദയവായി ക്രോൺടാബ് ഗുരു പോലുള്ളവ പരിശോധിക്കുക", + "cron_expression_presets": "ക്രോൺ എക്സ്പ്രഷൻ പ്രീസെറ്റുകൾ", + "disable_login": "ലോഗിൻ പ്രവർത്തനരഹിതമാക്കുക", + "duplicate_detection_job_description": "സമാന ചിത്രങ്ങൾ കണ്ടെത്താൻ അസറ്റുകളിൽ മെഷീൻ ലേണിംഗ് പ്രവർത്തിപ്പിക്കുക. ഇത് സ്മാർട്ട് സെർച്ചിനെ ആശ്രയിച്ചിരിക്കുന്നു", + "exclusion_pattern_description": "നിങ്ങളുടെ ലൈബ്രറി സ്കാൻ ചെയ്യുമ്പോൾ ഫയലുകളും ഫോൾഡറുകളും ഒഴിവാക്കാൻ എക്സ്ക്ലൂഷൻ പാറ്റേണുകൾ നിങ്ങളെ സഹായിക്കുന്നു. നിങ്ങൾ ഇമ്പോർട്ട് ചെയ്യാൻ ആഗ്രഹിക്കാത്ത ഫയലുകൾ അടങ്ങിയ ഫോൾഡറുകൾ (ഉദാഹരണത്തിന് RAW ഫയലുകൾ) ഉണ്ടെങ്കിൽ ഇത് ഉപയോഗപ്രദമാണ്.", + "external_library_management": "എക്സ്റ്റേണൽ ലൈബ്രറി മാനേജ്മെന്റ്", + "face_detection": "മുഖം തിരിച്ചറിയൽ", + "face_detection_description": "മെഷീൻ ലേണിംഗ് ഉപയോഗിച്ച് അസറ്റുകളിലെ മുഖങ്ങൾ കണ്ടെത്തുക. വീഡിയോകൾക്കായി, തംബ്നെയിൽ മാത്രമേ പരിഗണിക്കൂ. \"റിഫ്രഷ്\" എല്ലാ അസറ്റുകളും വീണ്ടും പ്രോസസ്സ് ചെയ്യുന്നു. \"റീസെറ്റ്\" നിലവിലുള്ള എല്ലാ മുഖ ഡാറ്റയും നീക്കംചെയ്യുന്നു. \"മിസ്സിംഗ്\" ഇതുവരെ പ്രോസസ്സ് ചെയ്യാത്ത അസറ്റുകളെ ക്യൂവിലാക്കുന്നു. മുഖം തിരിച്ചറിയൽ പൂർത്തിയായ ശേഷം, കണ്ടെത്തിയ മുഖങ്ങൾ ഫേഷ്യൽ റെക്കഗ്നിഷനായി ക്യൂ ചെയ്യപ്പെടും, അവയെ നിലവിലുള്ളതോ പുതിയതോ ആയ ആളുകളായി തരംതിരിക്കും.", + "facial_recognition_job_description": "കണ്ടെത്തിയ മുഖങ്ങളെ ആളുകളായി ഗ്രൂപ്പ് ചെയ്യുക. മുഖം കണ്ടെത്തൽ പൂർത്തിയായതിന് ശേഷമാണ് ഈ ഘട്ടം പ്രവർത്തിക്കുന്നത്. \"റീസെറ്റ്\" എല്ലാ മുഖങ്ങളെയും വീണ്ടും ക്ലസ്റ്റർ ചെയ്യുന്നു. \"മിസ്സിംഗ്\" ഒരു വ്യക്തിയെയും അസൈൻ ചെയ്യാത്ത മുഖങ്ങളെ ക്യൂവിലാക്കുന്നു.", + "failed_job_command": "{job} എന്ന ജോലിക്കുള്ള കമാൻഡ് {command} പരാജയപ്പെട്ടു", + "force_delete_user_warning": "മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിനെയും എല്ലാ അസറ്റുകളെയും ഉടനടി നീക്കം ചെയ്യും. ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല, ഫയലുകൾ വീണ്ടെടുക്കാനും സാധിക്കില്ല.", + "image_format": "ഫോർമാറ്റ്", + "image_format_description": "WebP, JPEG-നെക്കാൾ ചെറിയ ഫയലുകൾ നിർമ്മിക്കുന്നു, പക്ഷേ എൻകോഡ് ചെയ്യാൻ വേഗത കുറവാണ്.", + "image_fullsize_description": "മെറ്റാഡാറ്റ നീക്കംചെയ്ത പൂർണ്ണ വലുപ്പത്തിലുള്ള ചിത്രം, സൂം ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നു", + "image_fullsize_enabled": "പൂർണ്ണ വലുപ്പത്തിലുള്ള ചിത്ര നിർമ്മാണം പ്രവർത്തനക്ഷമമാക്കുക", + "image_fullsize_enabled_description": "വെബ്-ഫ്രണ്ട്ലി അല്ലാത്ത ഫോർമാറ്റുകൾക്കായി പൂർണ്ണ വലുപ്പത്തിലുള്ള ചിത്രം നിർമ്മിക്കുക. \"എംബഡഡ് പ്രിവ്യൂവിന് മുൻഗണന നൽകുക\" പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, എംബഡഡ് പ്രിവ്യൂകൾ പരിവർത്തനം കൂടാതെ നേരിട്ട് ഉപയോഗിക്കുന്നു. JPEG പോലുള്ള വെബ്-ഫ്രണ്ട്ലി ഫോർമാറ്റുകളെ ഇത് ബാധിക്കില്ല.", + "image_fullsize_quality_description": "പൂർണ്ണ വലുപ്പത്തിലുള്ള ചിത്രത്തിന്റെ ഗുണമേന്മ 1-100 വരെ. ഉയർന്ന മൂല്യം മികച്ചതാണ്, പക്ഷേ വലിയ ഫയലുകൾ ഉണ്ടാക്കുന്നു.", + "image_fullsize_title": "പൂർണ്ണ വലുപ്പ ചിത്ര ക്രമീകരണങ്ങൾ", + "image_prefer_embedded_preview": "എംബഡഡ് പ്രിവ്യൂവിന് മുൻഗണന നൽകുക", + "image_prefer_embedded_preview_setting_description": "ലഭ്യമാകുമ്പോൾ, റോ (RAW) ഫോട്ടോകളിലെ എംബഡഡ് പ്രിവ്യൂകൾ ഇമേജ് പ്രോസസ്സിംഗിനുള്ള ഇൻപുട്ടായി ഉപയോഗിക്കുക. ഇത് ചില ചിത്രങ്ങൾക്ക് കൂടുതൽ കൃത്യമായ നിറങ്ങൾ നൽകിയേക്കാം, പക്ഷേ പ്രിവ്യൂവിൻ്റെ ഗുണനിലവാരം ക്യാമറയെ ആശ്രയിച്ചിരിക്കും, കൂടാതെ ചിത്രത്തിൽ കൂടുതൽ കംപ്രഷൻ ആർട്ടിഫാക്റ്റുകൾ ഉണ്ടാകാം.", + "image_prefer_wide_gamut": "വൈഡ് ഗാമറ്റിന് മുൻഗണന നൽകുക", + "image_prefer_wide_gamut_setting_description": "തംബ്നെയിലുകൾക്കായി ഡിസ്പ്ലേ P3 ഉപയോഗിക്കുക. ഇത് വൈഡ് കളർസ്പേസുകളുള്ള ചിത്രങ്ങളുടെ മിഴിവ് നന്നായി സംരക്ഷിക്കുന്നു, പക്ഷേ പഴയ ബ്രൗസർ പതിപ്പുള്ള പഴയ ഉപകരണങ്ങളിൽ ചിത്രങ്ങൾ വ്യത്യസ്തമായി കാണപ്പെട്ടേക്കാം. കളർ ഷിഫ്റ്റുകൾ ഒഴിവാക്കാൻ sRGB ചിത്രങ്ങൾ sRGB ആയി തന്നെ നിലനിർത്തുന്നു.", + "image_preview_description": "മെറ്റാഡാറ്റ നീക്കംചെയ്ത ഇടത്തരം വലുപ്പമുള്ള ചിത്രം, ഒരൊറ്റ അസറ്റ് കാണുമ്പോഴും മെഷീൻ ലേണിംഗിനും ഉപയോഗിക്കുന്നു", + "image_preview_quality_description": "പ്രിവ്യൂ ഗുണമേന്മ 1-100 വരെ. ഉയർന്ന മൂല്യം മികച്ചതാണ്, പക്ഷേ വലിയ ഫയലുകൾ ഉണ്ടാക്കുകയും ആപ്പിന്റെ പ്രതികരണശേഷി കുറയ്ക്കുകയും ചെയ്യും. കുറഞ്ഞ മൂല്യം സജ്ജീകരിക്കുന്നത് മെഷീൻ ലേണിംഗ് ഗുണമേന്മയെ ബാധിച്ചേക്കാം.", + "image_preview_title": "പ്രിവ്യൂ ക്രമീകരണങ്ങൾ", + "image_quality": "ഗുണമേന്മ", + "image_resolution": "റെസല്യൂഷൻ", + "image_resolution_description": "ഉയർന്ന റെസല്യൂഷനുകൾക്ക് കൂടുതൽ വിശദാംശങ്ങൾ സംരക്ഷിക്കാൻ കഴിയും, പക്ഷേ എൻകോഡ് ചെയ്യാൻ കൂടുതൽ സമയമെടുക്കും, വലിയ ഫയൽ വലുപ്പമുണ്ടാകും, കൂടാതെ ആപ്പിന്റെ പ്രതികരണശേഷി കുറയ്ക്കുകയും ചെയ്യും.", + "image_settings": "ചിത്ര ക്രമീകരണങ്ങൾ", + "image_settings_description": "നിർമ്മിച്ച ചിത്രങ്ങളുടെ ഗുണമേന്മയും റെസല്യൂഷനും കൈകാര്യം ചെയ്യുക", + "image_thumbnail_description": "മെറ്റാഡാറ്റ നീക്കംചെയ്ത ചെറിയ തംബ്നെയിൽ, പ്രധാന ടൈംലൈൻ പോലുള്ള ഫോട്ടോകളുടെ ഗ്രൂപ്പുകൾ കാണുമ്പോൾ ഉപയോഗിക്കുന്നു", + "image_thumbnail_quality_description": "തംബ്നെയിലിന്റെ ഗുണമേന്മ 1-100 വരെ. ഉയർന്ന മൂല്യം മികച്ചതാണ്, പക്ഷേ വലിയ ഫയലുകൾ ഉണ്ടാക്കുകയും ആപ്പിന്റെ പ്രതികരണശേഷി കുറയ്ക്കുകയും ചെയ്യും.", + "image_thumbnail_title": "തംബ്നെയിൽ ക്രമീകരണങ്ങൾ", + "job_concurrency": "{job} കോൺകറൻസി", "job_created": "ജോലി സൃഷ്ടിച്ചു", - "job_status": "ജോലി നില" + "job_not_concurrency_safe": "ഈ ജോലി കോൺകറൻസി-സേഫ് അല്ല.", + "job_settings": "ജോലി ക്രമീകരണങ്ങൾ", + "job_settings_description": "ജോലി കോൺകറൻസി കൈകാര്യം ചെയ്യുക", + "job_status": "ജോലിയുടെ നില", + "jobs_delayed": "{jobCount, plural, one {# ജോലി വൈകി} other {# ജോലികൾ വൈകി}}", + "jobs_failed": "{jobCount, plural, one {# ജോലി പരാജയപ്പെട്ടു} other {# ജോലികൾ പരാജയപ്പെട്ടു}}", + "library_created": "{library} എന്ന ലൈബ്രറി സൃഷ്ടിച്ചു", + "library_deleted": "ലൈബ്രറി ഇല്ലാതാക്കി", + "library_import_path_description": "ഇമ്പോർട്ടുചെയ്യാൻ ഒരു ഫോൾഡർ വ്യക്തമാക്കുക. സബ്ഫോൾഡറുകൾ ഉൾപ്പെടെ ഈ ഫോൾഡർ ചിത്രങ്ങൾക്കും വീഡിയോകൾക്കുമായി സ്കാൻ ചെയ്യും.", + "library_scanning": "ആനുകാലിക സ്കാനിംഗ്", + "library_scanning_description": "ആനുകാലിക ലൈബ്രറി സ്കാനിംഗ് കോൺഫിഗർ ചെയ്യുക", + "library_scanning_enable_description": "ആനുകാലിക ലൈബ്രറി സ്കാനിംഗ് പ്രവർത്തനക്ഷമമാക്കുക", + "library_settings": "എക്സ്റ്റേണൽ ലൈബ്രറി", + "library_settings_description": "എക്സ്റ്റേണൽ ലൈബ്രറി ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "library_tasks_description": "പുതിയതോ മാറ്റം വരുത്തിയതോ ആയ അസറ്റുകൾക്കായി എക്സ്റ്റേണൽ ലൈബ്രറികൾ സ്കാൻ ചെയ്യുക", + "library_watching_enable_description": "ഫയൽ മാറ്റങ്ങൾക്കായി എക്സ്റ്റേണൽ ലൈബ്രറികൾ നിരീക്ഷിക്കുക", + "library_watching_settings": "ലൈബ്രറി നിരീക്ഷിക്കൽ (പരീക്ഷണാടിസ്ഥാനത്തിൽ)", + "library_watching_settings_description": "മാറ്റം വന്ന ഫയലുകൾക്കായി യാന്ത്രികമായി നിരീക്ഷിക്കുക", + "logging_enable_description": "ലോഗിംഗ് പ്രവർത്തനക്ഷമമാക്കുക", + "logging_level_description": "പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, ഏത് ലോഗ് ലെവൽ ഉപയോഗിക്കണം.", + "logging_settings": "ലോഗിംഗ്", + "machine_learning_availability_checks": "ലഭ്യത പരിശോധനകൾ", + "machine_learning_availability_checks_description": "ലഭ്യമായ മെഷീൻ ലേണിംഗ് സെർവറുകൾ യാന്ത്രികമായി കണ്ടെത്തുകയും മുൻഗണന നൽകുകയും ചെയ്യുക", + "machine_learning_availability_checks_enabled": "ലഭ്യത പരിശോധനകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "machine_learning_availability_checks_interval": "പരിശോധന ഇടവേള", + "machine_learning_availability_checks_interval_description": "ലഭ്യത പരിശോധനകൾക്കിടയിലുള്ള ഇടവേള (മില്ലിസെക്കൻഡിൽ)", + "machine_learning_availability_checks_timeout": "അഭ്യർത്ഥനയുടെ സമയപരിധി", + "machine_learning_availability_checks_timeout_description": "ലഭ്യത പരിശോധനകൾക്കുള്ള സമയപരിധി (മില്ലിസെക്കൻഡിൽ)", + "machine_learning_clip_model": "CLIP മോഡൽ", + "machine_learning_clip_model_description": "ഇവിടെ ലിസ്റ്റ് ചെയ്തിട്ടുള്ള ഒരു CLIP മോഡലിന്റെ പേര്. ഒരു മോഡൽ മാറ്റുമ്പോൾ എല്ലാ ചിത്രങ്ങൾക്കുമായി 'സ്മാർട്ട് സെർച്ച്' ജോലി വീണ്ടും പ്രവർത്തിപ്പിക്കേണ്ടതുണ്ടെന്ന് ഓർമ്മിക്കുക.", + "machine_learning_duplicate_detection": "ഡ്യൂപ്ലിക്കേറ്റ് കണ്ടെത്തൽ", + "machine_learning_duplicate_detection_enabled": "ഡ്യൂപ്ലിക്കേറ്റ് കണ്ടെത്തൽ പ്രവർത്തനക്ഷമമാക്കുക", + "machine_learning_duplicate_detection_enabled_description": "പ്രവർത്തനരഹിതമാക്കിയാലും, തികച്ചും സമാനമായ അസറ്റുകളിലെ ഡ്യൂപ്ലിക്കേറ്റുകൾ ഒഴിവാക്കപ്പെടും.", + "machine_learning_duplicate_detection_setting_description": "സമാനമായ ഡ്യൂപ്ലിക്കേറ്റുകൾ കണ്ടെത്താൻ CLIP എംബെഡ്ഡിംഗ്‌സ് ഉപയോഗിക്കുക", + "machine_learning_enabled": "മെഷീൻ ലേണിംഗ് പ്രവർത്തനക്ഷമമാക്കുക", + "machine_learning_enabled_description": "പ്രവർത്തനരഹിതമാക്കിയാൽ, താഴെയുള്ള ക്രമീകരണങ്ങൾ പരിഗണിക്കാതെ എല്ലാ ML ഫീച്ചറുകളും പ്രവർത്തനരഹിതമാകും.", + "machine_learning_facial_recognition": "മുഖം തിരിച്ചറിയൽ", + "machine_learning_facial_recognition_description": "ചിത്രങ്ങളിലെ മുഖങ്ങൾ കണ്ടെത്തുക, തിരിച്ചറിയുക, ഗ്രൂപ്പ് ചെയ്യുക", + "machine_learning_facial_recognition_model": "മുഖം തിരിച്ചറിയൽ മോഡൽ", + "machine_learning_facial_recognition_model_description": "മോഡലുകൾ വലുപ്പത്തിന്റെ അവരോഹണ ക്രമത്തിലാണ് ലിസ്റ്റ് ചെയ്തിരിക്കുന്നത്. വലിയ മോഡലുകൾ വേഗത കുറഞ്ഞതും കൂടുതൽ മെമ്മറി ഉപയോഗിക്കുന്നവയുമാണ്, പക്ഷേ മികച്ച ഫലങ്ങൾ നൽകുന്നു. ഒരു മോഡൽ മാറ്റുമ്പോൾ എല്ലാ ചിത്രങ്ങൾക്കുമായി 'മുഖം കണ്ടെത്തൽ' ജോലി വീണ്ടും പ്രവർത്തിപ്പിക്കേണ്ടതുണ്ടെന്ന് ഓർമ്മിക്കുക.", + "machine_learning_facial_recognition_setting": "മുഖം തിരിച്ചറിയൽ പ്രവർത്തനക്ഷമമാക്കുക", + "machine_learning_facial_recognition_setting_description": "പ്രവർത്തനരഹിതമാക്കിയാൽ, മുഖം തിരിച്ചറിയലിനായി ചിത്രങ്ങൾ എൻകോഡ് ചെയ്യപ്പെടില്ല, കൂടാതെ എക്സ്പ്ലോർ പേജിലെ 'ആളുകൾ' വിഭാഗത്തിൽ അവ ദൃശ്യമാകുകയുമില്ല.", + "machine_learning_max_detection_distance": "പരമാവധി കണ്ടെത്തൽ ദൂരം", + "machine_learning_max_detection_distance_description": "രണ്ട് ചിത്രങ്ങളെ ഡ്യൂപ്ലിക്കേറ്റുകളായി കണക്കാക്കുന്നതിനുള്ള പരമാവധി ദൂരം, 0.001-0.1 വരെ. ഉയർന്ന മൂല്യങ്ങൾ കൂടുതൽ ഡ്യൂപ്ലിക്കേറ്റുകളെ കണ്ടെത്തും, പക്ഷേ തെറ്റായ ഫലങ്ങളിലേക്ക് നയിച്ചേക്കാം.", + "machine_learning_max_recognition_distance": "പരമാവധി തിരിച്ചറിയൽ ദൂരം", + "machine_learning_max_recognition_distance_description": "രണ്ട് മുഖങ്ങളെ ഒരേ വ്യക്തിയായി കണക്കാക്കുന്നതിനുള്ള പരമാവധി ദൂരം, 0-2 വരെ. ഇത് കുറയ്ക്കുന്നത് രണ്ട് പേരെ ഒരേ വ്യക്തിയായി ലേബൽ ചെയ്യുന്നത് തടയാൻ സഹായിക്കും, അതേസമയം ഇത് കൂട്ടുന്നത് ഒരേ വ്യക്തിയെ രണ്ട് വ്യത്യസ്ത ആളുകളായി ലേബൽ ചെയ്യുന്നത് തടയാനും സഹായിക്കും. ഒരാളെ രണ്ടായി വിഭജിക്കുന്നതിനേക്കാൾ എളുപ്പമാണ് രണ്ടുപേരെ ഒന്നാക്കുന്നത് എന്നത് ശ്രദ്ധിക്കുക, അതിനാൽ സാധ്യമാകുമ്പോൾ കുറഞ്ഞ പരിധി തിരഞ്ഞെടുക്കുന്നതാണ് ഉചിതം.", + "machine_learning_min_detection_score": "കുറഞ്ഞ കണ്ടെത്തൽ സ്കോർ", + "machine_learning_min_detection_score_description": "ഒരു മുഖം കണ്ടെത്തുന്നതിനുള്ള ഏറ്റവും കുറഞ്ഞ കോൺഫിഡൻസ് സ്കോർ 0-1 വരെ. കുറഞ്ഞ മൂല്യങ്ങൾ കൂടുതൽ മുഖങ്ങളെ കണ്ടെത്തും, പക്ഷേ തെറ്റായ ഫലങ്ങളിലേക്ക് നയിച്ചേക്കാം.", + "machine_learning_min_recognized_faces": "തിരിച്ചറിഞ്ഞ മുഖങ്ങളുടെ കുറഞ്ഞ എണ്ണം", + "machine_learning_min_recognized_faces_description": "ഒരു വ്യക്തിയെ സൃഷ്ടിക്കുന്നതിന് ആവശ്യമായ തിരിച്ചറിഞ്ഞ മുഖങ്ങളുടെ ഏറ്റവും കുറഞ്ഞ എണ്ണം. ഇത് വർദ്ധിപ്പിക്കുന്നത് മുഖം തിരിച്ചറിയൽ കൂടുതൽ കൃത്യമാക്കുന്നു, എന്നാൽ ഒരു മുഖം ഒരു വ്യക്തിക്ക് നൽകാതിരിക്കാനുള്ള സാധ്യതയും വർദ്ധിപ്പിക്കുന്നു.", + "machine_learning_settings": "മെഷീൻ ലേണിംഗ് ക്രമീകരണങ്ങൾ", + "machine_learning_settings_description": "മെഷീൻ ലേണിംഗ് ഫീച്ചറുകളും ക്രമീകരണങ്ങളും കൈകാര്യം ചെയ്യുക", + "machine_learning_smart_search": "സ്മാർട്ട് സെർച്ച്", + "machine_learning_smart_search_description": "CLIP എംബെഡ്ഡിംഗ്‌സ് ഉപയോഗിച്ച് ചിത്രങ്ങൾക്കായി അർത്ഥപൂർവ്വം തിരയുക", + "machine_learning_smart_search_enabled": "സ്മാർട്ട് സെർച്ച് പ്രവർത്തനക്ഷമമാക്കുക", + "machine_learning_smart_search_enabled_description": "പ്രവർത്തനരഹിതമാക്കിയാൽ, സ്മാർട്ട് സെർച്ചിനായി ചിത്രങ്ങൾ എൻകോഡ് ചെയ്യപ്പെടില്ല.", + "machine_learning_url_description": "മെഷീൻ ലേണിംഗ് സെർവറിന്റെ URL. ഒന്നിൽ കൂടുതൽ URL-കൾ നൽകിയിട്ടുണ്ടെങ്കിൽ, ഓരോ സെർവറും ഒന്നിനു പുറകെ ഒന്നായി വിജയകരമായി പ്രതികരിക്കുന്നതുവരെ ശ്രമിക്കും. പ്രതികരിക്കാത്ത സെർവറുകൾ ഓൺലൈനിൽ തിരികെ വരുന്നതുവരെ താൽക്കാലികമായി അവഗണിക്കപ്പെടും.", + "manage_concurrency": "കോൺകറൻസി കൈകാര്യം ചെയ്യുക", + "manage_log_settings": "ലോഗ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "map_dark_style": "ഡാർക്ക് സ്റ്റൈൽ", + "map_enable_description": "മാപ്പ് ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "map_gps_settings": "മാപ്പ് & GPS ക്രമീകരണങ്ങൾ", + "map_gps_settings_description": "മാപ്പ് & GPS (റിവേഴ്സ് ജിയോകോഡിംഗ്) ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "map_implications": "മാപ്പ് ഫീച്ചർ ഒരു ബാഹ്യ ടൈൽ സേവനത്തെ (tiles.immich.cloud) ആശ്രയിച്ചിരിക്കുന്നു", + "map_light_style": "ലൈറ്റ് സ്റ്റൈൽ", + "map_manage_reverse_geocoding_settings": "റിവേഴ്സ് ജിയോകോഡിംഗ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "map_reverse_geocoding": "റിവേഴ്സ് ജിയോകോഡിംഗ്", + "map_reverse_geocoding_enable_description": "റിവേഴ്സ് ജിയോകോഡിംഗ് പ്രവർത്തനക്ഷമമാക്കുക", + "map_reverse_geocoding_settings": "റിവേഴ്സ് ജിയോകോഡിംഗ് ക്രമീകരണങ്ങൾ", + "map_settings": "മാപ്പ്", + "map_settings_description": "മാപ്പ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "map_style_description": "ഒരു style.json മാപ്പ് തീമിലേക്കുള്ള URL", + "memory_cleanup_job": "മെമ്മറി ക്ലീനപ്പ്", + "memory_generate_job": "മെമ്മറി ജനറേഷൻ", + "metadata_extraction_job": "മെറ്റാഡാറ്റ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുക", + "metadata_extraction_job_description": "ഓരോ അസറ്റിൽ നിന്നും GPS, മുഖങ്ങൾ, റെസല്യൂഷൻ തുടങ്ങിയ മെറ്റാഡാറ്റ വിവരങ്ങൾ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുക", + "metadata_faces_import_setting": "മുഖം ഇമ്പോർട്ട് പ്രവർത്തനക്ഷമമാക്കുക", + "metadata_faces_import_setting_description": "ചിത്രത്തിന്റെ EXIF ഡാറ്റയിൽ നിന്നും സൈഡ്‌കാർ ഫയലുകളിൽ നിന്നും മുഖങ്ങൾ ഇമ്പോർട്ടുചെയ്യുക", + "metadata_settings": "മെറ്റാഡാറ്റ ക്രമീകരണങ്ങൾ", + "metadata_settings_description": "മെറ്റാഡാറ്റ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "migration_job": "മൈഗ്രേഷൻ", + "migration_job_description": "അസറ്റുകളുടെയും മുഖങ്ങളുടെയും തംബ്നെയിലുകൾ ഏറ്റവും പുതിയ ഫോൾഡർ ഘടനയിലേക്ക് മൈഗ്രേറ്റ് ചെയ്യുക", + "nightly_tasks_cluster_faces_setting_description": "പുതുതായി കണ്ടെത്തിയ മുഖങ്ങളിൽ ഫേഷ്യൽ റെക്കഗ്നിഷൻ പ്രവർത്തിപ്പിക്കുക", + "nightly_tasks_cluster_new_faces_setting": "പുതിയ മുഖങ്ങളെ ക്ലസ്റ്റർ ചെയ്യുക", + "nightly_tasks_database_cleanup_setting": "ഡാറ്റാബേസ് ക്ലീനപ്പ് ടാസ്ക്കുകൾ", + "nightly_tasks_database_cleanup_setting_description": "ഡാറ്റാബേസിൽ നിന്ന് പഴയതും കാലഹരണപ്പെട്ടതുമായ ഡാറ്റ വൃത്തിയാക്കുക", + "nightly_tasks_generate_memories_setting": "മെമ്മറികൾ നിർമ്മിക്കുക", + "nightly_tasks_generate_memories_setting_description": "അസറ്റുകളിൽ നിന്ന് പുതിയ മെമ്മറികൾ സൃഷ്ടിക്കുക", + "nightly_tasks_missing_thumbnails_setting": "നഷ്ടപ്പെട്ട തംബ്നെയിലുകൾ നിർമ്മിക്കുക", + "nightly_tasks_missing_thumbnails_setting_description": "തംബ്നെയിലുകൾ ഇല്ലാത്ത അസറ്റുകളെ തംബ്നെയിൽ നിർമ്മാണത്തിനായി ക്യൂ ചെയ്യുക", + "nightly_tasks_settings": "രാത്രിയിലെ ടാസ്ക് ക്രമീകരണങ്ങൾ", + "nightly_tasks_settings_description": "രാത്രിയിലെ ടാസ്ക്കുകൾ കൈകാര്യം ചെയ്യുക", + "nightly_tasks_start_time_setting": "തുടങ്ങുന്ന സമയം", + "nightly_tasks_start_time_setting_description": "സെർവർ രാത്രിയിലെ ടാസ്ക്കുകൾ പ്രവർത്തിപ്പിക്കാൻ തുടങ്ങുന്ന സമയം", + "nightly_tasks_sync_quota_usage_setting": "ക്വാട്ട ഉപയോഗം സിങ്ക് ചെയ്യുക", + "nightly_tasks_sync_quota_usage_setting_description": "നിലവിലെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഉപയോക്താവിന്റെ സ്റ്റോറേജ് ക്വാട്ട അപ്ഡേറ്റ് ചെയ്യുക", + "no_paths_added": "പാത്തുകൾ ഒന്നും ചേർത്തിട്ടില്ല", + "no_pattern_added": "പാറ്റേൺ ഒന്നും ചേർത്തിട്ടില്ല", + "note_apply_storage_label_previous_assets": "കുറിപ്പ്: മുമ്പ് അപ്‌ലോഡ് ചെയ്ത അസറ്റുകളിൽ സ്റ്റോറേജ് ലേബൽ പ്രയോഗിക്കാൻ, ഇത് പ്രവർത്തിപ്പിക്കുക", + "note_cannot_be_changed_later": "കുറിപ്പ്: ഇത് പിന്നീട് മാറ്റാൻ കഴിയില്ല!", + "notification_email_from_address": "അയയ്ക്കുന്നയാളുടെ വിലാസം", + "notification_email_from_address_description": "അയയ്ക്കുന്നയാളുടെ ഇമെയിൽ വിലാസം, ഉദാഹരണത്തിന്: \"Immich Photo Server \". നിങ്ങൾക്ക് ഇമെയിലുകൾ അയയ്ക്കാൻ അനുവാദമുള്ള ഒരു വിലാസം ഉപയോഗിക്കുന്നുവെന്ന് ഉറപ്പാക്കുക.", + "notification_email_host_description": "ഇമെയിൽ സെർവറിന്റെ ഹോസ്റ്റ് (ഉദാ. smtp.immich.app)", + "notification_email_ignore_certificate_errors": "സർട്ടിഫിക്കറ്റ് പിശകുകൾ അവഗണിക്കുക", + "notification_email_ignore_certificate_errors_description": "TLS സർട്ടിഫിക്കറ്റ് സാധുതാ പിശകുകൾ അവഗണിക്കുക (ശുപാർശ ചെയ്യുന്നില്ല)", + "notification_email_password_description": "ഇമെയിൽ സെർവറുമായി പ്രാമാണീകരിക്കുമ്പോൾ ഉപയോഗിക്കേണ്ട പാസ്‌വേഡ്", + "notification_email_port_description": "ഇമെയിൽ സെർവറിന്റെ പോർട്ട് (ഉദാ. 25, 465, അല്ലെങ്കിൽ 587)", + "notification_email_sent_test_email_button": "പരിശോധനാ ഇമെയിൽ അയച്ച് സേവ് ചെയ്യുക", + "notification_email_setting_description": "ഇമെയിൽ അറിയിപ്പുകൾ അയക്കുന്നതിനുള്ള ക്രമീകരണങ്ങൾ", + "notification_email_test_email": "പരിശോധനാ ഇമെയിൽ അയക്കുക", + "notification_email_test_email_failed": "പരിശോധനാ ഇമെയിൽ അയക്കുന്നതിൽ പരാജയപ്പെട്ടു, നിങ്ങളുടെ മൂല്യങ്ങൾ പരിശോധിക്കുക", + "notification_email_test_email_sent": "{email} എന്ന വിലാസത്തിലേക്ക് ഒരു പരിശോധനാ ഇമെയിൽ അയച്ചിട്ടുണ്ട്. ദയവായി നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.", + "notification_email_username_description": "ഇമെയിൽ സെർവറുമായി പ്രാമാണീകരിക്കുമ്പോൾ ഉപയോഗിക്കേണ്ട ഉപയോക്തൃനാമം", + "notification_enable_email_notifications": "ഇമെയിൽ അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "notification_settings": "അറിയിപ്പ് ക്രമീകരണങ്ങൾ", + "notification_settings_description": "ഇമെയിൽ ഉൾപ്പെടെയുള്ള അറിയിപ്പ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "oauth_auto_launch": "യാന്ത്രികമായി തുടങ്ങുക", + "oauth_auto_launch_description": "ലോഗിൻ പേജിലേക്ക് പോകുമ്പോൾ OAuth ലോഗിൻ ഫ്ലോ യാന്ത്രികമായി ആരംഭിക്കുക", + "oauth_auto_register": "യാന്ത്രികമായി രജിസ്റ്റർ ചെയ്യുക", + "oauth_auto_register_description": "OAuth ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത ശേഷം പുതിയ ഉപയോക്താക്കളെ യാന്ത്രികമായി രജിസ്റ്റർ ചെയ്യുക", + "oauth_button_text": "ബട്ടണിലെ വാചകം", + "oauth_client_secret_description": "OAuth ദാതാവ് PKCE (പ്രൂഫ് കീ ഫോർ കോഡ് എക്സ്ചേഞ്ച്) പിന്തുണയ്ക്കുന്നില്ലെങ്കിൽ ആവശ്യമാണ്", + "oauth_enable_description": "OAuth ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യുക", + "oauth_mobile_redirect_uri": "മൊബൈൽ റീഡയറക്ട് URI", + "oauth_mobile_redirect_uri_override": "മൊബൈൽ റീഡയറക്ട് URI ഓവർറൈഡ്", + "oauth_mobile_redirect_uri_override_description": "OAuth ദാതാവ് \"{callback}\" പോലുള്ള ഒരു മൊബൈൽ URI അനുവദിക്കാത്തപ്പോൾ പ്രവർത്തനക്ഷമമാക്കുക", + "oauth_role_claim": "റോൾ ക്ലെയിം", + "oauth_role_claim_description": "ഈ ക്ലെയിമിന്റെ സാന്നിധ്യത്തെ അടിസ്ഥാനമാക്കി യാന്ത്രികമായി അഡ്മിൻ ആക്സസ് നൽകുക. ക്ലെയിമിന് 'user' അല്ലെങ്കിൽ 'admin' എന്ന് ഉണ്ടാകാം.", + "oauth_settings": "OAuth", + "oauth_settings_description": "OAuth ലോഗിൻ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "oauth_settings_more_details": "ഈ ഫീച്ചറിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, ഡോക്സ് പരിശോധിക്കുക.", + "oauth_storage_label_claim": "സ്റ്റോറേജ് ലേബൽ ക്ലെയിം", + "oauth_storage_label_claim_description": "ഉപയോക്താവിന്റെ സ്റ്റോറേജ് ലേബൽ ഈ ക്ലെയിമിന്റെ മൂല്യത്തിലേക്ക് യാന്ത്രികമായി സജ്ജമാക്കുക.", + "oauth_storage_quota_claim": "സ്റ്റോറേജ് ക്വാട്ട ക്ലെയിം", + "oauth_storage_quota_claim_description": "ഉപയോക്താവിന്റെ സ്റ്റോറേജ് ക്വാട്ട ഈ ക്ലെയിമിന്റെ മൂല്യത്തിലേക്ക് യാന്ത്രികമായി സജ്ജമാക്കുക.", + "oauth_storage_quota_default": "ഡിഫോൾട്ട് സ്റ്റോറേജ് ക്വാട്ട (GiB)", + "oauth_storage_quota_default_description": "ക്ലെയിം ഒന്നും നൽകാത്തപ്പോൾ ഉപയോഗിക്കേണ്ട ക്വാട്ട (GiB-യിൽ).", + "oauth_timeout": "അഭ്യർത്ഥനയുടെ സമയപരിധി", + "oauth_timeout_description": "അഭ്യർത്ഥനകൾക്കുള്ള സമയപരിധി (മില്ലിസെക്കൻഡിൽ)", + "password_enable_description": "ഇമെയിലും പാസ്‌വേഡും ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യുക", + "password_settings": "പാസ്‌വേഡ് ലോഗിൻ", + "password_settings_description": "പാസ്‌വേഡ് ലോഗിൻ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "paths_validated_successfully": "എല്ലാ പാത്തുകളും വിജയകരമായി സാധൂകരിച്ചു", + "person_cleanup_job": "വ്യക്തി ക്ലീനപ്പ്", + "quota_size_gib": "ക്വാട്ട വലുപ്പം (GiB)", + "refreshing_all_libraries": "എല്ലാ ലൈബ്രറികളും പുതുക്കുന്നു", + "registration": "അഡ്മിൻ രജിസ്ട്രേഷൻ", + "registration_description": "നിങ്ങളാണ് സിസ്റ്റത്തിലെ ആദ്യത്തെ ഉപയോക്താവ് എന്നതിനാൽ, നിങ്ങളെ അഡ്മിൻ ആയി നിയമിക്കും. ഭരണപരമായ ജോലികൾക്ക് നിങ്ങൾ ഉത്തരവാദിയായിരിക്കും, കൂടാതെ അധിക ഉപയോക്താക്കളെ സൃഷ്ടിക്കുന്നത് നിങ്ങളായിരിക്കും.", + "require_password_change_on_login": "ആദ്യ ലോഗിൻ ചെയ്യുമ്പോൾ പാസ്‌വേഡ് മാറ്റാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക", + "reset_settings_to_default": "ക്രമീകരണങ്ങൾ ഡിഫോൾട്ടിലേക്ക് പുനഃസജ്ജമാക്കുക", + "reset_settings_to_recent_saved": "അടുത്തിടെ സേവ് ചെയ്ത ക്രമീകരണങ്ങളിലേക്ക് പുനഃസജ്ജമാക്കുക", + "scanning_library": "ലൈബ്രറി സ്കാൻ ചെയ്യുന്നു", + "search_jobs": "ജോലികൾക്കായി തിരയുക…", + "send_welcome_email": "സ്വാഗത ഇമെയിൽ അയക്കുക", + "server_external_domain_settings": "ബാഹ്യ ഡൊമെയ്ൻ", + "server_external_domain_settings_description": "പൊതുവായി പങ്കിട്ട ലിങ്കുകൾക്കുള്ള ഡൊമെയ്ൻ, http(s):// ഉൾപ്പെടെ", + "server_public_users": "പൊതു ഉപയോക്താക്കൾ", + "server_public_users_description": "പങ്കിട്ട ആൽബങ്ങളിലേക്ക് ഒരു ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ എല്ലാ ഉപയോക്താക്കളെയും (പേരും ഇമെയിലും) ലിസ്റ്റ് ചെയ്യും. പ്രവർത്തനരഹിതമാക്കുമ്പോൾ, ഉപയോക്തൃ ലിസ്റ്റ് അഡ്മിൻ ഉപയോക്താക്കൾക്ക് മാത്രമേ ലഭ്യമാകൂ.", + "server_settings": "സെർവർ ക്രമീകരണങ്ങൾ", + "server_settings_description": "സെർവർ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "server_welcome_message": "സ്വാഗത സന്ദേശം", + "server_welcome_message_description": "ലോഗിൻ പേജിൽ പ്രദർശിപ്പിക്കുന്ന ഒരു സന്ദേശം.", + "sidecar_job": "സൈഡ്‌കാർ മെറ്റാഡാറ്റ", + "sidecar_job_description": "ഫയൽസിസ്റ്റത്തിൽ നിന്ന് സൈഡ്‌കാർ മെറ്റാഡാറ്റ കണ്ടെത്തുകയോ സിൻക്രൊണൈസ് ചെയ്യുകയോ ചെയ്യുക", + "slideshow_duration_description": "ഓരോ ചിത്രവും പ്രദർശിപ്പിക്കാനുള്ള സെക്കൻഡുകളുടെ എണ്ണം", + "smart_search_job_description": "സ്മാർട്ട് സെർച്ചിനെ പിന്തുണയ്ക്കുന്നതിനായി അസറ്റുകളിൽ മെഷീൻ ലേണിംഗ് പ്രവർത്തിപ്പിക്കുക", + "storage_template_date_time_description": "ഡേറ്റ്ടൈം വിവരങ്ങൾക്കായി അസറ്റിന്റെ ക്രിയേഷൻ ടൈംസ്റ്റാമ്പ് ഉപയോഗിക്കുന്നു", + "storage_template_date_time_sample": "സാമ്പിൾ സമയം {date}", + "storage_template_enable_description": "സ്റ്റോറേജ് ടെംപ്ലേറ്റ് എഞ്ചിൻ പ്രവർത്തനക്ഷമമാക്കുക", + "storage_template_hash_verification_enabled": "ഹാഷ് വെരിഫിക്കേഷൻ പ്രവർത്തനക്ഷമമാക്കി", + "storage_template_hash_verification_enabled_description": "ഹാഷ് വെരിഫിക്കേഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നു, പ്രത്യാഘാതങ്ങളെക്കുറിച്ച് ഉറപ്പില്ലെങ്കിൽ ഇത് പ്രവർത്തനരഹിതമാക്കരുത്", + "storage_template_migration": "സ്റ്റോറേജ് ടെംപ്ലേറ്റ് മൈഗ്രേഷൻ", + "storage_template_migration_description": "മുമ്പ് അപ്‌ലോഡ് ചെയ്ത അസറ്റുകളിലേക്ക് നിലവിലെ {template} പ്രയോഗിക്കുക", + "storage_template_migration_info": "സ്റ്റോറേജ് ടെംപ്ലേറ്റ് എല്ലാ എക്സ്റ്റൻഷനുകളെയും ചെറിയക്ഷരത്തിലേക്ക് മാറ്റും. ടെംപ്ലേറ്റിലെ മാറ്റങ്ങൾ പുതിയ അസറ്റുകൾക്ക് മാത്രമേ ബാധകമാകൂ. മുമ്പ് അപ്‌ലോഡ് ചെയ്ത അസറ്റുകളിൽ ടെംപ്ലേറ്റ് മുൻകാല പ്രാബല്യത്തോടെ പ്രയോഗിക്കാൻ, {job} പ്രവർത്തിപ്പിക്കുക.", + "storage_template_migration_job": "സ്റ്റോറേജ് ടെംപ്ലേറ്റ് മൈഗ്രേഷൻ ജോലി", + "storage_template_more_details": "ഈ ഫീച്ചറിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, സ്റ്റോറേജ് ടെംപ്ലേറ്റ്-ഉം അതിൻ്റെ പ്രത്യാഘാതങ്ങളും പരിശോധിക്കുക", + "storage_template_onboarding_description_v2": "പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, ഉപയോക്താവ് നിർവചിച്ച ടെംപ്ലേറ്റ് അടിസ്ഥാനമാക്കി ഈ ഫീച്ചർ ഫയലുകൾ യാന്ത്രികമായി ഓർഗനൈസ് ചെയ്യും. കൂടുതൽ വിവരങ്ങൾക്ക്, ദയവായി ഡോക്യുമെന്റേഷൻ കാണുക.", + "storage_template_path_length": "ഏകദേശ പാത്ത് ദൈർഘ്യ പരിധി: {length, number}/{limit, number}", + "storage_template_settings": "സ്റ്റോറേജ് ടെംപ്ലേറ്റ്", + "storage_template_settings_description": "അപ്‌ലോഡ് ചെയ്യുന്ന അസറ്റിന്റെ ഫോൾഡർ ഘടനയും ഫയൽ നാമവും കൈകാര്യം ചെയ്യുക", + "storage_template_user_label": "{label} എന്നത് ഉപയോക്താവിന്റെ സ്റ്റോറേജ് ലേബലാണ്", + "system_settings": "സിസ്റ്റം ക്രമീകരണങ്ങൾ", + "tag_cleanup_job": "ടാഗ് ക്ലീനപ്പ്", + "template_email_available_tags": "നിങ്ങളുടെ ടെംപ്ലേറ്റിൽ ഇനിപ്പറയുന്ന വേരിയബിളുകൾ ഉപയോഗിക്കാം: {tags}", + "template_email_if_empty": "ടെംപ്ലേറ്റ് ശൂന്യമാണെങ്കിൽ, ഡിഫോൾട്ട് ഇമെയിൽ ഉപയോഗിക്കും.", + "template_email_invite_album": "ആൽബം ക്ഷണിക്കാനുള്ള ടെംപ്ലേറ്റ്", + "template_email_preview": "പ്രിവ്യൂ", + "template_email_settings": "ഇമെയിൽ ടെംപ്ലേറ്റുകൾ", + "template_email_update_album": "ആൽബം അപ്ഡേറ്റ് ടെംപ്ലേറ്റ്", + "template_email_welcome": "സ്വാഗത ഇമെയിൽ ടെംപ്ലേറ്റ്", + "template_settings": "അറിയിപ്പ് ടെംപ്ലേറ്റുകൾ", + "template_settings_description": "അറിയിപ്പുകൾക്കായി ഇഷ്ടാനുസൃത ടെംപ്ലേറ്റുകൾ കൈകാര്യം ചെയ്യുക", + "theme_custom_css_settings": "കസ്റ്റം CSS", + "theme_custom_css_settings_description": "കാസ്കേഡിംഗ് സ്റ്റൈൽ ഷീറ്റുകൾ (CSS) Immich-ന്റെ ഡിസൈൻ ഇഷ്ടാനുസൃതമാക്കാൻ അനുവദിക്കുന്നു.", + "theme_settings": "തീം ക്രമീകരണങ്ങൾ", + "theme_settings_description": "Immich വെബ് ഇന്റർഫേസിന്റെ കസ്റ്റമൈസേഷൻ കൈകാര്യം ചെയ്യുക", + "thumbnail_generation_job": "തംബ്നെയിലുകൾ നിർമ്മിക്കുക", + "thumbnail_generation_job_description": "ഓരോ അസറ്റിനും വലുതും ചെറുതും മങ്ങിയതുമായ തംബ്നെയിലുകളും ഓരോ വ്യക്തിക്കും തംബ്നെയിലുകളും നിർമ്മിക്കുക", + "transcoding_acceleration_api": "ആക്സിലറേഷൻ API", + "transcoding_acceleration_api_description": "ട്രാൻസ്‌കോഡിംഗ് ത്വരിതപ്പെടുത്തുന്നതിന് നിങ്ങളുടെ ഉപകരണവുമായി സംവദിക്കുന്ന API. ഈ ക്രമീകരണം 'ബെസ്റ്റ് എഫേർട്ട്' ആണ്: പരാജയപ്പെട്ടാൽ സോഫ്റ്റ്‌വെയർ ട്രാൻസ്‌കോഡിംഗിലേക്ക് മാറും. നിങ്ങളുടെ ഹാർഡ്‌വെയർ അനുസരിച്ച് VP9 പ്രവർത്തിക്കുകയോ പ്രവർത്തിക്കാതിരിക്കുകയോ ചെയ്യാം.", + "transcoding_acceleration_nvenc": "NVENC (NVIDIA GPU ആവശ്യമാണ്)", + "transcoding_acceleration_qsv": "ക്വിക്ക് സിങ്ക് (7-ാം തലമുറ ഇന്റൽ സിപിയു അല്ലെങ്കിൽ അതിനുശേഷമുള്ളത് ആവശ്യമാണ്)", + "transcoding_acceleration_rkmpp": "RKMPP (Rockchip SOC-കളിൽ മാത്രം)", + "transcoding_acceleration_vaapi": "VAAPI", + "transcoding_accepted_audio_codecs": "അംഗീകൃത ഓഡിയോ കോഡെക്കുകൾ", + "transcoding_accepted_audio_codecs_description": "ട്രാൻസ്‌കോഡ് ചെയ്യേണ്ടാത്ത ഓഡിയോ കോഡെക്കുകൾ തിരഞ്ഞെടുക്കുക. ചില ട്രാൻസ്‌കോഡ് നയങ്ങൾക്ക് വേണ്ടി മാത്രം ഉപയോഗിക്കുന്നു.", + "transcoding_accepted_containers": "അംഗീകൃത കണ്ടെയ്‌നറുകൾ", + "transcoding_accepted_containers_description": "MP4-ലേക്ക് റീമക്സ് ചെയ്യേണ്ടാത്ത കണ്ടെയ്‌നർ ഫോർമാറ്റുകൾ തിരഞ്ഞെടുക്കുക. ചില ട്രാൻസ്‌കോഡ് നയങ്ങൾക്ക് വേണ്ടി മാത്രം ഉപയോഗിക്കുന്നു.", + "transcoding_accepted_video_codecs": "അംഗീകൃത വീഡിയോ കോഡെക്കുകൾ", + "transcoding_accepted_video_codecs_description": "ട്രാൻസ്‌കോഡ് ചെയ്യേണ്ടാത്ത വീഡിയോ കോഡെക്കുകൾ തിരഞ്ഞെടുക്കുക. ചില ട്രാൻസ്‌കോഡ് നയങ്ങൾക്ക് വേണ്ടി മാത്രം ഉപയോഗിക്കുന്നു.", + "transcoding_advanced_options_description": "മിക്ക ഉപയോക്താക്കളും മാറ്റം വരുത്തേണ്ടതില്ലാത്ത ഓപ്ഷനുകൾ", + "transcoding_audio_codec": "ഓഡിയോ കോഡെക്", + "transcoding_audio_codec_description": "Opus ഏറ്റവും ഉയർന്ന നിലവാരമുള്ള ഓപ്ഷനാണ്, പക്ഷേ പഴയ ഉപകരണങ്ങളുമായോ സോഫ്റ്റ്‌വെയറുമായോ ഇതിന് കുറഞ്ഞ അനുയോജ്യതയേ ഉള്ളൂ.", + "transcoding_bitrate_description": "പരമാവധി ബിറ്റ്റേറ്റിനേക്കാൾ ഉയർന്നതോ അംഗീകൃത ഫോർമാറ്റിൽ അല്ലാത്തതോ ആയ വീഡിയോകൾ", + "transcoding_codecs_learn_more": "ഇവിടെ ഉപയോഗിച്ചിരിക്കുന്ന പദങ്ങളെക്കുറിച്ച് കൂടുതലറിയാൻ, H.264 കോഡെക്, HEVC കോഡെക്, VP9 കോഡെക് എന്നിവയുടെ FFmpeg ഡോക്യുമെന്റേഷൻ പരിശോധിക്കുക.", + "transcoding_constant_quality_mode": "സ്ഥിരമായ ഗുണമേന്മ മോഡ്", + "transcoding_constant_quality_mode_description": "CQP-യെക്കാൾ മികച്ചതാണ് ICQ, എന്നാൽ ചില ഹാർഡ്‌വെയർ ആക്സിലറേഷൻ ഉപകരണങ്ങൾ ഈ മോഡിനെ പിന്തുണയ്ക്കുന്നില്ല. ഗുണമേന്മ അടിസ്ഥാനമാക്കിയുള്ള എൻകോഡിംഗ് ഉപയോഗിക്കുമ്പോൾ ഈ ഓപ്ഷൻ സജ്ജീകരിക്കുന്നത് നിർദ്ദിഷ്ട മോഡിന് മുൻഗണന നൽകും. ICQ പിന്തുണയ്ക്കാത്തതിനാൽ NVENC ഇത് അവഗണിക്കുന്നു.", + "transcoding_constant_rate_factor": "കോൺസ്റ്റന്റ് റേറ്റ് ഫാക്ടർ (-crf)", + "transcoding_constant_rate_factor_description": "വീഡിയോയുടെ ഗുണമേന്മ നില. സാധാരണ മൂല്യങ്ങൾ H.264-ന് 23, HEVC-ക്ക് 28, VP9-ന് 31, AV1-ന് 35 എന്നിങ്ങനെയാണ്. കുറഞ്ഞ മൂല്യം മികച്ചതാണ്, പക്ഷേ വലിയ ഫയലുകൾ ഉണ്ടാക്കുന്നു.", + "transcoding_disabled_description": "ഒരു വീഡിയോയും ട്രാൻസ്‌കോഡ് ചെയ്യരുത്, ഇത് ചില ക്ലയിന്റുകളിൽ പ്ലേബാക്ക് തടസ്സപ്പെടുത്തിയേക്കാം", + "transcoding_encoding_options": "എൻകോഡിംഗ് ഓപ്ഷനുകൾ", + "transcoding_encoding_options_description": "എൻകോഡ് ചെയ്ത വീഡിയോകൾക്കായി കോഡെക്കുകൾ, റെസല്യൂഷൻ, ഗുണമേന്മ, മറ്റ് ഓപ്ഷനുകൾ എന്നിവ സജ്ജമാക്കുക", + "transcoding_hardware_acceleration": "ഹാർഡ്‌വെയർ ആക്സിലറേഷൻ", + "transcoding_hardware_acceleration_description": "പരീക്ഷണാടിസ്ഥാനത്തിലുള്ളത്: വേഗതയേറിയ ട്രാൻസ്‌കോഡിംഗ്, എന്നാൽ ഒരേ ബിറ്റ്റേറ്റിൽ ഗുണമേന്മ കുറച്ചേക്കാം", + "transcoding_hardware_decoding": "ഹാർഡ്‌വെയർ ഡീകോഡിംഗ്", + "transcoding_hardware_decoding_setting_description": "എൻകോഡിംഗ് മാത്രം ത്വരിതപ്പെടുത്തുന്നതിന് പകരം എൻഡ്-ടു-എൻഡ് ആക്സിലറേഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നു. എല്ലാ വീഡിയോകളിലും പ്രവർത്തിച്ചേക്കില്ല.", + "transcoding_max_b_frames": "പരമാവധി ബി-ഫ്രെയിമുകൾ", + "transcoding_max_b_frames_description": "ഉയർന്ന മൂല്യങ്ങൾ കംപ്രഷൻ കാര്യക്ഷമത മെച്ചപ്പെടുത്തുന്നു, പക്ഷേ എൻകോഡിംഗ് വേഗത കുറയ്ക്കുന്നു. പഴയ ഉപകരണങ്ങളിലെ ഹാർഡ്‌വെയർ ആക്സിലറേഷനുമായി പൊരുത്തപ്പെടണമെന്നില്ല. 0 ബി-ഫ്രെയിമുകൾ പ്രവർത്തനരഹിതമാക്കുന്നു, അതേസമയം -1 ഈ മൂല്യം യാന്ത്രികമായി സജ്ജീകരിക്കുന്നു.", + "transcoding_max_bitrate": "പരമാവധി ബിറ്റ്റേറ്റ്", + "transcoding_max_bitrate_description": "ഒരു പരമാവധി ബിറ്റ്റേറ്റ് സജ്ജീകരിക്കുന്നത് ഗുണമേന്മയിൽ ചെറിയൊരു വിട്ടുവീഴ്ചയോടെ ഫയൽ വലുപ്പങ്ങൾ കൂടുതൽ പ്രവചനാതീതമാക്കും. 720p-ൽ, സാധാരണ മൂല്യങ്ങൾ VP9 അല്ലെങ്കിൽ HEVC-ക്ക് 2600 kbit/s, അല്ലെങ്കിൽ H.264-ന് 4500 kbit/s ആണ്. 0 ആയി സജ്ജീകരിച്ചാൽ പ്രവർത്തനരഹിതമാകും.", + "transcoding_max_keyframe_interval": "പരമാവധി കീഫ്രെയിം ഇടവേള", + "transcoding_max_keyframe_interval_description": "കീഫ്രെയിമുകൾക്കിടയിലുള്ള പരമാവധി ഫ്രെയിം ദൂരം സജ്ജമാക്കുന്നു. കുറഞ്ഞ മൂല്യങ്ങൾ കംപ്രഷൻ കാര്യക്ഷമത കുറയ്ക്കുന്നു, പക്ഷേ സീക്ക് സമയം മെച്ചപ്പെടുത്തുകയും വേഗതയേറിയ ചലനമുള്ള രംഗങ്ങളിൽ ഗുണമേന്മ മെച്ചപ്പെടുത്തുകയും ചെയ്തേക്കാം. 0 ഈ മൂല്യം യാന്ത്രികമായി സജ്ജീകരിക്കുന്നു.", + "transcoding_optimal_description": "ലക്ഷ്യമിട്ട റെസല്യൂഷനേക്കാൾ ഉയർന്നതോ അംഗീകൃത ഫോർമാറ്റിൽ അല്ലാത്തതോ ആയ വീഡിയോകൾ", + "transcoding_policy": "ട്രാൻസ്‌കോഡ് നയം", + "transcoding_policy_description": "ഒരു വീഡിയോ എപ്പോൾ ട്രാൻസ്‌കോഡ് ചെയ്യണമെന്ന് സജ്ജമാക്കുക", + "transcoding_preferred_hardware_device": "തിരഞ്ഞെടുക്കുന്ന ഹാർഡ്‌വെയർ ഉപകരണം", + "transcoding_preferred_hardware_device_description": "VAAPI, QSV എന്നിവയ്ക്ക് മാത്രം ബാധകം. ഹാർഡ്‌വെയർ ട്രാൻസ്‌കോഡിംഗിനായി ഉപയോഗിക്കുന്ന dri നോഡ് സജ്ജമാക്കുന്നു.", + "transcoding_preset_preset": "പ്രീസെറ്റ് (-preset)", + "transcoding_preset_preset_description": "കംപ്രഷൻ വേഗത. വേഗത കുറഞ്ഞ പ്രീസെറ്റുകൾ ചെറിയ ഫയലുകൾ നിർമ്മിക്കുന്നു, ഒരു നിശ്ചിത ബിറ്റ്റേറ്റ് ലക്ഷ്യമിടുമ്പോൾ ഗുണമേന്മ വർദ്ധിപ്പിക്കുന്നു. 'faster'-നേക്കാൾ ഉയർന്ന വേഗത VP9 അവഗണിക്കുന്നു.", + "transcoding_reference_frames": "റഫറൻസ് ഫ്രെയിമുകൾ", + "transcoding_reference_frames_description": "നൽകിയിരിക്കുന്ന ഒരു ഫ്രെയിം കംപ്രസ് ചെയ്യുമ്പോൾ റഫറൻസ് ചെയ്യേണ്ട ഫ്രെയിമുകളുടെ എണ്ണം. ഉയർന്ന മൂല്യങ്ങൾ കംപ്രഷൻ കാര്യക്ഷമത മെച്ചപ്പെടുത്തുന്നു, പക്ഷേ എൻകോഡിംഗ് വേഗത കുറയ്ക്കുന്നു. 0 ഈ മൂല്യം യാന്ത്രികമായി സജ്ജീകരിക്കുന്നു.", + "transcoding_required_description": "അംഗീകൃത ഫോർമാറ്റിൽ അല്ലാത്ത വീഡിയോകൾ മാത്രം", + "transcoding_settings": "വീഡിയോ ട്രാൻസ്കോഡിംഗ് ക്രമീകരണങ്ങൾ", + "transcoding_settings_description": "ഏതൊക്കെ വീഡിയോകളാണ് ട്രാൻസ്‌കോഡ് ചെയ്യേണ്ടതെന്നും അവ എങ്ങനെ പ്രോസസ്സ് ചെയ്യണമെന്നും കൈകാര്യം ചെയ്യുക", + "transcoding_target_resolution": "ലക്ഷ്യമിടുന്ന റെസല്യൂഷൻ", + "transcoding_target_resolution_description": "ഉയർന്ന റെസല്യൂഷനുകൾക്ക് കൂടുതൽ വിശദാംശങ്ങൾ സംരക്ഷിക്കാൻ കഴിയും, പക്ഷേ എൻകോഡ് ചെയ്യാൻ കൂടുതൽ സമയമെടുക്കും, വലിയ ഫയൽ വലുപ്പമുണ്ടാകും, കൂടാതെ ആപ്പിന്റെ പ്രതികരണശേഷി കുറയ്ക്കുകയും ചെയ്യും.", + "transcoding_temporal_aq": "ടെമ്പറൽ AQ", + "transcoding_temporal_aq_description": "NVENC-ക്ക് മാത്രം ബാധകം. ഉയർന്ന വിശദാംശങ്ങളും കുറഞ്ഞ ചലനവുമുള്ള രംഗങ്ങളുടെ ഗുണമേന്മ വർദ്ധിപ്പിക്കുന്നു. പഴയ ഉപകരണങ്ങളുമായി പൊരുത്തപ്പെടണമെന്നില്ല.", + "transcoding_threads": "ത്രെഡുകൾ", + "transcoding_threads_description": "ഉയർന്ന മൂല്യങ്ങൾ വേഗതയേറിയ എൻകോഡിംഗിലേക്ക് നയിക്കുന്നു, പക്ഷേ സെർവറിന് മറ്റ് ജോലികൾ പ്രോസസ്സ് ചെയ്യാൻ കുറച്ച് ഇടം നൽകുന്നു. ഈ മൂല്യം സിപിയു കോറുകളുടെ എണ്ണത്തേക്കാൾ കൂടുതലാകരുത്. 0 ആയി സജ്ജീകരിച്ചാൽ ഉപയോഗം പരമാവധിയാക്കുന്നു.", + "transcoding_tone_mapping": "ടോൺ-മാപ്പിംഗ്", + "transcoding_tone_mapping_description": "HDR വീഡിയോകൾ SDR-ലേക്ക് പരിവർത്തനം ചെയ്യുമ്പോൾ അവയുടെ രൂപം നിലനിർത്താൻ ശ്രമിക്കുന്നു. ഓരോ അൽഗോരിതവും നിറം, വിശദാംശങ്ങൾ, തെളിച്ചം എന്നിവയ്ക്കായി വ്യത്യസ്ത വിട്ടുവീഴ്ചകൾ ചെയ്യുന്നു. Hable വിശദാംശങ്ങൾ സംരക്ഷിക്കുന്നു, Mobius നിറം സംരക്ഷിക്കുന്നു, Reinhard തെളിച്ചം സംരക്ഷിക്കുന്നു.", + "transcoding_transcode_policy": "ട്രാൻസ്‌കോഡ് നയം", + "transcoding_transcode_policy_description": "ഒരു വീഡിയോ എപ്പോൾ ട്രാൻസ്‌കോഡ് ചെയ്യണം എന്നതിനെക്കുറിച്ചുള്ള നയം. HDR വീഡിയോകൾ എല്ലായ്പ്പോഴും ട്രാൻസ്‌കോഡ് ചെയ്യപ്പെടും (ട്രാൻസ്‌കോഡിംഗ് പ്രവർത്തനരഹിതമാക്കിയിട്ടില്ലെങ്കിൽ).", + "transcoding_two_pass_encoding": "ടു-പാസ് എൻകോഡിംഗ്", + "transcoding_two_pass_encoding_setting_description": "മെച്ചപ്പെട്ട എൻകോഡ് ചെയ്ത വീഡിയോകൾ നിർമ്മിക്കുന്നതിന് രണ്ട് പാസുകളിലായി ട്രാൻസ്‌കോഡ് ചെയ്യുക. പരമാവധി ബിറ്റ്റേറ്റ് പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ (H.264, HEVC എന്നിവയ്‌ക്കൊപ്പം പ്രവർത്തിക്കാൻ ഇത് ആവശ്യമാണ്), ഈ മോഡ് പരമാവധി ബിറ്റ്റേറ്റിനെ അടിസ്ഥാനമാക്കി ഒരു ബിറ്റ്റേറ്റ് ശ്രേണി ഉപയോഗിക്കുകയും CRF അവഗണിക്കുകയും ചെയ്യുന്നു. VP9-നായി, പരമാവധി ബിറ്റ്റേറ്റ് പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ CRF ഉപയോഗിക്കാം.", + "transcoding_video_codec": "വീഡിയോ കോഡെക്", + "transcoding_video_codec_description": "VP9-ന് ഉയർന്ന കാര്യക്ഷമതയും വെബ് അനുയോജ്യതയുമുണ്ട്, പക്ഷേ ട്രാൻസ്‌കോഡ് ചെയ്യാൻ കൂടുതൽ സമയമെടുക്കും. HEVC സമാനമായി പ്രവർത്തിക്കുന്നു, പക്ഷേ വെബ് അനുയോജ്യത കുറവാണ്. H.264 വ്യാപകമായി അനുയോജ്യവും വേഗത്തിൽ ട്രാൻസ്‌കോഡ് ചെയ്യാൻ കഴിയുന്നതുമാണ്, പക്ഷേ വളരെ വലിയ ഫയലുകൾ നിർമ്മിക്കുന്നു. AV1 ഏറ്റവും കാര്യക്ഷമമായ കോഡെക്കാണ്, പക്ഷേ പഴയ ഉപകരണങ്ങളിൽ ഇതിന് പിന്തുണയില്ല.", + "trash_enabled_description": "ട്രാഷ് ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "trash_number_of_days": "ദിവസങ്ങളുടെ എണ്ണം", + "trash_number_of_days_description": "അസറ്റുകൾ ശാശ്വതമായി നീക്കം ചെയ്യുന്നതിനുമുമ്പ് ട്രാഷിൽ സൂക്ഷിക്കേണ്ട ദിവസങ്ങളുടെ എണ്ണം", + "trash_settings": "ട്രാഷ് ക്രമീകരണങ്ങൾ", + "trash_settings_description": "ട്രാഷ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "unlink_all_oauth_accounts": "എല്ലാ OAuth അക്കൗണ്ടുകളും അൺലിങ്ക് ചെയ്യുക", + "unlink_all_oauth_accounts_description": "ഒരു പുതിയ ദാതാവിലേക്ക് മാറുന്നതിന് മുമ്പ് എല്ലാ OAuth അക്കൗണ്ടുകളും അൺലിങ്ക് ചെയ്യാൻ ഓർമ്മിക്കുക.", + "unlink_all_oauth_accounts_prompt": "എല്ലാ OAuth അക്കൗണ്ടുകളും അൺലിങ്ക് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് ഓരോ ഉപയോക്താവിന്റെയും OAuth ഐഡി റീസെറ്റ് ചെയ്യും, ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല.", + "user_cleanup_job": "ഉപയോക്തൃ ക്ലീനപ്പ്", + "user_delete_delay": "{user}-ന്റെ അക്കൗണ്ടും അസറ്റുകളും {delay, plural, one {# ദിവസത്തിനുള്ളിൽ} other {# ദിവസങ്ങൾക്കുള്ളിൽ}} ശാശ്വതമായി ഇല്ലാതാക്കാൻ ഷെഡ്യൂൾ ചെയ്യും.", + "user_delete_delay_settings": "ഇല്ലാതാക്കാനുള്ള കാലതാമസം", + "user_delete_delay_settings_description": "ഒരു ഉപയോക്താവിന്റെ അക്കൗണ്ടും അസറ്റുകളും ശാശ്വതമായി ഇല്ലാതാക്കാൻ നീക്കം ചെയ്തതിന് ശേഷമുള്ള ദിവസങ്ങളുടെ എണ്ണം. ഇല്ലാതാക്കാൻ തയ്യാറായ ഉപയോക്താക്കളെ പരിശോധിക്കാൻ ഉപയോക്താവിനെ ഇല്ലാതാക്കാനുള്ള ജോലി അർദ്ധരാത്രിയിൽ പ്രവർത്തിക്കുന്നു. ഈ ക്രമീകരണത്തിലെ മാറ്റങ്ങൾ അടുത്ത എക്സിക്യൂഷനിൽ വിലയിരുത്തപ്പെടും.", + "user_delete_immediately": "{user}-ന്റെ അക്കൗണ്ടും അസറ്റുകളും ഉടനടി ശാശ്വതമായി ഇല്ലാതാക്കുന്നതിനായി ക്യൂ ചെയ്യും.", + "user_delete_immediately_checkbox": "ഉപയോക്താവിനെയും അസറ്റുകളെയും ഉടനടി ഇല്ലാതാക്കാൻ ക്യൂ ചെയ്യുക", + "user_details": "ഉപയോക്തൃ വിശദാംശങ്ങൾ", + "user_management": "ഉപയോക്തൃ മാനേജ്മെന്റ്", + "user_password_has_been_reset": "ഉപയോക്താവിന്റെ പാസ്‌വേഡ് റീസെറ്റ് ചെയ്തു:", + "user_password_reset_description": "ദയവായി ഉപയോക്താവിന് താൽക്കാലിക പാസ്‌വേഡ് നൽകുക, അടുത്ത ലോഗിൻ ചെയ്യുമ്പോൾ പാസ്‌വേഡ് മാറ്റേണ്ടിവരുമെന്ന് അവരെ അറിയിക്കുക.", + "user_restore_description": "{user}-ന്റെ അക്കൗണ്ട് പുനഃസ്ഥാപിക്കും.", + "user_restore_scheduled_removal": "ഉപയോക്താവിനെ പുനഃസ്ഥാപിക്കുക - {date, date, long}-ന് നീക്കംചെയ്യാൻ ഷെഡ്യൂൾ ചെയ്‌തിരിക്കുന്നു", + "user_settings": "ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങൾ", + "user_settings_description": "ഉപയോക്തൃ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "user_successfully_removed": "{email} എന്ന ഉപയോക്താവിനെ വിജയകരമായി നീക്കംചെയ്തു.", + "version_check_enabled_description": "പതിപ്പ് പരിശോധന പ്രവർത്തനക്ഷമമാക്കുക", + "version_check_implications": "പതിപ്പ് പരിശോധന ഫീച്ചർ github.com-മായി ആനുകാലിക ആശയവിനിമയത്തെ ആശ്രയിച്ചിരിക്കുന്നു", + "version_check_settings": "പതിപ്പ് പരിശോധന", + "version_check_settings_description": "പുതിയ പതിപ്പിന്റെ അറിയിപ്പ് പ്രവർത്തനക്ഷമമാക്കുക/പ്രവർത്തനരഹിതമാക്കുക", + "video_conversion_job": "വീഡിയോകൾ ട്രാൻസ്‌കോഡ് ചെയ്യുക", + "video_conversion_job_description": "ബ്രൗസറുകളുമായും ഉപകരണങ്ങളുമായും കൂടുതൽ അനുയോജ്യതയ്ക്കായി വീഡിയോകൾ ട്രാൻസ്‌കോഡ് ചെയ്യുക" }, + "admin_email": "അഡ്മിൻ ഇമെയിൽ", + "admin_password": "അഡ്മിൻ പാസ്‌വേഡ്", + "administration": "അഡ്മിനിസ്ട്രേഷൻ", + "advanced": "വിപുലമായത്", + "advanced_settings_enable_alternate_media_filter_subtitle": "ഇതര മാനദണ്ഡങ്ങളെ അടിസ്ഥാനമാക്കി സിങ്ക് സമയത്ത് മീഡിയ ഫിൽട്ടർ ചെയ്യാൻ ഈ ഓപ്ഷൻ ഉപയോഗിക്കുക. എല്ലാ ആൽബങ്ങളും കണ്ടെത്തുന്നതിൽ ആപ്പിന് പ്രശ്നങ്ങളുണ്ടെങ്കിൽ മാത്രം ഇത് പരീക്ഷിക്കുക.", + "advanced_settings_enable_alternate_media_filter_title": "[പരീക്ഷണാടിസ്ഥാനത്തിൽ] ഇതര ഉപകരണ ആൽബം സിങ്ക് ഫിൽട്ടർ ഉപയോഗിക്കുക", + "advanced_settings_log_level_title": "ലോഗ് ലെവൽ: {level}", + "advanced_settings_prefer_remote_subtitle": "ചില ഉപകരണങ്ങളിൽ പ്രാദേശിക അസറ്റുകളിൽ നിന്ന് തംബ്നെയിലുകൾ ലോഡുചെയ്യാൻ വളരെ വേഗത കുറവാണ്. പകരം റിമോട്ട് ചിത്രങ്ങൾ ലോഡുചെയ്യാൻ ഈ ക്രമീകരണം സജീവമാക്കുക.", + "advanced_settings_prefer_remote_title": "റിമോട്ട് ചിത്രങ്ങൾക്ക് മുൻഗണന നൽകുക", + "advanced_settings_proxy_headers_subtitle": "ഓരോ നെറ്റ്‌വർക്ക് അഭ്യർത്ഥനയ്‌ക്കൊപ്പവും Immich അയയ്‌ക്കേണ്ട പ്രോക്സി ഹെഡറുകൾ നിർവചിക്കുക", + "advanced_settings_proxy_headers_title": "പ്രോക്സി ഹെഡറുകൾ", + "advanced_settings_readonly_mode_subtitle": "ഫോട്ടോകൾ മാത്രം കാണാൻ കഴിയുന്ന റീഡ്-ഓൺലി മോഡ് പ്രവർത്തനക്ഷമമാക്കുന്നു. ഒന്നിലധികം ചിത്രങ്ങൾ തിരഞ്ഞെടുക്കൽ, പങ്കിടൽ, കാസ്റ്റിംഗ്, ഇല്ലാതാക്കൽ എന്നിവയെല്ലാം പ്രവർത്തനരഹിതമാകും. പ്രധാന സ്ക്രീനിലെ ഉപയോക്തൃ അവതാർ വഴി റീഡ്-ഓൺലി പ്രവർത്തനക്ഷമമാക്കുക/പ്രവർത്തനരഹിതമാക്കുക.", + "advanced_settings_readonly_mode_title": "റീഡ്-ഓൺലി മോഡ്", + "advanced_settings_self_signed_ssl_subtitle": "സെർവർ എൻഡ്‌പോയിന്റിനായുള്ള SSL സർട്ടിഫിക്കറ്റ് പരിശോധന ഒഴിവാക്കുന്നു. സ്വയം ഒപ്പിട്ട സർട്ടിഫിക്കറ്റുകൾക്ക് ആവശ്യമാണ്.", + "advanced_settings_self_signed_ssl_title": "സ്വയം ഒപ്പിട്ട SSL സർട്ടിഫിക്കറ്റുകൾ അനുവദിക്കുക", + "advanced_settings_sync_remote_deletions_subtitle": "വെബിൽ ആ പ്രവർത്തനം നടത്തുമ്പോൾ ഈ ഉപകരണത്തിലെ ഒരു അസറ്റ് യാന്ത്രികമായി ഇല്ലാതാക്കുകയോ പുനഃസ്ഥാപിക്കുകയോ ചെയ്യുക", + "advanced_settings_sync_remote_deletions_title": "റിമോട്ട് ഇല്ലാതാക്കലുകൾ സിങ്ക് ചെയ്യുക [പരീക്ഷണാടിസ്ഥാനത്തിൽ]", + "advanced_settings_tile_subtitle": "വിപുലമായ ഉപയോക്തൃ ക്രമീകരണങ്ങൾ", + "advanced_settings_troubleshooting_subtitle": "ട്രബിൾഷൂട്ടിംഗിനായി അധിക ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "advanced_settings_troubleshooting_title": "ട്രബിൾഷൂട്ടിംഗ്", + "age_months": "പ്രായം {months, plural, one {# മാസം} other {# മാസം}}", + "age_year_months": "പ്രായം 1 വർഷം, {months, plural, one {# മാസം} other {# മാസം}}", + "age_years": "{years, plural, other {പ്രായം #}}", + "album_added": "ആൽബം ചേർത്തു", + "album_added_notification_setting_description": "നിങ്ങളെ ഒരു പങ്കിട്ട ആൽബത്തിലേക്ക് ചേർക്കുമ്പോൾ ഒരു ഇമെയിൽ അറിയിപ്പ് സ്വീകരിക്കുക", + "album_cover_updated": "ആൽബം കവർ അപ്ഡേറ്റ് ചെയ്തു", + "album_delete_confirmation": "നിങ്ങൾക്ക് {album} ആൽബം ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ?", + "album_delete_confirmation_description": "ഈ ആൽബം പങ്കിട്ടതാണെങ്കിൽ, മറ്റ് ഉപയോക്താക്കൾക്ക് ഇനി ഇത് ആക്‌സസ് ചെയ്യാൻ കഴിയില്ല.", + "album_deleted": "ആൽബം ഇല്ലാതാക്കി", + "album_info_card_backup_album_excluded": "ഒഴിവാക്കി", + "album_info_card_backup_album_included": "ഉൾപ്പെടുത്തി", + "album_info_updated": "ആൽബം വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്തു", + "album_leave": "ആൽബം വിടുകയാണോ?", + "album_leave_confirmation": "{album} വിട്ടുപോകണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "album_name": "ആൽബത്തിന്റെ പേര്", + "album_options": "ആൽബം ഓപ്ഷനുകൾ", + "album_remove_user": "ഉപയോക്താവിനെ നീക്കം ചെയ്യണോ?", + "album_remove_user_confirmation": "{user}-നെ നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "album_search_not_found": "നിങ്ങളുടെ തിരയലുമായി പൊരുത്തപ്പെടുന്ന ആൽബങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "album_share_no_users": "നിങ്ങൾ ഈ ആൽബം എല്ലാ ഉപയോക്താക്കളുമായും പങ്കിട്ടു, അല്ലെങ്കിൽ നിങ്ങൾക്ക് പങ്കിടാൻ ഉപയോക്താക്കളാരും ഇല്ലെന്നു തോന്നുന്നു.", + "album_summary": "ആൽബത്തിന്റെ സംഗ്രഹം", + "album_updated": "ആൽബം അപ്ഡേറ്റ് ചെയ്തു", + "album_updated_setting_description": "ഒരു പങ്കിട്ട ആൽബത്തിൽ പുതിയ അസറ്റുകൾ ഉണ്ടാകുമ്പോൾ ഒരു ഇമെയിൽ അറിയിപ്പ് സ്വീകരിക്കുക", + "album_user_left": "{album} വിട്ടുപോയി", + "album_user_removed": "{user}-നെ നീക്കം ചെയ്തു", + "album_viewer_appbar_delete_confirm": "നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് ഈ ആൽബം ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ?", + "album_viewer_appbar_share_err_delete": "ആൽബം ഇല്ലാതാക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "album_viewer_appbar_share_err_leave": "ആൽബം വിടുന്നതിൽ പരാജയപ്പെട്ടു", + "album_viewer_appbar_share_err_remove": "ആൽബത്തിൽ നിന്ന് അസറ്റുകൾ നീക്കം ചെയ്യുന്നതിൽ പ്രശ്നങ്ങളുണ്ട്", + "album_viewer_appbar_share_err_title": "ആൽബത്തിന്റെ ശീർഷകം മാറ്റുന്നതിൽ പരാജയപ്പെട്ടു", + "album_viewer_appbar_share_leave": "ആൽബം വിടുക", + "album_viewer_appbar_share_to": "ഇതിലേക്ക് പങ്കിടുക", + "album_viewer_page_share_add_users": "ഉപയോക്താക്കളെ ചേർക്കുക", + "album_with_link_access": "ലിങ്കുള്ള ആർക്കും ഈ ആൽബത്തിലെ ഫോട്ടോകളും ആളുകളെയും കാണാൻ അനുവദിക്കുക.", + "albums": "ആൽബങ്ങൾ", + "albums_count": "{count, plural, one {{count, number} ആൽബം} other {{count, number} ആൽബങ്ങൾ}}", + "albums_default_sort_order": "ഡിഫോൾട്ട് ആൽബം സോർട്ട് ഓർഡർ", + "albums_default_sort_order_description": "പുതിയ ആൽബങ്ങൾ സൃഷ്ടിക്കുമ്പോൾ പ്രാരംഭ അസറ്റ് സോർട്ട് ഓർഡർ.", + "albums_feature_description": "മറ്റ് ഉപയോക്താക്കളുമായി പങ്കിടാൻ കഴിയുന്ന അസറ്റുകളുടെ ശേഖരം.", + "albums_on_device_count": "ഉപകരണത്തിലെ ആൽബങ്ങൾ ({count})", + "all": "എല്ലാം", + "all_albums": "എല്ലാ ആൽബങ്ങളും", + "all_people": "എല്ലാ ആളുകളും", + "all_videos": "എല്ലാ വീഡിയോകളും", + "allow_dark_mode": "ഡാർക്ക് മോഡ് അനുവദിക്കുക", + "allow_edits": "എഡിറ്റുകൾ അനുവദിക്കുക", + "allow_public_user_to_download": "പൊതു ഉപയോക്താവിനെ ഡൗൺലോഡ് ചെയ്യാൻ അനുവദിക്കുക", + "allow_public_user_to_upload": "പൊതു ഉപയോക്താവിനെ അപ്‌ലോഡ് ചെയ്യാൻ അനുവദിക്കുക", + "alt_text_qr_code": "QR കോഡ് ചിത്രം", + "anti_clockwise": "അപ്രദക്ഷിണമായി", + "api_key": "API കീ", + "api_key_description": "ഈ മൂല്യം ഒരു തവണ മാത്രമേ കാണിക്കൂ. വിൻഡോ അടയ്ക്കുന്നതിന് മുമ്പ് ഇത് പകർത്തുന്നത് ഉറപ്പാക്കുക.", + "api_key_empty": "നിങ്ങളുടെ API കീയുടെ പേര് ശൂന്യമാകരുത്", + "api_keys": "API കീകൾ", + "app_bar_signout_dialog_content": "സൈൻ ഔട്ട് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "app_bar_signout_dialog_ok": "അതെ", + "app_bar_signout_dialog_title": "സൈൻ ഔട്ട്", + "app_settings": "ആപ്പ് ക്രമീകരണങ്ങൾ", + "appears_in": "ഇതിൽ കാണപ്പെടുന്നു", + "apply_count": "പ്രയോഗിക്കുക ({count, number})", + "archive": "ആർക്കൈവ്", + "archive_action_prompt": "{count} എണ്ണം ആർക്കൈവിലേക്ക് ചേർത്തു", + "archive_or_unarchive_photo": "ഫോട്ടോ ആർക്കൈവ് ചെയ്യുക അല്ലെങ്കിൽ അൺആർക്കൈവ് ചെയ്യുക", + "archive_page_no_archived_assets": "ആർക്കൈവുചെയ്‌ത അസറ്റുകളൊന്നും കണ്ടെത്തിയില്ല", + "archive_page_title": "ആർക്കൈവ് ({count})", + "archive_size": "ആർക്കൈവ് വലുപ്പം", + "archive_size_description": "ഡൗൺലോഡുകൾക്കായി ആർക്കൈവ് വലുപ്പം കോൺഫിഗർ ചെയ്യുക (GiB-യിൽ)", + "archived": "ആർക്കൈവുചെയ്‌തു", + "archived_count": "{count, plural, other {ആർക്കൈവുചെയ്‌തവ #}}", + "are_these_the_same_person": "ഇവർ ഒരേ വ്യക്തിയാണോ?", + "are_you_sure_to_do_this": "ഇത് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "asset_action_delete_err_read_only": "വായിക്കാൻ മാത്രമുള്ള അസറ്റ്(കൾ) ഇല്ലാതാക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "asset_action_share_err_offline": "ഓഫ്‌ലൈൻ അസറ്റ്(കൾ) ലഭ്യമാക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "asset_added_to_album": "ആൽബത്തിലേക്ക് ചേർത്തു", + "asset_adding_to_album": "ആൽബത്തിലേക്ക് ചേർത്തുകൊണ്ടിരിക്കുന്നു…", + "asset_description_updated": "അസറ്റിന്റെ വിവരണം അപ്ഡേറ്റ് ചെയ്തു", + "asset_filename_is_offline": "{filename} എന്ന അസറ്റ് ഓഫ്‌ലൈനാണ്", + "asset_has_unassigned_faces": "അസറ്റിൽ അസൈൻ ചെയ്യാത്ത മുഖങ്ങളുണ്ട്", + "asset_hashing": "ഹാഷിംഗ്…", + "asset_list_group_by_sub_title": "ഇതനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "asset_list_layout_settings_dynamic_layout_title": "ഡൈനാമിക് ലേഔട്ട്", + "asset_list_layout_settings_group_automatically": "യാന്ത്രികം", + "asset_list_layout_settings_group_by": "അസറ്റുകളെ ഇതനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "asset_list_layout_settings_group_by_month_day": "മാസം + ദിവസം", + "asset_list_layout_sub_title": "ലേഔട്ട്", + "asset_list_settings_subtitle": "ഫോട്ടോ ഗ്രിഡ് ലേഔട്ട് ക്രമീകരണങ്ങൾ", + "asset_list_settings_title": "ഫോട്ടോ ഗ്രിഡ്", + "asset_offline": "അസറ്റ് ഓഫ്‌ലൈൻ", + "asset_offline_description": "ഈ എക്സ്റ്റേണൽ അസറ്റ് ഇപ്പോൾ ഡിസ്കിൽ ലഭ്യമല്ല. സഹായത്തിനായി നിങ്ങളുടെ Immich അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.", + "asset_restored_successfully": "അസറ്റ് വിജയകരമായി പുനഃസ്ഥാപിച്ചു", + "asset_skipped": "ഒഴിവാക്കി", + "asset_skipped_in_trash": "ട്രാഷിൽ", + "asset_trashed": "അസറ്റ് ട്രാഷ് ചെയ്തു", + "asset_troubleshoot": "അസറ്റ് ട്രബിൾഷൂട്ട്", + "asset_uploaded": "അപ്‌ലോഡ് ചെയ്തു", + "asset_uploading": "അപ്‌ലോഡ് ചെയ്യുന്നു…", + "asset_viewer_settings_subtitle": "നിങ്ങളുടെ ഗാലറി വ്യൂവർ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "asset_viewer_settings_title": "അസറ്റ് വ്യൂവർ", + "assets": "അസറ്റുകൾ", + "assets_added_count": "{count, plural, one {# അസറ്റ് ചേർത്തു} other {# അസറ്റുകൾ ചേർത്തു}}", + "assets_added_to_album_count": "ആൽബത്തിലേക്ക് {count, plural, one {# അസറ്റ് ചേർത്തു} other {# അസറ്റുകൾ ചേർത്തു}}", + "assets_added_to_albums_count": "{albumTotal, plural, one {# ആൽബത്തിലേക്ക്} other {# ആൽബങ്ങളിലേക്ക്}} {assetTotal, plural, one {# അസറ്റ് ചേർത്തു} other {# അസറ്റുകൾ ചേർത്തു}}", + "assets_cannot_be_added_to_album_count": "{count, plural, one {അസറ്റ്} other {അസറ്റുകൾ}} ആൽബത്തിലേക്ക് ചേർക്കാൻ കഴിയില്ല", + "assets_cannot_be_added_to_albums": "{count, plural, one {അസറ്റ്} other {അസറ്റുകൾ}} ഒരു ആൽബത്തിലേക്കും ചേർക്കാൻ കഴിയില്ല", + "assets_count": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}}", + "assets_deleted_permanently": "{count} അസറ്റ്(കൾ) ശാശ്വതമായി ഇല്ലാതാക്കി", + "assets_deleted_permanently_from_server": "{count} അസറ്റ്(കൾ) Immich സെർവറിൽ നിന്ന് ശാശ്വതമായി ഇല്ലാതാക്കി", + "assets_downloaded_failed": "{count, plural, one {# ഫയൽ ഡൗൺലോഡ് ചെയ്തു - {error} ഫയൽ പരാജയപ്പെട്ടു} other {# ഫയലുകൾ ഡൗൺലോഡ് ചെയ്തു - {error} ഫയലുകൾ പരാജയപ്പെട്ടു}}", + "assets_downloaded_successfully": "{count, plural, one {# ഫയൽ വിജയകരമായി ഡൗൺലോഡ് ചെയ്തു} other {# ഫയലുകൾ വിജയകരമായി ഡൗൺലോഡ് ചെയ്തു}}", + "assets_moved_to_trash_count": "{count, plural, one {# അസറ്റ് ട്രാഷിലേക്ക് മാറ്റി} other {# അസറ്റുകൾ ട്രാഷിലേക്ക് മാറ്റി}}", + "assets_permanently_deleted_count": "{count, plural, one {# അസറ്റ് ശാശ്വതമായി ഇല്ലാതാക്കി} other {# അസറ്റുകൾ ശാശ്വതമായി ഇല്ലാതാക്കി}}", + "assets_removed_count": "{count, plural, one {# അസറ്റ് നീക്കം ചെയ്തു} other {# അസറ്റുകൾ നീക്കം ചെയ്തു}}", + "assets_removed_permanently_from_device": "{count} അസറ്റ്(കൾ) നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് ശാശ്വതമായി നീക്കം ചെയ്തു", + "assets_restore_confirmation": "ട്രാഷ് ചെയ്ത എല്ലാ അസറ്റുകളും പുനഃസ്ഥാപിക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഈ പ്രവർത്തനം പഴയപടിയാക്കാൻ കഴിയില്ല! ഓഫ്‌ലൈൻ അസറ്റുകളൊന്നും ഈ രീതിയിൽ പുനഃസ്ഥാപിക്കാൻ കഴിയില്ലെന്ന കാര്യം ശ്രദ്ധിക്കുക.", + "assets_restored_count": "{count, plural, one {# അസറ്റ് പുനഃസ്ഥാപിച്ചു} other {# അസറ്റുകൾ പുനഃസ്ഥാപിച്ചു}}", + "assets_restored_successfully": "{count} അസറ്റ്(കൾ) വിജയകരമായി പുനഃസ്ഥാപിച്ചു", + "assets_trashed": "{count} അസറ്റ്(കൾ) ട്രാഷ് ചെയ്തു", + "assets_trashed_count": "{count, plural, one {# അസറ്റ് ട്രാഷ് ചെയ്തു} other {# അസറ്റുകൾ ട്രാഷ് ചെയ്തു}}", + "assets_trashed_from_server": "{count} അസറ്റ്(കൾ) Immich സെർവറിൽ നിന്ന് ട്രാഷ് ചെയ്തു", + "assets_were_part_of_album_count": "{count, plural, one {അസറ്റ് ഇതിനകം} other {അസറ്റുകൾ ഇതിനകം}} ആൽബത്തിന്റെ ഭാഗമായിരുന്നു", + "assets_were_part_of_albums_count": "{count, plural, one {അസറ്റ് ഇതിനകം} other {അസറ്റുകൾ ഇതിനകം}} ആൽബങ്ങളുടെ ഭാഗമായിരുന്നു", + "authorized_devices": "അംഗീകൃത ഉപകരണങ്ങൾ", + "automatic_endpoint_switching_subtitle": "ലഭ്യമാകുമ്പോൾ നിശ്ചിത വൈ-ഫൈ വഴി പ്രാദേശികമായി കണക്റ്റുചെയ്യുക, മറ്റ് സ്ഥലങ്ങളിൽ ഇതര കണക്ഷനുകൾ ഉപയോഗിക്കുക", + "automatic_endpoint_switching_title": "യാന്ത്രിക URL സ്വിച്ചിംഗ്", + "autoplay_slideshow": "സ്ലൈഡ്‌ഷോ യാന്ത്രികമായി പ്ലേ ചെയ്യുക", + "back": "തിരികെ", + "back_close_deselect": "പുറകോട്ട്, അടയ്ക്കുക, അല്ലെങ്കിൽ തിരഞ്ഞെടുത്തത് മാറ്റുക", + "background_backup_running_error": "പശ്ചാത്തല ബാക്കപ്പ് ഇപ്പോൾ പ്രവർത്തിക്കുന്നു, മാനുവൽ ബാക്കപ്പ് ആരംഭിക്കാൻ കഴിയില്ല", + "background_location_permission": "പശ്ചാത്തല ലൊക്കേഷൻ അനുമതി", + "background_location_permission_content": "പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കുമ്പോൾ നെറ്റ്‌വർക്കുകൾ മാറുന്നതിന്, Immich-ന് എപ്പോഴും കൃത്യമായ ലൊക്കേഷൻ ആക്‌സസ് ഉണ്ടായിരിക്കണം, അതുവഴി ആപ്പിന് വൈ-ഫൈ നെറ്റ്‌വർക്കിന്റെ പേര് വായിക്കാൻ കഴിയും", + "background_options": "പശ്ചാത്തല ഓപ്ഷനുകൾ", + "backup": "ബാക്കപ്പ്", + "backup_album_selection_page_albums_device": "ഉപകരണത്തിലെ ആൽബങ്ങൾ ({count})", + "backup_album_selection_page_albums_tap": "ഉൾപ്പെടുത്താൻ ടാപ്പുചെയ്യുക, ഒഴിവാക്കാൻ ഡബിൾ ടാപ്പുചെയ്യുക", + "backup_album_selection_page_assets_scatter": "അസറ്റുകൾ ഒന്നിലധികം ആൽബങ്ങളിലായി വ്യാപിച്ചുകിടക്കാം. അതിനാൽ, ബാക്കപ്പ് പ്രക്രിയയിൽ ആൽബങ്ങൾ ഉൾപ്പെടുത്തുകയോ ഒഴിവാക്കുകയോ ചെയ്യാം.", + "backup_album_selection_page_select_albums": "ആൽബങ്ങൾ തിരഞ്ഞെടുക്കുക", + "backup_album_selection_page_selection_info": "തിരഞ്ഞെടുക്കൽ വിവരം", + "backup_album_selection_page_total_assets": "ആകെ സവിശേഷമായ അസറ്റുകൾ", + "backup_albums_sync": "ബാക്കപ്പ് ആൽബം സിൻക്രൊണൈസേഷൻ", + "backup_all": "എല്ലാം ബാക്കപ്പ് ചെയ്യുക", + "backup_background_service_backup_failed_message": "അസറ്റുകൾ ബാക്കപ്പ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുന്നു…", + "backup_background_service_connection_failed_message": "സെർവറിലേക്ക് കണക്റ്റുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുന്നു…", + "backup_background_service_current_upload_notification": "{filename} അപ്‌ലോഡ് ചെയ്യുന്നു", + "backup_background_service_default_notification": "പുതിയ അസറ്റുകൾക്കായി പരിശോധിക്കുന്നു…", + "backup_background_service_error_title": "ബാക്കപ്പ് പിശക്", + "backup_background_service_in_progress_notification": "നിങ്ങളുടെ അസറ്റുകൾ ബാക്കപ്പ് ചെയ്യുന്നു…", + "backup_background_service_upload_failure_notification": "{filename} അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "backup_controller_page_albums": "ബാക്കപ്പ് ആൽബങ്ങൾ", + "backup_controller_page_background_app_refresh_disabled_content": "പശ്ചാത്തല ബാക്കപ്പ് ഉപയോഗിക്കുന്നതിന്, ക്രമീകരണങ്ങൾ > പൊതുവായത് > പശ്ചാത്തല ആപ്പ് റിഫ്രഷ് എന്നതിൽ പശ്ചാത്തല ആപ്പ് റിഫ്രഷ് പ്രവർത്തനക്ഷമമാക്കുക.", + "backup_controller_page_background_app_refresh_disabled_title": "പശ്ചാത്തല ആപ്പ് റിഫ്രഷ് പ്രവർത്തനരഹിതമാക്കി", + "backup_controller_page_background_app_refresh_enable_button_text": "ക്രമീകരണങ്ങളിലേക്ക് പോകുക", + "backup_controller_page_background_battery_info_link": "എങ്ങനെയെന്ന് കാണിക്കുക", + "backup_controller_page_background_battery_info_message": "മികച്ച പശ്ചാത്തല ബാക്കപ്പ് അനുഭവത്തിനായി, Immich-ന്റെ പശ്ചാത്തല പ്രവർത്തനം നിയന്ത്രിക്കുന്ന ഏതെങ്കിലും ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ പ്രവർത്തനരഹിതമാക്കുക.\n\nഇത് ഉപകരണത്തെ ആശ്രയിച്ചിരിക്കുന്നതിനാൽ, നിങ്ങളുടെ ഉപകരണ നിർമ്മാതാവിനുള്ള ആവശ്യമായ വിവരങ്ങൾ ദയവായി കണ്ടെത്തുക.", + "backup_controller_page_background_battery_info_ok": "ശരി", + "backup_controller_page_background_battery_info_title": "ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ", + "backup_controller_page_background_charging": "ചാർജ് ചെയ്യുമ്പോൾ മാത്രം", + "backup_controller_page_background_configure_error": "പശ്ചാത്തല സേവനം കോൺഫിഗർ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "backup_controller_page_background_delay": "പുതിയ അസറ്റുകളുടെ ബാക്കപ്പ് വൈകിപ്പിക്കുക: {duration}", + "backup_controller_page_background_description": "ആപ്പ് തുറക്കാതെ തന്നെ പുതിയ അസറ്റുകൾ യാന്ത്രികമായി ബാക്കപ്പ് ചെയ്യാൻ പശ്ചാത്തല സേവനം ഓണാക്കുക", + "backup_controller_page_background_is_off": "യാന്ത്രിക പശ്ചാത്തല ബാക്കപ്പ് ഓഫാണ്", + "backup_controller_page_background_is_on": "യാന്ത്രിക പശ്ചാത്തല ബാക്കപ്പ് ഓണാണ്", + "backup_controller_page_background_turn_off": "പശ്ചാത്തല സേവനം ഓഫാക്കുക", + "backup_controller_page_background_turn_on": "പശ്ചാത്തല സേവനം ഓണാക്കുക", + "backup_controller_page_background_wifi": "വൈ-ഫൈയിൽ മാത്രം", + "backup_controller_page_backup": "ബാക്കപ്പ്", + "backup_controller_page_backup_selected": "തിരഞ്ഞെടുത്തവ: ", + "backup_controller_page_backup_sub": "ബാക്കപ്പ് ചെയ്ത ഫോട്ടോകളും വീഡിയോകളും", + "backup_controller_page_created": "സൃഷ്ടിച്ചത്: {date}", + "backup_controller_page_desc_backup": "ആപ്പ് തുറക്കുമ്പോൾ പുതിയ അസറ്റുകൾ യാന്ത്രികമായി സെർവറിലേക്ക് അപ്‌ലോഡ് ചെയ്യാൻ ഫോർഗ്രൗണ്ട് ബാക്കപ്പ് ഓണാക്കുക.", + "backup_controller_page_excluded": "ഒഴിവാക്കിയവ: ", + "backup_controller_page_failed": "പരാജയപ്പെട്ടു ({count})", + "backup_controller_page_filename": "ഫയലിന്റെ പേര്: {filename}[{size}]", + "backup_controller_page_id": "ഐഡി: {id}", + "backup_controller_page_info": "ബാക്കപ്പ് വിവരങ്ങൾ", + "backup_controller_page_none_selected": "ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല", + "backup_controller_page_remainder": "ശേഷിക്കുന്നത്", + "backup_controller_page_remainder_sub": "തിരഞ്ഞെടുത്തവയിൽ നിന്ന് ബാക്കപ്പ് ചെയ്യാനുള്ള ശേഷിക്കുന്ന ഫോട്ടോകളും വീഡിയോകളും", + "backup_controller_page_server_storage": "സെർവർ സ്റ്റോറേജ്", + "backup_controller_page_start_backup": "ബാക്കപ്പ് ആരംഭിക്കുക", + "backup_controller_page_status_off": "യാന്ത്രിക ഫോർഗ്രൗണ്ട് ബാക്കപ്പ് ഓഫാണ്", + "backup_controller_page_status_on": "യാന്ത്രിക ഫോർഗ്രൗണ്ട് ബാക്കപ്പ് ഓണാണ്", + "backup_controller_page_storage_format": "{total}-ൽ {used} ഉപയോഗിച്ചു", + "backup_controller_page_to_backup": "ബാക്കപ്പ് ചെയ്യേണ്ട ആൽബങ്ങൾ", + "backup_controller_page_total_sub": "തിരഞ്ഞെടുത്ത ആൽബങ്ങളിൽ നിന്നുള്ള എല്ലാ സവിശേഷമായ ഫോട്ടോകളും വീഡിയോകളും", + "backup_controller_page_turn_off": "ഫോർഗ്രൗണ്ട് ബാക്കപ്പ് ഓഫാക്കുക", + "backup_controller_page_turn_on": "ഫോർഗ്രൗണ്ട് ബാക്കപ്പ് ഓണാക്കുക", + "backup_controller_page_uploading_file_info": "ഫയൽ വിവരങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നു", + "backup_err_only_album": "ഒരേയൊരു ആൽബം നീക്കം ചെയ്യാൻ കഴിയില്ല", + "backup_error_sync_failed": "സിങ്ക് പരാജയപ്പെട്ടു. ബാക്കപ്പ് പ്രോസസ്സ് ചെയ്യാൻ കഴിയില്ല.", + "backup_info_card_assets": "അസറ്റുകൾ", + "backup_manual_cancelled": "റദ്ദാക്കി", + "backup_manual_in_progress": "അപ്‌ലോഡ് ഇതിനകം പുരോഗമിക്കുന്നു. കുറച്ച് സമയത്തിന് ശേഷം ശ്രമിക്കുക", + "backup_manual_success": "വിജയം", + "backup_manual_title": "അപ്‌ലോഡ് നില", + "backup_options": "ബാക്കപ്പ് ഓപ്ഷനുകൾ", + "backup_options_page_title": "ബാക്കപ്പ് ഓപ്ഷനുകൾ", + "backup_setting_subtitle": "പശ്ചാത്തല, മുൻനിര അപ്‌ലോഡ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "backup_settings_subtitle": "അപ്‌ലോഡ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "backward": "പിന്നോട്ട്", + "biometric_auth_enabled": "ബയോമെട്രിക് പ്രാമാണീകരണം പ്രവർത്തനക്ഷമമാക്കി", + "biometric_locked_out": "ബയോമെട്രിക് പ്രാമാണീകരണത്തിൽ നിന്ന് നിങ്ങളെ ലോക്ക് ഔട്ട് ചെയ്തിരിക്കുന്നു", + "biometric_no_options": "ബയോമെട്രിക് ഓപ്ഷനുകളൊന്നും ലഭ്യമല്ല", + "biometric_not_available": "ഈ ഉപകരണത്തിൽ ബയോമെട്രിക് പ്രാമാണീകരണം ലഭ്യമല്ല", + "birthdate_saved": "ജനനത്തീയതി വിജയകരമായി സേവ് ചെയ്തു", + "birthdate_set_description": "ഒരു ഫോട്ടോ എടുക്കുമ്പോഴുള്ള ഈ വ്യക്തിയുടെ പ്രായം കണക്കാക്കാൻ ജനനത്തീയതി ഉപയോഗിക്കുന്നു.", + "blurred_background": "മങ്ങിയ പശ്ചാത്തലം", + "bugs_and_feature_requests": "ബഗുകളും ഫീച്ചർ അഭ്യർത്ഥനകളും", + "build": "ബിൽഡ്", + "build_image": "ഇമേജ് നിർമ്മിക്കുക", + "bulk_delete_duplicates_confirmation": "നിങ്ങൾക്ക് {count, plural, one {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റ്} other {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റുകൾ}} ബൾക്കായി ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ? ഇത് ഓരോ ഗ്രൂപ്പിലെയും ഏറ്റവും വലിയ അസറ്റ് നിലനിർത്തുകയും മറ്റ് എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും ശാശ്വതമായി ഇല്ലാതാക്കുകയും ചെയ്യും. ഈ പ്രവർത്തനം പഴയപടിയാക്കാൻ കഴിയില്ല!", + "bulk_keep_duplicates_confirmation": "നിങ്ങൾക്ക് {count, plural, one {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റ്} other {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റുകൾ}} നിലനിർത്തണമെന്ന് ഉറപ്പാണോ? ഇത് ഒന്നും ഇല്ലാതാക്കാതെ എല്ലാ ഡ്യൂപ്ലിക്കേറ്റ് ഗ്രൂപ്പുകളെയും പരിഹരിക്കും.", + "bulk_trash_duplicates_confirmation": "നിങ്ങൾക്ക് {count, plural, one {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റ്} other {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റുകൾ}} ബൾക്കായി ട്രാഷ് ചെയ്യണമെന്ന് ഉറപ്പാണോ? ഇത് ഓരോ ഗ്രൂപ്പിലെയും ഏറ്റവും വലിയ അസറ്റ് നിലനിർത്തുകയും മറ്റ് എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും ട്രാഷ് ചെയ്യുകയും ചെയ്യും.", + "buy": "Immich വാങ്ങുക", + "cache_settings_clear_cache_button": "കാഷെ ക്ലിയർ ചെയ്യുക", + "cache_settings_clear_cache_button_title": "ആപ്പിന്റെ കാഷെ ക്ലിയർ ചെയ്യുന്നു. കാഷെ പുനർനിർമ്മിക്കുന്നതുവരെ ഇത് ആപ്പിന്റെ പ്രകടനത്തെ സാരമായി ബാധിക്കും.", + "cache_settings_duplicated_assets_clear_button": "ക്ലിയർ ചെയ്യുക", + "cache_settings_duplicated_assets_subtitle": "ആപ്പ് അവഗണിച്ച ഫോട്ടോകളും വീഡിയോകളും", + "cache_settings_duplicated_assets_title": "ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റുകൾ ({count})", + "cache_settings_statistics_album": "ലൈബ്രറി തംബ്നെയിലുകൾ", + "cache_settings_statistics_full": "പൂർണ്ണ ചിത്രങ്ങൾ", + "cache_settings_statistics_shared": "പങ്കിട്ട ആൽബം തംബ്നെയിലുകൾ", + "cache_settings_statistics_thumbnail": "തംബ്നെയിലുകൾ", + "cache_settings_statistics_title": "കാഷെ ഉപയോഗം", + "cache_settings_subtitle": "Immich മൊബൈൽ ആപ്ലിക്കേഷന്റെ കാഷിംഗ് സ്വഭാവം നിയന്ത്രിക്കുക", + "cache_settings_tile_subtitle": "പ്രാദേശിക സ്റ്റോറേജ് സ്വഭാവം നിയന്ത്രിക്കുക", + "cache_settings_tile_title": "പ്രാദേശിക സ്റ്റോറേജ്", + "cache_settings_title": "കാഷിംഗ് ക്രമീകരണങ്ങൾ", + "camera": "ക്യാമറ", + "camera_brand": "ക്യാമറ ബ്രാൻഡ്", + "camera_model": "ക്യാമറ മോഡൽ", + "cancel": "റദ്ദാക്കുക", + "cancel_search": "തിരയൽ റദ്ദാക്കുക", + "canceled": "റദ്ദാക്കി", + "canceling": "റദ്ദാക്കുന്നു", + "cannot_merge_people": "ആളുകളെ ലയിപ്പിക്കാൻ കഴിയില്ല", + "cannot_undo_this_action": "നിങ്ങൾക്ക് ഈ പ്രവർത്തനം പഴയപടിയാക്കാൻ കഴിയില്ല!", + "cannot_update_the_description": "വിവരണം അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "cast": "കാസ്റ്റ്", + "cast_description": "ലഭ്യമായ കാസ്റ്റ് ഡെസ്റ്റിനേഷനുകൾ കോൺഫിഗർ ചെയ്യുക", + "change_date": "തീയതി മാറ്റുക", + "change_description": "വിവരണം മാറ്റുക", + "change_display_order": "പ്രദർശന ക്രമം മാറ്റുക", + "change_expiration_time": "കാലഹരണപ്പെടുന്ന സമയം മാറ്റുക", + "change_location": "സ്ഥാനം മാറ്റുക", + "change_name": "പേര് മാറ്റുക", + "change_name_successfully": "പേര് വിജയകരമായി മാറ്റി", + "change_password": "പാസ്‌വേഡ് മാറ്റുക", + "change_password_description": "ഇത് നിങ്ങൾ ആദ്യമായി സിസ്റ്റത്തിൽ സൈൻ ഇൻ ചെയ്യുന്നതുകൊണ്ടോ അല്ലെങ്കിൽ നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റാൻ ഒരു അഭ്യർത്ഥന നടത്തിയതുകൊണ്ടോ ആകാം. ദയവായി താഴെ പുതിയ പാസ്‌വേഡ് നൽകുക.", + "change_password_form_confirm_password": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "change_password_form_description": "നമസ്കാരം {name},\n\nഇത് നിങ്ങൾ ആദ്യമായി സിസ്റ്റത്തിൽ സൈൻ ഇൻ ചെയ്യുന്നതുകൊണ്ടോ അല്ലെങ്കിൽ നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റാൻ ഒരു അഭ്യർത്ഥന നടത്തിയതുകൊണ്ടോ ആകാം. ദയവായി താഴെ പുതിയ പാസ്‌വേഡ് നൽകുക.", + "change_password_form_new_password": "പുതിയ പാസ്‌വേഡ്", + "change_password_form_password_mismatch": "പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല", + "change_password_form_reenter_new_password": "പുതിയ പാസ്‌വേഡ് വീണ്ടും നൽകുക", + "change_pin_code": "പിൻ കോഡ് മാറ്റുക", + "change_your_password": "നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റുക", + "changed_visibility_successfully": "ദൃശ്യത വിജയകരമായി മാറ്റി", + "charging": "ചാർജ്ജ് ചെയ്യുന്നു", + "charging_requirement_mobile_backup": "പശ്ചാത്തല ബാക്കപ്പിന് ഉപകരണം ചാർജ് ചെയ്യേണ്ടതുണ്ട്", + "check_corrupt_asset_backup": "കേടായ അസറ്റ് ബാക്കപ്പുകൾ പരിശോധിക്കുക", + "check_corrupt_asset_backup_button": "പരിശോധന നടത്തുക", + "check_corrupt_asset_backup_description": "എല്ലാ അസറ്റുകളും ബാക്കപ്പ് ചെയ്ത ശേഷം, വൈ-ഫൈയിൽ മാത്രം ഈ പരിശോധന നടത്തുക. നടപടിക്രമത്തിന് കുറച്ച് മിനിറ്റുകൾ എടുത്തേക്കാം.", + "check_logs": "ലോഗുകൾ പരിശോധിക്കുക", + "choose_matching_people_to_merge": "ലയിപ്പിക്കാൻ പൊരുത്തപ്പെടുന്ന ആളുകളെ തിരഞ്ഞെടുക്കുക", + "city": "നഗരം", + "clear": "ക്ലിയർ ചെയ്യുക", + "clear_all": "എല്ലാം ക്ലിയർ ചെയ്യുക", + "clear_all_recent_searches": "അടുത്തിടെ നടത്തിയ എല്ലാ തിരയലുകളും ക്ലിയർ ചെയ്യുക", + "clear_file_cache": "ഫയൽ കാഷെ ക്ലിയർ ചെയ്യുക", + "clear_message": "സന്ദേശം ക്ലിയർ ചെയ്യുക", + "clear_value": "മൂല്യം ക്ലിയർ ചെയ്യുക", + "client_cert_dialog_msg_confirm": "ശരി", + "client_cert_enter_password": "പാസ്‌വേഡ് നൽകുക", + "client_cert_import": "ഇമ്പോർട്ട് ചെയ്യുക", + "client_cert_import_success_msg": "ക്ലയിന്റ് സർട്ടിഫിക്കറ്റ് ഇമ്പോർട്ടുചെയ്‌തു", + "client_cert_invalid_msg": "അസാധുവായ സർട്ടിഫിക്കറ്റ് ഫയൽ അല്ലെങ്കിൽ തെറ്റായ പാസ്‌വേഡ്", + "client_cert_remove_msg": "ക്ലയിന്റ് സർട്ടിഫിക്കറ്റ് നീക്കംചെയ്‌തു", + "client_cert_subtitle": "PKCS12 (.p12, .pfx) ഫോർമാറ്റ് മാത്രം പിന്തുണയ്ക്കുന്നു. ലോഗിൻ ചെയ്യുന്നതിന് മുമ്പ് മാത്രമേ സർട്ടിഫിക്കറ്റ് ഇമ്പോർട്ട്/നീക്കംചെയ്യൽ ലഭ്യമാകൂ", + "client_cert_title": "SSL ക്ലയിന്റ് സർട്ടിഫിക്കറ്റ്", + "clockwise": "പ്രദക്ഷിണമായി", + "close": "അടയ്ക്കുക", + "collapse": "ചുരുക്കുക", + "collapse_all": "എല്ലാം ചുരുക്കുക", + "color": "നിറം", + "color_theme": "കളർ തീം", + "comment_deleted": "അഭിപ്രായം ഇല്ലാതാക്കി", + "comment_options": "അഭിപ്രായത്തിനുള്ള ഓപ്ഷനുകൾ", + "comments_and_likes": "അഭിപ്രായങ്ങളും ലൈക്കുകളും", + "comments_are_disabled": "അഭിപ്രായങ്ങൾ പ്രവർത്തനരഹിതമാക്കി", + "common_create_new_album": "പുതിയ ആൽബം ഉണ്ടാക്കുക", + "common_server_error": "നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിക്കുക, സെർവർ ലഭ്യമാണെന്നും ആപ്പ്/സെർവർ പതിപ്പുകൾ അനുയോജ്യമാണെന്നും ഉറപ്പാക്കുക.", + "completed": "പൂർത്തിയായി", + "confirm": "സ്ഥിരീകരിക്കുക", + "confirm_admin_password": "അഡ്മിൻ പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "confirm_delete_face": "{name} എന്ന മുഖം അസറ്റിൽ നിന്ന് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "confirm_delete_shared_link": "ഈ പങ്കിട്ട ലിങ്ക് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "confirm_keep_this_delete_others": "ഈ അസറ്റ് ഒഴികെ സ്റ്റാക്കിലെ മറ്റെല്ലാ അസറ്റുകളും ഇല്ലാതാക്കപ്പെടും. തുടരണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "confirm_new_pin_code": "പുതിയ പിൻ കോഡ് സ്ഥിരീകരിക്കുക", + "confirm_password": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക", + "confirm_tag_face": "ഈ മുഖം {name} എന്ന് ടാഗ് ചെയ്യണോ?", + "confirm_tag_face_unnamed": "ഈ മുഖം ടാഗ് ചെയ്യണോ?", + "connected_device": "ബന്ധിപ്പിച്ച ഉപകരണം", + "connected_to": "ഇതുമായി ബന്ധിപ്പിച്ചു", + "contain": "ഉൾക്കൊള്ളുക", + "context": "സന്ദർഭം", + "continue": "തുടരുക", + "control_bottom_app_bar_create_new_album": "പുതിയ ആൽബം ഉണ്ടാക്കുക", + "control_bottom_app_bar_delete_from_immich": "Immich-ൽ നിന്ന് ഇല്ലാതാക്കുക", + "control_bottom_app_bar_delete_from_local": "ഉപകരണത്തിൽ നിന്ന് ഇല്ലാതാക്കുക", + "control_bottom_app_bar_edit_location": "സ്ഥാനം എഡിറ്റുചെയ്യുക", + "control_bottom_app_bar_edit_time": "തീയതിയും സമയവും എഡിറ്റുചെയ്യുക", + "control_bottom_app_bar_share_link": "ലിങ്ക് പങ്കിടുക", + "control_bottom_app_bar_share_to": "ഇതിലേക്ക് പങ്കിടുക", + "control_bottom_app_bar_trash_from_immich": "ട്രാഷിലേക്ക് മാറ്റുക", + "copied_image_to_clipboard": "ചിത്രം ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി.", + "copied_to_clipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി!", + "copy_error": "പകർത്തുന്നതിൽ പിശക്", + "copy_file_path": "ഫയൽ പാത്ത് പകർത്തുക", + "copy_image": "ചിത്രം പകർത്തുക", + "copy_link": "ലിങ്ക് പകർത്തുക", + "copy_link_to_clipboard": "ലിങ്ക് ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക", + "copy_password": "പാസ്‌വേഡ് പകർത്തുക", + "copy_to_clipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക", + "country": "രാജ്യം", + "cover": "കവർ", + "covers": "കവറുകൾ", + "create": "സൃഷ്ടിക്കുക", + "create_album": "ആൽബം ഉണ്ടാക്കുക", + "create_album_page_untitled": "പേരില്ലാത്തത്", + "create_library": "ലൈബ്രറി ഉണ്ടാക്കുക", + "create_link": "ലിങ്ക് ഉണ്ടാക്കുക", + "create_link_to_share": "പങ്കിടാൻ ലിങ്ക് ഉണ്ടാക്കുക", + "create_link_to_share_description": "തിരഞ്ഞെടുത്ത ഫോട്ടോ(കൾ) കാണാൻ ലിങ്കുള്ള ആർക്കും അനുവാദം നൽകുക", + "create_new": "പുതിയത് ഉണ്ടാക്കുക", + "create_new_person": "പുതിയ വ്യക്തിയെ ഉണ്ടാക്കുക", + "create_new_person_hint": "തിരഞ്ഞെടുത്ത അസറ്റുകൾ ഒരു പുതിയ വ്യക്തിക്ക് നൽകുക", + "create_new_user": "പുതിയ ഉപയോക്താവിനെ ഉണ്ടാക്കുക", + "create_shared_album_page_share_add_assets": "അസറ്റുകൾ ചേർക്കുക", + "create_shared_album_page_share_select_photos": "ഫോട്ടോകൾ തിരഞ്ഞെടുക്കുക", + "create_shared_link": "പങ്കിട്ട ലിങ്ക് ഉണ്ടാക്കുക", + "create_tag": "ടാഗ് ഉണ്ടാക്കുക", + "create_tag_description": "ഒരു പുതിയ ടാഗ് ഉണ്ടാക്കുക. നെസ്റ്റഡ് ടാഗുകൾക്കായി, ഫോർവേഡ് സ്ലാഷുകൾ ഉൾപ്പെടെ ടാഗിന്റെ പൂർണ്ണ പാത നൽകുക.", + "create_user": "ഉപയോക്താവിനെ ഉണ്ടാക്കുക", + "created": "സൃഷ്ടിച്ചത്", + "created_at": "സൃഷ്ടിച്ചത്", + "creating_linked_albums": "ബന്ധിപ്പിച്ച ആൽബങ്ങൾ ഉണ്ടാക്കുന്നു...", + "crop": "ക്രോപ്പ് ചെയ്യുക", + "curated_object_page_title": "വസ്തുക്കൾ", + "current_device": "നിലവിലെ ഉപകരണം", + "current_pin_code": "നിലവിലെ പിൻ കോഡ്", + "current_server_address": "നിലവിലെ സെർവർ വിലാസം", + "custom_locale": "കസ്റ്റം ലൊക്കേൽ", + "custom_locale_description": "ഭാഷയെയും പ്രദേശത്തെയും അടിസ്ഥാനമാക്കി തീയതികളും അക്കങ്ങളും ഫോർമാറ്റ് ചെയ്യുക", + "custom_url": "കസ്റ്റം URL", + "daily_title_text_date": "E, MMM dd", + "daily_title_text_date_year": "E, MMM dd, yyyy", + "dark": "ഇരുണ്ടത്", + "dark_theme": "ഡാർക്ക് തീം ടോഗിൾ ചെയ്യുക", + "date_after": "ഇതിനു ശേഷമുള്ള തീയതി", + "date_and_time": "തീയതിയും സമയവും", + "date_before": "ഇതിനു മുമ്പുള്ള തീയതി", + "date_format": "E, LLL d, y • h:mm a", + "date_of_birth_saved": "ജനനത്തീയതി വിജയകരമായി സേവ് ചെയ്തു", + "date_range": "തീയതി പരിധി", + "day": "ദിവസം", + "days": "ദിവസങ്ങൾ", + "deduplicate_all": "എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും ഒഴിവാക്കുക", + "deduplication_criteria_1": "ചിത്രത്തിന്റെ വലുപ്പം (ബൈറ്റുകളിൽ)", + "deduplication_criteria_2": "EXIF ഡാറ്റയുടെ എണ്ണം", + "deduplication_info": "ഡ്യൂപ്ലിക്കേഷൻ ഒഴിവാക്കൽ വിവരം", + "deduplication_info_description": "അസറ്റുകൾ യാന്ത്രികമായി മുൻകൂട്ടി തിരഞ്ഞെടുക്കുന്നതിനും ഡ്യൂപ്ലിക്കേറ്റുകൾ ബൾക്കായി നീക്കം ചെയ്യുന്നതിനും, ഞങ്ങൾ ഇവ പരിഗണിക്കുന്നു:", + "default_locale": "ഡിഫോൾട്ട് ലൊക്കേൽ", + "default_locale_description": "നിങ്ങളുടെ ബ്രൗസർ ലൊക്കേലിനെ അടിസ്ഥാനമാക്കി തീയതികളും അക്കങ്ങളും ഫോർമാറ്റ് ചെയ്യുക", + "delete": "ഇല്ലാതാക്കുക", + "delete_action_confirmation_message": "ഈ അസറ്റ് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഈ പ്രവർത്തനം അസറ്റിനെ സെർവറിന്റെ ട്രാഷിലേക്ക് മാറ്റും, കൂടാതെ ഇത് പ്രാദേശികമായി ഇല്ലാതാക്കണോ എന്ന് ചോദിക്കുകയും ചെയ്യും", + "delete_action_prompt": "{count} എണ്ണം ഇല്ലാതാക്കി", + "delete_album": "ആൽബം ഇല്ലാതാക്കുക", + "delete_api_key_prompt": "ഈ API കീ ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "delete_dialog_alert": "ഈ ഇനങ്ങൾ Immich-ൽ നിന്നും നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്നും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും", + "delete_dialog_alert_local": "ഈ ഇനങ്ങൾ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് ശാശ്വതമായി നീക്കം ചെയ്യപ്പെടും, പക്ഷേ Immich സെർവറിൽ തുടർന്നും ലഭ്യമാകും", + "delete_dialog_alert_local_non_backed_up": "ചില ഇനങ്ങൾ Immich-ലേക്ക് ബാക്കപ്പ് ചെയ്തിട്ടില്ല, അവ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് ശാശ്വതമായി നീക്കം ചെയ്യപ്പെടും", + "delete_dialog_alert_remote": "ഈ ഇനങ്ങൾ Immich സെർവറിൽ നിന്ന് ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും", + "delete_dialog_ok_force": "എന്തായാലും ഇല്ലാതാക്കുക", + "delete_dialog_title": "ശാശ്വതമായി ഇല്ലാതാക്കുക", + "delete_duplicates_confirmation": "ഈ ഡ്യൂപ്ലിക്കേറ്റുകൾ ശാശ്വതമായി ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "delete_face": "മുഖം ഇല്ലാതാക്കുക", + "delete_key": "കീ ഇല്ലാതാക്കുക", + "delete_library": "ലൈബ്രറി ഇല്ലാതാക്കുക", + "delete_link": "ലിങ്ക് ഇല്ലാതാക്കുക", + "delete_local_action_prompt": "{count} എണ്ണം പ്രാദേശികമായി ഇല്ലാതാക്കി", + "delete_local_dialog_ok_backed_up_only": "ബാക്കപ്പ് ചെയ്തവ മാത്രം ഇല്ലാതാക്കുക", + "delete_local_dialog_ok_force": "എന്തായാലും ഇല്ലാതാക്കുക", + "delete_others": "മറ്റുള്ളവ ഇല്ലാതാക്കുക", + "delete_permanently": "ശാശ്വതമായി ഇല്ലാതാക്കുക", + "delete_permanently_action_prompt": "{count} എണ്ണം ശാശ്വതമായി ഇല്ലാതാക്കി", + "delete_shared_link": "പങ്കിട്ട ലിങ്ക് ഇല്ലാതാക്കുക", + "delete_shared_link_dialog_title": "പങ്കിട്ട ലിങ്ക് ഇല്ലാതാക്കുക", + "delete_tag": "ടാഗ് ഇല്ലാതാക്കുക", + "delete_tag_confirmation_prompt": "{tagName} എന്ന ടാഗ് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "delete_user": "ഉപയോക്താവിനെ ഇല്ലാതാക്കുക", + "deleted_shared_link": "പങ്കിട്ട ലിങ്ക് ഇല്ലാതാക്കി", + "deletes_missing_assets": "ഡിസ്കിൽ നിന്ന് കാണാതായ അസറ്റുകൾ ഇല്ലാതാക്കുന്നു", + "description": "വിവരണം", + "description_input_hint_text": "വിവരണം ചേർക്കുക...", + "description_input_submit_error": "വിവരണം അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ പിശക്, കൂടുതൽ വിവരങ്ങൾക്ക് ലോഗ് പരിശോധിക്കുക", + "deselect_all": "എല്ലാം തിരഞ്ഞെടുത്തത് മാറ്റുക", + "details": "വിശദാംശങ്ങൾ", + "direction": "ദിശ", + "disabled": "പ്രവർത്തനരഹിതം", + "disallow_edits": "എഡിറ്റുകൾ അനുവദിക്കരുത്", + "discord": "ഡിസ്കോർഡ്", + "discover": "കണ്ടെത്തുക", + "discovered_devices": "കണ്ടെത്തിയ ഉപകരണങ്ങൾ", + "dismiss_all_errors": "എല്ലാ പിശകുകളും തള്ളിക്കളയുക", + "dismiss_error": "പിശക് തള്ളിക്കളയുക", + "display_options": "പ്രദർശന ഓപ്ഷനുകൾ", + "display_order": "പ്രദർശന ക്രമം", + "display_original_photos": "യഥാർത്ഥ ഫോട്ടോകൾ പ്രദർശിപ്പിക്കുക", + "display_original_photos_setting_description": "യഥാർത്ഥ അസറ്റ് വെബ്-അനുയോജ്യമാകുമ്പോൾ, തംബ്നെയിലുകൾക്ക് പകരം യഥാർത്ഥ ഫോട്ടോ പ്രദർശിപ്പിക്കാൻ മുൻഗണന നൽകുക. ഇത് ഫോട്ടോ പ്രദർശന വേഗത കുറയ്ക്കാൻ ഇടയാക്കും.", + "do_not_show_again": "ഈ സന്ദേശം വീണ്ടും കാണിക്കരുത്", + "documentation": "ഡോക്യുമെന്റേഷൻ", + "done": "പൂർത്തിയായി", + "download": "ഡൗൺലോഡ്", + "download_action_prompt": "{count} അസറ്റുകൾ ഡൗൺലോഡ് ചെയ്യുന്നു", + "download_canceled": "ഡൗൺലോഡ് റദ്ദാക്കി", + "download_complete": "ഡൗൺലോഡ് പൂർത്തിയായി", + "download_enqueue": "ഡൗൺലോഡ് ക്യൂവിൽ ചേർത്തു", + "download_error": "ഡൗൺലോഡ് പിശക്", + "download_failed": "ഡൗൺലോഡ് പരാജയപ്പെട്ടു", + "download_finished": "ഡൗൺലോഡ് കഴിഞ്ഞു", + "download_include_embedded_motion_videos": "ഉൾച്ചേർത്ത വീഡിയോകൾ", + "download_include_embedded_motion_videos_description": "ചലിക്കുന്ന ഫോട്ടോകളിൽ ഉൾച്ചേർത്ത വീഡിയോകൾ ഒരു പ്രത്യേക ഫയലായി ഉൾപ്പെടുത്തുക", + "download_notfound": "ഡൗൺലോഡ് കണ്ടെത്തിയില്ല", + "download_paused": "ഡൗൺലോഡ് താൽക്കാലികമായി നിർത്തി", + "download_settings": "ഡൗൺലോഡ് ക്രമീകരണങ്ങൾ", + "download_settings_description": "അസറ്റ് ഡൗൺലോഡുമായി ബന്ധപ്പെട്ട ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "download_started": "ഡൗൺലോഡ് ആരംഭിച്ചു", + "download_sucess": "ഡൗൺലോഡ് വിജയിച്ചു", + "download_sucess_android": "മീഡിയ DCIM/Immich എന്നതിലേക്ക് ഡൗൺലോഡ് ചെയ്തിരിക്കുന്നു", + "download_waiting_to_retry": "വീണ്ടും ശ്രമിക്കാൻ കാത്തിരിക്കുന്നു", + "downloading": "ഡൗൺലോഡ് ചെയ്യുന്നു", + "downloading_asset_filename": "{filename} എന്ന അസറ്റ് ഡൗൺലോഡ് ചെയ്യുന്നു", + "downloading_media": "മീഡിയ ഡൗൺലോഡ് ചെയ്യുന്നു", + "drop_files_to_upload": "അപ്‌ലോഡ് ചെയ്യാൻ ഫയലുകൾ എവിടെയും ഡ്രോപ്പ് ചെയ്യുക", + "duplicates": "ഡ്യൂപ്ലിക്കേറ്റുകൾ", + "duplicates_description": "ഏതാണ് ഡ്യൂപ്ലിക്കേറ്റ് എന്ന് സൂചിപ്പിച്ച് ഓരോ ഗ്രൂപ്പും പരിഹരിക്കുക", + "duration": "ദൈർഘ്യം", + "edit": "തിരുത്തുക", + "edit_album": "ആൽബം എഡിറ്റുചെയ്യുക", + "edit_avatar": "അവതാർ എഡിറ്റുചെയ്യുക", + "edit_birthday": "ജന്മദിനം എഡിറ്റുചെയ്യുക", + "edit_date": "തീയതി എഡിറ്റുചെയ്യുക", + "edit_date_and_time": "തീയതിയും സമയവും എഡിറ്റുചെയ്യുക", + "edit_date_and_time_action_prompt": "{count} എണ്ണത്തിന്റെ തീയതിയും സമയവും എഡിറ്റുചെയ്തു", + "edit_date_and_time_by_offset": "ഓഫ്സെറ്റ് ഉപയോഗിച്ച് തീയതി മാറ്റുക", + "edit_date_and_time_by_offset_interval": "പുതിയ തീയതി പരിധി: {from}-{to}", + "edit_description": "വിവരണം എഡിറ്റുചെയ്യുക", + "edit_description_prompt": "ദയവായി ഒരു പുതിയ വിവരണം തിരഞ്ഞെടുക്കുക:", + "edit_exclusion_pattern": "ഒഴിവാക്കൽ പാറ്റേൺ എഡിറ്റുചെയ്യുക", + "edit_faces": "മുഖങ്ങൾ എഡിറ്റുചെയ്യുക", + "edit_import_path": "ഇമ്പോർട്ട് പാത്ത് എഡിറ്റുചെയ്യുക", + "edit_import_paths": "ഇമ്പോർട്ട് പാത്തുകൾ എഡിറ്റുചെയ്യുക", + "edit_key": "കീ എഡിറ്റുചെയ്യുക", + "edit_link": "ലിങ്ക് എഡിറ്റുചെയ്യുക", + "edit_location": "സ്ഥാനം എഡിറ്റുചെയ്യുക", + "edit_location_action_prompt": "{count} എണ്ണത്തിന്റെ സ്ഥാനം എഡിറ്റുചെയ്തു", + "edit_location_dialog_title": "സ്ഥാനം", + "edit_name": "പേര് എഡിറ്റുചെയ്യുക", + "edit_people": "ആളുകളെ എഡിറ്റുചെയ്യുക", + "edit_tag": "ടാഗ് എഡിറ്റുചെയ്യുക", + "edit_title": "ശീർഷകം എഡിറ്റുചെയ്യുക", + "edit_user": "ഉപയോക്താവിനെ എഡിറ്റുചെയ്യുക", + "edited": "എഡിറ്റുചെയ്തു", + "editor": "എഡിറ്റർ", + "editor_close_without_save_prompt": "മാറ്റങ്ങൾ സേവ് ചെയ്യില്ല", + "editor_close_without_save_title": "എഡിറ്റർ അടയ്ക്കണോ?", + "editor_crop_tool_h2_aspect_ratios": "വീക്ഷണാനുപാതം", + "editor_crop_tool_h2_rotation": "റൊട്ടേഷൻ", + "email": "ഇമെയിൽ", + "email_notifications": "ഇമെയിൽ അറിയിപ്പുകൾ", + "empty_folder": "ഈ ഫോൾഡർ ശൂന്യമാണ്", + "empty_trash": "ട്രാഷ് ശൂന്യമാക്കുക", + "empty_trash_confirmation": "ട്രാഷ് ശൂന്യമാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് ട്രാഷിലെ എല്ലാ അസറ്റുകളും Immich-ൽ നിന്ന് ശാശ്വതമായി നീക്കംചെയ്യും.\nനിങ്ങൾക്ക് ഈ പ്രവർത്തനം പഴയപടിയാക്കാൻ കഴിയില്ല!", + "enable": "പ്രവർത്തനക്ഷമമാക്കുക", + "enable_backup": "ബാക്കപ്പ് പ്രവർത്തനക്ഷമമാക്കുക", + "enable_biometric_auth_description": "ബയോമെട്രിക് പ്രാമാണീകരണം പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങളുടെ പിൻ കോഡ് നൽകുക", + "enabled": "പ്രവർത്തനക്ഷമമാക്കി", + "end_date": "അവസാന തീയതി", + "enqueued": "ക്യൂവിൽ ചേർത്തു", + "enter_wifi_name": "വൈ-ഫൈയുടെ പേര് നൽകുക", + "enter_your_pin_code": "നിങ്ങളുടെ പിൻ കോഡ് നൽകുക", + "enter_your_pin_code_subtitle": "ലോക്ക് ചെയ്ത ഫോൾഡർ ആക്‌സസ് ചെയ്യാൻ നിങ്ങളുടെ പിൻ കോഡ് നൽകുക", + "error": "പിശക്", + "error_change_sort_album": "ആൽബത്തിന്റെ സോർട്ട് ഓർഡർ മാറ്റുന്നതിൽ പരാജയപ്പെട്ടു", + "error_delete_face": "അസറ്റിൽ നിന്ന് മുഖം ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "error_getting_places": "സ്ഥലങ്ങൾ ലഭിക്കുന്നതിൽ പിശക്", + "error_loading_image": "ചിത്രം ലോഡുചെയ്യുന്നതിൽ പിശക്", + "error_loading_partners": "പങ്കാളികളെ ലോഡുചെയ്യുന്നതിൽ പിശക്: {error}", + "error_saving_image": "പിശക്: {error}", + "error_tag_face_bounding_box": "മുഖം ടാഗ് ചെയ്യുന്നതിൽ പിശക് - ബൗണ്ടിംഗ് ബോക്സ് കോർഡിനേറ്റുകൾ ലഭിക്കുന്നില്ല", + "error_title": "പിശക് - എന്തോ കുഴപ്പം സംഭവിച്ചു", + "errors": { + "cannot_navigate_next_asset": "അടുത്ത അസറ്റിലേക്ക് പോകാൻ കഴിയില്ല", + "cannot_navigate_previous_asset": "മുമ്പത്തെ അസറ്റിലേക്ക് പോകാൻ കഴിയില്ല", + "cant_apply_changes": "മാറ്റങ്ങൾ പ്രയോഗിക്കാൻ കഴിയില്ല", + "cant_change_activity": "പ്രവർത്തനം {enabled, select, true {പ്രവർത്തനരഹിതമാക്കാൻ} other {പ്രവർത്തനക്ഷമമാക്കാൻ}} കഴിയില്ല", + "cant_change_asset_favorite": "അസറ്റിന്റെ പ്രിയപ്പെട്ടവ മാറ്റാൻ കഴിയില്ല", + "cant_change_metadata_assets_count": "{count, plural, one {# അസറ്റിന്റെ} other {# അസറ്റുകളുടെ}} മെറ്റാഡാറ്റ മാറ്റാൻ കഴിയില്ല", + "cant_get_faces": "മുഖങ്ങൾ ലഭിക്കുന്നില്ല", + "cant_get_number_of_comments": "അഭിപ്രായങ്ങളുടെ എണ്ണം ലഭിക്കുന്നില്ല", + "cant_search_people": "ആളുകളെ തിരയാൻ കഴിയില്ല", + "cant_search_places": "സ്ഥലങ്ങൾ തിരയാൻ കഴിയില്ല", + "error_adding_assets_to_album": "ആൽബത്തിലേക്ക് അസറ്റുകൾ ചേർക്കുന്നതിൽ പിശക്", + "error_adding_users_to_album": "ആൽബത്തിലേക്ക് ഉപയോക്താക്കളെ ചേർക്കുന്നതിൽ പിശക്", + "error_deleting_shared_user": "പങ്കിട്ട ഉപയോക്താവിനെ ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "error_downloading": "{filename} ഡൗൺലോഡ് ചെയ്യുന്നതിൽ പിശക്", + "error_hiding_buy_button": "വാങ്ങാനുള്ള ബട്ടൺ മറയ്ക്കുന്നതിൽ പിശക്", + "error_removing_assets_from_album": "ആൽബത്തിൽ നിന്ന് അസറ്റുകൾ നീക്കം ചെയ്യുന്നതിൽ പിശക്, കൂടുതൽ വിവരങ്ങൾക്ക് കൺസോൾ പരിശോധിക്കുക", + "error_selecting_all_assets": "എല്ലാ അസറ്റുകളും തിരഞ്ഞെടുക്കുന്നതിൽ പിശക്", + "exclusion_pattern_already_exists": "ഈ ഒഴിവാക്കൽ പാറ്റേൺ ഇതിനകം നിലവിലുണ്ട്.", + "failed_to_create_album": "ആൽബം ഉണ്ടാക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_create_shared_link": "പങ്കിട്ട ലിങ്ക് ഉണ്ടാക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_edit_shared_link": "പങ്കിട്ട ലിങ്ക് എഡിറ്റുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_get_people": "ആളുകളെ ലഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_keep_this_delete_others": "ഈ അസറ്റ് നിലനിർത്തി മറ്റ് അസറ്റുകൾ ഇല്ലാതാക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_asset": "അസറ്റ് ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_assets": "അസറ്റുകൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_notifications": "അറിയിപ്പുകൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_people": "ആളുകളെ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_remove_product_key": "പ്രൊഡക്റ്റ് കീ നീക്കം ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_reset_pin_code": "പിൻ കോഡ് റീസെറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_stack_assets": "അസറ്റുകൾ സ്റ്റാക്ക് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_unstack_assets": "അസറ്റുകൾ അൺ-സ്റ്റാക്ക് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_update_notification_status": "അറിയിപ്പിന്റെ നില അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "import_path_already_exists": "ഈ ഇമ്പോർട്ട് പാത്ത് ഇതിനകം നിലവിലുണ്ട്.", + "incorrect_email_or_password": "തെറ്റായ ഇമെയിൽ അല്ലെങ്കിൽ പാസ്‌വേഡ്", + "paths_validation_failed": "{paths, plural, one {# പാത്ത്} other {# പാത്തുകൾ}} സാധൂകരണത്തിൽ പരാജയപ്പെട്ടു", + "profile_picture_transparent_pixels": "പ്രൊഫൈൽ ചിത്രങ്ങൾക്ക് സുതാര്യമായ പിക്സലുകൾ ഉണ്ടാകരുത്. ദയവായി സൂം ഇൻ ചെയ്യുക കൂടാതെ/അല്ലെങ്കിൽ ചിത്രം നീക്കുക.", + "quota_higher_than_disk_size": "ഡിസ്ക് വലുപ്പത്തേക്കാൾ ഉയർന്ന ക്വാട്ട നിങ്ങൾ സജ്ജമാക്കിയിരിക്കുന്നു", + "something_went_wrong": "എന്തോ കുഴപ്പം സംഭവിച്ചു", + "unable_to_add_album_users": "ആൽബത്തിലേക്ക് ഉപയോക്താക്കളെ ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_assets_to_shared_link": "പങ്കിട്ട ലിങ്കിലേക്ക് അസറ്റുകൾ ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_comment": "അഭിപ്രായം ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_exclusion_pattern": "ഒഴിവാക്കൽ പാറ്റേൺ ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_import_path": "ഇമ്പോർട്ട് പാത്ത് ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_partners": "പങ്കാളികളെ ചേർക്കാൻ കഴിയില്ല", + "unable_to_add_remove_archive": "ആർക്കൈവിൽ {archived, select, true {നിന്ന് അസറ്റ് നീക്കംചെയ്യാൻ} other {ലേക്ക് അസറ്റ് ചേർക്കാൻ}} കഴിയില്ല", + "unable_to_add_remove_favorites": "പ്രിയപ്പെട്ടവയിലേക്ക് {favorite, select, true {അസറ്റ് ചേർക്കാൻ} other {നിന്ന് അസറ്റ് നീക്കംചെയ്യാൻ}} കഴിയില്ല", + "unable_to_archive_unarchive": "{archived, select, true {ആർക്കൈവ് ചെയ്യാൻ} other {അൺആർക്കൈവ് ചെയ്യാൻ}} കഴിയില്ല", + "unable_to_change_album_user_role": "ആൽബം ഉപയോക്താവിന്റെ റോൾ മാറ്റാൻ കഴിയില്ല", + "unable_to_change_date": "തീയതി മാറ്റാൻ കഴിയില്ല", + "unable_to_change_description": "വിവരണം മാറ്റാൻ കഴിയില്ല", + "unable_to_change_favorite": "അസറ്റിന്റെ പ്രിയപ്പെട്ടവ മാറ്റാൻ കഴിയില്ല", + "unable_to_change_location": "സ്ഥാനം മാറ്റാൻ കഴിയില്ല", + "unable_to_change_password": "പാസ്‌വേഡ് മാറ്റാൻ കഴിയില്ല", + "unable_to_change_visibility": "{count, plural, one {# വ്യക്തിയുടെ} other {# ആളുകളുടെ}} ദൃശ്യത മാറ്റാൻ കഴിയില്ല", + "unable_to_complete_oauth_login": "OAuth ലോഗിൻ പൂർത്തിയാക്കാൻ കഴിയില്ല", + "unable_to_connect": "ബന്ധിപ്പിക്കാൻ കഴിയില്ല", + "unable_to_copy_to_clipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്താൻ കഴിയില്ല, നിങ്ങൾ https വഴിയാണ് പേജ് ആക്‌സസ് ചെയ്യുന്നതെന്ന് ഉറപ്പാക്കുക", + "unable_to_create_admin_account": "അഡ്മിൻ അക്കൗണ്ട് ഉണ്ടാക്കാൻ കഴിയില്ല", + "unable_to_create_api_key": "പുതിയ API കീ ഉണ്ടാക്കാൻ കഴിയില്ല", + "unable_to_create_library": "ലൈബ്രറി ഉണ്ടാക്കാൻ കഴിയില്ല", + "unable_to_create_user": "ഉപയോക്താവിനെ ഉണ്ടാക്കാൻ കഴിയില്ല", + "unable_to_delete_album": "ആൽബം ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_delete_asset": "അസറ്റ് ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_delete_assets": "അസറ്റുകൾ ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "unable_to_delete_exclusion_pattern": "ഒഴിവാക്കൽ പാറ്റേൺ ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_delete_import_path": "ഇമ്പോർട്ട് പാത്ത് ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_delete_shared_link": "പങ്കിട്ട ലിങ്ക് ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_delete_user": "ഉപയോക്താവിനെ ഇല്ലാതാക്കാൻ കഴിയില്ല", + "unable_to_download_files": "ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_edit_exclusion_pattern": "ഒഴിവാക്കൽ പാറ്റേൺ എഡിറ്റുചെയ്യാൻ കഴിയില്ല", + "unable_to_edit_import_path": "ഇമ്പോർട്ട് പാത്ത് എഡിറ്റുചെയ്യാൻ കഴിയില്ല", + "unable_to_empty_trash": "ട്രാഷ് ശൂന്യമാക്കാൻ കഴിയില്ല", + "unable_to_enter_fullscreen": "ഫുൾസ്ക്രീനിൽ പ്രവേശിക്കാൻ കഴിയില്ല", + "unable_to_exit_fullscreen": "ഫുൾസ്ക്രീനിൽ നിന്ന് പുറത്തുകടക്കാൻ കഴിയില്ല", + "unable_to_get_comments_number": "അഭിപ്രായങ്ങളുടെ എണ്ണം ലഭിക്കുന്നില്ല", + "unable_to_get_shared_link": "പങ്കിട്ട ലിങ്ക് ലഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "unable_to_hide_person": "വ്യക്തിയെ മറയ്ക്കാൻ കഴിയില്ല", + "unable_to_link_motion_video": "ചലിക്കുന്ന വീഡിയോ ലിങ്ക് ചെയ്യാൻ കഴിയില്ല", + "unable_to_link_oauth_account": "OAuth അക്കൗണ്ട് ലിങ്ക് ചെയ്യാൻ കഴിയില്ല", + "unable_to_log_out_all_devices": "എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ലോഗ് ഔട്ട് ചെയ്യാൻ കഴിയില്ല", + "unable_to_log_out_device": "ഉപകരണത്തിൽ നിന്ന് ലോഗ് ഔട്ട് ചെയ്യാൻ കഴിയില്ല", + "unable_to_login_with_oauth": "OAuth ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാൻ കഴിയില്ല", + "unable_to_play_video": "വീഡിയോ പ്ലേ ചെയ്യാൻ കഴിയില്ല", + "unable_to_reassign_assets_existing_person": "{name, select, null {നിലവിലുള്ള ഒരു വ്യക്തിക്ക്} other {{name}-ന്}} അസറ്റുകൾ വീണ്ടും നൽകാൻ കഴിയില്ല", + "unable_to_reassign_assets_new_person": "ഒരു പുതിയ വ്യക്തിക്ക് അസറ്റുകൾ വീണ്ടും നൽകാൻ കഴിയില്ല", + "unable_to_refresh_user": "ഉപയോക്താവിനെ പുതുക്കാൻ കഴിയില്ല", + "unable_to_remove_album_users": "ആൽബത്തിൽ നിന്ന് ഉപയോക്താക്കളെ നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_remove_api_key": "API കീ നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_remove_assets_from_shared_link": "പങ്കിട്ട ലിങ്കിൽ നിന്ന് അസറ്റുകൾ നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_remove_library": "ലൈബ്രറി നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_remove_partner": "പങ്കാളിയെ നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_remove_reaction": "പ്രതികരണം നീക്കംചെയ്യാൻ കഴിയില്ല", + "unable_to_reset_password": "പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_reset_pin_code": "പിൻ കോഡ് റീസെറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_resolve_duplicate": "ഡ്യൂപ്ലിക്കേറ്റ് പരിഹരിക്കാൻ കഴിയില്ല", + "unable_to_restore_assets": "അസറ്റുകൾ പുനഃസ്ഥാപിക്കാൻ കഴിയില്ല", + "unable_to_restore_trash": "ട്രാഷ് പുനഃസ്ഥാപിക്കാൻ കഴിയില്ല", + "unable_to_restore_user": "ഉപയോക്താവിനെ പുനഃസ്ഥാപിക്കാൻ കഴിയില്ല", + "unable_to_save_album": "ആൽബം സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_save_api_key": "API കീ സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_save_date_of_birth": "ജനനത്തീയതി സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_save_name": "പേര് സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_save_profile": "പ്രൊഫൈൽ സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_save_settings": "ക്രമീകരണങ്ങൾ സേവ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_scan_libraries": "ലൈബ്രറികൾ സ്കാൻ ചെയ്യാൻ കഴിയില്ല", + "unable_to_scan_library": "ലൈബ്രറി സ്കാൻ ചെയ്യാൻ കഴിയില്ല", + "unable_to_set_feature_photo": "ഫീച്ചർ ഫോട്ടോ സജ്ജമാക്കാൻ കഴിയില്ല", + "unable_to_set_profile_picture": "പ്രൊഫൈൽ ചിത്രം സജ്ജമാക്കാൻ കഴിയില്ല", + "unable_to_submit_job": "ജോലി സമർപ്പിക്കാൻ കഴിയില്ല", + "unable_to_trash_asset": "അസറ്റ് ട്രാഷ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_unlink_account": "അക്കൗണ്ട് അൺലിങ്ക് ചെയ്യാൻ കഴിയില്ല", + "unable_to_unlink_motion_video": "ചലിക്കുന്ന വീഡിയോ അൺലിങ്ക് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_album_cover": "ആൽബം കവർ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_album_info": "ആൽബം വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_library": "ലൈബ്രറി അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_location": "സ്ഥാനം അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_settings": "ക്രമീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_timeline_display_status": "ടൈംലൈൻ പ്രദർശന നില അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_update_user": "ഉപയോക്താവിനെ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല", + "unable_to_upload_file": "ഫയൽ അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ല" + }, + "exif": "Exif", + "exif_bottom_sheet_description": "വിവരണം ചേർക്കുക...", + "exif_bottom_sheet_description_error": "വിവരണം അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ പിശക്", + "exif_bottom_sheet_details": "വിശദാംശങ്ങൾ", + "exif_bottom_sheet_location": "സ്ഥാനം", + "exif_bottom_sheet_people": "ആളുകൾ", + "exif_bottom_sheet_person_add_person": "പേര് ചേർക്കുക", + "exit_slideshow": "സ്ലൈഡ്‌ഷോയിൽ നിന്ന് പുറത്തുകടക്കുക", + "expand_all": "എല്ലാം വികസിപ്പിക്കുക", + "experimental_settings_new_asset_list_subtitle": "പുരോഗതിയിലാണ്", + "experimental_settings_new_asset_list_title": "പരീക്ഷണാടിസ്ഥാനത്തിലുള്ള ഫോട്ടോ ഗ്രിഡ് പ്രവർത്തനക്ഷമമാക്കുക", + "experimental_settings_subtitle": "നിങ്ങളുടെ സ്വന്തം ഉത്തരവാദിത്വത്തിൽ ഉപയോഗിക്കുക!", + "experimental_settings_title": "പരീക്ഷണാടിസ്ഥാനത്തിലുള്ളത്", + "expire_after": "ഇതിന് ശേഷം കാലഹരണപ്പെടും", + "expired": "കാലഹരണപ്പെട്ടു", + "expires_date": "{date}-ന് കാലഹരണപ്പെടും", + "explore": "പര്യവേക്ഷണം ചെയ്യുക", + "explorer": "എക്സ്പ്ലോറർ", + "export": "കയറ്റുമതി ചെയ്യുക", + "export_as_json": "JSON ആയി കയറ്റുമതി ചെയ്യുക", + "export_database": "ഡാറ്റാബേസ് കയറ്റുമതി ചെയ്യുക", + "export_database_description": "SQLite ഡാറ്റാബേസ് കയറ്റുമതി ചെയ്യുക", + "extension": "എക്സ്റ്റൻഷൻ", + "external": "ബാഹ്യം", + "external_libraries": "ബാഹ്യ ലൈബ്രറികൾ", + "external_network": "ബാഹ്യ നെറ്റ്‌വർക്ക്", + "external_network_sheet_info": "തിരഞ്ഞെടുത്ത വൈ-ഫൈ നെറ്റ്‌വർക്കിൽ അല്ലാത്തപ്പോൾ, താഴെ നൽകിയിട്ടുള്ള URL-കളിൽ ആദ്യം ലഭ്യമാകുന്ന ഒന്നിലൂടെ, മുകളിൽ നിന്ന് താഴേക്കുള്ള ക്രമത്തിൽ, ആപ്പ് സെർവറുമായി ബന്ധിപ്പിക്കും", + "face_unassigned": "അസൈൻ ചെയ്തിട്ടില്ല", + "failed": "പരാജയപ്പെട്ടു", + "failed_to_authenticate": "പ്രാമാണീകരിക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_assets": "അസറ്റുകൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "failed_to_load_folder": "ഫോൾഡർ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "favorite": "പ്രിയം", + "favorite_action_prompt": "{count} എണ്ണം പ്രിയപ്പെട്ടവയിലേക്ക് ചേർത്തു", + "favorite_or_unfavorite_photo": "ഫോട്ടോ പ്രിയപ്പെട്ടതാക്കുക അല്ലെങ്കിൽ മാറ്റുക", + "favorites": "പ്രിയങ്ങൾ", + "favorites_page_no_favorites": "പ്രിയപ്പെട്ട അസറ്റുകളൊന്നും കണ്ടെത്തിയില്ല", + "feature_photo_updated": "ഫീച്ചർ ഫോട്ടോ അപ്ഡേറ്റ് ചെയ്തു", + "features": "ഫീച്ചറുകൾ", + "features_in_development": "വികസിപ്പിച്ചുകൊണ്ടിരിക്കുന്ന ഫീച്ചറുകൾ", + "features_setting_description": "ആപ്പ് ഫീച്ചറുകൾ കൈകാര്യം ചെയ്യുക", + "file_name": "ഫയലിന്റെ പേര്", + "file_name_or_extension": "ഫയലിന്റെ പേര് അല്ലെങ്കിൽ എക്സ്റ്റൻഷൻ", + "filename": "ഫയൽനാമം", + "filetype": "ഫയൽ തരം", + "filter": "ഫിൽട്ടർ ചെയ്യുക", + "filter_people": "ആളുകളെ ഫിൽട്ടർ ചെയ്യുക", + "filter_places": "സ്ഥലങ്ങൾ ഫിൽട്ടർ ചെയ്യുക", + "find_them_fast": "തിരയലിലൂടെ പേര് ഉപയോഗിച്ച് അവരെ വേഗത്തിൽ കണ്ടെത്തുക", + "first": "ആദ്യം", + "fix_incorrect_match": "തെറ്റായ പൊരുത്തം ശരിയാക്കുക", + "folder": "ഫോൾഡർ", + "folder_not_found": "ഫോൾഡർ കണ്ടെത്തിയില്ല", + "folders": "ഫോൾഡറുകൾ", + "folders_feature_description": "ഫയൽ സിസ്റ്റത്തിലെ ഫോട്ടോകൾക്കും വീഡിയോകൾക്കുമായി ഫോൾഡർ കാഴ്‌ച ബ്രൗസുചെയ്യുന്നു", + "forgot_pin_code_question": "നിങ്ങളുടെ പിൻ മറന്നോ?", + "forward": "മുന്നോട്ട്", + "gcast_enabled": "ഗൂഗിൾ കാസ്റ്റ്", + "gcast_enabled_description": "പ്രവർത്തിക്കുന്നതിനായി ഈ ഫീച്ചർ ഗൂഗിളിൽ നിന്ന് ബാഹ്യ ഉറവിടങ്ങൾ ലോഡുചെയ്യുന്നു.", + "general": "പൊതുവായത്", + "geolocation_instruction_location": "ലൊക്കേഷൻ ഉപയോഗിക്കുന്നതിന് GPS കോർഡിനേറ്റുകളുള്ള ഒരു അസറ്റിൽ ക്ലിക്കുചെയ്യുക, അല്ലെങ്കിൽ മാപ്പിൽ നിന്ന് നേരിട്ട് ഒരു സ്ഥലം തിരഞ്ഞെടുക്കുക", + "get_help": "സഹായം നേടുക", + "get_wifiname_error": "വൈ-ഫൈയുടെ പേര് ലഭിച്ചില്ല. നിങ്ങൾ ആവശ്യമായ അനുമതികൾ നൽകിയിട്ടുണ്ടെന്നും ഒരു വൈ-ഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്‌തിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക", + "getting_started": "ആരംഭിക്കുന്നു", + "go_back": "പിന്നോട്ട് പോകുക", + "go_to_folder": "ഫോൾഡറിലേക്ക് പോകുക", + "go_to_search": "തിരയലിലേക്ക് പോകുക", + "gps": "ജിപിഎസ്", + "gps_missing": "GPS ഇല്ല", + "grant_permission": "അനുമതി നൽകുക", + "group_albums_by": "ആൽബങ്ങളെ ഇതനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക...", + "group_country": "രാജ്യം അനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "group_no": "ഗ്രൂപ്പിംഗ് ഇല്ല", + "group_owner": "ഉടമ അനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "group_places_by": "സ്ഥലങ്ങളെ ഇതനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക...", + "group_year": "വർഷം അനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "haptic_feedback_switch": "ഹാപ്റ്റിക് ഫീഡ്‌ബാക്ക് പ്രവർത്തനക്ഷമമാക്കുക", + "haptic_feedback_title": "ഹാപ്റ്റിക് ഫീഡ്‌ബാക്ക്", + "has_quota": "ക്വാട്ടയുണ്ട്", + "hash_asset": "അസറ്റ് ഹാഷ് ചെയ്യുക", + "hashed_assets": "ഹാഷ് ചെയ്ത അസറ്റുകൾ", + "hashing": "ഹാഷിംഗ്", + "header_settings_add_header_tip": "ഹെഡർ ചേർക്കുക", + "header_settings_field_validator_msg": "മൂല്യം ശൂന്യമാകരുത്", + "header_settings_header_name_input": "ഹെഡറിന്റെ പേര്", + "header_settings_header_value_input": "ഹെഡറിന്റെ മൂല്യം", + "headers_settings_tile_subtitle": "ഓരോ നെറ്റ്‌വർക്ക് അഭ്യർത്ഥനയ്‌ക്കൊപ്പവും ആപ്പ് അയയ്‌ക്കേണ്ട പ്രോക്സി ഹെഡറുകൾ നിർവചിക്കുക", + "headers_settings_tile_title": "കസ്റ്റം പ്രോക്സി ഹെഡറുകൾ", + "hi_user": "നമസ്കാരം {name} ({email})", + "hide_all_people": "എല്ലാ ആളുകളെയും മറയ്ക്കുക", + "hide_gallery": "ഗാലറി മറയ്ക്കുക", + "hide_named_person": "{name} എന്ന വ്യക്തിയെ മറയ്ക്കുക", + "hide_password": "പാസ്‌വേഡ് മറയ്ക്കുക", + "hide_person": "വ്യക്തിയെ മറയ്ക്കുക", + "hide_unnamed_people": "പേരില്ലാത്ത ആളുകളെ മറയ്ക്കുക", + "home_page_add_to_album_conflicts": "{album} എന്ന ആൽബത്തിലേക്ക് {added} അസറ്റുകൾ ചേർത്തു. {failed} അസറ്റുകൾ ഇതിനകം ആൽബത്തിലുണ്ട്.", + "home_page_add_to_album_err_local": "പ്രാദേശിക അസറ്റുകൾ ഇപ്പോൾ ആൽബങ്ങളിലേക്ക് ചേർക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_add_to_album_success": "{album} എന്ന ആൽബത്തിലേക്ക് {added} അസറ്റുകൾ ചേർത്തു.", + "home_page_album_err_partner": "പങ്കാളിയുടെ അസറ്റുകൾ ഇപ്പോൾ ഒരു ആൽബത്തിലേക്ക് ചേർക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_archive_err_local": "പ്രാദേശിക അസറ്റുകൾ ഇപ്പോൾ ആർക്കൈവ് ചെയ്യാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_archive_err_partner": "പങ്കാളിയുടെ അസറ്റുകൾ ആർക്കൈവ് ചെയ്യാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_building_timeline": "ടൈംലൈൻ നിർമ്മിക്കുന്നു", + "home_page_delete_err_partner": "പങ്കാളിയുടെ അസറ്റുകൾ ഇല്ലാതാക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_delete_remote_err_local": "റിമോട്ട് ഇല്ലാതാക്കൽ തിരഞ്ഞെടുപ്പിൽ പ്രാദേശിക അസറ്റുകൾ ഉണ്ട്, ഒഴിവാക്കുന്നു", + "home_page_favorite_err_local": "പ്രാദേശിക അസറ്റുകൾ ഇപ്പോൾ പ്രിയപ്പെട്ടതാക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_favorite_err_partner": "പങ്കാളിയുടെ അസറ്റുകൾ ഇപ്പോൾ പ്രിയപ്പെട്ടതാക്കാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_first_time_notice": "നിങ്ങൾ ആദ്യമായിട്ടാണ് ഈ ആപ്പ് ഉപയോഗിക്കുന്നതെങ്കിൽ, ഒരു ബാക്കപ്പ് ആൽബം തിരഞ്ഞെടുക്കുന്നത് ഉറപ്പാക്കുക, അതുവഴി ടൈംലൈനിൽ ഫോട്ടോകളും വീഡിയോകളും ചേർക്കാൻ കഴിയും", + "home_page_locked_error_local": "പ്രാദേശിക അസറ്റുകൾ ലോക്ക് ചെയ്ത ഫോൾഡറിലേക്ക് മാറ്റാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_locked_error_partner": "പങ്കാളിയുടെ അസറ്റുകൾ ലോക്ക് ചെയ്ത ഫോൾഡറിലേക്ക് മാറ്റാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_share_err_local": "പ്രാദേശിക അസറ്റുകൾ ലിങ്ക് വഴി പങ്കിടാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "home_page_upload_err_limit": "ഒരു സമയം പരമാവധി 30 അസറ്റുകൾ മാത്രമേ അപ്‌ലോഡ് ചെയ്യാൻ കഴിയൂ, ഒഴിവാക്കുന്നു", + "host": "ഹോസ്റ്റ്", + "hour": "മണിക്കൂർ", + "hours": "മണിക്കൂറുകൾ", + "id": "ഐഡി", + "idle": "നിഷ്‌ക്രിയം", + "ignore_icloud_photos": "iCloud ഫോട്ടോകൾ അവഗണിക്കുക", + "ignore_icloud_photos_description": "iCloud-ൽ സംഭരിച്ചിരിക്കുന്ന ഫോട്ടോകൾ Immich സെർവറിലേക്ക് അപ്‌ലോഡ് ചെയ്യില്ല", + "image": "ചിത്രം", + "image_alt_text_date": "{date}-ന് എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_1_person": "{date}-ന് {person1}-നൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_2_people": "{date}-ന് {person1}, {person2} എന്നിവർക്കൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_3_people": "{date}-ന് {person1}, {person2}, {person3} എന്നിവർക്കൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_4_or_more_people": "{date}-ന് {person1}, {person2}, കൂടാതെ മറ്റ് {additionalCount, number} പേർക്കുമൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_place": "{date}-ന് {city}, {country} എന്നിവിടങ്ങളിൽ വെച്ച് എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_place_1_person": "{date}-ന് {city}, {country} എന്നിവിടങ്ങളിൽ വെച്ച് {person1}-നൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_place_2_people": "{date}-ന് {city}, {country} എന്നിവിടങ്ങളിൽ വെച്ച് {person1}, {person2} എന്നിവർക്കൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_place_3_people": "{date}-ന് {city}, {country} എന്നിവിടങ്ങളിൽ വെച്ച് {person1}, {person2}, {person3} എന്നിവർക്കൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_alt_text_date_place_4_or_more_people": "{date}-ന് {city}, {country} എന്നിവിടങ്ങളിൽ വെച്ച് {person1}, {person2}, കൂടാതെ മറ്റ് {additionalCount, number} പേർക്കുമൊപ്പം എടുത്ത {isVideo, select, true {വീഡിയോ} other {ചിത്രം}}", + "image_saved_successfully": "ചിത്രം സേവ് ചെയ്തു", + "image_viewer_page_state_provider_download_started": "ഡൗൺലോഡ് ആരംഭിച്ചു", + "image_viewer_page_state_provider_download_success": "ഡൗൺലോഡ് വിജയിച്ചു", + "image_viewer_page_state_provider_share_error": "പങ്കിടുന്നതിൽ പിശക്", + "immich_logo": "Immich ലോഗോ", + "immich_web_interface": "Immich വെബ് ഇന്റർഫേസ്", + "import_from_json": "JSON-ൽ നിന്ന് ഇമ്പോർട്ടുചെയ്യുക", + "import_path": "ഇമ്പോർട്ട് പാത്ത്", + "in_albums": "{count, plural, one {# ആൽബത്തിൽ} other {# ആൽബങ്ങളിൽ}}", + "in_archive": "ആർക്കൈവിൽ", + "include_archived": "ആർക്കൈവുചെയ്‌തവ ഉൾപ്പെടുത്തുക", + "include_shared_albums": "പങ്കിട്ട ആൽബങ്ങൾ ഉൾപ്പെടുത്തുക", + "include_shared_partner_assets": "പങ്കിട്ട പങ്കാളിയുടെ അസറ്റുകൾ ഉൾപ്പെടുത്തുക", + "individual_share": "വ്യക്തിഗത പങ്കിടൽ", + "individual_shares": "വ്യക്തിഗത പങ്കിടലുകൾ", + "info": "വിവരങ്ങൾ", + "interval": { + "day_at_onepm": "എല്ലാ ദിവസവും ഉച്ചയ്ക്ക് 1 മണിക്ക്", + "hours": "{hours, plural, one {ഓരോ മണിക്കൂറിലും} other {ഓരോ {hours, number} മണിക്കൂറിലും}}", + "night_at_midnight": "എല്ലാ രാത്രിയും അർദ്ധരാത്രിക്ക്", + "night_at_twoam": "എല്ലാ രാത്രിയും പുലർച്ചെ 2 മണിക്ക്" + }, + "invalid_date": "അസാധുവായ തീയതി", + "invalid_date_format": "അസാധുവായ തീയതി ഫോർമാറ്റ്", + "invite_people": "ആളുകളെ ക്ഷണിക്കുക", + "invite_to_album": "ആൽബത്തിലേക്ക് ക്ഷണിക്കുക", + "ios_debug_info_fetch_ran_at": "ഫെച്ച് പ്രവർത്തിച്ചത് {dateTime}", + "ios_debug_info_last_sync_at": "അവസാന സിങ്ക് {dateTime}", + "ios_debug_info_no_processes_queued": "പശ്ചാത്തല പ്രോസസ്സുകളൊന്നും ക്യൂവിൽ ഇല്ല", + "ios_debug_info_no_sync_yet": "പശ്ചാത്തല സിങ്ക് ജോലി ഇതുവരെ പ്രവർത്തിച്ചിട്ടില്ല", + "ios_debug_info_processes_queued": "{count, plural, one {{count} പശ്ചാത്തല പ്രോസസ്സ് ക്യൂവിലുണ്ട്} other {{count} പശ്ചാത്തല പ്രോസസ്സുകൾ ക്യൂവിലുണ്ട്}}", + "ios_debug_info_processing_ran_at": "പ്രോസസ്സിംഗ് പ്രവർത്തിച്ചത് {dateTime}", + "items_count": "{count, plural, one {# ഇനം} other {# ഇനങ്ങൾ}}", + "jobs": "ജോലികൾ", + "keep": "സൂക്ഷിക്കുക", + "keep_all": "എല്ലാം സൂക്ഷിക്കുക", + "keep_this_delete_others": "ഇത് സൂക്ഷിച്ച് മറ്റുള്ളവ ഇല്ലാതാക്കുക", + "kept_this_deleted_others": "ഈ അസറ്റ് സൂക്ഷിക്കുകയും {count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ഇല്ലാതാക്കുകയും ചെയ്തു", + "keyboard_shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ", + "language": "ഭാഷ", + "language_no_results_subtitle": "നിങ്ങളുടെ തിരയൽ പദം ക്രമീകരിച്ച് ശ്രമിക്കുക", + "language_no_results_title": "ഭാഷകളൊന്നും കണ്ടെത്തിയില്ല", + "language_search_hint": "ഭാഷകൾക്കായി തിരയുക...", + "language_setting_description": "നിങ്ങൾക്കിഷ്ടപ്പെട്ട ഭാഷ തിരഞ്ഞെടുക്കുക", + "large_files": "വലിയ ഫയലുകൾ", + "last": "അവസാനത്തേത്", + "last_seen": "അവസാനം കണ്ടത്", + "latest_version": "ഏറ്റവും പുതിയ പതിപ്പ്", + "latitude": "അക്ഷാംശം", + "leave": "വിടുക", + "leave_album": "ആൽബം വിടുക", + "lens_model": "ലെൻസ് മോഡൽ", + "let_others_respond": "മറ്റുള്ളവരെ പ്രതികരിക്കാൻ അനുവദിക്കുക", + "level": "തലം", + "library": "ലൈബ്രറി", + "library_options": "ലൈബ്രറി ഓപ്ഷനുകൾ", + "library_page_device_albums": "ഉപകരണത്തിലെ ആൽബങ്ങൾ", + "library_page_new_album": "പുതിയ ആൽബം", + "library_page_sort_asset_count": "അസറ്റുകളുടെ എണ്ണം", + "library_page_sort_created": "സൃഷ്ടിച്ച തീയതി", + "library_page_sort_last_modified": "അവസാനം മാറ്റം വരുത്തിയത്", + "library_page_sort_title": "ആൽബത്തിന്റെ ശീർഷകം", + "licenses": "ലൈസൻസുകൾ", + "light": "ലൈറ്റ്", + "like": "ഇഷ്ടപ്പെട്ടു", + "like_deleted": "ഇഷ്ടം നീക്കംചെയ്തു", + "link_motion_video": "ചലിക്കുന്ന വീഡിയോ ലിങ്ക് ചെയ്യുക", + "link_to_oauth": "OAuth-ലേക്ക് ലിങ്ക് ചെയ്യുക", + "linked_oauth_account": "ലിങ്ക് ചെയ്ത OAuth അക്കൗണ്ട്", + "list": "ലിസ്റ്റ്", + "loading": "ലോഡിംഗ്", + "loading_search_results_failed": "തിരയൽ ഫലങ്ങൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "local": "പ്രാദേശികം", + "local_asset_cast_failed": "സെർവറിലേക്ക് അപ്‌ലോഡ് ചെയ്യാത്ത ഒരു അസറ്റ് കാസ്റ്റ് ചെയ്യാൻ കഴിയില്ല", + "local_assets": "പ്രാദേശിക അസറ്റുകൾ", + "local_media_summary": "പ്രാദേശിക മീഡിയ സംഗ്രഹം", + "local_network": "പ്രാദേശിക നെറ്റ്‌വർക്ക്", + "local_network_sheet_info": "നിർദ്ദിഷ്‌ട വൈ-ഫൈ നെറ്റ്‌വർക്ക് ഉപയോഗിക്കുമ്പോൾ ഈ URL വഴി ആപ്പ് സെർവറുമായി ബന്ധിപ്പിക്കും", + "location_permission": "ലൊക്കേഷൻ അനുമതി", + "location_permission_content": "യാന്ത്രിക-സ്വിച്ചിംഗ് ഫീച്ചർ ഉപയോഗിക്കുന്നതിന്, Immich-ന് കൃത്യമായ ലൊക്കേഷൻ അനുമതി ആവശ്യമാണ്, അതുവഴി നിലവിലെ വൈ-ഫൈ നെറ്റ്‌വർക്കിന്റെ പേര് വായിക്കാൻ കഴിയും", + "location_picker_choose_on_map": "മാപ്പിൽ തിരഞ്ഞെടുക്കുക", + "location_picker_latitude_error": "സാധുവായ അക്ഷാംശം നൽകുക", + "location_picker_latitude_hint": "നിങ്ങളുടെ അക്ഷാംശം ഇവിടെ നൽകുക", + "location_picker_longitude_error": "സാധുവായ രേഖാംശം നൽകുക", + "location_picker_longitude_hint": "നിങ്ങളുടെ രേഖാംശം ഇവിടെ നൽകുക", + "lock": "ലോക്ക് ചെയ്യുക", + "locked_folder": "ലോക്ക് ചെയ്ത ഫോൾഡർ", + "log_detail_title": "ലോഗ് വിശദാംശം", + "log_out": "ലോഗ് ഔട്ട്", + "log_out_all_devices": "എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ലോഗ് ഔട്ട് ചെയ്യുക", + "logged_in_as": "{user} ആയി ലോഗിൻ ചെയ്തു", + "logged_out_all_devices": "എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ലോഗ് ഔട്ട് ചെയ്തു", + "logged_out_device": "ഉപകരണത്തിൽ നിന്ന് ലോഗ് ഔട്ട് ചെയ്തു", + "login": "ലോഗിൻ", + "login_disabled": "ലോഗിൻ പ്രവർത്തനരഹിതമാക്കി", + "login_form_api_exception": "API എക്സെപ്ഷൻ. ദയവായി സെർവർ URL പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.", + "login_form_back_button_text": "തിരികെ", + "login_form_email_hint": "youremail@email.com", + "login_form_endpoint_hint": "http://your-server-ip:port", + "login_form_endpoint_url": "സെർവർ എൻഡ്‌പോയിന്റ് URL", + "login_form_err_http": "ദയവായി http:// അല്ലെങ്കിൽ https:// എന്ന് വ്യക്തമാക്കുക", + "login_form_err_invalid_email": "അസാധുവായ ഇമെയിൽ", + "login_form_err_invalid_url": "അസാധുവായ URL", + "login_form_err_leading_whitespace": "തുടക്കത്തിലെ ശൂന്യസ്ഥലം", + "login_form_err_trailing_whitespace": "അവസാനത്തെ ശൂന്യസ്ഥലം", + "login_form_failed_get_oauth_server_config": "OAuth ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യുന്നതിൽ പിശക്, സെർവർ URL പരിശോധിക്കുക", + "login_form_failed_get_oauth_server_disable": "ഈ സെർവറിൽ OAuth ഫീച്ചർ ലഭ്യമല്ല", + "login_form_failed_login": "നിങ്ങളെ ലോഗിൻ ചെയ്യുന്നതിൽ പിശക്, സെർവർ URL, ഇമെയിൽ, പാസ്‌വേഡ് എന്നിവ പരിശോധിക്കുക", + "login_form_handshake_exception": "സെർവറുമായി ഒരു ഹാൻഡ്‌ഷേക്ക് എക്സെപ്ഷൻ ഉണ്ടായി. നിങ്ങൾ ഒരു സ്വയം ഒപ്പിട്ട സർട്ടിഫിക്കറ്റാണ് ഉപയോഗിക്കുന്നതെങ്കിൽ ക്രമീകരണങ്ങളിൽ സ്വയം ഒപ്പിട്ട സർട്ടിഫിക്കറ്റ് പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുക.", + "login_form_password_hint": "പാസ്‌വേഡ്", + "login_form_save_login": "ലോഗിൻ ആയി തുടരുക", + "login_form_server_empty": "ഒരു സെർവർ URL നൽകുക.", + "login_form_server_error": "സെർവറിലേക്ക് കണക്റ്റുചെയ്യാൻ കഴിഞ്ഞില്ല.", + "login_has_been_disabled": "ലോഗിൻ പ്രവർത്തനരഹിതമാക്കി.", + "login_password_changed_error": "നിങ്ങളുടെ പാസ്‌വേഡ് അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ ഒരു പിശകുണ്ടായി", + "login_password_changed_success": "പാസ്‌വേഡ് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "logout_all_device_confirmation": "എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ലോഗ് ഔട്ട് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "logout_this_device_confirmation": "ഈ ഉപകരണത്തിൽ നിന്ന് ലോഗ് ഔട്ട് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "logs": "ലോഗുകൾ", + "longitude": "രേഖാംശം", + "look": "കാഴ്ച", + "loop_videos": "വീഡിയോകൾ ലൂപ്പ് ചെയ്യുക", + "loop_videos_description": "വിശദാംശ വ്യൂവറിൽ ഒരു വീഡിയോ യാന്ത്രികമായി ലൂപ്പ് ചെയ്യാൻ പ്രവർത്തനക്ഷമമാക്കുക.", + "main_branch_warning": "നിങ്ങൾ ഒരു ഡെവലപ്‌മെന്റ് പതിപ്പാണ് ഉപയോഗിക്കുന്നത്; ഒരു റിലീസ് പതിപ്പ് ഉപയോഗിക്കാൻ ഞങ്ങൾ ശക്തമായി ശുപാർശ ചെയ്യുന്നു!", + "main_menu": "പ്രധാന മെനു", + "make": "നിർമ്മാതാവ്", + "manage_geolocation": "സ്ഥാനം കൈകാര്യം ചെയ്യുക", + "manage_shared_links": "പങ്കിട്ട ലിങ്കുകൾ കൈകാര്യം ചെയ്യുക", + "manage_sharing_with_partners": "പങ്കാളികളുമായുള്ള പങ്കിടൽ കൈകാര്യം ചെയ്യുക", + "manage_the_app_settings": "ആപ്പ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "manage_your_account": "നിങ്ങളുടെ അക്കൗണ്ട് കൈകാര്യം ചെയ്യുക", + "manage_your_api_keys": "നിങ്ങളുടെ API കീകൾ കൈകാര്യം ചെയ്യുക", + "manage_your_devices": "നിങ്ങൾ ലോഗിൻ ചെയ്ത ഉപകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "manage_your_oauth_connection": "നിങ്ങളുടെ OAuth കണക്ഷൻ കൈകാര്യം ചെയ്യുക", + "map": "മാപ്പ്", + "map_assets_in_bounds": "{count, plural, =0 {ഈ പ്രദേശത്ത് ഫോട്ടോകളൊന്നുമില്ല} one {# ഫോട്ടോ} other {# ഫോട്ടോകൾ}}", + "map_cannot_get_user_location": "ഉപയോക്താവിന്റെ സ്ഥാനം ലഭിക്കുന്നില്ല", + "map_location_dialog_yes": "അതെ", + "map_location_picker_page_use_location": "ഈ സ്ഥലം ഉപയോഗിക്കുക", + "map_location_service_disabled_content": "നിങ്ങളുടെ നിലവിലെ സ്ഥാനത്ത് നിന്നുള്ള അസറ്റുകൾ പ്രദർശിപ്പിക്കുന്നതിന് ലൊക്കേഷൻ സേവനം പ്രവർത്തനക്ഷമമാക്കേണ്ടതുണ്ട്. ഇപ്പോൾ പ്രവർത്തനക്ഷമമാക്കണോ?", + "map_location_service_disabled_title": "ലൊക്കേഷൻ സേവനം പ്രവർത്തനരഹിതമാക്കി", + "map_marker_for_images": "{city}, {country} എന്നിവിടങ്ങളിൽ എടുത്ത ചിത്രങ്ങൾക്കുള്ള മാപ്പ് മാർക്കർ", + "map_marker_with_image": "ചിത്രത്തോടുകൂടിയ മാപ്പ് മാർക്കർ", + "map_no_location_permission_content": "നിങ്ങളുടെ നിലവിലെ സ്ഥാനത്ത് നിന്നുള്ള അസറ്റുകൾ പ്രദർശിപ്പിക്കുന്നതിന് ലൊക്കേഷൻ അനുമതി ആവശ്യമാണ്. ഇപ്പോൾ അനുവദിക്കണോ?", + "map_no_location_permission_title": "ലൊക്കേഷൻ അനുമതി നിഷേധിച്ചു", + "map_settings": "മാപ്പ് ക്രമീകരണങ്ങൾ", + "map_settings_dark_mode": "ഡാർക്ക് മോഡ്", + "map_settings_date_range_option_day": "കഴിഞ്ഞ 24 മണിക്കൂർ", + "map_settings_date_range_option_days": "കഴിഞ്ഞ {days} ദിവസങ്ങൾ", + "map_settings_date_range_option_year": "കഴിഞ്ഞ വർഷം", + "map_settings_date_range_option_years": "കഴിഞ്ഞ {years} വർഷങ്ങൾ", + "map_settings_dialog_title": "മാപ്പ് ക്രമീകരണങ്ങൾ", + "map_settings_include_show_archived": "ആർക്കൈവുചെയ്‌തവ ഉൾപ്പെടുത്തുക", + "map_settings_include_show_partners": "പങ്കാളികളെ ഉൾപ്പെടുത്തുക", + "map_settings_only_show_favorites": "പ്രിയപ്പെട്ടവ മാത്രം കാണിക്കുക", + "map_settings_theme_settings": "മാപ്പ് തീം", + "map_zoom_to_see_photos": "ഫോട്ടോകൾ കാണാൻ സൂം ഔട്ട് ചെയ്യുക", + "mark_all_as_read": "എല്ലാം വായിച്ചതായി അടയാളപ്പെടുത്തുക", + "mark_as_read": "വായിച്ചതായി അടയാളപ്പെടുത്തുക", + "marked_all_as_read": "എല്ലാം വായിച്ചതായി അടയാളപ്പെടുത്തി", + "matches": "ചേർച്ചകൾ", + "matching_assets": "ചേർച്ചയുള്ള അസറ്റുകൾ", + "media_type": "മീഡിയ തരം", + "memories": "ഓർമ്മകൾ", + "memories_all_caught_up": "എല്ലാം കണ്ടുതീർത്തു", + "memories_check_back_tomorrow": "കൂടുതൽ ഓർമ്മകൾക്കായി നാളെ വീണ്ടും പരിശോധിക്കുക", + "memories_setting_description": "നിങ്ങളുടെ ഓർമ്മകളിൽ നിങ്ങൾ കാണുന്നത് കൈകാര്യം ചെയ്യുക", + "memories_start_over": "വീണ്ടും തുടങ്ങുക", + "memories_swipe_to_close": "അടയ്ക്കാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക", + "memory": "മെമ്മറി", + "memory_lane_title": "ഓർമ്മകളുടെ പാത {title}", + "menu": "മെനു", + "merge": "ലയിപ്പിക്കുക", + "merge_people": "ആളുകളെ ലയിപ്പിക്കുക", + "merge_people_limit": "ഒരു സമയം 5 മുഖങ്ങൾ വരെ മാത്രമേ ലയിപ്പിക്കാൻ കഴിയൂ", + "merge_people_prompt": "ഈ ആളുകളെ ലയിപ്പിക്കണോ? ഈ പ്രവർത്തനം പഴയപടിയാക്കാൻ കഴിയില്ല.", + "merge_people_successfully": "ആളുകളെ വിജയകരമായി ലയിപ്പിച്ചു", + "merged_people_count": "{count, plural, one {# വ്യക്തിയെ ലയിപ്പിച്ചു} other {# ആളുകളെ ലയിപ്പിച്ചു}}", + "minimize": "ചെറുതാക്കുക", + "minute": "മിനിറ്റ്", + "minutes": "മിനിറ്റുകൾ", + "missing": "കാണാനില്ല", + "model": "മോഡൽ", + "month": "മാസം", + "monthly_title_text_date_format": "MMMM y", + "more": "കൂടുതൽ", + "move": "നീക്കുക", + "move_off_locked_folder": "ലോക്ക് ചെയ്ത ഫോൾഡറിൽ നിന്ന് മാറ്റുക", + "move_to_lock_folder_action_prompt": "{count} എണ്ണം ലോക്ക് ചെയ്ത ഫോൾഡറിലേക്ക് ചേർത്തു", + "move_to_locked_folder": "ലോക്ക് ചെയ്ത ഫോൾഡറിലേക്ക് മാറ്റുക", + "move_to_locked_folder_confirmation": "ഈ ഫോട്ടോകളും വീഡിയോയും എല്ലാ ആൽബങ്ങളിൽ നിന്നും നീക്കം ചെയ്യപ്പെടും, ലോക്ക് ചെയ്ത ഫോൾഡറിൽ നിന്ന് മാത്രമേ കാണാൻ കഴിയൂ", + "moved_to_archive": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ആർക്കൈവിലേക്ക് മാറ്റി", + "moved_to_library": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ലൈബ്രറിയിലേക്ക് മാറ്റി", + "moved_to_trash": "ട്രാഷിലേക്ക് മാറ്റി", + "multiselect_grid_edit_date_time_err_read_only": "വായിക്കാൻ മാത്രമുള്ള അസറ്റി(കളു)ടെ തീയതി എഡിറ്റുചെയ്യാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "multiselect_grid_edit_gps_err_read_only": "വായിക്കാൻ മാത്രമുള്ള അസറ്റി(കളു)ടെ സ്ഥാനം എഡിറ്റുചെയ്യാൻ കഴിയില്ല, ഒഴിവാക്കുന്നു", + "mute_memories": "ഓർമ്മകൾ നിശ്ശബ്ദമാക്കുക", + "my_albums": "എന്റെ ആൽബങ്ങൾ", + "name": "പേര്", + "name_or_nickname": "പേര് അല്ലെങ്കിൽ വിളിപ്പേര്", + "network_requirement_photos_upload": "ഫോട്ടോകൾ ബാക്കപ്പ് ചെയ്യാൻ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിക്കുക", + "network_requirement_videos_upload": "വീഡിയോകൾ ബാക്കപ്പ് ചെയ്യാൻ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിക്കുക", + "network_requirements": "നെറ്റ്‌വർക്ക് ആവശ്യകതകൾ", + "network_requirements_updated": "നെറ്റ്‌വർക്ക് ആവശ്യകതകൾ മാറി, ബാക്കപ്പ് ക്യൂ പുനഃസജ്ജമാക്കുന്നു", + "networking_settings": "നെറ്റ്‌വർക്കിംഗ്", + "networking_subtitle": "സെർവർ എൻഡ്‌പോയിന്റ് ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക", + "never": "ഒരിക്കലും ഇല്ല", + "new_album": "പുതിയ ആൽബം", + "new_api_key": "പുതിയ API കീ", + "new_password": "പുതിയ പാസ്‌വേഡ്", + "new_person": "പുതിയ വ്യക്തി", + "new_pin_code": "പുതിയ പിൻ കോഡ്", + "new_pin_code_subtitle": "നിങ്ങൾ ആദ്യമായിട്ടാണ് ലോക്ക് ചെയ്ത ഫോൾഡർ ആക്‌സസ് ചെയ്യുന്നത്. ഈ പേജ് സുരക്ഷിതമായി ആക്‌സസ് ചെയ്യാൻ ഒരു പിൻ കോഡ് ഉണ്ടാക്കുക", + "new_timeline": "പുതിയ ടൈംലൈൻ", + "new_user_created": "പുതിയ ഉപയോക്താവിനെ ഉണ്ടാക്കി", + "new_version_available": "പുതിയ പതിപ്പ് ലഭ്യമാണ്", + "newest_first": "ഏറ്റവും പുതിയത് ആദ്യം", + "next": "അടുത്തത്", + "next_memory": "അടുത്ത ഓർമ്മ", + "no": "ഇല്ല", + "no_albums_message": "നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും ക്രമീകരിക്കാൻ ഒരു ആൽബം ഉണ്ടാക്കുക", + "no_albums_with_name_yet": "ഈ പേരിൽ നിങ്ങൾക്ക് ഇതുവരെ ആൽബങ്ങളൊന്നും ഇല്ലെന്ന് തോന്നുന്നു.", + "no_albums_yet": "നിങ്ങൾക്ക് ഇതുവരെ ആൽബങ്ങളൊന്നും ഇല്ലെന്ന് തോന്നുന്നു.", + "no_archived_assets_message": "നിങ്ങളുടെ ഫോട്ടോ കാഴ്‌ചയിൽ നിന്ന് മറയ്ക്കാൻ ഫോട്ടോകളും വീഡിയോകളും ആർക്കൈവ് ചെയ്യുക", + "no_assets_message": "നിങ്ങളുടെ ആദ്യ ഫോട്ടോ അപ്‌ലോഡ് ചെയ്യാൻ ക്ലിക്കുചെയ്യുക", + "no_assets_to_show": "കാണിക്കാൻ അസറ്റുകളൊന്നുമില്ല", + "no_cast_devices_found": "കാസ്റ്റ് ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "no_checksum_local": "ചെക്ക്സം ലഭ്യമല്ല - പ്രാദേശിക അസറ്റുകൾ ലഭ്യമാക്കാൻ കഴിയില്ല", + "no_checksum_remote": "ചെക്ക്സം ലഭ്യമല്ല - റിമോട്ട് അസറ്റ് ലഭ്യമാക്കാൻ കഴിയില്ല", + "no_duplicates_found": "ഡ്യൂപ്ലിക്കേറ്റുകളൊന്നും കണ്ടെത്തിയില്ല.", + "no_exif_info_available": "Exif വിവരങ്ങൾ ലഭ്യമല്ല", + "no_explore_results_message": "നിങ്ങളുടെ ശേഖരം പര്യവേക്ഷണം ചെയ്യാൻ കൂടുതൽ ഫോട്ടോകൾ അപ്‌ലോഡ് ചെയ്യുക.", + "no_favorites_message": "നിങ്ങളുടെ മികച്ച ചിത്രങ്ങളും വീഡിയോകളും വേഗത്തിൽ കണ്ടെത്താൻ പ്രിയപ്പെട്ടവ ചേർക്കുക", + "no_libraries_message": "നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും കാണുന്നതിന് ഒരു ബാഹ്യ ലൈബ്രറി ഉണ്ടാക്കുക", + "no_local_assets_found": "ഈ ചെക്ക്സം ഉപയോഗിച്ച് പ്രാദേശിക അസറ്റുകളൊന്നും കണ്ടെത്തിയില്ല", + "no_locked_photos_message": "ലോക്ക് ചെയ്‌ത ഫോൾഡറിലെ ഫോട്ടോകളും വീഡിയോകളും മറച്ചിരിക്കുന്നു, നിങ്ങൾ ലൈബ്രറി ബ്രൗസ് ചെയ്യുമ്പോഴോ തിരയുമ്പോഴോ അവ ദൃശ്യമാകില്ല.", + "no_name": "പേരില്ല", + "no_notifications": "അറിയിപ്പുകളൊന്നുമില്ല", + "no_people_found": "ചേർച്ചയുള്ള ആളുകളെ കണ്ടെത്തിയില്ല", + "no_places": "സ്ഥലങ്ങളില്ല", + "no_remote_assets_found": "ഈ ചെക്ക്സം ഉപയോഗിച്ച് റിമോട്ട് അസറ്റുകളൊന്നും കണ്ടെത്തിയില്ല", + "no_results": "ഫലങ്ങളൊന്നുമില്ല", + "no_results_description": "ഒരു പര്യായപദമോ കൂടുതൽ പൊതുവായ കീവേഡോ ഉപയോഗിച്ച് ശ്രമിക്കുക", + "no_shared_albums_message": "നിങ്ങളുടെ നെറ്റ്‌വർക്കിലെ ആളുകളുമായി ഫോട്ടോകളും വീഡിയോകളും പങ്കിടാൻ ഒരു ആൽബം ഉണ്ടാക്കുക", + "no_uploads_in_progress": "അപ്‌ലോഡുകളൊന്നും പുരോഗമിക്കുന്നില്ല", + "not_available": "ലഭ്യമല്ല", + "not_in_any_album": "ഒരു ആൽബത്തിലുമില്ല", + "not_selected": "തിരഞ്ഞെടുത്തിട്ടില്ല", + "note_apply_storage_label_to_previously_uploaded assets": "കുറിപ്പ്: മുമ്പ് അപ്‌ലോഡ് ചെയ്ത അസറ്റുകളിൽ സ്റ്റോറേജ് ലേബൽ പ്രയോഗിക്കാൻ, ഇത് പ്രവർത്തിപ്പിക്കുക", + "notes": "കുറിപ്പുകൾ", + "nothing_here_yet": "ഇവിടെ ഇതുവരെ ഒന്നുമില്ല", + "notification_permission_dialog_content": "അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കാൻ, ക്രമീകരണങ്ങളിലേക്ക് പോയി 'അനുവദിക്കുക' തിരഞ്ഞെടുക്കുക.", + "notification_permission_list_tile_content": "അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കാൻ അനുമതി നൽകുക.", + "notification_permission_list_tile_enable_button": "അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "notification_permission_list_tile_title": "അറിയിപ്പ് അനുമതി", + "notification_toggle_setting_description": "ഇമെയിൽ അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "notifications": "അറിയിപ്പുകൾ", + "notifications_setting_description": "അറിയിപ്പുകൾ കൈകാര്യം ചെയ്യുക", + "oauth": "OAuth", + "official_immich_resources": "Immich-ന്റെ ഔദ്യോഗിക ഉറവിടങ്ങൾ", + "offline": "ഓഫ്‌ലൈൻ", + "offset": "ഓഫ്സെറ്റ്", + "ok": "ശരി", + "oldest_first": "ഏറ്റവും പഴയത് ആദ്യം", + "on_this_device": "ഈ ഉപകരണത്തിൽ", + "onboarding": "ഓൺബോർഡിംഗ്", + "onboarding_locale_description": "നിങ്ങൾക്കിഷ്ടപ്പെട്ട ഭാഷ തിരഞ്ഞെടുക്കുക. ഇത് പിന്നീട് നിങ്ങളുടെ ക്രമീകരണങ്ങളിൽ മാറ്റാവുന്നതാണ്.", + "onboarding_privacy_description": "ഇനിപ്പറയുന്ന (ഓപ്ഷണൽ) ഫീച്ചറുകൾ ബാഹ്യ സേവനങ്ങളെ ആശ്രയിച്ചിരിക്കുന്നു, അവ എപ്പോൾ വേണമെങ്കിലും ക്രമീകരണങ്ങളിൽ പ്രവർത്തനരഹിതമാക്കാം.", + "onboarding_server_welcome_description": "ചില സാധാരണ ക്രമീകരണങ്ങൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ഇൻസ്റ്റൻസ് സജ്ജമാക്കാം.", + "onboarding_theme_description": "നിങ്ങളുടെ ഇൻസ്റ്റൻസിനായി ഒരു കളർ തീം തിരഞ്ഞെടുക്കുക. ഇത് പിന്നീട് നിങ്ങളുടെ ക്രമീകരണങ്ങളിൽ മാറ്റാവുന്നതാണ്.", + "onboarding_user_welcome_description": "നമുക്ക് ആരംഭിക്കാം!", + "onboarding_welcome_user": "സ്വാഗതം, {user}", + "online": "ഓൺലൈൻ", + "only_favorites": "പ്രിയപ്പെട്ടവ മാത്രം", + "open": "തുറക്കുക", + "open_in_map_view": "മാപ്പ് കാഴ്‌ചയിൽ തുറക്കുക", + "open_in_openstreetmap": "OpenStreetMap-ൽ തുറക്കുക", + "open_the_search_filters": "തിരയൽ ഫിൽട്ടറുകൾ തുറക്കുക", + "options": "ഓപ്ഷനുകൾ", + "or": "അല്ലെങ്കിൽ", + "organize_into_albums": "ആൽബങ്ങളായി ക്രമീകരിക്കുക", + "organize_into_albums_description": "നിലവിലെ സിങ്ക് ക്രമീകരണങ്ങൾ ഉപയോഗിച്ച് നിലവിലുള്ള ഫോട്ടോകൾ ആൽബങ്ങളിലേക്ക് മാറ്റുക", + "organize_your_library": "നിങ്ങളുടെ ലൈബ്രറി ക്രമീകരിക്കുക", + "original": "യഥാർത്ഥം", + "other": "മറ്റുള്ളവ", + "other_devices": "മറ്റ് ഉപകരണങ്ങൾ", + "other_entities": "മറ്റ് എന്റിറ്റികൾ", + "other_variables": "മറ്റ് വേരിയബിളുകൾ", + "owned": "സ്വന്തമായുള്ളത്", + "owner": "ഉടമ", + "partner": "പങ്കാളി", + "partner_can_access": "{partner}-ക്ക് ആക്സസ് ചെയ്യാൻ കഴിയും", + "partner_can_access_assets": "ആർക്കൈവുചെയ്‌തതും ഇല്ലാതാക്കിയതുമായവ ഒഴികെ നിങ്ങളുടെ എല്ലാ ഫോട്ടോകളും വീഡിയോകളും", + "partner_can_access_location": "നിങ്ങളുടെ ഫോട്ടോകൾ എടുത്ത സ്ഥലം", + "partner_list_user_photos": "{user}-ന്റെ ഫോട്ടോകൾ", + "partner_list_view_all": "എല്ലാം കാണുക", + "partner_page_empty_message": "നിങ്ങളുടെ ഫോട്ടോകൾ ഇതുവരെ ഒരു പങ്കാളിയുമായും പങ്കിട്ടിട്ടില്ല.", + "partner_page_no_more_users": "ചേർക്കാൻ കൂടുതൽ ഉപയോക്താക്കളില്ല", + "partner_page_partner_add_failed": "പങ്കാളിയെ ചേർക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "partner_page_select_partner": "പങ്കാളിയെ തിരഞ്ഞെടുക്കുക", + "partner_page_shared_to_title": "ഇതിലേക്ക് പങ്കിട്ടു", + "partner_page_stop_sharing_content": "{partner}-ക്ക് ഇനി നിങ്ങളുടെ ഫോട്ടോകൾ ആക്‌സസ് ചെയ്യാൻ കഴിയില്ല.", + "partner_sharing": "പങ്കാളിയുമായി പങ്കിടൽ", + "partners": "പങ്കാളികൾ", + "password": "പാസ്‌വേർഡ്", + "password_does_not_match": "പാസ്‌വേഡ് പൊരുത്തപ്പെടുന്നില്ല", + "password_required": "പാസ്‌വേഡ് ആവശ്യമാണ്", + "password_reset_success": "പാസ്‌വേഡ് റീസെറ്റ് വിജയിച്ചു", + "past_durations": { + "days": "കഴിഞ്ഞ {days, plural, one {ദിവസം} other {# ദിവസങ്ങൾ}}", + "hours": "കഴിഞ്ഞ {hours, plural, one {മണിക്കൂർ} other {# മണിക്കൂറുകൾ}}", + "years": "കഴിഞ്ഞ {years, plural, one {വർഷം} other {# വർഷങ്ങൾ}}" + }, + "path": "പാത്ത്", + "pattern": "പാറ്റേൺ", + "pause": "താൽക്കാലികമായി നിർത്തുക", + "pause_memories": "ഓർമ്മകൾ താൽക്കാലികമായി നിർത്തുക", + "paused": "താൽക്കാലികമായി നിർത്തി", + "pending": "കാത്തിരിക്കുന്നു", + "people": "ആളുകൾ", + "people_edits_count": "{count, plural, one {# വ്യക്തിയെ എഡിറ്റുചെയ്തു} other {# ആളുകളെ എഡിറ്റുചെയ്തു}}", + "people_feature_description": "ആളുകളനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്ത ഫോട്ടോകളും വീഡിയോകളും ബ്രൗസുചെയ്യുന്നു", + "people_sidebar_description": "സൈഡ്‌ബാറിൽ 'ആളുകൾ' എന്നതിലേക്ക് ഒരു ലിങ്ക് പ്രദർശിപ്പിക്കുക", + "permanent_deletion_warning": "ശാശ്വതമായ ഇല്ലാതാക്കൽ മുന്നറിയിപ്പ്", + "permanent_deletion_warning_setting_description": "അസറ്റുകൾ ശാശ്വതമായി ഇല്ലാതാക്കുമ്പോൾ ഒരു മുന്നറിയിപ്പ് കാണിക്കുക", + "permanently_delete": "ശാശ്വതമായി ഇല്ലാതാക്കുക", + "permanently_delete_assets_count": "{count, plural, one {അസറ്റ്} other {അസറ്റുകൾ}} ശാശ്വതമായി ഇല്ലാതാക്കുക", + "permanently_delete_assets_prompt": "{count, plural, one {ഈ അസറ്റ് ശാശ്വതമായി ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?} other {ഈ # അസറ്റുകൾ ശാശ്വതമായി ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?}} ഇത് {count, plural, one {അതിനെ അതിന്റെ} other {അവയെ അവയുടെ}} ആൽബത്തിൽ(ങ്ങളിൽ) നിന്നും നീക്കം ചെയ്യും.", + "permanently_deleted_asset": "അസറ്റ് ശാശ്വതമായി ഇല്ലാതാക്കി", + "permanently_deleted_assets_count": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ശാശ്വതമായി ഇല്ലാതാക്കി", + "permission": "അനുമതി", + "permission_empty": "നിങ്ങളുടെ അനുമതി ശൂന്യമാകരുത്", + "permission_onboarding_back": "തിരികെ", + "permission_onboarding_continue_anyway": "എന്തായാലും തുടരുക", + "permission_onboarding_get_started": "തുടങ്ങാം", + "permission_onboarding_go_to_settings": "ക്രമീകരണങ്ങളിലേക്ക് പോകുക", + "permission_onboarding_permission_denied": "അനുമതി നിഷേധിച്ചു. Immich ഉപയോഗിക്കുന്നതിന്, ക്രമീകരണങ്ങളിൽ ഫോട്ടോ, വീഡിയോ അനുമതികൾ നൽകുക.", + "permission_onboarding_permission_granted": "അനുമതി ലഭിച്ചു! നിങ്ങൾ തയ്യാറാണ്.", + "permission_onboarding_permission_limited": "അനുമതി പരിമിതമാണ്. Immich-ന് നിങ്ങളുടെ മുഴുവൻ ഗാലറി ശേഖരവും ബാക്കപ്പ് ചെയ്യാനും കൈകാര്യം ചെയ്യാനും അനുവദിക്കുന്നതിന്, ക്രമീകരണങ്ങളിൽ ഫോട്ടോ, വീഡിയോ അനുമതികൾ നൽകുക.", + "permission_onboarding_request": "നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും കാണുന്നതിന് Immich-ന് അനുമതി ആവശ്യമാണ്.", + "person": "വ്യക്തി", + "person_age_months": "{months, plural, one {# മാസം} other {# മാസം}} പ്രായം", + "person_age_year_months": "1 വർഷവും {months, plural, one {# മാസവും} other {# മാസവും}} പ്രായം", + "person_age_years": "{years, plural, other {# വയസ്സ്}}", + "person_birthdate": "{date}-ന് ജനിച്ചു", + "person_hidden": "{name}{hidden, select, true { (മറച്ചത്)} other {}}", + "photo_shared_all_users": "നിങ്ങൾ എല്ലാ ഉപയോക്താക്കളുമായും ഫോട്ടോകൾ പങ്കിട്ടു, അല്ലെങ്കിൽ നിങ്ങൾക്ക് പങ്കിടാൻ ഉപയോക്താക്കളാരും ഇല്ലെന്നു തോന്നുന്നു.", + "photos": "ഫോട്ടോകൾ", + "photos_and_videos": "ഫോട്ടോകളും വീഡിയോകളും", + "photos_count": "{count, plural, one {{count, number} ഫോട്ടോ} other {{count, number} ഫോട്ടോകൾ}}", + "photos_from_previous_years": "മുൻ വർഷങ്ങളിലെ ഫോട്ടോകൾ", + "pick_a_location": "ഒരു സ്ഥലം തിരഞ്ഞെടുക്കുക", + "pin_code_changed_successfully": "പിൻ കോഡ് വിജയകരമായി മാറ്റി", + "pin_code_reset_successfully": "പിൻ കോഡ് വിജയകരമായി റീസെറ്റ് ചെയ്തു", + "pin_code_setup_successfully": "പിൻ കോഡ് വിജയകരമായി സജ്ജീകരിച്ചു", + "pin_verification": "പിൻ കോഡ് പരിശോധന", + "place": "സ്ഥലം", + "places": "സ്ഥലങ്ങൾ", + "places_count": "{count, plural, one {{count, number} സ്ഥലം} other {{count, number} സ്ഥലങ്ങൾ}}", + "play": "പ്ലേ ചെയ്യുക", + "play_memories": "ഓർമ്മകൾ പ്ലേ ചെയ്യുക", + "play_motion_photo": "ചലിക്കുന്ന ഫോട്ടോ പ്ലേ ചെയ്യുക", + "play_or_pause_video": "വീഡിയോ പ്ലേ ചെയ്യുക അല്ലെങ്കിൽ താൽക്കാലികമായി നിർത്തുക", + "please_auth_to_access": "ആക്‌സസ് ചെയ്യുന്നതിന് ദയവായി പ്രാമാണീകരിക്കുക", + "port": "പോർട്ട്", + "preferences_settings_subtitle": "ആപ്പിന്റെ മുൻഗണനകൾ കൈകാര്യം ചെയ്യുക", + "preferences_settings_title": "മുൻഗണനകൾ", + "preparing": "തയ്യാറാക്കുന്നു", + "preset": "പ്രീസെറ്റ്", + "preview": "പ്രിവ്യൂ", + "previous": "മുമ്പത്തെ", + "previous_memory": "മുമ്പത്തെ ഓർമ്മ", + "previous_or_next_day": "ദിവസം മുന്നോട്ട്/പുറകോട്ട്", + "previous_or_next_month": "മാസം മുന്നോട്ട്/പുറകോട്ട്", + "previous_or_next_photo": "ഫോട്ടോ മുന്നോട്ട്/പുറകോട്ട്", + "previous_or_next_year": "വർഷം മുന്നോട്ട്/പുറകോട്ട്", + "primary": "പ്രധാനമായത്", + "privacy": "സ്വകാര്യത", + "profile": "പ്രൊഫൈൽ", + "profile_drawer_app_logs": "ലോഗുകൾ", + "profile_drawer_client_out_of_date_major": "മൊബൈൽ ആപ്പ് കാലഹരണപ്പെട്ടു. ദയവായി ഏറ്റവും പുതിയ പ്രധാന പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുക.", + "profile_drawer_client_out_of_date_minor": "മൊബൈൽ ആപ്പ് കാലഹരണപ്പെട്ടു. ദയവായി ഏറ്റവും പുതിയ മൈനർ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുക.", + "profile_drawer_client_server_up_to_date": "ക്ലയിന്റും സെർവറും ഏറ്റവും പുതിയതാണ്", + "profile_drawer_github": "ഗിറ്റ്ഹബ്", + "profile_drawer_readonly_mode": "റീഡ്-ഓൺലി മോഡ് പ്രവർത്തനക്ഷമമാക്കി. പുറത്തുകടക്കാൻ ഉപയോക്തൃ അവതാർ ഐക്കണിൽ ദീർഘനേരം അമർത്തുക.", + "profile_drawer_server_out_of_date_major": "സെർവർ കാലഹരണപ്പെട്ടു. ദയവായി ഏറ്റവും പുതിയ പ്രധാന പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുക.", + "profile_drawer_server_out_of_date_minor": "സെർവർ കാലഹരണപ്പെട്ടു. ദയവായി ഏറ്റവും പുതിയ മൈനർ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുക.", + "profile_image_of_user": "{user}-ന്റെ പ്രൊഫൈൽ ചിത്രം", + "profile_picture_set": "പ്രൊഫൈൽ ചിത്രം സജ്ജീകരിച്ചു.", + "public_album": "പൊതു ആൽബം", + "public_share": "പൊതു പങ്കിടൽ", + "purchase_account_info": "സഹായി", + "purchase_activated_subtitle": "Immich-നെയും ഓപ്പൺ സോഴ്‌സ് സോഫ്റ്റ്‌വെയറിനെയും പിന്തുണച്ചതിന് നന്ദി", + "purchase_activated_time": "{date}-ന് സജീവമാക്കി", + "purchase_activated_title": "നിങ്ങളുടെ കീ വിജയകരമായി സജീവമാക്കി", + "purchase_button_activate": "സജീവമാക്കുക", + "purchase_button_buy": "വാങ്ങുക", + "purchase_button_buy_immich": "Immich വാങ്ങുക", + "purchase_button_never_show_again": "ഇനി കാണിക്കരുത്", + "purchase_button_reminder": "30 ദിവസത്തിനുള്ളിൽ ഓർമ്മിപ്പിക്കുക", + "purchase_button_remove_key": "കീ നീക്കം ചെയ്യുക", + "purchase_button_select": "തിരഞ്ഞെടുക്കുക", + "purchase_failed_activation": "സജീവമാക്കുന്നതിൽ പരാജയപ്പെട്ടു! ശരിയായ പ്രൊഡക്റ്റ് കീക്കായി ദയവായി നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക!", + "purchase_individual_description_1": "ഒരു വ്യക്തിക്ക്", + "purchase_individual_description_2": "സഹായിയുടെ നില", + "purchase_individual_title": "വ്യക്തിഗതം", + "purchase_input_suggestion": "പ്രൊഡക്റ്റ് കീ ഉണ്ടോ? താഴെ കീ നൽകുക", + "purchase_license_subtitle": "സേവനത്തിന്റെ തുടർ വികസനത്തെ പിന്തുണയ്ക്കാൻ Immich വാങ്ങുക", + "purchase_lifetime_description": "ആജീവനാന്ത വാങ്ങൽ", + "purchase_option_title": "വാങ്ങാനുള്ള ഓപ്ഷനുകൾ", + "purchase_panel_info_1": "Immich നിർമ്മിക്കാൻ ധാരാളം സമയവും പ്രയത്നവും ആവശ്യമാണ്, അത് കഴിയുന്നത്ര മികച്ചതാക്കാൻ മുഴുവൻ സമയ എഞ്ചിനീയർമാർ പ്രവർത്തിക്കുന്നു. ഓപ്പൺ സോഴ്‌സ് സോഫ്റ്റ്‌വെയറും ധാർമ്മികമായ ബിസിനസ്സ് രീതികളും ഡെവലപ്പർമാർക്ക് സുസ്ഥിരമായ വരുമാന മാർഗ്ഗമാക്കുക, ചൂഷണപരമായ ക്ലൗഡ് സേവനങ്ങൾക്ക് യഥാർത്ഥ ബദലുകളുള്ള സ്വകാര്യതയെ മാനിക്കുന്ന ഒരു ആവാസവ്യവസ്ഥ സൃഷ്ടിക്കുക എന്നതാണ് ഞങ്ങളുടെ ദൗത്യം.", + "purchase_panel_info_2": "പേവാളുകൾ ചേർക്കില്ലെന്ന് ഞങ്ങൾ പ്രതിജ്ഞാബദ്ധരായതിനാൽ, ഈ വാങ്ങൽ നിങ്ങൾക്ക് Immich-ൽ അധിക ഫീച്ചറുകളൊന്നും നൽകില്ല. Immich-ന്റെ തുടർ വികസനത്തെ പിന്തുണയ്ക്കാൻ നിങ്ങളെപ്പോലുള്ള ഉപയോക്താക്കളെയാണ് ഞങ്ങൾ ആശ്രയിക്കുന്നത്.", + "purchase_panel_title": "പദ്ധതിയെ പിന്തുണയ്ക്കുക", + "purchase_per_server": "ഓരോ സെർവറിനും", + "purchase_per_user": "ഓരോ ഉപയോക്താവിനും", + "purchase_remove_product_key": "പ്രൊഡക്റ്റ് കീ നീക്കം ചെയ്യുക", + "purchase_remove_product_key_prompt": "പ്രൊഡക്റ്റ് കീ നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "purchase_remove_server_product_key": "സെർവർ പ്രൊഡക്റ്റ് കീ നീക്കം ചെയ്യുക", + "purchase_remove_server_product_key_prompt": "സെർവർ പ്രൊഡക്റ്റ് കീ നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "purchase_server_description_1": "മുഴുവൻ സെർവറിനും", + "purchase_server_description_2": "സഹായിയുടെ നില", + "purchase_server_title": "സെർവർ", + "purchase_settings_server_activated": "സെർവർ പ്രൊഡക്റ്റ് കീ അഡ്മിൻ ആണ് കൈകാര്യം ചെയ്യുന്നത്", + "query_asset_id": "അസറ്റ് ഐഡി അന്വേഷിക്കുക", + "queue_status": "ക്യൂ ചെയ്യുന്നു {count}/{total}", + "rating": "സ്റ്റാർ റേറ്റിംഗ്", + "rating_clear": "റേറ്റിംഗ് ക്ലിയർ ചെയ്യുക", + "rating_count": "{count, plural, one {# സ്റ്റാർ} other {# സ്റ്റാറുകൾ}}", + "rating_description": "വിവര പാനലിൽ EXIF റേറ്റിംഗ് പ്രദർശിപ്പിക്കുക", + "reaction_options": "പ്രതികരണ ഓപ്ഷനുകൾ", + "read_changelog": "മാറ്റങ്ങളുടെ ലോഗ് വായിക്കുക", + "readonly_mode_disabled": "റീഡ്-ഓൺലി മോഡ് പ്രവർത്തനരഹിതമാക്കി", + "readonly_mode_enabled": "റീഡ്-ഓൺലി മോഡ് പ്രവർത്തനക്ഷമമാക്കി", + "ready_for_upload": "അപ്‌ലോഡിനായി തയ്യാറാണ്", + "reassign": "വീണ്ടും നൽകുക", + "reassigned_assets_to_existing_person": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} {name, select, null {നിലവിലുള്ള ഒരു വ്യക്തിക്ക്} other {{name}-ന്}} വീണ്ടും നൽകി", + "reassigned_assets_to_new_person": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ഒരു പുതിയ വ്യക്തിക്ക് വീണ്ടും നൽകി", + "reassing_hint": "തിരഞ്ഞെടുത്ത അസറ്റുകൾ നിലവിലുള്ള ഒരു വ്യക്തിക്ക് നൽകുക", + "recent": "സമീപകാലം", + "recent-albums": "സമീപകാല ആൽബങ്ങൾ", + "recent_searches": "സമീപകാല തിരയലുകൾ", + "recently_added": "അടുത്തിടെ ചേർത്തത്", + "recently_added_page_title": "അടുത്തിടെ ചേർത്തത്", + "recently_taken": "അടുത്തിടെ എടുത്തത്", + "recently_taken_page_title": "അടുത്തിടെ എടുത്തത്", + "refresh": "പുതുക്കുക", + "refresh_encoded_videos": "എൻകോഡ് ചെയ്ത വീഡിയോകൾ പുതുക്കുക", + "refresh_faces": "മുഖങ്ങൾ പുതുക്കുക", + "refresh_metadata": "മെറ്റാഡാറ്റ പുതുക്കുക", + "refresh_thumbnails": "തംബ്നെയിലുകൾ പുതുക്കുക", + "refreshed": "പുതുക്കി", + "refreshes_every_file": "നിലവിലുള്ളതും പുതിയതുമായ എല്ലാ ഫയലുകളും വീണ്ടും വായിക്കുന്നു", + "refreshing_encoded_video": "എൻകോഡ് ചെയ്ത വീഡിയോ പുതുക്കുന്നു", + "refreshing_faces": "മുഖങ്ങൾ പുതുക്കുന്നു", + "refreshing_metadata": "മെറ്റാഡാറ്റ പുതുക്കുന്നു", + "regenerating_thumbnails": "തംബ്നെയിലുകൾ പുനർനിർമ്മിക്കുന്നു", + "remote": "റിമോട്ട്", + "remote_assets": "റിമോട്ട് അസറ്റുകൾ", + "remote_media_summary": "റിമോട്ട് മീഡിയ സംഗ്രഹം", + "remove": "നീക്കം ചെയ്യുക", + "remove_assets_album_confirmation": "ആൽബത്തിൽ നിന്ന് {count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "remove_assets_shared_link_confirmation": "ഈ പങ്കിട്ട ലിങ്കിൽ നിന്ന് {count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "remove_assets_title": "അസറ്റുകൾ നീക്കം ചെയ്യണോ?", + "remove_custom_date_range": "കസ്റ്റം തീയതി പരിധി നീക്കം ചെയ്യുക", + "remove_deleted_assets": "ഇല്ലാതാക്കിയ അസറ്റുകൾ നീക്കം ചെയ്യുക", + "remove_from_album": "ആൽബത്തിൽ നിന്ന് നീക്കം ചെയ്യുക", + "remove_from_album_action_prompt": "{count} എണ്ണം ആൽബത്തിൽ നിന്ന് നീക്കം ചെയ്തു", + "remove_from_favorites": "പ്രിയപ്പെട്ടവയിൽ നിന്ന് നീക്കം ചെയ്യുക", + "remove_from_lock_folder_action_prompt": "{count} എണ്ണം ലോക്ക് ചെയ്ത ഫോൾഡറിൽ നിന്ന് നീക്കം ചെയ്തു", + "remove_from_locked_folder": "ലോക്ക് ചെയ്ത ഫോൾഡറിൽ നിന്ന് നീക്കം ചെയ്യുക", + "remove_from_locked_folder_confirmation": "ഈ ഫോട്ടോകളും വീഡിയോകളും ലോക്ക് ചെയ്ത ഫോൾഡറിൽ നിന്ന് മാറ്റണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? അവ നിങ്ങളുടെ ലൈബ്രറിയിൽ ദൃശ്യമാകും.", + "remove_from_shared_link": "പങ്കിട്ട ലിങ്കിൽ നിന്ന് നീക്കം ചെയ്യുക", + "remove_memory": "ഓർമ്മ നീക്കം ചെയ്യുക", + "remove_photo_from_memory": "ഈ ഓർമ്മയിൽ നിന്ന് ഫോട്ടോ നീക്കം ചെയ്യുക", + "remove_tag": "ടാഗ് നീക്കം ചെയ്യുക", + "remove_url": "URL നീക്കം ചെയ്യുക", + "remove_user": "ഉപയോക്താവിനെ നീക്കം ചെയ്യുക", + "removed_api_key": "API കീ നീക്കം ചെയ്തു: {name}", + "removed_from_archive": "ആർക്കൈവിൽ നിന്ന് നീക്കം ചെയ്തു", + "removed_from_favorites": "പ്രിയപ്പെട്ടവയിൽ നിന്ന് നീക്കം ചെയ്തു", + "removed_from_favorites_count": "{count, plural, other {# എണ്ണം}} പ്രിയപ്പെട്ടവയിൽ നിന്ന് നീക്കം ചെയ്തു", + "removed_memory": "ഓർമ്മ നീക്കം ചെയ്തു", + "removed_photo_from_memory": "ഓർമ്മയിൽ നിന്ന് ഫോട്ടോ നീക്കം ചെയ്തു", + "removed_tagged_assets": "{count, plural, one {# അസറ്റിൽ നിന്ന്} other {# അസറ്റുകളിൽ നിന്ന്}} ടാഗ് നീക്കം ചെയ്തു", + "rename": "പുനർനാമകരണം ചെയ്യുക", + "repair": "റിപ്പയർ ചെയ്യുക", + "repair_no_results_message": "ട്രാക്ക് ചെയ്യാത്തതും കാണാതായതുമായ ഫയലുകൾ ഇവിടെ കാണിക്കും", + "replace_with_upload": "അപ്‌ലോഡ് ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുക", + "repository": "റെപ്പോസിറ്ററി", + "require_password": "പാസ്‌വേഡ് ആവശ്യമാണ്", + "require_user_to_change_password_on_first_login": "ആദ്യ ലോഗിൻ ചെയ്യുമ്പോൾ പാസ്‌വേഡ് മാറ്റാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക", + "rescan": "വീണ്ടും സ്കാൻ ചെയ്യുക", + "reset": "റീസെറ്റ് ചെയ്യുക", + "reset_password": "പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുക", + "reset_people_visibility": "ആളുകളുടെ ദൃശ്യത പുനഃസജ്ജമാക്കുക", + "reset_pin_code": "പിൻ കോഡ് റീസെറ്റ് ചെയ്യുക", + "reset_pin_code_description": "നിങ്ങൾ പിൻ കോഡ് മറന്നെങ്കിൽ, അത് പുനഃസജ്ജമാക്കാൻ നിങ്ങൾക്ക് സെർവർ അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടാം", + "reset_pin_code_success": "പിൻ കോഡ് വിജയകരമായി റീസെറ്റ് ചെയ്തു", + "reset_pin_code_with_password": "നിങ്ങളുടെ പാസ്‌വേഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് എപ്പോഴും പിൻ കോഡ് റീസെറ്റ് ചെയ്യാം", + "reset_sqlite": "SQLite ഡാറ്റാബേസ് റീസെറ്റ് ചെയ്യുക", + "reset_sqlite_confirmation": "SQLite ഡാറ്റാബേസ് റീസെറ്റ് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഡാറ്റ വീണ്ടും സിങ്ക് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്ത് വീണ്ടും ലോഗിൻ ചെയ്യേണ്ടിവരും", + "reset_sqlite_success": "SQLite ഡാറ്റാബേസ് വിജയകരമായി റീസെറ്റ് ചെയ്തു", + "reset_to_default": "ഡിഫോൾട്ടിലേക്ക് പുനഃസജ്ജമാക്കുക", + "resolve_duplicates": "ഡ്യൂപ്ലിക്കേറ്റുകൾ പരിഹരിക്കുക", + "resolved_all_duplicates": "എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും പരിഹരിച്ചു", + "restore": "പുനഃസ്ഥാപിക്കുക", + "restore_all": "എല്ലാം പുനഃസ്ഥാപിക്കുക", + "restore_trash_action_prompt": "{count} എണ്ണം ട്രാഷിൽ നിന്ന് പുനഃസ്ഥാപിച്ചു", + "restore_user": "ഉപയോക്താവിനെ പുനഃസ്ഥാപിക്കുക", + "restored_asset": "അസറ്റ് പുനഃസ്ഥാപിച്ചു", + "resume": "പുനരാരംഭിക്കുക", + "resume_paused_jobs": "{count, plural, one {താൽക്കാലികമായി നിർത്തിയ # ജോലി} other {താൽക്കാലികമായി നിർത്തിയ # ജോലികൾ}} പുനരാരംഭിക്കുക", + "retry_upload": "അപ്‌ലോഡ് വീണ്ടും ശ്രമിക്കുക", + "review_duplicates": "ഡ്യൂപ്ലിക്കേറ്റുകൾ അവലോകനം ചെയ്യുക", + "review_large_files": "വലിയ ഫയലുകൾ അവലോകനം ചെയ്യുക", + "role": "റോൾ", + "role_editor": "എഡിറ്റർ", + "role_viewer": "കാണുന്നയാൾ", + "running": "പ്രവർത്തിക്കുന്നു", + "save": "സേവ് ചെയ്യുക", + "save_to_gallery": "ഗാലറിയിലേക്ക് സേവ് ചെയ്യുക", + "saved_api_key": "API കീ സേവ് ചെയ്തു", + "saved_profile": "പ്രൊഫൈൽ സേവ് ചെയ്തു", + "saved_settings": "ക്രമീകരണങ്ങൾ സേവ് ചെയ്തു", + "say_something": "എന്തെങ്കിലും പറയൂ", + "scaffold_body_error_occurred": "പിശക് സംഭവിച്ചു", + "scan_all_libraries": "എല്ലാ ലൈബ്രറികളും സ്കാൻ ചെയ്യുക", + "scan_library": "സ്കാൻ ചെയ്യുക", + "scan_settings": "സ്കാൻ ക്രമീകരണങ്ങൾ", + "scanning_for_album": "ആൽബത്തിനായി സ്കാൻ ചെയ്യുന്നു...", + "search": "തിരയുക", + "search_albums": "ആൽബങ്ങൾക്കായി തിരയുക", + "search_by_context": "സന്ദർഭം അനുസരിച്ച് തിരയുക", + "search_by_description": "വിവരണം അനുസരിച്ച് തിരയുക", + "search_by_description_example": "സപ്പയിലെ ഹൈക്കിംഗ് ദിനം", + "search_by_filename": "ഫയൽ നാമം അല്ലെങ്കിൽ എക്സ്റ്റൻഷൻ ഉപയോഗിച്ച് തിരയുക", + "search_by_filename_example": "ഉദാ. IMG_1234.JPG അല്ലെങ്കിൽ PNG", + "search_camera_make": "ക്യാമറ നിർമ്മാതാവിനായി തിരയുക...", + "search_camera_model": "ക്യാമറ മോഡലിനായി തിരയുക...", + "search_city": "നഗരത്തിനായി തിരയുക...", + "search_country": "രാജ്യത്തിനായി തിരയുക...", + "search_filter_apply": "ഫിൽട്ടർ പ്രയോഗിക്കുക", + "search_filter_camera_title": "ക്യാമറ തരം തിരഞ്ഞെടുക്കുക", + "search_filter_date": "തീയതി", + "search_filter_date_interval": "{start} മുതൽ {end} വരെ", + "search_filter_date_title": "ഒരു തീയതി പരിധി തിരഞ്ഞെടുക്കുക", + "search_filter_display_option_not_in_album": "ആൽബത്തിൽ ഇല്ല", + "search_filter_display_options": "പ്രദർശന ഓപ്ഷനുകൾ", + "search_filter_filename": "ഫയൽ നാമം ഉപയോഗിച്ച് തിരയുക", + "search_filter_location": "സ്ഥാനം", + "search_filter_location_title": "സ്ഥാനം തിരഞ്ഞെടുക്കുക", + "search_filter_media_type": "മീഡിയ തരം", + "search_filter_media_type_title": "മീഡിയ തരം തിരഞ്ഞെടുക്കുക", + "search_filter_people_title": "ആളുകളെ തിരഞ്ഞെടുക്കുക", + "search_for": "ഇതിനായി തിരയുക", + "search_for_existing_person": "നിലവിലുള്ള വ്യക്തിക്കായി തിരയുക", + "search_no_more_result": "കൂടുതൽ ഫലങ്ങളില്ല", + "search_no_people": "ആളുകളില്ല", + "search_no_people_named": "\"{name}\" എന്ന് പേരുള്ള ആളുകളില്ല", + "search_no_result": "ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല, മറ്റൊരു തിരയൽ പദമോ സംയോജനമോ ഉപയോഗിച്ച് ശ്രമിക്കുക", + "search_options": "തിരയൽ ഓപ്ഷനുകൾ", + "search_page_categories": "വിഭാഗങ്ങൾ", + "search_page_motion_photos": "ചലിക്കുന്ന ഫോട്ടോകൾ", + "search_page_no_objects": "വസ്തുക്കളുടെ വിവരങ്ങൾ ലഭ്യമല്ല", + "search_page_no_places": "സ്ഥലങ്ങളുടെ വിവരങ്ങൾ ലഭ്യമല്ല", + "search_page_screenshots": "സ്ക്രീൻഷോട്ടുകൾ", + "search_page_search_photos_videos": "നിങ്ങളുടെ ഫോട്ടോകൾക്കും വീഡിയോകൾക്കുമായി തിരയുക", + "search_page_selfies": "സെൽഫികൾ", + "search_page_things": "വസ്തുക്കൾ", + "search_page_view_all_button": "എല്ലാം കാണുക", + "search_page_your_activity": "നിങ്ങളുടെ പ്രവർത്തനം", + "search_page_your_map": "നിങ്ങളുടെ മാപ്പ്", + "search_people": "ആളുകളെ തിരയുക", + "search_places": "സ്ഥലങ്ങൾ തിരയുക", + "search_rating": "റേറ്റിംഗ് അനുസരിച്ച് തിരയുക...", + "search_result_page_new_search_hint": "പുതിയ തിരയൽ", + "search_settings": "തിരയൽ ക്രമീകരണങ്ങൾ", + "search_state": "സംസ്ഥാനം തിരയുക...", + "search_suggestion_list_smart_search_hint_1": "സ്മാർട്ട് സെർച്ച് ഡിഫോൾട്ടായി പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു, മെറ്റാഡാറ്റയ്ക്കായി തിരയാൻ ഈ വാക്യഘടന ഉപയോഗിക്കുക ", + "search_suggestion_list_smart_search_hint_2": "m:നിങ്ങളുടെ-തിരയൽ-പദം", + "search_tags": "ടാഗുകൾക്കായി തിരയുക...", + "search_timezone": "സമയമേഖലയ്ക്കായി തിരയുക...", + "search_type": "തിരയൽ തരം", + "search_your_photos": "നിങ്ങളുടെ ഫോട്ടോകൾ തിരയുക", + "searching_locales": "ലൊക്കേലുകൾക്കായി തിരയുന്നു...", + "second": "സെക്കന്റ്", + "see_all_people": "എല്ലാ ആളുകളെയും കാണുക", + "select": "തിരഞ്ഞെടുക്കുക", + "select_album_cover": "ആൽബം കവർ തിരഞ്ഞെടുക്കുക", + "select_all": "എല്ലാം തിരഞ്ഞെടുക്കുക", + "select_all_duplicates": "എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും തിരഞ്ഞെടുക്കുക", + "select_all_in": "{group}-ലെ എല്ലാം തിരഞ്ഞെടുക്കുക", + "select_avatar_color": "അവതാർ നിറം തിരഞ്ഞെടുക്കുക", + "select_face": "മുഖം തിരഞ്ഞെടുക്കുക", + "select_featured_photo": "ഫീച്ചർ ചെയ്ത ഫോട്ടോ തിരഞ്ഞെടുക്കുക", + "select_from_computer": "കമ്പ്യൂട്ടറിൽ നിന്ന് തിരഞ്ഞെടുക്കുക", + "select_keep_all": "എല്ലാം സൂക്ഷിക്കാൻ തിരഞ്ഞെടുക്കുക", + "select_library_owner": "ലൈബ്രറി ഉടമയെ തിരഞ്ഞെടുക്കുക", + "select_new_face": "പുതിയ മുഖം തിരഞ്ഞെടുക്കുക", + "select_person_to_tag": "ടാഗ് ചെയ്യാൻ ഒരു വ്യക്തിയെ തിരഞ്ഞെടുക്കുക", + "select_photos": "ഫോട്ടോകൾ തിരഞ്ഞെടുക്കുക", + "select_trash_all": "എല്ലാം ട്രാഷ് ചെയ്യാൻ തിരഞ്ഞെടുക്കുക", + "select_user_for_sharing_page_err_album": "ആൽബം ഉണ്ടാക്കുന്നതിൽ പരാജയപ്പെട്ടു", + "selected": "തിരഞ്ഞെടുത്തു", + "selected_count": "{count, plural, other {# എണ്ണം തിരഞ്ഞെടുത്തു}}", + "selected_gps_coordinates": "തിരഞ്ഞെടുത്ത GPS കോർഡിനേറ്റുകൾ", + "send_message": "സന്ദേശം അയക്കുക", + "send_welcome_email": "സ്വാഗത ഇമെയിൽ അയക്കുക", + "server_endpoint": "സെർവർ എൻഡ്‌പോയിന്റ്", + "server_info_box_app_version": "ആപ്പ് പതിപ്പ്", + "server_info_box_server_url": "സെർവർ URL", + "server_offline": "സെർവർ ഓഫ്‌ലൈൻ", + "server_online": "സെർവർ ഓൺലൈൻ", + "server_privacy": "സെർവർ സ്വകാര്യത", + "server_stats": "സെർവർ സ്ഥിതിവിവരക്കണക്കുകൾ", + "server_version": "സെർവർ പതിപ്പ്", + "set": "സജ്ജമാക്കുക", + "set_as_album_cover": "ആൽബം കവറായി സജ്ജമാക്കുക", + "set_as_featured_photo": "ഫീച്ചർ ചെയ്ത ഫോട്ടോയായി സജ്ജമാക്കുക", + "set_as_profile_picture": "പ്രൊഫൈൽ ചിത്രമായി സജ്ജമാക്കുക", + "set_date_of_birth": "ജനനത്തീയതി സജ്ജമാക്കുക", + "set_profile_picture": "പ്രൊഫൈൽ ചിത്രം സജ്ജമാക്കുക", + "set_slideshow_to_fullscreen": "സ്ലൈഡ്‌ഷോ ഫുൾസ്ക്രീനായി സജ്ജമാക്കുക", + "set_stack_primary_asset": "പ്രധാന അസറ്റായി സജ്ജമാക്കുക", + "setting_image_viewer_help": "വിശദാംശ വ്യൂവർ ആദ്യം ചെറിയ തംബ്നെയിൽ ലോഡുചെയ്യുന്നു, തുടർന്ന് ഇടത്തരം പ്രിവ്യൂ (പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ), ഒടുവിൽ യഥാർത്ഥ ചിത്രം (പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ) ലോഡുചെയ്യുന്നു.", + "setting_image_viewer_original_subtitle": "യഥാർത്ഥ പൂർണ്ണ-റെസല്യൂഷൻ ചിത്രം (വലുത്!) ലോഡുചെയ്യാൻ പ്രവർത്തനക്ഷമമാക്കുക. ഡാറ്റ ഉപയോഗം (നെറ്റ്‌വർക്കും ഉപകരണ കാഷെയും) കുറയ്ക്കാൻ പ്രവർത്തനരഹിതമാക്കുക.", + "setting_image_viewer_original_title": "യഥാർത്ഥ ചിത്രം ലോഡുചെയ്യുക", + "setting_image_viewer_preview_subtitle": "ഇടത്തരം റെസല്യൂഷനുള്ള ചിത്രം ലോഡുചെയ്യാൻ പ്രവർത്തനക്ഷമമാക്കുക. ഒന്നുകിൽ യഥാർത്ഥ ചിത്രം നേരിട്ട് ലോഡുചെയ്യുന്നതിനോ അല്ലെങ്കിൽ തംബ്നെയിൽ മാത്രം ഉപയോഗിക്കുന്നതിനോ പ്രവർത്തനരഹിതമാക്കുക.", + "setting_image_viewer_preview_title": "പ്രിവ്യൂ ചിത്രം ലോഡുചെയ്യുക", + "setting_image_viewer_title": "ചിത്രങ്ങൾ", + "setting_languages_apply": "പ്രയോഗിക്കുക", + "setting_languages_subtitle": "ആപ്പിന്റെ ഭാഷ മാറ്റുക", + "setting_notifications_notify_failures_grace_period": "പശ്ചാത്തല ബാക്കപ്പ് പരാജയങ്ങൾ അറിയിക്കുക: {duration}", + "setting_notifications_notify_hours": "{count} മണിക്കൂർ", + "setting_notifications_notify_immediately": "ഉടനടി", + "setting_notifications_notify_minutes": "{count} മിനിറ്റ്", + "setting_notifications_notify_never": "ഒരിക്കലും", + "setting_notifications_notify_seconds": "{count} സെക്കൻഡ്", + "setting_notifications_single_progress_subtitle": "ഓരോ അസറ്റിന്റെയും വിശദമായ അപ്‌ലോഡ് പുരോഗതി വിവരം", + "setting_notifications_single_progress_title": "പശ്ചാത്തല ബാക്കപ്പിന്റെ വിശദമായ പുരോഗതി കാണിക്കുക", + "setting_notifications_subtitle": "നിങ്ങളുടെ അറിയിപ്പ് മുൻഗണനകൾ ക്രമീകരിക്കുക", + "setting_notifications_total_progress_subtitle": "മൊത്തത്തിലുള്ള അപ്‌ലോഡ് പുരോഗതി (ചെയ്തത്/ആകെ അസറ്റുകൾ)", + "setting_notifications_total_progress_title": "പശ്ചാത്തല ബാക്കപ്പിന്റെ മൊത്തം പുരോഗതി കാണിക്കുക", + "setting_video_viewer_looping_title": "ലൂപ്പിംഗ്", + "setting_video_viewer_original_video_subtitle": "സെർവറിൽ നിന്ന് ഒരു വീഡിയോ സ്ട്രീം ചെയ്യുമ്പോൾ, ഒരു ട്രാൻസ്‌കോഡ് ലഭ്യമാണെങ്കിലും യഥാർത്ഥ വീഡിയോ പ്ലേ ചെയ്യുക. ഇത് ബഫറിംഗിന് കാരണമായേക്കാം. പ്രാദേശികമായി ലഭ്യമായ വീഡിയോകൾ ഈ ക്രമീകരണം പരിഗണിക്കാതെ തന്നെ യഥാർത്ഥ ഗുണമേന്മയിൽ പ്ലേ ചെയ്യും.", + "setting_video_viewer_original_video_title": "യഥാർത്ഥ വീഡിയോ നിർബന്ധമാക്കുക", + "settings": "ക്രമീകരണങ്ങൾ", + "settings_require_restart": "ഈ ക്രമീകരണം പ്രയോഗിക്കാൻ ദയവായി Immich പുനരാരംഭിക്കുക", + "settings_saved": "ക്രമീകരണങ്ങൾ സേവ് ചെയ്തു", + "setup_pin_code": "ഒരു പിൻ കോഡ് സജ്ജീകരിക്കുക", + "share": "പങ്കിടുക", + "share_action_prompt": "{count} അസറ്റുകൾ പങ്കിട്ടു", + "share_add_photos": "ഫോട്ടോകൾ ചേർക്കുക", + "share_assets_selected": "{count} എണ്ണം തിരഞ്ഞെടുത്തു", + "share_dialog_preparing": "തയ്യാറാക്കുന്നു...", + "share_link": "ലിങ്ക് പങ്കിടുക", + "shared": "പങ്കിട്ടത്", + "shared_album_activities_input_disable": "അഭിപ്രായം പ്രവർത്തനരഹിതമാക്കി", + "shared_album_activity_remove_content": "ഈ പ്രവർത്തനം ഇല്ലാതാക്കണോ?", + "shared_album_activity_remove_title": "പ്രവർത്തനം ഇല്ലാതാക്കുക", + "shared_album_section_people_action_error": "ആൽബത്തിൽ നിന്ന് വിട്ടുപോകുന്നതിനോ/നീക്കംചെയ്യുന്നതിനോ പിശക്", + "shared_album_section_people_action_leave": "ആൽബത്തിൽ നിന്ന് ഉപയോക്താവിനെ നീക്കം ചെയ്യുക", + "shared_album_section_people_action_remove_user": "ആൽബത്തിൽ നിന്ന് ഉപയോക്താവിനെ നീക്കം ചെയ്യുക", + "shared_album_section_people_title": "ആളുകൾ", + "shared_by": "പങ്കിട്ടത്", + "shared_by_user": "{user} പങ്കിട്ടു", + "shared_by_you": "നിങ്ങൾ പങ്കിട്ടത്", + "shared_from_partner": "{partner}-ൽ നിന്നുള്ള ഫോട്ടോകൾ", + "shared_intent_upload_button_progress_text": "{current}/{total} അപ്‌ലോഡ് ചെയ്തു", + "shared_link_app_bar_title": "പങ്കിട്ട ലിങ്കുകൾ", + "shared_link_clipboard_copied_massage": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി", + "shared_link_clipboard_text": "ലിങ്ക്: {link}\nപാസ്‌വേഡ്: {password}", + "shared_link_create_error": "പങ്കിട്ട ലിങ്ക് ഉണ്ടാക്കുന്നതിൽ പിശക്", + "shared_link_custom_url_description": "ഒരു കസ്റ്റം URL ഉപയോഗിച്ച് ഈ പങ്കിട്ട ലിങ്ക് ആക്‌സസ് ചെയ്യുക", + "shared_link_edit_description_hint": "പങ്കിടലിന്റെ വിവരണം നൽകുക", + "shared_link_edit_expire_after_option_day": "1 ദിവസം", + "shared_link_edit_expire_after_option_days": "{count} ദിവസങ്ങൾ", + "shared_link_edit_expire_after_option_hour": "1 മണിക്കൂർ", + "shared_link_edit_expire_after_option_hours": "{count} മണിക്കൂറുകൾ", + "shared_link_edit_expire_after_option_minute": "1 മിനിറ്റ്", + "shared_link_edit_expire_after_option_minutes": "{count} മിനിറ്റുകൾ", + "shared_link_edit_expire_after_option_months": "{count} മാസങ്ങൾ", + "shared_link_edit_expire_after_option_year": "{count} വർഷം", + "shared_link_edit_password_hint": "പങ്കിടലിന്റെ പാസ്‌വേഡ് നൽകുക", + "shared_link_edit_submit_button": "ലിങ്ക് അപ്ഡേറ്റ് ചെയ്യുക", + "shared_link_error_server_url_fetch": "സെർവർ url ലഭ്യമാക്കാൻ കഴിയില്ല", + "shared_link_expires_day": "{count} ദിവസത്തിനുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_days": "{count} ദിവസങ്ങൾക്കുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_hour": "{count} മണിക്കൂറിനുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_hours": "{count} മണിക്കൂറുകൾക്കുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_minute": "{count} മിനിറ്റിനുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_minutes": "{count} മിനിറ്റുകൾക്കുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_never": "കാലഹരണപ്പെടില്ല ∞", + "shared_link_expires_second": "{count} സെക്കൻഡിനുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_expires_seconds": "{count} സെക്കൻഡുകൾക്കുള്ളിൽ കാലഹരണപ്പെടും", + "shared_link_individual_shared": "വ്യക്തിഗതമായി പങ്കിട്ടത്", + "shared_link_info_chip_metadata": "EXIF", + "shared_link_manage_links": "പങ്കിട്ട ലിങ്കുകൾ കൈകാര്യം ചെയ്യുക", + "shared_link_options": "പങ്കിട്ട ലിങ്ക് ഓപ്ഷനുകൾ", + "shared_link_password_description": "ഈ പങ്കിട്ട ലിങ്ക് ആക്‌സസ് ചെയ്യാൻ ഒരു പാസ്‌വേഡ് ആവശ്യമാണ്", + "shared_links": "പങ്കിട്ട ലിങ്കുകൾ", + "shared_links_description": "ഒരു ലിങ്ക് ഉപയോഗിച്ച് ഫോട്ടോകളും വീഡിയോകളും പങ്കിടുക", + "shared_photos_and_videos_count": "{assetCount, plural, other {പങ്കിട്ട # ഫോട്ടോകളും വീഡിയോകളും.}}", + "shared_with_me": "എനിക്കായി പങ്കിട്ടത്", + "shared_with_partner": "{partner}-മായി പങ്കിട്ടു", + "sharing": "പങ്കിടൽ", + "sharing_enter_password": "ഈ പേജ് കാണുന്നതിന് ദയവായി പാസ്‌വേഡ് നൽകുക.", + "sharing_page_album": "പങ്കിട്ട ആൽബങ്ങൾ", + "sharing_page_description": "നിങ്ങളുടെ നെറ്റ്‌വർക്കിലെ ആളുകളുമായി ഫോട്ടോകളും വീഡിയോകളും പങ്കിടാൻ പങ്കിട്ട ആൽബങ്ങൾ ഉണ്ടാക്കുക.", + "sharing_page_empty_list": "ശൂന്യമായ ലിസ്റ്റ്", + "sharing_sidebar_description": "സൈഡ്‌ബാറിൽ 'പങ്കിടൽ' എന്നതിലേക്ക് ഒരു ലിങ്ക് പ്രദർശിപ്പിക്കുക", + "sharing_silver_appbar_create_shared_album": "പുതിയ പങ്കിട്ട ആൽബം", + "sharing_silver_appbar_share_partner": "പങ്കാളിയുമായി പങ്കിടുക", + "shift_to_permanent_delete": "അസറ്റ് ശാശ്വതമായി ഇല്ലാതാക്കാൻ ⇧ അമർത്തുക", + "show_album_options": "ആൽബം ഓപ്ഷനുകൾ കാണിക്കുക", + "show_albums": "ആൽബങ്ങൾ കാണിക്കുക", + "show_all_people": "എല്ലാ ആളുകളെയും കാണിക്കുക", + "show_and_hide_people": "ആളുകളെ കാണിക്കുകയും മറയ്ക്കുകയും ചെയ്യുക", + "show_file_location": "ഫയലിന്റെ സ്ഥാനം കാണിക്കുക", + "show_gallery": "ഗാലറി കാണിക്കുക", + "show_hidden_people": "മറച്ച ആളുകളെ കാണിക്കുക", + "show_in_timeline": "ടൈംലൈനിൽ കാണിക്കുക", + "show_in_timeline_setting_description": "ഈ ഉപയോക്താവിൽ നിന്നുള്ള ഫോട്ടോകളും വീഡിയോകളും നിങ്ങളുടെ ടൈംലൈനിൽ കാണിക്കുക", + "show_keyboard_shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ കാണിക്കുക", + "show_metadata": "മെറ്റാഡാറ്റ കാണിക്കുക", + "show_or_hide_info": "വിവരങ്ങൾ കാണിക്കുക അല്ലെങ്കിൽ മറയ്ക്കുക", + "show_password": "പാസ്‌വേഡ് കാണിക്കുക", + "show_person_options": "വ്യക്തിയുടെ ഓപ്ഷനുകൾ കാണിക്കുക", + "show_progress_bar": "പുരോഗതി ബാർ കാണിക്കുക", + "show_search_options": "തിരയൽ ഓപ്ഷനുകൾ കാണിക്കുക", + "show_shared_links": "പങ്കിട്ട ലിങ്കുകൾ കാണിക്കുക", + "show_slideshow_transition": "സ്ലൈഡ്‌ഷോ സംക്രമണം കാണിക്കുക", + "show_supporter_badge": "സഹായിയുടെ ബാഡ്ജ്", + "show_supporter_badge_description": "ഒരു സഹായിയുടെ ബാഡ്ജ് കാണിക്കുക", + "show_text_search_menu": "ടെക്സ്റ്റ് തിരയൽ മെനു കാണിക്കുക", + "shuffle": "ഷഫിൾ ചെയ്യുക", + "sidebar": "സൈഡ്‌ബാർ", + "sidebar_display_description": "സൈഡ്‌ബാറിലെ കാഴ്‌ചയിലേക്ക് ഒരു ലിങ്ക് പ്രദർശിപ്പിക്കുക", + "sign_out": "സൈൻ ഔട്ട്", + "sign_up": "സൈൻ അപ്പ് ചെയ്യുക", + "size": "വലിപ്പം", + "skip_to_content": "ഉള്ളടക്കത്തിലേക്ക് പോകുക", + "skip_to_folders": "ഫോൾഡറുകളിലേക്ക് പോകുക", + "skip_to_tags": "ടാഗുകളിലേക്ക് പോകുക", + "slideshow": "സ്ലൈഡ്‌ഷോ", + "slideshow_settings": "സ്ലൈഡ്‌ഷോ ക്രമീകരണങ്ങൾ", + "sort_albums_by": "ആൽബങ്ങളെ ഇതനുസരിച്ച് ക്രമീകരിക്കുക...", + "sort_created": "സൃഷ്ടിച്ച തീയതി", + "sort_items": "ഇനങ്ങളുടെ എണ്ണം", + "sort_modified": "മാറ്റം വരുത്തിയ തീയതി", + "sort_newest": "ഏറ്റവും പുതിയ ഫോട്ടോ", + "sort_oldest": "ഏറ്റവും പഴയ ഫോട്ടോ", + "sort_people_by_similarity": "സാമ്യം അനുസരിച്ച് ആളുകളെ ക്രമീകരിക്കുക", + "sort_recent": "ഏറ്റവും പുതിയ ഫോട്ടോ", + "sort_title": "ശീർഷകം", + "source": "ഉറവിടം", + "stack": "സ്റ്റാക്ക്", + "stack_action_prompt": "{count} എണ്ണം സ്റ്റാക്ക് ചെയ്തു", + "stack_duplicates": "ഡ്യൂപ്ലിക്കേറ്റുകൾ സ്റ്റാക്ക് ചെയ്യുക", + "stack_select_one_photo": "സ്റ്റാക്കിനായി ഒരു പ്രധാന ഫോട്ടോ തിരഞ്ഞെടുക്കുക", + "stack_selected_photos": "തിരഞ്ഞെടുത്ത ഫോട്ടോകൾ സ്റ്റാക്ക് ചെയ്യുക", + "stacked_assets_count": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} സ്റ്റാക്ക് ചെയ്തു", + "stacktrace": "സ്റ്റാക്ക്ട്രേസ്", + "start": "ആരംഭിക്കുക", + "start_date": "ആരംഭ തീയതി", + "start_date_before_end_date": "ആരംഭ തീയതി അവസാന തീയതിക്ക് മുമ്പായിരിക്കണം", + "state": "സംസ്ഥാനം", + "status": "നില", + "stop_casting": "കാസ്റ്റിംഗ് നിർത്തുക", + "stop_motion_photo": "ചലിക്കുന്ന ഫോട്ടോ നിർത്തുക", + "stop_photo_sharing": "നിങ്ങളുടെ ഫോട്ടോകൾ പങ്കിടുന്നത് നിർത്തണോ?", + "stop_photo_sharing_description": "{partner}-ക്ക് ഇനി നിങ്ങളുടെ ഫോട്ടോകൾ ആക്‌സസ് ചെയ്യാൻ കഴിയില്ല.", + "stop_sharing_photos_with_user": "ഈ ഉപയോക്താവുമായി നിങ്ങളുടെ ഫോട്ടോകൾ പങ്കിടുന്നത് നിർത്തുക", + "storage": "സംഭരണ സ്ഥലം", + "storage_label": "സ്റ്റോറേജ് ലേബൽ", + "storage_quota": "സ്റ്റോറേജ് ക്വാട്ട", + "storage_usage": "{available}-ൽ {used} ഉപയോഗിച്ചു", + "submit": "സമർപ്പിക്കുക", + "success": "വിജയം", + "suggestions": "നിർദ്ദേശങ്ങൾ", + "sunrise_on_the_beach": "ബീച്ചിലെ സൂര്യോദയം", + "support": "പിന്തുണ", + "support_and_feedback": "പിന്തുണയും അഭിപ്രായവും", + "support_third_party_description": "നിങ്ങളുടെ Immich ഇൻസ്റ്റാളേഷൻ ഒരു മൂന്നാം കക്ഷി പാക്കേജ് ചെയ്തതാണ്. നിങ്ങൾ അനുഭവിക്കുന്ന പ്രശ്നങ്ങൾ ആ പാക്കേജ് കാരണമാകാം, അതിനാൽ താഴെയുള്ള ലിങ്കുകൾ ഉപയോഗിച്ച് ആദ്യം അവരുമായി പ്രശ്നങ്ങൾ ഉന്നയിക്കുക.", + "swap_merge_direction": "ലയിപ്പിക്കൽ ദിശ മാറ്റുക", + "sync": "സിങ്ക്", + "sync_albums": "ആൽബങ്ങൾ സിങ്ക് ചെയ്യുക", + "sync_albums_manual_subtitle": "അപ്‌ലോഡ് ചെയ്ത എല്ലാ വീഡിയോകളും ഫോട്ടോകളും തിരഞ്ഞെടുത്ത ബാക്കപ്പ് ആൽബങ്ങളിലേക്ക് സിങ്ക് ചെയ്യുക", + "sync_local": "പ്രാദേശികമായി സിങ്ക് ചെയ്യുക", + "sync_remote": "റിമോട്ടായി സിങ്ക് ചെയ്യുക", + "sync_status": "സിങ്ക് നില", + "sync_status_subtitle": "സിങ്ക് സിസ്റ്റം കാണുക, കൈകാര്യം ചെയ്യുക", + "sync_upload_album_setting_subtitle": "നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും Immich-ലെ തിരഞ്ഞെടുത്ത ആൽബങ്ങളിലേക്ക് ഉണ്ടാക്കി അപ്‌ലോഡ് ചെയ്യുക", + "tag": "ടാഗ്", + "tag_assets": "അസറ്റുകൾ ടാഗ് ചെയ്യുക", + "tag_created": "{tag} എന്ന ടാഗ് ഉണ്ടാക്കി", + "tag_feature_description": "യുക്തിസഹമായ ടാഗ് വിഷയങ്ങൾ അനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്ത ഫോട്ടോകളും വീഡിയോകളും ബ്രൗസുചെയ്യുന്നു", + "tag_not_found_question": "ഒരു ടാഗ് കണ്ടെത്താൻ കഴിയുന്നില്ലേ? ഒരു പുതിയ ടാഗ് ഉണ്ടാക്കുക.", + "tag_people": "ആളുകളെ ടാഗ് ചെയ്യുക", + "tag_updated": "{tag} എന്ന ടാഗ് അപ്ഡേറ്റ് ചെയ്തു", + "tagged_assets": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} ടാഗ് ചെയ്തു", + "tags": "ടാഗുകൾ", + "tap_to_run_job": "ജോലി പ്രവർത്തിപ്പിക്കാൻ ടാപ്പുചെയ്യുക", + "template": "ടെംപ്ലേറ്റ്", + "theme": "തീം", + "theme_selection": "തീം തിരഞ്ഞെടുക്കൽ", + "theme_selection_description": "നിങ്ങളുടെ ബ്രൗസറിന്റെ സിസ്റ്റം മുൻഗണന അനുസരിച്ച് തീം ലൈറ്റ് അല്ലെങ്കിൽ ഡാർക്ക് ആയി യാന്ത്രികമായി സജ്ജമാക്കുക", + "theme_setting_asset_list_storage_indicator_title": "അസറ്റ് ടൈലുകളിൽ സ്റ്റോറേജ് ഇൻഡിക്കേറ്റർ കാണിക്കുക", + "theme_setting_asset_list_tiles_per_row_title": "ഓരോ വരിയിലും അസറ്റുകളുടെ എണ്ണം ({count})", + "theme_setting_colorful_interface_subtitle": "പശ്ചാത്തല പ്രതലങ്ങളിൽ പ്രധാന നിറം പ്രയോഗിക്കുക.", + "theme_setting_colorful_interface_title": "വർണ്ണാഭമായ ഇന്റർഫേസ്", + "theme_setting_image_viewer_quality_subtitle": "വിശദാംശ ഇമേജ് വ്യൂവറിന്റെ ഗുണമേന്മ ക്രമീകരിക്കുക", + "theme_setting_image_viewer_quality_title": "ഇമേജ് വ്യൂവർ ഗുണമേന്മ", + "theme_setting_primary_color_subtitle": "പ്രധാന പ്രവർത്തനങ്ങൾക്കും ആക്‌സന്റുകൾക്കുമായി ഒരു നിറം തിരഞ്ഞെടുക്കുക.", + "theme_setting_primary_color_title": "പ്രധാന നിറം", + "theme_setting_system_primary_color_title": "സിസ്റ്റം നിറം ഉപയോഗിക്കുക", + "theme_setting_system_theme_switch": "യാന്ത്രികം (സിസ്റ്റം ക്രമീകരണം പിന്തുടരുക)", + "theme_setting_theme_subtitle": "ആപ്പിന്റെ തീം ക്രമീകരണം തിരഞ്ഞെടുക്കുക", + "theme_setting_three_stage_loading_subtitle": "മൂന്ന്-ഘട്ട ലോഡിംഗ് പ്രകടനം വർദ്ധിപ്പിച്ചേക്കാം, പക്ഷേ നെറ്റ്‌വർക്ക് ലോഡ് ഗണ്യമായി വർദ്ധിപ്പിക്കുന്നു", + "theme_setting_three_stage_loading_title": "മൂന്ന്-ഘട്ട ലോഡിംഗ് പ്രവർത്തനക്ഷമമാക്കുക", + "they_will_be_merged_together": "അവയെ ഒരുമിച്ച് ലയിപ്പിക്കും", + "third_party_resources": "മൂന്നാം കക്ഷി ഉറവിടങ്ങൾ", + "time_based_memories": "സമയം അടിസ്ഥാനമാക്കിയുള്ള ഓർമ്മകൾ", + "timeline": "ടൈംലൈൻ", + "timezone": "സമയമേഖല", + "to_archive": "ആർക്കൈവ് ചെയ്യുക", + "to_change_password": "പാസ്‌വേഡ് മാറ്റുക", + "to_favorite": "പ്രിയപ്പെട്ടതാക്കുക", + "to_login": "ലോഗിൻ", + "to_multi_select": "ഒന്നിലധികം തിരഞ്ഞെടുക്കാൻ", + "to_parent": "പാരന്റിലേക്ക് പോകുക", + "to_select": "തിരഞ്ഞെടുക്കാൻ", + "to_trash": "ട്രാഷ് ചെയ്യുക", + "toggle_settings": "ക്രമീകരണങ്ങൾ ടോഗിൾ ചെയ്യുക", + "total": "ആകെ", + "total_usage": "ആകെ ഉപയോഗം", + "trash": "ട്രാഷ്", + "trash_action_prompt": "{count} എണ്ണം ട്രാഷിലേക്ക് മാറ്റി", + "trash_all": "എല്ലാം ട്രാഷ് ചെയ്യുക", + "trash_count": "ട്രാഷ് ({count, number})", + "trash_delete_asset": "അസറ്റ് ട്രാഷ് ചെയ്യുക/ഇല്ലാതാക്കുക", + "trash_emptied": "ട്രാഷ് ശൂന്യമാക്കി", + "trash_no_results_message": "ട്രാഷ് ചെയ്ത ഫോട്ടോകളും വീഡിയോകളും ഇവിടെ കാണിക്കും.", + "trash_page_delete_all": "എല്ലാം ഇല്ലാതാക്കുക", + "trash_page_empty_trash_dialog_content": "നിങ്ങളുടെ ട്രാഷ് ചെയ്ത അസറ്റുകൾ ശൂന്യമാക്കണോ? ഈ ഇനങ്ങൾ Immich-ൽ നിന്ന് ശാശ്വതമായി നീക്കം ചെയ്യപ്പെടും", + "trash_page_info": "ട്രാഷ് ചെയ്ത ഇനങ്ങൾ {days} ദിവസങ്ങൾക്ക് ശേഷം ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും", + "trash_page_no_assets": "ട്രാഷ് ചെയ്ത അസറ്റുകളൊന്നുമില്ല", + "trash_page_restore_all": "എല്ലാം പുനഃസ്ഥാപിക്കുക", + "trash_page_select_assets_btn": "അസറ്റുകൾ തിരഞ്ഞെടുക്കുക", + "trash_page_title": "ട്രാഷ് ({count})", + "trashed_items_will_be_permanently_deleted_after": "ട്രാഷ് ചെയ്ത ഇനങ്ങൾ {days, plural, one {# ദിവസത്തിന്} other {# ദിവസങ്ങൾക്ക്}} ശേഷം ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും.", + "troubleshoot": "ട്രബിൾഷൂട്ട്", + "type": "തരം", + "unable_to_change_pin_code": "പിൻ കോഡ് മാറ്റാൻ കഴിയില്ല", + "unable_to_setup_pin_code": "പിൻ കോഡ് സജ്ജീകരിക്കാൻ കഴിയില്ല", + "unarchive": "അൺആർക്കൈവ് ചെയ്യുക", + "unarchive_action_prompt": "{count} എണ്ണം ആർക്കൈവിൽ നിന്ന് നീക്കം ചെയ്തു", + "unarchived_count": "{count, plural, other {അൺആർക്കൈവ് ചെയ്തവ #}}", + "undo": "തിരികെചെയ്യുക", + "unfavorite": "പ്രിയപ്പെട്ടതല്ലാതാക്കുക", + "unfavorite_action_prompt": "{count} എണ്ണം പ്രിയപ്പെട്ടവയിൽ നിന്ന് നീക്കം ചെയ്തു", + "unhide_person": "വ്യക്തിയെ മറവിൽനിന്ന് മാറ്റുക", + "unknown": "അജ്ഞാതം", + "unknown_country": "അജ്ഞാത രാജ്യം", + "unknown_year": "അജ്ഞാത വർഷം", + "unlimited": "പരിധിയില്ലാത്തത്", + "unlink_motion_video": "ചലിക്കുന്ന വീഡിയോ അൺലിങ്ക് ചെയ്യുക", + "unlink_oauth": "OAuth അൺലിങ്ക് ചെയ്യുക", + "unlinked_oauth_account": "അൺലിങ്ക് ചെയ്ത OAuth അക്കൗണ്ട്", + "unmute_memories": "ഓർമ്മകൾ ശബ്ദമുള്ളതാക്കുക", + "unnamed_album": "പേരില്ലാത്ത ആൽബം", + "unnamed_album_delete_confirmation": "ഈ ആൽബം ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "unnamed_share": "പേരില്ലാത്ത പങ്കിടൽ", + "unsaved_change": "സേവ് ചെയ്യാത്ത മാറ്റം", + "unselect_all": "എല്ലാം തിരഞ്ഞെടുത്തത് മാറ്റുക", + "unselect_all_duplicates": "എല്ലാ ഡ്യൂപ്ലിക്കേറ്റുകളും തിരഞ്ഞെടുത്തത് മാറ്റുക", + "unselect_all_in": "{group}-ലെ എല്ലാം തിരഞ്ഞെടുത്തത് മാറ്റുക", + "unstack": "അൺ-സ്റ്റാക്ക് ചെയ്യുക", + "unstack_action_prompt": "{count} എണ്ണം അൺ-സ്റ്റാക്ക് ചെയ്തു", + "unstacked_assets_count": "{count, plural, one {# അസറ്റ്} other {# അസറ്റുകൾ}} അൺ-സ്റ്റാക്ക് ചെയ്തു", + "untagged": "ടാഗ് ചെയ്തിട്ടില്ല", + "up_next": "അടുത്തത്", + "update_location_action_prompt": "തിരഞ്ഞെടുത്ത {count} അസറ്റുകളുടെ സ്ഥാനം ഇതുപയോഗിച്ച് അപ്ഡേറ്റ് ചെയ്യുക:", + "updated_at": "അപ്ഡേറ്റ് ചെയ്തത്", + "updated_password": "പാസ്‌വേഡ് അപ്ഡേറ്റ് ചെയ്തു", + "upload": "അപ്‌ലോഡ്", + "upload_action_prompt": "{count} എണ്ണം അപ്‌ലോഡിനായി ക്യൂവിൽ ചേർത്തു", + "upload_concurrency": "അപ്‌ലോഡ് കോൺകറൻസി", + "upload_details": "അപ്‌ലോഡ് വിശദാംശങ്ങൾ", + "upload_dialog_info": "തിരഞ്ഞെടുത്ത അസറ്റ്(കൾ) സെർവറിലേക്ക് ബാക്കപ്പ് ചെയ്യണോ?", + "upload_dialog_title": "അസറ്റ് അപ്‌ലോഡ് ചെയ്യുക", + "upload_errors": "അപ്‌ലോഡ് {count, plural, one {# പിശകോടെ} other {# പിശകുകളോടെ}} പൂർത്തിയായി, പുതിയ അപ്‌ലോഡ് അസറ്റുകൾ കാണുന്നതിന് പേജ് പുതുക്കുക.", + "upload_finished": "അപ്‌ലോഡ് കഴിഞ്ഞു", + "upload_progress": "ശേഷിക്കുന്നത് {remaining, number} - പ്രോസസ്സ് ചെയ്തത് {processed, number}/{total, number}", + "upload_skipped_duplicates": "{count, plural, one {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റ്} other {# ഡ്യൂപ്ലിക്കേറ്റ് അസറ്റുകൾ}} ഒഴിവാക്കി", + "upload_status_duplicates": "ഡ്യൂപ്ലിക്കേറ്റുകൾ", + "upload_status_errors": "പിശകുകൾ", + "upload_status_uploaded": "അപ്‌ലോഡ് ചെയ്തു", + "upload_success": "അപ്‌ലോഡ് വിജയിച്ചു, പുതിയ അപ്‌ലോഡ് അസറ്റുകൾ കാണുന്നതിന് പേജ് പുതുക്കുക.", + "upload_to_immich": "Immich-ലേക്ക് അപ്‌ലോഡ് ചെയ്യുക ({count})", + "uploading": "അപ്‌ലോഡ് ചെയ്യുന്നു", + "uploading_media": "മീഡിയ അപ്‌ലോഡ് ചെയ്യുന്നു", + "url": "യുആർഎൽ", + "usage": "ഉപയോഗം", + "use_biometric": "ബയോമെട്രിക് ഉപയോഗിക്കുക", + "use_current_connection": "നിലവിലെ കണക്ഷൻ ഉപയോഗിക്കുക", + "use_custom_date_range": "പകരം കസ്റ്റം തീയതി പരിധി ഉപയോഗിക്കുക", + "user": "ഉപയോക്താവ്", + "user_has_been_deleted": "ഈ ഉപയോക്താവിനെ ഇല്ലാതാക്കി.", + "user_id": "ഉപയോക്തൃ ഐഡി", + "user_liked": "{user} {type, select, photo {ഈ ഫോട്ടോ} video {ഈ വീഡിയോ} asset {ഈ അസറ്റ്} other {ഇത്}} ഇഷ്ടപ്പെട്ടു", + "user_pin_code_settings": "പിൻ കോഡ്", + "user_pin_code_settings_description": "നിങ്ങളുടെ പിൻ കോഡ് കൈകാര്യം ചെയ്യുക", + "user_privacy": "ഉപയോക്തൃ സ്വകാര്യത", + "user_purchase_settings": "വാങ്ങൽ", + "user_purchase_settings_description": "നിങ്ങളുടെ വാങ്ങൽ കൈകാര്യം ചെയ്യുക", + "user_role_set": "{user}-നെ {role} ആയി സജ്ജമാക്കി", + "user_usage_detail": "ഉപയോക്തൃ ഉപയോഗ വിശദാംശം", + "user_usage_stats": "അക്കൗണ്ട് ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകൾ", + "user_usage_stats_description": "അക്കൗണ്ട് ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകൾ കാണുക", + "username": "ഉപയോക്തൃനാമം", + "users": "ഉപയോക്താക്കൾ", + "users_added_to_album_count": "{count, plural, one {# ഉപയോക്താവിനെ} other {# ഉപയോക്താക്കളെ}} ആൽബത്തിലേക്ക് ചേർത്തു", + "utilities": "യൂട്ടിലിറ്റികൾ", + "validate": "സാധൂകരിക്കുക", + "validate_endpoint_error": "ദയവായി സാധുവായ ഒരു URL നൽകുക", + "variables": "വേരിയബിളുകൾ", + "version": "പതിപ്പ്", + "version_announcement_closing": "നിങ്ങളുടെ സുഹൃത്ത്, അലക്സ്", + "version_announcement_message": "നമസ്കാരം! Immich-ന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്. നിങ്ങളുടെ സജ്ജീകരണം ഏറ്റവും പുതിയതാണെന്ന് ഉറപ്പാക്കാൻ ദയവായി റിലീസ് നോട്ടുകൾ വായിക്കാൻ കുറച്ച് സമയമെടുക്കുക. ഇത് തെറ്റായ കോൺഫിഗറേഷനുകൾ ഒഴിവാക്കാൻ സഹായിക്കും, പ്രത്യേകിച്ചും നിങ്ങൾ വാച്ച്ടവർ അല്ലെങ്കിൽ നിങ്ങളുടെ Immich ഇൻസ്റ്റൻസ് യാന്ത്രികമായി അപ്ഡേറ്റ് ചെയ്യുന്ന ഏതെങ്കിലും സംവിധാനം ഉപയോഗിക്കുന്നുണ്ടെങ്കിൽ.", + "version_history": "പതിപ്പ് ചരിത്രം", + "version_history_item": "{date}-ന് {version} ഇൻസ്റ്റാൾ ചെയ്തു", + "video": "വീഡിയോ", + "video_hover_setting": "ഹോവർ ചെയ്യുമ്പോൾ വീഡിയോ തംബ്നെയിൽ പ്ലേ ചെയ്യുക", + "video_hover_setting_description": "മൗസ് ഒരു ഇനത്തിന് മുകളിലൂടെ ഹോവർ ചെയ്യുമ്പോൾ വീഡിയോ തംബ്നെയിൽ പ്ലേ ചെയ്യുക. പ്രവർത്തനരഹിതമാക്കിയാലും, പ്ലേ ഐക്കണിന് മുകളിലൂടെ ഹോവർ ചെയ്ത് പ്ലേബാക്ക് ആരംഭിക്കാൻ കഴിയും.", + "videos": "വീഡിയോകൾ", + "videos_count": "{count, plural, one {# വീഡിയോ} other {# വീഡിയോകൾ}}", + "view": "കാണുക", + "view_album": "ആൽബം കാണുക", + "view_all": "എല്ലാം കാണുക", + "view_all_users": "എല്ലാ ഉപയോക്താക്കളെയും കാണുക", + "view_details": "വിശദാംശങ്ങൾ കാണുക", + "view_in_timeline": "ടൈംലൈനിൽ കാണുക", + "view_link": "ലിങ്ക് കാണുക", + "view_links": "ലിങ്കുകൾ കാണുക", + "view_name": "കാണുക", + "view_next_asset": "അടുത്ത അസറ്റ് കാണുക", + "view_previous_asset": "മുമ്പത്തെ അസറ്റ് കാണുക", + "view_qr_code": "QR കോഡ് കാണുക", + "view_similar_photos": "സമാനമായ ഫോട്ടോകൾ കാണുക", + "view_stack": "സ്റ്റാക്ക് കാണുക", + "view_user": "ഉപയോക്താവിനെ കാണുക", + "viewer_remove_from_stack": "സ്റ്റാക്കിൽ നിന്ന് നീക്കം ചെയ്യുക", + "viewer_stack_use_as_main_asset": "പ്രധാന അസറ്റായി ഉപയോഗിക്കുക", + "viewer_unstack": "അൺ-സ്റ്റാക്ക് ചെയ്യുക", + "visibility_changed": "{count, plural, one {# വ്യക്തിയുടെ} other {# ആളുകളുടെ}} ദൃശ്യത മാറ്റി", "waiting": "കാത്തിരിക്കുന്നു", "warning": "മുന്നറിയിപ്പ്", "week": "ആഴ്ച", "welcome": "സ്വാഗതം", + "welcome_to_immich": "Immich-ലേക്ക് സ്വാഗതം", + "wifi_name": "വൈ-ഫൈയുടെ പേര്", + "wrong_pin_code": "തെറ്റായ പിൻ കോഡ്", "year": "വർഷം", - "yes": "അതെ" + "years_ago": "{years, plural, one {# വർഷം} other {# വർഷങ്ങൾ}} മുമ്പ്", + "yes": "അതെ", + "you_dont_have_any_shared_links": "നിങ്ങൾക്ക് പങ്കിട്ട ലിങ്കുകളൊന്നുമില്ല", + "your_wifi_name": "നിങ്ങളുടെ വൈ-ഫൈയുടെ പേര്", + "zoom_image": "ചിത്രം വലുതാക്കുക", + "zoom_to_bounds": "പരിധികളിലേക്ക് സൂം ചെയ്യുക" } diff --git a/i18n/nb_NO.json b/i18n/nb_NO.json index 4162170885..621f67e1aa 100644 --- a/i18n/nb_NO.json +++ b/i18n/nb_NO.json @@ -23,23 +23,24 @@ "add_partner": "Legg til partner", "add_path": "Legg til sti", "add_photos": "Legg til bilder", - "add_tag": "Legg til tagg", + "add_tag": "Legg til merkelapp", "add_to": "Legg til i…", "add_to_album": "Legg til album", "add_to_album_bottom_sheet_added": "Lagt til i {album}", "add_to_album_bottom_sheet_already_exists": "Allerede i {album}", + "add_to_album_bottom_sheet_some_local_assets": "Noen lokale elementer kunne ikke legges til i albumet", "add_to_album_toggle": "Avhuking for {album}", "add_to_albums": "Legg til i album", "add_to_albums_count": "Legg til i albumer ({count})", "add_to_shared_album": "Legg til delt album", "add_url": "Legg til URL", - "added_to_archive": "Lagt til i arkiv", - "added_to_favorites": "Lagt til i favoritter", + "added_to_archive": "Lagt til i arkivet", + "added_to_favorites": "Lagt til favoritter", "added_to_favorites_count": "Lagt til {count, number} i favoritter", "admin": { "add_exclusion_pattern_description": "Legg til ekskluderingsmønstre. Globbing med *, ** og ? støttes. For å ignorere alle filer i en hvilken som helst mappe som heter \"Raw\", bruk \"**/Raw/**\". For å ignorere alle filer som slutter på \".tif\", bruk \"**/*.tif\". For å ignorere en absolutt filplassering, bruk \"/filsti/til/ignorer/**\".", "admin_user": "Administrasjonsbruker", - "asset_offline_description": "Dette eksterne biblioteksobjektet finnes ikke lenger på disk og har blitt flyttet til papirkurven. Hvis filen ble flyttet innad i biblioteket, se etter det tilsvarende objektet i tidslinjen din. For å gjenopprette objektet, vennligst sørg for at filstien under er tilgjengelig for Immich og skann biblioteket.", + "asset_offline_description": "Dette eksterne bibliotekselementet finnes ikke lenger på disk og har blitt flyttet til papirkurven. Hvis filen ble flyttet innad i biblioteket, se etter det tilsvarende elementet i tidslinjen din. For å gjenopprette elementet, vennligst sørg for at filstien under er tilgjengelig for Immich og skann biblioteket.", "authentication_settings": "Godkjenningsinnstillinger", "authentication_settings_description": "Administrer passord, OAuth, og andre innstillinger for autentisering", "authentication_settings_disable_all": "Er du sikker på at du ønsker å deaktivere alle innloggingsmetoder? Innlogging vil bli fullstendig deaktivert.", @@ -59,12 +60,12 @@ "backup_settings_description": "Håndter innstillinger for database-dump.", "cleared_jobs": "Ryddet opp jobber for: {job}", "config_set_by_file": "Konfigurasjonen er for øyeblikket satt av en konfigurasjonsfil", - "confirm_delete_library": "Er du sikker på at du vil slette biblioteket {library}?", - "confirm_delete_library_assets": "Er du sikker på at du vil slette dette biblioteket? Dette vil slette alt innhold ({count, plural, one {# objekt} other {# objekter}}) og tilhørende eiendeler fra Immich og kan ikke angres. Filene vil forbli på disken.", + "confirm_delete_library": "Vil du virkelig slette biblioteket {library}?", + "confirm_delete_library_assets": "Vil du virkelig slette dette biblioteket? Dette vil slette alt innhold ({count, plural, one {# element} other {# elementer}}) og tilhørende eiendeler fra Immich og kan ikke angres. Filene vil forbli på disken.", "confirm_email_below": "For å bekrefte, skriv inn \"{email}\" nedenfor", - "confirm_reprocess_all_faces": "Er du sikker på at du vil behandle alle ansikter på nytt? Dette vil også fjerne navngitte personer.", - "confirm_user_password_reset": "Er du sikker på at du vil tilbakestille passordet til {user}?", - "confirm_user_pin_code_reset": "Er du sikker på at du vil tilbakestille PIN-koden til {user} ?", + "confirm_reprocess_all_faces": "Vil du virkelig behandle alle ansikter på nytt? Dette vil også fjerne navngitte personer.", + "confirm_user_password_reset": "Vil du virkelig tilbakestille passordet til {user}?", + "confirm_user_pin_code_reset": "Vil du virkelig tilbakestille PIN-koden til {user} ?", "create_job": "Lag jobb", "cron_expression": "Cron uttrykk", "cron_expression_description": "Still inn skanneintervallet med cron-formatet. For mer informasjon henvises til f.eks. Crontab Guru", @@ -189,9 +190,9 @@ "nightly_tasks_database_cleanup_setting": "Opprydningsjobber for databasen", "nightly_tasks_database_cleanup_setting_description": "Rydder opp i gamle, utgåtte data fra databasen", "nightly_tasks_generate_memories_setting": "Genererer minner", - "nightly_tasks_generate_memories_setting_description": "Generer nye minner fra objekter", + "nightly_tasks_generate_memories_setting_description": "Generer nye minner fra elementer", "nightly_tasks_missing_thumbnails_setting": "Generer manglende miniatyrbilder", - "nightly_tasks_missing_thumbnails_setting_description": "Legg til objekter i kø som mangler miniatyrbilder for generering", + "nightly_tasks_missing_thumbnails_setting_description": "Legg til elementer i kø som mangler miniatyrbilder for generering", "nightly_tasks_settings": "Innstillinger for nattjobber", "nightly_tasks_settings_description": "Endre på nattjobber", "nightly_tasks_start_time_setting": "Starttid", @@ -275,7 +276,7 @@ "storage_template_hash_verification_enabled_description": "Aktiver hasjverifisering. Ikke deaktiver dette med mindre du er sikker på konsekvensene", "storage_template_migration": "Implementer lagringsmal", "storage_template_migration_description": "Bruk gjeldende {template} på tidligere opplastede bilder", - "storage_template_migration_info": "Lagringsmalen vil endre filtypen til små bokstaver. Malendringer vil kun gjelde nye objekter. For å anvende malen på tidligere opplastede objekter, kjør {job}.", + "storage_template_migration_info": "Lagringsmalen vil endre filtypen til små bokstaver. Malendringer vil kun gjelde nye elementer. For å anvende malen på tidligere opplastede elementer, kjør {job}.", "storage_template_migration_job": "Migreringsjobb for lagringsmal", "storage_template_more_details": "For mer informasjon om denne funksjonen, se lagringsmalen og dens konsekvenser", "storage_template_onboarding_description_v2": "Når aktivert vil denne funksjonen automatisk organisere filer basert på en brukerdefinert mal. For mer informasjon, se denne linken dokumentasjon.", @@ -367,7 +368,7 @@ "trash_settings_description": "Administrer papirkurv-innstillinger", "unlink_all_oauth_accounts": "Koble fra alle OAuth-kontoer", "unlink_all_oauth_accounts_description": "Husk å koble fra alle OAuth-kontoer før du migrerer til ny leverandør.", - "unlink_all_oauth_accounts_prompt": "Er du sikker på at du vil koble fra alle OAuth-kontoer? Dette vil nullstille OAuth ID for hver bruker, og kan ikke angres.", + "unlink_all_oauth_accounts_prompt": "Vil du virkelig koble fra alle OAuth-kontoer? Dette vil nullstille OAuth ID for hver bruker, og kan ikke angres.", "user_cleanup_job": "Bruker opprydning", "user_delete_delay": "{user}s konto og elementer vil legges i kø for permanent sletting om {delay, plural, one {# dag} other {# dager}}.", "user_delete_delay_settings": "Sletteforsinkelse", @@ -390,8 +391,8 @@ "video_conversion_job": "Transkod videoer", "video_conversion_job_description": "Konverter videoer for bedre kompatibilitet med nettlesere og enheter" }, - "admin_email": "Administrator E-post", - "admin_password": "Administrator Passord", + "admin_email": "Administrator e-post", + "admin_password": "Administratorpassord", "administration": "Administrasjon", "advanced": "Avansert", "advanced_settings_enable_alternate_media_filter_subtitle": "Bruk denne innstillingen for å filtrere mediefiler under synkronisering basert på alternative kriterier. Bruk kun denne innstillingen dersom man opplever problemer med at applikasjonen ikke oppdager alle album.", @@ -413,33 +414,33 @@ "age_months": "Alder {months, plural, one {# måned} other {# måneder}}", "age_year_months": "Alder 1 år, {months, plural, one {# måned} other {# måneder}}", "age_years": "{years, plural, other {Alder #}}", - "album_added": "Album lagt til", + "album_added": "Album opprettet", "album_added_notification_setting_description": "Motta en e-postvarsling når du legges til i et delt album", "album_cover_updated": "Albumomslag oppdatert", - "album_delete_confirmation": "Er du sikker på at du vil slette albumet {album}?", + "album_delete_confirmation": "Vil du virkelig slette albumet {album}?", "album_delete_confirmation_description": "Hvis dette albumet deles, vil andre brukere miste tilgangen til dette.", "album_deleted": "Album slettet", "album_info_card_backup_album_excluded": "EKSKLUDERT", "album_info_card_backup_album_included": "INKLUDERT", "album_info_updated": "Albuminformasjon oppdatert", "album_leave": "Forlate album?", - "album_leave_confirmation": "Er du sikker på at du vil forlate {album}?", - "album_name": "Album Navn", + "album_leave_confirmation": "Vil du virkelig forlate {album}?", + "album_name": "Albumnavn", "album_options": "Albumalternativer", "album_remove_user": "Fjerne bruker?", - "album_remove_user_confirmation": "Er du sikker på at du vil fjerne {user}?", + "album_remove_user_confirmation": "Vil du virkelig fjerne {user}?", "album_search_not_found": "Ingen album ble funnet som traff ditt søk", - "album_share_no_users": "Ser ut til at du har delt dette albumet med alle brukere, eller du ikke har noen brukere å dele det med.", + "album_share_no_users": "Dette albumet er allerede delt med du har delt dette albumet med alle brukere, eller du ikke har noen brukere å dele det med.", "album_summary": "Oppsummering av album", "album_updated": "Album oppdatert", "album_updated_setting_description": "Motta e-postvarsling når et delt album får nye filer", "album_user_left": "Forlot {album}", "album_user_removed": "Fjernet {user}", - "album_viewer_appbar_delete_confirm": "Er du sikker på at du vil slette dette albumet fra kontoen din?", + "album_viewer_appbar_delete_confirm": "Vil du virkelig slette dette albumet fra kontoen din?", "album_viewer_appbar_share_err_delete": "Kunne ikke slette albumet", "album_viewer_appbar_share_err_leave": "Kunne ikke forlate albumet", - "album_viewer_appbar_share_err_remove": "Det oppstod et problem ved fjerning av objekter fra albumet", - "album_viewer_appbar_share_err_title": "Feilet ved endring av albumtittel", + "album_viewer_appbar_share_err_remove": "Det oppstod et problem ved fjerning av elementer fra albumet", + "album_viewer_appbar_share_err_title": "Mislyktes ved endring av albumtittel", "album_viewer_appbar_share_leave": "Forlat album", "album_viewer_appbar_share_to": "Del til", "album_viewer_page_share_add_users": "Legg til brukere", @@ -460,11 +461,11 @@ "allow_public_user_to_upload": "Tillat uautentiserte brukere å laste opp", "alt_text_qr_code": "QR-kodebilde", "anti_clockwise": "Mot klokken", - "api_key": "API Nøkkel", + "api_key": "API-nøkkel", "api_key_description": "Denne verdien vil vises kun én gang. Pass på å kopiere den før du lukker vinduet.", "api_key_empty": "API-nøkkelnavnet bør ikke være tomt", "api_keys": "API-nøkler", - "app_bar_signout_dialog_content": "Er du sikker på at du vil logge ut?", + "app_bar_signout_dialog_content": "Vil du virkelig logge ut?", "app_bar_signout_dialog_ok": "Ja", "app_bar_signout_dialog_title": "Logg ut", "app_settings": "Appinstillinger", @@ -473,16 +474,16 @@ "archive": "Arkiv", "archive_action_prompt": "{count} lagt til i arkivet", "archive_or_unarchive_photo": "Arkiver eller ta ut av arkivet", - "archive_page_no_archived_assets": "Ingen arkiverte objekter funnet", + "archive_page_no_archived_assets": "Ingen arkiverte elementer funnet", "archive_page_title": "Arkiv ({count})", "archive_size": "Arkivstørrelse", "archive_size_description": "Konfigurer arkivstørrelsen for nedlastinger (i GiB)", "archived": "Arkivert", "archived_count": "{count, plural, other {Arkivert #}}", "are_these_the_same_person": "Er disse samme person?", - "are_you_sure_to_do_this": "Er du sikker på at du vil gjøre dette?", - "asset_action_delete_err_read_only": "Kan ikke slette objekt(er) med kun lese-rettighet, hopper over", - "asset_action_share_err_offline": "Kan ikke hente offline objekt(er), hopper over", + "are_you_sure_to_do_this": "Vil du virkelig gjøre dette?", + "asset_action_delete_err_read_only": "Kunne ikke slette element(er) med kun lese-rettighet, hopper over", + "asset_action_share_err_offline": "Kunne ikke hente offline element(er), hopper over", "asset_added_to_album": "Lagt til i album", "asset_adding_to_album": "Legger til i album…", "asset_description_updated": "Elementbeskrivelse har blitt oppdatert", @@ -498,37 +499,37 @@ "asset_list_settings_subtitle": "Innstillinger for layout av fotorutenett", "asset_list_settings_title": "Fotorutenett", "asset_offline": "Fil utilgjengelig", - "asset_offline_description": "Dette elementet er offline. Immich kan ikke aksessere dets lokasjon. Vennlist påse at elementet er tilgijengelig og skann så biblioteket på nytt.", + "asset_offline_description": "Dette elementet er offline. Immich kan ikke aksessere dets lokasjon. Vennligst påse at elementet er tilgjengelig og skann så biblioteket på nytt.", "asset_restored_successfully": "Objekt(er) gjenopprettet", "asset_skipped": "Hoppet over", - "asset_skipped_in_trash": "I søppelbøtten", + "asset_skipped_in_trash": "I papirkurven", "asset_trashed": "Objekt slettet", - "asset_troubleshoot": "Feilsøk objekt", + "asset_troubleshoot": "Feilsøk element", "asset_uploaded": "Lastet opp", "asset_uploading": "Laster opp…", "asset_viewer_settings_subtitle": "Endre dine visningsinnstillinger for galleriet", "asset_viewer_settings_title": "Objektviser", "assets": "Filer", - "assets_added_count": "Lagt til {count, plural, one {# objekt} other {# objekter}}", - "assets_added_to_album_count": "Lagt til {count, plural, one {# objekter} other {# objekt}} i album", + "assets_added_count": "Lagt til {count, plural, one {# element} other {# elementer}}", + "assets_added_to_album_count": "Lagt til {count, plural, one {# elementer} other {# element}} i album", "assets_added_to_albums_count": "Lagt til {assetTotal, plural, one {# asset} other {# assets}} til {albumTotal, plural, one {# album} other {# albums}}", "assets_cannot_be_added_to_album_count": "{count, plural, one {Objektet} other {Objektene}} kan ikke legges til i albumet", "assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} kan ikke legges til i noen av albumene", "assets_count": "{count, plural, one {# fil} other {# filer}}", - "assets_deleted_permanently": "{count} objekt(er) slettet permanent", - "assets_deleted_permanently_from_server": "{count} objekt(er) slettet permanent fra Immich-serveren", + "assets_deleted_permanently": "{count} element(er) slettet permanent", + "assets_deleted_permanently_from_server": "{count} element(er) slettet permanent fra Immich-serveren", "assets_downloaded_failed": "{count, plural, one {Nedlasting av # fil - {error} fil feilet} other {Nedlastede # filer - {error} filer feilet}}", "assets_downloaded_successfully": "{count, plural, one {Nedlastet # fil vellykket} other {Nedlastede # filer vellykket}}", - "assets_moved_to_trash_count": "Flyttet {count, plural, one {# objekt} other {# objekter}} til søppel", - "assets_permanently_deleted_count": "Slettet {count, plural, one {# objekt} other {# objekter}} permanent", - "assets_removed_count": "Slettet {count, plural, one {# objekt} other {# objekter}}", - "assets_removed_permanently_from_device": "{count} objekt(er) slettet permanent fra enheten din", - "assets_restore_confirmation": "Er du sikker på at du vil gjenopprette alle slettede eiendeler? Denne handlingen kan ikke angres! Vær oppmerksom på at frakoblede ressurser ikke kan gjenopprettes på denne måten.", - "assets_restored_count": "Gjenopprettet {count, plural, one {# objekt} other {# objekter}}", - "assets_restored_successfully": "{count} objekt(er) gjenopprettet", - "assets_trashed": "{count} objekt(er) slettet", - "assets_trashed_count": "Kastet {count, plural, one {# objekt} other {# objekter}}", - "assets_trashed_from_server": "{count} objekt(er) slettet fra Immich serveren", + "assets_moved_to_trash_count": "Flyttet {count, plural, one {# element} other {# elementer}} til søppel", + "assets_permanently_deleted_count": "Slettet {count, plural, one {# element} other {# elementer}} permanent", + "assets_removed_count": "Slettet {count, plural, one {# element} other {# elementer}}", + "assets_removed_permanently_from_device": "{count} element(er) slettet permanent fra enheten din", + "assets_restore_confirmation": "Vil du virkelig gjenopprette alle slettede eiendeler? Denne handlingen kan ikke angres! Vær oppmerksom på at frakoblede ressurser ikke kan gjenopprettes på denne måten.", + "assets_restored_count": "Gjenopprettet {count, plural, one {# element} other {# elementer}}", + "assets_restored_successfully": "{count} element(er) gjenopprettet", + "assets_trashed": "{count} element(er) slettet", + "assets_trashed_count": "Kastet {count, plural, one {# element} other {# elementer}}", + "assets_trashed_from_server": "{count} element(er) slettet fra Immich serveren", "assets_were_part_of_album_count": "{count, plural, one {Objektet} other {Objektene}} er allerede lagt til i albumet", "assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} allerede inkludert i albumet", "authorized_devices": "Autoriserte enheter", @@ -547,15 +548,15 @@ "backup_album_selection_page_assets_scatter": "Objekter kan bli spredd over flere album. Album kan derfor bli inkludert eller ekskludert under sikkerhetskopieringen.", "backup_album_selection_page_select_albums": "Velg album", "backup_album_selection_page_selection_info": "Valginformasjon", - "backup_album_selection_page_total_assets": "Totalt antall unike objekter", + "backup_album_selection_page_total_assets": "Totalt antall unike elementer", "backup_albums_sync": "Synkronisering av sikkerhetskopialbum", "backup_all": "Alle", - "backup_background_service_backup_failed_message": "Sikkerhetskopiering av objekter feilet. Prøver på nytt…", + "backup_background_service_backup_failed_message": "Sikkerhetskopiering av elementer feilet. Prøver på nytt…", "backup_background_service_connection_failed_message": "Tilkobling til server feilet. Prøver på nytt…", "backup_background_service_current_upload_notification": "Laster opp {filename}", - "backup_background_service_default_notification": "Ser etter nye objekter…", - "backup_background_service_error_title": "Sikkerhetskopieringsfeil", - "backup_background_service_in_progress_notification": "Sikkerhetskopierer objekter…", + "backup_background_service_default_notification": "Ser etter nye elementer…", + "backup_background_service_error_title": "Feil under sikkerhetskopiering", + "backup_background_service_in_progress_notification": "Sikkerhetskopierer elementer…", "backup_background_service_upload_failure_notification": "Opplasting feilet {filename}", "backup_controller_page_albums": "Sikkerhetskopier albumer", "backup_controller_page_background_app_refresh_disabled_content": "Aktiver bakgrunnsoppdatering i Innstillinger > Generelt > Bakgrunnsoppdatering for å bruke sikkerhetskopiering i bakgrunnen.", @@ -567,8 +568,8 @@ "backup_controller_page_background_battery_info_title": "Batterioptimalisering", "backup_controller_page_background_charging": "Kun ved lading", "backup_controller_page_background_configure_error": "Konfigurering av bakgrunnstjenesten feilet", - "backup_controller_page_background_delay": "Forsink sikkerhetskopiering av nye objekter: {duration}", - "backup_controller_page_background_description": "Skru på bakgrunnstjenesten for å automatisk sikkerhetskopiere alle nye objekter uten å måtte åpne appen", + "backup_controller_page_background_delay": "Forsink sikkerhetskopiering av nye elementer: {duration}", + "backup_controller_page_background_description": "Skru på bakgrunnstjenesten for å automatisk sikkerhetskopiere alle nye elementer uten å måtte åpne appen", "backup_controller_page_background_is_off": "Automatisk sikkerhetskopiering i bakgrunnen er deaktivert", "backup_controller_page_background_is_on": "Automatisk sikkerhetskopiering i bakgrunnen er aktivert", "backup_controller_page_background_turn_off": "Skru av bakgrunnstjenesten", @@ -578,9 +579,9 @@ "backup_controller_page_backup_selected": "Valgte: ", "backup_controller_page_backup_sub": "Opplastede bilder og videoer", "backup_controller_page_created": "Opprettet: {date}", - "backup_controller_page_desc_backup": "Slå på sikkerhetskopiering i forgrunnen for automatisk å laste opp nye objekter til serveren når du åpner appen.", + "backup_controller_page_desc_backup": "Slå på sikkerhetskopiering i forgrunnen for automatisk å laste opp nye elementer til serveren når du åpner appen.", "backup_controller_page_excluded": "Ekskludert: ", - "backup_controller_page_failed": "Feilet ({count})", + "backup_controller_page_failed": "Mislyktes ({count})", "backup_controller_page_filename": "Filnavn: {filename} [{size}]", "backup_controller_page_id": "ID: {id}", "backup_controller_page_info": "Informasjon om sikkerhetskopi", @@ -597,8 +598,9 @@ "backup_controller_page_turn_off": "Slå av sikkerhetskopiering i forgrunnen", "backup_controller_page_turn_on": "Slå på sikkerhetskopiering i forgrunnen", "backup_controller_page_uploading_file_info": "Laster opp filinformasjon", - "backup_err_only_album": "Kan ikke fjerne det eneste albumet", - "backup_info_card_assets": "objekter", + "backup_err_only_album": "Kunne ikke fjerne det eneste albumet", + "backup_error_sync_failed": "Synkronisering feilet. Kunne ikke fortsette sikkerhetskopiering.", + "backup_info_card_assets": "elementer", "backup_manual_cancelled": "Avbrutt", "backup_manual_in_progress": "Opplasting er allerede i gang. Prøv igjen om litt", "backup_manual_success": "Vellykket", @@ -618,15 +620,15 @@ "bugs_and_feature_requests": "Feil og funksjonsforespørsler", "build": "Bygg", "build_image": "Lag Bilde", - "bulk_delete_duplicates_confirmation": "Er du sikker på at du vil slette {count, plural, one {# duplisert fil} other {# dupliserte filer}}? Dette vil beholde største filen fra hver gruppe og vil permanent slette alle andre duplikater. Du kan ikke angre denne handlingen!", - "bulk_keep_duplicates_confirmation": "Er du sikker på at du vil beholde {count, plural, one {# duplikat} other {# duplikater}}? Dette vil løse alle duplikatgrupper uten å slette noe.", - "bulk_trash_duplicates_confirmation": "Er du sikker på ønsker å slette {count, plural, one {# duplisert objekt} other {# dupliserte objekter}}? Dette vil beholde største filen fra hver gruppe, samt slette alle andre duplikater.", + "bulk_delete_duplicates_confirmation": "Vil du virkelig slette {count, plural, one {# duplisert fil} other {# dupliserte filer}}? Dette vil beholde største filen fra hver gruppe og vil permanent slette alle andre duplikater. Du kan ikke angre denne handlingen!", + "bulk_keep_duplicates_confirmation": "Vil du virkelig beholde {count, plural, one {# duplikat} other {# duplikater}}? Dette vil løse alle duplikatgrupper uten å slette noe.", + "bulk_trash_duplicates_confirmation": "Vil du virkelig å slette {count, plural, one {# duplisert element} other {# dupliserte elementer}}? Dette vil beholde største filen fra hver gruppe, samt slette alle andre duplikater.", "buy": "Kjøp Immich", "cache_settings_clear_cache_button": "Tøm buffer", "cache_settings_clear_cache_button_title": "Tømmer app-ens buffer. Dette vil ha betydelig innvirkning på appens ytelse inntil bufferen er gjenoppbygd.", "cache_settings_duplicated_assets_clear_button": "TØM", "cache_settings_duplicated_assets_subtitle": "Bilder og videoer som er ignorert av app'en", - "cache_settings_duplicated_assets_title": "Dupliserte objekter ({count})", + "cache_settings_duplicated_assets_title": "Dupliserte elementer ({count})", "cache_settings_statistics_album": "Bibliotekminiatyrbilder", "cache_settings_statistics_full": "Originalbilder", "cache_settings_statistics_shared": "Delte albumminiatyrbilder", @@ -643,9 +645,9 @@ "cancel_search": "Avbryt søk", "canceled": "Avbrutt", "canceling": "Avbryter", - "cannot_merge_people": "Kan ikke slå sammen personer", + "cannot_merge_people": "Kunne ikke slå sammen personer", "cannot_undo_this_action": "Du kan ikke gjøre om denne handlingen!", - "cannot_update_the_description": "Kan ikke oppdatere beskrivelsen", + "cannot_update_the_description": "Kunne ikke oppdatere beskrivelsen", "cast": "Strøm", "cast_description": "Konfigurer tilgjengelige cast-destinasjoner", "change_date": "Endre dato", @@ -655,21 +657,21 @@ "change_location": "Endre sted", "change_name": "Endre navn", "change_name_successfully": "Navneendring vellykket", - "change_password": "Endre Passord", + "change_password": "Endre passord", "change_password_description": "Dette er enten første gang du logger inn i systemet, eller det har blitt gjort en forespørsel om å endre passordet ditt. Vennligst skriv inn det nye passordet nedenfor.", "change_password_form_confirm_password": "Bekreft passord", "change_password_form_description": "Hei {name}!\n\nDette er enten første gang du logger på systemet, eller det er sendt en forespørsel om å endre passordet ditt. Vennligst skriv inn det nye passordet nedenfor.", "change_password_form_new_password": "Nytt passord", "change_password_form_password_mismatch": "Passordene stemmer ikke", "change_password_form_reenter_new_password": "Skriv nytt passord igjen", - "change_pin_code": "Endre PIN kode", + "change_pin_code": "Endre PIN-kode", "change_your_password": "Endre passordet ditt", "changed_visibility_successfully": "Endret synlighet vellykket", "charging": "Lading", "charging_requirement_mobile_backup": "Bakgrunnsbackup krever at enheten lader", - "check_corrupt_asset_backup": "Sjekk etter korrupte backupobjekter", + "check_corrupt_asset_backup": "Sjekk etter korrupte backupelementer", "check_corrupt_asset_backup_button": "Utfør sjekk", - "check_corrupt_asset_backup_description": "Kjør denne sjekken kun over Wi-Fi og når alle objekter har blitt lastet opp. Denne sjekken kan ta noen minutter.", + "check_corrupt_asset_backup_description": "Kjør denne sjekken kun over Wi-Fi og når alle elementer har blitt lastet opp. Denne sjekken kan ta noen minutter.", "check_logs": "Sjekk Logger", "choose_matching_people_to_merge": "Velg personer som skal slås sammen", "city": "By", @@ -702,8 +704,8 @@ "completed": "Fullført", "confirm": "Bekreft", "confirm_admin_password": "Bekreft administratorpassord", - "confirm_delete_face": "Er du sikker på at du vil slette {name} sitt ansikt fra ativia?", - "confirm_delete_shared_link": "Er du sikker på at du vil slette denne delte lenken?", + "confirm_delete_face": "Vil du virkelig slette {name} sitt ansikt fra ativia?", + "confirm_delete_shared_link": "Vil du virkelig slette denne delte lenken?", "confirm_keep_this_delete_others": "Alle andre ressurser i denne stabelen vil bli slettet bortsett fra denne ressursen. Er du sikker på at du vil fortsette?", "confirm_new_pin_code": "Bekreft ny PIN kode", "confirm_password": "Bekreft passord", @@ -721,7 +723,7 @@ "control_bottom_app_bar_edit_time": "Endre Dato og tid", "control_bottom_app_bar_share_link": "Del Lenke", "control_bottom_app_bar_share_to": "Del til", - "control_bottom_app_bar_trash_from_immich": "Flytt til søppelkasse", + "control_bottom_app_bar_trash_from_immich": "Flytt til papirkurv", "copied_image_to_clipboard": "Bildet er kopiert til utklippstavlen.", "copied_to_clipboard": "Kopiert til utklippstavlen!", "copy_error": "Kopi feil", @@ -736,9 +738,9 @@ "covers": "Omslag", "create": "Opprett", "create_album": "Opprett album", - "create_album_page_untitled": "Uten navn", + "create_album_page_untitled": "Navnløst", "create_library": "Opprett Bibliotek", - "create_link": "Opprett link", + "create_link": "Opprett lenke", "create_link_to_share": "Opprett delelink", "create_link_to_share_description": "La alle med lenken se de(t) valgte bildet/bildene", "create_new": "LAG NY", @@ -747,8 +749,8 @@ "create_new_user": "Opprett ny bruker", "create_shared_album_page_share_add_assets": "LEGG TIL OBJEKTER", "create_shared_album_page_share_select_photos": "Velg bilder", - "create_shared_link": "Opprett delt link", - "create_tag": "Lag tag", + "create_shared_link": "Opprett delt lenke", + "create_tag": "Lag merkelapp", "create_tag_description": "Lag en ny tag. For undertag, vennligst fullfør hele stien til taggen, inkludert forovervendt skråstrek.", "create_user": "Opprett Bruker", "created": "Opprettet", @@ -782,23 +784,23 @@ "default_locale": "Standard språkinnstilling", "default_locale_description": "Formater datoer og tall basert på nettleserens språkinnstilling", "delete": "Slett", - "delete_action_confirmation_message": "Er du sikker på at du vil slette dette objektet? Dette vil flytte objektet til søppelkassen og vil gi deg beskjed om du vil slette det lokalt", + "delete_action_confirmation_message": "Vil du virkelig slette dette elementet? Dette vil flytte elementet til papirkurvn og vil gi deg beskjed om du vil slette det lokalt", "delete_action_prompt": "{count} slettet", "delete_album": "Slett album", - "delete_api_key_prompt": "Er du sikker på at du vil slette denne API-nøkkelen?", - "delete_dialog_alert": "Disse objektene vil bli slettet permanent fra Immich og fra enheten din", - "delete_dialog_alert_local": "Disse objektene vil bli permanent slettet fra enheten din, men vil fortsatt være tilgjengelige fra Immich serveren", - "delete_dialog_alert_local_non_backed_up": "Noen av objektene er ikke sikkerhetskopiert til Immich og vil bli permanent fjernet fra enheten din", - "delete_dialog_alert_remote": "Disse objektene vil bli permanent slettet fra Immich serveren", + "delete_api_key_prompt": "Vil du virkelig slette denne API-nøkkelen?", + "delete_dialog_alert": "Disse elementene vil bli slettet permanent fra Immich og fra enheten din", + "delete_dialog_alert_local": "Disse elementene vil bli permanent slettet fra enheten din, men vil fortsatt være tilgjengelige fra Immich serveren", + "delete_dialog_alert_local_non_backed_up": "Noen av elementene er ikke sikkerhetskopiert til Immich og vil bli permanent fjernet fra enheten din", + "delete_dialog_alert_remote": "Disse elementene vil bli permanent slettet fra Immich serveren", "delete_dialog_ok_force": "Slett uansett", "delete_dialog_title": "Slett permanent", - "delete_duplicates_confirmation": "Er du sikker på at du vil slette disse duplikatene permanent?", + "delete_duplicates_confirmation": "Vil du virkelig slette disse duplikatene permanent?", "delete_face": "Slett ansik", "delete_key": "Slett nøkkel", "delete_library": "Slett bibliotek", "delete_link": "Slett lenke", "delete_local_action_prompt": "{count} slettet lokalt", - "delete_local_dialog_ok_backed_up_only": "Slett kun sikkerhetskopierte objekter", + "delete_local_dialog_ok_backed_up_only": "Slett kun sikkerhetskopierte elementer", "delete_local_dialog_ok_force": "Slett uansett", "delete_others": "Slett andre", "delete_permanently": "Slett permanent", @@ -806,7 +808,7 @@ "delete_shared_link": "Slett delt lenke", "delete_shared_link_dialog_title": "Slett delt link", "delete_tag": "Slett tag", - "delete_tag_confirmation_prompt": "Er du sikker på at du vil slette {tagName} tag?", + "delete_tag_confirmation_prompt": "Vil du virkelig slette {tagName} tag?", "delete_user": "Slett bruker", "deleted_shared_link": "Slettet delt lenke", "deletes_missing_assets": "Slett eiendeler som mangler fra disk", @@ -831,7 +833,7 @@ "documentation": "Dokumentasjon", "done": "Ferdig", "download": "Last ned", - "download_action_prompt": "Laster ned {count} objekter", + "download_action_prompt": "Laster ned {count} elementer", "download_canceled": "Nedlasting avbrutt", "download_complete": "Nedlasting fullført", "download_enqueue": "Nedlasting satt i kø", @@ -890,7 +892,7 @@ "email_notifications": "Epostvarsler", "empty_folder": "Denne mappen er tom", "empty_trash": "Tøm papirkurv", - "empty_trash_confirmation": "Er du sikker på at du vil tømme søppelbøtta? Dette vil slette alle filene i søppelbøtta permanent fra Immich.\nDu kan ikke angre denne handlingen!", + "empty_trash_confirmation": "Vil du virkelig Tømme søppelbøtta? Dette vil slette alle filene i søppelbøtta permanent fra Immich.\nDu kan ikke angre denne handlingen!", "enable": "Aktivere", "enable_backup": "Aktiver backup", "enable_biometric_auth_description": "Skriv inn PINkoden for å aktivere biometrisk autentisering", @@ -901,7 +903,7 @@ "enter_your_pin_code": "Skriv inn din PIN kode", "enter_your_pin_code_subtitle": "Skriv inn din PIN kode for å få tilgang til låst mappe", "error": "Feil", - "error_change_sort_album": "Feilet ved endring av sorteringsrekkefølge på albumer", + "error_change_sort_album": "Mislyktes ved endring av sorteringsrekkefølge på albumer", "error_delete_face": "Feil ved sletting av ansikt fra aktivia", "error_getting_places": "Feil ved henting av steder", "error_loading_image": "Feil ved lasting av bilde", @@ -910,16 +912,16 @@ "error_tag_face_bounding_box": "Feil ved merking av ansikt - klarte ikke å få koordinatene på omrisset", "error_title": "Feil - Noe gikk galt", "errors": { - "cannot_navigate_next_asset": "Kan ikke navigere til neste fil", - "cannot_navigate_previous_asset": "Kan ikke navigere til forrige fil", - "cant_apply_changes": "Kan ikke legge til endringene", - "cant_change_activity": "Kan ikke {enabled, select, true {disable} other {enable}} aktivitet", - "cant_change_asset_favorite": "Kan ikke endre favoritt til filen", - "cant_change_metadata_assets_count": "Kan ikke endre metadata for {count, plural, one {# objekt} other {# objekter}}", - "cant_get_faces": "Kan ikke finne ansikter", - "cant_get_number_of_comments": "Kan ikke hente antall kommentarer", - "cant_search_people": "Kan ikke søke etter mennesker", - "cant_search_places": "Kan ikke søke etter plasser", + "cannot_navigate_next_asset": "Kunne ikke navigere til neste fil", + "cannot_navigate_previous_asset": "Kunne ikke navigere til forrige fil", + "cant_apply_changes": "Kunne ikke legge til endringene", + "cant_change_activity": "Kunne ikke {enabled, select, true {disable} other {enable}} aktivitet", + "cant_change_asset_favorite": "Kunne ikke endre favoritt til filen", + "cant_change_metadata_assets_count": "Kunne ikke endre metadata for {count, plural, one {# element} other {# elementer}}", + "cant_get_faces": "Kunne ikke finne ansikter", + "cant_get_number_of_comments": "Kunne ikke hente antall kommentarer", + "cant_search_people": "Kunne ikke søke etter mennesker", + "cant_search_places": "Kunne ikke søke etter plasser", "error_adding_assets_to_album": "Feil med å legge til bilder til album", "error_adding_users_to_album": "Feil, kan ikke legge til brukere til album", "error_deleting_shared_user": "Feil med å slette delt bruker", @@ -930,17 +932,17 @@ "exclusion_pattern_already_exists": "Dette eksklusjonsmønsteret eksisterer allerede.", "failed_to_create_album": "Feil med å lage album", "failed_to_create_shared_link": "Feil med å lage delt lenke", - "failed_to_edit_shared_link": "Feilet med å redigere delt lenke", - "failed_to_get_people": "Feilet med å finne mennesker", - "failed_to_keep_this_delete_others": "Feilet med å beholde dette bilde og slette de andre", - "failed_to_load_asset": "Feilet med å laste bilder", - "failed_to_load_assets": "Feilet med å laste bilde", + "failed_to_edit_shared_link": "Mislyktes med å redigere delt lenke", + "failed_to_get_people": "Mislyktes med å finne mennesker", + "failed_to_keep_this_delete_others": "Mislyktes med å beholde dette bilde og slette de andre", + "failed_to_load_asset": "Mislyktes med å laste bilder", + "failed_to_load_assets": "Mislyktes med å laste bilde", "failed_to_load_notifications": "Kunne ikke laste inn varsler", "failed_to_load_people": "Feilen med å laste mennesker", - "failed_to_remove_product_key": "Feilet med å ta bort produkt nøkkel", + "failed_to_remove_product_key": "Mislyktes med å ta bort produkt nøkkel", "failed_to_reset_pin_code": "Kunne ikke tilbakestille PIN-koden", - "failed_to_stack_assets": "Feilet med å stable bilder", - "failed_to_unstack_assets": "Feilet med å avstable bilder", + "failed_to_stack_assets": "Mislyktes med å stable bilder", + "failed_to_unstack_assets": "Mislyktes med å avstable bilder", "failed_to_update_notification_status": "Kunne ikke oppdatere varslingsstatusen", "import_path_already_exists": "Denne importstien eksisterer allerede.", "incorrect_email_or_password": "Feil epost eller passord", @@ -948,87 +950,87 @@ "profile_picture_transparent_pixels": "Profil bilde kan ikke ha gjennomsiktige piksler. Vennligst zoom inn og/eller flytt bilde.", "quota_higher_than_disk_size": "Du har satt kvoten større enn diskstørrelsen", "something_went_wrong": "Noe gikk galt", - "unable_to_add_album_users": "Kan ikke legge til brukere i albumet", - "unable_to_add_assets_to_shared_link": "Kan ikke legge til bilder til delt lenke", - "unable_to_add_comment": "Kan ikke legge til kommentar", - "unable_to_add_exclusion_pattern": "Kan ikke legge til eksklusjonsmønster", - "unable_to_add_import_path": "Kan ikke legge til importsti", - "unable_to_add_partners": "Kan ikke legge til partnere", - "unable_to_add_remove_archive": "Kan ikke {archived, select, true {fjerne objekt fra} other {flytte objekt til}} arkivet", - "unable_to_add_remove_favorites": "Kan ikke {favorite, select, true {legge til objekt til} other {fjerne objekt fra}} favoritter", - "unable_to_archive_unarchive": "Kan ikke {archived, select, true {archive} other {unarchive}}", - "unable_to_change_album_user_role": "Kan ikke endre brukerens rolle i albumet", - "unable_to_change_date": "Kan ikke endre dato", + "unable_to_add_album_users": "Kunne ikke legge til brukere i albumet", + "unable_to_add_assets_to_shared_link": "Kunne ikke legge til bilder til delt lenke", + "unable_to_add_comment": "Kunne ikke legge til kommentar", + "unable_to_add_exclusion_pattern": "Kunne ikke legge til eksklusjonsmønster", + "unable_to_add_import_path": "Kunne ikke legge til importsti", + "unable_to_add_partners": "Kunne ikke legge til partnere", + "unable_to_add_remove_archive": "Kunne ikke {archived, select, true {fjerne element fra} other {flytte element til}} arkivet", + "unable_to_add_remove_favorites": "Kunne ikke {favorite, select, true {legge til element til} other {fjerne element fra}} favoritter", + "unable_to_archive_unarchive": "Kunne ikke {archived, select, true {archive} other {unarchive}}", + "unable_to_change_album_user_role": "Kunne ikke endre brukerens rolle i albumet", + "unable_to_change_date": "Kunne ikke endre dato", "unable_to_change_description": "Klarte ikke å oppdatere beskrivelse", - "unable_to_change_favorite": "Kan ikke endre favoritt for bildet", - "unable_to_change_location": "Kan ikke endre plassering", - "unable_to_change_password": "Kan ikke endre passord", - "unable_to_change_visibility": "Kan ikke endre synlighet for {count, plural, one {# person} other {# people}}", + "unable_to_change_favorite": "Kunne ikke endre favoritt for bildet", + "unable_to_change_location": "Kunne ikke endre plassering", + "unable_to_change_password": "Kunne ikke endre passord", + "unable_to_change_visibility": "Kunne ikke endre synlighet for {count, plural, one {# person} other {# people}}", "unable_to_complete_oauth_login": "Kunne ikke fullføre OAuth innlogging", - "unable_to_connect": "Kan ikke koble til", - "unable_to_copy_to_clipboard": "Kan ikke kopiere til utklippstavlen, sørg for at du får tilgang til siden via HTTPS", - "unable_to_create_admin_account": "Kan ikke opprette administrator bruker", - "unable_to_create_api_key": "Kan ikke opprette en ny API-nøkkel", - "unable_to_create_library": "Kan ikke opprette bibliotek", - "unable_to_create_user": "Kan ikke opprette bruker", - "unable_to_delete_album": "Kan ikke slette album", - "unable_to_delete_asset": "Kan ikke slette filen", + "unable_to_connect": "Kunne ikke koble til", + "unable_to_copy_to_clipboard": "Kunne ikke kopiere til utklippstavlen, sørg for at du får tilgang til siden via HTTPS", + "unable_to_create_admin_account": "Kunne ikke opprette administrator bruker", + "unable_to_create_api_key": "Kunne ikke opprette en ny API-nøkkel", + "unable_to_create_library": "Kunne ikke opprette bibliotek", + "unable_to_create_user": "Kunne ikke opprette bruker", + "unable_to_delete_album": "Kunne ikke slette album", + "unable_to_delete_asset": "Kunne ikke slette filen", "unable_to_delete_assets": "Feil med å slette bilde", - "unable_to_delete_exclusion_pattern": "Kan ikke slette eksklusjonsmønster", - "unable_to_delete_import_path": "Kan ikke slette importsti", - "unable_to_delete_shared_link": "Kan ikke slette delt lenke", - "unable_to_delete_user": "Kan ikke slette bruker", - "unable_to_download_files": "Kan ikke laste ned filer", - "unable_to_edit_exclusion_pattern": "Kan ikke redigere eksklusjonsmønster", - "unable_to_edit_import_path": "Kan ikke redigere importsti", - "unable_to_empty_trash": "Kan ikke tømme papirkurven", - "unable_to_enter_fullscreen": "Kan ikke gå inn i fullskjerm", - "unable_to_exit_fullscreen": "Kan ikke gå ut fra fullskjerm", - "unable_to_get_comments_number": "Kan ikke hente antall kommentarer", - "unable_to_get_shared_link": "Kan ikke hente delt lenke", - "unable_to_hide_person": "Kan ikke skjule person", - "unable_to_link_motion_video": "Kan ikke lenke bevegelig video", - "unable_to_link_oauth_account": "Kan ikke lenke til OAuth-konto", - "unable_to_log_out_all_devices": "Kan ikke logge ut fra alle enheter", - "unable_to_log_out_device": "Kan ikke logge ut av enhet", - "unable_to_login_with_oauth": "Kan ikke logge inn med OAuth", - "unable_to_play_video": "Kan ikke spille av video", + "unable_to_delete_exclusion_pattern": "Kunne ikke slette eksklusjonsmønster", + "unable_to_delete_import_path": "Kunne ikke slette importsti", + "unable_to_delete_shared_link": "Kunne ikke slette delt lenke", + "unable_to_delete_user": "Kunne ikke slette bruker", + "unable_to_download_files": "Kunne ikke laste ned filer", + "unable_to_edit_exclusion_pattern": "Kunne ikke redigere eksklusjonsmønster", + "unable_to_edit_import_path": "Kunne ikke redigere importsti", + "unable_to_empty_trash": "Kunne ikke Tømme papirkurven", + "unable_to_enter_fullscreen": "Kunne ikke gå inn i fullskjerm", + "unable_to_exit_fullscreen": "Kunne ikke gå ut fra fullskjerm", + "unable_to_get_comments_number": "Kunne ikke hente antall kommentarer", + "unable_to_get_shared_link": "Kunne ikke hente delt lenke", + "unable_to_hide_person": "Kunne ikke skjule person", + "unable_to_link_motion_video": "Kunne ikke lenke bevegelig video", + "unable_to_link_oauth_account": "Kunne ikke lenke til OAuth-konto", + "unable_to_log_out_all_devices": "Kunne ikke logge ut fra alle enheter", + "unable_to_log_out_device": "Kunne ikke logge ut av enhet", + "unable_to_login_with_oauth": "Kunne ikke logge inn med OAuth", + "unable_to_play_video": "Kunne ikke spille av video", "unable_to_reassign_assets_existing_person": "Kunne ikke endre bruker på bildene til {name, select, null {an existing person} other {{name}}}", "unable_to_reassign_assets_new_person": "Kunne ikke tildele bildene til en ny person", - "unable_to_refresh_user": "Kan ikke oppdatere bruker", - "unable_to_remove_album_users": "Kan ikke fjerne brukere fra album", - "unable_to_remove_api_key": "Kan ikke fjerne API-nøkkel", + "unable_to_refresh_user": "Kunne ikke oppdatere bruker", + "unable_to_remove_album_users": "Kunne ikke fjerne brukere fra album", + "unable_to_remove_api_key": "Kunne ikke fjerne API-nøkkel", "unable_to_remove_assets_from_shared_link": "Kunne ikke fjerne bilder fra delt lenke", - "unable_to_remove_library": "Kan ikke fjerne bibliotek", - "unable_to_remove_partner": "Kan ikke fjerne partner", - "unable_to_remove_reaction": "Kan ikke fjerne reaksjon", - "unable_to_reset_password": "Kan ikke tilbakestille passord", + "unable_to_remove_library": "Kunne ikke fjerne bibliotek", + "unable_to_remove_partner": "Kunne ikke fjerne partner", + "unable_to_remove_reaction": "Kunne ikke fjerne reaksjon", + "unable_to_reset_password": "Kunne ikke tilbakestille passord", "unable_to_reset_pin_code": "Klarte ikke å resette PIN kode", - "unable_to_resolve_duplicate": "Kan ikke løse duplikat", - "unable_to_restore_assets": "Kan ikke gjenopprette filer", - "unable_to_restore_trash": "Kan ikke gjenopprette papirkurven", - "unable_to_restore_user": "Kan ikke gjenopprette bruker", - "unable_to_save_album": "Kan ikke lagre album", - "unable_to_save_api_key": "Kan ikke lagre API-nøkkel", + "unable_to_resolve_duplicate": "Kunne ikke løse duplikat", + "unable_to_restore_assets": "Kunne ikke gjenopprette filer", + "unable_to_restore_trash": "Kunne ikke gjenopprette papirkurven", + "unable_to_restore_user": "Kunne ikke gjenopprette bruker", + "unable_to_save_album": "Kunne ikke lagre album", + "unable_to_save_api_key": "Kunne ikke lagre API-nøkkel", "unable_to_save_date_of_birth": "Kunne ikke lagre bursdag", - "unable_to_save_name": "Kan ikke lagre navn", - "unable_to_save_profile": "Kan ikke lagre profil", - "unable_to_save_settings": "Kan ikke lagre instillinger", - "unable_to_scan_libraries": "Kan ikke skanne biblioteker", - "unable_to_scan_library": "Kan ikke skanne bibliotek", + "unable_to_save_name": "Kunne ikke lagre navn", + "unable_to_save_profile": "Kunne ikke lagre profil", + "unable_to_save_settings": "Kunne ikke lagre instillinger", + "unable_to_scan_libraries": "Kunne ikke skanne biblioteker", + "unable_to_scan_library": "Kunne ikke skanne bibliotek", "unable_to_set_feature_photo": "Kunne ikke sette funksjonsbilde", - "unable_to_set_profile_picture": "Kan ikke sette profilbilde", - "unable_to_submit_job": "Kan ikke sende inn jobb", - "unable_to_trash_asset": "Kan ikke flytte filen til papirkurven", - "unable_to_unlink_account": "Kan ikke fjerne kobling til konto", + "unable_to_set_profile_picture": "Kunne ikke sette profilbilde", + "unable_to_submit_job": "Kunne ikke sende inn jobb", + "unable_to_trash_asset": "Kunne ikke flytte filen til papirkurven", + "unable_to_unlink_account": "Kunne ikke fjerne kobling til konto", "unable_to_unlink_motion_video": "Kunne ikke ta på kobling på bevegelig video", "unable_to_update_album_cover": "Kunne ikke oppdatere album bilde", "unable_to_update_album_info": "Kunne ikke oppdatere informasjon i album", - "unable_to_update_library": "Kan ikke oppdatere bibliotek", - "unable_to_update_location": "Kan ikke oppdatere plassering", - "unable_to_update_settings": "Kan ikke oppdatere innstillinger", - "unable_to_update_timeline_display_status": "Kan ikke oppdatere visningsstatus for tidslinje", - "unable_to_update_user": "Kan ikke oppdatere bruker", + "unable_to_update_library": "Kunne ikke oppdatere bibliotek", + "unable_to_update_location": "Kunne ikke oppdatere plassering", + "unable_to_update_settings": "Kunne ikke oppdatere innstillinger", + "unable_to_update_timeline_display_status": "Kunne ikke oppdatere visningsstatus for tidslinje", + "unable_to_update_user": "Kunne ikke oppdatere bruker", "unable_to_upload_file": "Kunne ikke laste opp fil" }, "exif": "EXIF", @@ -1059,15 +1061,15 @@ "external_network": "Eksternt nettverk", "external_network_sheet_info": "Når du ikke er på det foretrukne Wi-Fi-nettverket, vil appen koble seg til serveren via den første av URL-ene nedenfor den kan nå, fra topp til bunn", "face_unassigned": "Ikke tilordnet", - "failed": "Feilet", + "failed": "Mislyktes", "failed_to_authenticate": "Kunne ikke autentisere", - "failed_to_load_assets": "Feilet med å laste fil", + "failed_to_load_assets": "Mislyktes med å laste fil", "failed_to_load_folder": "Kunne ikke laste inn mappe", "favorite": "Favoritt", "favorite_action_prompt": "{count} lagt til i favoritter", "favorite_or_unfavorite_photo": "Merk som favoritt eller fjern som favoritt", "favorites": "Favoritter", - "favorites_page_no_favorites": "Ingen favorittobjekter funnet", + "favorites_page_no_favorites": "Ingen favorittelementer funnet", "feature_photo_updated": "Fremhevet bilde oppdatert", "features": "Funksjoner", "features_in_development": "Funksjoner under utvikling", @@ -1091,7 +1093,7 @@ "gcast_enabled": "Google Cast", "gcast_enabled_description": "Denne funksjonen laster eksterne ressurser fra Google for å fungere.", "general": "Generelt", - "geolocation_instruction_location": "Klikk på et objekt med GPS-koordinater for å bruke posisjonen, eller velg en posisjon direkte fra kartet", + "geolocation_instruction_location": "Klikk på et element med GPS-koordinater for å bruke posisjonen, eller velg en posisjon direkte fra kartet", "get_help": "Få Hjelp", "get_wifiname_error": "Kunne ikke hente Wi-Fi-navnet. Sørg for at du har gitt de nødvendige tillatelsene og er koblet til et Wi-Fi-nettverk", "getting_started": "Kom i gang", @@ -1110,8 +1112,8 @@ "haptic_feedback_switch": "Aktivert haptisk tilbakemelding", "haptic_feedback_title": "Haptisk tilbakemelding", "has_quota": "Kvote", - "hash_asset": "Hash objekter", - "hashed_assets": "Hashede objekter", + "hash_asset": "Hash elementer", + "hashed_assets": "Hashede elementer", "hashing": "Hasher", "header_settings_add_header_tip": "Legg til header", "header_settings_field_validator_msg": "Verdi kan ikke være null", @@ -1126,22 +1128,22 @@ "hide_password": "Skjul passord", "hide_person": "Skjul person", "hide_unnamed_people": "Skjul mennesker uten navn", - "home_page_add_to_album_conflicts": "Lagt til {added} objekter til album {album}. {failed} objekter er allerede i albumet.", - "home_page_add_to_album_err_local": "Kan ikke legge til lokale objekter til album enda, hopper over", - "home_page_add_to_album_success": "Lagt til {added} objekter til album {album}.", - "home_page_album_err_partner": "Kan ikke legge til partnerobjekter i album enda, hopper over", - "home_page_archive_err_local": "Kan ikke arkivere lokale objekter enda, hopper over", - "home_page_archive_err_partner": "Kan ikke arkivere partnerobjekter, hopper over", + "home_page_add_to_album_conflicts": "Lagt til {added} elementer til album {album}. {failed} elementer er allerede i albumet.", + "home_page_add_to_album_err_local": "Kunne ikke legge til lokale elementer til album enda, hopper over", + "home_page_add_to_album_success": "Lagt til {added} elementer til album {album}.", + "home_page_album_err_partner": "Kunne ikke legge til partnerelementer i album enda, hopper over", + "home_page_archive_err_local": "Kunne ikke arkivere lokale elementer enda, hopper over", + "home_page_archive_err_partner": "Kunne ikke arkivere partnerelementer, hopper over", "home_page_building_timeline": "Genererer tidslinjen", - "home_page_delete_err_partner": "Kan ikke slette partnerobjekter, hopper over", - "home_page_delete_remote_err_local": "Lokale objekter i fjernslettingsvalgene, hopper over", - "home_page_favorite_err_local": "Kan ikke sette favoritt på lokale objekter enda, hopper over", - "home_page_favorite_err_partner": "Kan ikke merke partnerobjekter som favoritt enda, hopper over", + "home_page_delete_err_partner": "Kunne ikke slette partnerelementer, hopper over", + "home_page_delete_remote_err_local": "Lokale elementer i fjernslettingsvalgene, hopper over", + "home_page_favorite_err_local": "Kunne ikke sette favoritt på lokale elementer enda, hopper over", + "home_page_favorite_err_partner": "Kunne ikke merke partnerelementer som favoritt enda, hopper over", "home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer", - "home_page_locked_error_local": "Kunne ikke flytte lokale objekter til låst mappe, hopper over", - "home_page_locked_error_partner": "Kunne ikke flytte partner objekter til låst mappe, hopper over", - "home_page_share_err_local": "Kan ikke dele lokale objekter via link, hopper over", - "home_page_upload_err_limit": "Maksimalt 30 objekter kan lastes opp om gangen, hopper over", + "home_page_locked_error_local": "Kunne ikke flytte lokale elementer til låst mappe, hopper over", + "home_page_locked_error_partner": "Kunne ikke flytte partner elementer til låst mappe, hopper over", + "home_page_share_err_local": "Kunne ikke dele lokale elementer via link, hopper over", + "home_page_upload_err_limit": "Maksimalt 30 elementer kan lastes opp om gangen, hopper over", "host": "Vert", "hour": "Time", "hours": "Timer", @@ -1197,7 +1199,7 @@ "keep": "Behold", "keep_all": "Behold alle", "keep_this_delete_others": "Behold denne, slett de andre", - "kept_this_deleted_others": "Behold denne filen og slett {count, plural, one {# objekt} other {# objekter}}", + "kept_this_deleted_others": "Behold denne filen og slett {count, plural, one {# element} other {# elementer}}", "keyboard_shortcuts": "Tastatursnarveier", "language": "Språk", "language_no_results_subtitle": "Prøv å endre søkeord", @@ -1218,7 +1220,7 @@ "library_options": "Bibliotekalternativer", "library_page_device_albums": "Albumer på enheten", "library_page_new_album": "Nytt album", - "library_page_sort_asset_count": "Antall objekter", + "library_page_sort_asset_count": "Antall elementer", "library_page_sort_created": "Nylig opplastet", "library_page_sort_last_modified": "Sist endret", "library_page_sort_title": "Albumtittel", @@ -1233,8 +1235,8 @@ "loading": "Laster", "loading_search_results_failed": "Klarte ikke å laste inn søkeresultater", "local": "Lokal", - "local_asset_cast_failed": "Kan ikke caste et bilde som ikke er lastet opp til serveren", - "local_assets": "Lokale objekter", + "local_asset_cast_failed": "Kunne ikke caste et bilde som ikke er lastet opp til serveren", + "local_assets": "Lokale elementer", "local_media_summary": "Oppsummering av lokale media", "local_network": "Lokalt nettverk", "local_network_sheet_info": "Appen vil koble til serveren via denne URL-en når du bruker det angitte Wi-Fi-nettverket", @@ -1272,12 +1274,12 @@ "login_form_password_hint": "passord", "login_form_save_login": "Forbli innlogget", "login_form_server_empty": "Skriv inn en server-URL.", - "login_form_server_error": "Kan ikke koble til server.", + "login_form_server_error": "Kunne ikke koble til server.", "login_has_been_disabled": "Innlogging har blitt deaktivert.", "login_password_changed_error": "Det skjedde en feil ved oppdatering av passordet", "login_password_changed_success": "Passord oppdatert", - "logout_all_device_confirmation": "Er du sikker på at du vil logge ut av alle enheter?", - "logout_this_device_confirmation": "Er du sikker på at du vil logge ut av denne enheten?", + "logout_all_device_confirmation": "Vil du virkelig logge ut av alle enheter?", + "logout_this_device_confirmation": "Vil du virkelig logge ut av denne enheten?", "logs": "Logger", "longitude": "Lengdegrad", "look": "Se", @@ -1296,14 +1298,14 @@ "manage_your_oauth_connection": "Administrer tilkoblingen din med OAuth", "map": "Kart", "map_assets_in_bounds": "{count, plural, =0 {Ingen bilder i dette området} one {# photo} other {# photos}}", - "map_cannot_get_user_location": "Kan ikke hente brukerlokasjon", + "map_cannot_get_user_location": "Kunne ikke hente brukerlokasjon", "map_location_dialog_yes": "Ja", "map_location_picker_page_use_location": "Bruk denne lokasjonen", - "map_location_service_disabled_content": "Lokasjonstjeneste må være aktivert for å vise objekter fra din nåværende lokasjon. Vil du aktivere det nå?", + "map_location_service_disabled_content": "Lokasjonstjeneste må være aktivert for å vise elementer fra din nåværende lokasjon. Vil du aktivere det nå?", "map_location_service_disabled_title": "Lokasjonstjeneste deaktivert", "map_marker_for_images": "Kart makeringer for bilder tatt i {city}, {country}", "map_marker_with_image": "Kartmarkør med bilde", - "map_no_location_permission_content": "Lokasjonstilgang er påkrevet for å vise objekter fra din nåværende lokasjon. Vil du tillate det nå?", + "map_no_location_permission_content": "Lokasjonstilgang er påkrevet for å vise elementer fra din nåværende lokasjon. Vil du tillate det nå?", "map_no_location_permission_title": "Lokasjonstilgang avvist", "map_settings": "Kartinnstillinger", "map_settings_dark_mode": "Mørk modus", @@ -1321,7 +1323,7 @@ "mark_as_read": "Merk som lest", "marked_all_as_read": "Merket alle som lest", "matches": "Samsvarende", - "matching_assets": "Matchende objekter", + "matching_assets": "Matchende elementer", "media_type": "Mediatype", "memories": "Minner", "memories_all_caught_up": "Alt utført", @@ -1351,11 +1353,11 @@ "move_to_lock_folder_action_prompt": "{count} lagt til i låst mappe", "move_to_locked_folder": "Flytt til låst mappe", "move_to_locked_folder_confirmation": "Disse bildene og videoene vil bli fjernet fra alle albumer, og kun tilgjengelige via den låste mappen", - "moved_to_archive": "Flyttet {count, plural, one {# objekt} other {# objekter}} til arkivet", - "moved_to_library": "Flyttet {count, plural, one {# objekt} other {# objekter}} til biblioteket", + "moved_to_archive": "Flyttet {count, plural, one {# element} other {# elementer}} til arkivet", + "moved_to_library": "Flyttet {count, plural, one {# element} other {# elementer}} til biblioteket", "moved_to_trash": "Flyttet til papirkurven", - "multiselect_grid_edit_date_time_err_read_only": "Kan ikke endre dato på objekt(er) med kun lese-rettigheter, hopper over", - "multiselect_grid_edit_gps_err_read_only": "Kan ikke endre lokasjon på objekt(er) med kun lese-rettigheter, hopper over", + "multiselect_grid_edit_date_time_err_read_only": "Kunne ikke endre dato på element(er) med kun lese-rettigheter, hopper over", + "multiselect_grid_edit_gps_err_read_only": "Kunne ikke endre lokasjon på element(er) med kun lese-rettigheter, hopper over", "mute_memories": "Demp minner", "my_albums": "Mine album", "name": "Navn", @@ -1385,22 +1387,22 @@ "no_albums_yet": "Det ser ut som om du ikke har noen album enda.", "no_archived_assets_message": "Arkiver bilder og videoer for å skjule dem fra visningen av bildene dine", "no_assets_message": "KLIKK FOR Å LASTE OPP DITT FØRSTE BILDE", - "no_assets_to_show": "Ingen objekter å vise", + "no_assets_to_show": "Ingen elementer å vise", "no_cast_devices_found": "Ingen caste-enheter oppdaget", - "no_checksum_local": "Ingen sjekksum tilgjengelig - Kan ikke hente lokale objekter", - "no_checksum_remote": "Ingen sjekksum tilgjengelig - Kan ikke hente eksterne objekter", + "no_checksum_local": "Ingen sjekksum tilgjengelig - Kunne ikke hente lokale elementer", + "no_checksum_remote": "Ingen sjekksum tilgjengelig - Kunne ikke hente eksterne elementer", "no_duplicates_found": "Ingen duplikater ble funnet.", "no_exif_info_available": "Ingen EXIF-informasjon tilgjengelig", "no_explore_results_message": "Last opp flere bilder for å utforske samlingen din.", "no_favorites_message": "Legg til favoritter for å finne dine beste bilder og videoer raskt", "no_libraries_message": "Opprett et eksternt bibliotek for å se bildene og videoene dine", - "no_local_assets_found": "Ingen lokale objekter funnet med denne sjekksummen", + "no_local_assets_found": "Ingen lokale elementer funnet med denne sjekksummen", "no_locked_photos_message": "Bilder og videoer i den låste mappen er skjult og vil ikke vises når du blar i biblioteket.", "no_name": "Ingen navn", "no_notifications": "Ingen varsler", "no_people_found": "Ingen samsvarende personer funnet", "no_places": "Ingen steder", - "no_remote_assets_found": "Ingen eksterne objekter funnet med denne sjekksummen", + "no_remote_assets_found": "Ingen eksterne elementer funnet med denne sjekksummen", "no_results": "Ingen resultater", "no_results_description": "Prøv et synonym eller mer generelt søkeord", "no_shared_albums_message": "Opprett et album for å dele bilder og videoer med personer i nettverket ditt", @@ -1446,7 +1448,7 @@ "original": "original", "other": "Annet", "other_devices": "Andre enheter", - "other_entities": "Andre objekter", + "other_entities": "Andre elementer", "other_variables": "Andre variabler", "owned": "Dine", "owner": "Eier", @@ -1486,10 +1488,10 @@ "permanent_deletion_warning": "Advarsel om permanent sletting", "permanent_deletion_warning_setting_description": "Vis en advarsel ved permanent sletting av filer", "permanently_delete": "Slett permanent", - "permanently_delete_assets_count": "Slett {count, plural, one {objekt} other {objekter}} permanent", - "permanently_delete_assets_prompt": "Er du sikker på at du vil permanent slette {count, plural, one {dette objektet?} other {disse # objektene?}} Dette vil også slette {count, plural, one {det fra dets} other {de fra deres}} album(er).", + "permanently_delete_assets_count": "Slett {count, plural, one {element} other {elementer}} permanent", + "permanently_delete_assets_prompt": "Vil du virkelig permanent slette {count, plural, one {dette elementet?} other {disse # elementene?}} Dette vil også slette {count, plural, one {det fra dets} other {de fra deres}} album(er).", "permanently_deleted_asset": "Filen har blitt permanent slettet", - "permanently_deleted_assets_count": "Permanent slett {count, plural, one {# objekt} other {# objekter}}", + "permanently_deleted_assets_count": "Permanent slett {count, plural, one {# element} other {# elementer}}", "permission": "Tillatelse", "permission_empty": "Dine tillatelser burde ikke være tomme", "permission_onboarding_back": "Tilbake", @@ -1562,7 +1564,7 @@ "purchase_button_reminder": "Påminn meg om 30 dager", "purchase_button_remove_key": "Ta bort produktnøkkel", "purchase_button_select": "Velg", - "purchase_failed_activation": "Feilet med å aktivere! Vennligst sjekk eposten for riktig produktnøkkel!", + "purchase_failed_activation": "Mislyktes med å aktivere! Vennligst sjekk eposten for riktig produktnøkkel!", "purchase_individual_description_1": "For en person", "purchase_individual_description_2": "Støttespiller status", "purchase_individual_title": "Individuell", @@ -1576,14 +1578,14 @@ "purchase_per_server": "For hver server", "purchase_per_user": "For hver bruker", "purchase_remove_product_key": "Ta bor Produktnøkkel", - "purchase_remove_product_key_prompt": "Er du sikker på at du vil ta bort produktnøkkelen?", + "purchase_remove_product_key_prompt": "Vil du virkelig ta bort produktnøkkelen?", "purchase_remove_server_product_key": "Ta bort Server Produktnøkkel", - "purchase_remove_server_product_key_prompt": "Er du sikker på at du vil ta bort Server Produktnøkkelen?", + "purchase_remove_server_product_key_prompt": "Vil du virkelig ta bort Server Produktnøkkelen?", "purchase_server_description_1": "For hele serveren", "purchase_server_description_2": "Støttespiller status", "purchase_server_title": "Server", "purchase_settings_server_activated": "Produktnøkkel for server er administrert av administratoren", - "query_asset_id": "Forespør objektID", + "query_asset_id": "Forespør elementID", "queue_status": "Kø {count}/{total}", "rating": "Stjernevurdering", "rating_clear": "Slett vurdering", @@ -1595,8 +1597,8 @@ "readonly_mode_enabled": "Skrivebeskyttet modus aktivert", "ready_for_upload": "Klar for opplasting", "reassign": "Tilordne på nytt", - "reassigned_assets_to_existing_person": "Flyttet {count, plural, one {# objekt} other {# objekter}} to {name, select, null {en eksisterende person} other {{name}}}", - "reassigned_assets_to_new_person": "Flyttet {count, plural, one {# objekt} other {# objekter}} til en ny person", + "reassigned_assets_to_existing_person": "Flyttet {count, plural, one {# element} other {# elementer}} to {name, select, null {en eksisterende person} other {{name}}}", + "reassigned_assets_to_new_person": "Flyttet {count, plural, one {# element} other {# elementer}} til en ny person", "reassing_hint": "Tilordne valgte eiendeler til en eksisterende person", "recent": "Nylig", "recent-albums": "Nylige album", @@ -1617,11 +1619,11 @@ "refreshing_metadata": "Oppdaterer matadata", "regenerating_thumbnails": "Regenererer miniatyrbilder", "remote": "Eksternt", - "remote_assets": "Eksterne objekter", + "remote_assets": "Eksterne elementer", "remote_media_summary": "Oppsummering av eksterne media", "remove": "Fjern", - "remove_assets_album_confirmation": "Er du sikker på at du fil slette {count, plural, one {# objekt} other {# objekter}} fra albumet?", - "remove_assets_shared_link_confirmation": "Er du sikker på at du vil slette {count, plural, one {# objekt} other {# objekter}} fra den delte lenken?", + "remove_assets_album_confirmation": "Er du sikker på at du fil slette {count, plural, one {# element} other {# elementer}} fra albumet?", + "remove_assets_shared_link_confirmation": "Vil du virkelig slette {count, plural, one {# element} other {# elementer}} fra den delte lenken?", "remove_assets_title": "Vil du fjerne eiendeler?", "remove_custom_date_range": "Fjern egendefinert datoperiode", "remove_deleted_assets": "Fjern fra frakoblede filer", @@ -1630,7 +1632,7 @@ "remove_from_favorites": "Fjern fra favoritter", "remove_from_lock_folder_action_prompt": "{count} fjernet fra låst mappe", "remove_from_locked_folder": "Fjern fra låst mappe", - "remove_from_locked_folder_confirmation": "Er du sikker på at du vil flytte disse bildene og videoene ut av den låste mappen? De vil bli synlige i biblioteket.", + "remove_from_locked_folder_confirmation": "Vil du virkelig flytte disse bildene og videoene ut av den låste mappen? De vil bli synlige i biblioteket.", "remove_from_shared_link": "Fjern fra delt lenke", "remove_memory": "Slett minne", "remove_photo_from_memory": "Slett bilde fra dette minne", @@ -1643,7 +1645,7 @@ "removed_from_favorites_count": "{count, plural, other {Removed #}} fra favoritter", "removed_memory": "Slettet minne", "removed_photo_from_memory": "Slettet bilde fra minne", - "removed_tagged_assets": "Fjern tag fra {count, plural, one {# objekt} other {# objekter}}", + "removed_tagged_assets": "Fjern tag fra {count, plural, one {# element} other {# elementer}}", "rename": "Gi nytt navn", "repair": "Reparer", "repair_no_results_message": "Usporrede og savnede filer vil vises her", @@ -1660,14 +1662,14 @@ "reset_pin_code_success": "PIN-koden er tilbakestilt", "reset_pin_code_with_password": "Du kan alltid tilbakestiller PIN-koden med passordet ditt", "reset_sqlite": "Reset SQLite Databasen", - "reset_sqlite_confirmation": "Er du sikker på at du vil resette SQLite databasen? Du blir nødt til å logge ut og inn igjen for å resynkronisere data", + "reset_sqlite_confirmation": "Vil du virkelig resette SQLite databasen? Du blir nødt til å logge ut og inn igjen for å resynkronisere data", "reset_sqlite_success": "Vellykket resetting av SQLite databasen", "reset_to_default": "Tilbakestill til standard", "resolve_duplicates": "Løs duplikater", "resolved_all_duplicates": "Løste alle duplikater", "restore": "Gjenopprett", "restore_all": "Gjenopprett alle", - "restore_trash_action_prompt": "{count} gjenopprettet fra søppelbøtten", + "restore_trash_action_prompt": "{count} gjenopprettet fra papirkurven", "restore_user": "Gjenopprett bruker", "restored_asset": "Gjenopprettet ressurs", "resume": "Fortsett", @@ -1723,7 +1725,7 @@ "search_options": "Søke alternativer", "search_page_categories": "Kategorier", "search_page_motion_photos": "Bevegelige bilder", - "search_page_no_objects": "Ingen objektinfo tilgjengelig", + "search_page_no_objects": "Ingen elementinfo tilgjengelig", "search_page_no_places": "Ingen stedsinformasjon er tilgjengelig", "search_page_screenshots": "Skjermbilder", "search_page_search_photos_videos": "Søk etter dine bilder og videoer", @@ -1762,7 +1764,7 @@ "select_person_to_tag": "Velg en person å tagge", "select_photos": "Velg bilder", "select_trash_all": "Velg å flytte alt til papirkurven", - "select_user_for_sharing_page_err_album": "Feilet ved oppretting av album", + "select_user_for_sharing_page_err_album": "Mislyktes ved oppretting av album", "selected": "Valgt", "selected_count": "{count, plural, other {# valgt}}", "selected_gps_coordinates": "Valgte GPS-koordinater", @@ -1798,10 +1800,10 @@ "setting_notifications_notify_minutes": "{count} minutter", "setting_notifications_notify_never": "aldri", "setting_notifications_notify_seconds": "{count} sekunder", - "setting_notifications_single_progress_subtitle": "Detaljert opplastingsinformasjon per objekt", + "setting_notifications_single_progress_subtitle": "Detaljert opplastingsinformasjon per element", "setting_notifications_single_progress_title": "Vis detaljert status på sikkerhetskopiering i bakgrunnen", "setting_notifications_subtitle": "Juster notifikasjonsinnstillinger", - "setting_notifications_total_progress_subtitle": "Total opplastingsstatus (fullført/totalt objekter)", + "setting_notifications_total_progress_subtitle": "Total opplastingsstatus (fullført/totalt elementer)", "setting_notifications_total_progress_title": "Vis status på sikkerhetskopiering i bakgrunnen", "setting_video_viewer_looping_title": "Looping", "setting_video_viewer_original_video_subtitle": "Når det streames en video fra serveren, spill originalkvaliteten selv om en omkodet versjon finnes. Dette kan medføre buffring. Videoer som er lagret lokalt på enheten spilles i originalkvalitet uavhengig av denne innstillingen.", @@ -1811,7 +1813,7 @@ "settings_saved": "Innstillinger lagret", "setup_pin_code": "Sett opp en PINkode", "share": "Del", - "share_action_prompt": "Delte {count} objekter", + "share_action_prompt": "Delte {count} elementer", "share_add_photos": "Legg til bilder", "share_assets_selected": "{count} valgt", "share_dialog_preparing": "Forbereder ...", @@ -1845,7 +1847,7 @@ "shared_link_edit_expire_after_option_year": "{count} år", "shared_link_edit_password_hint": "Skriv inn dele-passord", "shared_link_edit_submit_button": "Oppdater link", - "shared_link_error_server_url_fetch": "Kan ikke hente server-url", + "shared_link_error_server_url_fetch": "Kunne ikke hente server-url", "shared_link_expires_day": "Utgår om {count} dag", "shared_link_expires_days": "Utgår om {count} dager", "shared_link_expires_hour": "Utgår om {count} time", @@ -1921,7 +1923,7 @@ "stack_duplicates": "Stable duplikater", "stack_select_one_photo": "Velg hovedbilde for bildestabbel", "stack_selected_photos": "Stable valgte bilder", - "stacked_assets_count": "Stable {count, plural, one {# objekt} other {# objekter}}", + "stacked_assets_count": "Stable {count, plural, one {# element} other {# elementer}}", "stacktrace": "Stakkspor", "start": "Start", "start_date": "Startdato", @@ -1960,15 +1962,15 @@ "tag_not_found_question": "Finner du ikke en merke? Opprett en nytt merke.", "tag_people": "Tag Folk", "tag_updated": "Oppdater merke: {tag}", - "tagged_assets": "Merket {count, plural, one {# objekt} other {# objekter}}", + "tagged_assets": "Merket {count, plural, one {# element} other {# elementer}}", "tags": "Merker", "tap_to_run_job": "Trykk for å kjøre jobben", "template": "Mal", "theme": "Tema", "theme_selection": "Temavalg", "theme_selection_description": "Automatisk sett tema til lys eller mørk basert på nettleserens systeminnstilling", - "theme_setting_asset_list_storage_indicator_title": "Vis lagringsindiaktor på objekter i fotorutenettet", - "theme_setting_asset_list_tiles_per_row_title": "Antall objekter per rad ({count})", + "theme_setting_asset_list_storage_indicator_title": "Vis lagringsindiaktor på elementer i fotorutenettet", + "theme_setting_asset_list_tiles_per_row_title": "Antall elementer per rad ({count})", "theme_setting_colorful_interface_subtitle": "Angi primærfarge til bakgrunner.", "theme_setting_colorful_interface_title": "Fargefullt grensesnitt", "theme_setting_image_viewer_quality_subtitle": "Juster kvaliteten på bilder i detaljvisning", @@ -2000,15 +2002,15 @@ "trash_action_prompt": "{count} flyttet til søppel", "trash_all": "Slett alt", "trash_count": "Slett {count, number}", - "trash_delete_asset": "Slett objekt", - "trash_emptied": "Søppelbøtte tømt", + "trash_delete_asset": "Slett element", + "trash_emptied": "Søppelbøtte Tømt", "trash_no_results_message": "Her vises bilder og videoer som er flyttet til papirkurven.", "trash_page_delete_all": "Slett alt", - "trash_page_empty_trash_dialog_content": "Vil du tømme søppelbøtten? Objektene vil bli permanent fjernet fra Immich", - "trash_page_info": "Objekter i søppelbøtten blir permanent fjernet etter {days} dager", - "trash_page_no_assets": "Ingen forkastede objekter", + "trash_page_empty_trash_dialog_content": "Vil du Tømme papirkurven? Objektene vil bli permanent fjernet fra Immich", + "trash_page_info": "Objekter i papirkurven blir permanent fjernet etter {days} dager", + "trash_page_no_assets": "Ingen forkastede elementer", "trash_page_restore_all": "Gjenopprett alt", - "trash_page_select_assets_btn": "Velg objekter", + "trash_page_select_assets_btn": "Velg elementer", "trash_page_title": "Søppelbøtte ({count})", "trashed_items_will_be_permanently_deleted_after": "Elementer i papirkurven vil bli permanent slettet etter {days, plural, one {# dag} other {# dager}}.", "troubleshoot": "Feilsøk", @@ -2031,7 +2033,7 @@ "unlinked_oauth_account": "Koblet fra OAuth-konto", "unmute_memories": "Opphev demping av minner", "unnamed_album": "Navnløst album", - "unnamed_album_delete_confirmation": "Er du sikker på at du vil slette dette albumet?", + "unnamed_album_delete_confirmation": "Vil du virkelig slette dette albumet?", "unnamed_share": "Deling uten navn", "unsaved_change": "Ulagrede endringer", "unselect_all": "Fjern alle valg", @@ -2039,22 +2041,22 @@ "unselect_all_in": "Fjern velging av alle i {group}", "unstack": "avstable", "unstack_action_prompt": "{count} ustakket", - "unstacked_assets_count": "Ikke stablet {count, plural, one {# objekt} other {# objekter}}", + "unstacked_assets_count": "Ikke stablet {count, plural, one {# element} other {# elementer}}", "untagged": "Umerket", "up_next": "Neste", - "update_location_action_prompt": "Oppdater plasseringen til {count} valgte objekter med:", + "update_location_action_prompt": "Oppdater plasseringen til {count} valgte elementer med:", "updated_at": "Oppdatert", "updated_password": "Passord oppdatert", "upload": "Last opp", "upload_action_prompt": "{count} i kø for opplasting", "upload_concurrency": "Samtidig opplastning", "upload_details": "Opplastingsdetaljer", - "upload_dialog_info": "Vil du utføre backup av valgte objekt(er) til serveren?", - "upload_dialog_title": "Last opp objekt", + "upload_dialog_info": "Vil du utføre backup av valgte element(er) til serveren?", + "upload_dialog_title": "Last opp element", "upload_errors": "Opplasting fullført med {count, plural, one {# error} other {# errors}}, oppdater siden for å se nye opplastingsressurser.", "upload_finished": "Opplasting fullført", "upload_progress": "Gjenstående {remaining, number} – behandlet {processed, number}/{total, number}", - "upload_skipped_duplicates": "Hoppet over {count, plural, one {# duplisert objekt} other {# dupliserte objekter}}", + "upload_skipped_duplicates": "Hoppet over {count, plural, one {# duplisert element} other {# dupliserte elementer}}", "upload_status_duplicates": "Duplikater", "upload_status_errors": "Feil", "upload_status_uploaded": "Opplastet", @@ -2070,7 +2072,7 @@ "user": "Bruker", "user_has_been_deleted": "Denne brukeren har blitt slettet.", "user_id": "Bruker ID", - "user_liked": "{user} likte {type, select, photo {dette bildet} video {denne videoen} asset {dette objektet} other {dette}}", + "user_liked": "{user} likte {type, select, photo {dette bildet} video {denne videoen} asset {dette elementet} other {dette}}", "user_pin_code_settings": "PINkode", "user_pin_code_settings_description": "Håndter din PINkode", "user_privacy": "Personverninnstillinger", @@ -2113,7 +2115,7 @@ "view_stack": "Vis stabel", "view_user": "Vis bruker", "viewer_remove_from_stack": "Fjern fra stabling", - "viewer_stack_use_as_main_asset": "Bruk som hovedobjekt", + "viewer_stack_use_as_main_asset": "Bruk som hovedelement", "viewer_unstack": "avstable", "visibility_changed": "Synlighet endret for {count, plural, one {# person} other {# people}}", "waiting": "Venter", diff --git a/i18n/nl.json b/i18n/nl.json index 82846668d8..55e934736c 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -416,7 +416,7 @@ "age_years": "{years, plural, other {Leeftijd #}}", "album_added": "Album toegevoegd", "album_added_notification_setting_description": "Ontvang een e-mailmelding wanneer je aan een gedeeld album wordt toegevoegd", - "album_cover_updated": "Album cover is bijgewerkt", + "album_cover_updated": "Albumomslag is bijgewerkt", "album_delete_confirmation": "Weet je zeker dat je het album {album} wilt verwijderen?", "album_delete_confirmation_description": "Als dit album gedeeld is, hebben andere gebruikers er geen toegang meer toe.", "album_deleted": "Album verwijderd", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Back-up op de voorgrond aanzetten", "backup_controller_page_uploading_file_info": "Bestandsgegevens uploaden", "backup_err_only_album": "Kan het enige album niet verwijderen", + "backup_error_sync_failed": "Synchronisatie mislukt. Kan back-up niet verwerken.", "backup_info_card_assets": "bestanden", "backup_manual_cancelled": "Geannuleerd", "backup_manual_in_progress": "Het uploaden is al bezig. Probeer het na een tijdje", @@ -734,7 +735,7 @@ "copy_to_clipboard": "Kopiëren naar klembord", "country": "Land", "cover": "Bedekken", - "covers": "Covers", + "covers": "Omslagen", "create": "Aanmaken", "create_album": "Album aanmaken", "create_album_page_untitled": "Naamloos", @@ -820,7 +821,7 @@ "disabled": "Uitgeschakeld", "disallow_edits": "Geen bewerkingen toestaan", "discord": "Discord", - "discover": "Zoeken", + "discover": "Zoek", "discovered_devices": "Gevonden apparaten", "dismiss_all_errors": "Negeer alle fouten", "dismiss_error": "Negeer fout", @@ -840,7 +841,7 @@ "download_failed": "Download mislukt", "download_finished": "Download voltooid", "download_include_embedded_motion_videos": "Ingesloten video's", - "download_include_embedded_motion_videos_description": "Voeg video's toe die ingesloten zijn in bewegende foto's als een apart bestand", + "download_include_embedded_motion_videos_description": "Voeg video's die in bewegingsfoto's zijn ingebed toe als een apart bestand", "download_notfound": "Download niet gevonden", "download_paused": "Download gepauseerd", "download_settings": "Downloaden", @@ -1023,7 +1024,7 @@ "unable_to_trash_asset": "Kan item niet naar prullenbak verplaatsen", "unable_to_unlink_account": "Kan account niet ontkoppelen", "unable_to_unlink_motion_video": "Kan bewegende video niet ontkoppelen", - "unable_to_update_album_cover": "Kan album cover niet bijwerken", + "unable_to_update_album_cover": "Kan albumomslag niet bijwerken", "unable_to_update_album_info": "Kan albumgegevens niet bijwerken", "unable_to_update_library": "Kan bibliotheek niet bijwerken", "unable_to_update_location": "Kan locatie niet bijwerken", @@ -1749,7 +1750,7 @@ "second": "Seconde", "see_all_people": "Bekijk alle mensen", "select": "Selecteer", - "select_album_cover": "Selecteer album cover", + "select_album_cover": "Selecteer albumomslag", "select_all": "Alles selecteren", "select_all_duplicates": "Selecteer alle duplicaten", "select_all_in": "Selecteer alles in {group}", @@ -1778,7 +1779,7 @@ "server_stats": "Serverstatistieken", "server_version": "Serverversie", "set": "Instellen", - "set_as_album_cover": "Stel in als album cover", + "set_as_album_cover": "Stel in als albumomslag", "set_as_featured_photo": "Instellen als uitgelichte foto", "set_as_profile_picture": "Instellen als profielfoto", "set_date_of_birth": "Geboortedatum instellen", diff --git a/i18n/pl.json b/i18n/pl.json index f2016bd1ce..a97ea701d0 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Włącz kopię zapasową na pierwszym planie", "backup_controller_page_uploading_file_info": "Informacje o przesyłanym pliku", "backup_err_only_album": "Nie można usunąć jedynego albumu", + "backup_error_sync_failed": "Synchronizacja nie powiodła się. Nie można wykonać kopii zapasowej.", "backup_info_card_assets": "zasoby", "backup_manual_cancelled": "Anulowano", "backup_manual_in_progress": "Przesyłanie już trwa. Spróbuj po pewnym czasie", diff --git a/i18n/pt.json b/i18n/pt.json index b05c9288a8..6bd4a786dd 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -368,7 +368,7 @@ "trash_settings_description": "Gerir definições da reciclagem", "unlink_all_oauth_accounts": "Desvincular todas as contas OAuth", "unlink_all_oauth_accounts_description": "Lembre-se de desvincular todas as contas OAuth antes de migrar para um novo provedor.", - "unlink_all_oauth_accounts_prompt": "Tem a certeza de que deseja desvincular todas as contas OAuth? Isso redefinirá o ID OAuth de cada utilizador e não poderá ser desfeito.", + "unlink_all_oauth_accounts_prompt": "Tem a certeza de que deseja desvincular todas as contas OAuth? Isto irá redefinir o ID OAuth de cada utilizador e não poderá ser anulado.", "user_cleanup_job": "Limpeza de utilizadores", "user_delete_delay": "A conta e os ficheiros de {user} serão agendados para eliminação permanente dentro de {delay, plural, one {# dia} other {# dias}}.", "user_delete_delay_settings": "Atraso de eliminação", @@ -402,8 +402,8 @@ "advanced_settings_prefer_remote_title": "Preferir imagens do servidor", "advanced_settings_proxy_headers_subtitle": "Defina os cabeçalhos do proxy que o Immich deve enviar em todas comunicações com a rede", "advanced_settings_proxy_headers_title": "Cabeçalhos do Proxy", - "advanced_settings_readonly_mode_subtitle": "Ativa o modo somente leitura, onde as fotos podem ser visualizadas. Recursos como selecionar várias imagens, partilhar, transmitir e excluir ficam deactivados. Ativar/Desativar o modo somente leitura via avatar do utilizador na janela principal", - "advanced_settings_readonly_mode_title": "Modo somente leitura", + "advanced_settings_readonly_mode_subtitle": "Ativa o modo só de leitura, onde as fotos apenas podem ser visualizadas. Funções como selecionar várias imagens, partilhar, transmitir e eliminar ficam deactivadas. Pode ativar ou desativar o modo só de leitura através da imagem de perfil do utilizador na janela principal", + "advanced_settings_readonly_mode_title": "Modo só de leitura", "advanced_settings_self_signed_ssl_subtitle": "Não validar o certificado SSL com o endereço do servidor. Isto é necessário para certificados auto-assinados.", "advanced_settings_self_signed_ssl_title": "Permitir certificados SSL auto-assinados", "advanced_settings_sync_remote_deletions_subtitle": "Automaticamente eliminar ou restaurar um ficheiro neste dispositivo quando essa mesma ação for efetuada na web", @@ -512,9 +512,9 @@ "assets": "Ficheiros", "assets_added_count": "{count, plural, one {# ficheiro adicionado} other {# ficheiros adicionados}}", "assets_added_to_album_count": "{count, plural, one {# ficheiro adicionado} other {# ficheiros adicionados}} ao álbum", - "assets_added_to_albums_count": "Adicionado {assetTotal, plural, one {# asset} other {# assets}} a {albumTotal, plural, one {# album} other {# albums}}", + "assets_added_to_albums_count": "{assetTotal, plural, one {Foi adicionado # ficheiro} other {Foram adiciondos # ficheiros}} a {albumTotal, plural, one {# álbum} other {# albuns}}", "assets_cannot_be_added_to_album_count": "Não foi possível adicionar {count, plural, one {ficheiro} other {ficheiros}} ao álbum", - "assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} não pode ser adicionado a nenhum dos álbuns", + "assets_cannot_be_added_to_albums": "{count, plural, one {Ficheiro não pode ser adicionado} other {Ficheiros não podem ser adiciondos}} a nenhum dos álbuns", "assets_count": "{count, plural, one {# ficheiro} other {# ficheiros}}", "assets_deleted_permanently": "{count} ficheiro(s) eliminado(s) permanentemente", "assets_deleted_permanently_from_server": "{count} ficheiro(s) eliminado(s) permanentemente do servidor Immich", @@ -531,7 +531,7 @@ "assets_trashed_count": "{count, plural, one {# ficheiro enviado} other {# ficheiros enviados}} para a reciclagem", "assets_trashed_from_server": "{count} ficheiro(s) do servidor Immich foi/foram enviados para a reciclagem", "assets_were_part_of_album_count": "{count, plural, one {O ficheiro já fazia} other {Os ficheiros já faziam}} parte do álbum", - "assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} já faz parte dos álbuns", + "assets_were_part_of_albums_count": "{count, plural, one {Ficheiro já fazia} other {Ficheiros já faziam}} parte dos álbuns", "authorized_devices": "Dispositivos Autorizados", "automatic_endpoint_switching_subtitle": "Conecte-se localmente quando estiver em uma rede uma Wi-Fi específica e use conexões alternativas em outras redes", "automatic_endpoint_switching_title": "Troca automática de URL", @@ -589,7 +589,7 @@ "backup_controller_page_remainder": "Restante", "backup_controller_page_remainder_sub": "Fotos e vídeos selecionados restantes para fazer backup", "backup_controller_page_server_storage": "Armazenamento no servidor", - "backup_controller_page_start_backup": "Iniciar Backup", + "backup_controller_page_start_backup": "Iniciar Cópia de Segurança", "backup_controller_page_status_off": "Backup automático desativado", "backup_controller_page_status_on": "Backup automático ativado", "backup_controller_page_storage_format": "{used} de {total} utilizado", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Ativar backup", "backup_controller_page_uploading_file_info": "Enviando arquivo", "backup_err_only_album": "Não é possível remover apenas o álbum", + "backup_error_sync_failed": "A sincronização falhou. Não é possível fazer cópia de segurança.", "backup_info_card_assets": "arquivos", "backup_manual_cancelled": "Cancelado", "backup_manual_in_progress": "Envio já está em progresso. Tente novamente mais tarde", @@ -667,7 +668,7 @@ "change_your_password": "Alterar a sua palavra-passe", "changed_visibility_successfully": "Visibilidade alterada com sucesso", "charging": "A carregar", - "charging_requirement_mobile_backup": "Cópia de segurança de fundo necesssita que o dispositivo esteja a carregar", + "charging_requirement_mobile_backup": "Cópia de segurança de fundo necessita que o dispositivo esteja a carregar", "check_corrupt_asset_backup": "Verificar por backups corrompidos", "check_corrupt_asset_backup_button": "Verificar", "check_corrupt_asset_backup_description": "Execute esta verificação somente em uma rede Wi-Fi e quando o backup de todos os arquivos já estiver concluído. O processo demora alguns minutos.", @@ -906,7 +907,7 @@ "error_delete_face": "Falha ao remover rosto do ficheiro", "error_getting_places": "Erro ao obter locais", "error_loading_image": "Erro ao carregar a imagem", - "error_loading_partners": "Erro a carregar parceiros: {error}", + "error_loading_partners": "Erro ao carregar parceiros: {error}", "error_saving_image": "Erro: {error}", "error_tag_face_bounding_box": "Erro ao marcar o rosto - não foi possível localizar o rosto", "error_title": "Erro - Algo correu mal", @@ -939,7 +940,7 @@ "failed_to_load_notifications": "Ocorreu um erro ao carregar notificações", "failed_to_load_people": "Ocorreu um erro ao carregar pessoas", "failed_to_remove_product_key": "Ocorreu um erro ao remover chave de produto", - "failed_to_reset_pin_code": "Falha ao repor o código PIN", + "failed_to_reset_pin_code": "Ocorreu um erro ao repor o código PIN", "failed_to_stack_assets": "Ocorreu um erro ao empilhar os ficheiros", "failed_to_unstack_assets": "Ocorreu um erro ao desempilhar ficheiros", "failed_to_update_notification_status": "Ocorreu um erro ao atualizar o estado das notificações", @@ -948,7 +949,7 @@ "paths_validation_failed": "Ocorreu um erro na validação de {paths, plural, one {# caminho} other {# caminhos}}", "profile_picture_transparent_pixels": "Imagem de perfil não pode ter pixeis transparentes. Por favor amplie e/ou mova a imagem.", "quota_higher_than_disk_size": "Definiu uma quota maior do que o tamanho do disco", - "something_went_wrong": "Algo deu errado", + "something_went_wrong": "Algo correu mal", "unable_to_add_album_users": "Não foi possível adicionar utilizadores ao álbum", "unable_to_add_assets_to_shared_link": "Não foi possível adicionar os ficheiros ao link partilhado", "unable_to_add_comment": "Não foi possível adicionar o comentário", @@ -1087,12 +1088,12 @@ "folder_not_found": "Pasta não encontrada", "folders": "Pastas", "folders_feature_description": "Navegar na vista de pastas por fotos e vídeos no sistema de ficheiros", - "forgot_pin_code_question": "Esqueceu o seu PIN?", + "forgot_pin_code_question": "Esqueceu-se do seu PIN?", "forward": "Para a frente", "gcast_enabled": "Google Cast", "gcast_enabled_description": "Esta funcionalidade requer o carregamento de recursos externos da Google para poder funcionar.", "general": "Geral", - "geolocation_instruction_location": "Clique num ativo com coordenadas GPS para usar a sua localização ou seleccione um local diretamente do mapa", + "geolocation_instruction_location": "Clique num ficheiro com coordenadas GPS para usar a sua localização ou selecione um local diretamente do mapa", "get_help": "Obter Ajuda", "get_wifiname_error": "Não foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissões necessárias e se está conectado a uma rede Wi-Fi", "getting_started": "Primeiros Passos", @@ -1225,7 +1226,7 @@ "library_page_sort_title": "Título do álbum", "licenses": "Licenças", "light": "Claro", - "like": "Gostar", + "like": "Gosto", "like_deleted": "Gosto removido", "link_motion_video": "Relacionar video animado", "link_to_oauth": "Link do OAuth", @@ -1254,7 +1255,7 @@ "logged_in_as": "Utilizador atual: {user}", "logged_out_all_devices": "Sessão terminada em todos os dispositivos", "logged_out_device": "Sessão terminada no dispositivo", - "login": "Iniciar sessão", + "login": "Iniciar Sessão", "login_disabled": "Login desativado", "login_form_api_exception": "Erro de API. Verifique a URL do servidor e tente novamente.", "login_form_back_button_text": "Voltar", @@ -1284,7 +1285,7 @@ "look": "Estilo", "loop_videos": "Repetir vídeos", "loop_videos_description": "Ativar para repetir os vídeos automaticamente durante a exibição.", - "main_branch_warning": "Está a utilizar uma versão de desenvolvimento, recomendamos vivamente que utilize uma versão estável!", + "main_branch_warning": "Está a usar uma versão de desenvolvimento; recomendamos vivamente que use uma versão de lançamento!", "main_menu": "Menu Principal", "make": "Marca", "manage_geolocation": "Gerir localização", @@ -1296,7 +1297,7 @@ "manage_your_devices": "Gerir os seus dispositivos com sessão iniciada", "manage_your_oauth_connection": "Gerir a sua ligação ao OAuth", "map": "Mapa", - "map_assets_in_bounds": "{count, plural, =0 {No photos in this area} one {# photo} other {# photos}}", + "map_assets_in_bounds": "{count, plural, =0 {Sem fotos nesta área} one {# foto} other {# fotos}}", "map_cannot_get_user_location": "Impossível obter a sua localização", "map_location_dialog_yes": "Sim", "map_location_picker_page_use_location": "Utilizar esta localização", @@ -1361,12 +1362,12 @@ "my_albums": "Os meus álbuns", "name": "Nome", "name_or_nickname": "Nome ou alcunha", - "network_requirement_photos_upload": "Usar dados móveis para fazer backup de fotos", - "network_requirement_videos_upload": "Usar dados móveis para fazer backup de vídeos", + "network_requirement_photos_upload": "Usar dados móveis para fazer cópia de segurança de fotos", + "network_requirement_videos_upload": "Usar dados móveis para fazer cópia de segurança de vídeos", "network_requirements": "Requisitos de rede", - "network_requirements_updated": "Requisitos de rede alterados, redefinindo fila de backup", - "networking_settings": "Conexões", - "networking_subtitle": "Gerencie a conexão do servidor", + "network_requirements_updated": "Requisitos de rede alterados, a redefinir fila de cópia de segurança", + "networking_settings": "Ligações", + "networking_subtitle": "Gerir as ligações de rede do servidor", "never": "Nunca", "new_album": "Novo Álbum", "new_api_key": "Nova Chave de API", @@ -1389,16 +1390,19 @@ "no_assets_to_show": "Não há arquivos para exibir", "no_cast_devices_found": "Nenhum dispositivo de transmissão encontrado", "no_checksum_local": "Sem cálculo de verificação disponível - não pode capturar conteúdos locais", + "no_checksum_remote": "Soma de verificação (checksum) não disponível - não é possível obter o recurso remoto", "no_duplicates_found": "Nenhum item duplicado foi encontrado.", "no_exif_info_available": "Sem informações exif disponíveis", "no_explore_results_message": "Carregue mais fotos para explorar a sua coleção.", "no_favorites_message": "Adicione aos favoritos para encontrar as suas melhores fotos e vídeos rapidamente", "no_libraries_message": "Crie uma biblioteca externa para ver as suas fotos e vídeos", + "no_local_assets_found": "Sem cálculo de verificação disponível", "no_locked_photos_message": "Fotos e vídeos na pasta trancada estão ocultos e não serão exibidos enquanto explora ou pesquisa na biblioteca.", "no_name": "Sem nome", "no_notifications": "Sem notificações", "no_people_found": "Nenhuma pessoa encontrada", "no_places": "Sem lugares", + "no_remote_assets_found": "Soma de verificação (checksum) não disponível - não é possível obter o recurso remoto", "no_results": "Sem resultados", "no_results_description": "Tente um sinónimo ou uma palavra-chave mais comum", "no_shared_albums_message": "Crie um álbum para partilhar fotos e vídeos com pessoas na sua rede", @@ -1499,9 +1503,9 @@ "permission_onboarding_permission_limited": "Permissão limitada. Para permitir que o Immich faça backups e gerencie sua galeria, conceda permissões para fotos e vídeos nas configurações.", "permission_onboarding_request": "O Immich requer autorização para ver as suas fotos e vídeos.", "person": "Pessoa", - "person_age_months": "{months, plural, one {# month} other {# months}} idade", - "person_age_year_months": "1 ano, {months, plural, one {# month} other {# months}} idade", - "person_age_years": "{years, plural, other {# years}} idade", + "person_age_months": "{months, plural, one {# month} other {# months}} de idade", + "person_age_year_months": "1 ano, {months, plural, one {# month} other {# months}} de idade", + "person_age_years": "{years, plural, other {# anos}} de idade", "person_birthdate": "Nasceu a {date}", "person_hidden": "{name}{hidden, select, true { (oculto)} other {}}", "photo_shared_all_users": "Parece que partilhou as suas fotos com todos os utilizadores ou não tem nenhum utilizador para partilhar.", @@ -1542,7 +1546,7 @@ "profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.", "profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados", "profile_drawer_github": "GitHub", - "profile_drawer_readonly_mode": "Modo somente leitura ativado. Toque duas vezes no ícone do avatar do utilizador para sair.", + "profile_drawer_readonly_mode": "Modo só de leitura ativado. Faça um toque longo no ícone do perfil do utilizador para sair.", "profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.", "profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.", "profile_image_of_user": "Imagem de perfil de {user}", @@ -1569,7 +1573,7 @@ "purchase_lifetime_description": "Compra vitalícia", "purchase_option_title": "OPÇÕES DE COMPRA", "purchase_panel_info_1": "O desenvolvimento do Immich requer muito tempo e esforço, e temos engenheiros a tempo inteiro a trabalhar nele para melhorá-lo quanto possível. A nossa missão é para que o software de código aberto e práticas de negócio éticas se tornem numa fonte de rendimento sustentável para os desenvolvedores e criar um ecossistema que respeite a privacidade dos utilizadores e que ofereça alternativas reais a serviços cloud explorativos.", - "purchase_panel_info_2": "Como estamos comprometidos a não adicionar acesso pago, esta compra não lhe dará acesso a nenhuma funcionalidade adicional do Immich. Contamos com utilizadores como você para dar suporte ao desenvolvimento contínuo do Immich.", + "purchase_panel_info_2": "Uma vez que estamos empenhados em não adicionar barreiras de pagamento, esta compra não lhe dará quaisquer funcionalidades adicionais no Immich. Contamos com utilizadores como você para apoiar o desenvolvimento contínuo do Immich.", "purchase_panel_title": "Apoie o projeto", "purchase_per_server": "Por servidor", "purchase_per_user": "Por utilizador", @@ -1581,7 +1585,7 @@ "purchase_server_description_2": "Status de apoiante", "purchase_server_title": "Servidor", "purchase_settings_server_activated": "A chave de produto do servidor é gerida pelo administrador", - "query_asset_id": "Consultar ID do recurso", + "query_asset_id": "Consultar ID do ficheiro", "queue_status": "Em fila {count}/{total}", "rating": "Classificação por estrelas", "rating_clear": "Limpar classificação", @@ -1589,8 +1593,8 @@ "rating_description": "Mostrar a classificação EXIF no painel de informações", "reaction_options": "Opções de reação", "read_changelog": "Ler Novidades", - "readonly_mode_disabled": "Modo somente leitura desativado", - "readonly_mode_enabled": "Modo somente leitura ativado", + "readonly_mode_disabled": "Modo só de leitura desativado", + "readonly_mode_enabled": "Modo só de leitura ativado", "ready_for_upload": "Pronto para upload", "reassign": "Reatribuir", "reassigned_assets_to_existing_person": "Reatribuir {count, plural, one {# ficheiro} other {# ficheiros}} para {name, select, null {uma pessoa existente} other {{name}}}", @@ -1616,6 +1620,7 @@ "regenerating_thumbnails": "A atualizar miniaturas", "remote": "Remoto", "remote_assets": "Ficheiros Remotos", + "remote_media_summary": "Sumário de Ficheiros Remotos", "remove": "Remover", "remove_assets_album_confirmation": "Tem a certeza de que deseja remover {count, plural, one {# ficheiro} other {# ficheiros}} do álbum?", "remove_assets_shared_link_confirmation": "Tem certeza de que deseja remover {count, plural, one {# ficheiro} other {# ficheiros}} deste link partilhado?", @@ -1653,9 +1658,9 @@ "reset_password": "Redefinir palavra-passe", "reset_people_visibility": "Redefinir pessoas ocultas", "reset_pin_code": "Repor código PIN", - "reset_pin_code_description": "Se esqueceu o seu código PIN, pode entrar em contato com o administrador do servidor para o repor", + "reset_pin_code_description": "Se esqueceu o seu código PIN, pode entrar em contacto com o administrador do servidor para o repor", "reset_pin_code_success": "Código PIN redefinido com sucesso", - "reset_pin_code_with_password": "Pode sempre repor o seu código PIN com a sua senha", + "reset_pin_code_with_password": "Pode sempre repor o seu código PIN com a sua palavra-passe", "reset_sqlite": "Reiniciar Base de Dados SQLite", "reset_sqlite_confirmation": "Tem a certeza de que quer reiniciar a base de dados SQLite? Vai ter de terminar a sessão e entrar outra vez para sincronizar os dados de novo", "reset_sqlite_success": "Base de dados SQLite reiniciada com sucesso", @@ -1668,10 +1673,10 @@ "restore_user": "Restaurar utilizador", "restored_asset": "Ficheiro restaurado", "resume": "Continuar", - "resume_paused_jobs": "Continuar {count, plural, one {# trabalho em pausa} other {# trabalhos pausados}}", + "resume_paused_jobs": "Continuar {count, plural, one {# trabalho em pausa} other {# trabalhos em pausa}}", "retry_upload": "Tentar carregar novamente", "review_duplicates": "Rever itens duplicados", - "review_large_files": "Rever arquivos grandes", + "review_large_files": "Rever ficheiros grandes", "role": "Função", "role_editor": "Editor", "role_viewer": "Visualizador", @@ -1856,7 +1861,7 @@ "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Gerenciar links compartilhados", "shared_link_options": "Opções de link partilhado", - "shared_link_password_description": "Exigir uma senha para aceder a este link partilhado", + "shared_link_password_description": "Exigir uma palavra-passe para aceder a este link partilhado", "shared_links": "Links partilhados", "shared_links_description": "Partilhar fotos e videos com um link", "shared_photos_and_videos_count": "{assetCount, plural, other {# Fotos & videos partilhados.}}", @@ -1947,7 +1952,7 @@ "sync_albums_manual_subtitle": "Sincronizar todas as fotos e vídeos enviados para o álbum de backup selecionado", "sync_local": "Sincronização Local", "sync_remote": "Sincronização Remota", - "sync_status": "Status da sincronização", + "sync_status": "Estado da sincronização", "sync_status_subtitle": "Ver e gerir o sistema de sincronização", "sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o álbum selecionado no Immich", "tag": "Etiqueta", @@ -2125,5 +2130,6 @@ "yes": "Sim", "you_dont_have_any_shared_links": "Não tem links partilhados", "your_wifi_name": "Nome da sua rede Wi-Fi", - "zoom_image": "Ampliar/Reduzir imagem" + "zoom_image": "Ampliar/Reduzir imagem", + "zoom_to_bounds": "Aproximar aos limites" } diff --git a/i18n/pt_BR.json b/i18n/pt_BR.json index 03471cef46..a4d590bc2c 100644 --- a/i18n/pt_BR.json +++ b/i18n/pt_BR.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Ativar backup automático", "backup_controller_page_uploading_file_info": "Informações do arquivo", "backup_err_only_album": "Não é possível remover o único álbum", + "backup_error_sync_failed": "A sincronização falhou. Não foi possível processar o backup.", "backup_info_card_assets": "arquivos", "backup_manual_cancelled": "Cancelado", "backup_manual_in_progress": "Envio já está em progresso. Tente novamente mais tarde", diff --git a/i18n/ro.json b/i18n/ro.json index 76e87c0cb6..71784cfcf9 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -468,7 +468,7 @@ "app_bar_signout_dialog_content": "Ești sigur că vrei să te deconectezi?", "app_bar_signout_dialog_ok": "Da", "app_bar_signout_dialog_title": "Deconectare", - "app_settings": "Setări Aplicație", + "app_settings": "Setări aplicație", "appears_in": "Apare în", "apply_count": "Aplică ({count, number})", "archive": "Arhivă", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Activează backup-ul în prim-plan", "backup_controller_page_uploading_file_info": "Informații încărcare fișier", "backup_err_only_album": "Nu poți șterge singurul album", + "backup_error_sync_failed": "Sincronizarea a eșuat. Nu se poate procesa copia de rezervă.", "backup_info_card_assets": "resurse", "backup_manual_cancelled": "Anulat", "backup_manual_in_progress": "Încărcarea este deja în curs. Încearcă din nou mai târziu", diff --git a/i18n/ru.json b/i18n/ru.json index f17b5ce364..51d80614d3 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -599,7 +599,7 @@ "backup_controller_page_turn_on": "Включить", "backup_controller_page_uploading_file_info": "Информация о загружаемом файле", "backup_err_only_album": "Невозможно удалить единственный альбом", - "backup_error_sync_failed": "Сбой синхронизации. Невозможно запустить резервное копирование.", + "backup_error_sync_failed": "Сбой синхронизации. Невозможно выполнить резервное копирование.", "backup_info_card_assets": "объектов", "backup_manual_cancelled": "Отменено", "backup_manual_in_progress": "Загрузка в процессе. Попробуйте позже", @@ -732,7 +732,7 @@ "copy_link": "Копировать ссылку", "copy_link_to_clipboard": "Скопировать ссылку в буфер обмена", "copy_password": "Скопировать пароль", - "copy_to_clipboard": "Скопировать настройки в буфер обмена", + "copy_to_clipboard": "Скопировать в буфер обмена", "country": "Страна", "cover": "Обложка", "covers": "Обложки", @@ -1779,7 +1779,7 @@ "server_stats": "Статистика сервера", "server_version": "Версия сервера", "set": "Установить", - "set_as_album_cover": "Установить в качестве обложки альбома", + "set_as_album_cover": "Установить как обложку альбома", "set_as_featured_photo": "Установить как основное фото", "set_as_profile_picture": "Установить как фото профиля", "set_date_of_birth": "Установить дату рождения", @@ -1969,7 +1969,7 @@ "theme": "Тема", "theme_selection": "Выбор темы", "theme_selection_description": "Автоматически устанавливать светлую или тёмную тему в зависимости от настроек вашего браузера", - "theme_setting_asset_list_storage_indicator_title": "Показать индикатор хранилища на плитках объектов", + "theme_setting_asset_list_storage_indicator_title": "Отображать индикатор хранилища на плитках объектов", "theme_setting_asset_list_tiles_per_row_title": "Количество объектов в строке ({count})", "theme_setting_colorful_interface_subtitle": "Добавить оттенок к фону.", "theme_setting_colorful_interface_title": "Цвет фона", diff --git a/i18n/sk.json b/i18n/sk.json index 2fdd6ca07a..de8f12dfa5 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -497,7 +497,7 @@ "asset_list_layout_settings_group_by_month_day": "Mesiac + deň", "asset_list_layout_sub_title": "Rozvrhnutie", "asset_list_settings_subtitle": "Nastavenia rozloženia mriežky fotografií", - "asset_list_settings_title": "Fotografická mriežka", + "asset_list_settings_title": "Mriežka fotografií", "asset_offline": "Médium je offline", "asset_offline_description": "Toto externý obsah sa už nenachádza na disku. Požiadajte o pomoc svojho správcu Immich.", "asset_restored_successfully": "Položky boli úspešne obnovené", @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Povoliť zálohovanie na popredí", "backup_controller_page_uploading_file_info": "Nahrávaný súbor", "backup_err_only_album": "Nie je možné odstrániť jediný vybraný album", + "backup_error_sync_failed": "Synchronizácia sa nepodarila. Nie je možné spracovať zálohu.", "backup_info_card_assets": "položiek", "backup_manual_cancelled": "Zrušené", "backup_manual_in_progress": "Nahrávanie už prebieha. Vyskúšajte neskôr", diff --git a/i18n/sl.json b/i18n/sl.json index 7a1aef509a..bcea0de5cf 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "Vklopite varnostno kopiranje v ospredju", "backup_controller_page_uploading_file_info": "Nalaganje podatkov o datoteki", "backup_err_only_album": "Edinega albuma ni mogoče odstraniti", + "backup_error_sync_failed": "Sinhronizacija ni uspela. Varnostne kopije ni mogoče obdelati.", "backup_info_card_assets": "sredstva", "backup_manual_cancelled": "Preklicano", "backup_manual_in_progress": "Nalaganje že poteka. Poskusite čez nekaj časa", diff --git a/i18n/sv.json b/i18n/sv.json index 6acee96f66..fba673610a 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -28,6 +28,7 @@ "add_to_album": "Lägg till i album", "add_to_album_bottom_sheet_added": "Tillagd till {album}", "add_to_album_bottom_sheet_already_exists": "Redan i {album}", + "add_to_album_bottom_sheet_some_local_assets": "Vissa lokala tillgångar kunde inte läggas till i albumet", "add_to_album_toggle": "Växla val för {album}", "add_to_albums": "Lägg till i album", "add_to_albums_count": "Lägg till i album ({count})", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Aktivera automatisk säkerhetskopiering", "backup_controller_page_uploading_file_info": "Laddar upp filinformation", "backup_err_only_album": "Kan inte ta bort det enda albumet", + "backup_error_sync_failed": "Synkroniseringen misslyckades. Det går inte att bearbeta säkerhetskopian.", "backup_info_card_assets": "objekt", "backup_manual_cancelled": "Avbrutet", "backup_manual_in_progress": "Uppladdning pågår redan. Försök igen om en liten stund", diff --git a/i18n/ta.json b/i18n/ta.json index f8996ad44b..e97b4b4b72 100644 --- a/i18n/ta.json +++ b/i18n/ta.json @@ -28,6 +28,7 @@ "add_to_album": "ஆல்பமில் சேர்க்க", "add_to_album_bottom_sheet_added": "{album}-இல் சேர்க்கப்பட்டது", "add_to_album_bottom_sheet_already_exists": "ஏற்கனவே {album}-இல் உள்ளது", + "add_to_album_bottom_sheet_some_local_assets": "சில உள்ளக சொத்துக்களை ஆல்பத்தில் சேர்க்க முடியவில்லை", "add_to_album_toggle": "{album} க்கான தேர்வை மாற்று", "add_to_albums": "ஆல்பத்தில் சேர்", "add_to_albums_count": "ஆல்பங்களில் சேர்({count})", @@ -39,16 +40,16 @@ "admin": { "add_exclusion_pattern_description": "விலக்கு வடிவங்களைச் சேர்க்கவும். *, **, மற்றும் ? ஆதரிக்கப்படுகிறது. \"Raw\" என்ற பெயரிடப்பட்ட எந்த கோப்பகத்திலும் உள்ள எல்லா கோப்புகளையும் புறக்கணிக்க, \"**/Raw/**\" ஐப் பயன்படுத்தவும். \".tif\" இல் முடியும் எல்லா கோப்புகளையும் புறக்கணிக்க, \"**/*.tif\" ஐப் பயன்படுத்தவும். ஒரு முழுமையான பாதையை புறக்கணிக்க, \"/path/to/ignore/**\" ஐப் பயன்படுத்தவும்.", "admin_user": "நிர்வாக பயனர்", - "asset_offline_description": "இந்த வெளிப்புற நூலக சொத்து இனி வட்டில் காணப்படவில்லை மற்றும் குப்பைக்கு நகர்த்தப்பட்டுள்ளது. கோப்பு நூலகத்திற்குள் நகர்த்தப்பட்டிருந்தால், புதிய தொடர்புடைய சொத்துக்கான உங்கள் காலவரிசையை சரிபார்க்கவும். இந்த சொத்தை மீட்டெடுக்க, கீழேயுள்ள கோப்பு பாதையை இம்மிச் மூலம் அணுகலாம் மற்றும் நூலகத்தை ச்கேன் செய்ய முடியும் என்பதை உறுதிப்படுத்தவும்.", - "authentication_settings": "அடையாள உறுதிப்படுத்தல் அமைப்புகள் (செட்டிங்ஸ்)", - "authentication_settings_description": "கடவுச்சொல், OAuth, மற்றும் பிற அடையாள அமைப்புகள்", - "authentication_settings_disable_all": "எல்லா உள்நுழைவு முறைகளையும் நிச்சயமாக முடக்க விரும்புகிறீர்களா? உள்நுழைவு முற்றிலும் முடக்கப்படும்.", - "authentication_settings_reenable": "மீண்டும் இயக்க, சர்வர் கட்டளை பயன்படுத்தவும்.", + "asset_offline_description": "இந்த வெளிப்புற நூலகச் சொத்து (external library asset) இனி கோப்புப் பதிப்பில் காணப்படவில்லை மற்றும் குப்பைத்தொட்டியில் (trash) நகர்த்தப்பட்டுள்ளது.கோப்பு நூலகத்தில் உள்ளே நகர்த்தப்பட்டிருந்தால், புதிய இணை சொத்தை (corresponding asset) கண்டுபிடிக்க உங்கள் காலவரிசையை (timeline) சரிபார்க்கவும். இந்த சொத்தை மீட்டமைக்க, கீழே உள்ள கோப்புப் பாதை Immich மூலம் அணுகக்கூடியதா என்பதை உறுதி செய்து, நூலகத்தை (library) மீண்டும் ஸ்கேன் செய்யவும்.", + "authentication_settings": "அங்கீகார அமைப்புகள்", + "authentication_settings_description": "அடையாளச் சொல்லுகள் (Password), OAuth மற்றும் பிற அங்கீகார அமைப்புகளை நிர்வகிக்கவும்", + "authentication_settings_disable_all": "நீங்கள் உண்மையில் அனைத்து உள்நுழைவு முறைகளையும் முடக்க விரும்புகிறீர்களா? உள்நுழைவு முழுமையாக முடக்கப்படும்.", + "authentication_settings_reenable": "மீண்டும் செயல்படுத்த, சேவையகம் கட்டளை பயன்படுத்தவும்.", "background_task_job": "பின்னணி பணிகள்", - "backup_database": "தரவுத்தள காப்புப்பிரதியை உருவாக்கு", - "backup_database_enable_description": "தரவுத்தள திணிப்புகள் இயக்கவும்", - "backup_keep_last_amount": "வைத்திருக்க முந்தைய திணிப்புகள் அளவு", - "backup_onboarding_1_description": "மேகக்கட்டத்தில் அல்லது மற்றொரு உடல் இடத்தில் ஆஃப்சைட் நகல்.", + "backup_database": "தரவுத்தள நகல் உருவாக்கவும்", + "backup_database_enable_description": "தரவுத்தள நகல்களை இயக்கவும்", + "backup_keep_last_amount": "வைத்திருக்க முந்தைய நகல்களின் அளவு", + "backup_onboarding_1_description": "மேகம் அல்லது வேறு இடத்தில் நகல்.", "backup_onboarding_2_description": "வெவ்வேறு சாதனங்களில் உள்ள நகல் பிரதிகள். இதில் முக்கிய கோப்புகள் மற்றும் அந்தக் கோப்புகளின் நகல் காப்புப்பிரதி ஆகியவை அடங்கும்.", "backup_onboarding_3_description": "உங்கள் தரவின் மொத்த கோப்புகள் அசல் மற்றும் நகல்கள் உட்பட. இதில் 1 வெளிப்புற நகல் மற்றும் 2 சாதனப் பிரதிகள் அடங்கும்.", "backup_onboarding_description": "உங்கள் தரவை பாதுகாப்பதற்காக ஒரு 3-2-1 காப்புப் பிரதி பரிந்துரைக்கப்படுகிறது. முழுமையான காப்பு பாதுகாப்பு தீர்விற்காக, நீங்கள் பதிவேற்றிய புகைப்படங்கள்/வீடியோக்கள் மற்றும் Immich தரவுத்தளத்தின் நகல்களையும் வைத்திருக்க வேண்டும்.", @@ -56,7 +57,7 @@ "backup_onboarding_parts_title": "3-2-1 காப்புப்பிரதியில் பின்வருவன அடங்கும்:", "backup_onboarding_title": "காப்புப்பிரதிகள்", "backup_settings": "தரவுத்தள திணிப்பு அமைப்புகள்", - "backup_settings_description": "தரவுத்தள திணிப்பு அமைப்புகளை நிர்வகிக்கவும்", + "backup_settings_description": "தரவுத்தள நகல் அமைப்புகளை நிர்வகிக்கவும்", "cleared_jobs": "முடித்த வேலைகள்: {job}", "config_set_by_file": "கட்டமைப்பு, தற்போது ஒரு கட்டமைப்பு கோப்பு மூலம் அமைக்கப்பட்டுள்ளது", "confirm_delete_library": "{library} படங்கள் நூலகத்தை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "முன்புற காப்புப்பிரதியை இயக்கவும்", "backup_controller_page_uploading_file_info": "கோப்பு தகவலைப் பதிவேற்றுகிறது", "backup_err_only_album": "ஒரே ஆல்பத்தை அகற்ற முடியாது", + "backup_error_sync_failed": "ஒத்திசைவு தோல்வியுற்றது. காப்புப்பிரதியை செயலாக்க முடியாது.", "backup_info_card_assets": "சொத்துக்கள்", "backup_manual_cancelled": "ரத்து செய்யப்பட்டது", "backup_manual_in_progress": "ஏற்கனவே முன்னேற்றத்தில் பதிவேற்றவும். சிறிது நேரம் கழித்து முயற்சிக்கவும்", diff --git a/i18n/tr.json b/i18n/tr.json index 38d1a4c227..a962420980 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -28,6 +28,7 @@ "add_to_album": "Albüme ekle", "add_to_album_bottom_sheet_added": "{album} albümüne eklendi", "add_to_album_bottom_sheet_already_exists": "Zaten {album} albümüne ekli", + "add_to_album_bottom_sheet_some_local_assets": "Bazı yerel öğeler albüme eklenemedi", "add_to_album_toggle": "{album} için seçimi değiştir", "add_to_albums": "Albümlere ekle", "add_to_albums_count": "{count} albümlerine ekle", @@ -574,16 +575,16 @@ "backup_controller_page_background_turn_off": "Arka plan hizmetini kapat", "backup_controller_page_background_turn_on": "Arka plan hizmetini aç", "backup_controller_page_background_wifi": "Sadece Wi-Fi", - "backup_controller_page_backup": "Yedekle", + "backup_controller_page_backup": "Yedek", "backup_controller_page_backup_selected": "Seçilen: ", - "backup_controller_page_backup_sub": "Yedeklenen öğeler", + "backup_controller_page_backup_sub": "Yedeklenen fotoğraflar ve videolar", "backup_controller_page_created": "Oluşturma tarihi: {date}", "backup_controller_page_desc_backup": "Uygulamayı açtığınızda yeni öğelerin sunucuya otomatik olarak yüklenmesi için ön planda yedeklemeyi açın.", "backup_controller_page_excluded": "Hariç tutuldu: ", "backup_controller_page_failed": "Başarısız ({count})", "backup_controller_page_filename": "Dosya adı: {filename} [{size}]", "backup_controller_page_id": "KNu: {id}", - "backup_controller_page_info": "Yedekleme bilgileri", + "backup_controller_page_info": "Yedekleme Bilgileri", "backup_controller_page_none_selected": "Hiçbiri seçilmedi", "backup_controller_page_remainder": "Kalan", "backup_controller_page_remainder_sub": "Seçili albümlerden yedeklenecek kalan öğeler", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "Ön planda yedeklemeyi aç", "backup_controller_page_uploading_file_info": "Dosya bilgisi yükleniyor", "backup_err_only_album": "Tek albüm kaldırılamaz", + "backup_error_sync_failed": "Senkronizasyon başarısız. Yedekleme işlemi gerçekleştirilemiyor.", "backup_info_card_assets": "öğeler", "backup_manual_cancelled": "İptal Edildi", "backup_manual_in_progress": "Yükleme halihazırda devam ediyor. Bir süre sonra deneyin", diff --git a/i18n/zh_Hant.json b/i18n/zh_Hant.json index fe9108c116..1f57b2a7ae 100644 --- a/i18n/zh_Hant.json +++ b/i18n/zh_Hant.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "開啟前台備份", "backup_controller_page_uploading_file_info": "上傳中的檔案資訊", "backup_err_only_album": "不能移除唯一的相簿", + "backup_error_sync_failed": "同步失敗。 無法處理備份。", "backup_info_card_assets": "個媒體", "backup_manual_cancelled": "已取消", "backup_manual_in_progress": "上傳正在進行中,請稍後再試", diff --git a/i18n/zh_SIMPLIFIED.json b/i18n/zh_SIMPLIFIED.json index 1f1455aa19..3ed4a14a2b 100644 --- a/i18n/zh_SIMPLIFIED.json +++ b/i18n/zh_SIMPLIFIED.json @@ -599,6 +599,7 @@ "backup_controller_page_turn_on": "开启前台备份", "backup_controller_page_uploading_file_info": "正在上传中的文件信息", "backup_err_only_album": "不能移除唯一的一个相册", + "backup_error_sync_failed": "同步失败。无法处理备份。", "backup_info_card_assets": "项", "backup_manual_cancelled": "已取消", "backup_manual_in_progress": "上传正在进行中,请稍后再试", From bb72d723e25fcf886ab7556d4a9d4b57fbfe36e6 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:12:12 +0000 Subject: [PATCH 027/134] chore: version v2.0.1 --- cli/package.json | 2 +- docs/static/archived-versions.json | 4 ++++ e2e/package.json | 2 +- machine-learning/pyproject.toml | 2 +- mobile/android/fastlane/Fastfile | 4 ++-- mobile/ios/fastlane/Fastfile | 2 +- mobile/openapi/README.md | 2 +- mobile/pubspec.yaml | 2 +- open-api/immich-openapi-specs.json | 2 +- open-api/typescript-sdk/package.json | 2 +- open-api/typescript-sdk/src/fetch-client.ts | 2 +- server/package.json | 2 +- web/package.json | 2 +- 13 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cli/package.json b/cli/package.json index ce2dab0bd4..5dffbf1c66 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@immich/cli", - "version": "2.2.95", + "version": "2.2.96", "description": "Command Line Interface (CLI) for Immich", "type": "module", "exports": "./dist/index.js", diff --git a/docs/static/archived-versions.json b/docs/static/archived-versions.json index 61e6fa2a67..46dec8c35e 100644 --- a/docs/static/archived-versions.json +++ b/docs/static/archived-versions.json @@ -1,4 +1,8 @@ [ + { + "label": "v2.0.1", + "url": "https://docs.v2.0.1.archive.immich.app" + }, { "label": "v2.0.0", "url": "https://docs.v2.0.0.archive.immich.app" diff --git a/e2e/package.json b/e2e/package.json index 1f9b7d197c..d2536ea00d 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "immich-e2e", - "version": "2.0.0", + "version": "2.0.1", "description": "", "main": "index.js", "type": "module", diff --git a/machine-learning/pyproject.toml b/machine-learning/pyproject.toml index 93e8bb3898..9eb4f7c0f6 100644 --- a/machine-learning/pyproject.toml +++ b/machine-learning/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "immich-ml" -version = "2.0.0" +version = "2.0.1" description = "" authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }] requires-python = ">=3.10,<4.0" diff --git a/mobile/android/fastlane/Fastfile b/mobile/android/fastlane/Fastfile index f359e3b614..cbc2440fa9 100644 --- a/mobile/android/fastlane/Fastfile +++ b/mobile/android/fastlane/Fastfile @@ -35,8 +35,8 @@ platform :android do task: 'bundle', build_type: 'Release', properties: { - "android.injected.version.code" => 3020, - "android.injected.version.name" => "2.0.0", + "android.injected.version.code" => 3021, + "android.injected.version.name" => "2.0.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') diff --git a/mobile/ios/fastlane/Fastfile b/mobile/ios/fastlane/Fastfile index 71d56a98f9..f72597fe33 100644 --- a/mobile/ios/fastlane/Fastfile +++ b/mobile/ios/fastlane/Fastfile @@ -22,7 +22,7 @@ platform :ios do path: "./Runner.xcodeproj", ) increment_version_number( - version_number: "2.0.0" + version_number: "2.0.1" ) increment_build_number( build_number: latest_testflight_build_number + 1, diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 47277a15bb..4a7d516a9d 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -3,7 +3,7 @@ Immich API This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 2.0.0 +- API version: 2.0.1 - Generator version: 7.8.0 - Build package: org.openapitools.codegen.languages.DartClientCodegen diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 6e143c448d..565306229a 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -2,7 +2,7 @@ name: immich_mobile description: Immich - selfhosted backup media file on mobile phone publish_to: 'none' -version: 2.0.0+3020 +version: 2.0.1+3021 environment: sdk: '>=3.8.0 <4.0.0' diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 996eeef87e..b574bc6624 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -9858,7 +9858,7 @@ "info": { "title": "Immich", "description": "Immich API", - "version": "2.0.0", + "version": "2.0.1", "contact": {} }, "tags": [], diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 5497923a22..4b2d8b9ec9 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@immich/sdk", - "version": "2.0.0", + "version": "2.0.1", "description": "Auto-generated TypeScript SDK for the Immich API", "type": "module", "main": "./build/index.js", diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index ab885eb9c5..c8a69dfe8c 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1,6 +1,6 @@ /** * Immich - * 2.0.0 + * 2.0.1 * DO NOT MODIFY - This file has been generated using oazapfts. * See https://www.npmjs.com/package/oazapfts */ diff --git a/server/package.json b/server/package.json index e2845b82ef..9854013002 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "immich", - "version": "2.0.0", + "version": "2.0.1", "description": "", "author": "", "private": true, diff --git a/web/package.json b/web/package.json index e7edd4e108..50fd1cd0fb 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "immich-web", - "version": "2.0.0", + "version": "2.0.1", "license": "GNU Affero General Public License version 3", "type": "module", "scripts": { From 29acf8997923351d512fd70ed775fd369388fc54 Mon Sep 17 00:00:00 2001 From: Xavier Dupuis Date: Mon, 6 Oct 2025 06:57:15 -0400 Subject: [PATCH 028/134] fix(docs): link to immich docs does not lead correctly to docs (#22687) --- web/src/lib/modals/HelpAndFeedbackModal.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/lib/modals/HelpAndFeedbackModal.svelte b/web/src/lib/modals/HelpAndFeedbackModal.svelte index 353eae9f0f..f25f7d1704 100644 --- a/web/src/lib/modals/HelpAndFeedbackModal.svelte +++ b/web/src/lib/modals/HelpAndFeedbackModal.svelte @@ -18,7 +18,7 @@

{$t('official_immich_resources')}

- +

{$t('documentation')} From 1a2a46014e3777c747f4432958d252f49714b952 Mon Sep 17 00:00:00 2001 From: Sergey Katsubo Date: Mon, 6 Oct 2025 18:37:35 +0300 Subject: [PATCH 029/134] fix(server): fix chunking Postgres query parameters (#22684) --- server/src/decorators.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/decorators.ts b/server/src/decorators.ts index 2f1e76d097..8a8e23d880 100644 --- a/server/src/decorators.ts +++ b/server/src/decorators.ts @@ -87,7 +87,7 @@ export function Chunked( return Promise.all( chunks(argument, chunkSize).map(async (chunk) => { - await Reflect.apply(originalMethod, this, [ + return await Reflect.apply(originalMethod, this, [ ...arguments_.slice(0, parameterIndex), chunk, ...arguments_.slice(parameterIndex + 1), @@ -103,7 +103,7 @@ export function ChunkedArray(options?: { paramIndex?: number }): MethodDecorator } export function ChunkedSet(options?: { paramIndex?: number }): MethodDecorator { - return Chunked({ ...options, mergeFn: setUnion }); + return Chunked({ ...options, mergeFn: (args: Set[]) => setUnion(...args) }); } const UUID = '00000000-0000-4000-a000-000000000000'; From 9da138e01e9f1fb47d53d7e8a9d42d98377d39d4 Mon Sep 17 00:00:00 2001 From: Sergey Katsubo Date: Mon, 6 Oct 2025 18:54:07 +0300 Subject: [PATCH 030/134] feat(server): improve checkAlbumAccess query performance (#22467) * Fix slow SQL query in checkAlbumAccess caused by the array overlap operator && * Update access.repository.sql * Rewrite the query to pass assetIds once as a single array parameter --- server/src/queries/access.repository.sql | 11 ++++++++++- server/src/repositories/access.repository.ts | 11 +++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/server/src/queries/access.repository.sql b/server/src/queries/access.repository.sql index 9aecaafb52..e98c5c6d98 100644 --- a/server/src/queries/access.repository.sql +++ b/server/src/queries/access.repository.sql @@ -71,6 +71,11 @@ where and "shared_link"."albumId" in ($2) -- AccessRepository.asset.checkAlbumAccess +with + "target" as ( + select + array[$1]::uuid[] as "ids" + ) select "asset"."id", "asset"."livePhotoVideoId" @@ -82,8 +87,12 @@ from left join "album_user" as "albumUsers" on "albumUsers"."albumsId" = "album"."id" left join "user" on "user"."id" = "albumUsers"."usersId" and "user"."deletedAt" is null + cross join "target" where - array["asset"."id", "asset"."livePhotoVideoId"] && array[$1]::uuid[] + ( + "asset"."id" = any (target.ids) + or "asset"."livePhotoVideoId" = any (target.ids) + ) and ( "album"."ownerId" = $2 or "user"."id" = $3 diff --git a/server/src/repositories/access.repository.ts b/server/src/repositories/access.repository.ts index 5cceb6dbe0..ca12ff040b 100644 --- a/server/src/repositories/access.repository.ts +++ b/server/src/repositories/access.repository.ts @@ -136,6 +136,7 @@ class AssetAccess { } return this.db + .with('target', (qb) => qb.selectNoFrom(sql`array[${sql.join([...assetIds])}]::uuid[]`.as('ids'))) .selectFrom('album') .innerJoin('album_asset as albumAssets', 'album.id', 'albumAssets.albumsId') .innerJoin('asset', (join) => @@ -143,11 +144,13 @@ class AssetAccess { ) .leftJoin('album_user as albumUsers', 'albumUsers.albumsId', 'album.id') .leftJoin('user', (join) => join.onRef('user.id', '=', 'albumUsers.usersId').on('user.deletedAt', 'is', null)) + .crossJoin('target') .select(['asset.id', 'asset.livePhotoVideoId']) - .where( - sql`array["asset"."id", "asset"."livePhotoVideoId"]`, - '&&', - sql`array[${sql.join([...assetIds])}]::uuid[] `, + .where((eb) => + eb.or([ + eb('asset.id', '=', sql`any(target.ids)`), + eb('asset.livePhotoVideoId', '=', sql`any(target.ids)`), + ]), ) .where((eb) => eb.or([eb('album.ownerId', '=', userId), eb('user.id', '=', userId)])) .where('album.deletedAt', 'is', null) From 075436a5d184bf30f46acc5d4251d9adceb29477 Mon Sep 17 00:00:00 2001 From: Adrian Jost <22987140+adrianjost@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:55:54 +0200 Subject: [PATCH 031/134] chore: mark VSCode tasks as background tasks (#22631) VSCode expect tasks that aren't marked as background tasks to finish eventually. That's not how a dev-server is supposed to work, we expect it to run for basically infinite time. By marking those tasks as background tasks, VSCode stops showing the infinite loading spinner on those processes. --- .vscode/tasks.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 119d6a961b..278e7e4fd3 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,6 +5,7 @@ "label": "Fix Permissions, Install Dependencies", "type": "shell", "command": "[ -f /immich-devcontainer/container-start.sh ] && /immich-devcontainer/container-start.sh || exit 0", + "isBackground": true, "presentation": { "echo": true, "reveal": "always", @@ -25,6 +26,7 @@ "dependsOn": ["Fix Permissions, Install Dependencies"], "type": "shell", "command": "[ -f /immich-devcontainer/container-start-backend.sh ] && /immich-devcontainer/container-start-backend.sh || exit 0", + "isBackground": true, "presentation": { "echo": true, "reveal": "always", @@ -45,6 +47,7 @@ "dependsOn": ["Fix Permissions, Install Dependencies"], "type": "shell", "command": "[ -f /immich-devcontainer/container-start-frontend.sh ] && /immich-devcontainer/container-start-frontend.sh || exit 0", + "isBackground": true, "presentation": { "echo": true, "reveal": "always", From 51150a3ed1db79c33d8c08706345a03c41b61ddd Mon Sep 17 00:00:00 2001 From: Cokodayo <78474654+CaptainJack2491@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:09:40 +0100 Subject: [PATCH 032/134] fix(ml): Resolve IPv6 startup crash and healthcheck failure (#22387) * fix(ml): Resolve IPv6 startup crash and healthcheck failure Fixes #13782 * fix(ml): updated the fix to use the std lib * Apply code formatting to __main__.py --- machine-learning/immich_ml/__main__.py | 8 +++++++- machine-learning/scripts/healthcheck.py | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/machine-learning/immich_ml/__main__.py b/machine-learning/immich_ml/__main__.py index d15b0fb321..f453dda0c5 100644 --- a/machine-learning/immich_ml/__main__.py +++ b/machine-learning/immich_ml/__main__.py @@ -1,6 +1,7 @@ import os import signal import subprocess +from ipaddress import ip_address from pathlib import Path from .config import log, non_prefixed_settings, settings @@ -12,6 +13,11 @@ else: module_dir = Path(__file__).parent +bind_host = non_prefixed_settings.immich_host +if ip_address(bind_host).version == 6: + bind_host = f"[{bind_host}]" +bind_address = f"{bind_host}:{non_prefixed_settings.immich_port}" + try: with subprocess.Popen( [ @@ -24,7 +30,7 @@ try: "-c", module_dir / "gunicorn_conf.py", "-b", - f"{non_prefixed_settings.immich_host}:{non_prefixed_settings.immich_port}", + bind_address, "-w", str(settings.workers), "-t", diff --git a/machine-learning/scripts/healthcheck.py b/machine-learning/scripts/healthcheck.py index 82c6cad790..97527290c7 100644 --- a/machine-learning/scripts/healthcheck.py +++ b/machine-learning/scripts/healthcheck.py @@ -1,5 +1,6 @@ import os import sys +from ipaddress import ip_address import requests @@ -7,6 +8,7 @@ port = os.getenv("IMMICH_PORT", 3003) host = os.getenv("IMMICH_HOST", "0.0.0.0") host = "localhost" if host == "0.0.0.0" else host +host = f"[{host}]" if ip_address(host).version == 6 else host try: response = requests.get(f"http://{host}:{port}/ping", timeout=2) From 24234bedf14c21b71e70987587ea8e371d3e795f Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:13:10 -0400 Subject: [PATCH 033/134] fix(server): override reserved color metadata for video thumbnails (#22348) override reserved metadata --- server/src/repositories/media.repository.ts | 3 +++ server/src/services/media.service.spec.ts | 20 +++++++++++++++ server/src/types.ts | 3 +++ server/src/utils/media.ts | 27 ++++++++++++++++++--- server/test/fixtures/media.stub.ts | 11 +++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/server/src/repositories/media.repository.ts b/server/src/repositories/media.repository.ts index fa36c41798..d98e018efb 100644 --- a/server/src/repositories/media.repository.ts +++ b/server/src/repositories/media.repository.ts @@ -203,6 +203,9 @@ export class MediaRepository { isHDR: stream.color_transfer === 'smpte2084' || stream.color_transfer === 'arib-std-b67', bitrate: this.parseInt(stream.bit_rate), pixelFormat: stream.pix_fmt || 'yuv420p', + colorPrimaries: stream.color_primaries, + colorSpace: stream.color_space, + colorTransfer: stream.color_transfer, })), audioStreams: results.streams .filter((stream) => stream.codec_type === 'audio') diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index e494dd9bcc..08606731a0 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -445,6 +445,7 @@ describe(MediaService.name, () => { }), ); }); + it('should not skip intra frames for MTS file', async () => { mocks.media.probe.mockResolvedValue(probeStub.videoStreamMTS); mocks.assetJob.getForGenerateThumbnailJob.mockResolvedValue(assetStub.video); @@ -462,6 +463,25 @@ describe(MediaService.name, () => { ); }); + it('should override reserved color metadata', async () => { + mocks.media.probe.mockResolvedValue(probeStub.videoStreamReserved); + mocks.assetJob.getForGenerateThumbnailJob.mockResolvedValue(assetStub.video); + await sut.handleGenerateThumbnails({ id: assetStub.video.id }); + + expect(mocks.media.transcode).toHaveBeenCalledWith( + '/original/path.ext', + expect.any(String), + expect.objectContaining({ + inputOptions: expect.arrayContaining([ + '-bsf:v hevc_metadata=colour_primaries=1:matrix_coefficients=1:transfer_characteristics=1', + ]), + outputOptions: expect.any(Array), + progress: expect.any(Object), + twoPass: false, + }), + ); + }); + it('should use scaling divisible by 2 even when using quick sync', async () => { mocks.media.probe.mockResolvedValue(probeStub.videoStream2160p); mocks.systemMetadata.get.mockResolvedValue({ ffmpeg: { accel: TranscodeHardwareAcceleration.Qsv } }); diff --git a/server/src/types.ts b/server/src/types.ts index ce0baa1672..da3889ef7c 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -88,6 +88,9 @@ export interface VideoStreamInfo { isHDR: boolean; bitrate: number; pixelFormat: string; + colorPrimaries?: string; + colorSpace?: string; + colorTransfer?: string; } export interface AudioStreamInfo { diff --git a/server/src/utils/media.ts b/server/src/utils/media.ts index 1ecd005315..f678a32b0f 100644 --- a/server/src/utils/media.ts +++ b/server/src/utils/media.ts @@ -392,9 +392,30 @@ export class ThumbnailConfig extends BaseConfig { getBaseInputOptions(videoStream: VideoStreamInfo, format?: VideoFormat): string[] { // skip_frame nointra skips all frames for some MPEG-TS files. Look at ffmpeg tickets 7950 and 7895 for more details. - return format?.formatName === 'mpegts' - ? ['-sws_flags accurate_rnd+full_chroma_int'] - : ['-skip_frame nointra', '-sws_flags accurate_rnd+full_chroma_int']; + const options = + format?.formatName === 'mpegts' + ? ['-sws_flags accurate_rnd+full_chroma_int'] + : ['-skip_frame nointra', '-sws_flags accurate_rnd+full_chroma_int']; + + const metadataOverrides = []; + if (videoStream.colorPrimaries === 'reserved') { + metadataOverrides.push('colour_primaries=1'); + } + + if (videoStream.colorSpace === 'reserved') { + metadataOverrides.push('matrix_coefficients=1'); + } + + if (videoStream.colorTransfer === 'reserved') { + metadataOverrides.push('transfer_characteristics=1'); + } + + if (metadataOverrides.length > 0) { + // workaround for https://fftrac-bg.ffmpeg.org/ticket/11020 + options.push(`-bsf:v ${videoStream.codecName}_metadata=${metadataOverrides.join(':')}`); + } + + return options; } getBaseOutputOptions() { diff --git a/server/test/fixtures/media.stub.ts b/server/test/fixtures/media.stub.ts index efbf21d317..727f5ae7cf 100644 --- a/server/test/fixtures/media.stub.ts +++ b/server/test/fixtures/media.stub.ts @@ -261,4 +261,15 @@ export const probeStub = { bitrate: 0, }, }), + videoStreamReserved: Object.freeze({ + ...probeStubDefault, + videoStreams: [ + { + ...probeStubDefaultVideoStream[0], + colorPrimaries: 'reserved', + colorSpace: 'reserved', + colorTransfer: 'reserved', + }, + ], + }), }; From a80b9be07cca86c865a174632d2748849126797f Mon Sep 17 00:00:00 2001 From: Yaros Date: Mon, 6 Oct 2025 18:18:00 +0200 Subject: [PATCH 034/134] fix(mobile): trash description cut off (#22662) --- mobile/lib/presentation/pages/drift_trash.page.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/lib/presentation/pages/drift_trash.page.dart b/mobile/lib/presentation/pages/drift_trash.page.dart index 43e9217cdf..8713166027 100644 --- a/mobile/lib/presentation/pages/drift_trash.page.dart +++ b/mobile/lib/presentation/pages/drift_trash.page.dart @@ -44,10 +44,7 @@ class DriftTrashPage extends StatelessWidget { return SliverPadding( padding: const EdgeInsets.all(16.0), sliver: SliverToBoxAdapter( - child: SizedBox( - height: 24.0, - child: const Text("trash_page_info").t(context: context, args: {"days": "$trashDays"}), - ), + child: const Text("trash_page_info").t(context: context, args: {"days": "$trashDays"}), ), ); }, From 55ad83d80d61dd13fca7b4869997224071011964 Mon Sep 17 00:00:00 2001 From: Yaros Date: Mon, 6 Oct 2025 18:19:57 +0200 Subject: [PATCH 035/134] fix(mobile): empty album description does not save (#22649) --- mobile/lib/presentation/pages/drift_remote_album.page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/presentation/pages/drift_remote_album.page.dart b/mobile/lib/presentation/pages/drift_remote_album.page.dart index e0fe5ee62b..34d8919674 100644 --- a/mobile/lib/presentation/pages/drift_remote_album.page.dart +++ b/mobile/lib/presentation/pages/drift_remote_album.page.dart @@ -300,7 +300,7 @@ class _EditAlbumDialogState extends ConsumerState<_EditAlbumDialog> { await ref .read(remoteAlbumProvider.notifier) - .updateAlbum(widget.album.id, name: newTitle, description: newDescription.isEmpty ? null : newDescription); + .updateAlbum(widget.album.id, name: newTitle, description: newDescription); if (mounted) { Navigator.of( From 43b06a036da4be712aee7f5d76a25ea2183cada7 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:20:30 -0400 Subject: [PATCH 036/134] fix(mobile): video player using ref after disposal (#21843) check if disposed --- .../widgets/asset_viewer/video_viewer.widget.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart index fa7f204596..3040af590e 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart @@ -88,10 +88,18 @@ class NativeVideoViewer extends HookConsumerWidget { } final videoAsset = await ref.read(assetServiceProvider).getAsset(asset) ?? asset; + if (!context.mounted) { + return null; + } + try { if (videoAsset.hasLocal && videoAsset.livePhotoVideoId == null) { final id = videoAsset is LocalAsset ? videoAsset.id : (videoAsset as RemoteAsset).localId!; final file = await const StorageRepository().getFileForAsset(id); + if (!context.mounted) { + return null; + } + if (file == null) { throw Exception('No file found for the video'); } @@ -289,7 +297,7 @@ class NativeVideoViewer extends HookConsumerWidget { ref.read(videoPlaybackValueProvider.notifier).reset(); final source = await videoSource; - if (source == null) { + if (source == null || !context.mounted) { return; } From 0fd16a3c46387ef840d36cd0bccf1994630a368a Mon Sep 17 00:00:00 2001 From: USBAkimbo <71508071+USBAkimbo@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:34:01 +0100 Subject: [PATCH 037/134] docs: add job order diagram (#22673) * docs: add job order diagram * wording --------- Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com> --- docs/docs/administration/jobs-workers.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/docs/administration/jobs-workers.md b/docs/docs/administration/jobs-workers.md index 75f50599a0..8ed3ba2694 100644 --- a/docs/docs/administration/jobs-workers.md +++ b/docs/docs/administration/jobs-workers.md @@ -55,3 +55,19 @@ Additionally, some jobs (such as memories generation) run on a schedule, which i :::note Some jobs ([External Libraries](/features/libraries) scanning, Database Dump) are configured in their own sections in System Settings. ::: + +## Job processing order + +The below diagram shows the job run order for newly uploaded files + +```mermaid +graph TD + A[Asset Upload] --> B[Metadata Extraction] + B --> C[Storage Template Migration] + C --> D["Thumbnail Generation (Large, small, blurred and person)"] + D --> E[Smart Search] + D --> F[Face Detection] + D --> G[Video Transcoding] + E --> H[Duplicate Detection] + F --> I[Facial Recognition] +``` From 42f46b11f4746cb8e1d5b5a2777e77b2ba62a2fd Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Mon, 6 Oct 2025 12:36:20 -0400 Subject: [PATCH 038/134] fix: missing responsive calculation in UserPageLayout (#22455) --- web/src/lib/components/layouts/user-page-layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/lib/components/layouts/user-page-layout.svelte b/web/src/lib/components/layouts/user-page-layout.svelte index 70e17792e0..7f40bf7a6d 100644 --- a/web/src/lib/components/layouts/user-page-layout.svelte +++ b/web/src/lib/components/layouts/user-page-layout.svelte @@ -49,7 +49,7 @@

From 6973683ea70a1919cf48dee5ebc5d8fc3fbf9aed Mon Sep 17 00:00:00 2001 From: grgergo Date: Mon, 6 Oct 2025 16:38:41 +0000 Subject: [PATCH 039/134] fix: use full-size image for non-web-compatible panoramas (#20359) * fix(web): use full-size image for non-web-compatible panoramas * always generate full-size image for panoramas * add unit test * fix formatting --------- Co-authored-by: gergo= --- server/src/services/media.service.spec.ts | 31 +++++++++++++++ server/src/services/media.service.ts | 4 +- server/test/fixtures/asset.stub.ts | 39 +++++++++++++++++++ .../asset-viewer/image-panorama-viewer.svelte | 6 ++- 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 08606731a0..ad52b0e8b0 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -861,6 +861,37 @@ describe(MediaService.name, () => { ); }); + it('should always generate full-size preview from non-web-friendly panoramas', async () => { + mocks.systemMetadata.get.mockResolvedValue({ image: { fullsize: { enabled: false } } }); + mocks.media.extract.mockResolvedValue({ buffer: extractedBuffer, format: RawExtractedFormat.Jpeg }); + mocks.media.getImageDimensions.mockResolvedValue({ width: 3840, height: 2160 }); + + mocks.assetJob.getForGenerateThumbnailJob.mockResolvedValue(assetStub.panoramaTif); + + await sut.handleGenerateThumbnails({ id: assetStub.image.id }); + + expect(mocks.media.decodeImage).toHaveBeenCalledOnce(); + expect(mocks.media.decodeImage).toHaveBeenCalledWith(assetStub.panoramaTif.originalPath, { + colorspace: Colorspace.Srgb, + orientation: undefined, + processInvalidImages: false, + size: undefined, + }); + + expect(mocks.media.generateThumbnail).toHaveBeenCalledTimes(3); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + rawBuffer, + { + colorspace: Colorspace.Srgb, + format: ImageFormat.Jpeg, + quality: 80, + processInvalidImages: false, + raw: rawInfo, + }, + expect.any(String), + ); + }); + it('should respect encoding options when generating full-size preview', async () => { mocks.systemMetadata.get.mockResolvedValue({ image: { fullsize: { enabled: true, format: ImageFormat.Webp, quality: 90 } }, diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index a2c3c5ed42..6caa682f5e 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -271,7 +271,9 @@ export class MediaService extends BaseService { // Handle embedded preview extraction for RAW files const extractEmbedded = image.extractEmbedded && mimeTypes.isRaw(asset.originalFileName); const extracted = extractEmbedded ? await this.extractImage(asset.originalPath, image.preview.size) : null; - const generateFullsize = image.fullsize.enabled && !mimeTypes.isWebSupportedImage(asset.originalPath); + const generateFullsize = + (image.fullsize.enabled || asset.exifInfo.projectionType == 'EQUIRECTANGULAR') && + !mimeTypes.isWebSupportedImage(asset.originalPath); const convertFullsize = generateFullsize && (!extracted || !mimeTypes.isWebSupportedImage(` .${extracted.format}`)); const { info, data, colorspace } = await this.decodeImage( diff --git a/server/test/fixtures/asset.stub.ts b/server/test/fixtures/asset.stub.ts index dd1f98d6eb..0fd2189268 100644 --- a/server/test/fixtures/asset.stub.ts +++ b/server/test/fixtures/asset.stub.ts @@ -866,4 +866,43 @@ export const assetStub = { stackId: null, visibility: AssetVisibility.Timeline, }), + panoramaTif: Object.freeze({ + id: 'asset-id', + status: AssetStatus.Active, + deviceAssetId: 'device-asset-id', + fileModifiedAt: new Date('2023-02-23T05:06:29.716Z'), + fileCreatedAt: new Date('2023-02-23T05:06:29.716Z'), + owner: userStub.user1, + ownerId: 'user-id', + deviceId: 'device-id', + originalPath: '/original/path.tif', + checksum: Buffer.from('file hash', 'utf8'), + type: AssetType.Image, + files, + thumbhash: Buffer.from('blablabla', 'base64'), + encodedVideoPath: null, + createdAt: new Date('2023-02-23T05:06:29.716Z'), + updatedAt: new Date('2023-02-23T05:06:29.716Z'), + localDateTime: new Date('2023-02-23T05:06:29.716Z'), + isFavorite: true, + duration: null, + isExternal: false, + livePhotoVideo: null, + livePhotoVideoId: null, + sharedLinks: [], + originalFileName: 'asset-id.tif', + faces: [], + deletedAt: null, + sidecarPath: null, + exifInfo: { + fileSizeInByte: 5000, + projectionType: 'EQUIRECTANGULAR', + } as Exif, + duplicateId: null, + isOffline: false, + updateId: '42', + libraryId: null, + stackId: null, + visibility: AssetVisibility.Timeline, + }), }; diff --git a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte index 3e7f869e7c..7334aab4d4 100644 --- a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte +++ b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte @@ -1,6 +1,6 @@ - + -{#if isShowDeleteConfirmation} - (isShowDeleteConfirmation = false)} - onConfirm={() => handlePromiseError(trashOrDelete(true))} - /> -{/if} - -{#if isShowSelectDate} - { - isShowSelectDate = false; - if (dateString.mode == 'absolute') { - const asset = await timelineManager.getClosestAssetToDate( - (DateTime.fromISO(dateString.date) as DateTime).toObject(), - ); - if (asset) { - setFocusAsset(asset); - } - } - }} - onCancel={() => (isShowSelectDate = false)} - /> -{/if} + scrollToAsset(asset) ?? false} + {timelineManager} + {assetInteraction} + bind:isShowDeleteConfirmation + {onEscape} +/> {#if timelineManager.months.length > 0} + import { goto } from '$app/navigation'; + import { shortcuts, type ShortcutOptions } from '$lib/actions/shortcut'; + import DeleteAssetDialog from '$lib/components/photos-page/delete-asset-dialog.svelte'; + import ChangeDate, { + type AbsoluteResult, + type RelativeResult, + } from '$lib/components/shared-components/change-date.svelte'; + import { + setFocusToAsset as setFocusAssetInit, + setFocusTo as setFocusToInit, + } from '$lib/components/timeline/actions/focus-actions'; + import { AppRoute } from '$lib/constants'; + import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; + import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; + import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte'; + import type { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; + import { assetViewingStore } from '$lib/stores/asset-viewing.store'; + import { showDeleteModal } from '$lib/stores/preferences.store'; + import { searchStore } from '$lib/stores/search.svelte'; + import { featureFlags } from '$lib/stores/server-config.store'; + import { handlePromiseError } from '$lib/utils'; + import { deleteAssets, updateStackedAssetInTimeline } from '$lib/utils/actions'; + import { archiveAssets, cancelMultiselect, selectAllAssets, stackAssets } from '$lib/utils/asset-utils'; + import { AssetVisibility } from '@immich/sdk'; + import { modalManager } from '@immich/ui'; + import { DateTime } from 'luxon'; + let { isViewing: showAssetViewer } = assetViewingStore; + + interface Props { + timelineManager: TimelineManager; + assetInteraction: AssetInteraction; + isShowDeleteConfirmation: boolean; + onEscape?: () => void; + scrollToAsset: (asset: TimelineAsset) => boolean; + } + + let { + timelineManager = $bindable(), + assetInteraction, + isShowDeleteConfirmation = $bindable(false), + onEscape, + scrollToAsset, + }: Props = $props(); + + let isShowSelectDate = $state(false); + + const trashOrDelete = async (force: boolean = false) => { + isShowDeleteConfirmation = false; + await deleteAssets( + !(isTrashEnabled && !force), + (assetIds) => timelineManager.removeAssets(assetIds), + assetInteraction.selectedAssets, + !isTrashEnabled || force ? undefined : (assets) => timelineManager.addAssets(assets), + ); + assetInteraction.clearMultiselect(); + }; + + const onDelete = () => { + const hasTrashedAsset = assetInteraction.selectedAssets.some((asset) => asset.isTrashed); + + if ($showDeleteModal && (!isTrashEnabled || hasTrashedAsset)) { + isShowDeleteConfirmation = true; + return; + } + handlePromiseError(trashOrDelete(hasTrashedAsset)); + }; + + const onForceDelete = () => { + if ($showDeleteModal) { + isShowDeleteConfirmation = true; + return; + } + handlePromiseError(trashOrDelete(true)); + }; + + const onStackAssets = async () => { + const result = await stackAssets(assetInteraction.selectedAssets); + + updateStackedAssetInTimeline(timelineManager, result); + + onEscape?.(); + }; + + const toggleArchive = async () => { + const visibility = assetInteraction.isAllArchived ? AssetVisibility.Timeline : AssetVisibility.Archive; + const ids = await archiveAssets(assetInteraction.selectedAssets, visibility); + timelineManager.updateAssetOperation(ids, (asset) => { + asset.visibility = visibility; + return { remove: false }; + }); + deselectAllAssets(); + }; + + let shiftKeyIsDown = $state(false); + + const deselectAllAssets = () => { + cancelMultiselect(assetInteraction); + }; + + const onKeyDown = (event: KeyboardEvent) => { + if (searchStore.isSearchEnabled) { + return; + } + + if (event.key === 'Shift') { + event.preventDefault(); + shiftKeyIsDown = true; + } + }; + + const onKeyUp = (event: KeyboardEvent) => { + if (searchStore.isSearchEnabled) { + return; + } + + if (event.key === 'Shift') { + event.preventDefault(); + shiftKeyIsDown = false; + } + }; + + const onSelectStart = (e: Event) => { + if (assetInteraction.selectionActive && shiftKeyIsDown) { + e.preventDefault(); + } + }; + + const isTrashEnabled = $derived($featureFlags.loaded && $featureFlags.trash); + const isEmpty = $derived(timelineManager.isInitialized && timelineManager.months.length === 0); + const idsSelectedAssets = $derived(assetInteraction.selectedAssets.map(({ id }) => id)); + let isShortcutModalOpen = false; + + const handleOpenShortcutModal = async () => { + if (isShortcutModalOpen) { + return; + } + + isShortcutModalOpen = true; + await modalManager.show(ShortcutsModal, {}); + isShortcutModalOpen = false; + }; + + $effect(() => { + if (isEmpty) { + assetInteraction.clearMultiselect(); + } + }); + + const setFocusTo = setFocusToInit.bind(undefined, scrollToAsset, timelineManager); + const setFocusAsset = setFocusAssetInit.bind(undefined, scrollToAsset); + + let shortcutList = $derived( + (() => { + if (searchStore.isSearchEnabled || $showAssetViewer) { + return []; + } + + const shortcuts: ShortcutOptions[] = [ + { shortcut: { key: '?', shift: true }, onShortcut: handleOpenShortcutModal }, + { shortcut: { key: '/' }, onShortcut: () => goto(AppRoute.EXPLORE) }, + { shortcut: { key: 'A', ctrl: true }, onShortcut: () => selectAllAssets(timelineManager, assetInteraction) }, + { shortcut: { key: 'ArrowRight' }, onShortcut: () => setFocusTo('earlier', 'asset') }, + { shortcut: { key: 'ArrowLeft' }, onShortcut: () => setFocusTo('later', 'asset') }, + { shortcut: { key: 'D' }, onShortcut: () => setFocusTo('earlier', 'day') }, + { shortcut: { key: 'D', shift: true }, onShortcut: () => setFocusTo('later', 'day') }, + { shortcut: { key: 'M' }, onShortcut: () => setFocusTo('earlier', 'month') }, + { shortcut: { key: 'M', shift: true }, onShortcut: () => setFocusTo('later', 'month') }, + { shortcut: { key: 'Y' }, onShortcut: () => setFocusTo('earlier', 'year') }, + { shortcut: { key: 'Y', shift: true }, onShortcut: () => setFocusTo('later', 'year') }, + { shortcut: { key: 'G' }, onShortcut: () => (isShowSelectDate = true) }, + ]; + if (onEscape) { + shortcuts.push({ shortcut: { key: 'Escape' }, onShortcut: onEscape }); + } + + if (assetInteraction.selectionActive) { + shortcuts.push( + { shortcut: { key: 'Delete' }, onShortcut: onDelete }, + { shortcut: { key: 'Delete', shift: true }, onShortcut: onForceDelete }, + { shortcut: { key: 'D', ctrl: true }, onShortcut: () => deselectAllAssets() }, + { shortcut: { key: 's' }, onShortcut: () => onStackAssets() }, + { shortcut: { key: 'a', shift: true }, onShortcut: toggleArchive }, + ); + } + + return shortcuts; + })(), + ); + + + + +{#if isShowDeleteConfirmation} + (isShowDeleteConfirmation = false)} + onConfirm={() => handlePromiseError(trashOrDelete(true))} + /> +{/if} + +{#if isShowSelectDate} + { + isShowSelectDate = false; + if (dateString.mode == 'absolute') { + const asset = await timelineManager.getClosestAssetToDate( + (DateTime.fromISO(dateString.date) as DateTime).toObject(), + ); + if (asset) { + setFocusAsset(asset); + } + } + }} + onCancel={() => (isShowSelectDate = false)} + /> +{/if} From 78fbe0fd49c18b04b684142504075cbec803ce55 Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Tue, 7 Oct 2025 09:58:59 -0400 Subject: [PATCH 061/134] feat: make skeleton title optional (#22396) feat: skeleton title is optional feat: skeleton title optional --- web/src/lib/elements/Skeleton.svelte | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/web/src/lib/elements/Skeleton.svelte b/web/src/lib/elements/Skeleton.svelte index 7ce2c3cee3..8ee05f4e61 100644 --- a/web/src/lib/elements/Skeleton.svelte +++ b/web/src/lib/elements/Skeleton.svelte @@ -1,18 +1,20 @@
-
- {title} -
+ {#if title} +
+ {title} +
+ {/if}
Date: Tue, 7 Oct 2025 10:01:06 -0400 Subject: [PATCH 062/134] refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component (#22268) refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component - Extracted asset viewer navigation and action handling logic from Timeline.svelte into a dedicated TimelineAssetViewer component - Reduces Timeline.svelte complexity by ~150 lines and improves separation of concerns - No functional changes - purely a refactoring to improve code organization ## Changes - Created new TimelineAssetViewer.svelte component containing all asset viewer-related logic - Moved handlePrevious, handleNext, handleRandom, handleClose, handlePreAction, and handleAction methods - Timeline.svelte now only passes required props to the new component - Maintained all existing functionality including navigation, asset actions, and stack management --- .../lib/components/timeline/Timeline.svelte | 147 +-------------- .../timeline/TimelineAssetViewer.svelte | 177 ++++++++++++++++++ 2 files changed, 182 insertions(+), 142 deletions(-) create mode 100644 web/src/lib/components/timeline/TimelineAssetViewer.svelte diff --git a/web/src/lib/components/timeline/Timeline.svelte b/web/src/lib/components/timeline/Timeline.svelte index ff8386aae9..f323235a13 100644 --- a/web/src/lib/components/timeline/Timeline.svelte +++ b/web/src/lib/components/timeline/Timeline.svelte @@ -2,14 +2,13 @@ import { afterNavigate, beforeNavigate } from '$app/navigation'; import { page } from '$app/stores'; import { resizeObserver, type OnResizeCallback } from '$lib/actions/resize-observer'; - import type { Action } from '$lib/components/asset-viewer/actions/action'; import Scrubber from '$lib/components/timeline/Scrubber.svelte'; + import TimelineAssetViewer from '$lib/components/timeline/TimelineAssetViewer.svelte'; import TimelineKeyboardActions from '$lib/components/timeline/actions/TimelineKeyboardActions.svelte'; import { AssetAction } from '$lib/constants'; import HotModuleReload from '$lib/elements/HotModuleReload.svelte'; import Portal from '$lib/elements/Portal.svelte'; import Skeleton from '$lib/elements/Skeleton.svelte'; - import { authManager } from '$lib/managers/auth-manager.svelte'; import type { DayGroup } from '$lib/managers/timeline-manager/day-group.svelte'; import type { MonthGroup } from '$lib/managers/timeline-manager/month-group.svelte'; import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; @@ -19,10 +18,9 @@ import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { isSelectingAllAssets } from '$lib/stores/assets-store.svelte'; import { mobileDevice } from '$lib/stores/mobile-device.svelte'; - import { updateStackedAssetInTimeline, updateUnstackedAssetInTimeline } from '$lib/utils/actions'; import { navigate } from '$lib/utils/navigation'; - import { getTimes, toTimelineAsset, type ScrubberListener, type TimelineYearMonth } from '$lib/utils/timeline-util'; - import { getAssetInfo, type AlbumResponseDto, type PersonResponseDto } from '@immich/sdk'; + import { getTimes, type ScrubberListener, type TimelineYearMonth } from '$lib/utils/timeline-util'; + import { type AlbumResponseDto, type PersonResponseDto } from '@immich/sdk'; import { DateTime } from 'luxon'; import { onMount, type Snippet } from 'svelte'; import type { UpdatePayload } from 'vite'; @@ -89,7 +87,7 @@ onThumbnailClick, }: Props = $props(); - let { isViewing: showAssetViewer, asset: viewingAsset, preloadAssets, gridScrollTarget, mutex } = assetViewingStore; + let { isViewing: showAssetViewer, asset: viewingAsset, gridScrollTarget } = assetViewingStore; let element: HTMLElement | undefined = $state(); @@ -392,126 +390,6 @@ } }; - const handlePrevious = async () => { - const release = await mutex.acquire(); - const laterAsset = await timelineManager.getLaterAsset($viewingAsset); - - if (laterAsset) { - const preloadAsset = await timelineManager.getLaterAsset(laterAsset); - const asset = await getAssetInfo({ ...authManager.params, id: laterAsset.id }); - assetViewingStore.setAsset(asset, preloadAsset ? [preloadAsset] : []); - await navigate({ targetRoute: 'current', assetId: laterAsset.id }); - } - - release(); - return !!laterAsset; - }; - - const handleNext = async () => { - const release = await mutex.acquire(); - const earlierAsset = await timelineManager.getEarlierAsset($viewingAsset); - - if (earlierAsset) { - const preloadAsset = await timelineManager.getEarlierAsset(earlierAsset); - const asset = await getAssetInfo({ ...authManager.params, id: earlierAsset.id }); - assetViewingStore.setAsset(asset, preloadAsset ? [preloadAsset] : []); - await navigate({ targetRoute: 'current', assetId: earlierAsset.id }); - } - - release(); - return !!earlierAsset; - }; - - const handleRandom = async () => { - const randomAsset = await timelineManager.getRandomAsset(); - - if (randomAsset) { - const asset = await getAssetInfo({ ...authManager.params, id: randomAsset.id }); - assetViewingStore.setAsset(asset); - await navigate({ targetRoute: 'current', assetId: randomAsset.id }); - return asset; - } - }; - - const handleClose = async (asset: { id: string }) => { - assetViewingStore.showAssetViewer(false); - showSkeleton = true; - $gridScrollTarget = { at: asset.id }; - await navigate({ targetRoute: 'current', assetId: null, assetGridRouteSearchParams: $gridScrollTarget }); - }; - - const handlePreAction = async (action: Action) => { - switch (action.type) { - case removeAction: - case AssetAction.TRASH: - case AssetAction.RESTORE: - case AssetAction.DELETE: - case AssetAction.ARCHIVE: - case AssetAction.SET_VISIBILITY_LOCKED: - case AssetAction.SET_VISIBILITY_TIMELINE: { - // find the next asset to show or close the viewer - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - (await handleNext()) || (await handlePrevious()) || (await handleClose(action.asset)); - - // delete after find the next one - timelineManager.removeAssets([action.asset.id]); - break; - } - } - }; - const handleAction = (action: Action) => { - switch (action.type) { - case AssetAction.ARCHIVE: - case AssetAction.UNARCHIVE: - case AssetAction.FAVORITE: - case AssetAction.UNFAVORITE: { - timelineManager.updateAssets([action.asset]); - break; - } - - case AssetAction.ADD: { - timelineManager.addAssets([action.asset]); - break; - } - - case AssetAction.UNSTACK: { - updateUnstackedAssetInTimeline(timelineManager, action.assets); - break; - } - case AssetAction.REMOVE_ASSET_FROM_STACK: { - timelineManager.addAssets([toTimelineAsset(action.asset)]); - if (action.stack) { - //Have to unstack then restack assets in timeline in order to update the stack count in the timeline. - updateUnstackedAssetInTimeline( - timelineManager, - action.stack.assets.map((asset) => toTimelineAsset(asset)), - ); - updateStackedAssetInTimeline(timelineManager, { - stack: action.stack, - toDeleteIds: action.stack.assets - .filter((asset) => asset.id !== action.stack?.primaryAssetId) - .map((asset) => asset.id), - }); - } - break; - } - case AssetAction.SET_STACK_PRIMARY_ASSET: { - //Have to unstack then restack assets in timeline in order for the currently removed new primary asset to be made visible. - updateUnstackedAssetInTimeline( - timelineManager, - action.stack.assets.map((asset) => toTimelineAsset(asset)), - ); - updateStackedAssetInTimeline(timelineManager, { - stack: action.stack, - toDeleteIds: action.stack.assets - .filter((asset) => asset.id !== action.stack.primaryAssetId) - .map((asset) => asset.id), - }); - break; - } - } - }; - let lastAssetMouseEvent: TimelineAsset | null = $state(null); let shiftKeyIsDown = $state(false); @@ -808,22 +686,7 @@ {#if $showAssetViewer} - {#await import('../asset-viewer/asset-viewer.svelte') then { default: AssetViewer }} - - {/await} + {/if} diff --git a/web/src/lib/components/timeline/TimelineAssetViewer.svelte b/web/src/lib/components/timeline/TimelineAssetViewer.svelte new file mode 100644 index 0000000000..17e3ed06f3 --- /dev/null +++ b/web/src/lib/components/timeline/TimelineAssetViewer.svelte @@ -0,0 +1,177 @@ + + +{#await import('../asset-viewer/asset-viewer.svelte') then { default: AssetViewer }} + +{/await} From 740ca14a68bb751b5703c77e8cc51f81a4a2c5fa Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Tue, 7 Oct 2025 17:58:26 +0200 Subject: [PATCH 063/134] chore: track full actions/cache version in comment (#22359) --- .github/workflows/build-mobile.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-mobile.yml b/.github/workflows/build-mobile.yml index 0996c8eccb..454b954597 100644 --- a/.github/workflows/build-mobile.yml +++ b/.github/workflows/build-mobile.yml @@ -73,7 +73,7 @@ jobs: - name: Restore Gradle Cache id: cache-gradle-restore - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | ~/.gradle/caches @@ -130,7 +130,7 @@ jobs: - name: Save Gradle Cache id: cache-gradle-save - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 if: github.ref == 'refs/heads/main' with: path: | From 5270107926821374aa12f6ea15de40b218a1f65d Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Tue, 7 Oct 2025 12:24:23 -0400 Subject: [PATCH 064/134] fix(ml): ipv6 check (#22735) --- machine-learning/immich_ml/__main__.py | 10 +++++++++- machine-learning/scripts/healthcheck.py | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/machine-learning/immich_ml/__main__.py b/machine-learning/immich_ml/__main__.py index f453dda0c5..8d575a58d5 100644 --- a/machine-learning/immich_ml/__main__.py +++ b/machine-learning/immich_ml/__main__.py @@ -13,8 +13,16 @@ else: module_dir = Path(__file__).parent + +def is_ipv6(host: str) -> bool: + try: + return ip_address(host).version == 6 + except ValueError: + return False + + bind_host = non_prefixed_settings.immich_host -if ip_address(bind_host).version == 6: +if is_ipv6(bind_host): bind_host = f"[{bind_host}]" bind_address = f"{bind_host}:{non_prefixed_settings.immich_port}" diff --git a/machine-learning/scripts/healthcheck.py b/machine-learning/scripts/healthcheck.py index 97527290c7..38c0a522f1 100644 --- a/machine-learning/scripts/healthcheck.py +++ b/machine-learning/scripts/healthcheck.py @@ -7,8 +7,16 @@ import requests port = os.getenv("IMMICH_PORT", 3003) host = os.getenv("IMMICH_HOST", "0.0.0.0") + +def is_ipv6(host: str) -> bool: + try: + return ip_address(host).version == 6 + except ValueError: + return False + + host = "localhost" if host == "0.0.0.0" else host -host = f"[{host}]" if ip_address(host).version == 6 else host +host = f"[{host}]" if is_ipv6(host) else host try: response = requests.get(f"http://{host}:{port}/ping", timeout=2) From 8353db6a50b66b6dd9d9e399ff6f72879ab9f266 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Tue, 7 Oct 2025 13:10:54 -0400 Subject: [PATCH 065/134] chore(deps): cache pnpm dependencies in prod build (#22555) * cache pnpm dependencies use different ids to be safe unnecessary lines * use buildcache folder --- server/Dockerfile | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/server/Dockerfile b/server/Dockerfile index 6702b338c5..05cd4601be 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,35 +1,50 @@ FROM ghcr.io/immich-app/base-server-dev:202509210934@sha256:b5ce2d7eaf379d4cf15efd4bab180d8afc8a80d20b36c9800f4091aca6ae267e AS builder ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \ CI=1 \ - COREPACK_HOME=/tmp + COREPACK_HOME=/tmp \ + PNPM_HOME=/buildcache/pnpm-store \ + PATH="/buildcache/pnpm-store:$PATH" RUN npm install --global corepack@latest && \ - corepack enable pnpm + corepack enable pnpm && \ + pnpm config set store-dir "$PNPM_HOME" FROM builder AS server WORKDIR /usr/src/app -COPY ./package* ./pnpm* .pnpmfile.cjs ./ COPY ./server ./server/ -RUN SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile build && \ +RUN --mount=type=cache,id=pnpm-server,target=/buildcache/pnpm-store \ + --mount=type=bind,source=package.json,target=package.json \ + --mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \ + --mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \ + --mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \ + SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile build && \ SHARP_FORCE_GLOBAL_LIBVIPS=true pnpm --filter immich --frozen-lockfile --prod --no-optional deploy /output/server-pruned FROM builder AS web WORKDIR /usr/src/app -COPY ./package* ./pnpm* .pnpmfile.cjs ./ COPY ./web ./web/ COPY ./i18n ./i18n/ COPY ./open-api ./open-api/ -RUN SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install && \ +RUN --mount=type=cache,id=pnpm-web,target=/buildcache/pnpm-store \ + --mount=type=bind,source=package.json,target=package.json \ + --mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \ + --mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \ + --mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \ + SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install && \ pnpm --filter @immich/sdk --filter immich-web build FROM builder AS cli -COPY ./package* ./pnpm* .pnpmfile.cjs ./ COPY ./cli ./cli/ COPY ./open-api ./open-api/ -RUN pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install && \ +RUN --mount=type=cache,id=pnpm-cli,target=/buildcache/pnpm-store \ + --mount=type=bind,source=package.json,target=package.json \ + --mount=type=bind,source=.pnpmfile.cjs,target=.pnpmfile.cjs \ + --mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \ + --mount=type=bind,source=pnpm-workspace.yaml,target=pnpm-workspace.yaml \ + pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install && \ pnpm --filter @immich/sdk --filter @immich/cli build && \ pnpm --filter @immich/cli --prod --no-optional deploy /output/cli-pruned From f16327d0ab96af5efea365d7e32e4f2b558d85b8 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:43:35 +0530 Subject: [PATCH 066/134] chore: use isar immich fork (#22738) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/pubspec.lock | 22 ++++++++++++---------- mobile/pubspec.yaml | 18 ++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 72d4b44b6c..ef1937e027 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1022,25 +1022,27 @@ packages: isar: dependency: "direct main" description: - name: isar - sha256: e17a9555bc7f22ff26568b8c64d019b4ffa2dc6bd4cb1c8d9b269aefd32e53ad - url: "https://pub.isar-community.dev" - source: hosted + path: "packages/isar" + ref: "3561848fe7f5811743b880ddd96bb18dede27306" + resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" + url: "https://github.com/immich-app/isar" + source: git version: "3.1.8" isar_flutter_libs: dependency: "direct main" description: - name: isar_flutter_libs - sha256: "78710781e658ce4bff59b3f38c5b2735e899e627f4e926e1221934e77b95231a" - url: "https://pub.isar-community.dev" - source: hosted + path: "packages/isar_flutter_libs" + ref: "3561848fe7f5811743b880ddd96bb18dede27306" + resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" + url: "https://github.com/immich-app/isar" + source: git version: "3.1.8" isar_generator: dependency: "direct dev" description: path: "packages/isar_generator" - ref: v3 - resolved-ref: ad574f60ed6f39d2995cd16fc7dc3de9a646ef30 + ref: "3561848fe7f5811743b880ddd96bb18dede27306" + resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" url: "https://github.com/immich-app/isar" source: git version: "3.1.8" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index db20bd2b5a..83c7da5b7d 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -8,8 +8,6 @@ environment: sdk: '>=3.8.0 <4.0.0' flutter: 3.35.4 -isar_version: &isar_version 3.1.8 - dependencies: flutter: sdk: flutter @@ -81,11 +79,15 @@ dependencies: openapi: path: openapi isar: - version: *isar_version - hosted: https://pub.isar-community.dev/ - isar_flutter_libs: # contains Isar Core - version: *isar_version - hosted: https://pub.isar-community.dev/ + git: + url: https://github.com/immich-app/isar + ref: '3561848fe7f5811743b880ddd96bb18dede27306' + path: packages/isar/ + isar_flutter_libs: + git: + url: https://github.com/immich-app/isar + ref: '3561848fe7f5811743b880ddd96bb18dede27306' + path: packages/isar_flutter_libs/ # DB drift: ^2.23.1 drift_flutter: ^0.2.4 @@ -101,7 +103,7 @@ dev_dependencies: isar_generator: git: url: https://github.com/immich-app/isar - ref: v3 + ref: '3561848fe7f5811743b880ddd96bb18dede27306' path: packages/isar_generator/ integration_test: sdk: flutter From 882baecf21d0db86760b36478ad356fb61bd7e78 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Tue, 7 Oct 2025 13:04:23 -0500 Subject: [PATCH 067/134] fix: bottom sheet blank with local assets that have remote counterparts (#22743) --- .../presentation/widgets/asset_viewer/bottom_sheet.widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart index 39f8e5ae69..bdd7fb9b48 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart @@ -51,7 +51,7 @@ class AssetDetailBottomSheet extends ConsumerWidget { isArchived: isArchived, isTrashEnabled: isTrashEnable, isInLockedView: isInLockedView, - isStacked: asset.hasRemote && (asset as RemoteAsset).stackId != null, + isStacked: asset is RemoteAsset && asset.stackId != null, currentAlbum: currentAlbum, advancedTroubleshooting: advancedTroubleshooting, source: ActionSource.viewer, From 24334aa3dfbbf50191fcc1c69cf581c4d29e2add Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 14:42:00 -0400 Subject: [PATCH 068/134] chore(deps): update dependency @types/node to ^22.18.8 (#22719) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- cli/package.json | 2 +- e2e/package.json | 2 +- open-api/typescript-sdk/package.json | 2 +- pnpm-lock.yaml | 332 +++++++++++++-------------- server/package.json | 2 +- 5 files changed, 170 insertions(+), 170 deletions(-) diff --git a/cli/package.json b/cli/package.json index 5dffbf1c66..dfd2cc3610 100644 --- a/cli/package.json +++ b/cli/package.json @@ -20,7 +20,7 @@ "@types/lodash-es": "^4.17.12", "@types/micromatch": "^4.0.9", "@types/mock-fs": "^4.13.1", - "@types/node": "^22.18.1", + "@types/node": "^22.18.8", "@vitest/coverage-v8": "^3.0.0", "byte-size": "^9.0.0", "cli-progress": "^3.12.0", diff --git a/e2e/package.json b/e2e/package.json index d2536ea00d..9d2a33ba25 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -25,7 +25,7 @@ "@playwright/test": "^1.44.1", "@socket.io/component-emitter": "^3.1.2", "@types/luxon": "^3.4.2", - "@types/node": "^22.18.1", + "@types/node": "^22.18.8", "@types/oidc-provider": "^9.0.0", "@types/pg": "^8.15.1", "@types/pngjs": "^6.0.4", diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 4b2d8b9ec9..05f0b320e0 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -19,7 +19,7 @@ "@oazapfts/runtime": "^1.0.2" }, "devDependencies": { - "@types/node": "^22.18.1", + "@types/node": "^22.18.8", "typescript": "^5.3.3" }, "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dce8f83f99..2300a6eac0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,11 +63,11 @@ importers: specifier: ^4.13.1 version: 4.13.4 '@types/node': - specifier: ^22.18.1 - version: 22.18.5 + specifier: ^22.18.8 + version: 22.18.8 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) byte-size: specifier: ^9.0.0 version: 9.0.1 @@ -109,16 +109,16 @@ importers: version: 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) vite: specifier: ^7.0.0 - version: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest-fetch-mock: specifier: ^0.4.0 - version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) yaml: specifier: ^2.3.1 version: 2.8.1 @@ -211,8 +211,8 @@ importers: specifier: ^3.4.2 version: 3.7.1 '@types/node': - specifier: ^22.18.1 - version: 22.18.5 + specifier: ^22.18.8 + version: 22.18.8 '@types/oidc-provider': specifier: ^9.0.0 version: 9.5.0 @@ -284,7 +284,7 @@ importers: version: 5.2.1(encoding@0.1.13) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) open-api/typescript-sdk: dependencies: @@ -293,8 +293,8 @@ importers: version: 1.0.4 devDependencies: '@types/node': - specifier: ^22.18.1 - version: 22.18.5 + specifier: ^22.18.8 + version: 22.18.8 typescript: specifier: ^5.3.3 version: 5.9.2 @@ -450,7 +450,7 @@ importers: version: 2.0.2 nest-commander: specifier: ^3.16.0 - version: 3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.5)(typescript@5.9.2) + version: 3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.8)(typescript@5.9.2) nestjs-cls: specifier: ^5.0.0 version: 5.4.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -532,7 +532,7 @@ importers: version: 9.36.0 '@nestjs/cli': specifier: ^11.0.2 - version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.5) + version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.8) '@nestjs/schematics': specifier: ^11.0.0 version: 11.0.7(chokidar@4.0.3)(typescript@5.9.2) @@ -582,8 +582,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ^22.18.1 - version: 22.18.5 + specifier: ^22.18.8 + version: 22.18.8 '@types/nodemailer': specifier: ^7.0.0 version: 7.0.1 @@ -613,7 +613,7 @@ importers: version: 13.15.3 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: ^9.14.0 version: 9.36.0(jiti@2.5.1) @@ -667,10 +667,10 @@ importers: version: 1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.50.1) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) web: dependencies: @@ -4519,8 +4519,8 @@ packages: '@types/node@20.19.2': resolution: {integrity: sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==} - '@types/node@22.18.5': - resolution: {integrity: sha512-g9BpPfJvxYBXUWI9bV37j6d6LTMNQ88hPwdWWUeYZnMhlo66FIg9gCc1/DZb15QylJSKwOZjwrckvOTWpOiChg==} + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} '@types/node@24.5.1': resolution: {integrity: sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==} @@ -11423,11 +11423,11 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.5)(chokidar@4.0.3)': + '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.8)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.18.5) + '@inquirer/prompts': 7.3.2(@types/node@22.18.8) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -14019,27 +14019,27 @@ snapshots: transitivePeerDependencies: - '@internationalized/date' - '@inquirer/checkbox@4.2.1(@types/node@22.18.5)': + '@inquirer/checkbox@4.2.1(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/type': 3.0.8(@types/node@22.18.8) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/confirm@5.1.15(@types/node@22.18.5)': + '@inquirer/confirm@5.1.15(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/core@10.1.15(@types/node@22.18.5)': + '@inquirer/core@10.1.15(@types/node@22.18.8)': dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/type': 3.0.8(@types/node@22.18.8) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -14047,115 +14047,115 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/editor@4.2.17(@types/node@22.18.5)': + '@inquirer/editor@4.2.17(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/external-editor': 1.0.2(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/expand@4.0.17(@types/node@22.18.5)': + '@inquirer/expand@4.0.17(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/external-editor@1.0.2(@types/node@22.18.5)': + '@inquirer/external-editor@1.0.2(@types/node@22.18.8)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.1(@types/node@22.18.5)': + '@inquirer/input@4.2.1(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/number@3.0.17(@types/node@22.18.5)': + '@inquirer/number@3.0.17(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/password@4.0.17(@types/node@22.18.5)': + '@inquirer/password@4.0.17(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/prompts@7.3.2(@types/node@22.18.5)': + '@inquirer/prompts@7.3.2(@types/node@22.18.8)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.5) - '@inquirer/confirm': 5.1.15(@types/node@22.18.5) - '@inquirer/editor': 4.2.17(@types/node@22.18.5) - '@inquirer/expand': 4.0.17(@types/node@22.18.5) - '@inquirer/input': 4.2.1(@types/node@22.18.5) - '@inquirer/number': 3.0.17(@types/node@22.18.5) - '@inquirer/password': 4.0.17(@types/node@22.18.5) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.5) - '@inquirer/search': 3.1.0(@types/node@22.18.5) - '@inquirer/select': 4.3.1(@types/node@22.18.5) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.8) + '@inquirer/confirm': 5.1.15(@types/node@22.18.8) + '@inquirer/editor': 4.2.17(@types/node@22.18.8) + '@inquirer/expand': 4.0.17(@types/node@22.18.8) + '@inquirer/input': 4.2.1(@types/node@22.18.8) + '@inquirer/number': 3.0.17(@types/node@22.18.8) + '@inquirer/password': 4.0.17(@types/node@22.18.8) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.8) + '@inquirer/search': 3.1.0(@types/node@22.18.8) + '@inquirer/select': 4.3.1(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/prompts@7.8.0(@types/node@22.18.5)': + '@inquirer/prompts@7.8.0(@types/node@22.18.8)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.5) - '@inquirer/confirm': 5.1.15(@types/node@22.18.5) - '@inquirer/editor': 4.2.17(@types/node@22.18.5) - '@inquirer/expand': 4.0.17(@types/node@22.18.5) - '@inquirer/input': 4.2.1(@types/node@22.18.5) - '@inquirer/number': 3.0.17(@types/node@22.18.5) - '@inquirer/password': 4.0.17(@types/node@22.18.5) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.5) - '@inquirer/search': 3.1.0(@types/node@22.18.5) - '@inquirer/select': 4.3.1(@types/node@22.18.5) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.8) + '@inquirer/confirm': 5.1.15(@types/node@22.18.8) + '@inquirer/editor': 4.2.17(@types/node@22.18.8) + '@inquirer/expand': 4.0.17(@types/node@22.18.8) + '@inquirer/input': 4.2.1(@types/node@22.18.8) + '@inquirer/number': 3.0.17(@types/node@22.18.8) + '@inquirer/password': 4.0.17(@types/node@22.18.8) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.8) + '@inquirer/search': 3.1.0(@types/node@22.18.8) + '@inquirer/select': 4.3.1(@types/node@22.18.8) optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/rawlist@4.1.5(@types/node@22.18.5)': + '@inquirer/rawlist@4.1.5(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.8) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/search@3.1.0(@types/node@22.18.5)': + '@inquirer/search@3.1.0(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/type': 3.0.8(@types/node@22.18.8) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/select@4.3.1(@types/node@22.18.5)': + '@inquirer/select@4.3.1(@types/node@22.18.8)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.5) + '@inquirer/core': 10.1.15(@types/node@22.18.8) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.5) + '@inquirer/type': 3.0.8(@types/node@22.18.8) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 - '@inquirer/type@3.0.8(@types/node@22.18.5)': + '@inquirer/type@3.0.8(@types/node@22.18.8)': optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@internationalized/date@3.8.2': dependencies: @@ -14193,7 +14193,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -14425,12 +14425,12 @@ snapshots: bullmq: 5.58.5 tslib: 2.8.1 - '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.5)': + '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.8)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.5)(chokidar@4.0.3) - '@inquirer/prompts': 7.8.0(@types/node@22.18.5) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.8)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@22.18.8) '@nestjs/schematics': 11.0.7(chokidar@4.0.3)(typescript@5.8.3) ansis: 4.1.0 chokidar: 4.0.3 @@ -15829,7 +15829,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/archiver@6.0.3': dependencies: @@ -15841,16 +15841,16 @@ snapshots: '@types/bcrypt@6.0.0': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/braces@3.0.5': {} @@ -15871,21 +15871,21 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/compression@1.8.1': dependencies: '@types/express': 5.0.3 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/connect@3.4.38': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/content-disposition@0.5.9': {} @@ -15902,11 +15902,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.3 '@types/keygrip': 1.0.6 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/cors@2.8.19': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/debug@4.1.12': dependencies: @@ -15916,13 +15916,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ssh2': 1.15.5 '@types/dockerode@3.3.42': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ssh2': 1.15.5 '@types/dom-to-image@2.6.7': {} @@ -15945,14 +15945,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -15978,7 +15978,7 @@ snapshots: '@types/fluent-ffmpeg@2.1.27': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/geojson-vt@3.2.5': dependencies: @@ -16010,7 +16010,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/inquirer@8.2.11': dependencies: @@ -16048,7 +16048,7 @@ snapshots: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/leaflet@1.9.20': dependencies: @@ -16080,7 +16080,7 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ms@2.1.0': {} @@ -16090,7 +16090,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/node@17.0.45': {} @@ -16102,7 +16102,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.5': + '@types/node@22.18.8': dependencies: undici-types: 6.21.0 @@ -16114,7 +16114,7 @@ snapshots: '@types/nodemailer@7.0.1': dependencies: '@aws-sdk/client-sesv2': 3.890.0 - '@types/node': 22.18.5 + '@types/node': 22.18.8 transitivePeerDependencies: - aws-crt @@ -16122,7 +16122,7 @@ snapshots: dependencies: '@types/keygrip': 1.0.6 '@types/koa': 3.0.0 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/parse5@5.0.3': {} @@ -16132,7 +16132,7 @@ snapshots: '@types/pg@8.15.5': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -16140,13 +16140,13 @@ snapshots: '@types/pngjs@6.0.5': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/prismjs@1.26.5': {} '@types/qrcode@1.5.5': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/qs@6.14.0': {} @@ -16175,7 +16175,7 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/retry@0.12.0': {} @@ -16185,14 +16185,14 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/semver@7.7.1': {} '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/serve-index@1.9.4': dependencies: @@ -16201,20 +16201,20 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.5': @@ -16225,7 +16225,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.18.5 + '@types/node': 22.18.8 form-data: 4.0.4 '@types/supercluster@7.1.3': @@ -16239,7 +16239,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/ua-parser-js@0.7.39': {} @@ -16255,7 +16255,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 '@types/yargs-parser@21.0.3': {} @@ -16358,7 +16358,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16373,7 +16373,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -16404,13 +16404,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: @@ -17974,7 +17974,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.18.5 + '@types/node': 22.18.8 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -18364,7 +18364,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 require-like: 0.1.2 event-emitter@0.3.5: @@ -19343,9 +19343,9 @@ snapshots: inline-style-parser@0.2.4: {} - inquirer@8.2.7(@types/node@22.18.5): + inquirer@8.2.7(@types/node@22.18.8): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@22.18.5) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -19549,7 +19549,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.5 + '@types/node': 22.18.8 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -19557,13 +19557,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20774,7 +20774,7 @@ snapshots: neo-async@2.6.2: {} - nest-commander@3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.5)(typescript@5.9.2): + nest-commander@3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.8)(typescript@5.9.2): dependencies: '@fig/complete-commander': 3.2.0(commander@11.1.0) '@golevelup/nestjs-discovery': 4.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) @@ -20783,7 +20783,7 @@ snapshots: '@types/inquirer': 8.2.11 commander: 11.1.0 cosmiconfig: 8.3.6(typescript@5.9.2) - inquirer: 8.2.7(@types/node@22.18.5) + inquirer: 8.2.7(@types/node@22.18.8) transitivePeerDependencies: - '@types/node' - typescript @@ -21871,7 +21871,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.18.5 + '@types/node': 22.18.8 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -23737,13 +23737,13 @@ snapshots: - rollup - supports-color - vite-node@3.2.4(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -23779,18 +23779,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.2) optionalDependencies: - vite: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -23799,7 +23799,7 @@ snapshots: rollup: 4.50.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.5 + '@types/node': 22.18.8 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 @@ -23826,15 +23826,15 @@ snapshots: optionalDependencies: vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23852,12 +23852,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.5 + '@types/node': 22.18.8 happy-dom: 18.0.1 jsdom: 26.1.0(canvas@2.11.2(encoding@0.1.13)) transitivePeerDependencies: @@ -23874,11 +23874,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.5)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23896,12 +23896,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.5)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.5 + '@types/node': 22.18.8 happy-dom: 18.0.1 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: diff --git a/server/package.json b/server/package.json index 9854013002..4d4c125474 100644 --- a/server/package.json +++ b/server/package.json @@ -129,7 +129,7 @@ "@types/luxon": "^3.6.2", "@types/mock-fs": "^4.13.1", "@types/multer": "^2.0.0", - "@types/node": "^22.18.1", + "@types/node": "^22.18.8", "@types/nodemailer": "^7.0.0", "@types/picomatch": "^4.0.0", "@types/pngjs": "^6.0.5", From ee4c45d5d392ab30c5a3302f53ba9666ddec7de2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:24:33 +0200 Subject: [PATCH 069/134] chore(deps): update dependency nodemailer to v7.0.7 [security] (#22740) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2300a6eac0..7a40c88c2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -462,7 +462,7 @@ importers: version: 7.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) nodemailer: specifier: ^7.0.0 - version: 7.0.6 + version: 7.0.7 openid-client: specifier: ^6.3.3 version: 6.8.0 @@ -8398,8 +8398,8 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nodemailer@7.0.6: - resolution: {integrity: sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==} + nodemailer@7.0.7: + resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} engines: {node: '>=6.0.0'} nopt@1.0.10: @@ -20873,7 +20873,7 @@ snapshots: node-releases@2.0.19: {} - nodemailer@7.0.6: {} + nodemailer@7.0.7: {} nopt@1.0.10: dependencies: From a7cfd7f183b20b6cfbee1f8ca846c120a46fffa4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:21:43 -0500 Subject: [PATCH 070/134] fix(deps): update dependency connectivity_plus to v7 (#22723) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Alex --- mobile/pubspec.lock | 4 ++-- mobile/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index ef1937e027..32c3be3567 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -317,10 +317,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27" + sha256: "33bae12a398f841c6cda09d1064212957265869104c478e5ad51e2fb26c3973c" url: "https://pub.dev" source: hosted - version: "6.1.3" + version: "7.0.0" connectivity_plus_platform_interface: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 83c7da5b7d..a715e12ff7 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: cancellation_token_http: ^2.1.0 cast: ^2.1.0 collection: ^1.18.0 - connectivity_plus: ^6.1.3 + connectivity_plus: ^7.0.0 crop_image: ^1.0.16 crypto: ^3.0.6 device_info_plus: ^12.0.0 From 63c2f4415b1abce42fada3d716b2cd655ec79f03 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:49:46 +0530 Subject: [PATCH 071/134] chore: use hosted isar flutter libs (#22757) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/ios/Podfile.lock | 10 +++--- mobile/lib/entities/album.entity.g.dart | 2 +- .../android_device_asset.entity.g.dart | 2 +- mobile/lib/entities/asset.entity.g.dart | 2 +- .../lib/entities/backup_album.entity.g.dart | 2 +- .../entities/duplicated_asset.entity.g.dart | 2 +- mobile/lib/entities/etag.entity.g.dart | 2 +- .../entities/ios_device_asset.entity.g.dart | 2 +- .../entities/device_asset.entity.g.dart | 2 +- .../entities/exif.entity.g.dart | 2 +- .../entities/store.entity.g.dart | 2 +- .../entities/user.entity.g.dart | 2 +- mobile/pubspec.lock | 33 +++++++++++-------- mobile/pubspec.yaml | 12 +++---- 14 files changed, 40 insertions(+), 37 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 502fd9008f..9bff8cd8e2 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -64,7 +64,7 @@ PODS: - Flutter - integration_test (0.0.1): - Flutter - - isar_flutter_libs (1.0.0): + - isar_community_flutter_libs (1.0.0): - Flutter - local_auth_darwin (0.0.1): - Flutter @@ -149,7 +149,7 @@ DEPENDENCIES: - home_widget (from `.symlinks/plugins/home_widget/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - integration_test (from `.symlinks/plugins/integration_test/ios`) - - isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`) + - isar_community_flutter_libs (from `.symlinks/plugins/isar_community_flutter_libs/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`) - native_video_player (from `.symlinks/plugins/native_video_player/ios`) @@ -210,8 +210,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/image_picker_ios/ios" integration_test: :path: ".symlinks/plugins/integration_test/ios" - isar_flutter_libs: - :path: ".symlinks/plugins/isar_flutter_libs/ios" + isar_community_flutter_libs: + :path: ".symlinks/plugins/isar_community_flutter_libs/ios" local_auth_darwin: :path: ".symlinks/plugins/local_auth_darwin/darwin" maplibre_gl: @@ -264,7 +264,7 @@ SPEC CHECKSUMS: home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e - isar_flutter_libs: bc909e72c3d756c2759f14c8776c13b5b0556e26 + isar_community_flutter_libs: bede843185a61a05ff364a05c9b23209523f7e0d local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 MapLibre: 69e572367f4ef6287e18246cfafc39c80cdcabcd maplibre_gl: 3c924e44725147b03dda33430ad216005b40555f diff --git a/mobile/lib/entities/album.entity.g.dart b/mobile/lib/entities/album.entity.g.dart index e6ecde7f9a..ecbbab48c2 100644 --- a/mobile/lib/entities/album.entity.g.dart +++ b/mobile/lib/entities/album.entity.g.dart @@ -132,7 +132,7 @@ const AlbumSchema = CollectionSchema( getId: _albumGetId, getLinks: _albumGetLinks, attach: _albumAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _albumEstimateSize( diff --git a/mobile/lib/entities/android_device_asset.entity.g.dart b/mobile/lib/entities/android_device_asset.entity.g.dart index 9034709b8e..f8b1e32c72 100644 --- a/mobile/lib/entities/android_device_asset.entity.g.dart +++ b/mobile/lib/entities/android_device_asset.entity.g.dart @@ -47,7 +47,7 @@ const AndroidDeviceAssetSchema = CollectionSchema( getId: _androidDeviceAssetGetId, getLinks: _androidDeviceAssetGetLinks, attach: _androidDeviceAssetAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _androidDeviceAssetEstimateSize( diff --git a/mobile/lib/entities/asset.entity.g.dart b/mobile/lib/entities/asset.entity.g.dart index be5b427d01..db6bc72331 100644 --- a/mobile/lib/entities/asset.entity.g.dart +++ b/mobile/lib/entities/asset.entity.g.dart @@ -168,7 +168,7 @@ const AssetSchema = CollectionSchema( getId: _assetGetId, getLinks: _assetGetLinks, attach: _assetAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _assetEstimateSize( diff --git a/mobile/lib/entities/backup_album.entity.g.dart b/mobile/lib/entities/backup_album.entity.g.dart index ed98503119..583aa55c4d 100644 --- a/mobile/lib/entities/backup_album.entity.g.dart +++ b/mobile/lib/entities/backup_album.entity.g.dart @@ -43,7 +43,7 @@ const BackupAlbumSchema = CollectionSchema( getId: _backupAlbumGetId, getLinks: _backupAlbumGetLinks, attach: _backupAlbumAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _backupAlbumEstimateSize( diff --git a/mobile/lib/entities/duplicated_asset.entity.g.dart b/mobile/lib/entities/duplicated_asset.entity.g.dart index 6cf08ad9cc..80d2f344e6 100644 --- a/mobile/lib/entities/duplicated_asset.entity.g.dart +++ b/mobile/lib/entities/duplicated_asset.entity.g.dart @@ -32,7 +32,7 @@ const DuplicatedAssetSchema = CollectionSchema( getId: _duplicatedAssetGetId, getLinks: _duplicatedAssetGetLinks, attach: _duplicatedAssetAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _duplicatedAssetEstimateSize( diff --git a/mobile/lib/entities/etag.entity.g.dart b/mobile/lib/entities/etag.entity.g.dart index b1abba6bb7..03b4ea9918 100644 --- a/mobile/lib/entities/etag.entity.g.dart +++ b/mobile/lib/entities/etag.entity.g.dart @@ -52,7 +52,7 @@ const ETagSchema = CollectionSchema( getId: _eTagGetId, getLinks: _eTagGetLinks, attach: _eTagAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _eTagEstimateSize( diff --git a/mobile/lib/entities/ios_device_asset.entity.g.dart b/mobile/lib/entities/ios_device_asset.entity.g.dart index 8d8fec945b..252fe127bb 100644 --- a/mobile/lib/entities/ios_device_asset.entity.g.dart +++ b/mobile/lib/entities/ios_device_asset.entity.g.dart @@ -60,7 +60,7 @@ const IOSDeviceAssetSchema = CollectionSchema( getId: _iOSDeviceAssetGetId, getLinks: _iOSDeviceAssetGetLinks, attach: _iOSDeviceAssetAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _iOSDeviceAssetEstimateSize( diff --git a/mobile/lib/infrastructure/entities/device_asset.entity.g.dart b/mobile/lib/infrastructure/entities/device_asset.entity.g.dart index 87ae54ad40..b6c30aca6f 100644 --- a/mobile/lib/infrastructure/entities/device_asset.entity.g.dart +++ b/mobile/lib/infrastructure/entities/device_asset.entity.g.dart @@ -65,7 +65,7 @@ const DeviceAssetEntitySchema = CollectionSchema( getId: _deviceAssetEntityGetId, getLinks: _deviceAssetEntityGetLinks, attach: _deviceAssetEntityAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _deviceAssetEntityEstimateSize( diff --git a/mobile/lib/infrastructure/entities/exif.entity.g.dart b/mobile/lib/infrastructure/entities/exif.entity.g.dart index d2f9ebda27..ffbfd0d8f0 100644 --- a/mobile/lib/infrastructure/entities/exif.entity.g.dart +++ b/mobile/lib/infrastructure/entities/exif.entity.g.dart @@ -68,7 +68,7 @@ const ExifInfoSchema = CollectionSchema( getId: _exifInfoGetId, getLinks: _exifInfoGetLinks, attach: _exifInfoAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _exifInfoEstimateSize( diff --git a/mobile/lib/infrastructure/entities/store.entity.g.dart b/mobile/lib/infrastructure/entities/store.entity.g.dart index 7da92cf778..626c3084fe 100644 --- a/mobile/lib/infrastructure/entities/store.entity.g.dart +++ b/mobile/lib/infrastructure/entities/store.entity.g.dart @@ -37,7 +37,7 @@ const StoreValueSchema = CollectionSchema( getId: _storeValueGetId, getLinks: _storeValueGetLinks, attach: _storeValueAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _storeValueEstimateSize( diff --git a/mobile/lib/infrastructure/entities/user.entity.g.dart b/mobile/lib/infrastructure/entities/user.entity.g.dart index bb87051731..7e0af41b77 100644 --- a/mobile/lib/infrastructure/entities/user.entity.g.dart +++ b/mobile/lib/infrastructure/entities/user.entity.g.dart @@ -95,7 +95,7 @@ const UserSchema = CollectionSchema( getId: _userGetId, getLinks: _userGetLinks, attach: _userAttach, - version: '3.1.8', + version: '3.3.0-dev.3', ); int _userEstimateSize( diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 32c3be3567..125e4d46e2 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -317,10 +317,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "33bae12a398f841c6cda09d1064212957265869104c478e5ad51e2fb26c3973c" + sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "6.1.5" connectivity_plus_platform_interface: dependency: transitive description: @@ -1023,26 +1023,33 @@ packages: dependency: "direct main" description: path: "packages/isar" - ref: "3561848fe7f5811743b880ddd96bb18dede27306" - resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" + ref: bb1dca40fe87a001122e5d43bc6254718cb49f3a + resolved-ref: bb1dca40fe87a001122e5d43bc6254718cb49f3a url: "https://github.com/immich-app/isar" source: git version: "3.1.8" - isar_flutter_libs: + isar_community: + dependency: transitive + description: + name: isar_community + sha256: "28f59e54636c45ba0bb1b3b7f2656f1c50325f740cea6efcd101900be3fba546" + url: "https://pub.dev" + source: hosted + version: "3.3.0-dev.3" + isar_community_flutter_libs: dependency: "direct main" description: - path: "packages/isar_flutter_libs" - ref: "3561848fe7f5811743b880ddd96bb18dede27306" - resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" - url: "https://github.com/immich-app/isar" - source: git - version: "3.1.8" + name: isar_community_flutter_libs + sha256: c2934fe755bb3181cb67602fd5df0d080b3d3eb52799f98623aa4fc5acbea010 + url: "https://pub.dev" + source: hosted + version: "3.3.0-dev.3" isar_generator: dependency: "direct dev" description: path: "packages/isar_generator" - ref: "3561848fe7f5811743b880ddd96bb18dede27306" - resolved-ref: "3561848fe7f5811743b880ddd96bb18dede27306" + ref: bb1dca40fe87a001122e5d43bc6254718cb49f3a + resolved-ref: bb1dca40fe87a001122e5d43bc6254718cb49f3a url: "https://github.com/immich-app/isar" source: git version: "3.1.8" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index a715e12ff7..7dc34807b1 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: cancellation_token_http: ^2.1.0 cast: ^2.1.0 collection: ^1.18.0 - connectivity_plus: ^7.0.0 + connectivity_plus: ^6.1.3 crop_image: ^1.0.16 crypto: ^3.0.6 device_info_plus: ^12.0.0 @@ -81,13 +81,9 @@ dependencies: isar: git: url: https://github.com/immich-app/isar - ref: '3561848fe7f5811743b880ddd96bb18dede27306' + ref: 'bb1dca40fe87a001122e5d43bc6254718cb49f3a' path: packages/isar/ - isar_flutter_libs: - git: - url: https://github.com/immich-app/isar - ref: '3561848fe7f5811743b880ddd96bb18dede27306' - path: packages/isar_flutter_libs/ + isar_community_flutter_libs: 3.3.0-dev.3 # DB drift: ^2.23.1 drift_flutter: ^0.2.4 @@ -103,7 +99,7 @@ dev_dependencies: isar_generator: git: url: https://github.com/immich-app/isar - ref: '3561848fe7f5811743b880ddd96bb18dede27306' + ref: 'bb1dca40fe87a001122e5d43bc6254718cb49f3a' path: packages/isar_generator/ integration_test: sdk: flutter From 265ed0b38fb51f67d7284a6ce92b532582d66388 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:51:34 +0530 Subject: [PATCH 072/134] fix: skip local only assets in move to lock action (#22728) * fix:prefer trashing to deletions * skip local only assets in move to lock action --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- .../infrastructure/action.provider.dart | 7 ++++-- .../repositories/asset_media.repository.dart | 24 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/mobile/lib/providers/infrastructure/action.provider.dart b/mobile/lib/providers/infrastructure/action.provider.dart index 77ac6595a7..21d76201c1 100644 --- a/mobile/lib/providers/infrastructure/action.provider.dart +++ b/mobile/lib/providers/infrastructure/action.provider.dart @@ -77,11 +77,14 @@ class ActionNotifier extends Notifier { return _getAssets(source).whereType().toIds().toList(growable: false); } - List _getLocalIdsForSource(ActionSource source) { + List _getLocalIdsForSource(ActionSource source, {bool ignoreLocalOnly = false}) { final Set assets = _getAssets(source); final List localIds = []; for (final asset in assets) { + if (ignoreLocalOnly && asset.storage != AssetState.merged) { + continue; + } if (asset is LocalAsset) { localIds.add(asset.id); } else if (asset is RemoteAsset && asset.localId != null) { @@ -189,7 +192,7 @@ class ActionNotifier extends Notifier { Future moveToLockFolder(ActionSource source) async { final ids = _getOwnedRemoteIdsForSource(source); - final localIds = _getLocalIdsForSource(source); + final localIds = _getLocalIdsForSource(source, ignoreLocalOnly: true); try { await _service.moveToLockFolder(ids, localIds); return ActionResult(count: ids.length, success: true); diff --git a/mobile/lib/repositories/asset_media.repository.dart b/mobile/lib/repositories/asset_media.repository.dart index 28a4ad661a..8336d2341d 100644 --- a/mobile/lib/repositories/asset_media.repository.dart +++ b/mobile/lib/repositories/asset_media.repository.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/widgets.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; @@ -25,7 +26,28 @@ class AssetMediaRepository { const AssetMediaRepository(this._assetApiRepository); - Future> deleteAll(List ids) => PhotoManager.editor.deleteWithIds(ids); + Future _androidSupportsTrash() async { + if (Platform.isAndroid) { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + int sdkVersion = androidInfo.version.sdkInt; + return sdkVersion >= 31; + } + return false; + } + + Future> deleteAll(List ids) async { + if (CurrentPlatform.isAndroid) { + if (await _androidSupportsTrash()) { + return PhotoManager.editor.android.moveToTrash( + ids.map((e) => AssetEntity(id: e, width: 1, height: 1, typeInt: 0)).toList(), + ); + } else { + return PhotoManager.editor.deleteWithIds(ids); + } + } + return PhotoManager.editor.deleteWithIds(ids); + } Future get(String id) async { final entity = await AssetEntity.fromId(id); From 54ed78d0bfad584c0ffbbe267b684ea208553193 Mon Sep 17 00:00:00 2001 From: Saschl <19493808+Saschl@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:31:15 +0200 Subject: [PATCH 073/134] fix: brief flashing when swiping from video (#22187) --- .../presentation/widgets/asset_viewer/video_viewer.widget.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart index 3040af590e..2bab507e3f 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart @@ -322,6 +322,9 @@ class NativeVideoViewer extends HookConsumerWidget { removeListeners(playerController); } + if (value != null) { + isVisible.value = _isCurrentAsset(value, asset); + } final curAsset = currentAsset.value; if (curAsset == asset) { return; From 6f3cb4f1bb7d8fa05566198f8c3af9c6cd9e1034 Mon Sep 17 00:00:00 2001 From: Pascal Sommer Date: Wed, 8 Oct 2025 16:19:33 +0200 Subject: [PATCH 074/134] fix(web): Uniform random distribution during shuffle (#19902) feat: better random distribution --- .../timeline-manager/day-group.svelte.ts | 5 -- .../timeline-manager/month-group.svelte.ts | 9 --- .../timeline-manager.svelte.spec.ts | 56 +++++++++++++++++++ .../timeline-manager.svelte.ts | 44 ++++++++++++--- 4 files changed, 91 insertions(+), 23 deletions(-) diff --git a/web/src/lib/managers/timeline-manager/day-group.svelte.ts b/web/src/lib/managers/timeline-manager/day-group.svelte.ts index 9d5008bf83..57cf513a7d 100644 --- a/web/src/lib/managers/timeline-manager/day-group.svelte.ts +++ b/web/src/lib/managers/timeline-manager/day-group.svelte.ts @@ -82,11 +82,6 @@ export class DayGroup { return this.viewerAssets[0]?.asset; } - getRandomAsset() { - const random = Math.floor(Math.random() * this.viewerAssets.length); - return this.viewerAssets[random]; - } - *assetsIterator(options: { startAsset?: TimelineAsset; direction?: Direction } = {}) { const isEarlier = (options?.direction ?? 'earlier') === 'earlier'; let assetIndex = options?.startAsset diff --git a/web/src/lib/managers/timeline-manager/month-group.svelte.ts b/web/src/lib/managers/timeline-manager/month-group.svelte.ts index e406972900..5a90944107 100644 --- a/web/src/lib/managers/timeline-manager/month-group.svelte.ts +++ b/web/src/lib/managers/timeline-manager/month-group.svelte.ts @@ -233,15 +233,6 @@ export class MonthGroup { addContext.changedDayGroups.add(dayGroup); } - getRandomDayGroup() { - const random = Math.floor(Math.random() * this.dayGroups.length); - return this.dayGroups[random]; - } - - getRandomAsset() { - return this.getRandomDayGroup()?.getRandomAsset()?.asset; - } - get viewId() { const { year, month } = this.yearMonth; return year + '-' + month; diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts index f845caa119..dabcb10479 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts @@ -580,4 +580,60 @@ describe('TimelineManager', () => { expect(timelineManager.getMonthGroupByAssetId(assetOne.id)?.yearMonth.month).toEqual(1); }); }); + + describe('getRandomAsset', () => { + let timelineManager: TimelineManager; + const bucketAssets: Record = { + '2024-03-01T00:00:00.000Z': timelineAssetFactory.buildList(1).map((asset) => + deriveLocalDateTimeFromFileCreatedAt({ + ...asset, + fileCreatedAt: fromISODateTimeUTCToObject('2024-03-01T00:00:00.000Z'), + }), + ), + '2024-02-01T00:00:00.000Z': timelineAssetFactory.buildList(10).map((asset, idx) => + deriveLocalDateTimeFromFileCreatedAt({ + ...asset, + // here we make sure that not all assets are on the first day of the month + fileCreatedAt: fromISODateTimeUTCToObject(`2024-02-0${idx < 7 ? 1 : 2}T00:00:00.000Z`), + }), + ), + '2024-01-01T00:00:00.000Z': timelineAssetFactory.buildList(3).map((asset) => + deriveLocalDateTimeFromFileCreatedAt({ + ...asset, + fileCreatedAt: fromISODateTimeUTCToObject('2024-01-01T00:00:00.000Z'), + }), + ), + }; + + const bucketAssetsResponse: Record = Object.fromEntries( + Object.entries(bucketAssets).map(([key, assets]) => [key, toResponseDto(...assets)]), + ); + + beforeEach(async () => { + timelineManager = new TimelineManager(); + sdkMock.getTimeBuckets.mockResolvedValue([ + { count: 1, timeBucket: '2024-03-01' }, + { count: 10, timeBucket: '2024-02-01' }, + { count: 3, timeBucket: '2024-01-01' }, + ]); + + sdkMock.getTimeBucket.mockImplementation(({ timeBucket }) => Promise.resolve(bucketAssetsResponse[timeBucket])); + await timelineManager.updateViewport({ width: 1588, height: 0 }); + }); + + it('gets all assets once', async () => { + const assetCount = timelineManager.assetCount; + expect(assetCount).toBe(14); + const discoveredAssets: Set = new Set(); + for (let idx = 0; idx < assetCount; idx++) { + const asset = await timelineManager.getRandomAsset(idx); + expect(asset).toBeDefined(); + const id = asset!.id; + expect(discoveredAssets.has(id)).toBeFalsy(); + discoveredAssets.add(id); + } + + expect(discoveredAssets.size).toBe(assetCount); + }); + }); }); diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts index 172cd07a02..b5f097e496 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts @@ -451,16 +451,42 @@ export class TimelineManager { return monthGroupInfo?.monthGroup; } - async getRandomMonthGroup() { - const random = Math.floor(Math.random() * this.months.length); - const month = this.months[random]; - await this.loadMonthGroup(month.yearMonth, { cancelable: false }); - return month; - } + // note: the `index` input is expected to be in the range [0, assetCount). This + // value can be passed to make the method deterministic, which is mainly useful + // for testing. + async getRandomAsset(index?: number): Promise { + const randomAssetIndex = index ?? Math.floor(Math.random() * this.assetCount); - async getRandomAsset() { - const month = await this.getRandomMonthGroup(); - return month?.getRandomAsset(); + let accumulatedCount = 0; + + let randomMonth: MonthGroup | undefined = undefined; + for (const month of this.months) { + if (randomAssetIndex < accumulatedCount + month.assetsCount) { + randomMonth = month; + break; + } + + accumulatedCount += month.assetsCount; + } + if (!randomMonth) { + return; + } + await this.loadMonthGroup(randomMonth.yearMonth, { cancelable: false }); + + let randomDay: DayGroup | undefined = undefined; + for (const day of randomMonth.dayGroups) { + if (randomAssetIndex < accumulatedCount + day.viewerAssets.length) { + randomDay = day; + break; + } + + accumulatedCount += day.viewerAssets.length; + } + if (!randomDay) { + return; + } + + return randomDay.viewerAssets[randomAssetIndex - accumulatedCount].asset; } updateAssetOperation(ids: string[], operation: AssetOperation) { From b3342323de7c1851b7ac424430eb57a6d7474e35 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Wed, 8 Oct 2025 20:30:51 +0530 Subject: [PATCH 075/134] fix: persist search page scroll offset between rebuilds (#22733) fix: persist search scroll between rebuilds Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- .../domain/models/search_result.model.dart | 19 +++++++++++-------- .../lib/domain/services/timeline.service.dart | 2 +- .../pages/search/drift_search.page.dart | 10 ++++++---- .../search/paginated_search.provider.dart | 12 ++++++++++-- .../widgets/timeline/timeline.widget.dart | 10 +++++++++- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/mobile/lib/domain/models/search_result.model.dart b/mobile/lib/domain/models/search_result.model.dart index bae8b8e821..947bc6192f 100644 --- a/mobile/lib/domain/models/search_result.model.dart +++ b/mobile/lib/domain/models/search_result.model.dart @@ -3,27 +3,30 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; class SearchResult { final List assets; + final double scrollOffset; final int? nextPage; - const SearchResult({required this.assets, this.nextPage}); + const SearchResult({required this.assets, this.scrollOffset = 0.0, this.nextPage}); - int get totalAssets => assets.length; - - SearchResult copyWith({List? assets, int? nextPage}) { - return SearchResult(assets: assets ?? this.assets, nextPage: nextPage ?? this.nextPage); + SearchResult copyWith({List? assets, int? nextPage, double? scrollOffset}) { + return SearchResult( + assets: assets ?? this.assets, + nextPage: nextPage ?? this.nextPage, + scrollOffset: scrollOffset ?? this.scrollOffset, + ); } @override - String toString() => 'SearchResult(assets: $assets, nextPage: $nextPage)'; + String toString() => 'SearchResult(assets: ${assets.length}, nextPage: $nextPage, scrollOffset: $scrollOffset)'; @override bool operator ==(covariant SearchResult other) { if (identical(this, other)) return true; final listEquals = const DeepCollectionEquality().equals; - return listEquals(other.assets, assets) && other.nextPage == nextPage; + return listEquals(other.assets, assets) && other.nextPage == nextPage && other.scrollOffset == scrollOffset; } @override - int get hashCode => assets.hashCode ^ nextPage.hashCode; + int get hashCode => assets.hashCode ^ nextPage.hashCode ^ scrollOffset.hashCode; } diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart index bf354847c3..6a7a1a22b2 100644 --- a/mobile/lib/domain/services/timeline.service.dart +++ b/mobile/lib/domain/services/timeline.service.dart @@ -203,7 +203,7 @@ class TimelineService { Future dispose() async { await _bucketSubscription?.cancel(); _bucketSubscription = null; - _buffer.clear(); + _buffer = []; _bufferOffset = 0; } } diff --git a/mobile/lib/presentation/pages/search/drift_search.page.dart b/mobile/lib/presentation/pages/search/drift_search.page.dart index 7e70ebf8ff..92716144f3 100644 --- a/mobile/lib/presentation/pages/search/drift_search.page.dart +++ b/mobile/lib/presentation/pages/search/drift_search.page.dart @@ -599,9 +599,9 @@ class _SearchResultGrid extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final searchResult = ref.watch(paginatedSearchProvider); + final assets = ref.watch(paginatedSearchProvider.select((s) => s.assets)); - if (searchResult.totalAssets == 0) { + if (assets.isEmpty) { return const _SearchEmptyContent(); } @@ -615,6 +615,7 @@ class _SearchResultGrid extends ConsumerWidget { if (metrics.pixels >= metrics.maxScrollExtent && isVerticalScroll && !isBottomSheetNotification) { onScrollEnd(); + ref.read(paginatedSearchProvider.notifier).setScrollOffset(metrics.maxScrollExtent); } return true; @@ -623,17 +624,18 @@ class _SearchResultGrid extends ConsumerWidget { child: ProviderScope( overrides: [ timelineServiceProvider.overrideWith((ref) { - final timelineService = ref.watch(timelineFactoryProvider).fromAssets(searchResult.assets); + final timelineService = ref.watch(timelineFactoryProvider).fromAssets(assets); ref.onDispose(timelineService.dispose); return timelineService; }), ], child: Timeline( - key: ValueKey(searchResult.totalAssets), + key: ValueKey(assets.length), groupBy: GroupAssetsBy.none, appBar: null, bottomSheet: const GeneralBottomSheet(minChildSize: 0.20), snapToMonth: false, + initialScrollOffset: ref.read(paginatedSearchProvider.select((s) => s.scrollOffset)), ), ), ), diff --git a/mobile/lib/presentation/pages/search/paginated_search.provider.dart b/mobile/lib/presentation/pages/search/paginated_search.provider.dart index 718a241ba4..c0c822198d 100644 --- a/mobile/lib/presentation/pages/search/paginated_search.provider.dart +++ b/mobile/lib/presentation/pages/search/paginated_search.provider.dart @@ -24,12 +24,20 @@ class PaginatedSearchNotifier extends StateNotifier { return false; } - state = SearchResult(assets: [...state.assets, ...result.assets], nextPage: result.nextPage); + state = SearchResult( + assets: [...state.assets, ...result.assets], + nextPage: result.nextPage, + scrollOffset: state.scrollOffset, + ); return true; } + void setScrollOffset(double offset) { + state = state.copyWith(scrollOffset: offset); + } + clear() { - state = const SearchResult(assets: [], nextPage: 1); + state = const SearchResult(assets: [], nextPage: 1, scrollOffset: 0.0); } } diff --git a/mobile/lib/presentation/widgets/timeline/timeline.widget.dart b/mobile/lib/presentation/widgets/timeline/timeline.widget.dart index e8832173a1..5f1e7f27b0 100644 --- a/mobile/lib/presentation/widgets/timeline/timeline.widget.dart +++ b/mobile/lib/presentation/widgets/timeline/timeline.widget.dart @@ -40,6 +40,7 @@ class Timeline extends StatelessWidget { this.groupBy, this.withScrubber = true, this.snapToMonth = true, + this.initialScrollOffset, }); final Widget? topSliverWidget; @@ -51,6 +52,7 @@ class Timeline extends StatelessWidget { final GroupAssetsBy? groupBy; final bool withScrubber; final bool snapToMonth; + final double? initialScrollOffset; @override Widget build(BuildContext context) { @@ -78,6 +80,7 @@ class Timeline extends StatelessWidget { bottomSheet: bottomSheet, withScrubber: withScrubber, snapToMonth: snapToMonth, + initialScrollOffset: initialScrollOffset, ), ), ), @@ -93,6 +96,7 @@ class _SliverTimeline extends ConsumerStatefulWidget { this.bottomSheet, this.withScrubber = true, this.snapToMonth = true, + this.initialScrollOffset, }); final Widget? topSliverWidget; @@ -101,6 +105,7 @@ class _SliverTimeline extends ConsumerStatefulWidget { final Widget? bottomSheet; final bool withScrubber; final bool snapToMonth; + final double? initialScrollOffset; @override ConsumerState createState() => _SliverTimelineState(); @@ -124,7 +129,10 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> { @override void initState() { super.initState(); - _scrollController = ScrollController(onAttach: _restoreScalePosition); + _scrollController = ScrollController( + initialScrollOffset: widget.initialScrollOffset ?? 0.0, + onAttach: _restoreScalePosition, + ); _eventSubscription = EventStream.shared.listen(_onEvent); final currentTilesPerRow = ref.read(settingsProvider).get(Setting.tilesPerRow); From eee793bfe4a2e48aea595ad7563bfaf038dd2cd5 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 8 Oct 2025 12:13:41 -0400 Subject: [PATCH 076/134] docs: add some external library notes (#22776) --- docs/docs/features/libraries.md | 4 ++++ docs/docs/guides/external-library.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/docs/features/libraries.md b/docs/docs/features/libraries.md index 08f37c6821..9f1cef0bc4 100644 --- a/docs/docs/features/libraries.md +++ b/docs/docs/features/libraries.md @@ -1,5 +1,9 @@ # External Libraries +:::info +Currently an external library can only belong to a single user which is selected when the library is initially created. +::: + External libraries track assets stored in the filesystem outside of Immich. When the external library is scanned, Immich will load videos and photos from disk and create the corresponding assets. These assets 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. Later, if a file is modified outside of Immich, you need to scan the library for the changes to show up. If an external asset is deleted from disk, Immich will move it to trash on rescan. To restore the asset, you need to restore the original file. After 30 days the file will be removed from trash, and any changes to metadata within Immich will be lost. diff --git a/docs/docs/guides/external-library.md b/docs/docs/guides/external-library.md index ef467159e7..8ff45f2806 100644 --- a/docs/docs/guides/external-library.md +++ b/docs/docs/guides/external-library.md @@ -21,6 +21,10 @@ Restart Immich by running `docker compose up -d`. # Create the library +:::info +External library management requires administrator access and the steps below assume you are using an admin account. +::: + In the Immich web UI: - click the **Administration** link in the upper right corner. From 98386340679b18f1d30eb559c7dc25fd3f273ab9 Mon Sep 17 00:00:00 2001 From: kaziu687 Date: Wed, 8 Oct 2025 18:30:54 +0200 Subject: [PATCH 077/134] feat(web): seconds and milliseconds in timestamps (#20337) * fix(web): seconds in timestamps * changed date-input step to provide millisecond precision --- web/src/lib/components/asset-viewer/detail-panel.svelte | 1 + web/src/lib/components/shared-components/change-date.svelte | 4 ++-- web/src/lib/elements/DateInput.svelte | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index c968c986a8..4361da207b 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -307,6 +307,7 @@ weekday: 'short', hour: 'numeric', minute: '2-digit', + second: '2-digit', timeZoneName: timeZone ? 'longOffset' : undefined, }, { locale: $locale }, diff --git a/web/src/lib/components/shared-components/change-date.svelte b/web/src/lib/components/shared-components/change-date.svelte index f7acf06890..930bafd599 100644 --- a/web/src/lib/components/shared-components/change-date.svelte +++ b/web/src/lib/components/shared-components/change-date.svelte @@ -88,7 +88,7 @@ const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - let selectedDate = $state(initialDate.toFormat("yyyy-MM-dd'T'HH:mm")); + let selectedDate = $state(initialDate.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")); // Use a fixed modern date to calculate stable timezone offsets for the list // This ensures that the offsets shown in the combobox are always current, // regardless of the historical date selected by the user. @@ -106,7 +106,7 @@ const { offsetMinutes, offsetFormat: zoneOffsetAtDate } = getModernOffsetForZoneAndDate(zone, date); // For validity, we still need to check if the exact date/time exists in the *original* timezone (for gaps/overlaps). const dateForValidity = DateTime.fromISO(date, { zone }); - const valid = dateForValidity.isValid && date === dateForValidity.toFormat("yyyy-MM-dd'T'HH:mm"); + const valid = dateForValidity.isValid && date === dateForValidity.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); return { value: zone, offsetMinutes, diff --git a/web/src/lib/elements/DateInput.svelte b/web/src/lib/elements/DateInput.svelte index a93d2e7cb8..c328a6c036 100644 --- a/web/src/lib/elements/DateInput.svelte +++ b/web/src/lib/elements/DateInput.svelte @@ -34,4 +34,5 @@ } onkeydown?.(e); }} + step=".001" /> From 7ee1b977c1694c70d48203471abe5cd1a043ccd5 Mon Sep 17 00:00:00 2001 From: Jorge Montejo Date: Wed, 8 Oct 2025 19:08:33 +0200 Subject: [PATCH 078/134] feat(cli): add debug development config (#22712) * add debug and change ts-node with tsx * update pr changes * update pnpm-lock * remove ts-node from readme * typo * resolve conflicts * remove tsx * launch from dist * add preLaunchTask * update readme * undo main in package.json * remove typo * Apply suggestion from @bwees Co-authored-by: Brandon Wees * revert pnpm-lock changes * @jrasm91 suggestions * chore: run node with source maps --------- Co-authored-by: Jason Rasmussen Co-authored-by: Brandon Wees --- .vscode/launch.json | 14 ++++++++++++++ .vscode/tasks.json | 5 +++++ cli/README.md | 16 ++++++++++++---- cli/package.json | 1 + 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0cc9b256ca..9ed2bb77b8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,6 +18,20 @@ "name": "Immich Workers", "remoteRoot": "/usr/src/app/server", "localRoot": "${workspaceFolder}/server" + }, + { + "type": "node", + "request": "launch", + "name": "Immich CLI", + "program": "${workspaceFolder}/cli/dist/index.js", + "args": ["upload", "--help"], + "runtimeArgs": ["--enable-source-maps"], + "console": "integratedTerminal", + "resolveSourceMapLocations": ["${workspaceFolder}/cli/dist/**/*.js.map"], + "sourceMaps": true, + "outFiles": ["${workspaceFolder}/cli/dist/**/*.js"], + "skipFiles": ["/**"], + "preLaunchTask": "Build Immich CLI" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 278e7e4fd3..478a46b4bd 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -70,6 +70,11 @@ "runOn": "folderOpen" }, "problemMatcher": [] + }, + { + "label": "Build Immich CLI", + "type": "shell", + "command": "pnpm --filter cli build:dev" } ] } diff --git a/cli/README.md b/cli/README.md index 09f5b163f7..b9d61fce09 100644 --- a/cli/README.md +++ b/cli/README.md @@ -13,15 +13,23 @@ Then, to build the open-api client run the following in the open-api folder: $ ./bin/generate-open-api.sh -To run the Immich CLI from source, run the following in the cli folder: +## Run from build + +Go to the cli folder and build it: $ pnpm install $ pnpm run build - $ ts-node . + $ node dist/index.js -You'll need ts-node, the easiest way to install it is to use pnpm: +## Run and Debug from source (VSCode) - $ pnpm i -g ts-node +With VScode you can run and debug the Immich CLI. Go to the launch.json file, find the Immich CLI config and change this with the command you need to debug + +`"args": ["upload", "--help"],` + +replace that for the command of your choice. + +## Install from build You can also build and install the CLI using diff --git a/cli/package.json b/cli/package.json index dfd2cc3610..3fff0c1031 100644 --- a/cli/package.json +++ b/cli/package.json @@ -43,6 +43,7 @@ }, "scripts": { "build": "vite build", + "build:dev": "vite build --sourcemap true", "lint": "eslint \"src/**/*.ts\" --max-warnings 0", "lint:fix": "npm run lint -- --fix", "prepack": "npm run build", From d764a59011b21ca9ad31462389bfcc0ae9dc1e9b Mon Sep 17 00:00:00 2001 From: Qhilm <3350433+Qhilm@users.noreply.github.com> Date: Wed, 8 Oct 2025 19:21:44 +0200 Subject: [PATCH 079/134] docs: add Immich-Stack to community-projects (#21563) docs: add Immich Stack community project Co-authored-by: Jason Rasmussen --- docs/src/components/community-projects.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/components/community-projects.tsx b/docs/src/components/community-projects.tsx index 932cc5ceb0..6b74ae7ad8 100644 --- a/docs/src/components/community-projects.tsx +++ b/docs/src/components/community-projects.tsx @@ -115,6 +115,11 @@ const projects: CommunityProjectProps[] = [ description: 'Auto-stack photos with identical filenames and differing extensions (i.e. JPG+RAW)', url: 'https://github.com/sid3windr/immich-stack', }, + { + title: 'Immich Stack', + description: 'Automatically groups similar photos into stacks within the Immich photo management system.', + url: 'https://github.com/Majorfi/immich-stack/', + }, ]; function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element { From cf60f4cdcd371e53bb40e13d67d40ce262c841bd Mon Sep 17 00:00:00 2001 From: Sebastian Schneider Date: Wed, 8 Oct 2025 19:22:33 +0200 Subject: [PATCH 080/134] feat(web): Add upload to stack action (#19842) * feat(web): Add upload to stack action * Event handling and translation * Update asset viewer instead * lint, improve upload return type * Add suggestions from code review * Resolve merge conflicts * Apply suggestions from code review --- i18n/en.json | 1 + .../components/asset-viewer/actions/action.ts | 1 + .../actions/add-to-stack-action.svelte | 37 +++++++++++++++++++ .../asset-viewer/asset-viewer-nav-bar.svelte | 2 + .../asset-viewer/asset-viewer.svelte | 1 + .../timeline/TimelineAssetViewer.svelte | 10 +++++ web/src/lib/constants.ts | 1 + web/src/lib/utils/file-uploader.ts | 2 +- 8 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 web/src/lib/components/asset-viewer/actions/add-to-stack-action.svelte diff --git a/i18n/en.json b/i18n/en.json index e86b56be85..bd59c37fac 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -33,6 +33,7 @@ "add_to_albums": "Add to albums", "add_to_albums_count": "Add to albums ({count})", "add_to_shared_album": "Add to shared album", + "add_upload_to_stack": "Add upload to stack", "add_url": "Add URL", "added_to_archive": "Added to archive", "added_to_favorites": "Added to favorites", diff --git a/web/src/lib/components/asset-viewer/actions/action.ts b/web/src/lib/components/asset-viewer/actions/action.ts index 680dced7ca..6a807d2766 100644 --- a/web/src/lib/components/asset-viewer/actions/action.ts +++ b/web/src/lib/components/asset-viewer/actions/action.ts @@ -12,6 +12,7 @@ type ActionMap = { [AssetAction.RESTORE]: { asset: TimelineAsset }; [AssetAction.ADD]: { asset: TimelineAsset }; [AssetAction.ADD_TO_ALBUM]: { asset: TimelineAsset; album: AlbumResponseDto }; + [AssetAction.STACK]: { stack: StackResponseDto }; [AssetAction.UNSTACK]: { assets: TimelineAsset[] }; [AssetAction.KEEP_THIS_DELETE_OTHERS]: { asset: TimelineAsset }; [AssetAction.SET_STACK_PRIMARY_ASSET]: { stack: StackResponseDto }; diff --git a/web/src/lib/components/asset-viewer/actions/add-to-stack-action.svelte b/web/src/lib/components/asset-viewer/actions/add-to-stack-action.svelte new file mode 100644 index 0000000000..5b30beff6e --- /dev/null +++ b/web/src/lib/components/asset-viewer/actions/add-to-stack-action.svelte @@ -0,0 +1,37 @@ + + + diff --git a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte index bbdd0dcd5f..d61af04db6 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte @@ -4,6 +4,7 @@ import CastButton from '$lib/cast/cast-button.svelte'; import type { OnAction, PreAction } from '$lib/components/asset-viewer/actions/action'; import AddToAlbumAction from '$lib/components/asset-viewer/actions/add-to-album-action.svelte'; + import AddToStackAction from '$lib/components/asset-viewer/actions/add-to-stack-action.svelte'; import ArchiveAction from '$lib/components/asset-viewer/actions/archive-action.svelte'; import CloseAction from '$lib/components/asset-viewer/actions/close-action.svelte'; import DeleteAction from '$lib/components/asset-viewer/actions/delete-action.svelte'; @@ -196,6 +197,7 @@ {/if} {#if isOwner} + {#if stack} diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 5484cd2c08..3dd7741af5 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -336,6 +336,7 @@ } break; } + case AssetAction.STACK: case AssetAction.SET_STACK_PRIMARY_ASSET: { stack = action.stack; break; diff --git a/web/src/lib/components/timeline/TimelineAssetViewer.svelte b/web/src/lib/components/timeline/TimelineAssetViewer.svelte index 17e3ed06f3..60b839d7e1 100644 --- a/web/src/lib/components/timeline/TimelineAssetViewer.svelte +++ b/web/src/lib/components/timeline/TimelineAssetViewer.svelte @@ -120,6 +120,16 @@ break; } + case AssetAction.STACK: { + updateStackedAssetInTimeline(timelineManager, { + stack: action.stack, + toDeleteIds: action.stack.assets + .filter((asset) => asset.id !== action.stack.primaryAssetId) + .map((asset) => asset.id), + }); + break; + } + case AssetAction.UNSTACK: { updateUnstackedAssetInTimeline(timelineManager, action.assets); break; diff --git a/web/src/lib/constants.ts b/web/src/lib/constants.ts index da638bb41d..8d2b706ead 100644 --- a/web/src/lib/constants.ts +++ b/web/src/lib/constants.ts @@ -8,6 +8,7 @@ export enum AssetAction { RESTORE = 'restore', ADD = 'add', ADD_TO_ALBUM = 'add-to-album', + STACK = 'stack', UNSTACK = 'unstack', KEEP_THIS_DELETE_OTHERS = 'keep-this-delete-others', SET_STACK_PRIMARY_ASSET = 'set-stack-primary-asset', diff --git a/web/src/lib/utils/file-uploader.ts b/web/src/lib/utils/file-uploader.ts index c572ec1760..3f602bdb29 100644 --- a/web/src/lib/utils/file-uploader.ts +++ b/web/src/lib/utils/file-uploader.ts @@ -52,7 +52,7 @@ export const openFileUploadDialog = async (options: FileUploadParam = {}) => { const { albumId, multiple = true, assetId } = options; const extensions = uploadManager.getExtensions(); - return new Promise<(string | undefined)[]>((resolve, reject) => { + return new Promise((resolve, reject) => { try { const fileSelector = document.createElement('input'); From b2d00405f1018be59239bb24b6113290cc3bfc65 Mon Sep 17 00:00:00 2001 From: Tushar Harsora Date: Wed, 8 Oct 2025 22:54:11 +0530 Subject: [PATCH 081/134] feat(server): add `immich.users.total` metric (#21780) * Add immich.users.total metric * Fix tests & one lint error * Lint * Fix SQL Schema checks * Fix nit * Use workers argument in OnEvent hook and remove condition from method body --- server/src/app.module.ts | 2 ++ server/src/queries/user.repository.sql | 8 ++++++++ server/src/repositories/user.repository.ts | 10 ++++++++++ server/src/services/base.service.ts | 1 + server/src/services/user-admin.service.ts | 2 ++ server/src/services/user.service.ts | 10 ++++++++-- server/test/medium.factory.ts | 6 ++++++ server/test/medium/specs/services/auth.service.spec.ts | 3 ++- server/test/medium/specs/services/user.service.spec.ts | 3 ++- 9 files changed, 41 insertions(+), 4 deletions(-) diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 8d261463e7..a1cd1edfdf 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -19,6 +19,7 @@ import { ConfigRepository } from 'src/repositories/config.repository'; import { EventRepository } from 'src/repositories/event.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { teardownTelemetry, TelemetryRepository } from 'src/repositories/telemetry.repository'; +import { UserRepository } from 'src/repositories/user.repository'; import { services } from 'src/services'; import { AuthService } from 'src/services/auth.service'; import { CliService } from 'src/services/cli.service'; @@ -55,6 +56,7 @@ class BaseModule implements OnModuleInit, OnModuleDestroy { private jobService: JobService, private telemetryRepository: TelemetryRepository, private authService: AuthService, + private userRepository: UserRepository, ) { logger.setAppName(this.worker); } diff --git a/server/src/queries/user.repository.sql b/server/src/queries/user.repository.sql index 6a02654781..c5a4f139a7 100644 --- a/server/src/queries/user.repository.sql +++ b/server/src/queries/user.repository.sql @@ -363,6 +363,14 @@ group by order by "user"."createdAt" asc +-- UserRepository.getCount +select + count(*) as "count" +from + "user" +where + "user"."deletedAt" is null + -- UserRepository.updateUsage update "user" set diff --git a/server/src/repositories/user.repository.ts b/server/src/repositories/user.repository.ts index 44f4a2bb9c..20b41c80f8 100644 --- a/server/src/repositories/user.repository.ts +++ b/server/src/repositories/user.repository.ts @@ -286,6 +286,16 @@ export class UserRepository { .execute(); } + @GenerateSql() + async getCount(): Promise { + const result = await this.db + .selectFrom('user') + .select((eb) => eb.fn.countAll().as('count')) + .where('user.deletedAt', 'is', null) + .executeTakeFirstOrThrow(); + return Number(result.count); + } + @GenerateSql({ params: [DummyValue.UUID, DummyValue.NUMBER] }) async updateUsage(id: string, delta: number): Promise { await this.db diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index 2f0e272883..6b85c3ec6c 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -215,6 +215,7 @@ export class BaseService { payload.storageLabel = sanitize(payload.storageLabel.replaceAll('.', '')); } + this.telemetryRepository.api.addToGauge(`immich.users.total`, 1); return this.userRepository.create(payload); } } diff --git a/server/src/services/user-admin.service.ts b/server/src/services/user-admin.service.ts index ce70419ff6..a57072e496 100644 --- a/server/src/services/user-admin.service.ts +++ b/server/src/services/user-admin.service.ts @@ -102,6 +102,7 @@ export class UserAdminService extends BaseService { const status = force ? UserStatus.Removing : UserStatus.Deleted; const user = await this.userRepository.update(id, { status, deletedAt: new Date() }); + this.telemetryRepository.api.addToGauge(`immich.users.total`, -1); if (force) { await this.jobRepository.queue({ name: JobName.UserDelete, data: { id: user.id, force } }); @@ -114,6 +115,7 @@ export class UserAdminService extends BaseService { await this.findOrFail(id, { withDeleted: true }); await this.albumRepository.restoreAll(id); const user = await this.userRepository.restore(id); + this.telemetryRepository.api.addToGauge('immich.users.total', 1); return mapUserAdmin(user); } diff --git a/server/src/services/user.service.ts b/server/src/services/user.service.ts index 6849b17ac3..fc71777673 100644 --- a/server/src/services/user.service.ts +++ b/server/src/services/user.service.ts @@ -3,14 +3,14 @@ import { Updateable } from 'kysely'; import { DateTime } from 'luxon'; import { SALT_ROUNDS } from 'src/constants'; import { StorageCore } from 'src/cores/storage.core'; -import { OnJob } from 'src/decorators'; +import { OnEvent, OnJob } from 'src/decorators'; import { AuthDto } from 'src/dtos/auth.dto'; import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto'; import { OnboardingDto, OnboardingResponseDto } from 'src/dtos/onboarding.dto'; import { UserPreferencesResponseDto, UserPreferencesUpdateDto, mapPreferences } from 'src/dtos/user-preferences.dto'; import { CreateProfileImageResponseDto } from 'src/dtos/user-profile.dto'; import { UserAdminResponseDto, UserResponseDto, UserUpdateMeDto, mapUser, mapUserAdmin } from 'src/dtos/user.dto'; -import { CacheControl, JobName, JobStatus, QueueName, StorageFolder, UserMetadataKey } from 'src/enum'; +import { CacheControl, ImmichWorker, JobName, JobStatus, QueueName, StorageFolder, UserMetadataKey } from 'src/enum'; import { UserFindOptions } from 'src/repositories/user.repository'; import { UserTable } from 'src/schema/tables/user.table'; import { BaseService } from 'src/services/base.service'; @@ -213,6 +213,12 @@ export class UserService extends BaseService { }; } + @OnEvent({ name: 'AppBootstrap', workers: [ImmichWorker.Api] }) + async onBootstrap(): Promise { + const userCount = await this.userRepository.getCount(); + this.telemetryRepository.api.addToGauge('immich.users.total', userCount); + } + @OnJob({ name: JobName.UserSyncUsage, queue: QueueName.BackgroundTask }) async handleUserSyncUsage(): Promise { await this.userRepository.syncUsage(); diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index a169d96322..c7356e2f1b 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -39,6 +39,7 @@ import { StorageRepository } from 'src/repositories/storage.repository'; import { SyncCheckpointRepository } from 'src/repositories/sync-checkpoint.repository'; import { SyncRepository } from 'src/repositories/sync.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; +import { TelemetryRepository } from 'src/repositories/telemetry.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { VersionHistoryRepository } from 'src/repositories/version-history.repository'; import { DB } from 'src/schema'; @@ -54,6 +55,7 @@ import { StackTable } from 'src/schema/tables/stack.table'; import { UserTable } from 'src/schema/tables/user.table'; import { BASE_SERVICE_DEPENDENCIES, BaseService } from 'src/services/base.service'; import { SyncService } from 'src/services/sync.service'; +import { newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock'; import { factory, newDate, newEmbedding, newUuid } from 'test/small.factory'; import { automock, wait } from 'test/utils'; import { Mocked } from 'vitest'; @@ -347,6 +349,10 @@ const newMockRepository = (key: ClassConstructor) => { return automock(key); } + case TelemetryRepository: { + return newTelemetryRepositoryMock(); + } + case DatabaseRepository: { return automock(DatabaseRepository, { args: [undefined, { setContext: () => {} }, { getEnv: () => ({ database: { vectorExtension: '' } }) }], diff --git a/server/test/medium/specs/services/auth.service.spec.ts b/server/test/medium/specs/services/auth.service.spec.ts index 14ea1451f2..60d3210f4c 100644 --- a/server/test/medium/specs/services/auth.service.spec.ts +++ b/server/test/medium/specs/services/auth.service.spec.ts @@ -11,6 +11,7 @@ import { LoggingRepository } from 'src/repositories/logging.repository'; import { SessionRepository } from 'src/repositories/session.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; +import { TelemetryRepository } from 'src/repositories/telemetry.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { DB } from 'src/schema'; import { AuthService } from 'src/services/auth.service'; @@ -32,7 +33,7 @@ const setup = (db?: Kysely) => { SystemMetadataRepository, UserRepository, ], - mock: [LoggingRepository, StorageRepository, EventRepository], + mock: [LoggingRepository, StorageRepository, EventRepository, TelemetryRepository], }); }; diff --git a/server/test/medium/specs/services/user.service.spec.ts b/server/test/medium/specs/services/user.service.spec.ts index 7643be292e..0d72d39950 100644 --- a/server/test/medium/specs/services/user.service.spec.ts +++ b/server/test/medium/specs/services/user.service.spec.ts @@ -6,6 +6,7 @@ import { CryptoRepository } from 'src/repositories/crypto.repository'; import { JobRepository } from 'src/repositories/job.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; +import { TelemetryRepository } from 'src/repositories/telemetry.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { DB } from 'src/schema'; import { UserService } from 'src/services/user.service'; @@ -21,7 +22,7 @@ const setup = (db?: Kysely) => { return newMediumService(UserService, { database: db || defaultDatabase, real: [CryptoRepository, ConfigRepository, SystemMetadataRepository, UserRepository], - mock: [LoggingRepository, JobRepository], + mock: [LoggingRepository, JobRepository, TelemetryRepository], }); }; From 53680d9643f7de5c18e2fd5195b4b6706cf6066f Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Thu, 9 Oct 2025 03:10:58 +0800 Subject: [PATCH 082/134] feat(docs): add zh_TW Traditional Chinese version README (#22703) docs: add zh_TW Traditional Chinese version README --- README.md | 3 +- readme_i18n/README_ar_JO.md | 3 +- readme_i18n/README_ca_ES.md | 3 +- readme_i18n/README_de_DE.md | 3 +- readme_i18n/README_es_ES.md | 3 +- readme_i18n/README_fr_FR.md | 3 +- readme_i18n/README_it_IT.md | 3 +- readme_i18n/README_ja_JP.md | 3 +- readme_i18n/README_ko_KR.md | 3 +- readme_i18n/README_nl_NL.md | 3 +- readme_i18n/README_pt_BR.md | 3 +- readme_i18n/README_ru_RU.md | 3 +- readme_i18n/README_sv_SE.md | 3 +- readme_i18n/README_th_TH.md | 3 +- readme_i18n/README_tr_TR.md | 3 +- readme_i18n/README_uk_UA.md | 3 +- readme_i18n/README_vi_VN.md | 3 +- readme_i18n/README_zh_CN.md | 1 + readme_i18n/README_zh_TW.md | 132 ++++++++++++++++++++++++++++++++++++ 19 files changed, 167 insertions(+), 17 deletions(-) create mode 100644 readme_i18n/README_zh_TW.md diff --git a/README.md b/README.md index 0b9b008bca..b540408475 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_ar_JO.md b/readme_i18n/README_ar_JO.md index b2c195cd3e..e0e13eeaf6 100644 --- a/readme_i18n/README_ar_JO.md +++ b/readme_i18n/README_ar_JO.md @@ -28,7 +28,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_ca_ES.md b/readme_i18n/README_ca_ES.md index 5efcf51aaf..d09362aa0f 100644 --- a/readme_i18n/README_ca_ES.md +++ b/readme_i18n/README_ca_ES.md @@ -27,7 +27,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_de_DE.md b/readme_i18n/README_de_DE.md index e54a1f0f71..a8685e0902 100644 --- a/readme_i18n/README_de_DE.md +++ b/readme_i18n/README_de_DE.md @@ -27,7 +27,8 @@ 한국어 Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_es_ES.md b/readme_i18n/README_es_ES.md index 0b4da86f71..032f8c50a8 100644 --- a/readme_i18n/README_es_ES.md +++ b/readme_i18n/README_es_ES.md @@ -27,7 +27,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_fr_FR.md b/readme_i18n/README_fr_FR.md index ae565571f8..349a0c49ce 100644 --- a/readme_i18n/README_fr_FR.md +++ b/readme_i18n/README_fr_FR.md @@ -27,7 +27,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_it_IT.md b/readme_i18n/README_it_IT.md index 656b392616..711840fd9d 100644 --- a/readme_i18n/README_it_IT.md +++ b/readme_i18n/README_it_IT.md @@ -28,7 +28,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_ja_JP.md b/readme_i18n/README_ja_JP.md index a6fa4953af..0e74077895 100644 --- a/readme_i18n/README_ja_JP.md +++ b/readme_i18n/README_ja_JP.md @@ -27,7 +27,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Русский Português Brasileiro Svenska diff --git a/readme_i18n/README_ko_KR.md b/readme_i18n/README_ko_KR.md index f4feb29fcc..c2dfd11dd3 100644 --- a/readme_i18n/README_ko_KR.md +++ b/readme_i18n/README_ko_KR.md @@ -28,7 +28,8 @@ Deutsch Nederlands Türkçe -中文 +简体中文 +正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_nl_NL.md b/readme_i18n/README_nl_NL.md index 0400442bb4..ac72e9d238 100644 --- a/readme_i18n/README_nl_NL.md +++ b/readme_i18n/README_nl_NL.md @@ -27,7 +27,8 @@ 한국어 Deutsch Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_pt_BR.md b/readme_i18n/README_pt_BR.md index 240fe4d2e2..d6f51cd779 100644 --- a/readme_i18n/README_pt_BR.md +++ b/readme_i18n/README_pt_BR.md @@ -29,7 +29,8 @@ Deutsch Nederlands Türkçe -中文 +简体中文 +正體中文 Українська Русский Svenska diff --git a/readme_i18n/README_ru_RU.md b/readme_i18n/README_ru_RU.md index d774fae84c..e29adde9c1 100644 --- a/readme_i18n/README_ru_RU.md +++ b/readme_i18n/README_ru_RU.md @@ -28,7 +28,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Português Brasileiro Svenska diff --git a/readme_i18n/README_sv_SE.md b/readme_i18n/README_sv_SE.md index 24c08fa8df..a421c23c2e 100644 --- a/readme_i18n/README_sv_SE.md +++ b/readme_i18n/README_sv_SE.md @@ -29,7 +29,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_th_TH.md b/readme_i18n/README_th_TH.md index 8d34261281..cdc28b14e6 100644 --- a/readme_i18n/README_th_TH.md +++ b/readme_i18n/README_th_TH.md @@ -31,7 +31,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_tr_TR.md b/readme_i18n/README_tr_TR.md index 930d750b88..46aef49745 100644 --- a/readme_i18n/README_tr_TR.md +++ b/readme_i18n/README_tr_TR.md @@ -27,7 +27,8 @@ 한국어 Deutsch Nederlands - 中文 + 简体中文 + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_uk_UA.md b/readme_i18n/README_uk_UA.md index f236d49091..297054ee42 100644 --- a/readme_i18n/README_uk_UA.md +++ b/readme_i18n/README_uk_UA.md @@ -29,7 +29,8 @@ Deutsch Nederlands Türkçe - 中文 + 简体中文 + 正體中文 Русский Português Brasileiro Svenska diff --git a/readme_i18n/README_vi_VN.md b/readme_i18n/README_vi_VN.md index f74e7c3771..b6b22ff610 100644 --- a/readme_i18n/README_vi_VN.md +++ b/readme_i18n/README_vi_VN.md @@ -29,7 +29,8 @@ Deutsch Nederlands Türkçe -中文 +简体中文 +正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_zh_CN.md b/readme_i18n/README_zh_CN.md index c95631db89..b48e69f94d 100644 --- a/readme_i18n/README_zh_CN.md +++ b/readme_i18n/README_zh_CN.md @@ -32,6 +32,7 @@ Deutsch Nederlands Türkçe + 正體中文 Українська Русский Português Brasileiro diff --git a/readme_i18n/README_zh_TW.md b/readme_i18n/README_zh_TW.md new file mode 100644 index 0000000000..bf14ce2dc0 --- /dev/null +++ b/readme_i18n/README_zh_TW.md @@ -0,0 +1,132 @@ +

+
+ 授權條款:AGPLv3 + + Discord + +
+
+

+ +

+ +

+

高效能的自架照片和影片管理解決方案

+
+ + + +
+ +

+ English + Català + Español + Français + Italiano + 日本語 + 한국어 + Deutsch + Nederlands + Türkçe + 简体中文 + 正體中文 + Українська + Русский + Português Brasileiro + Svenska + العربية + Tiếng Việt + ภาษาไทย +

+ +> [!WARNING] +> ⚠️ 請務必遵循 [3-2-1 備份原則](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/),守護珍貴的照片與影片! +> + +> [!NOTE] +> 主要說明文件(包含安裝指南)可於 https://immich.app/ 取得。 + +## 連結 + +- [說明文件](https://docs.immich.app/) +- [關於](https://docs.immich.app/overview/introduction) +- [安裝](https://docs.immich.app/install/requirements) +- [發展藍圖](https://immich.app/roadmap) +- [線上體驗](#線上體驗) +- [功能](#功能) +- [翻譯](https://docs.immich.app/developer/translations) +- [貢獻指南](https://docs.immich.app/overview/support-the-project) + +## 線上體驗 + +請前往 [Demoo 網站](https://demo.immich.app) 立即體驗 Immich。若要在手機 App 試用,請在 `伺服器端點 URL` 欄位輸入 `https://demo.immich.app`。 + +### 登入資訊 + +| 電子郵件 | 密碼 | +| --------------- | ------ | +| demo@immich.app | demo | + +## 功能 + +| 功能 | 手機版 | 網頁版 | +| :----------------------------------------- | ------ | ------ | +| 上傳與檢視照片與影片 | 是 | 是 | +| 開啟 App 時自動備份 | 是 | 不適用 | +| 避免重複媒體 | 是 | 是 | +| 選擇要備份的相簿 | 是 | 不適用 | +| 下載照片與影片到本機裝置 | 是 | 是 | +| 多使用者支援 | 是 | 是 | +| 相簿與共享相簿 | 是 | 是 | +| 可拖曳的捲軸 | 是 | 是 | +| 支援 RAW 格式 | 是 | 是 | +| 中繼資料檢視(EXIF、地圖) | 是 | 是 | +| 依中繼資料、物件、臉孔與 CLIP 搜尋 | 是 | 是 | +| 管理功能(使用者管理) | 否 | 是 | +| 背景備份 | 是 | 不適用 | +| 虛擬滾動 | 是 | 是 | +| 支援 OAuth | 是 | 是 | +| API 金鑰 | 不適用 | 是 | +| Live Photo/動態照片備份與播放 | 是 | 是 | +| 支援 360 度全景照片顯示 | 否 | 是 | +| 使用者自訂儲存結構 | 是 | 是 | +| 公開分享 | 是 | 是 | +| 封存與收藏 | 是 | 是 | +| 世界地圖 | 是 | 是 | +| 親朋好友分享 | 是 | 是 | +| 臉部辨識與分群 | 是 | 是 | +| 回憶(x 年前) | 是 | 是 | +| 離線支援 | 是 | 否 | +| 唯讀媒體庫 | 是 | 是 | +| 照片堆疊 | 是 | 是 | +| 標籤 | 否 | 是 | +| 資料夾檢視 | 是 | 是 | + +## 翻譯 + +更多翻譯相關資訊請見 [此處](https://docs.immich.app/developer/translations)。 + + +翻譯狀態 + + +## 專案活躍度 + +![專案活躍度](https://repobeats.axiom.co/api/embed/9e86d9dc3ddd137161f2f6d2e758d7863b1789cb.svg "Repobeats 分析圖片") + +## Star 數量歷史紀錄 + + + + + + Star 歷史紀錄圖表 + + + +## 貢獻者 + + + + From f7250f24fe424b6f2a2bab62309693fb8b26a002 Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Thu, 9 Oct 2025 20:34:54 +0200 Subject: [PATCH 083/134] chore: ignore renovate major updates for postgres image (#22764) --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/renovate.json b/renovate.json index 5fe45d61f7..d214a81da5 100644 --- a/renovate.json +++ b/renovate.json @@ -21,6 +21,12 @@ "addLabels": [ "📱mobile" ] + }, + { + "matchDatasources": ["docker"], + "matchPackageNames": ["ghcr.io/immich-app/postgres"], + "matchUpdateTypes": ["major"], + "enabled": false } ], "ignorePaths": [ From 84302dc14ccca9046d56a67d374ef1a0e6e45d5a Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Thu, 9 Oct 2025 20:44:20 +0200 Subject: [PATCH 084/134] fix: remove postgres exclude datasource match (#22811) --- renovate.json | 1 - 1 file changed, 1 deletion(-) diff --git a/renovate.json b/renovate.json index d214a81da5..3a889f4789 100644 --- a/renovate.json +++ b/renovate.json @@ -23,7 +23,6 @@ ] }, { - "matchDatasources": ["docker"], "matchPackageNames": ["ghcr.io/immich-app/postgres"], "matchUpdateTypes": ["major"], "enabled": false From 1fdbe2c6b85c46af43ca09d1a0f338aed789b192 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 20:51:51 +0200 Subject: [PATCH 085/134] chore(deps): update github-actions (major) (#22810) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-mobile.yml | 4 +- .github/workflows/cache-cleanup.yml | 2 +- .github/workflows/cli.yml | 6 +-- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/docs-build.yml | 4 +- .github/workflows/docs-deploy.yml | 16 +++---- .github/workflows/docs-destroy.yml | 4 +- .github/workflows/fix-format.yml | 6 +-- .github/workflows/pr-labeler.yml | 2 +- .github/workflows/prepare-release.yml | 10 ++--- .github/workflows/preview-label.yaml | 2 +- .github/workflows/sdk.yml | 4 +- .github/workflows/static_analysis.yml | 2 +- .github/workflows/test.yml | 62 +++++++++++++-------------- 14 files changed, 63 insertions(+), 63 deletions(-) diff --git a/.github/workflows/build-mobile.yml b/.github/workflows/build-mobile.yml index 454b954597..f7e9ad5731 100644 --- a/.github/workflows/build-mobile.yml +++ b/.github/workflows/build-mobile.yml @@ -55,7 +55,7 @@ jobs: runs-on: mich steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.sha }} persist-credentials: false @@ -66,7 +66,7 @@ jobs: working-directory: ./mobile run: printf "%s" $KEY_JKS | base64 -d > android/key.jks - - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 with: distribution: 'zulu' java-version: '17' diff --git a/.github/workflows/cache-cleanup.yml b/.github/workflows/cache-cleanup.yml index cdff8ed931..0b4366ba04 100644 --- a/.github/workflows/cache-cleanup.yml +++ b/.github/workflows/cache-cleanup.yml @@ -19,7 +19,7 @@ jobs: actions: write steps: - name: Check out code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 27dab9aef3..1483b4312b 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -29,7 +29,7 @@ jobs: working-directory: ./cli steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false @@ -37,7 +37,7 @@ jobs: uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './cli/.nvmrc' registry-url: 'https://registry.npmjs.org' @@ -65,7 +65,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4d4cbdf49b..cb50b650e2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,7 +44,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 0879c30386..1a29bebe47 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -47,7 +47,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false @@ -55,7 +55,7 @@ jobs: uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './docs/.nvmrc' cache: 'pnpm' diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index b504b811e3..f0742917d8 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -20,7 +20,7 @@ jobs: run: echo 'The triggering workflow did not succeed' && exit 1 - name: Get artifact id: get-artifact - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ @@ -38,7 +38,7 @@ jobs: return { found: true, id: matchArtifact.id }; - name: Determine deploy parameters id: parameters - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: HEAD_SHA: ${{ github.event.workflow_run.head_sha }} with: @@ -108,13 +108,13 @@ jobs: if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }} steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Load parameters id: parameters - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: PARAM_JSON: ${{ needs.checks.outputs.parameters }} with: @@ -125,7 +125,7 @@ jobs: core.setOutput("shouldDeploy", parameters.shouldDeploy); - name: Download artifact - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }} with: @@ -150,7 +150,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 + uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 with: tg_version: '0.58.12' tofu_version: '1.7.1' @@ -165,7 +165,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 + uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 with: tg_version: '0.58.12' tofu_version: '1.7.1' @@ -199,7 +199,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 + uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 with: tg_version: '0.58.12' tofu_version: '1.7.1' diff --git a/.github/workflows/docs-destroy.yml b/.github/workflows/docs-destroy.yml index 37653c0990..ad3accab54 100644 --- a/.github/workflows/docs-destroy.yml +++ b/.github/workflows/docs-destroy.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false @@ -25,7 +25,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 + uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 with: tg_version: '0.58.12' tofu_version: '1.7.1' diff --git a/.github/workflows/fix-format.yml b/.github/workflows/fix-format.yml index 849de79a47..1c57828b0c 100644 --- a/.github/workflows/fix-format.yml +++ b/.github/workflows/fix-format.yml @@ -22,7 +22,7 @@ jobs: private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: 'Checkout' - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ github.event.pull_request.head.ref }} token: ${{ steps.generate-token.outputs.token }} @@ -32,7 +32,7 @@ jobs: uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -48,7 +48,7 @@ jobs: message: 'chore: fix formatting' - name: Remove label - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 if: always() with: script: | diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml index ad73c78cf8..af92a3e215 100644 --- a/.github/workflows/pr-labeler.yml +++ b/.github/workflows/pr-labeler.yml @@ -11,4 +11,4 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5.0.0 + - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 8b6dc0af1c..69934b953b 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -55,20 +55,20 @@ jobs: private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Checkout - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: token: ${{ steps.generate-token.outputs.token }} persist-credentials: true ref: main - name: Install uv - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 + uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0 - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -117,13 +117,13 @@ jobs: private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - name: Checkout - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: token: ${{ steps.generate-token.outputs.token }} persist-credentials: false - name: Download APK - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 with: name: release-apk-signed diff --git a/.github/workflows/preview-label.yaml b/.github/workflows/preview-label.yaml index 1d9a0060ad..594214f820 100644 --- a/.github/workflows/preview-label.yaml +++ b/.github/workflows/preview-label.yaml @@ -24,7 +24,7 @@ jobs: permissions: pull-requests: write steps: - - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | github.rest.issues.removeLabel({ diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index c541fac3c1..a0d89be598 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -16,7 +16,7 @@ jobs: run: working-directory: ./open-api/typescript-sdk steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false @@ -24,7 +24,7 @@ jobs: uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 # Setup .npmrc file to publish to npm - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './open-api/typescript-sdk/.nvmrc' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index d30f95422c..3e7223be74 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -42,7 +42,7 @@ jobs: working-directory: ./mobile steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eaf9e2c080..0180333309 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,13 +56,13 @@ jobs: working-directory: ./server steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -93,13 +93,13 @@ jobs: working-directory: ./cli steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './cli/.nvmrc' cache: 'pnpm' @@ -133,13 +133,13 @@ jobs: working-directory: ./cli steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './cli/.nvmrc' cache: 'pnpm' @@ -168,13 +168,13 @@ jobs: working-directory: ./web steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -205,13 +205,13 @@ jobs: working-directory: ./web steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -236,13 +236,13 @@ jobs: contents: read steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './web/.nvmrc' cache: 'pnpm' @@ -277,13 +277,13 @@ jobs: working-directory: ./e2e steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -316,13 +316,13 @@ jobs: working-directory: ./server steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -347,14 +347,14 @@ jobs: runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false submodules: 'recursive' - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -395,14 +395,14 @@ jobs: runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false submodules: 'recursive' - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './e2e/.nvmrc' cache: 'pnpm' @@ -441,7 +441,7 @@ jobs: permissions: contents: read steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup Flutter SDK @@ -466,12 +466,12 @@ jobs: run: working-directory: ./machine-learning steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Install uv - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 # TODO: add caching when supported (https://github.com/actions/setup-python/pull/818) # with: # python-version: 3.11 @@ -503,13 +503,13 @@ jobs: working-directory: ./.github steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './.github/.nvmrc' cache: 'pnpm' @@ -525,7 +525,7 @@ jobs: permissions: contents: read steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Run ShellCheck @@ -540,13 +540,13 @@ jobs: contents: read steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' @@ -595,13 +595,13 @@ jobs: working-directory: ./server steps: - name: Checkout code - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version-file: './server/.nvmrc' cache: 'pnpm' From aed7bb53aadcdd4dda665a5414e84d69ac8cdfed Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Thu, 9 Oct 2025 21:11:39 +0200 Subject: [PATCH 086/134] fix: revert terragrunt-action bump (#22812) --- .github/workflows/docs-deploy.yml | 6 +++--- .github/workflows/docs-destroy.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index f0742917d8..6643c5abfd 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -150,7 +150,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 + uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 with: tg_version: '0.58.12' tofu_version: '1.7.1' @@ -165,7 +165,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 + uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 with: tg_version: '0.58.12' tofu_version: '1.7.1' @@ -199,7 +199,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 + uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 with: tg_version: '0.58.12' tofu_version: '1.7.1' diff --git a/.github/workflows/docs-destroy.yml b/.github/workflows/docs-destroy.yml index ad3accab54..c4b9a9fff3 100644 --- a/.github/workflows/docs-destroy.yml +++ b/.github/workflows/docs-destroy.yml @@ -25,7 +25,7 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }} - uses: gruntwork-io/terragrunt-action@95fc057922e3c3d4cc021a81a213f088f333ddef # v3.0.2 + uses: gruntwork-io/terragrunt-action@aee21a7df999be8b471c2a8564c6cd853cb674e1 # v2.1.8 with: tg_version: '0.58.12' tofu_version: '1.7.1' From 9793828dc771c68fc2d37effc2fe842eea24da99 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Thu, 9 Oct 2025 21:17:42 +0200 Subject: [PATCH 087/134] chore: don't enforce runes (#22813) --- web/svelte.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/svelte.config.js b/web/svelte.config.js index 1d6527fdf0..00472f9c13 100644 --- a/web/svelte.config.js +++ b/web/svelte.config.js @@ -10,7 +10,8 @@ process.env.PUBLIC_IMMICH_PAY_HOST = process.env.PUBLIC_IMMICH_PAY_HOST || 'http /** @type {import('@sveltejs/kit').Config} */ const config = { compilerOptions: { - runes: true, + // TODO pending `@immich/ui` to enable it + // runes: true, }, preprocess: vitePreprocess(), kit: { From a5e0d83d9fbdef7a6c31b7b16492bf37892ccd95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 22:40:23 +0000 Subject: [PATCH 088/134] chore(deps): update base-image to v202510092146 (major) (#22818) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- server/Dockerfile | 4 ++-- server/Dockerfile.dev | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/Dockerfile b/server/Dockerfile index 05cd4601be..2ff62f9ab4 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/immich-app/base-server-dev:202509210934@sha256:b5ce2d7eaf379d4cf15efd4bab180d8afc8a80d20b36c9800f4091aca6ae267e AS builder +FROM ghcr.io/immich-app/base-server-dev:202510092146@sha256:124ec9659cba4a206924de5e3691f84acde16d75fa2b10b7007542424b696b96 AS builder ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \ CI=1 \ COREPACK_HOME=/tmp \ @@ -48,7 +48,7 @@ RUN --mount=type=cache,id=pnpm-cli,target=/buildcache/pnpm-store \ pnpm --filter @immich/sdk --filter @immich/cli build && \ pnpm --filter @immich/cli --prod --no-optional deploy /output/cli-pruned -FROM ghcr.io/immich-app/base-server-prod:202509210934@sha256:0c7eacf0ba88ca52e1a267cfc62d20d07792ea2c604818c2cbd37dc7dcefdac9 +FROM ghcr.io/immich-app/base-server-prod:202510092146@sha256:c39b9ad949e7777bce415e6931334aeff7331e04cb7f9df93f9ae44f6ff36b9e WORKDIR /usr/src/app ENV NODE_ENV=production \ diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev index 717094cb6b..c37d9d3149 100644 --- a/server/Dockerfile.dev +++ b/server/Dockerfile.dev @@ -1,5 +1,5 @@ # dev build -FROM ghcr.io/immich-app/base-server-dev:202509210934@sha256:b5ce2d7eaf379d4cf15efd4bab180d8afc8a80d20b36c9800f4091aca6ae267e AS dev +FROM ghcr.io/immich-app/base-server-dev:202510092146@sha256:124ec9659cba4a206924de5e3691f84acde16d75fa2b10b7007542424b696b96 AS dev ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \ CI=1 \ From ea610760eee96b2e594ec4c712d4b72567d05502 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 00:50:48 +0200 Subject: [PATCH 089/134] fix(deps): update typescript-projects (#22809) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Dietzler --- docs/package.json | 8 +- e2e/package.json | 2 +- mise.toml | 2 +- package.json | 2 +- pnpm-lock.yaml | 5139 +++++++++-------- pnpm-workspace.yaml | 2 +- server/package.json | 10 +- web/package.json | 6 +- web/src/lib/components/ServerAboutItem.svelte | 2 +- .../asset-viewer/asset-viewer.svelte | 4 +- .../asset-viewer/slideshow-bar.svelte | 8 +- .../lib/components/timeline/Scrubber.svelte | 2 - web/src/test-data/setup.ts | 9 + 13 files changed, 2725 insertions(+), 2471 deletions(-) diff --git a/docs/package.json b/docs/package.json index d984427622..f45a4ec256 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,9 +17,9 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "~3.8.0", - "@docusaurus/preset-classic": "~3.8.0", - "@docusaurus/theme-common": "~3.8.0", + "@docusaurus/core": "~3.9.0", + "@docusaurus/preset-classic": "~3.9.0", + "@docusaurus/theme-common": "~3.9.0", "@mdi/js": "^7.3.67", "@mdi/react": "^1.6.1", "@mdx-js/react": "^3.0.0", @@ -35,7 +35,7 @@ "url": "^0.11.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "~3.8.0", + "@docusaurus/module-type-aliases": "~3.9.0", "@docusaurus/tsconfig": "^3.7.0", "@docusaurus/types": "^3.7.0", "prettier": "^3.2.4", diff --git a/e2e/package.json b/e2e/package.json index 9d2a33ba25..e783eded9e 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -43,7 +43,7 @@ "pngjs": "^7.0.0", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^4.0.0", - "sharp": "^0.34.3", + "sharp": "^0.34.4", "socket.io-client": "^4.7.4", "supertest": "^7.0.0", "typescript": "^5.3.3", diff --git a/mise.toml b/mise.toml index a1a735ea18..ac6bcdb816 100644 --- a/mise.toml +++ b/mise.toml @@ -1,7 +1,7 @@ [tools] node = "22.20.0" flutter = "3.35.5" -pnpm = "10.15.1" +pnpm = "10.18.0" [tools."github:CQLabs/homebrew-dcm"] version = "1.30.0" diff --git a/package.json b/package.json index 18610fe4bc..ac281d42a2 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Monorepo for Immich", "private": true, - "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67", + "packageManager": "pnpm@10.18.0+sha512.e804f889f1cecc40d572db084eec3e4881739f8dec69c0ff10d2d1beff9a4e309383ba27b5b750059d7f4c149535b6cd0d2cb1ed3aeb739239a4284a68f40cfa", "engines": { "pnpm": ">=10.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a40c88c2e..3ef694e5fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: overrides: canvas: 2.11.2 - sharp: ^0.34.3 + sharp: ^0.34.4 packageExtensionsChecksum: sha256-DAYr0FTkvKYnvBH4muAER9UE1FVGKhqfRU4/QwA2xPQ= @@ -43,7 +43,7 @@ importers: devDependencies: '@eslint/js': specifier: ^9.8.0 - version: 9.36.0 + version: 9.37.0 '@immich/sdk': specifier: file:../open-api/typescript-sdk version: link:../open-api/typescript-sdk @@ -64,10 +64,10 @@ importers: version: 4.13.4 '@types/node': specifier: ^22.18.8 - version: 22.18.8 + version: 22.18.9 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) byte-size: specifier: ^9.0.0 version: 9.0.1 @@ -79,16 +79,16 @@ importers: version: 12.1.0 eslint: specifier: ^9.14.0 - version: 9.36.0(jiti@2.5.1) + version: 9.37.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + version: 10.1.8(eslint@9.37.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2) + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-unicorn: specifier: ^60.0.0 - version: 60.0.0(eslint@9.36.0(jiti@2.5.1)) + version: 60.0.0(eslint@9.37.0(jiti@2.6.1)) globals: specifier: ^16.0.0 version: 16.4.0 @@ -100,25 +100,25 @@ importers: version: 3.6.2 prettier-plugin-organize-imports: specifier: ^4.0.0 - version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + version: 4.3.0(prettier@3.6.2)(typescript@5.9.3) typescript: specifier: ^5.3.3 - version: 5.9.2 + version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.0.0 - version: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest-fetch-mock: specifier: ^0.4.0 - version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) yaml: specifier: ^2.3.1 version: 2.8.1 @@ -126,14 +126,14 @@ importers: docs: dependencies: '@docusaurus/core': - specifier: ~3.8.0 - version: 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) + specifier: ~3.9.0 + version: 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/preset-classic': - specifier: ~3.8.0 - version: 3.8.1(@algolia/client-search@5.29.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.2) + specifier: ~3.9.0 + version: 3.9.1(@algolia/client-search@5.40.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) '@docusaurus/theme-common': - specifier: ~3.8.0 - version: 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ~3.9.0 + version: 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdi/js': specifier: ^7.3.67 version: 7.4.47 @@ -142,13 +142,13 @@ importers: version: 1.6.1 '@mdx-js/react': specifier: ^3.0.0 - version: 3.1.1(@types/react@19.1.13)(react@18.3.1) + version: 3.1.1(@types/react@19.2.2)(react@18.3.1) autoprefixer: specifier: ^10.4.17 version: 10.4.21(postcss@8.5.6) docusaurus-lunr-search: specifier: ^3.3.2 - version: 3.6.0(@docusaurus/core@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.6.0(@docusaurus/core@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lunr: specifier: ^2.3.9 version: 2.3.9 @@ -160,7 +160,7 @@ importers: version: 2.4.1(react@18.3.1) raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.100.2) + version: 4.0.2(webpack@5.102.1) react: specifier: ^18.0.0 version: 18.3.1 @@ -169,32 +169,32 @@ importers: version: 18.3.1(react@18.3.1) tailwindcss: specifier: ^3.2.4 - version: 3.4.17 + version: 3.4.18(yaml@2.8.1) url: specifier: ^0.11.0 version: 0.11.4 devDependencies: '@docusaurus/module-type-aliases': - specifier: ~3.8.0 - version: 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ~3.9.0 + version: 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: ^3.7.0 - version: 3.8.1 + version: 3.9.1 '@docusaurus/types': specifier: ^3.7.0 - version: 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) prettier: specifier: ^3.2.4 version: 3.6.2 typescript: specifier: ^5.1.6 - version: 5.9.2 + version: 5.9.3 e2e: devDependencies: '@eslint/js': specifier: ^9.8.0 - version: 9.36.0 + version: 9.37.0 '@immich/cli': specifier: file:../cli version: link:../cli @@ -203,7 +203,7 @@ importers: version: link:../open-api/typescript-sdk '@playwright/test': specifier: ^1.44.1 - version: 1.55.0 + version: 1.55.1 '@socket.io/component-emitter': specifier: ^3.1.2 version: 3.1.2 @@ -212,7 +212,7 @@ importers: version: 3.7.1 '@types/node': specifier: ^22.18.8 - version: 22.18.8 + version: 22.18.9 '@types/oidc-provider': specifier: ^9.0.0 version: 9.5.0 @@ -227,16 +227,16 @@ importers: version: 6.0.3 eslint: specifier: ^9.14.0 - version: 9.36.0(jiti@2.5.1) + version: 9.37.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + version: 10.1.8(eslint@9.37.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2) + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-unicorn: specifier: ^60.0.0 - version: 60.0.0(eslint@9.36.0(jiti@2.5.1)) + version: 60.0.0(eslint@9.37.0(jiti@2.6.1)) exiftool-vendored: specifier: ^28.3.1 version: 28.8.0 @@ -263,10 +263,10 @@ importers: version: 3.6.2 prettier-plugin-organize-imports: specifier: ^4.0.0 - version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + version: 4.3.0(prettier@3.6.2)(typescript@5.9.3) sharp: - specifier: ^0.34.3 - version: 0.34.3 + specifier: ^0.34.4 + version: 0.34.4 socket.io-client: specifier: ^4.7.4 version: 4.8.1 @@ -275,16 +275,16 @@ importers: version: 7.1.4 typescript: specifier: ^5.3.3 - version: 5.9.2 + version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) utimes: specifier: ^5.2.1 version: 5.2.1(encoding@0.1.13) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) open-api/typescript-sdk: dependencies: @@ -294,16 +294,16 @@ importers: devDependencies: '@types/node': specifier: ^22.18.8 - version: 22.18.8 + version: 22.18.9 typescript: specifier: ^5.3.3 - version: 5.9.2 + version: 5.9.3 server: dependencies: '@nestjs/bullmq': specifier: ^11.0.1 - version: 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.58.5) + version: 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.60.0) '@nestjs/common': specifier: ^11.0.4 version: 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -318,7 +318,7 @@ importers: version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.6)(rxjs@7.8.2) '@nestjs/schedule': specifier: ^6.0.0 - version: 6.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) + version: 6.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) '@nestjs/swagger': specifier: ^11.0.2 version: 11.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) @@ -339,13 +339,13 @@ importers: version: 0.205.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-ioredis': specifier: ^0.53.0 - version: 0.53.0(@opentelemetry/api@1.9.0) + version: 0.53.3(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-nestjs-core': - specifier: ^0.51.0 - version: 0.51.0(@opentelemetry/api@1.9.0) + specifier: ^0.52.0 + version: 0.52.2(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-pg': specifier: ^0.58.0 - version: 0.58.0(@opentelemetry/api@1.9.0) + version: 0.58.3(@opentelemetry/api@1.9.0) '@opentelemetry/resources': specifier: ^2.0.1 version: 2.1.0(@opentelemetry/api@1.9.0) @@ -360,10 +360,10 @@ importers: version: 1.37.0 '@react-email/components': specifier: ^0.5.0 - version: 0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 0.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-email/render': specifier: ^1.1.2 - version: 1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@socket.io/redis-adapter': specifier: ^8.3.0 version: 8.3.0(socket.io-adapter@2.5.5) @@ -381,7 +381,7 @@ importers: version: 2.2.0 bullmq: specifier: ^5.51.0 - version: 5.58.5 + version: 5.60.0 chokidar: specifier: ^4.0.3 version: 4.0.3 @@ -401,8 +401,8 @@ importers: specifier: ^1.4.7 version: 1.4.7 cron: - specifier: 4.3.0 - version: 4.3.0 + specifier: 4.3.3 + version: 4.3.3 exiftool-vendored: specifier: ^28.8.0 version: 28.8.0 @@ -426,7 +426,7 @@ importers: version: 7.14.0 ioredis: specifier: ^5.3.2 - version: 5.7.0 + version: 5.8.0 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -450,12 +450,12 @@ importers: version: 2.0.2 nest-commander: specifier: ^3.16.0 - version: 3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.8)(typescript@5.9.2) + version: 3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.9)(typescript@5.9.3) nestjs-cls: specifier: ^5.0.0 version: 5.4.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) nestjs-kysely: - specifier: ^3.0.0 + specifier: 3.0.0 version: 3.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(kysely@0.28.2)(reflect-metadata@0.2.2) nestjs-otel: specifier: ^7.0.0 @@ -465,7 +465,7 @@ importers: version: 7.0.7 openid-client: specifier: ^6.3.3 - version: 6.8.0 + version: 6.8.1 pg: specifier: ^8.11.3 version: 8.16.3 @@ -480,13 +480,13 @@ importers: version: 3.4.7 react: specifier: ^19.0.0 - version: 19.1.1 + version: 19.2.0 react-dom: specifier: ^19.0.0 - version: 19.1.1(react@19.1.1) + version: 19.2.0(react@19.2.0) react-email: specifier: ^4.0.0 - version: 4.2.11 + version: 4.2.12 reflect-metadata: specifier: ^0.2.0 version: 0.2.2 @@ -501,10 +501,10 @@ importers: version: 2.17.0 semver: specifier: ^7.6.2 - version: 7.7.2 + version: 7.7.3 sharp: - specifier: ^0.34.3 - version: 0.34.3 + specifier: ^0.34.4 + version: 0.34.4 sirv: specifier: ^3.0.0 version: 3.0.2 @@ -513,7 +513,7 @@ importers: version: 4.8.1 tailwindcss-preset-email: specifier: ^1.4.0 - version: 1.4.0(tailwindcss@3.4.17) + version: 1.4.0(tailwindcss@3.4.18(yaml@2.8.1)) thumbhash: specifier: ^0.1.1 version: 0.1.1 @@ -529,13 +529,13 @@ importers: devDependencies: '@eslint/js': specifier: ^9.8.0 - version: 9.36.0 + version: 9.37.0 '@nestjs/cli': specifier: ^11.0.2 - version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.8) + version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.9) '@nestjs/schematics': specifier: ^11.0.0 - version: 11.0.7(chokidar@4.0.3)(typescript@5.9.2) + version: 11.0.8(chokidar@4.0.3)(typescript@5.9.3) '@nestjs/testing': specifier: ^11.0.4 version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/platform-express@11.1.6) @@ -583,10 +583,10 @@ importers: version: 2.0.0 '@types/node': specifier: ^22.18.8 - version: 22.18.8 + version: 22.18.9 '@types/nodemailer': specifier: ^7.0.0 - version: 7.0.1 + version: 7.0.2 '@types/picomatch': specifier: ^4.0.0 version: 4.0.2 @@ -595,7 +595,7 @@ importers: version: 6.0.5 '@types/react': specifier: ^19.0.0 - version: 19.1.13 + version: 19.2.2 '@types/sanitize-html': specifier: ^2.13.0 version: 2.16.0 @@ -613,19 +613,19 @@ importers: version: 13.15.3 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: ^9.14.0 - version: 9.36.0(jiti@2.5.1) + version: 9.37.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + version: 10.1.8(eslint@9.37.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2) + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-unicorn: specifier: ^60.0.0 - version: 60.0.0(eslint@9.36.0(jiti@2.5.1)) + version: 60.0.0(eslint@9.37.0(jiti@2.6.1)) globals: specifier: ^16.0.0 version: 16.4.0 @@ -643,46 +643,46 @@ importers: version: 3.6.2 prettier-plugin-organize-imports: specifier: ^4.0.0 - version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + version: 4.3.0(prettier@3.6.2)(typescript@5.9.3) sql-formatter: specifier: ^15.0.0 - version: 15.6.9 + version: 15.6.10 supertest: specifier: ^7.1.0 version: 7.1.4 tailwindcss: specifier: ^3.4.0 - version: 3.4.17 + version: 3.4.18(yaml@2.8.1) testcontainers: specifier: ^11.0.0 - version: 11.5.1 + version: 11.7.1 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) unplugin-swc: specifier: ^1.4.5 - version: 1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.50.1) + version: 1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.52.4) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) web: dependencies: '@formatjs/icu-messageformat-parser': specifier: ^2.9.8 - version: 2.11.2 + version: 2.11.3 '@immich/sdk': specifier: file:../open-api/typescript-sdk version: link:../open-api/typescript-sdk '@immich/ui': - specifier: ^0.29.0 - version: 0.29.0(@internationalized/date@3.8.2)(svelte@5.38.10) + specifier: ^0.34.0 + version: 0.34.2(@internationalized/date@3.8.2)(svelte@5.39.11) '@mapbox/mapbox-gl-rtl-text': specifier: 0.2.3 version: 0.2.3(mapbox-gl@1.13.3) @@ -709,10 +709,10 @@ importers: version: 7946.0.16 '@zoom-image/core': specifier: ^0.41.0 - version: 0.41.0 + version: 0.41.3 '@zoom-image/svelte': specifier: ^0.3.0 - version: 0.3.4(svelte@5.38.10) + version: 0.3.7(svelte@5.39.11) async-mutex: specifier: ^0.5.0 version: 0.5.0 @@ -736,7 +736,7 @@ importers: version: 18.0.1 intl-messageformat: specifier: ^10.7.11 - version: 10.7.16 + version: 10.7.17 justified-layout: specifier: ^4.1.0 version: 4.1.0 @@ -748,7 +748,7 @@ importers: version: 3.7.2 maplibre-gl: specifier: ^5.6.2 - version: 5.7.1 + version: 5.8.0 pmtiles: specifier: ^4.3.0 version: 4.3.0 @@ -757,7 +757,7 @@ importers: version: 1.5.4 simple-icons: specifier: ^15.15.0 - version: 15.15.0 + version: 15.16.0 socket.io-client: specifier: ~4.8.0 version: 4.8.1 @@ -766,13 +766,13 @@ importers: version: 5.2.2 svelte-i18n: specifier: ^4.0.1 - version: 4.0.1(svelte@5.38.10) + version: 4.0.1(svelte@5.39.11) svelte-maplibre: specifier: ^1.2.0 - version: 1.2.1(svelte@5.38.10) + version: 1.2.1(svelte@5.39.11) svelte-persisted-store: specifier: ^0.12.0 - version: 0.12.0(svelte@5.38.10) + version: 0.12.0(svelte@5.39.11) tabbable: specifier: ^6.2.0 version: 6.2.0 @@ -782,37 +782,37 @@ importers: devDependencies: '@eslint/js': specifier: ^9.36.0 - version: 9.36.0 + version: 9.37.0 '@faker-js/faker': specifier: ^10.0.0 version: 10.0.0 '@koddsson/eslint-plugin-tscompat': specifier: ^0.2.0 - version: 0.2.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 0.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@socket.io/component-emitter': specifier: ^3.1.0 version: 3.1.2 '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.9(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + version: 3.0.10(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) '@sveltejs/enhanced-img': specifier: ^0.8.0 - version: 0.8.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.50.1)(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.8.3(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@sveltejs/kit': specifier: ^2.27.1 - version: 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@sveltejs/vite-plugin-svelte': - specifier: 6.2.0 - version: 6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + specifier: 6.2.1 + version: 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@tailwindcss/vite': specifier: ^4.1.7 - version: 4.1.13(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.4.2 version: 6.8.0 '@testing-library/svelte': specifier: ^5.2.8 - version: 5.2.8(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@testing-library/user-event': specifier: ^14.5.2 version: 14.6.1(@testing-library/dom@10.4.0) @@ -836,25 +836,25 @@ importers: version: 1.5.5 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) dotenv: specifier: ^17.0.0 - version: 17.2.2 + version: 17.2.3 eslint: specifier: ^9.36.0 - version: 9.36.0(jiti@2.5.1) + version: 9.37.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + version: 10.1.8(eslint@9.37.0(jiti@2.6.1)) eslint-plugin-compat: specifier: ^6.0.2 - version: 6.0.2(eslint@9.36.0(jiti@2.5.1)) + version: 6.0.2(eslint@9.37.0(jiti@2.6.1)) eslint-plugin-svelte: specifier: ^3.12.4 - version: 3.12.4(eslint@9.36.0(jiti@2.5.1))(svelte@5.38.10) + version: 3.12.4(eslint@9.37.0(jiti@2.6.1))(svelte@5.39.11) eslint-plugin-unicorn: specifier: ^61.0.2 - version: 61.0.2(eslint@9.36.0(jiti@2.5.1)) + version: 61.0.2(eslint@9.37.0(jiti@2.6.1)) factory.ts: specifier: ^1.4.1 version: 1.4.2 @@ -866,46 +866,50 @@ importers: version: 3.6.2 prettier-plugin-organize-imports: specifier: ^4.0.0 - version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + version: 4.3.0(prettier@3.6.2)(typescript@5.9.3) prettier-plugin-sort-json: specifier: ^4.1.1 version: 4.1.1(prettier@3.6.2) prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.4.0(prettier@3.6.2)(svelte@5.38.10) + version: 3.4.0(prettier@3.6.2)(svelte@5.39.11) rollup-plugin-visualizer: specifier: ^6.0.0 - version: 6.0.3(rollup@4.50.1) + version: 6.0.4(rollup@4.52.4) svelte: - specifier: 5.38.10 - version: 5.38.10 + specifier: 5.39.11 + version: 5.39.11 svelte-check: specifier: ^4.1.5 - version: 4.3.1(picomatch@4.0.3)(svelte@5.38.10)(typescript@5.9.2) + version: 4.3.2(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3) svelte-eslint-parser: specifier: ^1.3.3 - version: 1.3.3(svelte@5.38.10) + version: 1.3.3(svelte@5.39.11) tailwindcss: specifier: ^4.1.7 - version: 4.1.13 + version: 4.1.14 typescript: specifier: ^5.8.3 - version: 5.9.2 + version: 5.9.3 typescript-eslint: specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.1.2 - version: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@algolia/abtesting@1.6.0': + resolution: {integrity: sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==} + engines: {node: '>= 14.0.0'} + '@algolia/autocomplete-core@1.17.9': resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} @@ -926,59 +930,59 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.29.0': - resolution: {integrity: sha512-AM/6LYMSTnZvAT5IarLEKjYWOdV+Fb+LVs8JRq88jn8HH6bpVUtjWdOZXqX1hJRXuCAY8SdQfb7F8uEiMNXdYQ==} + '@algolia/client-abtesting@5.40.0': + resolution: {integrity: sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.29.0': - resolution: {integrity: sha512-La34HJh90l0waw3wl5zETO8TuukeUyjcXhmjYZL3CAPLggmKv74mobiGRIb+mmBENybiFDXf/BeKFLhuDYWMMQ==} + '@algolia/client-analytics@5.40.0': + resolution: {integrity: sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.29.0': - resolution: {integrity: sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==} + '@algolia/client-common@5.40.0': + resolution: {integrity: sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.29.0': - resolution: {integrity: sha512-A39F1zmHY9aev0z4Rt3fTLcGN5AG1VsVUkVWy6yQG5BRDScktH+U5m3zXwThwniBTDV1HrPgiGHZeWb67GkR2Q==} + '@algolia/client-insights@5.40.0': + resolution: {integrity: sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.29.0': - resolution: {integrity: sha512-ibxmh2wKKrzu5du02gp8CLpRMeo+b/75e4ORct98CT7mIxuYFXowULwCd6cMMkz/R0LpKXIbTUl15UL5soaiUQ==} + '@algolia/client-personalization@5.40.0': + resolution: {integrity: sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.29.0': - resolution: {integrity: sha512-VZq4/AukOoJC2WSwF6J5sBtt+kImOoBwQc1nH3tgI+cxJBg7B77UsNC+jT6eP2dQCwGKBBRTmtPLUTDDnHpMgA==} + '@algolia/client-query-suggestions@5.40.0': + resolution: {integrity: sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.29.0': - resolution: {integrity: sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==} + '@algolia/client-search@5.40.0': + resolution: {integrity: sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==} engines: {node: '>= 14.0.0'} '@algolia/events@4.0.1': resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - '@algolia/ingestion@1.29.0': - resolution: {integrity: sha512-scBXn0wO5tZCxmO6evfa7A3bGryfyOI3aoXqSQBj5SRvNYXaUlFWQ/iKI70gRe/82ICwE0ICXbHT/wIvxOW7vw==} + '@algolia/ingestion@1.40.0': + resolution: {integrity: sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.29.0': - resolution: {integrity: sha512-FGWWG9jLFhsKB7YiDjM2dwQOYnWu//7Oxrb2vT96N7+s+hg1mdHHfHNRyEudWdxd4jkMhBjeqNA21VbTiOIPVg==} + '@algolia/monitoring@1.40.0': + resolution: {integrity: sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.29.0': - resolution: {integrity: sha512-xte5+mpdfEARAu61KXa4ewpjchoZuJlAlvQb8ptK6hgHlBHDnYooy1bmOFpokaAICrq/H9HpoqNUX71n+3249A==} + '@algolia/recommend@5.40.0': + resolution: {integrity: sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.29.0': - resolution: {integrity: sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==} + '@algolia/requester-browser-xhr@5.40.0': + resolution: {integrity: sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.29.0': - resolution: {integrity: sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==} + '@algolia/requester-fetch@5.40.0': + resolution: {integrity: sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.29.0': - resolution: {integrity: sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==} + '@algolia/requester-node-http@5.40.0': + resolution: {integrity: sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==} engines: {node: '>= 14.0.0'} '@alloc/quick-lru@5.2.0': @@ -998,6 +1002,15 @@ packages: chokidar: optional: true + '@angular-devkit/core@19.2.17': + resolution: {integrity: sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + '@angular-devkit/schematics-cli@19.2.15': resolution: {integrity: sha512-1ESFmFGMpGQmalDB3t2EtmWDGv6gOFYBMxmHO2f1KI/UDl8UmZnCGL4mD3EWo8Hv0YIsZ9wOH9Q7ZHNYjeSpzg==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -1007,6 +1020,10 @@ packages: resolution: {integrity: sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@19.2.17': + resolution: {integrity: sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -1023,103 +1040,103 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-sesv2@3.890.0': - resolution: {integrity: sha512-AM9Lt4QkNet8xKgCwJxfkyqlorwG9S+tvtpSfHYCVq0j2Z6PbkDaUBnvwjGOMBV7Um5IzZ7yhvQXrBg7omZciQ==} + '@aws-sdk/client-sesv2@3.907.0': + resolution: {integrity: sha512-r0NV1gxN3OO5l3gnxdQPS+STQHh+q9CRoEf9EG1273nOb1TwzrOIE34A0LO0Ow88XL5amgx/e9MdfuopJH9j+g==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.890.0': - resolution: {integrity: sha512-vefYNwh/K5V5YiJpFJfoMPNqsoiRTqD7ZnkvR0cjJdwhOIwFnSKN1vz0OMjySTQmVMcG4JKGVul82ou7ErtOhQ==} + '@aws-sdk/client-sso@3.907.0': + resolution: {integrity: sha512-ANuu0duNTcQHv0g5YrEuWImT8o9t6li3A+MtAaKxIbTA3eFQnl6xHDxyrbsrU19FtKPg3CWhvfY04j6DaDvR8g==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.890.0': - resolution: {integrity: sha512-CT+yjhytHdyKvV3Nh/fqBjnZ8+UiQZVz4NMm4LrPATgVSOdfygXHqrWxrPTVgiBtuJWkotg06DF7+pTd5ekLBw==} + '@aws-sdk/core@3.907.0': + resolution: {integrity: sha512-vuIHL8qUcA5oNi7IWSZauCMaXstWTcSsnK1iHcvg92ddGDo1LMd2kQNo0G9UANa8vOfc908+8xKO40gfL8+M7w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.890.0': - resolution: {integrity: sha512-BtsUa2y0Rs8phmB2ScZ5RuPqZVmxJJXjGfeiXctmLFTxTwoayIK1DdNzOWx6SRMPVc3s2RBGN4vO7T1TwN+ajA==} + '@aws-sdk/credential-provider-env@3.907.0': + resolution: {integrity: sha512-orqT6djon57y09Ci5q0kezisrEvr78Z+7WvZbq0ZC0Ncul4RgJfCmhcgmzNPaWA18NEI0wGytaxYh3YFE7kIBQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.890.0': - resolution: {integrity: sha512-0sru3LVwsuGYyzbD90EC/d5HnCZ9PL4O9BA2LYT6b9XceC005Oj86uzE47LXb+mDhTAt3T6ZO0+ZcVQe0DDi8w==} + '@aws-sdk/credential-provider-http@3.907.0': + resolution: {integrity: sha512-CKG/0hT4o8K2aQKOe+xwGP3keSNOyryhZNmKuHPuMRVlsJfO6wNxlu37HcUPzihJ+S2pOmTVGUbeVMCxJVUJmw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.890.0': - resolution: {integrity: sha512-Mxv7ByftHKH7dE6YXu9gQ6ODXwO1iSO32t8tBrZLS3g8K1knWADIqDFv3yErQtJ8hp27IDxbAbVH/1RQdSkmhA==} + '@aws-sdk/credential-provider-ini@3.907.0': + resolution: {integrity: sha512-Clz1YdXrgQ5WIlcRE7odHbgM/INBxy49EA3csDITafHaDPtPRL39zkQtB5+Lwrrt/Gg0xBlyTbvP5Snan+0lqA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.890.0': - resolution: {integrity: sha512-zbPz3mUtaBdch0KoH8/LouRDcYSzyT2ecyCOo5OAFVil7AxT1jvsn4vX78FlnSVpZ4mLuHY8pHTVGi235XiyBA==} + '@aws-sdk/credential-provider-node@3.907.0': + resolution: {integrity: sha512-w6Hhc4rV/CFaBliIh9Ph/T59xdGcTF6WmPGzzpykjl68+jcJyUem82hbTVIGaMCpvhx8VRqEr5AEXCXdbDbojw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.890.0': - resolution: {integrity: sha512-dWZ54TI1Q+UerF5YOqGiCzY+x2YfHsSQvkyM3T4QDNTJpb/zjiVv327VbSOULOlI7gHKWY/G3tMz0D9nWI7YbA==} + '@aws-sdk/credential-provider-process@3.907.0': + resolution: {integrity: sha512-MBWpZqZtKkpM/LOGD5quXvlHJJN8YIP4GKo2ad8y1fEEVydwI8cggyXuauMPV7GllW8d0u3kQUs+4rxm1VaS4w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.890.0': - resolution: {integrity: sha512-ajYCZ6f2+98w8zG/IXcQ+NhWYoI5qPUDovw+gMqMWX/jL1cmZ9PFAwj2Vyq9cbjum5RNWwPLArWytTCgJex4AQ==} + '@aws-sdk/credential-provider-sso@3.907.0': + resolution: {integrity: sha512-F8I7xwIt0mhdg8NrC70HDmhDRx3ValBvmWH3YkWsjZltWIFozhQCCDISRPhanMkXVhSFmZY0FJ5Lo+B/SZvAAA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.890.0': - resolution: {integrity: sha512-qZ2Mx7BeYR1s0F/H6wePI0MAmkFswmBgrpgMCOt2S4b2IpQPnUa2JbxY3GwW2WqX3nV0KjPW08ctSLMmlq/tKA==} + '@aws-sdk/credential-provider-web-identity@3.907.0': + resolution: {integrity: sha512-1CmRE/M8LJ/joXm5vUsKkQS35MoWA4xvUH9J1jyCuL3J9A8M+bnTe6ER8fnNLgmEs6ikdmYEIdfijPpBjBpFig==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.887.0': - resolution: {integrity: sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==} + '@aws-sdk/middleware-host-header@3.901.0': + resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.887.0': - resolution: {integrity: sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==} + '@aws-sdk/middleware-logger@3.901.0': + resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.887.0': - resolution: {integrity: sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==} + '@aws-sdk/middleware-recursion-detection@3.901.0': + resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.890.0': - resolution: {integrity: sha512-58P1lrE606zpp29xH9Keh3j2BWfa2ciGBtygJTpulRMlqPL3U1gFfU2g5nDYJbjKgRtCgNIBqfmtkL4eikCb9w==} + '@aws-sdk/middleware-sdk-s3@3.907.0': + resolution: {integrity: sha512-8VVxcZPmJOKI8P08v5ARvoXbLV41abpAIIkt388fp/lwtfzbnXt6sWhhAk/pHgvCR1NnuvkbGuXGVcux59648Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.890.0': - resolution: {integrity: sha512-x4+gLrOFGN7PnfxCaQbs3QEF8bMQE4CVxcOp066UEJqr2Pn4yB12Q3O+YntOtESK5NcTxIh7JlhGss95EHzNng==} + '@aws-sdk/middleware-user-agent@3.907.0': + resolution: {integrity: sha512-j/h3lk4X6AAXvusx/h8rr0zlo7G0l0quZM4k4rS/9jzatI53HCsrMaiGu6YXbxuVqtfMqv0MAj0MVhaMsAIs4A==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.890.0': - resolution: {integrity: sha512-D5qVNd+qlqdL8duJShzffAqPllGRA4tG7n/GEpL13eNfHChPvGkkUFBMrxSgCAETaTna13G6kq+dMO+SAdbm1A==} + '@aws-sdk/nested-clients@3.907.0': + resolution: {integrity: sha512-LycXsdC5sMIc+Az5z1Mo2eYShr2kLo2gUgx7Rja3udG0GdqgdR/NNJ6ArmDCeKk2O5RFS5EgEg89bT55ecl5Uw==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.890.0': - resolution: {integrity: sha512-VfdT+tkF9groRYNzKvQCsCGDbOQdeBdzyB1d6hWiq22u13UafMIoskJ1ec0i0H1X29oT6mjTitfnvPq1UiKwzQ==} + '@aws-sdk/region-config-resolver@3.901.0': + resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.890.0': - resolution: {integrity: sha512-il8kb2/wDLXhemN3p7v4MvbvqoMuo7Ug3ihuIUIhPtSVjcnn+BISJU0S+5YTl8TXf6qxML9VrfxL0pmuhO3BsA==} + '@aws-sdk/signature-v4-multi-region@3.907.0': + resolution: {integrity: sha512-f5XHRu6MTbjB/ud5RwBZzntYMgThRaDur5PJRZ1CaYAL8gZLNuEpJLzUA7o3queeSfE9JboO+cm1gZnOfnYJkg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.890.0': - resolution: {integrity: sha512-+pK/0iQEpPmnztbAw0NNmb+B5pPy8VLu+Ab4SJLgVp41RE9NO13VQtrzUbh61TTAVMrzqWlLQ2qmAl2Fk4VNgw==} + '@aws-sdk/token-providers@3.907.0': + resolution: {integrity: sha512-HjPbNft1Ad8X1lHQG21QXy9pitdXA+OKH6NtcXg57A31002tM+SkyUmU6ty1jbsRBEScxziIVe5doI1NmkHheA==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.887.0': - resolution: {integrity: sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==} + '@aws-sdk/types@3.901.0': + resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-arn-parser@3.873.0': - resolution: {integrity: sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==} + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.890.0': - resolution: {integrity: sha512-nJ8v1x9ZQKzMRK4dS4oefOMIHqb6cguctTcx1RB9iTaFOR5pP7bvq+D4mvNZ6vBxiHg1dQGBUUgl5XJmdR7atQ==} + '@aws-sdk/util-endpoints@3.901.0': + resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.873.0': - resolution: {integrity: sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==} + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.887.0': - resolution: {integrity: sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==} + '@aws-sdk/util-user-agent-browser@3.907.0': + resolution: {integrity: sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==} - '@aws-sdk/util-user-agent-node@3.890.0': - resolution: {integrity: sha512-s85NkCxKoAlUvx7UP7OelxLqwTi27Tps9/Q+4N+9rEUjThxEnDsqJSStJ1XiYhddz1xc/vxMvPjYN0qX6EKPtA==} + '@aws-sdk/util-user-agent-node@3.907.0': + resolution: {integrity: sha512-r2Bc8VCU6ymkuem+QWT6oDdGvaYnK0YHg77SGUF47k+JsztSt1kZR0Y0q8jRH97bOsXldThyEcYsNbqDERa1Uw==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1127,8 +1144,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.887.0': - resolution: {integrity: sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==} + '@aws-sdk/xml-builder@3.901.0': + resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} engines: {node: '>=18.0.0'} '@aws/lambda-invoke-store@0.0.1': @@ -1995,120 +2012,120 @@ packages: search-insights: optional: true - '@docusaurus/babel@3.8.1': - resolution: {integrity: sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==} - engines: {node: '>=18.0'} + '@docusaurus/babel@3.9.1': + resolution: {integrity: sha512-/uoi3oG+wvbVWNBRfPrzrEslOSeLxrQEyWMywK51TLDFTANqIRivzkMusudh5bdDty8fXzCYUT+tg5t697jYqg==} + engines: {node: '>=20.0'} - '@docusaurus/bundler@3.8.1': - resolution: {integrity: sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==} - engines: {node: '>=18.0'} + '@docusaurus/bundler@3.9.1': + resolution: {integrity: sha512-E1c9DgNmAz4NqbNtiJVp4UgjLtr8O01IgtXD/NDQ4PZaK8895cMiTOgb3k7mN0qX8A3lb8vqyrPJ842+yMpuUg==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/faster': '*' peerDependenciesMeta: '@docusaurus/faster': optional: true - '@docusaurus/core@3.8.1': - resolution: {integrity: sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==} - engines: {node: '>=18.0'} + '@docusaurus/core@3.9.1': + resolution: {integrity: sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==} + engines: {node: '>=20.0'} hasBin: true peerDependencies: '@mdx-js/react': ^3.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/cssnano-preset@3.8.1': - resolution: {integrity: sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==} - engines: {node: '>=18.0'} + '@docusaurus/cssnano-preset@3.9.1': + resolution: {integrity: sha512-2y7+s7RWQMqBg+9ejeKwvZs7Bdw/hHIVJIodwMXbs2kr+S48AhcmAfdOh6Cwm0unJb0hJUshN0ROwRoQMwl3xg==} + engines: {node: '>=20.0'} - '@docusaurus/logger@3.8.1': - resolution: {integrity: sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==} - engines: {node: '>=18.0'} + '@docusaurus/logger@3.9.1': + resolution: {integrity: sha512-C9iFzXwHzwvGlisE4bZx+XQE0JIqlGAYAd5LzpR7fEDgjctu7yL8bE5U4nTNywXKHURDzMt4RJK8V6+stFHVkA==} + engines: {node: '>=20.0'} - '@docusaurus/mdx-loader@3.8.1': - resolution: {integrity: sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==} - engines: {node: '>=18.0'} + '@docusaurus/mdx-loader@3.9.1': + resolution: {integrity: sha512-/1PY8lqry8jCt0qZddJSpc0U2sH6XC27kVJZfpA7o2TiQ3mdBQyH5AVbj/B2m682B1ounE+XjI0LdpOkAQLPoA==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/module-type-aliases@3.8.1': - resolution: {integrity: sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==} + '@docusaurus/module-type-aliases@3.9.1': + resolution: {integrity: sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==} peerDependencies: react: '*' react-dom: '*' - '@docusaurus/plugin-content-blog@3.8.1': - resolution: {integrity: sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-blog@3.9.1': + resolution: {integrity: sha512-vT6kIimpJLWvW9iuWzH4u7VpTdsGlmn4yfyhq0/Kb1h4kf9uVouGsTmrD7WgtYBUG1P+TSmQzUUQa+ALBSRTig==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-docs@3.8.1': - resolution: {integrity: sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-docs@3.9.1': + resolution: {integrity: sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-pages@3.8.1': - resolution: {integrity: sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-pages@3.9.1': + resolution: {integrity: sha512-/1wFzRnXYASI+Nv9ck9IVPIMw0O5BGQ8ZVhDzEwhkL+tl44ycvSnY6PIe6rW2HLxsw61Z3WFwAiU8+xMMtMZpg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-css-cascade-layers@3.8.1': - resolution: {integrity: sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-css-cascade-layers@3.9.1': + resolution: {integrity: sha512-/QyW2gRCk/XE3ttCK/ERIgle8KJ024dBNKMu6U5SmpJvuT2il1n5jR/48Pp/9wEwut8WVml4imNm6X8JsL5A0Q==} + engines: {node: '>=20.0'} - '@docusaurus/plugin-debug@3.8.1': - resolution: {integrity: sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-debug@3.9.1': + resolution: {integrity: sha512-qPeAuk0LccC251d7jg2MRhNI+o7niyqa924oEM/AxnZJvIpMa596aAxkRImiAqNN6+gtLE1Hkrz/RHUH2HDGsA==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-analytics@3.8.1': - resolution: {integrity: sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-analytics@3.9.1': + resolution: {integrity: sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-gtag@3.8.1': - resolution: {integrity: sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-gtag@3.9.1': + resolution: {integrity: sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-tag-manager@3.8.1': - resolution: {integrity: sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-tag-manager@3.9.1': + resolution: {integrity: sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-sitemap@3.8.1': - resolution: {integrity: sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-sitemap@3.9.1': + resolution: {integrity: sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-svgr@3.8.1': - resolution: {integrity: sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-svgr@3.9.1': + resolution: {integrity: sha512-TeZOXT2PSdTNR1OpDJMkYqFyX7MMhbd4t16hQByXksgZQCXNyw3Dio+KaDJ2Nj+LA4WkOvsk45bWgYG5MAaXSQ==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/preset-classic@3.8.1': - resolution: {integrity: sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==} - engines: {node: '>=18.0'} + '@docusaurus/preset-classic@3.9.1': + resolution: {integrity: sha512-ZHga2xsxxsyd0dN1BpLj8S889Eu9eMBuj2suqxdw/vaaXu/FjJ8KEGbcaeo6nHPo8VQcBBnPEdkBtSDm2TfMNw==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -2118,52 +2135,52 @@ packages: peerDependencies: react: '*' - '@docusaurus/theme-classic@3.8.1': - resolution: {integrity: sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==} - engines: {node: '>=18.0'} + '@docusaurus/theme-classic@3.9.1': + resolution: {integrity: sha512-LrAIu/mQ04nG6s1cssC0TMmICD8twFIIn/hJ5Pd9uIPQvtKnyAKEn12RefopAul5KfMo9kixPaqogV5jIJr26w==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-common@3.8.1': - resolution: {integrity: sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==} - engines: {node: '>=18.0'} + '@docusaurus/theme-common@3.9.1': + resolution: {integrity: sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-search-algolia@3.8.1': - resolution: {integrity: sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==} - engines: {node: '>=18.0'} + '@docusaurus/theme-search-algolia@3.9.1': + resolution: {integrity: sha512-WjM28bzlgfT6nHlEJemkwyGVpvGsZWPireV/w+wZ1Uo64xCZ8lNOb4xwQRukDaLSed3oPBN0gSnu06l5VuCXHg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-translations@3.8.1': - resolution: {integrity: sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==} - engines: {node: '>=18.0'} + '@docusaurus/theme-translations@3.9.1': + resolution: {integrity: sha512-mUQd49BSGKTiM6vP9+JFgRJL28lMIN3PUvXjF3rzuOHMByUZUBNwCt26Z23GkKiSIOrRkjKoaBNTipR/MHdYSQ==} + engines: {node: '>=20.0'} - '@docusaurus/tsconfig@3.8.1': - resolution: {integrity: sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==} + '@docusaurus/tsconfig@3.9.1': + resolution: {integrity: sha512-stdzM1dNDgRO0OvxeznXlE3N1igUoeHPNJjiKqyffLizgpVgNXJBAWeG6fuoYiCH4udGUBqy2dyM+1+kG2/UPQ==} - '@docusaurus/types@3.8.1': - resolution: {integrity: sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==} + '@docusaurus/types@3.9.1': + resolution: {integrity: sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/utils-common@3.8.1': - resolution: {integrity: sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==} - engines: {node: '>=18.0'} + '@docusaurus/utils-common@3.9.1': + resolution: {integrity: sha512-4M1u5Q8Zn2CYL2TJ864M51FV4YlxyGyfC3x+7CLuR6xsyTVNBNU4QMcPgsTHRS9J2+X6Lq7MyH6hiWXyi/sXUQ==} + engines: {node: '>=20.0'} - '@docusaurus/utils-validation@3.8.1': - resolution: {integrity: sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==} - engines: {node: '>=18.0'} + '@docusaurus/utils-validation@3.9.1': + resolution: {integrity: sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ==} + engines: {node: '>=20.0'} - '@docusaurus/utils@3.8.1': - resolution: {integrity: sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==} - engines: {node: '>=18.0'} + '@docusaurus/utils@3.9.1': + resolution: {integrity: sha512-YAL4yhhWLl9DXuf5MVig260a6INz4MehrBGFU/CZu8yXmRiYEuQvRFWh9ZsjfAOyaG7za1MNmBVZ4VVAi/CiJA==} + engines: {node: '>=20.0'} '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} @@ -2174,8 +2191,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2186,8 +2203,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2198,8 +2215,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2210,8 +2227,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2222,8 +2239,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2234,8 +2251,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2246,8 +2263,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2258,8 +2275,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2270,8 +2287,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2282,8 +2299,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2294,8 +2311,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2306,8 +2323,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2318,8 +2335,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2330,8 +2347,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2342,8 +2359,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2354,8 +2371,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2366,14 +2383,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2384,14 +2401,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2402,14 +2419,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2420,8 +2437,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2432,8 +2449,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2444,8 +2461,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2456,8 +2473,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2476,20 +2493,24 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.15.2': resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.36.0': - resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -2500,6 +2521,10 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@faker-js/faker@10.0.0': resolution: {integrity: sha512-UollFEUkVXutsaP+Vndjxar40Gs5JL2HeLcl8xO1QAjJgOdhc3OmBFWyEylS+RddWaaBiAzH+5/17PLQJwDiLw==} engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} @@ -2518,29 +2543,29 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@formatjs/ecma402-abstract@2.3.4': - resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} + '@formatjs/ecma402-abstract@2.3.5': + resolution: {integrity: sha512-1HTESOq1IUa23g1lFZEGIXsfZKZOwWmB9RROwGn+xariiQnd++wwTMvlRAbZ8wtXRHFUamJPxsKcxpSzeCvFWQ==} '@formatjs/fast-memoize@2.2.7': resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - '@formatjs/icu-messageformat-parser@2.11.2': - resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==} + '@formatjs/icu-messageformat-parser@2.11.3': + resolution: {integrity: sha512-H/KfWSosaiDiOaW4nHe1Fn4Cgzm+oFQ8giTmB5RJzTBNSMmd+j2NVrvvZHAmlxJHcuOelzKBLjQ2EDcyH4NSWw==} - '@formatjs/icu-skeleton-parser@1.8.14': - resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==} + '@formatjs/icu-skeleton-parser@1.8.15': + resolution: {integrity: sha512-qNrKxWJmnWxin5U4A4Evy7C0rgRiNw3IqXu9OGuT31B8lDxBGl+OgT8kcq0ZVKK0gqA4l4SQB9x+SFAvLT5hcQ==} - '@formatjs/intl-localematcher@0.6.1': - resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} + '@formatjs/intl-localematcher@0.6.2': + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@golevelup/nestjs-discovery@4.0.3': - resolution: {integrity: sha512-8w3CsXHN7+7Sn2i419Eal1Iw/kOjAd6Kb55M/ZqKBBwACCMn4WiEuzssC71LpBMI1090CiDxuelfPRwwIrQK+A==} + '@golevelup/nestjs-discovery@5.0.0': + resolution: {integrity: sha512-NaIWLCLI+XvneUK05LH2idHLmLNITYT88YnpOuUQmllKtiJNIS3woSt7QXrMZ5k3qUWuZpehEVz1JtlX4I1KyA==} peerDependencies: - '@nestjs/common': ^10.x || ^11.0.0 - '@nestjs/core': ^10.x || ^11.0.0 + '@nestjs/common': ^11.0.20 + '@nestjs/core': ^11.0.20 - '@grpc/grpc-js@1.13.4': - resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + '@grpc/grpc-js@1.14.0': + resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} engines: {node: '>=12.10.0'} '@grpc/proto-loader@0.7.15': @@ -2548,6 +2573,11 @@ packages: engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2570,130 +2600,134 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@immich/ui@0.29.0': - resolution: {integrity: sha512-An9cf1L4nMO6+C1Tkktd+qjGmZvyGz/Un33cGsKQa2I7IdZHd67KbbC2v3wN3bQMiTjxtFJ8YR9EONohJ8jDtQ==} + '@immich/ui@0.34.2': + resolution: {integrity: sha512-tWjEV1prSZ9VLes69Ha9jnnZj6tbv/9+PdQjsK+5zK7sQok/l7kyzAobj5z4XRD11XtGk/cAqi/ZOlqRWvZilA==} peerDependencies: svelte: ^5.0.0 @@ -2839,8 +2873,8 @@ packages: '@internationalized/date@3.8.2': resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} - '@ioredis/commands@1.3.0': - resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + '@ioredis/commands@1.4.0': + resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} @@ -2886,12 +2920,48 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.0': + resolution: {integrity: sha512-6RX+W5a+ZUY/c/7J5s5jK9UinLfJo5oWKh84fb4X0yK2q4WXEWUWZWuEMjvCb1YNUQhEAhUfr5scEGOH7jC4YQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.20.0': + resolution: {integrity: sha512-adcXFVorSQULtT4XDL0giRLr2EVGIcyWm6eQKZWTrRA4EEydGOY8QVQtL0PaITQpUyu+lOd/QOicw6vdy1v8QQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@koa/cors@5.0.0': resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} @@ -2963,8 +3033,8 @@ packages: resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} engines: {node: '>=6.0.0'} - '@maplibre/maplibre-gl-style-spec@23.3.0': - resolution: {integrity: sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==} + '@maplibre/maplibre-gl-style-spec@24.2.0': + resolution: {integrity: sha512-cE80g83fRcBbZbQC70siOUxUK6YJ/5ZkClDZbmm+hzrUbv+J6yntkMmcpdz9DbOrWOM7FHKR5rruc6Q/hWx5cA==} hasBin: true '@maplibre/vt-pbf@4.0.3': @@ -2982,8 +3052,8 @@ packages: '@mdn/browser-compat-data@6.0.27': resolution: {integrity: sha512-s5kTuDih5Ysb7DS2T2MhvneFLvDS0NwnLY5Jv6dL+zBXbcNVcyFcGdjwn3rttiHvcbb/qF02HP9ywufdwHZbIw==} - '@mdx-js/mdx@3.1.0': - resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} '@mdx-js/react@3.1.1': resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} @@ -3110,14 +3180,14 @@ packages: '@nestjs/websockets': ^11.0.0 rxjs: ^7.1.0 - '@nestjs/schedule@6.0.0': - resolution: {integrity: sha512-aQySMw6tw2nhitELXd3EiRacQRgzUKD9mFcUZVOJ7jPLqIBvXOyvRWLsK9SdurGA+jjziAlMef7iB5ZEFFoQpw==} + '@nestjs/schedule@6.0.1': + resolution: {integrity: sha512-v3yO6cSPAoBSSyH67HWnXHzuhPhSNZhRmLY38JvCt2sqY8sPMOODpcU1D79iUMFf7k16DaMEbL4Mgx61ZhiC8Q==} peerDependencies: '@nestjs/common': ^10.0.0 || ^11.0.0 '@nestjs/core': ^10.0.0 || ^11.0.0 - '@nestjs/schematics@11.0.7': - resolution: {integrity: sha512-t8dNYYMwEeEsrlwc2jbkfwCfXczq4AeNEgx1KVQuJ6wYibXk0ZbXbPdfp8scnEAaQv1grpncNV5gWgzi7ZwbvQ==} + '@nestjs/schematics@11.0.8': + resolution: {integrity: sha512-HKunkzfBYLpNyL/qP5wu0OBKVPrISJLnrB4r6S53fT99pEvopDcJAeIuznSAD1Dx1njUqpbTR/uGyD0xL1y0nw==} peerDependencies: typescript: '>=4.8.2' @@ -3293,20 +3363,20 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.53.0': - resolution: {integrity: sha512-Ah2wU347vOJYbE563Tgm3UX2J3DAXoI8gsr8qH0OOO4uDuEv3kVS/eDCfXApt11bvvDDPlOoc60/TGn6m9IoPw==} + '@opentelemetry/instrumentation-ioredis@0.53.3': + resolution: {integrity: sha512-afCzr4OSHWDfvVRx5ni92zEgNPoq2akoe+/nubWkGPKHFLsJwYO/ihAaky1i6m9d3tBO571g9rlnUvDlvoKSoQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.51.0': - resolution: {integrity: sha512-Se/m4887W94OO12pjKMjI3398L7HCoWeCjcbwoPvNOWpSpMkljBOHA9vE/fyo63CaVG1XAM5xA4ad60wmJKl9A==} + '@opentelemetry/instrumentation-nestjs-core@0.52.2': + resolution: {integrity: sha512-kL91hPGEjUI08VcDJeNwYKP2EpynAnymF0wr4Irqp5uHeyvE/hTX4R3DmpDP80IZ/aQ5WVxuWiaBlVP7cERu/w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pg@0.58.0': - resolution: {integrity: sha512-WHntZAorf6CZ0n5a3oHlwGkSeu5Xa4AiCmXkNTKg24TbYSFWzJUtWvPQSkxePvQ3ku71lhAY/M20WgwHlvpZpQ==} + '@opentelemetry/instrumentation-pg@0.58.3': + resolution: {integrity: sha512-eGyrTHDx3WA9JiCbBQO1OUc8B9InqCJvC87uY1hSuOXU6HtawCEml1epuAVQY3cizK7Tc3IH0EYSR/q4w/kHyw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3347,8 +3417,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/redis-common@0.38.0': - resolution: {integrity: sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==} + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} engines: {node: ^18.19.0 || >=20.6.0} '@opentelemetry/resources@2.1.0': @@ -3391,8 +3461,8 @@ packages: resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} - '@opentelemetry/sql-common@0.41.0': - resolution: {integrity: sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==} + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -3436,8 +3506,8 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.55.0': - resolution: {integrity: sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==} + '@playwright/test@1.55.1': + resolution: {integrity: sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==} engines: {node: '>=18'} hasBin: true @@ -3515,8 +3585,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.5.3': - resolution: {integrity: sha512-8G5vsoMehuGOT4cDqaYLdpagtqCYPl4vThXNylClxO6SrN2w9Mh1+i2RNGj/rdqh/woamHORjlXMYCA/kzDMew==} + '@react-email/components@0.5.5': + resolution: {integrity: sha512-+utnip1DiXTq5TQKvL8qztWy0EC3L+qdRIeJkBZXJA4WGIukbaqimWCTBGIMW19Pj+1iKvDYk2JQHEQDLiq7uQ==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3580,8 +3650,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@1.2.3': - resolution: {integrity: sha512-qu3XYNkHGao3teJexVD5CrcgFkNLrzbZvpZN17a7EyQYUN3kHkTkE9saqY4VbvGx6QoNU3p8rsk/Xm++D/+pTw==} + '@react-email/render@1.3.1': + resolution: {integrity: sha512-BOc/kanieEVyiuldFFvceriiBGBBVhe4JWWXCXE2ehLIqz+gSWD4rgCoXAGbJRnnVyyp4joPqK62bSfa88yonA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3620,108 +3690,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.50.1': - resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.1': - resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.1': - resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': - resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.1': - resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': - resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': - resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': - resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.1': - resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.1': - resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': - resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.1': - resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.1': - resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.1': - resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.1': - resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.1': - resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.1': - resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': - resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': - resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} cpu: [x64] os: [win32] @@ -3760,172 +3835,176 @@ packages: '@slorber/remark-comment@1.0.0': resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} - '@smithy/abort-controller@4.1.1': - resolution: {integrity: sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==} + '@smithy/abort-controller@4.2.0': + resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.2.2': - resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} + '@smithy/config-resolver@4.3.0': + resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.11.0': - resolution: {integrity: sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==} + '@smithy/core@3.15.0': + resolution: {integrity: sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.1.2': - resolution: {integrity: sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==} + '@smithy/credential-provider-imds@4.2.0': + resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.2.1': - resolution: {integrity: sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==} + '@smithy/fetch-http-handler@5.3.1': + resolution: {integrity: sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.1.1': - resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} + '@smithy/hash-node@4.2.0': + resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.1.1': - resolution: {integrity: sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==} + '@smithy/invalid-dependency@4.2.0': + resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.1.0': - resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.1.1': - resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} + '@smithy/middleware-content-length@4.2.0': + resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.2': - resolution: {integrity: sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==} + '@smithy/middleware-endpoint@4.3.1': + resolution: {integrity: sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.2': - resolution: {integrity: sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==} + '@smithy/middleware-retry@4.4.1': + resolution: {integrity: sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.1.1': - resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} + '@smithy/middleware-serde@4.2.0': + resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.1.1': - resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} + '@smithy/middleware-stack@4.2.0': + resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.2.2': - resolution: {integrity: sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==} + '@smithy/node-config-provider@4.3.0': + resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.2.1': - resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} + '@smithy/node-http-handler@4.3.0': + resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.1.1': - resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} + '@smithy/property-provider@4.2.0': + resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.2.1': - resolution: {integrity: sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==} + '@smithy/protocol-http@5.3.0': + resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.1.1': - resolution: {integrity: sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==} + '@smithy/querystring-builder@4.2.0': + resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.1.1': - resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} + '@smithy/querystring-parser@4.2.0': + resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.1.1': - resolution: {integrity: sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==} + '@smithy/service-error-classification@4.2.0': + resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.2.0': - resolution: {integrity: sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==} + '@smithy/shared-ini-file-loader@4.3.0': + resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.2.1': - resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} + '@smithy/signature-v4@5.3.0': + resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.2': - resolution: {integrity: sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==} + '@smithy/smithy-client@4.7.1': + resolution: {integrity: sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.5.0': - resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} + '@smithy/types@4.6.0': + resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.1.1': - resolution: {integrity: sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==} + '@smithy/url-parser@4.2.0': + resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.1.0': - resolution: {integrity: sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==} + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.1.0': - resolution: {integrity: sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.1.0': - resolution: {integrity: sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==} + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.1.0': - resolution: {integrity: sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.1.0': - resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.2': - resolution: {integrity: sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==} + '@smithy/util-defaults-mode-browser@4.3.0': + resolution: {integrity: sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.2': - resolution: {integrity: sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==} + '@smithy/util-defaults-mode-node@4.2.1': + resolution: {integrity: sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.1.2': - resolution: {integrity: sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==} + '@smithy/util-endpoints@3.2.0': + resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.1.0': - resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.1.1': - resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} + '@smithy/util-middleware@4.2.0': + resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.1.1': - resolution: {integrity: sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==} + '@smithy/util-retry@4.2.0': + resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.3.1': - resolution: {integrity: sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==} + '@smithy/util-stream@4.5.0': + resolution: {integrity: sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.1.0': - resolution: {integrity: sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.1.0': - resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': @@ -3940,18 +4019,18 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@sveltejs/acorn-typescript@1.0.5': - resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + '@sveltejs/acorn-typescript@1.0.6': + resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} peerDependencies: acorn: ^8.9.0 - '@sveltejs/adapter-static@3.0.9': - resolution: {integrity: sha512-aytHXcMi7lb9ljsWUzXYQ0p5X1z9oWud2olu/EpmH7aCu4m84h7QLvb5Wp+CFirKcwoNnYvYWhyP/L8Vh1ztdw==} + '@sveltejs/adapter-static@3.0.10': + resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/enhanced-img@0.8.1': - resolution: {integrity: sha512-Ibom8j6F9vdmOeR+ljQ4q7TEJV0FWN1kB5wJZ2S/GuDVgCrKYrsXBw5gpSKcHwGYpKA3o9EoijPhep/GHgRUWQ==} + '@sveltejs/enhanced-img@0.8.3': + resolution: {integrity: sha512-UM56PSQHbXBvRw5/Ah7R4vxrTR4xbB5/7gTE/7bypVGOGx0pBwTloWXsnLfJXEFI+YYR7IU4jtbYcp4pBXaUSg==} peerDependencies: '@sveltejs/vite-plugin-svelte': ^6.0.0 svelte: ^5.0.0 @@ -3978,8 +4057,8 @@ packages: svelte: ^5.0.0 vite: ^6.3.0 || ^7.0.0 - '@sveltejs/vite-plugin-svelte@6.2.0': - resolution: {integrity: sha512-nJsV36+o7rZUDlrnSduMNl11+RoDE1cKqOI0yUEBCcqFoAZOk47TwD3dPKS2WmRutke9StXnzsPBslY7prDM9w==} + '@sveltejs/vite-plugin-svelte@6.2.1': + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: svelte: ^5.0.0 @@ -4145,65 +4224,65 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@tailwindcss/node@4.1.13': - resolution: {integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==} + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} - '@tailwindcss/oxide-android-arm64@4.1.13': - resolution: {integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==} + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.13': - resolution: {integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.13': - resolution: {integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==} + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.13': - resolution: {integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==} + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': - resolution: {integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': - resolution: {integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.13': - resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.13': - resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.13': - resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==} + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.13': - resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==} + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -4214,24 +4293,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': - resolution: {integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.13': - resolution: {integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.13': - resolution: {integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==} + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} engines: {node: '>= 10'} - '@tailwindcss/vite@4.1.13': - resolution: {integrity: sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==} + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 @@ -4363,8 +4442,8 @@ packages: '@types/docker-modem@3.0.6': resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} - '@types/dockerode@3.3.42': - resolution: {integrity: sha512-U1jqHMShibMEWHdxYhj3rCMNCiLx5f35i4e3CEUuW+JSSszc/tVqc6WCAPdhwBymG5R/vgbcceagK0St7Cq6Eg==} + '@types/dockerode@3.3.44': + resolution: {integrity: sha512-fUpIHlsbYpxAJb285xx3vp7q5wf5mjqSn3cYwl/MhiM+DB99OdO5sOCPlO0PjO+TyOtphPs7tMVLU/RtOo/JjA==} '@types/dom-to-image@2.6.7': resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==} @@ -4477,9 +4556,6 @@ packages: '@types/lodash@4.17.20': resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} - '@types/luxon@3.6.2': - resolution: {integrity: sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==} - '@types/luxon@3.7.1': resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} @@ -4513,20 +4589,20 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.19.126': - resolution: {integrity: sha512-8AXQlBfrGmtYJEJUPs63F/uZQqVeFiN9o6NUjbDJYfxNxFnArlZufANPw4h6dGhYGKxcyw+TapXFvEsguzIQow==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} '@types/node@20.19.2': resolution: {integrity: sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==} - '@types/node@22.18.8': - resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + '@types/node@22.18.9': + resolution: {integrity: sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==} - '@types/node@24.5.1': - resolution: {integrity: sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==} + '@types/node@24.7.1': + resolution: {integrity: sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==} - '@types/nodemailer@7.0.1': - resolution: {integrity: sha512-UfHAghPmGZVzaL8x9y+mKZMWyHC399+iq0MOmya5tIyenWX3lcdSb60vOmp0DocR6gCDTYTozv/ULQnREyyjkg==} + '@types/nodemailer@7.0.2': + resolution: {integrity: sha512-Zo6uOA9157WRgBk/ZhMpTQ/iCWLMk7OIs/Q9jvHarMvrzUUP/MDdPHL2U1zpf57HrrWGv4nYQn5uIxna0xY3xw==} '@types/oidc-provider@9.5.0': resolution: {integrity: sha512-eEzCRVTSqIHD9Bo/qRJ4XQWQ5Z/zBcG+Z2cGJluRsSuWx1RJihqRyPxhIEpMXTwPzHYRTQkVp7hwisQOwzzSAg==} @@ -4567,14 +4643,14 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@19.1.13': - resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} '@types/readdir-glob@1.1.5': resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} '@types/sanitize-html@2.16.0': resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} @@ -4627,9 +4703,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.15.3': resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} @@ -4796,11 +4869,11 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@zoom-image/core@0.41.0': - resolution: {integrity: sha512-LAxGru91286gFmyiQB4RjM277YOWxJX+OZcwtIH/N0dyo73y4NfaAE1eGVdnhjxEYv7yVV3xToMyYnm+uQboTw==} + '@zoom-image/core@0.41.3': + resolution: {integrity: sha512-yW2sZRP6FnZZ7vREpYucDpSCsVFgMSWq22Sp1kabsMPz5+6LSs+sBPPDCVs/ahVYSHa9YOX8rlGHM5iiTFPZLA==} - '@zoom-image/svelte@0.3.4': - resolution: {integrity: sha512-8cPkFUjh+t3/eYkoT2krvz8hoFiXoiYZKpcHOnYCHLhEwaHr1yjgXg/ttWehotVH9V3Z51JQgIcGF3uhYWKB/Q==} + '@zoom-image/svelte@0.3.7': + resolution: {integrity: sha512-vCgA2ClH8J2JBTzpJEgzy03yTi5uJE0963cUjBwc5fi7q8g1wxbbj4/W7YHwQfDmdh9uqHxlX0VcmUQqV44d+w==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -4908,8 +4981,8 @@ packages: peerDependencies: algoliasearch: '>= 3.1 < 6' - algoliasearch@5.29.0: - resolution: {integrity: sha512-E2l6AlTWGznM2e7vEE6T6hzObvEyXukxMOlBmVlMyixZyK1umuO/CiVc6sDBbzVH0oEviCE5IfVY1oZBmccYPQ==} + algoliasearch@5.40.0: + resolution: {integrity: sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==} engines: {node: '>= 14.0.0'} ansi-align@3.0.1: @@ -5093,11 +5166,11 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.1: - resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + bare-events@2.7.0: + resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} - bare-fs@4.2.0: - resolution: {integrity: sha512-oRfrw7gwwBVAWx9S5zPMo2iiOjxyiZE12DmblmMQREgcogbNO0AFaZ+QBxxkEXiPspcpvO/Qtqn8LabUx4uYXg==} + bare-fs@4.4.7: + resolution: {integrity: sha512-huJQxUWc2d1T+6dxnC/FoYpBgEHzJp33mYZqFtQqTTPPyP9xPvmjC16VpR4wTte4ZKd5VxkFAcfDYi51iwWMcg==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -5105,8 +5178,8 @@ packages: bare-buffer: optional: true - bare-os@3.6.1: - resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: @@ -5123,6 +5196,9 @@ packages: bare-events: optional: true + bare-url@2.2.2: + resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5130,6 +5206,10 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} + baseline-browser-mapping@2.8.15: + resolution: {integrity: sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==} + hasBin: true + batch-cluster@13.0.0: resolution: {integrity: sha512-EreW0Vi8TwovhYUHBXXRA5tthuU2ynGsZFlboyMJHCCUXYa2AjgwnE3ubBOJs2xJLcuXFJbi6c/8pH5+FVj8Og==} engines: {node: '>=14'} @@ -5199,8 +5279,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.3: - resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5225,8 +5305,12 @@ packages: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} - bullmq@5.58.5: - resolution: {integrity: sha512-0A6Qjxdn8j7aOcxfRZY798vO/aMuwvoZwfE6a9EOXHb1pzpBVAogsc/OfRWeUf+5wMBoYB5nthstnJo/zrQOeQ==} + bullmq@5.60.0: + resolution: {integrity: sha512-hQPfUOLE7/aidCiQSMc5K1EYF6eAuOYSGNdKoLbTpYuRsjYsY0uGUBNX7VrESvAerUpklrsgPLqbunySUxWh5Q==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -5307,8 +5391,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001735: - resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + caniuse-lite@1.0.30001749: + resolution: {integrity: sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==} canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -5486,17 +5570,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -5552,8 +5629,8 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - comment-json@4.2.5: - resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + comment-json@4.4.1: + resolution: {integrity: sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==} engines: {node: '>= 6'} common-path-prefix@3.0.0: @@ -5655,10 +5732,6 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} - copy-text-to-clipboard@3.2.0: - resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} - engines: {node: '>=12'} - copy-webpack-plugin@11.0.0: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} @@ -5707,8 +5780,8 @@ packages: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - cron@4.3.0: - resolution: {integrity: sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==} + cron@4.3.3: + resolution: {integrity: sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==} engines: {node: '>=18.x'} cross-spawn@7.0.6: @@ -5949,9 +6022,13 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -5968,6 +6045,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -6002,8 +6083,8 @@ packages: detect-europe-js@0.1.2: resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node@2.1.0: @@ -6050,16 +6131,16 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} - docker-compose@1.2.0: - resolution: {integrity: sha512-wIU1eHk3Op7dFgELRdmOYlPYS4gP8HhH1ZmZa13QZF59y0fblzFDFmKPhyc05phCy2hze9OEvNZAsoljrs+72w==} + docker-compose@1.3.0: + resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==} engines: {node: '>= 6.0.0'} docker-modem@5.0.6: resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} engines: {node: '>= 8.0'} - dockerode@4.0.7: - resolution: {integrity: sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==} + dockerode@4.0.9: + resolution: {integrity: sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==} engines: {node: '>= 8.0'} docusaurus-lunr-search@3.6.0: @@ -6117,8 +6198,8 @@ packages: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} - dotenv@17.2.2: - resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -6140,8 +6221,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.207: - resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} + electron-to-chromium@1.5.233: + resolution: {integrity: sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==} emoji-regex@10.5.0: resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} @@ -6256,8 +6337,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -6353,8 +6434,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.36.0: - resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6455,6 +6536,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -6535,8 +6619,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-parser@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} @@ -6800,6 +6884,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -6894,10 +6984,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -6975,6 +7061,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} @@ -6996,9 +7086,6 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -7103,6 +7190,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + i18n-iso-countries@7.14.0: resolution: {integrity: sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg==} engines: {node: '>= 12'} @@ -7152,8 +7243,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.14.2: - resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + import-in-the-middle@1.14.4: + resolution: {integrity: sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==} import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -7203,14 +7294,14 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - intl-messageformat@10.7.16: - resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} + intl-messageformat@10.7.17: + resolution: {integrity: sha512-0Ugaf65B2J76rb31drgNF1l6bGEDkbIiYc2Glx6jaZINHnwa5kDRGy8KXYuA+/8P4G0c9prAFhfVhQJJfzUuvQ==} invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@5.7.0: - resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} + ioredis@5.8.0: + resolution: {integrity: sha512-AUXbKn9gvo9hHKvk6LbZJQSKn/qIfkWXrnsyL9Yrf+oeXmla9Nmf6XEumOddyhM8neynpK5oAV6r9r99KBuwzA==} engines: {node: '>=12.22.0'} ip-address@10.0.1: @@ -7234,9 +7325,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -7265,6 +7353,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -7284,6 +7377,11 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -7296,6 +7394,10 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7378,6 +7480,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + is-yarn-global@0.4.1: resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} @@ -7446,8 +7552,8 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true joi@17.13.3: @@ -7689,8 +7795,8 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -7790,10 +7896,6 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - luxon@3.6.1: - resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} - engines: {node: '>=12'} - luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} @@ -7827,8 +7929,8 @@ packages: resolution: {integrity: sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==} engines: {node: '>=6.4.0'} - maplibre-gl@5.7.1: - resolution: {integrity: sha512-iCOQB6W/EGgQx8aU4SyfU5a5/GR2E+ELF92NMsqYfs3x+vnY+8mARmz4gor6XZHCz3tv19mnotVDRlRTMNKyGw==} + maplibre-gl@5.8.0: + resolution: {integrity: sha512-zLblPFK+z5sxeitDF8RL2cnqfRaivNwxbGoQMfwAm9st6d1lRGTxgI7NNNr/U1AEPkp5+X+wjROagiHvJD8aqg==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} mark.js@8.11.1: @@ -7930,6 +8032,9 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} + memfs@4.49.0: + resolution: {integrity: sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==} + memoizee@0.4.17: resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} engines: {node: '>=0.12'} @@ -8200,8 +8305,8 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} mkdirp-classic@0.5.3: @@ -8220,11 +8325,6 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - mnemonist@0.40.3: resolution: {integrity: sha512-Vjyr90sJ23CKKH/qPAgUKicw/v6pRoamxIEDFOF8uSgFME7DqPRpHgRTejWVjkdGg5dXj0/NyxZHZ9bcjH+2uQ==} @@ -8315,8 +8415,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nest-commander@3.19.1: - resolution: {integrity: sha512-Pn6xcMeSnidlzZozNLnbe7P4TqXL7g0JuxqTAtJ89KT4S63ntJZKtRU6g/56h/aHUQa+m98j/c9OxBSduK7EPg==} + nest-commander@3.20.1: + resolution: {integrity: sha512-LRI7z6UlWy2vWyQR0PYnAXsaRyJvpfiuvOCmx2jk2kLXJH9+y/omPDl9NE3fq4WMaE0/AhviuUjA12eC/zDqXw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 @@ -8395,8 +8495,8 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} nodemailer@7.0.7: resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} @@ -8462,8 +8562,8 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - oauth4webapi@3.8.1: - resolution: {integrity: sha512-olkZDELNycOWQf9LrsELFq8n05LwJgV8UkrS0cburk6FOwf8GvLam+YB+Uj5Qvryee+vwWOfQVeI5Vm0MVg7SA==} + oauth4webapi@3.8.2: + resolution: {integrity: sha512-FzZZ+bht5X0FKe7Mwz3DAVAmlH1BV5blSak/lHMBKz0/EBMhX6B10GlQYI51+oRp8ObJaX0g6pXrAxZh5s8rjw==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -8513,6 +8613,10 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8521,8 +8625,8 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - openid-client@6.8.0: - resolution: {integrity: sha512-oG1d1nAVhIIE+JSjLS+7E9wY1QOJpZltkzlJdbZ7kEn7Hp3hqur2TEeQ8gLOHoHkhbRAGZJKoOnEQcLOQJuIyg==} + openid-client@6.8.1: + resolution: {integrity: sha512-VoYT6enBo6Vj2j3Q5Ec0AezS+9YGzQo1f5Xc42lreMGlfP4ljiXPKVDvCADh+XHCV/bqPu/wWSiCVXbJKvrODw==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -8580,9 +8684,9 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} @@ -8773,13 +8877,13 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.55.0: - resolution: {integrity: sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==} + playwright-core@1.55.1: + resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} engines: {node: '>=18'} hasBin: true - playwright@1.55.0: - resolution: {integrity: sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==} + playwright@1.55.1: + resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==} engines: {node: '>=18'} hasBin: true @@ -8971,16 +9075,22 @@ packages: ts-node: optional: true - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss-loader@7.3.4: @@ -9283,8 +9393,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-organize-imports@4.2.0: - resolution: {integrity: sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg==} + prettier-plugin-organize-imports@4.3.0: + resolution: {integrity: sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==} peerDependencies: prettier: '>=2.0' typescript: '>=2.9' @@ -9473,13 +9583,13 @@ packages: peerDependencies: react: ^18.3.1 - react-dom@19.1.1: - resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^19.1.1 + react: ^19.2.0 - react-email@4.2.11: - resolution: {integrity: sha512-/7TXRgsTrXcV1u7kc5ZXDVlPvZqEBaYcflMhE2FgWIJh3OHLjj2FqctFTgYcp0iwzbR59a7gzJLmSKyD0wYJEQ==} + react-email@4.2.12: + resolution: {integrity: sha512-Cp6nYAG9uL4//X/96wDSKxGqVTXsaRMuD1ub0G0iBcfTqLel4VVre3kicq7RraplDuj+ATlqSZu47d7P2ULP5w==} engines: {node: '>=18.0.0'} hasBin: true @@ -9528,8 +9638,8 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -9560,8 +9670,10 @@ packages: recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - recma-jsx@1.0.0: - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 recma-parse@1.0.0: resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} @@ -9640,8 +9752,8 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -9738,8 +9850,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup-plugin-visualizer@6.0.3: - resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} + rollup-plugin-visualizer@6.0.4: + resolution: {integrity: sha512-q8Q7J/6YofkmaGW1sH/fPRAz37x/+pd7VBuaUU7lwvOS/YikuiiEU9jeb9PH8XHiq50XFrUsBbOxeAMYQ7KZkg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -9751,8 +9863,8 @@ packages: rollup: optional: true - rollup@4.50.1: - resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -9768,6 +9880,10 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -9818,8 +9934,8 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -9828,8 +9944,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} search-insights@2.17.3: @@ -9857,8 +9973,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -9915,8 +10031,8 @@ packages: resolution: {integrity: sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==} hasBin: true - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -9963,13 +10079,10 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-icons@15.15.0: - resolution: {integrity: sha512-ohh1Uo9AjH10WN5wpPmtjnmbSLv6MjiULHS4dYA821uIsPAp0Q3XoluPnjBnQAFsztasmM6z2dezJBrQbtserg==} + simple-icons@15.16.0: + resolution: {integrity: sha512-AeyYdQ5BsFe7ONruVRClZ+2921tQIEcHuP9AZdNUR0in1jFeakH0pA9Rkjj0T/RkTH7Icx2jprXxWWY3aaCDJQ==} engines: {node: '>=0.12.18'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -10053,6 +10166,10 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -10076,8 +10193,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sql-formatter@15.6.9: - resolution: {integrity: sha512-r9VKnkRfKW7jbhTgytwbM+JqmFclQYN9L58Z3UTktuy9V1f1Y+rGK3t70Truh2wIOJzvZkzobAQ2PwGjjXsr6Q==} + sql-formatter@15.6.10: + resolution: {integrity: sha512-0bJOPQrRO/JkjQhiThVayq0hOKnI1tHI+2OTkmT7TGtc6kqS+V7kveeMzRW+RNQGxofmTmet9ILvztyuxv0cJQ==} hasBin: true srcset@4.0.0: @@ -10087,8 +10204,8 @@ packages: ssh-remote-port-forward@1.0.4: resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} - ssh2@1.16.0: - resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + ssh2@1.17.0: + resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} engines: {node: '>=10.16.0'} ssri@12.0.0: @@ -10127,8 +10244,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -10244,8 +10361,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.3.1: - resolution: {integrity: sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==} + svelte-check@4.3.2: + resolution: {integrity: sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -10264,6 +10381,9 @@ packages: svelte-gestures@5.2.2: resolution: {integrity: sha512-Y+chXPaSx8OsPoFppUwPk8PJzgrZ7xoDJKXeiEc7JBqyKKzXer9hlf8F9O34eFuAWB4/WQEvccACvyBplESL7A==} + svelte-highlight@7.8.4: + resolution: {integrity: sha512-aVp+Q0hH9kI7PlSDrklmFTF4Uj7wYj7UGuqkREnkXlqpEffxr2g6esZcMMaTgECdg5rb2mJqM88+nwS10ecoTg==} + svelte-i18n@4.0.1: resolution: {integrity: sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==} engines: {node: '>= 16'} @@ -10303,8 +10423,8 @@ packages: peerDependencies: svelte: ^5.30.2 - svelte@5.38.10: - resolution: {integrity: sha512-UY+OhrWK7WI22bCZ00P/M3HtyWgwJPi9IxSRkoAE2MeAy6kl7ZlZWJZ8RaB+X4KD/G+wjis+cGVnVYaoqbzBqg==} + svelte@5.39.11: + resolution: {integrity: sha512-8MxWVm2+3YwrFbPaxOlT1bbMi6OTenrAgks6soZfiaS8Fptk4EVyRIFhJc3RpO264EeSNwgjWAdki0ufg4zkGw==} engines: {node: '>=18'} svg-parser@2.0.4: @@ -10368,23 +10488,23 @@ packages: peerDependencies: tailwindcss: '>=3.4.17' - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.13: - resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==} + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - tar-fs@3.1.0: - resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -10397,8 +10517,8 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} engines: {node: '>=18'} terser-webpack-plugin@5.3.14: @@ -10426,8 +10546,8 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - testcontainers@11.5.1: - resolution: {integrity: sha512-YSSP4lSJB8498zTeu4HYTZYgSky54ozBmIDdC8PFU5inj+vBo5hPpilhcYTgmsqsYjrXOJGV7jl0MWByS7GwuA==} + testcontainers@11.7.1: + resolution: {integrity: sha512-fjut+07G4Avp6Lly/6hQePpUpQFv9ZyQd+7JC5iCDKg+dWa2Sw7fXD3pBrkzslYFfKqGx9M6kyIaLpg9VeMsjw==} text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -10443,6 +10563,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + three@0.179.1: resolution: {integrity: sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==} @@ -10548,6 +10674,12 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -10646,8 +10778,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -10681,8 +10813,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.12.0: - resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} undici@7.16.0: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} @@ -10843,10 +10975,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - validator@13.15.15: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} @@ -10867,8 +10995,8 @@ packages: vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} @@ -10893,8 +11021,8 @@ packages: vite: optional: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -11014,18 +11142,21 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true - webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + engines: {node: '>= 18.12.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true - webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5.0.0 webpack-cli: '*' peerDependenciesMeta: webpack: @@ -11062,6 +11193,16 @@ packages: webpack-cli: optional: true + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + webpackbar@6.0.1: resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==} engines: {node: '>=14.21.3'} @@ -11196,6 +11337,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -11281,8 +11426,8 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zimmerframe@1.1.2: - resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} @@ -11298,119 +11443,126 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3)': + '@algolia/abtesting@1.6.0': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 + + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)': + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) - '@algolia/client-search': 5.29.0 - algoliasearch: 5.29.0 + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)': + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: - '@algolia/client-search': 5.29.0 - algoliasearch: 5.29.0 + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 - '@algolia/client-abtesting@5.29.0': + '@algolia/client-abtesting@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-analytics@5.29.0': + '@algolia/client-analytics@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-common@5.29.0': {} + '@algolia/client-common@5.40.0': {} - '@algolia/client-insights@5.29.0': + '@algolia/client-insights@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-personalization@5.29.0': + '@algolia/client-personalization@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-query-suggestions@5.29.0': + '@algolia/client-query-suggestions@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-search@5.29.0': + '@algolia/client-search@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 '@algolia/events@4.0.1': {} - '@algolia/ingestion@1.29.0': + '@algolia/ingestion@1.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/monitoring@1.29.0': + '@algolia/monitoring@1.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/recommend@5.29.0': + '@algolia/recommend@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/requester-browser-xhr@5.29.0': + '@algolia/requester-browser-xhr@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-fetch@5.29.0': + '@algolia/requester-fetch@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-node-http@5.29.0': + '@algolia/requester-node-http@5.40.0': dependencies: - '@algolia/client-common': 5.29.0 + '@algolia/client-common': 5.40.0 '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@angular-devkit/core@19.2.15(chokidar@4.0.3)': dependencies: @@ -11423,11 +11575,22 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.8)(chokidar@4.0.3)': + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.9)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.18.8) + '@inquirer/prompts': 7.3.2(@types/node@22.18.9) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -11445,6 +11608,16 @@ snapshots: transitivePeerDependencies: - chokidar + '@angular-devkit/schematics@19.2.17(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -11459,15 +11632,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-locate-window': 3.873.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -11476,366 +11649,365 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-sesv2@3.890.0': + '@aws-sdk/client-sesv2@3.907.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/credential-provider-node': 3.890.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.890.0 - '@aws-sdk/region-config-resolver': 3.890.0 - '@aws-sdk/signature-v4-multi-region': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.890.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.890.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/credential-provider-node': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/signature-v4-multi-region': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.890.0': + '@aws-sdk/client-sso@3.907.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.890.0 - '@aws-sdk/region-config-resolver': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.890.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.890.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.890.0': + '@aws-sdk/core@3.907.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@aws-sdk/xml-builder': 3.887.0 - '@smithy/core': 3.11.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-utf8': 4.1.0 - fast-xml-parser: 5.2.5 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.890.0': + '@aws-sdk/credential-provider-env@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.890.0': + '@aws-sdk/credential-provider-http@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/node-http-handler': 4.2.1 - '@smithy/property-provider': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-stream': 4.3.1 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.890.0': + '@aws-sdk/credential-provider-ini@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/credential-provider-env': 3.890.0 - '@aws-sdk/credential-provider-http': 3.890.0 - '@aws-sdk/credential-provider-process': 3.890.0 - '@aws-sdk/credential-provider-sso': 3.890.0 - '@aws-sdk/credential-provider-web-identity': 3.890.0 - '@aws-sdk/nested-clients': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/credential-provider-env': 3.907.0 + '@aws-sdk/credential-provider-http': 3.907.0 + '@aws-sdk/credential-provider-process': 3.907.0 + '@aws-sdk/credential-provider-sso': 3.907.0 + '@aws-sdk/credential-provider-web-identity': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.890.0': + '@aws-sdk/credential-provider-node@3.907.0': dependencies: - '@aws-sdk/credential-provider-env': 3.890.0 - '@aws-sdk/credential-provider-http': 3.890.0 - '@aws-sdk/credential-provider-ini': 3.890.0 - '@aws-sdk/credential-provider-process': 3.890.0 - '@aws-sdk/credential-provider-sso': 3.890.0 - '@aws-sdk/credential-provider-web-identity': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/credential-provider-env': 3.907.0 + '@aws-sdk/credential-provider-http': 3.907.0 + '@aws-sdk/credential-provider-ini': 3.907.0 + '@aws-sdk/credential-provider-process': 3.907.0 + '@aws-sdk/credential-provider-sso': 3.907.0 + '@aws-sdk/credential-provider-web-identity': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.890.0': + '@aws-sdk/credential-provider-process@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.890.0': + '@aws-sdk/credential-provider-sso@3.907.0': dependencies: - '@aws-sdk/client-sso': 3.890.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/token-providers': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/client-sso': 3.907.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/token-providers': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.890.0': + '@aws-sdk/credential-provider-web-identity@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/nested-clients': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.887.0': + '@aws-sdk/middleware-host-header@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.887.0': + '@aws-sdk/middleware-logger@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.887.0': + '@aws-sdk/middleware-recursion-detection@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 + '@aws-sdk/types': 3.901.0 '@aws/lambda-invoke-store': 0.0.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.890.0': + '@aws-sdk/middleware-sdk-s3@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-arn-parser': 3.873.0 - '@smithy/core': 3.11.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/protocol-http': 5.2.1 - '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-stream': 4.3.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.890.0': + '@aws-sdk/middleware-user-agent@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.890.0 - '@smithy/core': 3.11.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.890.0': + '@aws-sdk/nested-clients@3.907.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/middleware-host-header': 3.887.0 - '@aws-sdk/middleware-logger': 3.887.0 - '@aws-sdk/middleware-recursion-detection': 3.887.0 - '@aws-sdk/middleware-user-agent': 3.890.0 - '@aws-sdk/region-config-resolver': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.890.0 - '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.890.0 - '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.0 - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/hash-node': 4.1.1 - '@smithy/invalid-dependency': 4.1.1 - '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-retry': 4.2.2 - '@smithy/middleware-serde': 4.1.1 - '@smithy/middleware-stack': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/node-http-handler': 4.2.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.2 - '@smithy/util-defaults-mode-node': 4.1.2 - '@smithy/util-endpoints': 3.1.2 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@smithy/util-utf8': 4.1.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.907.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.890.0': + '@aws-sdk/region-config-resolver@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 - '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.1 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.890.0': + '@aws-sdk/signature-v4-multi-region@3.907.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/signature-v4': 5.2.1 - '@smithy/types': 4.5.0 + '@aws-sdk/middleware-sdk-s3': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.890.0': + '@aws-sdk/token-providers@3.907.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/nested-clients': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@aws-sdk/core': 3.907.0 + '@aws-sdk/nested-clients': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.887.0': + '@aws-sdk/types@3.901.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.873.0': + '@aws-sdk/util-arn-parser@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.890.0': + '@aws-sdk/util-endpoints@3.901.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-endpoints': 3.1.2 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-endpoints': 3.2.0 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.873.0': + '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.887.0': + '@aws-sdk/util-user-agent-browser@3.907.0': dependencies: - '@aws-sdk/types': 3.887.0 - '@smithy/types': 4.5.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.890.0': + '@aws-sdk/util-user-agent-node@3.907.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.890.0 - '@aws-sdk/types': 3.887.0 - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 + '@aws-sdk/middleware-user-agent': 3.907.0 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.887.0': + '@aws-sdk/xml-builder@3.901.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 + fast-xml-parser: 5.2.5 tslib: 2.8.1 '@aws/lambda-invoke-store@0.0.1': {} @@ -11873,7 +12045,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': @@ -11884,7 +12056,7 @@ snapshots: dependencies: '@babel/compat-data': 7.27.7 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.3 + browserslist: 4.26.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -12858,21 +13030,21 @@ snapshots: '@docsearch/css@3.9.0': {} - '@docsearch/react@3.9.0(@algolia/client-search@5.29.0)(@types/react@19.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) '@docsearch/css': 3.9.0 - algoliasearch: 5.29.0 + algoliasearch: 5.40.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/babel@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/babel@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.28.3 @@ -12884,14 +13056,13 @@ snapshots: '@babel/runtime': 7.28.4 '@babel/runtime-corejs3': 7.27.6 '@babel/traverse': 7.28.4 - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) babel-plugin-dynamic-import-node: 2.3.3 fs-extra: 11.3.0 tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - react - react-dom @@ -12899,38 +13070,37 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/bundler@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: '@babel/core': 7.27.7 - '@docusaurus/babel': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/cssnano-preset': 3.8.1 - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.100.2) + '@docusaurus/babel': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/cssnano-preset': 3.9.1 + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.102.1) clean-css: 5.3.3 - copy-webpack-plugin: 11.0.0(webpack@5.100.2) - css-loader: 6.11.0(webpack@5.100.2) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.100.2) + copy-webpack-plugin: 11.0.0(webpack@5.102.1) + css-loader: 6.11.0(webpack@5.102.1) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.102.1) cssnano: 6.1.2(postcss@8.5.6) - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.102.1) html-minifier-terser: 7.2.0 - mini-css-extract-plugin: 2.9.2(webpack@5.100.2) - null-loader: 4.0.1(webpack@5.100.2) + mini-css-extract-plugin: 2.9.2(webpack@5.102.1) + null-loader: 4.0.1(webpack@5.102.1) postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.100.2) + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.3)(webpack@5.102.1) postcss-preset-env: 10.2.4(postcss@8.5.6) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.102.1) tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - webpack: 5.100.2 - webpackbar: 6.0.1(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) + webpack: 5.102.1 + webpackbar: 6.0.1(webpack@5.102.1) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - csso - esbuild - lightningcss @@ -12941,16 +13111,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/core@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/babel': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/bundler': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mdx-js/react': 3.1.1(@types/react@19.1.13)(react@18.3.1) + '@docusaurus/babel': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/bundler': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@18.3.1) boxen: 6.2.1 chalk: 4.1.2 chokidar: 3.6.0 @@ -12965,7 +13135,7 @@ snapshots: execa: 5.1.1 fs-extra: 11.3.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.102.1) leven: 3.1.0 lodash: 4.17.21 open: 8.4.2 @@ -12975,18 +13145,18 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.100.2) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.102.1) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) - semver: 7.7.2 + semver: 7.7.3 serve-handler: 6.1.6 tinypool: 1.1.1 tslib: 2.8.1 update-notifier: 6.0.2 - webpack: 5.100.2 + webpack: 5.102.1 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack@5.102.1) webpack-merge: 6.0.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12994,7 +13164,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13006,28 +13175,28 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/cssnano-preset@3.8.1': + '@docusaurus/cssnano-preset@3.9.1': dependencies: cssnano-preset-advanced: 6.1.2(postcss@8.5.6) postcss: 8.5.6 postcss-sort-media-queries: 5.2.0(postcss@8.5.6) tslib: 2.8.1 - '@docusaurus/logger@3.8.1': + '@docusaurus/logger@3.9.1': dependencies: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/mdx-loader@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.4.0 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.102.1) fs-extra: 11.3.0 image-size: 2.0.2 mdast-util-mdx: 3.0.0 @@ -13043,22 +13212,21 @@ snapshots: tslib: 2.8.1 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) vfile: 6.0.3 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - supports-color - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 '@types/react-router-dom': 5.3.3 react: 18.3.1 @@ -13067,23 +13235,22 @@ snapshots: react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - supports-color - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-blog@3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.3.0 @@ -13095,7 +13262,7 @@ snapshots: tslib: 2.8.1 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -13103,7 +13270,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13115,17 +13281,17 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.0 @@ -13136,7 +13302,7 @@ snapshots: schema-dts: 1.1.5 tslib: 2.8.1 utility-types: 3.11.0 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -13144,7 +13310,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13156,18 +13321,18 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-pages@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -13175,7 +13340,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13187,12 +13351,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-css-cascade-layers@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -13201,7 +13365,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13215,11 +13378,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-debug@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13232,7 +13395,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13244,11 +13406,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-analytics@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -13259,7 +13421,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13271,11 +13432,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-gtag@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13287,7 +13448,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13299,11 +13459,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-tag-manager@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -13314,7 +13474,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13326,14 +13485,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-sitemap@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13346,7 +13505,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13358,18 +13516,18 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/plugin-svgr@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/webpack': 8.1.0(typescript@5.9.2) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/webpack': 8.1.0(typescript@5.9.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -13377,7 +13535,6 @@ snapshots: - '@rspack/core' - '@swc/core' - '@swc/css' - - acorn - bufferutil - csso - debug @@ -13389,23 +13546,23 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.29.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.2)': + '@docusaurus/preset-classic@3.9.1(@algolia/client-search@5.40.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-css-cascade-layers': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-debug': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-google-analytics': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-google-gtag': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-google-tag-manager': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-sitemap': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-svgr': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/theme-classic': 3.8.1(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.29.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-css-cascade-layers': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-debug': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-analytics': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-gtag': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-tag-manager': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-sitemap': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-svgr': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-classic': 3.9.1(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-search-algolia': 3.9.1(@algolia/client-search@5.40.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -13417,7 +13574,6 @@ snapshots: - '@swc/core' - '@swc/css' - '@types/react' - - acorn - bufferutil - csso - debug @@ -13432,27 +13588,26 @@ snapshots: '@docusaurus/react-loadable@6.0.0(react@18.3.1)': dependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 react: 18.3.1 - '@docusaurus/theme-classic@3.8.1(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2)': + '@docusaurus/theme-classic@3.9.1(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mdx-js/react': 3.1.1(@types/react@19.1.13)(react@18.3.1) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-translations': 3.9.1 + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@18.3.1) clsx: 2.1.1 - copy-text-to-clipboard: 3.2.0 infima: 0.2.0-alpha.45 lodash: 4.17.21 nprogress: 0.2.0 @@ -13472,7 +13627,6 @@ snapshots: - '@swc/core' - '@swc/css' - '@types/react' - - acorn - bufferutil - csso - debug @@ -13484,15 +13638,15 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/theme-common@3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/mdx-loader': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 clsx: 2.1.1 parse-numeric-range: 1.3.0 @@ -13503,24 +13657,23 @@ snapshots: utility-types: 3.11.0 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - supports-color - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.29.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(@types/react@19.1.13)(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.2)': + '@docusaurus/theme-search-algolia@3.9.1(@algolia/client-search@5.40.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.29.0)(@types/react@19.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - algoliasearch: 5.29.0 - algoliasearch-helper: 3.26.0(algoliasearch@5.29.0) + '@docsearch/react': 3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/plugin-content-docs': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-translations': 3.9.1 + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + algoliasearch: 5.40.0 + algoliasearch-helper: 3.26.0(algoliasearch@5.40.0) clsx: 2.1.1 eta: 2.2.0 fs-extra: 11.3.0 @@ -13538,7 +13691,6 @@ snapshots: - '@swc/core' - '@swc/css' - '@types/react' - - acorn - bufferutil - csso - debug @@ -13551,41 +13703,40 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-translations@3.8.1': + '@docusaurus/theme-translations@3.9.1': dependencies: fs-extra: 11.3.0 tslib: 2.8.1 - '@docusaurus/tsconfig@3.8.1': {} + '@docusaurus/tsconfig@3.9.1': {} - '@docusaurus/types@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/mdast': 4.0.4 + '@types/react': 19.2.2 commander: 5.1.0 joi: 17.13.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' utility-types: 3.11.0 - webpack: 5.100.2 + webpack: 5.102.1 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - supports-color - uglify-js - webpack-cli - '@docusaurus/utils-common@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils-common@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - react - react-dom @@ -13593,11 +13744,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils-validation@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -13605,7 +13756,6 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - react - react-dom @@ -13613,14 +13763,14 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) escape-string-regexp: 4.0.0 execa: 5.1.1 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.102.1) fs-extra: 11.3.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -13633,12 +13783,11 @@ snapshots: prompts: 2.4.2 resolve-pathname: 3.0.0 tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) utility-types: 3.11.0 - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - '@swc/core' - - acorn - esbuild - react - react-dom @@ -13654,153 +13803,153 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ppc64@0.25.10': optional: true '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-riscv64@0.25.10': optional: true '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-s390x@0.25.10': optional: true '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.25.10': optional: true '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/sunos-x64@0.25.10': optional: true '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/win32-arm64@0.25.10': optional: true '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.25.10': optional: true '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -13813,12 +13962,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -13833,7 +13988,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.36.0': {} + '@eslint/js@9.37.0': {} '@eslint/object-schema@2.1.6': {} @@ -13842,6 +13997,11 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 + '@eslint/plugin-kit@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + '@faker-js/faker@10.0.0': {} '@fig/complete-commander@3.2.0(commander@11.1.0)': @@ -13860,10 +14020,10 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@formatjs/ecma402-abstract@2.3.4': + '@formatjs/ecma402-abstract@2.3.5': dependencies: '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.1 + '@formatjs/intl-localematcher': 0.6.2 decimal.js: 10.6.0 tslib: 2.8.1 @@ -13871,30 +14031,30 @@ snapshots: dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.11.2': + '@formatjs/icu-messageformat-parser@2.11.3': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-skeleton-parser': 1.8.14 + '@formatjs/ecma402-abstract': 2.3.5 + '@formatjs/icu-skeleton-parser': 1.8.15 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.14': + '@formatjs/icu-skeleton-parser@1.8.15': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.5 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.6.1': + '@formatjs/intl-localematcher@0.6.2': dependencies: tslib: 2.8.1 - '@golevelup/nestjs-discovery@4.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': + '@golevelup/nestjs-discovery@5.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) lodash: 4.17.21 - '@grpc/grpc-js@1.13.4': + '@grpc/grpc-js@1.14.0': dependencies: - '@grpc/proto-loader': 0.7.15 + '@grpc/proto-loader': 0.8.0 '@js-sdsl/ordered-map': 4.4.2 '@grpc/proto-loader@0.7.15': @@ -13904,6 +14064,13 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -13921,125 +14088,129 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/sharp-darwin-arm64@0.34.3': + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-arm64': 1.2.3 optional: true - '@img/sharp-darwin-x64@0.34.3': + '@img/sharp-darwin-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': + '@img/sharp-libvips-darwin-arm64@1.2.3': optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': + '@img/sharp-libvips-darwin-x64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': + '@img/sharp-libvips-linux-arm64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm@1.2.0': + '@img/sharp-libvips-linux-arm@1.2.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': + '@img/sharp-libvips-linux-ppc64@1.2.3': optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': + '@img/sharp-libvips-linux-s390x@1.2.3': optional: true - '@img/sharp-libvips-linux-x64@1.2.0': + '@img/sharp-libvips-linux-x64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.3': optional: true - '@img/sharp-linux-arm64@0.34.3': + '@img/sharp-linux-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.3 optional: true - '@img/sharp-linux-arm@0.34.3': + '@img/sharp-linux-arm@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.3 optional: true - '@img/sharp-linux-ppc64@0.34.3': + '@img/sharp-linux-ppc64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.3 optional: true - '@img/sharp-linux-s390x@0.34.3': + '@img/sharp-linux-s390x@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.3 optional: true - '@img/sharp-linux-x64@0.34.3': + '@img/sharp-linux-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.3 optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': + '@img/sharp-linuxmusl-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 optional: true - '@img/sharp-linuxmusl-x64@0.34.3': + '@img/sharp-linuxmusl-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 optional: true - '@img/sharp-wasm32@0.34.3': + '@img/sharp-wasm32@0.34.4': dependencies: '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-win32-arm64@0.34.3': + '@img/sharp-win32-arm64@0.34.4': optional: true - '@img/sharp-win32-ia32@0.34.3': + '@img/sharp-win32-ia32@0.34.4': optional: true - '@img/sharp-win32-x64@0.34.3': + '@img/sharp-win32-x64@0.34.4': optional: true - '@immich/ui@0.29.0(@internationalized/date@3.8.2)(svelte@5.38.10)': + '@immich/ui@0.34.2(@internationalized/date@3.8.2)(svelte@5.39.11)': dependencies: '@mdi/js': 7.4.47 - bits-ui: 2.9.8(@internationalized/date@3.8.2)(svelte@5.38.10) - simple-icons: 15.15.0 - svelte: 5.38.10 + bits-ui: 2.9.8(@internationalized/date@3.8.2)(svelte@5.39.11) + luxon: 3.7.2 + simple-icons: 15.16.0 + svelte: 5.39.11 + svelte-highlight: 7.8.4 tailwind-merge: 3.3.1 - tailwind-variants: 3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.13) - tailwindcss: 4.1.13 + tailwind-variants: 3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.14) + tailwindcss: 4.1.14 transitivePeerDependencies: - '@internationalized/date' - '@inquirer/checkbox@4.2.1(@types/node@22.18.8)': + '@inquirer/checkbox@4.2.1(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.9) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/confirm@5.1.15(@types/node@22.18.8)': + '@inquirer/confirm@5.1.15(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/core@10.1.15(@types/node@22.18.8)': + '@inquirer/core@10.1.15(@types/node@22.18.9)': dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.9) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -14047,121 +14218,121 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/editor@4.2.17(@types/node@22.18.8)': + '@inquirer/editor@4.2.17(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/expand@4.0.17(@types/node@22.18.8)': + '@inquirer/expand@4.0.17(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/external-editor@1.0.2(@types/node@22.18.8)': + '@inquirer/external-editor@1.0.2(@types/node@22.18.9)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.1(@types/node@22.18.8)': + '@inquirer/input@4.2.1(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/number@3.0.17(@types/node@22.18.8)': + '@inquirer/number@3.0.17(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/password@4.0.17(@types/node@22.18.8)': + '@inquirer/password@4.0.17(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/prompts@7.3.2(@types/node@22.18.8)': + '@inquirer/prompts@7.3.2(@types/node@22.18.9)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.8) - '@inquirer/confirm': 5.1.15(@types/node@22.18.8) - '@inquirer/editor': 4.2.17(@types/node@22.18.8) - '@inquirer/expand': 4.0.17(@types/node@22.18.8) - '@inquirer/input': 4.2.1(@types/node@22.18.8) - '@inquirer/number': 3.0.17(@types/node@22.18.8) - '@inquirer/password': 4.0.17(@types/node@22.18.8) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.8) - '@inquirer/search': 3.1.0(@types/node@22.18.8) - '@inquirer/select': 4.3.1(@types/node@22.18.8) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.9) + '@inquirer/confirm': 5.1.15(@types/node@22.18.9) + '@inquirer/editor': 4.2.17(@types/node@22.18.9) + '@inquirer/expand': 4.0.17(@types/node@22.18.9) + '@inquirer/input': 4.2.1(@types/node@22.18.9) + '@inquirer/number': 3.0.17(@types/node@22.18.9) + '@inquirer/password': 4.0.17(@types/node@22.18.9) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.9) + '@inquirer/search': 3.1.0(@types/node@22.18.9) + '@inquirer/select': 4.3.1(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/prompts@7.8.0(@types/node@22.18.8)': + '@inquirer/prompts@7.8.0(@types/node@22.18.9)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.8) - '@inquirer/confirm': 5.1.15(@types/node@22.18.8) - '@inquirer/editor': 4.2.17(@types/node@22.18.8) - '@inquirer/expand': 4.0.17(@types/node@22.18.8) - '@inquirer/input': 4.2.1(@types/node@22.18.8) - '@inquirer/number': 3.0.17(@types/node@22.18.8) - '@inquirer/password': 4.0.17(@types/node@22.18.8) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.8) - '@inquirer/search': 3.1.0(@types/node@22.18.8) - '@inquirer/select': 4.3.1(@types/node@22.18.8) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.9) + '@inquirer/confirm': 5.1.15(@types/node@22.18.9) + '@inquirer/editor': 4.2.17(@types/node@22.18.9) + '@inquirer/expand': 4.0.17(@types/node@22.18.9) + '@inquirer/input': 4.2.1(@types/node@22.18.9) + '@inquirer/number': 3.0.17(@types/node@22.18.9) + '@inquirer/password': 4.0.17(@types/node@22.18.9) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.9) + '@inquirer/search': 3.1.0(@types/node@22.18.9) + '@inquirer/select': 4.3.1(@types/node@22.18.9) optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/rawlist@4.1.5(@types/node@22.18.8)': + '@inquirer/rawlist@4.1.5(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.9) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/search@3.1.0(@types/node@22.18.8)': + '@inquirer/search@3.1.0(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.9) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/select@4.3.1(@types/node@22.18.8)': + '@inquirer/select@4.3.1(@types/node@22.18.9)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.8) + '@inquirer/core': 10.1.15(@types/node@22.18.9) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.8) + '@inquirer/type': 3.0.8(@types/node@22.18.9) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@inquirer/type@3.0.8(@types/node@22.18.8)': + '@inquirer/type@3.0.8(@types/node@22.18.9)': optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@internationalized/date@3.8.2': dependencies: '@swc/helpers': 0.5.17 - '@ioredis/commands@1.3.0': {} + '@ioredis/commands@1.4.0': {} '@isaacs/balanced-match@4.0.1': {} @@ -14193,36 +14364,71 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/yargs': 17.0.33 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 '@js-sdsl/ordered-map@4.4.2': {} + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.20.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + '@koa/cors@5.0.0': dependencies: vary: 1.1.2 @@ -14236,12 +14442,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@koddsson/eslint-plugin-tscompat@0.2.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@koddsson/eslint-plugin-tscompat@0.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@mdn/browser-compat-data': 6.0.27 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - browserslist: 4.25.3 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + browserslist: 4.26.3 transitivePeerDependencies: - eslint - supports-color @@ -14270,14 +14476,14 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11': dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -14286,14 +14492,14 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -14323,7 +14529,7 @@ snapshots: '@mapbox/whoots-js@3.1.0': {} - '@maplibre/maplibre-gl-style-spec@23.3.0': + '@maplibre/maplibre-gl-style-spec@24.2.0': dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.2 '@mapbox/unitbezier': 0.0.1 @@ -14353,12 +14559,13 @@ snapshots: '@mdn/browser-compat-data@6.0.27': {} - '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 + acorn: 8.15.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -14367,26 +14574,25 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.15.0) + recma-jsx: 1.0.1(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 - remark-mdx: 3.1.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-rehype: 11.1.2 - source-map: 0.7.4 + source-map: 0.7.6 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: - - acorn - supports-color - '@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1)': + '@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.13 + '@types/react': 19.2.2 react: 18.3.1 '@microsoft/tsdoc@0.15.1': {} @@ -14417,21 +14623,21 @@ snapshots: '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 - '@nestjs/bullmq@11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.58.5)': + '@nestjs/bullmq@11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.60.0)': dependencies: '@nestjs/bull-shared': 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) - bullmq: 5.58.5 + bullmq: 5.60.0 tslib: 2.8.1 - '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.8)': + '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.9)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.8)(chokidar@4.0.3) - '@inquirer/prompts': 7.8.0(@types/node@22.18.8) - '@nestjs/schematics': 11.0.7(chokidar@4.0.3)(typescript@5.8.3) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.9)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@22.18.9) + '@nestjs/schematics': 11.0.8(chokidar@4.0.3)(typescript@5.8.3) ansis: 4.1.0 chokidar: 4.0.3 cli-table3: 0.6.5 @@ -14516,31 +14722,31 @@ snapshots: - supports-color - utf-8-validate - '@nestjs/schedule@6.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': + '@nestjs/schedule@6.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) - cron: 4.3.0 + cron: 4.3.3 - '@nestjs/schematics@11.0.7(chokidar@4.0.3)(typescript@5.8.3)': + '@nestjs/schematics@11.0.8(chokidar@4.0.3)(typescript@5.8.3)': dependencies: - '@angular-devkit/core': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 typescript: 5.8.3 transitivePeerDependencies: - chokidar - '@nestjs/schematics@11.0.7(chokidar@4.0.3)(typescript@5.9.2)': + '@nestjs/schematics@11.0.8(chokidar@4.0.3)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - chokidar @@ -14605,7 +14811,7 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@nuxt/opencollective@0.4.1': dependencies: @@ -14630,7 +14836,7 @@ snapshots: '@opentelemetry/exporter-logs-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) @@ -14660,7 +14866,7 @@ snapshots: '@opentelemetry/exporter-metrics-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) @@ -14698,7 +14904,7 @@ snapshots: '@opentelemetry/exporter-trace-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) @@ -14748,16 +14954,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-ioredis@0.53.3(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 - '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/redis-common': 0.38.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.51.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-nestjs-core@0.52.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) @@ -14765,13 +14970,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.58.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pg@0.58.3(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.5 '@types/pg-pool': 2.0.6 transitivePeerDependencies: @@ -14781,7 +14986,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.205.0 - import-in-the-middle: 1.14.2 + import-in-the-middle: 1.14.4 require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color @@ -14794,7 +14999,7 @@ snapshots: '@opentelemetry/otlp-grpc-exporter-base@0.205.0(@opentelemetry/api@1.9.0)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) @@ -14821,7 +15026,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common@0.38.0': {} + '@opentelemetry/redis-common@0.38.2': {} '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': dependencies: @@ -14886,7 +15091,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.37.0': {} - '@opentelemetry/sql-common@0.41.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) @@ -14926,9 +15131,9 @@ snapshots: '@pkgr/core@0.2.9': {} - '@playwright/test@1.55.0': + '@playwright/test@1.55.1': dependencies: - playwright: 1.55.0 + playwright: 1.55.1 '@pnpm/config.env-replace@1.1.0': {} @@ -14967,187 +15172,190 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@react-email/body@0.1.0(react@19.1.1)': + '@react-email/body@0.1.0(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/button@0.2.0(react@19.1.1)': + '@react-email/button@0.2.0(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/code-block@0.1.0(react@19.1.1)': + '@react-email/code-block@0.1.0(react@19.2.0)': dependencies: prismjs: 1.30.0 - react: 19.1.1 + react: 19.2.0 - '@react-email/code-inline@0.0.5(react@19.1.1)': + '@react-email/code-inline@0.0.5(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/column@0.0.13(react@19.1.1)': + '@react-email/column@0.0.13(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/components@0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/components@0.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@react-email/body': 0.1.0(react@19.1.1) - '@react-email/button': 0.2.0(react@19.1.1) - '@react-email/code-block': 0.1.0(react@19.1.1) - '@react-email/code-inline': 0.0.5(react@19.1.1) - '@react-email/column': 0.0.13(react@19.1.1) - '@react-email/container': 0.0.15(react@19.1.1) - '@react-email/font': 0.0.9(react@19.1.1) - '@react-email/head': 0.0.12(react@19.1.1) - '@react-email/heading': 0.0.15(react@19.1.1) - '@react-email/hr': 0.0.11(react@19.1.1) - '@react-email/html': 0.0.11(react@19.1.1) - '@react-email/img': 0.0.11(react@19.1.1) - '@react-email/link': 0.0.12(react@19.1.1) - '@react-email/markdown': 0.0.15(react@19.1.1) - '@react-email/preview': 0.0.13(react@19.1.1) - '@react-email/render': 1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/row': 0.0.12(react@19.1.1) - '@react-email/section': 0.0.16(react@19.1.1) - '@react-email/tailwind': 1.2.2(react@19.1.1) - '@react-email/text': 0.1.5(react@19.1.1) - react: 19.1.1 + '@react-email/body': 0.1.0(react@19.2.0) + '@react-email/button': 0.2.0(react@19.2.0) + '@react-email/code-block': 0.1.0(react@19.2.0) + '@react-email/code-inline': 0.0.5(react@19.2.0) + '@react-email/column': 0.0.13(react@19.2.0) + '@react-email/container': 0.0.15(react@19.2.0) + '@react-email/font': 0.0.9(react@19.2.0) + '@react-email/head': 0.0.12(react@19.2.0) + '@react-email/heading': 0.0.15(react@19.2.0) + '@react-email/hr': 0.0.11(react@19.2.0) + '@react-email/html': 0.0.11(react@19.2.0) + '@react-email/img': 0.0.11(react@19.2.0) + '@react-email/link': 0.0.12(react@19.2.0) + '@react-email/markdown': 0.0.15(react@19.2.0) + '@react-email/preview': 0.0.13(react@19.2.0) + '@react-email/render': 1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-email/row': 0.0.12(react@19.2.0) + '@react-email/section': 0.0.16(react@19.2.0) + '@react-email/tailwind': 1.2.2(react@19.2.0) + '@react-email/text': 0.1.5(react@19.2.0) + react: 19.2.0 transitivePeerDependencies: - react-dom - '@react-email/container@0.0.15(react@19.1.1)': + '@react-email/container@0.0.15(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/font@0.0.9(react@19.1.1)': + '@react-email/font@0.0.9(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/head@0.0.12(react@19.1.1)': + '@react-email/head@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/heading@0.0.15(react@19.1.1)': + '@react-email/heading@0.0.15(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/hr@0.0.11(react@19.1.1)': + '@react-email/hr@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/html@0.0.11(react@19.1.1)': + '@react-email/html@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/img@0.0.11(react@19.1.1)': + '@react-email/img@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/link@0.0.12(react@19.1.1)': + '@react-email/link@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/markdown@0.0.15(react@19.1.1)': + '@react-email/markdown@0.0.15(react@19.2.0)': dependencies: - md-to-react-email: 5.0.5(react@19.1.1) - react: 19.1.1 + md-to-react-email: 5.0.5(react@19.2.0) + react: 19.2.0 - '@react-email/preview@0.0.13(react@19.1.1)': + '@react-email/preview@0.0.13(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/render@1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/render@1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-promise-suspense: 0.3.4 - '@react-email/row@0.0.12(react@19.1.1)': + '@react-email/row@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/section@0.0.16(react@19.1.1)': + '@react-email/section@0.0.16(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/tailwind@1.2.2(react@19.1.1)': + '@react-email/tailwind@1.2.2(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/text@0.1.5(react@19.1.1)': + '@react-email/text@0.1.5(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@rollup/pluginutils@5.3.0(rollup@4.50.1)': + '@rollup/pluginutils@5.3.0(rollup@4.52.4)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.1 + rollup: 4.52.4 - '@rollup/rollup-android-arm-eabi@4.50.1': + '@rollup/rollup-android-arm-eabi@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.50.1': + '@rollup/rollup-android-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.50.1': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.50.1': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.50.1': + '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-openharmony-arm64@4.50.1': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': + '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': optional: true '@scarf/scarf@1.4.0': {} @@ -15187,197 +15395,195 @@ snapshots: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 - '@smithy/abort-controller@4.1.1': + '@smithy/abort-controller@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/config-resolver@4.2.2': + '@smithy/config-resolver@4.3.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 - '@smithy/util-config-provider': 4.1.0 - '@smithy/util-middleware': 4.1.1 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@smithy/core@3.11.0': + '@smithy/core@3.15.0': dependencies: - '@smithy/middleware-serde': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-stream': 4.3.1 - '@smithy/util-utf8': 4.1.0 - '@types/uuid': 9.0.8 - tslib: 2.8.1 - uuid: 9.0.1 - - '@smithy/credential-provider-imds@4.1.2': - dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.2.1': + '@smithy/credential-provider-imds@4.2.0': dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/querystring-builder': 4.1.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 tslib: 2.8.1 - '@smithy/hash-node@4.1.1': + '@smithy/fetch-http-handler@5.3.1': dependencies: - '@smithy/types': 4.5.0 - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.1.1': + '@smithy/hash-node@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.0': + dependencies: + '@smithy/types': 4.6.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.1.0': + '@smithy/is-array-buffer@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.1.1': + '@smithy/middleware-content-length@4.2.0': dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.2': + '@smithy/middleware-endpoint@4.3.1': dependencies: - '@smithy/core': 3.11.0 - '@smithy/middleware-serde': 4.1.1 - '@smithy/node-config-provider': 4.2.2 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 - '@smithy/url-parser': 4.1.1 - '@smithy/util-middleware': 4.1.1 + '@smithy/core': 3.15.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.2': + '@smithy/middleware-retry@4.4.1': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/protocol-http': 5.2.1 - '@smithy/service-error-classification': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-retry': 4.1.1 - '@types/uuid': 9.0.8 - tslib: 2.8.1 - uuid: 9.0.1 - - '@smithy/middleware-serde@4.1.1': - dependencies: - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.1.1': + '@smithy/middleware-serde@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.2.2': + '@smithy/middleware-stack@4.2.0': dependencies: - '@smithy/property-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.2.0 - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.2.1': + '@smithy/node-config-provider@4.3.0': dependencies: - '@smithy/abort-controller': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/querystring-builder': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/property-provider@4.1.1': + '@smithy/node-http-handler@4.3.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/abort-controller': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/protocol-http@5.2.1': + '@smithy/property-provider@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.1.1': + '@smithy/protocol-http@5.3.0': dependencies: - '@smithy/types': 4.5.0 - '@smithy/util-uri-escape': 4.1.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.1.1': + '@smithy/querystring-builder@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 + '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.1.1': + '@smithy/querystring-parser@4.2.0': dependencies: - '@smithy/types': 4.5.0 - - '@smithy/shared-ini-file-loader@4.2.0': - dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/signature-v4@5.2.1': + '@smithy/service-error-classification@4.2.0': dependencies: - '@smithy/is-array-buffer': 4.1.0 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-hex-encoding': 4.1.0 - '@smithy/util-middleware': 4.1.1 - '@smithy/util-uri-escape': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/types': 4.6.0 + + '@smithy/shared-ini-file-loader@4.3.0': + dependencies: + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.2': + '@smithy/signature-v4@5.3.0': dependencies: - '@smithy/core': 3.11.0 - '@smithy/middleware-endpoint': 4.2.2 - '@smithy/middleware-stack': 4.1.1 - '@smithy/protocol-http': 5.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-stream': 4.3.1 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/types@4.5.0': + '@smithy/smithy-client@4.7.1': + dependencies: + '@smithy/core': 3.15.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-stack': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + + '@smithy/types@4.6.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.1.1': + '@smithy/url-parser@4.2.0': dependencies: - '@smithy/querystring-parser': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/querystring-parser': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-base64@4.1.0': + '@smithy/util-base64@4.3.0': dependencies: - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.1.0': + '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.1.0': + '@smithy/util-body-length-node@4.2.1': dependencies: tslib: 2.8.1 @@ -15386,66 +15592,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.1.0': + '@smithy/util-buffer-from@4.2.0': dependencies: - '@smithy/is-array-buffer': 4.1.0 + '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.1.0': + '@smithy/util-config-provider@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.2': + '@smithy/util-defaults-mode-browser@4.3.0': dependencies: - '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 - bowser: 2.12.1 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.2': + '@smithy/util-defaults-mode-node@4.2.1': dependencies: - '@smithy/config-resolver': 4.2.2 - '@smithy/credential-provider-imds': 4.1.2 - '@smithy/node-config-provider': 4.2.2 - '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.2 - '@smithy/types': 4.5.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.1.2': + '@smithy/util-endpoints@3.2.0': dependencies: - '@smithy/node-config-provider': 4.2.2 - '@smithy/types': 4.5.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.1.0': + '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.1.1': + '@smithy/util-middleware@4.2.0': dependencies: - '@smithy/types': 4.5.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-retry@4.1.1': + '@smithy/util-retry@4.2.0': dependencies: - '@smithy/service-error-classification': 4.1.1 - '@smithy/types': 4.5.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-stream@4.3.1': + '@smithy/util-stream@4.5.0': dependencies: - '@smithy/fetch-http-handler': 5.2.1 - '@smithy/node-http-handler': 4.2.1 - '@smithy/types': 4.5.0 - '@smithy/util-base64': 4.1.0 - '@smithy/util-buffer-from': 4.1.0 - '@smithy/util-hex-encoding': 4.1.0 - '@smithy/util-utf8': 4.1.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.1.0': + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 @@ -15454,9 +15659,13 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.1.0': + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': dependencies: - '@smithy/util-buffer-from': 4.1.0 tslib: 2.8.1 '@socket.io/component-emitter@3.1.2': {} @@ -15472,33 +15681,33 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': dependencies: acorn: 8.15.0 - '@sveltejs/adapter-static@3.0.9(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: - '@sveltejs/kit': 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/kit': 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) - '@sveltejs/enhanced-img@0.8.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.50.1)(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/enhanced-img@0.8.3(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) magic-string: 0.30.19 - sharp: 0.34.3 - svelte: 5.38.10 - svelte-parse-markup: 0.1.5(svelte@5.38.10) - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-imagetools: 8.0.0(rollup@4.50.1) - zimmerframe: 1.1.2 + sharp: 0.34.4 + svelte: 5.39.11 + svelte-parse-markup: 0.1.5(svelte@5.39.11) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-imagetools: 8.0.0(rollup@4.52.4) + zimmerframe: 1.1.4 transitivePeerDependencies: - rollup - supports-color - '@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@standard-schema/spec': 1.0.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -15510,29 +15719,29 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.2 - svelte: 5.38.10 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + svelte: 5.39.11 + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: '@opentelemetry/api': 1.9.0 - '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) debug: 4.4.3 - svelte: 5.38.10 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + svelte: 5.39.11 + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.19 - svelte: 5.38.10 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + svelte: 5.39.11 + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -15580,12 +15789,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.27.7) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.27.7) - '@svgr/core@8.1.0(typescript@5.9.2)': + '@svgr/core@8.1.0(typescript@5.9.3)': dependencies: '@babel/core': 7.27.7 '@svgr/babel-preset': 8.1.0(@babel/core@7.27.7) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -15596,35 +15805,35 @@ snapshots: '@babel/types': 7.28.4 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': dependencies: '@babel/core': 7.27.7 '@svgr/babel-preset': 8.1.0(@babel/core@7.27.7) - '@svgr/core': 8.1.0(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.9.2) - cosmiconfig: 8.3.6(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@5.9.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/webpack@8.1.0(typescript@5.9.2)': + '@svgr/webpack@8.1.0(typescript@5.9.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript @@ -15690,76 +15899,76 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.1.13': + '@tailwindcss/node@4.1.14': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 - jiti: 2.5.1 + jiti: 2.6.1 lightningcss: 1.30.1 magic-string: 0.30.19 source-map-js: 1.2.1 - tailwindcss: 4.1.13 + tailwindcss: 4.1.14 - '@tailwindcss/oxide-android-arm64@4.1.13': + '@tailwindcss/oxide-android-arm64@4.1.14': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.13': + '@tailwindcss/oxide-darwin-arm64@4.1.14': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.13': + '@tailwindcss/oxide-darwin-x64@4.1.14': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.13': + '@tailwindcss/oxide-freebsd-x64@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.13': + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.13': + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.13': + '@tailwindcss/oxide-linux-x64-musl@4.1.14': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.13': + '@tailwindcss/oxide-wasm32-wasi@4.1.14': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.13': + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': optional: true - '@tailwindcss/oxide@4.1.13': + '@tailwindcss/oxide@4.1.14': dependencies: - detect-libc: 2.1.0 - tar: 7.4.3 + detect-libc: 2.1.2 + tar: 7.5.1 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.13 - '@tailwindcss/oxide-darwin-arm64': 4.1.13 - '@tailwindcss/oxide-darwin-x64': 4.1.13 - '@tailwindcss/oxide-freebsd-x64': 4.1.13 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.13 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.13 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.13 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.13 - '@tailwindcss/oxide-linux-x64-musl': 4.1.13 - '@tailwindcss/oxide-wasm32-wasi': 4.1.13 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.13 + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 - '@tailwindcss/vite@4.1.13(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@tailwindcss/node': 4.1.13 - '@tailwindcss/oxide': 4.1.13 - tailwindcss: 4.1.13 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@testing-library/dom@10.4.0': dependencies: @@ -15781,13 +15990,13 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/svelte@5.2.8(svelte@5.38.10)(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@testing-library/svelte@5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@testing-library/dom': 10.4.0 - svelte: 5.38.10 + svelte: 5.39.11 optionalDependencies: - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -15829,7 +16038,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/archiver@6.0.3': dependencies: @@ -15841,16 +16050,16 @@ snapshots: '@types/bcrypt@6.0.0': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/braces@3.0.5': {} @@ -15871,21 +16080,21 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/compression@1.8.1': dependencies: '@types/express': 5.0.3 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/connect@3.4.38': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/content-disposition@0.5.9': {} @@ -15902,11 +16111,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.3 '@types/keygrip': 1.0.6 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/cors@2.8.19': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/debug@4.1.12': dependencies: @@ -15916,13 +16125,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ssh2': 1.15.5 - '@types/dockerode@3.3.42': + '@types/dockerode@3.3.44': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ssh2': 1.15.5 '@types/dom-to-image@2.6.7': {} @@ -15945,14 +16154,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -15978,7 +16187,7 @@ snapshots: '@types/fluent-ffmpeg@2.1.27': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/geojson-vt@3.2.5': dependencies: @@ -16010,7 +16219,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/inquirer@8.2.11': dependencies: @@ -16048,7 +16257,7 @@ snapshots: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/leaflet@1.9.20': dependencies: @@ -16060,8 +16269,6 @@ snapshots: '@types/lodash@4.17.20': {} - '@types/luxon@3.6.2': {} - '@types/luxon@3.7.1': {} '@types/mdast@4.0.4': @@ -16080,7 +16287,7 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ms@2.1.0': {} @@ -16090,11 +16297,11 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/node@17.0.45': {} - '@types/node@18.19.126': + '@types/node@18.19.130': dependencies: undici-types: 5.26.5 @@ -16102,19 +16309,19 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.8': + '@types/node@22.18.9': dependencies: undici-types: 6.21.0 - '@types/node@24.5.1': + '@types/node@24.7.1': dependencies: - undici-types: 7.12.0 + undici-types: 7.14.0 optional: true - '@types/nodemailer@7.0.1': + '@types/nodemailer@7.0.2': dependencies: - '@aws-sdk/client-sesv2': 3.890.0 - '@types/node': 22.18.8 + '@aws-sdk/client-sesv2': 3.907.0 + '@types/node': 22.18.9 transitivePeerDependencies: - aws-crt @@ -16122,7 +16329,7 @@ snapshots: dependencies: '@types/keygrip': 1.0.6 '@types/koa': 3.0.0 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/parse5@5.0.3': {} @@ -16132,7 +16339,7 @@ snapshots: '@types/pg@8.15.5': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -16140,13 +16347,13 @@ snapshots: '@types/pngjs@6.0.5': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/prismjs@1.26.5': {} '@types/qrcode@1.5.5': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/qs@6.14.0': {} @@ -16155,29 +16362,29 @@ snapshots: '@types/react-router-config@5.0.11': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router': 5.1.20 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@types/react@19.1.13': + '@types/react@19.2.2': dependencies: csstype: 3.1.3 '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 - '@types/retry@0.12.0': {} + '@types/retry@0.12.2': {} '@types/sanitize-html@2.16.0': dependencies: @@ -16185,14 +16392,14 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/semver@7.7.1': {} '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/serve-index@1.9.4': dependencies: @@ -16201,31 +16408,31 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.5': dependencies: - '@types/node': 18.19.126 + '@types/node': 18.19.130 '@types/superagent@8.1.9': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.18.8 + '@types/node': 22.18.9 form-data: 4.0.4 '@types/supercluster@7.1.3': @@ -16239,7 +16446,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/ua-parser-js@0.7.39': {} @@ -16247,15 +16454,13 @@ snapshots: '@types/unist@3.0.3': {} - '@types/uuid@9.0.8': {} - '@types/validator@13.15.3': {} '@types/whatwg-mimetype@3.0.2': {} '@types/ws@8.18.1': dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 '@types/yargs-parser@21.0.3': {} @@ -16263,41 +16468,41 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.45.0 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3 - eslint: 9.36.0(jiti@2.5.1) - typescript: 5.9.2 + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.45.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) '@typescript-eslint/types': 8.45.0 debug: 4.4.3 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -16306,48 +16511,48 @@ snapshots: '@typescript-eslint/types': 8.45.0 '@typescript-eslint/visitor-keys': 8.45.0 - '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.36.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + eslint: 9.37.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.45.0': {} - '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.45.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.45.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) '@typescript-eslint/types': 8.45.0 '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -16358,7 +16563,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16373,11 +16578,11 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16392,7 +16597,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -16404,21 +16609,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -16526,14 +16731,14 @@ snapshots: '@xtuc/long@4.2.2': {} - '@zoom-image/core@0.41.0': + '@zoom-image/core@0.41.3': dependencies: '@namnode/store': 0.1.0 - '@zoom-image/svelte@0.3.4(svelte@5.38.10)': + '@zoom-image/svelte@0.3.7(svelte@5.39.11)': dependencies: - '@zoom-image/core': 0.41.0 - svelte: 5.38.10 + '@zoom-image/core': 0.41.3 + svelte: 5.39.11 abab@2.0.6: optional: true @@ -16622,30 +16827,31 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch-helper@3.26.0(algoliasearch@5.29.0): + algoliasearch-helper@3.26.0(algoliasearch@5.40.0): dependencies: '@algolia/events': 4.0.1 - algoliasearch: 5.29.0 + algoliasearch: 5.40.0 - algoliasearch@5.29.0: + algoliasearch@5.40.0: dependencies: - '@algolia/client-abtesting': 5.29.0 - '@algolia/client-analytics': 5.29.0 - '@algolia/client-common': 5.29.0 - '@algolia/client-insights': 5.29.0 - '@algolia/client-personalization': 5.29.0 - '@algolia/client-query-suggestions': 5.29.0 - '@algolia/client-search': 5.29.0 - '@algolia/ingestion': 1.29.0 - '@algolia/monitoring': 1.29.0 - '@algolia/recommend': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 + '@algolia/abtesting': 1.6.0 + '@algolia/client-abtesting': 5.40.0 + '@algolia/client-analytics': 5.40.0 + '@algolia/client-common': 5.40.0 + '@algolia/client-insights': 5.40.0 + '@algolia/client-personalization': 5.40.0 + '@algolia/client-query-suggestions': 5.40.0 + '@algolia/client-search': 5.40.0 + '@algolia/ingestion': 1.40.0 + '@algolia/monitoring': 1.40.0 + '@algolia/recommend': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 ansi-align@3.0.1: dependencies: @@ -16745,7 +16951,7 @@ snapshots: ast-v8-to-istanbul@0.3.3: dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -16769,8 +16975,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.3 - caniuse-lite: 1.0.30001735 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001749 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -16781,12 +16987,12 @@ snapshots: b4a@1.6.7: {} - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.100.2): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.102.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.100.2 + schema-utils: 4.3.3 + webpack: 5.102.1 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -16822,35 +17028,43 @@ snapshots: balanced-match@1.0.2: {} - bare-events@2.6.1: - optional: true + bare-events@2.7.0: {} - bare-fs@4.2.0: + bare-fs@4.4.7: dependencies: - bare-events: 2.6.1 + bare-events: 2.7.0 bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.6.1) + bare-stream: 2.7.0(bare-events@2.7.0) + bare-url: 2.2.2 + fast-fifo: 1.3.2 optional: true - bare-os@3.6.1: + bare-os@3.6.2: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.6.1 + bare-os: 3.6.2 optional: true - bare-stream@2.7.0(bare-events@2.6.1): + bare-stream@2.7.0(bare-events@2.7.0): dependencies: - streamx: 2.22.1 + streamx: 2.23.0 optionalDependencies: - bare-events: 2.6.1 + bare-events: 2.7.0 + optional: true + + bare-url@2.2.2: + dependencies: + bare-path: 3.0.0 optional: true base64-js@1.5.1: {} base64id@2.0.0: {} + baseline-browser-mapping@2.8.15: {} + batch-cluster@13.0.0: {} batch@0.6.1: {} @@ -16870,15 +17084,15 @@ snapshots: binary-extensions@2.3.0: {} - bits-ui@2.9.8(@internationalized/date@3.8.2)(svelte@5.38.10): + bits-ui@2.9.8(@internationalized/date@3.8.2)(svelte@5.39.11): dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.4 '@internationalized/date': 3.8.2 esm-env: 1.2.2 - runed: 0.29.2(svelte@5.38.10) - svelte: 5.38.10 - svelte-toolbelt: 0.9.3(svelte@5.38.10) + runed: 0.29.2(svelte@5.39.11) + svelte: 5.39.11 + svelte-toolbelt: 0.9.3(svelte@5.39.11) tabbable: 6.2.0 bl@4.1.0: @@ -16962,12 +17176,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.3: + browserslist@4.26.3: dependencies: - caniuse-lite: 1.0.30001735 - electron-to-chromium: 1.5.207 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.3) + baseline-browser-mapping: 2.8.15 + caniuse-lite: 1.0.30001749 + electron-to-chromium: 1.5.233 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) buffer-crc32@1.0.0: {} @@ -16988,18 +17203,22 @@ snapshots: builtin-modules@5.0.0: {} - bullmq@5.58.5: + bullmq@5.60.0: dependencies: cron-parser: 4.9.0 - ioredis: 5.7.0 + ioredis: 5.8.0 msgpackr: 1.11.5 node-abort-controller: 3.1.1 - semver: 7.7.2 + semver: 7.7.3 tslib: 2.8.1 - uuid: 9.0.1 + uuid: 11.1.0 transitivePeerDependencies: - supports-color + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -17026,7 +17245,7 @@ snapshots: minipass-pipeline: 1.2.4 p-map: 7.0.3 ssri: 12.0.0 - tar: 7.4.3 + tar: 7.5.1 unique-filename: 4.0.0 cacheable-lookup@7.0.0: {} @@ -17075,12 +17294,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.25.3 - caniuse-lite: 1.0.30001735 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001749 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001735: {} + caniuse-lite@1.0.30001749: {} canvas@2.11.2: dependencies: @@ -17272,18 +17491,8 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - color-support@1.1.3: {} - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - colord@2.9.3: {} colorette@2.0.20: {} @@ -17316,13 +17525,11 @@ snapshots: commander@8.3.0: {} - comment-json@4.2.5: + comment-json@4.4.1: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 - has-own-prop: 2.0.0 - repeat-string: 1.6.1 common-path-prefix@3.0.0: {} @@ -17420,21 +17627,19 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - copy-text-to-clipboard@3.2.0: {} - - copy-webpack-plugin@11.0.0(webpack@5.100.2): + copy-webpack-plugin@11.0.0(webpack@5.102.1): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 globby: 13.2.2 normalize-path: 3.0.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.100.2 + webpack: 5.102.1 core-js-compat@3.45.0: dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 core-js-pure@3.43.0: {} @@ -17456,14 +17661,14 @@ snapshots: optionalDependencies: typescript: 5.8.3 - cosmiconfig@8.3.6(typescript@5.9.2): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 cpu-features@0.0.10: dependencies: @@ -17482,10 +17687,10 @@ snapshots: dependencies: luxon: 3.7.2 - cron@4.3.0: + cron@4.3.3: dependencies: - '@types/luxon': 3.6.2 - luxon: 3.6.1 + '@types/luxon': 3.7.1 + luxon: 3.7.2 cross-spawn@7.0.6: dependencies: @@ -17513,7 +17718,7 @@ snapshots: postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.100.2): + css-loader@6.11.0(webpack@5.102.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -17522,19 +17727,19 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.100.2 + webpack: 5.102.1 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.100.2): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.102.1): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 cssnano: 6.1.2(postcss@8.5.6) jest-worker: 29.7.0 postcss: 8.5.6 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.100.2 + webpack: 5.102.1 optionalDependencies: clean-css: 5.3.3 @@ -17583,7 +17788,7 @@ snapshots: cssnano-preset-advanced@6.1.2(postcss@8.5.6): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) - browserslist: 4.25.3 + browserslist: 4.26.3 cssnano-preset-default: 6.1.2(postcss@8.5.6) postcss: 8.5.6 postcss-discard-unused: 6.0.5(postcss@8.5.6) @@ -17593,7 +17798,7 @@ snapshots: cssnano-preset-default@6.1.2(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 css-declaration-sorter: 7.2.0(postcss@8.5.6) cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 @@ -17727,9 +17932,12 @@ snapshots: deepmerge@4.3.1: {} - default-gateway@6.0.3: + default-browser-id@5.0.0: {} + + default-browser@5.2.1: dependencies: - execa: 5.1.1 + bundle-name: 4.1.0 + default-browser-id: 5.0.0 defaults@1.0.4: dependencies: @@ -17745,6 +17953,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -17767,7 +17977,7 @@ snapshots: detect-europe-js@0.1.2: {} - detect-libc@2.1.0: {} + detect-libc@2.1.2: {} detect-node@2.1.0: {} @@ -17809,7 +18019,7 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - docker-compose@1.2.0: + docker-compose@1.3.0: dependencies: yaml: 2.8.1 @@ -17818,25 +18028,25 @@ snapshots: debug: 4.4.3 readable-stream: 3.6.2 split-ca: 1.0.1 - ssh2: 1.16.0 + ssh2: 1.17.0 transitivePeerDependencies: - supports-color - dockerode@4.0.7: + dockerode@4.0.9: dependencies: '@balena/dockerignore': 1.0.2 - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.0 '@grpc/proto-loader': 0.7.15 docker-modem: 5.0.6 protobufjs: 7.5.4 - tar-fs: 2.1.3 + tar-fs: 2.1.4 uuid: 10.0.0 transitivePeerDependencies: - supports-color - docusaurus-lunr-search@3.6.0(@docusaurus/core@3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + docusaurus-lunr-search@3.6.0(@docusaurus/core@3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@18.3.1))(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.2) + '@docusaurus/core': 3.9.1(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) autocomplete.js: 0.37.1 clsx: 2.1.1 gauge: 3.0.2 @@ -17912,7 +18122,7 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@17.2.2: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -17930,7 +18140,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.207: {} + electron-to-chromium@1.5.233: {} emoji-regex@10.5.0: {} @@ -17974,7 +18184,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.18.8 + '@types/node': 22.18.9 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -17990,7 +18200,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.3.0 entities@2.2.0: {} @@ -18060,7 +18270,7 @@ snapshots: '@types/estree-jsx': 1.0.5 acorn: 8.15.0 esast-util-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 esbuild@0.19.12: optionalDependencies: @@ -18088,34 +18298,34 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -18138,60 +18348,60 @@ snapshots: source-map: 0.6.1 optional: true - eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)): + eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) - eslint-plugin-compat@6.0.2(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-compat@6.0.2(eslint@9.37.0(jiti@2.6.1)): dependencies: '@mdn/browser-compat-data': 5.7.6 ast-metadata-inferer: 0.8.1 - browserslist: 4.25.3 - caniuse-lite: 1.0.30001735 - eslint: 9.36.0(jiti@2.5.1) + browserslist: 4.26.3 + caniuse-lite: 1.0.30001749 + eslint: 9.37.0(jiti@2.6.1) find-up: 5.0.0 globals: 15.15.0 lodash.memoize: 4.1.2 - semver: 7.7.2 + semver: 7.7.3 - eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1))(prettier@3.6.2): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + eslint-config-prettier: 10.1.8(eslint@9.37.0(jiti@2.6.1)) - eslint-plugin-svelte@3.12.4(eslint@9.36.0(jiti@2.5.1))(svelte@5.38.10): + eslint-plugin-svelte@3.12.4(eslint@9.37.0(jiti@2.6.1))(svelte@5.39.11): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) esutils: 2.0.3 globals: 16.4.0 known-css-properties: 0.37.0 postcss: 8.5.6 postcss-load-config: 3.1.4(postcss@8.5.6) postcss-safe-parser: 7.0.1(postcss@8.5.6) - semver: 7.7.2 - svelte-eslint-parser: 1.3.3(svelte@5.38.10) + semver: 7.7.3 + svelte-eslint-parser: 1.3.3(svelte@5.39.11) optionalDependencies: - svelte: 5.38.10 + svelte: 5.39.11 transitivePeerDependencies: - ts-node - eslint-plugin-unicorn@60.0.0(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-unicorn@60.0.0(eslint@9.37.0(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint/plugin-kit': 0.3.5 change-case: 5.4.4 ci-info: 4.3.0 clean-regexp: 1.0.0 core-js-compat: 3.45.0 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) esquery: 1.6.0 find-up-simple: 1.0.1 globals: 16.4.0 @@ -18201,19 +18411,19 @@ snapshots: pluralize: 8.0.0 regexp-tree: 0.1.27 regjsparser: 0.12.0 - semver: 7.7.2 + semver: 7.7.3 strip-indent: 4.0.0 - eslint-plugin-unicorn@61.0.2(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-unicorn@61.0.2(eslint@9.37.0(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint/plugin-kit': 0.3.5 change-case: 5.4.4 ci-info: 4.3.0 clean-regexp: 1.0.0 core-js-compat: 3.45.0 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.37.0(jiti@2.6.1) esquery: 1.6.0 find-up-simple: 1.0.1 globals: 16.4.0 @@ -18223,7 +18433,7 @@ snapshots: pluralize: 8.0.0 regexp-tree: 0.1.27 regjsparser: 0.12.0 - semver: 7.7.2 + semver: 7.7.3 strip-indent: 4.0.0 eslint-scope@5.1.1: @@ -18240,16 +18450,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.36.0(jiti@2.5.1): + eslint@9.37.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.36.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -18278,7 +18488,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -18337,7 +18547,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 estree-util-value-to-estree@3.4.0: dependencies: @@ -18364,7 +18574,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 require-like: 0.1.2 event-emitter@0.3.5: @@ -18376,6 +18586,10 @@ snapshots: eventemitter3@4.0.7: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.7.0 + events@3.3.0: {} execa@5.1.1: @@ -18527,7 +18741,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-xml-parser@5.2.5: dependencies: @@ -18563,11 +18777,11 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-loader@6.2.0(webpack@5.100.2): + file-loader@6.2.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2 + webpack: 5.102.1 file-source@0.6.1: dependencies: @@ -18664,8 +18878,8 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 + semver: 7.7.3 + tapable: 2.3.0 typescript: 5.8.3 webpack: 5.100.2(@swc/core@1.13.5(@swc/helpers@0.5.17)) @@ -18806,6 +19020,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.4.5: @@ -18922,8 +19140,6 @@ snapshots: has-flag@4.0.0: {} - has-own-prop@2.0.0: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -19042,7 +19258,7 @@ snapshots: space-separated-tokens: 2.0.2 style-to-js: 1.1.17 unist-util-position: 5.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -19088,6 +19304,8 @@ snapshots: he@1.2.0: {} + highlight.js@11.11.1: {} + history@4.10.1: dependencies: '@babel/runtime': 7.28.4 @@ -19123,8 +19341,6 @@ snapshots: whatwg-encoding: 3.1.1 optional: true - html-entities@2.6.0: {} - html-escaper@2.0.2: {} html-minifier-terser@6.1.0: @@ -19159,15 +19375,15 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.100.2): + html-webpack-plugin@5.6.3(webpack@5.102.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.2 + tapable: 2.3.0 optionalDependencies: - webpack: 5.100.2 + webpack: 5.102.1 htmlparser2@6.1.0: dependencies: @@ -19274,6 +19490,8 @@ snapshots: human-signals@2.1.0: {} + hyperdyperid@1.2.0: {} + i18n-iso-countries@7.14.0: dependencies: diacritics: 1.3.0 @@ -19311,7 +19529,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.14.2: + import-in-the-middle@1.14.4: dependencies: acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -19343,9 +19561,9 @@ snapshots: inline-style-parser@0.2.4: {} - inquirer@8.2.7(@types/node@22.18.8): + inquirer@8.2.7(@types/node@22.18.9): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.9) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -19365,20 +19583,20 @@ snapshots: internmap@2.0.3: {} - intl-messageformat@10.7.16: + intl-messageformat@10.7.17: dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.5 '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 + '@formatjs/icu-messageformat-parser': 2.11.3 tslib: 2.8.1 invariant@2.2.4: dependencies: loose-envify: 1.4.0 - ioredis@5.7.0: + ioredis@5.8.0: dependencies: - '@ioredis/commands': 1.3.0 + '@ioredis/commands': 1.4.0 cluster-key-slot: 1.1.2 debug: 4.4.3 denque: 2.1.0 @@ -19405,8 +19623,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -19429,6 +19645,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -19441,6 +19659,10 @@ snapshots: is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 @@ -19450,6 +19672,8 @@ snapshots: is-interactive@2.0.0: {} + is-network-error@1.3.0: {} + is-npm@6.0.0: {} is-number@7.0.0: {} @@ -19501,6 +19725,10 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + is-yarn-global@0.4.1: {} isarray@0.0.1: {} @@ -19523,7 +19751,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -19549,7 +19777,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.8 + '@types/node': 22.18.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -19557,13 +19785,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -19572,7 +19800,7 @@ snapshots: jiti@2.4.2: {} - jiti@2.5.1: {} + jiti@2.6.1: {} joi@17.13.3: dependencies: @@ -19831,7 +20059,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -19854,7 +20082,7 @@ snapshots: load-tsconfig@0.2.5: {} - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} loader-utils@2.0.4: dependencies: @@ -19941,8 +20169,6 @@ snapshots: lunr@2.3.9: {} - luxon@3.6.1: {} - luxon@3.7.2: {} lz-string@1.5.0: {} @@ -19967,7 +20193,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-fetch-happen@14.0.3: dependencies: @@ -20010,7 +20236,7 @@ snapshots: tinyqueue: 2.0.3 vt-pbf: 3.1.3 - maplibre-gl@5.7.1: + maplibre-gl@5.8.0: dependencies: '@mapbox/geojson-rewind': 0.5.2 '@mapbox/jsonlint-lines-primitives': 2.0.2 @@ -20019,7 +20245,7 @@ snapshots: '@mapbox/unitbezier': 0.0.1 '@mapbox/vector-tile': 2.0.4 '@mapbox/whoots-js': 3.1.0 - '@maplibre/maplibre-gl-style-spec': 23.3.0 + '@maplibre/maplibre-gl-style-spec': 24.2.0 '@maplibre/vt-pbf': 4.0.3 '@types/geojson': 7946.0.16 '@types/geojson-vt': 3.2.5 @@ -20049,10 +20275,10 @@ snapshots: math-intrinsics@1.1.0: {} - md-to-react-email@5.0.5(react@19.1.1): + md-to-react-email@5.0.5(react@19.2.0): dependencies: marked: 7.0.4 - react: 19.1.1 + react: 19.2.0 mdast-util-directive@3.1.0: dependencies: @@ -20184,7 +20410,7 @@ snapshots: parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -20254,6 +20480,15 @@ snapshots: dependencies: fs-monkey: 1.1.0 + memfs@4.49.0: + dependencies: + '@jsonjoy.com/json-pack': 1.20.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + memoizee@0.4.17: dependencies: d: 1.0.2 @@ -20391,7 +20626,7 @@ snapshots: micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-extension-mdx-md@2.0.0: dependencies: @@ -20407,7 +20642,7 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-extension-mdxjs@3.0.0: dependencies: @@ -20443,7 +20678,7 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-factory-space@1.1.0: dependencies: @@ -20515,7 +20750,7 @@ snapshots: estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-util-html-tag-name@2.0.1: {} @@ -20610,11 +20845,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.2(webpack@5.100.2): + mini-css-extract-plugin@2.9.2(webpack@5.102.1): dependencies: - schema-utils: 4.3.2 - tapable: 2.2.2 - webpack: 5.100.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.102.1 minimalistic-assert@1.0.1: {} @@ -20644,7 +20879,7 @@ snapshots: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 - minizlib: 3.0.2 + minizlib: 3.1.0 optionalDependencies: encoding: 0.1.13 @@ -20673,7 +20908,7 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - minizlib@3.0.2: + minizlib@3.1.0: dependencies: minipass: 7.1.2 @@ -20687,8 +20922,6 @@ snapshots: mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - mnemonist@0.40.3: dependencies: obliterator: 2.0.5 @@ -20774,16 +21007,16 @@ snapshots: neo-async@2.6.2: {} - nest-commander@3.19.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.8)(typescript@5.9.2): + nest-commander@3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.9)(typescript@5.9.3): dependencies: '@fig/complete-commander': 3.2.0(commander@11.1.0) - '@golevelup/nestjs-discovery': 4.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) + '@golevelup/nestjs-discovery': 5.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@types/inquirer': 8.2.11 commander: 11.1.0 - cosmiconfig: 8.3.6(typescript@5.9.2) - inquirer: 8.2.7(@types/node@22.18.8) + cosmiconfig: 8.3.6(typescript@5.9.3) + inquirer: 8.2.7(@types/node@22.18.9) transitivePeerDependencies: - '@types/node' - typescript @@ -20851,7 +21084,7 @@ snapshots: node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 optional: true node-gyp-build@4.8.4: {} @@ -20864,14 +21097,14 @@ snapshots: make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 - tar: 7.4.3 + semver: 7.7.3 + tar: 7.5.1 tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: - supports-color - node-releases@2.0.19: {} + node-releases@2.0.23: {} nodemailer@7.0.7: {} @@ -20914,11 +21147,11 @@ snapshots: dependencies: boolbase: 1.0.0 - null-loader@4.0.1(webpack@5.100.2): + null-loader@4.0.1(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2 + webpack: 5.102.1 nwsapi@2.2.22: optional: true @@ -20931,7 +21164,7 @@ snapshots: pkg-types: 2.3.0 tinyexec: 0.3.2 - oauth4webapi@3.8.1: {} + oauth4webapi@3.8.2: {} object-assign@4.1.1: {} @@ -20987,6 +21220,13 @@ snapshots: dependencies: mimic-function: 5.0.1 + open@10.2.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -20995,10 +21235,10 @@ snapshots: opener@1.5.2: {} - openid-client@6.8.0: + openid-client@6.8.1: dependencies: jose: 6.1.0 - oauth4webapi: 3.8.1 + oauth4webapi: 3.8.2 optionator@0.9.4: dependencies: @@ -21072,9 +21312,10 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 - p-retry@4.6.2: + p-retry@6.2.1: dependencies: - '@types/retry': 0.12.0 + '@types/retry': 0.12.2 + is-network-error: 1.3.0 retry: 0.13.1 p-timeout@3.2.0: @@ -21090,7 +21331,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.2 + semver: 7.7.3 param-case@3.0.4: dependencies: @@ -21258,11 +21499,11 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 - playwright-core@1.55.0: {} + playwright-core@1.55.1: {} - playwright@1.55.0: + playwright@1.55.1: dependencies: - playwright-core: 1.55.0 + playwright-core: 1.55.1 optionalDependencies: fsevents: 2.3.2 @@ -21324,7 +21565,7 @@ snapshots: postcss-colormin@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -21332,7 +21573,7 @@ snapshots: postcss-convert-values@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -21446,20 +21687,21 @@ snapshots: optionalDependencies: postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 - yaml: 2.8.1 optionalDependencies: - postcss: 8.5.6 - - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.100.2): - dependencies: - cosmiconfig: 8.3.6(typescript@5.9.2) jiti: 1.21.7 postcss: 8.5.6 - semver: 7.7.2 - webpack: 5.100.2 + yaml: 2.8.1 + + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.3)(webpack@5.102.1): + dependencies: + cosmiconfig: 8.3.6(typescript@5.9.3) + jiti: 1.21.7 + postcss: 8.5.6 + semver: 7.7.3 + webpack: 5.102.1 transitivePeerDependencies: - typescript @@ -21482,7 +21724,7 @@ snapshots: postcss-merge-rules@6.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 caniuse-api: 3.0.0 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 @@ -21502,7 +21744,7 @@ snapshots: postcss-minify-params@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -21576,7 +21818,7 @@ snapshots: postcss-normalize-unicode@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -21650,7 +21892,7 @@ snapshots: '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.6) '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.6) autoprefixer: 10.4.21(postcss@8.5.6) - browserslist: 4.25.3 + browserslist: 4.26.3 css-blank-pseudo: 7.0.1(postcss@8.5.6) css-has-pseudo: 7.0.2(postcss@8.5.6) css-prefers-color-scheme: 10.0.0(postcss@8.5.6) @@ -21694,7 +21936,7 @@ snapshots: postcss-reduce-initial@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -21780,19 +22022,19 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-organize-imports@4.2.0(prettier@3.6.2)(typescript@5.9.2): + prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3): dependencies: prettier: 3.6.2 - typescript: 5.9.2 + typescript: 5.9.3 prettier-plugin-sort-json@4.1.1(prettier@3.6.2): dependencies: prettier: 3.6.2 - prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.10): + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.39.11): dependencies: prettier: 3.6.2 - svelte: 5.38.10 + svelte: 5.39.11 prettier@3.6.2: {} @@ -21871,7 +22113,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.18.8 + '@types/node': 22.18.9 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -21955,11 +22197,11 @@ snapshots: iconv-lite: 0.7.0 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.100.2): + raw-loader@4.0.2(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2 + webpack: 5.102.1 rc@1.2.8: dependencies: @@ -21974,19 +22216,19 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-dom@19.1.1(react@19.1.1): + react-dom@19.2.0(react@19.2.0): dependencies: - react: 19.1.1 - scheduler: 0.26.0 + react: 19.2.0 + scheduler: 0.27.0 - react-email@4.2.11: + react-email@4.2.12: dependencies: '@babel/parser': 7.28.4 '@babel/traverse': 7.28.4 chokidar: 4.0.3 commander: 13.1.0 debounce: 2.2.0 - esbuild: 0.25.9 + esbuild: 0.25.10 glob: 11.0.3 jiti: 2.4.2 log-symbols: 7.0.1 @@ -22012,11 +22254,11 @@ snapshots: dependencies: react: 18.3.1 - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.100.2): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.102.1): dependencies: '@babel/runtime': 7.28.4 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.100.2 + webpack: 5.102.1 react-promise-suspense@0.3.4: dependencies: @@ -22056,7 +22298,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - react@19.1.1: {} + react@19.2.0: {} read-cache@1.0.0: dependencies: @@ -22102,15 +22344,14 @@ snapshots: estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.15.0): + recma-jsx@1.0.1(acorn@8.15.0): dependencies: + acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 unified: 11.0.5 - transitivePeerDependencies: - - acorn recma-parse@1.0.0: dependencies: @@ -22228,7 +22469,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.1.0: + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -22335,40 +22576,41 @@ snapshots: robust-predicates@3.0.2: {} - rollup-plugin-visualizer@6.0.3(rollup@4.50.1): + rollup-plugin-visualizer@6.0.4(rollup@4.52.4): dependencies: open: 8.4.2 picomatch: 4.0.3 - source-map: 0.7.4 + source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.50.1 + rollup: 4.52.4 - rollup@4.50.1: + rollup@4.52.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.1 - '@rollup/rollup-android-arm64': 4.50.1 - '@rollup/rollup-darwin-arm64': 4.50.1 - '@rollup/rollup-darwin-x64': 4.50.1 - '@rollup/rollup-freebsd-arm64': 4.50.1 - '@rollup/rollup-freebsd-x64': 4.50.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 - '@rollup/rollup-linux-arm-musleabihf': 4.50.1 - '@rollup/rollup-linux-arm64-gnu': 4.50.1 - '@rollup/rollup-linux-arm64-musl': 4.50.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 - '@rollup/rollup-linux-ppc64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-musl': 4.50.1 - '@rollup/rollup-linux-s390x-gnu': 4.50.1 - '@rollup/rollup-linux-x64-gnu': 4.50.1 - '@rollup/rollup-linux-x64-musl': 4.50.1 - '@rollup/rollup-openharmony-arm64': 4.50.1 - '@rollup/rollup-win32-arm64-msvc': 4.50.1 - '@rollup/rollup-win32-ia32-msvc': 4.50.1 - '@rollup/rollup-win32-x64-msvc': 4.50.1 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 router@2.2.0: @@ -22391,16 +22633,18 @@ snapshots: postcss: 8.5.6 strip-json-comments: 3.1.1 + run-applescript@7.1.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - runed@0.29.2(svelte@5.38.10): + runed@0.29.2(svelte@5.39.11): dependencies: esm-env: 1.2.2 - svelte: 5.38.10 + svelte: 5.39.11 rw@1.3.3: {} @@ -22446,7 +22690,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - scheduler@0.26.0: {} + scheduler@0.27.0: {} schema-dts@1.1.5: {} @@ -22456,7 +22700,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -22483,11 +22727,11 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} send@0.19.0: dependencies: @@ -22599,36 +22843,36 @@ snapshots: stream-source: 0.3.5 text-encoding: 0.6.4 - sharp@0.34.3: + sharp@0.34.4: dependencies: - color: 4.2.3 - detect-libc: 2.1.0 + '@img/colour': 1.0.0 + detect-libc: 2.1.2 node-addon-api: 8.5.0 node-gyp: 11.4.2 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.3 - '@img/sharp-darwin-x64': 0.34.3 - '@img/sharp-libvips-darwin-arm64': 1.2.0 - '@img/sharp-libvips-darwin-x64': 1.2.0 - '@img/sharp-libvips-linux-arm': 1.2.0 - '@img/sharp-libvips-linux-arm64': 1.2.0 - '@img/sharp-libvips-linux-ppc64': 1.2.0 - '@img/sharp-libvips-linux-s390x': 1.2.0 - '@img/sharp-libvips-linux-x64': 1.2.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - '@img/sharp-linux-arm': 0.34.3 - '@img/sharp-linux-arm64': 0.34.3 - '@img/sharp-linux-ppc64': 0.34.3 - '@img/sharp-linux-s390x': 0.34.3 - '@img/sharp-linux-x64': 0.34.3 - '@img/sharp-linuxmusl-arm64': 0.34.3 - '@img/sharp-linuxmusl-x64': 0.34.3 - '@img/sharp-wasm32': 0.34.3 - '@img/sharp-win32-arm64': 0.34.3 - '@img/sharp-win32-ia32': 0.34.3 - '@img/sharp-win32-x64': 0.34.3 + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 transitivePeerDependencies: - supports-color @@ -22684,11 +22928,7 @@ snapshots: simple-concat: 1.0.1 optional: true - simple-icons@15.15.0: {} - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 + simple-icons@15.16.0: {} sirv@2.0.4: dependencies: @@ -22801,6 +23041,8 @@ snapshots: source-map@0.7.4: {} + source-map@0.7.6: {} + space-separated-tokens@1.1.5: {} space-separated-tokens@2.0.2: {} @@ -22832,7 +23074,7 @@ snapshots: sprintf-js@1.0.3: {} - sql-formatter@15.6.9: + sql-formatter@15.6.10: dependencies: argparse: 2.0.1 nearley: 2.20.1 @@ -22842,9 +23084,9 @@ snapshots: ssh-remote-port-forward@1.0.4: dependencies: '@types/ssh2': 0.5.52 - ssh2: 1.16.0 + ssh2: 1.17.0 - ssh2@1.16.0: + ssh2@1.17.0: dependencies: asn1: 0.2.6 bcrypt-pbkdf: 1.0.2 @@ -22874,12 +23116,11 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.22.1: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.1 string-width@4.2.3: dependencies: @@ -22964,7 +23205,7 @@ snapshots: stylehacks@6.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 postcss: 8.5.6 postcss-selector-parser: 6.1.2 @@ -23017,19 +23258,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.1(picomatch@4.0.3)(svelte@5.38.10)(typescript@5.9.2): + svelte-check@4.3.2(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.38.10 - typescript: 5.9.2 + svelte: 5.39.11 + typescript: 5.9.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@1.3.3(svelte@5.38.10): + svelte-eslint-parser@1.3.3(svelte@5.39.11): dependencies: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -23038,50 +23279,54 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.6) postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 5.38.10 + svelte: 5.39.11 svelte-gestures@5.2.2: {} - svelte-i18n@4.0.1(svelte@5.38.10): + svelte-highlight@7.8.4: + dependencies: + highlight.js: 11.11.1 + + svelte-i18n@4.0.1(svelte@5.39.11): dependencies: cli-color: 2.0.4 deepmerge: 4.3.1 esbuild: 0.19.12 estree-walker: 2.0.2 - intl-messageformat: 10.7.16 + intl-messageformat: 10.7.17 sade: 1.8.1 - svelte: 5.38.10 + svelte: 5.39.11 tiny-glob: 0.2.9 - svelte-maplibre@1.2.1(svelte@5.38.10): + svelte-maplibre@1.2.1(svelte@5.39.11): dependencies: d3-geo: 3.1.1 dequal: 2.0.3 just-compare: 2.3.0 - maplibre-gl: 5.7.1 + maplibre-gl: 5.8.0 pmtiles: 3.2.1 - svelte: 5.38.10 + svelte: 5.39.11 - svelte-parse-markup@0.1.5(svelte@5.38.10): + svelte-parse-markup@0.1.5(svelte@5.39.11): dependencies: - svelte: 5.38.10 + svelte: 5.39.11 - svelte-persisted-store@0.12.0(svelte@5.38.10): + svelte-persisted-store@0.12.0(svelte@5.39.11): dependencies: - svelte: 5.38.10 + svelte: 5.39.11 - svelte-toolbelt@0.9.3(svelte@5.38.10): + svelte-toolbelt@0.9.3(svelte@5.39.11): dependencies: clsx: 2.1.1 - runed: 0.29.2(svelte@5.38.10) + runed: 0.29.2(svelte@5.39.11) style-to-object: 1.0.9 - svelte: 5.38.10 + svelte: 5.39.11 - svelte@5.38.10: + svelte@5.39.11: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) '@types/estree': 1.0.8 acorn: 8.15.0 aria-query: 5.3.2 @@ -23092,7 +23337,7 @@ snapshots: is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.19 - zimmerframe: 1.1.2 + zimmerframe: 1.1.4 svg-parser@2.0.4: {} @@ -23125,27 +23370,27 @@ snapshots: tailwind-merge@3.3.1: {} - tailwind-variants@3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.13): + tailwind-variants@3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.14): dependencies: - tailwindcss: 4.1.13 + tailwindcss: 4.1.14 optionalDependencies: tailwind-merge: 3.3.1 - tailwindcss-email-variants@3.0.4(tailwindcss@3.4.17): + tailwindcss-email-variants@3.0.4(tailwindcss@3.4.18(yaml@2.8.1)): dependencies: - tailwindcss: 3.4.17 + tailwindcss: 3.4.18(yaml@2.8.1) - tailwindcss-mso@2.0.2(tailwindcss@3.4.17): + tailwindcss-mso@2.0.2(tailwindcss@3.4.18(yaml@2.8.1)): dependencies: - tailwindcss: 3.4.17 + tailwindcss: 3.4.18(yaml@2.8.1) - tailwindcss-preset-email@1.4.0(tailwindcss@3.4.17): + tailwindcss-preset-email@1.4.0(tailwindcss@3.4.18(yaml@2.8.1)): dependencies: - tailwindcss: 3.4.17 - tailwindcss-email-variants: 3.0.4(tailwindcss@3.4.17) - tailwindcss-mso: 2.0.2(tailwindcss@3.4.17) + tailwindcss: 3.4.18(yaml@2.8.1) + tailwindcss-email-variants: 3.0.4(tailwindcss@3.4.18(yaml@2.8.1)) + tailwindcss-mso: 2.0.2(tailwindcss@3.4.18(yaml@2.8.1)) - tailwindcss@3.4.17: + tailwindcss@3.4.18(yaml@2.8.1): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -23164,31 +23409,32 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - - ts-node + - tsx + - yaml - tailwindcss@4.1.13: {} + tailwindcss@4.1.14: {} - tapable@2.2.2: {} + tapable@2.3.0: {} - tar-fs@2.1.3: + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.3 tar-stream: 2.2.0 - tar-fs@3.1.0: + tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.0 + bare-fs: 4.4.7 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer @@ -23205,7 +23451,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.22.1 + streamx: 2.23.0 tar@6.2.1: dependencies: @@ -23216,34 +23462,33 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.4.3: + tar@7.5.1: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 + minizlib: 3.1.0 yallist: 5.0.0 terser-webpack-plugin@5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.43.1 webpack: 5.100.2(@swc/core@1.13.5(@swc/helpers@0.5.17)) optionalDependencies: '@swc/core': 1.13.5(@swc/helpers@0.5.17) - terser-webpack-plugin@5.3.14(webpack@5.100.2): + terser-webpack-plugin@5.3.14(webpack@5.102.1): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2 + webpack: 5.102.1 terser@5.43.1: dependencies: @@ -23258,21 +23503,21 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - testcontainers@11.5.1: + testcontainers@11.7.1: dependencies: '@balena/dockerignore': 1.0.2 - '@types/dockerode': 3.3.42 + '@types/dockerode': 3.3.44 archiver: 7.0.1 async-lock: 1.4.1 byline: 5.0.0 debug: 4.4.3 - docker-compose: 1.2.0 - dockerode: 4.0.7 + docker-compose: 1.3.0 + dockerode: 4.0.9 get-port: 7.1.0 proper-lockfile: 4.1.2 properties-reader: 2.3.0 ssh-remote-port-forward: 1.0.4 - tar-fs: 3.1.0 + tar-fs: 3.1.1 tmp: 0.2.5 undici: 7.16.0 transitivePeerDependencies: @@ -23293,6 +23538,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + three@0.179.1: {} three@0.180.0: {} @@ -23390,6 +23639,10 @@ snapshots: punycode: 2.3.1 optional: true + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -23402,21 +23655,21 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-interface-checker@0.1.13: {} - tsconfck@3.1.6(typescript@5.9.2): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 - tapable: 2.2.2 + tapable: 2.3.0 tsconfig-paths: 4.2.0 tsconfig-paths@4.2.0: @@ -23460,20 +23713,20 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.8.3: {} - typescript@5.9.2: {} + typescript@5.9.3: {} ua-is-frozen@0.1.2: {} @@ -23499,7 +23752,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.12.0: + undici-types@7.14.0: optional: true undici@7.16.0: {} @@ -23604,9 +23857,9 @@ snapshots: unpipe@1.0.0: {} - unplugin-swc@1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.50.1): + unplugin-swc@1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.52.4): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.1) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) '@swc/core': 1.13.5(@swc/helpers@0.5.17) load-tsconfig: 0.2.5 unplugin: 2.3.10 @@ -23620,9 +23873,9 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.1.3(browserslist@4.25.3): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.25.3 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -23639,7 +23892,7 @@ snapshots: is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.1.0 - semver: 7.7.2 + semver: 7.7.3 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -23647,14 +23900,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.100.2 + webpack: 5.102.1 optionalDependencies: - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.102.1) url-parse@1.5.10: dependencies: @@ -23691,8 +23944,6 @@ snapshots: uuid@8.3.2: {} - uuid@9.0.1: {} - validator@13.15.15: {} value-equal@1.0.1: {} @@ -23711,7 +23962,7 @@ snapshots: '@types/unist': 2.0.11 unist-util-stringify-position: 2.0.3 - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -23726,24 +23977,24 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - vite-imagetools@8.0.0(rollup@4.50.1): + vite-imagetools@8.0.0(rollup@4.52.4): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.1) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) imagetools-core: 8.0.0 - sharp: 0.34.3 + sharp: 0.34.4 transitivePeerDependencies: - rollup - supports-color - vite-node@3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -23758,13 +24009,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -23779,62 +24030,62 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.2) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.50.1 + rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.9 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.1 lightningcss: 1.30.1 terser: 5.43.1 yaml: 2.8.1 - vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.50.1 + rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.5.1 + '@types/node': 24.7.1 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.1 lightningcss: 1.30.1 terser: 5.43.1 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23852,12 +24103,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.8 + '@types/node': 22.18.9 happy-dom: 18.0.1 jsdom: 26.1.0(canvas@2.11.2(encoding@0.1.13)) transitivePeerDependencies: @@ -23874,11 +24125,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23896,12 +24147,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.8 + '@types/node': 22.18.9 happy-dom: 18.0.1 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: @@ -23918,11 +24169,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.1)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23940,12 +24191,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.5.1 + '@types/node': 24.7.1 happy-dom: 18.0.1 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: @@ -24018,20 +24269,23 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@5.3.4(webpack@5.100.2): + webpack-dev-middleware@7.4.5(webpack@5.102.1): dependencies: colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 + memfs: 4.49.0 + mime-types: 3.0.1 + on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.2 - webpack: 5.100.2 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.102.1 - webpack-dev-server@4.15.2(webpack@5.100.2): + webpack-dev-server@5.2.2(webpack@5.102.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.23 + '@types/express-serve-static-core': 4.19.6 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.8 '@types/sockjs': 0.3.36 @@ -24042,25 +24296,22 @@ snapshots: colorette: 2.0.20 compression: 1.8.1 connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 express: 4.21.2 graceful-fs: 4.2.11 - html-entities: 2.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 launch-editor: 2.10.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.3.2 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.100.2) + webpack-dev-middleware: 7.4.5(webpack@5.102.1) ws: 8.18.3 optionalDependencies: - webpack: 5.100.2 + webpack: 5.102.1 transitivePeerDependencies: - bufferutil - debug @@ -24085,38 +24336,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.100.2: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webpack@5.100.2(@swc/core@1.13.5(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 @@ -24127,7 +24346,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.3 + browserslist: 4.26.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -24136,11 +24355,11 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 + schema-utils: 4.3.3 + tapable: 2.3.0 terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.5(@swc/helpers@0.5.17))) watchpack: 2.4.4 webpack-sources: 3.3.3 @@ -24149,7 +24368,39 @@ snapshots: - esbuild - uglify-js - webpackbar@6.0.1(webpack@5.100.2): + webpack@5.102.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.26.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(webpack@5.102.1) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpackbar@6.0.1(webpack@5.102.1): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -24158,7 +24409,7 @@ snapshots: markdown-table: 2.0.0 pretty-time: 1.1.0 std-env: 3.9.0 - webpack: 5.100.2 + webpack: 5.102.1 wrap-ansi: 7.0.0 websocket-driver@0.7.4: @@ -24267,6 +24518,10 @@ snapshots: ws@8.18.3: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xdg-basedir@5.1.0: {} xml-js@1.6.11: @@ -24339,7 +24594,7 @@ snapshots: yoctocolors@2.1.2: {} - zimmerframe@1.1.2: {} + zimmerframe@1.1.4: {} zip-stream@6.0.1: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 880d115880..5fd79faba3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -27,7 +27,7 @@ onlyBuiltDependencies: - '@tailwindcss/oxide' overrides: canvas: 2.11.2 - sharp: ^0.34.3 + sharp: ^0.34.4 packageExtensions: nestjs-kysely: dependencies: diff --git a/server/package.json b/server/package.json index 4d4c125474..293e43c893 100644 --- a/server/package.json +++ b/server/package.json @@ -47,7 +47,7 @@ "@opentelemetry/exporter-prometheus": "^0.205.0", "@opentelemetry/instrumentation-http": "^0.205.0", "@opentelemetry/instrumentation-ioredis": "^0.53.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.51.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.52.0", "@opentelemetry/instrumentation-pg": "^0.58.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", @@ -67,7 +67,7 @@ "compression": "^1.8.0", "cookie": "^1.0.2", "cookie-parser": "^1.4.7", - "cron": "4.3.0", + "cron": "4.3.3", "exiftool-vendored": "^28.8.0", "express": "^5.1.0", "fast-glob": "^3.3.2", @@ -85,7 +85,7 @@ "multer": "^2.0.2", "nest-commander": "^3.16.0", "nestjs-cls": "^5.0.0", - "nestjs-kysely": "^3.0.0", + "nestjs-kysely": "3.0.0", "nestjs-otel": "^7.0.0", "nodemailer": "^7.0.0", "openid-client": "^6.3.3", @@ -101,7 +101,7 @@ "sanitize-filename": "^1.6.3", "sanitize-html": "^2.14.0", "semver": "^7.6.2", - "sharp": "^0.34.3", + "sharp": "^0.34.4", "sirv": "^3.0.0", "socket.io": "^4.8.1", "tailwindcss-preset-email": "^1.4.0", @@ -164,6 +164,6 @@ "node": "22.20.0" }, "overrides": { - "sharp": "^0.34.3" + "sharp": "^0.34.4" } } diff --git a/web/package.json b/web/package.json index fae4568097..dd4557a3c5 100644 --- a/web/package.json +++ b/web/package.json @@ -27,7 +27,7 @@ "dependencies": { "@formatjs/icu-messageformat-parser": "^2.9.8", "@immich/sdk": "file:../open-api/typescript-sdk", - "@immich/ui": "^0.29.0", + "@immich/ui": "^0.34.0", "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", @@ -69,7 +69,7 @@ "@sveltejs/adapter-static": "^3.0.8", "@sveltejs/enhanced-img": "^0.8.0", "@sveltejs/kit": "^2.27.1", - "@sveltejs/vite-plugin-svelte": "6.2.0", + "@sveltejs/vite-plugin-svelte": "6.2.1", "@tailwindcss/vite": "^4.1.7", "@testing-library/jest-dom": "^6.4.2", "@testing-library/svelte": "^5.2.8", @@ -95,7 +95,7 @@ "prettier-plugin-sort-json": "^4.1.1", "prettier-plugin-svelte": "^3.3.3", "rollup-plugin-visualizer": "^6.0.0", - "svelte": "5.38.10", + "svelte": "5.39.11", "svelte-check": "^4.1.5", "svelte-eslint-parser": "^1.3.3", "tailwindcss": "^4.1.7", diff --git a/web/src/lib/components/ServerAboutItem.svelte b/web/src/lib/components/ServerAboutItem.svelte index 9e169a9839..415c047732 100644 --- a/web/src/lib/components/ServerAboutItem.svelte +++ b/web/src/lib/components/ServerAboutItem.svelte @@ -16,7 +16,7 @@ {#if versionHref} - {version} + {version} {:else} {version} {/if} diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 3dd7741af5..0fe8610b3d 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -22,8 +22,8 @@ import { AssetJobName, AssetTypeEnum, - getAssetInfo, getAllAlbums, + getAssetInfo, getStack, runAssetJobs, type AlbumResponseDto, @@ -303,10 +303,8 @@ const handleStopSlideshow = async () => { try { - // eslint-disable-next-line tscompat/tscompat if (document.fullscreenElement) { document.body.style.cursor = ''; - // eslint-disable-next-line tscompat/tscompat await document.exitFullscreen(); } } catch (error) { diff --git a/web/src/lib/components/asset-viewer/slideshow-bar.svelte b/web/src/lib/components/asset-viewer/slideshow-bar.svelte index 52160af69e..ea4519bc53 100644 --- a/web/src/lib/components/asset-viewer/slideshow-bar.svelte +++ b/web/src/lib/components/asset-viewer/slideshow-bar.svelte @@ -100,9 +100,7 @@ }; const onShowSettings = async () => { - // eslint-disable-next-line tscompat/tscompat if (document.fullscreenElement) { - // eslint-disable-next-line tscompat/tscompat await document.exitFullscreen(); } await modalManager.show(SlideshowSettingsModal); @@ -114,11 +112,7 @@ webkitIsFullScreen?: boolean; }; - if ( - // eslint-disable-next-line tscompat/tscompat - !document.fullscreenElement && - !doc.webkitIsFullScreen - ) { + if (!document.fullscreenElement && !doc.webkitIsFullScreen) { onClose(); } } diff --git a/web/src/lib/components/timeline/Scrubber.svelte b/web/src/lib/components/timeline/Scrubber.svelte index 1344e667dc..76a12ea1ec 100644 --- a/web/src/lib/components/timeline/Scrubber.svelte +++ b/web/src/lib/components/timeline/Scrubber.svelte @@ -341,7 +341,6 @@ scrubberMonthScrollPercent: monthGroupPercentY, }); }; - /* eslint-disable tscompat/tscompat */ const getTouch = (event: TouchEvent) => { if (event.touches.length === 1) { return event.touches[0]; @@ -386,7 +385,6 @@ isHover = false; } }; - /* eslint-enable tscompat/tscompat */ onMount(() => { document.addEventListener('touchmove', onTouchMove, { capture: true, passive: true }); return () => { diff --git a/web/src/test-data/setup.ts b/web/src/test-data/setup.ts index f2cfac3c36..7a94c54338 100644 --- a/web/src/test-data/setup.ts +++ b/web/src/test-data/setup.ts @@ -3,6 +3,7 @@ import { init } from 'svelte-i18n'; beforeAll(async () => { await init({ fallbackLocale: 'dev' }); + Element.prototype.animate = vi.fn().mockImplementation(() => ({ cancel: () => {}, finished: Promise.resolve() })); }); Object.defineProperty(globalThis, 'matchMedia', { @@ -16,3 +17,11 @@ Object.defineProperty(globalThis, 'matchMedia', { dispatchEvent: vi.fn(), })), }); + +vi.mock('$env/dynamic/public', () => { + return { + env: { + PUBLIC_IMMICH_HOSTNAME: '', + }, + }; +}); From efa21af6f97fe88f2f1aea97bf7876a0ea086e95 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Fri, 10 Oct 2025 11:13:31 -0500 Subject: [PATCH 090/134] fix: only cast to device if the asset is a RemoteAsset (#22805) --- .../widgets/asset_viewer/asset_viewer.page.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart index 7ac8cf34d5..e3106c7f7f 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart @@ -221,10 +221,8 @@ class _AssetViewerState extends ConsumerState { context.scaffoldMessenger.hideCurrentSnackBar(); // send image to casting if the server has it - if (asset.hasRemote) { - final remoteAsset = asset as RemoteAsset; - - ref.read(castProvider.notifier).loadMedia(remoteAsset, false); + if (asset is RemoteAsset) { + ref.read(castProvider.notifier).loadMedia(asset, false); } else { // casting cannot show local assets context.scaffoldMessenger.clearSnackBars(); From ce4e8fa6bae83d52b8647688fd627254138c9374 Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Fri, 10 Oct 2025 15:48:29 -0400 Subject: [PATCH 091/134] feat: (perf) remove scroll compensation (#22837) --- .../lib/components/timeline/Timeline.svelte | 32 +------------- .../timeline/TimelineDateGroup.svelte | 10 +---- .../internal/intersection-support.svelte.ts | 10 ++--- .../timeline-manager/month-group.svelte.ts | 34 +++++---------- .../timeline-manager.svelte.spec.ts | 6 +-- .../timeline-manager.svelte.ts | 43 ++----------------- 6 files changed, 23 insertions(+), 112 deletions(-) diff --git a/web/src/lib/components/timeline/Timeline.svelte b/web/src/lib/components/timeline/Timeline.svelte index f323235a13..eacc938f26 100644 --- a/web/src/lib/components/timeline/Timeline.svelte +++ b/web/src/lib/components/timeline/Timeline.svelte @@ -134,26 +134,12 @@ element.scrollTop = top; } }; - const scrollBy = (y: number) => { - if (element) { - element.scrollBy(0, y); - } - }; + const scrollToTop = () => { scrollTo(0); }; - const getAssetHeight = (assetId: string, monthGroup: MonthGroup) => { - // the following method may trigger any layouts, so need to - // handle any scroll compensation that may have been set - const height = monthGroup!.findAssetAbsolutePosition(assetId); - - while (timelineManager.scrollCompensation.monthGroup) { - handleScrollCompensation(timelineManager.scrollCompensation); - timelineManager.clearScrollCompensation(); - } - return height; - }; + const getAssetHeight = (assetId: string, monthGroup: MonthGroup) => monthGroup.findAssetAbsolutePosition(assetId); const assetIsVisible = (assetTop: number): boolean => { if (!element) { @@ -246,19 +232,6 @@ // note: don't throttle, debounch, or otherwise do this function async - it causes flicker const updateSlidingWindow = () => timelineManager.updateSlidingWindow(element?.scrollTop || 0); - const handleScrollCompensation = ({ heightDelta, scrollTop }: { heightDelta?: number; scrollTop?: number }) => { - if (heightDelta !== undefined) { - scrollBy(heightDelta); - } else if (scrollTop !== undefined) { - scrollTo(scrollTop); - } - // Yes, updateSlideWindow() is called by the onScroll event triggered as a result of - // the above calls. However, this delay is enough time to set the intersecting property - // of the monthGroup to false, then true, which causes the DOM nodes to be recreated, - // causing bad perf, and also, disrupting focus of those elements. - updateSlidingWindow(); - }; - const topSectionResizeObserver: OnResizeCallback = ({ height }) => (timelineManager.topSectionHeight = height); onMount(() => { @@ -666,7 +639,6 @@ onSelect={({ title, assets }) => handleGroupSelect(timelineManager, title, assets)} onSelectAssetCandidates={handleSelectAssetCandidates} onSelectAssets={handleSelectAssets} - onScrollCompensation={handleScrollCompensation} {customLayout} {onThumbnailClick} /> diff --git a/web/src/lib/components/timeline/TimelineDateGroup.svelte b/web/src/lib/components/timeline/TimelineDateGroup.svelte index 30f6e65edb..5070b6b7c1 100644 --- a/web/src/lib/components/timeline/TimelineDateGroup.svelte +++ b/web/src/lib/components/timeline/TimelineDateGroup.svelte @@ -33,7 +33,6 @@ onSelect: ({ title, assets }: { title: string; assets: TimelineAsset[] }) => void; onSelectAssets: (asset: TimelineAsset) => void; onSelectAssetCandidates: (asset: TimelineAsset | null) => void; - onScrollCompensation: (compensation: { heightDelta?: number; scrollTop?: number }) => void; onThumbnailClick?: ( asset: TimelineAsset, timelineManager: TimelineManager, @@ -59,7 +58,7 @@ onSelect, onSelectAssets, onSelectAssetCandidates, - onScrollCompensation, + onThumbnailClick, }: Props = $props(); @@ -134,13 +133,6 @@ }); return getDateLocaleString(date); }; - - $effect.root(() => { - if (timelineManager.scrollCompensation.monthGroup === monthGroup) { - onScrollCompensation(timelineManager.scrollCompensation); - timelineManager.clearScrollCompensation(); - } - }); {#each filterIntersecting(monthGroup.dayGroups) as dayGroup, groupIndex (dayGroup.day)} diff --git a/web/src/lib/managers/timeline-manager/internal/intersection-support.svelte.ts b/web/src/lib/managers/timeline-manager/internal/intersection-support.svelte.ts index 185d74e0b0..bdf2b17cbe 100644 --- a/web/src/lib/managers/timeline-manager/internal/intersection-support.svelte.ts +++ b/web/src/lib/managers/timeline-manager/internal/intersection-support.svelte.ts @@ -55,7 +55,7 @@ export function calculateMonthGroupIntersecting( } /** - * Calculate intersection for viewer assets with additional parameters like header height and scroll compensation + * Calculate intersection for viewer assets with additional parameters like header height */ export function calculateViewerAssetIntersecting( timelineManager: TimelineManager, @@ -64,12 +64,8 @@ export function calculateViewerAssetIntersecting( expandTop: number = INTERSECTION_EXPAND_TOP, expandBottom: number = INTERSECTION_EXPAND_BOTTOM, ) { - const scrollCompensationHeightDelta = timelineManager.scrollCompensation?.heightDelta ?? 0; - - const topWindow = - timelineManager.visibleWindow.top - timelineManager.headerHeight - expandTop + scrollCompensationHeightDelta; - const bottomWindow = - timelineManager.visibleWindow.bottom + timelineManager.headerHeight + expandBottom + scrollCompensationHeightDelta; + const topWindow = timelineManager.visibleWindow.top - timelineManager.headerHeight - expandTop; + const bottomWindow = timelineManager.visibleWindow.bottom + timelineManager.headerHeight + expandBottom; const positionBottom = positionTop + positionHeight; diff --git a/web/src/lib/managers/timeline-manager/month-group.svelte.ts b/web/src/lib/managers/timeline-manager/month-group.svelte.ts index 5a90944107..f9c34668b8 100644 --- a/web/src/lib/managers/timeline-manager/month-group.svelte.ts +++ b/web/src/lib/managers/timeline-manager/month-group.svelte.ts @@ -36,7 +36,6 @@ export class MonthGroup { #initialCount: number = 0; #sortOrder: AssetOrder = AssetOrder.Desc; - percent: number = $state(0); assetsCount: number = $derived( this.isLoaded @@ -242,42 +241,31 @@ export class MonthGroup { if (this.#height === height) { return; } - const { timelineManager: store, percent } = this; - const index = store.months.indexOf(this); + let needsIntersectionUpdate = false; + const timelineManager = this.timelineManager; + const index = timelineManager.months.indexOf(this); const heightDelta = height - this.#height; this.#height = height; - const prevMonthGroup = store.months[index - 1]; + const prevMonthGroup = timelineManager.months[index - 1]; if (prevMonthGroup) { const newTop = prevMonthGroup.#top + prevMonthGroup.#height; if (this.#top !== newTop) { this.#top = newTop; } } - for (let cursor = index + 1; cursor < store.months.length; cursor++) { + if (heightDelta === 0) { + return; + } + for (let cursor = index + 1; cursor < timelineManager.months.length; cursor++) { const monthGroup = this.timelineManager.months[cursor]; const newTop = monthGroup.#top + heightDelta; if (monthGroup.#top !== newTop) { monthGroup.#top = newTop; + needsIntersectionUpdate = true; } } - if (store.topIntersectingMonthGroup) { - const currentIndex = store.months.indexOf(store.topIntersectingMonthGroup); - if (currentIndex > 0) { - if (index < currentIndex) { - store.scrollCompensation = { - heightDelta, - scrollTop: undefined, - monthGroup: this, - }; - } else if (percent > 0) { - const top = this.top + height * percent; - store.scrollCompensation = { - heightDelta: undefined, - scrollTop: top, - monthGroup: this, - }; - } - } + if (needsIntersectionUpdate) { + timelineManager.updateIntersections(); } } diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts index dabcb10479..ceafa5b0bd 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts @@ -68,7 +68,7 @@ describe('TimelineManager', () => { it('should load months in viewport', () => { expect(sdkMock.getTimeBuckets).toBeCalledTimes(1); - expect(sdkMock.getTimeBucket).toHaveBeenCalledTimes(2); + expect(sdkMock.getTimeBucket).toHaveBeenCalledTimes(3); }); it('calculates month height', () => { @@ -82,13 +82,13 @@ describe('TimelineManager', () => { expect.arrayContaining([ expect.objectContaining({ year: 2024, month: 3, height: 165.5 }), expect.objectContaining({ year: 2024, month: 2, height: 11_996 }), - expect.objectContaining({ year: 2024, month: 1, height: 286 }), + expect.objectContaining({ year: 2024, month: 1, height: 48 }), ]), ); }); it('calculates timeline height', () => { - expect(timelineManager.timelineHeight).toBe(12_447.5); + expect(timelineManager.timelineHeight).toBe(12_209.5); }); }); diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts index b5f097e496..f507f4de28 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts @@ -5,7 +5,7 @@ import { authManager } from '$lib/managers/auth-manager.svelte'; import { CancellableTask } from '$lib/utils/cancellable-task'; import { toTimelineAsset, type TimelineDateTime, type TimelineYearMonth } from '$lib/utils/timeline-util'; -import { clamp, debounce, isEqual } from 'lodash-es'; +import { debounce, isEqual } from 'lodash-es'; import { SvelteDate, SvelteMap, SvelteSet } from 'svelte/reactivity'; import { updateIntersectionMonthGroup } from '$lib/managers/timeline-manager/internal/intersection-support.svelte'; @@ -49,8 +49,6 @@ export class TimelineManager { scrubberMonths: ScrubberMonth[] = $state([]); scrubberTimelineHeight: number = $state(0); - topIntersectingMonthGroup: MonthGroup | undefined = $state(); - visibleWindow = $derived.by(() => ({ top: this.#scrollTop, bottom: this.#scrollTop + this.viewportHeight, @@ -87,15 +85,6 @@ export class TimelineManager { #suspendTransitions = $state(false); #resetScrolling = debounce(() => (this.#scrolling = false), 1000); #resetSuspendTransitions = debounce(() => (this.suspendTransitions = false), 1000); - scrollCompensation: { - heightDelta: number | undefined; - scrollTop: number | undefined; - monthGroup: MonthGroup | undefined; - } = $state({ - heightDelta: 0, - scrollTop: 0, - monthGroup: undefined, - }); constructor() {} @@ -241,38 +230,12 @@ export class TimelineManager { } } - clearScrollCompensation() { - this.scrollCompensation = { - heightDelta: undefined, - scrollTop: undefined, - monthGroup: undefined, - }; - } - updateIntersections() { if (!this.isInitialized || this.visibleWindow.bottom === this.visibleWindow.top) { return; } - let topIntersectingMonthGroup = undefined; for (const month of this.months) { updateIntersectionMonthGroup(this, month); - if (!topIntersectingMonthGroup && month.actuallyIntersecting) { - topIntersectingMonthGroup = month; - } - } - if (topIntersectingMonthGroup !== undefined && this.topIntersectingMonthGroup !== topIntersectingMonthGroup) { - this.topIntersectingMonthGroup = topIntersectingMonthGroup; - } - for (const month of this.months) { - if (month === this.topIntersectingMonthGroup) { - this.topIntersectingMonthGroup.percent = clamp( - (this.visibleWindow.top - this.topIntersectingMonthGroup.top) / this.topIntersectingMonthGroup.height, - 0, - 1, - ); - } else { - month.percent = 0; - } } } @@ -401,10 +364,10 @@ export class TimelineManager { return; } - const result = await monthGroup.loader?.execute(async (signal: AbortSignal) => { + const executionStatus = await monthGroup.loader?.execute(async (signal: AbortSignal) => { await loadFromTimeBuckets(this, monthGroup, this.#options, signal); }, cancelable); - if (result === 'LOADED') { + if (executionStatus === 'LOADED') { updateIntersectionMonthGroup(this, monthGroup); } } From 8fe54a4de17bd79ae2f9fa8fd4892473d13b0618 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 13:17:25 +0200 Subject: [PATCH 092/134] fix(deps): update dependency happy-dom to v20 [security] (#22846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 56 ++++++++++++++++++++++++------------------------ web/package.json | 4 ++-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ef694e5fa..c1bd16729f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,7 +67,7 @@ importers: version: 22.18.9 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) byte-size: specifier: ^9.0.0 version: 9.0.1 @@ -115,10 +115,10 @@ importers: version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest-fetch-mock: specifier: ^0.4.0 - version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) yaml: specifier: ^2.3.1 version: 2.8.1 @@ -284,7 +284,7 @@ importers: version: 5.2.1(encoding@0.1.13) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) open-api/typescript-sdk: dependencies: @@ -613,7 +613,7 @@ importers: version: 13.15.3 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: ^9.14.0 version: 9.37.0(jiti@2.6.1) @@ -670,7 +670,7 @@ importers: version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) web: dependencies: @@ -732,8 +732,8 @@ importers: specifier: ^4.7.8 version: 4.7.8 happy-dom: - specifier: ^18.0.1 - version: 18.0.1 + specifier: ^20.0.0 + version: 20.0.0 intl-messageformat: specifier: ^10.7.11 version: 10.7.17 @@ -812,7 +812,7 @@ importers: version: 6.8.0 '@testing-library/svelte': specifier: ^5.2.8 - version: 5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@testing-library/user-event': specifier: ^14.5.2 version: 14.6.1(@testing-library/dom@10.4.0) @@ -836,7 +836,7 @@ importers: version: 1.5.5 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) dotenv: specifier: ^17.0.0 version: 17.2.3 @@ -899,7 +899,7 @@ importers: version: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) packages: @@ -6976,8 +6976,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@18.0.1: - resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + happy-dom@20.0.0: + resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} engines: {node: '>=20.0.0'} has-flag@4.0.0: @@ -15990,13 +15990,13 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/svelte@5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@testing-library/svelte@5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@testing-library/dom': 10.4.0 svelte: 5.39.11 optionalDependencies: vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -16563,7 +16563,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16578,11 +16578,11 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16597,7 +16597,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -19132,7 +19132,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@18.0.1: + happy-dom@20.0.0: dependencies: '@types/node': 20.19.2 '@types/whatwg-mimetype': 3.0.2 @@ -24077,11 +24077,11 @@ snapshots: optionalDependencies: vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -24109,7 +24109,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.18.9 - happy-dom: 18.0.1 + happy-dom: 20.0.0 jsdom: 26.1.0(canvas@2.11.2(encoding@0.1.13)) transitivePeerDependencies: - jiti @@ -24125,7 +24125,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -24153,7 +24153,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.18.9 - happy-dom: 18.0.1 + happy-dom: 20.0.0 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: - jiti @@ -24169,7 +24169,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -24197,7 +24197,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.7.1 - happy-dom: 18.0.1 + happy-dom: 20.0.0 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: - jiti diff --git a/web/package.json b/web/package.json index dd4557a3c5..d44eb768df 100644 --- a/web/package.json +++ b/web/package.json @@ -44,7 +44,7 @@ "geo-coordinates-parser": "^1.7.4", "geojson": "^0.5.0", "handlebars": "^4.7.8", - "happy-dom": "^18.0.1", + "happy-dom": "^20.0.0", "intl-messageformat": "^10.7.11", "justified-layout": "^4.1.0", "lodash-es": "^4.17.21", @@ -89,7 +89,7 @@ "eslint-plugin-unicorn": "^61.0.2", "factory.ts": "^1.4.1", "globals": "^16.0.0", - "happy-dom": "^18.0.1", + "happy-dom": "^20.0.0", "prettier": "^3.4.2", "prettier-plugin-organize-imports": "^4.0.0", "prettier-plugin-sort-json": "^4.1.1", From f2b553182a27123eda5642cf0436ba6e6985415a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 12:59:36 +0200 Subject: [PATCH 093/134] chore(deps): update github-actions (#22793) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/docker.yml | 4 ++-- .github/workflows/prepare-release.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index cb50b650e2..2946f33783 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -50,7 +50,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/init@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,7 +63,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/autobuild@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -76,6 +76,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/analyze@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7a63fcc881..7175dc0a89 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -124,7 +124,7 @@ jobs: tag-suffix: '-rocm' platforms: linux/amd64 runner-mapping: '{"linux/amd64": "mich"}' - uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1 + uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@946acac326940f8badf09ccf591d9cb345d6a689 # multi-runner-build-workflow-v0.2.1 permissions: contents: read actions: read @@ -147,7 +147,7 @@ jobs: name: Build and Push Server needs: pre-job if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} - uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1 + uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@946acac326940f8badf09ccf591d9cb345d6a689 # multi-runner-build-workflow-v0.2.1 permissions: contents: read actions: read diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 69934b953b..a6fa5c802f 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -128,7 +128,7 @@ jobs: name: release-apk-signed - name: Create draft release - uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2.3.3 + uses: softprops/action-gh-release@aec2ec56f94eb8180ceec724245f64ef008b89f5 # v2.4.0 with: draft: true tag_name: ${{ env.IMMICH_VERSION }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0180333309..3ed57a59ba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -581,7 +581,7 @@ jobs: contents: read services: postgres: - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:da52bbead5d818adaa8077c8dcdaad0aaf93038c31ad8348b51f9f0ec1310a4d + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:dbf18b3ffea4a81434c65b71e20d27203baf903a0275f4341e4c16dfd901fd67 env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres From 46869f664d0f1c5cab102fabaeaf7c2307ebabe1 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Mon, 13 Oct 2025 05:55:23 -0400 Subject: [PATCH 094/134] fix: various typos (#22867) Found via `codespell -q 3 -S "*.svg,./i18n,./docs/package-lock.json,./readme_i18n,./mobile/assets/i18n" -L afterall,devlop,finaly,inout,nd,optin,renderd,sade` --- docs/docs/FAQ.mdx | 2 +- docs/docs/features/casting.md | 2 +- mobile/ios/WidgetExtension/widgets/MemoryWidget.swift | 2 +- mobile/lib/domain/services/store.service.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/FAQ.mdx b/docs/docs/FAQ.mdx index 14ac1de298..e3df672d35 100644 --- a/docs/docs/FAQ.mdx +++ b/docs/docs/FAQ.mdx @@ -22,7 +22,7 @@ For organizations seeking to resell Immich, we have established the following gu - Do not misrepresent your reseller site or services as being officially affiliated with or endorsed by Immich or our development team. -- For small resellers who wish to contribute financially to Immich's development, we recommend directing your customers to purchase licenses directy from us rather than attempting to broker revenue-sharing arrangements. We ask that you refrain from misrepresenting reseller activities as directly supporting our development work. +- For small resellers who wish to contribute financially to Immich's development, we recommend directing your customers to purchase licenses directly from us rather than attempting to broker revenue-sharing arrangements. We ask that you refrain from misrepresenting reseller activities as directly supporting our development work. When in doubt or if you have an edge case scenario, we encourage you to contact us directly via email to discuss the use of our trademark. We can provide clear guidance on what is acceptable and what is not. You can reach out at: questions@immich.app diff --git a/docs/docs/features/casting.md b/docs/docs/features/casting.md index bca85cb28c..2a6785dc6c 100644 --- a/docs/docs/features/casting.md +++ b/docs/docs/features/casting.md @@ -4,7 +4,7 @@ Immich supports the Google's Cast protocol so that photos and videos can be cast ## Enable Google Cast Support -Google Cast support is disabled by default. The web UI uses Google-provided scripts and must retreive them from Google servers when the page loads. This is a privacy concern for some and is thus opt-in. +Google Cast support is disabled by default. The web UI uses Google-provided scripts and must retrieve them from Google servers when the page loads. This is a privacy concern for some and is thus opt-in. You can enable Google Cast support through `Account Settings > Features > Cast > Google Cast` diff --git a/mobile/ios/WidgetExtension/widgets/MemoryWidget.swift b/mobile/ios/WidgetExtension/widgets/MemoryWidget.swift index d0a3e8c29d..22414fbec4 100644 --- a/mobile/ios/WidgetExtension/widgets/MemoryWidget.swift +++ b/mobile/ios/WidgetExtension/widgets/MemoryWidget.swift @@ -114,7 +114,7 @@ struct ImmichMemoryProvider: TimelineProvider { } } - // If we didnt add any memory images (some failure occured or no images in memory), + // If we didn't add any memory images (some failure occurred or no images in memory), // default to 12 hours of random photos if entries.count == 0 { // this must be a do/catch since we need to diff --git a/mobile/lib/domain/services/store.service.dart b/mobile/lib/domain/services/store.service.dart index f9b4a0aa81..0098c3d262 100644 --- a/mobile/lib/domain/services/store.service.dart +++ b/mobile/lib/domain/services/store.service.dart @@ -86,7 +86,7 @@ class StoreService { _cache.remove(key.id); } - /// Clears all values from thw store (cache and DB) + /// Clears all values from the store (cache and DB) Future clear() async { await _storeRepository.deleteAll(); _cache.clear(); From cf52b879b1b0797a62e039fac852c85690d9b03d Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 14 Oct 2025 07:39:12 +0530 Subject: [PATCH 095/134] fix: ios skip posting hash response after detached from engine (#22695) * skip posting message after detached from engine * review changes * cancel plugin before destroying engine --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- mobile/ios/Runner.xcodeproj/project.pbxproj | 17 +++++++++++-- mobile/ios/Runner/AppDelegate.swift | 14 +++++++---- .../Runner/Background/BackgroundWorker.swift | 3 ++- mobile/ios/Runner/Core/ImmichPlugin.swift | 17 +++++++++++++ mobile/ios/Runner/Sync/MessagesImpl.swift | 24 ++++++++++++++----- .../services/background_worker.service.dart | 2 +- 6 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 mobile/ios/Runner/Core/ImmichPlugin.swift diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 6403a0ab4b..a6a7b42cca 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -131,10 +131,13 @@ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ + B231F52D2E93A44A00BC45D1 /* Core */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = Core; + sourceTree = ""; + }; B2CF7F8C2DDE4EBB00744BF6 /* Sync */ = { isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - ); path = Sync; sourceTree = ""; }; @@ -247,6 +250,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + B231F52D2E93A44A00BC45D1 /* Core */, B25D37792E72CA15008B6CA7 /* Connectivity */, B21E34A62E5AF9760031FDB9 /* Background */, B2CF7F8C2DDE4EBB00744BF6 /* Sync */, @@ -331,6 +335,7 @@ F0B57D482DF764BE00DC5BCC /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( + B231F52D2E93A44A00BC45D1 /* Core */, B2CF7F8C2DDE4EBB00744BF6 /* Sync */, ); name = Runner; @@ -521,10 +526,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; @@ -553,10 +562,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift index 3476030923..4e4cb2ed13 100644 --- a/mobile/ios/Runner/AppDelegate.swift +++ b/mobile/ios/Runner/AppDelegate.swift @@ -20,7 +20,7 @@ import UIKit GeneratedPluginRegistrant.register(with: self) let controller: FlutterViewController = window?.rootViewController as! FlutterViewController - AppDelegate.registerPlugins(binaryMessenger: controller.binaryMessenger) + AppDelegate.registerPlugins(with: controller.engine) BackgroundServicePlugin.register(with: self.registrar(forPlugin: "BackgroundServicePlugin")!) BackgroundServicePlugin.registerBackgroundProcessing() @@ -51,9 +51,13 @@ import UIKit return super.application(application, didFinishLaunchingWithOptions: launchOptions) } - public static func registerPlugins(binaryMessenger: FlutterBinaryMessenger) { - NativeSyncApiSetup.setUp(binaryMessenger: binaryMessenger, api: NativeSyncApiImpl()) - ThumbnailApiSetup.setUp(binaryMessenger: binaryMessenger, api: ThumbnailApiImpl()) - BackgroundWorkerFgHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: BackgroundWorkerApiImpl()) + public static func registerPlugins(with engine: FlutterEngine) { + NativeSyncApiImpl.register(with: engine.registrar(forPlugin: NativeSyncApiImpl.name)!) + ThumbnailApiSetup.setUp(binaryMessenger: engine.binaryMessenger, api: ThumbnailApiImpl()) + BackgroundWorkerFgHostApiSetup.setUp(binaryMessenger: engine.binaryMessenger, api: BackgroundWorkerApiImpl()) + } + + public static func cancelPlugins(with engine: FlutterEngine) { + (engine.valuePublished(byPlugin: NativeSyncApiImpl.name) as? NativeSyncApiImpl)?.detachFromEngine() } } diff --git a/mobile/ios/Runner/Background/BackgroundWorker.swift b/mobile/ios/Runner/Background/BackgroundWorker.swift index 15df971203..7dc450d76e 100644 --- a/mobile/ios/Runner/Background/BackgroundWorker.swift +++ b/mobile/ios/Runner/Background/BackgroundWorker.swift @@ -95,7 +95,7 @@ class BackgroundWorker: BackgroundWorkerBgHostApi { // Register plugins in the new engine GeneratedPluginRegistrant.register(with: engine) // Register custom plugins - AppDelegate.registerPlugins(binaryMessenger: engine.binaryMessenger) + AppDelegate.registerPlugins(with: engine) flutterApi = BackgroundWorkerFlutterApi(binaryMessenger: engine.binaryMessenger) BackgroundWorkerBgHostApiSetup.setUp(binaryMessenger: engine.binaryMessenger, api: self) @@ -168,6 +168,7 @@ class BackgroundWorker: BackgroundWorkerBgHostApi { } isComplete = true + AppDelegate.cancelPlugins(with: engine) engine.destroyContext() flutterApi = nil completionHandler(success) diff --git a/mobile/ios/Runner/Core/ImmichPlugin.swift b/mobile/ios/Runner/Core/ImmichPlugin.swift new file mode 100644 index 0000000000..db10b7a75d --- /dev/null +++ b/mobile/ios/Runner/Core/ImmichPlugin.swift @@ -0,0 +1,17 @@ +class ImmichPlugin: NSObject { + var detached: Bool + + override init() { + detached = false + super.init() + } + + func detachFromEngine() { + self.detached = true + } + + func completeWhenActive(for completion: @escaping (T) -> Void, with value: T) { + guard !self.detached else { return } + completion(value) + } +} diff --git a/mobile/ios/Runner/Sync/MessagesImpl.swift b/mobile/ios/Runner/Sync/MessagesImpl.swift index bb23bae6b6..c9f58398b6 100644 --- a/mobile/ios/Runner/Sync/MessagesImpl.swift +++ b/mobile/ios/Runner/Sync/MessagesImpl.swift @@ -17,13 +17,25 @@ struct AssetWrapper: Hashable, Equatable { } } -class NativeSyncApiImpl: NativeSyncApi { +class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { + static let name = "NativeSyncApi" + + static func register(with registrar: any FlutterPluginRegistrar) { + let instance = NativeSyncApiImpl() + NativeSyncApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + registrar.publish(instance) + } + + func detachFromEngine(for registrar: any FlutterPluginRegistrar) { + super.detachFromEngine() + } + private let defaults: UserDefaults private let changeTokenKey = "immich:changeToken" private let albumTypes: [PHAssetCollectionType] = [.album, .smartAlbum] private let recoveredAlbumSubType = 1000000219 - private var hashTask: Task? + private var hashTask: Task? private static let hashCancelledCode = "HASH_CANCELLED" private static let hashCancelled = Result<[HashResult], Error>.failure(PigeonError(code: hashCancelledCode, message: "Hashing cancelled", details: nil)) @@ -272,7 +284,7 @@ class NativeSyncApiImpl: NativeSyncApi { } if Task.isCancelled { - return completion(Self.hashCancelled) + return self?.completeWhenActive(for: completion, with: Self.hashCancelled) } await withTaskGroup(of: HashResult?.self) { taskGroup in @@ -280,7 +292,7 @@ class NativeSyncApiImpl: NativeSyncApi { results.reserveCapacity(assets.count) for asset in assets { if Task.isCancelled { - return completion(Self.hashCancelled) + return self?.completeWhenActive(for: completion, with: Self.hashCancelled) } taskGroup.addTask { guard let self = self else { return nil } @@ -290,7 +302,7 @@ class NativeSyncApiImpl: NativeSyncApi { for await result in taskGroup { guard let result = result else { - return completion(Self.hashCancelled) + return self?.completeWhenActive(for: completion, with: Self.hashCancelled) } results.append(result) } @@ -299,7 +311,7 @@ class NativeSyncApiImpl: NativeSyncApi { results.append(HashResult(assetId: missing, error: "Asset not found in library", hash: nil)) } - completion(.success(results)) + return self?.completeWhenActive(for: completion, with: .success(results)) } } } diff --git a/mobile/lib/domain/services/background_worker.service.dart b/mobile/lib/domain/services/background_worker.service.dart index d95b1d4951..78ba5b7088 100644 --- a/mobile/lib/domain/services/background_worker.service.dart +++ b/mobile/lib/domain/services/background_worker.service.dart @@ -192,6 +192,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { _cancellationToken.cancel(); _logger.info("Cleaning up background worker"); final cleanupFutures = [ + nativeSyncApi?.cancelHashing(), workerManager.dispose().catchError((_) async { // Discard any errors on the dispose call return; @@ -201,7 +202,6 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { _drift.close(), _driftLogger.close(), backgroundSyncManager?.cancel(), - nativeSyncApi?.cancelHashing(), ]; if (_isar.isOpen) { From d411594c84135714ce095e9ab2dfc4c523f6ab88 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:12:40 -0500 Subject: [PATCH 096/134] chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.3.0 docker digest to 6f3e9d2 (#22912) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- e2e/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index baf63cfe9c..ec7865538f 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -38,7 +38,7 @@ services: image: redis:6.2-alpine@sha256:2185e741f4c1e7b0ea9ca1e163a3767c4270a73086b6bbea2049a7203212fb7f database: - image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:11ced39d65a92a54d12890ced6a26cc2003f92697d6f0d4d944b98459dba7138 + image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:6f3e9d2c2177af16c2988ff71425d79d89ca630ec2f9c8db03209ab716542338 command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf environment: POSTGRES_PASSWORD: postgres From e8ca7f235c957a18fd51155cd6d2fa9b51503cc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:14:33 -0500 Subject: [PATCH 097/134] chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to bcf6335 (#22913) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/docker-compose.dev.yml | 2 +- docker/docker-compose.prod.yml | 2 +- docker/docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index eba1f632c1..0dadaa2cc7 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -140,7 +140,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:41eacbe83eca995561fe43814fd4891e16e39632806253848efaf04d3c8a8b84 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 env_file: - .env environment: diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index e27012cf56..7ec77cda92 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -63,7 +63,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:41eacbe83eca995561fe43814fd4891e16e39632806253848efaf04d3c8a8b84 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 env_file: - .env environment: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b4ff05f366..9f0935e17c 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -56,7 +56,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:41eacbe83eca995561fe43814fd4891e16e39632806253848efaf04d3c8a8b84 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} From 146973b072f2d1f87d2b81b6765b0c3ee1ad7c65 Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Mon, 13 Oct 2025 22:16:05 -0400 Subject: [PATCH 098/134] fix: re-add scroll compensation (efficiently) (#22848) * fix: re-add scroll compensation (efficient) * Rename showSkeleton to invisible. Adjust skeleton margins, invisible support. * Fix faulty logic, simplify * Calculate ratios and determine compensation strategy: height comp for above/partiality visible, month-scroll comp within a fully visible month. --------- Co-authored-by: Alex --- .../lib/components/timeline/Timeline.svelte | 77 ++++++++----------- .../timeline/TimelineAssetViewer.svelte | 6 +- .../timeline/TimelineDateGroup.svelte | 2 +- web/src/lib/elements/Skeleton.svelte | 16 ++-- .../internal/load-support.svelte.ts | 3 - .../timeline-manager/month-group.svelte.ts | 18 ++++- .../timeline-manager.svelte.spec.ts | 8 +- .../timeline-manager.svelte.ts | 69 +++++++++++++++-- 8 files changed, 128 insertions(+), 71 deletions(-) diff --git a/web/src/lib/components/timeline/Timeline.svelte b/web/src/lib/components/timeline/Timeline.svelte index eacc938f26..74e6ac67ae 100644 --- a/web/src/lib/components/timeline/Timeline.svelte +++ b/web/src/lib/components/timeline/Timeline.svelte @@ -89,10 +89,10 @@ let { isViewing: showAssetViewer, asset: viewingAsset, gridScrollTarget } = assetViewingStore; - let element: HTMLElement | undefined = $state(); + let scrollableElement: HTMLElement | undefined = $state(); let timelineElement: HTMLElement | undefined = $state(); - let showSkeleton = $state(true); + let invisible = $state(true); // The percentage of scroll through the month that is currently intersecting the top boundary of the viewport. // Note: There may be multiple months visible within the viewport at any given time. let viewportTopMonthScrollPercent = $state(0); @@ -124,29 +124,22 @@ timelineManager.setLayoutOptions(layoutOptions); }); - const scrollTo = (top: number) => { - if (element) { - element.scrollTo({ top }); - } - }; - const scrollTop = (top: number) => { - if (element) { - element.scrollTop = top; - } - }; + $effect(() => { + timelineManager.scrollableElement = scrollableElement; + }); const scrollToTop = () => { - scrollTo(0); + timelineManager.scrollTo(0); }; const getAssetHeight = (assetId: string, monthGroup: MonthGroup) => monthGroup.findAssetAbsolutePosition(assetId); const assetIsVisible = (assetTop: number): boolean => { - if (!element) { + if (!scrollableElement) { return false; } - const { clientHeight, scrollTop } = element; + const { clientHeight, scrollTop } = scrollableElement; return assetTop >= scrollTop && assetTop < scrollTop + clientHeight; }; @@ -163,8 +156,7 @@ return true; } - scrollTo(height); - updateSlidingWindow(); + timelineManager.scrollTo(height); return true; }; @@ -174,8 +166,7 @@ return false; } const height = getAssetHeight(asset.id, monthGroup); - scrollTo(height); - updateSlidingWindow(); + timelineManager.scrollTo(height); return true; }; @@ -189,7 +180,7 @@ // if the asset is not found, scroll to the top scrollToTop(); } - showSkeleton = false; + invisible = false; }; beforeNavigate(() => (timelineManager.suspendTransitions = true)); @@ -216,7 +207,7 @@ } else { scrollToTop(); } - showSkeleton = false; + invisible = false; }, 500); } }; @@ -230,13 +221,12 @@ const updateIsScrolling = () => (timelineManager.scrolling = true); // note: don't throttle, debounch, or otherwise do this function async - it causes flicker - const updateSlidingWindow = () => timelineManager.updateSlidingWindow(element?.scrollTop || 0); const topSectionResizeObserver: OnResizeCallback = ({ height }) => (timelineManager.topSectionHeight = height); onMount(() => { if (!enableRouting) { - showSkeleton = false; + invisible = false; } }); @@ -246,11 +236,13 @@ }; const getMaxScroll = () => { - if (!element || !timelineElement) { + if (!scrollableElement || !timelineElement) { return 0; } return ( - timelineManager.topSectionHeight + bottomSectionHeight + (timelineElement.clientHeight - element.clientHeight) + timelineManager.topSectionHeight + + bottomSectionHeight + + (timelineElement.clientHeight - scrollableElement.clientHeight) ); }; @@ -260,7 +252,7 @@ const delta = monthGroup.height * monthGroupScrollPercent; const scrollToTop = (topOffset + delta) * maxScrollPercent; - scrollTop(scrollToTop); + timelineManager.scrollTo(scrollToTop); }; // note: don't throttle, debounce, or otherwise make this function async - it causes flicker @@ -272,7 +264,7 @@ // edge case - scroll limited due to size of content, must adjust - use use the overall percent instead const maxScroll = getMaxScroll(); const offset = maxScroll * overallScrollPercent; - scrollTop(offset); + timelineManager.scrollTo(offset); } else { const monthGroup = timelineManager.months.find( ({ yearMonth: { year, month } }) => year === scrubberMonth.year && month === scrubberMonth.month, @@ -288,26 +280,26 @@ const handleTimelineScroll = () => { isInLeadOutSection = false; - if (!element) { + if (!scrollableElement) { return; } if (timelineManager.timelineHeight < timelineManager.viewportHeight * 2) { // edge case - scroll limited due to size of content, must adjust - use the overall percent instead const maxScroll = getMaxScroll(); - timelineScrollPercent = Math.min(1, element.scrollTop / maxScroll); + timelineScrollPercent = Math.min(1, scrollableElement.scrollTop / maxScroll); viewportTopMonth = undefined; viewportTopMonthScrollPercent = 0; } else { - let top = element.scrollTop; + let top = scrollableElement.scrollTop; if (top < timelineManager.topSectionHeight) { // in the lead-in area viewportTopMonth = undefined; viewportTopMonthScrollPercent = 0; const maxScroll = getMaxScroll(); - timelineScrollPercent = Math.min(1, element.scrollTop / maxScroll); + timelineScrollPercent = Math.min(1, scrollableElement.scrollTop / maxScroll); return; } @@ -414,7 +406,7 @@ onSelect(asset); if (singleSelect) { - scrollTop(0); + timelineManager.scrollTo(0); return; } @@ -564,10 +556,10 @@ if (evt.key === 'ArrowUp') { amount = -amount; if (shiftKeyIsDown) { - element?.scrollBy({ top: amount, behavior: 'smooth' }); + scrollableElement?.scrollBy({ top: amount, behavior: 'smooth' }); } } else if (evt.key === 'ArrowDown') { - element?.scrollBy({ top: amount, behavior: 'smooth' }); + scrollableElement?.scrollBy({ top: amount, behavior: 'smooth' }); } }} /> @@ -580,19 +572,19 @@ style:margin-right={(usingMobileDevice ? 0 : scrubberWidth) + 'px'} tabindex="-1" bind:clientHeight={timelineManager.viewportHeight} - bind:clientWidth={null, (v: number) => ((timelineManager.viewportWidth = v), updateSlidingWindow())} - bind:this={element} - onscroll={() => (handleTimelineScroll(), updateSlidingWindow(), updateIsScrolling())} + bind:clientWidth={timelineManager.viewportWidth} + bind:this={scrollableElement} + onscroll={() => (handleTimelineScroll(), timelineManager.updateSlidingWindow(), updateIsScrolling())} >
- +
{:else if display}
{#if $showAssetViewer} - + {/if} diff --git a/web/src/lib/components/timeline/TimelineAssetViewer.svelte b/web/src/lib/components/timeline/TimelineAssetViewer.svelte index 60b839d7e1..9459eef25b 100644 --- a/web/src/lib/components/timeline/TimelineAssetViewer.svelte +++ b/web/src/lib/components/timeline/TimelineAssetViewer.svelte @@ -13,7 +13,7 @@ interface Props { timelineManager: TimelineManager; - showSkeleton: boolean; + invisible: boolean; withStacked?: boolean; isShared?: boolean; album?: AlbumResponseDto | null; @@ -30,7 +30,7 @@ let { timelineManager, - showSkeleton = $bindable(false), + invisible = $bindable(false), removeAction, withStacked = false, isShared = false, @@ -81,7 +81,7 @@ const handleClose = async (asset: { id: string }) => { assetViewingStore.showAssetViewer(false); - showSkeleton = true; + invisible = true; $gridScrollTarget = { at: asset.id }; await navigate({ targetRoute: 'current', assetId: null, assetGridRouteSearchParams: $gridScrollTarget }); }; diff --git a/web/src/lib/components/timeline/TimelineDateGroup.svelte b/web/src/lib/components/timeline/TimelineDateGroup.svelte index 5070b6b7c1..cd0dc9a212 100644 --- a/web/src/lib/components/timeline/TimelineDateGroup.svelte +++ b/web/src/lib/components/timeline/TimelineDateGroup.svelte @@ -14,7 +14,7 @@ import { fromTimelinePlainDate, getDateLocaleString } from '$lib/utils/timeline-util'; import { Icon } from '@immich/ui'; - import type { Snippet } from 'svelte'; + import { type Snippet } from 'svelte'; import { flip } from 'svelte/animate'; import { scale } from 'svelte/transition'; diff --git a/web/src/lib/elements/Skeleton.svelte b/web/src/lib/elements/Skeleton.svelte index 8ee05f4e61..10ded84818 100644 --- a/web/src/lib/elements/Skeleton.svelte +++ b/web/src/lib/elements/Skeleton.svelte @@ -2,24 +2,21 @@ interface Props { height: number; title?: string; + invisible?: boolean; } - let { height = 0, title }: Props = $props(); + let { height = 0, title, invisible = false }: Props = $props(); -
+
{#if title}
{title}
{/if} -
+
diff --git a/web/src/lib/managers/timeline-manager/internal/load-support.svelte.ts b/web/src/lib/managers/timeline-manager/internal/load-support.svelte.ts index 82a9e8083d..e6a80afc7f 100644 --- a/web/src/lib/managers/timeline-manager/internal/load-support.svelte.ts +++ b/web/src/lib/managers/timeline-manager/internal/load-support.svelte.ts @@ -4,7 +4,6 @@ import { getTimeBucket } from '@immich/sdk'; import type { MonthGroup } from '../month-group.svelte'; import type { TimelineManager } from '../timeline-manager.svelte'; import type { TimelineManagerOptions } from '../types'; -import { layoutMonthGroup } from './layout-support.svelte'; export async function loadFromTimeBuckets( timelineManager: TimelineManager, @@ -55,6 +54,4 @@ export async function loadFromTimeBuckets( )}`, ); } - - layoutMonthGroup(timelineManager, monthGroup); } diff --git a/web/src/lib/managers/timeline-manager/month-group.svelte.ts b/web/src/lib/managers/timeline-manager/month-group.svelte.ts index f9c34668b8..d244df9f81 100644 --- a/web/src/lib/managers/timeline-manager/month-group.svelte.ts +++ b/web/src/lib/managers/timeline-manager/month-group.svelte.ts @@ -36,6 +36,7 @@ export class MonthGroup { #initialCount: number = 0; #sortOrder: AssetOrder = AssetOrder.Desc; + percent: number = $state(0); assetsCount: number = $derived( this.isLoaded @@ -241,7 +242,6 @@ export class MonthGroup { if (this.#height === height) { return; } - let needsIntersectionUpdate = false; const timelineManager = this.timelineManager; const index = timelineManager.months.indexOf(this); const heightDelta = height - this.#height; @@ -261,11 +261,21 @@ export class MonthGroup { const newTop = monthGroup.#top + heightDelta; if (monthGroup.#top !== newTop) { monthGroup.#top = newTop; - needsIntersectionUpdate = true; } } - if (needsIntersectionUpdate) { - timelineManager.updateIntersections(); + if (!timelineManager.viewportTopMonthIntersection) { + return; + } + const { month, monthBottomViewportRatio, viewportTopRatioInMonth } = timelineManager.viewportTopMonthIntersection; + const currentIndex = month ? timelineManager.months.indexOf(month) : -1; + if (!month || currentIndex <= 0 || index > currentIndex) { + return; + } + if (index < currentIndex || monthBottomViewportRatio < 1) { + timelineManager.scrollBy(heightDelta); + } else if (index === currentIndex) { + const scrollTo = this.top + height * viewportTopRatioInMonth; + timelineManager.scrollTo(scrollTo); } } diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts index ceafa5b0bd..7c448331ff 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.spec.ts @@ -4,6 +4,7 @@ import { AbortError } from '$lib/utils'; import { fromISODateTimeUTCToObject } from '$lib/utils/timeline-util'; import { type AssetResponseDto, type TimeBucketAssetResponseDto } from '@immich/sdk'; import { timelineAssetFactory, toResponseDto } from '@test-data/factories/asset-factory'; +import { tick } from 'svelte'; import { TimelineManager } from './timeline-manager.svelte'; import type { TimelineAsset } from './types'; @@ -64,11 +65,12 @@ describe('TimelineManager', () => { sdkMock.getTimeBucket.mockImplementation(({ timeBucket }) => Promise.resolve(bucketAssetsResponse[timeBucket])); await timelineManager.updateViewport({ width: 1588, height: 1000 }); + await tick(); }); it('should load months in viewport', () => { expect(sdkMock.getTimeBuckets).toBeCalledTimes(1); - expect(sdkMock.getTimeBucket).toHaveBeenCalledTimes(3); + expect(sdkMock.getTimeBucket).toHaveBeenCalledTimes(2); }); it('calculates month height', () => { @@ -82,13 +84,13 @@ describe('TimelineManager', () => { expect.arrayContaining([ expect.objectContaining({ year: 2024, month: 3, height: 165.5 }), expect.objectContaining({ year: 2024, month: 2, height: 11_996 }), - expect.objectContaining({ year: 2024, month: 1, height: 48 }), + expect.objectContaining({ year: 2024, month: 1, height: 286 }), ]), ); }); it('calculates timeline height', () => { - expect(timelineManager.timelineHeight).toBe(12_209.5); + expect(timelineManager.timelineHeight).toBe(12_447.5); }); }); diff --git a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts index f507f4de28..23cf677b40 100644 --- a/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts +++ b/web/src/lib/managers/timeline-manager/timeline-manager.svelte.ts @@ -5,7 +5,7 @@ import { authManager } from '$lib/managers/auth-manager.svelte'; import { CancellableTask } from '$lib/utils/cancellable-task'; import { toTimelineAsset, type TimelineDateTime, type TimelineYearMonth } from '$lib/utils/timeline-util'; -import { debounce, isEqual } from 'lodash-es'; +import { clamp, debounce, isEqual } from 'lodash-es'; import { SvelteDate, SvelteMap, SvelteSet } from 'svelte/reactivity'; import { updateIntersectionMonthGroup } from '$lib/managers/timeline-manager/internal/intersection-support.svelte'; @@ -37,6 +37,13 @@ import type { Viewport, } from './types'; +type ViewportTopMonthIntersection = { + month: MonthGroup | undefined; + // Where viewport top intersects month (0 = month top, 1 = month bottom) + viewportTopRatioInMonth: number; + // Where month bottom is in viewport (0 = viewport top, 1 = viewport bottom) + monthBottomViewportRatio: number; +}; export class TimelineManager { isInitialized = $state(false); months: MonthGroup[] = $state([]); @@ -49,6 +56,8 @@ export class TimelineManager { scrubberMonths: ScrubberMonth[] = $state([]); scrubberTimelineHeight: number = $state(0); + viewportTopMonthIntersection: ViewportTopMonthIntersection | undefined; + visibleWindow = $derived.by(() => ({ top: this.#scrollTop, bottom: this.#scrollTop + this.viewportHeight, @@ -85,6 +94,8 @@ export class TimelineManager { #suspendTransitions = $state(false); #resetScrolling = debounce(() => (this.#scrolling = false), 1000); #resetSuspendTransitions = debounce(() => (this.suspendTransitions = false), 1000); + #updatingIntersections = false; + #scrollableElement: HTMLElement | undefined = $state(); constructor() {} @@ -98,6 +109,20 @@ export class TimelineManager { } } + set scrollableElement(element: HTMLElement | undefined) { + this.#scrollableElement = element; + } + + scrollTo(top: number) { + this.#scrollableElement?.scrollTo({ top }); + this.updateSlidingWindow(); + } + + scrollBy(y: number) { + this.#scrollableElement?.scrollBy(0, y); + this.updateSlidingWindow(); + } + #setHeaderHeight(value: number) { if (this.#headerHeight == value) { return false; @@ -161,7 +186,8 @@ export class TimelineManager { const changed = value !== this.#viewportWidth; this.#viewportWidth = value; this.suspendTransitions = true; - void this.#updateViewportGeometry(changed); + this.#updateViewportGeometry(changed); + this.updateSlidingWindow(); } get viewportWidth() { @@ -223,20 +249,52 @@ export class TimelineManager { this.#websocketSupport = undefined; } - updateSlidingWindow(scrollTop: number) { + updateSlidingWindow() { + const scrollTop = this.#scrollableElement?.scrollTop ?? 0; if (this.#scrollTop !== scrollTop) { this.#scrollTop = scrollTop; this.updateIntersections(); } } + #calculateMonthBottomViewportRatio(month: MonthGroup | undefined) { + if (!month) { + return 0; + } + const windowHeight = this.visibleWindow.bottom - this.visibleWindow.top; + const bottomOfMonth = month.top + month.height; + const bottomOfMonthInViewport = bottomOfMonth - this.visibleWindow.top; + return clamp(bottomOfMonthInViewport / windowHeight, 0, 1); + } + + #calculateVewportTopRatioInMonth(month: MonthGroup | undefined) { + if (!month) { + return 0; + } + return clamp((this.visibleWindow.top - month.top) / month.height, 0, 1); + } + updateIntersections() { - if (!this.isInitialized || this.visibleWindow.bottom === this.visibleWindow.top) { + if (this.#updatingIntersections || !this.isInitialized || this.visibleWindow.bottom === this.visibleWindow.top) { return; } + this.#updatingIntersections = true; + for (const month of this.months) { updateIntersectionMonthGroup(this, month); } + + const month = this.months.find((month) => month.actuallyIntersecting); + const viewportTopRatioInMonth = this.#calculateVewportTopRatioInMonth(month); + const monthBottomViewportRatio = this.#calculateMonthBottomViewportRatio(month); + + this.viewportTopMonthIntersection = { + month, + monthBottomViewportRatio, + viewportTopRatioInMonth, + }; + + this.#updatingIntersections = false; } clearDeferredLayout(month: MonthGroup) { @@ -368,7 +426,8 @@ export class TimelineManager { await loadFromTimeBuckets(this, monthGroup, this.#options, signal); }, cancelable); if (executionStatus === 'LOADED') { - updateIntersectionMonthGroup(this, monthGroup); + updateGeometry(this, monthGroup, { invalidateHeight: false }); + this.updateIntersections(); } } From 8473dab68467c8644be4ffcd714c060a179e3403 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Mon, 13 Oct 2025 21:34:22 -0500 Subject: [PATCH 099/134] fix: shared album control permissions (#22435) * fix: shared album control permissions * fix: properly display "add photos" * fix: dont allow modification of album order * fix: album title/description edit from app bar * chore: code review changes * chore: format translations * chore: lintings --- i18n/en.json | 1 + .../domain/services/remote_album.service.dart | 4 ++ .../repositories/remote_album.repository.dart | 9 ++++ .../pages/drift_remote_album.page.dart | 51 ++++++++++++------- .../asset_viewer/bottom_bar.widget.dart | 2 +- .../asset_viewer/bottom_sheet.widget.dart | 44 +++++++++------- .../asset_viewer/top_app_bar.widget.dart | 3 +- .../remote_album_bottom_sheet.widget.dart | 39 ++++++++------ 8 files changed, 99 insertions(+), 54 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index bd59c37fac..2f98ab4bcb 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1039,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Error updating description", "exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_location": "LOCATION", + "exif_bottom_sheet_no_description": "No description", "exif_bottom_sheet_people": "PEOPLE", "exif_bottom_sheet_person_add_person": "Add name", "exit_slideshow": "Exit Slideshow", diff --git a/mobile/lib/domain/services/remote_album.service.dart b/mobile/lib/domain/services/remote_album.service.dart index cc28dfafd5..13dfadb8d8 100644 --- a/mobile/lib/domain/services/remote_album.service.dart +++ b/mobile/lib/domain/services/remote_album.service.dart @@ -120,6 +120,10 @@ class RemoteAlbumService { return _repository.getSharedUsers(albumId); } + Future getUserRole(String albumId, String userId) { + return _repository.getUserRole(albumId, userId); + } + Future> getAssets(String albumId) { return _repository.getAssets(albumId); } diff --git a/mobile/lib/infrastructure/repositories/remote_album.repository.dart b/mobile/lib/infrastructure/repositories/remote_album.repository.dart index 22d4715c1e..0526cfb7aa 100644 --- a/mobile/lib/infrastructure/repositories/remote_album.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_album.repository.dart @@ -221,6 +221,15 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository { .get(); } + Future getUserRole(String albumId, String userId) async { + final query = _db.remoteAlbumUserEntity.select() + ..where((row) => row.albumId.equals(albumId) & row.userId.equals(userId)) + ..limit(1); + + final result = await query.getSingleOrNull(); + return result?.role; + } + Future> getAssets(String albumId) { final query = _db.remoteAlbumAssetEntity.select().join([ innerJoin(_db.remoteAssetEntity, _db.remoteAssetEntity.id.equalsExp(_db.remoteAlbumAssetEntity.assetId)), diff --git a/mobile/lib/presentation/pages/drift_remote_album.page.dart b/mobile/lib/presentation/pages/drift_remote_album.page.dart index 34d8919674..23d82dcb92 100644 --- a/mobile/lib/presentation/pages/drift_remote_album.page.dart +++ b/mobile/lib/presentation/pages/drift_remote_album.page.dart @@ -169,9 +169,11 @@ class _RemoteAlbumPageState extends ConsumerState { context.pushRoute(const DriftActivitiesRoute()); } - void showOptionSheet(BuildContext context) { + Future showOptionSheet(BuildContext context) async { final user = ref.watch(currentUserProvider); final isOwner = user != null ? user.id == _album.ownerId : false; + final canAddPhotos = + await ref.read(remoteAlbumServiceProvider).getUserRole(_album.id, user?.id ?? '') == AlbumUserRole.editor; showModalBottomSheet( context: context, @@ -193,22 +195,30 @@ class _RemoteAlbumPageState extends ConsumerState { context.pop(); } : null, - onAddPhotos: () async { - await addAssets(context); - context.pop(); - }, - onToggleAlbumOrder: () async { - await toggleAlbumOrder(); - context.pop(); - }, - onEditAlbum: () async { - context.pop(); - await showEditTitleAndDescription(context); - }, - onCreateSharedLink: () async { - context.pop(); - context.pushRoute(SharedLinkEditRoute(albumId: _album.id)); - }, + onAddPhotos: isOwner || canAddPhotos + ? () async { + await addAssets(context); + context.pop(); + } + : null, + onToggleAlbumOrder: isOwner + ? () async { + await toggleAlbumOrder(); + context.pop(); + } + : null, + onEditAlbum: isOwner + ? () async { + context.pop(); + await showEditTitleAndDescription(context); + } + : null, + onCreateSharedLink: isOwner + ? () async { + context.pop(); + context.pushRoute(SharedLinkEditRoute(albumId: _album.id)); + } + : null, onShowOptions: () { context.pop(); context.pushRoute(const DriftAlbumOptionsRoute()); @@ -220,6 +230,9 @@ class _RemoteAlbumPageState extends ConsumerState { @override Widget build(BuildContext context) { + final user = ref.watch(currentUserProvider); + final isOwner = user != null ? user.id == _album.ownerId : false; + return PopScope( onPopInvokedWithResult: (didPop, _) { if (didPop) { @@ -243,8 +256,8 @@ class _RemoteAlbumPageState extends ConsumerState { appBar: RemoteAlbumSliverAppBar( icon: Icons.photo_album_outlined, onShowOptions: () => showOptionSheet(context), - onToggleAlbumOrder: () => toggleAlbumOrder(), - onEditTitle: () => showEditTitleAndDescription(context), + onToggleAlbumOrder: isOwner ? () => toggleAlbumOrder() : null, + onEditTitle: isOwner ? () => showEditTitleAndDescription(context) : null, onActivity: () => showActivity(context), ), bottomSheet: RemoteAlbumBottomSheet(album: _album), diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart index 3111512823..44660e440c 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_bar.widget.dart @@ -43,7 +43,7 @@ class ViewerBottomBar extends ConsumerWidget { final actions = [ const ShareActionButton(source: ActionSource.viewer), if (asset.isLocalOnly) const UploadActionButton(source: ActionSource.viewer), - if (asset.type == AssetType.image) const EditImageActionButton(), + if (asset.type == AssetType.image && isOwner) const EditImageActionButton(), if (isOwner) ...[ if (asset.hasRemote && isOwner && isArchived) const UnArchiveActionButton(source: ActionSource.viewer) diff --git a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart index bdd7fb9b48..9d29b19bff 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/bottom_sheet.widget.dart @@ -140,6 +140,7 @@ class _AssetDetailBottomSheet extends ConsumerWidget { final exifInfo = ref.watch(currentAssetExifProvider).valueOrNull; final cameraTitle = _getCameraInfoTitle(exifInfo); + final isOwner = ref.watch(currentUserProvider)?.id == (asset is RemoteAsset ? asset.ownerId : null); return SliverList.list( children: [ @@ -147,10 +148,10 @@ class _AssetDetailBottomSheet extends ConsumerWidget { _SheetTile( title: _getDateTime(context, asset), titleStyle: context.textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.w600), - trailing: asset.hasRemote ? const Icon(Icons.edit, size: 18) : null, - onTap: asset.hasRemote ? () async => await _editDateTime(context, ref) : null, + trailing: asset.hasRemote && isOwner ? const Icon(Icons.edit, size: 18) : null, + onTap: asset.hasRemote && isOwner ? () async => await _editDateTime(context, ref) : null, ), - if (exifInfo != null) _SheetAssetDescription(exif: exifInfo), + if (exifInfo != null) _SheetAssetDescription(exif: exifInfo, isEditable: isOwner), const SheetPeopleDetails(), const SheetLocationDetails(), // Details header @@ -265,8 +266,9 @@ class _SheetTile extends ConsumerWidget { class _SheetAssetDescription extends ConsumerStatefulWidget { final ExifInfo exif; + final bool isEditable; - const _SheetAssetDescription({required this.exif}); + const _SheetAssetDescription({required this.exif, this.isEditable = true}); @override ConsumerState<_SheetAssetDescription> createState() => _SheetAssetDescriptionState(); @@ -312,27 +314,33 @@ class _SheetAssetDescriptionState extends ConsumerState<_SheetAssetDescription> // Update controller text when EXIF data changes final currentDescription = currentExifInfo?.description ?? ''; + final hintText = (widget.isEditable ? 'exif_bottom_sheet_description' : 'exif_bottom_sheet_no_description').t( + context: context, + ); if (_controller.text != currentDescription && !_descriptionFocus.hasFocus) { _controller.text = currentDescription; } return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), - child: TextField( - controller: _controller, - keyboardType: TextInputType.multiline, - focusNode: _descriptionFocus, - maxLines: null, // makes it grow as text is added - decoration: InputDecoration( - hintText: 'exif_bottom_sheet_description'.t(context: context), - border: InputBorder.none, - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - disabledBorder: InputBorder.none, - errorBorder: InputBorder.none, - focusedErrorBorder: InputBorder.none, + child: IgnorePointer( + ignoring: !widget.isEditable, + child: TextField( + controller: _controller, + keyboardType: TextInputType.multiline, + focusNode: _descriptionFocus, + maxLines: null, // makes it grow as text is added + decoration: InputDecoration( + hintText: hintText, + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + disabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + focusedErrorBorder: InputBorder.none, + ), + onTapOutside: (_) => saveDescription(currentExifInfo?.description), ), - onTapOutside: (_) => saveDescription(currentExifInfo?.description), ), ); } diff --git a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart index 149252ab17..c0e93a73cc 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart @@ -45,7 +45,8 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { (previousRouteName != TabShellRoute.name || tabRoute == TabEnum.search) && previousRouteName != AssetViewerRoute.name && previousRouteName != null && - previousRouteName != LocalTimelineRoute.name; + previousRouteName != LocalTimelineRoute.name && + isOwner; final isShowingSheet = ref.watch(assetViewerProvider.select((state) => state.showingBottomSheet)); int opacity = ref.watch(assetViewerProvider.select((state) => state.backgroundOpacity)); diff --git a/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart b/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart index 0ab419a56b..7db8a80af2 100644 --- a/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart +++ b/mobile/lib/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart @@ -24,6 +24,7 @@ import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_shee import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; +import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; class RemoteAlbumBottomSheet extends ConsumerStatefulWidget { @@ -53,6 +54,7 @@ class _RemoteAlbumBottomSheetState extends ConsumerState Widget build(BuildContext context) { final multiselect = ref.watch(multiSelectProvider); final isTrashEnable = ref.watch(serverInfoProvider.select((state) => state.serverFeatures.trash)); + final ownsAlbum = ref.watch(currentUserProvider)?.id == widget.album.ownerId; Future addAssetsToAlbum(RemoteAlbum album) async { final selectedAssets = multiselect.selectedAssets; @@ -93,28 +95,35 @@ class _RemoteAlbumBottomSheetState extends ConsumerState const ShareActionButton(source: ActionSource.timeline), if (multiselect.hasRemote) ...[ const ShareLinkActionButton(source: ActionSource.timeline), - const ArchiveActionButton(source: ActionSource.timeline), - const FavoriteActionButton(source: ActionSource.timeline), + + if (ownsAlbum) ...[ + const ArchiveActionButton(source: ActionSource.timeline), + const FavoriteActionButton(source: ActionSource.timeline), + ], const DownloadActionButton(source: ActionSource.timeline), - isTrashEnable - ? const TrashActionButton(source: ActionSource.timeline) - : const DeletePermanentActionButton(source: ActionSource.timeline), - const EditDateTimeActionButton(source: ActionSource.timeline), - const EditLocationActionButton(source: ActionSource.timeline), - const MoveToLockFolderActionButton(source: ActionSource.timeline), - if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline), - if (multiselect.hasStacked) const UnStackActionButton(source: ActionSource.timeline), + if (ownsAlbum) ...[ + isTrashEnable + ? const TrashActionButton(source: ActionSource.timeline) + : const DeletePermanentActionButton(source: ActionSource.timeline), + const EditDateTimeActionButton(source: ActionSource.timeline), + const EditLocationActionButton(source: ActionSource.timeline), + const MoveToLockFolderActionButton(source: ActionSource.timeline), + if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline), + if (multiselect.hasStacked) const UnStackActionButton(source: ActionSource.timeline), + ], ], if (multiselect.hasLocal) ...[ const DeleteLocalActionButton(source: ActionSource.timeline), const UploadActionButton(source: ActionSource.timeline), ], - RemoveFromAlbumActionButton(source: ActionSource.timeline, albumId: widget.album.id), - ], - slivers: [ - const AddToAlbumHeader(), - AlbumSelector(onAlbumSelected: addAssetsToAlbum, onKeyboardExpanded: onKeyboardExpand), + if (ownsAlbum) RemoveFromAlbumActionButton(source: ActionSource.timeline, albumId: widget.album.id), ], + slivers: ownsAlbum + ? [ + const AddToAlbumHeader(), + AlbumSelector(onAlbumSelected: addAssetsToAlbum, onKeyboardExpanded: onKeyboardExpand), + ] + : null, ); } } From dbee1337645b1ea1cc854784283499fd707b92ba Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 14 Oct 2025 12:50:14 +0530 Subject: [PATCH 100/134] fix: show dialog before delete local action (#22280) * fix: show dialog on delete local action # Conflicts: # mobile/lib/repositories/asset_media.repository.dart * button style --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex --- .../domain/models/asset/base_asset.model.dart | 2 + .../models/asset/local_asset.model.dart | 12 +++- .../models/asset/remote_asset.model.dart | 12 +++- .../delete_local_action_button.widget.dart | 13 ++++- .../infrastructure/action.provider.dart | 11 +++- .../repositories/asset_media.repository.dart | 1 + .../lib/widgets/asset_grid/delete_dialog.dart | 58 ++++++++++++------- 7 files changed, 80 insertions(+), 29 deletions(-) diff --git a/mobile/lib/domain/models/asset/base_asset.model.dart b/mobile/lib/domain/models/asset/base_asset.model.dart index 4d40be2d32..5774a13c90 100644 --- a/mobile/lib/domain/models/asset/base_asset.model.dart +++ b/mobile/lib/domain/models/asset/base_asset.model.dart @@ -56,6 +56,8 @@ sealed class BaseAsset { // Overridden in subclasses AssetState get storage; + String? get localId; + String? get remoteId; String get heroTag; @override diff --git a/mobile/lib/domain/models/asset/local_asset.model.dart b/mobile/lib/domain/models/asset/local_asset.model.dart index 9cd20acb0a..6f2f4c06ba 100644 --- a/mobile/lib/domain/models/asset/local_asset.model.dart +++ b/mobile/lib/domain/models/asset/local_asset.model.dart @@ -2,12 +2,12 @@ part of 'base_asset.model.dart'; class LocalAsset extends BaseAsset { final String id; - final String? remoteId; + final String? remoteAssetId; final int orientation; const LocalAsset({ required this.id, - this.remoteId, + String? remoteId, required super.name, super.checksum, required super.type, @@ -19,7 +19,13 @@ class LocalAsset extends BaseAsset { super.isFavorite = false, super.livePhotoVideoId, this.orientation = 0, - }); + }) : remoteAssetId = remoteId; + + @override + String? get localId => id; + + @override + String? get remoteId => remoteAssetId; @override AssetState get storage => remoteId == null ? AssetState.local : AssetState.merged; diff --git a/mobile/lib/domain/models/asset/remote_asset.model.dart b/mobile/lib/domain/models/asset/remote_asset.model.dart index 8648255167..4974dc9118 100644 --- a/mobile/lib/domain/models/asset/remote_asset.model.dart +++ b/mobile/lib/domain/models/asset/remote_asset.model.dart @@ -5,7 +5,7 @@ enum AssetVisibility { timeline, hidden, archive, locked } // Model for an asset stored in the server class RemoteAsset extends BaseAsset { final String id; - final String? localId; + final String? localAssetId; final String? thumbHash; final AssetVisibility visibility; final String ownerId; @@ -13,7 +13,7 @@ class RemoteAsset extends BaseAsset { const RemoteAsset({ required this.id, - this.localId, + String? localId, required super.name, required this.ownerId, required super.checksum, @@ -28,7 +28,13 @@ class RemoteAsset extends BaseAsset { this.visibility = AssetVisibility.timeline, super.livePhotoVideoId, this.stackId, - }); + }) : localAssetId = localId; + + @override + String? get localId => localAssetId; + + @override + String? get remoteId => id; @override AssetState get storage => localId == null ? AssetState.remote : AssetState.merged; diff --git a/mobile/lib/presentation/widgets/action_buttons/delete_local_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/delete_local_action_button.widget.dart index cccdee9b3a..9445daa2ad 100644 --- a/mobile/lib/presentation/widgets/action_buttons/delete_local_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/delete_local_action_button.widget.dart @@ -8,6 +8,7 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_bu import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; +import 'package:immich_mobile/widgets/asset_grid/delete_dialog.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; /// This delete action has the following behavior: @@ -22,7 +23,17 @@ class DeleteLocalActionButton extends ConsumerWidget { return; } - final result = await ref.read(actionProvider.notifier).deleteLocal(source); + bool? backedUpOnly = await showDialog( + context: context, + builder: (BuildContext context) => DeleteLocalOnlyDialog(onDeleteLocal: (_) {}), + ); + + if (backedUpOnly == null) { + // User cancelled the dialog + return; + } + + final result = await ref.read(actionProvider.notifier).deleteLocal(source, backedUpOnly); ref.read(multiSelectProvider.notifier).reset(); if (source == ActionSource.viewer) { diff --git a/mobile/lib/providers/infrastructure/action.provider.dart b/mobile/lib/providers/infrastructure/action.provider.dart index 21d76201c1..9f38f4b0ec 100644 --- a/mobile/lib/providers/infrastructure/action.provider.dart +++ b/mobile/lib/providers/infrastructure/action.provider.dart @@ -260,8 +260,15 @@ class ActionNotifier extends Notifier { } } - Future deleteLocal(ActionSource source) async { - final ids = _getLocalIdsForSource(source); + Future deleteLocal(ActionSource source, bool backedUpOnly) async { + final List ids; + if (backedUpOnly) { + final assets = _getAssets(source); + ids = assets.where((asset) => asset.storage == AssetState.merged).map((asset) => asset.localId!).toList(); + } else { + ids = _getLocalIdsForSource(source); + } + try { final deletedCount = await _service.deleteLocal(ids); return ActionResult(count: deletedCount, success: true); diff --git a/mobile/lib/repositories/asset_media.repository.dart b/mobile/lib/repositories/asset_media.repository.dart index 8336d2341d..f71c919373 100644 --- a/mobile/lib/repositories/asset_media.repository.dart +++ b/mobile/lib/repositories/asset_media.repository.dart @@ -22,6 +22,7 @@ final assetMediaRepositoryProvider = Provider((ref) => AssetMediaRepository(ref. class AssetMediaRepository { final AssetApiRepository _assetApiRepository; + static final Logger _log = Logger("AssetMediaRepository"); const AssetMediaRepository(this._assetApiRepository); diff --git a/mobile/lib/widgets/asset_grid/delete_dialog.dart b/mobile/lib/widgets/asset_grid/delete_dialog.dart index e7c7775e54..adb22889a8 100644 --- a/mobile/lib/widgets/asset_grid/delete_dialog.dart +++ b/mobile/lib/widgets/asset_grid/delete_dialog.dart @@ -22,12 +22,12 @@ class DeleteLocalOnlyDialog extends StatelessWidget { @override Widget build(BuildContext context) { void onDeleteBackedUpOnly() { - context.pop(); + context.pop(true); onDeleteLocal(true); } void onForceDelete() { - context.pop(); + context.pop(false); onDeleteLocal(false); } @@ -36,26 +36,44 @@ class DeleteLocalOnlyDialog extends StatelessWidget { title: const Text("delete_dialog_title").tr(), content: const Text("delete_dialog_alert_local_non_backed_up").tr(), actions: [ - TextButton( - onPressed: () => context.pop(), - child: Text( - "cancel", - style: TextStyle(color: context.primaryColor, fontWeight: FontWeight.bold), - ).tr(), + SizedBox( + width: double.infinity, + height: 48, + child: FilledButton( + onPressed: () => context.pop(), + style: FilledButton.styleFrom( + backgroundColor: context.colorScheme.surfaceDim, + foregroundColor: context.primaryColor, + ), + child: const Text("cancel", style: TextStyle(fontWeight: FontWeight.bold)).tr(), + ), ), - TextButton( - onPressed: onDeleteBackedUpOnly, - child: Text( - "delete_local_dialog_ok_backed_up_only", - style: TextStyle(color: context.colorScheme.tertiary, fontWeight: FontWeight.bold), - ).tr(), + const SizedBox(height: 8), + SizedBox( + width: double.infinity, + height: 48, + + child: FilledButton( + onPressed: onDeleteBackedUpOnly, + style: FilledButton.styleFrom( + backgroundColor: context.colorScheme.errorContainer, + foregroundColor: context.colorScheme.onErrorContainer, + ), + child: const Text( + "delete_local_dialog_ok_backed_up_only", + style: TextStyle(fontWeight: FontWeight.bold), + ).tr(), + ), ), - TextButton( - onPressed: onForceDelete, - child: Text( - "delete_local_dialog_ok_force", - style: TextStyle(color: Colors.red[400], fontWeight: FontWeight.bold), - ).tr(), + const SizedBox(height: 8), + SizedBox( + width: double.infinity, + height: 48, + child: FilledButton( + onPressed: onForceDelete, + style: FilledButton.styleFrom(backgroundColor: Colors.red[400], foregroundColor: Colors.white), + child: const Text("delete_local_dialog_ok_force", style: TextStyle(fontWeight: FontWeight.bold)).tr(), + ), ), ], ); From e4d2c4926cf6b30854d9b14ddcbe24768d81c753 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:11:52 +0200 Subject: [PATCH 101/134] fix(deps): update dependency kysely-postgres-js to v3 (#22924) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 17 +++++++++++------ server/package.json | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1bd16729f..4388844008 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -434,8 +434,8 @@ importers: specifier: 0.28.2 version: 0.28.2 kysely-postgres-js: - specifier: ^2.0.0 - version: 2.0.0(kysely@0.28.2)(postgres@3.4.7) + specifier: ^3.0.0 + version: 3.0.0(kysely@0.28.2)(postgres@3.4.7) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -7677,11 +7677,15 @@ packages: resolution: {integrity: sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==} engines: {node: '>= 18'} - kysely-postgres-js@2.0.0: - resolution: {integrity: sha512-R1tWx6/x3tSatWvsmbHJxpBZYhNNxcnMw52QzZaHKg7ZOWtHib4iZyEaw4gb2hNKVctWQ3jfMxZT/ZaEMK6kBQ==} + kysely-postgres-js@3.0.0: + resolution: {integrity: sha512-o2t/xNSYJQDW6rVGGFPXKmZ0BEz2dGn66c2B+cO/k9ZNcU2qPWPycQPQ+B+P2MBXbKYq0xV9BZmFIvkUrmFWAQ==} + engines: {bun: '>=1.2', node: '>=20'} peerDependencies: kysely: '>= 0.24.0 < 1' - postgres: '>= 3.4.0 < 4' + postgres: ^3.4.0 + peerDependenciesMeta: + postgres: + optional: true kysely@0.28.2: resolution: {integrity: sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A==} @@ -19996,9 +20000,10 @@ snapshots: type-is: 2.0.1 vary: 1.1.2 - kysely-postgres-js@2.0.0(kysely@0.28.2)(postgres@3.4.7): + kysely-postgres-js@3.0.0(kysely@0.28.2)(postgres@3.4.7): dependencies: kysely: 0.28.2 + optionalDependencies: postgres: 3.4.7 kysely@0.28.2: {} diff --git a/server/package.json b/server/package.json index 293e43c893..878acb6cad 100644 --- a/server/package.json +++ b/server/package.json @@ -78,7 +78,7 @@ "ioredis": "^5.3.2", "js-yaml": "^4.1.0", "kysely": "0.28.2", - "kysely-postgres-js": "^2.0.0", + "kysely-postgres-js": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.4.2", "mnemonist": "^0.40.3", From 6d009300828c37baa4c7efa8147da57721020531 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:16:21 +0200 Subject: [PATCH 102/134] chore(deps): update redis:6.2-alpine docker digest to 77697a7 (#22915) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- e2e/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index ec7865538f..9aef2288f6 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -35,7 +35,7 @@ services: - 2285:2285 redis: - image: redis:6.2-alpine@sha256:2185e741f4c1e7b0ea9ca1e163a3767c4270a73086b6bbea2049a7203212fb7f + image: redis:6.2-alpine@sha256:77697a75da9f94e9357b61fcaf8345f69e3d9d32e9d15032c8415c21263977dc database: image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:6f3e9d2c2177af16c2988ff71425d79d89ca630ec2f9c8db03209ab716542338 From 4d41fa08ad57f9dd58ebe8d86645f7510fe59461 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 12:22:13 +0200 Subject: [PATCH 103/134] fix(deps): update typescript-projects (#22918) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Dietzler --- mise.toml | 2 +- package.json | 2 +- pnpm-lock.yaml | 863 ++++++++++++++++++++++---------------------- server/package.json | 12 +- 4 files changed, 439 insertions(+), 440 deletions(-) diff --git a/mise.toml b/mise.toml index ac6bcdb816..275098ab55 100644 --- a/mise.toml +++ b/mise.toml @@ -1,7 +1,7 @@ [tools] node = "22.20.0" flutter = "3.35.5" -pnpm = "10.18.0" +pnpm = "10.18.1" [tools."github:CQLabs/homebrew-dcm"] version = "1.30.0" diff --git a/package.json b/package.json index ac281d42a2..415c598179 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Monorepo for Immich", "private": true, - "packageManager": "pnpm@10.18.0+sha512.e804f889f1cecc40d572db084eec3e4881739f8dec69c0ff10d2d1beff9a4e309383ba27b5b750059d7f4c149535b6cd0d2cb1ed3aeb739239a4284a68f40cfa", + "packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34", "engines": { "pnpm": ">=10.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4388844008..4a38969b4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,10 +64,10 @@ importers: version: 4.13.4 '@types/node': specifier: ^22.18.8 - version: 22.18.9 + version: 22.18.10 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) byte-size: specifier: ^9.0.0 version: 9.0.1 @@ -106,19 +106,19 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.0.0 - version: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) vitest-fetch-mock: specifier: ^0.4.0 - version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) yaml: specifier: ^2.3.1 version: 2.8.1 @@ -203,7 +203,7 @@ importers: version: link:../open-api/typescript-sdk '@playwright/test': specifier: ^1.44.1 - version: 1.55.1 + version: 1.56.0 '@socket.io/component-emitter': specifier: ^3.1.2 version: 3.1.2 @@ -212,7 +212,7 @@ importers: version: 3.7.1 '@types/node': specifier: ^22.18.8 - version: 22.18.9 + version: 22.18.10 '@types/oidc-provider': specifier: ^9.0.0 version: 9.5.0 @@ -278,13 +278,13 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) utimes: specifier: ^5.2.1 version: 5.2.1(encoding@0.1.13) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) open-api/typescript-sdk: dependencies: @@ -294,7 +294,7 @@ importers: devDependencies: '@types/node': specifier: ^22.18.8 - version: 22.18.9 + version: 22.18.10 typescript: specifier: ^5.3.3 version: 5.9.3 @@ -303,7 +303,7 @@ importers: dependencies: '@nestjs/bullmq': specifier: ^11.0.1 - version: 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.60.0) + version: 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.61.0) '@nestjs/common': specifier: ^11.0.4 version: 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -332,20 +332,20 @@ importers: specifier: ^2.0.0 version: 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-prometheus': - specifier: ^0.205.0 - version: 0.205.0(@opentelemetry/api@1.9.0) + specifier: ^0.206.0 + version: 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-http': - specifier: ^0.205.0 - version: 0.205.0(@opentelemetry/api@1.9.0) + specifier: ^0.206.0 + version: 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-ioredis': - specifier: ^0.53.0 - version: 0.53.3(@opentelemetry/api@1.9.0) + specifier: ^0.54.0 + version: 0.54.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-nestjs-core': - specifier: ^0.52.0 - version: 0.52.2(@opentelemetry/api@1.9.0) + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-pg': - specifier: ^0.58.0 - version: 0.58.3(@opentelemetry/api@1.9.0) + specifier: ^0.59.0 + version: 0.59.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': specifier: ^2.0.1 version: 2.1.0(@opentelemetry/api@1.9.0) @@ -353,17 +353,17 @@ importers: specifier: ^2.0.1 version: 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': - specifier: ^0.205.0 - version: 0.205.0(@opentelemetry/api@1.9.0) + specifier: ^0.206.0 + version: 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': specifier: ^1.34.0 version: 1.37.0 '@react-email/components': specifier: ^0.5.0 - version: 0.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.5.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-email/render': specifier: ^1.1.2 - version: 1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.3.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@socket.io/redis-adapter': specifier: ^8.3.0 version: 8.3.0(socket.io-adapter@2.5.5) @@ -381,7 +381,7 @@ importers: version: 2.2.0 bullmq: specifier: ^5.51.0 - version: 5.60.0 + version: 5.61.0 chokidar: specifier: ^4.0.3 version: 4.0.3 @@ -426,7 +426,7 @@ importers: version: 7.14.0 ioredis: specifier: ^5.3.2 - version: 5.8.0 + version: 5.8.1 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -450,7 +450,7 @@ importers: version: 2.0.2 nest-commander: specifier: ^3.16.0 - version: 3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.9)(typescript@5.9.3) + version: 3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.10)(typescript@5.9.3) nestjs-cls: specifier: ^5.0.0 version: 5.4.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -462,7 +462,7 @@ importers: version: 7.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) nodemailer: specifier: ^7.0.0 - version: 7.0.7 + version: 7.0.9 openid-client: specifier: ^6.3.3 version: 6.8.1 @@ -486,7 +486,7 @@ importers: version: 19.2.0(react@19.2.0) react-email: specifier: ^4.0.0 - version: 4.2.12 + version: 4.3.0 reflect-metadata: specifier: ^0.2.0 version: 0.2.2 @@ -532,7 +532,7 @@ importers: version: 9.37.0 '@nestjs/cli': specifier: ^11.0.2 - version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.9) + version: 11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.10) '@nestjs/schematics': specifier: ^11.0.0 version: 11.0.8(chokidar@4.0.3)(typescript@5.9.3) @@ -583,7 +583,7 @@ importers: version: 2.0.0 '@types/node': specifier: ^22.18.8 - version: 22.18.9 + version: 22.18.10 '@types/nodemailer': specifier: ^7.0.0 version: 7.0.2 @@ -613,7 +613,7 @@ importers: version: 13.15.3 '@vitest/coverage-v8': specifier: ^3.0.0 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: ^9.14.0 version: 9.37.0(jiti@2.6.1) @@ -661,16 +661,16 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) unplugin-swc: specifier: ^1.4.5 version: 1.5.7(@swc/core@1.13.5(@swc/helpers@0.5.17))(rollup@4.52.4) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) web: dependencies: @@ -757,7 +757,7 @@ importers: version: 1.5.4 simple-icons: specifier: ^15.15.0 - version: 15.16.0 + version: 15.16.1 socket.io-client: specifier: ~4.8.0 version: 4.8.1 @@ -794,13 +794,13 @@ importers: version: 3.1.2 '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.10(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + version: 3.0.10(@sveltejs/kit@2.46.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) '@sveltejs/enhanced-img': specifier: ^0.8.0 - version: 0.8.3(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.8.4(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@sveltejs/kit': specifier: ^2.27.1 - version: 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 2.46.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@sveltejs/vite-plugin-svelte': specifier: 6.2.1 version: 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) @@ -809,7 +809,7 @@ importers: version: 4.1.14(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.8.0 + version: 6.9.1 '@testing-library/svelte': specifier: ^5.2.8 version: 5.2.8(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) @@ -881,7 +881,7 @@ importers: version: 5.39.11 svelte-check: specifier: ^4.1.5 - version: 4.3.2(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3) + version: 4.3.3(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3) svelte-eslint-parser: specifier: ^1.3.3 version: 1.3.3(svelte@5.39.11) @@ -893,7 +893,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.45.0 - version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.1.2 version: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) @@ -3265,8 +3265,8 @@ packages: '@oazapfts/runtime@1.0.4': resolution: {integrity: sha512-7t6C2shug/6tZhQgkCa532oTYBLEnbASV/i1SG1rH2GB4h3aQQujYciYSPT92hvN4IwTe8S2hPkN/6iiOyTlCg==} - '@opentelemetry/api-logs@0.205.0': - resolution: {integrity: sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg==} + '@opentelemetry/api-logs@0.206.0': + resolution: {integrity: sha512-yIVDu9jX//nV5wSMLZLdHdb1SKHIMj9k+wQVFtln5Flcgdldz9BkHtavvExQiJqBZg2OpEEJEZmzQazYztdz2A==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.0': @@ -3285,62 +3285,62 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-logs-otlp-grpc@0.205.0': - resolution: {integrity: sha512-jQlw7OHbqZ8zPt+pOrW2KGN7T55P50e3NXBMr4ckPOF+DWDwSy4W7mkG09GpYWlQAQ5C9BXg5gfUlv5ldTgWsw==} + '@opentelemetry/exporter-logs-otlp-grpc@0.206.0': + resolution: {integrity: sha512-kJKxKBaGwqWop95d6tcluz260IWwIgOG0BH8oVm6429tg8LxY2PJb7Om8d5s+5vOFM8DkUYCnIpn9d/13/RcKQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-http@0.205.0': - resolution: {integrity: sha512-5JteMyVWiro4ghF0tHQjfE6OJcF7UBUcoEqX3UIQ5jutKP1H+fxFdyhqjjpmeHMFxzOHaYuLlNR1Bn7FOjGyJg==} + '@opentelemetry/exporter-logs-otlp-http@0.206.0': + resolution: {integrity: sha512-VWcHEnS+1kN+sQTAdCgSn2anqHPxY1/e52fhpe2mcSnEaXI1srFf3RU5DAu7hzQO6T9DPQzOKG8kc76vCtyYDw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-proto@0.205.0': - resolution: {integrity: sha512-q3VS9wS+lpZ01txKxiDGBtBpTNge3YhbVEFDgem9ZQR9eI3EZ68+9tVZH9zJcSxI37nZPJ6lEEZO58yEjYZsVA==} + '@opentelemetry/exporter-logs-otlp-proto@0.206.0': + resolution: {integrity: sha512-CsYNXJwkn1qCXJGE+/JvvYucAjL8rpaxa2hnl+tDP6M5E0O3UVa8zG4ZUEebjr5J5Nc32egvslEZx5rgNOp3lQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-grpc@0.205.0': - resolution: {integrity: sha512-1Vxlo4lUwqSKYX+phFkXHKYR3DolFHxCku6lVMP1H8sVE3oj4wwmwxMzDsJ7zF+sXd8M0FCr+ckK4SnNNKkV+w==} + '@opentelemetry/exporter-metrics-otlp-grpc@0.206.0': + resolution: {integrity: sha512-/qGIwVa27BSGqzULB34O+UtEVl4isc+gEd2ydMfZVidWpdkJYbMeZZYBWi4z6giD0w0Dep5k/NIJ/lSEZoKEIg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.205.0': - resolution: {integrity: sha512-fFxNQ/HbbpLmh1pgU6HUVbFD1kNIjrkoluoKJkh88+gnmpFD92kMQ8WFNjPnSbjg2mNVnEkeKXgCYEowNW+p1w==} + '@opentelemetry/exporter-metrics-otlp-http@0.206.0': + resolution: {integrity: sha512-u6ztHNbgNlFw3vCuOErGsiiEcDk9KB0pwd/Jv6aPnvV4oKJd/5K+lfiSjDpCFUh5UUFJdGmHtADxUgbRpYMPyA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-proto@0.205.0': - resolution: {integrity: sha512-qIbNnedw9QfFjwpx4NQvdgjK3j3R2kWH/2T+7WXAm1IfMFe9fwatYxE61i7li4CIJKf8HgUC3GS8Du0C3D+AuQ==} + '@opentelemetry/exporter-metrics-otlp-proto@0.206.0': + resolution: {integrity: sha512-mLlmXmVOSwMw8Cm9RKz5ZuTUWW28lQWWIcy5cpEUhIrJ5cuSuTZ/PKIaa3+CHmcKkkF2pWFdBkzOIar9aApzoQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-prometheus@0.205.0': - resolution: {integrity: sha512-xsot/Qm9VLDTag4GEwAunD1XR1U8eBHTLAgO7IZNo2JuD/c/vL7xmDP7mQIUr6Lk3gtj/yGGIR2h3vhTeVzv4w==} + '@opentelemetry/exporter-prometheus@0.206.0': + resolution: {integrity: sha512-sCzW+vE2KhlDZhH73f7drr+d0kvlsqG02t9xGtG40c6t4hjgpa5qEwEZTzFo9s4djtUrmDBjwJ5S3NYuCERVKg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.205.0': - resolution: {integrity: sha512-ZBksUk84CcQOuDJB65yu5A4PORkC4qEsskNwCrPZxDLeWjPOFZNSWt0E0jQxKCY8PskLhjNXJYo12YaqsYvGFA==} + '@opentelemetry/exporter-trace-otlp-grpc@0.206.0': + resolution: {integrity: sha512-/q8sU9wj20tT9m+529VXN9E9DzpvNui5Cict8onY/gRGeXqTav21xHkvmv0FSpetb/29WS89drVjfI8/Mf2iWQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-http@0.205.0': - resolution: {integrity: sha512-vr2bwwPCSc9u7rbKc74jR+DXFvyMFQo9o5zs+H/fgbK672Whw/1izUKVf+xfWOdJOvuwTnfWxy+VAY+4TSo74Q==} + '@opentelemetry/exporter-trace-otlp-http@0.206.0': + resolution: {integrity: sha512-xiEhJZxE9yDb13FVW4XaF7J56boLv1NALOGEVu3F8jMC24iZmX5TSVRJCNGLWyy1Xb3N27Yu31kdSsmEBCnxyw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-proto@0.205.0': - resolution: {integrity: sha512-bGtFzqiENO2GpJk988mOBMe0MfeNpTQjbLm/LBijas6VRyEDQarUzdBHpFlu89A25k1+BCntdWGsWTa9Ai4FyA==} + '@opentelemetry/exporter-trace-otlp-proto@0.206.0': + resolution: {integrity: sha512-A3lGp39qqZGt6PU/9X682/4KdkDMu+jO+slnNCdm8Zki3AKEFulY2yYtz4rL0rah/liN+ENRsFQWI/B3xJiZGw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3357,50 +3357,50 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.205.0': - resolution: {integrity: sha512-6fOgRlV7ypBuEzCQP7vXkLQxz3UL1FhE24rAlMRbwGvPAnZLvutcG/fq9FI/n+VU23dOpYexocYsXCf5oy/AXw==} + '@opentelemetry/instrumentation-http@0.206.0': + resolution: {integrity: sha512-U355U6PpRSj5NDLqI8uY2SPp4uapuGASSGFLPoQbrqphHQ6pJrHDFBTR72a+S5XvHJo1PlLS84k4IOl+tXYPsA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.53.3': - resolution: {integrity: sha512-afCzr4OSHWDfvVRx5ni92zEgNPoq2akoe+/nubWkGPKHFLsJwYO/ihAaky1i6m9d3tBO571g9rlnUvDlvoKSoQ==} + '@opentelemetry/instrumentation-ioredis@0.54.0': + resolution: {integrity: sha512-SkGBzieEHnpfeYB112R9wzshtpqZkQ0DUHm1DhminO4KYIOTyGS7NkaZlIcRUsmMg3/1Tk1HqEVjSdCO2rOXfA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.52.2': - resolution: {integrity: sha512-kL91hPGEjUI08VcDJeNwYKP2EpynAnymF0wr4Irqp5uHeyvE/hTX4R3DmpDP80IZ/aQ5WVxuWiaBlVP7cERu/w==} + '@opentelemetry/instrumentation-nestjs-core@0.53.0': + resolution: {integrity: sha512-8sDcdwPb6fJ2ayD7Q7H2Vxwj21ao8Atuvm+RtPzAdrOvqEWTigpO99LJaEsZRRphJTdRBejg07/oYQzJusPODQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pg@0.58.3': - resolution: {integrity: sha512-eGyrTHDx3WA9JiCbBQO1OUc8B9InqCJvC87uY1hSuOXU6HtawCEml1epuAVQY3cizK7Tc3IH0EYSR/q4w/kHyw==} + '@opentelemetry/instrumentation-pg@0.59.0': + resolution: {integrity: sha512-26Q6wwsx84K8KNX/CZ2q6ZRv2hIzPawRpL0og+Ro4BHN8Qin+ktkqFDlF2n83KPJn/tFstz3nErue+DAVXAGTw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.205.0': - resolution: {integrity: sha512-cgvm7tvQdu9Qo7VurJP84wJ7ZV9F6WqDDGZpUc6rUEXwjV7/bXWs0kaYp9v+1Vh1+3TZCD3i6j/lUBcPhu8NhA==} + '@opentelemetry/instrumentation@0.206.0': + resolution: {integrity: sha512-anPU9GAn3vSH/0JFQZ4e626xRw8p8R21kxM7xammFk9BRhfDw1IpgqvFMllbb+1MSHHEX9EiUqYHJyWo/B6KGA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.205.0': - resolution: {integrity: sha512-2MN0C1IiKyo34M6NZzD6P9Nv9Dfuz3OJ3rkZwzFmF6xzjDfqqCTatc9v1EpNfaP55iDOCLHFyYNCgs61FFgtUQ==} + '@opentelemetry/otlp-exporter-base@0.206.0': + resolution: {integrity: sha512-Rv54oSNKMHYS5hv+H5EGksfBUtvPQWFTK+Dk6MjJun9tOijCsFJrhRFvAqg5d67TWSMn+ZQYRKIeXh5oLVrpAQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-grpc-exporter-base@0.205.0': - resolution: {integrity: sha512-AeuLfrciGYffqsp4EUTdYYc6Ee2BQS+hr08mHZk1C524SFWx0WnfcTnV0NFXbVURUNU6DZu1DhS89zRRrcx/hg==} + '@opentelemetry/otlp-grpc-exporter-base@0.206.0': + resolution: {integrity: sha512-IA8EDbrB8OKtidMqErBY8sUc9mh03LOXuNPwp4/rdPrxSt45g1gBuZMovRXdEWfRyKKbF2E7MdipT2m11bs6SQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.205.0': - resolution: {integrity: sha512-KmObgqPtk9k/XTlWPJHdMbGCylRAmMJNXIRh6VYJmvlRDMfe+DonH41G7eenG8t4FXn3fxOGh14o/WiMRR6vPg==} + '@opentelemetry/otlp-transformer@0.206.0': + resolution: {integrity: sha512-Li2Cik1WnmNbU2mmTnw7DxvRiXhMcnAuTfAclP8y/zy7h5+GrLDpTZ+Z0XUs+Q3MLkb/h3ry4uFrC/z+2a6X7g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -3427,8 +3427,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-logs@0.205.0': - resolution: {integrity: sha512-nyqhNQ6eEzPWQU60Nc7+A5LIq8fz3UeIzdEVBQYefB4+msJZ2vuVtRuk9KxPMw1uHoHDtYEwkr2Ct0iG29jU8w==} + '@opentelemetry/sdk-logs@0.206.0': + resolution: {integrity: sha512-SQ2yTmqe4Mw9RI3a/glVkfjWPsXh6LySvnljXubiZq4zu+UP8NMJt2j82ZsYb+KpD7Eu+/41/7qlJnjdeVjz7Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' @@ -3439,8 +3439,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-node@0.205.0': - resolution: {integrity: sha512-Y4Wcs8scj/Wy1u61pX1ggqPXPtCsGaqx/UnFu7BtRQE1zCQR+b0h56K7I0jz7U2bRlPUZIFdnNLtoaJSMNzz2g==} + '@opentelemetry/sdk-node@0.206.0': + resolution: {integrity: sha512-t/2xYG1+pXK2M4jra48Gw6BS0E/hz4zYwuqC8G8JCTx9UQpCiFlaA3Yxbns79R1h6NbQz7NAe2kJO3/Jf9BoIA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -3506,8 +3506,8 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.55.1': - resolution: {integrity: sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==} + '@playwright/test@1.56.0': + resolution: {integrity: sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==} engines: {node: '>=18'} hasBin: true @@ -3585,8 +3585,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.5.5': - resolution: {integrity: sha512-+utnip1DiXTq5TQKvL8qztWy0EC3L+qdRIeJkBZXJA4WGIukbaqimWCTBGIMW19Pj+1iKvDYk2JQHEQDLiq7uQ==} + '@react-email/components@0.5.6': + resolution: {integrity: sha512-3o9ellDaF3bBcVMWeos9HI0iUIT1zGygPRcn9WSfI5JREORiN6ViEJIvz5SKWEn1KPNZtw/iaW8ct7PpVyhomg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3650,8 +3650,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@1.3.1': - resolution: {integrity: sha512-BOc/kanieEVyiuldFFvceriiBGBBVhe4JWWXCXE2ehLIqz+gSWD4rgCoXAGbJRnnVyyp4joPqK62bSfa88yonA==} + '@react-email/render@1.3.2': + resolution: {integrity: sha512-oq8/BD/I/YspeuBjjdLJG6xaf9tsPYk+VWu8/mX9xWbRN0t0ExKSVm9sEBL6RsCpndQA2jbY2VgPEreIrzUgqw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -4029,15 +4029,15 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/enhanced-img@0.8.3': - resolution: {integrity: sha512-UM56PSQHbXBvRw5/Ah7R4vxrTR4xbB5/7gTE/7bypVGOGx0pBwTloWXsnLfJXEFI+YYR7IU4jtbYcp4pBXaUSg==} + '@sveltejs/enhanced-img@0.8.4': + resolution: {integrity: sha512-/L12VUQj+ANIhskHT620jtxAs9wUPUIutgo37rwx5NgLnxOpVsP27fMiSpdIMgERldbgr6uRJ1WZGGOkzm7Vcg==} peerDependencies: '@sveltejs/vite-plugin-svelte': ^6.0.0 svelte: ^5.0.0 vite: ^6.3.0 || >=7.0.0 - '@sveltejs/kit@2.38.1': - resolution: {integrity: sha512-5JJBPu3U2KXpRwc+e/D2Pl+DJM9oBcCl6XtWenrb6xc6H4lFa0XIJaSch4wMiADrhX512sVIUf13VnEp7aWO1w==} + '@sveltejs/kit@2.46.4': + resolution: {integrity: sha512-J1fd80WokLzIm6EAV7z7C2+/C02qVAX645LZomARARTRJkbbJSY1Jln3wtBZYibUB8c9/5Z6xqLAV39VdbtWCQ==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -4318,8 +4318,8 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.8.0': - resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/svelte@5.2.8': @@ -4595,8 +4595,8 @@ packages: '@types/node@20.19.2': resolution: {integrity: sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==} - '@types/node@22.18.9': - resolution: {integrity: sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==} + '@types/node@22.18.10': + resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} '@types/node@24.7.1': resolution: {integrity: sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==} @@ -4718,63 +4718,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.45.0': - resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} + '@typescript-eslint/eslint-plugin@8.46.0': + resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.45.0 + '@typescript-eslint/parser': ^8.46.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.45.0': - resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} + '@typescript-eslint/parser@8.46.0': + resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.45.0': - resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} + '@typescript-eslint/project-service@8.46.0': + resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.45.0': - resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} + '@typescript-eslint/scope-manager@8.46.0': + resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.45.0': - resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} + '@typescript-eslint/tsconfig-utils@8.46.0': + resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.45.0': - resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} + '@typescript-eslint/type-utils@8.46.0': + resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.45.0': - resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} + '@typescript-eslint/types@8.46.0': + resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.45.0': - resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} + '@typescript-eslint/typescript-estree@8.46.0': + resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.45.0': - resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} + '@typescript-eslint/utils@8.46.0': + resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.45.0': - resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} + '@typescript-eslint/visitor-keys@8.46.0': + resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -5305,8 +5305,8 @@ packages: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} - bullmq@5.60.0: - resolution: {integrity: sha512-hQPfUOLE7/aidCiQSMc5K1EYF6eAuOYSGNdKoLbTpYuRsjYsY0uGUBNX7VrESvAerUpklrsgPLqbunySUxWh5Q==} + bullmq@5.61.0: + resolution: {integrity: sha512-khaTjc1JnzaYFl4FrUtsSsqugAW/urRrcZ9Q0ZE+REAw8W+gkHFqxbGlutOu6q7j7n91wibVaaNlOUMdiEvoSQ==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -6224,8 +6224,8 @@ packages: electron-to-chromium@1.5.233: resolution: {integrity: sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -7300,8 +7300,8 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@5.8.0: - resolution: {integrity: sha512-AUXbKn9gvo9hHKvk6LbZJQSKn/qIfkWXrnsyL9Yrf+oeXmla9Nmf6XEumOddyhM8neynpK5oAV6r9r99KBuwzA==} + ioredis@5.8.1: + resolution: {integrity: sha512-Qho8TgIamqEPdgiMadJwzRMW3TudIg6vpg4YONokGDudy4eqRIJtDbVX72pfLBcWxvbn3qm/40TyGUObdW4tLQ==} engines: {node: '>=12.22.0'} ip-address@10.0.1: @@ -8502,8 +8502,8 @@ packages: node-releases@2.0.23: resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} - nodemailer@7.0.7: - resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} + nodemailer@7.0.9: + resolution: {integrity: sha512-9/Qm0qXIByEP8lEV2qOqcAW7bRpL8CR9jcTwk3NBnHJNmP9fIJ86g2fgmIXqHY+nj55ZEMwWqYAT2QTDpRUYiQ==} engines: {node: '>=6.0.0'} nopt@1.0.10: @@ -8881,13 +8881,13 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.55.1: - resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} + playwright-core@1.56.0: + resolution: {integrity: sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==} engines: {node: '>=18'} hasBin: true - playwright@1.55.1: - resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==} + playwright@1.56.0: + resolution: {integrity: sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==} engines: {node: '>=18'} hasBin: true @@ -9592,8 +9592,8 @@ packages: peerDependencies: react: ^19.2.0 - react-email@4.2.12: - resolution: {integrity: sha512-Cp6nYAG9uL4//X/96wDSKxGqVTXsaRMuD1ub0G0iBcfTqLel4VVre3kicq7RraplDuj+ATlqSZu47d7P2ULP5w==} + react-email@4.3.0: + resolution: {integrity: sha512-XFHCSfhdlO7k5q2TYGwC0HsVh5Yn13YaOdahuJEUEOfOJKHEpSP4PKg7R/RiKFoK9cDvzunhY+58pXxz0vE2zA==} engines: {node: '>=18.0.0'} hasBin: true @@ -9783,9 +9783,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} + require-in-the-middle@8.0.0: + resolution: {integrity: sha512-9s0pnM5tH8G4dSI3pms2GboYOs25LwOGnRMxN/Hx3TYT1K0rh6OjaWf4dI0DAQnMyaEXWoGVnSTPQasqwzTTAA==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} @@ -10083,8 +10083,8 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-icons@15.16.0: - resolution: {integrity: sha512-AeyYdQ5BsFe7ONruVRClZ+2921tQIEcHuP9AZdNUR0in1jFeakH0pA9Rkjj0T/RkTH7Icx2jprXxWWY3aaCDJQ==} + simple-icons@15.16.1: + resolution: {integrity: sha512-UpT6dslPDUfl+9xAjxHAh4ralefkrAqBe8o4cN+HtBOa2HjYZnEAiQsUkAdkaMfW05rU/rc/MWaKxF/cpUllCg==} engines: {node: '>=0.12.18'} sirv@2.0.4: @@ -10365,8 +10365,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.3.2: - resolution: {integrity: sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==} + svelte-check@4.3.3: + resolution: {integrity: sha512-RYP0bEwenDXzfv0P1sKAwjZSlaRyqBn0Fz1TVni58lqyEiqgwztTpmodJrGzP6ZT2aHl4MbTvWP6gbmQ3FOnBg==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -10770,8 +10770,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.45.0: - resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==} + typescript-eslint@8.46.0: + resolution: {integrity: sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -11590,11 +11590,11 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.9)(chokidar@4.0.3)': + '@angular-devkit/schematics-cli@19.2.15(@types/node@22.18.10)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.18.9) + '@inquirer/prompts': 7.3.2(@types/node@22.18.10) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -14185,7 +14185,7 @@ snapshots: '@mdi/js': 7.4.47 bits-ui: 2.9.8(@internationalized/date@3.8.2)(svelte@5.39.11) luxon: 3.7.2 - simple-icons: 15.16.0 + simple-icons: 15.16.1 svelte: 5.39.11 svelte-highlight: 7.8.4 tailwind-merge: 3.3.1 @@ -14194,27 +14194,27 @@ snapshots: transitivePeerDependencies: - '@internationalized/date' - '@inquirer/checkbox@4.2.1(@types/node@22.18.9)': + '@inquirer/checkbox@4.2.1(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/confirm@5.1.15(@types/node@22.18.9)': + '@inquirer/confirm@5.1.15(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/core@10.1.15(@types/node@22.18.9)': + '@inquirer/core@10.1.15(@types/node@22.18.10)': dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.10) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -14222,115 +14222,115 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/editor@4.2.17(@types/node@22.18.9)': + '@inquirer/editor@4.2.17(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/external-editor': 1.0.2(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/expand@4.0.17(@types/node@22.18.9)': + '@inquirer/expand@4.0.17(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/external-editor@1.0.2(@types/node@22.18.9)': + '@inquirer/external-editor@1.0.2(@types/node@22.18.10)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.1(@types/node@22.18.9)': + '@inquirer/input@4.2.1(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/number@3.0.17(@types/node@22.18.9)': + '@inquirer/number@3.0.17(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/password@4.0.17(@types/node@22.18.9)': + '@inquirer/password@4.0.17(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/prompts@7.3.2(@types/node@22.18.9)': + '@inquirer/prompts@7.3.2(@types/node@22.18.10)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.9) - '@inquirer/confirm': 5.1.15(@types/node@22.18.9) - '@inquirer/editor': 4.2.17(@types/node@22.18.9) - '@inquirer/expand': 4.0.17(@types/node@22.18.9) - '@inquirer/input': 4.2.1(@types/node@22.18.9) - '@inquirer/number': 3.0.17(@types/node@22.18.9) - '@inquirer/password': 4.0.17(@types/node@22.18.9) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.9) - '@inquirer/search': 3.1.0(@types/node@22.18.9) - '@inquirer/select': 4.3.1(@types/node@22.18.9) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.10) + '@inquirer/confirm': 5.1.15(@types/node@22.18.10) + '@inquirer/editor': 4.2.17(@types/node@22.18.10) + '@inquirer/expand': 4.0.17(@types/node@22.18.10) + '@inquirer/input': 4.2.1(@types/node@22.18.10) + '@inquirer/number': 3.0.17(@types/node@22.18.10) + '@inquirer/password': 4.0.17(@types/node@22.18.10) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.10) + '@inquirer/search': 3.1.0(@types/node@22.18.10) + '@inquirer/select': 4.3.1(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/prompts@7.8.0(@types/node@22.18.9)': + '@inquirer/prompts@7.8.0(@types/node@22.18.10)': dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@22.18.9) - '@inquirer/confirm': 5.1.15(@types/node@22.18.9) - '@inquirer/editor': 4.2.17(@types/node@22.18.9) - '@inquirer/expand': 4.0.17(@types/node@22.18.9) - '@inquirer/input': 4.2.1(@types/node@22.18.9) - '@inquirer/number': 3.0.17(@types/node@22.18.9) - '@inquirer/password': 4.0.17(@types/node@22.18.9) - '@inquirer/rawlist': 4.1.5(@types/node@22.18.9) - '@inquirer/search': 3.1.0(@types/node@22.18.9) - '@inquirer/select': 4.3.1(@types/node@22.18.9) + '@inquirer/checkbox': 4.2.1(@types/node@22.18.10) + '@inquirer/confirm': 5.1.15(@types/node@22.18.10) + '@inquirer/editor': 4.2.17(@types/node@22.18.10) + '@inquirer/expand': 4.0.17(@types/node@22.18.10) + '@inquirer/input': 4.2.1(@types/node@22.18.10) + '@inquirer/number': 3.0.17(@types/node@22.18.10) + '@inquirer/password': 4.0.17(@types/node@22.18.10) + '@inquirer/rawlist': 4.1.5(@types/node@22.18.10) + '@inquirer/search': 3.1.0(@types/node@22.18.10) + '@inquirer/select': 4.3.1(@types/node@22.18.10) optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/rawlist@4.1.5(@types/node@22.18.9)': + '@inquirer/rawlist@4.1.5(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) + '@inquirer/type': 3.0.8(@types/node@22.18.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/search@3.1.0(@types/node@22.18.9)': + '@inquirer/search@3.1.0(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/select@4.3.1(@types/node@22.18.9)': + '@inquirer/select@4.3.1(@types/node@22.18.10)': dependencies: - '@inquirer/core': 10.1.15(@types/node@22.18.9) + '@inquirer/core': 10.1.15(@types/node@22.18.10) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.9) + '@inquirer/type': 3.0.8(@types/node@22.18.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 - '@inquirer/type@3.0.8(@types/node@22.18.9)': + '@inquirer/type@3.0.8(@types/node@22.18.10)': optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@internationalized/date@3.8.2': dependencies: @@ -14368,7 +14368,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -14449,8 +14449,8 @@ snapshots: '@koddsson/eslint-plugin-tscompat@0.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@mdn/browser-compat-data': 6.0.27 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) browserslist: 4.26.3 transitivePeerDependencies: - eslint @@ -14627,20 +14627,20 @@ snapshots: '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 - '@nestjs/bullmq@11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.60.0)': + '@nestjs/bullmq@11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(bullmq@5.61.0)': dependencies: '@nestjs/bull-shared': 11.0.3(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(@nestjs/websockets@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) - bullmq: 5.60.0 + bullmq: 5.61.0 tslib: 2.8.1 - '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.9)': + '@nestjs/cli@11.0.10(@swc/core@1.13.5(@swc/helpers@0.5.17))(@types/node@22.18.10)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.9)(chokidar@4.0.3) - '@inquirer/prompts': 7.8.0(@types/node@22.18.9) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@22.18.10)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@22.18.10) '@nestjs/schematics': 11.0.8(chokidar@4.0.3)(typescript@5.8.3) ansis: 4.1.0 chokidar: 4.0.3 @@ -14823,7 +14823,7 @@ snapshots: '@oazapfts/runtime@1.0.4': {} - '@opentelemetry/api-logs@0.205.0': + '@opentelemetry/api-logs@0.206.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -14838,100 +14838,100 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/exporter-logs-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-grpc@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-http@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-proto@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-grpc@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-http@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-proto@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-prometheus@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-grpc@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-proto@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) @@ -14948,37 +14948,37 @@ snapshots: '@opentelemetry/api': 1.9.0 systeminformation: 5.23.8 - '@opentelemetry/instrumentation-http@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-http@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.53.3(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-ioredis@0.54.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.52.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-nestjs-core@0.53.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.58.3(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-pg@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.5 @@ -14986,36 +14986,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 import-in-the-middle: 1.14.4 - require-in-the-middle: 7.5.2 + require-in-the-middle: 8.0.0 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-exporter-base@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-grpc-exporter-base@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-transformer@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) protobufjs: 7.5.4 @@ -15038,10 +15038,10 @@ snapshots: '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sdk-logs@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) @@ -15051,27 +15051,27 @@ snapshots: '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node@0.205.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-node@0.206.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/api-logs': 0.206.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-zipkin': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-b3': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-jaeger': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.1.0(@opentelemetry/api@1.9.0) @@ -15135,9 +15135,9 @@ snapshots: '@pkgr/core@0.2.9': {} - '@playwright/test@1.55.1': + '@playwright/test@1.56.0': dependencies: - playwright: 1.55.1 + playwright: 1.56.0 '@pnpm/config.env-replace@1.1.0': {} @@ -15197,7 +15197,7 @@ snapshots: dependencies: react: 19.2.0 - '@react-email/components@0.5.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-email/components@0.5.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@react-email/body': 0.1.0(react@19.2.0) '@react-email/button': 0.2.0(react@19.2.0) @@ -15214,7 +15214,7 @@ snapshots: '@react-email/link': 0.0.12(react@19.2.0) '@react-email/markdown': 0.0.15(react@19.2.0) '@react-email/preview': 0.0.13(react@19.2.0) - '@react-email/render': 1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-email/render': 1.3.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-email/row': 0.0.12(react@19.2.0) '@react-email/section': 0.0.16(react@19.2.0) '@react-email/tailwind': 1.2.2(react@19.2.0) @@ -15264,7 +15264,7 @@ snapshots: dependencies: react: 19.2.0 - '@react-email/render@1.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-email/render@1.3.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 @@ -15689,11 +15689,11 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.46.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: - '@sveltejs/kit': 2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@sveltejs/kit': 2.46.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) - '@sveltejs/enhanced-img@0.8.3(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/enhanced-img@0.8.4(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(rollup@4.52.4)(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) magic-string: 0.30.19 @@ -15707,7 +15707,7 @@ snapshots: - rollup - supports-color - '@sveltejs/kit@2.38.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@sveltejs/kit@2.46.4(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.39.11)(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@standard-schema/spec': 1.0.0 '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) @@ -15985,7 +15985,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.8.0': + '@testing-library/jest-dom@6.9.1': dependencies: '@adobe/css-tools': 4.4.4 aria-query: 5.3.2 @@ -16042,7 +16042,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/archiver@6.0.3': dependencies: @@ -16054,16 +16054,16 @@ snapshots: '@types/bcrypt@6.0.0': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/braces@3.0.5': {} @@ -16084,21 +16084,21 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/compression@1.8.1': dependencies: '@types/express': 5.0.3 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/connect@3.4.38': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/content-disposition@0.5.9': {} @@ -16115,11 +16115,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.3 '@types/keygrip': 1.0.6 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/cors@2.8.19': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/debug@4.1.12': dependencies: @@ -16129,13 +16129,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ssh2': 1.15.5 '@types/dockerode@3.3.44': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ssh2': 1.15.5 '@types/dom-to-image@2.6.7': {} @@ -16158,14 +16158,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -16191,7 +16191,7 @@ snapshots: '@types/fluent-ffmpeg@2.1.27': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/geojson-vt@3.2.5': dependencies: @@ -16223,7 +16223,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/inquirer@8.2.11': dependencies: @@ -16261,7 +16261,7 @@ snapshots: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/leaflet@1.9.20': dependencies: @@ -16291,7 +16291,7 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ms@2.1.0': {} @@ -16301,7 +16301,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/node@17.0.45': {} @@ -16313,7 +16313,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.9': + '@types/node@22.18.10': dependencies: undici-types: 6.21.0 @@ -16325,7 +16325,7 @@ snapshots: '@types/nodemailer@7.0.2': dependencies: '@aws-sdk/client-sesv2': 3.907.0 - '@types/node': 22.18.9 + '@types/node': 22.18.10 transitivePeerDependencies: - aws-crt @@ -16333,7 +16333,7 @@ snapshots: dependencies: '@types/keygrip': 1.0.6 '@types/koa': 3.0.0 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/parse5@5.0.3': {} @@ -16343,7 +16343,7 @@ snapshots: '@types/pg@8.15.5': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -16351,13 +16351,13 @@ snapshots: '@types/pngjs@6.0.5': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/prismjs@1.26.5': {} '@types/qrcode@1.5.5': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/qs@6.14.0': {} @@ -16386,7 +16386,7 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/retry@0.12.2': {} @@ -16396,14 +16396,14 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/semver@7.7.1': {} '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/serve-index@1.9.4': dependencies: @@ -16412,20 +16412,20 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.5': @@ -16436,7 +16436,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.18.9 + '@types/node': 22.18.10 form-data: 4.0.4 '@types/supercluster@7.1.3': @@ -16450,7 +16450,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/ua-parser-js@0.7.39': {} @@ -16464,7 +16464,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 '@types/yargs-parser@21.0.3': {} @@ -16472,14 +16472,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 eslint: 9.37.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -16489,41 +16489,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3 eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.45.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) - '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.45.0': + '@typescript-eslint/scope-manager@8.46.0': dependencies: - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 - '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.37.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) @@ -16531,14 +16531,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.45.0': {} + '@typescript-eslint/types@8.46.0': {} - '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.45.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -16549,25 +16549,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.45.0': + '@typescript-eslint/visitor-keys@8.46.0': dependencies: - '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/types': 8.46.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -16582,7 +16582,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -16613,13 +16613,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: @@ -17207,10 +17207,10 @@ snapshots: builtin-modules@5.0.0: {} - bullmq@5.60.0: + bullmq@5.61.0: dependencies: cron-parser: 4.9.0 - ioredis: 5.8.0 + ioredis: 5.8.1 msgpackr: 1.11.5 node-abort-controller: 3.1.1 semver: 7.7.3 @@ -18146,7 +18146,7 @@ snapshots: electron-to-chromium@1.5.233: {} - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -18188,7 +18188,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.18.9 + '@types/node': 22.18.10 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -18578,7 +18578,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 require-like: 0.1.2 event-emitter@0.3.5: @@ -19565,9 +19565,9 @@ snapshots: inline-style-parser@0.2.4: {} - inquirer@8.2.7(@types/node@22.18.9): + inquirer@8.2.7(@types/node@22.18.10): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@22.18.9) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.10) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -19598,7 +19598,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@5.8.0: + ioredis@5.8.1: dependencies: '@ioredis/commands': 1.4.0 cluster-key-slot: 1.1.2 @@ -19781,7 +19781,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.18.9 + '@types/node': 22.18.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -19789,13 +19789,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -21012,7 +21012,7 @@ snapshots: neo-async@2.6.2: {} - nest-commander@3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.9)(typescript@5.9.3): + nest-commander@3.20.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@types/inquirer@8.2.11)(@types/node@22.18.10)(typescript@5.9.3): dependencies: '@fig/complete-commander': 3.2.0(commander@11.1.0) '@golevelup/nestjs-discovery': 5.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) @@ -21021,7 +21021,7 @@ snapshots: '@types/inquirer': 8.2.11 commander: 11.1.0 cosmiconfig: 8.3.6(typescript@5.9.3) - inquirer: 8.2.7(@types/node@22.18.9) + inquirer: 8.2.7(@types/node@22.18.10) transitivePeerDependencies: - '@types/node' - typescript @@ -21111,7 +21111,7 @@ snapshots: node-releases@2.0.23: {} - nodemailer@7.0.7: {} + nodemailer@7.0.9: {} nopt@1.0.10: dependencies: @@ -21504,11 +21504,11 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 - playwright-core@1.55.1: {} + playwright-core@1.56.0: {} - playwright@1.55.1: + playwright@1.56.0: dependencies: - playwright-core: 1.55.1 + playwright-core: 1.56.0 optionalDependencies: fsevents: 2.3.2 @@ -22118,7 +22118,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.18.9 + '@types/node': 22.18.10 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -22226,7 +22226,7 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-email@4.2.12: + react-email@4.3.0: dependencies: '@babel/parser': 7.28.4 '@babel/traverse': 7.28.4 @@ -22518,11 +22518,10 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.5.2: + require-in-the-middle@8.0.0: dependencies: debug: 4.4.3 module-details-from-path: 1.0.4 - resolve: 1.22.10 transitivePeerDependencies: - supports-color @@ -22933,7 +22932,7 @@ snapshots: simple-concat: 1.0.1 optional: true - simple-icons@15.16.0: {} + simple-icons@15.16.1: {} sirv@2.0.4: dependencies: @@ -23141,7 +23140,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -23263,7 +23262,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.2(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3): + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.39.11)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 @@ -23718,12 +23717,12 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -23993,13 +23992,13 @@ snapshots: - rollup - supports-color - vite-node@3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -24035,18 +24034,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -24055,7 +24054,7 @@ snapshots: rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.9 + '@types/node': 22.18.10 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.1 @@ -24082,15 +24081,15 @@ snapshots: optionalDependencies: vite: 7.1.9(@types/node@24.7.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vitest-fetch-mock@0.4.5(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2(encoding@0.1.13)))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -24108,12 +24107,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.9 + '@types/node': 22.18.10 happy-dom: 20.0.0 jsdom: 26.1.0(canvas@2.11.2(encoding@0.1.13)) transitivePeerDependencies: @@ -24130,11 +24129,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.9)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.10)(happy-dom@20.0.0)(jiti@2.6.1)(jsdom@26.1.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -24152,12 +24151,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.9)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.9 + '@types/node': 22.18.10 happy-dom: 20.0.0 jsdom: 26.1.0(canvas@2.11.2) transitivePeerDependencies: diff --git a/server/package.json b/server/package.json index 878acb6cad..b1ba8cfdcb 100644 --- a/server/package.json +++ b/server/package.json @@ -44,14 +44,14 @@ "@nestjs/websockets": "^11.0.4", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.0.0", - "@opentelemetry/exporter-prometheus": "^0.205.0", - "@opentelemetry/instrumentation-http": "^0.205.0", - "@opentelemetry/instrumentation-ioredis": "^0.53.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.52.0", - "@opentelemetry/instrumentation-pg": "^0.58.0", + "@opentelemetry/exporter-prometheus": "^0.206.0", + "@opentelemetry/instrumentation-http": "^0.206.0", + "@opentelemetry/instrumentation-ioredis": "^0.54.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.53.0", + "@opentelemetry/instrumentation-pg": "^0.59.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", - "@opentelemetry/sdk-node": "^0.205.0", + "@opentelemetry/sdk-node": "^0.206.0", "@opentelemetry/semantic-conventions": "^1.34.0", "@react-email/components": "^0.5.0", "@react-email/render": "^1.1.2", From d778286777b9d29c7fe30f085ff450ea7fd177ce Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 14 Oct 2025 10:15:51 -0500 Subject: [PATCH 104/134] feat: local album events notification (#22817) * feat: local album events notification * pr feedback * show number of unread notification --- .../openapi/lib/model/notification_type.dart | 6 +++ open-api/immich-openapi-specs.json | 2 + open-api/typescript-sdk/src/fetch-client.ts | 2 + server/src/enum.ts | 2 + .../src/services/notification.service.spec.ts | 11 ++++++ server/src/services/notification.service.ts | 26 +++++++++++++ server/test/fixtures/notification.stub.ts | 14 +++++++ .../navigation-bar/navigation-bar.svelte | 37 ++++++++++++++----- .../navigation-bar/notification-item.svelte | 27 ++++++++++++-- .../navigation-bar/notification-panel.svelte | 35 +++++++++++++++++- 10 files changed, 148 insertions(+), 14 deletions(-) create mode 100644 server/test/fixtures/notification.stub.ts diff --git a/mobile/openapi/lib/model/notification_type.dart b/mobile/openapi/lib/model/notification_type.dart index 436d2d190f..b5885aa441 100644 --- a/mobile/openapi/lib/model/notification_type.dart +++ b/mobile/openapi/lib/model/notification_type.dart @@ -26,6 +26,8 @@ class NotificationType { static const jobFailed = NotificationType._(r'JobFailed'); static const backupFailed = NotificationType._(r'BackupFailed'); static const systemMessage = NotificationType._(r'SystemMessage'); + static const albumInvite = NotificationType._(r'AlbumInvite'); + static const albumUpdate = NotificationType._(r'AlbumUpdate'); static const custom = NotificationType._(r'Custom'); /// List of all possible values in this [enum][NotificationType]. @@ -33,6 +35,8 @@ class NotificationType { jobFailed, backupFailed, systemMessage, + albumInvite, + albumUpdate, custom, ]; @@ -75,6 +79,8 @@ class NotificationTypeTypeTransformer { case r'JobFailed': return NotificationType.jobFailed; case r'BackupFailed': return NotificationType.backupFailed; case r'SystemMessage': return NotificationType.systemMessage; + case r'AlbumInvite': return NotificationType.albumInvite; + case r'AlbumUpdate': return NotificationType.albumUpdate; case r'Custom': return NotificationType.custom; default: if (!allowNull) { diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index b574bc6624..5eada143a6 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -12820,6 +12820,8 @@ "JobFailed", "BackupFailed", "SystemMessage", + "AlbumInvite", + "AlbumUpdate", "Custom" ], "type": "string" diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index c8a69dfe8c..4d3d0cd21d 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -4650,6 +4650,8 @@ export enum NotificationType { JobFailed = "JobFailed", BackupFailed = "BackupFailed", SystemMessage = "SystemMessage", + AlbumInvite = "AlbumInvite", + AlbumUpdate = "AlbumUpdate", Custom = "Custom" } export enum UserStatus { diff --git a/server/src/enum.ts b/server/src/enum.ts index 646138b060..b8e6e5209f 100644 --- a/server/src/enum.ts +++ b/server/src/enum.ts @@ -722,6 +722,8 @@ export enum NotificationType { JobFailed = 'JobFailed', BackupFailed = 'BackupFailed', SystemMessage = 'SystemMessage', + AlbumInvite = 'AlbumInvite', + AlbumUpdate = 'AlbumUpdate', Custom = 'Custom', } diff --git a/server/src/services/notification.service.spec.ts b/server/src/services/notification.service.spec.ts index 11c385b1e2..a96caf5ac2 100644 --- a/server/src/services/notification.service.spec.ts +++ b/server/src/services/notification.service.spec.ts @@ -7,6 +7,7 @@ import { NotificationService } from 'src/services/notification.service'; import { INotifyAlbumUpdateJob } from 'src/types'; import { albumStub } from 'test/fixtures/album.stub'; import { assetStub } from 'test/fixtures/asset.stub'; +import { notificationStub } from 'test/fixtures/notification.stub'; import { userStub } from 'test/fixtures/user.stub'; import { newTestService, ServiceMocks } from 'test/utils'; @@ -282,6 +283,7 @@ describe(NotificationService.name, () => { }, ], }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); await expect(sut.handleAlbumInvite({ id: '', recipientId: '' })).resolves.toBe(JobStatus.Skipped); }); @@ -297,6 +299,7 @@ describe(NotificationService.name, () => { }, ], }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); await expect(sut.handleAlbumInvite({ id: '', recipientId: '' })).resolves.toBe(JobStatus.Skipped); }); @@ -313,6 +316,7 @@ describe(NotificationService.name, () => { ], }); mocks.systemMetadata.get.mockResolvedValue({ server: {} }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); await expect(sut.handleAlbumInvite({ id: '', recipientId: '' })).resolves.toBe(JobStatus.Success); @@ -334,6 +338,7 @@ describe(NotificationService.name, () => { ], }); mocks.systemMetadata.get.mockResolvedValue({ server: {} }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([]); @@ -363,6 +368,7 @@ describe(NotificationService.name, () => { ], }); mocks.systemMetadata.get.mockResolvedValue({ server: {} }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([ { id: '1', type: AssetFileType.Thumbnail, path: 'path-to-thumb.jpg' }, @@ -394,6 +400,7 @@ describe(NotificationService.name, () => { ], }); mocks.systemMetadata.get.mockResolvedValue({ server: {} }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([assetStub.image.files[2]]); @@ -431,6 +438,7 @@ describe(NotificationService.name, () => { albumUsers: [{ user: { id: userStub.user1.id } } as AlbumUser], }); mocks.user.get.mockResolvedValueOnce(userStub.user1); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([]); @@ -453,6 +461,7 @@ describe(NotificationService.name, () => { }, ], }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([]); @@ -475,6 +484,7 @@ describe(NotificationService.name, () => { }, ], }); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([]); @@ -489,6 +499,7 @@ describe(NotificationService.name, () => { albumUsers: [{ user: { id: userStub.user1.id } } as AlbumUser], }); mocks.user.get.mockResolvedValue(userStub.user1); + mocks.notification.create.mockResolvedValue(notificationStub.albumEvent); mocks.email.renderEmail.mockResolvedValue({ html: '', text: '' }); mocks.assetJob.getAlbumThumbnailFiles.mockResolvedValue([]); diff --git a/server/src/services/notification.service.ts b/server/src/services/notification.service.ts index 91a043d405..5d192523b1 100644 --- a/server/src/services/notification.service.ts +++ b/server/src/services/notification.service.ts @@ -1,5 +1,6 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { OnEvent, OnJob } from 'src/decorators'; +import { MapAlbumDto } from 'src/dtos/album.dto'; import { mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; import { @@ -295,6 +296,8 @@ export class NotificationService extends BaseService { return JobStatus.Skipped; } + await this.sendAlbumLocalNotification(album, recipientId, NotificationType.AlbumInvite, album.owner.name); + const { emailNotifications } = getPreferences(recipient.metadata); if (!emailNotifications.enabled || !emailNotifications.albumInvite) { @@ -344,6 +347,8 @@ export class NotificationService extends BaseService { return JobStatus.Skipped; } + await this.sendAlbumLocalNotification(album, recipientId, NotificationType.AlbumUpdate); + const attachment = await this.getAlbumThumbnailAttachment(album); const { server, templates } = await this.getConfig({ withCache: false }); @@ -431,4 +436,25 @@ export class NotificationService extends BaseService { cid: 'album-thumbnail', }; } + + private async sendAlbumLocalNotification( + album: MapAlbumDto, + userId: string, + type: NotificationType.AlbumInvite | NotificationType.AlbumUpdate, + senderName?: string, + ) { + const isInvite = type === NotificationType.AlbumInvite; + const item = await this.notificationRepository.create({ + userId, + type, + level: isInvite ? NotificationLevel.Success : NotificationLevel.Info, + title: isInvite ? 'Shared Album Invitation' : 'Shared Album Update', + description: isInvite + ? `${senderName} shared an album (${album.albumName}) with you` + : `New media has been added to the album (${album.albumName})`, + data: JSON.stringify({ albumId: album.id }), + }); + + this.eventRepository.clientSend('on_notification', userId, mapNotification(item)); + } } diff --git a/server/test/fixtures/notification.stub.ts b/server/test/fixtures/notification.stub.ts new file mode 100644 index 0000000000..b5a436a622 --- /dev/null +++ b/server/test/fixtures/notification.stub.ts @@ -0,0 +1,14 @@ +import { NotificationLevel, NotificationType } from 'src/enum'; + +export const notificationStub = { + albumEvent: { + id: 'notification-album-event', + type: NotificationType.AlbumInvite, + description: 'You have been invited to a shared album', + title: 'Album Invitation', + createdAt: new Date('2024-01-01'), + data: { albumId: 'album-id' }, + level: NotificationLevel.Success, + readAt: null, + }, +}; diff --git a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte index e4446cf142..51488381f5 100644 --- a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte @@ -19,6 +19,7 @@ import { user } from '$lib/stores/user.store'; import { Button, IconButton } from '@immich/ui'; import { mdiBellBadge, mdiBellOutline, mdiMagnify, mdiMenu, mdiTrayArrowUp } from '@mdi/js'; + import { onMount } from 'svelte'; import { t } from 'svelte-i18n'; import ThemeButton from '../theme-button.svelte'; import UserAvatar from '../user-avatar.svelte'; @@ -37,6 +38,14 @@ let shouldShowNotificationPanel = $state(false); let innerWidth: number = $state(0); const hasUnreadNotifications = $derived(notificationManager.notifications.length > 0); + + onMount(async () => { + try { + await notificationManager.refresh(); + } catch (error) { + console.error('Failed to load notifications on mount', error); + } + }); @@ -125,15 +134,25 @@ onEscape: () => (shouldShowNotificationPanel = false), }} > - (shouldShowNotificationPanel = !shouldShowNotificationPanel)} - aria-label={$t('notifications')} - /> +
+ (shouldShowNotificationPanel = !shouldShowNotificationPanel)} + aria-label={$t('notifications')} + /> + + {#if hasUnreadNotifications} +
+ {notificationManager.notifications.length} +
+ {/if} +
{#if shouldShowNotificationPanel} diff --git a/web/src/lib/components/shared-components/navigation-bar/notification-item.svelte b/web/src/lib/components/shared-components/navigation-bar/notification-item.svelte index 0d05e2d6d7..e713eb7743 100644 --- a/web/src/lib/components/shared-components/navigation-bar/notification-item.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/notification-item.svelte @@ -1,12 +1,19 @@
{#each notificationManager.notifications as notification (notification.id)}
- markAsRead(id)} /> +
{/each} From b484a52252b4a651a334485db543ddb5ecb48d6f Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Tue, 14 Oct 2025 10:25:48 -0500 Subject: [PATCH 105/134] chore: refactor show view in timeline button (#22894) * chore: refactor show view in timeline button This refactor includes changes to notify asset viewer about where an asset was shown from. * chore: realized I could just pull from the timelineProvider instead of storing it in the asset viewer state * chore: rename enum to TimelineOrigin and update members * fix: update isOwner condition --------- Co-authored-by: Alex --- .../lib/domain/services/timeline.service.dart | 35 +++++++++++++++---- .../repositories/timeline.repository.dart | 17 ++++++++- .../pages/search/drift_search.page.dart | 3 +- .../asset_viewer/top_app_bar.widget.dart | 15 ++++---- mobile/lib/services/deep_link.service.dart | 7 ++-- 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart index 6a7a1a22b2..85fc5fc55d 100644 --- a/mobile/lib/domain/services/timeline.service.dart +++ b/mobile/lib/domain/services/timeline.service.dart @@ -16,7 +16,24 @@ typedef TimelineAssetSource = Future> Function(int index, int co typedef TimelineBucketSource = Stream> Function(); -typedef TimelineQuery = ({TimelineAssetSource assetSource, TimelineBucketSource bucketSource}); +typedef TimelineQuery = ({TimelineAssetSource assetSource, TimelineBucketSource bucketSource, TimelineOrigin origin}); + +enum TimelineOrigin { + main, + localAlbum, + remoteAlbum, + remoteAssets, + favorite, + trash, + archive, + lockedFolder, + video, + place, + person, + map, + search, + deepLink, +} class TimelineFactory { final DriftTimelineRepository _timelineRepository; @@ -57,7 +74,8 @@ class TimelineFactory { TimelineService person(String userId, String personId) => TimelineService(_timelineRepository.person(userId, personId, groupBy)); - TimelineService fromAssets(List assets) => TimelineService(_timelineRepository.fromAssets(assets)); + TimelineService fromAssets(List assets, TimelineOrigin type) => + TimelineService(_timelineRepository.fromAssets(assets, type)); TimelineService map(String userId, LatLngBounds bounds) => TimelineService(_timelineRepository.map(userId, bounds, groupBy)); @@ -66,6 +84,7 @@ class TimelineFactory { class TimelineService { final TimelineAssetSource _assetSource; final TimelineBucketSource _bucketSource; + final TimelineOrigin origin; final AsyncMutex _mutex = AsyncMutex(); int _bufferOffset = 0; List _buffer = []; @@ -74,11 +93,15 @@ class TimelineService { int _totalAssets = 0; int get totalAssets => _totalAssets; - TimelineService(TimelineQuery query) : this._(assetSource: query.assetSource, bucketSource: query.bucketSource); + TimelineService(TimelineQuery query) + : this._(assetSource: query.assetSource, bucketSource: query.bucketSource, origin: query.origin); - TimelineService._({required TimelineAssetSource assetSource, required TimelineBucketSource bucketSource}) - : _assetSource = assetSource, - _bucketSource = bucketSource { + TimelineService._({ + required TimelineAssetSource assetSource, + required TimelineBucketSource bucketSource, + required this.origin, + }) : _assetSource = assetSource, + _bucketSource = bucketSource { _bucketSubscription = _bucketSource().listen((buckets) { _mutex.run(() async { final totalAssets = buckets.fold(0, (acc, bucket) => acc + bucket.assetCount); diff --git a/mobile/lib/infrastructure/repositories/timeline.repository.dart b/mobile/lib/infrastructure/repositories/timeline.repository.dart index 05928d938f..1fc0ee43e5 100644 --- a/mobile/lib/infrastructure/repositories/timeline.repository.dart +++ b/mobile/lib/infrastructure/repositories/timeline.repository.dart @@ -35,6 +35,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { TimelineQuery main(List userIds, GroupAssetsBy groupBy) => ( bucketSource: () => _watchMainBucket(userIds, groupBy: groupBy), assetSource: (offset, count) => _getMainBucketAssets(userIds, offset: offset, count: count), + origin: TimelineOrigin.main, ); Stream> _watchMainBucket(List userIds, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { @@ -91,6 +92,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { TimelineQuery localAlbum(String albumId, GroupAssetsBy groupBy) => ( bucketSource: () => _watchLocalAlbumBucket(albumId, groupBy: groupBy), assetSource: (offset, count) => _getLocalAlbumBucketAssets(albumId, offset: offset, count: count), + origin: TimelineOrigin.localAlbum, ); Stream> _watchLocalAlbumBucket(String albumId, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { @@ -156,6 +158,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { TimelineQuery remoteAlbum(String albumId, GroupAssetsBy groupBy) => ( bucketSource: () => _watchRemoteAlbumBucket(albumId, groupBy: groupBy), assetSource: (offset, count) => _getRemoteAlbumBucketAssets(albumId, offset: offset, count: count), + origin: TimelineOrigin.remoteAlbum, ); Stream> _watchRemoteAlbumBucket(String albumId, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { @@ -244,15 +247,17 @@ class DriftTimelineRepository extends DriftDatabaseRepository { .get(); } - TimelineQuery fromAssets(List assets) => ( + TimelineQuery fromAssets(List assets, TimelineOrigin origin) => ( bucketSource: () => Stream.value(_generateBuckets(assets.length)), assetSource: (offset, count) => Future.value(assets.skip(offset).take(count).toList(growable: false)), + origin: origin, ); TimelineQuery remote(String ownerId, GroupAssetsBy groupBy) => _remoteQueryBuilder( filter: (row) => row.deletedAt.isNull() & row.visibility.equalsValue(AssetVisibility.timeline) & row.ownerId.equals(ownerId), groupBy: groupBy, + origin: TimelineOrigin.remoteAssets, ); TimelineQuery favorite(String userId, GroupAssetsBy groupBy) => _remoteQueryBuilder( @@ -262,11 +267,13 @@ class DriftTimelineRepository extends DriftDatabaseRepository { row.ownerId.equals(userId) & row.visibility.equalsValue(AssetVisibility.timeline), groupBy: groupBy, + origin: TimelineOrigin.favorite, ); TimelineQuery trash(String userId, GroupAssetsBy groupBy) => _remoteQueryBuilder( filter: (row) => row.deletedAt.isNotNull() & row.ownerId.equals(userId), groupBy: groupBy, + origin: TimelineOrigin.trash, joinLocal: true, ); @@ -274,11 +281,13 @@ class DriftTimelineRepository extends DriftDatabaseRepository { filter: (row) => row.deletedAt.isNull() & row.ownerId.equals(userId) & row.visibility.equalsValue(AssetVisibility.archive), groupBy: groupBy, + origin: TimelineOrigin.archive, ); TimelineQuery locked(String userId, GroupAssetsBy groupBy) => _remoteQueryBuilder( filter: (row) => row.deletedAt.isNull() & row.visibility.equalsValue(AssetVisibility.locked) & row.ownerId.equals(userId), + origin: TimelineOrigin.lockedFolder, groupBy: groupBy, ); @@ -288,17 +297,20 @@ class DriftTimelineRepository extends DriftDatabaseRepository { row.type.equalsValue(AssetType.video) & row.visibility.equalsValue(AssetVisibility.timeline) & row.ownerId.equals(userId), + origin: TimelineOrigin.video, groupBy: groupBy, ); TimelineQuery place(String place, GroupAssetsBy groupBy) => ( bucketSource: () => _watchPlaceBucket(place, groupBy: groupBy), assetSource: (offset, count) => _getPlaceBucketAssets(place, offset: offset, count: count), + origin: TimelineOrigin.place, ); TimelineQuery person(String userId, String personId, GroupAssetsBy groupBy) => ( bucketSource: () => _watchPersonBucket(userId, personId, groupBy: groupBy), assetSource: (offset, count) => _getPersonBucketAssets(userId, personId, offset: offset, count: count), + origin: TimelineOrigin.person, ); Stream> _watchPlaceBucket(String place, {GroupAssetsBy groupBy = GroupAssetsBy.day}) { @@ -434,6 +446,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { TimelineQuery map(String userId, LatLngBounds bounds, GroupAssetsBy groupBy) => ( bucketSource: () => _watchMapBucket(userId, bounds, groupBy: groupBy), assetSource: (offset, count) => _getMapBucketAssets(userId, bounds, offset: offset, count: count), + origin: TimelineOrigin.map, ); Stream> _watchMapBucket( @@ -502,6 +515,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { @pragma('vm:prefer-inline') TimelineQuery _remoteQueryBuilder({ required Expression Function($RemoteAssetEntityTable row) filter, + required TimelineOrigin origin, GroupAssetsBy groupBy = GroupAssetsBy.day, bool joinLocal = false, }) { @@ -509,6 +523,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { bucketSource: () => _watchRemoteBucket(filter: filter, groupBy: groupBy), assetSource: (offset, count) => _getRemoteAssets(filter: filter, offset: offset, count: count, joinLocal: joinLocal), + origin: origin, ); } diff --git a/mobile/lib/presentation/pages/search/drift_search.page.dart b/mobile/lib/presentation/pages/search/drift_search.page.dart index 92716144f3..425c4985e9 100644 --- a/mobile/lib/presentation/pages/search/drift_search.page.dart +++ b/mobile/lib/presentation/pages/search/drift_search.page.dart @@ -8,6 +8,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/person.model.dart'; import 'package:immich_mobile/domain/models/timeline.model.dart'; +import 'package:immich_mobile/domain/services/timeline.service.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; @@ -624,7 +625,7 @@ class _SearchResultGrid extends ConsumerWidget { child: ProviderScope( overrides: [ timelineServiceProvider.overrideWith((ref) { - final timelineService = ref.watch(timelineFactoryProvider).fromAssets(assets); + final timelineService = ref.watch(timelineFactoryProvider).fromAssets(assets, TimelineOrigin.search); ref.onDispose(timelineService.dispose); return timelineService; }), diff --git a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart index c0e93a73cc..38ad9d17de 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart @@ -4,6 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/timeline.model.dart'; +import 'package:immich_mobile/domain/services/timeline.service.dart'; import 'package:immich_mobile/domain/utils/event_stream.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; @@ -17,8 +18,8 @@ import 'package:immich_mobile/providers/cast.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart'; -import 'package:immich_mobile/providers/tab.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/routing/router.dart'; @@ -39,13 +40,13 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { final isInLockedView = ref.watch(inLockedViewProvider); final isReadonlyModeEnabled = ref.watch(readonlyModeProvider); - final previousRouteName = ref.watch(previousRouteNameProvider); - final tabRoute = ref.watch(tabProvider); + final timelineOrigin = ref.read(timelineServiceProvider).origin; final showViewInTimelineButton = - (previousRouteName != TabShellRoute.name || tabRoute == TabEnum.search) && - previousRouteName != AssetViewerRoute.name && - previousRouteName != null && - previousRouteName != LocalTimelineRoute.name && + timelineOrigin != TimelineOrigin.main && + timelineOrigin != TimelineOrigin.deepLink && + timelineOrigin != TimelineOrigin.trash && + timelineOrigin != TimelineOrigin.archive && + timelineOrigin != TimelineOrigin.localAlbum && isOwner; final isShowingSheet = ref.watch(assetViewerProvider.select((state) => state.showingBottomSheet)); diff --git a/mobile/lib/services/deep_link.service.dart b/mobile/lib/services/deep_link.service.dart index 6226781919..7c8ddce265 100644 --- a/mobile/lib/services/deep_link.service.dart +++ b/mobile/lib/services/deep_link.service.dart @@ -8,8 +8,8 @@ import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.page.dart'; import 'package:immich_mobile/providers/album/current_album.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/asset.provider.dart' as beta_asset_provider; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/asset.provider.dart' as beta_asset_provider; import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/memory.provider.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; @@ -150,7 +150,10 @@ class DeepLinkService { } AssetViewer.setAsset(ref, asset); - return AssetViewerRoute(initialIndex: 0, timelineService: _betaTimelineFactory.fromAssets([asset])); + return AssetViewerRoute( + initialIndex: 0, + timelineService: _betaTimelineFactory.fromAssets([asset], TimelineOrigin.deepLink), + ); } else { // TODO: Remove this when beta is default final asset = await _assetService.getAssetByRemoteId(assetId); From e6b9cc09c208494faf044458a278d38e872a14e6 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 14 Oct 2025 18:22:42 +0200 Subject: [PATCH 106/134] chore(web): update translations (#22623) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/immich/immich/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/bn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/et/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/gl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hi/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ka/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/mr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pa/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/ Translation: Immich/immich Co-authored-by: Abhijeet Bonde Co-authored-by: Adam Uchmanowicz Co-authored-by: Adrian Hermida Co-authored-by: Aleksa Milošević Co-authored-by: Amin Co-authored-by: AndreiP28 Co-authored-by: António Santos Co-authored-by: Asger Mogensen Co-authored-by: Christoph Auer Co-authored-by: Denis Pacquier Co-authored-by: DevServs Co-authored-by: Eetu Mäenpää Co-authored-by: Felipe Garcia Co-authored-by: Filip Joković Co-authored-by: Hurricane-32 Co-authored-by: Indrek Haav Co-authored-by: Jason Song Co-authored-by: Javier Villanueva García Co-authored-by: Jordy H Co-authored-by: Jorge Montejo Co-authored-by: Jozef Gaal Co-authored-by: Konstantinos D Co-authored-by: Leo Bottaro Co-authored-by: Linerly Co-authored-by: Liviu Roman Co-authored-by: Lorenz Baum Co-authored-by: Lukas Konsin Co-authored-by: Mandeep Co-authored-by: Marc Casillas Co-authored-by: Marcelo Popper Costa Co-authored-by: MatijaThe245th Co-authored-by: Matjaž T Co-authored-by: Mees Frensel Co-authored-by: Mirko Co-authored-by: Mārtiņš Bruņenieks Co-authored-by: Oleksandr Yurov Co-authored-by: Orkun Sürel Co-authored-by: Peter Dave Hello Co-authored-by: Philipp Burndorfer Co-authored-by: Prasanth Baskar Co-authored-by: Roman Zhukov Co-authored-by: Sayan Goswami Co-authored-by: Sergey Katsubo Co-authored-by: Simon Bierwald Co-authored-by: Sylvain Pichon Co-authored-by: TV Box Co-authored-by: Taiki M Co-authored-by: Theodore Zhvania Co-authored-by: Tim De Meyer Co-authored-by: User 123456789 Co-authored-by: Valentino Harpa Co-authored-by: Vegard Fladby Co-authored-by: Willem Schipper Co-authored-by: Yago Raña Gayoso Co-authored-by: Zurab Sajaia Co-authored-by: albanobattistella Co-authored-by: bittin1ddc447d824349b2 Co-authored-by: dark&white Co-authored-by: eav5jhl0 Co-authored-by: findussoft Co-authored-by: kiwinho Co-authored-by: millallo Co-authored-by: pyccl Co-authored-by: rokon001 Co-authored-by: vaibhav kumar Co-authored-by: waclaw66 Co-authored-by: Максим Горпиніч Co-authored-by: தமிழ்நேரம் --- i18n/ar.json | 1 + i18n/be.json | 10 + i18n/bn.json | 6 + i18n/ca.json | 1 + i18n/cs.json | 7 +- i18n/da.json | 4 +- i18n/de.json | 42 +-- i18n/el.json | 1 + i18n/es.json | 3 +- i18n/et.json | 11 +- i18n/fi.json | 123 +++++--- i18n/fr.json | 3 +- i18n/gl.json | 635 +++++++++++++++++++++++++--------------- i18n/he.json | 18 +- i18n/hi.json | 1 + i18n/hr.json | 189 ++++++------ i18n/id.json | 3 + i18n/it.json | 4 +- i18n/ja.json | 2 + i18n/ka.json | 9 +- i18n/lv.json | 74 ++++- i18n/mr.json | 87 +++++- i18n/nb_NO.json | 1 + i18n/nl.json | 124 ++++---- i18n/pa.json | 22 +- i18n/pl.json | 6 +- i18n/pt.json | 5 +- i18n/pt_BR.json | 5 +- i18n/ro.json | 20 +- i18n/ru.json | 6 +- i18n/sk.json | 45 +-- i18n/sl.json | 2 + i18n/sr_Latn.json | 8 +- i18n/sv.json | 1 + i18n/ta.json | 49 ++-- i18n/tr.json | 41 +-- i18n/uk.json | 4 +- i18n/zh_Hant.json | 508 ++++++++++++++++---------------- i18n/zh_SIMPLIFIED.json | 5 +- 39 files changed, 1265 insertions(+), 821 deletions(-) diff --git a/i18n/ar.json b/i18n/ar.json index a94c920bec..5d94846c52 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -33,6 +33,7 @@ "add_to_albums": "إضافة الى البومات", "add_to_albums_count": "إضافه إلى البومات ({count})", "add_to_shared_album": "إضافة إلى ألبوم مشارك", + "add_upload_to_stack": "اضف رفع الى حزمة", "add_url": "إضافة رابط", "added_to_archive": "أُضيفت للأرشيف", "added_to_favorites": "أُضيفت للمفضلات", diff --git a/i18n/be.json b/i18n/be.json index 7298e904c1..98c02cae53 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -51,6 +51,9 @@ "backup_keep_last_amount": "Колькасць папярэдніх рэзервовых копій для захавання", "backup_onboarding_1_description": "зняшняя копія ў воблаку або ў іншым фізічным месцы.", "backup_onboarding_2_description": "лакальныя копіі на іншых прыладах. Гэта ўключае ў сябе асноўныя файлы і лакальную рэзервовую копію гэтых файлаў.", + "backup_onboarding_3_description": "поўная колькасць копій вашых данных, у тым ліку зыходных файлаў. Гэта ўключае 1 пазаштатную копію і 2 лакальныя копіі.", + "backup_onboarding_description": " стратэгія рэзервавання 3-2-1 рэкамендавана для аховы вашых данных. Вы павінны захоўваць копіі вашых загружаных фота / відэа гэтак жа добра, як базу данных Immich для вычарпальна поўнага рэзервовага капіявання.", + "backup_onboarding_footer": "Каб атрымаць дадатковую інфармацыю пра рэзервовае капіраванне Immich, звярніцеся да дакументацыі.", "backup_onboarding_parts_title": "Рэзервовая копія «3-2-1» уключае ў сябе:", "backup_onboarding_title": "Рэзервовыя копіі", "backup_settings": "Налады рэзервовага капіявання", @@ -93,6 +96,8 @@ "image_resolution": "Раздзяляльнасць", "image_settings": "Налады відарыса", "image_settings_description": "Кіруйце якасцю і раздзяляльнасцю сгенерыраваных відарысаў", + "image_thumbnail_description": "Маленькая мініяцюра з выдаленымі метададзенымі, якая выкарыстоўваецца пры праглядзе груп фатаграфій, такіх як асноўная хроніка", + "image_thumbnail_quality_description": "Якасць мініяцюр ад 1 да 100. Чым вышэй якасць, тым лепш, але пры гэтым ствараюцца файлы большага памеру і можа знізіцца хуткасць водгуку прыкладання.", "image_thumbnail_title": "Налады мініяцюр", "job_concurrency": "{job} канкурэнтнасць", "job_created": "Заданне створана", @@ -100,6 +105,8 @@ "job_settings": "Налады заданняў", "job_settings_description": "Кіраваць наладамі адначасовага (паралельнага) выканання задання", "job_status": "Становішча задання", + "jobs_delayed": "{jobCount, plural, other {# адкладзена}}", + "jobs_failed": "{jobCount, plural, other {# не выканалася}}", "library_created": "Створана бібліятэка: {library}", "library_deleted": "Бібліятэка выдалена", "library_scanning": "Сканаванне па раскладзе", @@ -156,6 +163,9 @@ "trash_settings": "Налады сметніцы", "trash_settings_description": "Кіраванне наладамі сметніцы", "user_cleanup_job": "Ачыстка карыстальніка", + "user_delete_delay": "Уліковы запіс {user} і актывы будуць запланаваны для канчатковага выдалення праз {delay, plural, one {# дзень} few {# дні} many {# дзён} other {# дзён}}.", + "user_delete_delay_settings_description": "Колькасць дзён пасля выдалення, па заканчэнні якіх уліковы запіс карыстальніка і яго актывы будуць выдаленыя незваротна. Заданне на выдаленне карыстальніка запускаецца апоўначы для праверкі гатоўнасці карыстальнікаў да выдалення. Змены ў гэтым параметры будуць улічаныя пры наступным выкананні.", + "user_delete_immediately": "Уліковы запіс {user} і актывы будуць неадкладна змешчаны ў чаргу на канчатковае выдаленне.", "user_management": "Кіраванне карыстальнікамі", "user_password_has_been_reset": "Пароль карыстальніка быў скінуты:", "user_password_reset_description": "Задайце карыстальніку часовы пароль і паведаміце яму, што пры наступным уваходзе ў сістэму яму трэба будзе змяніць пароль.", diff --git a/i18n/bn.json b/i18n/bn.json index 004b584d3c..813aadea7e 100644 --- a/i18n/bn.json +++ b/i18n/bn.json @@ -28,6 +28,7 @@ "add_to_album": "এলবাম এ যোগ করুন", "add_to_album_bottom_sheet_added": "{album} এ যোগ করা হয়েছে", "add_to_album_bottom_sheet_already_exists": "{album} এ আগে থেকেই আছে", + "add_to_album_bottom_sheet_some_local_assets": "কিছু স্থানীয় ছবি বা ভিডিও অ্যালবামে যোগ করা যায়নি", "add_to_album_toggle": "{album} - এর নির্বাচন পরিবর্তন করুন", "add_to_albums": "অ্যালবামে যোগ করুন", "add_to_albums_count": "অ্যালবামে যোগ করুন ({count})", @@ -123,6 +124,11 @@ "logging_enable_description": "লগিং এনাবল/সক্ষম করুন", "logging_level_description": "সক্রিয় থাকাকালীন, কোন লগ স্তর ব্যবহার করতে হবে।", "logging_settings": "লগিং", + "machine_learning_availability_checks": "প্রাপ্যতা পরীক্ষা", + "machine_learning_availability_checks_description": "স্বয়ংক্রিয়ভাবে উপলব্ধ মেশিন লার্নিং সার্ভারগুলি সনাক্ত করুন এবং পছন্দ করুন", + "machine_learning_availability_checks_enabled": "প্রাপ্যতা পরীক্ষা সক্ষম করুন", + "machine_learning_availability_checks_interval": "চেক ব্যবধান", + "machine_learning_availability_checks_interval_description": "প্রাপ্যতা পরীক্ষাগুলির মধ্যে ব্যবধান মিলিসেকেন্ডে", "machine_learning_clip_model": "CLIP মডেল", "machine_learning_clip_model_description": "এখানে তালিকাভুক্ত একটি CLIP মডেলের নাম। মনে রাখবেন, মডেল পরিবর্তনের পর সব ছবির জন্য অবশ্যই ‘Smart Search’ কাজটি আবার চালাতে হবে।", "machine_learning_duplicate_detection": "পুনরাবৃত্তি সনাক্তকরণ", diff --git a/i18n/ca.json b/i18n/ca.json index 5f3267f7ca..cd55641f64 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -33,6 +33,7 @@ "add_to_albums": "Afegir als àlbums", "add_to_albums_count": "Afegir als àlbums ({count})", "add_to_shared_album": "Afegir a un àlbum compartit", + "add_upload_to_stack": "Afegeix la càrrega a la pila", "add_url": "Afegir URL", "added_to_archive": "Afegir a l'arxiu", "added_to_favorites": "Afegit als preferits", diff --git a/i18n/cs.json b/i18n/cs.json index 4382629f89..e6fe1a3589 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -28,11 +28,12 @@ "add_to_album": "Přidat do alba", "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_some_local_assets": "Některá místní aktiva nebylo možné přidat do alba", + "add_to_album_bottom_sheet_some_local_assets": "Některé místní položky nebylo možné přidat do alba", "add_to_album_toggle": "Přepnout výběr pro {album}", "add_to_albums": "Přidat do alb", "add_to_albums_count": "Přidat do alb ({count})", "add_to_shared_album": "Přidat do sdíleného alba", + "add_upload_to_stack": "Přidat nahrané do zásobníku", "add_url": "Přidat URL", "added_to_archive": "Přidáno do archivu", "added_to_favorites": "Přidáno do oblíbených", @@ -129,8 +130,8 @@ "machine_learning_availability_checks_enabled": "Povolit kontroly dostupnosti", "machine_learning_availability_checks_interval": "Interval kontrol", "machine_learning_availability_checks_interval_description": "Interval v milisekundách mezi kontrolami dostupnosti", - "machine_learning_availability_checks_timeout": "Vypršení požadavku", - "machine_learning_availability_checks_timeout_description": "Časové vypršení požadavku v milisekundách u kontrol dostupnosti", + "machine_learning_availability_checks_timeout": "Časový limit požadavku", + "machine_learning_availability_checks_timeout_description": "Časový limit v milisekundách pro kontrolu dostupnosti", "machine_learning_clip_model": "Model CLIP", "machine_learning_clip_model_description": "Název CLIP modelu je uvedený zde. Pamatujte, že při změně modelu je nutné znovu spustit úlohu 'Chytré vyhledávání' pro všechny obrázky.", "machine_learning_duplicate_detection": "Kontrola duplicit", diff --git a/i18n/da.json b/i18n/da.json index c7aabf2b3c..24dd99d45f 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -651,7 +651,7 @@ "cast": "Caste", "cast_description": "Konfigurer tilgængelige cast destinationer", "change_date": "Ændr dato", - "change_description": "Beskrivelse af ændringer", + "change_description": "Ændr beskrivelse", "change_display_order": "Ændrer visningsrækkefølge", "change_expiration_time": "Ændr udløbstidspunkt", "change_location": "Ændr sted", @@ -1385,7 +1385,7 @@ "no_albums_message": "Opret et album for at organisere dine billeder og videoer", "no_albums_with_name_yet": "Det ser ud til, at du ikke har noget album med dette navn endnu.", "no_albums_yet": "Det ser ud til, at du ikke har nogen album endnu.", - "no_archived_assets_message": "Arkivér billeder og videoer for at gemme dem væk fra din Billede oversigt", + "no_archived_assets_message": "Arkivér billeder og videoer for at gemme dem væk fra din billedoversigt", "no_assets_message": "KLIK FOR AT UPLOADE DIT FØRSTE BILLEDE", "no_assets_to_show": "Ingen elementer at vise", "no_cast_devices_found": "Ingen Cast-enheder fundet", diff --git a/i18n/de.json b/i18n/de.json index 69e36be8e9..7f81950c29 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -33,6 +33,7 @@ "add_to_albums": "Zu Alben hinzufügen", "add_to_albums_count": "Zu Alben hinzufügen ({count})", "add_to_shared_album": "Zu geteiltem Album hinzufügen", + "add_upload_to_stack": "Upload zum Stapel hinzufügen", "add_url": "URL hinzufügen", "added_to_archive": "Zum Archiv hinzugefügt", "added_to_favorites": "Zu Favoriten hinzugefügt", @@ -48,14 +49,14 @@ "background_task_job": "Hintergrundaufgaben", "backup_database": "Datenbanksicherung erstellen", "backup_database_enable_description": "Datenbank regelmäßig sichern", - "backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Backups", + "backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen", "backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.", - "backup_onboarding_2_description": "Lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.", - "backup_onboarding_3_description": "3 komplette Kopien deiner Daten, inkl. der Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopie.", - "backup_onboarding_description": "Eine 3-2-1 Backup-Strategie wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Backup-Lösung zu haben.", + "backup_onboarding_2_description": "lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.", + "backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.", + "backup_onboarding_description": "Eine 3-2-1 Sicherungssrategie wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Sicherungslösung zu haben.", "backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der Dokumentation.", "backup_onboarding_parts_title": "Eine 3-2-1-Sicherung umfasst:", - "backup_onboarding_title": "Backups", + "backup_onboarding_title": "Sicherungen", "backup_settings": "Einstellungen für Datenbanksicherung", "backup_settings_description": "Einstellungen zur regelmäßigen Sicherung der Datenbank. Hinweis: Diese Jobs werden nicht überwacht und du wirst nicht über Fehler informiert.", "cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}", @@ -67,9 +68,9 @@ "confirm_user_password_reset": "Bist du sicher, dass du das Passwort für {user} zurücksetzen möchtest?", "confirm_user_pin_code_reset": "Bist du sicher, dass du den PIN Code von {user} zurücksetzen möchtest?", "create_job": "Aufgabe erstellen", - "cron_expression": "Cron Zeitangabe", - "cron_expression_description": "Setze ein Intervall für die Sicherung mittels cron. Hilfe mit dem Format bietet dir dabei z. B. der Crontab Guru", - "cron_expression_presets": "Nützliche Zeitangaben für Cron", + "cron_expression": "Cron-Zeitangabe", + "cron_expression_description": "Setze das Scanintervall im Cron-Format. Hilfe mit dem Format bietet dir dabei z. B. der Crontab Guru", + "cron_expression_presets": "Vorlagen für Cron-Zeitangabe", "disable_login": "Login deaktivieren", "duplicate_detection_job_description": "Diese Aufgabe führt das maschinelle Lernen für jede Datei aus, um Duplikate zu finden. Diese Aufgabe beruht auf der intelligenten Suche", "exclusion_pattern_description": "Mit Ausschlussmustern können Dateien und Ordner beim Scannen Ihrer Bibliothek ignoriert werden. Dies ist nützlich, wenn du Ordner hast, die Dateien enthalten, die du nicht importieren möchtest, wie z. B. RAW-Dateien.", @@ -286,13 +287,13 @@ "storage_template_user_label": "{label} is die Speicherpfadbezeichnung des Benutzers", "system_settings": "Systemeinstellungen", "tag_cleanup_job": "Tags aufräumen", - "template_email_available_tags": "In deiner Vorlage kannst du die folgenden Variablen verwenden: {tags}", - "template_email_if_empty": "Wenn die Vorlage leer ist, wird die Standard-E-Mail verwendet.", - "template_email_invite_album": "E-Mail-Vorlage: Einladung zu Album", + "template_email_available_tags": "Du kannst die folgenden Variablen in deiner Vorlage verwenden: {tags}", + "template_email_if_empty": "Wenn die Vorlage leer ist, wird die Standard-E-Mail-Vorlage verwendet.", + "template_email_invite_album": "Einladung zu Album", "template_email_preview": "Vorschau", "template_email_settings": "E-Mail-Vorlagen", - "template_email_update_album": "Album-Vorlage aktualisieren", - "template_email_welcome": "Willkommen bei den E-Mail-Vorlagen", + "template_email_update_album": "Aktualisiertes Album", + "template_email_welcome": "Willkommens-E-Mail", "template_settings": "Benachrichtigungsvorlagen", "template_settings_description": "Benutzerdefinierte Vorlagen für Benachrichtigungen verwalten", "theme_custom_css_settings": "Benutzerdefiniertes CSS", @@ -538,18 +539,18 @@ "autoplay_slideshow": "Automatische Diashow", "back": "Zurück", "back_close_deselect": "Zurück, Schließen oder Abwählen", - "background_backup_running_error": "Hintergrund Sicherung läuft, kann manuelle Sicherung nicht starten", + "background_backup_running_error": "Sicherung läuft im Hintergrund. Manuelle Sicherung kann nicht gestartet werden", "background_location_permission": "Hintergrund Standortfreigabe", "background_location_permission_content": "Um im Hintergrund zwischen den Netzwerken wechseln zu können, muss Immich *immer* Zugriff auf den genauen Standort haben, damit die App den Namen des WLAN-Netzwerks ermitteln kann", "background_options": "Hintergrund Optionen", "backup": "Sicherung", "backup_album_selection_page_albums_device": "Alben auf dem Gerät ({count})", - "backup_album_selection_page_albums_tap": "Einmalig das Album antippen um es zu sichern, doppelt antippen um es nicht mehr zu sichern", + "backup_album_selection_page_albums_tap": "Antippen zum sichern, erneut antippen zum Ausschließen", "backup_album_selection_page_assets_scatter": "Elemente (Fotos / Videos) 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_selection_info": "Information", - "backup_album_selection_page_total_assets": "Elemente", - "backup_albums_sync": "Synchronisation von Alben beim Backup", + "backup_album_selection_page_selection_info": "Auswahlinformation", + "backup_album_selection_page_total_assets": "Elemente gesamt", + "backup_albums_sync": "Synchronisation der Sicherungsalben", "backup_all": "Alle", "backup_background_service_backup_failed_message": "Es trat ein Fehler bei der Sicherung auf. Erneuter Versuch…", "backup_background_service_connection_failed_message": "Es konnte keine Verbindung zum Server hergestellt werden. Erneuter Versuch…", @@ -599,7 +600,7 @@ "backup_controller_page_turn_on": "Sicherung im Vordergrund einschalten", "backup_controller_page_uploading_file_info": "Informationen", "backup_err_only_album": "Das einzige Album kann nicht entfernt werden", - "backup_error_sync_failed": "Synchronisierung fehlgeschlagen. Backup kann nicht verarbeitet werden.", + "backup_error_sync_failed": "Synchronisierung fehlgeschlagen. Sicherung kann nicht verarbeitet werden.", "backup_info_card_assets": "Elemente", "backup_manual_cancelled": "Abgebrochen", "backup_manual_in_progress": "Sicherung läuft bereits. Bitte versuche es später erneut", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Fehler bei der Aktualisierung der Beschreibung", "exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_location": "STANDORT", + "exif_bottom_sheet_no_description": "Keine Beschreibung", "exif_bottom_sheet_people": "PERSONEN", "exif_bottom_sheet_person_add_person": "Namen hinzufügen", "exit_slideshow": "Diashow beenden", @@ -1954,7 +1956,7 @@ "sync_remote": "mit Server synchronisieren", "sync_status": "Synchronisierungstatus", "sync_status_subtitle": "Synchronisierungssystem anzeigen und bearbeiten", - "sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch", + "sync_upload_album_setting_subtitle": "Erstelle und lade deine ausgewählten Fotos und Videos in die ausgewählten Alben auf Immich hoch", "tag": "Tag", "tag_assets": "Dateien taggen", "tag_created": "Tag erstellt: {tag}", diff --git a/i18n/el.json b/i18n/el.json index 6492ea0370..6f6835b441 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -33,6 +33,7 @@ "add_to_albums": "Προσθήκη στα άλμπουμ", "add_to_albums_count": "Προσθήκη στα άλμπουμ ({count})", "add_to_shared_album": "Προσθήκη σε κοινόχρηστο άλμπουμ", + "add_upload_to_stack": "Προσθήκη αρχείου στην ουρά", "add_url": "Προσθήκη Συνδέσμου", "added_to_archive": "Προστέθηκε στο αρχείο", "added_to_favorites": "Προστέθηκε στα αγαπημένα", diff --git a/i18n/es.json b/i18n/es.json index 626ae0540c..c08f93da08 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -33,6 +33,7 @@ "add_to_albums": "Incluir en álbumes", "add_to_albums_count": "Incluir en {count} álbumes", "add_to_shared_album": "Incluir en álbum compartido", + "add_upload_to_stack": "Añadir archivo y apilar", "add_url": "Agregar URL", "added_to_archive": "Agregado al Archivado", "added_to_favorites": "Agregado a favoritos", @@ -599,7 +600,7 @@ "backup_controller_page_turn_on": "Activar la copia de seguridad", "backup_controller_page_uploading_file_info": "Subiendo información del archivo", "backup_err_only_album": "No se puede eliminar el único álbum", - "backup_error_sync_failed": "Sincronización falló. No es posible procesar la copia de seguridad.", + "backup_error_sync_failed": "La sincronización falló. No es posible procesar la copia de seguridad.", "backup_info_card_assets": "elementos", "backup_manual_cancelled": "Cancelado", "backup_manual_in_progress": "Subida ya en progreso. Vuelve a intentarlo más tarde", diff --git a/i18n/et.json b/i18n/et.json index d451606dae..bfd083ad4e 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -33,6 +33,7 @@ "add_to_albums": "Lisa albumitesse", "add_to_albums_count": "Lisa albumitesse ({count})", "add_to_shared_album": "Lisa jagatud albumisse", + "add_upload_to_stack": "Virnasta üleslaaditud üksus", "add_url": "Lisa URL", "added_to_archive": "Lisatud arhiivi", "added_to_favorites": "Lisatud lemmikutesse", @@ -599,6 +600,7 @@ "backup_controller_page_turn_on": "Lülita esiplaanil varundus sisse", "backup_controller_page_uploading_file_info": "Faili info üleslaadimine", "backup_err_only_album": "Ei saa ainsat albumit eemaldada", + "backup_error_sync_failed": "Sünkroonimine ebaõnnestus. Varundust ei saa töödelda.", "backup_info_card_assets": "üksused", "backup_manual_cancelled": "Tühistatud", "backup_manual_in_progress": "Üleslaadimine juba käib. Proovi hiljem uuesti", @@ -1037,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Viga kirjelduse muutmisel", "exif_bottom_sheet_details": "ÜKSIKASJAD", "exif_bottom_sheet_location": "ASUKOHT", + "exif_bottom_sheet_no_description": "Kirjeldus puudub", "exif_bottom_sheet_people": "ISIKUD", "exif_bottom_sheet_person_add_person": "Lisa nimi", "exit_slideshow": "Sulge slaidiesitlus", @@ -1323,7 +1326,7 @@ "marked_all_as_read": "Kõik märgiti loetuks", "matches": "Ühtivad failid", "matching_assets": "Ühtivad üksused", - "media_type": "Meediumi tüüp", + "media_type": "Üksuse tüüp", "memories": "Mälestused", "memories_all_caught_up": "Ongi kõik", "memories_check_back_tomorrow": "Vaata homme juba uusi mälestusi", @@ -1406,6 +1409,7 @@ "no_results_description": "Proovi sünonüümi või üldisemat märksõna", "no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada", "no_uploads_in_progress": "Üleslaadimisi käimas ei ole", + "not_available": "Pole saadaval", "not_in_any_album": "Pole üheski albumis", "not_selected": "Ei ole valitud", "note_apply_storage_label_to_previously_uploaded assets": "Märkus: Et rakendada talletussilt varem üleslaaditud üksustele, käivita", @@ -1583,6 +1587,7 @@ "purchase_server_description_2": "Toetaja staatus", "purchase_server_title": "Server", "purchase_settings_server_activated": "Serveri tootevõtit haldab administraator", + "query_asset_id": "Päringu üksuse ID", "queue_status": "Järjekorras {count}/{total}", "rating": "Hinnang", "rating_clear": "Tühjenda hinnang", @@ -1710,8 +1715,8 @@ "search_filter_filename": "Otsi failinime alusel", "search_filter_location": "Asukoht", "search_filter_location_title": "Vali asukoht", - "search_filter_media_type": "Meediumi tüüp", - "search_filter_media_type_title": "Vali meediumi tüüp", + "search_filter_media_type": "Üksuse tüüp", + "search_filter_media_type_title": "Vali üksuse tüüp", "search_filter_people_title": "Vali isikud", "search_for": "Otsi", "search_for_existing_person": "Otsi olemasolevat isikut", diff --git a/i18n/fi.json b/i18n/fi.json index 769b528f4c..a940493d95 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -28,6 +28,7 @@ "add_to_album": "Lisää albumiin", "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_some_local_assets": "Joitakin osia paikallisesta sisällöstä ei pystytty lisämään albumiin", "add_to_album_toggle": "Vaihda albumin {album} valintaa", "add_to_albums": "Lisää albumeihin", "add_to_albums_count": "Lisää albumeihin ({count})", @@ -39,7 +40,7 @@ "admin": { "add_exclusion_pattern_description": "Lisää mallit, jonka mukaan jätetään tiedostoja pois. Jokerimerkit *, ** ja ? ovat tuettuna. Jättääksesi pois kaikki tiedostot mistä tahansa löytyvästä kansiosta \"Raw\" käytä \"**/Raw/**\". Jättääksesi pois kaikki \". tif\" päätteiset tiedot, käytä \"**/*.tif\". Jättääksesi pois tarkan tiedostopolun, käytä \"/path/to/ignore/**\".", "admin_user": "Ylläpitäjä", - "asset_offline_description": "Ulkoista kirjaston resurssia ei enää löydy levyltä, ja se on siirretty roskakoriin. Jos tiedosto siirrettiin kirjaston sisällä, tarkista aikajanaltasi uusi vastaava resurssi. Palautaaksesi tämän resurssin, varmista, että alla oleva tiedostopolku on Immichin käytettävissä ja skannaa kirjasto uudelleen.", + "asset_offline_description": "Ulkoista kirjaston resurssia ei enää löydy levyltä, ja se on siirretty roskakoriin. Jos tiedosto siirrettiin kirjaston sisällä, tarkista aikajanaltasi uusi vastaava resurssi. Palauttaaksesi tämän resurssin, varmista, että alla oleva tiedostopolku on Immichin käytettävissä ja skannaa kirjasto uudelleen.", "authentication_settings": "Autentikointiasetukset", "authentication_settings_description": "Hallitse salasana-, OAuth- ja muut autentikoinnin asetukset", "authentication_settings_disable_all": "Haluatko varmasti poistaa kaikki kirjautumistavat käytöstä? Kirjautuminen on tämän jälkeen mahdotonta.", @@ -149,7 +150,7 @@ "machine_learning_max_recognition_distance": "Suurin kasvojen eroavaisuus", "machine_learning_max_recognition_distance_description": "Kahden kasvon suurin eroavaisuus, milloin ne vielä mielletään samaksi henkilöksi, välillä 0-2. Arvoa alentamalla voidaan ehkäistä kahden saman näköisen henkilön mieltäminen samaksi henkilöksi, kun taas korottamalla voidaan ehkäistä saman henkilön mieltäminen kahdeksi erilliseksi henkilöksi. Huomaa että on helpompaa yhdistää kaksi, kuin erottaa, joten suosi mahdollisimman matalaa arvoa.", "machine_learning_min_detection_score": "Tunnistuksen vähimmäistulos", - "machine_learning_min_detection_score_description": "Pienin kasvojen tunnistamisessa saatu vahvuusarvo välillä 0-1. Matalammalla arvolla havaitaan enemmän kascoja, mutta voi lisätä virhearvioiden määrää.", + "machine_learning_min_detection_score_description": "Pienin kasvojen tunnistamisessa saatu vahvuusarvo välillä 0-1. Matalammalla arvolla havaitaan enemmän kasvoja, mutta voi lisätä virhearvioiden määrää.", "machine_learning_min_recognized_faces": "Tunnistettujen kasvojen vähimmäismäärä", "machine_learning_min_recognized_faces_description": "Luotavan käyttäjän kasvojen vähimmäismäärä. Arvoa nostamalla kasvojentunnistuksen tarkkuus paranee, mutta todennäköisyys sille, että kasvoja ei osata yhdistää henkilöön kasvaa.", "machine_learning_settings": "Koneoppimisen asetukset", @@ -183,7 +184,7 @@ "metadata_settings": "Metatietoasetukset", "metadata_settings_description": "Hallitse metatietoja", "migration_job": "Migraatio", - "migration_job_description": "Migroi aineiston pikkukuvat ja kasvot uusimpaan kansiorakenteeseen", + "migration_job_description": "Migratoi aineiston pikkukuvat ja kasvot uusimpaan kansiorakenteeseen", "nightly_tasks_cluster_faces_setting_description": "Aja kasvojen tunnistus uusiin tunnistettuihin kasvoihin", "nightly_tasks_cluster_new_faces_setting": "Kokoa uudet kasvot", "nightly_tasks_database_cleanup_setting": "Tietokannan puhdistuksen tehtävät", @@ -203,7 +204,7 @@ "note_apply_storage_label_previous_assets": "Huom: Asettaaksesi nimikkeen aiemmin ladatulle aineistolle, aja", "note_cannot_be_changed_later": "Huom: Tätä ei voi enää myöhemmin vaihtaa!", "notification_email_from_address": "Lähettäjän osoite", - "notification_email_from_address_description": "Lähettäjän sähköpostiosoite. Esimerkiksi \"Immich-kuvapalvelin \". Varmista, että käytetystä osoiteesta on lupa lähettää sähköposteja.", + "notification_email_from_address_description": "Lähettäjän sähköpostiosoite. Esimerkiksi \"Immich-kuvapalvelin \". Varmista, että käytetystä osoitteesta on lupa lähettää sähköposteja.", "notification_email_host_description": "Sähköpostipalvelin (esim. smtp.immich.app)", "notification_email_ignore_certificate_errors": "Älä huomioi varmennevirheitä", "notification_email_ignore_certificate_errors_description": "Älä huomioi TLS-varmenteiden validointivirheitä (ei suositeltu)", @@ -225,9 +226,9 @@ "oauth_button_text": "Painikkeen teksti", "oauth_client_secret_description": "Vaaditaan, jos OAuth-palveluntarjoaja ei tue PKCE:tä (Proof Key for Code Exchange)", "oauth_enable_description": "Kirjaudu käyttäen OAuthia", - "oauth_mobile_redirect_uri": "Mobiilin uudellenohjaus-URI", + "oauth_mobile_redirect_uri": "Mobiilin uudelleenohjaus-URI", "oauth_mobile_redirect_uri_override": "Ohita mobiilin uudelleenohjaus-URI", - "oauth_mobile_redirect_uri_override_description": "Ota käyttöön kun OAuth tarjoaja ei salli mobiili URI:a, kuten ''{callback}''", + "oauth_mobile_redirect_uri_override_description": "Ota käyttöön kun OAuth-tarjoaja ei salli mobiili-URI:a, kuten ''{callback}''", "oauth_role_claim": "Roolin vaatimus", "oauth_role_claim_description": "Salli pääkäyttäjän pääsyoikeus automaattisesti tämän vaatimuksen perusteella. Vaatimus voi sisältää, joko 'käyttäjän' tai 'pääkäyttäjän'.", "oauth_settings": "OAuth", @@ -278,7 +279,7 @@ "storage_template_migration_info": "Tallennusmalli muuntaa kaikki tiedostopäätteet pieniksi kirjaimiksi. Mallipohjan muutokset koskevat vain uusia resursseja. Jos haluat käyttää mallipohjaa takautuvasti aiemmin ladattuihin resursseihin, suorita {job}.", "storage_template_migration_job": "Tallennustilan mallin muutostyö", "storage_template_more_details": "Saadaksesi lisätietoa tästä ominaisuudesta, katso Tallennustilan Mallit sekä mihin se vaikuttaa", - "storage_template_onboarding_description_v2": "Päälle kytkettynä, toiminto järjestestelee tiedostot automaattisesti käyttäjän määrittämän mallin mukaisesti. Lisätietoja dokumentaatiosta..", + "storage_template_onboarding_description_v2": "Päälle kytkettynä toiminto järjestelee tiedostot automaattisesti käyttäjän määrittämän mallin mukaisesti. Lisätietoja dokumentaatiosta..", "storage_template_path_length": "Arvioitu tiedostopolun pituusrajoitus: {length, number}/{limit, number}", "storage_template_settings": "Tallennustilan malli", "storage_template_settings_description": "Hallitse palvelimelle ladatun aineiston kansiorakennetta ja tiedostonimiä", @@ -301,17 +302,17 @@ "thumbnail_generation_job": "Luo pikkukuvat", "thumbnail_generation_job_description": "Generoi isot, pienet sekä sumeat pikkukuvat jokaisesta aineistosta, kuten myös henkilöistä", "transcoding_acceleration_api": "Kiihdytysrajapinta", - "transcoding_acceleration_api_description": "Rajapinta, jolla keskustellaan laittesi kanssa nopeuttaaksemme koodausta. Tämä asetus on paras mahdollinen: Mikäli ongelmia ilmenee, palataan käyttämään ohjelmistopohjaista koodausta. VP9 voi toimia tai ei, riippuen laitteistosi kokoonpanosta.", + "transcoding_acceleration_api_description": "Rajapinta, jolla keskustellaan laitteesi kanssa nopeuttaaksemme koodausta. Tämä asetus on paras mahdollinen: Mikäli ongelmia ilmenee, palataan käyttämään ohjelmistopohjaista koodausta. VP9 voi toimia tai ei, riippuen laitteistosi kokoonpanosta.", "transcoding_acceleration_nvenc": "NVENC (vaatii NVIDIA:n grafiikkasuorittimen)", "transcoding_acceleration_qsv": "Quick Sync (Vaatii vähintään gen7 Intel prosessorin)", "transcoding_acceleration_rkmpp": "RKMPP (vain Rockchip SOCt)", "transcoding_acceleration_vaapi": "VAAPI", "transcoding_accepted_audio_codecs": "Sallitut äänikoodekit", - "transcoding_accepted_audio_codecs_description": "Valitse mitä äänikoodekkeja ei tarvitse muuntaa. Käytetään vain tiettyjen koodauskäytäntöjen kanssa.", - "transcoding_accepted_containers": "Hyväksytyt kontit", - "transcoding_accepted_containers_description": "Valitse, mitä formaatteja ei tarvitse kääntää MP4- muotoon. Käytössä vain tietyille muunnos säännöille.", + "transcoding_accepted_audio_codecs_description": "Valitse, mitä äänikoodekkeja ei tarvitse muuntaa. Käytetään vain tiettyjen koodauskäytäntöjen kanssa.", + "transcoding_accepted_containers": "Sallitut säiliömuodot", + "transcoding_accepted_containers_description": "Valitse, mitä säiliömuotoja ei tarvitse muuntaa MP4-muotoon. Käytetään vain tiettyjen koodauskäytäntöjen kanssa.", "transcoding_accepted_video_codecs": "Sallitut videokoodekit", - "transcoding_accepted_video_codecs_description": "Valitse mitä videokoodekkeja ei tarvitse muuntaa. Käytetään vain tiettyjen koodauskäytäntöjen kanssa.", + "transcoding_accepted_video_codecs_description": "Valitse, mitä videokoodekkeja ei tarvitse muuntaa. Käytetään vain tiettyjen koodauskäytäntöjen kanssa.", "transcoding_advanced_options_description": "Asetukset, joita useimpien käyttäjien ei tulisi muuttaa", "transcoding_audio_codec": "Äänikoodekki", "transcoding_audio_codec_description": "Opus on paras laadultaan, mutta ei välttämättä ole yhteensopiva vanhempien laitteiden tai sovellusten kanssa.", @@ -338,7 +339,7 @@ "transcoding_policy": "Transkoodauskäytäntö", "transcoding_policy_description": "Aseta milloin video transkoodataan", "transcoding_preferred_hardware_device": "Ensisijainen laite", - "transcoding_preferred_hardware_device_description": "On voimassa vain VAAPI ja QSV -määritteille. Asettaa laitteistokoodauksessa käytetyn DRI noodin.", + "transcoding_preferred_hardware_device_description": "On voimassa vain VAAPI- ja QSV-määritteille. Asettaa laitteistokoodauksessa käytetyn DRI-noodin.", "transcoding_preset_preset": "Esiasetus (-asetus)", "transcoding_preset_preset_description": "Pakkausnopeus. Hitaampi tuottaa pienempiä tiedostoja ja parantaa laatua, kun kohdistetaan tiettyyn bittinopeuteen. VP9 ei huomioi korkeampaa kuin 'faster'.", "transcoding_reference_frames": "Kehysviitteet", @@ -355,7 +356,7 @@ "transcoding_tone_mapping": "Sävykartoitus", "transcoding_tone_mapping_description": "Pyrkii säilömään HDR-kuvien ulkonäön, kun muunnetaan peruskuvaksi. Jokaisella algoritmilla on omat heikkoutensa värien, yksityiskohtien tai kirkkauksien kesken. Hable säilöö yksityiskohdat, Mobius värit ja Reinhard kirkkaudet.", "transcoding_transcode_policy": "Transkoodauskäytäntö", - "transcoding_transcode_policy_description": "Käytäntö miten video tulisi transkoodata. HDR videot transkoodataan aina, paitsi jos transkoodaus on poistettu käytöstä.", + "transcoding_transcode_policy_description": "Käytäntö, miten video tulisi transkoodata. HDR-videot transkoodataan aina, paitsi jos transkoodaus on poistettu käytöstä.", "transcoding_two_pass_encoding": "Two-pass enkoodaus", "transcoding_two_pass_encoding_setting_description": "Transkoodaa kahdessa vaiheessa tuottaaksesi paremmin koodattuja videoita. Kun maksimibittinopeus on käytössä (vaaditaan H.264- ja HEVC-koodaukselle), tämä tila käyttää bittinopeusaluetta, joka perustuu maksimibittinopeuteen ja ohittaa CRF. VP9 osalta CRF:ää voidaan käyttää, jos maksimibittinopeus on poistettu käytöstä.", "transcoding_video_codec": "Videokoodekki", @@ -435,7 +436,7 @@ "album_updated_setting_description": "Saa sähköpostia kun jaetussa albumissa on uutta sisältöä", "album_user_left": "Poistuttiin albumista {album}", "album_user_removed": "{user} poistettu", - "album_viewer_appbar_delete_confirm": "Haluatko varmast poistaa tämän albumin tililtäsi?", + "album_viewer_appbar_delete_confirm": "Haluatko varmasti poistaa tämän albumin tililtäsi?", "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_remove": "Ongelmia kohteiden poistamisessa albumista", @@ -481,7 +482,7 @@ "archived_count": "{count, plural, other {Arkistoitu #}}", "are_these_the_same_person": "Ovatko he sama henkilö?", "are_you_sure_to_do_this": "Haluatko varmasti tehdä tämän?", - "asset_action_delete_err_read_only": "Vain luku-tilassa olevia kohteita ei voitu poistaa, ohitetaan", + "asset_action_delete_err_read_only": "Vain luku -tilassa olevia kohteita ei voitu poistaa, ohitetaan", "asset_action_share_err_offline": "Verkottomassa tilassa olevia kohteita ei voitu noutaa, ohitetaan", "asset_added_to_album": "Lisätty albumiin", "asset_adding_to_album": "Lisätään albumiin…", @@ -503,6 +504,7 @@ "asset_skipped": "Ohitettu", "asset_skipped_in_trash": "Roskakorissa", "asset_trashed": "Kohde poistettu", + "asset_troubleshoot": "Sisällön vian paikannus", "asset_uploaded": "Lähetetty", "asset_uploading": "Ladataan…", "asset_viewer_settings_subtitle": "Galleriakatseluohjelman asetusten hallinta", @@ -510,7 +512,7 @@ "assets": "Kohteet", "assets_added_count": "Lisätty {count, plural, one {# kohde} other {# kohdetta}}", "assets_added_to_album_count": "Albumiin lisätty {count, plural, one {# kohde} other {# kohdetta}}", - "assets_added_to_albums_count": "Lisätty {assetTotal, plural, one {# aineisto} other {# aaineistoa}} {albumTotal, plural, one {# albumiin} other {# albumeihin}}", + "assets_added_to_albums_count": "Lisätty {assetTotal, plural, one {# kohde} other {# kohdetta}} {albumTotal, plural, one {# albumiin} other {# albumiin}}", "assets_cannot_be_added_to_album_count": "{count, plural, one {Kohdetta} other {Kohdetta}} ei voida lisätä albumiin", "assets_cannot_be_added_to_albums": "{count, plural, one {Aineisto} other {Aineistoa}} ei voi lisätä mihinkään albumiin", "assets_count": "{count, plural, one {# media} other {# mediaa}}", @@ -547,6 +549,7 @@ "backup_album_selection_page_select_albums": "Valitse albumit", "backup_album_selection_page_selection_info": "Valintatiedot", "backup_album_selection_page_total_assets": "Ainulaatuisia kohteita yhteensä", + "backup_albums_sync": "Varmuuskopioitujen albumeiden synkronointi", "backup_all": "Kaikki", "backup_background_service_backup_failed_message": "Kohteiden varmuuskopiointi epäonnistui. Yritetään uudelleen…", "backup_background_service_connection_failed_message": "Palvelimeen ei saatu yhteyttä. Yritetään uudelleen…", @@ -596,7 +599,8 @@ "backup_controller_page_turn_on": "Varmuuskopiointi päälle", "backup_controller_page_uploading_file_info": "Tiedostojen lähetystiedot", "backup_err_only_album": "Vähintään yhden albumin tulee olla valittuna", - "backup_info_card_assets": "kohteet", + "backup_error_sync_failed": "Synkronointi epäonnistui. Varmuuskopion käsittely ei onnistu.", + "backup_info_card_assets": "kohdetta", "backup_manual_cancelled": "Peruutettu", "backup_manual_in_progress": "Lähetys palvelimelle on jo käynnissä. Kokeile myöhemmin uudelleen", "backup_manual_success": "Onnistui", @@ -631,7 +635,7 @@ "cache_settings_statistics_thumbnail": "Esikatselukuvat", "cache_settings_statistics_title": "Välimuistin käyttö", "cache_settings_subtitle": "Hallitse Immich-mobiilisovelluksen välimuistin käyttöä", - "cache_settings_tile_subtitle": "Hallitse paikallista tallenustilaa", + "cache_settings_tile_subtitle": "Hallitse paikallista tallennustilaa", "cache_settings_tile_title": "Paikallinen tallennustila", "cache_settings_title": "Välimuistin asetukset", "camera": "Kamera", @@ -663,6 +667,8 @@ "change_pin_code": "Vaihda PIN-koodi", "change_your_password": "Vaihda salasanasi", "changed_visibility_successfully": "Näkyvyys vaihdettu", + "charging": "Ladataan laitetta", + "charging_requirement_mobile_backup": "Varmuuskopiointi taustalla vaatii laitteen latautumista", "check_corrupt_asset_backup": "Vioittuneiden varmuuskopioiden tarkistaminen", "check_corrupt_asset_backup_button": "Suorita tarkistus", "check_corrupt_asset_backup_description": "Suorita tämä tarkistus vain Wi-Fi-yhteyden kautta ja vasta, kun kaikki kohteet on varmuuskopioitu. Toimenpide voi kestää muutamia minuutteja.", @@ -749,6 +755,7 @@ "create_user": "Luo käyttäjä", "created": "Luotu", "created_at": "Luotu", + "creating_linked_albums": "Luodaan linkattuja albumeita...", "crop": "Rajaa", "curated_object_page_title": "Asiat", "current_device": "Nykyinen laite", @@ -773,7 +780,7 @@ "deduplication_criteria_1": "Kuvan koko tavuina", "deduplication_criteria_2": "EXIF-datan määrä", "deduplication_info": "Deduplikaatiotieto", - "deduplication_info_description": "Jotta voimme automaattisesti esivalita aineistot ja poistaa duplikaatit suurina erinä, tarkastelemme:", + "deduplication_info_description": "Jotta voimme automaattisesti esivalita aineistot ja poistaa kaksoiskappaleet suurina erinä, tarkastelemme:", "default_locale": "Oletuskieliasetus", "default_locale_description": "Muotoile päivämäärät ja numerot selaimesi kielen mukaan", "delete": "Poista", @@ -848,7 +855,7 @@ "downloading_media": "Median lataaminen", "drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne", "duplicates": "Kaksoiskappaleet", - "duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos yksikään) ovat kaksoiskappaleita", + "duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos mitkään) ovat kaksoiskappaleita", "duration": "Kesto", "edit": "Muokkaa", "edit_album": "Muokkaa albumia", @@ -898,7 +905,9 @@ "error": "Virhe", "error_change_sort_album": "Albumin lajittelujärjestyksen muuttaminen epäonnistui", "error_delete_face": "Virhe kasvojen poistamisessa kohteesta", + "error_getting_places": "Ongelma paikkojen haussa", "error_loading_image": "Kuvan lataus ei onnistunut", + "error_loading_partners": "Ongelma partnerin haussa: {error}", "error_saving_image": "Virhe: {error}", "error_tag_face_bounding_box": "Kasvojen merkitseminen epäonnistui – rajausruudun koordinaatteja ei löydy", "error_title": "Virhe - Jotain meni pieleen", @@ -1058,11 +1067,12 @@ "failed_to_load_folder": "Kansion lataaminen epäonnistui", "favorite": "Suosikki", "favorite_action_prompt": "{count} lisätty suosikkeihin", - "favorite_or_unfavorite_photo": "Suosikki- tai ei-suosikkikuva", + "favorite_or_unfavorite_photo": "Lisää tai poista kuva suosikeista", "favorites": "Suosikit", "favorites_page_no_favorites": "Suosikkikohteita ei löytynyt", "feature_photo_updated": "Kansikuva ladattu", "features": "Ominaisuudet", + "features_in_development": "Kehityksessä olevat ominaisuudet", "features_setting_description": "Hallitse sovelluksen ominaisuuksia", "file_name": "Tiedoston nimi", "file_name_or_extension": "Tiedostonimi tai tiedostopääte", @@ -1090,6 +1100,8 @@ "go_back": "Palaa", "go_to_folder": "Mene kansioon", "go_to_search": "Siirry hakuun", + "gps": "GPS", + "gps_missing": "Ei GPS:ää", "grant_permission": "Myönnä lupa", "group_albums_by": "Ryhmitä albumi...", "group_country": "Ryhmitä maan mukaan", @@ -1119,18 +1131,18 @@ "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_success": "Lisätty {added} kohdetta albumiin {album}.", - "home_page_album_err_partner": "Kumppanin kohteita ei voi vielä lisätä albumiin. Hypätään yli", + "home_page_album_err_partner": "Kumppanin kohteita ei voi vielä lisätä albumiin, ohitetaan", "home_page_archive_err_local": "Paikallisten kohteiden arkistointi ei ole mahdollista, ohitetaan", - "home_page_archive_err_partner": "Kumppanin kohteita ei voi arkistoida. Hypätään yli", + "home_page_archive_err_partner": "Kumppanin kohteita ei voi arkistoida, ohitetaan", "home_page_building_timeline": "Rakennetaan aikajanaa", - "home_page_delete_err_partner": "Kumppanin kohteita ei voi poistaa.Hypätään yli", + "home_page_delete_err_partner": "Kumppanin kohteita ei voi poistaa, ohitetaan", "home_page_delete_remote_err_local": "Paikallisia kohteita etäkohdevalintojen joukossa, ohitetaan", "home_page_favorite_err_local": "Paikallisten kohteiden lisääminen suosikkeihin ei ole mahdollista, ohitetaan", - "home_page_favorite_err_partner": "Kumppanin kohteita ei voi vielä merkitä suosikiksi. Hypätään yli", + "home_page_favorite_err_partner": "Kumppanin kohteita ei voi vielä merkitä suosikiksi, ohitetaan", "home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita", "home_page_locked_error_local": "Paikallisten kohteiden siirto lukittuun kansioon ei onnistu, ohitetaan", "home_page_locked_error_partner": "Kumppanin kohteita ei voi siirtää lukittuun kansioon, ohitetaan", - "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, ohitetaan", "home_page_upload_err_limit": "Voit lähettää palvelimelle enintään 30 kohdetta kerrallaan, ohitetaan", "host": "Isäntä", "hour": "Tunti", @@ -1158,7 +1170,7 @@ "immich_web_interface": "Immich-verkkokäyttöliittymä", "import_from_json": "Tuo JSON-tiedostosta", "import_path": "Tuontipolku", - "in_albums": "{count, plural, one {# Albumissa} other {# albumissa}}", + "in_albums": "{count, plural, one {# albumissa} other {# albumissa}}", "in_archive": "Arkistossa", "include_archived": "Sisällytä arkistoidut", "include_shared_albums": "Sisällytä jaetut albumit", @@ -1167,10 +1179,10 @@ "individual_shares": "Yksittäiset jaot", "info": "Lisätietoja", "interval": { - "day_at_onepm": "Joka päivä klo 13:00", + "day_at_onepm": "Joka päivä klo 13.00", "hours": "Joka {hours, plural, one {tunti} other {{hours, number} tuntia}}", "night_at_midnight": "Joka yö keskiyöllä", - "night_at_twoam": "Joka yö klo 02:00" + "night_at_twoam": "Joka yö klo 2.00" }, "invalid_date": "Virheellinen päivämäärä", "invalid_date_format": "Virheellinen päivämäärämuoto", @@ -1225,6 +1237,7 @@ "local": "Paikallinen", "local_asset_cast_failed": "Kohdetta, joka ei ole ladattuna palvelimelle, ei voida striimata", "local_assets": "Paikalliset kohteet", + "local_media_summary": "Paikallisen median yhteenveto", "local_network": "Lähiverkko", "local_network_sheet_info": "Sovellus muodostaa yhteyden palvelimeen tämän URL-osoitteen kautta, kun käytetään määritettyä Wi-Fi-verkkoa", "location_permission": "Sijainnin käyttöoikeus", @@ -1236,6 +1249,7 @@ "location_picker_longitude_hint": "Syötä pituusaste", "lock": "Lukitse", "locked_folder": "Lukittu kansio", + "log_detail_title": "Lokin yksityiskohtaisuus", "log_out": "Kirjaudu ulos", "log_out_all_devices": "Kirjaudu ulos kaikilta laitteilta", "logged_in_as": "Kirjautunut käyttäjänä {user}", @@ -1266,6 +1280,7 @@ "login_password_changed_success": "Salasan päivitetty onnistuneesti", "logout_all_device_confirmation": "Haluatko varmasti kirjautua ulos kaikilta laitteilta?", "logout_this_device_confirmation": "Haluatko varmasti kirjautua ulos näiltä laitteilta?", + "logs": "Loki", "longitude": "Pituusaste", "look": "Tyyli", "loop_videos": "Toista videot uudelleen", @@ -1273,6 +1288,7 @@ "main_branch_warning": "Käytät kehitysversiota; suosittelemme vahvasti käyttämään julkaisuversiota!", "main_menu": "Päävalikko", "make": "Valmistaja", + "manage_geolocation": "Muokkaa sijaintia", "manage_shared_links": "Hallitse jaettuja linkkejä", "manage_sharing_with_partners": "Hallitse jakamista kumppaneille", "manage_the_app_settings": "Hallitse sovelluksen asetuksia", @@ -1307,6 +1323,7 @@ "mark_as_read": "Merkitse luetuksi", "marked_all_as_read": "Merkitty kaikki luetuiksi", "matches": "Osumia", + "matching_assets": "Vastaava sisältö", "media_type": "Median tyyppi", "memories": "Muistoja", "memories_all_caught_up": "Kaikki ajan tasalla", @@ -1340,13 +1357,14 @@ "moved_to_library": "Siirretty {count, plural, one {# kohde} other {# kohdetta}} kirjastoon", "moved_to_trash": "Siirretty roskakoriin", "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", "mute_memories": "Mykistä muistot", "my_albums": "Omat albumit", "name": "Nimi", "name_or_nickname": "Nimi tai lempinimi", "network_requirement_photos_upload": "Käytä mobiiliverkkoa kuvien varmuuskopioimiseksi", "network_requirement_videos_upload": "Käytä mobiiliverkkoa videoiden varmuuskopioimiseksi", + "network_requirements": "Verkkovaatimukset", "network_requirements_updated": "Verkkovaatimukset muuttuivat, nollataan varmuuskopiointijono", "networking_settings": "Verkko", "networking_subtitle": "Hallitse palvelinasetuksia", @@ -1357,6 +1375,7 @@ "new_person": "Uusi henkilö", "new_pin_code": "Uusi PIN-koodi", "new_pin_code_subtitle": "Tämä on ensimmäinen kerta, kun käytät lukittua kansiota. Luo PIN-koodi päästäksesi tähän sisältöön turvallisesti", + "new_timeline": "Uusi aikajana", "new_user_created": "Uusi käyttäjä lisätty", "new_version_available": "UUSI VERSIO SAATAVILLA", "newest_first": "Uusin ensin", @@ -1367,23 +1386,28 @@ "no_albums_with_name_yet": "Näyttää siltä, ettei sinulla ole yhtään tämän nimistä albumia.", "no_albums_yet": "Näyttää siltä, ettei sinulla ole vielä yhtään albumia.", "no_archived_assets_message": "Arkistoi kuvia ja videoita piilottaaksesi ne kuvat näkymästä", - "no_assets_message": "NAPAUTA LATAAKSESI ENSIMMÄISEN KUVASI", + "no_assets_message": "NAPAUTA LADATAKSESI ENSIMMÄINEN KUVASI", "no_assets_to_show": "Ei näytettäviä kohteita", "no_cast_devices_found": "Cast-laitteita ei löytynyt", + "no_checksum_local": "Ei tarkistussummaa - paikallista sisältöä ei voida hakea", + "no_checksum_remote": "Ei tarkistussummaa - etänä olevaa sisältöä ei voida hakea", "no_duplicates_found": "Kaksoiskappaleita ei löytynyt.", "no_exif_info_available": "EXIF-tietoa ei saatavilla", "no_explore_results_message": "Lataa lisää kuvia tutkiaksesi kokoelmaasi.", "no_favorites_message": "Lisää suosikkeja löytääksesi nopeasti parhaat kuvasi ja videosi", "no_libraries_message": "Luo ulkoinen kirjasto nähdäksesi valokuvasi ja videot", + "no_local_assets_found": "Paikallista sisältöä ei löytynyt tällä tarkistussummalla", "no_locked_photos_message": "Kuvat ja videot lukitussa kansiossa ovat piilotettuja, eivätkä ne näy selatessasi tai etsiessäsi kirjastoasi.", "no_name": "Ei nimeä", "no_notifications": "Ei ilmoituksia", "no_people_found": "Ei vastaavia henkilöitä", "no_places": "Ei paikkoja", + "no_remote_assets_found": "Etänä olevaa sisältöä ei löytynyt tällä tarkistussummalla", "no_results": "Ei tuloksia", "no_results_description": "Kokeile synonyymiä tai yleisempää avainsanaa", "no_shared_albums_message": "Luo albumi, jotta voit jakaa kuvia ja videoita toisille", "no_uploads_in_progress": "Ei käynnissä olevia latauksia", + "not_available": "N/A", "not_in_any_album": "Ei yhdessäkään albumissa", "not_selected": "Ei valittu", "note_apply_storage_label_to_previously_uploaded assets": "Huom: Jotta voit soveltaa tallennustunnistetta aiemmin ladattuihin kohteisiin, suorita", @@ -1418,6 +1442,8 @@ "open_the_search_filters": "Avaa hakusuodattimet", "options": "Vaihtoehdot", "or": "tai", + "organize_into_albums": "Järjestä albumeihin", + "organize_into_albums_description": "Siirrä olemassa olevat kuvat albumeihin käyttäen nykyisiä synkronointiasetuksia", "organize_your_library": "Järjestele kirjastosi", "original": "alkuperäinen", "other": "Muut", @@ -1463,7 +1489,7 @@ "permanent_deletion_warning_setting_description": "Näytä varoitus, kun poistat kohteita pysyvästi", "permanently_delete": "Poista pysyvästi", "permanently_delete_assets_count": "Poista pysyvästi {count, plural, one {kohde} other {kohteita}}", - "permanently_delete_assets_prompt": "Haluatko varmasti poistaa pysyvästi {count, plural, one {tämän kohteen?} other {nämä # kohteet?}} Tämä poistaa myös {count, plural, one {sen} other {ne}} kaikista albumeista.", + "permanently_delete_assets_prompt": "Haluatko varmasti poistaa pysyvästi {count, plural, one {tämän kohteen?} other {nämä # kohteet?}} Tämä poistaa {count, plural, one {sen} other {ne}} myös kaikista albumeista.", "permanently_deleted_asset": "Media poistettu pysyvästi", "permanently_deleted_assets_count": "{count, plural, one {# media} other {# mediaa}} poistettu pysyvästi", "permission": "Käyttöoikeus", @@ -1503,6 +1529,7 @@ "port": "Portti", "preferences_settings_subtitle": "Hallitse sovelluksen asetuksia", "preferences_settings_title": "Asetukset", + "preparing": "Valmistellaan", "preset": "Asetus", "preview": "Esikatselu", "previous": "Edellinen", @@ -1519,6 +1546,7 @@ "profile_drawer_client_out_of_date_minor": "Sovelluksen mobiiliversio on vanhentunut. Päivitä viimeisimpään versioon.", "profile_drawer_client_server_up_to_date": "Asiakasohjelma ja palvelin ovat ajan tasalla", "profile_drawer_github": "GitHub", + "profile_drawer_readonly_mode": "Muokkaus on estetty. Paina käyttäjäkuvaketta pitkään palataksesi muokkaustilaan.", "profile_drawer_server_out_of_date_major": "Palvelimen ohjelmistoversio on vanhentunut. Päivitä viimeisimpään merkittävään versioon.", "profile_drawer_server_out_of_date_minor": "Palvelimen ohjelmistoversio on vanhentunut. Päivitä viimeisimpään versioon.", "profile_image_of_user": "Käyttäjän {user} profiilikuva", @@ -1557,6 +1585,7 @@ "purchase_server_description_2": "Tukijan tila", "purchase_server_title": "Palvelin", "purchase_settings_server_activated": "Palvelimen tuoteavainta hallinnoi ylläpitäjä", + "query_asset_id": "Kysy sisällön ID:tä", "queue_status": "Jonossa {count}/{total}", "rating": "Tähtiarvostelu", "rating_clear": "Tyhjennä arvostelu", @@ -1564,6 +1593,9 @@ "rating_description": "Näytä EXIF-arvosana lisätietopaneelissa", "reaction_options": "Reaktioasetukset", "read_changelog": "Lue muutosloki", + "readonly_mode_disabled": "Muokkaustila päällä", + "readonly_mode_enabled": "Muokkaustila pois päältä", + "ready_for_upload": "Valmis lähetystä varten", "reassign": "Määritä uudelleen", "reassigned_assets_to_existing_person": "Uudelleen määritetty {count, plural, one {# kohde} other {# kohdetta}} {name, select, null {olemassa olevalle henkilölle} other {{name}}}", "reassigned_assets_to_new_person": "Määritetty {count, plural, one {# media} other {# mediaa}} uudelle henkilölle", @@ -1588,6 +1620,7 @@ "regenerating_thumbnails": "Regeneroidaan pikkukuvia", "remote": "Etä", "remote_assets": "Etäkohteet", + "remote_media_summary": "Yhteenveto etänä olevasta mediasta", "remove": "Poista", "remove_assets_album_confirmation": "Haluatko varmasti poistaa {count, plural, one {# median} other {# mediaa}} albumista?", "remove_assets_shared_link_confirmation": "Haluatko varmasti poistaa {count, plural, one {# median} other {# mediaa}} tästä jakolinkistä?", @@ -1640,6 +1673,7 @@ "restore_user": "Palauta käyttäjä", "restored_asset": "Palautettu media", "resume": "Jatka", + "resume_paused_jobs": "Jatka {count, plural, one {# paused job} other {# paused jobs}}", "retry_upload": "Yritä latausta uudelleen", "review_duplicates": "Tarkastele kaksoiskappaleita", "review_large_files": "Tarkista suuret tiedostot", @@ -1704,7 +1738,7 @@ "search_places": "Etsi paikkoja", "search_rating": "Hae luokituksen mukaan...", "search_result_page_new_search_hint": "Uusi haku", - "search_settings": "Hakuasetukset", + "search_settings": "Etsi asetuksia", "search_state": "Etsi maakuntaa...", "search_suggestion_list_smart_search_hint_1": "Älykäs haku on oletuksena käytössä. Käytä metatietojen etsimiseen syntaksia ", "search_suggestion_list_smart_search_hint_2": "m:hakusana", @@ -1716,7 +1750,7 @@ "second": "Toinen", "see_all_people": "Näytä kaikki henkilöt", "select": "Valitse", - "select_album_cover": "Valitse albmin kansi", + "select_album_cover": "Valitse albumin kansi", "select_all": "Valitse kaikki", "select_all_duplicates": "Valitse kaikki kaksoiskappaleet", "select_all_in": "Valitse kaikki {group}", @@ -1733,6 +1767,7 @@ "select_user_for_sharing_page_err_album": "Albumin luonti epäonnistui", "selected": "Valittu", "selected_count": "{count, plural, other {# valittu}}", + "selected_gps_coordinates": "Valitut GPS-koordinaatit", "send_message": "Lähetä viesti", "send_welcome_email": "Lähetä tervetuloviesti", "server_endpoint": "Palvelinosoite", @@ -1774,7 +1809,7 @@ "setting_video_viewer_original_video_subtitle": "Kun toistat videota palvelimelta, toista alkuperäinen, vaikka transkoodattu versio olisi saatavilla. Tämä voi johtaa puskurointiin. Paikalliset videot toistetaan aina alkuperäislaadulla.", "setting_video_viewer_original_video_title": "Pakota alkuperäinen video", "settings": "Asetukset", - "settings_require_restart": "Käynnistä Immich uudelleen ottaaksesti tämän asetuksen käyttöön", + "settings_require_restart": "Käynnistä Immich uudelleen ottaaksesi tämä asetus käyttöön", "settings_saved": "Asetukset tallennettu", "setup_pin_code": "Määritä PIN-koodi", "share": "Jaa", @@ -1840,7 +1875,7 @@ "sharing_sidebar_description": "Näytä jakamislinkki sivupalkissa", "sharing_silver_appbar_create_shared_album": "Luo jaettu albumi", "sharing_silver_appbar_share_partner": "Jaa kumppanille", - "shift_to_permanent_delete": "Paina ⇧ poistaaksesi median pysyvästi", + "shift_to_permanent_delete": "Paina ⇧ poistaaksesi media pysyvästi", "show_album_options": "Näytä albumin asetukset", "show_albums": "Näytä albumit", "show_all_people": "Näytä kaikki henkilöt", @@ -1861,6 +1896,7 @@ "show_slideshow_transition": "Näytä diaesitys siirtymä", "show_supporter_badge": "Kannattajan merkki", "show_supporter_badge_description": "Näytä kannattajan merkki", + "show_text_search_menu": "Näytä tekstihakuvalikko", "shuffle": "Sekoita", "sidebar": "Sivupalkki", "sidebar_display_description": "Näytä linkki näkymään sivupalkissa", @@ -1891,6 +1927,7 @@ "stacktrace": "Vianetsintätiedot", "start": "Aloita", "start_date": "Alkupäivä", + "start_date_before_end_date": "Aloituspäivämäärän pitää olla ennen lopetuspäivämäärää", "state": "Maakunta", "status": "Tila", "stop_casting": "Lopeta suoratoisto", @@ -1915,6 +1952,8 @@ "sync_albums_manual_subtitle": "Synkronoi kaikki ladatut videot ja valokuvat valittuihin varmuuskopioalbumeihin", "sync_local": "Synkronoi paikallinen", "sync_remote": "Synkronoi etä", + "sync_status": "Synkronoinnin status", + "sync_status_subtitle": "Näytä ja hallinnoi synkronointijärjestelmää", "sync_upload_album_setting_subtitle": "Luo ja lataa valokuvasi ja videosi valittuihin albumeihin Immichissä", "tag": "Tunniste", "tag_assets": "Lisää tunnisteita", @@ -1952,7 +1991,9 @@ "to_change_password": "Vaihda salasana", "to_favorite": "Aseta suosikiksi", "to_login": "Kirjaudu sisään", + "to_multi_select": "usean valitsemiseksi", "to_parent": "Siirry vanhempaan", + "to_select": "valitsemiseksi", "to_trash": "Roskakoriin", "toggle_settings": "Määritä asetukset", "total": "Yhteensä", @@ -1960,7 +2001,7 @@ "trash": "Roskakori", "trash_action_prompt": "{count} siirretty roskakoriin", "trash_all": "Vie kaikki roskakoriin", - "trash_count": "Roskakori {count, number}", + "trash_count": "Vie {count, number} roskakoriin", "trash_delete_asset": "Poista / vie roskakoriin", "trash_emptied": "Roskakori tyhjennetty", "trash_no_results_message": "Roskakorissa olevat kuvat ja videot näytetään täällä.", @@ -1972,6 +2013,7 @@ "trash_page_select_assets_btn": "Valitse kohteet", "trash_page_title": "Roskakori ({count})", "trashed_items_will_be_permanently_deleted_after": "Roskakorin kohteet poistetaan pysyvästi {days, plural, one {# päivän} other {# päivän}} päästä.", + "troubleshoot": "Vianetsintä", "type": "Tyyppi", "unable_to_change_pin_code": "PIN-koodin vaihtaminen epäonnistui", "unable_to_setup_pin_code": "PIN-koodin määrittäminen epäonnistui", @@ -2002,6 +2044,7 @@ "unstacked_assets_count": "Poistettu pinosta {count, plural, one {# kohde} other {# kohdetta}}", "untagged": "Ilman tunnistetta", "up_next": "Seuraavaksi", + "update_location_action_prompt": "Päivitä {count} kohteen sijaintia:", "updated_at": "Päivitetty", "updated_password": "Salasana päivitetty", "upload": "Siirrä palvelimelle", @@ -2068,6 +2111,7 @@ "view_next_asset": "Näytä seuraava", "view_previous_asset": "Näytä edellinen", "view_qr_code": "Näytä QR-koodi", + "view_similar_photos": "Näytä samankaltaiset kuvat", "view_stack": "Näytä pinona", "view_user": "Näytä käyttäjä", "viewer_remove_from_stack": "Poista pinosta", @@ -2086,5 +2130,6 @@ "yes": "Kyllä", "you_dont_have_any_shared_links": "Sinulla ei ole jaettuja linkkejä", "your_wifi_name": "Wi-Fi-verkkosi nimi", - "zoom_image": "Zoomaa kuvaa" + "zoom_image": "Zoomaa kuvaa", + "zoom_to_bounds": "Zoomaa reunoihin" } diff --git a/i18n/fr.json b/i18n/fr.json index df0e9d1cc0..0c92c52764 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -33,6 +33,7 @@ "add_to_albums": "Ajouter aux albums", "add_to_albums_count": "Ajouter aux albums ({count})", "add_to_shared_album": "Ajouter à l'album partagé", + "add_upload_to_stack": "Ajouter les éléments téléversés à la pile", "add_url": "Ajouter l'URL", "added_to_archive": "Ajouté à l'archive", "added_to_favorites": "Ajouté aux favoris", @@ -600,7 +601,7 @@ "backup_controller_page_uploading_file_info": "Envoi des informations du fichier", "backup_err_only_album": "Impossible de retirer le seul album", "backup_error_sync_failed": "Échec de la synchronisation. Impossible d'exécuter la sauvegarde.", - "backup_info_card_assets": "éléments", + "backup_info_card_assets": "médias", "backup_manual_cancelled": "Annulé", "backup_manual_in_progress": "Envoi déjà en cours. Réessayez plus tard", "backup_manual_success": "Succès", diff --git a/i18n/gl.json b/i18n/gl.json index b6a59fadc7..8a38ef2c86 100644 --- a/i18n/gl.json +++ b/i18n/gl.json @@ -11,14 +11,14 @@ "activity_changed": "A actividade está {enabled, select, true {activada} other {desactivada}}", "add": "Engadir", "add_a_description": "Engadir unha descrición", - "add_a_location": "Engadir unha ubicación", + "add_a_location": "Engadir unha localización", "add_a_name": "Engadir un nome", "add_a_title": "Engadir un título", - "add_birthday": "Engadir cumpleanos", - "add_endpoint": "Engadir endpoint", + "add_birthday": "Engadir cumpreanos", + "add_endpoint": "Engadir punto final", "add_exclusion_pattern": "Engadir patrón de exclusión", "add_import_path": "Engadir ruta de importación", - "add_location": "Engadir ubicación", + "add_location": "Engadir localización", "add_more_users": "Engadir máis usuarios", "add_partner": "Engadir compañeiro/a", "add_path": "Engadir ruta", @@ -28,69 +28,70 @@ "add_to_album": "Engadir ao álbum", "add_to_album_bottom_sheet_added": "Engadido a {album}", "add_to_album_bottom_sheet_already_exists": "Xa está en {album}", - "add_to_album_toggle": "Alternar selección para o {album}", - "add_to_albums": "Engadir en álbums", + "add_to_album_bottom_sheet_some_local_assets": "Algunhas imaxes ou ficheiros locais non se puideron engadir ao álbum", + "add_to_album_toggle": "Alternar selección para {album}", + "add_to_albums": "Engadir a álbums", "add_to_albums_count": "Engadir a {count} álbums", "add_to_shared_album": "Engadir ao álbum compartido", "add_url": "Engadir URL", "added_to_archive": "Engadido ao arquivo", "added_to_favorites": "Engadido a favoritos", - "added_to_favorites_count": "Engadido {count, number} a favoritos", + "added_to_favorites_count": "Engadíronse {count, number} a favoritos", "admin": { - "add_exclusion_pattern_description": "Engadir patróns de exclusión. Admítense caracteres comodín usando *, ** e ?. Para ignorar todos os ficheiros en calquera directorio chamado \"Raw\", emprega \"**/Raw/**\". Para ignorar todos os ficheiros que rematen en \".tif\", usa \"**/*.tif\". Para ignorar unha ruta absoluta, emprega \"/ruta/a/ignorar/**\".", + "add_exclusion_pattern_description": "Engadir patróns de exclusión. Admítense caracteres comodín usando *, ** e ?. Para ignorar todos os ficheiros en calquera directorio chamado \"Raw\", empregue \"**/Raw/**\". Para ignorar todos os ficheiros que rematen en \".tif\", use \"**/*.tif\". Para ignorar unha ruta absoluta, empregue \"/ruta/a/ignorar/**\".", "admin_user": "Usuario administrador", - "asset_offline_description": "Este activo da biblioteca externa xa non se atopa no disco e moveuse ao lixo. Se o ficheiro se moveu dentro da biblioteca, comproba a túa liña de tempo para o novo activo correspondente. Para restaurar este activo, asegúrate de que Immich poida acceder á ruta do ficheiro a continuación e escanee a biblioteca.", + "asset_offline_description": "Este activo da biblioteca externa xa non se atopa no disco e moveuse ao lixo. Se o ficheiro se moveu dentro da biblioteca, comprobe a súa liña de tempo para o novo activo correspondente. Para restaurar este activo, asegúrese de que Immich poida acceder á ruta do ficheiro a continuación e escanee a biblioteca.", "authentication_settings": "Configuración de autenticación", "authentication_settings_description": "Xestionar contrasinal, OAuth e outras configuracións de autenticación", - "authentication_settings_disable_all": "Estás seguro de que queres desactivar todos os métodos de inicio de sesión? O inicio de sesión desactivarase completamente.", + "authentication_settings_disable_all": "Está seguro de que quere desactivar todos os métodos de inicio de sesión? O inicio de sesión desactivarase completamente.", "authentication_settings_reenable": "Para reactivalo, use un Comando de servidor.", "background_task_job": "Tarefas en segundo plano", - "backup_database": "Crear un vertedoiro de base de datos", - "backup_database_enable_description": "Activar o vertedoiro de copias de seguridade da base de datos", - "backup_keep_last_amount": "Cantidade de copias de seguridade anteriores a conservar", - "backup_onboarding_1_description": "Copia no exterior na nube ou noutra localización física.", - "backup_onboarding_2_description": "Copias locais en diferentes dispositivos. Isto inclue os arquivos principais e as copias de esos arquivos localmente.", - "backup_onboarding_3_description": "copias totais da tua información, incluindo os arquivos orixinais. Isto inclue 1 copia externa e 2 copias locais.", - "backup_onboarding_description": "Unha estratexia de copia 3-2-1 é recomendada para protexer os teus datos. Deberías gardar copias das túas fotos/videos subidas así como da base de datos de Immich como unha solución de seguridade.", - "backup_onboarding_footer": "Pra máis información sobre copias de seguridade de Immich, por favor use a seguinte ligazón de documentación.", - "backup_onboarding_parts_title": "Unha copia de seguridade 3-2-1 inclue:", + "backup_database": "Crear unha copia da base de datos", + "backup_database_enable_description": "Activar a copia de seguridade da base de datos", + "backup_keep_last_amount": "Número de copias anteriores a conservar", + "backup_onboarding_1_description": "Copia externa na nube ou noutra localización física.", + "backup_onboarding_2_description": "Copias locais en diferentes dispositivos. Isto inclúe os arquivos principais e as copias deses arquivos localmente.", + "backup_onboarding_3_description": "Copias totais da súa información, incluíndo os arquivos orixinais. Isto inclúe 1 copia externa e 2 copias locais.", + "backup_onboarding_description": "Unha estratexia de copia de seguridade 3-2-1 é recomendada para protexer os seus datos. Debería gardar copias das súas fotos/vídeos subidos así como da base de datos de Immich como unha solución de seguridade.", + "backup_onboarding_footer": "Para máis información sobre copias de seguridade de Immich, por favor use a seguinte ligazón á documentación.", + "backup_onboarding_parts_title": "Unha copia de seguridade 3-2-1 inclúe:", "backup_onboarding_title": "Copia de seguridade", - "backup_settings": "Configuración da copia de seguridade", - "backup_settings_description": "Xestionar a configuración do volcado da base de datos", + "backup_settings": "Configuración da copia da base de datos", + "backup_settings_description": "Xestionar a configuración da copia da base de datos", "cleared_jobs": "Traballos borrados para: {job}", "config_set_by_file": "A configuración establécese actualmente mediante un ficheiro de configuración", - "confirm_delete_library": "Estás seguro de que queres eliminar a biblioteca {library}?", - "confirm_delete_library_assets": "Estás seguro de que queres eliminar esta biblioteca? Isto eliminará {count, plural, one {# activo contido} other {todos os # activos contidos}} de Immich e non se pode desfacer. Os ficheiros permanecerán no disco.", + "confirm_delete_library": "Está seguro de que quere eliminar a biblioteca {library}?", + "confirm_delete_library_assets": "Está seguro de que quere eliminar esta biblioteca? Isto eliminará {count, plural, one {# activo contido} other {todos os # activos contidos}} de Immich e non se pode desfacer. Os ficheiros permanecerán no disco.", "confirm_email_below": "Para confirmar, escriba \"{email}\" a continuación", - "confirm_reprocess_all_faces": "Estás seguro de que queres reprocesar todas as caras? Isto tamén borrará as persoas nomeadas.", - "confirm_user_password_reset": "Estás seguro de que queres restablecer o contrasinal de {user}?", - "confirm_user_pin_code_reset": "Estás seguro de que queres restablecer o PIN de {user}?", + "confirm_reprocess_all_faces": "Está seguro de que quere reprocesar todas as caras? Isto tamén borrará as persoas nomeadas.", + "confirm_user_password_reset": "Está seguro de que quere restablecer o contrasinal de {user}?", + "confirm_user_pin_code_reset": "Está seguro de que quere restablecer o PIN de {user}?", "create_job": "Crear traballo", "cron_expression": "Expresión Cron", "cron_expression_description": "Estableza o intervalo de escaneo usando o formato cron. Para obter máis información, consulte por exemplo Crontab Guru", "cron_expression_presets": "Preaxustes de expresión Cron", "disable_login": "Desactivar inicio de sesión", "duplicate_detection_job_description": "Executar aprendizaxe automática nos activos para detectar imaxes similares. Depende da Busca Intelixente", - "exclusion_pattern_description": "Os patróns de exclusión permítenche ignorar ficheiros e cartafoles ao escanear a túa biblioteca. Isto é útil se tes cartafoles que conteñen ficheiros que non queres importar, como ficheiros RAW.", + "exclusion_pattern_description": "Os patróns de exclusión permítenlle ignorar ficheiros e cartafoles ao escanear a súa biblioteca. Isto é útil se ten cartafoles que conteñen ficheiros que non quere importar, como ficheiros RAW.", "external_library_management": "Xestión da biblioteca externa", "face_detection": "Detección de caras", "face_detection_description": "Detectar as caras nos activos usando aprendizaxe automática. Para vídeos, só se considera a miniatura. \"Actualizar\" (re)procesa todos os activos. \"Restablecer\" ademais borra todos os datos de caras actuais. \"Faltantes\" pon en cola os activos que aínda non foron procesados. As caras detectadas poranse en cola para o Recoñecemento Facial despois de completar a Detección de Caras, agrupándoas en persoas existentes ou novas.", "facial_recognition_job_description": "Agrupar caras detectadas en persoas. Este paso execútase despois de completar a Detección de Caras. \"Restablecer\" (re)agrupa todas as caras. \"Faltantes\" pon en cola as caras que non teñen unha persoa asignada.", "failed_job_command": "O comando {command} fallou para o traballo: {job}", - "force_delete_user_warning": "AVISO: Isto eliminará inmediatamente o usuario e todos os activos. Isto non se pode desfacer e os ficheiros non se poden recuperar.", + "force_delete_user_warning": "AVISO: Isto eliminará inmediatamente o usuario e todos os seus activos. Esta acción non se pode desfacer e os ficheiros non se poderán recuperar.", "image_format": "Formato", "image_format_description": "WebP produce ficheiros máis pequenos que JPEG, pero é máis lento de codificar.", "image_fullsize_description": "Imaxe a tamaño completo con metadatos eliminados, usada ao facer zoom", "image_fullsize_enabled": "Activar a xeración de imaxes a tamaño completo", "image_fullsize_enabled_description": "Xerar imaxe a tamaño completo para formatos non compatibles coa web. Cando \"Preferir vista previa incrustada\" está activado, as vistas previas incrustadas utilízanse directamente sen conversión. Non afecta a formatos compatibles coa web como JPEG.", - "image_fullsize_quality_description": "Calidade da imaxe a tamaño completo de 1 a 100. Máis alto é mellor, pero produce ficheiros máis grandes.", + "image_fullsize_quality_description": "Calidade da imaxe a tamaño completo de 1 a 100. Canto máis alto, mellor, pero produce ficheiros máis grandes.", "image_fullsize_title": "Configuración da imaxe a tamaño completo", "image_prefer_embedded_preview": "Preferir vista previa incrustada", - "image_prefer_embedded_preview_setting_description": "Usar vistas previas incrustadas en fotos RAW como entrada para o procesamento de imaxes e cando estean dispoñibles. Isto pode producir cores máis precisas para algunhas imaxes, pero a calidade da vista previa depende da cámara e a imaxe pode ter máis artefactos de compresión.", - "image_prefer_wide_gamut": "Preferir gama ampla", + "image_prefer_embedded_preview_setting_description": "Usar vistas previas incrustadas en fotos RAW como entrada para o procesamento de imaxes cando estean dispoñibles. Isto pode producir cores máis precisas para algunhas imaxes, pero a calidade da vista previa depende da cámara e a imaxe pode ter máis artefactos de compresión.", + "image_prefer_wide_gamut": "Preferir gama de cores ampla", "image_prefer_wide_gamut_setting_description": "Usar Display P3 para as miniaturas. Isto preserva mellor a viveza das imaxes con espazos de cor amplos, pero as imaxes poden aparecer de forma diferente en dispositivos antigos cunha versión de navegador antiga. As imaxes sRGB mantéñense como sRGB para evitar cambios de cor.", "image_preview_description": "Imaxe de tamaño medio con metadatos eliminados, usada ao ver un único activo e para aprendizaxe automática", - "image_preview_quality_description": "Calidade da vista previa de 1 a 100. Máis alto é mellor, pero produce ficheiros máis grandes e pode reducir a capacidade de resposta da aplicación. Establecer un valor baixo pode afectar á calidade da aprendizaxe automática.", + "image_preview_quality_description": "Calidade da vista previa de 1 a 100. Canto máis alto, mellor, pero produce ficheiros máis grandes e pode reducir a capacidade de resposta da aplicación. Establecer un valor baixo pode afectar á calidade da aprendizaxe automática.", "image_preview_title": "Configuración da vista previa", "image_quality": "Calidade", "image_resolution": "Resolución", @@ -98,11 +99,11 @@ "image_settings": "Configuración da imaxe", "image_settings_description": "Xestionar a calidade e resolución das imaxes xeradas", "image_thumbnail_description": "Miniatura pequena con metadatos eliminados, usada ao ver grupos de fotos como a liña de tempo principal", - "image_thumbnail_quality_description": "Calidade da miniatura de 1 a 100. Máis alto é mellor, pero produce ficheiros máis grandes e pode reducir a capacidade de resposta da aplicación.", + "image_thumbnail_quality_description": "Calidade da miniatura de 1 a 100. Canto máis alto, mellor, pero produce ficheiros máis grandes e pode reducir a capacidade de resposta da aplicación.", "image_thumbnail_title": "Configuración da miniatura", "job_concurrency": "concorrencia de {job}", "job_created": "Traballo creado", - "job_not_concurrency_safe": "Este traballo non é seguro para concorrencia.", + "job_not_concurrency_safe": "Este traballo non é seguro para execución concorrente.", "job_settings": "Configuración de traballos", "job_settings_description": "Xestionar a concorrencia de traballos", "job_status": "Estado do traballo", @@ -117,31 +118,31 @@ "library_settings": "Biblioteca externa", "library_settings_description": "Xestionar a configuración da biblioteca externa", "library_tasks_description": "Escanear bibliotecas externas en busca de activos novos e/ou modificados", - "library_watching_enable_description": "Vixiar bibliotecas externas para cambios nos ficheiros", + "library_watching_enable_description": "Vixiar bibliotecas externas para detectar cambios nos ficheiros", "library_watching_settings": "Vixilancia da biblioteca (EXPERIMENTAL)", "library_watching_settings_description": "Vixiar automaticamente os ficheiros modificados", "logging_enable_description": "Activar rexistro", "logging_level_description": "Cando estea activado, que nivel de rexistro usar.", "logging_settings": "Rexistro", "machine_learning_availability_checks": "Comprobacións de dispoñibilidade", - "machine_learning_availability_checks_description": "Detectar automáticamente e preferir servidores de aprendizaxe profunda dispoñibles", + "machine_learning_availability_checks_description": "Detectar automaticamente e preferir servidores de aprendizaxe automática dispoñibles", "machine_learning_availability_checks_enabled": "Activar comprobacións de dispoñibilidade", "machine_learning_availability_checks_interval": "Intervalo de comprobación", "machine_learning_availability_checks_interval_description": "Intervalo en milisegundos entre comprobacións de dispoñibilidade", "machine_learning_availability_checks_timeout": "Tempo de espera da solicitude", - "machine_learning_availability_checks_timeout_description": "Tempo de espera en milisegundos para as comprobación de dispoñibilidade", + "machine_learning_availability_checks_timeout_description": "Tempo de espera en milisegundos para as comprobacións de dispoñibilidade", "machine_learning_clip_model": "Modelo CLIP", - "machine_learning_clip_model_description": "O nome dun modelo CLIP listado aquí. Ten en conta que debe volver executar o traballo 'Busca Intelixente' para todas as imaxes ao cambiar un modelo.", + "machine_learning_clip_model_description": "O nome dun modelo CLIP listado aquí. Teña en conta que debe volver executar o traballo 'Busca Intelixente' para todas as imaxes ao cambiar un modelo.", "machine_learning_duplicate_detection": "Detección de duplicados", "machine_learning_duplicate_detection_enabled": "Activar detección de duplicados", - "machine_learning_duplicate_detection_enabled_description": "Se está desactivado, os activos exactamente idénticos aínda se eliminarán duplicados.", + "machine_learning_duplicate_detection_enabled_description": "Se está desactivado, os activos exactamente idénticos aínda se eliminarán.", "machine_learning_duplicate_detection_setting_description": "Usar incrustacións CLIP para atopar posibles duplicados", "machine_learning_enabled": "Activar aprendizaxe automática", - "machine_learning_enabled_description": "Se está desactivado, todas as funcións de ML desactivaranse independentemente da configuración a continuación.", + "machine_learning_enabled_description": "Se está desactivado, todas as funcións de aprendizaxe automática desactivaranse independentemente da configuración a continuación.", "machine_learning_facial_recognition": "Recoñecemento facial", "machine_learning_facial_recognition_description": "Detectar, recoñecer e agrupar caras en imaxes", "machine_learning_facial_recognition_model": "Modelo de recoñecemento facial", - "machine_learning_facial_recognition_model_description": "Os modelos están listados en orde descendente de tamaño. Os modelos máis grandes son máis lentos e usan máis memoria, pero producen mellores resultados. Teña en conta que debes volver executar o traballo de Detección de Caras para todas as imaxes ao cambiar un modelo.", + "machine_learning_facial_recognition_model_description": "Os modelos están listados en orde descendente de tamaño. Os modelos máis grandes son máis lentos e usan máis memoria, pero producen mellores resultados. Teña en conta que debe volver executar o traballo de Detección de Caras para todas as imaxes ao cambiar un modelo.", "machine_learning_facial_recognition_setting": "Activar recoñecemento facial", "machine_learning_facial_recognition_setting_description": "Se está desactivado, as imaxes non se codificarán para o recoñecemento facial e non encherán a sección Persoas na páxina Explorar.", "machine_learning_max_detection_distance": "Distancia máxima de detección", @@ -188,21 +189,22 @@ "nightly_tasks_cluster_new_faces_setting": "Agrupar novas caras", "nightly_tasks_database_cleanup_setting": "Tarefas de limpeza da base de datos", "nightly_tasks_database_cleanup_setting_description": "Limpar información vella e obsoleta da base de datos", - "nightly_tasks_generate_memories_setting": "Xerar memorias", - "nightly_tasks_generate_memories_setting_description": "Crear novas memorias dende os recursos", + "nightly_tasks_generate_memories_setting": "Xerar recordos", + "nightly_tasks_generate_memories_setting_description": "Crear novos recordos a partir dos activos", "nightly_tasks_missing_thumbnails_setting": "Xerar as miniaturas que faltan", - "nightly_tasks_missing_thumbnails_setting_description": "Encolar arquivos sin miniaturas para a xeración das miniaturas", + "nightly_tasks_missing_thumbnails_setting_description": "Poñer en cola os arquivos sen miniaturas para a súa xeración", "nightly_tasks_settings": "Configuración das tarefas nocturnas", "nightly_tasks_settings_description": "Administrar as tarefas nocturnas", - "nightly_tasks_start_time_setting": "Tempo de inicio", - "nightly_tasks_start_time_setting_description": "O tempo no que o servidor comeza a executar as tarefas nocturnas", - "nightly_tasks_sync_quota_usage_setting": "Sincronizar uso de cuota", + "nightly_tasks_start_time_setting": "Hora de inicio", + "nightly_tasks_start_time_setting_description": "A hora na que o servidor comeza a executar as tarefas nocturnas", + "nightly_tasks_sync_quota_usage_setting": "Sincronizar uso de cota", + "nightly_tasks_sync_quota_usage_setting_description": "Actualizar a cota de almacenamento do usuario, en base ao uso actual", "no_paths_added": "Non se engadiron rutas", - "no_pattern_added": "Non se engadiu ningún padrón", + "no_pattern_added": "Non se engadiu ningún patrón", "note_apply_storage_label_previous_assets": "Nota: Para aplicar a Etiqueta de Almacenamento a activos cargados previamente, execute o", "note_cannot_be_changed_later": "NOTA: Isto non se pode cambiar máis tarde!", "notification_email_from_address": "Enderezo do remitente", - "notification_email_from_address_description": "Enderezo de correo electrónico do remitente, por exemplo: \"Servidor de Fotos Immich \"", + "notification_email_from_address_description": "Enderezo de correo do remitente, por exemplo: \"Servidor de Fotos Immich noreply@exemplo.com\". Asegúrese de empregar un enderezo dende o que teña permiso para enviar correos.", "notification_email_host_description": "Host do servidor de correo electrónico (p. ex. smtp.immich.app)", "notification_email_ignore_certificate_errors": "Ignorar erros de certificado", "notification_email_ignore_certificate_errors_description": "Ignorar erros de validación do certificado TLS (non recomendado)", @@ -211,8 +213,8 @@ "notification_email_sent_test_email_button": "Enviar correo de proba e gardar", "notification_email_setting_description": "Configuración para enviar notificacións por correo electrónico", "notification_email_test_email": "Enviar correo de proba", - "notification_email_test_email_failed": "Erro ao enviar correo de proba, comproba os teus valores", - "notification_email_test_email_sent": "Enviouse un correo electrónico de proba a {email}. Por favor, comproba a túa caixa de entrada.", + "notification_email_test_email_failed": "Erro ao enviar correo de proba, comprobe os seus valores", + "notification_email_test_email_sent": "Enviouse un correo electrónico de proba a {email}. Por favor, comprobe a súa caixa de entrada.", "notification_email_username_description": "Nome de usuario a usar ao autenticarse co servidor de correo electrónico", "notification_enable_email_notifications": "Activar notificacións por correo electrónico", "notification_settings": "Configuración de Notificacións", @@ -222,10 +224,13 @@ "oauth_auto_register": "Rexistro automático", "oauth_auto_register_description": "Rexistrar automaticamente novos usuarios despois de iniciar sesión con OAuth", "oauth_button_text": "Texto do botón", + "oauth_client_secret_description": "Requirido se o provedor OAuth non admite PKCE (Proof Key for Code Exchange)", "oauth_enable_description": "Iniciar sesión con OAuth", "oauth_mobile_redirect_uri": "URI de redirección móbil", "oauth_mobile_redirect_uri_override": "Substitución de URI de redirección móbil", "oauth_mobile_redirect_uri_override_description": "Activar cando o provedor OAuth non permite un URI móbil, como ''{callback}''", + "oauth_role_claim": "Declaración de rol", + "oauth_role_claim_description": "Conceder acceso de administrador automaticamente segundo a presenza desta declaración. A declaración pode ter os valores 'user' ou 'admin'.", "oauth_settings": "OAuth", "oauth_settings_description": "Xestionar a configuración de inicio de sesión OAuth", "oauth_settings_more_details": "Para máis detalles sobre esta función, consulte a documentación.", @@ -234,7 +239,9 @@ "oauth_storage_quota_claim": "Declaración de cota de almacenamento", "oauth_storage_quota_claim_description": "Establecer automaticamente a cota de almacenamento do usuario ao valor desta declaración.", "oauth_storage_quota_default": "Cota de almacenamento predeterminada (GiB)", - "oauth_storage_quota_default_description": "Cota en GiB a usar cando non se proporciona ningunha declaración (Introduza 0 para cota ilimitada).", + "oauth_storage_quota_default_description": "Cota en GiB a empregar cando non se proporciona ningunha declaración.", + "oauth_timeout": "Tempo máximo de espera da solicitude", + "oauth_timeout_description": "Tempo máximo de espera para as solicitudes en milisegundos", "password_enable_description": "Iniciar sesión con correo electrónico e contrasinal", "password_settings": "Inicio de sesión con contrasinal", "password_settings_description": "Xestionar a configuración de inicio de sesión con contrasinal", @@ -243,17 +250,17 @@ "quota_size_gib": "Tamaño da cota (GiB)", "refreshing_all_libraries": "Actualizando todas as bibliotecas", "registration": "Rexistro do administrador", - "registration_description": "Dado que ti es o primeiro usuario no sistema, asignarásete como Administrador e serás responsable das tarefas administrativas, e os usuarios adicionais serán creados por ti.", + "registration_description": "Dado que vostede é o primeiro usuario no sistema, asignaráselle como Administrador e será responsable das tarefas administrativas. Os usuarios adicionais serán creados por vostede.", "require_password_change_on_login": "Requirir que o usuario cambie o contrasinal no primeiro inicio de sesión", "reset_settings_to_default": "Restablecer a configuración aos valores predeterminados", - "reset_settings_to_recent_saved": "Restablecer a configuración á configuración gardada recentemente", + "reset_settings_to_recent_saved": "Restablecer á configuración gardada recentemente", "scanning_library": "Escaneando biblioteca", "search_jobs": "Buscar traballos…", "send_welcome_email": "Enviar correo electrónico de benvida", "server_external_domain_settings": "Dominio externo", "server_external_domain_settings_description": "Dominio para ligazóns públicas compartidas, incluíndo http(s)://", "server_public_users": "Usuarios públicos", - "server_public_users_description": "Todos os usuarios (nome e correo electrónico) listanse ao engadir un usuario a álbums compartidos. Cando está desactivado, a lista de usuarios só estará dispoñible para os usuarios administradores.", + "server_public_users_description": "Todos os usuarios (nome e correo electrónico) lístanse ao engadir un usuario a álbums compartidos. Cando está desactivado, a lista de usuarios só estará dispoñible para os usuarios administradores.", "server_settings": "Configuración do servidor", "server_settings_description": "Xestionar a configuración do servidor", "server_welcome_message": "Mensaxe de benvida", @@ -266,19 +273,20 @@ "storage_template_date_time_sample": "Tempo de mostra {date}", "storage_template_enable_description": "Activar o motor de modelos de almacenamento", "storage_template_hash_verification_enabled": "Verificación de hash activada", - "storage_template_hash_verification_enabled_description": "Activa a verificación de hash, non desactives isto a menos que esteas seguro das implicacións", + "storage_template_hash_verification_enabled_description": "Activa a verificación de hash. Non desactive isto a menos que estea seguro das implicacións.", "storage_template_migration": "Migración do modelo de almacenamento", "storage_template_migration_description": "Aplicar o {template} actual aos activos cargados previamente", "storage_template_migration_info": "O modelo de almacenamento converterá todas as extensións a minúsculas. Os cambios no modelo só se aplicarán aos activos novos. Para aplicar retroactivamente o modelo aos activos cargados previamente, execute o {job}.", "storage_template_migration_job": "Traballo de Migración do Modelo de Almacenamento", "storage_template_more_details": "Para máis detalles sobre esta función, consulte o Modelo de Almacenamento e as súas implicacións", + "storage_template_onboarding_description_v2": "Cando está activada, esta función organizará automaticamente os ficheiros segundo un modelo definido polo usuario. Para máis información, consulte a documentación.", "storage_template_path_length": "Límite aproximado da lonxitude da ruta: {length, number}/{limit, number}", "storage_template_settings": "Modelo de Almacenamento", "storage_template_settings_description": "Xestionar a estrutura de cartafoles e o nome de ficheiro do activo cargado", "storage_template_user_label": "{label} é a Etiqueta de Almacenamento do usuario", "system_settings": "Configuración do Sistema", "tag_cleanup_job": "Limpeza de etiquetas", - "template_email_available_tags": "Podes usar as seguintes variables no teu modelo: {tags}", + "template_email_available_tags": "Pode usar as seguintes variables no seu modelo: {tags}", "template_email_if_empty": "Se o modelo está baleiro, usarase o correo electrónico predeterminado.", "template_email_invite_album": "Modelo de Invitación a Álbum", "template_email_preview": "Vista previa", @@ -286,15 +294,15 @@ "template_email_update_album": "Modelo de Actualización de Álbum", "template_email_welcome": "Modelo de correo electrónico de benvida", "template_settings": "Modelos de Notificación", - "template_settings_description": "Xestionar modelos personalizados para notificacións.", + "template_settings_description": "Xestionar modelos personalizados para notificacións", "theme_custom_css_settings": "CSS Personalizado", - "theme_custom_css_settings_description": "As Follas de Estilo en Cascada permiten personalizar o deseño de Immich.", + "theme_custom_css_settings_description": "As Follas de Estilo en Cascada (CSS) permiten personalizar o deseño de Immich.", "theme_settings": "Configuración do Tema", "theme_settings_description": "Xestionar a personalización da interface web de Immich", "thumbnail_generation_job": "Xerar Miniaturas", "thumbnail_generation_job_description": "Xerar miniaturas grandes, pequenas e borrosas para cada activo, así como miniaturas para cada persoa", "transcoding_acceleration_api": "API de aceleración", - "transcoding_acceleration_api_description": "A API que interactuará co teu dispositivo para acelerar a transcodificación. Esta configuración é de 'mellor esforzo': recurrirá á transcodificación por software en caso de fallo. VP9 pode funcionar ou non dependendo do teu hardware.", + "transcoding_acceleration_api_description": "A API que interactuará co seu dispositivo para acelerar a transcodificación. Esta configuración é de 'mellor esforzo': recurrirá á transcodificación por software en caso de fallo. VP9 pode funcionar ou non dependendo do seu hardware.", "transcoding_acceleration_nvenc": "NVENC (require GPU NVIDIA)", "transcoding_acceleration_qsv": "Quick Sync (require CPU Intel de 7ª xeración ou posterior)", "transcoding_acceleration_rkmpp": "RKMPP (só en SOCs Rockchip)", @@ -309,16 +317,16 @@ "transcoding_audio_codec": "Códec de audio", "transcoding_audio_codec_description": "Opus é a opción de maior calidade, pero ten menor compatibilidade con dispositivos ou software antigos.", "transcoding_bitrate_description": "Vídeos cun bitrate superior ao máximo ou que non estean nun formato aceptado", - "transcoding_codecs_learn_more": "Para saber máis sobre a terminoloxía usada aquí, consulte a documentación de FFmpeg para códec H.264, códec HEVC e códec VP9.", + "transcoding_codecs_learn_more": "Para saber máis sobre a terminoloxía usada aquí, consulte a documentación de FFmpeg para o códec H.264, o códec HEVC e o códec VP9.", "transcoding_constant_quality_mode": "Modo de calidade constante", "transcoding_constant_quality_mode_description": "ICQ é mellor que CQP, pero algúns dispositivos de aceleración por hardware non admiten este modo. Establecer esta opción preferirá o modo especificado ao usar codificación baseada na calidade. Ignorado por NVENC xa que non admite ICQ.", "transcoding_constant_rate_factor": "Factor de taxa constante (-crf)", - "transcoding_constant_rate_factor_description": "Nivel de calidade do vídeo. Valores típicos son 23 para H.264, 28 para HEVC, 31 para VP9 e 35 para AV1. Máis baixo é mellor, pero produce ficheiros máis grandes.", - "transcoding_disabled_description": "Non transcodificar ningún vídeo, pode romper a reprodución nalgúns clientes", + "transcoding_constant_rate_factor_description": "Nivel de calidade do vídeo. Valores típicos son 23 para H.264, 28 para HEVC, 31 para VP9 e 35 para AV1. Canto máis baixo, mellor, pero produce ficheiros máis grandes.", + "transcoding_disabled_description": "Non transcodificar ningún vídeo; pode romper a reprodución nalgúns clientes", "transcoding_encoding_options": "Opcións de Codificación", "transcoding_encoding_options_description": "Establecer códecs, resolución, calidade e outras opcións para os vídeos codificados", "transcoding_hardware_acceleration": "Aceleración por Hardware", - "transcoding_hardware_acceleration_description": "Experimental; moito máis rápido, pero terá menor calidade co mesmo bitrate", + "transcoding_hardware_acceleration_description": "Experimental: transcodificación máis rápida, pero pode reducir a calidade ao mesmo bitrate", "transcoding_hardware_decoding": "Decodificación por hardware", "transcoding_hardware_decoding_setting_description": "Activa a aceleración de extremo a extremo en lugar de só acelerar a codificación. Pode non funcionar en todos os vídeos.", "transcoding_max_b_frames": "Máximo de B-frames", @@ -350,7 +358,7 @@ "transcoding_transcode_policy": "Política de transcodificación", "transcoding_transcode_policy_description": "Política para cando un vídeo debe ser transcodificado. Os vídeos HDR sempre serán transcodificados (excepto se a transcodificación está desactivada).", "transcoding_two_pass_encoding": "Codificación en dous pasos", - "transcoding_two_pass_encoding_setting_description": "Transcodificar en dous pasos para producir vídeos codificados mellor. Cando o bitrate máximo está activado (requirido para que funcione con H.264 e HEVC), este modo usa un rango de bitrate baseado no bitrate máximo e ignora CRF. Para VP9, pódese usar CRF se o bitrate máximo está desactivado.", + "transcoding_two_pass_encoding_setting_description": "Transcodificar en dous pasos para producir vídeos codificados de mellor calidade. Cando o bitrate máximo está activado (requirido para que funcione con H.264 e HEVC), este modo usa un rango de bitrate baseado no bitrate máximo e ignora CRF. Para VP9, pódese usar CRF se o bitrate máximo está desactivado.", "transcoding_video_codec": "Códec de vídeo", "transcoding_video_codec_description": "VP9 ten alta eficiencia e compatibilidade web, pero tarda máis en transcodificarse. HEVC ten un rendemento similar, pero ten menor compatibilidade web. H.264 é amplamente compatible e rápido de transcodificar, pero produce ficheiros moito máis grandes. AV1 é o códec máis eficiente pero carece de soporte en dispositivos máis antigos.", "trash_enabled_description": "Activar funcións do Lixo", @@ -358,6 +366,9 @@ "trash_number_of_days_description": "Número de días para manter os activos no lixo antes de eliminalos permanentemente", "trash_settings": "Configuración do Lixo", "trash_settings_description": "Xestionar a configuración do lixo", + "unlink_all_oauth_accounts": "Desvincular todas as contas OAuth", + "unlink_all_oauth_accounts_description": "Lembre desvincular todas as contas OAuth antes de migrar a un novo provedor.", + "unlink_all_oauth_accounts_prompt": "Está seguro de que quere desvincular todas as contas OAuth? Isto reiniciará o ID de OAuth de cada usuario e non se poderá desfacer.", "user_cleanup_job": "Limpeza de usuarios", "user_delete_delay": "A conta e os activos de {user} programaranse para a súa eliminación permanente en {delay, plural, one {# día} other {# días}}.", "user_delete_delay_settings": "Atraso na eliminación", @@ -384,13 +395,15 @@ "admin_password": "Contrasinal do administrador", "administration": "Administración", "advanced": "Avanzado", - "advanced_settings_enable_alternate_media_filter_subtitle": "Usa esta opción para filtrar medios durante a sincronización baseándose en criterios alternativos. Só proba isto se tes problemas coa aplicación detectando todos os álbums.", + "advanced_settings_enable_alternate_media_filter_subtitle": "Use esta opción para filtrar medios durante a sincronización baseándose en criterios alternativos. Só probe isto se ten problemas coa aplicación para detectar todos os álbums.", "advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Usar filtro alternativo de sincronización de álbums do dispositivo", "advanced_settings_log_level_title": "Nivel de rexistro: {level}", - "advanced_settings_prefer_remote_subtitle": "Algúns dispositivos son extremadamente lentos para cargar miniaturas de activos no dispositivo. Active esta configuración para cargar imaxes remotas no seu lugar.", + "advanced_settings_prefer_remote_subtitle": "Algúns dispositivos tardan moito en cargar as miniaturas de ficheiros locais. Active esta opción para cargar imaxes remotas no seu lugar.", "advanced_settings_prefer_remote_title": "Preferir imaxes remotas", "advanced_settings_proxy_headers_subtitle": "Definir cabeceiras de proxy que Immich debería enviar con cada solicitude de rede", "advanced_settings_proxy_headers_title": "Cabeceiras de Proxy", + "advanced_settings_readonly_mode_subtitle": "Activa o modo de só lectura, no que as fotos só se poden visualizar; opcións como seleccionar varias imaxes, compartir, enviar a outros dispositivos ou eliminar están deshabilitadas. Active/desactive o modo de só lectura a través do avatar do usuario na pantalla principal", + "advanced_settings_readonly_mode_title": "Modo de só lectura", "advanced_settings_self_signed_ssl_subtitle": "Omite a verificación do certificado SSL para o punto final do servidor. Requirido para certificados autofirmados.", "advanced_settings_self_signed_ssl_title": "Permitir certificados SSL autofirmados", "advanced_settings_sync_remote_deletions_subtitle": "Eliminar ou restaurar automaticamente un activo neste dispositivo cando esa acción se realiza na web", @@ -398,32 +411,35 @@ "advanced_settings_tile_subtitle": "Configuración de usuario avanzado", "advanced_settings_troubleshooting_subtitle": "Activar funcións adicionais para a resolución de problemas", "advanced_settings_troubleshooting_title": "Resolución de problemas", - "age_months": "Idade {months, plural, one {# mes} other {# meses}}", - "age_year_months": "Idade 1 ano, {months, plural, one {# mes} other {# meses}}", - "age_years": "{years, plural, other {Idade #}}", + "age_months": "Idade: {months, plural, one {# mes} other {# meses}}", + "age_year_months": "Idade: 1 ano e {months, plural, one {# mes} other {# meses}}", + "age_years": "Idade: {years, plural, one {# ano} other {# anos}}", "album_added": "Álbum engadido", - "album_added_notification_setting_description": "Recibir unha notificación por correo electrónico cando sexas engadido a un álbum compartido", + "album_added_notification_setting_description": "Recibir unha notificación por correo electrónico cando sexa engadido a un álbum compartido", "album_cover_updated": "Portada do álbum actualizada", - "album_delete_confirmation": "Estás seguro de que queres eliminar o álbum {album}?", + "album_delete_confirmation": "Está seguro de que quere eliminar o álbum {album}?", "album_delete_confirmation_description": "Se este álbum está compartido, outros usuarios non poderán acceder a el.", + "album_deleted": "Álbum eliminado", "album_info_card_backup_album_excluded": "EXCLUÍDO", "album_info_card_backup_album_included": "INCLUÍDO", "album_info_updated": "Información do álbum actualizada", "album_leave": "Saír do álbum?", - "album_leave_confirmation": "Estás seguro de que queres saír de {album}?", + "album_leave_confirmation": "Está seguro de que quere saír de {album}?", "album_name": "Nome do Álbum", "album_options": "Opcións do álbum", "album_remove_user": "Eliminar usuario?", - "album_remove_user_confirmation": "Estás seguro de que queres eliminar a {user}?", - "album_share_no_users": "Parece que compartiches este álbum con todos os usuarios ou non tes ningún usuario co que compartir.", + "album_remove_user_confirmation": "Está seguro de que quere eliminar a {user}?", + "album_search_not_found": "Non se atoparon álbums que coincidan coa súa busca", + "album_share_no_users": "Parece que compartiu este álbum con todos os usuarios ou non ten ningún usuario co que compartir.", + "album_summary": "Resumo do álbum", "album_updated": "Álbum actualizado", "album_updated_setting_description": "Recibir unha notificación por correo electrónico cando un álbum compartido teña novos activos", "album_user_left": "Saíu de {album}", - "album_user_removed": "Eliminado {user}", - "album_viewer_appbar_delete_confirm": "Estás seguro de que queres eliminar este álbum da túa conta?", + "album_user_removed": "Eliminouse a {user}", + "album_viewer_appbar_delete_confirm": "Está seguro de que quere eliminar este álbum da súa conta?", "album_viewer_appbar_share_err_delete": "Erro ao eliminar o álbum", "album_viewer_appbar_share_err_leave": "Erro ao saír do álbum", - "album_viewer_appbar_share_err_remove": "Hai problemas ao eliminar activos do álbum", + "album_viewer_appbar_share_err_remove": "Houbo problemas ao eliminar activos do álbum", "album_viewer_appbar_share_err_title": "Erro ao cambiar o título do álbum", "album_viewer_appbar_share_leave": "Saír do álbum", "album_viewer_appbar_share_to": "Compartir con", @@ -431,6 +447,10 @@ "album_with_link_access": "Permitir que calquera persoa coa ligazón vexa fotos e persoas neste álbum.", "albums": "Álbums", "albums_count": "{count, plural, one {{count, number} Álbum} other {{count, number} Álbums}}", + "albums_default_sort_order": "Orde de clasificación predeterminada do álbum", + "albums_default_sort_order_description": "Orde inicial dos ficheiros ao crear novos álbums.", + "albums_feature_description": "Coleccións de ficheiros que se poden compartir con outros usuarios.", + "albums_on_device_count": "Álbums no dispositivo ({count})", "all": "Todo", "all_albums": "Todos os álbums", "all_people": "Todas as persoas", @@ -445,12 +465,14 @@ "api_key_description": "Este valor só se mostrará unha vez. Asegúrese de copialo antes de pechar a xanela.", "api_key_empty": "O nome da súa chave API non pode estar baleiro", "api_keys": "Chaves API", - "app_bar_signout_dialog_content": "Estás seguro de que queres pechar sesión?", + "app_bar_signout_dialog_content": "Está seguro de que quere pechar sesión?", "app_bar_signout_dialog_ok": "Si", "app_bar_signout_dialog_title": "Pechar sesión", "app_settings": "Configuración da Aplicación", "appears_in": "Aparece en", + "apply_count": "Aplicar ({count, number})", "archive": "Arquivo", + "archive_action_prompt": "{count} engadido(s) ao Arquivo", "archive_or_unarchive_photo": "Arquivar ou desarquivar foto", "archive_page_no_archived_assets": "Non se atoparon activos arquivados", "archive_page_title": "Arquivo ({count})", @@ -459,14 +481,14 @@ "archived": "Arquivado", "archived_count": "{count, plural, other {Arquivados #}}", "are_these_the_same_person": "Son estas a mesma persoa?", - "are_you_sure_to_do_this": "Estás seguro de que queres facer isto?", + "are_you_sure_to_do_this": "Está seguro de que quere facer isto?", "asset_action_delete_err_read_only": "Non se poden eliminar activo(s) de só lectura, omitindo", "asset_action_share_err_offline": "Non se poden obter activo(s) fóra de liña, omitindo", "asset_added_to_album": "Engadido ao álbum", "asset_adding_to_album": "Engadindo ao álbum…", "asset_description_updated": "A descrición do activo actualizouse", "asset_filename_is_offline": "O activo {filename} está fóra de liña", - "asset_has_unassigned_faces": "O activo ten caras non asignadas", + "asset_has_unassigned_faces": "O activo ten caras sen asignar", "asset_hashing": "Calculando hash…", "asset_list_group_by_sub_title": "Agrupar por", "asset_list_layout_settings_dynamic_layout_title": "Deseño dinámico", @@ -477,59 +499,71 @@ "asset_list_settings_subtitle": "Configuración do deseño da grella de fotos", "asset_list_settings_title": "Grella de Fotos", "asset_offline": "Activo Fóra de Liña", - "asset_offline_description": "Este activo externo xa non se atopa no disco. Por favor, contacta co teu administrador de Immich para obter axuda.", + "asset_offline_description": "Este activo externo xa non se atopa no disco. Por favor, contacte co seu administrador de Immich para obter axuda.", "asset_restored_successfully": "Activo restaurado correctamente", "asset_skipped": "Omitido", "asset_skipped_in_trash": "No lixo", + "asset_trashed": "Ficheiro enviado ao lixo", + "asset_troubleshoot": "Solución de problemas do ficheiro", "asset_uploaded": "Subido", "asset_uploading": "Subindo…", - "asset_viewer_settings_subtitle": "Xestionar a túa configuración do visor da galería", + "asset_viewer_settings_subtitle": "Xestionar a súa configuración do visor da galería", "asset_viewer_settings_title": "Visor de Activos", "assets": "Activos", "assets_added_count": "Engadido {count, plural, one {# activo} other {# activos}}", "assets_added_to_album_count": "Engadido {count, plural, one {# activo} other {# activos}} ao álbum", + "assets_added_to_albums_count": "Engadido {assetTotal, plural, one {# ficheiro} other {# ficheiros}} a {albumTotal, plural, one {# álbum} other {# álbums}}", + "assets_cannot_be_added_to_album_count": "{count, plural, one {O ficheiro non se pode engadir} other {Os ficheiros non se poden engadir}} ao álbum", + "assets_cannot_be_added_to_albums": "{count, plural, one {O ficheiro non se pode engadir} other {Os ficheiros non se poden engadir}} a ningún dos álbums", "assets_count": "{count, plural, one {# activo} other {# activos}}", "assets_deleted_permanently": "{count} activo(s) eliminado(s) permanentemente", "assets_deleted_permanently_from_server": "{count} activo(s) eliminado(s) permanentemente do servidor Immich", + "assets_downloaded_failed": "{count, plural, one {Descargouse # ficheiro - fallou 1 ficheiro} other {Descargáronse # ficheiros - fallaron {error} ficheiros}}", + "assets_downloaded_successfully": "{count, plural, one {Descargouse # ficheiro correctamente} other {Descargáronse # ficheiros correctamente}}", "assets_moved_to_trash_count": "Movido {count, plural, one {# activo} other {# activos}} ao lixo", "assets_permanently_deleted_count": "Eliminados permanentemente {count, plural, one {# activo} other {# activos}}", "assets_removed_count": "Eliminados {count, plural, one {# activo} other {# activos}}", - "assets_removed_permanently_from_device": "{count} activo(s) eliminado(s) permanentemente do teu dispositivo", - "assets_restore_confirmation": "Estás seguro de que queres restaurar todos os seus activos no lixo? Non podes desfacer esta acción! Ten en conta que calquera activo fóra de liña non pode ser restaurado desta maneira.", + "assets_removed_permanently_from_device": "{count} activo(s) eliminado(s) permanentemente do seu dispositivo", + "assets_restore_confirmation": "Está seguro de que quere restaurar todos os activos no lixo? Non pode desfacer esta acción! Teña en conta que calquera activo fóra de liña non pode ser restaurado desta maneira.", "assets_restored_count": "Restaurados {count, plural, one {# activo} other {# activos}}", "assets_restored_successfully": "{count} activo(s) restaurado(s) correctamente", "assets_trashed": "{count} activo(s) movido(s) ao lixo", "assets_trashed_count": "Movido {count, plural, one {# activo} other {# activos}} ao lixo", "assets_trashed_from_server": "{count} activo(s) movido(s) ao lixo desde o servidor Immich", "assets_were_part_of_album_count": "{count, plural, one {O activo xa era} other {Os activos xa eran}} parte do álbum", + "assets_were_part_of_albums_count": "{count, plural, one {O ficheiro xa estaba} other {Os ficheiros xa estaban}} neses álbums", "authorized_devices": "Dispositivos Autorizados", "automatic_endpoint_switching_subtitle": "Conectar localmente a través da wifi designada cando estea dispoñible e usar conexións alternativas noutros lugares", "automatic_endpoint_switching_title": "Cambio automático de URL", + "autoplay_slideshow": "Reprodución automática da presentación", "back": "Atrás", "back_close_deselect": "Atrás, pechar ou deseleccionar", - "background_location_permission": "Permiso de ubicación en segundo plano", - "background_location_permission_content": "Para cambiar de rede cando se executa en segundo plano, Immich debe ter *sempre* acceso á ubicación precisa para que a aplicación poida ler o nome da rede wifi", + "background_backup_running_error": "A copia de seguridade en segundo plano está en curso, non se pode iniciar unha copia manual", + "background_location_permission": "Permiso de localización en segundo plano", + "background_location_permission_content": "Para cambiar de rede cando se executa en segundo plano, Immich debe ter *sempre* acceso á localización precisa para que a aplicación poida ler o nome da rede wifi", + "background_options": "Opcións en segundo plano", "backup": "Copia de Seguridade", "backup_album_selection_page_albums_device": "Álbums no dispositivo ({count})", "backup_album_selection_page_albums_tap": "Tocar para incluír, dobre toque para excluír", - "backup_album_selection_page_assets_scatter": "Os activos poden dispersarse por varios álbums. Polo tanto, os álbums poden incluírse ou excluírse durante o proceso de copia de seguridade.", + "backup_album_selection_page_assets_scatter": "Os activos poden estar dispersos por varios álbums. Polo tanto, os álbums poden incluírse ou excluírse durante o proceso de copia de seguridade.", "backup_album_selection_page_select_albums": "Seleccionar álbums", "backup_album_selection_page_selection_info": "Información da selección", "backup_album_selection_page_total_assets": "Total de activos únicos", + "backup_albums_sync": "Sincronización de álbums da copia de seguridade", "backup_all": "Todo", "backup_background_service_backup_failed_message": "Erro ao facer copia de seguridade dos activos. Reintentando…", "backup_background_service_connection_failed_message": "Erro ao conectar co servidor. Reintentando…", "backup_background_service_current_upload_notification": "Subindo {filename}", "backup_background_service_default_notification": "Comprobando novos activos…", "backup_background_service_error_title": "Erro na copia de seguridade", - "backup_background_service_in_progress_notification": "Facendo copia de seguridade dos teus activos…", + "backup_background_service_in_progress_notification": "Facendo copia de seguridade dos seus activos…", "backup_background_service_upload_failure_notification": "Erro ao subir {filename}", "backup_controller_page_albums": "Álbums da Copia de Seguridade", "backup_controller_page_background_app_refresh_disabled_content": "Active a actualización de aplicacións en segundo plano en Axustes > Xeral > Actualización en segundo plano para usar a copia de seguridade en segundo plano.", "backup_controller_page_background_app_refresh_disabled_title": "Actualización de aplicacións en segundo plano desactivada", "backup_controller_page_background_app_refresh_enable_button_text": "Ir a axustes", - "backup_controller_page_background_battery_info_link": "Móstrame como", - "backup_controller_page_background_battery_info_message": "Para a mellor experiencia de copia de seguridade en segundo plano, desactiva calquera optimización de batería que restrinxa a actividade en segundo plano para Immich.\n\nDado que isto é específico do dispositivo, busque a información requirida para o fabricante do teu dispositivo.", + "backup_controller_page_background_battery_info_link": "Móstreme como", + "backup_controller_page_background_battery_info_message": "Para a mellor experiencia de copia de seguridade en segundo plano, desactive calquera optimización de batería que restrinxa a actividade en segundo plano para Immich.\n\nDado que isto é específico do dispositivo, busque a información requirida para o fabricante do seu dispositivo.", "backup_controller_page_background_battery_info_ok": "Aceptar", "backup_controller_page_background_battery_info_title": "Optimizacións da batería", "backup_controller_page_background_charging": "Só mentres se carga", @@ -565,29 +599,35 @@ "backup_controller_page_turn_on": "Activar copia de seguridade en primeiro plano", "backup_controller_page_uploading_file_info": "Subindo información do ficheiro", "backup_err_only_album": "Non se pode eliminar o único álbum", + "backup_error_sync_failed": "A sincronización fallou. Non se pode procesar a copia de seguridade.", "backup_info_card_assets": "activos", "backup_manual_cancelled": "Cancelado", - "backup_manual_in_progress": "Subida xa en progreso. Intenta despois dun tempo", + "backup_manual_in_progress": "Subida xa en progreso. Inténteo despois dun tempo", "backup_manual_success": "Éxito", "backup_manual_title": "Estado da subida", + "backup_options": "Opcións de copia de seguridade", "backup_options_page_title": "Opcións da copia de seguridade", "backup_setting_subtitle": "Xestionar a configuración de carga en segundo plano e primeiro plano", + "backup_settings_subtitle": "Xestionar configuración de subidas", "backward": "Atrás", "biometric_auth_enabled": "Autenticación biométrica activada", + "biometric_locked_out": "Está bloqueado da autenticación biométrica", + "biometric_no_options": "Non hai opcións biométricas dispoñibles", + "biometric_not_available": "A autenticación biométrica non está dispoñible neste dispositivo", "birthdate_saved": "Data de nacemento gardada correctamente", "birthdate_set_description": "A data de nacemento úsase para calcular a idade desta persoa no momento dunha foto.", "blurred_background": "Fondo borroso", "bugs_and_feature_requests": "Erros e Solicitudes de Funcións", "build": "Compilación", "build_image": "Construír Imaxe", - "bulk_delete_duplicates_confirmation": "Estás seguro de que queres eliminar masivamente {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto conservará o activo máis grande de cada grupo e eliminará permanentemente todos os demais duplicados. Non pode desfacer esta acción!", - "bulk_keep_duplicates_confirmation": "Estás seguro de que queres conservar {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto resolverá todos os grupos duplicados sen eliminar nada.", - "bulk_trash_duplicates_confirmation": "Estás seguro de que queres mover masivamente ao lixo {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto conservará o activo máis grande de cada grupo e moverá ao lixo todos os demais duplicados.", - "buy": "Comprar Immich", + "bulk_delete_duplicates_confirmation": "Está seguro de que quere eliminar masivamente {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto conservará o activo máis grande de cada grupo e eliminará permanentemente todos os demais duplicados. Non pode desfacer esta acción!", + "bulk_keep_duplicates_confirmation": "Está seguro de que quere conservar {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto resolverá todos os grupos duplicados sen eliminar nada.", + "bulk_trash_duplicates_confirmation": "Está seguro de que quere mover masivamente ao lixo {count, plural, one {# activo duplicado} other {# activos duplicados}}? Isto conservará o activo máis grande de cada grupo e moverá ao lixo todos os demais duplicados.", + "buy": "Apoiar Immich", "cache_settings_clear_cache_button": "Borrar caché", "cache_settings_clear_cache_button_title": "Borra a caché da aplicación. Isto afectará significativamente o rendemento da aplicación ata que a caché se reconstruíu.", "cache_settings_duplicated_assets_clear_button": "BORRAR", - "cache_settings_duplicated_assets_subtitle": "Fotos e vídeos que están na lista negra da aplicación", + "cache_settings_duplicated_assets_subtitle": "Fotos e vídeos que a aplicación ten na lista de ignorados", "cache_settings_duplicated_assets_title": "Activos Duplicados ({count})", "cache_settings_statistics_album": "Miniaturas da biblioteca", "cache_settings_statistics_full": "Imaxes completas", @@ -604,24 +644,31 @@ "cancel": "Cancelar", "cancel_search": "Cancelar busca", "canceled": "Cancelado", + "canceling": "Cancelando", "cannot_merge_people": "Non se poden fusionar persoas", "cannot_undo_this_action": "Non pode desfacer esta acción!", "cannot_update_the_description": "Non se pode actualizar a descrición", + "cast": "Enviar a dispositivo", + "cast_description": "Configurar destinos dispoñibles para enviar a dispositivo", "change_date": "Cambiar data", + "change_description": "Cambiar descrición", "change_display_order": "Cambiar orde de visualización", "change_expiration_time": "Cambiar hora de caducidade", - "change_location": "Cambiar ubicación", + "change_location": "Cambiar localización", "change_name": "Cambiar nome", "change_name_successfully": "Nome cambiado correctamente", "change_password": "Cambiar Contrasinal", - "change_password_description": "Esta é a primeira vez que inicias sesión no sistema ou solicitouse un cambio do teu contrasinal. Introduza o novo contrasinal a continuación.", + "change_password_description": "Esta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.", "change_password_form_confirm_password": "Confirmar Contrasinal", - "change_password_form_description": "Ola {name},\n\nEsta é a primeira vez que inicias sesión no sistema ou solicitouse un cambio do teu contrasinal. Introduza o novo contrasinal a continuación.", + "change_password_form_description": "Ola {name},\n\nEsta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.", "change_password_form_new_password": "Novo Contrasinal", "change_password_form_password_mismatch": "Os contrasinais non coinciden", "change_password_form_reenter_new_password": "Reintroducir Novo Contrasinal", - "change_your_password": "Cambiar o teu contrasinal", + "change_pin_code": "Cambiar código PIN", + "change_your_password": "Cambiar o seu contrasinal", "changed_visibility_successfully": "Visibilidade cambiada correctamente", + "charging": "Cargando", + "charging_requirement_mobile_backup": "A copia de seguridade en segundo plano require que o dispositivo estea cargando", "check_corrupt_asset_backup": "Comprobar copias de seguridade de activos corruptos", "check_corrupt_asset_backup_button": "Realizar comprobación", "check_corrupt_asset_backup_description": "Execute esta comprobación só a través da wifi e unha vez que todos os activos teñan copia de seguridade. O procedemento pode tardar uns minutos.", @@ -631,6 +678,7 @@ "clear": "Limpar", "clear_all": "Limpar todo", "clear_all_recent_searches": "Limpar todas as buscas recentes", + "clear_file_cache": "Limpar caché de ficheiros", "clear_message": "Limpar mensaxe", "clear_value": "Limpar valor", "client_cert_dialog_msg_confirm": "Aceptar", @@ -652,21 +700,26 @@ "comments_and_likes": "Comentarios e Gústames", "comments_are_disabled": "Os comentarios están desactivados", "common_create_new_album": "Crear novo álbum", - "common_server_error": "Por favor, comprobe a túa conexión de rede, asegúrache de que o servidor sexa accesible e que as versións da aplicación/servidor sexan compatibles.", + "common_server_error": "Por favor, comprobe a súa conexión de rede, asegúrese de que o servidor sexa accesible e que as versións da aplicación/servidor sexan compatibles.", "completed": "Completado", "confirm": "Confirmar", "confirm_admin_password": "Confirmar Contrasinal do Administrador", - "confirm_delete_face": "Estás seguro de que queres eliminar a cara de {name} do activo?", - "confirm_delete_shared_link": "Estás seguro de que queres eliminar esta ligazón compartida?", - "confirm_keep_this_delete_others": "Todos os demais activos na pila eliminaranse excepto este activo. Estás seguro de que queres continuar?", + "confirm_delete_face": "Está seguro de que quere eliminar a cara de {name} do activo?", + "confirm_delete_shared_link": "Está seguro de que quere eliminar esta ligazón compartida?", + "confirm_keep_this_delete_others": "Todos os demais activos na pila eliminaranse excepto este activo. Está seguro de que quere continuar?", + "confirm_new_pin_code": "Confirmar novo código PIN", "confirm_password": "Confirmar contrasinal", + "confirm_tag_face": "Quere etiquetar esta cara como {name}?", + "confirm_tag_face_unnamed": "Quere etiquetar esta cara?", + "connected_device": "Dispositivo conectado", + "connected_to": "Conectado a", "contain": "Conter", "context": "Contexto", "continue": "Continuar", "control_bottom_app_bar_create_new_album": "Crear novo álbum", "control_bottom_app_bar_delete_from_immich": "Eliminar de Immich", "control_bottom_app_bar_delete_from_local": "Eliminar do dispositivo", - "control_bottom_app_bar_edit_location": "Editar ubicación", + "control_bottom_app_bar_edit_location": "Editar localización", "control_bottom_app_bar_edit_time": "Editar Data e Hora", "control_bottom_app_bar_share_link": "Compartir Ligazón", "control_bottom_app_bar_share_to": "Compartir Con", @@ -696,19 +749,25 @@ "create_new_user": "Crear novo usuario", "create_shared_album_page_share_add_assets": "ENGADIR ACTIVOS", "create_shared_album_page_share_select_photos": "Seleccionar Fotos", + "create_shared_link": "Crear ligazón compartida", "create_tag": "Crear etiqueta", "create_tag_description": "Crear unha nova etiqueta. Para etiquetas aniñadas, introduza a ruta completa da etiqueta incluíndo barras inclinadas.", "create_user": "Crear usuario", "created": "Creado", + "created_at": "Creado", + "creating_linked_albums": "Creando álbums vinculados...", "crop": "Recortar", "curated_object_page_title": "Cousas", "current_device": "Dispositivo actual", + "current_pin_code": "Código PIN actual", "current_server_address": "Enderezo do servidor actual", "custom_locale": "Configuración Rexional Personalizada", "custom_locale_description": "Formatar datas e números baseándose na lingua e a rexión", + "custom_url": "URL personalizada", "daily_title_text_date": "E, dd MMM", "daily_title_text_date_year": "E, dd MMM, yyyy", "dark": "Escuro", + "dark_theme": "Alternar tema escuro", "date_after": "Data posterior a", "date_and_time": "Data e Hora", "date_before": "Data anterior a", @@ -716,45 +775,54 @@ "date_of_birth_saved": "Data de nacemento gardada correctamente", "date_range": "Rango de datas", "day": "Día", - "deduplicate_all": "Eliminar Duplicados Todos", + "days": "Días", + "deduplicate_all": "Eliminar todos os duplicados", "deduplication_criteria_1": "Tamaño da imaxe en bytes", "deduplication_criteria_2": "Reconto de datos EXIF", "deduplication_info": "Información de Deduplicación", "deduplication_info_description": "Para preseleccionar automaticamente activos e eliminar duplicados masivamente, miramos:", "default_locale": "Configuración Rexional Predeterminada", - "default_locale_description": "Formatar datas e números baseándose na configuración rexional do teu navegador", + "default_locale_description": "Formatar datas e números baseándose na configuración rexional do seu navegador", "delete": "Eliminar", + "delete_action_confirmation_message": "Está seguro de que quere eliminar este ficheiro? Esta acción moverá o ficheiro ao lixo do servidor e preguntaralle se tamén quere eliminalo localmente", + "delete_action_prompt": "{count} eliminado(s)", "delete_album": "Eliminar álbum", - "delete_api_key_prompt": "Estás seguro de que queres eliminar esta chave API?", - "delete_dialog_alert": "Estes elementos eliminaranse permanentemente de Immich e do teu dispositivo", - "delete_dialog_alert_local": "Estes elementos eliminaranse permanentemente do teu dispositivo pero aínda estarán dispoñibles no servidor Immich", - "delete_dialog_alert_local_non_backed_up": "Algúns dos elementos non teñen copia de seguridade en Immich e eliminaranse permanentemente do teu dispositivo", + "delete_api_key_prompt": "Está seguro de que quere eliminar esta chave API?", + "delete_dialog_alert": "Estes elementos eliminaranse permanentemente de Immich e do seu dispositivo", + "delete_dialog_alert_local": "Estes elementos eliminaranse permanentemente do seu dispositivo pero aínda estarán dispoñibles no servidor Immich", + "delete_dialog_alert_local_non_backed_up": "Algúns dos elementos non teñen copia de seguridade en Immich e eliminaranse permanentemente do seu dispositivo", "delete_dialog_alert_remote": "Estes elementos eliminaranse permanentemente do servidor Immich", "delete_dialog_ok_force": "Eliminar Igualmente", "delete_dialog_title": "Eliminar Permanentemente", - "delete_duplicates_confirmation": "Estás seguro de que queres eliminar permanentemente estes duplicados?", + "delete_duplicates_confirmation": "Está seguro de que quere eliminar permanentemente estes duplicados?", "delete_face": "Eliminar cara", "delete_key": "Eliminar chave", "delete_library": "Eliminar Biblioteca", "delete_link": "Eliminar ligazón", + "delete_local_action_prompt": "{count} eliminado(s) localmente", "delete_local_dialog_ok_backed_up_only": "Eliminar Só con Copia de Seguridade", "delete_local_dialog_ok_force": "Eliminar Igualmente", "delete_others": "Eliminar outros", + "delete_permanently": "Eliminar permanentemente", + "delete_permanently_action_prompt": "{count} eliminado(s) permanentemente", "delete_shared_link": "Eliminar ligazón compartida", "delete_shared_link_dialog_title": "Eliminar Ligazón Compartida", "delete_tag": "Eliminar etiqueta", - "delete_tag_confirmation_prompt": "Estás seguro de que queres eliminar a etiqueta {tagName}?", + "delete_tag_confirmation_prompt": "Está seguro de que quere eliminar a etiqueta {tagName}?", "delete_user": "Eliminar usuario", "deleted_shared_link": "Ligazón compartida eliminada", "deletes_missing_assets": "Elimina activos que faltan no disco", "description": "Descrición", "description_input_hint_text": "Engadir descrición...", "description_input_submit_error": "Erro ao actualizar a descrición, comprobe o rexistro para máis detalles", + "deselect_all": "Deseleccionar todo", "details": "Detalles", "direction": "Dirección", "disabled": "Desactivado", "disallow_edits": "Non permitir edicións", + "discord": "Discord", "discover": "Descubrir", + "discovered_devices": "Dispositivos descubertos", "dismiss_all_errors": "Descartar todos os erros", "dismiss_error": "Descartar erro", "display_options": "Opcións de visualización", @@ -765,6 +833,7 @@ "documentation": "Documentación", "done": "Feito", "download": "Descargar", + "download_action_prompt": "Descargando {count} activo(s)", "download_canceled": "Descarga cancelada", "download_complete": "Descarga completada", "download_enqueue": "Descarga en cola", @@ -791,40 +860,56 @@ "edit": "Editar", "edit_album": "Editar álbum", "edit_avatar": "Editar avatar", + "edit_birthday": "Editar aniversario", "edit_date": "Editar data", "edit_date_and_time": "Editar data e hora", - "edit_exclusion_pattern": "Editar padrón de exclusión", + "edit_date_and_time_action_prompt": "{count} data(s) e hora(s) editada(s)", + "edit_date_and_time_by_offset": "Cambiar data por desfase", + "edit_date_and_time_by_offset_interval": "Nova franxa de datas: {from} - {to}", + "edit_description": "Editar descrición", + "edit_description_prompt": "Por favor, seleccione unha nova descrición:", + "edit_exclusion_pattern": "Editar patrón de exclusión", "edit_faces": "Editar caras", "edit_import_path": "Editar ruta de importación", "edit_import_paths": "Editar Rutas de Importación", "edit_key": "Editar chave", "edit_link": "Editar ligazón", - "edit_location": "Editar ubicación", - "edit_location_dialog_title": "Ubicación", + "edit_location": "Editar localización", + "edit_location_action_prompt": "{count} localización(s) editada(s)", + "edit_location_dialog_title": "Localización", "edit_name": "Editar nome", "edit_people": "Editar persoas", "edit_tag": "Editar etiqueta", "edit_title": "Editar Título", "edit_user": "Editar usuario", "edited": "Editado", + "editor": "Editor", "editor_close_without_save_prompt": "Os cambios non se gardarán", "editor_close_without_save_title": "Pechar editor?", "editor_crop_tool_h2_aspect_ratios": "Proporcións de aspecto", "editor_crop_tool_h2_rotation": "Rotación", "email": "Correo electrónico", + "email_notifications": "Notificacións por correo electrónico", "empty_folder": "Este cartafol está baleiro", "empty_trash": "Baleirar lixo", - "empty_trash_confirmation": "Estás seguro de que queres baleirar o lixo? Isto eliminará permanentemente todos os activos no lixo de Immich. Non podes desfacer esta acción!", + "empty_trash_confirmation": "Está seguro de que quere baleirar o lixo? Isto eliminará permanentemente todos os activos no lixo de Immich. Non pode desfacer esta acción!", "enable": "Activar", + "enable_backup": "Activar copia de seguridade", + "enable_biometric_auth_description": "Introduza o seu código PIN para activar a autenticación biométrica", "enabled": "Activado", "end_date": "Data de fin", "enqueued": "En cola", "enter_wifi_name": "Introducir nome da wifi", + "enter_your_pin_code": "Introduza o seu código PIN", + "enter_your_pin_code_subtitle": "Introduza o seu código PIN para acceder ao cartafol bloqueado", "error": "Erro", "error_change_sort_album": "Erro ao cambiar a orde de clasificación do álbum", "error_delete_face": "Erro ao eliminar a cara do activo", + "error_getting_places": "Erro ao obter lugares", "error_loading_image": "Erro ao cargar a imaxe", + "error_loading_partners": "Erro cargando compañeiros/as: {error}", "error_saving_image": "Erro: {error}", + "error_tag_face_bounding_box": "Erro ao etiquetar cara - non se poden obter as coordenadas da caixa delimitadora", "error_title": "Erro - Algo saíu mal", "errors": { "cannot_navigate_next_asset": "Non se pode navegar ao seguinte activo", @@ -841,10 +926,10 @@ "error_adding_users_to_album": "Erro ao engadir usuarios ao álbum", "error_deleting_shared_user": "Erro ao eliminar o usuario compartido", "error_downloading": "Erro ao descargar {filename}", - "error_hiding_buy_button": "Erro ao ocultar o botón de compra", + "error_hiding_buy_button": "Erro ao ocultar o botón de apoio", "error_removing_assets_from_album": "Erro ao eliminar activos do álbum, comprobe a consola para máis detalles", "error_selecting_all_assets": "Erro ao seleccionar todos os activos", - "exclusion_pattern_already_exists": "Este padrón de exclusión xa existe.", + "exclusion_pattern_already_exists": "Este patrón de exclusión xa existe.", "failed_to_create_album": "Erro ao crear o álbum", "failed_to_create_shared_link": "Erro ao crear a ligazón compartida", "failed_to_edit_shared_link": "Erro ao editar a ligazón compartida", @@ -855,6 +940,7 @@ "failed_to_load_notifications": "Erro ao cargar as notificacións", "failed_to_load_people": "Erro ao cargar persoas", "failed_to_remove_product_key": "Erro ao eliminar a chave do produto", + "failed_to_reset_pin_code": "Erro ao restablecer o código PIN", "failed_to_stack_assets": "Erro ao apilar activos", "failed_to_unstack_assets": "Erro ao desapilar activos", "failed_to_update_notification_status": "Erro ao actualizar o estado das notificacións", @@ -863,10 +949,11 @@ "paths_validation_failed": "{paths, plural, one {# ruta fallou} other {# rutas fallaron}} na validación", "profile_picture_transparent_pixels": "As imaxes de perfil non poden ter píxeles transparentes. Por favor, faga zoom e/ou mova a imaxe.", "quota_higher_than_disk_size": "Estableceu unha cota superior ao tamaño do disco", + "something_went_wrong": "Algo fallou", "unable_to_add_album_users": "Non se puideron engadir usuarios ao álbum", "unable_to_add_assets_to_shared_link": "Non se puideron engadir activos á ligazón compartida", "unable_to_add_comment": "Non se puido engadir o comentario", - "unable_to_add_exclusion_pattern": "Non se puido engadir o padrón de exclusión", + "unable_to_add_exclusion_pattern": "Non se puido engadir o patrón de exclusión", "unable_to_add_import_path": "Non se puido engadir a ruta de importación", "unable_to_add_partners": "Non se puideron engadir compañeiros/as", "unable_to_add_remove_archive": "Non se puido {archived, select, true {eliminar activo do} other {engadir activo ao}} arquivo", @@ -874,13 +961,14 @@ "unable_to_archive_unarchive": "Non se puido {archived, select, true {arquivar} other {desarquivar}}", "unable_to_change_album_user_role": "Non se puido cambiar o rol do usuario do álbum", "unable_to_change_date": "Non se puido cambiar a data", + "unable_to_change_description": "Non se puido cambiar a descrición", "unable_to_change_favorite": "Non se puido cambiar o favorito do activo", - "unable_to_change_location": "Non se puido cambiar a ubicación", + "unable_to_change_location": "Non se puido cambiar a localización", "unable_to_change_password": "Non se puido cambiar o contrasinal", "unable_to_change_visibility": "Non se puido cambiar a visibilidade para {count, plural, one {# persoa} other {# persoas}}", "unable_to_complete_oauth_login": "Non se puido completar o inicio de sesión OAuth", "unable_to_connect": "Non se puido conectar", - "unable_to_copy_to_clipboard": "Non se puido copiar ao portapapeis, asegúrate de acceder á páxina a través de https", + "unable_to_copy_to_clipboard": "Non se puido copiar ao portapapeis, asegúrese de acceder á páxina a través de https", "unable_to_create_admin_account": "Non se puido crear a conta de administrador", "unable_to_create_api_key": "Non se puido crear unha nova Chave API", "unable_to_create_library": "Non se puido crear a biblioteca", @@ -888,12 +976,12 @@ "unable_to_delete_album": "Non se puido eliminar o álbum", "unable_to_delete_asset": "Non se puido eliminar o activo", "unable_to_delete_assets": "Erro ao eliminar activos", - "unable_to_delete_exclusion_pattern": "Non se puido eliminar o padrón de exclusión", + "unable_to_delete_exclusion_pattern": "Non se puido eliminar o patrón de exclusión", "unable_to_delete_import_path": "Non se puido eliminar a ruta de importación", "unable_to_delete_shared_link": "Non se puido eliminar a ligazón compartida", "unable_to_delete_user": "Non se puido eliminar o usuario", "unable_to_download_files": "Non se puideron descargar os ficheiros", - "unable_to_edit_exclusion_pattern": "Non se puido editar o padrón de exclusión", + "unable_to_edit_exclusion_pattern": "Non se puido editar o patrón de exclusión", "unable_to_edit_import_path": "Non se puido editar a ruta de importación", "unable_to_empty_trash": "Non se puido baleirar o lixo", "unable_to_enter_fullscreen": "Non se puido entrar en pantalla completa", @@ -917,6 +1005,7 @@ "unable_to_remove_partner": "Non se puido eliminar o/a compañeiro/a", "unable_to_remove_reaction": "Non se puido eliminar a reacción", "unable_to_reset_password": "Non se puido restablecer o contrasinal", + "unable_to_reset_pin_code": "Non é posible reiniciar o código PIN", "unable_to_resolve_duplicate": "Non se puido resolver o duplicado", "unable_to_restore_assets": "Non se puideron restaurar os activos", "unable_to_restore_trash": "Non se puido restaurar o lixo", @@ -938,22 +1027,25 @@ "unable_to_update_album_cover": "Non se puido actualizar a portada do álbum", "unable_to_update_album_info": "Non se puido actualizar a información do álbum", "unable_to_update_library": "Non se puido actualizar a biblioteca", - "unable_to_update_location": "Non se puido actualizar a ubicación", + "unable_to_update_location": "Non se puido actualizar a localización", "unable_to_update_settings": "Non se puido actualizar a configuración", "unable_to_update_timeline_display_status": "Non se puido actualizar o estado de visualización da liña de tempo", "unable_to_update_user": "Non se puido actualizar o usuario", "unable_to_upload_file": "Non se puido cargar o ficheiro" }, + "exif": "Exif", "exif_bottom_sheet_description": "Engadir Descrición...", + "exif_bottom_sheet_description_error": "Erro ao actualizar a descrición", "exif_bottom_sheet_details": "DETALLES", - "exif_bottom_sheet_location": "UBICACIÓN", + "exif_bottom_sheet_location": "LOCALIZACIÓN", "exif_bottom_sheet_people": "PERSOAS", "exif_bottom_sheet_person_add_person": "Engadir nome", "exit_slideshow": "Saír da Presentación", "expand_all": "Expandir todo", "experimental_settings_new_asset_list_subtitle": "Traballo en progreso", "experimental_settings_new_asset_list_title": "Activar grella de fotos experimental", - "experimental_settings_subtitle": "Use baixo o teu propio risco!", + "experimental_settings_subtitle": "Use baixo o seu propio risco!", + "experimental_settings_title": "Experimental", "expire_after": "Caduca despois de", "expired": "Caducado", "expires_date": "Caduca o {date}", @@ -961,6 +1053,8 @@ "explorer": "Explorador", "export": "Exportar", "export_as_json": "Exportar como JSON", + "export_database": "Exportar a Base de Datos", + "export_database_description": "Exportar a base de datos SQLite", "extension": "Extensión", "external": "Externo", "external_libraries": "Bibliotecas Externas", @@ -968,14 +1062,17 @@ "external_network_sheet_info": "Cando non estea na rede wifi preferida, a aplicación conectarase ao servidor a través da primeira das seguintes URLs que poida alcanzar, comezando de arriba a abaixo", "face_unassigned": "Sen asignar", "failed": "Fallado", + "failed_to_authenticate": "Fallou a autenticación", "failed_to_load_assets": "Erro ao cargar activos", "failed_to_load_folder": "Erro ao cargar o cartafol", "favorite": "Favorito", + "favorite_action_prompt": "{count} engadido/a a Favoritos", "favorite_or_unfavorite_photo": "Marcar ou desmarcar como favorito", "favorites": "Favoritos", "favorites_page_no_favorites": "Non se atoparon activos favoritos", "feature_photo_updated": "Foto destacada actualizada", "features": "Funcións", + "features_in_development": "Funcionalidades en Desenvolvemento", "features_setting_description": "Xestionar as funcións da aplicación", "file_name": "Nome do ficheiro", "file_name_or_extension": "Nome do ficheiro ou extensión", @@ -984,20 +1081,27 @@ "filter": "Filtro", "filter_people": "Filtrar persoas", "filter_places": "Filtrar lugares", - "find_them_fast": "Atópaos rápido por nome coa busca", + "find_them_fast": "Atópeos rápido por nome coa busca", + "first": "Primeiro/a", "fix_incorrect_match": "Corrixir coincidencia incorrecta", "folder": "Cartafol", "folder_not_found": "Cartafol non atopado", "folders": "Cartafoles", "folders_feature_description": "Navegar pola vista de cartafoles para as fotos e vídeos no sistema de ficheiros", + "forgot_pin_code_question": "Esqueceu o seu PIN?", "forward": "Adiante", + "gcast_enabled": "Google Cast", + "gcast_enabled_description": "Esta funcionalidade carga recursos externos de Google para poder funcionar.", "general": "Xeral", + "geolocation_instruction_location": "Prema nun recurso con coordenadas GPS para usar a súa localización, ou seleccione unha localización directamente no mapa", "get_help": "Obter Axuda", - "get_wifiname_error": "Non se puido obter o nome da wifi. Asegúrate de que concedeu os permisos necesarios e está conectado a unha rede wifi", + "get_wifiname_error": "Non se puido obter o nome da wifi. Asegúrese de que concedeu os permisos necesarios e está conectado a unha rede wifi", "getting_started": "Primeiros Pasos", "go_back": "Volver", "go_to_folder": "Ir ao cartafol", "go_to_search": "Ir á busca", + "gps": "GPS", + "gps_missing": "Sen GPS", "grant_permission": "Conceder permiso", "group_albums_by": "Agrupar álbums por...", "group_country": "Agrupar por país", @@ -1008,6 +1112,9 @@ "haptic_feedback_switch": "Activar resposta háptica", "haptic_feedback_title": "Resposta Háptica", "has_quota": "Ten cota", + "hash_asset": "Facer hash do recurso", + "hashed_assets": "Recursos cun hash", + "hashing": "Aplicando hash", "header_settings_add_header_tip": "Engadir Cabeceira", "header_settings_field_validator_msg": "O valor non pode estar baleiro", "header_settings_header_name_input": "Nome da cabeceira", @@ -1017,7 +1124,7 @@ "hi_user": "Ola {name} ({email})", "hide_all_people": "Ocultar todas as persoas", "hide_gallery": "Ocultar galería", - "hide_named_person": "Ocultar persoa {name}", + "hide_named_person": "Ocultar a persoa {name}", "hide_password": "Ocultar contrasinal", "hide_person": "Ocultar persoa", "hide_unnamed_people": "Ocultar persoas sen nome", @@ -1032,10 +1139,16 @@ "home_page_delete_remote_err_local": "Activos locais na selección de eliminación remota, omitindo", "home_page_favorite_err_local": "Non se poden marcar como favoritos activos locais aínda, omitindo", "home_page_favorite_err_partner": "Non se poden marcar como favoritos activos de compañeiro/a aínda, omitindo", - "home_page_first_time_notice": "Se esta é a primeira vez que usas a aplicación, asegúrate de elixir un álbum de copia de seguridade para que a liña de tempo poida encherse con fotos e vídeos nel", + "home_page_first_time_notice": "Se esta é a primeira vez que usa a aplicación, asegúrese de elixir un álbum de copia de seguridade para que a liña de tempo poida encherse con fotos e vídeos nel", + "home_page_locked_error_local": "Non é posíbel mover os recursos locais ao cartafol bloqueado, saltando", + "home_page_locked_error_partner": "Non é posíbel mover os recursos do/a colaborador/a ao cartafol bloqueado, saltando", "home_page_share_err_local": "Non se poden compartir activos locais mediante ligazón, omitindo", "home_page_upload_err_limit": "Só se pode cargar un máximo de 30 activos á vez, omitindo", + "host": "Servidor", "hour": "Hora", + "hours": "Horas", + "id": "ID", + "idle": "Inactivo/a", "ignore_icloud_photos": "Ignorar fotos de iCloud", "ignore_icloud_photos_description": "As fotos que están almacenadas en iCloud non se cargarán ao servidor Immich", "image": "Imaxe", @@ -1063,7 +1176,7 @@ "include_shared_albums": "Incluír álbums compartidos", "include_shared_partner_assets": "Incluír activos de compañeiro/a compartidos", "individual_share": "Compartir individual", - "individual_shares": "Compartires individuais", + "individual_shares": "Comparticións individuais", "info": "Información", "interval": { "day_at_onepm": "Todos os días ás 13:00", @@ -1075,6 +1188,12 @@ "invalid_date_format": "Formato de data inválido", "invite_people": "Invitar Persoas", "invite_to_album": "Invitar ao álbum", + "ios_debug_info_fetch_ran_at": "Obtívose ás {dateTime}", + "ios_debug_info_last_sync_at": "Última sincronización: {dateTime}", + "ios_debug_info_no_processes_queued": "Sen procesos en segundo plano en cola", + "ios_debug_info_no_sync_yet": "Aínda non se executou ningunha tarefa de sincronización en segundo plano", + "ios_debug_info_processes_queued": "{count, plural, one {{count} proceso en segundo plano en cola} other {{count} procesos en segundo plano en cola}}", + "ios_debug_info_processing_ran_at": "O procesamento executouse ás {dateTime}", "items_count": "{count, plural, one {# elemento} other {# elementos}}", "jobs": "Traballos", "keep": "Conservar", @@ -1083,10 +1202,17 @@ "kept_this_deleted_others": "Conservouse este activo e elimináronse {count, plural, one {# activo} other {# activos}}", "keyboard_shortcuts": "Atallos de teclado", "language": "Lingua", - "language_setting_description": "Seleccione a túa lingua preferida", + "language_no_results_subtitle": "Probe axustar o seu termo de busca", + "language_no_results_title": "Non se atopou ningunha lingua", + "language_search_hint": "Buscar linguas...", + "language_setting_description": "Seleccione a súa lingua preferida", + "large_files": "Ficheiros Grandes", + "last": "Último/a", "last_seen": "Visto por última vez", "latest_version": "Última Versión", + "latitude": "Latitude", "leave": "Saír", + "leave_album": "Deixar o álbum", "lens_model": "Modelo da lente", "let_others_respond": "Permitir que outros respondan", "level": "Nivel", @@ -1098,7 +1224,9 @@ "library_page_sort_created": "Data de creación", "library_page_sort_last_modified": "Última modificación", "library_page_sort_title": "Título do álbum", + "licenses": "Licenzas", "light": "Claro", + "like": "Gústame", "like_deleted": "Gústame eliminado", "link_motion_video": "Ligar vídeo en movemento", "link_to_oauth": "Ligar a OAuth", @@ -1106,25 +1234,33 @@ "list": "Lista", "loading": "Cargando", "loading_search_results_failed": "Erro ao cargar os resultados da busca", + "local": "Local", + "local_asset_cast_failed": "Non é posíbel proxectar un recurso que non está cargado no servidor", + "local_assets": "Recursos Locais", + "local_media_summary": "Resumo de Contido Local", "local_network": "Rede local", "local_network_sheet_info": "A aplicación conectarase ao servidor a través desta URL cando use a rede wifi especificada", - "location_permission": "Permiso de ubicación", - "location_permission_content": "Para usar a función de cambio automático, Immich necesita permiso de ubicación precisa para poder ler o nome da rede wifi actual", + "location_permission": "Permiso de localización", + "location_permission_content": "Para usar a función de cambio automático, Immich necesita permiso de localización precisa para poder ler o nome da rede wifi actual", "location_picker_choose_on_map": "Elixir no mapa", "location_picker_latitude_error": "Introducir unha latitude válida", - "location_picker_latitude_hint": "Introduza a túa latitude aquí", + "location_picker_latitude_hint": "Introduza a súa latitude aquí", "location_picker_longitude_error": "Introducir unha lonxitude válida", - "location_picker_longitude_hint": "Introduza a túa lonxitude aquí", + "location_picker_longitude_hint": "Introduza a súa lonxitude aquí", + "lock": "Bloquear", + "locked_folder": "Cartafol Bloqueado", + "log_detail_title": "Detalle do Rexistro", "log_out": "Pechar sesión", "log_out_all_devices": "Pechar Sesión en Todos os Dispositivos", + "logged_in_as": "Sesión iniciada como {user}", "logged_out_all_devices": "Pechouse sesión en todos os dispositivos", "logged_out_device": "Pechouse sesión no dispositivo", "login": "Iniciar sesión", "login_disabled": "O inicio de sesión foi desactivado", "login_form_api_exception": "Excepción da API. Por favor, comprobe a URL do servidor e inténteo de novo.", "login_form_back_button_text": "Atrás", - "login_form_email_hint": "oteuemail@email.com", - "login_form_endpoint_hint": "http://ip-do-teu-servidor:porto", + "login_form_email_hint": "oseuemail@dominio.com", + "login_form_endpoint_hint": "http://ip-do-servidor:porto", "login_form_endpoint_url": "URL do Punto Final do Servidor", "login_form_err_http": "Por favor, especifique http:// ou https://", "login_form_err_invalid_email": "Correo electrónico inválido", @@ -1133,42 +1269,44 @@ "login_form_err_trailing_whitespace": "Espazo en branco final", "login_form_failed_get_oauth_server_config": "Erro ao iniciar sesión usando OAuth, comprobe a URL do servidor", "login_form_failed_get_oauth_server_disable": "A función OAuth non está dispoñible neste servidor", - "login_form_failed_login": "Erro ao iniciar sesión, comproba a URL do servidor, correo electrónico e contrasinal", - "login_form_handshake_exception": "Houbo unha Excepción de Handshake co servidor. Activa o soporte para certificados autofirmados nas configuracións se estás a usar un certificado autofirmado.", + "login_form_failed_login": "Erro ao iniciar sesión, comprobe a URL do servidor, correo electrónico e contrasinal", + "login_form_handshake_exception": "Houbo unha Excepción de Handshake co servidor. Active o soporte para certificados autofirmados nas configuracións se está a usar un certificado autofirmado.", "login_form_password_hint": "contrasinal", "login_form_save_login": "Manter sesión iniciada", "login_form_server_empty": "Introduza unha URL do servidor.", "login_form_server_error": "Non se puido conectar co servidor.", "login_has_been_disabled": "O inicio de sesión foi desactivado.", - "login_password_changed_error": "Houbo un erro ao actualizar o teu contrasinal", + "login_password_changed_error": "Houbo un erro ao actualizar o seu contrasinal", "login_password_changed_success": "Contrasinal actualizado correctamente", - "logout_all_device_confirmation": "Estás seguro de que queres pechar sesión en todos os dispositivos?", - "logout_this_device_confirmation": "Estás seguro de que queres pechar sesión neste dispositivo?", + "logout_all_device_confirmation": "Está seguro de que quere pechar sesión en todos os dispositivos?", + "logout_this_device_confirmation": "Está seguro de que quere pechar sesión neste dispositivo?", + "logs": "Rexistros", "longitude": "Lonxitude", - "look": "Ollar", + "look": "Aspecto", "loop_videos": "Reproducir vídeos en bucle", "loop_videos_description": "Activar para reproducir automaticamente un vídeo en bucle no visor de detalles.", "main_branch_warning": "Está a usar unha versión de desenvolvemento; recomendamos encarecidamente usar unha versión de lanzamento!", "main_menu": "Menú principal", "make": "Marca", + "manage_geolocation": "Xestionar a localización", "manage_shared_links": "Xestionar ligazóns compartidas", "manage_sharing_with_partners": "Xestionar compartición con compañeiros/as", "manage_the_app_settings": "Xestionar a configuración da aplicación", - "manage_your_account": "Xestionar a túa conta", - "manage_your_api_keys": "Xestionar as túas claves API", - "manage_your_devices": "Xestionar os teus dispositivos con sesión iniciada", - "manage_your_oauth_connection": "Xestionar a túa conexión OAuth", + "manage_your_account": "Xestionar a súa conta", + "manage_your_api_keys": "Xestionar as súas claves API", + "manage_your_devices": "Xestionar os seus dispositivos con sesión iniciada", + "manage_your_oauth_connection": "Xestionar a súa conexión OAuth", "map": "Mapa", - "map_assets_in_bounds": "{count} fotos", - "map_cannot_get_user_location": "Non se pode obter a ubicación do usuario", + "map_assets_in_bounds": "{count, plural, =0 {Sen fotos nesta área} one {# foto} other {# fotos}}", + "map_cannot_get_user_location": "Non se pode obter a localización do usuario", "map_location_dialog_yes": "Si", - "map_location_picker_page_use_location": "Usar esta ubicación", - "map_location_service_disabled_content": "O servizo de ubicación debe estar activado para mostrar activos da túa ubicación actual. Queres activalo agora?", - "map_location_service_disabled_title": "Servizo de ubicación deshabilitado", + "map_location_picker_page_use_location": "Usar esta localización", + "map_location_service_disabled_content": "O servizo de localización debe estar activado para mostrar activos da súa localización actual. Quere activalo agora?", + "map_location_service_disabled_title": "Servizo de localización deshabilitado", "map_marker_for_images": "Marcador de mapa para imaxes tomadas en {city}, {country}", "map_marker_with_image": "Marcador de mapa con imaxe", - "map_no_location_permission_content": "Necesítase permiso de ubicación para mostrar activos da súa ubicación actual. Queres permitilo agora?", - "map_no_location_permission_title": "Permiso de ubicación denegado", + "map_no_location_permission_content": "Necesítase permiso de localización para mostrar activos da súa localización actual. Quere permitilo agora?", + "map_no_location_permission_title": "Permiso de localización denegado", "map_settings": "Configuración do mapa", "map_settings_dark_mode": "Modo escuro", "map_settings_date_range_option_day": "Últimas 24 horas", @@ -1180,40 +1318,54 @@ "map_settings_include_show_partners": "Incluír Compañeiros/as", "map_settings_only_show_favorites": "Mostrar Só Favoritos", "map_settings_theme_settings": "Tema do Mapa", - "map_zoom_to_see_photos": "Alonxe o zoom para ver fotos", + "map_zoom_to_see_photos": "Afaste o zoom para ver fotos", "mark_all_as_read": "Marcar todo como lido", "mark_as_read": "Marcar como lido", "marked_all_as_read": "Marcado todo como lido", "matches": "Coincidencias", + "matching_assets": "Recursos Correspondentes", "media_type": "Tipo de medio", "memories": "Recordos", "memories_all_caught_up": "Todo ao día", "memories_check_back_tomorrow": "Volva mañá para máis recordos", - "memories_setting_description": "Xestionar o que ves nos teus recordos", + "memories_setting_description": "Xestionar o que ve nos seus recordos", "memories_start_over": "Comezar de novo", - "memories_swipe_to_close": "Deslizar cara arriba para pechar", + "memories_swipe_to_close": "Deslice cara arriba para pechar", "memory": "Recordo", - "memory_lane_title": "Camiño dos Recordos {title}", + "memory_lane_title": "Camiño dos Recordos: {title}", "menu": "Menú", "merge": "Fusionar", "merge_people": "Fusionar persoas", "merge_people_limit": "Só pode fusionar ata 5 caras á vez", - "merge_people_prompt": "Queres fusionar estas persoas? Esta acción é irreversible.", + "merge_people_prompt": "Quere fusionar estas persoas? Esta acción é irreversible.", "merge_people_successfully": "Persoas fusionadas correctamente", "merged_people_count": "Fusionadas {count, plural, one {# persoa} other {# persoas}}", "minimize": "Minimizar", "minute": "Minuto", + "minutes": "Minutos", "missing": "Faltantes", "model": "Modelo", "month": "Mes", + "monthly_title_text_date_format": "MMMM a", "more": "Máis", + "move": "Mover", + "move_off_locked_folder": "Mover fóra do cartafol bloqueado", + "move_to_lock_folder_action_prompt": "{count} engadido/a ao cartafol bloqueado", + "move_to_locked_folder": "Mover ao cartafol bloqueado", + "move_to_locked_folder_confirmation": "Estas fotos e vídeo eliminaranse de todos os álbums e só serán visíbeis dende o cartafol bloqueado", + "moved_to_archive": "Moveuse {count, plural, one {# recurso} other {# recursos}} ao arquivo", + "moved_to_library": "Moveuse {count, plural, one {# recurso} other {# recursos}} á biblioteca", "moved_to_trash": "Movido ao lixo", "multiselect_grid_edit_date_time_err_read_only": "Non se pode editar a data de activo(s) de só lectura, omitindo", - "multiselect_grid_edit_gps_err_read_only": "Non se pode editar a ubicación de activo(s) de só lectura, omitindo", + "multiselect_grid_edit_gps_err_read_only": "Non se pode editar a localización de activo(s) de só lectura, omitindo", "mute_memories": "Silenciar Recordos", "my_albums": "Os meus álbums", "name": "Nome", "name_or_nickname": "Nome ou alcume", + "network_requirement_photos_upload": "Usar datos móbiles para facer copia de seguridade das fotos", + "network_requirement_videos_upload": "Usar datos móbiles para facer copia de seguridade dos vídeos", + "network_requirements": "Requisitos de rede", + "network_requirements_updated": "Os requisitos de rede cambiaron, reiniciando cola de copia de seguridade", "networking_settings": "Rede", "networking_subtitle": "Xestionar a configuración do punto final do servidor", "never": "Nunca", @@ -1221,29 +1373,34 @@ "new_api_key": "Nova Chave API", "new_password": "Novo contrasinal", "new_person": "Nova persoa", + "new_pin_code": "Novo código PIN", + "new_pin_code_subtitle": "Esta é a túa primeira vez accedendo á carpeta segura. Crea un código PIN para acceder de maneira segura a esta páxina", + "new_timeline": "Nova liña de tempo", "new_user_created": "Novo usuario creado", "new_version_available": "NOVA VERSIÓN DISPOÑIBLE", "newest_first": "Máis recentes primeiro", "next": "Seguinte", "next_memory": "Seguinte recordo", "no": "Non", - "no_albums_message": "Crea un álbum para organizar as túas fotos e vídeos", - "no_albums_with_name_yet": "Parece que aínda non tes ningún álbum con este nome.", - "no_albums_yet": "Parece que aínda non tes ningún álbum.", - "no_archived_assets_message": "Arquiva fotos e vídeos para ocultalos da túa vista de Fotos", + "no_albums_message": "Cree un álbum para organizar as súas fotos e vídeos", + "no_albums_with_name_yet": "Parece que aínda non ten ningún álbum con este nome.", + "no_albums_yet": "Parece que aínda non ten ningún álbum.", + "no_archived_assets_message": "Arquive fotos e vídeos para ocultalos da súa vista de Fotos", "no_assets_message": "PREMA PARA CARGAR A SÚA PRIMEIRA FOTO", "no_assets_to_show": "Non hai activos para mostrar", + "no_cast_devices_found": "Non se atoparon dispositivos de transmisión", "no_duplicates_found": "Non se atoparon duplicados.", - "no_exif_info_available": "Non hai información exif dispoñible", - "no_explore_results_message": "Suba máis fotos para explorar a túa colección.", - "no_favorites_message": "Engade favoritos para atopar rapidamente as túas mellores fotos e vídeos", - "no_libraries_message": "Crea unha biblioteca externa para ver as túas fotos e vídeos", + "no_exif_info_available": "Non hai información EXIF dispoñible", + "no_explore_results_message": "Suba máis fotos para explorar a súa colección.", + "no_favorites_message": "Engada favoritos para atopar rapidamente as súas mellores fotos e vídeos", + "no_libraries_message": "Cree unha biblioteca externa para ver as súas fotos e vídeos", + "no_local_assets_found": "Non se atoparon elementos locais con esta suma de comprobación", "no_name": "Sen Nome", "no_notifications": "Sen notificacións", "no_places": "Sen lugares", "no_results": "Sen resultados", - "no_results_description": "Proba cun sinónimo ou palabra chave máis xeral", - "no_shared_albums_message": "Crea un álbum para compartir fotos e vídeos con persoas na túa rede", + "no_results_description": "Probe cun sinónimo ou palabra chave máis xeral", + "no_shared_albums_message": "Cree un álbum para compartir fotos e vídeos con persoas na súa rede", "not_in_any_album": "Non está en ningún álbum", "not_selected": "Non seleccionado", "note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar a Etiqueta de Almacenamento a activos cargados previamente, execute o", @@ -1260,9 +1417,9 @@ "ok": "Aceptar", "oldest_first": "Máis antigos primeiro", "on_this_device": "Neste dispositivo", - "onboarding": "Incorporación", + "onboarding": "Primeiros pasos", "onboarding_privacy_description": "As seguintes funcións (opcionais) dependen de servizos externos e poden desactivarse en calquera momento na configuración da administración.", - "onboarding_theme_description": "Elixe un tema de cor para a túa instancia. Podes cambialo máis tarde na túa configuración.", + "onboarding_theme_description": "Elixa un tema de cor para a súa instancia. Pode cambialo máis tarde na súa configuración.", "onboarding_welcome_user": "Benvido/a, {user}", "online": "En liña", "only_favorites": "Só favoritos", @@ -1272,7 +1429,7 @@ "open_the_search_filters": "Abrir os filtros de busca", "options": "Opcións", "or": "ou", - "organize_your_library": "Organizar a túa biblioteca", + "organize_your_library": "Organizar a súa biblioteca", "original": "orixinal", "other": "Outro", "other_devices": "Outros dispositivos", @@ -1281,8 +1438,8 @@ "owner": "Propietario", "partner": "Compañeiro/a", "partner_can_access": "{partner} pode acceder a", - "partner_can_access_assets": "Todas as túas fotos e vídeos excepto os de Arquivo e Eliminados", - "partner_can_access_location": "A ubicación onde se tomaron as túas fotos", + "partner_can_access_assets": "Todas as súas fotos e vídeos excepto os de Arquivo e Eliminados", + "partner_can_access_location": "A localización onde se tomaron as súas fotos", "partner_list_user_photos": "Fotos de {user}", "partner_list_view_all": "Ver todo", "partner_page_empty_message": "As súas fotos aínda non están compartidas con ningún compañeiro/a.", @@ -1290,7 +1447,7 @@ "partner_page_partner_add_failed": "Erro ao engadir compañeiro/a", "partner_page_select_partner": "Seleccionar compañeiro/a", "partner_page_shared_to_title": "Compartido con", - "partner_page_stop_sharing_content": "{partner} xa non poderá acceder ás túas fotos.", + "partner_page_stop_sharing_content": "{partner} xa non poderá acceder ás súas fotos.", "partner_sharing": "Compartición con Compañeiro/a", "partners": "Compañeiros/as", "password": "Contrasinal", @@ -1303,7 +1460,7 @@ "years": "Últimos {years, plural, one {ano} other {# anos}}" }, "path": "Ruta", - "pattern": "Padrón", + "pattern": "Patrón", "pause": "Pausa", "pause_memories": "Pausar recordos", "paused": "Pausado", @@ -1316,7 +1473,7 @@ "permanent_deletion_warning_setting_description": "Mostrar un aviso ao eliminar permanentemente activos", "permanently_delete": "Eliminar permanentemente", "permanently_delete_assets_count": "Eliminar permanentemente {count, plural, one {activo} other {activos}}", - "permanently_delete_assets_prompt": "Estás seguro de que queres eliminar permanentemente {count, plural, one {este activo?} other {estes # activos?}} Isto tamén {count, plural, one {o eliminará do teu} other {os eliminará dos teus}} álbum(s).", + "permanently_delete_assets_prompt": "Está seguro de que quere eliminar permanentemente {count, plural, one {este activo?} other {estes # activos?}} Isto tamén {count, plural, one {o eliminará do seu} other {os eliminará dos seus}} álbum(s).", "permanently_deleted_asset": "Activo eliminado permanentemente", "permanently_deleted_assets_count": "Eliminados permanentemente {count, plural, one {# activo} other {# activos}}", "permission_onboarding_back": "Atrás", @@ -1325,17 +1482,17 @@ "permission_onboarding_go_to_settings": "Ir a axustes", "permission_onboarding_permission_denied": "Permiso denegado. Para usar Immich, conceda permisos de fotos e vídeos en Axustes.", "permission_onboarding_permission_granted": "Permiso concedido! Xa está todo listo.", - "permission_onboarding_permission_limited": "Permiso limitado. Para permitir que Immich faga copia de seguridade e xestione toda a túa colección da galería, conceda permisos de fotos e vídeos en Configuración.", - "permission_onboarding_request": "Immich require permiso para ver as túas fotos e vídeos.", + "permission_onboarding_permission_limited": "Permiso limitado. Para permitir que Immich faga copia de seguridade e xestione toda a súa colección da galería, conceda permisos de fotos e vídeos en Configuración.", + "permission_onboarding_request": "Immich require permiso para ver as súas fotos e vídeos.", "person": "Persoa", "person_birthdate": "Nacido/a o {date}", "person_hidden": "{name}{hidden, select, true { (oculto)} other {}}", - "photo_shared_all_users": "Parece que compartiches as túas fotos con todos os usuarios ou non tes ningún usuario co que compartir.", + "photo_shared_all_users": "Parece que compartiu as súas fotos con todos os usuarios ou non ten ningún usuario co que compartir.", "photos": "Fotos", "photos_and_videos": "Fotos e Vídeos", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}", "photos_from_previous_years": "Fotos de anos anteriores", - "pick_a_location": "Elixir unha ubicación", + "pick_a_location": "Elixir unha localización", "place": "Lugar", "places": "Lugares", "places_count": "{count, plural, one {{count, number} Lugar} other {{count, number} Lugares}}", @@ -1368,28 +1525,28 @@ "purchase_activated_time": "Activado o {date}", "purchase_activated_title": "A súa chave activouse correctamente", "purchase_button_activate": "Activar", - "purchase_button_buy": "Comprar", - "purchase_button_buy_immich": "Comprar Immich", + "purchase_button_buy": "Apoiar", + "purchase_button_buy_immich": "Apoiar Immich", "purchase_button_never_show_again": "Non mostrar nunca máis", "purchase_button_reminder": "Lembrarme en 30 días", "purchase_button_remove_key": "Eliminar chave", "purchase_button_select": "Seleccionar", - "purchase_failed_activation": "Erro ao activar! Por favor, comproba o teu correo electrónico para a chave do produto correcta!", + "purchase_failed_activation": "Erro ao activar! Por favor, comprobe o seu correo electrónico para a chave do produto correcta!", "purchase_individual_description_1": "Para un individuo", "purchase_individual_description_2": "Estado de seguidor/a", "purchase_input_suggestion": "Ten unha chave de produto? Introduza a chave a continuación", - "purchase_license_subtitle": "Compre Immich para apoiar o desenvolvemento continuado do servizo", - "purchase_lifetime_description": "Compra vitalicia", - "purchase_option_title": "OPCIÓNS DE COMPRA", + "purchase_license_subtitle": "Apoie Immich para contribuír ao desenvolvemento continuado do servizo", + "purchase_lifetime_description": "Contribución vitalicia", + "purchase_option_title": "OPCIÓNS DE APOIO", "purchase_panel_info_1": "Construír Immich leva moito tempo e esforzo, e temos enxeñeiros a tempo completo traballando nel para facelo o mellor posible. A nosa misión é que o software de código aberto e as prácticas comerciais éticas se convertan nunha fonte de ingresos sostible para os desenvolvedores e crear un ecosistema respectuoso coa privacidade con alternativas reais aos servizos na nube explotadores.", - "purchase_panel_info_2": "Como estamos comprometidos a non engadir muros de pago, esta compra non che outorgará ningunha función adicional en Immich. Dependemos de usuarios coma ti para apoiar o desenvolvemento continuo de Immich.", + "purchase_panel_info_2": "Como estamos comprometidos a non engadir muros de pago, esta contribución non lle outorgará ningunha función adicional en Immich. Dependemos de usuarios coma vostede para apoiar o desenvolvemento continuo de Immich.", "purchase_panel_title": "Apoiar o proxecto", "purchase_per_server": "Por servidor", "purchase_per_user": "Por usuario", "purchase_remove_product_key": "Eliminar Chave do Produto", - "purchase_remove_product_key_prompt": "Estás seguro de que queres eliminar a chave do produto?", + "purchase_remove_product_key_prompt": "Está seguro de que quere eliminar a chave do produto?", "purchase_remove_server_product_key": "Eliminar chave do produto do Servidor", - "purchase_remove_server_product_key_prompt": "Estás seguro de que queres eliminar a chave do produto do Servidor?", + "purchase_remove_server_product_key_prompt": "Está seguro de que quere eliminar a chave do produto do Servidor?", "purchase_server_description_1": "Para todo o servidor", "purchase_server_description_2": "Estado de seguidor/a", "purchase_server_title": "Servidor", @@ -1409,8 +1566,8 @@ "recent_searches": "Buscas recentes", "recently_added": "Engadido recentemente", "recently_added_page_title": "Engadido Recentemente", - "recently_taken": "Recentemente tomado", - "recently_taken_page_title": "Recentemente Tomado", + "recently_taken": "Tomado recentemente", + "recently_taken_page_title": "Tomado Recentemente", "refresh": "Actualizar", "refresh_encoded_videos": "Actualizar vídeos codificados", "refresh_faces": "Actualizar caras", @@ -1423,8 +1580,8 @@ "refreshing_metadata": "Actualizando metadatos", "regenerating_thumbnails": "Rexenerando miniaturas", "remove": "Eliminar", - "remove_assets_album_confirmation": "Estás seguro de que queres eliminar {count, plural, one {# activo} other {# activos}} do álbum?", - "remove_assets_shared_link_confirmation": "Estás seguro de que queres eliminar {count, plural, one {# activo} other {# activos}} desta ligazón compartida?", + "remove_assets_album_confirmation": "Está seguro de que quere eliminar {count, plural, one {# activo} other {# activos}} do álbum?", + "remove_assets_shared_link_confirmation": "Está seguro de que quere eliminar {count, plural, one {# activo} other {# activos}} desta ligazón compartida?", "remove_assets_title": "Eliminar activos?", "remove_custom_date_range": "Eliminar rango de datas personalizado", "remove_deleted_assets": "Eliminar Activos Eliminados", @@ -1470,7 +1627,7 @@ "saved_api_key": "Chave API gardada", "saved_profile": "Perfil gardado", "saved_settings": "Configuración gardada", - "say_something": "Dicir algo", + "say_something": "Dicir algo...", "scaffold_body_error_occurred": "Ocorreu un erro", "scan_all_libraries": "Escanear Todas as Bibliotecas", "scan_library": "Escanear", @@ -1495,8 +1652,8 @@ "search_filter_display_option_not_in_album": "Non nun álbum", "search_filter_display_options": "Opcións de Visualización", "search_filter_filename": "Buscar por nome de ficheiro", - "search_filter_location": "Ubicación", - "search_filter_location_title": "Seleccionar ubicación", + "search_filter_location": "Localización", + "search_filter_location_title": "Seleccionar localización", "search_filter_media_type": "Tipo de Medio", "search_filter_media_type_title": "Seleccionar tipo de medio", "search_filter_people_title": "Seleccionar persoas", @@ -1512,11 +1669,11 @@ "search_page_no_objects": "Non hai Información de Obxectos Dispoñible", "search_page_no_places": "Non hai Información de Lugares Dispoñible", "search_page_screenshots": "Capturas de pantalla", - "search_page_search_photos_videos": "Busca as túas fotos e vídeos", + "search_page_search_photos_videos": "Busca as súas fotos e vídeos", "search_page_things": "Cousas", "search_page_view_all_button": "Ver todo", - "search_page_your_activity": "A túa actividade", - "search_page_your_map": "O teu Mapa", + "search_page_your_activity": "A súa actividade", + "search_page_your_map": "O seu Mapa", "search_people": "Buscar persoas", "search_places": "Buscar lugares", "search_rating": "Buscar por clasificación...", @@ -1524,11 +1681,11 @@ "search_settings": "Configuración da busca", "search_state": "Buscar estado...", "search_suggestion_list_smart_search_hint_1": "A busca intelixente está activada por defecto, para buscar metadatos use a sintaxe ", - "search_suggestion_list_smart_search_hint_2": "m:o-teu-termo-de-busca", + "search_suggestion_list_smart_search_hint_2": "m:o-seu-termo-de-busca", "search_tags": "Buscar etiquetas...", "search_timezone": "Buscar fuso horario...", "search_type": "Tipo de busca", - "search_your_photos": "Buscar as túas fotos", + "search_your_photos": "Buscar as súas fotos", "searching_locales": "Buscando configuracións rexionais...", "second": "Segundo", "see_all_people": "Ver todas as persoas", @@ -1564,7 +1721,7 @@ "set_date_of_birth": "Establecer data de nacemento", "set_profile_picture": "Establecer imaxe de perfil", "set_slideshow_to_fullscreen": "Poñer Presentación a pantalla completa", - "setting_image_viewer_help": "O visor de detalles carga primeiro a miniatura pequena, despois carga a vista previa de tamaño medio (se está activada), finalmente carga o orixinal (se está activado).", + "setting_image_viewer_help": "O visor de detalles carga primeiro a miniatura pequena, despois carga a vista previa de tamaño medio (se está activada), e finalmente carga o orixinal (se está activado).", "setting_image_viewer_original_subtitle": "Activar para cargar a imaxe orixinal a resolución completa (grande!). Desactivar para reducir o uso de datos (tanto na rede como na caché do dispositivo).", "setting_image_viewer_original_title": "Cargar imaxe orixinal", "setting_image_viewer_preview_subtitle": "Activar para cargar unha imaxe de resolución media. Desactivar para cargar directamente o orixinal ou usar só a miniatura.", @@ -1580,11 +1737,11 @@ "setting_notifications_notify_seconds": "{count} segundos", "setting_notifications_single_progress_subtitle": "Información detallada do progreso da carga por activo", "setting_notifications_single_progress_title": "Mostrar progreso detallado da copia de seguridade en segundo plano", - "setting_notifications_subtitle": "Axustar as túas preferencias de notificación", + "setting_notifications_subtitle": "Axustar as súas preferencias de notificación", "setting_notifications_total_progress_subtitle": "Progreso xeral da carga (feitos/total activos)", "setting_notifications_total_progress_title": "Mostrar progreso total da copia de seguridade en segundo plano", "setting_video_viewer_looping_title": "Bucle", - "setting_video_viewer_original_video_subtitle": "Ao transmitir un vídeo desde o servidor, reproducir o orixinal aínda que haxa unha transcodificación dispoñible. Pode provocar buffering. Os vídeos dispoñibles localmente repródúcense en calidade orixinal independentemente desta configuración.", + "setting_video_viewer_original_video_subtitle": "Ao transmitir un vídeo desde o servidor, reproducir o orixinal aínda que haxa unha transcodificación dispoñible. Pode provocar buffering. Os vídeos dispoñibles localmente reprodúcense en calidade orixinal independentemente desta configuración.", "setting_video_viewer_original_video_title": "Forzar vídeo orixinal", "settings": "Configuración", "settings_require_restart": "Por favor, reinicie Immich para aplicar esta configuración", @@ -1595,7 +1752,7 @@ "share_dialog_preparing": "Preparando...", "shared": "Compartido", "shared_album_activities_input_disable": "O comentario está desactivado", - "shared_album_activity_remove_content": "Queres eliminar esta actividade?", + "shared_album_activity_remove_content": "Quere eliminar esta actividade?", "shared_album_activity_remove_title": "Eliminar Actividade", "shared_album_section_people_action_error": "Erro ao saír/eliminar do álbum", "shared_album_section_people_action_leave": "Eliminar usuario do álbum", @@ -1603,7 +1760,7 @@ "shared_album_section_people_title": "PERSOAS", "shared_by": "Compartido por", "shared_by_user": "Compartido por {user}", - "shared_by_you": "Compartido por ti", + "shared_by_you": "Compartido por vostede", "shared_from_partner": "Fotos de {partner}", "shared_intent_upload_button_progress_text": "{current} / {total} Subidos", "shared_link_app_bar_title": "Ligazóns Compartidas", @@ -1621,14 +1778,14 @@ "shared_link_edit_expire_after_option_year": "{count} ano", "shared_link_edit_password_hint": "Introduza o contrasinal da compartición", "shared_link_edit_submit_button": "Actualizar ligazón", - "shared_link_error_server_url_fetch": "Non se pode obter a url do servidor", + "shared_link_error_server_url_fetch": "Non se pode obter a URL do servidor", "shared_link_expires_day": "Caduca en {count} día", "shared_link_expires_days": "Caduca en {count} días", "shared_link_expires_hour": "Caduca en {count} hora", "shared_link_expires_hours": "Caduca en {count} horas", "shared_link_expires_minute": "Caduca en {count} minuto", "shared_link_expires_minutes": "Caduca en {count} minutos", - "shared_link_expires_never": "Caduca ∞", + "shared_link_expires_never": "Non caduca", "shared_link_expires_second": "Caduca en {count} segundo", "shared_link_expires_seconds": "Caduca en {count} segundos", "shared_link_individual_shared": "Compartido individualmente", @@ -1642,7 +1799,7 @@ "sharing": "Compartir", "sharing_enter_password": "Por favor, introduza o contrasinal para ver esta páxina.", "sharing_page_album": "Álbums compartidos", - "sharing_page_description": "Crea álbums compartidos para compartir fotos e vídeos con persoas na túa rede.", + "sharing_page_description": "Cree álbums compartidos para compartir fotos e vídeos con persoas na súa rede.", "sharing_page_empty_list": "LISTA BALEIRA", "sharing_sidebar_description": "Mostrar unha ligazón a Compartir na barra lateral", "sharing_silver_appbar_create_shared_album": "Novo álbum compartido", @@ -1652,11 +1809,11 @@ "show_albums": "Mostrar álbums", "show_all_people": "Mostrar todas as persoas", "show_and_hide_people": "Mostrar e ocultar persoas", - "show_file_location": "Mostrar ubicación do ficheiro", + "show_file_location": "Mostrar localización do ficheiro", "show_gallery": "Mostrar galería", "show_hidden_people": "Mostrar persoas ocultas", "show_in_timeline": "Mostrar na liña de tempo", - "show_in_timeline_setting_description": "Mostrar fotos e vídeos deste usuario na túa liña de tempo", + "show_in_timeline_setting_description": "Mostrar fotos e vídeos deste usuario na súa liña de tempo", "show_keyboard_shortcuts": "Mostrar atallos de teclado", "show_metadata": "Mostrar metadatos", "show_or_hide_info": "Mostrar ou ocultar información", @@ -1699,10 +1856,10 @@ "state": "Estado", "status": "Estado", "stop_motion_photo": "Deter Foto en Movemento", - "stop_photo_sharing": "Deixar de compartir as túas fotos?", - "stop_photo_sharing_description": "{partner} xa non poderá acceder ás túas fotos.", - "stop_sharing_photos_with_user": "Deixar de compartir as túas fotos con este usuario", - "storage": "Espazo de almacenamento", + "stop_photo_sharing": "Deixar de compartir as súas fotos?", + "stop_photo_sharing_description": "{partner} xa non poderá acceder ás súas fotos.", + "stop_sharing_photos_with_user": "Deixar de compartir as súas fotos con este usuario", + "storage": "Almacenamento", "storage_label": "Etiqueta de almacenamento", "storage_usage": "{used} de {available} usado", "submit": "Enviar", @@ -1710,12 +1867,12 @@ "sunrise_on_the_beach": "Amencer na praia", "support": "Soporte", "support_and_feedback": "Soporte e Comentarios", - "support_third_party_description": "A túa instalación de Immich foi empaquetada por un terceiro. Os problemas que experimente poden ser causados por ese paquete, así que por favor, comunica os problemas con eles en primeira instancia usando as ligazóns a continuación.", + "support_third_party_description": "A súa instalación de Immich foi empaquetada por un terceiro. Os problemas que experimente poden ser causados por ese paquete, así que por favor, comunique os problemas con eles en primeira instancia usando as ligazóns a continuación.", "swap_merge_direction": "Intercambiar dirección de fusión", "sync": "Sincronizar", "sync_albums": "Sincronizar álbums", "sync_albums_manual_subtitle": "Sincronizar todos os vídeos e fotos cargados aos álbums de copia de seguridade seleccionados", - "sync_upload_album_setting_subtitle": "Crear e suba as túas fotos e vídeos aos álbums seleccionados en Immich", + "sync_upload_album_setting_subtitle": "Crear e subir as súas fotos e vídeos aos álbums seleccionados en Immich", "tag": "Etiqueta", "tag_assets": "Etiquetar activos", "tag_created": "Etiqueta creada: {tag}", @@ -1728,8 +1885,8 @@ "template": "Modelo", "theme": "Tema", "theme_selection": "Selección de tema", - "theme_selection_description": "Establecer automaticamente o tema a claro ou escuro baseándose na preferencia do sistema do teu navegador", - "theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de almacenamento nas tellas de activos", + "theme_selection_description": "Establecer automaticamente o tema a claro ou escuro baseándose na preferencia do sistema do seu navegador", + "theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de almacenamento nas celas de activos", "theme_setting_asset_list_tiles_per_row_title": "Número de activos por fila ({count})", "theme_setting_colorful_interface_subtitle": "Aplicar cor primaria ás superficies de fondo.", "theme_setting_colorful_interface_title": "Interface colorida", @@ -1757,12 +1914,12 @@ "total_usage": "Uso total", "trash": "Lixo", "trash_all": "Mover Todo ao Lixo", - "trash_count": "Lixo {count, number}", + "trash_count": "Lixo ({count, number})", "trash_delete_asset": "Mover ao Lixo/Eliminar Activo", "trash_emptied": "Lixo baleirado", "trash_no_results_message": "As fotos e vídeos movidos ao lixo aparecerán aquí.", "trash_page_delete_all": "Eliminar Todo", - "trash_page_empty_trash_dialog_content": "Queres baleirar os teus activos no lixo? Estes elementos eliminaranse permanentemente de Immich", + "trash_page_empty_trash_dialog_content": "Quere baleirar os seus activos no lixo? Estes elementos eliminaranse permanentemente de Immich", "trash_page_info": "Os elementos no lixo eliminaranse permanentemente despois de {days} días", "trash_page_no_assets": "Non hai activos no lixo", "trash_page_restore_all": "Restaurar Todo", @@ -1783,8 +1940,8 @@ "unlinked_oauth_account": "Conta OAuth desvinculada", "unmute_memories": "Desilenciar Recordos", "unnamed_album": "Álbum Sen Nome", - "unnamed_album_delete_confirmation": "Estás seguro de que queres eliminar este álbum?", - "unnamed_share": "Compartir Sen Nome", + "unnamed_album_delete_confirmation": "Está seguro de que quere eliminar este álbum?", + "unnamed_share": "Compartición Sen Nome", "unsaved_change": "Cambio sen gardar", "unselect_all": "Deseleccionar todo", "unselect_all_duplicates": "Deseleccionar todos os duplicados", @@ -1794,25 +1951,29 @@ "updated_password": "Contrasinal actualizado", "upload": "Subir", "upload_concurrency": "Concorrencia de subida", - "upload_dialog_info": "Queres facer copia de seguridade do(s) Activo(s) seleccionado(s) no servidor?", + "upload_dialog_info": "Quere facer copia de seguridade do(s) Activo(s) seleccionado(s) no servidor?", "upload_dialog_title": "Subir Activo", - "upload_errors": "Subida completada con {count, plural, one {# erro} other {# erros}}, actualice a páxina para ver os novos activos subidos.", + "upload_errors": "Subida completada con {count, plural, one {# erro} other {# erros}}. Actualice a páxina para ver os novos activos subidos.", "upload_progress": "Restantes {remaining, number} - Procesados {processed, number}/{total, number}", "upload_skipped_duplicates": "Omitidos {count, plural, one {# activo duplicado} other {# activos duplicados}}", "upload_status_duplicates": "Duplicados", "upload_status_errors": "Erros", "upload_status_uploaded": "Subido", - "upload_success": "Subida exitosa, actualice a páxina para ver os novos activos subidos.", + "upload_success": "Subida exitosa. Actualice a páxina para ver os novos activos subidos.", "upload_to_immich": "Subir a Immich ({count})", "uploading": "Subindo", "usage": "Uso", "use_current_connection": "usar conexión actual", "use_custom_date_range": "Usar rango de datas personalizado no seu lugar", "user": "Usuario", + "user_has_been_deleted": "Este usuario foi eliminado.", "user_id": "ID de Usuario", "user_liked": "A {user} gustoulle {type, select, photo {esta foto} video {este vídeo} asset {este activo} other {isto}}", - "user_purchase_settings": "Compra", - "user_purchase_settings_description": "Xestionar a túa compra", + "user_pin_code_settings": "Código PIN", + "user_pin_code_settings_description": "Xestionar seu código PIN", + "user_privacy": "Privacidade do usuario", + "user_purchase_settings": "Contribución", + "user_purchase_settings_description": "Xestionar a súa contribución", "user_role_set": "Establecer {user} como {role}", "user_usage_detail": "Detalle de uso do usuario", "user_usage_stats": "Estatísticas de uso da conta", @@ -1822,9 +1983,10 @@ "utilities": "Utilidades", "validate": "Validar", "validate_endpoint_error": "Por favor, introduza unha URL válida", + "variables": "Variables", "version": "Versión", "version_announcement_closing": "O seu amigo, Alex", - "version_announcement_message": "Ola! Unha nova versión de Immich está dispoñible. Por favor, toma un tempo para ler as notas de lanzamento para asegurarse de que a túa configuración está actualizada para evitar calquera configuración incorrecta, especialmente se usas WatchTower ou calquera mecanismo que xestione a actualización automática da túa instancia de Immich.", + "version_announcement_message": "Ola! Unha nova versión de Immich está dispoñible. Por favor, tome un tempo para ler as notas de lanzamento para asegurarse de que a súa configuración está actualizada para evitar calquera configuración incorrecta, especialmente se usa WatchTower ou calquera mecanismo que xestione a actualización automática da súa instancia de Immich.", "version_history": "Historial de Versións", "version_history_item": "Instalado {version} o {date}", "video": "Vídeo", @@ -1836,6 +1998,7 @@ "view_album": "Ver Álbum", "view_all": "Ver Todo", "view_all_users": "Ver todos os usuarios", + "view_details": "Ver detalles", "view_in_timeline": "Ver na liña de tempo", "view_link": "Ver ligazón", "view_links": "Ver ligazóns", @@ -1857,7 +2020,7 @@ "year": "Ano", "years_ago": "Hai {years, plural, one {# ano} other {# anos}}", "yes": "Si", - "you_dont_have_any_shared_links": "Non tes ningunha ligazón compartida", - "your_wifi_name": "O nome da túa wifi", + "you_dont_have_any_shared_links": "Non ten ningunha ligazón compartida", + "your_wifi_name": "O nome da súa wifi", "zoom_image": "Ampliar Imaxe" } diff --git a/i18n/he.json b/i18n/he.json index 8138679cdd..458062832f 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -15,7 +15,7 @@ "add_a_name": "הוספת שם", "add_a_title": "הוספת כותרת", "add_birthday": "הוספת יום הולדת", - "add_endpoint": "הוסף נקודת קצה", + "add_endpoint": "הוסף כתובת URL", "add_exclusion_pattern": "הוספת דפוס החרגה", "add_import_path": "הוספת נתיב יבוא", "add_location": "הוספת מיקום", @@ -404,7 +404,7 @@ "advanced_settings_proxy_headers_title": "כותרות פרוקסי", "advanced_settings_readonly_mode_subtitle": "מאפשר את מצב לקריאה בלבד בו התמונות ניתנות לצפייה בלבד, דברים כמו בחירת תמונות מרובות, שיתוף, שידור, מחיקה הם כולם מושבתים. אפשר/השבת מצב לקריאה בלבד באמצעות יצגן המשתמש מהמסך הראשי", "advanced_settings_readonly_mode_title": "מצב לקריאה בלבד", - "advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור נקודת הקצה של השרת. דרוש עבור תעודות בחתימה עצמית.", + "advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור כתובת URL של השרת. דרוש עבור תעודות בחתימה עצמית.", "advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית", "advanced_settings_sync_remote_deletions_subtitle": "מחק או שחזר תמונה במכשיר זה באופן אוטומטי כאשר פעולה זו נעשית בדפדפן", "advanced_settings_sync_remote_deletions_title": "סנכרן מחיקות שבוצעו במכשירים אחרים [נסיוני]", @@ -592,7 +592,7 @@ "backup_controller_page_start_backup": "התחל גיבוי", "backup_controller_page_status_off": "גיבוי חזית אוטומטי כבוי", "backup_controller_page_status_on": "גיבוי חזית אוטומטי מופעל", - "backup_controller_page_storage_format": "{used}מתוך {total} בשימוש", + "backup_controller_page_storage_format": "{used} מתוך {total} בשימוש", "backup_controller_page_to_backup": "אלבומים לגבות", "backup_controller_page_total_sub": "כל התמונות והסרטונים הייחודיים מאלבומים שנבחרו", "backup_controller_page_turn_off": "כיבוי גיבוי חזית", @@ -1261,7 +1261,7 @@ "login_form_back_button_text": "חזרה", "login_form_email_hint": "yourmail@email.com", "login_form_endpoint_hint": "http://your-server-ip:port", - "login_form_endpoint_url": "כתובת נקודת קצה השרת", + "login_form_endpoint_url": "כתובת URL של השרת", "login_form_err_http": "נא לציין //:http או //:https", "login_form_err_invalid_email": "דוא\"ל שגוי", "login_form_err_invalid_url": "כתובת לא חוקית", @@ -1367,7 +1367,7 @@ "network_requirements": "דרישות רשת", "network_requirements_updated": "דרישות הרשת השתנו, תור הגיבוי אופס", "networking_settings": "רשת", - "networking_subtitle": "ניהול הגדרות נקודת קצה שרת", + "networking_subtitle": "ניהול הגדרות כתובת URL של השרת", "never": "אף פעם", "new_album": "אלבום חדש", "new_api_key": "מפתח API חדש", @@ -1770,7 +1770,7 @@ "selected_gps_coordinates": "קואורדינטות GPS שנבחרו", "send_message": "שלח הודעה", "send_welcome_email": "שלח דוא\"ל קבלת פנים", - "server_endpoint": "נקודת קצה שרת", + "server_endpoint": "כתובת URL של השרת", "server_info_box_app_version": "גרסת יישום", "server_info_box_server_url": "כתובת שרת", "server_offline": "השרת מנותק", @@ -1951,8 +1951,8 @@ "sync_albums": "סנכרן אלבומים", "sync_albums_manual_subtitle": "סנכרן את כל הסרטונים והתמונות שהועלו לאלבומי הגיבוי שנבחרו", "sync_local": "סנכרן מקומי", - "sync_remote": "סנכרן נקודת קצה מרוחקת", - "sync_status": "סנכרן מצב", + "sync_remote": "סנכרן מהשרת", + "sync_status": "סטטוס סנכרון", "sync_status_subtitle": "הצג ונהל את מערכת הסנכרון", "sync_upload_album_setting_subtitle": "צור והעלה תמונות וסרטונים שלך לאלבומים שנבחרו ביישום", "tag": "תג", @@ -2087,7 +2087,7 @@ "users_added_to_album_count": "נוספו {count, plural, one {משתמש #} other {# משתמשים}} לאלבום", "utilities": "כלים", "validate": "לאמת", - "validate_endpoint_error": "נא להזין כתובת תקנית", + "validate_endpoint_error": "נא להזין כתובת URL תקנית", "variables": "משתנים", "version": "גרסה", "version_announcement_closing": "החבר שלך, אלכס", diff --git a/i18n/hi.json b/i18n/hi.json index 385a85c2e2..aaf5bcbe7a 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -28,6 +28,7 @@ "add_to_album": "एल्बम में डालें", "add_to_album_bottom_sheet_added": "{album} में डालें", "add_to_album_bottom_sheet_already_exists": "{album} में पहले से है", + "add_to_albums": "एकाधिक एल्बम में डाले", "add_to_shared_album": "शेयर किए गए एल्बम में डालें", "add_url": "URL डालें", "added_to_archive": "संग्रहीत कर दिया गया है", diff --git a/i18n/hr.json b/i18n/hr.json index 32331976c1..4e54541c2d 100644 --- a/i18n/hr.json +++ b/i18n/hr.json @@ -15,9 +15,9 @@ "add_a_name": "Dodaj ime", "add_a_title": "Dodaj naslov", "add_birthday": "Dodaj rođendan", - "add_endpoint": "Dodaj krajnju točnu", + "add_endpoint": "Dodaj krajnju točku", "add_exclusion_pattern": "Dodaj uzorak izuzimanja", - "add_import_path": "Dodaj import folder", + "add_import_path": "Dodaj putanju uvoza", "add_location": "Dodaj lokaciju", "add_more_users": "Dodaj još korisnika", "add_partner": "Dodaj partnera", @@ -28,35 +28,37 @@ "add_to_album": "Dodaj u album", "add_to_album_bottom_sheet_added": "Dodano u {album}", "add_to_album_bottom_sheet_already_exists": "Već u {album}", + "add_to_album_bottom_sheet_some_local_assets": "Neke lokalne stavke nije moguće dodati u album", "add_to_album_toggle": "Uključi/isključi odabir za {album}", "add_to_albums": "Dodaj u albume", "add_to_albums_count": "Dodaj u albume ({count})", "add_to_shared_album": "Dodaj u dijeljeni album", + "add_upload_to_stack": "Dodaj preneseno u skup", "add_url": "Dodaj URL", "added_to_archive": "Dodano u arhivu", "added_to_favorites": "Dodano u omiljeno", "added_to_favorites_count": "Dodano {count, number} u omiljeno", "admin": { - "add_exclusion_pattern_description": "Dodajte uzorke izuzimanja. Globiranje pomoću *, ** i ? je podržano. Za ignoriranje svih datoteka u bilo kojem direktoriju pod nazivom \"Raw\", koristite \"**/Raw/**\". Da biste zanemarili sve datoteke koje završavaju na \".tif\", koristite \"**/*.tif\". Da biste zanemarili apsolutni put, koristite \"/path/to/ignore/**\".", + "add_exclusion_pattern_description": "Dodajte uzorke izuzimanja. Globiranje pomoću *, ** i ? je podržano. Za ignoriranje svih datoteka u bilo kojem direktoriju pod nazivom \"Raw\", koristite \"**/Raw/**\". Kako biste ignorirali sve datoteke koje završavaju na \".tif\", koristite \"**/*.tif\". Kako biste ignorirali apsolutnu putanju, koristite \"/putanja/za/ignoriranje/**\".", "admin_user": "Administrator", - "asset_offline_description": "Ovo sredstvo vanjske knjižnice više nije pronađeno na disku i premješteno je u smeće. Ako je datoteka premještena unutar biblioteke, provjerite svoju vremensku traku za novo odgovarajuće sredstvo. Da biste vratili ovo sredstvo, provjerite može li Immich pristupiti donjoj stazi datoteke i skenirajte biblioteku.", - "authentication_settings": "Postavke autentikacije", - "authentication_settings_description": "Uredi lozinku, OAuth, i druge postavke autentikacije", - "authentication_settings_disable_all": "Jeste li sigurni da želite onemogućenit sve načine prijave? Prijava će biti potpuno onemogućena.", - "authentication_settings_reenable": "Za ponovno uključivanje upotrijebite naredbu poslužitelja.", + "asset_offline_description": "Ova stavka vanjske biblioteke nije pronađena na disku i premještena je u smeće. Ako je datoteka premještena unutar biblioteke, provjerite svoju vremensku traku za novu odgovarajuću stavku. Da biste vratili ovu stavku, provjerite može li Immich pristupiti donjoj putanji datoteke i skenirajte biblioteku.", + "authentication_settings": "Postavke autentifikacije", + "authentication_settings_description": "Upravljajte lozinkom, OAuthom i drugim postavkama autentifikacije", + "authentication_settings_disable_all": "Jeste li sigurni da želite onemogućiti sve načine prijave? Prijava će biti potpuno onemogućena.", + "authentication_settings_reenable": "Za ponovno uključivanje upotrijebite naredbu servera.", "background_task_job": "Pozadinski zadaci", "backup_database": "Kreiraj sigurnosnu kopiju baze podataka", "backup_database_enable_description": "Omogućite sigurnosne kopije baze podataka", "backup_keep_last_amount": "Količina prethodnih sigurnosnih kopija za čuvanje", "backup_onboarding_1_description": "kopija izvan lokacije u oblaku ili na drugoj fizičkoj lokaciji.", - "backup_onboarding_2_description": "lokalne kopije na različitim uređajima. To uključuje glavne datoteke i sigurnosnu kopiju tih datoteka lokalno.", + "backup_onboarding_2_description": "lokalne kopije na različitim uređajima. To uključuje glavne datoteke i lokalnu sigurnosnu kopiju tih datoteka.", "backup_onboarding_3_description": "ukupne kopije vaših podataka, uključujući izvorne datoteke. To uključuje 1 kopiju izvan lokacije i 2 lokalne kopije.", "backup_onboarding_description": "Preporučuje se 3-2-1 strategija sigurnosnog kopiranja za zaštitu vaših podataka. Trebali biste čuvati kopije svojih prenesenih fotografija/videozapisa kao i Immich bazu podataka za sveobuhvatno rješenje sigurnosne kopije.", - "backup_onboarding_footer": "Za više informacija o sigurnosnom kopiranju Immich, molimo pogledajte dokumentaciju.", + "backup_onboarding_footer": "Za više informacija o sigurnosnom kopiranju Immicha, molimo pogledajte dokumentaciju.", "backup_onboarding_parts_title": "3-2-1 sigurnosna kopija uključuje:", "backup_onboarding_title": "Sigurnosne kopije", - "backup_settings": "Postavke sigurnosne kopije", - "backup_settings_description": "Upravljajte postavkama izvoza baze podataka.", + "backup_settings": "Postavke sigurnosne kopije baze podataka", + "backup_settings_description": "Upravljajte postavkama sigurnosne kopije baze podataka.", "cleared_jobs": "Izbrisani poslovi za: {job}", "config_set_by_file": "Konfiguracija je trenutno postavljena konfiguracijskom datotekom", "confirm_delete_library": "Jeste li sigurni da želite izbrisati biblioteku {library}?", @@ -65,23 +67,23 @@ "confirm_reprocess_all_faces": "Jeste li sigurni da želite ponovno obraditi sva lica? Ovo će također obrisati imenovane osobe.", "confirm_user_password_reset": "Jeste li sigurni da želite poništiti lozinku korisnika {user}?", "confirm_user_pin_code_reset": "Jeste li sigurni da želite resetirati PIN korisnika {user}?", - "create_job": "Izradi zadatak", - "cron_expression": "Cron izraz (expression)", + "create_job": "Stvori posao", + "cron_expression": "Cron izraz", "cron_expression_description": "Postavite interval skeniranja koristeći cron format. Za više informacija pogledajte npr. Crontab Guru", - "cron_expression_presets": "Cron unaprijed postavljene postavke izraza", + "cron_expression_presets": "Unaprijed postavljene postavke cron izraza", "disable_login": "Onemogući prijavu", - "duplicate_detection_job_description": "Pokrenite strojno učenje na materijalima kako biste otkrili slične slike. Oslanja se na Pametno Pretraživanje", - "exclusion_pattern_description": "Uzorci izuzimanja omogućuju vam da zanemarite datoteke i mape prilikom skeniranja svoje biblioteke. Ovo je korisno ako imate mape koje sadrže datoteke koje ne želite uvesti, kao što su RAW datoteke.", - "external_library_management": "Upravljanje vanjskom knjižnicom", + "duplicate_detection_job_description": "Pokrenite strojno učenje na stavkama kako biste otkrili slične slike. Oslanja se na Pametno pretraživanje", + "exclusion_pattern_description": "Uzorci izuzimanja omogućuju vam da ignorirate datoteke i mape prilikom skeniranja svoje biblioteke. Ovo je korisno ako imate mape koje sadrže datoteke koje ne želite uvesti, kao što su RAW datoteke.", + "external_library_management": "Upravljanje vanjskom bibliotekom", "face_detection": "Detekcija lica", - "face_detection_description": "Prepoznajte lica u sredstvima pomoću strojnog učenja. Za videozapise u obzir se uzima samo minijaturni prikaz. \"Sve\" (ponovno) obrađuje svu imovinu. \"Nedostaje\" stavlja u red čekanja sredstva koja još nisu obrađena. Otkrivena lica bit će stavljena u red čekanja za prepoznavanje lica nakon dovršetka prepoznavanja lica, grupirajući ih u postojeće ili nove osobe.", - "facial_recognition_job_description": "Grupirajte otkrivena lica u osobe. Ovaj se korak pokreće nakon dovršetka prepoznavanja lica. \"Sve\" (ponovno) grupira sva lica. \"Nedostajuća\" lica u redovima kojima nije dodijeljena osoba.", + "face_detection_description": "Detektirajte lica u stavkama pomoću strojnog učenja. Za videozapise se uzima u obzir samo sličica. \"Osvježi\" (ponovno) obrađuje sve stavke. \"Poništi\" dodatno briše sve trenutne podatke o licu. \"Nedostaje\" stavlja u red čekanja stavke koje još nisu obrađene. Detektirana lica bit će stavljena u red čekanja za Prepoznavanje lica nakon što se dovrši Detekcija lica, grupirajući ih u postojeće ili nove osobe.", + "facial_recognition_job_description": "Grupirajte otkrivena lica u osobe. Ovaj korak se izvršava nakon što je Detekcija lica dovršena. \"Resetiraj\" (ponovno) grupira sva lica. \"Nedostaje\" stavlja u red lica kojima nije dodijeljena osoba.", "failed_job_command": "Naredba {command} nije uspjela za posao: {job}", - "force_delete_user_warning": "UPOZORENJE: Ovo će odmah ukloniti korisnika i sve pripadajuće podatke. Ovo se ne može poništiti i datoteke se ne mogu vratiti.", + "force_delete_user_warning": "UPOZORENJE: Ovo će odmah ukloniti korisnika i sve pripadajuće stavke. Ovo se ne može poništiti i datoteke se ne mogu vratiti.", "image_format": "Format", "image_format_description": "WebP proizvodi manje datoteke od JPEG-a, ali se sporije kodira.", - "image_fullsize_description": "Slika pune veličine bez meta podataka, koristi se prilikom zumiranja", - "image_fullsize_enabled": "Omogući generiranje slike pune veličine", + "image_fullsize_description": "Slika pune veličine bez metapodataka, koristi se prilikom zumiranja", + "image_fullsize_enabled": "Omogući generiranje slika pune veličine", "image_fullsize_enabled_description": "Generiraj sliku pune veličine za formate koji nisu prilagođeni webu. Kada je opcija \"Preferiraj ugrađeni pregled\" omogućena, ugrađeni pregledi koriste se izravno bez konverzije. Ne utječe na formate prilagođene webu kao što je JPEG.", "image_fullsize_quality_description": "Kvaliteta slike pune veličine od 1 do 100. Veća vrijednost znači bolja kvaliteta, ali stvara veće datoteke.", "image_fullsize_title": "Postavke slike pune veličine", @@ -89,7 +91,7 @@ "image_prefer_embedded_preview_setting_description": "Koristite ugrađene preglede u RAW fotografije kao ulaz za obradu slike kada su dostupni. To može proizvesti preciznije boje za neke slike, ali kvaliteta pregleda ovisi o kameri i slika može imati više artifakta kompresije.", "image_prefer_wide_gamut": "Preferirajte široku gamu", "image_prefer_wide_gamut_setting_description": "Koristite Display P3 za sličice. Ovo bolje čuva živost slika sa širokim prostorima boja, ali slike mogu izgledati drugačije na starim uređajima sa starom verzijom preglednika. sRGB slike čuvaju se kao sRGB kako bi se izbjegle promjene boja.", - "image_preview_description": "Slika srednje veličine s ogoljenim metapodacima, koristi se prilikom pregledavanja jednog sredstva i za strojno učenje", + "image_preview_description": "Slika srednje veličine s uklonjenim metapodacima, koristi se prilikom pregledavanja jedne stavke i za strojno učenje", "image_preview_quality_description": "Kvaliteta pregleda od 1-100. Više je bolje, ali proizvodi veće datoteke i može smanjiti odziv aplikacije. Postavljanje niske vrijednosti može utjecati na kvalitetu strojnog učenja.", "image_preview_title": "Postavke pregleda", "image_quality": "Kvaliteta", @@ -116,27 +118,31 @@ "library_scanning_enable_description": "Omogući periodično skeniranje biblioteke", "library_settings": "Externa biblioteka", "library_settings_description": "Upravljajte postavkama vanjske biblioteke", - "library_tasks_description": "Skeniraj eksterne biblioteke za nove i/ili promijenjene resurse", + "library_tasks_description": "Skeniraj vanjske biblioteke za nove i/ili promijenjene stavke", "library_watching_enable_description": "Pratite vanjske biblioteke za promjena datoteke", "library_watching_settings": "Gledanje biblioteke (EKSPERIMENTALNO)", "library_watching_settings_description": "Automatsko praćenje promijenjenih datoteke", "logging_enable_description": "Omogući zapisivanje", "logging_level_description": "Kada je omogućeno, koju razinu zapisivanja koristiti.", "logging_settings": "Zapisivanje", + "machine_learning_availability_checks": "Provjere dostupnosti", + "machine_learning_availability_checks_enabled": "Omogući provjere dostupnosti", + "machine_learning_availability_checks_interval": "Provjeri interval", + "machine_learning_availability_checks_interval_description": "Interval u milisekundama između provjera dostupnosti", "machine_learning_clip_model": "CLIP model", "machine_learning_clip_model_description": "Naziv CLIP modela navedenog ovdje. Imajte na umu da morate ponovno pokrenuti posao 'Pametno Pretraživanje' za sve slike nakon promjene modela.", "machine_learning_duplicate_detection": "Detekcija Duplikata", "machine_learning_duplicate_detection_enabled": "Omogući detekciju duplikata", - "machine_learning_duplicate_detection_enabled_description": "Ako je onemogućeno, potpuno identična sredstva i dalje će biti deduplicirana.", + "machine_learning_duplicate_detection_enabled_description": "Ako je onemogućeno, potpuno identične stavke i dalje će biti deduplicirane.", "machine_learning_duplicate_detection_setting_description": "Upotrijebite CLIP ugradnje da biste pronašli vjerojatne duplikate", "machine_learning_enabled": "Uključi strojsko učenje", "machine_learning_enabled_description": "Ukoliko je ovo isključeno, sve funkcije strojnoga učenja biti će isključene bez obzira na postavke ispod.", - "machine_learning_facial_recognition": "Detekcija lica", + "machine_learning_facial_recognition": "Prepoznavanje lica", "machine_learning_facial_recognition_description": "Detektiraj, prepoznaj i grupiraj lica u fotografijama", "machine_learning_facial_recognition_model": "Model prepoznavanja lica", "machine_learning_facial_recognition_model_description": "Modeli su navedeni silaznim redoslijedom veličine. Veći modeli su sporiji i koriste više memorije, ali daju bolje rezultate. Imajte na umu da morate ponovno pokrenuti posao detekcije lica za sve slike nakon promjene modela.", "machine_learning_facial_recognition_setting": "Omogući prepoznavanje lica", - "machine_learning_facial_recognition_setting_description": "Ako je onemogućeno, slike neće biti kodirane za prepoznavanje lica i neće popuniti odjeljak Ljudi na stranici Istraživanje.", + "machine_learning_facial_recognition_setting_description": "Ako je onemogućeno, slike neće biti kodirane za prepoznavanje lica i neće popuniti odjeljak Osobe na stranici Istraži.", "machine_learning_max_detection_distance": "Maksimalna udaljenost za detektiranje", "machine_learning_max_detection_distance_description": "Maksimalna udaljenost između dvije slike da bi se smatrale duplikatima, u rasponu od 0,001-0,1. Više vrijednosti otkrit će više duplikata, ali mogu rezultirati netočnim rezultatima.", "machine_learning_max_recognition_distance": "Maksimalna udaljenost za detekciju", @@ -144,7 +150,7 @@ "machine_learning_min_detection_score": "Minimalni rezultat otkrivanja", "machine_learning_min_detection_score_description": "Minimalni rezultat pouzdanosti za detektirano lice od 0-1. Niže vrijednosti otkrit će više lica, ali mogu dovesti do lažno pozitivnih rezultata.", "machine_learning_min_recognized_faces": "Minimum prepoznatih lica", - "machine_learning_min_recognized_faces_description": "Najmanji broj prepoznatih lica za osobu koja se stvara. Povećanje toga čini prepoznavanje lica preciznijim po cijenu povećanja šanse da lice nije dodijeljeno osobi.", + "machine_learning_min_recognized_faces_description": "Najmanji broj prepoznatih lica za osobu koja se stvara. Povećanje toga čini Prepoznavanje lica preciznijim po cijenu povećanja šanse da lice nije dodijeljeno osobi.", "machine_learning_settings": "Postavke strojnog učenja", "machine_learning_settings_description": "Upravljajte značajkama i postavkama strojnog učenja", "machine_learning_smart_search": "Pametna pretraga", @@ -170,21 +176,21 @@ "memory_cleanup_job": "Čišćenje memorije", "memory_generate_job": "Generiranje memorije", "metadata_extraction_job": "Izdvoj metapodatke", - "metadata_extraction_job_description": "Izdvojite podatke o metapodacima iz svakog sredstva, kao što su GPS, lica i rezolucija", + "metadata_extraction_job_description": "Izdvojite metapodatke iz svake stavke, kao što su GPS, lica i rezolucija", "metadata_faces_import_setting": "Omogući uvoz lica", "metadata_faces_import_setting_description": "Uvezite lica iz EXIF podataka slike i sidecar datoteka", "metadata_settings": "Postavke Metapodataka", "metadata_settings_description": "Upravljanje postavkama metapodataka", "migration_job": "Migracija", - "migration_job_description": "Premjestite minijature za sredstva i lica u najnoviju strukturu mapa", + "migration_job_description": "Premjestite sličice za stavke i lica u najnoviju strukturu mapa", "nightly_tasks_cluster_faces_setting_description": "Pokreni prepoznavanje lica na novootkrivenim licima", "nightly_tasks_cluster_new_faces_setting": "Grupiraj nova lica", "nightly_tasks_database_cleanup_setting": "Zadaci čišćenja baze podataka", "nightly_tasks_database_cleanup_setting_description": "Očisti stare, istekle podatke iz baze podataka", "nightly_tasks_generate_memories_setting": "Generiraj uspomene", - "nightly_tasks_generate_memories_setting_description": "Stvori nove uspomene iz sadržaja", + "nightly_tasks_generate_memories_setting_description": "Stvori nove uspomene iz stavki", "nightly_tasks_missing_thumbnails_setting": "Generiraj nedostajuće sličice", - "nightly_tasks_missing_thumbnails_setting_description": "Stavi u red čekanja sadržaje bez sličica za generiranje sličica", + "nightly_tasks_missing_thumbnails_setting_description": "Stavke bez sličica stavi u red čekanja za generiranje sličica", "nightly_tasks_settings": "Postavke noćnih zadataka", "nightly_tasks_settings_description": "Upravljanje noćnim zadacima", "nightly_tasks_start_time_setting": "Vrijeme početka", @@ -193,7 +199,7 @@ "nightly_tasks_sync_quota_usage_setting_description": "Ažuriraj korisničku kvotu za pohranu na temelju trenutne potrošnje", "no_paths_added": "Nema dodanih putanja", "no_pattern_added": "Nije dodan uzorak", - "note_apply_storage_label_previous_assets": "Napomena: da biste primijenili Oznaku Pohrane na prethodno prenesena sredstva, pokrenite", + "note_apply_storage_label_previous_assets": "Napomena: Da biste primijenili Oznaku pohrane na prethodno prenesene stavke, pokrenite", "note_cannot_be_changed_later": "NAPOMENA: Ovo se ne može promijeniti kasnije!", "notification_email_from_address": "Od adrese", "notification_email_from_address_description": "E-mail adresa pošiljatelja, na primjer: \"Immich Photo Server \". Obavezno koristite adresu s koje vam je dopušteno slanje e-pošte.", @@ -260,21 +266,21 @@ "sidecar_job": "Sidecar metapodaci", "sidecar_job_description": "Otkrijte ili sinkronizirajte sidecar metapodatke iz datotečnog sustava", "slideshow_duration_description": "Broj sekundi za prikaz svake slike", - "smart_search_job_description": "Pokrenite strojno učenje na sredstvima za podršku pametnog pretraživanja", - "storage_template_date_time_description": "Vremenska oznaka stvaranja sredstva koristi se za informacije o datumu i vremenu", + "smart_search_job_description": "Pokrenite strojno učenje na stavkama za korištenje Pametnog pretraživanja", + "storage_template_date_time_description": "Vremenska oznaka stvaranja stavke koristi se za informacije o datumu i vremenu", "storage_template_date_time_sample": "Vrijeme uzorka {date}", "storage_template_enable_description": "Omogući mehanizam predloška za pohranu", "storage_template_hash_verification_enabled": "Omogućena hash provjera", "storage_template_hash_verification_enabled_description": "Omogućuje hash provjeru, nemojte je onemogućiti osim ako niste sigurni u implikacije", "storage_template_migration": "Migracija predloška za pohranu", - "storage_template_migration_description": "Primijenite trenutni {template} na prethodno prenesena sredstva", - "storage_template_migration_info": "Predložak za pohranu će sve nastavke (ekstenzije) pretvoriti u mala slova. Promjene predloška primjenjivat će se samo na nova sredstva. Za retroaktivnu primjenu predloška na prethodno prenesena sredstva, pokrenite {job}.", + "storage_template_migration_description": "Primijenite trenutni {template} na prethodno prenesene stavke", + "storage_template_migration_info": "Predložak za pohranu pretvorit će sve datotečne nastavke u mala slova. Promjene predloška primijenit će se samo na nove stavke. Da biste retroaktivno primijenili predložak na prethodno prenesene stavke, pokrenite {job}.", "storage_template_migration_job": "Posao Migracije Predloška Pohrane", "storage_template_more_details": "Za više pojedinosti o ovoj značajci pogledajte Predložak pohrane i njegove implikacije", "storage_template_onboarding_description_v2": "Kada je omogućena, ova će značajka automatski organizira datoteke prema predlošku koji je definirao korisnik. Za više informacija pogledajte dokumentaciju.", "storage_template_path_length": "Približno ograničenje duljine putanje: {length, number}/{limit, number}", "storage_template_settings": "Predložak pohrane", - "storage_template_settings_description": "Upravljajte strukturom mape i nazivom datoteke učitanog sredstva", + "storage_template_settings_description": "Upravljajte strukturom mape i nazivom datoteke učitane stavke", "storage_template_user_label": "{label} je korisnička oznaka za pohranu", "system_settings": "Postavke Sustava", "tag_cleanup_job": "Čišćenje oznaka", @@ -292,7 +298,7 @@ "theme_settings": "Postavke tema", "theme_settings_description": "Upravljajte prilagodbom Immich web sučelja", "thumbnail_generation_job": "Generirajte sličice", - "thumbnail_generation_job_description": "Generirajte velike, male i zamućene sličice za svaki materijal, kao i sličice za svaku osobu", + "thumbnail_generation_job_description": "Generirajte velike, male i zamućene sličice za svaku stavku, kao i sličice za svaku osobu", "transcoding_acceleration_api": "API ubrzanja", "transcoding_acceleration_api_description": "API koji će komunicirati s vašim uređajem radi ubrzanja transkodiranja. Ova postavka je 'najveći trud': vratit će se na softversko transkodiranje u slučaju kvara. VP9 može ili ne mora raditi ovisno o vašem hardveru.", "transcoding_acceleration_nvenc": "NVENC (zahtjeva NVIDIA GPU)", @@ -355,20 +361,20 @@ "transcoding_video_codec_description": "VP9 ima visoku učinkovitost i web-kompatibilnost, ali treba dulje za transkodiranje. HEVC ima sličnu izvedbu, ali ima slabiju web kompatibilnost. H.264 široko je kompatibilan i brzo se transkodira, ali proizvodi mnogo veće datoteke. AV1 je najučinkovitiji kodek, ali nema podršku na starijim uređajima.", "trash_enabled_description": "Omogućite značajke Smeća", "trash_number_of_days": "Broj dana", - "trash_number_of_days_description": "Broj dana za držanje sredstava u smeću prije njihovog trajnog uklanjanja", + "trash_number_of_days_description": "Broj dana za čuvanje stavki u smeću prije njihovog trajnog uklanjanja", "trash_settings": "Postavke Smeća", "trash_settings_description": "Upravljanje postavkama smeća", "unlink_all_oauth_accounts": "Odspoji sve OAuth račune", "unlink_all_oauth_accounts_description": "Zapamtite da odspojite sve OAuth račune prije prelaska na novog pružatelja usluge.", "unlink_all_oauth_accounts_prompt": "Jeste li sigurni da želite odspojiti sve OAuth račune? Ovo će resetirati OAuth ID za svakog korisnika i ne može se poništiti.", "user_cleanup_job": "Čišćenje korisnika", - "user_delete_delay": "Račun i sredstva korisnika {user} bit će zakazani za trajno brisanje za {delay, plural, one {# day} other {# days}}.", + "user_delete_delay": "Račun i stavke korisnika {user} bit će stavljeni u red čekanja trajnog brisanja za {delay, plural, one {# dan} other {# dana}}.", "user_delete_delay_settings": "Brisanje odgode", - "user_delete_delay_settings_description": "Broj dana nakon uklanjanja za trajno brisanje korisničkog računa i imovine. Posao brisanja korisnika pokreće se u ponoć kako bi se provjerili korisnici koji su spremni za brisanje. Promjene ove postavke bit će procijenjene pri sljedećem izvršavanju.", - "user_delete_immediately": "Račun i sredstva korisnika {user} bit će stavljeni u red čekanja za trajno brisanje odmah.", - "user_delete_immediately_checkbox": "Stavite korisnika i imovinu u red za trenutačno brisanje", + "user_delete_delay_settings_description": "Broj dana nakon uklanjanja za trajno brisanje korisničkog računa i stavki. Posao brisanja korisnika pokreće se u ponoć kako bi se provjerili korisnici koji su spremni za brisanje. Promjene ove postavke bit će procijenjene pri sljedećem izvršavanju.", + "user_delete_immediately": "Račun i stavke korisnika {user} bit će stavljeni u red čekanja za trajno brisanje odmah.", + "user_delete_immediately_checkbox": "Stavite korisnika i stavke u red čekanja za trenutno brisanje", "user_details": "Detalji korisnika", - "user_management": "Upravljanje Korisnicima", + "user_management": "Upravljanje korisnicima", "user_password_has_been_reset": "Korisnička lozinka je poništena:", "user_password_reset_description": "Molimo dostavite privremenu lozinku korisniku i obavijestite ga da će morati promijeniti lozinku pri sljedećoj prijavi.", "user_restore_description": "Račun korisnika {user} bit će vraćen.", @@ -390,13 +396,13 @@ "advanced_settings_enable_alternate_media_filter_subtitle": "Koristite ovu opciju za filtriranje medija tijekom sinkronizacije na temelju alternativnih kriterija. Pokušajte ovo samo ako imate problema s aplikacijom koja ne prepoznaje sve albume.", "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTALNO] Koristite alternativni filter za sinkronizaciju albuma na uređaju", "advanced_settings_log_level_title": "Razina zapisivanja: {level}", - "advanced_settings_prefer_remote_subtitle": "Neki uređaji sporo učitavaju sličice s lokalnih resursa. Aktivirajte ovu postavku kako biste umjesto toga učitali slike s udaljenih izvora.", + "advanced_settings_prefer_remote_subtitle": "Neki uređaji sporo učitavaju sličice s lokalnih stavki. Aktivirajte ovu postavku kako biste umjesto toga učitali slike s udaljenih izvora.", "advanced_settings_prefer_remote_title": "Preferiraj udaljene slike", "advanced_settings_proxy_headers_subtitle": "Definirajte zaglavlja posrednika koja Immich treba slati sa svakim mrežnim zahtjevom.", "advanced_settings_proxy_headers_title": "Proxy zaglavlja", "advanced_settings_self_signed_ssl_subtitle": "Preskoči provjeru SSL certifikata za krajnju točku poslužitelja. Potrebno za samo-potpisane certifikate.", "advanced_settings_self_signed_ssl_title": "Dopusti samo-potpisane SSL certifikate", - "advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriši ili obnovi resurs na ovom uređaju kada se ta radnja izvrši na webu", + "advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriši ili obnovi stavku na ovom uređaju kada se ta radnja izvrši na webu", "advanced_settings_sync_remote_deletions_title": "Sinkroniziraj udaljena brisanja [EKSPERIMENTALNO]", "advanced_settings_tile_subtitle": "Postavke za napredne korisnike", "advanced_settings_troubleshooting_subtitle": "Omogući dodatne značajke za rješavanje problema", @@ -421,14 +427,15 @@ "album_remove_user_confirmation": "Jeste li sigurni da želite ukloniti {user}?", "album_search_not_found": "Nema albuma koji odgovaraju vašem pretraživanju", "album_share_no_users": "Čini se da ste podijelili ovaj album sa svim korisnicima ili nemate nijednog korisnika s kojim biste ga dijelili.", + "album_summary": "Sažetak albuma", "album_updated": "Album ažuriran", - "album_updated_setting_description": "Primite obavijest e-poštom kada dijeljeni album ima nova sredstva", + "album_updated_setting_description": "Primite obavijest e-poštom kada dijeljeni album ima nove stavke", "album_user_left": "Napušten {album}", "album_user_removed": "Uklonjen {user}", "album_viewer_appbar_delete_confirm": "Jeste li sigurni da želite izbrisati ovaj album s vašeg računa?", "album_viewer_appbar_share_err_delete": "Neuspješno brisanje albuma", "album_viewer_appbar_share_err_leave": "Neuspješno napuštanje albuma", - "album_viewer_appbar_share_err_remove": "Postoje problemi s uklanjanjem resursa iz albuma", + "album_viewer_appbar_share_err_remove": "Postoje problemi s uklanjanjem stavki iz albuma", "album_viewer_appbar_share_err_title": "Neuspješno mijenjanje naslova albuma", "album_viewer_appbar_share_leave": "Napusti album", "album_viewer_appbar_share_to": "Podijeli s", @@ -437,8 +444,8 @@ "albums": "Albumi", "albums_count": "{count, plural, one {{count, number} Album} other {{count, number} Albumi}}", "albums_default_sort_order": "Zadani redoslijed sortiranja albuma", - "albums_default_sort_order_description": "Početni redoslijed sortiranja elemenata prilikom izrade novih albuma.", - "albums_feature_description": "Zbirke resursa koje se mogu dijeliti s drugim korisnicima.", + "albums_default_sort_order_description": "Početni redoslijed sortiranja stavki prilikom izrade novih albuma.", + "albums_feature_description": "Zbirke stavki koje se mogu dijeliti s drugim korisnicima.", "albums_on_device_count": "Albumi na uređaju ({count})", "all": "Sve", "all_albums": "Svi albumi", @@ -457,58 +464,60 @@ "app_bar_signout_dialog_content": "Jeste li sigurni da se želite odjaviti?", "app_bar_signout_dialog_ok": "Da", "app_bar_signout_dialog_title": "Odjavi se", - "app_settings": "Postavke Aplikacije", + "app_settings": "Postavke aplikacije", "appears_in": "Pojavljuje se u", "archive": "Arhiva", "archive_action_prompt": "{count} dodano u arhivu", "archive_or_unarchive_photo": "Arhivirajte ili dearhivirajte fotografiju", - "archive_page_no_archived_assets": "Nema arhiviranih resursa", + "archive_page_no_archived_assets": "Nema arhiviranih stavki", "archive_page_title": "Arhiviraj ({count})", "archive_size": "Veličina arhive", "archive_size_description": "Konfigurirajte veličinu arhive za preuzimanja (u GiB)", - "archived": "Ahrivirano", + "archived": "Arhivirano", "archived_count": "{count, plural, other {Archived #}}", "are_these_the_same_person": "Je li ovo ista osoba?", "are_you_sure_to_do_this": "Jeste li sigurni da to želite učiniti?", - "asset_action_delete_err_read_only": "Nije moguće izbrisati resurse samo za čitanje, preskačem", - "asset_action_share_err_offline": "Nije moguće dohvatiti izvanmrežne resurse, preskačem", + "asset_action_delete_err_read_only": "Nije moguće izbrisati stavke samo za čitanje, preskakanje", + "asset_action_share_err_offline": "Nije moguće dohvatiti izvanmrežne stavke, preskakanje", "asset_added_to_album": "Dodano u album", "asset_adding_to_album": "Dodavanje u album…", - "asset_description_updated": "Opis imovine je ažuriran", - "asset_filename_is_offline": "Sredstvo {filename} je izvan mreže", - "asset_has_unassigned_faces": "Materijal ima nedodijeljena lica", - "asset_hashing": "Sažimanje…", + "asset_description_updated": "Opis stavke je ažuriran", + "asset_filename_is_offline": "Stavka {filename} je izvan mreže", + "asset_has_unassigned_faces": "Stavka ima nedodijeljena lica", + "asset_hashing": "Hashiranje…", "asset_list_group_by_sub_title": "Grupiraj po", "asset_list_layout_settings_dynamic_layout_title": "Dinamički raspored", "asset_list_layout_settings_group_automatically": "Automatski", - "asset_list_layout_settings_group_by": "Grupiraj resurse po", + "asset_list_layout_settings_group_by": "Grupiraj stavke po", "asset_list_layout_settings_group_by_month_day": "Mjesec + dan", "asset_list_layout_sub_title": "Raspored", - "asset_list_settings_subtitle": "Postavke izgleda mreže fotografija", - "asset_list_settings_title": "Mreža Fotografija", - "asset_offline": "Sredstvo izvan mreže", - "asset_offline_description": "Ovaj materijal je izvan mreže. Immich ne može pristupiti lokaciji datoteke. Provjerite je li sredstvo dostupno, a zatim ponovno skenirajte biblioteku.", - "asset_restored_successfully": "Resurs uspješno obnovljen", + "asset_list_settings_subtitle": "Postavke izgleda Mreže fotografija", + "asset_list_settings_title": "Mreža fotografija", + "asset_offline": "Stavka izvan mreže", + "asset_offline_description": "Ova vanjska stavka nije pronađena na disku. Za pomoć se obratite Immich administratoru.", + "asset_restored_successfully": "Stavka uspješno obnovljena", "asset_skipped": "Preskočeno", "asset_skipped_in_trash": "U smeću", - "asset_uploaded": "Učitano", - "asset_uploading": "Šaljem…", - "asset_viewer_settings_subtitle": "Upravljajte postavkama preglednika vaše galerije", - "asset_viewer_settings_title": "Preglednik Resursa", - "assets": "Sredstva", - "assets_added_count": "Dodano {count, plural, one {# asset} other {# assets}}", - "assets_added_to_album_count": "Dodano {count, plural, one {# asset} other {# assets}} u album", - "assets_added_to_albums_count": "Dodano je {assetTotal} datoteka u {albumTotal} albuma", - "assets_cannot_be_added_to_album_count": "{count, plural, one {Sadržaj se ne može dodati u album} other {{count} sadržaja se ne mogu dodati u album}}", - "assets_cannot_be_added_to_albums": "{count, plural, one {Datoteka se ne može dodati ni u jedan album} few {Datoteke se ne mogu dodati ni u jedan album} other {Datoteka se ne može dodati ni u jedan album}}", - "assets_count": "{count, plural, one {# asset} other {# assets}}", - "assets_deleted_permanently": "{count} resurs(i) uspješno uklonjeni", - "assets_deleted_permanently_from_server": "{count} resurs(i) trajno obrisan(i) sa Immich poslužitelja", - "assets_downloaded_failed": "{count, plural, one {Preuzeta # datoteka – {error} datoteka nije uspjela} other {Preuzeto je # datoteka – {error} datoteke nisu uspjele}}", - "assets_downloaded_successfully": "{count, plural, one {Uspješno preuzeta # datoteka} other {Uspješno preuzete # datoteke}}", - "assets_moved_to_trash_count": "{count, plural, one {# asset} other {# asset}} premješteno u smeće", - "assets_permanently_deleted_count": "Trajno izbrisano {count, plural, one {# asset} other {# assets}}", - "assets_removed_count": "Uklonjeno {count, plural, one {# asset} other {# assets}}", + "asset_trashed": "Stavka premještena u smeće", + "asset_troubleshoot": "Rješavanje problema sa stavkom", + "asset_uploaded": "Preneseno", + "asset_uploading": "Prenošenje…", + "asset_viewer_settings_subtitle": "Upravljajte postavkama vašeg preglednika galerije", + "asset_viewer_settings_title": "Preglednik stavki", + "assets": "Stavke", + "assets_added_count": "{count, plural, one {Dodana # stavka} few {Dodane # stavke} other {Dodano # stavki}}", + "assets_added_to_album_count": "{count, plural, one {Dodana # stavka} few {Dodane # stavke} other {Dodano # stavki}} u album", + "assets_added_to_albums_count": "{assetTotal, plural, one {Dodana # stavka} other {Dodano # stavki}} u {albumTotal, plural, one {# album} other {# albuma}}", + "assets_cannot_be_added_to_album_count": "{count, plural, one {Stavka se ne može} other {Stavke se ne mogu}} dodati u album", + "assets_cannot_be_added_to_albums": "{count, plural, one {Stavka se ne može} few {Stavke se ne mogu} other {Stavki se ne može}} dodati ni u jedan album", + "assets_count": "{count, plural, one {# stavka} few {# stavke} other {# stavki}}", + "assets_deleted_permanently": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}}", + "assets_deleted_permanently_from_server": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}} s Immich servera", + "assets_downloaded_failed": "{count, plural, one {Preuzeta # datoteka – {error} datoteka nije uspjela} few {Preuzete # datoteke - {error} datoteke nisu uspjele} other {Preuzeto # datoteka – {error} datoteke nisu uspjele}}", + "assets_downloaded_successfully": "{count, plural, one {Uspješno preuzeta # datoteka} few {Uspješno preuzete # datoteke} other {Uspješno preueto # datoteka}}", + "assets_moved_to_trash_count": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavk premještenoi}} u smeće", + "assets_permanently_deleted_count": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}}", + "assets_removed_count": "{count, plural, one {Uklonjena # stavka} few {Uklonjene # stavke} other {Uklonjeno # stavki}}", "assets_removed_permanently_from_device": "{count} resurs(i) trajno uklonjen(i) s vašeg uređaja", "assets_restore_confirmation": "Jeste li sigurni da želite obnoviti sve svoje resurse bačene u otpad? Ne možete poništiti ovu radnju! Imajte na umu da se bilo koji izvanmrežni resursi ne mogu obnoviti na ovaj način.", "assets_restored_count": "Vraćeno {count, plural, one {# asset} other {# assets}}", @@ -518,7 +527,7 @@ "assets_trashed_from_server": "{count} resurs(i) premješten(i) u smeće s Immich poslužitelja", "assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} već dio albuma", "assets_were_part_of_albums_count": "{count, plural, one {Datoteka je već bila dio albuma} few {Datoteke su već bile dio albuma} other {Datoteka je već bila dio albuma}}", - "authorized_devices": "Ovlašteni Uređaji", + "authorized_devices": "Ovlašteni uređaji", "automatic_endpoint_switching_subtitle": "Povežite se lokalno preko naznačene Wi-Fi mreže kada je dostupna i koristite alternativne veze na drugim lokacijama", "automatic_endpoint_switching_title": "Automatsko prebacivanje URL-a", "autoplay_slideshow": "Automatsko prikazivanje slajdova", @@ -1034,7 +1043,7 @@ "export_database_description": "Izvezi SQLite bazu podataka", "extension": "Proširenje (Extension)", "external": "Vanjski", - "external_libraries": "Vanjske Biblioteke", + "external_libraries": "Vanjske biblioteke", "external_network": "Vanjska mreža", "external_network_sheet_info": "Kada niste na željenoj Wi-Fi mreži, aplikacija će se povezati s poslužiteljem putem prve dostupne URL adrese s popisa ispod, redom od vrha prema dnu", "face_unassigned": "Nedodijeljeno", @@ -1048,7 +1057,7 @@ "favorites": "Omiljene", "favorites_page_no_favorites": "Nema pronađenih omiljenih stavki", "feature_photo_updated": "Istaknuta fotografija ažurirana", - "features": "Značajke (Features)", + "features": "Značajke", "features_setting_description": "Upravljajte značajkama aplikacije", "file_name": "Naziv datoteke", "file_name_or_extension": "Naziv ili ekstenzija datoteke", @@ -1220,7 +1229,7 @@ "location_picker_longitude_error": "Unesite valjanu geografsku dužinu", "location_picker_longitude_hint": "Unesite ovdje svoju geografsku dužinu", "lock": "Zaključaj", - "locked_folder": "Zaključana Mapa", + "locked_folder": "Zaključana mapa", "log_out": "Odjavi se", "log_out_all_devices": "Odjava sa svih uređaja", "logged_in_as": "Prijavljeni kao {user}", @@ -1900,6 +1909,8 @@ "sync_albums_manual_subtitle": "Sinkroniziraj sve prenesene videozapise i fotografije u odabrane albume za sigurnosnu kopiju", "sync_local": "Sinkroniziraj lokalno", "sync_remote": "Sinkroniziraj udaljeno", + "sync_status": "Status sinkronizacije", + "sync_status_subtitle": "Pregledajte i upravljajte sistemom sinkronizacije", "sync_upload_album_setting_subtitle": "Kreiraj i prenesi svoje fotografije i videozapise u odabrane albume na Immichu", "tag": "Oznaka", "tag_assets": "Označi stavke", diff --git a/i18n/id.json b/i18n/id.json index 8dba86752e..abf8ef4747 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -28,10 +28,12 @@ "add_to_album": "Tambahkan ke album", "add_to_album_bottom_sheet_added": "Ditambahkan ke {album}", "add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}", + "add_to_album_bottom_sheet_some_local_assets": "Beberapa aset lokal tidak dapat ditambahkan ke album", "add_to_album_toggle": "Masukkan ke {album} / Batalkan dari {album}", "add_to_albums": "Tambahkan ke album", "add_to_albums_count": "Tambahkan ke album ({count})", "add_to_shared_album": "Tambahkan ke album terbagi", + "add_upload_to_stack": "Tambahkan unggahan ke tumpukan", "add_url": "Tambahkan URL", "added_to_archive": "Ditambahkan ke arsip", "added_to_favorites": "Ditambahkan ke favorit", @@ -598,6 +600,7 @@ "backup_controller_page_turn_on": "Aktifkan pencadangan latar depan", "backup_controller_page_uploading_file_info": "Mengunggah info file", "backup_err_only_album": "Tidak dapat menghapus album", + "backup_error_sync_failed": "Sinkronisasi gagal. Tidak dapat memproses cadangan.", "backup_info_card_assets": "aset", "backup_manual_cancelled": "Dibatalkan", "backup_manual_in_progress": "Dalam proses unggah. Coba lagi nanti", diff --git a/i18n/it.json b/i18n/it.json index 3f8d90eacc..b1aeabd33e 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -14,7 +14,7 @@ "add_a_location": "Aggiungi una posizione", "add_a_name": "Aggiungi un nome", "add_a_title": "Aggiungi un titolo", - "add_birthday": "Aggiungi un compleanno", + "add_birthday": "Aggiungi compleanno", "add_endpoint": "Aggiungi un endpoint", "add_exclusion_pattern": "Aggiungi un pattern di esclusione", "add_import_path": "Aggiungi un percorso per l’importazione", @@ -33,6 +33,7 @@ "add_to_albums": "Aggiungi ad album", "add_to_albums_count": "Aggiungi ad album ({count})", "add_to_shared_album": "Aggiungi ad album condiviso", + "add_upload_to_stack": "Aggiungi caricamento allo stack", "add_url": "Aggiungi URL", "added_to_archive": "Aggiunto all'archivio", "added_to_favorites": "Aggiunto ai preferiti", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Errore durante l'aggiornamento della descrizione", "exif_bottom_sheet_details": "DETTAGLI", "exif_bottom_sheet_location": "POSIZIONE", + "exif_bottom_sheet_no_description": "Nessuna descrizione", "exif_bottom_sheet_people": "PERSONE", "exif_bottom_sheet_person_add_person": "Aggiungi nome", "exit_slideshow": "Esci dalla presentazione", diff --git a/i18n/ja.json b/i18n/ja.json index b03614d65c..bec51aeca8 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -28,6 +28,7 @@ "add_to_album": "アルバムに追加", "add_to_album_bottom_sheet_added": "{album}に追加", "add_to_album_bottom_sheet_already_exists": "{album}に追加済み", + "add_to_album_bottom_sheet_some_local_assets": "いくつかの項目はまだサーバーへアップロードされていないためアルバムに追加できませんでした", "add_to_album_toggle": "{album}の選択を切り替え", "add_to_albums": "アルバムに追加", "add_to_albums_count": "{count}つのアルバムへ追加", @@ -598,6 +599,7 @@ "backup_controller_page_turn_on": "バックアップをオンにする", "backup_controller_page_uploading_file_info": "アップロード中のファイル", "backup_err_only_album": "最低1つのアルバムを選択してください", + "backup_error_sync_failed": "同期に失敗しました。バックアップができません。", "backup_info_card_assets": "写真と動画", "backup_manual_cancelled": "キャンセルされました", "backup_manual_in_progress": "アップロードが進行中です。後でもう一度試してください", diff --git a/i18n/ka.json b/i18n/ka.json index 13b0e1d065..bc1c05492b 100644 --- a/i18n/ka.json +++ b/i18n/ka.json @@ -14,6 +14,7 @@ "add_a_location": "დაამატე ადგილი", "add_a_name": "დაამატე სახელი", "add_a_title": "დაასათაურე", + "add_birthday": "დაბადების დღის დამატება", "add_exclusion_pattern": "დაამატე გამონაკლისი ნიმუში", "add_import_path": "დაამატე საიმპორტო მისამართი", "add_location": "დაამატე ადგილი", @@ -21,16 +22,20 @@ "add_partner": "დაამატე პარტნიორი", "add_path": "დაამატე მისამართი", "add_photos": "დაამატე ფოტოები", + "add_tag": "დაამატე თეგი", "add_to": "დაამატე ...ში", "add_to_album": "დაამატე ალბომში", "add_to_album_bottom_sheet_added": "დამატებულია {album}-ში", "add_to_album_bottom_sheet_already_exists": "{album}-ში უკვე არსებობს", + "add_to_albums": "დაამატე ალბომებში", + "add_to_albums_count": "დაამატე ალბომში ({count})", "add_to_shared_album": "დაამატე საზიარო ალბომში", "add_url": "დაამატე URL", "added_to_archive": "დაარქივდა", "added_to_favorites": "დაამატე რჩეულებში", "added_to_favorites_count": "{count, number} დაემატა რჩეულებში", "admin": { + "admin_user": "ადმინ მომხმარებელი", "asset_offline_description": "ეს საგარეო ბიბლიოთეკის აქტივი დისკზე ვერ მოიძებნა და სანაგვეში იქნა მოთავსებული. თუ ფაილი ბიბლიოთეკის შიგნით მდებარეობს, შეამოწმეთ შესაბამისი აქტივი ტაიმლაინზე. ამ აქტივის აღსადგენად, დარწმუნდით რომ ქვემოთ მოცემული ფაილის მისამართი Immich-ის მიერ წვდომადია და დაასკანერეთ ბიბლიოთეკა.", "authentication_settings": "ავთენტიკაციის პარამეტრები", "authentication_settings_description": "პაროლის, OAuth-ის და სხვა ავტენთიფიკაციის პარამეტრების მართვა", @@ -41,7 +46,7 @@ "backup_database_enable_description": "ბაზის დამპების ჩართვა", "backup_keep_last_amount": "წინა დამპების შესანარჩუნებელი რაოდენობა", "backup_settings": "მონაცემთა ბაზის დამპის მორგება", - "backup_settings_description": "მონაცემთა ბაზის პარამეტრების ამრთვა. შენიშვნა: ამ დავალებების მონიტორინგი არ ხდება და თქვენ არ მოგივათ შეტყობინება, თუ ის ჩავარდება.", + "backup_settings_description": "მონაცემთა ბაზის ასლის შექმნის პარამეტრების მრთვა.", "cleared_jobs": "დავალებები {job}-ისათვის გაწმენდილია", "config_set_by_file": "მიმდინარე კონფიგურაცია ფაილის მიერ არის დაყენებული", "confirm_delete_library": "ნამდვილად გინდა {library} ბიბლიოთეკის წაშლა?", @@ -58,6 +63,7 @@ "image_format_description": "WebP ფორმატი JPEG-ზე პატარა ფაილებს აწარმოებს, მაგრამ მის დამზადებას უფრო მეტი დრო სჭირდება.", "image_fullsize_title": "სრული ზომის გამოსახულების პარამეტრები", "image_prefer_wide_gamut": "უპირატესობა მიენიჭოს ფერის ფართე დიაპაზონს", + "image_preview_title": "გამოსახულების გადახედვის პარამეტრები", "image_quality": "ხარისხი", "image_resolution": "გაფართოება", "image_settings": "გამოსახულების პარამეტრები", @@ -68,6 +74,7 @@ "library_created": "შეიქმნა ბიბლიოთეკა: {library}", "library_deleted": "ბიბლიოთეკა წაიშალა", "library_import_path_description": "აირჩიე დასაიმპორტებელი საქაღალდე. ფოტოები და ვიდეოები მოიძებნება ამ საქაღალდესა და მასში არსებულ საქაღალდეებში.", + "library_settings": "გარე ბიბლიოთეკა", "library_settings_description": "გარე ბიბლიოთეკების პარამეტრების მართვა", "logging_settings": "ჟურნალი", "map_settings": "რუკა", diff --git a/i18n/lv.json b/i18n/lv.json index db02cea147..053a156a17 100644 --- a/i18n/lv.json +++ b/i18n/lv.json @@ -28,10 +28,12 @@ "add_to_album": "Pievienot albumam", "add_to_album_bottom_sheet_added": "Pievienots {album}", "add_to_album_bottom_sheet_already_exists": "Jau pievienots {album}", + "add_to_album_bottom_sheet_some_local_assets": "Dažus lokālos failus albumam nevarēja pievienot", "add_to_album_toggle": "Pārslēgt izvēli {album}", "add_to_albums": "Pievienot albumiem", "add_to_albums_count": "Pievienot albumiem ({count})", "add_to_shared_album": "Pievienot koplietotam albumam", + "add_upload_to_stack": "Pievienot augšupielādi kaudzei", "add_url": "Pievienot URL", "added_to_archive": "Pievienots arhīvam", "added_to_favorites": "Pievienots izlasei", @@ -49,7 +51,11 @@ "backup_database_enable_description": "Iespējot datu bāzes izrakstus", "backup_keep_last_amount": "Iepriekšējo izrakstu daudzums, kas jāsaglabā", "backup_onboarding_1_description": "ārēja kopija mākonī vai citā fiziskā atrašanās vietā.", - "backup_onboarding_2_description": "vietējās kopijas citās ierīcēs. Tas ietver galvenos failus un šo failu vietējo rezerves kopiju.", + "backup_onboarding_2_description": "lokālās kopijas citās ierīcēs. Tas ietver galvenos failus un šo failu lokālo rezerves kopiju.", + "backup_onboarding_3_description": "kopiju skaits, ieskaitot oriģinālos failus. Tas ietver 1 ārējo kopiju un 2 lokālās kopijas.", + "backup_onboarding_description": "Lai aizsargātu savus datus, ieteicams izmantot 3-2-1 rezerves kopiju stratēģiju. Lai nodrošinātu visaptverošu dublēšanas risinājumu, vajadzētu veidot kopijas saviem augšupielādētajiem fotoattēliem/videoklipiem, kā arī Immich datubāzei.", + "backup_onboarding_footer": "Lai iegūtu vairāk informācijas par Immich rezerves kopiju veidošanu, lūdzu, apskatiet dokumentāciju.", + "backup_onboarding_parts_title": "3-2-1 rezerves kopija ietver:", "backup_onboarding_title": "Rezerves kopijas", "backup_settings": "Datubāzes izrakstu iestatījumi", "backup_settings_description": "Datubāzes izrakstu iestatījumu pārvaldība", @@ -61,12 +67,15 @@ "confirm_user_password_reset": "Vai tiešām vēlaties atiestatīt lietotāja {user} paroli?", "create_job": "Izveidot uzdevumu", "cron_expression": "Cron izteiksme", + "cron_expression_description": "Iestatiet skenēšanas intervālu, izmantojot cron formātu. Papildu informācijai skatiet, piemēram, Crontab Guru", + "cron_expression_presets": "Cron izteiksmju sagataves", "disable_login": "Atspējot pieteikšanos", "duplicate_detection_job_description": "Analizēt failus ar mašīnmācīšanos, lai noteiktu līdzīgus attēlus. Šī funkcija izmanto viedo meklēšanu", "external_library_management": "Ārējo bibliotēku pārvaldība", "face_detection": "Seju noteikšana", "face_detection_description": "Atpazīt attēlos sejas, izmantojot mašīnmācīšanos. Video gadījumā tiek ņemta vērā tikai sīktēls. \"Atsvaidzināt\" atkārtoti apstrādā visus attēlus. \"Atiestatīt\" izdzēš visus pašreizējos seju datus. \"Trūkstošie\" ierindo attēlus, kas vēl nav apstrādāti. Pēc seju noteikšanas pabeigšanas atrastās sejas tiek ierindotas seju atpazīšanai, grupējot tās pēc esošas vai jauns personas.", "facial_recognition_job_description": "Grupēt atpazītās sejas pēc cilvēkiem. Šis solis tiek veikts pēc seju noteikšanas pabeigšanas. \"Atiestatīt\" atkārtoti sagrupē visas sejas. \"Trūkstošie\" ierindo sejas, kurām nav piešķirta persona.", + "force_delete_user_warning": "BRĪDINĀJUMS: Tas uzreiz izdzēsīs lietotāju ar visiem failiem. Šo darbību nevar atcelt, un failus nevarēs atgūt.", "image_format": "Formāts", "image_format_description": "WebP veido mazākus failus nekā JPEG, taču to kodēšana ir lēnāka.", "image_fullsize_description": "Pilnizmēra attēls ar noņemtiem metadatiem, ko izmanto, kad attēls ir tuvināts", @@ -76,29 +85,37 @@ "image_fullsize_title": "Pilnizmēra attēlu iestatījumi", "image_prefer_embedded_preview": "Priekšroka iegultajam priekšskatījumam", "image_prefer_embedded_preview_setting_description": "Izmanto RAW fotoattēlos iestrādātos priekšskatījumus, ja tādi ir pieejami, kā ievades datus attēlu apstrādei. Tādējādi dažiem attēliem var iegūt precīzākas krāsas, taču priekšskatījuma kvalitāte ir atkarīga no fotokameras un attēlam var būt vairāk saspiešanas artefaktu.", + "image_prefer_wide_gamut": "Dot priekšroku plašai krāsu gammai", "image_prefer_wide_gamut_setting_description": "Sīktēliem izmanto Display P3. Tas labāk saglabā attēlu dzīvīgumu ar plašu krāsu gammu, bet attēli var izskatīties atšķirīgi vecās ierīcēs ar vecu pārlūka versiju. sRGB attēli tiek saglabāti kā sRGB, lai izvairītos no krāsu izmaiņām.", + "image_preview_quality_description": "Priekšskatījuma kvalitāte no 1 līdz 100. Augstāka kvalitāte ir labāka, bet veido lielākus failus un var samazināt lietotnes reaģēšanas ātrumu. Zemas vērtības iestatīšana var ietekmēt mašīnmācīšanās kvalitāti.", "image_preview_title": "Priekšskatījuma iestatījumi", "image_quality": "Kvalitāte", "image_resolution": "Izšķirtspēja", + "image_resolution_description": "Augstāka izšķirtspēja ļauj saglabāt vairāk detaļu, taču kodēšana aizņem vairāk laika, failu izmērs ir lielāks un var samazināties lietotnes reaģēšanas ātrums.", "image_settings": "Attēlu iestatījumi", "image_settings_description": "Ģenerēto attēlu kvalitātes un izšķirtspējas pārvaldība", "image_thumbnail_description": "Neliels sīktēls bez metadatiem, ko izmanto, lai apskatītu vairākus fotoattēlus, piemēram, galvenajā laika skalā", + "image_thumbnail_quality_description": "Sīktēlu kvalitāte no 1 līdz 100. Augstāka kvalitāte ir labāka, bet veido lielākus failus un var samazināt lietotnes reaģēšanas ātrumu.", "image_thumbnail_title": "Sīktēlu iestatījumi", "job_concurrency": "{job} vienlaicīgi", "job_created": "Uzdevums izveidots", + "job_not_concurrency_safe": "Šis uzdevums nav drošs vienlaicīgai izpildei.", "job_settings": "Uzdevumu iestatījumi", "job_settings_description": "Uzdevumu izpildes vienlaicīguma pārvaldība", "job_status": "Uzdevumu statuss", "library_created": "Izveidoja bibliotēku: {library}", "library_deleted": "Bibliotēka dzēsta", + "library_import_path_description": "Norādi importējamo mapi. Šī mape un tās apakšmapes tiks pārbaudīta, lai atrastu attēlus un videoklipus.", "library_scanning": "Periodiska skenēšana", "library_scanning_description": "Konfigurē periodisku bibliotēku skenēšanu", "library_scanning_enable_description": "Iespējot periodisku bibliotēku skenēšanu", - "library_settings": "Ārējā bibliotēka", + "library_settings": "Ārējās bibliotēkas", "library_settings_description": "Ārējo bibliotēku iestatījumu pārvaldība", "library_tasks_description": "Pārbaudīt ārējās bibliotēkas, lai atrastu jaunus un/vai mainītus failus", + "library_watching_enable_description": "Uzraudzīt ārējo bibliotēku failu izmaiņas", "library_watching_settings": "Bibliotēku uzraudzīšana (EKSPERIMENTĀLA)", "library_watching_settings_description": "Automātiski uzraudzīt, vai ir mainīti faili", + "machine_learning_availability_checks": "Pieejamības pārbaudes", "machine_learning_availability_checks_enabled": "Iespējot pieejamības pārbaudes", "machine_learning_clip_model": "CLIP modelis", "machine_learning_duplicate_detection": "Dublikātu noteikšana", @@ -108,6 +125,7 @@ "machine_learning_enabled_description": "Ja funkcija ir atspējota, tiks atspējotas visas ML funkcijas neatkarīgi no zemāk esošajiem iestatījumiem.", "machine_learning_facial_recognition": "Seju atpazīšana", "machine_learning_facial_recognition_model": "Seju atpazīšanas modelis", + "machine_learning_facial_recognition_model_description": "Modeļi ir uzskaitīti pēc to izmēra dilstošā secībā. Lielāki modeļi ir lēnāki un izmanto vairāk atmiņas, bet nodrošina labākus rezultātus. Ņem vērā, ka, mainot modeli, ir atkārtoti jāpalaiž sejas atpazīšanas uzdevums visiem attēliem.", "machine_learning_facial_recognition_setting": "Iespējot seju atpazīšanu", "machine_learning_settings": "Mašīnmācīšanās iestatījumi", "machine_learning_settings_description": "Mašīnmācīšanās funkciju un iestatījumu pārvaldība", @@ -120,6 +138,7 @@ "map_dark_style": "Tumšais stils", "map_gps_settings": "Kartes un GPS iestatījumi", "map_gps_settings_description": "Karšu un GPS (apgrieztās ģeokodēšanas) iestatījumu pārvaldība", + "map_implications": "Kartes funkcija izmanto ārējo kartes fragmentu pakalpojumu (tiles.immich.cloud)", "map_light_style": "Gaišais stils", "map_manage_reverse_geocoding_settings": "Reversās ģeokodēšanas iestatījumu pārvaldība", "map_reverse_geocoding": "Reversā ģeokodēšana", @@ -130,6 +149,7 @@ "memory_generate_job": "Atmiņu ģenerēšana", "metadata_extraction_job": "Metadatu iegūšana", "metadata_extraction_job_description": "iegūt metadatu informāciju no katra faila, piemēram, GPS, sejas un izšķirtspēju", + "metadata_faces_import_setting": "Iespējot seju importēšanu", "metadata_faces_import_setting_description": "Importēt sejas no attēla EXIF datiem un blakusfailiem", "metadata_settings": "Metadatu iestatījumi", "metadata_settings_description": "Metadatu iestatījumu pārvaldība", @@ -151,6 +171,7 @@ "nightly_tasks_sync_quota_usage_setting_description": "Pārrēķināt lietotāja uzglabāšanas kvotu, pamatojoties uz pašreizējo izmantošanu", "no_paths_added": "Nav pievienots neviens ceļš", "no_pattern_added": "Nav pievienots neviens izslēgšanas šablons", + "note_apply_storage_label_previous_assets": "Piezīme: Lai piemērotu glabātuves nosaukumu iepriekš augšupielādētiem failiem, izpildiet", "note_cannot_be_changed_later": "PIEZĪME: Vēlāk to vairs nevar mainīt!", "notification_email_from_address": "No adreses", "notification_email_from_address_description": "Sūtītāja e-pasta adrese, piemēram: “Immich foto serveris ”", @@ -158,7 +179,9 @@ "notification_email_ignore_certificate_errors_description": "Ignorēt TLS sertifikāta apstiprināšanas kļūdas (nav ieteicams)", "notification_email_port_description": "e-pasta servera ports (piemēram, 25, 465 vai 587)", "notification_email_sent_test_email_button": "Nosūtīt testa e-pastu un saglabāt", + "notification_email_setting_description": "E-pasta paziņojumu sūtīšanas iestatījumi", "notification_email_test_email": "Nosūtīt testa e-pastu", + "notification_email_test_email_failed": "Neizdevās nosūtīt pārbaudes e-pastu, pārbaudi ievadītās vērtības", "notification_email_test_email_sent": "Uz {email} ir nosūtīts testa e-pasts. Lūdzu, pārbaudi savu iesūtni.", "notification_settings": "Paziņojumu iestatījumi", "notification_settings_description": "Paziņojumu iestatījumu, tostarp e-pasta, pārvaldība", @@ -170,6 +193,8 @@ "oauth_enable_description": "Pieslēgties ar OAuth", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth pieteikšanās iestatījumu pārvaldība", + "oauth_storage_label_claim": "Glabātuves nosaukuma pieteikums", + "oauth_storage_label_claim_description": "Automātiski iestatīt lietotāja glabātuves nosaukumu uz šī pieteikuma vērtību.", "oauth_storage_quota_default": "Noklusējuma krātuves kvota (GiB)", "password_enable_description": "Pieteikšanās ar e-pasta adresi un paroli", "password_settings": "Pieteikšanās ar paroli", @@ -204,6 +229,7 @@ "storage_template_migration_job": "Krātuves veidņu migrācijas uzdevumu", "storage_template_path_length": "Aptuvenais ceļa garuma ierobežojums: {length, number}/{limit, number}", "storage_template_settings": "Krātuves veidne", + "storage_template_user_label": "{label} ir lietotāja glabātuves nosaukums", "system_settings": "Sistēmas iestatījumi", "template_email_available_tags": "Sagatavē var izmantot šos mainīgos: {tags}", "template_email_if_empty": "Ja sagatave ir tukša, tiks izmantots noklusējuma e-pasts.", @@ -222,15 +248,19 @@ "transcoding_acceleration_qsv": "Quick Sync (nepieciešams 7. paaudzes vai jaunāks Intel procesors)", "transcoding_acceleration_rkmpp": "RKMPP (tikai Rockchip SOC)", "transcoding_acceleration_vaapi": "VAAPI", + "transcoding_accepted_video_codecs": "Akceptētie video kodeki", "transcoding_advanced_options_description": "Lielākajai daļai lietotāju nevajadzētu mainīt šīs opcijas", "transcoding_audio_codec": "Audio kodeks", + "transcoding_audio_codec_description": "Opus ir augstākās kvalitātes izvēle, bet tā ir mazāk saderīga ar vecām ierīcēm vai programmatūru.", "transcoding_codecs_learn_more": "Lai uzzinātu vairāk par šeit lietoto terminoloģiju, skatiet FFmpeg dokumentāciju par H.264 kodeku, HEVC kodeku un VP9 kodeku.", + "transcoding_constant_quality_mode": "Nemainīgas kvalitātes režīms", "transcoding_constant_quality_mode_description": "ICQ ir labāks nekā CQP, bet dažas aparatūras paātrinājuma ierīces neatbalsta šo režīmu. Iestatot šo opciju, tiks izmantots norādītais režīms, ja tiek izmantota kvalitātē balstīta kodēšana. NVENC to ignorē, jo neatbalsta ICQ.", "transcoding_constant_rate_factor_description": "Video kvalitātes līmenis. Tipiskās vērtības ir 23 priekš H.264, 28 priekš HEVC, 31 priekš VP9 un 35 priekš AV1. Zemāka vērtība ir labāka, bet rada lielākus failus.", "transcoding_hardware_acceleration": "Aparatūras paātrinājums", "transcoding_required_description": "Tikai video, kas nav atbalstītā formātā", "transcoding_settings": "Video transkodēšanas iestatījumi", "transcoding_threads": "Pavedieni", + "transcoding_threads_description": "Augstākas vērtības nodrošina ātrāku kodēšanu, bet atstāj mazāk jaudas serverim, lai apstrādātu citus aktīvos uzdevumus. Šai vērtībai nevajadzētu pārsniegt CPU kodolu skaitu. Ja iestatīta uz 0, maksimizē izmantošanu.", "transcoding_video_codec": "Video kodeks", "trash_number_of_days": "Dienu skaits", "trash_settings": "Atkritnes iestatījumi", @@ -409,6 +439,7 @@ "backup_controller_page_turn_on": "Ieslēgt priekšplāna dublēšanu", "backup_controller_page_uploading_file_info": "Faila informācijas augšupielāde", "backup_err_only_album": "Nevar noņemt vienīgo albumu", + "backup_error_sync_failed": "Sinhronizācija neizdevās. Nevar apstrādāt rezerves kopiju.", "backup_info_card_assets": "faili", "backup_manual_cancelled": "Atcelts", "backup_manual_in_progress": "Augšupielāde jau notiek. Mēģiniet pēc kāda laika atkārtoti", @@ -440,7 +471,7 @@ "cache_settings_statistics_title": "Kešatmiņas lietojums", "cache_settings_subtitle": "Kontrolēt Immich mobilās lietotnes kešdarbi", "cache_settings_tile_subtitle": "Kontrolēt lokālās krātuves uzvedību", - "cache_settings_tile_title": "Lokālā Krātuve", + "cache_settings_tile_title": "Lokālā krātuve", "cache_settings_title": "Kešdarbes iestatījumi", "camera": "Fotokamera", "camera_brand": "Fotokameras zīmols", @@ -570,7 +601,7 @@ "delete_library": "Dzēst bibliotēku", "delete_link": "Dzēst saiti", "delete_local_action_prompt": "{count} dzēsti lokāli", - "delete_local_dialog_ok_backed_up_only": "Dzēst tikai Dublētos", + "delete_local_dialog_ok_backed_up_only": "Dzēst tikai dublētos", "delete_local_dialog_ok_force": "Tā pat dzēst", "delete_others": "Dzēst citus", "delete_shared_link": "Dzēst Kopīgošanas saiti", @@ -587,6 +618,7 @@ "discovered_devices": "Atrastās ierīces", "display_order": "Attēlošanas secība", "display_original_photos": "Rādīt oriģinālās fotogrāfijas", + "do_not_show_again": "Vairs nerādīt šo ziņojumu", "documentation": "Dokumentācija", "done": "Gatavs", "download": "Lejupielādēt", @@ -619,6 +651,7 @@ "edit_birthday": "Labot dzimšanas dienu", "edit_date": "Labot datumu", "edit_date_and_time": "Labot datumu un laiku", + "edit_date_and_time_action_prompt": "{count} datums un laiks labots", "edit_description": "Labot aprakstu", "edit_description_prompt": "Lūdzu, izvēlies jaunu aprakstu:", "edit_faces": "Labot sejas", @@ -653,7 +686,11 @@ "error_loading_image": "Kļūda, ielādējot attēlu", "error_loading_partners": "Kļūda, ielādējot partnerus: {error}", "error_saving_image": "Kļūda: {error}", + "error_title": "Kļūda - kaut kas nogāja greizi", "errors": { + "cannot_navigate_next_asset": "Nevar pāriet uz nākamo resursu", + "cannot_navigate_previous_asset": "Nevar pāriet uz iepriekšējo resursu", + "cant_apply_changes": "Nevar piemērot izmaiņas", "cant_get_faces": "Nevar iegūt sejas", "cant_search_people": "Neizdevās veikt peronu meklēšanu", "exclusion_pattern_already_exists": "Šāds izslēgšanas paraugs jau pastāv.", @@ -676,7 +713,12 @@ "profile_picture_transparent_pixels": "Profila attēlos nevar būt caurspīdīgi pikseļi. Lūdzu, palielini un/vai pārvieto attēlu.", "something_went_wrong": "Kaut kas nogāja greizi", "unable_to_change_description": "Neizdevās nomainīt aprakstu", + "unable_to_create_admin_account": "Nevar izveidot administratora kontu", + "unable_to_create_api_key": "Nevar izveidot jaunu API atslēgu", + "unable_to_create_library": "Nevar izveidot bibliotēku", "unable_to_create_user": "Neizdevās izveidot lietotāju", + "unable_to_delete_album": "Nevar izdzēst albumu", + "unable_to_delete_asset": "Nevar izdzēst failu", "unable_to_delete_user": "Neizdevās dzēst lietotāju", "unable_to_empty_trash": "Neizdevās iztukšot atkritni", "unable_to_hide_person": "Neizdevās paslēpt personu", @@ -768,20 +810,20 @@ "hide_person": "Paslēpt personu", "hide_unnamed_people": "Paslēpt nenosauktas personas", "home_page_add_to_album_conflicts": "Pievienoja {added} failus albumam {album}. {failed} faili jau ir albumā.", - "home_page_add_to_album_err_local": "Albumiem vēl nevar pievienot lokālos aktīvus, notiek izlaišana", + "home_page_add_to_album_err_local": "Albumiem vēl nevar pievienot lokālos failus, izlaiž", "home_page_add_to_album_success": "Pievienoja {added} aktīvus albumam {album}.", "home_page_album_err_partner": "Pagaidām nevar pievienot partnera aktīvus albumam, notiek izlaišana", - "home_page_archive_err_local": "Vēl nevar arhivēt lokālos aktīvus, notiek izlaišana", + "home_page_archive_err_local": "Vēl nevar arhivēt lokālos aktīvus, izlaiž", "home_page_archive_err_partner": "Nevarēja arhivēt partnera aktīvus, notiek izlaišana", "home_page_building_timeline": "Tiek izveidota laika skala", "home_page_delete_err_partner": "Nevarēja dzēst partnera aktīvus, notiek izlaišana", - "home_page_delete_remote_err_local": "Lokālie faili dzēšanai attālinātajā izvēlē, tiek izlaists", - "home_page_favorite_err_local": "Vēl nevar pievienot izlasei vietējos failus, izlaiž", + "home_page_delete_remote_err_local": "Lokālie faili dzēšanai attālinātajā izvēlē, izlaiž", + "home_page_favorite_err_local": "Vēl nevar pievienot izlasei lokālos failus, izlaiž", "home_page_favorite_err_partner": "Pagaidām nevar ievietot izlasē partnera failus, izlaiž", "home_page_first_time_notice": "Ja šī ir pirmā reize, kad izmanto lietotni, lūdzu, izvēlies dublējamo albumu, lai laika skalā varētu aizpildīt fotoattēlus un videoklipus", - "home_page_locked_error_local": "Nevar pārvietot vietējos failus uz slēgto mapi, izlaiž", + "home_page_locked_error_local": "Nevar pārvietot lokālos failus uz slēgto mapi, izlaiž", "home_page_locked_error_partner": "Nevar pārvietot partneru failus uz slēgto mapi, izlaiž", - "home_page_share_err_local": "Caur saiti nevarēja kopīgot lokālos aktīvus, notiek izlaišana", + "home_page_share_err_local": "Caur saiti nevarēja kopīgot lokālos aktīvus, izlaiž", "home_page_upload_err_limit": "Vienlaikus var augšupielādēt ne vairāk kā 30 aktīvus, notiek izlaišana", "hour": "Stunda", "hours": "Stundas", @@ -852,7 +894,11 @@ "list": "Saraksts", "loading": "Ielādē", "local": "Lokāli", + "local_asset_cast_failed": "Nav iespējams pārraidīt resursu, kas nav augšupielādēts serverī", + "local_assets": "Lokālie faili", + "local_media_summary": "Lokālo mediju kopsavilkums", "local_network": "Lokālais tīkls", + "local_network_sheet_info": "Izmantojot norādīto Wi-Fi tīklu, lietotne veidos savienojumu ar serveri, izmantojot šo URL", "location_permission": "Atrašanās vietas atļauja", "location_permission_content": "Lai izmantotu automātiskās pārslēgšanās funkciju, Immich ir nepieciešama precīzas atrašanās vietas atļauja, lai varētu nolasīt pašreizējā Wi-Fi tīkla nosaukumu", "location_picker_choose_on_map": "Izvēlēties uz kartes", @@ -979,11 +1025,12 @@ "no_assets_message": "NOKLIKŠĶINIET, LAI AUGŠUPIELĀDĒTU SAVU PIRMO FOTOATTĒLU", "no_assets_to_show": "Nav uzrādāmo aktīvu", "no_cast_devices_found": "Nav atrasta neviena pārraides ierīce", - "no_checksum_local": "Nav pieejama kontrolsumma - nevar iegūt vietējos failus", + "no_checksum_local": "Nav pieejama kontrolsumma - nevar iegūt lokālos failus", "no_checksum_remote": "Nav pieejama kontrolsumma - nevar iegūt attālo failu", "no_duplicates_found": "Dublikāti netika atrasti.", "no_exif_info_available": "Nav pieejama exif informācija", "no_explore_results_message": "Augšupielādē vairāk fotogrāfiju, lai iepazītu savu kolekciju.", + "no_local_assets_found": "Ar šo kontrolsummu nav atrasts neviens lokālais fails", "no_name": "Nav nosaukuma", "no_notifications": "Nav paziņojumu", "no_places": "Nav atrašanās vietu", @@ -991,6 +1038,7 @@ "no_results_description": "Izmēģiniet sinonīmu vai vispārīgāku atslēgvārdu", "not_in_any_album": "Nav nevienā albumā", "not_selected": "Nav izvēlēts", + "note_apply_storage_label_to_previously_uploaded assets": "Piezīme: Lai piemērotu glabātuves nosaukumu iepriekš augšupielādētiem failiem, izpildiet", "notes": "Piezīmes", "nothing_here_yet": "Šeit vēl nekā nav", "notification_permission_dialog_content": "Lai iespējotu paziņojumus, atveriet Iestatījumi un atlasiet Atļaut.", @@ -1234,6 +1282,7 @@ "search_suggestion_list_smart_search_hint_2": "m:jūsu-meklēšanas-frāze", "search_type": "Meklēšanas veids", "search_your_photos": "Meklēt fotoattēlos", + "searching_locales": "Meklē lokalizācijas...", "second": "Sekunde", "see_all_people": "Skatīt visas personas", "select_album_cover": "Izvēlieties albuma vāciņu", @@ -1383,13 +1432,16 @@ "stop_photo_sharing_description": "{partner} vairs nevarēs piekļūt tavām fotogrāfijām.", "stop_sharing_photos_with_user": "Pārtraukt dalīties ar fotogrāfijām ar šo lietotāju", "storage": "Vieta krātuvē", + "storage_label": "Glabātuves nosaukums", "storage_usage": "{used} no {available} izmantoti", "submit": "Iesniegt", "suggestions": "Ieteikumi", "sunrise_on_the_beach": "Saullēkts pludmalē", "support": "Atbalsts", "support_and_feedback": "Atbalsts un atsauksmes", + "support_third_party_description": "Tavu Immich instalāciju ir sagatavojusi trešā puse. Problēmas, ar kurām sastopies, var būt saistītas ar šo pakotni, tāpēc lūdzu vispirms ziņo par tām, izmantojot zemāk norādītās saites.", "sync": "Sinhronizēt", + "sync_local": "Sinhronizēt lokāli", "sync_status": "Sinhronizācijas statuss", "sync_status_subtitle": "Skatīt un pārvaldīt sinhronizācijas sistēmu", "theme": "Dizains", diff --git a/i18n/mr.json b/i18n/mr.json index dbc2e3d114..fb1b61e2af 100644 --- a/i18n/mr.json +++ b/i18n/mr.json @@ -357,6 +357,9 @@ "trash_number_of_days_description": "कायमस्वरीत्या काढून टाकण्यापूर्वी ट्रॅशमध्ये सामग्री किती दिवस ठेवायची ते क्रम", "trash_settings": "ट्रॅश सेटिंग्ज", "trash_settings_description": "ट्रॅश सेटिंग्ज व्यवस्थापित करा", + "unlink_all_oauth_accounts": "सर्व OAuth खात्यांची जोडणी तोडा", + "unlink_all_oauth_accounts_description": "नव्या सेवा-प्रदात्याकडे स्थलांतर करण्यापूर्वी सर्व OAuth खात्यांची जोडणी तोडायला विसरू नका.", + "unlink_all_oauth_accounts_prompt": "तुम्ही खरोखर सर्व OAuth खात्यांची जोडणी तोडू इच्छिता का? यामुळे प्रत्येक वापरकर्त्याचा OAuth ID रीसेट होईल आणि ही कृती पूर्वस्थितीत आणता येणार नाही.", "user_cleanup_job": "वापरकर्ता स्वच्छता", "user_delete_delay": "{user} यांचे खाते आणि मालमत्ता कायमची हटविण्यासाठी {delay, plural, one {# दिवस} other {# दिवस}} नंतर शेड्यूल केली जातील.", "user_delete_delay_settings": "हटविण्याची विलंबीत कालावधी", @@ -390,6 +393,8 @@ "advanced_settings_prefer_remote_title": "रिमोट प्रतिमा पसंत करा", "advanced_settings_proxy_headers_subtitle": "प्रत्येक नेटवर्क विनंतीसोबत Immich पाठवावयाचे प्रॉक्सी हेडर येथे परिभाषित करा", "advanced_settings_proxy_headers_title": "प्रॉक्सी हेडर", + "advanced_settings_readonly_mode_subtitle": "या मोडमध्ये फोटो फक्त पाहता येतात - अनेक फोटो निवडणे, शेअर करणे, कास्ट करणे आणि हटवणे अशा क्रिया निष्क्रिय राहतात. मुख्य स्क्रीनवरील वापरकर्ता अवतारातून हा मोड चालू किंवा बंद करा", + "advanced_settings_readonly_mode_title": "फक्त पाहण्याचा मोड", "advanced_settings_self_signed_ssl_subtitle": "सर्व्हर एंडपॉइंटसाठी SSL प्रमाणपत्र सत्यापन वगळते. स्वाक्षरीत प्रमाणपत्रांसाठी आवश्यक.", "advanced_settings_self_signed_ssl_title": "स्वतः स्वाक्षरीत SSL प्रमाणपत्रांना परवानगी द्या", "advanced_settings_sync_remote_deletions_subtitle": "वेबवर ही क्रिया केली गेल्यावर या उपकरणावर असलेले अॅसेट आपोआप हटवा किंवा पुनर्संचयित करा", @@ -417,6 +422,7 @@ "album_remove_user_confirmation": "आपण निश्चितच वापरकर्ता {user} काढून टाकणार आहात का?", "album_search_not_found": "तुमच्या शोधाशी जुळणारे कोणतेही अल्बम आढळले नाहीत", "album_share_no_users": "असा दिसते की हा अल्बम तुम्ही सर्व वापरकर्त्यांसोबत शेअर केला आहे किंवा शेअर करण्यासाठी कुठलाही वापरकर्ता उपलब्ध नाही.", + "album_summary": "अल्बम सारांश", "album_updated": "अल्बम अद्यतनित", "album_updated_setting_description": "शेअर केलेल्या अल्बममध्ये नवीन फाईल्स आल्यास ईमेल सूचनार्थ प्राप्त करा", "album_user_left": "सोडले: {album}", @@ -455,6 +461,7 @@ "app_bar_signout_dialog_title": "साइन आउट", "app_settings": "अ‍ॅप सेटिंग्ज", "appears_in": "दिसते (कुठे दिसते)", + "apply_count": "लागू करा ({count, number})", "archive": "आर्काइव्ह", "archive_action_prompt": "{count} आर्काइव्हमध्ये जोडले", "archive_or_unarchive_photo": "फोटो आर्काइव्ह करा किंवा अनआर्काइव्ह करा", @@ -487,6 +494,8 @@ "asset_restored_successfully": "साधन यशस्वीपणे पुनर्संचयित केले गेले", "asset_skipped": "वगळले", "asset_skipped_in_trash": "ट्रॅशमध्ये", + "asset_trashed": "मीडिया घटक कचरापेटीत हलवला", + "asset_troubleshoot": "मीडिया घटक समस्यानिवारण", "asset_uploaded": "अपलोड झाले", "asset_uploading": "अपलोड करत आहे…", "asset_viewer_settings_subtitle": "आपल्या गॅलरी व्ह्यूअरच्या सेटिंग्ज व्यवस्थापित करा", @@ -494,7 +503,9 @@ "assets": "साधने", "assets_added_count": "{count, plural, one {# साधन जोडले} other {# साधने जोडले}}", "assets_added_to_album_count": "{count, plural, one {# साधन अल्बममध्ये जोडले} other {# साधने अल्बममध्ये जोडले}}", + "assets_added_to_albums_count": "{albumTotal, plural, one {# अल्बममध्ये} other {# अल्बममध्ये}} {assetTotal, plural, one {# मीडिया घटक} other {# मीडिया घटक}} जोडले", "assets_cannot_be_added_to_album_count": "{count, plural, one {# साधन अल्बममध्ये जोडता येणार नाही} other {# साधने अल्बममध्ये जोडता येणार नाहीत}}", + "assets_cannot_be_added_to_albums": "{count, plural, one {# मीडिया घटक कोणत्याही अल्बममध्ये जोडता येत नाही} other {# मीडिया घटक कोणत्याही अल्बममध्ये जोडता येत नाहीत}}", "assets_count": "{count, plural, one {# साधन} other {# साधने}}", "assets_deleted_permanently": "{count} साधन(े) कायमचे हटविले", "assets_deleted_permanently_from_server": "Immich सर्व्हरवरून {count} साधन(े) कायमचे हटविले", @@ -502,6 +513,20 @@ "assets_downloaded_successfully": "{count, plural, one {एक फाईल यशस्वीरित्या डाउनलोड झाली} other {# फाईल्स यशस्वीरित्या डाउनलोड झाल्या}}", "assets_moved_to_trash_count": "{count, plural, one {एक फाईल ट्रॅशमध्ये हलवली} other {# फाईल्स ट्रॅशमध्ये हलवल्या}}", "assets_permanently_deleted_count": "{count, plural, one {एक फाईल कायमस्वरूपी हटवली} other {# फाईल्स कायमस्वरूपी हटवल्या}}", + "assets_removed_count": "{count, plural, one {# मीडिया घटक काढून टाकला} other {# मीडिया घटक काढून टाकले}}", + "assets_removed_permanently_from_device": "{count} मीडिया घटक तुमच्या डिव्हाइसवरून कायमचे काढले गेले", + "assets_restore_confirmation": "कचरापेटीतले सर्व मीडिया घटक पुनर्संचयित करायचे आहेत का? ही कृती पूर्ववत करता येणार नाही. लक्षात ठेवा - ऑफलाइन मीडिया घटक अशा प्रकारे पुनर्संचयित करता येत नाहीत.", + "assets_restored_count": "{count, plural, one {# मीडिया घटक पुनर्संचयित केला} other {# मीडिया घटक पुनर्संचयित केले}}", + "assets_restored_successfully": "{count} मीडिया घटक यशस्वीरित्या पुनर्संचयित झाले", + "assets_trashed": "{count} मीडिया घटक कचरापेटीत हलवले", + "assets_trashed_count": "{count, plural, one {# मीडिया घटक कचरापेटीत हलवला} other {# मीडिया घटक कचरापेटीत हलवले}}", + "assets_trashed_from_server": "{count} मीडिया घटक Immich सर्व्हरवरून कचरापेटीत हलवले", + "assets_were_part_of_album_count": "{count, plural, one {मीडिया घटक आधीच त्या अल्बमचा भाग होता} other {मीडिया घटक आधीच त्या अल्बमचा भाग होते}}", + "assets_were_part_of_albums_count": "{count, plural, one {मीडिया घटक आधीच अल्बम्सचा भाग होता} other {मीडिया घटक आधीच अल्बम्सचा भाग होते}}", + "authorized_devices": "अधिकृत उपकरणे", + "automatic_endpoint_switching_subtitle": "उपलब्ध असल्यास निश्‍चित Wi-Fi वर स्थानिकरित्या कनेक्ट करा आणि इतर ठिकाणी पर्यायी कनेक्शन वापरा", + "automatic_endpoint_switching_title": "स्वयंचलित URL स्विचिंग", + "autoplay_slideshow": "स्वयंचलित स्लाइडशो", "back": "मागे", "back_close_deselect": "मागे किंवा बंद करा / निवड रद्द करा", "background_location_permission": "बॅकग्राउंडमध्ये स्थान परवानगी द्या", @@ -562,6 +587,7 @@ "backup_controller_page_turn_on": "फोरग्राउंड बॅकअप चालू करा", "backup_controller_page_uploading_file_info": "फाईल माहिती अपलोड करत आहे", "backup_err_only_album": "अंतिम अल्बम काढता येणार नाही", + "backup_error_sync_failed": "समक्रमण अयशस्वी. बॅकअप प्रक्रिया करता येत नाही.", "backup_info_card_assets": "फाईल्स", "backup_manual_cancelled": "रद्द केले", "backup_manual_in_progress": "अपलोड आधीच चालू आहे. थोड्यावेळेनंतर पुन्हा प्रयत्न करा", @@ -629,6 +655,8 @@ "change_pin_code": "PIN कोड बदला", "change_your_password": "आपला संकेतशब्द बदला", "changed_visibility_successfully": "दृश्यमानता यशस्वीरित्या बदलली", + "charging": "चार्जिंग", + "charging_requirement_mobile_backup": "बॅकग्राउंड बॅकअपसाठी उपकरण चार्ज होत असणे आवश्यक आहे", "check_corrupt_asset_backup": "भ्रष्ट फाईल बॅकअप तपासा", "check_corrupt_asset_backup_button": "तपासणी करा", "check_corrupt_asset_backup_description": "फक्त Wi-Fi वर हा तपास चालवा आणि सर्व फाईल्स बॅकअप झाल्यावरच. प्रक्रिया काही मिनिटे लागू शकते.", @@ -715,6 +743,7 @@ "create_user": "वापरकर्ता तयार करा", "created": "तयार केले", "created_at": "निर्मिती तारीख", + "creating_linked_albums": "लिंक केलेले अल्बम तयार करत आहे...", "crop": "छाटणी करा", "curated_object_page_title": "गोष्टी", "current_device": "वर्तमान उपकरण", @@ -1032,6 +1061,7 @@ "filter_people": "लोक फिल्टर करा", "filter_places": "ठिकाणे फिल्टर करा", "find_them_fast": "नावाने पटकन शोधा", + "first": "प्रथम", "fix_incorrect_match": "चुकीची जुळणी दुरुस्त करा", "folder": "फोल्डर", "folder_not_found": "फोल्डर सापडला नाही", @@ -1042,18 +1072,72 @@ "gcast_enabled": "Google Cast", "gcast_enabled_description": "ही सुविधा चालण्यासाठी Google कडील बाह्य संसाधने लोड करते.", "general": "सामान्य", + "geolocation_instruction_location": "GPS निर्देशांक असलेल्या मीडिया घटकावर क्लिक करून त्याचे स्थान वापरा, किंवा थेट नकाशावरून स्थान निवडा", "get_help": "मदत घ्या", "get_wifiname_error": "Wi-Fi चे नाव मिळाले नाही. आवश्यक परवानग्या दिल्या आहेत आणि Wi-Fi नेटवर्कशी जोडले आहात याची खात्री करा", "getting_started": "सुरुवात करा", "go_back": "मागे जा", "go_to_folder": "फोल्डरकडे जा", "go_to_search": "शोधाकडे जा", + "gps": "जीपीएस", + "gps_missing": "GPS उपलब्ध नाही", "grant_permission": "परवानगी द्या", "group_albums_by": "अल्बम गटबद्ध करा: …", "group_country": "देशानुसार गट करा", "group_no": "गटबद्ध नाही", "group_owner": "मालकानुसार गट करा", "group_places_by": "स्थळे गटबद्ध करा: …", + "group_year": "वर्षानुसार गटबद्ध करा", + "haptic_feedback_switch": "हॅप्टिक फीडबॅक सक्षम करा", + "haptic_feedback_title": "हॅप्टिक फीडबॅक", + "has_quota": "कोटा आहे", + "hash_asset": "मीडिया घटकाचा हॅश तयार करा", + "hashed_assets": "हॅश केलेले मीडिया घटक", + "hashing": "हॅशिंग", + "header_settings_add_header_tip": "हेडर जोडा", + "header_settings_field_validator_msg": "मूल्य रिकामे असू शकत नाही", + "header_settings_header_name_input": "हेडरचे नाव", + "header_settings_header_value_input": "हेडरचे मूल्य", + "headers_settings_tile_subtitle": "प्रत्येक नेटवर्क विनंतीसोबत अ‍ॅपने पाठवायचे प्रॉक्सी हेडर्स परिभाषित करा", + "headers_settings_tile_title": "सानुकूल प्रॉक्सी हेडर्स", + "hi_user": "नमस्कार {name} ({email})", + "hide_all_people": "सर्व व्यक्ती लपवा", + "hide_gallery": "गॅलरी लपवा", + "hide_named_person": "व्यक्ती {name} लपवा", + "hide_password": "संकेतशब्द लपवा", + "hide_person": "व्यक्ती लपवा", + "hide_unnamed_people": "नाव नसलेल्या व्यक्ती लपवा", + "home_page_add_to_album_conflicts": "अल्बम {album} मध्ये {added} मीडिया घटक जोडले. {failed} मीडिया घटक आधीच त्या अल्बममध्ये आहेत.", + "home_page_add_to_album_err_local": "स्थानिक मीडिया घटक अजून अल्बममध्ये जोडता येत नाहीत, वगळत आहे", + "home_page_add_to_album_success": "अल्बम {album} मध्ये {added} मीडिया घटक जोडले.", + "home_page_album_err_partner": "भागीदारचे मीडिया घटक अजून अल्बममध्ये जोडता येत नाहीत, वगळत आहे", + "home_page_archive_err_local": "स्थानिक मीडिया घटक अजून संग्रहित करता येत नाहीत, वगळत आहे", + "home_page_archive_err_partner": "भागीदारचे मीडिया घटक संग्रहित करता येत नाहीत, वगळत आहे", + "home_page_building_timeline": "टाइमलाइन तयार करत आहे", + "home_page_delete_err_partner": "भागीदारचे मीडिया घटक हटवता येत नाहीत, वगळत आहे", + "home_page_delete_remote_err_local": "दूरस्थ हटवण्याच्या निवडीत स्थानिक मीडिया घटक आहेत, वगळत आहे", + "home_page_favorite_err_local": "स्थानिक मीडिया घटकांना अजून आवडीमध्ये जोडता येत नाही, वगळत आहे", + "home_page_favorite_err_partner": "भागीदारचे मीडिया घटक अजून आवडीमध्ये जोडता येत नाहीत, वगळत आहे", + "home_page_first_time_notice": "अ‍ॅप प्रथमच वापरत असाल तर टाइमलाइनमध्ये फोटो आणि व्हिडिओ भरण्यासाठी कृपया बॅकअप अल्बम निवडा", + "home_page_locked_error_local": "स्थानिक मीडिया घटक लॉक केलेल्या फोल्डरमध्ये हलवता येत नाहीत, वगळत आहे", + "home_page_locked_error_partner": "भागीदारचे मीडिया घटक लॉक केलेल्या फोल्डरमध्ये हलवता येत नाहीत, वगळत आहे", + "home_page_share_err_local": "स्थानिक मीडिया घटक लिंकद्वारे शेअर करता येत नाहीत, वगळत आहे", + "home_page_upload_err_limit": "एकावेळी कमाल 30 मीडिया घटकच अपलोड करता येतात, वगळत आहे", + "host": "होस्ट", + "hour": "तास", + "hours": "तास", + "id": "ID", + "idle": "निष्क्रिय", + "ignore_icloud_photos": "iCloud वरील फोटो दुर्लक्षित करा", + "ignore_icloud_photos_description": "iCloud वर साठवलेले फोटो Immich सर्व्हरवर अपलोड केले जाणार नाहीत", + "image": "फोटो", + "image_alt_text_date": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {date} ला घेतले", + "image_alt_text_date_1_person": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {person1} सोबत {date} ला घेतले", + "image_alt_text_date_2_people": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {person1} आणि {person2} सोबत {date} ला घेतले", + "image_alt_text_date_3_people": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {person1}, {person2} आणि {person3} सोबत {date} ला घेतले", + "image_alt_text_date_4_or_more_people": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {person1}, {person2} आणि आणखी {additionalCount, number} जणांसोबत {date} ला घेतले", + "image_alt_text_date_place": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {city}, {country} येथे {date} ला घेतले", + "image_alt_text_date_place_1_person": "{isVideo, select, true {व्हिडिओ} other {फोटो}} {city}, {country} येथे {person1} सोबत {date} ला घेतले", "notification_permission_dialog_content": "सूचना सक्षम करण्यासाठी सेटिंग्जमध्ये जा आणि अनुमती द्या.", "notification_permission_list_tile_content": "सूचना सक्षम करण्यासाठी परवानगी द्या.", "notification_permission_list_tile_enable_button": "सूचना सक्षम करा", @@ -1764,5 +1848,6 @@ "year": "वर्ष", "yes": "हो", "you_dont_have_any_shared_links": "आपल्याकडे कोणतेही सामायिक दुवे नाहीत", - "zoom_image": "प्रतिमा झूम करा" + "zoom_image": "प्रतिमा झूम करा", + "zoom_to_bounds": "सीमेपर्यंत झूम करा" } diff --git a/i18n/nb_NO.json b/i18n/nb_NO.json index 621f67e1aa..75429712d5 100644 --- a/i18n/nb_NO.json +++ b/i18n/nb_NO.json @@ -33,6 +33,7 @@ "add_to_albums": "Legg til i album", "add_to_albums_count": "Legg til i albumer ({count})", "add_to_shared_album": "Legg til delt album", + "add_upload_to_stack": "Legg til opplasting i stakken", "add_url": "Legg til URL", "added_to_archive": "Lagt til i arkivet", "added_to_favorites": "Lagt til favoritter", diff --git a/i18n/nl.json b/i18n/nl.json index 55e934736c..28be27f00f 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -33,6 +33,7 @@ "add_to_albums": "Toevoegen aan albums", "add_to_albums_count": "Toevoegen aan albums ({count})", "add_to_shared_album": "Aan gedeeld album toevoegen", + "add_upload_to_stack": "Voeg upload toe aan stack", "add_url": "URL toevoegen", "added_to_archive": "Toegevoegd aan archief", "added_to_favorites": "Toegevoegd aan favorieten", @@ -42,7 +43,7 @@ "admin_user": "Beheerder gebruiker", "asset_offline_description": "Dit item uit een externe bibliotheek is niet meer beschikbaar op de schijf en is naar de prullenbak verplaatst. Als het bestand binnen de bibliotheek is verplaatst, controleer dan je tijdlijn voor het nieuwe bijbehorende item. Om dit bestand te herstellen, zorg ervoor dat het onderstaande bestandspad toegankelijk is voor Immich en scan de bibliotheek opnieuw.", "authentication_settings": "Authenticatie-instellingen", - "authentication_settings_description": "Wachtwoord, OAuth, en andere authenticatie-instellingen beheren", + "authentication_settings_description": "Wachtwoord-, OAuth-, en andere authenticatie-instellingen beheren", "authentication_settings_disable_all": "Weet je zeker dat je alle inlogmethoden wilt uitschakelen? Inloggen zal volledig worden uitgeschakeld.", "authentication_settings_reenable": "Gebruik een servercommando om opnieuw in te schakelen.", "background_task_job": "Achtergrondtaken", @@ -65,7 +66,7 @@ "confirm_email_below": "Typ hieronder \"{email}\" ter bevestiging", "confirm_reprocess_all_faces": "Weet je zeker dat je alle gezichten opnieuw wilt verwerken? Hiermee worden ook alle mensen gewist.", "confirm_user_password_reset": "Weet je zeker dat je het wachtwoord van {user} wilt resetten?", - "confirm_user_pin_code_reset": "Weet je zeker dat je de PIN code van {user} wilt resetten?", + "confirm_user_pin_code_reset": "Weet je zeker dat je de pincode van {user} wilt resetten?", "create_job": "Taak maken", "cron_expression": "Cron expressie", "cron_expression_description": "Stel het scaninterval in met het cron-formaat. Voor meer informatie kun je bijvoorbeeld kijken naar Crontab Guru", @@ -86,7 +87,7 @@ "image_fullsize_enabled_description": "Genereer afbeelding op volledig formaat voor niet-webvriendelijke formaten. Als “Verkies ingesloten voorbeeldafbeelding” is ingeschakeld, worden ingesloten voorvertoningen direct gebruikt zonder conversie. Heeft geen invloed op webvriendelijke formaten zoals JPEG.", "image_fullsize_quality_description": "Beeldkwaliteit op ware grootte van 1-100. Hoger is beter, maar genereert grotere bestanden.", "image_fullsize_title": "Instellingen afbeelding op ware grootte", - "image_prefer_embedded_preview": "Verkies ingesloten voorbeeldafbeelding", + "image_prefer_embedded_preview": "Voorkeur geven aan ingesloten voorbeeldafbeelding", "image_prefer_embedded_preview_setting_description": "Gebruik ingesloten voorbeeldafbeelding van RAW-bestanden als invoer voor beeldverwerking wanneer beschikbaar. Dit kan preciezere kleuren produceren voor sommige afbeeldingen, maar de kwaliteit van het voorbeeld is afhankelijk van de camera en de afbeelding kan mogelijk meer compressie-artefacten bevatten.", "image_prefer_wide_gamut": "Voorkeur geven aan wide gamut", "image_prefer_wide_gamut_setting_description": "Display P3 gebruiken voor voorbeeldafbeeldingen. Dit behoudt de levendigheid van afbeeldingen met brede kleurruimtes beter, maar afbeeldingen kunnen er anders uitzien op oude apparaten met een oude browserversie. sRGB-afbeeldingen blijven sRGB gebruiken om kleurverschuivingen te vermijden.", @@ -103,7 +104,7 @@ "image_thumbnail_title": "Thumbnailinstellingen", "job_concurrency": "{job} gelijktijdigheid", "job_created": "Taak aangemaakt", - "job_not_concurrency_safe": "Deze taak kan niet gelijktijdig worden uitgevoerd.", + "job_not_concurrency_safe": "Deze taak kan niet parallel worden uitgevoerd.", "job_settings": "Achtergrondtaak-instellingen", "job_settings_description": "Beheer aantal gelijktijdige taken", "job_status": "Taakstatus", @@ -123,20 +124,20 @@ "library_watching_settings_description": "Automatisch gewijzigde bestanden bijhouden", "logging_enable_description": "Logboek inschakelen", "logging_level_description": "Indien ingeschakeld, welk logniveau er wordt gebruikt.", - "logging_settings": "Logging", - "machine_learning_availability_checks": "Beschikbaarheid", + "logging_settings": "Logboek", + "machine_learning_availability_checks": "Beschikbaarheidscontroles", "machine_learning_availability_checks_description": "Automatisch detecteren en selecteren van beschikbare machine learning servers", - "machine_learning_availability_checks_enabled": "Activeer beschikbaarheid controles", + "machine_learning_availability_checks_enabled": "Activeer beschikbaarheidscontroles", "machine_learning_availability_checks_interval": "Controleinterval", - "machine_learning_availability_checks_interval_description": "Interval in milliseconden tussen beschikbaarheid checks", + "machine_learning_availability_checks_interval_description": "Interval in milliseconden tussen beschikbaarheidscontroles", "machine_learning_availability_checks_timeout": "Verzoek time-out", - "machine_learning_availability_checks_timeout_description": "Time-out in milliseconden voor beschikbaarheidschecks", - "machine_learning_clip_model": "CLIP model", - "machine_learning_clip_model_description": "De naam van een CLIP-model dat hier is vermeld. Let op: je moet de 'Slim Zoeken -taak opnieuw uitvoeren voor alle afbeeldingen wanneer je een model wijzigt.", - "machine_learning_duplicate_detection": "Duplicaat detectie", + "machine_learning_availability_checks_timeout_description": "Time-out in milliseconden voor beschikbaarheidscontroles", + "machine_learning_clip_model": "CLIP-model", + "machine_learning_clip_model_description": "De naam van een CLIP-model dat hier is vermeld. Let op: je moet de 'Slim Zoeken'-taak voor alle afbeeldingen opnieuw uitvoeren wanneer je een model wijzigt.", + "machine_learning_duplicate_detection": "Duplicaatdetectie", "machine_learning_duplicate_detection_enabled": "Duplicaatdetectie inschakelen", "machine_learning_duplicate_detection_enabled_description": "Indien uitgeschakeld, worden identieke items nog steeds gededupliceerd.", - "machine_learning_duplicate_detection_setting_description": "Gebruik CLIP om exactie kopieën te vinden", + "machine_learning_duplicate_detection_setting_description": "Gebruik CLIP-embeddings om mogelijke kopieën te vinden", "machine_learning_enabled": "Machine learning inschakelen", "machine_learning_enabled_description": "Wanneer uitgeschakeld zullen alle ML instellingen uitgezet worden, ongeacht onderstaande instellingen.", "machine_learning_facial_recognition": "Gezichtsherkenning", @@ -164,8 +165,8 @@ "manage_log_settings": "Beheer logboekinstellingen", "map_dark_style": "Donkere stijl", "map_enable_description": "Kaartfuncties inschakelen", - "map_gps_settings": "Kaart & GPS Instellingen", - "map_gps_settings_description": "Beheer kaart & GPS (omgekeerde geocodering) instellingen", + "map_gps_settings": "Kaart- & gps-instellingen", + "map_gps_settings_description": "Beheer kaart- & gps-instellingen (omgekeerde geocodering)", "map_implications": "De kaartfunctie is afhankelijk van een externe service (tiles.immich.cloud)", "map_light_style": "Lichte stijl", "map_manage_reverse_geocoding_settings": "Beheer omgekeerde geocodering instellingen", @@ -178,27 +179,27 @@ "memory_cleanup_job": "Herinneringen opschonen", "memory_generate_job": "Herinneringen genereren", "metadata_extraction_job": "Metadata ophalen", - "metadata_extraction_job_description": "Metadata ophalen van ieder item, zoals GPS, gezichten en resolutie", + "metadata_extraction_job_description": "Metadata ophalen van ieder item, zoals gps, gezichten en resolutie", "metadata_faces_import_setting": "Gezichten importeren inschakelen", "metadata_faces_import_setting_description": "Gezichten importeren uit EXIF-gegevens van afbeeldingen en sidecar bestanden", - "metadata_settings": "Metadata instellingen", - "metadata_settings_description": "Beheer metadata instellingen", + "metadata_settings": "Metadata-instellingen", + "metadata_settings_description": "Beheer metadata-instellingen", "migration_job": "Migratie", "migration_job_description": "Migreer thumbnails voor items en gezichten naar de nieuwste mapstructuur", "nightly_tasks_cluster_faces_setting_description": "Gezichtsherkenning uitvoeren op nieuw gedetecteerde gezichten", "nightly_tasks_cluster_new_faces_setting": "Cluster nieuwe gezichten", - "nightly_tasks_database_cleanup_setting": "Database opschoon taken", - "nightly_tasks_database_cleanup_setting_description": "Ruim oude data op van de database", + "nightly_tasks_database_cleanup_setting": "Database-opruimtaken", + "nightly_tasks_database_cleanup_setting_description": "Ruim oude, niet meer geldige data op uit de database", "nightly_tasks_generate_memories_setting": "Genereer herinneringen", "nightly_tasks_generate_memories_setting_description": "Maak nieuwe herinneringen van items", "nightly_tasks_missing_thumbnails_setting": "Genereer ontbrekende thumbnails", "nightly_tasks_missing_thumbnails_setting_description": "Items zonder thumbnail in een wachtrij plaatsen voor het genereren van thumbnails", - "nightly_tasks_settings": "Instellingen voor nacht taken", - "nightly_tasks_settings_description": "Beheer nacht taken", - "nightly_tasks_start_time_setting": "Start tijd", - "nightly_tasks_start_time_setting_description": "De tijd waarop de server begint met het uitvoeren van de nacht taken", - "nightly_tasks_sync_quota_usage_setting": "Synchroniseer quota gebruik", - "nightly_tasks_sync_quota_usage_setting_description": "update gebruiker opslag quota, gebaseerd op huidig gebruik", + "nightly_tasks_settings": "Instellingen voor nachtelijke taken", + "nightly_tasks_settings_description": "Beheer nachtelijke taken", + "nightly_tasks_start_time_setting": "Starttijd", + "nightly_tasks_start_time_setting_description": "De tijd waarop de server begint met het uitvoeren van de nachtelijke taken", + "nightly_tasks_sync_quota_usage_setting": "Synchroniseer opslaglimieten", + "nightly_tasks_sync_quota_usage_setting_description": "Update opslaglimieten van gebruikers, gebaseerd op huidig gebruik", "no_paths_added": "Geen paden toegevoegd", "no_pattern_added": "Geen patroon toegevoegd", "note_apply_storage_label_previous_assets": "Opmerking: om het opslaglabel toe te passen op eerder geüploade items, voer de volgende taak uit", @@ -273,12 +274,12 @@ "storage_template_date_time_sample": "Voorbeeldtijd {date}", "storage_template_enable_description": "Engine voor opslagtemplate inschakelen", "storage_template_hash_verification_enabled": "Hashverificatie ingeschakeld", - "storage_template_hash_verification_enabled_description": "Zet hashverificatie aan, schakel dit niet uit tenzij je zeker bent van de implicaties", + "storage_template_hash_verification_enabled_description": "Zet hashverificatie aan. Schakel dit niet uit tenzij je zeker bent van de gevolgen", "storage_template_migration": "Opslagtemplate migratie", "storage_template_migration_description": "Pas de huidige {template} toe op eerder geüploade items", "storage_template_migration_info": "Wijzigingen in de opslagtemplate worden alleen toegepast op nieuwe items. Om de template met terugwerkende kracht toe te passen op eerder geüploade items, voer je de {job} uit.", "storage_template_migration_job": "Opslagtemplate migratietaak", - "storage_template_more_details": "Voor meer details over deze functie, bekijk de Opslagstemplate en de implicaties daarvan", + "storage_template_more_details": "Meer details over deze functie vind je onder Opslagtemplate, net als de gevolgen daarvan", "storage_template_onboarding_description_v2": "Wanneer ingeschakeld, zal deze functie bestanden automatisch organiseren gebaseerd op een template gedefinieerd door de gebruiker. Voor meer informatie, bekijk de documentatie.", "storage_template_path_length": "Geschatte padlengte: {length, number}/{limit, number}", "storage_template_settings": "Opslagtemplate", @@ -353,7 +354,7 @@ "transcoding_temporal_aq_description": "Alleen van toepassing op NVENC. Verhoogt de kwaliteit van scènes met veel details en weinig beweging. Is mogelijk niet compatibel met oudere apparaten.", "transcoding_threads": "Threads", "transcoding_threads_description": "Hogere waarden leiden tot snellere codering, maar laten minder ruimte over voor de server om andere taken te verwerken terwijl deze actief is. Deze waarde mag niet groter zijn dan het aantal CPU cores. Maximaliseert het gebruik als deze is ingesteld op 0.", - "transcoding_tone_mapping": "Tone-mapping", + "transcoding_tone_mapping": "Tone mapping", "transcoding_tone_mapping_description": "Probeert het uiterlijk van HDR-video's te behouden wanneer ze worden geconverteerd naar SDR. Elk algoritme maakt verschillende afwegingen voor kleur, detail en helderheid. Hable behoudt detail, Mobius behoudt kleur en Reinhard behoudt helderheid.", "transcoding_transcode_policy": "Transcodeerbeleid", "transcoding_transcode_policy_description": "Beleid voor wanneer een video getranscodeerd moet worden. HDR-video's worden altijd getranscodeerd (behalve als transcodering is uitgeschakeld).", @@ -372,7 +373,7 @@ "user_cleanup_job": "Gebruiker opschoning", "user_delete_delay": "Het account en de items van {user} worden over {delay, plural, one {# dag} other {# dagen}} permanent verwijderd.", "user_delete_delay_settings": "Verwijder vertraging", - "user_delete_delay_settings_description": "Aantal dagen na verwijdering om het account en de items van een gebruiker permanent te verwijderen. De taak voor het verwijderen van gebruikers wordt om middernacht uitgevoerd om te controleren of gebruikers verwijderd kunnen worden. Wijzigingen in deze instelling worden bij de volgende uitvoering meegenomen.", + "user_delete_delay_settings_description": "Aantal dagen na verwijdering om het account en de items van een gebruiker permanent te verwijderen. De taak voor het verwijderen van gebruikers wordt om middernacht uitgevoerd om te controleren of gebruiker te verwijderen zijn. Wijzigingen in deze instelling worden bij de volgende uitvoering meegenomen.", "user_delete_immediately": "Het account en de items van {user} worden onmiddellijk in de wachtrij geplaatst voor permanente verwijdering.", "user_delete_immediately_checkbox": "Gebruikers en items in de wachtrij plaatsen voor onmiddellijke verwijdering", "user_details": "Gebruiker details", @@ -418,7 +419,7 @@ "album_added_notification_setting_description": "Ontvang een e-mailmelding wanneer je aan een gedeeld album wordt toegevoegd", "album_cover_updated": "Albumomslag is bijgewerkt", "album_delete_confirmation": "Weet je zeker dat je het album {album} wilt verwijderen?", - "album_delete_confirmation_description": "Als dit album gedeeld is, hebben andere gebruikers er geen toegang meer toe.", + "album_delete_confirmation_description": "Als dit album gedeeld is, zullen andere gebruikers geen toegang meer hebben.", "album_deleted": "Album verwijderd", "album_info_card_backup_album_excluded": "UITGESLOTEN", "album_info_card_backup_album_included": "INBEGREPEN", @@ -664,7 +665,7 @@ "change_password_form_new_password": "Nieuw wachtwoord", "change_password_form_password_mismatch": "Wachtwoorden komen niet overeen", "change_password_form_reenter_new_password": "Vul het wachtwoord opnieuw in", - "change_pin_code": "Wijzig PIN code", + "change_pin_code": "Wijzig pincode", "change_your_password": "Wijzig je wachtwoord", "changed_visibility_successfully": "Zichtbaarheid succesvol gewijzigd", "charging": "Opladen", @@ -707,7 +708,7 @@ "confirm_delete_face": "Weet je zeker dat je het gezicht van {name} wilt verwijderen uit het item?", "confirm_delete_shared_link": "Weet je zeker dat je deze gedeelde link wilt verwijderen?", "confirm_keep_this_delete_others": "Alle andere items in de stack worden verwijderd, behalve deze. Weet je zeker dat je wilt doorgaan?", - "confirm_new_pin_code": "Bevestig nieuwe PIN code", + "confirm_new_pin_code": "Bevestig nieuwe pincode", "confirm_password": "Bevestig wachtwoord", "confirm_tag_face": "Wil je dit gezicht taggen als {name}?", "confirm_tag_face_unnamed": "Wil je dit gezicht taggen?", @@ -759,7 +760,7 @@ "crop": "Bijsnijden", "curated_object_page_title": "Dingen", "current_device": "Huidig apparaat", - "current_pin_code": "Huidige PIN code", + "current_pin_code": "Huidige pincode", "current_server_address": "Huidig serveradres", "custom_locale": "Aangepaste landinstelling", "custom_locale_description": "Formatteer datums en getallen op basis van de taal en de regio", @@ -940,7 +941,7 @@ "failed_to_load_notifications": "Kon meldingen niet laden", "failed_to_load_people": "Kan mensen niet laden", "failed_to_remove_product_key": "Fout bij het verwijderen van de licentiesleutel", - "failed_to_reset_pin_code": "Resetten van PIN code mislukt", + "failed_to_reset_pin_code": "Resetten van pincode mislukt", "failed_to_stack_assets": "Fout bij stapelen van items", "failed_to_unstack_assets": "Fout bij ontstapelen van items", "failed_to_update_notification_status": "Kon notificatiestatus niet updaten", @@ -1005,7 +1006,7 @@ "unable_to_remove_partner": "Kan partner niet verwijderen", "unable_to_remove_reaction": "Kan reactie niet verwijderen", "unable_to_reset_password": "Kan wachtwoord niet resetten", - "unable_to_reset_pin_code": "Kan PIN code niet resetten", + "unable_to_reset_pin_code": "Kan pincode niet resetten", "unable_to_resolve_duplicate": "Kan duplicaat niet oplossen", "unable_to_restore_assets": "Kan items niet herstellen", "unable_to_restore_trash": "Kan niet herstellen uit prullenbak", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Fout bij het bijwerken van de beschrijving", "exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_location": "LOCATIE", + "exif_bottom_sheet_no_description": "Geen beschrijving", "exif_bottom_sheet_people": "MENSEN", "exif_bottom_sheet_person_add_person": "Naam toevoegen", "exit_slideshow": "Diavoorstelling sluiten", @@ -1088,12 +1090,12 @@ "folder_not_found": "Map niet gevonden", "folders": "Mappen", "folders_feature_description": "Bladeren door de mapweergave van de foto's en video's op het bestandssysteem", - "forgot_pin_code_question": "PIN vergeten?", + "forgot_pin_code_question": "Pincode vergeten?", "forward": "Vooruit", "gcast_enabled": "Google Cast", "gcast_enabled_description": "Deze functie gebruikt externe bronnen van Google om te kunnen werken.", "general": "Algemeen", - "geolocation_instruction_location": "Klik op een item met GPS coördinaten om de locatie te gebruiken, of selecteer een locatie direct vanaf de kaart", + "geolocation_instruction_location": "Klik op een item met gps-coördinaten om de locatie te gebruiken, of kies een locatie direct op de kaart", "get_help": "Krijg hulp", "get_wifiname_error": "Kon de WiFi-naam niet ophalen. Zorg ervoor dat je de benodigde machtigingen hebt verleend en verbonden bent met een WiFi-netwerk", "getting_started": "Aan de slag", @@ -1138,7 +1140,7 @@ "home_page_delete_err_partner": "Partner items kunnen niet verwijderd worden, overslaan", "home_page_delete_remote_err_local": "Lokale items staan in verwijder selectie externe items, overslaan", "home_page_favorite_err_local": "Lokale items kunnen nog niet als favoriet worden aangemerkt, overslaan", - "home_page_favorite_err_partner": "Partner items kunnen nog niet ge-favoriet worden, overslaan", + "home_page_favorite_err_partner": "Partner items kunnen nog niet als favoriet gemarkeerd worden, overslaan", "home_page_first_time_notice": "Als dit de eerste keer is dat je de app gebruikt, zorg er dan voor dat je een back-up album kiest, zodat de tijdlijn gevuld kan worden met foto's en video's uit het album", "home_page_locked_error_local": "Kan lokale bestanden niet naar de vergrendelde map verplaatsen, sla over", "home_page_locked_error_partner": "Kan partnerbestanden niet naar de vergrendelde map verplaatsen, sla over", @@ -1182,7 +1184,7 @@ "day_at_onepm": "Iedere dag om 13 uur", "hours": "{hours, plural, one {Ieder uur} other {Iedere {hours, number} uren}}", "night_at_midnight": "Iedere avond om middernacht", - "night_at_twoam": "Iedere nacht om 2 uur" + "night_at_twoam": "Elke nacht om 2 uur" }, "invalid_date": "Ongeldige datum", "invalid_date_format": "Ongeldig datumformaat", @@ -1373,7 +1375,7 @@ "new_api_key": "Nieuwe API-sleutel", "new_password": "Nieuw wachtwoord", "new_person": "Nieuw persoon", - "new_pin_code": "Nieuwe PIN code", + "new_pin_code": "Nieuwe pincode", "new_pin_code_subtitle": "Dit is de eerste keer dat u de vergrendelde map opent. Stel een pincode in om deze pagina veilig te openen", "new_timeline": "Nieuwe tijdlijn", "new_user_created": "Nieuwe gebruiker aangemaakt", @@ -1407,7 +1409,7 @@ "no_results_description": "Probeer een synoniem of een algemener zoekwoord", "no_shared_albums_message": "Maak een album om foto's en video's te delen met mensen in je netwerk", "no_uploads_in_progress": "Geen uploads bezig", - "not_available": "N.B.", + "not_available": "n.v.t.", "not_in_any_album": "Niet in een album", "not_selected": "Niet geselecteerd", "note_apply_storage_label_to_previously_uploaded assets": "Opmerking: om het opslaglabel toe te passen op eerder geüploade items, voer de volgende taak uit", @@ -1427,7 +1429,7 @@ "ok": "Ok", "oldest_first": "Oudste eerst", "on_this_device": "Op dit apparaat", - "onboarding": "Onboarding", + "onboarding": "Introductie", "onboarding_locale_description": "Selecteer je voorkeurstaal. Je dan dit later wijzigen in je instellingen.", "onboarding_privacy_description": "De volgende (optionele) functies zijn afhankelijk van externe services en kunnen op elk moment worden uitgeschakeld in de instellingen.", "onboarding_server_welcome_description": "Laten we je instantie instellen met een aantal veelgebruikte instellingen.", @@ -1514,9 +1516,9 @@ "photos_count": "{count, plural, one {{count, number} foto} other {{count, number} foto's}}", "photos_from_previous_years": "Foto's van voorgaande jaren", "pick_a_location": "Kies een locatie", - "pin_code_changed_successfully": "PIN code succesvol gewijzigd", - "pin_code_reset_successfully": "PIN code succesvol gereset", - "pin_code_setup_successfully": "PIN code succesvol ingesteld", + "pin_code_changed_successfully": "Pincode succesvol gewijzigd", + "pin_code_reset_successfully": "Pincode succesvol gereset", + "pin_code_setup_successfully": "Pincode succesvol ingesteld", "pin_verification": "Pincodeverificatie", "place": "Plaats", "places": "Plaatsen", @@ -1571,7 +1573,7 @@ "purchase_input_suggestion": "Heb je een licentiesleutel? Voer deze hieronder in", "purchase_license_subtitle": "Koop Immich om de verdere ontwikkeling van de service te ondersteunen", "purchase_lifetime_description": "Levenslange aankoop", - "purchase_option_title": "AANKOOP MOGELIJKHEDEN", + "purchase_option_title": "AANKOOPMOGELIJKHEDEN", "purchase_panel_info_1": "Het bouwen van Immich kost veel tijd en moeite, en we hebben fulltime engineers die eraan werken om het zo goed mogelijk te maken. Onze missie is om open-source software en ethische bedrijfspraktijken een duurzame inkomstenbron te laten worden voor ontwikkelaars en een ecosysteem te creëren dat de privacy respecteert met echte alternatieven voor uitbuitende cloudservices.", "purchase_panel_info_2": "Omdat we ons inzetten om geen paywalls toe te voegen, krijg je met deze aankoop geen extra functies in Immich. We vertrouwen op gebruikers zoals jij om de verdere ontwikkeling van Immich te ondersteunen.", "purchase_panel_title": "Steun het project", @@ -1585,7 +1587,7 @@ "purchase_server_description_2": "Supporterstatus", "purchase_server_title": "Server", "purchase_settings_server_activated": "De licentiesleutel van de server wordt beheerd door de beheerder", - "query_asset_id": "Query Asset ID", + "query_asset_id": "Item-ID opvragen", "queue_status": "Wachtrij {count}/{total}", "rating": "Sterwaardering", "rating_clear": "Waardering verwijderen", @@ -1657,10 +1659,10 @@ "reset": "Resetten", "reset_password": "Wachtwoord resetten", "reset_people_visibility": "Zichtbaarheid mensen resetten", - "reset_pin_code": "Reset PIN code", - "reset_pin_code_description": "Als je jouw PIN code bent vergeten, neem dan contact op met de administrator van de server om deze te resetten", - "reset_pin_code_success": "Resetten van PIN code gelukt", - "reset_pin_code_with_password": "Je kan altijd je PIN code resetten met je wachtwoord", + "reset_pin_code": "Reset pincode", + "reset_pin_code_description": "Als je jouw pincode bent vergeten, neem dan contact op met de administrator van de server om deze te resetten", + "reset_pin_code_success": "Resetten van pincode gelukt", + "reset_pin_code_with_password": "Je kan je pincode altijd resetten met je wachtwoord", "reset_sqlite": "SQLite database resetten", "reset_sqlite_confirmation": "Ben je zeker dat je de SQLite database wilt resetten? Je zal moeten uitloggen om de data opnieuw te synchroniseren", "reset_sqlite_success": "De SQLite database is succesvol gereset", @@ -1767,7 +1769,7 @@ "select_user_for_sharing_page_err_album": "Album aanmaken mislukt", "selected": "Geselecteerd", "selected_count": "{count, plural, other {# geselecteerd}}", - "selected_gps_coordinates": "Geselecteerde GPS Coördinaten", + "selected_gps_coordinates": "Geselecteerde gps-coördinaten", "send_message": "Bericht versturen", "send_welcome_email": "Stuur welkomstmail", "server_endpoint": "Server-URL", @@ -1811,7 +1813,7 @@ "settings": "Instellingen", "settings_require_restart": "Start Immich opnieuw op om deze instelling toe te passen", "settings_saved": "Instellingen opgeslagen", - "setup_pin_code": "Stel een PIN code in", + "setup_pin_code": "Stel een pincode in", "share": "Delen", "share_action_prompt": "{count} item(s) gedeeld", "share_add_photos": "Foto's toevoegen", @@ -1947,7 +1949,7 @@ "support_and_feedback": "Ondersteuning & feedback", "support_third_party_description": "Je Immich installatie is door een derde partij samengesteld. Problemen die je ervaart, kunnen door dat pakket veroorzaakt zijn. Meld problemen in eerste instantie bij hen via de onderstaande links.", "swap_merge_direction": "Wissel richting voor samenvoegen om", - "sync": "Sync", + "sync": "Synchroniseren", "sync_albums": "Albums synchroniseren", "sync_albums_manual_subtitle": "Synchroniseer alle geüploade video’s en foto’s naar de geselecteerde back-up albums", "sync_local": "Lokaal synchroniseren", @@ -2015,8 +2017,8 @@ "trashed_items_will_be_permanently_deleted_after": "Items in de prullenbak worden na {days, plural, one {# dag} other {# dagen}} permanent verwijderd.", "troubleshoot": "Problemen oplossen", "type": "Type", - "unable_to_change_pin_code": "PIN code kan niet gewijzigd worden", - "unable_to_setup_pin_code": "PIN code kan niet ingesteld worden", + "unable_to_change_pin_code": "Pincode kan niet gewijzigd worden", + "unable_to_setup_pin_code": "Pincode kan niet ingesteld worden", "unarchive": "Herstellen uit archief", "unarchive_action_prompt": "{count} verwijderd uit het archief", "unarchived_count": "{count, plural, other {# verwijderd uit archief}}", @@ -2073,8 +2075,8 @@ "user_has_been_deleted": "Deze gebruiker is verwijderd.", "user_id": "Gebruikers ID", "user_liked": "{user} heeft {type, select, photo {deze foto} video {deze video} asset {} other {dit item}} geliket", - "user_pin_code_settings": "PIN Code", - "user_pin_code_settings_description": "Beheer je PIN code", + "user_pin_code_settings": "Pincode", + "user_pin_code_settings_description": "Beheer je pincode", "user_privacy": "Gebruikersprivacy", "user_purchase_settings": "Kopen", "user_purchase_settings_description": "Beheer je aankoop", @@ -2095,8 +2097,8 @@ "version_history": "Versiegeschiedenis", "version_history_item": "{version} geïnstalleerd op {date}", "video": "Video", - "video_hover_setting": "Speel videothumbnail af bij hoveren", - "video_hover_setting_description": "Speel videothumbnail af wanneer de muis over het item beweegt. Zelfs wanneer uitgeschakeld, kan het afspelen worden gestart door de muis over het afspeelpictogram te bewegen.", + "video_hover_setting": "Speel videominiatuur af bij hoveren", + "video_hover_setting_description": "Speel videominiatuur af wanneer de muis over het item beweegt. Zelfs wanneer uitgeschakeld, kan het afspelen worden gestart door de muis over het afspeelpictogram te bewegen.", "videos": "Video's", "videos_count": "{count, plural, one {# video} other {# video's}}", "view": "Bekijken", diff --git a/i18n/pa.json b/i18n/pa.json index 0967ef424b..0801a54351 100644 --- a/i18n/pa.json +++ b/i18n/pa.json @@ -1 +1,21 @@ -{} +{ + "about": "ਐਪ ਬਾਰੇ", + "account": "ਖ਼ਾਤਾ", + "account_settings": "ਖ਼ਾਤਾ ਸੈਟਿੰਗਾਂ", + "action": "ਕਾਰਵਾਈ", + "action_common_update": "ਅੱਪਡੇਟ", + "actions": "ਕਾਰਵਾਈਆਂ", + "active": "ਕਿਰਿਆਸ਼ੀਲ", + "activity": "ਗਤੀਵਿਧੀ", + "add": "ਸ਼ਾਮਲ ਕਰੋ", + "add_a_description": "ਵੇਰਵਾ ਸ਼ਾਮਲ ਕਰੋ", + "add_a_location": "ਇੱਕ ਸਥਾਨ ਸ਼ਾਮਲ ਕਰੋ", + "add_a_name": "ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ", + "add_a_title": "ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ", + "add_birthday": "ਜਨਮਦਿਨ ਸ਼ਾਮਲ ਕਰੋ", + "add_endpoint": "ਐਂਡਪੁਆਇੰਟ ਸ਼ਾਮਲ ਕਰੋ", + "add_exclusion_pattern": "ਅਲਹਿਦਗੀ ਪੈਟਰਨ ਸ਼ਾਮਲ ਕਰੋ", + "add_import_path": "ਆਯਾਤ ਮਾਰਗ ਸ਼ਾਮਲ ਕਰੋ", + "add_location": "ਸਥਾਨ ਸ਼ਾਮਲ ਕਰੋ", + "add_more_users": "ਹੋਰ ਉਪਭੋਗਤਾ ਸ਼ਾਮਲ ਕਰੋ" +} diff --git a/i18n/pl.json b/i18n/pl.json index a97ea701d0..2531f8210d 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -33,6 +33,7 @@ "add_to_albums": "Dodaj do albumów", "add_to_albums_count": "Dodaj do albumów ({count})", "add_to_shared_album": "Dodaj do udostępnionego albumu", + "add_upload_to_stack": "Dodaj przesłane do stosu", "add_url": "Dodaj URL", "added_to_archive": "Dodano do archiwum", "added_to_favorites": "Dodano do ulubionych", @@ -676,10 +677,10 @@ "choose_matching_people_to_merge": "Wybierz osoby, aby złączyć je w jedną", "city": "Miasto", "clear": "Wyczyść", - "clear_all": "Wyczyść", + "clear_all": "Wyczyść wszystko", "clear_all_recent_searches": "Usuń ostatnio wyszukiwane", "clear_file_cache": "Wyczyść pamięć podręczną plików", - "clear_message": "Zamknij wiadomość", + "clear_message": "Wyczyść wiadomość", "clear_value": "Wyczyść wartość", "client_cert_dialog_msg_confirm": "OK", "client_cert_enter_password": "Wprowadź hasło", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Wystąpił błąd podczas aktualizacji opisu", "exif_bottom_sheet_details": "SZCZEGÓŁY", "exif_bottom_sheet_location": "LOKALIZACJA", + "exif_bottom_sheet_no_description": "Brak opisu", "exif_bottom_sheet_people": "LUDZIE", "exif_bottom_sheet_person_add_person": "Dodaj nazwę", "exit_slideshow": "Zamknij Pokaz Slajdów", diff --git a/i18n/pt.json b/i18n/pt.json index 6bd4a786dd..fdb3561ed2 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -33,6 +33,7 @@ "add_to_albums": "Adicionar aos álbuns", "add_to_albums_count": "Adicionar aos álbuns ({count})", "add_to_shared_album": "Adicionar ao álbum partilhado", + "add_upload_to_stack": "Adicionar carregamento à fila", "add_url": "Adicionar URL", "added_to_archive": "Adicionado ao arquivo", "added_to_favorites": "Adicionado aos favoritos", @@ -599,14 +600,14 @@ "backup_controller_page_turn_on": "Ativar backup", "backup_controller_page_uploading_file_info": "Enviando arquivo", "backup_err_only_album": "Não é possível remover apenas o álbum", - "backup_error_sync_failed": "A sincronização falhou. Não é possível fazer cópia de segurança.", + "backup_error_sync_failed": "A sincronização falhou. Não é possível fazer a cópia de segurança.", "backup_info_card_assets": "arquivos", "backup_manual_cancelled": "Cancelado", "backup_manual_in_progress": "Envio já está em progresso. Tente novamente mais tarde", "backup_manual_success": "Sucesso", "backup_manual_title": "Estado do envio", "backup_options": "Definições de cópia de segurança", - "backup_options_page_title": "Opções de backup", + "backup_options_page_title": "Opções de cópia de segurança", "backup_setting_subtitle": "Gerenciar as configurações de envio em primeiro e segundo plano", "backup_settings_subtitle": "Gerir definições de carregamento", "backward": "Para trás", diff --git a/i18n/pt_BR.json b/i18n/pt_BR.json index a4d590bc2c..5103df2ebc 100644 --- a/i18n/pt_BR.json +++ b/i18n/pt_BR.json @@ -33,6 +33,7 @@ "add_to_albums": "Adicionar aos álbuns", "add_to_albums_count": "Adicionar aos álbuns ({count})", "add_to_shared_album": "Adicionar ao álbum compartilhado", + "add_upload_to_stack": "Adicionar upload ao grupo", "add_url": "Adicionar URL", "added_to_archive": "Adicionado ao arquivo", "added_to_favorites": "Adicionado aos favoritos", @@ -784,7 +785,7 @@ "default_locale": "Localização Padrão", "default_locale_description": "Formatar datas e números baseados na linguagem do seu navegador", "delete": "Excluir", - "delete_action_confirmation_message": "Confirma deletar este arquivo? O arquivo será enviado para a lixeira do servidor e depois perguntará se deseja deletar do seu dispositivo local", + "delete_action_confirmation_message": "Tem certeza? O arquivo será enviado para a lixeira do servidor, depois você poderá confirmar se deseja também deletar do seu dispositivo local", "delete_action_prompt": "{count} deletados", "delete_album": "Excluir álbum", "delete_api_key_prompt": "Tem certeza de que deseja excluir esta chave de API?", @@ -2039,7 +2040,7 @@ "unselect_all": "Desselecionar todos", "unselect_all_duplicates": "Desselecionar todas as duplicatas", "unselect_all_in": "Remover seleção de {group}", - "unstack": "Retirar do grupo", + "unstack": "Desagrupar", "unstack_action_prompt": "{count} desagrupados", "unstacked_assets_count": "{count, plural, one {# arquivo retirado} other {# arquivos retirados}} do grupo", "untagged": "Marcador removido", diff --git a/i18n/ro.json b/i18n/ro.json index 71784cfcf9..ffa7d6f6f0 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -479,7 +479,7 @@ "archive_size": "Mărime arhivă", "archive_size_description": "Configurează dimensiunea arhivei pentru descărcări (în GiB)", "archived": "Arhivat", - "archived_count": "{count, plural, other {Arhivat/e#}}", + "archived_count": "{count, plural, one {Arhivat} few {# arhivate} other {# arhivate}}", "are_these_the_same_person": "Sunt aceștia aceeași persoană?", "are_you_sure_to_do_this": "Sunteți sigur că doriți să faceți acest lucru?", "asset_action_delete_err_read_only": "Fișierele cu permisiuni doar de citire nu au putut fi șterse, omitere", @@ -1086,7 +1086,7 @@ "fix_incorrect_match": "Remediați potrivirea incorectă", "folder": "Dosar", "folder_not_found": "Dosar negăsit", - "folders": "Foldere", + "folders": "Fișiere", "folders_feature_description": "Răsfoire în conținutul folderului pentru fotografiile și videoclipurile din sistemul de fișiere", "forgot_pin_code_question": "Ai uitat codul PIN?", "forward": "Redirecționare", @@ -1287,7 +1287,7 @@ "loop_videos_description": "Activați pentru a rula in buclă automat un videoclip în vizualizatorul de detalii.", "main_branch_warning": "Utilizați o versiune de dezvoltare; vă recomandăm insistent să utilizați o versiune de lansare!", "main_menu": "Meniu principal", - "make": "Face", + "make": "Marcă", "manage_geolocation": "Gestionați locația", "manage_shared_links": "Administrați link-urile distribuite", "manage_sharing_with_partners": "Gestionați partajarea cu partenerii", @@ -1503,8 +1503,8 @@ "permission_onboarding_permission_limited": "Permisiune limitată. Pentru a permite Immich să facă copii de siguranță și să gestioneze întreaga colecție de galerii, acordă permisiuni pentru fotografii și videoclipuri în Setări.", "permission_onboarding_request": "Immich necesită permisiunea de a vizualiza fotografiile și videoclipurile tale.", "person": "Persoanǎ", - "person_age_months": "{months, plural, one {# month} other {# months}} vechime", - "person_age_year_months": "1 year, {months, plural, one {# month} other {# months}} vechime", + "person_age_months": "{months, plural, one {# lună} other {# luni}}", + "person_age_year_months": "1 an, {months, plural, one {# lună} other {# luni}}", "person_age_years": "{years, plural, other {# years}} vechime", "person_birthdate": "Născut pe {date}", "person_hidden": "{name}{hidden, select, true { (ascuns)} other {}}", @@ -1701,8 +1701,8 @@ "search_by_filename_example": "i.e. IMG_1234.JPG sau PNG", "search_camera_make": "Se caută marca camerei...", "search_camera_model": "Se caută modelul camerei...", - "search_city": "Se caută orașul...", - "search_country": "Se caută țara...", + "search_city": "Caută în orașul...", + "search_country": "Caută în țara...", "search_filter_apply": "Aplicați filtrul", "search_filter_camera_title": "Selectați tipul de cameră", "search_filter_date": "Dată", @@ -1717,7 +1717,7 @@ "search_filter_media_type_title": "Selectați tipul media", "search_filter_people_title": "Selectați persoane", "search_for": "Căutare după", - "search_for_existing_person": "Se caută o persoană existentă", + "search_for_existing_person": "Caută o persoană existentă", "search_no_more_result": "Nu mai există rezultate", "search_no_people": "Fără persoane", "search_no_people_named": "Nicio persoană numită \"{name}\"", @@ -1739,7 +1739,7 @@ "search_rating": "Caută după notă...", "search_result_page_new_search_hint": "Căutare nouă", "search_settings": "Setări de căutare", - "search_state": "Starea căutării...", + "search_state": "Caută în Stat/Județ...", "search_suggestion_list_smart_search_hint_1": "Căutarea inteligentă este activată în mod implicit, pentru a căuta metadata, utilizează sintaxa ", "search_suggestion_list_smart_search_hint_2": "m:termen-de-căutare", "search_tags": "Căutați etichete...", @@ -1928,7 +1928,7 @@ "start": "Început", "start_date": "Data de începere", "start_date_before_end_date": "Data de început trebuie să fie înainte de data de sfârșit", - "state": "Situaţie", + "state": "Stat/Județ", "status": "Stare", "stop_casting": "Opriți difuzarea", "stop_motion_photo": "Opriți Fotografia in Mișcare", diff --git a/i18n/ru.json b/i18n/ru.json index 51d80614d3..17d6c804a2 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -33,6 +33,7 @@ "add_to_albums": "Добавить в альбомы", "add_to_albums_count": "Добавить в альбомы ({count})", "add_to_shared_album": "Добавить в общий альбом", + "add_upload_to_stack": "Загрузить и добавить в группу", "add_url": "Добавить URL", "added_to_archive": "Добавлено в архив", "added_to_favorites": "Добавлено в избранное", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Не удалось обновить описание", "exif_bottom_sheet_details": "ПОДРОБНОСТИ", "exif_bottom_sheet_location": "МЕСТО", + "exif_bottom_sheet_no_description": "Нет описания", "exif_bottom_sheet_people": "ЛЮДИ", "exif_bottom_sheet_person_add_person": "Добавить имя", "exit_slideshow": "Выйти из слайд-шоу", @@ -1639,7 +1641,7 @@ "remove_tag": "Удалить тег", "remove_url": "Удалить URL", "remove_user": "Удалить пользователя", - "removed_api_key": "Удалён API ключ {name}", + "removed_api_key": "API ключ \"{name}\" удалён", "removed_from_archive": "Удален из архива", "removed_from_favorites": "Удалено из избранного", "removed_from_favorites_count": "{count, plural, one {# объект удалён} many {# объектов удалено} other {# объекта удалено}} из избранного", @@ -1779,7 +1781,7 @@ "server_stats": "Статистика сервера", "server_version": "Версия сервера", "set": "Установить", - "set_as_album_cover": "Установить как обложку альбома", + "set_as_album_cover": "Установить обложкой альбома", "set_as_featured_photo": "Установить как основное фото", "set_as_profile_picture": "Установить как фото профиля", "set_date_of_birth": "Установить дату рождения", diff --git a/i18n/sk.json b/i18n/sk.json index de8f12dfa5..97f4ca07f4 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -33,6 +33,7 @@ "add_to_albums": "Pridať do albumov", "add_to_albums_count": "Pridať do albumov ({count})", "add_to_shared_album": "Pridať do zdieľaného albumu", + "add_upload_to_stack": "Pridať nahraté do zoskupených", "add_url": "Pridať URL", "added_to_archive": "Pridané do archívu", "added_to_favorites": "Pridané do obľúbených", @@ -364,7 +365,7 @@ "trash_enabled_description": "Povoliť funkcie koša", "trash_number_of_days": "Počet dní", "trash_number_of_days_description": "Počet dní, počas ktorých sa majú médiá ponechať v koši pred ich trvalým odstránením", - "trash_settings": "Kôš", + "trash_settings": "Nastavenia koša", "trash_settings_description": "Spravovať nastavenia koša", "unlink_all_oauth_accounts": "Odpojiť všetky účty OAuth", "unlink_all_oauth_accounts_description": "Nezabudnite odpojiť všetky účty OAuth pred prechodom na nového poskytovateľa.", @@ -499,7 +500,7 @@ "asset_list_settings_subtitle": "Nastavenia rozloženia mriežky fotografií", "asset_list_settings_title": "Mriežka fotografií", "asset_offline": "Médium je offline", - "asset_offline_description": "Toto externý obsah sa už nenachádza na disku. Požiadajte o pomoc svojho správcu Immich.", + "asset_offline_description": "Tento externá položka sa už nenachádza na disku. Pre pomoc sa prosím obráťte na správcu systému Immich.", "asset_restored_successfully": "Položky boli úspešne obnovené", "asset_skipped": "Preskočené", "asset_skipped_in_trash": "V koši", @@ -703,10 +704,10 @@ "common_server_error": "Skontrolujte svoje sieťové pripojenie, uistite sa, že server je dostupný a verzie aplikácie/server sú kompatibilné.", "completed": "Dokončené", "confirm": "Potvrdiť", - "confirm_admin_password": "Potvrdiť Administrátorské Heslo", + "confirm_admin_password": "Potvrdiť heslo správcu", "confirm_delete_face": "Naozaj chcete z položky odstrániť tvár osoby {name}?", "confirm_delete_shared_link": "Ste si istý, že chcete odstrániť tento zdieľaný odkaz?", - "confirm_keep_this_delete_others": "Všetky ostatné položky v zásobníku budú odstránené okrem tejto položky. Naozaj chcete pokračovať?", + "confirm_keep_this_delete_others": "Všetky ostatné položky v zoskupení budú odstránené okrem tejto položky. Naozaj chcete pokračovať?", "confirm_new_pin_code": "Potvrdiť nový PIN kód", "confirm_password": "Potvrdiť heslo", "confirm_tag_face": "Chcete označiť túto tvár ako {name}?", @@ -942,7 +943,7 @@ "failed_to_remove_product_key": "Nepodarilo sa odstrániť produktový kľúč", "failed_to_reset_pin_code": "PIN kód sa nepodarilo obnoviť", "failed_to_stack_assets": "Nepodarilo sa zoskupiť položky", - "failed_to_unstack_assets": "Nepodarilo sa rozdeliť položky", + "failed_to_unstack_assets": "Nepodarilo sa zrušiť zoskupenie položiek", "failed_to_update_notification_status": "Nepodarilo sa aktualizovať stav oznámenia", "import_path_already_exists": "Táto cesta importu už existuje.", "incorrect_email_or_password": "Nesprávny e-mail alebo heslo", @@ -1056,7 +1057,7 @@ "export_database": "Exportovať databázu", "export_database_description": "Exportovať databázu SQLite", "extension": "Prípona", - "external": "Externý", + "external": "Externá", "external_libraries": "Externé knižnice", "external_network": "Externá sieť", "external_network_sheet_info": "Ak nie ste v preferovanej sieti Wi-Fi, aplikácia sa pripojí k serveru prostredníctvom prvej z nižšie uvedených adries URL, na ktorú sa dostane, počnúc zhora nadol", @@ -1198,8 +1199,8 @@ "jobs": "Úlohy", "keep": "Ponechať", "keep_all": "Ponechať všetko", - "keep_this_delete_others": "Ponechať toto, odstrániť ostatné", - "kept_this_deleted_others": "Ponechal túto položku a odstránil {count, plural, one {# položku} few {# položky} other {# položiek}}", + "keep_this_delete_others": "Ponechať túto, odstrániť ostatné", + "kept_this_deleted_others": "Táto položka bola ponechaná a {count, plural, one {odstránila sa # položka} few {odstránili sa # položky} other {odstránilo sa # položiek}}", "keyboard_shortcuts": "Klávesové skratky", "language": "Jazyk", "language_no_results_subtitle": "Skúste upraviť hľadaný výraz", @@ -1382,7 +1383,7 @@ "next": "Ďalej", "next_memory": "Ďalšia spomienka", "no": "Nie", - "no_albums_message": "Vytvorí album na organizovanie fotiek a videí", + "no_albums_message": "Vytvorte album na usporiadanie svojich fotiek a videí", "no_albums_with_name_yet": "Vyzerá, že zatiaľ nemáte album s týmto názvom.", "no_albums_yet": "Vyzerá, že zatiaľ nemáte žiadne albumy.", "no_archived_assets_message": "Archivujte fotografie a videá a skryte ich z vášho zobrazenia fotografií", @@ -1395,7 +1396,7 @@ "no_exif_info_available": "Nie sú dostupné exif údaje", "no_explore_results_message": "Nahrajte viac fotiek na objavovanie vašej zbierky.", "no_favorites_message": "Pridajte si obľúbené, aby ste rýchlo našli svoje najlepšie obrázky a videá", - "no_libraries_message": "Vytvorí externú knižnicu na prezeranie fotiek a videí", + "no_libraries_message": "Vytvorte externú knižnicu na prezeranie fotiek a videí", "no_local_assets_found": "Neboli nájdené žiadne lokálne položky s touto kontrolnou sumou", "no_locked_photos_message": "Fotografie a videá v zamknutom priečinku sú skryté a nezobrazujú sa pri prehľadávaní alebo vyhľadávaní v knižnici.", "no_name": "Bez mena", @@ -1405,7 +1406,7 @@ "no_remote_assets_found": "Neboli nájdené žiadne vzdialené položky s touto kontrolnou sumou", "no_results": "Žiadne výsledky", "no_results_description": "Skúste synonymum alebo všeobecnejší výraz", - "no_shared_albums_message": "Vytvorí album na zdieľanie fotiek a videí s ľuďmi vo vašej sieti", + "no_shared_albums_message": "Vytvorte album na zdieľanie fotiek a videí s ľuďmi vo vašej sieti", "no_uploads_in_progress": "Žiadne prebiehajúce nahrávanie", "not_available": "Nedostupné", "not_in_any_album": "Nie je v žiadnom albume", @@ -1450,7 +1451,7 @@ "other_devices": "Ďalšie zariadenia", "other_entities": "Ostatné subjekty", "other_variables": "Ostatné premenné", - "owned": "Vlastnené", + "owned": "Vlastné", "owner": "Vlastník", "partner": "Partner", "partner_can_access": "{partner} môže pristupovať", @@ -1510,7 +1511,7 @@ "person_hidden": "{name}{hidden, select, true { (skryté)} other {}}", "photo_shared_all_users": "Vyzerá, že zdieľate svoje fotky so všetkými používateľmi alebo nemáte žiadnych používateľov.", "photos": "Fotografie", - "photos_and_videos": "Fotografie & Videa", + "photos_and_videos": "Fotografie a videá", "photos_count": "{count, plural, one {{count, number} fotka} few {{count, number} fotky} other {{count, number} fotiek}}", "photos_from_previous_years": "Fotky z minulých rokov", "pick_a_location": "Vyberte polohu", @@ -1863,7 +1864,7 @@ "shared_link_options": "Možnosti zdieľaných odkazov", "shared_link_password_description": "Vyžadovať heslo pre prístup k tomuto zdieľanému odkazu", "shared_links": "Zdieľané odkazy", - "shared_links_description": "Zdieľanie fotografií a videí pomocou odkazu", + "shared_links_description": "Zdieľajte fotografie a videá pomocou odkazu", "shared_photos_and_videos_count": "{assetCount, plural, few {# zdieľané fotky a videá.} other {# zdieľaných fotiek a videí.}}", "shared_with_me": "Zdieľané so mnou", "shared_with_partner": "Zdieľané s {partner}", @@ -1918,9 +1919,9 @@ "sort_recent": "Najnovšia fotografia", "sort_title": "Názov", "source": "Zdroj", - "stack": "Zoskupenie", + "stack": "Zoskupiť", "stack_action_prompt": "{count} zoskupených", - "stack_duplicates": "Zoskupiť duplicity", + "stack_duplicates": "Zoskupiť duplikáty", "stack_select_one_photo": "Vyberte jednu hlavnú fotku pre zoskupenie", "stack_selected_photos": "Zoskupiť vybraté fotky", "stacked_assets_count": "{count, plural, one {Zoskupená # položka} few {Zoskupené # položky} other {Zoskupených # položiek}}", @@ -1932,7 +1933,7 @@ "status": "Stav", "stop_casting": "Zastaviť prenos", "stop_motion_photo": "Stopmotion fotka", - "stop_photo_sharing": "Zastaviť zdieľanie vašich fotiek?", + "stop_photo_sharing": "Zastaviť zdieľanie vašich fotografií?", "stop_photo_sharing_description": "{partner} už nebude mať prístup k vašim fotkám.", "stop_sharing_photos_with_user": "Zastaviť zdieľanie vašich fotiek s týmto používateľom", "storage": "Ukladací priestor", @@ -1994,7 +1995,7 @@ "to_multi_select": "na viacnásobný výber", "to_parent": "Prejsť k nadradenému", "to_select": "na výber", - "to_trash": "Kôš", + "to_trash": "Do koša", "toggle_settings": "Prepnúť nastavenie", "total": "Celkom", "total_usage": "Celkové využitie", @@ -2006,7 +2007,7 @@ "trash_emptied": "Kôš vyprázdnený", "trash_no_results_message": "Vymazané fotografie a videá sa zobrazia tu.", "trash_page_delete_all": "Vymazať všetky", - "trash_page_empty_trash_dialog_content": "Skutočne chcete vyprázdniť kôš? Tieto položky budú permanentne odstránené z aplikácie Immich", + "trash_page_empty_trash_dialog_content": "Skutočne chcete vyprázdniť kôš? Tieto položky budú natrvalo odstránené z aplikácie Immich", "trash_page_info": "Médiá v koši sa permanentne odstránia po {days} dňoch", "trash_page_no_assets": "Žiadne médiá v koši", "trash_page_restore_all": "Obnoviť všetky", @@ -2039,9 +2040,9 @@ "unselect_all": "Zrušiť výber všetkých", "unselect_all_duplicates": "Zrušiť výber všetkých duplicít", "unselect_all_in": "Zrušiť výber všetkých v {group}", - "unstack": "Odskupiť", + "unstack": "Zrušiť zoskupenie", "unstack_action_prompt": "{count} nezoskupených", - "unstacked_assets_count": "Zrušenie zoskupenia pre {count, plural, one {# položku} few {# položky} other {# položiek}}", + "unstacked_assets_count": "Zrušené zoskupenia pre {count, plural, one {# položku} few {# položky} other {# položiek}}", "untagged": "Bez štítku", "up_next": "To je všetko", "update_location_action_prompt": "Aktualizovať polohu {count} vybraných položiek pomocou:", @@ -2116,7 +2117,7 @@ "view_user": "Zobraziť používateľa", "viewer_remove_from_stack": "Odstrániť zo zoskupenia", "viewer_stack_use_as_main_asset": "Použiť ako hlavnú fotku", - "viewer_unstack": "Odskupiť", + "viewer_unstack": "Zrušiť zoskupenie", "visibility_changed": "Viditeľnosť zmenená pre {count, plural, one {# osobu} few {# osoby} other {# osôb}}", "waiting": "Čakajúce", "warning": "Varovanie", diff --git a/i18n/sl.json b/i18n/sl.json index bcea0de5cf..3939cdfa52 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -33,6 +33,7 @@ "add_to_albums": "Dodaj v albume", "add_to_albums_count": "Dodaj v albume ({count})", "add_to_shared_album": "Dodaj k deljenemu albumu", + "add_upload_to_stack": "Dodaj nalaganje v sklad", "add_url": "Dodaj URL", "added_to_archive": "Dodano v arhiv", "added_to_favorites": "Dodano med priljubljene", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Napaka pri posodabljanju opisa", "exif_bottom_sheet_details": "PODROBNOSTI", "exif_bottom_sheet_location": "LOKACIJA", + "exif_bottom_sheet_no_description": "Ni opisa", "exif_bottom_sheet_people": "OSEBE", "exif_bottom_sheet_person_add_person": "Dodaj ime", "exit_slideshow": "Zapustite diaprojekcijo", diff --git a/i18n/sr_Latn.json b/i18n/sr_Latn.json index 06a76f8f0a..4e4afe02f8 100644 --- a/i18n/sr_Latn.json +++ b/i18n/sr_Latn.json @@ -123,6 +123,10 @@ "logging_enable_description": "Omogući evidentiranje", "logging_level_description": "Kada je omogućeno, koji nivo evidencije koristiti.", "logging_settings": "Evidentiranje", + "machine_learning_availability_checks": "Provere dostupnosti", + "machine_learning_availability_checks_enabled": "Omogući provere dostupnosti", + "machine_learning_availability_checks_interval": "Interval provere", + "machine_learning_availability_checks_interval_description": "Interval u milisekundama između provera dostupnosti", "machine_learning_clip_model": "Model CLIP", "machine_learning_clip_model_description": "Naziv CLIP modela je naveden ovde. Imajte na umu da morate ponovo da pokrenete posao „Pametno pretraživanje“ za sve slike nakon promene modela.", "machine_learning_duplicate_detection": "Detekcija duplikata", @@ -182,11 +186,13 @@ "nightly_tasks_database_cleanup_setting": "Zadaci čiščenja baze podataka", "nightly_tasks_database_cleanup_setting_description": "Očisti stare, istekle podatke iz baze podataka", "nightly_tasks_generate_memories_setting": "Generiši sjećanja", - "nightly_tasks_generate_memories_setting_description": "Kreiraj nova sjećanja", + "nightly_tasks_generate_memories_setting_description": "Stvorite nova sećanja iz imovine", "nightly_tasks_missing_thumbnails_setting": "Generiši nedostajuće sličice", "nightly_tasks_missing_thumbnails_setting_description": "Dodajte elemente bez sličica u red za generisanje sličica", "nightly_tasks_settings": "Podešavanja noćnih zadataka", "nightly_tasks_settings_description": "Upravljaj noćnim zadacima", + "nightly_tasks_start_time_setting": "Vreme početka", + "nightly_tasks_start_time_setting_description": "Vreme kada server započinje noćne zadatke", "nightly_tasks_sync_quota_usage_setting_description": "Ažurirajte kvotu memorijskog prostora korisnika na osnovu trenutne upotrebe", "no_paths_added": "Nema dodatih putanja", "no_pattern_added": "Nije dodat obrazac", diff --git a/i18n/sv.json b/i18n/sv.json index fba673610a..4057a6aa56 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -33,6 +33,7 @@ "add_to_albums": "Lägg till i album", "add_to_albums_count": "Lägg till i album ({count})", "add_to_shared_album": "Lägg till i delat album", + "add_upload_to_stack": "Lägg till uppladdning till stack", "add_url": "Lägg till URL", "added_to_archive": "Tillagd i arkiv", "added_to_favorites": "Tillagd till favoriter", diff --git a/i18n/ta.json b/i18n/ta.json index e97b4b4b72..978a36ab64 100644 --- a/i18n/ta.json +++ b/i18n/ta.json @@ -33,6 +33,7 @@ "add_to_albums": "ஆல்பத்தில் சேர்", "add_to_albums_count": "ஆல்பங்களில் சேர்({count})", "add_to_shared_album": "பகிரப்பட்ட ஆல்பமில் சேர்க்க", + "add_upload_to_stack": "அடுக்கில் பதிவேற்றத்தைச் சேர்", "add_url": "URL ஐச் சேர்க்கவும்", "added_to_archive": "காப்பகத்தில் சேர்க்கப்பட்டது", "added_to_favorites": "விருப்பங்களில் (பேவரிட்ஸ்) சேர்க்கப்பட்டது", @@ -57,7 +58,7 @@ "backup_onboarding_parts_title": "3-2-1 காப்புப்பிரதியில் பின்வருவன அடங்கும்:", "backup_onboarding_title": "காப்புப்பிரதிகள்", "backup_settings": "தரவுத்தள திணிப்பு அமைப்புகள்", - "backup_settings_description": "தரவுத்தள நகல் அமைப்புகளை நிர்வகிக்கவும்", + "backup_settings_description": "தரவுத்தள நகல் அமைப்புகளை நிர்வகி.", "cleared_jobs": "முடித்த வேலைகள்: {job}", "config_set_by_file": "கட்டமைப்பு, தற்போது ஒரு கட்டமைப்பு கோப்பு மூலம் அமைக்கப்பட்டுள்ளது", "confirm_delete_library": "{library} படங்கள் நூலகத்தை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", @@ -68,7 +69,7 @@ "confirm_user_pin_code_reset": "{user} இன் பின் குறியீட்டை மீட்டமைக்க விரும்புகிறீர்களா?", "create_job": "வேலையை உருவாக்கு", "cron_expression": "க்ரோன் வெளிப்பாடு", - "cron_expression_description": "CRON வடிவமைப்பைப் பயன்படுத்தி ச்கேனிங் இடைவெளியை அமைக்கவும். மேலும் தகவலுக்கு எ.கா. <இணைப்பு> க்ரோன்டாப் குரு ", + "cron_expression_description": "CRON வடிவமைப்பைப் பயன்படுத்தி ச்கேனிங் இடைவெளியை அமைக்கவும். மேலும் தகவலுக்கு எ.கா. க்ரோன்டாப் குரு ", "cron_expression_presets": "க்ரோன் வெளிப்பாடு முன்னமைவுகள்", "disable_login": "உள்நுழைவை முடக்கு", "duplicate_detection_job_description": "ஒத்த படங்களைக் கண்டறிய, சொத்துக்களில் இயந்திரக் கற்றலை இயக்கவும். ஸ்மார்ட் தேடலை நம்பியுள்ளது", @@ -117,7 +118,7 @@ "library_scanning_enable_description": "நியமிக்கப்பட்ட புகைப்பட நூலக ஸ்கேனிங்கை இயக்கு", "library_settings": "வெளிப்புற புகைப்பட நூலகம்", "library_settings_description": "வெளிப்புற புகைப்பட நூலக அமைப்புகளை மேலாண்மை செய்யவும்", - "library_tasks_description": "புதிய மற்றும்/அல்லது மாற்றப்பட்ட சொத்துக்களுக்கு வெளிப்புற நூலகங்களை ஸ்கேன் செய்யவும்.", + "library_tasks_description": "புதிய மற்றும்/அல்லது மாற்றப்பட்ட சொத்துக்களுக்கு வெளிப்புற நூலகங்களை வருடவும்", "library_watching_enable_description": "கோப்பு மாற்றங்களுக்கு வெளிப்புற நூலகங்களைப் பாருங்கள்", "library_watching_settings": "நூலகப் பார்ப்பது (சோதனை)", "library_watching_settings_description": "மாற்றப்பட்ட புகைப்படங்களைத் தானாகவே பார்க்கவும்", @@ -317,7 +318,7 @@ "transcoding_audio_codec": "ஆடியோ கோடெக்", "transcoding_audio_codec_description": "ஓபச் மிக உயர்ந்த தரமான விருப்பமாகும், ஆனால் பழைய சாதனங்கள் அல்லது மென்பொருளுடன் குறைந்த பொருந்தக்கூடிய தன்மையைக் கொண்டுள்ளது.", "transcoding_bitrate_description": "மேக்ச் பிட்ரேட்டை விட அதிகமான வீடியோக்கள் அல்லது ஏற்றுக்கொள்ளப்பட்ட வடிவத்தில் இல்லை", - "transcoding_codecs_learn_more": "இங்கே பயன்படுத்தப்படும் சொற்களைப் பற்றி மேலும் அறிய, H.264 கோடெக் , HEVC கோடெக் மற்றும் VP9 க்கான FFMPEG ஆவணங்களைப் பார்க்கவும் கோடெக் .", + "transcoding_codecs_learn_more": "இங்கே பயன்படுத்தப்படும் சொற்களைப் பற்றி மேலும் அறிய, H.264 கோடெக், HEVC கோடெக் மற்றும் VP9 க்கான கோடெக் FFMPEG ஆவணங்களைப் பார்க்கவும்.", "transcoding_constant_quality_mode": "நிலையான தர முறை", "transcoding_constant_quality_mode_description": "CQP ஐ விட ICQ சிறந்தது, ஆனால் சில வன்பொருள் முடுக்கம் சாதனங்கள் இந்த பயன்முறையை ஆதரிக்கவில்லை. இந்த விருப்பத்தை அமைப்பது தர அடிப்படையிலான குறியாக்கத்தைப் பயன்படுத்தும் போது குறிப்பிட்ட பயன்முறையை விரும்புகிறது. NVENC ஆல் புறக்கணிக்கப்பட்டது, ஏனெனில் இது ICQ ஐ ஆதரிக்காது.", "transcoding_constant_rate_factor": "நிலையான வீத காரணி (-crf)", @@ -326,7 +327,7 @@ "transcoding_encoding_options": "குறியீட்டு விருப்பங்கள்", "transcoding_encoding_options_description": "குறியிடப்பட்ட வீடியோக்களுக்கான கோடெக்குகள், தெளிவுத்திறன், தரம் மற்றும் பிற விருப்பங்களை அமைக்கவும்", "transcoding_hardware_acceleration": "வன்பொருள் முடுக்கம்", - "transcoding_hardware_acceleration_description": "பரிசோதனை: வேகமான டிரான்ஸ்கோடிங் ஆனால் அதே பிட்ரேட்டில் தரத்தைக் குறைக்கலாம்.", + "transcoding_hardware_acceleration_description": "பரிசோதனை: வேகமான டிரான்ஸ்கோடிங் ஆனால் அதே பிட்ரேட்டில் தரத்தைக் குறைக்கலாம்", "transcoding_hardware_decoding": "வன்பொருள் டிகோடிங்", "transcoding_hardware_decoding_setting_description": "குறியாக்கத்தை விரைவுபடுத்துவதற்கு பதிலாக இறுதி முதல் இறுதி முடுக்கம் ஆகியவற்றை செயல்படுத்துகிறது. எல்லா வீடியோக்களிலும் வேலை செய்யக்கூடாது.", "transcoding_max_b_frames": "அதிகபட்ச பி-பிரேம்கள்", @@ -620,9 +621,9 @@ "bugs_and_feature_requests": "பிழைகள் மற்றும் அம்ச கோரிக்கைகள்", "build": "உருவாக்கு", "build_image": "படத்தை உருவாக்குங்கள்", - "bulk_delete_duplicates_confirmation": "{எண்ணிக்கை, பன்மை, ஒன்று {# நகல் சொத்து} பிற {# நகல் சொத்துக்கள்}}}}}}}}} {{# நகல் சொத்து ஆகியவற்றை மொத்தமாக நீக்க விரும்புகிறீர்களா? இது ஒவ்வொரு குழுவின் மிகப்பெரிய சொத்தை வைத்திருக்கும் மற்றும் மற்ற அனைத்து நகல்களையும் நிரந்தரமாக நீக்குகிறது. இந்த செயலை நீங்கள் செயல்தவிர்க்க முடியாது!", - "bulk_keep_duplicates_confirmation": "நீங்கள் {எண்ணிக்கை, பன்மை, ஒன்று {# நகல் சொத்து} பிற {# நகல் சொத்துக்கள்} be வைக்க விரும்புகிறீர்களா? இது எதையும் நீக்காமல் அனைத்து நகல் குழுக்களையும் தீர்க்கும்.", - "bulk_trash_duplicates_confirmation": "நீங்கள் மொத்தமாக குப்பை {எண்ணிக்கை, பன்மை, ஒன்று {# நகல் சொத்து} பிற {# நகல் சொத்துக்கள்}}}} செய்ய விரும்புகிறீர்களா? இது ஒவ்வொரு குழுவின் மிகப்பெரிய சொத்தை வைத்திருக்கும் மற்றும் மற்ற அனைத்து நகல்களையும் குப்பைத் தொட்டியாக இருக்கும்.", + "bulk_delete_duplicates_confirmation": "நீங்கள் நிச்சயமாக {count, plural, one {# நகல் சொத்து} other {# நகல் சொத்துகள்}} மொத்தமாக நீக்க விரும்புகிறீர்களா? இது ஒவ்வொரு குழுவின் மிகப்பெரிய சொத்தை வைத்திருக்கும் மற்றும் மற்ற அனைத்து நகல்களையும் நிரந்தரமாக நீக்கும். இந்தச் செயலை நீங்கள் செயல்தவிர்க்க முடியாது!", + "bulk_keep_duplicates_confirmation": "நீங்கள் நிச்சயமாக {count, plural, one {# நகல் சொத்து} other {# நகல் சொத்துக்கள்}} வைத்திருக்க விரும்புகிறீர்களா? இது எதையும் நீக்காமல் அனைத்து நகல் குழுக்களையும் தீர்க்கும்.", + "bulk_trash_duplicates_confirmation": "நீங்கள் நிச்சயமாக மொத்தமாகக் குப்பையில் போட விரும்புகிறீர்களா {count, plural, one {# நகல் சொத்து} other {# நகல் சொத்துக்கள்}}? இது ஒவ்வொரு குழுவின் மிகப்பெரிய சொத்தையும் வைத்திருக்கும், மற்ற அனைத்து நகல்களையும் குப்பையில் போடும்.", "buy": "இம்மியை வாங்கவும்", "cache_settings_clear_cache_button": "தெளிவான தற்காலிக சேமிப்பு", "cache_settings_clear_cache_button_title": "பயன்பாட்டின் தற்காலிக சேமிப்பை அழிக்கிறது. கேச் மீண்டும் கட்டப்படும் வரை இது பயன்பாட்டின் செயல்திறனை கணிசமாக பாதிக்கும்.", @@ -709,7 +710,7 @@ "confirm_keep_this_delete_others": "இந்த சொத்தைத் தவிர அடுக்கில் உள்ள மற்ற அனைத்து சொத்துகளும் நீக்கப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", "confirm_new_pin_code": "புதிய முள் குறியீட்டை உறுதிப்படுத்தவும்", "confirm_password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்", - "confirm_tag_face": "இந்த முகத்தை {பெயர் அச் எனக் குறிக்க விரும்புகிறீர்களா?", + "confirm_tag_face": "இந்த முகத்தை {name} எனக் குறிக்க விரும்புகிறீர்களா?", "confirm_tag_face_unnamed": "இந்த முகத்தை குறிக்க விரும்புகிறீர்களா?", "connected_device": "இணைக்கப்பட்ட சாதனம்", "connected_to": "இணைக்கப்பட்டுள்ளது", @@ -915,9 +916,9 @@ "cannot_navigate_next_asset": "அடுத்த சொத்துக்கு செல்ல முடியாது", "cannot_navigate_previous_asset": "முந்தைய சொத்துக்கு செல்ல முடியாது", "cant_apply_changes": "மாற்றங்களைப் பயன்படுத்த முடியாது", - "cant_change_activity": "{செயல்படுத்த முடியாது, தேர்ந்தெடுக்கவும், உண்மை {disable} பிற {enable}} செயல்பாடு", + "cant_change_activity": "செயல்பாட்டை {enabled, select, true {முடக்க} other {இயக்க}} முடியாது", "cant_change_asset_favorite": "சொத்துக்கு பிடித்ததை மாற்ற முடியாது", - "cant_change_metadata_assets_count": "{எண்ணிக்கை, பன்மை, ஒன்று {# சொத்து} பிற {# சொத்துக்கள்}} இன் மெட்டாடேட்டாவை மாற்ற முடியாது", + "cant_change_metadata_assets_count": "{count, plural, one {# சொத்து} other {# சொத்துக்கள்}}இன் மீள்தரவை மாற்ற முடியாது", "cant_get_faces": "முகங்களைப் பெற முடியாது", "cant_get_number_of_comments": "கருத்துகளின் எண்ணிக்கையைப் பெற முடியாது", "cant_search_people": "மக்களைத் தேட முடியாது", @@ -946,7 +947,7 @@ "failed_to_update_notification_status": "அறிவிப்பு நிலையைப் புதுப்பிக்கத் தவறிவிட்டது", "import_path_already_exists": "இந்த இறக்குமதி பாதை ஏற்கனவே உள்ளது.", "incorrect_email_or_password": "தவறான மின்னஞ்சல் அல்லது கடவுச்சொல்", - "paths_validation_failed": "{பாதைகள், பன்மை, ஒன்று {# பாதை} மற்ற {# பாதைகள்}} தோல்வியுற்ற சரிபார்ப்பு", + "paths_validation_failed": "தோல்வியுற்ற சரிபார்ப்பு {paths, plural, one {# பாதை} other {# பாதைகள்}}", "profile_picture_transparent_pixels": "சுயவிவரப் படங்களுக்கு வெளிப்படையான படப்புள்ளிகள் இருக்க முடியாது. தயவுசெய்து பெரிதாக்கவும்/அல்லது படத்தை நகர்த்தவும்.", "quota_higher_than_disk_size": "வட்டு அளவை விட அதிகமாக ஒதுக்கீட்டை அமைத்துள்ளீர்கள்", "something_went_wrong": "ஏதோ தவறு நடந்தது", @@ -956,9 +957,9 @@ "unable_to_add_exclusion_pattern": "விலக்கு முறையைச் சேர்க்க முடியவில்லை", "unable_to_add_import_path": "இறக்குமதி பாதையைச் சேர்க்க முடியவில்லை", "unable_to_add_partners": "கூட்டாளர்களைச் சேர்க்க முடியவில்லை", - "unable_to_add_remove_archive": "{காப்பகப்படுத்த முடியவில்லை, தேர்ந்தெடுக்கவும், உண்மையாகவும்} பிற {remove asset from}}} காப்பகத்திற்குச் சேர்க்கவும்", - "unable_to_add_remove_favorites": "{பிடித்த, தேர்ந்தெடுக்கவும், உண்மையாகவும்}}} பிடித்தவைகளிலிருந்து சொத்தை அகற்று", - "unable_to_archive_unarchive": "{காப்பகப்படுத்த முடியவில்லை, தேர்ந்தெடுக்க முடியவில்லை, உண்மை {archive} பிற {unarchive}}", + "unable_to_add_remove_archive": "காப்பகத்தில் {archived, select, true {இருந்து சொத்தை அகற்ற} other {சொத்தைச் சேர்க்க}} முடியவில்லை", + "unable_to_add_remove_favorites": "பிடித்தவையில் {பிடித்தது, தேர்ந்தெடு, உண்மை {சொத்தைச் சேர்க்க} மற்ற {சொத்தை அகற்ற}} முடியவில்லை", + "unable_to_archive_unarchive": "{காப்பகப்படுத்த முடியவில்லை, தேர்ந்தெடு, உண்மை {காப்பகம்} மற்றவை {காப்பகத்தை அகற்று}}", "unable_to_change_album_user_role": "ஆல்பத்தின் பயனரின் பாத்திரத்தை மாற்ற முடியவில்லை", "unable_to_change_date": "தேதியை மாற்ற முடியவில்லை", "unable_to_change_description": "விளக்கத்தை மாற்ற முடியவில்லை", @@ -1066,7 +1067,7 @@ "failed_to_load_assets": "சொத்துக்களை ஏற்றுவதில் தோல்வி", "failed_to_load_folder": "கோப்புறையை ஏற்றுவதில் தோல்வி", "favorite": "பிடித்த", - "favorite_action_prompt": "{எண்ணிக்கை the பிடித்தவைகளில் சேர்க்கப்பட்டது", + "favorite_action_prompt": "{count} பிடித்தவைகளில் சேர்க்கப்பட்டது", "favorite_or_unfavorite_photo": "பிடித்த அல்லது சாதகமற்ற புகைப்படம்", "favorites": "பிடித்தவை", "favorites_page_no_favorites": "பிடித்த சொத்துக்கள் எதுவும் கிடைக்கவில்லை", @@ -1128,9 +1129,9 @@ "hide_password": "கடவுச்சொல்லை மறைக்கவும்", "hide_person": "நபரை மறைக்க", "hide_unnamed_people": "பெயரிடப்படாதவர்களை மறைக்கவும்", - "home_page_add_to_album_conflicts": "சேர்க்கப்பட்டது {ஆல்பம் {added} சொத்துக்கள் {ஆல்பம். {album} சொத்துக்கள் ஏற்கனவே ஆல்பத்தில் உள்ளன.", + "home_page_add_to_album_conflicts": "{album} ஆல்பத்தில் {added} சொத்துக்கள் சேர்க்கப்பட்டன. {failed} சொத்துக்கள் ஏற்கனவே ஆல்பத்தில் உள்ளன.", "home_page_add_to_album_err_local": "ஆல்பங்களில் உள்ளக சொத்துக்களை இன்னும் சேர்க்க முடியாது, தவிர்க்கவும்", - "home_page_add_to_album_success": "சேர்க்கப்பட்டது {ஆல்பம் {added} சொத்துக்கள் {ஆல்பம்.", + "home_page_add_to_album_success": "{album} ஆல்பத்தில் {added} சொத்துக்கள் சேர்க்கப்பட்டன.", "home_page_album_err_partner": "ஒரு ஆல்பத்திற்கு இன்னும் கூட்டாளர் சொத்துக்களைச் சேர்க்க முடியவில்லை, தவிர்க்கவும்", "home_page_archive_err_local": "உள்ளக சொத்துக்களை இன்னும் காப்பகப்படுத்த முடியாது, தவிர்க்கவும்", "home_page_archive_err_partner": "கூட்டாளர் சொத்துக்களை காப்பகப்படுத்த முடியாது, தவிர்க்கவும்", @@ -1152,8 +1153,8 @@ "ignore_icloud_photos": "ICloud புகைப்படங்களை புறக்கணிக்கவும்", "ignore_icloud_photos_description": "ICloud இல் சேமிக்கப்படும் புகைப்படங்கள் இம்மிச் சேவையகத்தில் பதிவேற்றப்படாது", "image": "படம்", - "image_alt_text_date": "{isvideo, தேர்ந்தெடு, உண்மை {Video} பிற {Image}} {date} இல் எடுக்கப்பட்டது", - "image_alt_text_date_1_person": "{isvideo, தேர்ந்தெடு, உண்மை {Video} பிற {Image}} {{person1} இல் {date}", + "image_alt_text_date": "{isVideo, select, true {Video} மற்ற {Image}} {date} அன்று எடுக்கப்பட்டது", + "image_alt_text_date_1_person": "{isVideo, தேர்ந்தெடு, உண்மை {Video} பிற {Image}} {person1} இல் {date}", "image_alt_text_date_2_people": "{isvideo, தேர்ந்தெடுக்கவும், உண்மை {Video} பிற {Image}} {{person1} மற்றும் {person2} {date} இல் எடுக்கப்பட்டது", "image_alt_text_date_3_people": "{isvideo, தேர்ந்தெடு, உண்மை {Video} பிற {Image} the {person1}, {person2}, மற்றும் {person3} இல் எடுக்கப்பட்டது {date}", "image_alt_text_date_4_or_more_people": "{isvideo, தேர்ந்தெடு, உண்மை {Video} பிற {Image} the {person1}, {person2}, மற்றும் {கூடுதல் COUNT, எண்} மற்றவர்கள் {date}", @@ -1489,7 +1490,7 @@ "permanent_deletion_warning_setting_description": "சொத்துக்களை நிரந்தரமாக நீக்கும்போது ஒரு எச்சரிக்கையைக் காட்டுங்கள்", "permanently_delete": "நிரந்தரமாக நீக்கு", "permanently_delete_assets_count": "நிரந்தரமாக நீக்கு {எண்ணிக்கை, பன்மை, ஒன்று {asset} மற்ற {assets}}", - "permanently_delete_assets_prompt": "நீங்கள் நிச்சயமாக {எண்ணிக்கை, பன்மை, ஒன்று {இந்த சொத்து?} மற்ற {இந்த # சொத்துக்கள்?", + "permanently_delete_assets_prompt": "{count, plural, one {this asset?} other {these # assets?}} என்பதை நிரந்தரமாக நீக்க விரும்புகிறீர்களா? இது {count, plural, one {it from its} other {them from their}} ஆல்பத்தையும் நீக்கும்.", "permanently_deleted_asset": "நிரந்தரமாக நீக்கப்பட்ட சொத்து", "permanently_deleted_assets_count": "நிரந்தரமாக நீக்கப்பட்டது {எண்ணிக்கை, பன்மை, ஒன்று {# சொத்து} பிற {# சொத்துக்கள்}}", "permission": "இசைவு", @@ -1959,7 +1960,7 @@ "tag_assets": "குறிச்சொல் சொத்துக்கள்", "tag_created": "உருவாக்கப்பட்ட குறிச்சொல்: {tag}", "tag_feature_description": "தர்க்கரீதியான குறிச்சொல் தலைப்புகளால் தொகுக்கப்பட்ட புகைப்படங்கள் மற்றும் வீடியோக்களை உலாவுதல்", - "tag_not_found_question": "குறிச்சொல்லைக் கண்டுபிடிக்க முடியவில்லையா? <இணைப்பு> புதிய குறிச்சொல்லை உருவாக்கவும். ", + "tag_not_found_question": "குறிச்சொல்லைக் கண்டுபிடிக்க முடியவில்லையா?புதிய குறிச்சொல்லை உருவாக்கவும்.", "tag_people": "மக்களை குறிக்கவும்", "tag_updated": "புதுப்பிக்கப்பட்ட குறிச்சொல்: {tag}", "tagged_assets": "குறித்துள்ளார் {எண்ணிக்கை, பன்மை, ஒன்று {# சொத்து} மற்ற {# சொத்துக்கள்}}", @@ -1980,7 +1981,7 @@ "theme_setting_system_primary_color_title": "கணினி நிறத்தைப் பயன்படுத்துங்கள்", "theme_setting_system_theme_switch": "தானியங்கி (கணினி அமைப்பைப் பின்பற்றவும்)", "theme_setting_theme_subtitle": "பயன்பாட்டின் கருப்பொருள் அமைப்பைத் தேர்வுசெய்க", - "theme_setting_three_stage_loading_subtitle": "மூன்று-நிலை ஏற்றுதல் ஏற்றுதல் செயல்திறனை அதிகரிக்கக்கூடும், ஆனால் கணிசமாக அதிக பிணைய சுமையை ஏற்படுத்துகிறது", + "theme_setting_three_stage_loading_subtitle": "மூன்று-நிலை ஏற்றுதல் இயக்கினால் ஏற்றுதல் செயல்திறனை அதிகரிக்கக்கூடும், ஆனால் கணிசமாக மிகை பிணையச் சுமையை ஏற்படுத்துகிறது", "theme_setting_three_stage_loading_title": "மூன்று-நிலை ஏற்றுதலை இயக்கவும்", "they_will_be_merged_together": "அவர்கள் ஒன்றாக இணைக்கப்படுவார்கள்", "third_party_resources": "மூன்றாம் தரப்பு வளங்கள்", @@ -2117,7 +2118,7 @@ "viewer_remove_from_stack": "அடுக்கிலிருந்து அகற்று", "viewer_stack_use_as_main_asset": "பிரதான சொத்தாகப் பயன்படுத்தவும்", "viewer_unstack": "அடுக்கை நீக்கு", - "visibility_changed": "{எண்ணிக்கை, பன்மை, ஒன்று {# நபர்} மற்ற {# நபர்கள்} க்கு க்கு தெரிவுநிலை மாற்றப்பட்டது", + "visibility_changed": "{count, plural, one {# நபர்} other {# நபர்கள்}} க்கான தெரிவுநிலை மாற்றப்பட்டது", "waiting": "காத்திருக்கிறது", "warning": "எச்சரிக்கை", "week": "வாரம்", diff --git a/i18n/tr.json b/i18n/tr.json index a962420980..0f80e60e85 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -33,6 +33,7 @@ "add_to_albums": "Albümlere ekle", "add_to_albums_count": "{count} albümlerine ekle", "add_to_shared_album": "Paylaşılan albüme ekle", + "add_upload_to_stack": "Yüklemeyi yığına ekle", "add_url": "URL ekle", "added_to_archive": "Arşive eklendi", "added_to_favorites": "Favorilere eklendi", @@ -62,7 +63,7 @@ "config_set_by_file": "Ayarlar şuanda config dosyası tarafından ayarlanmıştır", "confirm_delete_library": "{library} kütüphanesini silmek istediğinize emin misiniz?", "confirm_delete_library_assets": "Bu kütüphaneyi silmek istediğinize emin misiniz? Bu işlem {count, plural, one {# tane öğeyi} other {all # tane öğeyi}} Immich'den silecek ve bu işlem geri alınamaz. Dosyalar diskte kalacaktır.", - "confirm_email_below": "Onaylamak için aşağıya {email} yazın", + "confirm_email_below": "Onaylamak için aşağıya \"{email}\" yazın", "confirm_reprocess_all_faces": "Tüm yüzleri tekrardan işlemek istediğinize emin misiniz? Bu işlem isimlendirilmiş insanları da silecek.", "confirm_user_password_reset": "{user} adlı kullanıcının şifresini sıfırlamak istediğinize emin misiniz?", "confirm_user_pin_code_reset": "{user} adlı kullanıcının PIN kodunu sıfırlamak istediğinize emin misiniz?", @@ -401,7 +402,7 @@ "advanced_settings_prefer_remote_subtitle": "Bazı cihazlar yerel öğelerden küçük resimleri yüklerken çok yavaş çalışır. Bunun yerine uzak görüntüleri yüklemek için bu ayarı etkinleştirin.", "advanced_settings_prefer_remote_title": "Uzak görüntüleri tercih et", "advanced_settings_proxy_headers_subtitle": "Immich'in her ağ isteğiyle birlikte göndermesi gereken proxy header'ları tanımlayın", - "advanced_settings_proxy_headers_title": "Proxy Header'lar", + "advanced_settings_proxy_headers_title": "Proxy Başlıkları", "advanced_settings_readonly_mode_subtitle": "Fotoğrafların yalnızca görüntülenebildiği salt okunur modu etkinleştirir; birden fazla görüntü seçme, paylaşma, aktarma, silme gibi işlemler devre dışı bırakılır. Ana ekrandan kullanıcı avatarı aracılığıyla salt okunur modu Etkinleştirin/Devre dışı bırakın", "advanced_settings_readonly_mode_title": "Salt okunur Mod", "advanced_settings_self_signed_ssl_subtitle": "Sunucu uç noktası için SSL sertifika doğrulamasını atlar. Kendinden imzalı sertifikalar için gereklidir.", @@ -415,15 +416,15 @@ "age_year_months": "1 yaş, {months, plural, one {# ay} other {# ay}}", "age_years": "{years, plural, other {Yaş #}}", "album_added": "Albüm eklendi", - "album_added_notification_setting_description": "Paylaşılan bir albüme eklendiğinizde email bildirimi alın", - "album_cover_updated": "Albüm Kapağı güncellendi", + "album_added_notification_setting_description": "Paylaşılan bir albüme eklendiğinizde e-posta bildirimi alın", + "album_cover_updated": "Albüm kapağı güncellendi", "album_delete_confirmation": "{album} albümünü silmek istediğinize emin misiniz?", "album_delete_confirmation_description": "Albüm paylaşılıyorsa, diğer kullanıcılar artık bu albüme erişemeyecektir.", "album_deleted": "Albüm silindi", "album_info_card_backup_album_excluded": "HARİÇ", "album_info_card_backup_album_included": "DAHİL", "album_info_updated": "Albüm bilgisi güncellendi", - "album_leave": "Albümden Ayrıl?", + "album_leave": "Albümden ayrıl?", "album_leave_confirmation": "{album} albümünden ayrılmak istediğinize emin misiniz?", "album_name": "Albüm Adı", "album_options": "Albüm seçenekleri", @@ -616,7 +617,7 @@ "biometric_not_available": "Bu cihazda biyometrik kimlik doğrulama mevcut değil", "birthdate_saved": "Doğum günü başarılı bir şekilde kaydedildi", "birthdate_set_description": "Doğum günü, fotoğraftaki insanın fotoğraf çekildiği zamandaki yaşının hesaplanması için kullanılır.", - "blurred_background": "Bulanık arkaplan", + "blurred_background": "Bulanık arka plan", "bugs_and_feature_requests": "Hatalar ve Özellik Talepleri", "build": "Yapı", "build_image": "Görüntü Oluştur", @@ -678,7 +679,7 @@ "clear": "Temizle", "clear_all": "Hepsini temizle", "clear_all_recent_searches": "Son aramaların hepsini temizle", - "clear_file_cache": "Dosya Önbelleği Temizle", + "clear_file_cache": "Dosya Önbelleğini Temizle", "clear_message": "Mesajı temizle", "clear_value": "Değeri temizle", "client_cert_dialog_msg_confirm": "Tamam", @@ -713,7 +714,7 @@ "confirm_tag_face_unnamed": "Bu yüzü etiketlemek ister misin?", "connected_device": "Cihaz bağlandı", "connected_to": "Bağlı", - "contain": "İçermek", + "contain": "Sığdır", "context": "Bağlam", "continue": "Devam et", "control_bottom_app_bar_create_new_album": "Yeni albüm", @@ -735,7 +736,7 @@ "copy_to_clipboard": "Panoya Kopyala", "country": "Ülke", "cover": "Kapla", - "covers": "Kaplar", + "covers": "Kapak", "create": "Oluştur", "create_album": "Albüm oluştur", "create_album_page_untitled": "Başlıksız", @@ -1342,7 +1343,7 @@ "merged_people_count": "{count, plural, one {# kişi} other {# kişi}} birleştirildi", "minimize": "Küçült", "minute": "Dakika", - "minutes": "Dakikalar", + "minutes": "Dakika", "missing": "Eksik", "model": "Model", "month": "Ay", @@ -1391,14 +1392,14 @@ "no_cast_devices_found": "Yansıtılacak cihaz bulunamadı", "no_checksum_local": "Sağlama toplamı mevcut değil - yerel varlıkları alamıyor", "no_checksum_remote": "Sağlama toplamı mevcut değil - uzak varlık alınamıyor", - "no_duplicates_found": "Çift bulunamadı.", + "no_duplicates_found": "Hiçbir kopya bulunamadı.", "no_exif_info_available": "EXIF bilgisi mevcut değil", "no_explore_results_message": "Koleksiyonunuzu keşfetmek için daha fazla fotoğraf yükleyin.", "no_favorites_message": "En sevdiğiniz fotoğraf ve videoları hızlıca bulmak için favorilere ekleyin", "no_libraries_message": "Fotoğraf ve videolarınızı görmek için bir harici kütüphane oluşturun", "no_local_assets_found": "Bu sağlama toplamı ile yerel varlık bulunamadı", "no_locked_photos_message": "Kilitli klasördeki fotoğraf ve videolar gizlidir; kitaplığınızda gezinirken veya arama yaparken görünmezler.", - "no_name": "İsim yok", + "no_name": "İsim Yok", "no_notifications": "Bildirim yok", "no_people_found": "Eşleşen kişi bulunamadı", "no_places": "Yer yok", @@ -1488,10 +1489,10 @@ "permanent_deletion_warning": "Kalıcı silme uyarısı", "permanent_deletion_warning_setting_description": "Nesneleri kalıcı olarak silerken uyarı göster", "permanently_delete": "Kalıcı olarak sil", - "permanently_delete_assets_count": "{count, plural, one {öğe} other {öğeler}} kalıcı olarak silindi", + "permanently_delete_assets_count": "{count, plural, one {öğe} other {öğe}} kalıcı olarak silindi", "permanently_delete_assets_prompt": "Bu {count, plural, one {öğeyi} other {# öğeleri}} kalıcı olarak silmek istediğinizden emin misiniz? Bu işlem {count, plural, one {bu öğeyi} other {bu öğeleri}} albümlerinizden de kaldırır.", "permanently_deleted_asset": "Kalıcı olarak silinmiş öğeler", - "permanently_deleted_assets_count": "{count, plural, one {# öğe} other {# öğeler}} kalıcı olarak silindi", + "permanently_deleted_assets_count": "{count, plural, one {# öğe} other {# öğe}} kalıcı olarak silindi", "permission": "İzin", "permission_empty": "İzniniz boş olmamalı", "permission_onboarding_back": "Geri", @@ -1503,9 +1504,9 @@ "permission_onboarding_permission_limited": "Sınırlı izin. Immich'in tüm fotoğrav ve videolarınızı yedeklemesine ve yönetmesine izin vermek için Ayarlar'da fotoğraf ve video izinlerini verin.", "permission_onboarding_request": "Immich'in fotoğraflarınızı ve videolarınızı görüntüleyebilmesi için izne ihtiyacı var.", "person": "Kişi", - "person_age_months": "{months, plural, one {# month} other {# months}} eski", - "person_age_year_months": "1 yıl, {months, plural, one {# month} other {# months}} eski", - "person_age_years": "{years, plural, other {# sene}} önce", + "person_age_months": "{months, plural, one {# aylık} other {# aylık}}", + "person_age_year_months": "1 yıl, {months, plural, one {# aylık} other {# aylık}}", + "person_age_years": "{years, plural, other {# yaşında}}", "person_birthdate": "{date} tarihinde doğdu", "person_hidden": "{name}{hidden, select, true { (gizli)} other {}}", "photo_shared_all_users": "Fotoğraflarınızı tüm kullanıcılarla paylaştınız gibi görünüyor veya paylaşacak kullanıcı bulunmuyor.", @@ -1675,8 +1676,8 @@ "resume": "Devam et", "resume_paused_jobs": "Sürdür {count, plural, one {# duraklatılmış iş} other {# duraklatılmış işler}}", "retry_upload": "Yeniden yüklemeyi dene", - "review_duplicates": "Çiftleri gözden geçir", - "review_large_files": "Büyük dosyaları inceleyin", + "review_duplicates": "Kopyaları gözden geçir", + "review_large_files": "Büyük dosyaları incele", "role": "Rol", "role_editor": "Düzenleyici", "role_viewer": "Görüntüleyici", @@ -1867,7 +1868,7 @@ "shared_photos_and_videos_count": "{assetCount, plural, other {# paylaşılan fotoğraflar & videolar.}}", "shared_with_me": "Benimle paylaşılanlar", "shared_with_partner": "{partner} ile paylaşıldı", - "sharing": "Paylaşılıyor", + "sharing": "Paylaşım", "sharing_enter_password": "Bu sayfayı görebilmek için lütfen şifreyi giriniz.", "sharing_page_album": "Paylaşılan albümler", "sharing_page_description": "Ağınızdaki kişilerle fotoğraf ve video paylaşmak için paylaşımlı albümler oluşturun.", diff --git a/i18n/uk.json b/i18n/uk.json index a664fc9aa0..0640982fe6 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -33,6 +33,7 @@ "add_to_albums": "Додати до альбомів", "add_to_albums_count": "Додати до альбомів ({count})", "add_to_shared_album": "Додати у спільний альбом", + "add_upload_to_stack": "Додати завантаження до стеку", "add_url": "Додати URL", "added_to_archive": "Додано до архіву", "added_to_favorites": "Додано до обраного", @@ -1038,6 +1039,7 @@ "exif_bottom_sheet_description_error": "Помилка під час оновлення опису", "exif_bottom_sheet_details": "ПОДРОБИЦІ", "exif_bottom_sheet_location": "МІСЦЕ", + "exif_bottom_sheet_no_description": "Без опису", "exif_bottom_sheet_people": "ЛЮДИ", "exif_bottom_sheet_person_add_person": "Додати ім'я", "exit_slideshow": "Вийти зі слайд-шоу", @@ -1113,7 +1115,7 @@ "haptic_feedback_title": "Тактильна віддача", "has_quota": "Квота", "hash_asset": "Гешувати файл", - "hashed_assets": "Гешовані фото та відео", + "hashed_assets": "Хеши", "hashing": "Хешування", "header_settings_add_header_tip": "Додати заголовок", "header_settings_field_validator_msg": "Значення не може бути порожнім", diff --git a/i18n/zh_Hant.json b/i18n/zh_Hant.json index 1f57b2a7ae..267eb767c3 100644 --- a/i18n/zh_Hant.json +++ b/i18n/zh_Hant.json @@ -28,19 +28,19 @@ "add_to_album": "加入到相簿", "add_to_album_bottom_sheet_added": "新增到 {album}", "add_to_album_bottom_sheet_already_exists": "已在 {album} 中", - "add_to_album_bottom_sheet_some_local_assets": "無法將某些本地資產添加到相册", + "add_to_album_bottom_sheet_some_local_assets": "無法將某些本機資產新增到相簿", "add_to_album_toggle": "選擇相簿{album}", "add_to_albums": "加入相簿", - "add_to_albums_count": "將({count})個項目加入相簿", + "add_to_albums_count": "將 ({count}) 個項目加入相簿", "add_to_shared_album": "加到共享相簿", - "add_url": "建立連結", + "add_url": "新增 URL", "added_to_archive": "移至封存", "added_to_favorites": "加入收藏", "added_to_favorites_count": "將 {count, number} 個項目加入收藏", "admin": { "add_exclusion_pattern_description": "新增排除條件。支援使用「*」、「 **」、「?」來找尋符合規則的字串。如果要在任何名為「Raw」的目錄內排除所有符合條件的檔案,請使用「**/Raw/**」。如果要排除所有「.tif」結尾的檔案,請使用「**/*.tif」。如果要排除某個絕對路徑,請使用「/path/to/ignore/**」。", "admin_user": "管理員", - "asset_offline_description": "此外部媒體庫項目已無法在磁碟上找到,並已移至垃圾桶。若該檔案是在媒體庫內移動,請在時間軸中查看新的對應項目。若要還原此項目,請確保下方的檔案路徑可供 Immich 存取,並重新掃描媒體庫。", + "asset_offline_description": "此外部媒體庫項目已無法在磁碟上找到,並已移至垃圾桶。若該檔案是在媒體庫內移動,請在時間軸中檢視新的對應項目。若要還原此項目,請確保下方的檔案路徑可供 Immich 存取,並重新掃描媒體庫。", "authentication_settings": "驗證設定", "authentication_settings_description": "管理密碼、OAuth 與其他驗證設定", "authentication_settings_disable_all": "確定要停用所有登入方式嗎?這樣會完全無法登入。", @@ -50,8 +50,8 @@ "backup_database_enable_description": "啟用資料庫備份", "backup_keep_last_amount": "保留先前備份的數量", "backup_onboarding_1_description": "在雲端或其他實體位置的異地備份副本。", - "backup_onboarding_2_description": "儲存在不同裝置上的本地副本。這包括主要檔案及其本地備份。", - "backup_onboarding_3_description": "您資料的總備份份數,包括原始檔案在內。這包括 1 份異地備份與 2 份本地副本。", + "backup_onboarding_2_description": "儲存在不同裝置上的本機副本。這包括主要檔案及其本機備份。", + "backup_onboarding_3_description": "您資料的總備份份數,包括原始檔案在內。這包括 1 份異地備份與 2 份本機副本。", "backup_onboarding_description": "建議採用 3-2-1 備份策略 來保護您的資料。您應保留已上傳的照片/影片副本,以及 Immich 資料庫,以建立完整的備份方案。", "backup_onboarding_footer": "更多備份 Immich 資訊,請參考說明文件。", "backup_onboarding_parts_title": "遵從備份原則 3-2-1:", @@ -82,7 +82,7 @@ "image_format": "格式", "image_format_description": "WebP 能產生相對於 JPEG 更小的檔案,但編碼速度較慢。", "image_fullsize_description": "移除中繼資料的大尺寸影像,在放大圖片時使用", - "image_fullsize_enabled": "啟用大尺寸影像生成", + "image_fullsize_enabled": "啟用大尺寸影像產生", "image_fullsize_enabled_description": "產生非網頁友善格式的大尺寸影像。啟用「偏好嵌入的預覽」時,會直接使用內嵌預覽而不進行轉換。不會影響 JPEG 等網頁友善格式。", "image_fullsize_quality_description": "大尺寸影像品質,範圍為 1 到 100。數值越高品質越好,但檔案也會越大。", "image_fullsize_title": "大尺寸影像設定", @@ -125,7 +125,7 @@ "logging_level_description": "啟用時的日誌層級。", "logging_settings": "日誌", "machine_learning_availability_checks": "可用性檢查", - "machine_learning_availability_checks_description": "自動檢測並優先選擇可用的機器學習服務器", + "machine_learning_availability_checks_description": "自動偵測並優先選擇可用的機器學習伺服器", "machine_learning_availability_checks_enabled": "啟用可用性檢查", "machine_learning_availability_checks_interval": "檢查間隔", "machine_learning_availability_checks_interval_description": "可用性檢查之間的間隔(毫秒)", @@ -159,14 +159,14 @@ "machine_learning_smart_search_description": "使用 CLIP 嵌入向量以語意方式搜尋影像", "machine_learning_smart_search_enabled": "啟用智慧搜尋", "machine_learning_smart_search_enabled_description": "如果停用,影像將不會被編碼以進行智慧搜尋。", - "machine_learning_url_description": "機器學習伺服器的 URL。若提供多個 URL,系統會依序逐一嘗試,直到其中一台成功回應為止(由前到後)。未回應的伺服器將被暫時忽略,直到其重新上線。", + "machine_learning_url_description": "機器學習伺服器的 URL。若提供多個 URL,系統會依序逐一嘗試,直到其中一臺成功回應為止(由前到後)。未回應的伺服器將被暫時忽略,直到其重新上線。", "manage_concurrency": "管理併發", "manage_log_settings": "管理日誌設定", "map_dark_style": "深色樣式", "map_enable_description": "啟用地圖功能", "map_gps_settings": "地圖與 GPS 設定", "map_gps_settings_description": "管理地圖與 GPS(反向地理編碼)設定", - "map_implications": "地圖功能依賴外部圖磚服務(tiles.immich.cloud)", + "map_implications": "地圖功能仰賴外部圖磚服務(tiles.immich.cloud)", "map_light_style": "淺色樣式", "map_manage_reverse_geocoding_settings": "管理逆向地理編碼設定", "map_reverse_geocoding": "反向地理編碼", @@ -199,7 +199,7 @@ "nightly_tasks_start_time_setting_description": "伺服器開始執行夜間任務的時間", "nightly_tasks_sync_quota_usage_setting": "同步配額使用情況", "nightly_tasks_sync_quota_usage_setting_description": "根據目前的使用量更新使用者的儲存配額", - "no_paths_added": "沒有已添加的路徑", + "no_paths_added": "沒有已新增的路徑", "no_pattern_added": "尚未新增排除規則", "note_apply_storage_label_previous_assets": "提示:若要將儲存標籤套用到先前上傳的媒體檔案,請執行", "note_cannot_be_changed_later": "注意:此設定日後無法變更!", @@ -213,12 +213,12 @@ "notification_email_sent_test_email_button": "傳送測試電子郵件並儲存", "notification_email_setting_description": "寄送電子郵件通知的設定", "notification_email_test_email": "傳送測試電子郵件", - "notification_email_test_email_failed": "無法發送測試電子郵件,請檢查您的設定資訊", - "notification_email_test_email_sent": "測試電子郵件已發送至 {email}。請檢查您的收件匣。", + "notification_email_test_email_failed": "無法傳送測試電子郵件,請檢查您的設定資訊", + "notification_email_test_email_sent": "測試電子郵件已傳送至 {email}。請檢查您的收件匣。", "notification_email_username_description": "用於與電子郵件伺服器驗證的使用者名稱", "notification_enable_email_notifications": "啟用電子郵件通知", "notification_settings": "通知設定", - "notification_settings_description": "管理通知設置,包括電子郵件", + "notification_settings_description": "管理通知設定,包括電子郵件", "oauth_auto_launch": "自動啟動", "oauth_auto_launch_description": "進入登入頁面時,自動啟動 OAuth 登入流程", "oauth_auto_register": "自動註冊", @@ -260,7 +260,7 @@ "server_external_domain_settings": "外部網域", "server_external_domain_settings_description": "公開分享連結的網域,包含 http(s)://", "server_public_users": "公開使用者", - "server_public_users_description": "在將使用者新增到共享相簿時,會列出所有使用者的姓名與電子郵件。停用此功能後,使用者清單將僅供系統管理員查看。", + "server_public_users_description": "在將使用者新增到共享相簿時,會列出所有使用者的姓名與電子郵件。停用此功能後,使用者清單將僅供系統管理員檢視。", "server_settings": "伺服器設定", "server_settings_description": "管理伺服器設定", "server_welcome_message": "歡迎訊息", @@ -270,10 +270,10 @@ "slideshow_duration_description": "每張圖片放映的秒數", "smart_search_job_description": "執行機器學習有助於智慧搜尋", "storage_template_date_time_description": "檔案的建立時間戳會用於日期與時間資訊", - "storage_template_date_time_sample": "採樣時間 {date}", + "storage_template_date_time_sample": "取樣時間 {date}", "storage_template_enable_description": "啟用儲存範本引擎", - "storage_template_hash_verification_enabled": "雜湊函数驗證已啟用", - "storage_template_hash_verification_enabled_description": "啟用雜湊函数驗證,除非您很清楚地知道這個選項的作用,否則請勿停用此功能", + "storage_template_hash_verification_enabled": "雜湊函式驗證已啟用", + "storage_template_hash_verification_enabled_description": "啟用雜湊函式驗證,除非您很清楚地知道這個選項的作用,否則請勿停用此功能", "storage_template_migration": "儲存範本遷移", "storage_template_migration_description": "將目前的 {template} 套用到先前上傳的項目", "storage_template_migration_info": "儲存範本會將所有副檔名轉換為小寫。範本變更只會套用到新的項目。若要將範本追溯套用到先前上傳的項目,請執行 {job}。", @@ -294,15 +294,15 @@ "template_email_update_album": "相簿更新範本", "template_email_welcome": "歡迎郵件範本", "template_settings": "通知範本", - "template_settings_description": "管理通知的自定義範本", - "theme_custom_css_settings": "自定義 CSS", + "template_settings_description": "管理通知的自訂範本", + "theme_custom_css_settings": "自訂 CSS", "theme_custom_css_settings_description": "可以用層疊樣式表(CSS)來自訂 Immich 的設計。", "theme_settings": "主題設定", - "theme_settings_description": "自訂 Immich 的網頁界面", + "theme_settings_description": "自訂 Immich 的網頁介面", "thumbnail_generation_job": "產生縮圖", "thumbnail_generation_job_description": "為每個檔案產生大、小及模糊縮圖,也為每位人物產生縮圖", "transcoding_acceleration_api": "加速 API", - "transcoding_acceleration_api_description": "此 API 會使用您的硬體以加速轉碼流程。此設定採「盡力而為」模式——若轉碼失敗,將會回退至軟體轉碼。VP9 是否能運作,取決於您的硬體配置。", + "transcoding_acceleration_api_description": "此 API 會使用您的硬體以加速轉碼流程。此設定採「盡力而為」模式——若轉碼失敗,將會回退至軟體轉碼。VP9 是否能運作,取決於您的硬體設定。", "transcoding_acceleration_nvenc": "NVENC(需要 NVIDIA GPU)", "transcoding_acceleration_qsv": "Quick Sync(需要第 7 代或更新的 Intel 處理器)", "transcoding_acceleration_rkmpp": "RKMPP(僅適用於 Rockchip SOCs)", @@ -322,7 +322,7 @@ "transcoding_constant_quality_mode_description": "ICQ 的效果優於 CQP,但部分硬體加速裝置不支援此模式。設定此選項時,在使用以品質為基準的編碼時會優先採用所指定的模式。NVENC 不支援 ICQ,因此此設定在 NVENC 下會被忽略。", "transcoding_constant_rate_factor": "恆定速率因子(-crf)", "transcoding_constant_rate_factor_description": "視訊品質等級。典型值為 H.264 的 23、HEVC 的 28、VP9 的 31 和 AV1 的 35。數值越低,品質越好,但會產生較大的檔案。", - "transcoding_disabled_description": "不對任何影片進行轉碼,可能會導致部分客戶端無法正常播放", + "transcoding_disabled_description": "不對任何影片進行轉碼,可能會導致部分用戶端無法正常播放", "transcoding_encoding_options": "編碼選項", "transcoding_encoding_options_description": "設定編碼影片的編解碼器、解析度、品質和其他選項", "transcoding_hardware_acceleration": "硬體加速", @@ -334,11 +334,11 @@ "transcoding_max_bitrate": "最大位元速率", "transcoding_max_bitrate_description": "設定最大位元率可以在輕微犧牲品質的情況下,讓檔案大小更容易預測。在 720p 解析度下,VP9 或 HEVC 的典型值為 2600 kbit/s,H.264 則為 4500 kbit/s。設為 0 則停用此功能。", "transcoding_max_keyframe_interval": "最大關鍵幀間隔", - "transcoding_max_keyframe_interval_description": "設置關鍵幀之間的最大幀距。較低的值會降低壓縮效率,但可以改善搜尋時間,並有可能會改善快速變動場景的品質。0 會自動設置此值。", + "transcoding_max_keyframe_interval_description": "設定關鍵幀之間的最大幀距。較低的值會降低壓縮效率,但可以改善搜尋時間,並有可能會改善快速變動場景的品質。0 會自動設定此值。", "transcoding_optimal_description": "高於目標解析度或格式不在可接受範圍的影片", "transcoding_policy": "轉碼策略", "transcoding_policy_description": "設定影片進行轉碼的條件", - "transcoding_preferred_hardware_device": "首選硬體設備", + "transcoding_preferred_hardware_device": "首選硬體裝置", "transcoding_preferred_hardware_device_description": "僅適用於 VAAPI 和 QSV。設定用於硬體轉碼的 dri 節點。", "transcoding_preset_preset": "預設值(-preset)", "transcoding_preset_preset_description": "壓縮速度。較慢的預設值會產生較小的檔案,並在鎖定位元率時提升品質。VP9 在速度高於「faster」時將忽略設定。", @@ -350,10 +350,10 @@ "transcoding_target_resolution": "目標解析度", "transcoding_target_resolution_description": "較高的解析度可以保留更多細節,但編碼時間較長,檔案也較大,且可能降低應用程式的回應速度。", "transcoding_temporal_aq": "時間自適應量化(Temporal AQ)", - "transcoding_temporal_aq_description": "僅適用於 NVENC,可提升高細節、低動態場景的畫質。可能與較舊的設備不相容。", + "transcoding_temporal_aq_description": "僅適用於 NVENC,可提升高細節、低動態場景的畫質。可能與較舊的裝置不相容。", "transcoding_threads": "執行緒數量", - "transcoding_threads_description": "較高的值會加快編碼速度,但會減少伺服器在運行過程中處理其他任務的空間。此值不應超過 CPU 核心數。設定為 0 可以最大化利用率。", - "transcoding_tone_mapping": "色調映射", + "transcoding_threads_description": "較高的值會加快編碼速度,但會減少伺服器在執行過程中處理其他任務的空間。此值不應超過 CPU 核心數。設定為 0 可以最大化利用率。", + "transcoding_tone_mapping": "色調對映", "transcoding_tone_mapping_description": "在將 HDR 影片轉換為 SDR 時,盡量維持原始觀感。每種演算法在色彩、細節和亮度方面都有不同的權衡。Hable 保留細節,Mobius 保留色彩,Reinhard 保留亮度。", "transcoding_transcode_policy": "轉碼策略", "transcoding_transcode_policy_description": "影片何時應進行轉碼的策略。HDR 影片一定會轉碼(除非停用轉碼)。", @@ -368,7 +368,7 @@ "trash_settings_description": "管理垃圾桶設定", "unlink_all_oauth_accounts": "解除所有 OAuth 帳號的連結", "unlink_all_oauth_accounts_description": "在遷移至新的服務提供者前,請不要忘記要先解除所有與 OAuth 帳戶的連結。", - "unlink_all_oauth_accounts_prompt": "您是否確認要解除所有與 OAuth 帳戶的連結? 所有相關的使用者身份會被重設,並且不能被還原。", + "unlink_all_oauth_accounts_prompt": "您是否確認要解除所有與 OAuth 帳戶的連結?所有相關的使用者身份會被重設,並且不能被還原。", "user_cleanup_job": "清理使用者", "user_delete_delay": "{user} 的帳號和項目會在 {delay, plural, one {# 天} other {# 天}} 後永久刪除。", "user_delete_delay_settings": "延後刪除", @@ -398,9 +398,9 @@ "advanced_settings_enable_alternate_media_filter_subtitle": "使用此選項可在同步時依其他條件篩選媒體。僅在應用程式無法偵測到所有相簿時再嘗試使用。", "advanced_settings_enable_alternate_media_filter_title": "[實驗性] 使用替代的裝置相簿同步篩選器", "advanced_settings_log_level_title": "日誌等級:{level}", - "advanced_settings_prefer_remote_subtitle": "部分裝置從本機ˊ體庫載入縮圖的速度非常慢。啟用此設定可改為載入遠端圖片。", + "advanced_settings_prefer_remote_subtitle": "部分裝置從本機媒體庫載入縮圖的速度非常慢。啟用此設定可改為載入遠端圖片。", "advanced_settings_prefer_remote_title": "偏好遠端影像", - "advanced_settings_proxy_headers_subtitle": "定義 Immich 在每次網路請求時應該發送的代理標頭", + "advanced_settings_proxy_headers_subtitle": "定義 Immich 在每次網路請求時應該傳送的代理標頭", "advanced_settings_proxy_headers_title": "代理標頭", "advanced_settings_readonly_mode_subtitle": "開啟唯讀模式後,照片只能瀏覽,像是多選影像、分享、投放、刪除等功能都會關閉。可在主畫面透過使用者頭像來開啟/關閉唯讀模式", "advanced_settings_readonly_mode_title": "唯讀模式", @@ -408,7 +408,7 @@ "advanced_settings_self_signed_ssl_title": "允許自簽的 SSL 憑證", "advanced_settings_sync_remote_deletions_subtitle": "當在網頁端執行刪除或還原操作時,自動在此裝置上刪除或還原該媒體", "advanced_settings_sync_remote_deletions_title": "同步遠端刪除 [實驗性]", - "advanced_settings_tile_subtitle": "進階用戶設定", + "advanced_settings_tile_subtitle": "進階使用者設定", "advanced_settings_troubleshooting_subtitle": "啟用額外功能以進行疑難排解", "advanced_settings_troubleshooting_title": "疑難排解", "age_months": "{months, plural, one {# 個月} other {# 個月}}", @@ -431,7 +431,7 @@ "album_remove_user_confirmation": "確定要移除 {user} 嗎?", "album_search_not_found": "找不到符合搜尋條件的相簿", "album_share_no_users": "看來您與所有使用者共享了這本相簿,或沒有其他使用者可供分享。", - "album_summary": "相册摘要", + "album_summary": "相簿摘要", "album_updated": "更新相簿時", "album_updated_setting_description": "當共享相簿有新項目時用電子郵件通知我", "album_user_left": "離開 {album}", @@ -444,12 +444,12 @@ "album_viewer_appbar_share_leave": "離開相簿", "album_viewer_appbar_share_to": "分享給", "album_viewer_page_share_add_users": "邀請其他人", - "album_with_link_access": "任何擁有連結的人都能查看此相簿中的照片與使用者。", + "album_with_link_access": "任何擁有連結的人都能檢視此相簿中的照片與人物。", "albums": "相簿", "albums_count": "{count, plural, one {{count, number} 個相簿} other {{count, number} 個相簿}}", "albums_default_sort_order": "預設相簿排序", "albums_default_sort_order_description": "建立新相簿時要初始化項目排序方式。", - "albums_feature_description": "一系列可以分享給其他用戶的項目。", + "albums_feature_description": "一系列可以分享給其他使用者的項目。", "albums_on_device_count": "此裝置有 ({count}) 個相簿", "all": "全部", "all_albums": "所有相簿", @@ -470,14 +470,14 @@ "app_bar_signout_dialog_title": "登出", "app_settings": "應用程式設定", "appears_in": "出現於", - "apply_count": "應用({count, number})", + "apply_count": "應用 ({count, number})", "archive": "封存", "archive_action_prompt": "已將 ({count}) 個加入進封存", "archive_or_unarchive_photo": "封存或取消封存照片", "archive_page_no_archived_assets": "未找到封存媒體", "archive_page_title": "封存 ({count})", "archive_size": "封存大小", - "archive_size_description": "設定要下載的封存檔案大小 (單位: GiB)", + "archive_size_description": "設定要下載的封存檔案大小 (單位:GiB)", "archived": "已封存", "archived_count": "{count, plural, other {已封存 # 個項目}}", "are_these_the_same_person": "同一位人物?", @@ -491,12 +491,12 @@ "asset_has_unassigned_faces": "媒體有未分配的臉孔", "asset_hashing": "正在計算雜湊…", "asset_list_group_by_sub_title": "分類方式", - "asset_list_layout_settings_dynamic_layout_title": "動態布局", + "asset_list_layout_settings_dynamic_layout_title": "動態版面", "asset_list_layout_settings_group_automatically": "自動", "asset_list_layout_settings_group_by": "媒體分類方式", "asset_list_layout_settings_group_by_month_day": "月份和日期", - "asset_list_layout_sub_title": "布局", - "asset_list_settings_subtitle": "相片格狀布局設定", + "asset_list_layout_sub_title": "版面", + "asset_list_settings_subtitle": "相片格狀版面設定", "asset_list_settings_title": "相片格狀檢視", "asset_offline": "媒體離線", "asset_offline_description": "此外部媒體已無法在磁碟中找到。請聯絡您的 Immich 管理員以取得協助。", @@ -533,12 +533,12 @@ "assets_were_part_of_album_count": "{count, plural, one {該媒體已} other {這些媒體已}}在相簿中", "assets_were_part_of_albums_count": "{count, plural, one {個} other {個}}項目已被儲存在相簿中", "authorized_devices": "已授權裝置", - "automatic_endpoint_switching_subtitle": "當可用時,透過指定的 Wi-Fi 在本地連線,其他情況則使用替代連線", + "automatic_endpoint_switching_subtitle": "當可用時,透過指定的 Wi-Fi 在本機連線,其他情況則使用替代連線", "automatic_endpoint_switching_title": "自動 URL 切換", "autoplay_slideshow": "自動播放幻燈片", - "back": "返回", - "back_close_deselect": "返回、關閉及取消選取", - "background_backup_running_error": "後臺備份當前正在運行,無法啟動手動備份", + "back": "上一頁", + "back_close_deselect": "回上一頁、關閉並取消選取", + "background_backup_running_error": "後臺備份目前正在執行,無法啟動手動備份", "background_location_permission": "背景存取位置權限", "background_location_permission_content": "為了在背景執行時切換網路,Immich 必須始終具有精確位置存取權限,才能讀取 Wi-Fi 網路名稱", "background_options": "背景選項", @@ -549,10 +549,10 @@ "backup_album_selection_page_select_albums": "選取相簿", "backup_album_selection_page_selection_info": "選取資訊", "backup_album_selection_page_total_assets": "總不重複媒體數", - "backup_albums_sync": "備份相册同步", + "backup_albums_sync": "備份相簿同步", "backup_all": "全部", "backup_background_service_backup_failed_message": "備份媒體失敗。正在重試…", - "backup_background_service_connection_failed_message": "連線伺服器失敗。正在重試…", + "backup_background_service_connection_failed_message": "連線至伺服器失敗。正在重試…", "backup_background_service_current_upload_notification": "正在上傳 {filename}", "backup_background_service_default_notification": "正在檢查新媒體…", "backup_background_service_error_title": "備份錯誤", @@ -569,7 +569,7 @@ "backup_controller_page_background_charging": "僅在充電時", "backup_controller_page_background_configure_error": "背景服務設定失敗", "backup_controller_page_background_delay": "新媒體備份延遲:{duration}", - "backup_controller_page_background_description": "開啟背景服務,即可在不需打開 App 的情況下,自動備份所有新媒體", + "backup_controller_page_background_description": "開啟背景服務,即可在不需開啟 App 的情況下,自動備份所有新媒體", "backup_controller_page_background_is_off": "背景自動備份已關閉", "backup_controller_page_background_is_on": "背景自動備份已開啟", "backup_controller_page_background_turn_off": "關閉背景服務", @@ -579,7 +579,7 @@ "backup_controller_page_backup_selected": "已選中: ", "backup_controller_page_backup_sub": "已備份的照片和影片", "backup_controller_page_created": "建立時間:{date}", - "backup_controller_page_desc_backup": "開啟前台備份,在打開 App 時自動將新媒體上傳至伺服器。", + "backup_controller_page_desc_backup": "開啟前臺備份,在開啟 App 時自動將新媒體上傳至伺服器。", "backup_controller_page_excluded": "已排除: ", "backup_controller_page_failed": "失敗({count})", "backup_controller_page_filename": "檔案名稱:{filename} [{size}]", @@ -590,16 +590,16 @@ "backup_controller_page_remainder_sub": "選取項目中尚未備份的照片與影片", "backup_controller_page_server_storage": "伺服器儲存空間", "backup_controller_page_start_backup": "開始備份", - "backup_controller_page_status_off": "前台自動備份已關閉", - "backup_controller_page_status_on": "前台自動備份已開啟", + "backup_controller_page_status_off": "前臺自動備份已關閉", + "backup_controller_page_status_on": "前臺自動備份已開啟", "backup_controller_page_storage_format": "{used} / {total} 已使用", "backup_controller_page_to_backup": "要備份的相簿", "backup_controller_page_total_sub": "已選取相簿中的所有不重複的照片與影片", - "backup_controller_page_turn_off": "關閉前台備份", - "backup_controller_page_turn_on": "開啟前台備份", + "backup_controller_page_turn_off": "關閉前臺備份", + "backup_controller_page_turn_on": "開啟前臺備份", "backup_controller_page_uploading_file_info": "上傳中的檔案資訊", "backup_err_only_album": "不能移除唯一的相簿", - "backup_error_sync_failed": "同步失敗。 無法處理備份。", + "backup_error_sync_failed": "同步失敗,無法處理備份。", "backup_info_card_assets": "個媒體", "backup_manual_cancelled": "已取消", "backup_manual_in_progress": "上傳正在進行中,請稍後再試", @@ -607,20 +607,20 @@ "backup_manual_title": "上傳狀態", "backup_options": "備份選項", "backup_options_page_title": "備份選項", - "backup_setting_subtitle": "管理背景與前台上傳設定", + "backup_setting_subtitle": "管理背景與前臺上傳設定", "backup_settings_subtitle": "管理上傳設定", "backward": "由舊至新", "biometric_auth_enabled": "生物辨識驗證已啟用", "biometric_locked_out": "您已被鎖定無法使用生物辨識驗證", "biometric_no_options": "沒有生物辨識選項可用", - "biometric_not_available": "此設備上無法使用生物辨識驗證", + "biometric_not_available": "此裝置上無法使用生物辨識驗證", "birthdate_saved": "出生日期儲存成功", "birthdate_set_description": "出生日期用於計算此人在照片拍攝時的年齡。", "blurred_background": "背景模糊", "bugs_and_feature_requests": "錯誤及功能請求", "build": "建置編號", "build_image": "建置映像", - "bulk_delete_duplicates_confirmation": "您確定要批量刪除 {count, plural, one {# 個重複媒體} other {# 個重複媒體}} 嗎?系統將保留每組中大小最大的媒體,並永久刪除所有其他重複項目。此操作無法復原!", + "bulk_delete_duplicates_confirmation": "您確定要批次刪除 {count, plural, one {# 個重複媒體} other {# 個重複媒體}} 嗎?系統將保留每組中大小最大的媒體,並永久刪除所有其他重複項目。此操作無法復原!", "bulk_keep_duplicates_confirmation": "您確定要保留 {count, plural, one {# 個重複媒體} other {# 個重複媒體}} 嗎?這將在不刪除任何項目的情況下解決所有重複群組。", "bulk_trash_duplicates_confirmation": "您確定要批次將 {count, plural, one {# 個重複媒體} other {# 個重複媒體}}移至垃圾桶嗎?系統將保留每組中大小最大的媒體,並將所有其他重複項目移至垃圾桶。", "buy": "購買 Immich", @@ -637,7 +637,7 @@ "cache_settings_subtitle": "控制 Immich 行動應用程式的快取行為", "cache_settings_tile_subtitle": "設定本機儲存行為", "cache_settings_tile_title": "本機儲存空間", - "cache_settings_title": "緩存設定", + "cache_settings_title": "快取設定", "camera": "相機", "camera_brand": "相機品牌", "camera_model": "相機型號", @@ -648,7 +648,7 @@ "cannot_merge_people": "無法合併人物", "cannot_undo_this_action": "此操作無法復原!", "cannot_update_the_description": "無法更新描述", - "cast": "投影", + "cast": "投放", "cast_description": "設定可用的投放裝置", "change_date": "變更日期", "change_description": "變更描述", @@ -668,27 +668,27 @@ "change_your_password": "變更您的密碼", "changed_visibility_successfully": "已成功變更可見性", "charging": "充電", - "charging_requirement_mobile_backup": "後臺備份要求設備正在充電", + "charging_requirement_mobile_backup": "後臺備份要求裝置正在充電", "check_corrupt_asset_backup": "檢查損毀的備份項目", "check_corrupt_asset_backup_button": "執行檢查", - "check_corrupt_asset_backup_description": "僅在連接 Wi-Fi 且所有媒體已完成備份後執行此檢查。此程序可能需要數分鐘。", + "check_corrupt_asset_backup_description": "僅在已連線至 Wi-Fi 且所有媒體已完成備份後執行此檢查。此程式可能需要數分鐘。", "check_logs": "檢查日誌", "choose_matching_people_to_merge": "選擇要合併的相符人物", "city": "城市", "clear": "清空", "clear_all": "全部清除", "clear_all_recent_searches": "清除所有最近的搜尋", - "clear_file_cache": "清除文件快取", + "clear_file_cache": "清除檔案快取", "clear_message": "清除訊息", "clear_value": "清除值", "client_cert_dialog_msg_confirm": "確定", "client_cert_enter_password": "輸入密碼", "client_cert_import": "匯入", - "client_cert_import_success_msg": "已匯入客戶端證書", - "client_cert_invalid_msg": "無效的證書文件或密碼錯誤", - "client_cert_remove_msg": "客戶端證書已移除", - "client_cert_subtitle": "僅支持PKCS12 (.p12, .pfx)格式。僅可在登入前進行證書的匯入和移除", - "client_cert_title": "SSL 客戶端證書", + "client_cert_import_success_msg": "已匯入用戶端憑證", + "client_cert_invalid_msg": "無效的憑證檔案或密碼錯誤", + "client_cert_remove_msg": "用戶端憑證已移除", + "client_cert_subtitle": "僅支援 PKCS12 (.p12, .pfx) 格式。僅可在登入前進行憑證的匯入和移除", + "client_cert_title": "SSL 用戶端憑證", "clockwise": "順時針", "close": "關閉", "collapse": "折疊", @@ -711,10 +711,10 @@ "confirm_password": "確認密碼", "confirm_tag_face": "您想要將此臉孔標籤為 {name} 嗎?", "confirm_tag_face_unnamed": "您想標籤這張臉嗎?", - "connected_device": "已連結裝置", - "connected_to": "已連接到", - "contain": "等比置入", - "context": "內容上下文", + "connected_device": "已連線裝置", + "connected_to": "已連線至", + "contain": "等比內縮", + "context": "脈絡", "continue": "繼續", "control_bottom_app_bar_create_new_album": "建立新相簿", "control_bottom_app_bar_delete_from_immich": "從 Immich 伺服器中刪除", @@ -742,7 +742,7 @@ "create_library": "建立媒體庫", "create_link": "建立連結", "create_link_to_share": "建立共享連結", - "create_link_to_share_description": "任何持有連結的人都允許查看所選相片", + "create_link_to_share_description": "任何持有連結的人都允許檢視所選相片", "create_new": "新增", "create_new_person": "建立新人物", "create_new_person_hint": "將選定的媒體分配給新人物", @@ -755,7 +755,7 @@ "create_user": "建立使用者", "created": "建立於", "created_at": "建立於", - "creating_linked_albums": "創建連結相册 ...", + "creating_linked_albums": "建立連結相簿 ...", "crop": "裁剪", "curated_object_page_title": "事物", "current_device": "目前裝置", @@ -763,7 +763,7 @@ "current_server_address": "目前的伺服器位址", "custom_locale": "自訂地區設定", "custom_locale_description": "根據語言與地區格式化日期與數字", - "custom_url": "自定義 URL", + "custom_url": "自訂 URL", "daily_title_text_date": "E, MMM dd", "daily_title_text_date_year": "YYYY 年 M 月 D 日 (E)", "dark": "深色", @@ -784,7 +784,7 @@ "default_locale": "預設地區", "default_locale_description": "依照您的瀏覽器地區設定格式化日期與數字", "delete": "刪除", - "delete_action_confirmation_message": "您確定要刪除此媒體嗎?此操作會將該媒體移至伺服器的垃圾桶,並會提示您是否要在本地同時刪除", + "delete_action_confirmation_message": "您確定要刪除此媒體嗎?此操作會將該媒體移至伺服器的垃圾桶,並會提示您是否要在本機同時刪除", "delete_action_prompt": "{count} 個已刪除", "delete_album": "刪除相簿", "delete_api_key_prompt": "您確定要刪除這個 API 金鑰嗎?", @@ -797,9 +797,9 @@ "delete_duplicates_confirmation": "您確定要永久刪除這些重複項目嗎?", "delete_face": "刪除臉孔", "delete_key": "刪除金鑰", - "delete_library": "刪除圖庫", + "delete_library": "刪除相簿", "delete_link": "刪除連結", - "delete_local_action_prompt": "已在本地刪除 {count} 個項目", + "delete_local_action_prompt": "已在本機刪除 {count} 個項目", "delete_local_dialog_ok_backed_up_only": "僅刪除已備份的項目", "delete_local_dialog_ok_force": "確認刪除", "delete_others": "刪除其他", @@ -822,7 +822,7 @@ "disallow_edits": "不允許編輯", "discord": "Discord", "discover": "探索", - "discovered_devices": "已探索的設備", + "discovered_devices": "已探索的裝置", "dismiss_all_errors": "忽略所有錯誤", "dismiss_error": "忽略錯誤", "display_options": "顯示選項", @@ -853,7 +853,7 @@ "downloading": "下載中", "downloading_asset_filename": "正在下載媒體 {filename}", "downloading_media": "正在下載媒體", - "drop_files_to_upload": "將文件拖放到任何位置以上傳", + "drop_files_to_upload": "將檔案拖放到任何位置以上傳", "duplicates": "重複項目", "duplicates_description": "逐一檢查每個群組,並標示其中是否有重複媒體", "duration": "顯示時長", @@ -905,9 +905,9 @@ "error": "錯誤", "error_change_sort_album": "變更相簿排序失敗", "error_delete_face": "從媒體刪除臉孔時失敗", - "error_getting_places": "獲取位置時出錯", + "error_getting_places": "取得位置時出錯", "error_loading_image": "圖片載入錯誤", - "error_loading_partners": "加載合作夥伴時出錯:{error}", + "error_loading_partners": "載入合作夥伴時出錯:{error}", "error_saving_image": "錯誤:{error}", "error_tag_face_bounding_box": "標記臉部錯誤 - 無法取得邊界框坐標", "error_title": "錯誤 - 發生錯誤", @@ -927,7 +927,7 @@ "error_deleting_shared_user": "刪除共享使用者時發生錯誤", "error_downloading": "下載 {filename} 時發生錯誤", "error_hiding_buy_button": "隱藏購買按鈕時發生錯誤", - "error_removing_assets_from_album": "從相簿移除媒體時發生錯誤,請檢查主控台以取得更多詳細資訊", + "error_removing_assets_from_album": "從相簿移除媒體時發生錯誤,請檢查主控臺以取得更多詳細資訊", "error_selecting_all_assets": "選取所有檔案時發生錯誤", "exclusion_pattern_already_exists": "此排除模式已存在。", "failed_to_create_album": "相簿建立失敗", @@ -940,22 +940,22 @@ "failed_to_load_notifications": "載入通知失敗", "failed_to_load_people": "載入人物失敗", "failed_to_remove_product_key": "移除產品金鑰失敗", - "failed_to_reset_pin_code": "重置 PIN 碼失敗", + "failed_to_reset_pin_code": "重設 PIN 碼失敗", "failed_to_stack_assets": "無法媒體堆疊", "failed_to_unstack_assets": "解除媒體堆疊失敗", "failed_to_update_notification_status": "無法更新通知狀態", "import_path_already_exists": "此匯入路徑已存在。", "incorrect_email_or_password": "電子郵件或密碼錯誤", "paths_validation_failed": "{paths, plural, one {# 個路徑} other {# 個路徑}} 驗證失敗", - "profile_picture_transparent_pixels": "個人資料圖片不能有透明像素。請放大並/或移動影像。", + "profile_picture_transparent_pixels": "個人資料圖片不能有透明畫素。請放大並/或移動影像。", "quota_higher_than_disk_size": "您所設定的配額大於磁碟大小", "something_went_wrong": "發生錯誤", "unable_to_add_album_users": "無法將使用者加入相簿", "unable_to_add_assets_to_shared_link": "無法加入媒體到共享連結", "unable_to_add_comment": "無法新增留言", - "unable_to_add_exclusion_pattern": "無法添加篩選條件", - "unable_to_add_import_path": "無法添加匯入路徑", - "unable_to_add_partners": "無法添加親朋好友", + "unable_to_add_exclusion_pattern": "無法新增篩選條件", + "unable_to_add_import_path": "無法新增匯入路徑", + "unable_to_add_partners": "無法新增親朋好友", "unable_to_add_remove_archive": "無法{archived, select, true {從封存中移除媒體} other {將檔案加入媒體}}", "unable_to_add_remove_favorites": "無法將媒體{favorite, select, true {加入收藏} other {從收藏中移除}}", "unable_to_archive_unarchive": "無法{archived, select, true {封存} other {取消封存}}", @@ -967,7 +967,7 @@ "unable_to_change_password": "無法變更密碼", "unable_to_change_visibility": "無法變更 {count, plural, one {# 位人物} other {# 位人物}} 的可見性", "unable_to_complete_oauth_login": "無法完成 OAuth 登入", - "unable_to_connect": "無法連接", + "unable_to_connect": "無法連線", "unable_to_copy_to_clipboard": "無法複製到剪貼簿,請確保您是以 https 存取本頁面", "unable_to_create_admin_account": "無法建立管理員帳號", "unable_to_create_api_key": "無法建立新的 API 金鑰", @@ -985,12 +985,12 @@ "unable_to_edit_import_path": "無法編輯匯入路徑", "unable_to_empty_trash": "無法清空垃圾桶", "unable_to_enter_fullscreen": "無法進入全螢幕", - "unable_to_exit_fullscreen": "無法退出全螢幕", + "unable_to_exit_fullscreen": "無法結束全螢幕", "unable_to_get_comments_number": "無法取得留言數量", "unable_to_get_shared_link": "取得共享連結失敗", "unable_to_hide_person": "無法隱藏人物", "unable_to_link_motion_video": "無法連結動態影片", - "unable_to_link_oauth_account": "無法連接 OAuth 帳號", + "unable_to_link_oauth_account": "無法連結 OAuth 帳號", "unable_to_log_out_all_devices": "無法登出所有裝置", "unable_to_log_out_device": "無法登出裝置", "unable_to_login_with_oauth": "無法使用 OAuth 登入", @@ -1005,7 +1005,7 @@ "unable_to_remove_partner": "無法移除親朋好友", "unable_to_remove_reaction": "無法移除反應", "unable_to_reset_password": "無法重設密碼", - "unable_to_reset_pin_code": "無法重置 PIN 碼", + "unable_to_reset_pin_code": "無法重設 PIN 碼", "unable_to_resolve_duplicate": "無法解決重複項目", "unable_to_restore_assets": "無法還原媒體", "unable_to_restore_trash": "無法還原垃圾桶", @@ -1022,8 +1022,8 @@ "unable_to_set_profile_picture": "無法設定個人資料圖片", "unable_to_submit_job": "無法提交任務", "unable_to_trash_asset": "無法將媒體丟進垃圾桶", - "unable_to_unlink_account": "無法取消帳號的連接", - "unable_to_unlink_motion_video": "無法取消連接動態影片", + "unable_to_unlink_account": "無法解除帳號連結", + "unable_to_unlink_motion_video": "無法解除連結動態影片", "unable_to_update_album_cover": "無法更新相簿封面", "unable_to_update_album_info": "無法更新相簿資訊", "unable_to_update_library": "無法更新媒體庫", @@ -1033,17 +1033,17 @@ "unable_to_update_user": "無法更新使用者", "unable_to_upload_file": "無法上傳檔案" }, - "exif": "EXIF 可交換圖像文件格式", + "exif": "EXIF 可交換影像檔格式", "exif_bottom_sheet_description": "新增描述...", "exif_bottom_sheet_description_error": "更新描述時發生錯誤", "exif_bottom_sheet_details": "詳細資料", "exif_bottom_sheet_location": "位置", "exif_bottom_sheet_people": "人物", "exif_bottom_sheet_person_add_person": "新增姓名", - "exit_slideshow": "退出幻燈片", + "exit_slideshow": "結束幻燈片", "expand_all": "展開全部", "experimental_settings_new_asset_list_subtitle": "正在處理", - "experimental_settings_new_asset_list_title": "啟用實驗性相片格狀布局", + "experimental_settings_new_asset_list_title": "啟用實驗性相片格狀版面", "experimental_settings_subtitle": "使用風險自負!", "experimental_settings_title": "實驗性功能", "expire_after": "失效時間", @@ -1059,7 +1059,7 @@ "external": "外部", "external_libraries": "外部媒體庫", "external_network": "外部網路", - "external_network_sheet_info": "若未連接偏好的 Wi-Fi,將依列表從上到下選擇可連線的伺服器網址", + "external_network_sheet_info": "若未連線至偏好的 Wi-Fi,將依列表從上到下選擇可連線的伺服器網址", "face_unassigned": "未指定", "failed": "失敗", "failed_to_authenticate": "身份驗證失敗", @@ -1093,15 +1093,15 @@ "gcast_enabled": "Google Cast", "gcast_enabled_description": "此功能需要從 Google 載入外部資源才能正常運作。", "general": "一般", - "geolocation_instruction_location": "點擊具有 GPS 座標的項目以使用其位置,或直接從地圖中選擇地點", - "get_help": "線上求助", - "get_wifiname_error": "無法取得 Wi-Fi 名稱。請確認您已授予必要的權限,並已連接至 Wi-Fi 網路", + "geolocation_instruction_location": "點選具有 GPS 座標的項目以使用其位置,或直接從地圖中選擇地點", + "get_help": "取得協助", + "get_wifiname_error": "無法取得 Wi-Fi 名稱。請確認您已授予必要的權限,並已連線至 Wi-Fi 網路", "getting_started": "開始使用", - "go_back": "返回", + "go_back": "上一頁", "go_to_folder": "前往資料夾", "go_to_search": "前往搜尋", "gps": "GPS", - "gps_missing": "無GPS", + "gps_missing": "無 GPS", "grant_permission": "授予權限", "group_albums_by": "分類群組的方式...", "group_country": "按照國家分類", @@ -1120,7 +1120,7 @@ "header_settings_header_name_input": "標頭名稱", "header_settings_header_value_input": "標頭值", "headers_settings_tile_subtitle": "定義應用程式在每次網路請求時應附帶的代理標頭", - "headers_settings_tile_title": "自定義代理標頭", + "headers_settings_tile_title": "自訂代理標頭", "hi_user": "嗨!{name}({email})", "hide_all_people": "隱藏所有人物", "hide_gallery": "隱藏媒體庫", @@ -1129,21 +1129,21 @@ "hide_person": "隱藏人物", "hide_unnamed_people": "隱藏未命名的人物", "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": "已在 {album} 相簿中新增 {added} 個媒體。", "home_page_album_err_partner": "暫時不能無法將親朋好友的媒體新增到相簿,已略過", - "home_page_archive_err_local": "暫時不能封存本地媒體,已略過", + "home_page_archive_err_local": "暫時不能封存本機媒體,已略過", "home_page_archive_err_partner": "無法封存親朋好友的媒體,已略過", "home_page_building_timeline": "正在建立時間軸", "home_page_delete_err_partner": "無法刪除親朋好友的媒體,已略過", "home_page_delete_remote_err_local": "刪除遠端媒體的選取中包含本機媒體,已略過", - "home_page_favorite_err_local": "暫不能收藏本地項目,略過", + "home_page_favorite_err_local": "暫不能收藏本機項目,略過", "home_page_favorite_err_partner": "暫無法收藏親朋好友的項目,略過", "home_page_first_time_notice": "如果這是您第一次使用本程式,請確保選擇一個要備份的相簿,以將照片與影片加入時間軸", "home_page_locked_error_local": "無法移動本機檔案至鎖定的資料夾,已略過", "home_page_locked_error_partner": "無法移動親朋好友分享的媒體至鎖定的資料夾,已略過", - "home_page_share_err_local": "無法通過連結共享本地媒體,已略過", - "home_page_upload_err_limit": "一次最多只能上傳 30 個媒體,已略過", + "home_page_share_err_local": "無法透過連結共享本機媒體,已略過", + "home_page_upload_err_limit": "一次最多隻能上傳 30 個媒體,已略過", "host": "主機", "hour": "小時", "hours": "小時", @@ -1166,7 +1166,7 @@ "image_viewer_page_state_provider_download_started": "下載已啟動", "image_viewer_page_state_provider_download_success": "下載成功", "image_viewer_page_state_provider_share_error": "分享時發生錯誤", - "immich_logo": "Immich 標誌", + "immich_logo": "Immich Logo", "immich_web_interface": "Immich 網頁介面", "import_from_json": "從 JSON 匯入", "import_path": "匯入路徑", @@ -1190,9 +1190,9 @@ "invite_to_album": "邀請至相簿", "ios_debug_info_fetch_ran_at": "抓取已於 {dateTime} 執行", "ios_debug_info_last_sync_at": "上次同步於 {dateTime}", - "ios_debug_info_no_processes_queued": "無排程中的背景程序", + "ios_debug_info_no_processes_queued": "無排程中的背景程式", "ios_debug_info_no_sync_yet": "尚未執行任何背景同步任務", - "ios_debug_info_processes_queued": "{count, plural, one {{count} 個背景程序已排程} other {{count} 個背景程序已排程}}", + "ios_debug_info_processes_queued": "{count, plural, one {{count} 個背景程式已排程} other {{count} 個背景程式已排程}}", "ios_debug_info_processing_ran_at": "於 {dateTime} 執行處理", "items_count": "{count, plural, one {# 個項目} other {# 個項目}}", "jobs": "任務", @@ -1216,7 +1216,7 @@ "lens_model": "鏡頭型號", "let_others_respond": "允許他人回覆", "level": "等級", - "library": "圖庫", + "library": "相簿", "library_options": "資料庫選項", "library_page_device_albums": "裝置上的相簿", "library_page_new_album": "新增相簿", @@ -1227,21 +1227,21 @@ "licenses": "授權", "light": "淺色", "like": "喜歡", - "like_deleted": "已刪除的收藏", - "link_motion_video": "鏈結動態影片", - "link_to_oauth": "連接 OAuth", - "linked_oauth_account": "已連接 OAuth 帳號", + "like_deleted": "已取消喜歡", + "link_motion_video": "連結動態影片", + "link_to_oauth": "連結 OAuth", + "linked_oauth_account": "已連結 OAuth 帳號", "list": "列表", "loading": "載入中", "loading_search_results_failed": "載入搜尋結果失敗", - "local": "本地", - "local_asset_cast_failed": "無法轉換未上傳至伺服器的項目", - "local_assets": "本地項目", - "local_media_summary": "當地媒體摘要", - "local_network": "本地網路", + "local": "本機", + "local_asset_cast_failed": "無法投放未上傳至伺服器的項目", + "local_assets": "本機項目", + "local_media_summary": "本機媒體摘要", + "local_network": "本機網路", "local_network_sheet_info": "當使用指定的 Wi-Fi 網路時,應用程式將透過此網址連線至伺服器", "location_permission": "位置權限", - "location_permission_content": "使用自動切換功能,Immich 需要精確位置權限,以取得連接的 Wi-Fi 網路名稱", + "location_permission_content": "使用自動切換功能,Immich 需要精確位置權限,以取得已連線的 Wi-Fi 網路名稱", "location_picker_choose_on_map": "在地圖上選擇", "location_picker_latitude_error": "輸入有效的緯度值", "location_picker_latitude_hint": "請在此處輸入您的緯度值", @@ -1256,25 +1256,25 @@ "logged_out_all_devices": "已登出所有裝置", "logged_out_device": "已登出裝置", "login": "登入", - "login_disabled": "已禁用登入", - "login_form_api_exception": "API 異常,請檢查伺服器地址並重試。", - "login_form_back_button_text": "後退", + "login_disabled": "已停用登入", + "login_form_api_exception": "API 發生例外,請檢查伺服器位址後再試。", + "login_form_back_button_text": "上一頁", "login_form_email_hint": "電子郵件地址", - "login_form_endpoint_hint": "http://您的伺服器地址:端口", - "login_form_endpoint_url": "伺服器鏈接地址", - "login_form_err_http": "請注明 http:// 或 https://", - "login_form_err_invalid_email": "電郵無效", - "login_form_err_invalid_url": "無效的地址", + "login_form_endpoint_hint": "http://您的伺服器位址:連接埠", + "login_form_endpoint_url": "伺服器端點 URL", + "login_form_err_http": "請註明 http:// 或 https://", + "login_form_err_invalid_email": "電子郵件地址無效", + "login_form_err_invalid_url": "無效的 URL", "login_form_err_leading_whitespace": "帶有前導空格", "login_form_err_trailing_whitespace": "帶有尾隨空格", - "login_form_failed_get_oauth_server_config": "使用 OAuth 登入時錯誤,請檢查伺服器地址", - "login_form_failed_get_oauth_server_disable": "OAuth 功能在此伺服器上不可用", - "login_form_failed_login": "登入失敗,請檢查伺服器地址、電郵和密碼", - "login_form_handshake_exception": "與伺服器通信時出現握手異常。如果您使用的是自簽名證書,請在設定中啓用自簽名證書支持。", + "login_form_failed_get_oauth_server_config": "使用 OAuth 登入時錯誤,請檢查伺服器位址", + "login_form_failed_get_oauth_server_disable": "OAuth 功能在此伺服器上無法使用", + "login_form_failed_login": "登入失敗,請檢查伺服器位址、電子郵件地址與密碼", + "login_form_handshake_exception": "與伺服器通訊時出現握手異常。若使用自簽名憑證,請在設定中啟用自簽名憑證支援。", "login_form_password_hint": "密碼", "login_form_save_login": "保持登入", - "login_form_server_empty": "輸入伺服器連結。", - "login_form_server_error": "無法連接到伺服器。", + "login_form_server_empty": "請輸入伺服器網址。", + "login_form_server_error": "無法連線至伺服器。", "login_has_been_disabled": "已停用登入功能。", "login_password_changed_error": "密碼更新失敗", "login_password_changed_success": "密碼更新成功", @@ -1286,7 +1286,7 @@ "loop_videos": "重播影片", "loop_videos_description": "啟用後,影片結束會自動重播。", "main_branch_warning": "您現在使用的是開發版本;我們強烈您建議使用正式發行版!", - "main_menu": "主頁面", + "main_menu": "主選單", "make": "製造商", "manage_geolocation": "管理位置", "manage_shared_links": "管理共享連結", @@ -1295,30 +1295,30 @@ "manage_your_account": "管理您的帳號", "manage_your_api_keys": "管理您的 API 金鑰", "manage_your_devices": "管理已登入的裝置", - "manage_your_oauth_connection": "管理您的 OAuth 連接", + "manage_your_oauth_connection": "管理您的 OAuth 連結", "map": "地圖", "map_assets_in_bounds": "{count, plural, one {# 張照片} other {# 張照片}}", "map_cannot_get_user_location": "無法取得使用者位置", "map_location_dialog_yes": "確定", "map_location_picker_page_use_location": "使用此位置", - "map_location_service_disabled_content": "需要啓用定位服務才能顯示當前位置相關的項目。要現在啓用嗎?", - "map_location_service_disabled_title": "定位服務已禁用", - "map_marker_for_images": "在 {city}、{country} 拍攝圖像的地圖標記", - "map_marker_with_image": "帶有圖像的地圖標記", - "map_no_location_permission_content": "需要位置權限才能顯示與當前位置。要現在就授予位置權限嗎?", + "map_location_service_disabled_content": "需要啟用定位服務才能顯示目前位置相關的項目。要現在啟用嗎?", + "map_location_service_disabled_title": "定位服務已停用", + "map_marker_for_images": "在 {city}、{country} 拍攝影像的地圖示記", + "map_marker_with_image": "帶有影像的地圖示記", + "map_no_location_permission_content": "需要位置權限才能顯示與目前位置。要現在就授予位置權限嗎?", "map_no_location_permission_title": "沒有位置權限", "map_settings": "地圖設定", "map_settings_dark_mode": "深色模式", - "map_settings_date_range_option_day": "過去24小時", + "map_settings_date_range_option_day": "過去 24 小時", "map_settings_date_range_option_days": "{days} 天前", - "map_settings_date_range_option_year": "1年前", + "map_settings_date_range_option_year": "1 年前", "map_settings_date_range_option_years": "{years} 年前", "map_settings_dialog_title": "地圖設定", "map_settings_include_show_archived": "包括已封存項目", "map_settings_include_show_partners": "包含親朋好友", "map_settings_only_show_favorites": "僅顯示收藏的項目", "map_settings_theme_settings": "地圖主題", - "map_zoom_to_see_photos": "縮小以查看項目", + "map_zoom_to_see_photos": "縮小以檢視項目", "mark_all_as_read": "全部標記為已讀", "mark_as_read": "標記為已讀", "marked_all_as_read": "已全部標記為已讀", @@ -1336,7 +1336,7 @@ "menu": "選單", "merge": "合併", "merge_people": "合併人物", - "merge_people_limit": "一次最多只能合併 5 張臉孔", + "merge_people_limit": "一次最多隻能合併 5 張臉孔", "merge_people_prompt": "您要合併這些人物嗎?此操作無法撤銷。", "merge_people_successfully": "成功合併人物", "merged_people_count": "合併了 {count, plural, one {# 位人士} other {# 位人士}}", @@ -1364,8 +1364,8 @@ "name_or_nickname": "名稱或暱稱", "network_requirement_photos_upload": "使用行動網路流量備份照片", "network_requirement_videos_upload": "使用行動網路流量備份影片", - "network_requirements": "網絡要求", - "network_requirements_updated": "網絡需求已變更,現重置備份佇列", + "network_requirements": "網路要求", + "network_requirements_updated": "網路需求已變更,現重設備份佇列", "networking_settings": "網路", "networking_subtitle": "管理伺服器端點設定", "never": "永不失效", @@ -1388,21 +1388,21 @@ "no_archived_assets_message": "將照片和影片封存,就不會顯示在「照片」中", "no_assets_message": "按這裡上傳您的第一張照片", "no_assets_to_show": "無項目展示", - "no_cast_devices_found": "沒有找到 Google Cast 裝置", - "no_checksum_local": "沒有可用的校驗和-無法獲取本地資產", - "no_checksum_remote": "沒有可用的校驗和-無法獲取遠程資產", + "no_cast_devices_found": "找不到 Google Cast 裝置", + "no_checksum_local": "沒有可用的校驗和 - 無法取得本機資產", + "no_checksum_remote": "沒有可用的校驗和 - 無法取得遠端資產", "no_duplicates_found": "沒發現重複項目。", "no_exif_info_available": "沒有可用的 Exif 資訊", "no_explore_results_message": "上傳更多照片以利探索。", "no_favorites_message": "加入收藏,加速尋找影像", - "no_libraries_message": "建立外部媒體庫以查看您的照片和影片", - "no_local_assets_found": "未找到具有此校驗和的本地資產", - "no_locked_photos_message": "鎖定的資料夾中的照片和影片會被隱藏,當您瀏覽或搜尋圖庫時不會顯示。", + "no_libraries_message": "建立外部媒體庫以檢視您的照片和影片", + "no_local_assets_found": "未找到具有此校驗和的本機資產", + "no_locked_photos_message": "鎖定的資料夾中的照片和影片會被隱藏,當您瀏覽或搜尋相簿時不會顯示。", "no_name": "無名", "no_notifications": "沒有通知", "no_people_found": "找不到符合的人物", "no_places": "沒有地點", - "no_remote_assets_found": "未找到具有此校驗和的遠程資產", + "no_remote_assets_found": "未找到具有此校驗和的遠端資產", "no_results": "沒有結果", "no_results_description": "試試同義詞或更通用的關鍵字吧", "no_shared_albums_message": "建立相簿分享照片和影片", @@ -1429,12 +1429,12 @@ "on_this_device": "在此裝置", "onboarding": "入門指南", "onboarding_locale_description": "選擇您想要顯示的語言。設定完成之後生效。", - "onboarding_privacy_description": "以下(可選)功能依賴外部服務,可隨時在設定中停用。", + "onboarding_privacy_description": "以下(可選)功能仰賴外部服務,可隨時在設定中停用。", "onboarding_server_welcome_description": "讓我們為您的系統進行一些基本設定。", - "onboarding_theme_description": "幫實例選色彩主題。之後也可以在設定中變更。", - "onboarding_user_welcome_description": "讓我們開始吧!", + "onboarding_theme_description": "幫執行個體選色彩主題。之後也可以在設定中變更。", + "onboarding_user_welcome_description": "讓我們開始吧!", "onboarding_welcome_user": "歡迎,{user}", - "online": "在線", + "online": "線上", "only_favorites": "僅顯示己收藏", "open": "開啟", "open_in_map_view": "開啟地圖檢視", @@ -1442,9 +1442,9 @@ "open_the_search_filters": "開啟搜尋篩選器", "options": "選項", "or": "或", - "organize_into_albums": "整理成相册", - "organize_into_albums_description": "使用當前同步設定將現有照片放入相册", - "organize_your_library": "整理您的圖庫", + "organize_into_albums": "整理成相簿", + "organize_into_albums_description": "使用目前同步設定將現有照片放入相簿", + "organize_your_library": "整理您的相簿", "original": "原圖", "other": "其他", "other_devices": "其它裝置", @@ -1459,7 +1459,7 @@ "partner_list_user_photos": "{user} 的照片", "partner_list_view_all": "展示全部", "partner_page_empty_message": "您的照片尚未與任何親朋好友共享。", - "partner_page_no_more_users": "無需新增更多用戶", + "partner_page_no_more_users": "無需新增更多使用者", "partner_page_partner_add_failed": "新增親朋好友失敗", "partner_page_select_partner": "選擇親朋好友", "partner_page_shared_to_title": "共享給", @@ -1494,14 +1494,14 @@ "permanently_deleted_assets_count": "永久刪除的 {count, plural, one {# 個檔案} other {# 個檔案}}", "permission": "權限", "permission_empty": "權限不能為空", - "permission_onboarding_back": "返回", + "permission_onboarding_back": "上一頁", "permission_onboarding_continue_anyway": "確認繼續", "permission_onboarding_get_started": "開始使用", "permission_onboarding_go_to_settings": "前往設定", "permission_onboarding_permission_denied": "如要繼續,請允許 Immich 存取相片和影片權限。", "permission_onboarding_permission_granted": "已允許!一切就緒。", "permission_onboarding_permission_limited": "如要繼續,請允許 Immich 備份和管理您的相簿收藏,在設定中授予相片和影片權限。", - "permission_onboarding_request": "Immich 需要權限才能查看您的相片和短片。", + "permission_onboarding_request": "Immich 需要權限才能檢視您的相片和短片。", "person": "人物", "person_age_months": "{months, plural, one {# 個月} other {# 個月}}前", "person_age_year_months": "1 年 {months, plural, one {# 個月} other {# 個月}}前", @@ -1515,9 +1515,9 @@ "photos_from_previous_years": "往年的照片", "pick_a_location": "選擇位置", "pin_code_changed_successfully": "變更 PIN 碼成功", - "pin_code_reset_successfully": "重置 PIN 碼成功", + "pin_code_reset_successfully": "重設 PIN 碼成功", "pin_code_setup_successfully": "設定 PIN 碼成功", - "pin_verification": "PIN碼驗證", + "pin_verification": "PIN 碼驗證", "place": "地點", "places": "地點", "places_count": "{count, plural, one {{count, number} 個地點} other {{count, number} 個地點}}", @@ -1542,13 +1542,13 @@ "privacy": "隱私", "profile": "帳戶設定", "profile_drawer_app_logs": "日誌", - "profile_drawer_client_out_of_date_major": "客戶端有大版本升級,請盡快升級至最新版。", - "profile_drawer_client_out_of_date_minor": "客戶端有小版本升級,請盡快升級至最新版。", - "profile_drawer_client_server_up_to_date": "客戶端和服務端都是最新的", + "profile_drawer_client_out_of_date_major": "用戶端有大版本升級,請盡快升級至最新版。", + "profile_drawer_client_out_of_date_minor": "用戶端有小版本升級,請盡快升級至最新版。", + "profile_drawer_client_server_up_to_date": "用戶端與伺服器端都是最新的", "profile_drawer_github": "GitHub", - "profile_drawer_readonly_mode": "唯讀模式已開啟。請長按使用者頭像圖示以退出。", - "profile_drawer_server_out_of_date_major": "服務端有大版本升級,請盡快升級至最新版。", - "profile_drawer_server_out_of_date_minor": "服務端有小版本升級,請盡快升級至最新版。", + "profile_drawer_readonly_mode": "唯讀模式已開啟。請長按使用者頭像圖示以結束。", + "profile_drawer_server_out_of_date_major": "伺服器端有大版本升級,請盡快升級至最新版。", + "profile_drawer_server_out_of_date_minor": "伺服器端有小版本升級,請盡快升級至最新版。", "profile_image_of_user": "{user} 的個人資料圖片", "profile_picture_set": "已設定個人資料圖片。", "public_album": "公開相簿", @@ -1573,7 +1573,7 @@ "purchase_lifetime_description": "終身購置", "purchase_option_title": "購置選項", "purchase_panel_info_1": "開發 Immich 可不是件容易的事,花了我們不少功夫。好在有一群全職工程師在背後默默努力,為的就是把它做到最好。我們的目標很簡單:讓開放原始碼軟體和正當的商業模式能成為開發者的長期飯碗,同時打造出重視隱私的生態系統,讓大家有個不被限制的雲端服務新選擇。", - "purchase_panel_info_2": "我們承諾不設付費牆,所以購置 Immich 並不會讓您獲得額外的功能。我們是依賴使用者們的支援來開發 Immich 的。", + "purchase_panel_info_2": "我們承諾不設付費牆,所以購置 Immich 並不會讓您獲得額外的功能。我們仰賴使用者們的支援來開發 Immich。", "purchase_panel_title": "支援這項專案", "purchase_per_server": "每臺伺服器", "purchase_per_user": "每位使用者", @@ -1585,7 +1585,7 @@ "purchase_server_description_2": "擁護者狀態", "purchase_server_title": "伺服器", "purchase_settings_server_activated": "伺服器產品金鑰是由管理者管理的", - "query_asset_id": "査詢資產ID", + "query_asset_id": "査詢資產 ID", "queue_status": "處理中 {count}/{total}", "rating": "評星", "rating_clear": "清除評等", @@ -1620,7 +1620,7 @@ "regenerating_thumbnails": "重新產生縮圖中", "remote": "遠端", "remote_assets": "遠端項目", - "remote_media_summary": "遠程媒體摘要", + "remote_media_summary": "遠端媒體摘要", "remove": "移除", "remove_assets_album_confirmation": "確定要從相簿中移除 {count, plural, other {# 個檔案}}嗎?", "remove_assets_shared_link_confirmation": "確定刪除共享連結中{count, plural, other {# 個項目}}嗎?", @@ -1632,13 +1632,13 @@ "remove_from_favorites": "從收藏中移除", "remove_from_lock_folder_action_prompt": "已從鎖定的資料夾中移除了 {count} 個項目", "remove_from_locked_folder": "從鎖定的資料夾中移除", - "remove_from_locked_folder_confirmation": "您確定要將這些照片和影片移出鎖定的資料夾嗎?這些內容將會顯示在您的圖庫中。", + "remove_from_locked_folder_confirmation": "您確定要將這些照片和影片移出鎖定的資料夾嗎?這些內容將會顯示在您的相簿中。", "remove_from_shared_link": "從共享連結中移除", "remove_memory": "移除記憶", "remove_photo_from_memory": "將圖片從此記憶中移除", "remove_tag": "移除標籤", "remove_url": "移除 URL", - "remove_user": "移除用戶", + "remove_user": "移除使用者", "removed_api_key": "已移除 API 金鑰:{name}", "removed_from_archive": "從封存中移除", "removed_from_favorites": "已從收藏中移除", @@ -1657,9 +1657,9 @@ "reset": "重設", "reset_password": "重設密碼", "reset_people_visibility": "重設人物可見性", - "reset_pin_code": "重置 PIN 碼", - "reset_pin_code_description": "若忘記了PIN 碼,閣下可要求系統伺服器管理員為您重置", - "reset_pin_code_success": "閣下已成功重設PIN碼", + "reset_pin_code": "重設 PIN 碼", + "reset_pin_code_description": "若忘記了 PIN 碼,閣下可要求系統伺服器管理員為您重設", + "reset_pin_code_success": "閣下已成功重設 PIN 碼", "reset_pin_code_with_password": "您可隨時使用您的密碼來重設 PIN 碼", "reset_sqlite": "重設 SQLite 資料庫", "reset_sqlite_confirmation": "確定要重設 SQLite 資料庫嗎?閣下需登出並重新登入才能重新同步資料", @@ -1676,19 +1676,19 @@ "resume_paused_jobs": "恢復 {count, plural, one {# 暫停的任務} other {# 暫停的任務}}", "retry_upload": "重新上傳", "review_duplicates": "檢視重複項目", - "review_large_files": "檢視大型文件", + "review_large_files": "檢視大型檔案", "role": "角色", "role_editor": "編輯者", "role_viewer": "檢視者", - "running": "運行中", + "running": "執行中", "save": "儲存", - "save_to_gallery": "儲存到圖庫", + "save_to_gallery": "儲存到相簿", "saved_api_key": "已儲存 API 金鑰", "saved_profile": "已儲存個人資料", "saved_settings": "已儲存設定", "say_something": "說說您的想法吧", "scaffold_body_error_occurred": "發生錯誤", - "scan_all_libraries": "掃描所有圖庫", + "scan_all_libraries": "掃描所有相簿", "scan_library": "掃描", "scan_settings": "掃描設定", "scanning_for_album": "掃描相簿中……", @@ -1727,11 +1727,11 @@ "search_page_motion_photos": "動態照片", "search_page_no_objects": "找不到物件資訊", "search_page_no_places": "找不到地點資訊", - "search_page_screenshots": "屏幕截圖", + "search_page_screenshots": "螢幕截圖", "search_page_search_photos_videos": "搜尋您的照片與影片", "search_page_selfies": "自拍", "search_page_things": "事物", - "search_page_view_all_button": "查看全部", + "search_page_view_all_button": "檢視全部", "search_page_your_activity": "您的活動", "search_page_your_map": "您的足跡", "search_people": "搜尋人物", @@ -1748,7 +1748,7 @@ "search_your_photos": "搜尋照片", "searching_locales": "搜尋區域…", "second": "秒", - "see_all_people": "查看所有人物", + "see_all_people": "檢視所有人物", "select": "選擇", "select_album_cover": "選擇相簿封面", "select_all": "選擇全部", @@ -1759,7 +1759,7 @@ "select_featured_photo": "選擇特色照片", "select_from_computer": "從電腦中選取", "select_keep_all": "全部保留", - "select_library_owner": "選擇圖庫擁有者", + "select_library_owner": "選擇相簿擁有者", "select_new_face": "選擇新臉孔", "select_person_to_tag": "選擇要標記的人物", "select_photos": "選照片", @@ -1767,12 +1767,12 @@ "select_user_for_sharing_page_err_album": "新增相簿失敗", "selected": "已選擇", "selected_count": "{count, plural, other {選了 # 項}}", - "selected_gps_coordinates": "選定的GPS座標", + "selected_gps_coordinates": "選定的 GPS 座標", "send_message": "傳訊息", "send_welcome_email": "傳送歡迎電子郵件", "server_endpoint": "伺服器端點", "server_info_box_app_version": "App 版本", - "server_info_box_server_url": "伺服器地址", + "server_info_box_server_url": "伺服器網址", "server_offline": "伺服器已離線", "server_online": "伺服器已上線", "server_privacy": "伺服器隱私", @@ -1783,13 +1783,13 @@ "set_as_featured_photo": "設為特色照片", "set_as_profile_picture": "設為個人資料圖片", "set_date_of_birth": "設定出生日期", - "set_profile_picture": "設置個人資料圖片", + "set_profile_picture": "設定個人資料圖片", "set_slideshow_to_fullscreen": "以全螢幕放映幻燈片", - "set_stack_primary_asset": "設置堆疊的首要項目", - "setting_image_viewer_help": "詳細資訊查看器首先載入小縮圖,然後載入中等大小的預覽圖(若啓用),最後載入原始圖片。", - "setting_image_viewer_original_subtitle": "啓用以載入原圖,禁用以減少數據使用量(包括網絡和裝置緩存)。", + "set_stack_primary_asset": "設定堆疊的首要項目", + "setting_image_viewer_help": "詳細資訊檢視器首先載入小縮圖,然後載入中等大小的預覽圖(若啟用),最後載入原始圖片。", + "setting_image_viewer_original_subtitle": "啟用以載入原圖,停用以減少資料使用量(包括網路和裝置快取)。", "setting_image_viewer_original_title": "載入原圖", - "setting_image_viewer_preview_subtitle": "啓用以載入中等質量的圖片,禁用以載入原圖或縮圖。", + "setting_image_viewer_preview_subtitle": "啟用以載入中等品質的圖片,停用以載入原圖或縮圖。", "setting_image_viewer_preview_title": "載入預覽圖", "setting_image_viewer_title": "圖片", "setting_languages_apply": "套用", @@ -1803,13 +1803,13 @@ "setting_notifications_single_progress_subtitle": "每項的詳細上傳進度資訊", "setting_notifications_single_progress_title": "顯示背景備份詳細進度", "setting_notifications_subtitle": "調整通知選項", - "setting_notifications_total_progress_subtitle": "總體上傳進度(已完成/總計)", + "setting_notifications_total_progress_subtitle": "總體上傳進度 (已完成/總計)", "setting_notifications_total_progress_title": "顯示背景備份總進度", - "setting_video_viewer_looping_title": "循環播放", + "setting_video_viewer_looping_title": "迴圈播放", "setting_video_viewer_original_video_subtitle": "從伺服器串流影片時,優先播放原始畫質(即使有轉檔的版本可用)。這可能會導致播放時出現緩衝情況。若影片已儲存在本機,則一律以原始畫質播放,與此設定無關。", "setting_video_viewer_original_video_title": "一律播放原始影片", "settings": "設定", - "settings_require_restart": "請重啓 Immich 以使設定生效", + "settings_require_restart": "請重啟 Immich 以使設定生效", "settings_saved": "設定已儲存", "setup_pin_code": "設定 PIN 碼", "share": "分享", @@ -1819,35 +1819,35 @@ "share_dialog_preparing": "正在準備...", "share_link": "分享連結", "shared": "共享", - "shared_album_activities_input_disable": "已禁用評論", + "shared_album_activities_input_disable": "已停用評論", "shared_album_activity_remove_content": "您確定要刪除此活動嗎?", "shared_album_activity_remove_title": "刪除活動", - "shared_album_section_people_action_error": "退出/刪除相簿失敗", - "shared_album_section_people_action_leave": "從相簿中刪除用戶", - "shared_album_section_people_action_remove_user": "從相簿中刪除用戶", + "shared_album_section_people_action_error": "結束/刪除相簿失敗", + "shared_album_section_people_action_leave": "從相簿中刪除使用者", + "shared_album_section_people_action_remove_user": "從相簿中刪除使用者", "shared_album_section_people_title": "人物", "shared_by": "共享自", "shared_by_user": "由 {user} 分享", "shared_by_you": "由您分享", "shared_from_partner": "來自 {partner} 的照片", "shared_intent_upload_button_progress_text": "{current} / {total} 已上傳", - "shared_link_app_bar_title": "共享鏈接", - "shared_link_clipboard_copied_massage": "複製到剪貼板", + "shared_link_app_bar_title": "共享連結", + "shared_link_clipboard_copied_massage": "複製到剪貼簿", "shared_link_clipboard_text": "連結: {link}\n密碼: {password}", "shared_link_create_error": "新增共享連結時發生錯誤", - "shared_link_custom_url_description": "使用自定義的 URL 連結", + "shared_link_custom_url_description": "使用自訂 URL", "shared_link_edit_description_hint": "編輯共享描述", - "shared_link_edit_expire_after_option_day": "1天", + "shared_link_edit_expire_after_option_day": "1 天", "shared_link_edit_expire_after_option_days": "{count} 天", - "shared_link_edit_expire_after_option_hour": "1小時", + "shared_link_edit_expire_after_option_hour": "1 小時", "shared_link_edit_expire_after_option_hours": "{count} 小時", - "shared_link_edit_expire_after_option_minute": "1分鐘", + "shared_link_edit_expire_after_option_minute": "1 分鐘", "shared_link_edit_expire_after_option_minutes": "{count} 分鐘", "shared_link_edit_expire_after_option_months": "{count} 個月", "shared_link_edit_expire_after_option_year": "{count} 年", "shared_link_edit_password_hint": "輸入共享密碼", "shared_link_edit_submit_button": "更新連結", - "shared_link_error_server_url_fetch": "無法取得伺服器地址", + "shared_link_error_server_url_fetch": "無法取得伺服器網址", "shared_link_expires_day": "{count} 天後過期", "shared_link_expires_days": "{count} 天後過期", "shared_link_expires_hour": "{count} 小時後過期", @@ -1859,18 +1859,18 @@ "shared_link_expires_seconds": "將在 {count} 秒後過期", "shared_link_individual_shared": "個人共享", "shared_link_info_chip_metadata": "EXIF", - "shared_link_manage_links": "管理共享鏈接", + "shared_link_manage_links": "管理共享連結", "shared_link_options": "共享連結選項", - "shared_link_password_description": "要求在訪問此連結時提供密碼", + "shared_link_password_description": "要求在存取此連結時提供密碼", "shared_links": "共享連結", "shared_links_description": "以連結分享照片和影片", "shared_photos_and_videos_count": "{assetCount, plural, other {已分享 # 張照片及影片。}}", "shared_with_me": "與我共享", "shared_with_partner": "與 {partner} 共享", "sharing": "共享", - "sharing_enter_password": "要查看此頁面請輸入密碼。", + "sharing_enter_password": "要檢視此頁面請輸入密碼。", "sharing_page_album": "共享相簿", - "sharing_page_description": "新增共享相簿以與網絡中的人共享照片和短片。", + "sharing_page_description": "新增共享相簿以與網路中的人共享照片和短片。", "sharing_page_empty_list": "空白清單", "sharing_sidebar_description": "在側邊欄顯示共享連結", "sharing_silver_appbar_create_shared_album": "新增共享相簿", @@ -1880,7 +1880,7 @@ "show_albums": "顯示相簿", "show_all_people": "顯示所有人物", "show_and_hide_people": "顯示與隱藏人物", - "show_file_location": "顯示文件位置", + "show_file_location": "顯示檔案位置", "show_gallery": "顯示畫廊", "show_hidden_people": "顯示隱藏的人物", "show_in_timeline": "在時間軸中顯示", @@ -1899,7 +1899,7 @@ "show_text_search_menu": "顯示文字蒐索選單", "shuffle": "隨機排序", "sidebar": "側邊欄", - "sidebar_display_description": "在側邊欄中顯示鏈結", + "sidebar_display_description": "在側邊欄中顯示連結", "sign_out": "登出", "sign_up": "註冊", "size": "用量", @@ -1918,7 +1918,7 @@ "sort_recent": "最新的照片", "sort_title": "標題", "source": "來源", - "stack": "堆叠", + "stack": "堆疊", "stack_action_prompt": "已堆疊了{count} 個項目", "stack_duplicates": "堆疊重複項目", "stack_select_one_photo": "為堆疊選一張主要照片", @@ -1930,11 +1930,11 @@ "start_date_before_end_date": "開始日期必須早於結束日期", "state": "地區", "status": "狀態", - "stop_casting": "停止casting", + "stop_casting": "停止投放", "stop_motion_photo": "停止動態照片", "stop_photo_sharing": "要停止分享您的照片嗎?", - "stop_photo_sharing_description": "{partner} 將無法再訪問您的照片。", - "stop_sharing_photos_with_user": "停止與此用戶共享您的照片", + "stop_photo_sharing_description": "{partner} 將無法再存取您的照片。", + "stop_sharing_photos_with_user": "停止與此使用者共享您的照片", "storage": "儲存空間", "storage_label": "儲存標籤", "storage_quota": "儲存空間", @@ -1944,16 +1944,16 @@ "suggestions": "建議", "sunrise_on_the_beach": "日出的海灘", "support": "支援", - "support_and_feedback": "支持與回饋", - "support_third_party_description": "您安裝的 immich 是由第三方打包的。您遇到的問題可能是該軟體包造成的,所以請先使用下面的鏈結向他們提出問題。", + "support_and_feedback": "支援與回饋", + "support_third_party_description": "您安裝的 Immich 是由第三方打包的。您遇到的問題可能是該套件造成的,所以請先使用下面的連結向他們提出問題。", "swap_merge_direction": "交換合併方向", "sync": "同步", "sync_albums": "同步相簿", "sync_albums_manual_subtitle": "將所有上傳的短片和照片同步到選定的備份相簿", "sync_local": "同步本機", "sync_remote": "同步遠端", - "sync_status": "同步状态", - "sync_status_subtitle": "查看和管理同步系統", + "sync_status": "同步狀態", + "sync_status_subtitle": "檢視和管理同步系統", "sync_upload_album_setting_subtitle": "新增照片和短片並上傳到 Immich 上的選定相簿中", "tag": "標籤", "tag_assets": "標記檔案", @@ -1964,7 +1964,7 @@ "tag_updated": "已更新標籤:{tag}", "tagged_assets": "已標籤 {count, plural, one {# 個檔案} other {# 個檔案}}", "tags": "標籤", - "tap_to_run_job": "點擊以進行作業", + "tap_to_run_job": "點選以進行作業", "template": "模板", "theme": "主題", "theme_selection": "主題選項", @@ -1972,16 +1972,16 @@ "theme_setting_asset_list_storage_indicator_title": "在項目標題上顯示使用之儲存空間", "theme_setting_asset_list_tiles_per_row_title": "每行展示 {count} 項", "theme_setting_colorful_interface_subtitle": "套用主色調到背景。", - "theme_setting_colorful_interface_title": "彩色界面", - "theme_setting_image_viewer_quality_subtitle": "調整查看大圖時的圖片質量", - "theme_setting_image_viewer_quality_title": "圖片質量", + "theme_setting_colorful_interface_title": "彩色介面", + "theme_setting_image_viewer_quality_subtitle": "調整檢視大圖時的圖片品質", + "theme_setting_image_viewer_quality_title": "圖片品質", "theme_setting_primary_color_subtitle": "選擇顏色作為主色調。", "theme_setting_primary_color_title": "主色調", "theme_setting_system_primary_color_title": "使用系統顏色", "theme_setting_system_theme_switch": "自動(跟隨系統設定)", "theme_setting_theme_subtitle": "選擇套用主題", "theme_setting_three_stage_loading_subtitle": "三段式載入可能提升載入效能,但會大幅增加網路負載", - "theme_setting_three_stage_loading_title": "啓用三段式載入", + "theme_setting_three_stage_loading_title": "啟用三段式載入", "they_will_be_merged_together": "它們將會被合併在一起", "third_party_resources": "第三方資源", "time_based_memories": "依時間回憶", @@ -1993,7 +1993,7 @@ "to_login": "登入", "to_multi_select": "進行多選", "to_parent": "到上一級", - "to_select": "选择", + "to_select": "選擇", "to_trash": "垃圾桶", "toggle_settings": "切換設定", "total": "統計", @@ -2006,14 +2006,14 @@ "trash_emptied": "已清空回收桶", "trash_no_results_message": "垃圾桶中的照片和影片將顯示在這裡。", "trash_page_delete_all": "刪除全部", - "trash_page_empty_trash_dialog_content": "是否清空回收桶?這些項目將被從Immich中永久刪除", + "trash_page_empty_trash_dialog_content": "是否清空回收桶?這些項目將被從 Immich 中永久刪除", "trash_page_info": "回收桶中項目將在 {days} 天後永久刪除", "trash_page_no_assets": "暫無已刪除項目", "trash_page_restore_all": "恢復全部", "trash_page_select_assets_btn": "選擇項目", "trash_page_title": "垃圾桶 ({count})", "trashed_items_will_be_permanently_deleted_after": "垃圾桶中的項目會在 {days, plural, other {# 天}}後永久刪除。", - "troubleshoot": "疑难解答", + "troubleshoot": "疑難解答", "type": "類型", "unable_to_change_pin_code": "無法變更 PIN 碼", "unable_to_setup_pin_code": "無法設定 PIN 碼", @@ -2026,11 +2026,11 @@ "unhide_person": "取消隱藏人物", "unknown": "未知", "unknown_country": "未知國家", - "unknown_year": "不知年份", + "unknown_year": "未知年份", "unlimited": "不限制", - "unlink_motion_video": "取消鏈結動態影片", - "unlink_oauth": "取消連接 OAuth", - "unlinked_oauth_account": "已解除連接 OAuth 帳號", + "unlink_motion_video": "解除連結動態影片", + "unlink_oauth": "解除連結 OAuth", + "unlinked_oauth_account": "已解除連結 OAuth 帳號", "unmute_memories": "取消靜音回憶", "unnamed_album": "未命名相簿", "unnamed_album_delete_confirmation": "確定要刪除這本相簿嗎?", @@ -2039,7 +2039,7 @@ "unselect_all": "取消全選", "unselect_all_duplicates": "取消選取所有的重複項目", "unselect_all_in": "{group} 全不選", - "unstack": "取消堆叠", + "unstack": "取消堆疊", "unstack_action_prompt": "{count} 個取消堆疊", "unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}", "untagged": "無標籤", @@ -2053,14 +2053,14 @@ "upload_details": "上傳詳細資訊", "upload_dialog_info": "是否要將所選項目備份到伺服器?", "upload_dialog_title": "上傳項目", - "upload_errors": "上傳完成,但有 {count, plural, other {# 處時發生錯誤}},要查看新上傳的檔案請重新整理頁面。", + "upload_errors": "上傳完成,但有 {count, plural, other {# 處時發生錯誤}},要檢視新上傳的檔案請重新整理頁面。", "upload_finished": "上傳完成", "upload_progress": "剩餘 {remaining, number} - 已處理 {processed, number}/{total, number}", "upload_skipped_duplicates": "已略過 {count, plural, other {# 個重複的檔案}}", "upload_status_duplicates": "重複項目", "upload_status_errors": "錯誤", "upload_status_uploaded": "已上傳", - "upload_success": "上傳成功,要查看新上傳的檔案請重新整理頁面。", + "upload_success": "上傳成功,要檢視新上傳的檔案請重新整理頁面。", "upload_to_immich": "上傳至 Immich ({count})", "uploading": "上傳中", "uploading_media": "媒體上傳中", @@ -2070,7 +2070,7 @@ "use_current_connection": "使用目前的連線", "use_custom_date_range": "改用自訂日期範圍", "user": "使用者", - "user_has_been_deleted": "此用戶已被刪除。", + "user_has_been_deleted": "此使用者已被刪除。", "user_id": "使用者 ID", "user_liked": "{user} 喜歡了 {type, select, photo {這張照片} video {這段影片} asset {這個檔案} other {它}}", "user_pin_code_settings": "PIN 碼", @@ -2081,13 +2081,13 @@ "user_role_set": "設 {user} 為{role}", "user_usage_detail": "使用者用量詳細資訊", "user_usage_stats": "帳號使用量統計", - "user_usage_stats_description": "查看帳號使用量", + "user_usage_stats_description": "檢視帳號使用量", "username": "使用者名稱", "users": "admin", "users_added_to_album_count": "已在此相簿中新增了 {count, plural, one {# 個} other {# 個}} 使用者", "utilities": "工具", "validate": "驗證", - "validate_endpoint_error": "請輸入有效的連結", + "validate_endpoint_error": "請輸入有效的 URL", "variables": "變數", "version": "版本", "version_announcement_closing": "敬祝順心,Alex", @@ -2095,24 +2095,24 @@ "version_history": "版本紀錄", "version_history_item": "{date} 安裝了 {version}", "video": "影片", - "video_hover_setting": "游標停留時播放影片縮圖", + "video_hover_setting": "遊標停留時播放影片縮圖", "video_hover_setting_description": "當滑鼠停在項目上時播放影片縮圖。即使停用,將滑鼠停在播放圖示上也可以播放。", "videos": "影片", "videos_count": "{count, plural, other {# 部影片}}", - "view": "查看", - "view_album": "查看相簿", + "view": "檢視", + "view_album": "檢視相簿", "view_all": "瀏覽全部", - "view_all_users": "查看所有使用者", + "view_all_users": "檢視所有使用者", "view_details": "檢視詳細資訊", - "view_in_timeline": "在時間軸中查看", - "view_link": "查看連結", - "view_links": "檢視鏈結", + "view_in_timeline": "在時間軸中檢視", + "view_link": "檢視連結", + "view_links": "檢視連結", "view_name": "檢視分類", - "view_next_asset": "查看下一項", - "view_previous_asset": "查看上一項", - "view_qr_code": "查看 QR code", - "view_similar_photos": "查看相似照片", - "view_stack": "查看堆疊", + "view_next_asset": "檢視下一項", + "view_previous_asset": "檢視上一項", + "view_qr_code": "檢視 QR code", + "view_similar_photos": "檢視相似照片", + "view_stack": "檢視堆疊", "view_user": "顯示使用者", "viewer_remove_from_stack": "從堆疊中移除", "viewer_stack_use_as_main_asset": "作為主項目使用", diff --git a/i18n/zh_SIMPLIFIED.json b/i18n/zh_SIMPLIFIED.json index 3ed4a14a2b..fc575d44e5 100644 --- a/i18n/zh_SIMPLIFIED.json +++ b/i18n/zh_SIMPLIFIED.json @@ -33,6 +33,7 @@ "add_to_albums": "添加到相册", "add_to_albums_count": "添加到相册({count}个)", "add_to_shared_album": "添加到共享相册", + "add_upload_to_stack": "上传项目至堆叠", "add_url": "添加 URL", "added_to_archive": "添加到归档", "added_to_favorites": "添加到收藏", @@ -465,7 +466,7 @@ "api_key_description": "该应用密钥只会显示一次。请确保在关闭窗口前复制下来。", "api_key_empty": "API 密钥名称不可为空", "api_keys": "API 密钥", - "app_bar_signout_dialog_content": "是否确定退出登录?", + "app_bar_signout_dialog_content": "您确定要退出吗?", "app_bar_signout_dialog_ok": "是", "app_bar_signout_dialog_title": "退出登录", "app_settings": "应用设置", @@ -1375,7 +1376,7 @@ "new_person": "新人物", "new_pin_code": "新的PIN码", "new_pin_code_subtitle": "这是您第一次访问此锁定文件夹。创建一个PIN码以安全访问此页面", - "new_timeline": "新建时间轴", + "new_timeline": "切换到新版时间线", "new_user_created": "已创建新用户", "new_version_available": "有新版本发布啦", "newest_first": "最新优先", From 43eccca86a4b25deb132bda72ac4d846332f3e6d Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:24:43 +0000 Subject: [PATCH 107/134] chore: version v2.1.0 --- cli/package.json | 2 +- docs/static/archived-versions.json | 4 ++++ e2e/package.json | 2 +- machine-learning/pyproject.toml | 2 +- mobile/android/fastlane/Fastfile | 4 ++-- mobile/ios/fastlane/Fastfile | 2 +- mobile/openapi/README.md | 2 +- mobile/pubspec.yaml | 2 +- open-api/immich-openapi-specs.json | 2 +- open-api/typescript-sdk/package.json | 2 +- open-api/typescript-sdk/src/fetch-client.ts | 2 +- server/package.json | 2 +- web/package.json | 2 +- 13 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cli/package.json b/cli/package.json index 3fff0c1031..f0b5bd5cd1 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@immich/cli", - "version": "2.2.96", + "version": "2.2.97", "description": "Command Line Interface (CLI) for Immich", "type": "module", "exports": "./dist/index.js", diff --git a/docs/static/archived-versions.json b/docs/static/archived-versions.json index 46dec8c35e..58f3d67cd2 100644 --- a/docs/static/archived-versions.json +++ b/docs/static/archived-versions.json @@ -1,4 +1,8 @@ [ + { + "label": "v2.1.0", + "url": "https://docs.v2.1.0.archive.immich.app" + }, { "label": "v2.0.1", "url": "https://docs.v2.0.1.archive.immich.app" diff --git a/e2e/package.json b/e2e/package.json index e783eded9e..67aeb00c1b 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "immich-e2e", - "version": "2.0.1", + "version": "2.1.0", "description": "", "main": "index.js", "type": "module", diff --git a/machine-learning/pyproject.toml b/machine-learning/pyproject.toml index 9eb4f7c0f6..683d8578a3 100644 --- a/machine-learning/pyproject.toml +++ b/machine-learning/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "immich-ml" -version = "2.0.1" +version = "2.1.0" description = "" authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }] requires-python = ">=3.10,<4.0" diff --git a/mobile/android/fastlane/Fastfile b/mobile/android/fastlane/Fastfile index cbc2440fa9..4c1df0d700 100644 --- a/mobile/android/fastlane/Fastfile +++ b/mobile/android/fastlane/Fastfile @@ -35,8 +35,8 @@ platform :android do task: 'bundle', build_type: 'Release', properties: { - "android.injected.version.code" => 3021, - "android.injected.version.name" => "2.0.1", + "android.injected.version.code" => 3022, + "android.injected.version.name" => "2.1.0", } ) upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') diff --git a/mobile/ios/fastlane/Fastfile b/mobile/ios/fastlane/Fastfile index f72597fe33..57c853e751 100644 --- a/mobile/ios/fastlane/Fastfile +++ b/mobile/ios/fastlane/Fastfile @@ -22,7 +22,7 @@ platform :ios do path: "./Runner.xcodeproj", ) increment_version_number( - version_number: "2.0.1" + version_number: "2.1.0" ) increment_build_number( build_number: latest_testflight_build_number + 1, diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 4a7d516a9d..4933c2c2b5 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -3,7 +3,7 @@ Immich API This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 2.0.1 +- API version: 2.1.0 - Generator version: 7.8.0 - Build package: org.openapitools.codegen.languages.DartClientCodegen diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 7dc34807b1..82ce321954 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -2,7 +2,7 @@ name: immich_mobile description: Immich - selfhosted backup media file on mobile phone publish_to: 'none' -version: 2.0.1+3021 +version: 2.1.0+3022 environment: sdk: '>=3.8.0 <4.0.0' diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 5eada143a6..2c045a73f0 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -9858,7 +9858,7 @@ "info": { "title": "Immich", "description": "Immich API", - "version": "2.0.1", + "version": "2.1.0", "contact": {} }, "tags": [], diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 05f0b320e0..5be13572e2 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@immich/sdk", - "version": "2.0.1", + "version": "2.1.0", "description": "Auto-generated TypeScript SDK for the Immich API", "type": "module", "main": "./build/index.js", diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 4d3d0cd21d..38a57e4b5d 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1,6 +1,6 @@ /** * Immich - * 2.0.1 + * 2.1.0 * DO NOT MODIFY - This file has been generated using oazapfts. * See https://www.npmjs.com/package/oazapfts */ diff --git a/server/package.json b/server/package.json index b1ba8cfdcb..080452c615 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "immich", - "version": "2.0.1", + "version": "2.1.0", "description": "", "author": "", "private": true, diff --git a/web/package.json b/web/package.json index d44eb768df..45cbdcc451 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "immich-web", - "version": "2.0.1", + "version": "2.1.0", "license": "GNU Affero General Public License version 3", "type": "module", "scripts": { From 1b62c2ef55f2ee153a34ac285bfc13fb91cb13f4 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:51:31 -0400 Subject: [PATCH 108/134] feat(ml): coreml (#17718) * coreml * add test * use arena by default in native installation * fix tests * add env to docs * remove availability envs --- docs/docs/install/environment-variables.md | 1 + machine-learning/Dockerfile | 12 +++++--- machine-learning/immich_ml/config.py | 1 + .../immich_ml/models/constants.py | 1 + machine-learning/immich_ml/sessions/ort.py | 10 ++++++- machine-learning/test_main.py | 28 ++++++++++++++++++- 6 files changed, 47 insertions(+), 6 deletions(-) diff --git a/docs/docs/install/environment-variables.md b/docs/docs/install/environment-variables.md index e606d03dee..78a5289bf4 100644 --- a/docs/docs/install/environment-variables.md +++ b/docs/docs/install/environment-variables.md @@ -171,6 +171,7 @@ Redis (Sentinel) URL example JSON before encoding: | `MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION` | Set the maximum number of faces that will be processed at once by the facial recognition model | None (`1` if using OpenVINO) | machine learning | | `MACHINE_LEARNING_RKNN` | Enable RKNN hardware acceleration if supported | `True` | machine learning | | `MACHINE_LEARNING_RKNN_THREADS` | How many threads of RKNN runtime should be spinned up while inferencing. | `1` | machine learning | +| `MACHINE_LEARNING_MODEL_ARENA` | Pre-allocates CPU memory to avoid memory fragmentation | true | machine learning | \*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones. diff --git a/machine-learning/Dockerfile b/machine-learning/Dockerfile index e4ed643375..f913fd3c78 100644 --- a/machine-learning/Dockerfile +++ b/machine-learning/Dockerfile @@ -70,7 +70,8 @@ RUN if [ "$DEVICE" = "rocm" ]; then \ FROM python:3.11-slim-bookworm@sha256:873f91540d53b36327ed4fb018c9669107a4e2a676719720edb4209c4b15d029 AS prod-cpu -ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 +ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 \ + MACHINE_LEARNING_MODEL_ARENA=false FROM python:3.11-slim-bookworm@sha256:873f91540d53b36327ed4fb018c9669107a4e2a676719720edb4209c4b15d029 AS prod-openvino @@ -88,7 +89,8 @@ RUN apt-get update && \ FROM nvidia/cuda:12.2.2-runtime-ubuntu22.04@sha256:94c1577b2cd9dd6c0312dc04dff9cb2fdce2b268018abc3d7c2dbcacf1155000 AS prod-cuda -ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 +ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 \ + MACHINE_LEARNING_MODEL_ARENA=false RUN apt-get update && \ apt-get install --no-install-recommends -yqq libcudnn9-cuda-12 && \ @@ -104,7 +106,8 @@ FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091 FROM prod-cpu AS prod-armnn ENV LD_LIBRARY_PATH=/opt/armnn \ - LD_PRELOAD=/usr/lib/libmimalloc.so.2 + LD_PRELOAD=/usr/lib/libmimalloc.so.2 \ + MACHINE_LEARNING_MODEL_ARENA=false RUN apt-get update && apt-get install -y --no-install-recommends ocl-icd-libopencl1 mesa-opencl-icd libgomp1 && \ rm -rf /var/lib/apt/lists/* && \ @@ -127,7 +130,8 @@ FROM prod-cpu AS prod-rknn # renovate: datasource=github-tags depName=airockchip/rknn-toolkit2 ARG RKNN_TOOLKIT_VERSION="v2.3.0" -ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 +ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2 \ + MACHINE_LEARNING_MODEL_ARENA=false ADD --checksum=sha256:73993ed4b440460825f21611731564503cc1d5a0c123746477da6cd574f34885 "https://github.com/airockchip/rknn-toolkit2/raw/refs/tags/${RKNN_TOOLKIT_VERSION}/rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so" /usr/lib/ diff --git a/machine-learning/immich_ml/config.py b/machine-learning/immich_ml/config.py index 939afbc98b..d9edd88a8c 100644 --- a/machine-learning/immich_ml/config.py +++ b/machine-learning/immich_ml/config.py @@ -61,6 +61,7 @@ class Settings(BaseSettings): request_threads: int = os.cpu_count() or 4 model_inter_op_threads: int = 0 model_intra_op_threads: int = 0 + model_arena: bool = True ann: bool = True ann_fp16_turbo: bool = False ann_tuning_level: int = 2 diff --git a/machine-learning/immich_ml/models/constants.py b/machine-learning/immich_ml/models/constants.py index 41b0990f71..b15b75b7d1 100644 --- a/machine-learning/immich_ml/models/constants.py +++ b/machine-learning/immich_ml/models/constants.py @@ -79,6 +79,7 @@ SUPPORTED_PROVIDERS = [ "CUDAExecutionProvider", "ROCMExecutionProvider", "OpenVINOExecutionProvider", + "CoreMLExecutionProvider", "CPUExecutionProvider", ] diff --git a/machine-learning/immich_ml/sessions/ort.py b/machine-learning/immich_ml/sessions/ort.py index e7d8635876..d18aae751a 100644 --- a/machine-learning/immich_ml/sessions/ort.py +++ b/machine-learning/immich_ml/sessions/ort.py @@ -96,6 +96,14 @@ class OrtSession: "precision": "FP32", "cache_dir": (self.model_path.parent / "openvino").as_posix(), } + case "CoreMLExecutionProvider": + options = { + "ModelFormat": "MLProgram", + "MLComputeUnits": "ALL", + "SpecializationStrategy": "FastPrediction", + "AllowLowPrecisionAccumulationOnGPU": "1", + "ModelCacheDirectory": (self.model_path.parent / "coreml").as_posix(), + } case _: options = {} provider_options.append(options) @@ -115,7 +123,7 @@ class OrtSession: @property def _sess_options_default(self) -> ort.SessionOptions: sess_options = ort.SessionOptions() - sess_options.enable_cpu_mem_arena = False + sess_options.enable_cpu_mem_arena = settings.model_arena # avoid thread contention between models if settings.model_inter_op_threads > 0: diff --git a/machine-learning/test_main.py b/machine-learning/test_main.py index eeafd01062..582a05a950 100644 --- a/machine-learning/test_main.py +++ b/machine-learning/test_main.py @@ -180,6 +180,7 @@ class TestOrtSession: CUDA_EP_OUT_OF_ORDER = ["CPUExecutionProvider", "CUDAExecutionProvider"] TRT_EP = ["TensorrtExecutionProvider", "CUDAExecutionProvider", "CPUExecutionProvider"] ROCM_EP = ["ROCMExecutionProvider", "CPUExecutionProvider"] + COREML_EP = ["CoreMLExecutionProvider", "CPUExecutionProvider"] @pytest.mark.providers(CPU_EP) def test_sets_cpu_provider(self, providers: list[str]) -> None: @@ -225,6 +226,12 @@ class TestOrtSession: assert session.providers == self.ROCM_EP + @pytest.mark.providers(COREML_EP) + def test_uses_coreml(self, providers: list[str]) -> None: + session = OrtSession("ViT-B-32__openai") + + assert session.providers == self.COREML_EP + def test_sets_provider_kwarg(self) -> None: providers = ["CUDAExecutionProvider"] session = OrtSession("ViT-B-32__openai", providers=providers) @@ -284,7 +291,6 @@ class TestOrtSession: assert session.sess_options.execution_mode == ort.ExecutionMode.ORT_SEQUENTIAL assert session.sess_options.inter_op_num_threads == 1 assert session.sess_options.intra_op_num_threads == 2 - assert session.sess_options.enable_cpu_mem_arena is False def test_sets_default_sess_options_does_not_set_threads_if_non_cpu_and_default_threads(self) -> None: session = OrtSession("ViT-B-32__openai", providers=["CUDAExecutionProvider", "CPUExecutionProvider"]) @@ -302,6 +308,26 @@ class TestOrtSession: assert session.sess_options.inter_op_num_threads == 2 assert session.sess_options.intra_op_num_threads == 4 + def test_uses_arena_if_enabled(self, mocker: MockerFixture) -> None: + mock_settings = mocker.patch("immich_ml.sessions.ort.settings", autospec=True) + mock_settings.model_inter_op_threads = 0 + mock_settings.model_intra_op_threads = 0 + mock_settings.model_arena = True + + session = OrtSession("ViT-B-32__openai", providers=["CPUExecutionProvider"]) + + assert session.sess_options.enable_cpu_mem_arena + + def test_does_not_use_arena_if_disabled(self, mocker: MockerFixture) -> None: + mock_settings = mocker.patch("immich_ml.sessions.ort.settings", autospec=True) + mock_settings.model_inter_op_threads = 0 + mock_settings.model_intra_op_threads = 0 + mock_settings.model_arena = False + + session = OrtSession("ViT-B-32__openai", providers=["CPUExecutionProvider"]) + + assert not session.sess_options.enable_cpu_mem_arena + def test_sets_sess_options_kwarg(self) -> None: sess_options = ort.SessionOptions() session = OrtSession( From 02beb85642986d715534ca51c87d7878f5c2515e Mon Sep 17 00:00:00 2001 From: Chaoscontrol Date: Tue, 14 Oct 2025 22:34:20 +0100 Subject: [PATCH 109/134] feat(album): show per-user contributions in shared albums (#21740) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: show per-user contribution counts on shared albums Add API support and UI display for per-user asset contribution counts on shared albums: - server: add ContributorCountResponseDto and repository method to aggregate counts per user (excluding deleted assets), expose via album response only when shared and counts > 0 - web: display contributor counts in Album Users modal next to each member’s role This helps users understand participation levels in shared albums. * Add ContributorCountResponseDto and expose contributorCounts on AlbumResponseDto in OpenAPI spec. Regenerate TypeScript SDK and mobile OpenAPI clients to include new types. No breaking changes; fields are additive. * fix: shrink age view to fit and not overflow (#22405) Co-authored-by: Alex * chore: post release tasks (#22587) * chore: clean auth-user entity on reset (#22583) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> * fix: mitigate database lock scenario when running full sync in splash screen page (#22608) * fix: improve sync backup error indicator (#22527) * fix: improve sync indicator error * prefer backup disabled icon before error --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * fix: bottom navigation bar overlay sheet info (#22610) * fix: respect storage indicator setting (#22596) * fix: respect storage indicator size setting * remove black bar on the bottom of the setting scaffold page --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * fix: do not run multiple engines on cold startup (#22518) fix: do not run multiple engines on app startup Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * fix: album selector in favorite view (#22612) * chore(web): update translations (#22486) Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/az/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/kn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ml/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/ Translation: Immich/immich Co-authored-by: Arthur Bols Co-authored-by: Ben Kim Co-authored-by: César Gómez Co-authored-by: DR Co-authored-by: DevServs Co-authored-by: Emil Friis Osmann Co-authored-by: Fjuro Co-authored-by: Godwin T Co-authored-by: Hristo T Co-authored-by: Hurricane-32 Co-authored-by: Jozef Gaal Co-authored-by: KecskeTech Co-authored-by: Kiril Panayotov Co-authored-by: Liviu Roman Co-authored-by: Lorenzo Co-authored-by: Marcelo Popper Costa Co-authored-by: Matjaž T Co-authored-by: Miryusif Rahimov Co-authored-by: Msaood Co-authored-by: Mārtiņš Bruņenieks Co-authored-by: Pedro Vendeira Co-authored-by: PontusÖsterlindh Co-authored-by: Rahees Co-authored-by: Sandeep R Co-authored-by: Sylvain Pichon Co-authored-by: TV Box Co-authored-by: Tino Altmann Co-authored-by: User 123456789 Co-authored-by: Vegard Fladby Co-authored-by: anton garcias Co-authored-by: chamdim Co-authored-by: longlarry Co-authored-by: pyccl Co-authored-by: swever Co-authored-by: தமிழ்நேரம் Co-authored-by: 안세훈 * chore: version v2.0.1 * fix(docs): link to immich docs does not lead correctly to docs (#22687) * fix(server): fix chunking Postgres query parameters (#22684) * feat(server): improve checkAlbumAccess query performance (#22467) * Fix slow SQL query in checkAlbumAccess caused by the array overlap operator && * Update access.repository.sql * Rewrite the query to pass assetIds once as a single array parameter * chore: mark VSCode tasks as background tasks (#22631) VSCode expect tasks that aren't marked as background tasks to finish eventually. That's not how a dev-server is supposed to work, we expect it to run for basically infinite time. By marking those tasks as background tasks, VSCode stops showing the infinite loading spinner on those processes. * fix(ml): Resolve IPv6 startup crash and healthcheck failure (#22387) * fix(ml): Resolve IPv6 startup crash and healthcheck failure Fixes #13782 * fix(ml): updated the fix to use the std lib * Apply code formatting to __main__.py * fix(server): override reserved color metadata for video thumbnails (#22348) override reserved metadata * fix(mobile): trash description cut off (#22662) * fix(mobile): empty album description does not save (#22649) * fix(mobile): video player using ref after disposal (#21843) check if disposed * docs: add job order diagram (#22673) * docs: add job order diagram * wording --------- Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com> * fix: missing responsive calculation in UserPageLayout (#22455) * fix: use full-size image for non-web-compatible panoramas (#20359) * fix(web): use full-size image for non-web-compatible panoramas * always generate full-size image for panoramas * add unit test * fix formatting --------- Co-authored-by: gergo= * chore: update cli docs to pnpm (#22702) update cli docs to pnpm * chore(web): upgrade ESLint and plugins (#22495) * chore(web): upgrade ESLint and plugins, simplify linting configuration - Update eslint from ^9.18.0 to ^9.36.0 - Update eslint plugins: - eslint-plugin-svelte: ^3.9.0 → ^3.12.4 - eslint-plugin-unicorn: ^60.0.0 → ^61.0.2 - svelte-eslint-parser: ^1.2.0 → ^1.3.3 - typescript-eslint: ^8.28.0 → ^8.45.0 - Remove eslint-p dependency in favor of native eslint concurrency - Add unicorn/no-array-sort rule exception - Update linting scripts to use eslint's native --concurrency flag - Update Makefile and mise.toml to reflect simplified lint commands - Update GitHub Actions workflow to use standard pnpm lint command * pnpm dedupe --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * fix(web): do not notify on patch releases (#22591) * chore: post release tasks (#22616) * fix: hide view in timeline button on local timeline (#22713) * chore(server): support vectorchord 0.5.x (#21602) Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * fix: Fix issue fail to download iOS live photos (#22708) Co-authored-by: bwees * fix(docs): Remove immich_remove_offline_files as no longer functional (#21774) Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> Co-authored-by: Brandon Wees * fix(mobile): closing editor goes back to main page (#22647) Co-authored-by: bwees * docs: update TrueNAS migration instructions (#22463) Co-authored-by: bo0tzz Co-authored-by: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> * docs: update Synology install guide (#21996) Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com> * fix: improve the selected sidebar item text color in dark mode (#22640) * chore(deps): update redis:6.2-alpine docker digest to 2185e74 (#22718) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: update devcontainers for trixie, devenv changes (#22194) * fix(deps): update dependency device_info_plus to v12 (#22724) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency flutter to v3.35.5 (#22720) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update github-actions (#22721) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: --no-git-checks on pnpm publish (#22715) * fix: --no-git-checks on sdk publish * fix: --no-git-checks on cli publish * refactor(web): Clarify property names in Timeline and Scrubber (#22265) refactor(web): Clarify property names in Timeline and Scrubber Renamed properties across Timeline/Scrubber components for clarity: - scrubOverallPercent → timelineScrollPercent - scrubberMonthPercent → viewportTopMonthScrollPercent - scrubberMonth → viewportTopMonth - leadout → isInLeadOutSection Additional changes: - Updated ScrubberListener signature to accept object parameter - Added detailed JSDoc comments for all Scrubber props - Fixed callback invocations to use new object syntax - Aligned Timeline's local state variables with Scrubber prop names * fix: promote to foreground service before starting engine (#22517) fix: show notification from native Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * refactor(web): extract timeline keyboard actions into separate component (#22266) refactor(web): extract timeline keyboard actions into separate component Extracts keyboard shortcuts and related functionality from Timeline component into a dedicated TimelineKeyboardActions component for better separation of concerns and maintainability. * feat: make skeleton title optional (#22396) feat: skeleton title is optional feat: skeleton title optional * refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component (#22268) refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component - Extracted asset viewer navigation and action handling logic from Timeline.svelte into a dedicated TimelineAssetViewer component - Reduces Timeline.svelte complexity by ~150 lines and improves separation of concerns - No functional changes - purely a refactoring to improve code organization ## Changes - Created new TimelineAssetViewer.svelte component containing all asset viewer-related logic - Moved handlePrevious, handleNext, handleRandom, handleClose, handlePreAction, and handleAction methods - Timeline.svelte now only passes required props to the new component - Maintained all existing functionality including navigation, asset actions, and stack management * chore: track full actions/cache version in comment (#22359) * fix(ml): ipv6 check (#22735) * chore(deps): cache pnpm dependencies in prod build (#22555) * cache pnpm dependencies use different ids to be safe unnecessary lines * use buildcache folder * chore: use isar immich fork (#22738) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> * fix: bottom sheet blank with local assets that have remote counterparts (#22743) * chore(deps): update dependency @types/node to ^22.18.8 (#22719) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency nodemailer to v7.0.7 [security] (#22740) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency connectivity_plus to v7 (#22723) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Alex * chore: use hosted isar flutter libs (#22757) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> * fix: skip local only assets in move to lock action (#22728) * fix:prefer trashing to deletions * skip local only assets in move to lock action --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * fix: brief flashing when swiping from video (#22187) * fix(web): Uniform random distribution during shuffle (#19902) feat: better random distribution * fix: persist search page scroll offset between rebuilds (#22733) fix: persist search scroll between rebuilds Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * docs: add some external library notes (#22776) * feat(web): seconds and milliseconds in timestamps (#20337) * fix(web): seconds in timestamps * changed date-input step to provide millisecond precision * feat(cli): add debug development config (#22712) * add debug and change ts-node with tsx * update pr changes * update pnpm-lock * remove ts-node from readme * typo * resolve conflicts * remove tsx * launch from dist * add preLaunchTask * update readme * undo main in package.json * remove typo * Apply suggestion from @bwees Co-authored-by: Brandon Wees * revert pnpm-lock changes * @jrasm91 suggestions * chore: run node with source maps --------- Co-authored-by: Jason Rasmussen Co-authored-by: Brandon Wees * docs: add Immich-Stack to community-projects (#21563) docs: add Immich Stack community project Co-authored-by: Jason Rasmussen * feat(web): Add upload to stack action (#19842) * feat(web): Add upload to stack action * Event handling and translation * Update asset viewer instead * lint, improve upload return type * Add suggestions from code review * Resolve merge conflicts * Apply suggestions from code review * feat(server): add `immich.users.total` metric (#21780) * Add immich.users.total metric * Fix tests & one lint error * Lint * Fix SQL Schema checks * Fix nit * Use workers argument in OnEvent hook and remove condition from method body * feat(docs): add zh_TW Traditional Chinese version README (#22703) docs: add zh_TW Traditional Chinese version README * chore: ignore renovate major updates for postgres image (#22764) * fix: remove postgres exclude datasource match (#22811) * chore(deps): update github-actions (major) (#22810) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: revert terragrunt-action bump (#22812) * chore: don't enforce runes (#22813) * chore(deps): update base-image to v202510092146 (major) (#22818) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update typescript-projects (#22809) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Dietzler * fix: only cast to device if the asset is a RemoteAsset (#22805) * feat: (perf) remove scroll compensation (#22837) * fix(deps): update dependency happy-dom to v20 [security] (#22846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update github-actions (#22793) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: various typos (#22867) Found via `codespell -q 3 -S "*.svg,./i18n,./docs/package-lock.json,./readme_i18n,./mobile/assets/i18n" -L afterall,devlop,finaly,inout,nd,optin,renderd,sade` * fix: ios skip posting hash response after detached from engine (#22695) * skip posting message after detached from engine * review changes * cancel plugin before destroying engine --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.3.0 docker digest to 6f3e9d2 (#22912) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to bcf6335 (#22913) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: re-add scroll compensation (efficiently) (#22848) * fix: re-add scroll compensation (efficient) * Rename showSkeleton to invisible. Adjust skeleton margins, invisible support. * Fix faulty logic, simplify * Calculate ratios and determine compensation strategy: height comp for above/partiality visible, month-scroll comp within a fully visible month. --------- Co-authored-by: Alex * fix: shared album control permissions (#22435) * fix: shared album control permissions * fix: properly display "add photos" * fix: dont allow modification of album order * fix: album title/description edit from app bar * chore: code review changes * chore: format translations * chore: lintings * fix: show dialog before delete local action (#22280) * fix: show dialog on delete local action # Conflicts: # mobile/lib/repositories/asset_media.repository.dart * button style --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex * fix(deps): update dependency kysely-postgres-js to v3 (#22924) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update redis:6.2-alpine docker digest to 77697a7 (#22915) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update typescript-projects (#22918) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Dietzler * feat: local album events notification (#22817) * feat: local album events notification * pr feedback * show number of unread notification * chore: refactor show view in timeline button (#22894) * chore: refactor show view in timeline button This refactor includes changes to notify asset viewer about where an asset was shown from. * chore: realized I could just pull from the timelineProvider instead of storing it in the asset viewer state * chore: rename enum to TimelineOrigin and update members * fix: update isOwner condition --------- Co-authored-by: Alex * chore(web): update translations (#22623) Translate-URL: https://hosted.weblate.org/projects/immich/immich/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/bn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/et/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/gl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hi/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ka/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/mr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pa/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/ Translation: Immich/immich Co-authored-by: Abhijeet Bonde Co-authored-by: Adam Uchmanowicz Co-authored-by: Adrian Hermida Co-authored-by: Aleksa Milošević Co-authored-by: Amin Co-authored-by: AndreiP28 Co-authored-by: António Santos Co-authored-by: Asger Mogensen Co-authored-by: Christoph Auer Co-authored-by: Denis Pacquier Co-authored-by: DevServs Co-authored-by: Eetu Mäenpää Co-authored-by: Felipe Garcia Co-authored-by: Filip Joković Co-authored-by: Hurricane-32 Co-authored-by: Indrek Haav Co-authored-by: Jason Song Co-authored-by: Javier Villanueva García Co-authored-by: Jordy H Co-authored-by: Jorge Montejo Co-authored-by: Jozef Gaal Co-authored-by: Konstantinos D Co-authored-by: Leo Bottaro Co-authored-by: Linerly Co-authored-by: Liviu Roman Co-authored-by: Lorenz Baum Co-authored-by: Lukas Konsin Co-authored-by: Mandeep Co-authored-by: Marc Casillas Co-authored-by: Marcelo Popper Costa Co-authored-by: MatijaThe245th Co-authored-by: Matjaž T Co-authored-by: Mees Frensel Co-authored-by: Mirko Co-authored-by: Mārtiņš Bruņenieks Co-authored-by: Oleksandr Yurov Co-authored-by: Orkun Sürel Co-authored-by: Peter Dave Hello Co-authored-by: Philipp Burndorfer Co-authored-by: Prasanth Baskar Co-authored-by: Roman Zhukov Co-authored-by: Sayan Goswami Co-authored-by: Sergey Katsubo Co-authored-by: Simon Bierwald Co-authored-by: Sylvain Pichon Co-authored-by: TV Box Co-authored-by: Taiki M Co-authored-by: Theodore Zhvania Co-authored-by: Tim De Meyer Co-authored-by: User 123456789 Co-authored-by: Valentino Harpa Co-authored-by: Vegard Fladby Co-authored-by: Willem Schipper Co-authored-by: Yago Raña Gayoso Co-authored-by: Zurab Sajaia Co-authored-by: albanobattistella Co-authored-by: bittin1ddc447d824349b2 Co-authored-by: dark&white Co-authored-by: eav5jhl0 Co-authored-by: findussoft Co-authored-by: kiwinho Co-authored-by: millallo Co-authored-by: pyccl Co-authored-by: rokon001 Co-authored-by: vaibhav kumar Co-authored-by: waclaw66 Co-authored-by: Максим Горпиніч Co-authored-by: தமிழ்நேரம் * chore: version v2.1.0 * refactor * question marks are the enemy * refactor count map * update readme * e2e * count of 0 is impossible * useless async --------- Co-authored-by: Chaoscontrol <6642238+Chaoscontrol@users.noreply.github.com> Co-authored-by: Brandon Wees Co-authored-by: Alex Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Weblate (bot) Co-authored-by: Arthur Bols Co-authored-by: Ben Kim Co-authored-by: César Gómez Co-authored-by: DR Co-authored-by: DevServs Co-authored-by: Emil Friis Osmann Co-authored-by: Fjuro Co-authored-by: Godwin T Co-authored-by: Hristo T Co-authored-by: Hurricane-32 Co-authored-by: Jozef Gaal Co-authored-by: KecskeTech Co-authored-by: Kiril Panayotov Co-authored-by: Liviu Roman Co-authored-by: Lorenzo Co-authored-by: Marcelo Popper Costa Co-authored-by: Matjaž T Co-authored-by: Miryusif Rahimov Co-authored-by: Msaood Co-authored-by: Mārtiņš Bruņenieks Co-authored-by: Pedro Vendeira Co-authored-by: PontusÖsterlindh Co-authored-by: Rahees Co-authored-by: Sandeep R Co-authored-by: Sylvain Pichon Co-authored-by: TV Box Co-authored-by: Tino Altmann Co-authored-by: User 123456789 Co-authored-by: Vegard Fladby Co-authored-by: anton garcias Co-authored-by: chamdim Co-authored-by: longlarry Co-authored-by: pyccl Co-authored-by: swever Co-authored-by: தமிழ்நேரம் Co-authored-by: 안세훈 Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Xavier Dupuis Co-authored-by: Sergey Katsubo Co-authored-by: Adrian Jost <22987140+adrianjost@users.noreply.github.com> Co-authored-by: Cokodayo <78474654+CaptainJack2491@users.noreply.github.com> Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> Co-authored-by: Yaros Co-authored-by: USBAkimbo <71508071+USBAkimbo@users.noreply.github.com> Co-authored-by: Min Idzelis Co-authored-by: grgergo Co-authored-by: gergo= Co-authored-by: Jorge Montejo Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Jason Rasmussen Co-authored-by: Diogo Correia Co-authored-by: CuberL Co-authored-by: Xantin <56741168+Xiticks@users.noreply.github.com> Co-authored-by: bo0tzz Co-authored-by: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Co-authored-by: TDR001 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Saschl <19493808+Saschl@users.noreply.github.com> Co-authored-by: Pascal Sommer Co-authored-by: kaziu687 Co-authored-by: Qhilm <3350433+Qhilm@users.noreply.github.com> Co-authored-by: Sebastian Schneider Co-authored-by: Tushar Harsora Co-authored-by: Peter Dave Hello Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Co-authored-by: Daniel Dietzler Co-authored-by: luzpaz Co-authored-by: Abhijeet Bonde Co-authored-by: Adam Uchmanowicz Co-authored-by: Adrian Hermida Co-authored-by: Aleksa Milošević Co-authored-by: Amin Co-authored-by: AndreiP28 Co-authored-by: António Santos Co-authored-by: Asger Mogensen Co-authored-by: Christoph Auer Co-authored-by: Denis Pacquier Co-authored-by: Eetu Mäenpää Co-authored-by: Felipe Garcia Co-authored-by: Filip Joković Co-authored-by: Indrek Haav Co-authored-by: Jason Song Co-authored-by: Javier Villanueva García Co-authored-by: Jordy H Co-authored-by: Konstantinos D Co-authored-by: Leo Bottaro Co-authored-by: Linerly Co-authored-by: Lorenz Baum Co-authored-by: Lukas Konsin Co-authored-by: Mandeep Co-authored-by: Marc Casillas Co-authored-by: MatijaThe245th Co-authored-by: Mees Frensel Co-authored-by: Mirko Co-authored-by: Oleksandr Yurov Co-authored-by: Orkun Sürel Co-authored-by: Philipp Burndorfer Co-authored-by: Prasanth Baskar Co-authored-by: Roman Zhukov Co-authored-by: Sayan Goswami Co-authored-by: Simon Bierwald Co-authored-by: Taiki M Co-authored-by: Theodore Zhvania Co-authored-by: Tim De Meyer Co-authored-by: Valentino Harpa Co-authored-by: Willem Schipper Co-authored-by: Yago Raña Gayoso Co-authored-by: Zurab Sajaia Co-authored-by: albanobattistella Co-authored-by: bittin1ddc447d824349b2 Co-authored-by: dark&white Co-authored-by: eav5jhl0 Co-authored-by: findussoft Co-authored-by: kiwinho Co-authored-by: millallo Co-authored-by: rokon001 Co-authored-by: vaibhav kumar Co-authored-by: waclaw66 Co-authored-by: Максим Горпиніч --- e2e/src/api/specs/album.e2e-spec.ts | 5 + mobile/openapi/README.md | 1 + mobile/openapi/lib/api.dart | 1 + mobile/openapi/lib/api_client.dart | 2 + .../openapi/lib/model/album_response_dto.dart | 9 +- .../model/contributor_count_response_dto.dart | 107 ++++++++++++++++++ open-api/immich-openapi-specs.json | 21 ++++ open-api/typescript-sdk/src/fetch-client.ts | 5 + server/src/dtos/album.dto.ts | 13 +++ server/src/queries/album.repository.sql | 15 +++ server/src/repositories/album.repository.ts | 18 +++ server/src/services/album.service.ts | 5 + web/src/lib/modals/AlbumUsersModal.svelte | 12 ++ 13 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 mobile/openapi/lib/model/contributor_count_response_dto.dart diff --git a/e2e/src/api/specs/album.e2e-spec.ts b/e2e/src/api/specs/album.e2e-spec.ts index 5615a312f2..c4f06edd93 100644 --- a/e2e/src/api/specs/album.e2e-spec.ts +++ b/e2e/src/api/specs/album.e2e-spec.ts @@ -136,6 +136,7 @@ describe('/albums', () => { expect(body).toEqual({ ...user1Albums[0], assets: [expect.objectContaining({ isFavorite: false })], + contributorCounts: [{ userId: user1.userId, assetCount: 1 }], lastModifiedAssetTimestamp: expect.any(String), startDate: expect.any(String), endDate: expect.any(String), @@ -310,6 +311,7 @@ describe('/albums', () => { expect(body).toEqual({ ...user1Albums[0], assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })], + contributorCounts: [{ userId: user1.userId, assetCount: 1 }], lastModifiedAssetTimestamp: expect.any(String), startDate: expect.any(String), endDate: expect.any(String), @@ -345,6 +347,7 @@ describe('/albums', () => { expect(body).toEqual({ ...user1Albums[0], assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })], + contributorCounts: [{ userId: user1.userId, assetCount: 1 }], lastModifiedAssetTimestamp: expect.any(String), startDate: expect.any(String), endDate: expect.any(String), @@ -362,6 +365,7 @@ describe('/albums', () => { expect(body).toEqual({ ...user1Albums[0], assets: [], + contributorCounts: [{ userId: user1.userId, assetCount: 1 }], assetCount: 1, lastModifiedAssetTimestamp: expect.any(String), endDate: expect.any(String), @@ -382,6 +386,7 @@ describe('/albums', () => { expect(body).toEqual({ ...user2Albums[0], assets: [], + contributorCounts: [{ userId: user1.userId, assetCount: 1 }], assetCount: 1, lastModifiedAssetTimestamp: expect.any(String), endDate: expect.any(String), diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 4933c2c2b5..698b9774da 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -359,6 +359,7 @@ Class | Method | HTTP request | Description - [CheckExistingAssetsDto](doc//CheckExistingAssetsDto.md) - [CheckExistingAssetsResponseDto](doc//CheckExistingAssetsResponseDto.md) - [Colorspace](doc//Colorspace.md) + - [ContributorCountResponseDto](doc//ContributorCountResponseDto.md) - [CreateAlbumDto](doc//CreateAlbumDto.md) - [CreateLibraryDto](doc//CreateLibraryDto.md) - [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index df2c2226b1..a3117ede86 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -130,6 +130,7 @@ part 'model/change_password_dto.dart'; part 'model/check_existing_assets_dto.dart'; part 'model/check_existing_assets_response_dto.dart'; part 'model/colorspace.dart'; +part 'model/contributor_count_response_dto.dart'; part 'model/create_album_dto.dart'; part 'model/create_library_dto.dart'; part 'model/create_profile_image_response_dto.dart'; diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 06d27593c9..33056cf14e 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -314,6 +314,8 @@ class ApiClient { return CheckExistingAssetsResponseDto.fromJson(value); case 'Colorspace': return ColorspaceTypeTransformer().decode(value); + case 'ContributorCountResponseDto': + return ContributorCountResponseDto.fromJson(value); case 'CreateAlbumDto': return CreateAlbumDto.fromJson(value); case 'CreateLibraryDto': diff --git a/mobile/openapi/lib/model/album_response_dto.dart b/mobile/openapi/lib/model/album_response_dto.dart index 547a6a70fd..2f53706e7a 100644 --- a/mobile/openapi/lib/model/album_response_dto.dart +++ b/mobile/openapi/lib/model/album_response_dto.dart @@ -18,6 +18,7 @@ class AlbumResponseDto { this.albumUsers = const [], required this.assetCount, this.assets = const [], + this.contributorCounts = const [], required this.createdAt, required this.description, this.endDate, @@ -43,6 +44,8 @@ class AlbumResponseDto { List assets; + List contributorCounts; + DateTime createdAt; String description; @@ -100,6 +103,7 @@ class AlbumResponseDto { _deepEquality.equals(other.albumUsers, albumUsers) && other.assetCount == assetCount && _deepEquality.equals(other.assets, assets) && + _deepEquality.equals(other.contributorCounts, contributorCounts) && other.createdAt == createdAt && other.description == description && other.endDate == endDate && @@ -122,6 +126,7 @@ class AlbumResponseDto { (albumUsers.hashCode) + (assetCount.hashCode) + (assets.hashCode) + + (contributorCounts.hashCode) + (createdAt.hashCode) + (description.hashCode) + (endDate == null ? 0 : endDate!.hashCode) + @@ -137,7 +142,7 @@ class AlbumResponseDto { (updatedAt.hashCode); @override - String toString() => 'AlbumResponseDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, assets=$assets, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, owner=$owner, ownerId=$ownerId, shared=$shared, startDate=$startDate, updatedAt=$updatedAt]'; + String toString() => 'AlbumResponseDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, assets=$assets, contributorCounts=$contributorCounts, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, owner=$owner, ownerId=$ownerId, shared=$shared, startDate=$startDate, updatedAt=$updatedAt]'; Map toJson() { final json = {}; @@ -150,6 +155,7 @@ class AlbumResponseDto { json[r'albumUsers'] = this.albumUsers; json[r'assetCount'] = this.assetCount; json[r'assets'] = this.assets; + json[r'contributorCounts'] = this.contributorCounts; json[r'createdAt'] = this.createdAt.toUtc().toIso8601String(); json[r'description'] = this.description; if (this.endDate != null) { @@ -196,6 +202,7 @@ class AlbumResponseDto { albumUsers: AlbumUserResponseDto.listFromJson(json[r'albumUsers']), assetCount: mapValueOfType(json, r'assetCount')!, assets: AssetResponseDto.listFromJson(json[r'assets']), + contributorCounts: ContributorCountResponseDto.listFromJson(json[r'contributorCounts']), createdAt: mapDateTime(json, r'createdAt', r'')!, description: mapValueOfType(json, r'description')!, endDate: mapDateTime(json, r'endDate', r''), diff --git a/mobile/openapi/lib/model/contributor_count_response_dto.dart b/mobile/openapi/lib/model/contributor_count_response_dto.dart new file mode 100644 index 0000000000..e0e16ee427 --- /dev/null +++ b/mobile/openapi/lib/model/contributor_count_response_dto.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class ContributorCountResponseDto { + /// Returns a new [ContributorCountResponseDto] instance. + ContributorCountResponseDto({ + required this.assetCount, + required this.userId, + }); + + int assetCount; + + String userId; + + @override + bool operator ==(Object other) => identical(this, other) || other is ContributorCountResponseDto && + other.assetCount == assetCount && + other.userId == userId; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (assetCount.hashCode) + + (userId.hashCode); + + @override + String toString() => 'ContributorCountResponseDto[assetCount=$assetCount, userId=$userId]'; + + Map toJson() { + final json = {}; + json[r'assetCount'] = this.assetCount; + json[r'userId'] = this.userId; + return json; + } + + /// Returns a new [ContributorCountResponseDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static ContributorCountResponseDto? fromJson(dynamic value) { + upgradeDto(value, "ContributorCountResponseDto"); + if (value is Map) { + final json = value.cast(); + + return ContributorCountResponseDto( + assetCount: mapValueOfType(json, r'assetCount')!, + userId: mapValueOfType(json, r'userId')!, + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = ContributorCountResponseDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = ContributorCountResponseDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of ContributorCountResponseDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = ContributorCountResponseDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'assetCount', + 'userId', + }; +} + diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 2c045a73f0..b9da330ee5 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -10096,6 +10096,12 @@ }, "type": "array" }, + "contributorCounts": { + "items": { + "$ref": "#/components/schemas/ContributorCountResponseDto" + }, + "type": "array" + }, "createdAt": { "format": "date-time", "type": "string" @@ -11471,6 +11477,21 @@ ], "type": "string" }, + "ContributorCountResponseDto": { + "properties": { + "assetCount": { + "type": "integer" + }, + "userId": { + "type": "string" + } + }, + "required": [ + "assetCount", + "userId" + ], + "type": "object" + }, "CreateAlbumDto": { "properties": { "albumName": { diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 38a57e4b5d..60d72fb32b 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -356,12 +356,17 @@ export type AssetResponseDto = { updatedAt: string; visibility: AssetVisibility; }; +export type ContributorCountResponseDto = { + assetCount: number; + userId: string; +}; export type AlbumResponseDto = { albumName: string; albumThumbnailAssetId: string | null; albumUsers: AlbumUserResponseDto[]; assetCount: number; assets: AssetResponseDto[]; + contributorCounts?: ContributorCountResponseDto[]; createdAt: string; description: string; endDate?: string; diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index 00f5759aac..2f3f22099a 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -128,6 +128,14 @@ export class AlbumUserResponseDto { role!: AlbumUserRole; } +export class ContributorCountResponseDto { + @ApiProperty() + userId!: string; + + @ApiProperty({ type: 'integer' }) + assetCount!: number; +} + export class AlbumResponseDto { id!: string; ownerId!: string; @@ -149,6 +157,11 @@ export class AlbumResponseDto { isActivityEnabled!: boolean; @ValidateEnum({ enum: AssetOrder, name: 'AssetOrder', optional: true }) order?: AssetOrder; + + // Optional per-user contribution counts for shared albums + @Type(() => ContributorCountResponseDto) + @ApiProperty({ type: [ContributorCountResponseDto], required: false }) + contributorCounts?: ContributorCountResponseDto[]; } export type MapAlbumDto = { diff --git a/server/src/queries/album.repository.sql b/server/src/queries/album.repository.sql index 36c44414db..0087217738 100644 --- a/server/src/queries/album.repository.sql +++ b/server/src/queries/album.repository.sql @@ -407,3 +407,18 @@ from where "album_asset"."albumsId" = $1 and "album_asset"."assetsId" in ($2) + +-- AlbumRepository.getContributorCounts +select + "asset"."ownerId" as "userId", + count(*) as "assetCount" +from + "album_asset" + inner join "asset" on "asset"."id" = "assetsId" +where + "asset"."deletedAt" is null + and "album_asset"."albumsId" = $1 +group by + "asset"."ownerId" +order by + "assetCount" desc diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index b023068f16..00c1dfda7f 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -379,4 +379,22 @@ export class AlbumRepository { ) .whereRef('album_asset.albumsId', '=', 'album.id'); } + + /** + * Get per-user asset contribution counts for a single album. + * Excludes deleted assets, orders by count desc. + */ + @GenerateSql({ params: [DummyValue.UUID] }) + getContributorCounts(id: string) { + return this.db + .selectFrom('album_asset') + .innerJoin('asset', 'asset.id', 'assetsId') + .where('asset.deletedAt', 'is', sql.lit(null)) + .where('album_asset.albumsId', '=', id) + .select('asset.ownerId as userId') + .select((eb) => eb.fn.countAll().as('assetCount')) + .groupBy('asset.ownerId') + .orderBy('assetCount', 'desc') + .execute(); + } } diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index d7b857d666..dd12e31892 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -79,12 +79,17 @@ export class AlbumService extends BaseService { const album = await this.findOrFail(id, { withAssets }); const [albumMetadataForIds] = await this.albumRepository.getMetadataForIds([album.id]); + const hasSharedUsers = album.albumUsers && album.albumUsers.length > 0; + const hasSharedLink = album.sharedLinks && album.sharedLinks.length > 0; + const isShared = hasSharedUsers || hasSharedLink; + return { ...mapAlbum(album, withAssets, auth), startDate: albumMetadataForIds?.startDate ?? undefined, endDate: albumMetadataForIds?.endDate ?? undefined, assetCount: albumMetadataForIds?.assetCount ?? 0, lastModifiedAssetTimestamp: albumMetadataForIds?.lastModifiedAssetTimestamp ?? undefined, + contributorCounts: isShared ? await this.albumRepository.getContributorCounts(album.id) : undefined, }; } diff --git a/web/src/lib/modals/AlbumUsersModal.svelte b/web/src/lib/modals/AlbumUsersModal.svelte index 3cc0f03d5e..7dd7442249 100644 --- a/web/src/lib/modals/AlbumUsersModal.svelte +++ b/web/src/lib/modals/AlbumUsersModal.svelte @@ -31,6 +31,14 @@ let isOwned = $derived(currentUser?.id == album.ownerId); + // Build a map of contributor counts by user id; avoid casts/derived + const contributorCounts: Record = {}; + if (album.contributorCounts) { + for (const { userId, assetCount } of album.contributorCounts) { + contributorCounts[userId] = assetCount; + } + } + onMount(async () => { try { currentUser = await getMyUser(); @@ -111,6 +119,10 @@ {:else} {$t('role_editor')} {/if} + {#if user.id in contributorCounts} + - + {$t('items_count', { values: { count: contributorCounts[user.id] } })} + {/if}
From 72f5ca4420b7db9156af9c5dfb6afbbba364b1d3 Mon Sep 17 00:00:00 2001 From: Mees Frensel <33722705+meesfrensel@users.noreply.github.com> Date: Wed, 15 Oct 2025 12:15:29 +0200 Subject: [PATCH 110/134] fix(web): prevent photo-only memories showing mute button (#22802) --- .../memory-page/memory-viewer.svelte | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/web/src/lib/components/memory-page/memory-viewer.svelte b/web/src/lib/components/memory-page/memory-viewer.svelte index 7f566c41a2..35cfdb04de 100644 --- a/web/src/lib/components/memory-page/memory-viewer.svelte +++ b/web/src/lib/components/memory-page/memory-viewer.svelte @@ -403,16 +403,18 @@

-
- ($videoViewerMuted = !$videoViewerMuted)} - /> -
+ {#if currentTimelineAssets.some(({ isVideo }) => isVideo)} +
+ ($videoViewerMuted = !$videoViewerMuted)} + /> +
+ {/if}
From c18df7ae254be16e7bde72f58ef341fe28c3c391 Mon Sep 17 00:00:00 2001 From: Mees Frensel <33722705+meesfrensel@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:17:07 +0200 Subject: [PATCH 111/134] fix(web): clarify some transcoding settings (#22797) --- i18n/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index 2f98ab4bcb..d80734b513 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -333,7 +333,7 @@ "transcoding_max_b_frames": "Maximum B-frames", "transcoding_max_b_frames_description": "Higher values improve compression efficiency, but slow down encoding. May not be compatible with hardware acceleration on older devices. 0 disables B-frames, while -1 sets this value automatically.", "transcoding_max_bitrate": "Maximum bitrate", - "transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600 kbit/s for VP9 or HEVC, or 4500 kbit/s for H.264. Disabled if set to 0.", + "transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600 kbit/s for VP9 or HEVC, or 4500 kbit/s for H.264. Disabled if set to 0. When no unit is specified, k (for kbit/s) is assumed; therefore 5000, 5000k, and 5M (for Mbit/s) are equivalent.", "transcoding_max_keyframe_interval": "Maximum keyframe interval", "transcoding_max_keyframe_interval_description": "Sets the maximum frame distance between keyframes. Lower values worsen compression efficiency, but improve seek times and may improve quality in scenes with fast movement. 0 sets this value automatically.", "transcoding_optimal_description": "Videos higher than target resolution or not in an accepted format", @@ -351,7 +351,7 @@ "transcoding_target_resolution": "Target resolution", "transcoding_target_resolution_description": "Higher resolutions can preserve more detail but take longer to encode, have larger file sizes, and can reduce app responsiveness.", "transcoding_temporal_aq": "Temporal AQ", - "transcoding_temporal_aq_description": "Applies only to NVENC. Increases quality of high-detail, low-motion scenes. May not be compatible with older devices.", + "transcoding_temporal_aq_description": "Applies only to NVENC. Temporal Adaptive Quantization increases quality of high-detail, low-motion scenes. May not be compatible with older devices.", "transcoding_threads": "Threads", "transcoding_threads_description": "Higher values lead to faster encoding, but leave less room for the server to process other tasks while active. This value should not be more than the number of CPU cores. Maximizes utilization if set to 0.", "transcoding_tone_mapping": "Tone-mapping", From 7d0228a1597fa40e1bba324ca5d1ede66b3f2c27 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 15 Oct 2025 09:31:49 -0500 Subject: [PATCH 112/134] chore: post release tasks (#22936) --- mobile/ios/Runner.xcodeproj/project.pbxproj | 22 ++++++++++++--------- mobile/ios/Runner/Info.plist | 4 ++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index a6a7b42cca..92306acb29 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -133,11 +133,15 @@ /* Begin PBXFileSystemSynchronizedRootGroup section */ B231F52D2E93A44A00BC45D1 /* Core */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); path = Core; sourceTree = ""; }; B2CF7F8C2DDE4EBB00744BF6 /* Sync */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); path = Sync; sourceTree = ""; }; @@ -718,7 +722,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -862,7 +866,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -892,7 +896,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_BITCODE = NO; @@ -926,7 +930,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -969,7 +973,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -1009,7 +1013,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -1048,7 +1052,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1092,7 +1096,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1133,7 +1137,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 230; + CURRENT_PROJECT_VERSION = 231; CUSTOM_GROUP_ID = group.app.immich.share; DEVELOPMENT_TEAM = 2F67MQ8R79; ENABLE_USER_SCRIPT_SANDBOXING = YES; diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist index fb89490550..1dc55468da 100644 --- a/mobile/ios/Runner/Info.plist +++ b/mobile/ios/Runner/Info.plist @@ -80,7 +80,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.1 + 2.1.0 CFBundleSignature ???? CFBundleURLTypes @@ -107,7 +107,7 @@ CFBundleVersion - 230 + 231 FLTEnableImpeller ITSAppUsesNonExemptEncryption From 9b5855f848b0f3dae50399e38fc2266c53a69016 Mon Sep 17 00:00:00 2001 From: Saschl <19493808+Saschl@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:24:47 +0200 Subject: [PATCH 113/134] feat: add video auto play setting (#20416) * feat: add auto play setting to mobile * feat: add auto play video setting to web * address review comments * fix setting id --------- Co-authored-by: Saschl --- i18n/en.json | 2 ++ mobile/lib/domain/models/setting.model.dart | 1 + mobile/lib/domain/models/store.model.dart | 2 ++ mobile/lib/pages/common/native_video_viewer.page.dart | 5 ++++- .../widgets/asset_viewer/video_viewer.widget.dart | 6 +++++- mobile/lib/services/app_settings.service.dart | 1 + .../asset_viewer_settings/video_viewer_settings.dart | 7 +++++++ .../components/asset-viewer/video-native-viewer.svelte | 9 +++++++-- .../components/memory-page/memory-video-viewer.svelte | 3 ++- .../components/user-settings-page/app-settings.svelte | 8 ++++++++ web/src/lib/stores/preferences.store.ts | 2 ++ 11 files changed, 41 insertions(+), 5 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index d80734b513..0d9e52681c 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1807,6 +1807,8 @@ "setting_notifications_subtitle": "Adjust your notification preferences", "setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)", "setting_notifications_total_progress_title": "Show background backup total progress", + "setting_video_viewer_auto_play_subtitle": "Automatically start playing videos when they are opened", + "setting_video_viewer_auto_play_title": "Auto play videos", "setting_video_viewer_looping_title": "Looping", "setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.", "setting_video_viewer_original_video_title": "Force original video", diff --git a/mobile/lib/domain/models/setting.model.dart b/mobile/lib/domain/models/setting.model.dart index f427d93285..2c46507331 100644 --- a/mobile/lib/domain/models/setting.model.dart +++ b/mobile/lib/domain/models/setting.model.dart @@ -6,6 +6,7 @@ enum Setting { showStorageIndicator(StoreKey.storageIndicator, true), loadOriginal(StoreKey.loadOriginal, false), loadOriginalVideo(StoreKey.loadOriginalVideo, false), + autoPlayVideo(StoreKey.autoPlayVideo, true), preferRemoteImage(StoreKey.preferRemoteImage, false), advancedTroubleshooting(StoreKey.advancedTroubleshooting, false), enableBackup(StoreKey.enableBackup, false); diff --git a/mobile/lib/domain/models/store.model.dart b/mobile/lib/domain/models/store.model.dart index efccc9bccd..d8404db409 100644 --- a/mobile/lib/domain/models/store.model.dart +++ b/mobile/lib/domain/models/store.model.dart @@ -70,6 +70,8 @@ enum StoreKey { // Read-only Mode settings readonlyModeEnabled._(138), + autoPlayVideo._(139), + // Experimental stuff photoManagerCustomFilter._(1000), betaPromptShown._(1001), diff --git a/mobile/lib/pages/common/native_video_viewer.page.dart b/mobile/lib/pages/common/native_video_viewer.page.dart index d8b6db2276..7f39d07ec0 100644 --- a/mobile/lib/pages/common/native_video_viewer.page.dart +++ b/mobile/lib/pages/common/native_video_viewer.page.dart @@ -190,7 +190,10 @@ class NativeVideoViewerPage extends HookConsumerWidget { isVideoReady.value = true; try { - await videoController.play(); + final autoPlayVideo = ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.autoPlayVideo); + if (autoPlayVideo) { + await videoController.play(); + } await videoController.setVolume(0.9); } catch (error) { log.severe('Error playing video: $error'); diff --git a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart index 2bab507e3f..3af31950ad 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/video_viewer.widget.dart @@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/setting.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; +import 'package:immich_mobile/domain/services/setting.service.dart'; import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; @@ -218,7 +219,10 @@ class NativeVideoViewer extends HookConsumerWidget { } try { - await videoController.play(); + final autoPlayVideo = AppSetting.get(Setting.autoPlayVideo); + if (autoPlayVideo) { + await videoController.play(); + } await videoController.setVolume(0.9); } catch (error) { log.severe('Error playing video: $error'); diff --git a/mobile/lib/services/app_settings.service.dart b/mobile/lib/services/app_settings.service.dart index 03d91328d1..7149408e8a 100644 --- a/mobile/lib/services/app_settings.service.dart +++ b/mobile/lib/services/app_settings.service.dart @@ -34,6 +34,7 @@ enum AppSettingsEnum { preferRemoteImage(StoreKey.preferRemoteImage, null, false), loopVideo(StoreKey.loopVideo, "loopVideo", true), loadOriginalVideo(StoreKey.loadOriginalVideo, "loadOriginalVideo", false), + autoPlayVideo(StoreKey.autoPlayVideo, "autoPlayVideo", true), mapThemeMode(StoreKey.mapThemeMode, null, 0), mapShowFavoriteOnly(StoreKey.mapShowFavoriteOnly, null, false), mapIncludeArchived(StoreKey.mapIncludeArchived, null, false), diff --git a/mobile/lib/widgets/settings/asset_viewer_settings/video_viewer_settings.dart b/mobile/lib/widgets/settings/asset_viewer_settings/video_viewer_settings.dart index 1d8d9812be..9a89b7e1e3 100644 --- a/mobile/lib/widgets/settings/asset_viewer_settings/video_viewer_settings.dart +++ b/mobile/lib/widgets/settings/asset_viewer_settings/video_viewer_settings.dart @@ -14,11 +14,18 @@ class VideoViewerSettings extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final useLoopVideo = useAppSettingsState(AppSettingsEnum.loopVideo); final useOriginalVideo = useAppSettingsState(AppSettingsEnum.loadOriginalVideo); + final useAutoPlayVideo = useAppSettingsState(AppSettingsEnum.autoPlayVideo); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SettingsSubTitle(title: "videos".tr()), + SettingsSwitchListTile( + valueNotifier: useAutoPlayVideo, + title: "setting_video_viewer_auto_play_title".tr(), + subtitle: "setting_video_viewer_auto_play_subtitle".tr(), + onChanged: (_) => ref.invalidate(appSettingsServiceProvider), + ), SettingsSwitchListTile( valueNotifier: useLoopVideo, title: "setting_video_viewer_looping_title".tr(), diff --git a/web/src/lib/components/asset-viewer/video-native-viewer.svelte b/web/src/lib/components/asset-viewer/video-native-viewer.svelte index e2dae3d195..fd3bc1c44f 100644 --- a/web/src/lib/components/asset-viewer/video-native-viewer.svelte +++ b/web/src/lib/components/asset-viewer/video-native-viewer.svelte @@ -4,7 +4,12 @@ import { assetViewerFadeDuration } from '$lib/constants'; import { castManager } from '$lib/managers/cast-manager.svelte'; import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; - import { loopVideo as loopVideoPreference, videoViewerMuted, videoViewerVolume } from '$lib/stores/preferences.store'; + import { + autoPlayVideo, + loopVideo as loopVideoPreference, + videoViewerMuted, + videoViewerVolume, + } from '$lib/stores/preferences.store'; import { getAssetPlaybackUrl, getAssetThumbnailUrl } from '$lib/utils'; import { AssetMediaSize } from '@immich/sdk'; import { LoadingSpinner } from '@immich/ui'; @@ -125,7 +130,7 @@
From 2919ee4c65c6962a9956c6a5a33cbb533fe430ea Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Thu, 16 Oct 2025 13:44:09 -0400 Subject: [PATCH 121/134] fix: navigate to time action (#20928) * fix: navigate to time action * change-date -> DateSelectionModal; use luxon; use handle* for callback fn name * refactor change-date dialogs * Review comments * chore: clean up --------- Co-authored-by: Jason Rasmussen --- i18n/en.json | 3 + .../asset-viewer/detail-panel.svelte | 43 +-- .../shared-components/change-date.svelte | 284 ------------------ .../timeline/actions/ChangeDateAction.svelte | 80 +---- .../actions/ChangeDescriptionAction.svelte | 4 +- .../actions/ChangeLocationAction.svelte | 4 +- .../actions/TimelineKeyboardActions.svelte | 39 +-- web/src/lib/elements/DateInput.svelte | 4 +- .../internal/search-support.svelte.spec.ts | 75 +++++ .../internal/search-support.svelte.ts | 20 ++ .../timeline-manager.svelte.ts | 9 +- .../lib/modals/AssetChangeDateModal.svelte | 84 ++++++ .../AssetSelectionChangeDateModal.spec.ts} | 120 ++++---- .../AssetSelectionChangeDateModal.svelte | 136 +++++++++ web/src/lib/modals/NavigateToDateModal.svelte | 61 ++++ web/src/lib/modals/ShortcutsModal.svelte | 1 + web/src/lib/modals/timezone-utils.ts | 149 +++++++++ web/src/lib/utils/asset-utils.ts | 2 +- web/src/lib/utils/timeline-util.ts | 6 - 19 files changed, 647 insertions(+), 477 deletions(-) delete mode 100644 web/src/lib/components/shared-components/change-date.svelte create mode 100644 web/src/lib/managers/timeline-manager/internal/search-support.svelte.spec.ts create mode 100644 web/src/lib/modals/AssetChangeDateModal.svelte rename web/src/lib/{components/shared-components/change-date.spec.ts => modals/AssetSelectionChangeDateModal.spec.ts} (61%) create mode 100644 web/src/lib/modals/AssetSelectionChangeDateModal.svelte create mode 100644 web/src/lib/modals/NavigateToDateModal.svelte create mode 100644 web/src/lib/modals/timezone-utils.ts diff --git a/i18n/en.json b/i18n/en.json index 0d9e52681c..e1702611a7 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1364,6 +1364,8 @@ "my_albums": "My albums", "name": "Name", "name_or_nickname": "Name or nickname", + "navigate": "Navigate", + "navigate_to_time": "Navigate to Time", "network_requirement_photos_upload": "Use cellular data to backup photos", "network_requirement_videos_upload": "Use cellular data to backup videos", "network_requirements": "Network Requirements", @@ -1373,6 +1375,7 @@ "never": "Never", "new_album": "New Album", "new_api_key": "New API Key", + "new_date_range": "New date range", "new_password": "New password", "new_person": "New person", "new_pin_code": "New PIN code", diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index 4361da207b..17cba69d99 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -5,12 +5,9 @@ import DetailPanelLocation from '$lib/components/asset-viewer/detail-panel-location.svelte'; import DetailPanelRating from '$lib/components/asset-viewer/detail-panel-star-rating.svelte'; import DetailPanelTags from '$lib/components/asset-viewer/detail-panel-tags.svelte'; - import ChangeDate, { - type AbsoluteResult, - type RelativeResult, - } from '$lib/components/shared-components/change-date.svelte'; import { AppRoute, QueryParameter, timeToLoadTheMap } from '$lib/constants'; import { authManager } from '$lib/managers/auth-manager.svelte'; + import AssetChangeDateModal from '$lib/modals/AssetChangeDateModal.svelte'; import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; import { boundingBoxesArray } from '$lib/stores/people.store'; import { locale } from '$lib/stores/preferences.store'; @@ -19,12 +16,11 @@ import { getAssetThumbnailUrl, getPeopleThumbnailUrl } from '$lib/utils'; import { delay, getDimensions } from '$lib/utils/asset-utils'; import { getByteUnitString } from '$lib/utils/byte-units'; - import { handleError } from '$lib/utils/handle-error'; import { getMetadataSearchQuery } from '$lib/utils/metadata-search'; - import { fromISODateTime, fromISODateTimeUTC } from '$lib/utils/timeline-util'; + import { fromISODateTime, fromISODateTimeUTC, toTimelineAsset } from '$lib/utils/timeline-util'; import { getParentPath } from '$lib/utils/tree-utils'; - import { AssetMediaSize, getAssetInfo, updateAsset, type AlbumResponseDto, type AssetResponseDto } from '@immich/sdk'; - import { Icon, IconButton, LoadingSpinner } from '@immich/ui'; + import { AssetMediaSize, getAssetInfo, type AlbumResponseDto, type AssetResponseDto } from '@immich/sdk'; + import { Icon, IconButton, LoadingSpinner, modalManager } from '@immich/ui'; import { mdiCalendar, mdiCameraIris, @@ -59,7 +55,7 @@ let people = $derived(asset.people || []); let unassignedFaces = $derived(asset.unassignedFaces || []); let showingHiddenPeople = $state(false); - let timeZone = $derived(asset.exifInfo?.timeZone); + let timeZone = $derived(asset.exifInfo?.timeZone ?? undefined); let dateTime = $derived( timeZone && asset.exifInfo?.dateTimeOriginal ? fromISODateTime(asset.exifInfo.dateTimeOriginal, timeZone) @@ -112,18 +108,13 @@ const toggleAssetPath = () => (showAssetPath = !showAssetPath); - let isShowChangeDate = $state(false); - - async function handleConfirmChangeDate(result: AbsoluteResult | RelativeResult) { - isShowChangeDate = false; - try { - if (result.mode === 'absolute') { - await updateAsset({ id: asset.id, updateAssetDto: { dateTimeOriginal: result.date } }); - } - } catch (error) { - handleError(error, $t('errors.unable_to_change_date')); + const handleChangeDate = async () => { + if (!isOwner) { + return; } - } + + await modalManager.show(AssetChangeDateModal, { asset: toTimelineAsset(asset), initialDate: dateTime }); + };
@@ -280,7 +271,7 @@
{/if} - {#if isShowChangeDate} - (isShowChangeDate = false)} - /> - {/if} -
diff --git a/web/src/lib/components/shared-components/change-date.svelte b/web/src/lib/components/shared-components/change-date.svelte deleted file mode 100644 index 930bafd599..0000000000 --- a/web/src/lib/components/shared-components/change-date.svelte +++ /dev/null @@ -1,284 +0,0 @@ - - - (confirmed ? handleConfirm() : onCancel())} -> - {#snippet promptSnippet()} - {#if withDuration} -
- - - -
- {/if} -
-
-
- - -
-
-
- - -
-
- {#if timezoneInput} -
- handleOnSelect(option)} - /> -
- {/if} -
- {$t('edit_date_and_time_by_offset_interval', { values: { from: intervalFrom, to: intervalTo } })} -
-
-
- {/snippet} -
diff --git a/web/src/lib/components/timeline/actions/ChangeDateAction.svelte b/web/src/lib/components/timeline/actions/ChangeDateAction.svelte index 5e869050d3..fdfbf48749 100644 --- a/web/src/lib/components/timeline/actions/ChangeDateAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeDateAction.svelte @@ -1,18 +1,11 @@ {#if menuItem} - (isShowChangeDate = true)} /> -{/if} -{#if isShowChangeDate} - (isShowChangeDate = false)} - /> + {/if} diff --git a/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte b/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte index cf16d01172..6a4da927c3 100644 --- a/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeDescriptionAction.svelte @@ -2,7 +2,7 @@ import { getAssetControlContext } from '$lib/components/timeline/AssetSelectControlBar.svelte'; import AssetUpdateDescriptionConfirmModal from '$lib/modals/AssetUpdateDescriptionConfirmModal.svelte'; import { user } from '$lib/stores/user.store'; - import { getSelectedAssets } from '$lib/utils/asset-utils'; + import { getOwnedAssetsWithWarning } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAssets } from '@immich/sdk'; import { modalManager } from '@immich/ui'; @@ -20,7 +20,7 @@ const handleUpdateDescription = async () => { const description = await modalManager.show(AssetUpdateDescriptionConfirmModal); if (description) { - const ids = getSelectedAssets(getOwnedAssets(), $user); + const ids = getOwnedAssetsWithWarning(getOwnedAssets(), $user); try { await updateAssets({ assetBulkUpdateDto: { ids, description } }); diff --git a/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte b/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte index 2ccfe3704d..bfb10bb382 100644 --- a/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte +++ b/web/src/lib/components/timeline/actions/ChangeLocationAction.svelte @@ -2,7 +2,7 @@ import ChangeLocation from '$lib/components/shared-components/change-location.svelte'; import { getAssetControlContext } from '$lib/components/timeline/AssetSelectControlBar.svelte'; import { user } from '$lib/stores/user.store'; - import { getSelectedAssets } from '$lib/utils/asset-utils'; + import { getOwnedAssetsWithWarning } from '$lib/utils/asset-utils'; import { handleError } from '$lib/utils/handle-error'; import { updateAssets } from '@immich/sdk'; import { mdiMapMarkerMultipleOutline } from '@mdi/js'; @@ -25,7 +25,7 @@ return; } - const ids = getSelectedAssets(getOwnedAssets(), $user); + const ids = getOwnedAssetsWithWarning(getOwnedAssets(), $user); try { await updateAssets({ assetBulkUpdateDto: { ids, latitude: point.lat, longitude: point.lng } }); diff --git a/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte b/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte index 6d7a64d3d8..d3f151a974 100644 --- a/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte +++ b/web/src/lib/components/timeline/actions/TimelineKeyboardActions.svelte @@ -2,10 +2,6 @@ import { goto } from '$app/navigation'; import { shortcuts, type ShortcutOptions } from '$lib/actions/shortcut'; import DeleteAssetDialog from '$lib/components/photos-page/delete-asset-dialog.svelte'; - import ChangeDate, { - type AbsoluteResult, - type RelativeResult, - } from '$lib/components/shared-components/change-date.svelte'; import { setFocusToAsset as setFocusAssetInit, setFocusTo as setFocusToInit, @@ -13,6 +9,7 @@ import { AppRoute } from '$lib/constants'; import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; import type { TimelineAsset } from '$lib/managers/timeline-manager/types'; + import NavigateToDateModal from '$lib/modals/NavigateToDateModal.svelte'; import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte'; import type { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; @@ -24,8 +21,6 @@ import { archiveAssets, cancelMultiselect, selectAllAssets, stackAssets } from '$lib/utils/asset-utils'; import { AssetVisibility } from '@immich/sdk'; import { modalManager } from '@immich/ui'; - import { DateTime } from 'luxon'; - let { isViewing: showAssetViewer } = assetViewingStore; interface Props { timelineManager: TimelineManager; @@ -43,7 +38,7 @@ scrollToAsset, }: Props = $props(); - let isShowSelectDate = $state(false); + const { isViewing: showAssetViewer } = assetViewingStore; const trashOrDelete = async (force: boolean = false) => { isShowDeleteConfirmation = false; @@ -150,6 +145,13 @@ const setFocusTo = setFocusToInit.bind(undefined, scrollToAsset, timelineManager); const setFocusAsset = setFocusAssetInit.bind(undefined, scrollToAsset); + const handleOpenDateModal = async () => { + const asset = await modalManager.show(NavigateToDateModal, { timelineManager }); + if (asset) { + setFocusAsset(asset); + } + }; + let shortcutList = $derived( (() => { if (searchStore.isSearchEnabled || $showAssetViewer) { @@ -168,7 +170,7 @@ { shortcut: { key: 'M', shift: true }, onShortcut: () => setFocusTo('later', 'month') }, { shortcut: { key: 'Y' }, onShortcut: () => setFocusTo('earlier', 'year') }, { shortcut: { key: 'Y', shift: true }, onShortcut: () => setFocusTo('later', 'year') }, - { shortcut: { key: 'G' }, onShortcut: () => (isShowSelectDate = true) }, + { shortcut: { key: 'G' }, onShortcut: handleOpenDateModal }, ]; if (onEscape) { shortcuts.push({ shortcut: { key: 'Escape' }, onShortcut: onEscape }); @@ -198,24 +200,3 @@ onConfirm={() => handlePromiseError(trashOrDelete(true))} /> {/if} - -{#if isShowSelectDate} - { - isShowSelectDate = false; - if (dateString.mode == 'absolute') { - const asset = await timelineManager.getClosestAssetToDate( - (DateTime.fromISO(dateString.date) as DateTime).toObject(), - ); - if (asset) { - setFocusAsset(asset); - } - } - }} - onCancel={() => (isShowSelectDate = false)} - /> -{/if} diff --git a/web/src/lib/elements/DateInput.svelte b/web/src/lib/elements/DateInput.svelte index c328a6c036..a8f406f928 100644 --- a/web/src/lib/elements/DateInput.svelte +++ b/web/src/lib/elements/DateInput.svelte @@ -1,5 +1,7 @@ + + onClose(false)} size="small"> + + + + + + + + + {#if timezoneInput} +
+ +
+ {/if} +
+
+ + + + + + +
diff --git a/web/src/lib/components/shared-components/change-date.spec.ts b/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts similarity index 61% rename from web/src/lib/components/shared-components/change-date.spec.ts rename to web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts index 63926a44a6..ab7f24db25 100644 --- a/web/src/lib/components/shared-components/change-date.spec.ts +++ b/web/src/lib/modals/AssetSelectionChangeDateModal.spec.ts @@ -1,33 +1,30 @@ +import { getAnimateMock } from '$lib/__mocks__/animate.mock'; import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock'; +import { sdkMock } from '$lib/__mocks__/sdk.mock'; import { getVisualViewportMock } from '$lib/__mocks__/visual-viewport.mock'; +import { calcNewDate } from '$lib/modals/timezone-utils'; import { fireEvent, render, screen, waitFor } from '@testing-library/svelte'; import userEvent from '@testing-library/user-event'; import { DateTime } from 'luxon'; -import ChangeDate from './change-date.svelte'; +import AssetSelectionChangeDateModal from './AssetSelectionChangeDateModal.svelte'; -describe('ChangeDate component', () => { +describe('DateSelectionModal component', () => { const initialDate = DateTime.fromISO('2024-01-01'); const initialTimeZone = 'Europe/Berlin'; - const currentInterval = { - start: DateTime.fromISO('2000-02-01T14:00:00+01:00'), - end: DateTime.fromISO('2001-02-01T14:00:00+01:00'), - }; - const onCancel = vi.fn(); - const onConfirm = vi.fn(); + + const onClose = vi.fn(); const getRelativeInputToggle = () => screen.getByTestId('edit-by-offset-switch'); const getDateInput = () => screen.getByLabelText('date_and_time') as HTMLInputElement; const getTimeZoneInput = () => screen.getByLabelText('timezone') as HTMLInputElement; - const getCancelButton = () => screen.getByText('Cancel'); - const getConfirmButton = () => screen.getByText('Confirm'); + const getCancelButton = () => screen.getByText('cancel'); + const getConfirmButton = () => screen.getByText('confirm'); beforeEach(() => { vi.stubGlobal('IntersectionObserver', getIntersectionObserverMock()); vi.stubGlobal('visualViewport', getVisualViewportMock()); - }); - - afterEach(() => { vi.resetAllMocks(); + Element.prototype.animate = getAnimateMock(); }); afterAll(async () => { @@ -38,54 +35,75 @@ describe('ChangeDate component', () => { }); test('should render correct values', () => { - render(ChangeDate, { initialDate, initialTimeZone, onCancel, onConfirm }); + render(AssetSelectionChangeDateModal, { + initialDate, + initialTimeZone, + assets: [], + + onClose, + }); expect(getDateInput().value).toBe('2024-01-01T00:00'); expect(getTimeZoneInput().value).toBe('Europe/Berlin (+01:00)'); }); test('calls onConfirm with correct date on confirm', async () => { - render(ChangeDate, { - props: { initialDate, initialTimeZone, onCancel, onConfirm }, + render(AssetSelectionChangeDateModal, { + props: { initialDate, initialTimeZone, assets: [], onClose }, }); await fireEvent.click(getConfirmButton()); - expect(onConfirm).toHaveBeenCalledWith({ mode: 'absolute', date: '2024-01-01T00:00:00.000+01:00' }); + expect(sdkMock.updateAssets).toHaveBeenCalledWith({ + assetBulkUpdateDto: { + ids: [], + dateTimeOriginal: '2024-01-01T00:00:00.000+01:00', + }, + }); }); test('calls onCancel on cancel', async () => { - render(ChangeDate, { - props: { initialDate, initialTimeZone, onCancel, onConfirm }, + render(AssetSelectionChangeDateModal, { + props: { initialDate, initialTimeZone, assets: [], onClose }, }); await fireEvent.click(getCancelButton()); - expect(onCancel).toHaveBeenCalled(); + expect(onClose).toHaveBeenCalled(); }); describe('when date is in daylight saving time', () => { const dstDate = DateTime.fromISO('2024-07-01'); test('should render correct timezone with offset', () => { - render(ChangeDate, { initialDate: dstDate, initialTimeZone, onCancel, onConfirm }); + render(AssetSelectionChangeDateModal, { + initialDate: dstDate, + initialTimeZone, + assets: [], + onClose, + }); expect(getTimeZoneInput().value).toBe('Europe/Berlin (+02:00)'); }); test('calls onConfirm with correct date on confirm', async () => { - render(ChangeDate, { - props: { initialDate: dstDate, initialTimeZone, onCancel, onConfirm }, + render(AssetSelectionChangeDateModal, { + props: { initialDate: dstDate, initialTimeZone, assets: [], onClose }, }); await fireEvent.click(getConfirmButton()); - expect(onConfirm).toHaveBeenCalledWith({ mode: 'absolute', date: '2024-07-01T00:00:00.000+02:00' }); + expect(sdkMock.updateAssets).toHaveBeenCalledWith({ + assetBulkUpdateDto: { + ids: [], + dateTimeOriginal: '2024-07-01T00:00:00.000+02:00', + }, + }); }); }); test('calls onConfirm with correct offset in relative mode', async () => { - render(ChangeDate, { - props: { initialDate, initialTimeZone, currentInterval, onCancel, onConfirm }, + render(AssetSelectionChangeDateModal, { + props: { initialDate, initialTimeZone, assets: [], onClose }, }); await fireEvent.click(getRelativeInputToggle()); @@ -104,17 +122,19 @@ describe('ChangeDate component', () => { await fireEvent.click(getConfirmButton()); - expect(onConfirm).toHaveBeenCalledWith({ - mode: 'relative', - duration: days * 60 * 24 + hours * 60 + minutes, - timeZone: undefined, + expect(sdkMock.updateAssets).toHaveBeenCalledWith({ + assetBulkUpdateDto: { + ids: [], + dateTimeRelative: days * 60 * 24 + hours * 60 + minutes, + timeZone: 'Europe/Berlin', + }, }); }); test('calls onConfirm with correct timeZone in relative mode', async () => { const user = userEvent.setup(); - render(ChangeDate, { - props: { initialDate, initialTimeZone, currentInterval, onCancel, onConfirm }, + render(AssetSelectionChangeDateModal, { + props: { initialDate, initialTimeZone, assets: [], onClose }, }); await user.click(getRelativeInputToggle()); @@ -123,10 +143,13 @@ describe('ChangeDate component', () => { await user.keyboard('{Enter}'); await user.click(getConfirmButton()); - expect(onConfirm).toHaveBeenCalledWith({ - mode: 'relative', - duration: 0, - timeZone: initialTimeZone, + + expect(sdkMock.updateAssets).toHaveBeenCalledWith({ + assetBulkUpdateDto: { + ids: [], + dateTimeRelative: 0, + timeZone: 'Europe/Berlin', + }, }); }); @@ -136,55 +159,50 @@ describe('ChangeDate component', () => { timestamp: DateTime.fromISO('2024-01-01T00:00:00.000+01:00', { setZone: true }), duration: 0, timezone: undefined, - expectedResult: 'Jan 1, 2024, 12:00 AM GMT+01:00', + expectedResult: '2024-01-01T00:00:00.000', }, { timestamp: DateTime.fromISO('2024-01-01T04:00:00.000+05:00', { setZone: true }), duration: 0, timezone: undefined, - expectedResult: 'Jan 1, 2024, 4:00 AM GMT+05:00', + expectedResult: '2024-01-01T04:00:00.000', }, { timestamp: DateTime.fromISO('2024-01-01T00:00:00.000+00:00', { setZone: true }), duration: 0, timezone: 'Europe/Berlin', - expectedResult: 'Jan 1, 2024, 1:00 AM GMT+01:00', + expectedResult: '2024-01-01T01:00:00.000', }, { timestamp: DateTime.fromISO('2024-07-01T00:00:00.000+00:00', { setZone: true }), duration: 0, timezone: 'Europe/Berlin', - expectedResult: 'Jul 1, 2024, 2:00 AM GMT+02:00', + expectedResult: '2024-07-01T02:00:00.000', }, { timestamp: DateTime.fromISO('2024-01-01T00:00:00.000+01:00', { setZone: true }), duration: 1440, timezone: undefined, - expectedResult: 'Jan 2, 2024, 12:00 AM GMT+01:00', + expectedResult: '2024-01-02T00:00:00.000', }, { timestamp: DateTime.fromISO('2024-01-01T00:00:00.000+01:00', { setZone: true }), duration: -1440, timezone: undefined, - expectedResult: 'Dec 31, 2023, 12:00 AM GMT+01:00', + expectedResult: '2023-12-31T00:00:00.000', }, { timestamp: DateTime.fromISO('2024-01-01T00:00:00.000-01:00', { setZone: true }), duration: -1440, timezone: 'America/Anchorage', - expectedResult: 'Dec 30, 2023, 4:00 PM GMT-09:00', + expectedResult: '2023-12-30T16:00:00.000', }, ]; - const component = render(ChangeDate, { - props: { initialDate, initialTimeZone, currentInterval, onCancel, onConfirm }, - }); - for (const testCase of testCases) { - expect( - component.component.calcNewDate(testCase.timestamp, testCase.duration, testCase.timezone), - JSON.stringify(testCase), - ).toBe(testCase.expectedResult); + expect(calcNewDate(testCase.timestamp, testCase.duration, testCase.timezone), JSON.stringify(testCase)).toBe( + testCase.expectedResult, + ); } }); }); diff --git a/web/src/lib/modals/AssetSelectionChangeDateModal.svelte b/web/src/lib/modals/AssetSelectionChangeDateModal.svelte new file mode 100644 index 0000000000..ae9bfeb1d0 --- /dev/null +++ b/web/src/lib/modals/AssetSelectionChangeDateModal.svelte @@ -0,0 +1,136 @@ + + + onClose(false)} size="small"> + + + + + + + + {#if showRelative} + + + + + + + {:else} + + + + + + + {/if} +
+ (lastSelectedTimezone = option as ZoneOption)} + > +
+ +
+
+ + + + + + +
diff --git a/web/src/lib/modals/NavigateToDateModal.svelte b/web/src/lib/modals/NavigateToDateModal.svelte new file mode 100644 index 0000000000..4b83c66bc6 --- /dev/null +++ b/web/src/lib/modals/NavigateToDateModal.svelte @@ -0,0 +1,61 @@ + + + onClose()}> + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/modals/ShortcutsModal.svelte b/web/src/lib/modals/ShortcutsModal.svelte index 9bd7b29b94..ebb5ea3c60 100644 --- a/web/src/lib/modals/ShortcutsModal.svelte +++ b/web/src/lib/modals/ShortcutsModal.svelte @@ -27,6 +27,7 @@ { key: ['D', 'd'], action: $t('previous_or_next_day') }, { key: ['M', 'm'], action: $t('previous_or_next_month') }, { key: ['Y', 'y'], action: $t('previous_or_next_year') }, + { key: ['g'], action: $t('navigate_to_time') }, { key: ['x'], action: $t('select') }, { key: ['Esc'], action: $t('back_close_deselect') }, { key: ['Ctrl', 'k'], action: $t('search_your_photos') }, diff --git a/web/src/lib/modals/timezone-utils.ts b/web/src/lib/modals/timezone-utils.ts new file mode 100644 index 0000000000..c7bb00fd69 --- /dev/null +++ b/web/src/lib/modals/timezone-utils.ts @@ -0,0 +1,149 @@ +import { DateTime, Duration } from 'luxon'; + +export type ZoneOption = { + /** + * Timezone name with offset + * + * e.g. Asia/Jerusalem (+03:00) + */ + label: string; + + /** + * Timezone name + * + * e.g. Asia/Jerusalem + */ + value: string; + + /** + * Timezone offset in minutes + * + * e.g. 300 + */ + offsetMinutes: number; + + /** + * True iff the date is valid + * + * Dates may be invalid for various reasons, for example setting a day that does not exist (30 Feb 2024). + * Due to daylight saving time, 2:30am is invalid for Europe/Berlin on Mar 31 2024.The two following local times + * are one second apart: + * + * - Mar 31 2024 01:59:59 (GMT+0100, unix timestamp 1725058799) + * - Mar 31 2024 03:00:00 (GMT+0200, unix timestamp 1711846800) + * + * Mar 31 2024 02:30:00 does not exist in Europe/Berlin, this is an invalid date/time/time zone combination. + */ + valid: boolean; +}; + +const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; +const knownTimezones = Intl.supportedValuesOf('timeZone'); + +export function getTimezones(selectedDate: string) { + // Use a fixed modern date to calculate stable timezone offsets for the list + // This ensures that the offsets shown in the combobox are always current, + // regardless of the historical date selected by the user. + return knownTimezones + .map((zone) => zoneOptionForDate(zone, selectedDate)) + .filter((zone) => zone.valid) + .sort((zoneA, zoneB) => sortTwoZones(zoneA, zoneB)); +} + +export function getModernOffsetForZoneAndDate( + zone: string, + dateString: string, +): { offsetMinutes: number; offsetFormat: string } { + const dt = DateTime.fromISO(dateString, { zone }); + + // we determine the *modern* offset for this zone based on its current rules. + // To do this, we "move" the date to the current year, keeping the local time components. + // This allows Luxon to apply current-year DST rules. + const modernYearDt = dt.set({ year: DateTime.now().year }); + + // Calculate the offset at that modern year's date. + const modernOffsetMinutes = modernYearDt.setZone(zone, { keepLocalTime: true }).offset; + const modernOffsetFormat = modernYearDt.setZone(zone, { keepLocalTime: true }).toFormat('ZZ'); + + return { offsetMinutes: modernOffsetMinutes, offsetFormat: modernOffsetFormat }; +} + +function zoneOptionForDate(zone: string, date: string) { + const { offsetMinutes, offsetFormat: zoneOffsetAtDate } = getModernOffsetForZoneAndDate(zone, date); + // For validity, we still need to check if the exact date/time exists in the *original* timezone (for gaps/overlaps). + const dateForValidity = DateTime.fromISO(date, { zone }); + const valid = dateForValidity.isValid && date === dateForValidity.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); + return { + value: zone, + offsetMinutes, + label: zone + ' (' + zoneOffsetAtDate + ')' + (valid ? '' : ' [invalid date!]'), + valid, + }; +} + +function sortTwoZones(zoneA: ZoneOption, zoneB: ZoneOption) { + const offsetDifference = zoneA.offsetMinutes - zoneB.offsetMinutes; + if (offsetDifference != 0) { + return offsetDifference; + } + return zoneA.value.localeCompare(zoneB.value, undefined, { sensitivity: 'base' }); +} + +/* + * If the time zone is not given, find the timezone to select for a given time, date, and offset (e.g. +02:00). + * + * This is done so that the list shown to the user includes more helpful names like "Europe/Berlin (+02:00)" + * instead of just the raw offset or something like "UTC+02:00". + * + * The provided information (initialDate, from some asset) includes the offset (e.g. +02:00), but no information about + * the actual time zone. As several countries/regions may share the same offset, for example Berlin (Germany) and + * Blantyre (Malawi) sharing +02:00 in summer, we have to guess and somehow pick a suitable time zone. + * + * If the time zone configured by the user (in the browser) provides the same offset for the given date (accounting + * for daylight saving time and other weirdness), we prefer to show it. This way, for German users, we might be able + * to show "Europe/Berlin" instead of the lexicographically first entry "Africa/Blantyre". + */ +export function getPreferredTimeZone( + date: DateTime, + initialTimeZone: string | undefined, + timezones: ZoneOption[], + selectedOption?: ZoneOption, +) { + const offset = date.offset; + const previousSelection = timezones.find((item) => item.value === selectedOption?.value); + const fromInitialTimeZone = timezones.find((item) => item.value === initialTimeZone); + const sameAsUserTimeZone = timezones.find((item) => item.offsetMinutes === offset && item.value === userTimeZone); + const firstWithSameOffset = timezones.find((item) => item.offsetMinutes === offset); + const utcFallback = { + label: 'UTC (+00:00)', + offsetMinutes: 0, + value: 'UTC', + valid: true, + }; + return previousSelection ?? fromInitialTimeZone ?? sameAsUserTimeZone ?? firstWithSameOffset ?? utcFallback; +} + +export function toDatetime(selectedDate: string, selectedZone: ZoneOption) { + const dtComponents = DateTime.fromISO(selectedDate, { zone: 'utc' }); + + // Determine the modern, DST-aware offset for the selected IANA zone + const { offsetMinutes } = getModernOffsetForZoneAndDate(selectedZone.value, selectedDate); + + // Construct the final ISO string with a fixed-offset zone. + const fixedOffsetZone = `UTC${offsetMinutes >= 0 ? '+' : ''}${Duration.fromObject({ minutes: offsetMinutes }).toFormat('hh:mm')}`; + + // Create a DateTime object in this fixed-offset zone, preserving the local time. + return DateTime.fromObject(dtComponents.toObject(), { zone: fixedOffsetZone }); +} + +export function toIsoDate(selectedDate: string, selectedZone: ZoneOption) { + return toDatetime(selectedDate, selectedZone).toISO({ includeOffset: true })!; +} + +export const calcNewDate = (timestamp: DateTime, selectedDuration: number, timezone?: string) => { + let newDateTime = timestamp.plus({ minutes: selectedDuration }); + if (timezone) { + newDateTime = newDateTime.setZone(timezone); + } + return newDateTime.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); +}; diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts index 25e045c8a1..5211f0bf72 100644 --- a/web/src/lib/utils/asset-utils.ts +++ b/web/src/lib/utils/asset-utils.ts @@ -405,7 +405,7 @@ export const getAssetType = (type: AssetTypeEnum) => { } }; -export const getSelectedAssets = (assets: TimelineAsset[], user: UserResponseDto | null): string[] => { +export const getOwnedAssetsWithWarning = (assets: TimelineAsset[], user: UserResponseDto | null): string[] => { const ids = [...assets].filter((a) => user && a.ownerId === user.id).map((a) => a.id); const numberOfIssues = [...assets].filter((a) => user && a.ownerId !== user.id).length; diff --git a/web/src/lib/utils/timeline-util.ts b/web/src/lib/utils/timeline-util.ts index 673b929a1c..60811c24f0 100644 --- a/web/src/lib/utils/timeline-util.ts +++ b/web/src/lib/utils/timeline-util.ts @@ -154,12 +154,6 @@ export function formatGroupTitle(_date: DateTime): string { export const getDateLocaleString = (date: DateTime, opts?: LocaleOptions): string => date.toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY, opts); -export const getDateTimeOffsetLocaleString = (date: DateTime, opts?: LocaleOptions): string => - date.toLocaleString( - { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit', timeZoneName: 'longOffset' }, - opts, - ); - export const toTimelineAsset = (unknownAsset: AssetResponseDto | TimelineAsset): TimelineAsset => { if (isTimelineAsset(unknownAsset)) { return unknownAsset; From a23dfff6cf8aa559178cb667089c22bdf8e2cec3 Mon Sep 17 00:00:00 2001 From: Jorge Montejo Date: Thu, 16 Oct 2025 21:03:41 +0200 Subject: [PATCH 122/134] fix: remove assets from shared link (#22935) * fix remove assets from shared link * rename var * test: should remove individually shared asset * test: should share individually assets * fix failing tests --- server/src/repositories/index.ts | 2 + .../shared-link-asset.repository.ts | 18 ++++++ server/src/services/base.service.ts | 3 + .../src/services/shared-link.service.spec.ts | 2 + server/src/services/shared-link.service.ts | 6 +- server/test/medium.factory.ts | 2 + .../services/shared-link.service.spec.ts | 64 ++++++++++++++++++- server/test/utils.ts | 4 ++ 8 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 server/src/repositories/shared-link-asset.repository.ts diff --git a/server/src/repositories/index.ts b/server/src/repositories/index.ts index a01b46f3bd..d2e1aa08c8 100644 --- a/server/src/repositories/index.ts +++ b/server/src/repositories/index.ts @@ -31,6 +31,7 @@ import { ProcessRepository } from 'src/repositories/process.repository'; import { SearchRepository } from 'src/repositories/search.repository'; import { ServerInfoRepository } from 'src/repositories/server-info.repository'; import { SessionRepository } from 'src/repositories/session.repository'; +import { SharedLinkAssetRepository } from 'src/repositories/shared-link-asset.repository'; import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StackRepository } from 'src/repositories/stack.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; @@ -79,6 +80,7 @@ export const repositories = [ SessionRepository, ServerInfoRepository, SharedLinkRepository, + SharedLinkAssetRepository, StackRepository, StorageRepository, SyncRepository, diff --git a/server/src/repositories/shared-link-asset.repository.ts b/server/src/repositories/shared-link-asset.repository.ts new file mode 100644 index 0000000000..45085c4a8d --- /dev/null +++ b/server/src/repositories/shared-link-asset.repository.ts @@ -0,0 +1,18 @@ +import { Kysely } from 'kysely'; +import { InjectKysely } from 'nestjs-kysely'; +import { DB } from 'src/schema'; + +export class SharedLinkAssetRepository { + constructor(@InjectKysely() private db: Kysely) {} + + async remove(sharedLinkId: string, assetsId: string[]) { + const deleted = await this.db + .deleteFrom('shared_link_asset') + .where('shared_link_asset.sharedLinksId', '=', sharedLinkId) + .where('shared_link_asset.assetsId', 'in', assetsId) + .returning('assetsId') + .execute(); + + return deleted.map((row) => row.assetsId); + } +} diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index 6b85c3ec6c..5a2dd42c3c 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -38,6 +38,7 @@ import { ProcessRepository } from 'src/repositories/process.repository'; import { SearchRepository } from 'src/repositories/search.repository'; import { ServerInfoRepository } from 'src/repositories/server-info.repository'; import { SessionRepository } from 'src/repositories/session.repository'; +import { SharedLinkAssetRepository } from 'src/repositories/shared-link-asset.repository'; import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StackRepository } from 'src/repositories/stack.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; @@ -89,6 +90,7 @@ export const BASE_SERVICE_DEPENDENCIES = [ ServerInfoRepository, SessionRepository, SharedLinkRepository, + SharedLinkAssetRepository, StackRepository, StorageRepository, SyncRepository, @@ -141,6 +143,7 @@ export class BaseService { protected serverInfoRepository: ServerInfoRepository, protected sessionRepository: SessionRepository, protected sharedLinkRepository: SharedLinkRepository, + protected sharedLinkAssetRepository: SharedLinkAssetRepository, protected stackRepository: StackRepository, protected storageRepository: StorageRepository, protected syncRepository: SyncRepository, diff --git a/server/src/services/shared-link.service.spec.ts b/server/src/services/shared-link.service.spec.ts index 9483cdddff..062214b975 100644 --- a/server/src/services/shared-link.service.spec.ts +++ b/server/src/services/shared-link.service.spec.ts @@ -300,6 +300,7 @@ describe(SharedLinkService.name, () => { mocks.sharedLink.get.mockResolvedValue(_.cloneDeep(sharedLinkStub.individual)); mocks.sharedLink.create.mockResolvedValue(sharedLinkStub.individual); mocks.sharedLink.update.mockResolvedValue(sharedLinkStub.individual); + mocks.sharedLinkAsset.remove.mockResolvedValue([assetStub.image.id]); await expect( sut.removeAssets(authStub.admin, 'link-1', { assetIds: [assetStub.image.id, 'asset-2'] }), @@ -308,6 +309,7 @@ describe(SharedLinkService.name, () => { { assetId: 'asset-2', success: false, error: AssetIdErrorReason.NOT_FOUND }, ]); + expect(mocks.sharedLinkAsset.remove).toHaveBeenCalledWith('link-1', [assetStub.image.id, 'asset-2']); expect(mocks.sharedLink.update).toHaveBeenCalledWith({ ...sharedLinkStub.individual, assets: [] }); }); }); diff --git a/server/src/services/shared-link.service.ts b/server/src/services/shared-link.service.ts index 096739d056..3c1a6083e9 100644 --- a/server/src/services/shared-link.service.ts +++ b/server/src/services/shared-link.service.ts @@ -175,10 +175,12 @@ export class SharedLinkService extends BaseService { throw new BadRequestException('Invalid shared link type'); } + const removedAssetIds = await this.sharedLinkAssetRepository.remove(id, dto.assetIds); + const results: AssetIdsResponseDto[] = []; for (const assetId of dto.assetIds) { - const hasAsset = sharedLink.assets.find((asset) => asset.id === assetId); - if (!hasAsset) { + const wasRemoved = removedAssetIds.find((id) => id === assetId); + if (!wasRemoved) { results.push({ assetId, success: false, error: AssetIdErrorReason.NOT_FOUND }); continue; } diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index f802e3113e..3f021f3eb7 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -33,6 +33,7 @@ import { PartnerRepository } from 'src/repositories/partner.repository'; import { PersonRepository } from 'src/repositories/person.repository'; import { SearchRepository } from 'src/repositories/search.repository'; import { SessionRepository } from 'src/repositories/session.repository'; +import { SharedLinkAssetRepository } from 'src/repositories/shared-link-asset.repository'; import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StackRepository } from 'src/repositories/stack.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; @@ -311,6 +312,7 @@ const newRealRepository = (key: ClassConstructor, db: Kysely): T => { case SearchRepository: case SessionRepository: case SharedLinkRepository: + case SharedLinkAssetRepository: case StackRepository: case SyncRepository: case SyncCheckpointRepository: diff --git a/server/test/medium/specs/services/shared-link.service.spec.ts b/server/test/medium/specs/services/shared-link.service.spec.ts index 88e7e86df5..acc51374d1 100644 --- a/server/test/medium/specs/services/shared-link.service.spec.ts +++ b/server/test/medium/specs/services/shared-link.service.spec.ts @@ -4,6 +4,7 @@ import { SharedLinkType } from 'src/enum'; import { AccessRepository } from 'src/repositories/access.repository'; import { DatabaseRepository } from 'src/repositories/database.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; +import { SharedLinkAssetRepository } from 'src/repositories/shared-link-asset.repository'; import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { DB } from 'src/schema'; @@ -17,7 +18,7 @@ let defaultDatabase: Kysely; const setup = (db?: Kysely) => { return newMediumService(SharedLinkService, { database: db || defaultDatabase, - real: [AccessRepository, DatabaseRepository, SharedLinkRepository], + real: [AccessRepository, DatabaseRepository, SharedLinkRepository, SharedLinkAssetRepository], mock: [LoggingRepository, StorageRepository], }); }; @@ -62,4 +63,65 @@ describe(SharedLinkService.name, () => { }); }); }); + + it('should share individually assets', async () => { + const { sut, ctx } = setup(); + + const { user } = await ctx.newUser(); + + const assets = await Promise.all([ + ctx.newAsset({ ownerId: user.id }), + ctx.newAsset({ ownerId: user.id }), + ctx.newAsset({ ownerId: user.id }), + ]); + + for (const { asset } of assets) { + await ctx.newExif({ assetId: asset.id, make: 'Canon' }); + } + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(16), + id: factory.uuid(), + userId: user.id, + allowUpload: false, + type: SharedLinkType.Individual, + assetIds: assets.map(({ asset }) => asset.id), + }); + + await expect(sut.getMine({ user, sharedLink }, {})).resolves.toMatchObject({ + assets: assets.map(({ asset }) => expect.objectContaining({ id: asset.id })), + }); + }); + + it('should remove individually shared asset', async () => { + const { sut, ctx } = setup(); + + const { user } = await ctx.newUser(); + const auth = factory.auth({ user }); + const { asset } = await ctx.newAsset({ ownerId: user.id }); + await ctx.newExif({ assetId: asset.id, make: 'Canon' }); + + const sharedLinkRepo = ctx.get(SharedLinkRepository); + + const sharedLink = await sharedLinkRepo.create({ + key: randomBytes(16), + id: factory.uuid(), + userId: user.id, + allowUpload: false, + type: SharedLinkType.Individual, + assetIds: [asset.id], + }); + + await expect(sut.getMine({ user, sharedLink }, {})).resolves.toMatchObject({ + assets: [expect.objectContaining({ id: asset.id })], + }); + + await sut.removeAssets(auth, sharedLink.id, { + assetIds: [asset.id], + }); + + await expect(sut.getMine({ user, sharedLink }, {})).resolves.toHaveProperty('assets', []); + }); }); diff --git a/server/test/utils.ts b/server/test/utils.ts index c23341d64c..bae9163b80 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -47,6 +47,7 @@ import { ProcessRepository } from 'src/repositories/process.repository'; import { SearchRepository } from 'src/repositories/search.repository'; import { ServerInfoRepository } from 'src/repositories/server-info.repository'; import { SessionRepository } from 'src/repositories/session.repository'; +import { SharedLinkAssetRepository } from 'src/repositories/shared-link-asset.repository'; import { SharedLinkRepository } from 'src/repositories/shared-link.repository'; import { StackRepository } from 'src/repositories/stack.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; @@ -236,6 +237,7 @@ export type ServiceOverrides = { serverInfo: ServerInfoRepository; session: SessionRepository; sharedLink: SharedLinkRepository; + sharedLinkAsset: SharedLinkAssetRepository; stack: StackRepository; storage: StorageRepository; sync: SyncRepository; @@ -307,6 +309,7 @@ export const newTestService = ( serverInfo: automock(ServerInfoRepository, { args: [, loggerMock], strict: false }), session: automock(SessionRepository), sharedLink: automock(SharedLinkRepository), + sharedLinkAsset: automock(SharedLinkAssetRepository), stack: automock(StackRepository), storage: newStorageRepositoryMock(), sync: automock(SyncRepository), @@ -357,6 +360,7 @@ export const newTestService = ( overrides.serverInfo || (mocks.serverInfo as As), overrides.session || (mocks.session as As), overrides.sharedLink || (mocks.sharedLink as As), + overrides.sharedLinkAsset || (mocks.sharedLinkAsset as As), overrides.stack || (mocks.stack as As), overrides.storage || (mocks.storage as As), overrides.sync || (mocks.sync as As), From 24bfdf3263f2c5fa8b2dd8a109e6389484b378ed Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Thu, 16 Oct 2025 17:49:12 -0400 Subject: [PATCH 123/134] fix(web): immich-form-label usage (#23006) --- .../shared-components/combobox.svelte | 4 +- web/src/lib/modals/ApiKeySecretModal.svelte | 14 +---- .../lib/modals/AssetChangeDateModal.svelte | 37 +++++------- .../AssetSelectionChangeDateModal.svelte | 58 ++++++++----------- 4 files changed, 43 insertions(+), 70 deletions(-) diff --git a/web/src/lib/components/shared-components/combobox.svelte b/web/src/lib/components/shared-components/combobox.svelte index 725b456912..955ca64565 100644 --- a/web/src/lib/components/shared-components/combobox.svelte +++ b/web/src/lib/components/shared-components/combobox.svelte @@ -23,7 +23,7 @@ import { focusOutside } from '$lib/actions/focus-outside'; import { shortcuts } from '$lib/actions/shortcut'; import { generateId } from '$lib/utils/generate-id'; - import { Icon, IconButton } from '@immich/ui'; + import { Icon, IconButton, Label } from '@immich/ui'; import { mdiClose, mdiMagnify, mdiUnfoldMoreHorizontal } from '@mdi/js'; import { onMount, tick } from 'svelte'; import { t } from 'svelte-i18n'; @@ -251,7 +251,7 @@ - +
import { copyToClipboard } from '$lib/utils'; - import { Button, HStack, Modal, ModalBody, ModalFooter } from '@immich/ui'; + import { Button, HStack, Modal, ModalBody, ModalFooter, Text, Textarea } from '@immich/ui'; import { mdiKeyVariant } from '@mdi/js'; import { t } from 'svelte-i18n'; @@ -14,16 +14,8 @@ -
-

- {$t('api_key_description')} -

-
- -
- - -
+ {$t('api_key_description')} +