The Hero server component awaited getMessages(locale) which called Directus with a 2-second timeout. On testing.dk0.dev (or when Directus is unreachable), this blocked the entire Hero render for ~2s → LCP 3.0s / 2320ms rendering delay. Changes: - Hero.tsx: remove getMessages() call entirely; use t() for all strings - messages/en.json + de.json: add hero.badge, hero.line1, hero.line2 keys - lib/i18n-loader.ts: invert lookup order — JSON first, Directus only as override for keys absent from JSON. Previously Directus was tried first for every key, causing ~49 parallel network requests per page load in HomePageServer (aboutT + projectsT + contactT + footerT translations). Now all JSON-backed keys return instantly without any network I/O. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
167 lines
5.9 KiB
JSON
167 lines
5.9 KiB
JSON
{
|
||
"nav": {
|
||
"home": "Home",
|
||
"about": "About",
|
||
"projects": "Projects",
|
||
"contact": "Contact"
|
||
},
|
||
"common": {
|
||
"back": "Back",
|
||
"backToHome": "Back to Home",
|
||
"backToProjects": "Back to Projects",
|
||
"viewAllProjects": "View All Projects",
|
||
"loading": "Loading..."
|
||
},
|
||
"consent": {
|
||
"title": "Privacy settings",
|
||
"description": "We use optional services (analytics and chat) to improve the site. You can change your choice anytime.",
|
||
"essential": "Essential",
|
||
"analytics": "Analytics",
|
||
"chat": "Chatbot",
|
||
"alwaysOn": "Always on",
|
||
"acceptAll": "Accept all",
|
||
"acceptSelected": "Accept selected",
|
||
"rejectAll": "Reject all",
|
||
"hide": "Hide"
|
||
}
|
||
,
|
||
"home": {
|
||
"hero": {
|
||
"badge": "Student & Self-Hoster",
|
||
"line1": "Building",
|
||
"line2": "Stuff.",
|
||
"features": {
|
||
"f1": "Next.js & Flutter",
|
||
"f2": "Docker Swarm & CI/CD",
|
||
"f3": "Self-Hosted Infrastructure"
|
||
},
|
||
"description": "I'm Dennis – a student from Germany and a passionate self-hoster. I build full-stack applications and love the challenge of managing the infrastructure they run on.",
|
||
"ctaWork": "View Projects",
|
||
"ctaContact": "Get in touch"
|
||
},
|
||
"about": {
|
||
"title": "Behind the Code",
|
||
"p1": "Ever since I set up my first home server, I've been hooked on infrastructure. Currently studying in Osnabrück, I split my time between developing modern web apps with Next.js and building mobile experiences with Flutter.",
|
||
"p2": "For me, it doesn't stop at the code. I genuinely enjoy managing my own Docker clusters, optimizing CI/CD pipelines, and making sure everything is stable and secure. DevOps isn't just a part of my job – it's how I think about building things.",
|
||
"p3": "When the servers are running smoothly, you'll find me jogging through the city, gaming, or tinkering with new automation workflows in n8n.",
|
||
"funFactTitle": "Hardcore Analog",
|
||
"funFactBody": "Despite my love for automation and the cloud, my most important ideas are still born on paper with a fountain pen. It's my way of staying grounded.",
|
||
"techStackTitle": "My Tech Stack",
|
||
"hobbiesTitle": "When I'm Not Coding",
|
||
"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": "Setting up game servers",
|
||
"jogging": "Jogging to clear my mind and stay active"
|
||
},
|
||
"currentlyReading": {
|
||
"title": "Currently Reading",
|
||
"progress": "Progress"
|
||
},
|
||
"readBooks": {
|
||
"title": "Read",
|
||
"finishedAt": "Finished",
|
||
"showMore": "{count} more",
|
||
"showLess": "Show less",
|
||
"empty": "Books finished in Hardcover will appear here automatically."
|
||
},
|
||
"activity": {
|
||
"idleStatus": "System Idle / Mind Active",
|
||
"codingNow": "Coding Now",
|
||
"gaming": "Gaming",
|
||
"listening": "Listening",
|
||
"inGame": "In Game"
|
||
}
|
||
},
|
||
"projects": {
|
||
"title": "Selected Works",
|
||
"subtitle": "A collection of projects I've worked on, ranging from web applications to experiments.",
|
||
"featured": "Featured",
|
||
"viewAll": "View All Projects"
|
||
},
|
||
"contact": {
|
||
"title": "Contact Me",
|
||
"subtitle": "Interested in working together or have questions about my projects? Feel free to reach out!",
|
||
"getInTouch": "Get In Touch",
|
||
"getInTouchBody": "I'm always available to discuss new opportunities, interesting projects, or simply chat about technology and innovation.",
|
||
"info": {
|
||
"email": "Email",
|
||
"location": "Location",
|
||
"locationValue": "Osnabrück, Germany"
|
||
},
|
||
"form": {
|
||
"title": "Send Message",
|
||
"sending": "Sending message…",
|
||
"send": "Send Message",
|
||
"labels": {
|
||
"name": "Name",
|
||
"email": "Email",
|
||
"subject": "Subject",
|
||
"message": "Message",
|
||
"requiredMarker": "*"
|
||
},
|
||
"placeholders": {
|
||
"name": "Your name",
|
||
"email": "your@email.com",
|
||
"subject": "What's this about?",
|
||
"message": "Tell me more about your project or question…"
|
||
},
|
||
"errors": {
|
||
"nameRequired": "Name is required",
|
||
"nameMin": "Name must be at least 2 characters",
|
||
"emailRequired": "Email is required",
|
||
"emailInvalid": "Please enter a valid email address",
|
||
"subjectRequired": "Subject is required",
|
||
"subjectMin": "Subject must be at least 3 characters",
|
||
"messageRequired": "Message is required",
|
||
"messageMin": "Message must be at least 10 characters"
|
||
},
|
||
"characters": "{count} characters"
|
||
}
|
||
}
|
||
}
|
||
,
|
||
"projects": {
|
||
"shared": {
|
||
"featured": "Featured"
|
||
},
|
||
"list": {
|
||
"title": "My Projects",
|
||
"intro": "Explore my portfolio of projects, from web applications to mobile apps. Each project showcases different skills and technologies.",
|
||
"searchPlaceholder": "Search projects...",
|
||
"all": "All",
|
||
"noResults": "No projects found matching your criteria.",
|
||
"clearFilters": "Clear filters"
|
||
},
|
||
"detail": {
|
||
"links": "Project Links",
|
||
"liveDemo": "Live Demo",
|
||
"liveNotAvailable": "Live demo not available",
|
||
"viewSource": "View Source",
|
||
"techStack": "Tech Stack"
|
||
}
|
||
}
|
||
,
|
||
"footer": {
|
||
"role": "Software Engineer",
|
||
"madeIn": "Made in Germany",
|
||
"legalNotice": "Legal notice",
|
||
"privacyPolicy": "Privacy policy",
|
||
"privacySettings": "Privacy settings",
|
||
"privacySettingsTitle": "Show privacy settings banner again",
|
||
"builtWith": "Built with"
|
||
}
|
||
}
|
||
|