diff --git a/locales/de.json b/locales/de.json
new file mode 100644
index 00000000..b4c03fa9
--- /dev/null
+++ b/locales/de.json
@@ -0,0 +1,95 @@
+{
+ "common.close": "Schließen",
+ "common.copied": "Kopiert!",
+ "common.copy": "Kopieren",
+ "common.coverimg": "Titelbild",
+ "common.create": "Erstellen",
+ "common.creating": "Wird erstellt...",
+ "common.datetimeformat": "dddd D MMMM YYYY H:mm",
+ "common.emailaddr": "E-Mail-Adresse",
+ "common.eventend": "Endet",
+ "common.eventgroupid": "Veranstaltungsgruppen-ID",
+ "common.eventgroupname": "Name der Veranstaltungsgruppe",
+ "common.eventgroups": "Veranstaltungsgruppen",
+ "common.eventlocation": "Ort",
+ "common.eventname": "Veranstaltungsname",
+ "common.eventstart": "Beginnt",
+ "common.timezone": "Zeitzone",
+ "common.year-month-format": "MMMM YYYY",
+ "common.youremail": "Deine E-Mail",
+ "config.defaultinstancedesc": "**{{ siteName }}** läuft auf Gathio — einer einfachen, föderierten, datenschutzfreundlichen Plattform zum Hosten von Veranstaltungen.",
+ "config.instancerule.creatoremail-false": "Jeder kann Veranstaltungen und Gruppen erstellen",
+ "config.instancerule.creatoremail-true": "Nur bestimmte Personen können Veranstaltungen und Gruppen erstellen",
+ "config.instancerule.deleteafterdays-false": "Veranstaltungen sind dauerhaft und werden nie automatisch gelöscht",
+ "config.instancerule.deleteafterdays-true": "Veranstaltungen werden automatisch {{ days }} Tage nach ihrem Ende gelöscht",
+ "config.instancerule.isfederated-false": "Diese Instanz föderiert nicht mit anderen Instanzen",
+ "config.instancerule.isfederated-true": "Diese Instanz föderiert mit anderen Instanzen über ActivityPub",
+ "config.instancerule.showpubliceventlist-false": "Veranstaltungen und Gruppen sind nur über Direktlink zugänglich",
+ "config.instancerule.showpubliceventlist-true": "Öffentliche Veranstaltungen und Gruppen werden auf der Startseite angezeigt",
+ "frontend.dateformat": "dddd D MMMM YYYY",
+ "frontend.displaydate-days": "{{ startdate }} um {{ starttime }} - {{ enddate }} um {{ endtime }} {{ timezone }}",
+ "frontend.displaydate-sameday": "{{ startdate }} von {{ starttime }} bis {{ endtime }} {{ timezone }}",
+ "frontend.elnumber": "({{count}} Personen)",
+ "frontend.eventattendees": "Teilnehmer",
+ "frontend.newevent": "Neue Veranstaltung",
+ "frontend.publicevents": "Öffentliche Veranstaltungen",
+ "frontend.timeformat": "H:mm",
+ "routes.addeventattendeesubject": "Du hast für {{ eventName }} zugesagt",
+ "routes.addeventcommentsubject": "Neuer Kommentar in {{eventName}}",
+ "routes.deleteeventsubject": "{{ eventName }} wurde gelöscht",
+ "routes.event.datetimeformat": "{{thedate, intlDate}}",
+ "routes.event.descriptionchanged": "die Veranstaltungsbeschreibung wurde geändert",
+ "routes.event.difftext": "Diese Veranstaltung wurde gerade mit neuen Informationen aktualisiert.",
+ "routes.event.editedsubject": "{{ eventname }} wurde gerade bearbeitet",
+ "routes.event.endtimechanged": "die Endzeit wurde auf {{ endtime }} geändert",
+ "routes.event.locationchanged": "der Veranstaltungsort wurde auf {{ location }} geändert",
+ "routes.event.namechanged": "der Veranstaltungsname wurde auf {{ eventname }} geändert",
+ "routes.event.starttimechanged": "die Startzeit wurde auf {{ starttime }} geändert",
+ "routes.event.timezonechanged": "die Zeitzone wurde auf {{ timezone }} geändert",
+ "routes.magiclink-invalid": "Dieser magische Link ist ungültig oder abgelaufen. Bitte fordere hier einen neuen an.",
+ "routes.magiclink.mailsubject": "Magischer Link zur Erstellung einer Veranstaltung",
+ "routes.magiclink.provideemail": "Bitte gib eine E-Mail-Adresse an.",
+ "routes.magiclink.requestmlbutton": "Magischen Link anfordern",
+ "routes.magiclink.thanks": "Danke! Wenn diese E-Mail-Adresse Veranstaltungen erstellen darf, solltest du eine E-Mail mit einem magischen Link erhalten.",
+ "routes.removeeventattendeesubject": "Du wurdest von einer Veranstaltung entfernt",
+ "routes.subscribedsubject": "Du hast eine Veranstaltungsgruppe abonniert",
+ "util.validation.eventdata.creatoremail": "E-Mail-Adresse ist ungültig.",
+ "util.validation.eventdata.eventdescription": "Veranstaltungsbeschreibung ist erforderlich.",
+ "util.validation.eventdata.eventend": "Endzeit der Veranstaltung ist erforderlich.",
+ "util.validation.eventdata.eventgroupboolean": "Veranstaltungsgruppen-ID ist erforderlich.",
+ "util.validation.eventdata.eventgroupedittoken": "Bearbeitungscode der Veranstaltungsgruppe ist erforderlich.",
+ "util.validation.eventdata.eventlocation": "Veranstaltungsort ist erforderlich.",
+ "util.validation.eventdata.eventname": "Veranstaltungsname ist erforderlich.",
+ "util.validation.eventdata.eventstart": "Startzeit der Veranstaltung ist erforderlich.",
+ "util.validation.eventdata.eventurl": "Veranstaltungslink ist ungültig.",
+ "util.validation.eventdata.maxattendees": "Maximale Teilnehmerzahl muss eine Zahl sein.",
+ "util.validation.eventdata.maxattendeesboolean": "Maximale Teilnehmerzahl ist erforderlich.",
+ "util.validation.eventdata.timezone": "Zeitzone der Veranstaltung ist erforderlich.",
+ "util.validation.eventtime.endisbefore": "Die Endzeit muss in der Zukunft liegen.",
+ "util.validation.eventtime.endyears": "Die Dauer einer Veranstaltung darf nicht länger als 1 Jahr sein.",
+ "util.validation.eventtime.startisafter": "Die Startzeit muss vor der Endzeit liegen.",
+ "util.validation.eventtime.startisbefore": "Die Startzeit muss in der Zukunft liegen.",
+ "util.validation.groupdata.creatoremail": "E-Mail-Adresse ist ungültig.",
+ "util.validation.groupdata.eventgroupdescription": "Beschreibung der Veranstaltungsgruppe ist erforderlich.",
+ "util.validation.groupdata.eventgroupname": "Name der Veranstaltungsgruppe ist erforderlich.",
+ "util.validation.groupdata.eventgroupurl": "Gruppenlink ist ungültig.",
+ "views.404desc": "Sie hat vielleicht nie existiert oder wurde vom Server entfernt. Nicht verzweifeln – warum nicht eine neue erstellen? Ich würde zu deinem Okarina-Konzert kommen.",
+ "views.404notfound": "Veranstaltung nicht gefunden!",
+ "views.createeventmagiclink.requestmlcontact": "Wenn du auf Probleme stößt, kontaktiere bitte den Administrator der Instanz.",
+ "views.createeventmagiclink.requestmldesc": "Der Administrator dieser Instanz hat das Erstellen von Veranstaltungen auf bestimmte E-Mail-Adressen beschränkt. Wenn deine E-Mail-Adresse berechtigt ist, erhältst du einen magischen Link. Wenn nicht, bekommst du nichts.",
+ "views.createeventmagiclink.requestmltitle": "Fordere einen Link zur Erstellung einer neuen Veranstaltung an",
+ "views.del": "Löschen",
+ "views.edittoken": "Bearbeitungspasswort eingeben",
+ "views.edittokendesc": "Gib das Bearbeitungspasswort ein, das du per E-Mail erhalten hast oder das dir bei der Erstellung der Veranstaltung angezeigt wurde.",
+ "views.emails.addeventattendee.clicktocancel": "Klicke auf diesen Link",
+ "views.emails.addeventattendee.dontknowhtml": "Falls du dich nicht auf {{ siteName }} zu einer Veranstaltung angemeldet hast, könnte jemand versehentlich deine E-Mail anstelle seiner eigenen eingegeben haben. Wenn du nicht teilnehmen möchtest, nutze das obenstehende Löschpasswort, um dich von der Veranstaltungsseite zu entfernen.",
+ "views.emails.addeventattendee.eventlink": "Folge diesem Link, um die Veranstaltungsseite jederzeit zu öffnen",
+ "views.emails.addeventattendee.preface": "Du hast dich gerade auf {{ siteName }} zu einer Veranstaltung angemeldet. Vielen Dank! Wir senden dir eine weitere E-Mail, falls es Aktualisierungen gibt. Deine E-Mail wird automatisch aus der Datenbank entfernt, sobald die Veranstaltung beendet ist.",
+ "views.emails.addeventattendee.removapasswordhtml": "Du kannst auch zur Veranstaltungsseite gehen und dieses Löschpasswort verwenden",
+ "views.emails.addeventattendee.removelink": "Möchtest du dich von dieser Veranstaltung entfernen? Klicke auf diesen Link",
+ "views.emails.addeventattendee.removepassword": "Du kannst auch zur Veranstaltungsseite gehen und dieses Löschpasswort verwenden",
+ "views.emails.addeventattendee.toremove": "Möchtest du dich von dieser Veranstaltung entfernen?",
+ "views.emails.addeventcomment.link": "Hier klicken, um den Kommentar zu sehen",
+ "views.emails.addeventcomment.preface": "{{ commentAuthor }} hat gerade einen Kommentar zu einer Veranstaltung gepostet, an der du auf {{ siteName }} teilnimmst.",
+ "views.emails.addeventcomment.prefacehtml": "{{ commentAuthor }} hat gerade einen Kommentar zu einer Veranstaltung gepostet, an der du auf {{ siteName }} teilnimmst."
+}
diff --git a/src/app.ts b/src/app.ts
index a649552a..2b1e5498 100755
--- a/src/app.ts
+++ b/src/app.ts
@@ -47,8 +47,8 @@ async function initializeApp() {
loadPath: path.join(getLocalesPath(), "{{lng}}.json"),
},
fallbackLng: "en",
- preload: ["en", "ja"],
- supportedLngs: ["en", "ja"],
+ preload: ["en", "ja", "de"],
+ supportedLngs: ["en", "ja", "de"],
nonExplicitSupportedLngs: true,
load: "languageOnly",
debug: false,