Files
portfolio/messages/de.json
denshooter d7958b3841
All checks were successful
CI / CD / test-build (push) Successful in 11m5s
CI / CD / deploy-dev (push) Successful in 1m18s
CI / CD / deploy-production (push) Has been skipped
feat: Hardcover→Directus book sync + fix empty states for projects/books
- 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>
2026-03-06 00:02:52 +01:00

160 lines
6.2 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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 gehts?",
"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"
}
}