Migrate from Vite to Next.js 15 with SSR

- Replace Vite + React Router with Next.js 15 App Router
- Implement i18n with next-intl (URL-based: /de, /en, /sr)
- Add SSR/SSG for all pages (48 static pages generated)
- Setup Supabase SSR client for auth
- Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms
- Add Docker support with standalone output
- Replace i18next with next-intl JSON translations
- Use next/image for optimized images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-17 01:00:33 +01:00
co-authored by Claude Opus 4.5
parent a66f51b9a2
commit b1ec7b4d61
281 changed files with 8024 additions and 8901 deletions
+99
View File
@@ -0,0 +1,99 @@
export const common = {
// SEO & Meta
siteTitle: 'Damjan Savić - Digital Solutions & JTL Integration',
siteDescription: 'Entwickler individueller Lösungen zur Automatisierung von Prozessen',
// Navigation
nav: {
home: 'Start',
about: 'Über mich',
services: 'Leistungen',
portfolio: 'Portfolio',
blog: 'Blog',
contact: 'Kontakt'
},
// Common Actions
actions: {
readMore: 'Weiterlesen',
viewMore: 'Mehr anzeigen',
viewAll: 'Alle anzeigen',
back: 'Zurück',
close: 'Schließen',
submit: 'Absenden',
loading: 'Lädt...'
},
// UI Components
ui: {
published: 'Veröffentlicht am',
lastUpdated: 'Zuletzt aktualisiert am',
category: 'Kategorie',
categories: 'Kategorien',
tag: 'Tag',
tags: 'Tags',
author: 'Autor',
minuteRead: 'Minuten Lesezeit',
tableOfContents: 'Inhaltsverzeichnis'
},
// Error Messages
errors: {
generic: 'Ein Fehler ist aufgetreten',
notFound: 'Seite nicht gefunden',
loading: 'Fehler beim Laden',
return: 'Zurück zur Startseite'
},
// Loading States
loading: {
content: 'Inhalt wird geladen',
page: 'Seite wird geladen',
processing: 'Wird verarbeitet'
},
// Dates
dates: {
months: {
long: [
'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
],
short: [
'Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'
]
},
weekdays: {
long: [
'Sonntag', 'Montag', 'Dienstag', 'Mittwoch',
'Donnerstag', 'Freitag', 'Samstag'
],
short: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
}
},
// Social Media
social: {
followMe: 'Folgen Sie mir auf',
shareOn: 'Teilen auf',
linkedin: 'LinkedIn',
github: 'GitHub',
email: 'E-Mail'
},
// Contact Form
contact: {
title: 'Kontakt',
name: 'Name',
email: 'E-Mail',
message: 'Nachricht',
submit: 'Nachricht senden',
success: 'Ihre Nachricht wurde erfolgreich gesendet',
error: 'Es gab einen Fehler beim Senden Ihrer Nachricht'
},
// Accessibility
a11y: {
skipToContent: 'Zum Hauptinhalt springen',
menuOpen: 'Menü öffnen',
menuClose: 'Menü schließen',
darkMode: 'Dark Mode umschalten',
carousel: {
next: 'Nächstes Bild',
previous: 'Vorheriges Bild'
}
}
} as const;
export type CommonTranslations = typeof common;