diff --git a/README.md b/README.md
index 29b8f8ac63..7c884ef97c 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_ca_ES.md b/README_ca_ES.md
index 29c47e15fd..d15c0fee9f 100644
--- a/README_ca_ES.md
+++ b/README_ca_ES.md
@@ -24,6 +24,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_de_DE.md b/README_de_DE.md
new file mode 100644
index 0000000000..de0d1e81f3
--- /dev/null
+++ b/README_de_DE.md
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+Immich - Hoch performante, selbst gehostete Backup Lösung für Fotos und Videos
+
+
+
+
+
+
+ English
+ Català
+ Español
+ Français
+ Italiano
+ 日本語
+ 한국어
+ Nederlands
+ Türkçe
+ 中文
+
+
+## Warnung
+
+- ⚠️ Das Projekt befindet sich unter **sehr aktiver** Entwicklung.
+- ⚠️ Erwarte Fehler und Änderungen mit Breaking-Changes.
+- ⚠️ **Nutze die App auf keinen Fall als einziges Speichermedium für deine Fotos und Videos.**
+- ⚠️ Befolge immer die [3-2-1](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) Backup Regel für deine wertvollen Fotos und Videos!
+
+## Inhalt
+
+- [Offizielle Dokumentation](https://immich.app/docs)
+- [Roadmap](https://github.com/orgs/immich-app/projects/1)
+- [Demo](#demo)
+- [Funktionen](#funktionen)
+- [Einführung](https://immich.app/docs/overview/introduction)
+- [Installation](https://immich.app/docs/install/requirements)
+- [Beitragsrichtlinien](https://immich.app/docs/overview/support-the-project)
+- [Unterstütze das Projekt](#unterstütze-das-projekt)
+
+## Dokumentation
+
+Die Hauptdokumentation, inklusive Installationsanleitungen, ist unter https://immich.app zu finden.
+
+## Demo
+
+Die Web-Demo kannst du unter https://demo.immich.app finden.
+
+Für die Handy-App kannst du `https://demo.immich.app/api` als `Server Endpoint URL` angeben.
+
+```bash title="Demo Credential"
+Die Anmeldedaten
+email: demo@immich.app
+passwort: demo
+```
+
+```
+Spec: Free-tier Oracle VM - Amsterdam - 2.4Ghz quad-core ARM64 CPU, 24GB RAM
+```
+
+## Funktionen
+
+| Funktionen | Mobil | Web |
+| ---------------------------------------------------- | ------ | ----- |
+| Fotos & Videos hochladen und ansehen | Ja | Ja |
+| Automatisches Backup wenn die App offen ist | Ja | n. a. |
+| Selektive Auswahl von Alben zum Backup | Ja | n. a. |
+| Fotos und Videos auf das Gerät herunterladen | Ja | Ja |
+| Unterstützt mehrere Benutzer | Ja | Ja |
+| Album und geteilte Alben | Ja | Ja |
+| Scrollleiste | Ja | Ja |
+| Unterstützt RAW Formate | Ja | Ja |
+| Metadaten anzeigen (EXIF, Karte) | Ja | Ja |
+| Suchen nach Metadaten, Objekten, Gesichtern und CLIP | Ja | Ja |
+| Administrative Funktionen (Nutzerverwaltung) | Nein | Ja |
+| Backup im Hintergrund | Ja | n. a. |
+| Virtuelles Scrollen | Ja | Ja |
+| OAuth Unterstützung | Ja | Ja |
+| API-Schlüssel | n. a. | Ja |
+| LivePhoto/MotionPhoto Backup und Wiedergabe | Ja | Ja |
+| Benutzerdefinierte Speicherstruktur | Ja | Ja |
+| Öffentliches Teilen | Nein | Ja |
+| Archive und Favoriten | Ja | Ja |
+| Globale Karte | Ja | Ja |
+| Teilen mit Partner | Ja | Ja |
+| Gesichtserkennung und Gruppierung | Ja | Ja |
+| Rückblicke (heute vor x Jahren) | Ja | Ja |
+| Offline Unterstützung | Ja | Nein |
+| Schreibgeschützte Gallerie | Ja | Ja |
+| Gestapelte Bilder | Ja | Ja |
+
+## Unterstütze das Projekt
+
+Ich habe mich diesem Projekt verpflichtet und werde nicht aufgeben. Ich werde die Dokumentation weiter aktualisieren, neue Funktionen hinzufügen und Fehler beheben. Allerdings kann ich das nicht alleine schaffen. Daher brauche ich Eure Unterstützung mir zusätzliche Motivation zu geben um weiterzumachen.
+
+Wie unsere Gastgeber in der [selfhosted.show - In der Episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) gesagt haben, ist dies ein riesiges Unterfangen, welchem das Team und ich uns annehmen. In Zukunft würde ich liebend gerne Vollzeit an dem Projekt arbeiten und bitte daher um Eure Unterstützung.
+
+Wenn Du denkst, dass dies die richtige Sache ist und dich selbst die App für eine längere Zeit nutzen siehst, dann denke bitte darüber nach das Projekt mit einer der unten aufgelisteten Optionen zu unterstützen.
+
+### Spenden
+
+- [Monatliche Spende](https://github.com/sponsors/alextran1502) via GitHub Sponsors
+- [Einmalige Spende](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) via GitHub Sponsors
+- [Librepay](https://liberapay.com/alex.tran1502/)
+- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
+- Bitcoin: 1FvEp6P6NM8EZEkpGUFAN2LqJ1gxusNxZX
+- ZCash: u1smm4wvqegcp46zss2jf5xptchgeczp4rx7a0wu3mermf2wxahm26yyz5w9mw3f2p4emwlljxjumg774kgs8rntt9yags0whnzane4n67z4c7gppq4yyvcj404ne3r769prwzd9j8ntvqp44fa6d67sf7rmcfjmds3gmeceff4u8e92rh38nd30cr96xw6vfhk6scu4ws90ldzupr3sz
+
+## Unterstützer
+
+
+
diff --git a/README_es_ES.md b/README_es_ES.md
index fc1b10201b..c7a6f6910f 100644
--- a/README_es_ES.md
+++ b/README_es_ES.md
@@ -24,6 +24,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_fr_FR.md b/README_fr_FR.md
index ed76d7a92c..93d01edfc4 100644
--- a/README_fr_FR.md
+++ b/README_fr_FR.md
@@ -24,6 +24,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_it_IT.md b/README_it_IT.md
index 9fb7b8ee28..0c7d20d735 100644
--- a/README_it_IT.md
+++ b/README_it_IT.md
@@ -24,6 +24,7 @@
Français
日本語
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_ja_JP.md b/README_ja_JP.md
index 3d339db4e6..557e0e3585 100644
--- a/README_ja_JP.md
+++ b/README_ja_JP.md
@@ -24,6 +24,7 @@
Français
Italiano
한국어
+ Deutsch
Nederlands
Türkçe
中文
diff --git a/README_ko_KR.md b/README_ko_KR.md
index e2dcc4c471..a6a49ae3d4 100644
--- a/README_ko_KR.md
+++ b/README_ko_KR.md
@@ -24,6 +24,7 @@
Français
Italiano
日本語
+ Deutsch
Nederlands
Türkçe
中文
@@ -113,4 +114,4 @@ password: demo
- [Librepay](https://liberapay.com/alex.tran1502/)
- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
- Bitcoin: 1FvEp6P6NM8EZEkpGUFAN2LqJ1gxusNxZX
-- ZCash: u1smm4wvqegcp46zss2jf5xptchgeczp4rx7a0wu3mermf2wxahm26yyz5w9mw3f2p4emwlljxjumg774kgs8rntt9yags0whnzane4n67z4c7gppq4yyvcj404ne3r769prwzd9j8ntvqp44fa6d67sf7rmcfjmds3gmeceff4u8e92rh38nd30cr96xw6vfhk6scu4ws90ldzupr3sz
\ No newline at end of file
+- ZCash: u1smm4wvqegcp46zss2jf5xptchgeczp4rx7a0wu3mermf2wxahm26yyz5w9mw3f2p4emwlljxjumg774kgs8rntt9yags0whnzane4n67z4c7gppq4yyvcj404ne3r769prwzd9j8ntvqp44fa6d67sf7rmcfjmds3gmeceff4u8e92rh38nd30cr96xw6vfhk6scu4ws90ldzupr3sz
diff --git a/README_nl_NL.md b/README_nl_NL.md
index cee5d6307b..129d84ebc2 100644
--- a/README_nl_NL.md
+++ b/README_nl_NL.md
@@ -25,6 +25,7 @@
Italiano
日本語
한국어
+ Deutsch
Türkçe
中文
diff --git a/README_tr_TR.md b/README_tr_TR.md
index 471d7d3142..c5d221182c 100644
--- a/README_tr_TR.md
+++ b/README_tr_TR.md
@@ -25,6 +25,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
中文
diff --git a/README_zh_CN.md b/README_zh_CN.md
index 3daeba7f7d..16d4248eaa 100644
--- a/README_zh_CN.md
+++ b/README_zh_CN.md
@@ -29,6 +29,7 @@
Italiano
日本語
한국어
+ Deutsch
Nederlands
Türkçe
diff --git a/cli/package-lock.json b/cli/package-lock.json
index c64010a6c6..4547cfc3c1 100644
--- a/cli/package-lock.json
+++ b/cli/package-lock.json
@@ -1567,9 +1567,9 @@
}
},
"node_modules/@types/jest": {
- "version": "29.5.9",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz",
- "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==",
+ "version": "29.5.10",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz",
+ "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==",
"dev": true,
"dependencies": {
"expect": "^29.0.0",
@@ -1604,9 +1604,9 @@
}
},
"node_modules/@types/node": {
- "version": "20.9.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz",
- "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==",
+ "version": "20.9.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz",
+ "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -7673,9 +7673,9 @@
}
},
"@types/jest": {
- "version": "29.5.9",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz",
- "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==",
+ "version": "29.5.10",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz",
+ "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==",
"dev": true,
"requires": {
"expect": "^29.0.0",
@@ -7710,9 +7710,9 @@
}
},
"@types/node": {
- "version": "20.9.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz",
- "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==",
+ "version": "20.9.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz",
+ "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==",
"dev": true,
"requires": {
"undici-types": "~5.26.4"
diff --git a/mobile/lib/modules/asset_viewer/services/image_viewer.service.dart b/mobile/lib/modules/asset_viewer/services/image_viewer.service.dart
index 3a356c8404..27be7029de 100644
--- a/mobile/lib/modules/asset_viewer/services/image_viewer.service.dart
+++ b/mobile/lib/modules/asset_viewer/services/image_viewer.service.dart
@@ -1,6 +1,5 @@
import 'dart:io';
-import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/providers/api.provider.dart';
@@ -84,8 +83,8 @@ class ImageViewerService {
}
return entity != null;
}
- } catch (e) {
- debugPrint("Error saving file $e");
+ } catch (error, stack) {
+ _log.severe("Error saving file ${error.toString()}", error, stack);
return false;
}
}
diff --git a/web/package-lock.json b/web/package-lock.json
index eacf643d6c..67359aef7c 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -56,7 +56,7 @@
"prettier-plugin-svelte": "^2.10.1",
"svelte": "^4.0.5",
"svelte-check": "^3.4.3",
- "svelte-jester": "^2.3.2",
+ "svelte-jester": "^3.0.0",
"svelte-preprocess": "^5.0.3",
"tailwind-merge": "^1.14.0",
"tailwindcss": "^3.2.7",
@@ -11301,12 +11301,13 @@
}
},
"node_modules/svelte-jester": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/svelte-jester/-/svelte-jester-2.3.2.tgz",
- "integrity": "sha512-JtxSz4FWAaCRBXbPsh4LcDs4Ua7zdXgLC0TZvT1R56hRV0dymmNP+abw67DTPF7sQPyNxWsOKd0Sl7Q8SnP8kg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/svelte-jester/-/svelte-jester-3.0.0.tgz",
+ "integrity": "sha512-V279cL906++hn00hkL1xAr/y5OjjxPYWic1g0yTJFmqdbdWKthdcuP3XBvmmwP9AzFBT51DlPgXz56HItle1Ug==",
"dev": true,
"engines": {
- "node": ">=14"
+ "node": ">=16",
+ "pnpm": "^8.0.0"
},
"peerDependencies": {
"jest": ">= 27",
diff --git a/web/package.json b/web/package.json
index 7939e00dc0..79fb3d1eeb 100644
--- a/web/package.json
+++ b/web/package.json
@@ -49,7 +49,7 @@
"prettier-plugin-svelte": "^2.10.1",
"svelte": "^4.0.5",
"svelte-check": "^3.4.3",
- "svelte-jester": "^2.3.2",
+ "svelte-jester": "^3.0.0",
"svelte-preprocess": "^5.0.3",
"tailwind-merge": "^1.14.0",
"tailwindcss": "^3.2.7",
diff --git a/web/src/lib/components/shared-components/gallery-viewer/gallery-viewer.svelte b/web/src/lib/components/shared-components/gallery-viewer/gallery-viewer.svelte
index fdd3f97b8f..dc62bc8dad 100644
--- a/web/src/lib/components/shared-components/gallery-viewer/gallery-viewer.svelte
+++ b/web/src/lib/components/shared-components/gallery-viewer/gallery-viewer.svelte
@@ -7,6 +7,7 @@
import { flip } from 'svelte/animate';
import { getThumbnailSize } from '$lib/utils/thumbnail-util';
import { assetViewingStore } from '$lib/stores/asset-viewing.store';
+ import { onDestroy } from 'svelte';
export let assets: AssetResponseDto[];
export let selectedAssets: Set = new Set();
@@ -80,6 +81,10 @@
$showAssetViewer = false;
history.pushState(null, '', `${$page.url.pathname}`);
};
+
+ onDestroy(() => {
+ $showAssetViewer = false;
+ });
{#if assets.length > 0}
diff --git a/web/src/routes/(user)/albums/[albumId]/+page.svelte b/web/src/routes/(user)/albums/[albumId]/+page.svelte
index 646b90335d..d999c9b577 100644
--- a/web/src/routes/(user)/albums/[albumId]/+page.svelte
+++ b/web/src/routes/(user)/albums/[albumId]/+page.svelte
@@ -123,7 +123,7 @@
afterNavigate(({ from }) => {
assetViewingStore.showAssetViewer(false);
- let url: string | undefined = from?.url.pathname;
+ let url: string | undefined = from?.url?.pathname;
if (from?.route.id === '/(user)/search') {
url = from.url.href;
diff --git a/web/src/routes/(user)/search/+page.svelte b/web/src/routes/(user)/search/+page.svelte
index e5961c8f04..557707b0de 100644
--- a/web/src/routes/(user)/search/+page.svelte
+++ b/web/src/routes/(user)/search/+page.svelte
@@ -72,7 +72,7 @@
afterNavigate(({ from }) => {
// Prevent setting previousRoute to the current page.
- if (from && from.route.id !== $page.route.id) {
+ if (from?.url && from.route.id !== $page.route.id) {
previousRoute = from.url.href;
}
@@ -149,7 +149,7 @@
{/if}
- {#if data.results?.assets?.items.length > 0}
+ {#if searchResultAssets.length > 0}