- Add POST /api/n8n/hardcover/sync-books — n8n calls this after detecting
finished books in Hardcover. Authenticates via N8N_SECRET_TOKEN/N8N_API_KEY,
deduplicates by hardcover_id, creates new book_reviews entries in Directus.
- Add getBookReviewByHardcoverId() + createBookReview() to lib/directus.ts.
Check uses GraphQL filter; create uses Directus REST POST /items/book_reviews.
- ReadBooks: replace silent return null with a visible empty state so the
section stays visible with a hint until the n8n sync populates it.
- Projects: add "No projects yet." placeholder instead of blank grid when
both Directus and PostgreSQL return no data.
- Add home.about.readBooks.empty i18n key (EN + DE).
n8n workflow setup:
Schedule → HTTP Hardcover GraphQL (books_read) → Code (transform) →
POST /api/n8n/hardcover/sync-books with array of { hardcover_id, title,
author, image, rating, finished_at }
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
160 lines
6.2 KiB
JSON
160 lines
6.2 KiB
JSON
{
|
||
"nav": {
|
||
"home": "Start",
|
||
"about": "Über mich",
|
||
"projects": "Projekte",
|
||
"contact": "Kontakt"
|
||
},
|
||
"common": {
|
||
"back": "Zurück",
|
||
"backToHome": "Zurück zur Startseite",
|
||
"backToProjects": "Zurück zu den Projekten",
|
||
"viewAllProjects": "Alle Projekte ansehen",
|
||
"loading": "Lädt..."
|
||
},
|
||
"consent": {
|
||
"title": "Datenschutz-Einstellungen",
|
||
"description": "Wir nutzen optionale Dienste (Analytics und Chat), um die Seite zu verbessern. Du kannst deine Auswahl jederzeit ändern.",
|
||
"essential": "Essentiell",
|
||
"analytics": "Analytics",
|
||
"chat": "Chatbot",
|
||
"alwaysOn": "Immer aktiv",
|
||
"acceptAll": "Alles akzeptieren",
|
||
"acceptSelected": "Auswahl akzeptieren",
|
||
"rejectAll": "Alles ablehnen",
|
||
"hide": "Ausblenden"
|
||
},
|
||
"home": {
|
||
"hero": {
|
||
"features": {
|
||
"f1": "Next.js & Flutter",
|
||
"f2": "Docker Swarm & CI/CD",
|
||
"f3": "Self-Hosted Infrastruktur"
|
||
},
|
||
"description": "Ich bin Dennis – Student aus Osnabrück und leidenschaftlicher Self-Hoster. Ich entwickle Full-Stack Apps und sorge am liebsten selbst dafür, dass sie auf meiner eigenen Infrastruktur perfekt laufen.",
|
||
"ctaWork": "Meine Projekte",
|
||
"ctaContact": "Kontakt"
|
||
},
|
||
"about": {
|
||
"title": "Hinter den Kulissen",
|
||
"p1": "Schon seit ich meinen ersten eigenen Server aufgesetzt habe, lässt mich das Thema Infrastruktur nicht mehr los. Als Student in Osnabrück verbringe ich meine Zeit am liebsten damit, moderne Web-Apps mit Next.js zu bauen oder mobile Lösungen mit Flutter zu entwickeln.",
|
||
"p2": "Aber für mich hört es nicht beim Code auf: Ich liebe es, meine eigenen Docker-Cluster zu managen, CI/CD-Pipelines zu optimieren und sicherzustellen, dass alles stabil und sicher läuft. DevOps ist für mich kein Job-Titel, sondern eine Lebenseinstellung.",
|
||
"p3": "Wenn die Server einmal ohne mich klarkommen, findet man mich beim Laufen durch Osnabrück, beim Gaming oder beim Experimentieren mit neuen Automationen in n8n.",
|
||
"funFactTitle": "Hardcore analog",
|
||
"funFactBody": "Trotz Cloud und Automatisierung: Meine wichtigsten Pläne entstehen immer noch mit Füller auf Papier. Das ist mein Anker im digitalen Chaos.",
|
||
"techStackTitle": "Mein Tech Stack",
|
||
"hobbiesTitle": "Wenn ich nicht code",
|
||
"techStack": {
|
||
"categories": {
|
||
"frontendMobile": "Frontend & Mobile",
|
||
"backendDevops": "Backend & DevOps",
|
||
"toolsAutomation": "Tools & Automation",
|
||
"securityAdmin": "Security & Admin"
|
||
},
|
||
"items": {
|
||
"selfHostedServices": "Self-hosted Services"
|
||
}
|
||
},
|
||
"hobbies": {
|
||
"selfHosting": "Self-Hosting & DevOps",
|
||
"gaming": "Gaming",
|
||
"gameServers": "Game-Server einrichten",
|
||
"jogging": "Joggen um den Kopf freizubekommen und aktiv bleiben"
|
||
},
|
||
"currentlyReading": {
|
||
"title": "Aktuell am Lesen",
|
||
"progress": "Fortschritt"
|
||
},
|
||
"readBooks": {
|
||
"title": "Gelesene Bücher",
|
||
"finishedAt": "Beendet am",
|
||
"showMore": "{count} weitere anzeigen",
|
||
"showLess": "Weniger anzeigen",
|
||
"empty": "In Hardcover fertig gelesene Bücher erscheinen hier automatisch."
|
||
},
|
||
"activity": {
|
||
"idleStatus": "System im Leerlauf / Geist aktiv",
|
||
"codingNow": "Gerade am Coden",
|
||
"gaming": "Am Zocken",
|
||
"listening": "Hört gerade",
|
||
"inGame": "Im Spiel"
|
||
}
|
||
},
|
||
"projects": {
|
||
"title": "Ausgewählte Projekte",
|
||
"subtitle": "Eine Auswahl an Projekten, an denen ich gearbeitet habe – von Web-Apps bis zu Experimenten.",
|
||
"featured": "Featured",
|
||
"viewAll": "Alle Projekte ansehen"
|
||
},
|
||
"contact": {
|
||
"title": "Kontakt",
|
||
"subtitle": "Du willst zusammenarbeiten oder hast Fragen zu meinen Projekten? Schreib mir gerne!",
|
||
"getInTouch": "Melde dich",
|
||
"getInTouchBody": "Ich bin immer offen für neue Chancen, spannende Projekte oder einfach einen Tech-Talk.",
|
||
"info": {
|
||
"email": "E-Mail",
|
||
"location": "Ort",
|
||
"locationValue": "Osnabrück, Deutschland"
|
||
},
|
||
"form": {
|
||
"title": "Nachricht senden",
|
||
"sending": "Sende Nachricht…",
|
||
"send": "Nachricht senden",
|
||
"labels": {
|
||
"name": "Name",
|
||
"email": "E-Mail",
|
||
"subject": "Betreff",
|
||
"message": "Nachricht",
|
||
"requiredMarker": "*"
|
||
},
|
||
"placeholders": {
|
||
"name": "Dein Name",
|
||
"email": "dein@email.de",
|
||
"subject": "Worum geht’s?",
|
||
"message": "Erzähl mir mehr über dein Projekt oder deine Frage…"
|
||
},
|
||
"errors": {
|
||
"nameRequired": "Name ist erforderlich",
|
||
"nameMin": "Name muss mindestens 2 Zeichen haben",
|
||
"emailRequired": "E-Mail ist erforderlich",
|
||
"emailInvalid": "Bitte eine gültige E-Mail-Adresse eingeben",
|
||
"subjectRequired": "Betreff ist erforderlich",
|
||
"subjectMin": "Betreff muss mindestens 3 Zeichen haben",
|
||
"messageRequired": "Nachricht ist erforderlich",
|
||
"messageMin": "Nachricht muss mindestens 10 Zeichen haben"
|
||
},
|
||
"characters": "{count} Zeichen"
|
||
}
|
||
}
|
||
},
|
||
"projects": {
|
||
"shared": {
|
||
"featured": "Hervorgehoben"
|
||
},
|
||
"list": {
|
||
"title": "Meine Projekte",
|
||
"intro": "Stöbere durch mein Portfolio – von Web-Anwendungen bis Mobile Apps. Jedes Projekt zeigt unterschiedliche Skills und Technologien.",
|
||
"searchPlaceholder": "Projekte durchsuchen...",
|
||
"all": "Alle",
|
||
"noResults": "Keine Projekte passen zu deinen Filtern.",
|
||
"clearFilters": "Filter zurücksetzen"
|
||
},
|
||
"detail": {
|
||
"links": "Projektlinks",
|
||
"liveDemo": "Live-Demo",
|
||
"liveNotAvailable": "Keine Live-Demo verfügbar",
|
||
"viewSource": "Quellcode ansehen",
|
||
"techStack": "Tech-Stack"
|
||
}
|
||
},
|
||
"footer": {
|
||
"role": "Software Engineer",
|
||
"madeIn": "Made in Germany",
|
||
"legalNotice": "Impressum",
|
||
"privacyPolicy": "Datenschutz",
|
||
"privacySettings": "Datenschutz-Einstellungen",
|
||
"privacySettingsTitle": "Datenschutz-Banner wieder anzeigen",
|
||
"builtWith": "Built with"
|
||
}
|
||
}
|