diff --git a/api/graphql/generated.go b/api/graphql/generated.go
index 7c02b83..93539f9 100644
--- a/api/graphql/generated.go
+++ b/api/graphql/generated.go
@@ -1849,6 +1849,7 @@ enum LanguageTranslation {
   Danish,
   Spanish,
   Polish,
+  German,
 }
 
 type UserPreferences {
diff --git a/api/graphql/models/generated.go b/api/graphql/models/generated.go
index 79c81d3..4741dd7 100644
--- a/api/graphql/models/generated.go
+++ b/api/graphql/models/generated.go
@@ -78,6 +78,7 @@ const (
 	LanguageTranslationDanish  LanguageTranslation = "Danish"
 	LanguageTranslationSpanish LanguageTranslation = "Spanish"
 	LanguageTranslationPolish  LanguageTranslation = "Polish"
+	LanguageTranslationGerman  LanguageTranslation = "German"
 )
 
 var AllLanguageTranslation = []LanguageTranslation{
@@ -88,11 +89,12 @@ var AllLanguageTranslation = []LanguageTranslation{
 	LanguageTranslationDanish,
 	LanguageTranslationSpanish,
 	LanguageTranslationPolish,
+	LanguageTranslationGerman,
 }
 
 func (e LanguageTranslation) IsValid() bool {
 	switch e {
-	case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish, LanguageTranslationSpanish, LanguageTranslationPolish:
+	case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish, LanguageTranslationSpanish, LanguageTranslationPolish, LanguageTranslationGerman:
 		return true
 	}
 	return false
diff --git a/api/graphql/schema.graphql b/api/graphql/schema.graphql
index 86686ff..89e0824 100644
--- a/api/graphql/schema.graphql
+++ b/api/graphql/schema.graphql
@@ -229,6 +229,7 @@ enum LanguageTranslation {
   Danish,
   Spanish,
   Polish,
+  German,
 }
 
 type UserPreferences {
diff --git a/ui/__generated__/globalTypes.ts b/ui/__generated__/globalTypes.ts
index 3d05a57..ad70570 100644
--- a/ui/__generated__/globalTypes.ts
+++ b/ui/__generated__/globalTypes.ts
@@ -11,6 +11,7 @@ export enum LanguageTranslation {
   Danish = 'Danish',
   English = 'English',
   French = 'French',
+  German = 'German',
   Italian = 'Italian',
   Polish = 'Polish',
   Spanish = 'Spanish',
diff --git a/ui/babel.config.js b/ui/babel.config.js
index a1f4481..6a12052 100644
--- a/ui/babel.config.js
+++ b/ui/babel.config.js
@@ -13,7 +13,7 @@ module.exports = function (api) {
       plugins.push([
         'i18next-extract',
         {
-          locales: ['en', 'da', 'fr', 'sv', 'es', 'it', 'pl'],
+          locales: ['en', 'da', 'fr', 'sv', 'es', 'it', 'pl', 'de'],
           defaultValue: null,
         },
       ])
diff --git a/ui/extractedTranslations/de/translation.json b/ui/extractedTranslations/de/translation.json
new file mode 100644
index 0000000..4be024b
--- /dev/null
+++ b/ui/extractedTranslations/de/translation.json
@@ -0,0 +1,254 @@
+{
+  "album_filter": {
+    "only_favorites": "Nur Favoriten anzeigen",
+    "sort_by": "Sortieren nach",
+    "sorting_options": {
+      "date_imported": "Importdatum",
+      "date_shot": "Aufnahmedatum",
+      "title": "Titel",
+      "type": "Typ"
+    }
+  },
+  "albums_page": {
+    "title": "Alben"
+  },
+  "general": {
+    "action": {
+      "add": "Hinzufügen",
+      "cancel": "Abbrechen",
+      "delete": "Löschen",
+      "more": "Mehr",
+      "remove": "Entfernen",
+      "save": "Speichern"
+    },
+    "loading": {
+      "album": "Lade Album",
+      "default": "Lade...",
+      "media": "Lade Medien",
+      "page": "Lade Seite",
+      "paginate": {
+        "faces": "Lade mehr Personen",
+        "media": "Lade mehr Medien"
+      },
+      "shares": "Lade Freigaben...",
+      "timeline": "Lade Timeline"
+    }
+  },
+  "header": {
+    "search": {
+      "loading": "Lade Ergebnisse...",
+      "no_results": "Keine Ergebnisse gefunden",
+      "placeholder": "Suche",
+      "result_type": {
+        "albums": "Alben",
+        "photos": "Fotos"
+      }
+    }
+  },
+  "login_page": {
+    "field": {
+      "password": "Passwort",
+      "submit": "Einloggen",
+      "username": "Benutzername"
+    },
+    "initial_setup": {
+      "field": {
+        "photo_path": {
+          "label": "Foto Pfad",
+          "placeholder": "/pfad/zu/fotos"
+        },
+        "submit": "Photoview einrichten"
+      },
+      "title": "Einrichtung"
+    },
+    "welcome": "Willkommen zu Photoview"
+  },
+  "meta": {
+    "description": "Einfache und nutzerfreundliche Fotogallerie für Homeserver"
+  },
+  "people_page": {
+    "face_group": {
+      "label_placeholder": "Zuordnung",
+      "unlabeled": "Nicht zugeordnet"
+    },
+    "recognize_unlabeled_faces_button": "Nicht zugeordnete Gesichter erkennen"
+  },
+  "photos_page": {
+    "title": "Fotos"
+  },
+  "places_page": {
+    "title": "Orte"
+  },
+  "routes": {
+    "page_not_found": "Seite nicht gefunden"
+  },
+  "settings": {
+    "concurrent_workers": {
+      "description": "Die maximale erlaubte Anzahl an gleichzeitig laufenden Scanner Jobs",
+      "title": "Anzahl an Workern"
+    },
+    "logout": "Ausloggen",
+    "periodic_scanner": {
+      "checkbox_label": "Kontinuierlichen Scanner aktivieren",
+      "field": {
+        "description": "Intervall, in dem automatische Scans aller Nutzer wiederholt werden",
+        "label": "Intervall - kontinuierlicher Scanner"
+      },
+      "interval_unit": {
+        "days": "Tage",
+        "hour": "Stunden",
+        "minutes": "Minuten",
+        "months": "Monate",
+        "seconds": "Sekunden"
+      },
+      "title": "Kontinuierlicher Scanner"
+    },
+    "scanner": {
+      "description": "Neue und aktualisierte Medien aller Benutzer scannen",
+      "scan_all_users": "Alle Benutzer scannen",
+      "title": "Scanner"
+    },
+    "user_preferences": {
+      "change_language": {
+        "description": "Ändert die Spracheinstellungen der Website für diesen Benutzer",
+        "label": "Sprache"
+      },
+      "language_selector": {
+        "placeholder": "Sprache auswählen"
+      },
+      "title": "Persönliche Einstelungen"
+    },
+    "users": {
+      "add_user": {
+        "submit": "Benutzer hinzufügen"
+      },
+      "confirm_delete_user": {
+        "action": "Lösche {{user}}",
+        "description": "<0>Du bist dabei, den Nutzer <1></1> endgültig zu löschen.</0><p>Diese Aktion kann nicht rückgängig gemacht werden. Bist du sicher?</p>",
+        "title": "Benutzer löschen"
+      },
+      "password_reset": {
+        "description": "Passwort von Benutzer <1></1> aktualisieren",
+        "form": {
+          "label": "Neues Passwort",
+          "placeholder": "Passwort",
+          "submit": "Passwört aktualisieren"
+        },
+        "title": "Passwort aktualisieren"
+      },
+      "table": {
+        "column_names": {
+          "action": "Aktion",
+          "admin": "Administrator",
+          "photo_path": "Pfad der Medien",
+          "username": "Benutzername"
+        },
+        "new_user": "Neuer Benutzer",
+        "row": {
+          "action": {
+            "change_password": "Passwort aktualisieren",
+            "delete": "Löschen",
+            "edit": "Bearbeiten",
+            "scan": "Scannen"
+          }
+        }
+      },
+      "title": "Benutzer"
+    }
+  },
+  "share_page": {
+    "media": {
+      "title": "Freigegebene Medien"
+    },
+    "protected_share": {
+      "description": "Diese Freigabe ist passwortgeschützt.",
+      "title": "Passwortgeschützte Freigabe"
+    },
+    "share_not_found": "Freigabe nicht gefunden",
+    "share_not_found_description": "Möglicherweise ist die Freigabe abgelaufen oder wurde gelöscht.",
+    "wrong_password": "Falsches Passwort, bitte erneut probieren."
+  },
+  "sidebar": {
+    "album": {
+      "title": "Album Optionen"
+    },
+    "download": {
+      "filesize": {
+        "byte": "{{count}} Byte",
+        "byte_plural": "{{count}} Bytes",
+        "giga_byte": "{{count}} GB",
+        "kilo_byte": "{{count}} KB",
+        "mega_byte": "{{count}} MB",
+        "tera_byte": "{{count}} TB"
+      },
+      "table_columns": {
+        "dimensions": "Dimension",
+        "file_size": "Dateigröße",
+        "file_type": "Typ",
+        "name": "Name"
+      },
+      "title": "Download"
+    },
+    "media": {
+      "exif": {
+        "exposure_program": {
+          "action_program": "Action (kurze Verschlusszeit)",
+          "aperture_priority": "Blende Priorität",
+          "bulb": "Glühbirne",
+          "creative_program": "Creative (lange Verschlusszeit)",
+          "landscape_mode": "Querformat",
+          "manual": "Manuell",
+          "normal_program": "Normalprogramm",
+          "not_defined": "Nicht definiert",
+          "portrait_mode": "Hochformat",
+          "shutter_priority": "Verschlusszeit Priorität"
+        },
+        "flash": {
+          "auto": "Auto",
+          "did_not_fire": "Nicht gezündet",
+          "fired": "Gezündet",
+          "no_flash": "Kein Blitz",
+          "no_flash_function": "Keine Blitz Funktionalität",
+          "off": "Aus",
+          "on": "An",
+          "red_eye_reduction": "Rote-Augen-Korrektur",
+          "return_detected": "Reflektion erkannt",
+          "return_not_detected": "Reflektion nicht erkannt"
+        },
+        "name": {
+          "aperture": "Blende",
+          "camera": "Kamera",
+          "date_shot": "Aufnahmedatum",
+          "exposure": "Belichtung",
+          "exposure_program": "Programm",
+          "flash": "Blitz",
+          "focal_length": "Brennweite",
+          "iso": "ISO",
+          "lens": "Objektiv",
+          "maker": "Hersteller"
+        }
+      }
+    },
+    "sharing": {
+      "add_share": "Freigabe hinzufügen",
+      "copy_link": "Link kopieren",
+      "no_shares_found": "Keine Freigaben gefunden",
+      "public_link": "Öffentlicher Link",
+      "table_header": "Öffentliche Freigabe",
+      "title": "Freigabeoptionen"
+    }
+  },
+  "sidemenu": {
+    "albums": "Alben",
+    "people": "Personen",
+    "photos": "Fotos",
+    "places": "Orte",
+    "settings": "Einstellungen"
+  },
+  "title": {
+    "loading_album": "Lade Album",
+    "login": "Login",
+    "people": "Personen",
+    "settings": "Einstellungen"
+  }
+}
diff --git a/ui/src/Pages/SettingsPage/UserPreferences.tsx b/ui/src/Pages/SettingsPage/UserPreferences.tsx
index d7caccc..e573fb8 100644
--- a/ui/src/Pages/SettingsPage/UserPreferences.tsx
+++ b/ui/src/Pages/SettingsPage/UserPreferences.tsx
@@ -24,6 +24,7 @@ const languagePreferences = [
   { key: 5, text: 'Español', flag: 'es', value: LanguageTranslation.Spanish },
   { key: 6, text: 'polski', flag: 'pl', value: LanguageTranslation.Polish },
   { key: 7, text: 'Italiano', flag: 'it', value: LanguageTranslation.Italian },
+  { key: 8, text: 'Deutsch', flag: 'de', value: LanguageTranslation.German },
 ]
 
 const CHANGE_USER_PREFERENCES = gql`
diff --git a/ui/src/localization.ts b/ui/src/localization.ts
index 4f6cba0..6d1b640 100644
--- a/ui/src/localization.ts
+++ b/ui/src/localization.ts
@@ -100,6 +100,12 @@ export const loadTranslations = () => {
           i18n.changeLanguage('pl')
         })
         return
+      case LanguageTranslation.German:
+        import('../extractedTranslations/de/translation.json').then(german => {
+          i18n.addResourceBundle('de', 'translation', german)
+          i18n.changeLanguage('de')
+        })
+        return
     }
 
     exhaustiveCheck(language)
