wip
Some checks failed
Build & Deploy / deploy (push) Failing after 19s

This commit is contained in:
2026-01-17 16:33:19 +01:00
parent d4e4142381
commit d8184caa9d
17 changed files with 287 additions and 114 deletions

View File

@@ -1,6 +1,7 @@
import { notFound } from 'next/navigation';
import { MDXRemote } from 'next-mdx-remote/rsc';
import { Section, Container, Heading, Badge } from '@/components/ui';
import { getTranslations } from 'next-intl/server';
interface PageProps {
params: {
@@ -12,6 +13,7 @@ interface PageProps {
export default async function StandardPage({ params: { locale, slug } }: PageProps) {
const { getPageBySlug } = await import('@/lib/pages');
const pageData = await getPageBySlug(slug, locale);
const t = await getTranslations('StandardPage');
if (!pageData) {
notFound();
@@ -26,7 +28,7 @@ export default async function StandardPage({ params: { locale, slug } }: PagePro
</div>
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Badge variant="accent" className="mb-4 md:mb-6">Information</Badge>
<Badge variant="accent" className="mb-4 md:mb-6">{t('badge')}</Badge>
<Heading level={1} className="text-3xl md:text-6xl lg:text-7xl xl:text-8xl text-white mb-0">
<span className="text-white">{pageData.frontmatter.title}</span>
</Heading>
@@ -42,29 +44,29 @@ export default async function StandardPage({ params: { locale, slug } }: PagePro
<div className="lg:sticky lg:top-32 space-y-4 md:space-y-8">
{/* Mobile-only chip/stepper feel */}
<div className="flex lg:hidden overflow-x-auto pb-4 gap-3 no-scrollbar -mx-4 px-4">
<Badge variant="primary" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm">Overview</Badge>
<Badge variant="neutral" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm opacity-60">Details</Badge>
<Badge variant="neutral" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm opacity-60">Support</Badge>
<Badge variant="primary" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm">{t('overview')}</Badge>
<Badge variant="neutral" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm opacity-60">{t('details')}</Badge>
<Badge variant="neutral" className="whitespace-nowrap px-4 py-2 rounded-full shadow-sm opacity-60">{t('support')}</Badge>
</div>
<div className="p-6 md:p-8 bg-neutral-light rounded-2xl md:rounded-3xl border border-neutral-medium shadow-sm">
<h3 className="text-lg md:text-xl font-bold text-primary mb-3 md:mb-4 flex items-center gap-2">
<span className="w-1.5 h-6 bg-accent rounded-full" />
Quick Navigation
{t('quickNavigation')}
</h3>
<nav className="space-y-3 md:space-y-4">
<p className="text-sm md:text-base text-text-secondary leading-relaxed">
Explore the details of {pageData.frontmatter.title}. KLZ provides comprehensive information on all our services and corporate policies.
{t('exploreDetails', { title: pageData.frontmatter.title })}
</p>
</nav>
</div>
<div className="p-6 md:p-8 bg-primary-dark rounded-2xl md:rounded-3xl text-white shadow-xl relative overflow-hidden group">
<div className="absolute top-0 right-0 w-24 h-full bg-accent/5 -skew-x-12 translate-x-1/2 transition-transform group-hover:translate-x-1/3" />
<h3 className="text-lg md:text-xl font-bold mb-3 md:mb-4 relative z-10">Need Help?</h3>
<p className="text-sm md:text-base text-white/70 mb-4 md:mb-6 relative z-10">Our support team is available for any questions regarding this topic.</p>
<h3 className="text-lg md:text-xl font-bold mb-3 md:mb-4 relative z-10">{t('needHelp')}</h3>
<p className="text-sm md:text-base text-white/70 mb-4 md:mb-6 relative z-10">{t('supportTeamAvailable')}</p>
<a href={`/${locale}/contact`} className="inline-flex items-center text-accent font-bold hover:underline touch-target relative z-10 group/link">
Contact Us
{t('contactUs')}
<span className="ml-2 transition-transform group-hover/link:translate-x-1">&rarr;</span>
</a>
</div>

View File

@@ -2,6 +2,7 @@ import Link from 'next/link';
import { getAllPosts } from '@/lib/blog';
import { Section, Container, Heading, Card, Badge, Button } from '@/components/ui';
import Reveal from '@/components/Reveal';
import { getTranslations } from 'next-intl/server';
interface BlogIndexProps {
params: {
@@ -10,15 +11,15 @@ interface BlogIndexProps {
}
export async function generateMetadata({ params: { locale } }: BlogIndexProps) {
const t = await getTranslations({ locale, namespace: 'Blog.meta' });
return {
title: locale === 'de' ? 'Neuigkeiten zu Kabeln und Energielösungen' : 'News on Cables and Energy Solutions',
description: locale === 'de'
? 'Bleiben Sie auf dem Laufenden! Lesen Sie aktuelle Themen und Insights zu Kabeltechnologie, Energielösungen und branchenspezifischen Innovationen.'
: 'Stay up to date! Read current topics and insights on cable technology, energy solutions and industry-specific innovations.',
title: t('title'),
description: t('description'),
};
}
export default async function BlogIndex({ params: { locale } }: BlogIndexProps) {
const t = await getTranslations('Blog');
const posts = await getAllPosts(locale);
// Sort posts by date descending
@@ -46,7 +47,7 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Badge variant="accent" className="mb-4 md:mb-6">Featured Post</Badge>
<Badge variant="accent" className="mb-4 md:mb-6">{t('featuredPost')}</Badge>
{featuredPost && (
<>
<h1 className="text-3xl md:text-7xl font-extrabold text-white mb-4 md:mb-8 leading-[1.1] line-clamp-3 md:line-clamp-none">
@@ -56,7 +57,7 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
{featuredPost.frontmatter.excerpt}
</p>
<Button href={`/${locale}/blog/${featuredPost.slug}`} variant="accent" size="lg" className="group w-full md:w-auto md:h-16 md:px-10 md:text-xl">
{locale === 'de' ? 'Vollständigen Artikel lesen' : 'Read Full Article'}
{t('readFullArticle')}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</Button>
</>
@@ -69,15 +70,15 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
<Container>
<Reveal>
<div className="flex flex-col md:flex-row items-start md:items-end justify-between mb-8 md:mb-16 gap-4 md:gap-6">
<Heading level={2} subtitle="Latest News" className="mb-0">
{locale === 'de' ? 'Alle Beiträge' : 'All Articles'}
<Heading level={2} subtitle={t('latestNews')} className="mb-0">
{t('allArticles')}
</Heading>
<div className="flex flex-wrap gap-2 md:gap-4">
{/* Category filters could go here */}
<Badge variant="primary" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">All</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">Industry</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">Technical</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">Sustainability</Badge>
<Badge variant="primary" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">{t('categories.all')}</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">{t('categories.industry')}</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">{t('categories.technical')}</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors touch-target px-3 md:px-4">{t('categories.sustainability')}</Badge>
</div>
</div>
</Reveal>
@@ -119,7 +120,7 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
</p>
<div className="mt-auto pt-4 md:pt-8 border-t border-neutral-medium flex items-center justify-between">
<span className="text-primary text-sm md:text-base font-extrabold group-hover:text-accent-dark transition-colors">
{locale === 'de' ? 'Weiterlesen' : 'Read more'}
{t('readMore')}
</span>
<div className="w-8 h-8 md:w-10 md:h-10 rounded-full bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300">
<svg className="w-4 h-4 md:w-5 md:h-5 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -136,10 +137,10 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
{/* Pagination Placeholder */}
<div className="mt-12 md:mt-24 flex justify-center gap-2 md:gap-4">
<Button variant="outline" size="sm" className="md:h-11 md:px-6 md:text-base" disabled>Prev</Button>
<Button variant="outline" size="sm" className="md:h-11 md:px-6 md:text-base" disabled>{t('prev')}</Button>
<Button variant="primary" size="sm" className="md:h-11 md:px-6 md:text-base">1</Button>
<Button variant="outline" size="sm" className="md:h-11 md:px-6 md:text-base">2</Button>
<Button variant="outline" size="sm" className="md:h-11 md:px-6 md:text-base">Next</Button>
<Button variant="outline" size="sm" className="md:h-11 md:px-6 md:text-base">{t('next')}</Button>
</div>
</Container>
</Section>

View File

@@ -13,7 +13,7 @@ export default function ContactPage() {
</div>
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Heading level={1} subtitle="Get in Touch" className="text-white mb-4 md:mb-6">
<Heading level={1} subtitle={t('heroSubtitle')} className="text-white mb-4 md:mb-6">
<span className="text-white">{t('title')}</span>
</Heading>
<p className="text-lg md:text-2xl text-white/70 leading-relaxed max-w-2xl">
@@ -29,8 +29,8 @@ export default function ContactPage() {
{/* Contact Info */}
<div className="lg:col-span-5 space-y-6 md:space-y-12">
<div className="animate-fade-in">
<Heading level={3} subtitle="Contact Details" className="mb-6 md:mb-8">
How to Reach Us
<Heading level={3} subtitle={t('info.subtitle')} className="mb-6 md:mb-8">
{t('info.howToReachUs')}
</Heading>
<div className="space-y-4 md:space-y-8">
<div className="flex items-start gap-4 md:gap-6 group">
@@ -41,7 +41,7 @@ export default function ContactPage() {
</svg>
</div>
<div>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">Our Office</h4>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">{t('info.office')}</h4>
<p className="text-sm md:text-lg text-text-secondary leading-relaxed whitespace-pre-line">
{t('info.address')}
</p>
@@ -55,7 +55,7 @@ export default function ContactPage() {
</svg>
</div>
<div>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">Phone</h4>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">{t('info.phone')}</h4>
<a href="tel:+4988192537298" className="text-sm md:text-lg text-text-secondary hover:text-primary transition-colors font-medium touch-target">+49 881 92537298</a>
</div>
</div>
@@ -67,7 +67,7 @@ export default function ContactPage() {
</svg>
</div>
<div>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">Email</h4>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">{t('info.email')}</h4>
<a href="mailto:info@klz-vertriebs-gmbh.com" className="text-sm md:text-lg text-text-secondary hover:text-primary transition-colors font-medium touch-target">info@klz-vertriebs-gmbh.com</a>
</div>
</div>
@@ -92,7 +92,7 @@ export default function ContactPage() {
{/* Contact Form */}
<div className="lg:col-span-7">
<Card className="p-6 md:p-12 rounded-2xl md:rounded-[40px] border-none shadow-2xl animate-slide-up">
<Heading level={3} subtitle="Send a Message" className="mb-6 md:mb-10">
<Heading level={3} subtitle={t('form.subtitle')} className="mb-6 md:mb-10">
{t('form.title')}
</Heading>
<form className="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-8">
@@ -105,7 +105,7 @@ export default function ContactPage() {
autoComplete="name"
enterKeyHint="next"
className="w-full px-4 md:px-6 py-2.5 md:py-4 bg-neutral rounded-xl md:rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-sm md:text-lg"
placeholder="Your Name"
placeholder={t('form.namePlaceholder')}
required
/>
</div>
@@ -119,7 +119,7 @@ export default function ContactPage() {
inputMode="email"
enterKeyHint="next"
className="w-full px-4 md:px-6 py-2.5 md:py-4 bg-neutral rounded-xl md:rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-sm md:text-lg"
placeholder="your@email.com"
placeholder={t('form.emailPlaceholder')}
required
/>
</div>
@@ -131,7 +131,7 @@ export default function ContactPage() {
rows={4}
enterKeyHint="send"
className="w-full px-4 md:px-6 py-2.5 md:py-4 bg-neutral rounded-xl md:rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-sm md:text-lg resize-none"
placeholder="How can we help you?"
placeholder={t('form.messagePlaceholder')}
required
></textarea>
</div>
@@ -156,7 +156,7 @@ export default function ContactPage() {
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
</svg>
</div>
<p className="font-bold text-primary text-xl">Interactive Map Coming Soon</p>
<p className="font-bold text-primary text-xl">{t('map.comingSoon')}</p>
</div>
</div>
</section>

View File

@@ -1,14 +1,18 @@
import {NextIntlClientProvider} from 'next-intl';
import {getMessages} from 'next-intl/server';
import {getMessages, getTranslations} from 'next-intl/server';
import '../../styles/globals.css';
import Header from '@/components/Header';
import Footer from '@/components/Footer';
import { Metadata, Viewport } from 'next';
export const metadata: Metadata = {
title: 'KLZ Cables',
description: 'Premium Cable Solutions',
};
export async function generateMetadata({params: {locale}}: {params: {locale: string}}): Promise<Metadata> {
const t = await getTranslations({locale, namespace: 'Index.meta'});
return {
title: t('title'),
description: t('description')
};
}
export const viewport: Viewport = {
width: 'device-width',

View File

@@ -22,7 +22,7 @@ export default function TeamPage() {
</div>
<Container className="relative z-10 text-center text-white max-w-5xl animate-slide-up">
<Badge variant="accent" className="mb-4 md:mb-8 shadow-lg">Our People</Badge>
<Badge variant="accent" className="mb-4 md:mb-8 shadow-lg">{t('hero.badge')}</Badge>
<h1 className="text-3xl md:text-7xl lg:text-8xl font-extrabold tracking-tight leading-[1.1] mb-4 md:mb-8">
{t('hero.subtitle')}
</h1>
@@ -38,7 +38,7 @@ export default function TeamPage() {
<Reveal className="w-full lg:w-1/2 p-6 md:p-24 lg:p-32 flex flex-col justify-center bg-primary-dark text-white relative order-2 lg:order-1">
<div className="absolute top-0 right-0 w-32 h-full bg-accent/5 -skew-x-12 translate-x-1/2" />
<div className="relative z-10">
<Badge variant="accent" className="mb-4 md:mb-8">Managing Director</Badge>
<Badge variant="accent" className="mb-4 md:mb-8">{t('michael.role')}</Badge>
<Heading level={2} className="text-white mb-6 md:mb-10 text-3xl md:text-6xl">
<span className="text-white">{t('michael.name')}</span>
</Heading>
@@ -80,7 +80,7 @@ export default function TeamPage() {
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/1694273920124-copy.webp"
alt="Legacy"
alt={t('legacy.subtitle')}
fill
className="object-cover opacity-20 md:opacity-30 scale-110 animate-slow-zoom"
sizes="100vw"
@@ -90,7 +90,7 @@ export default function TeamPage() {
<Container className="relative z-10">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8 md:gap-16 items-center">
<div className="lg:col-span-6">
<Heading level={2} subtitle="Our Heritage" className="text-white mb-6 md:mb-10">
<Heading level={2} subtitle={t('legacy.subtitle')} className="text-white mb-6 md:mb-10">
<span className="text-white">{t('legacy.title')}</span>
</Heading>
<div className="space-y-4 md:space-y-8 text-base md:text-2xl text-white/80 leading-relaxed font-medium">
@@ -104,12 +104,12 @@ export default function TeamPage() {
</div>
<div className="lg:col-span-6 grid grid-cols-2 md:grid-cols-2 gap-3 md:gap-6">
<div className="p-4 md:p-8 bg-white/5 backdrop-blur-md border border-white/10 rounded-2xl md:rounded-[32px] hover:bg-white/10 transition-colors">
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">Expertise</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">Decades of Knowledge</div>
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">{t('legacy.expertise')}</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">{t('legacy.expertiseDesc')}</div>
</div>
<div className="p-4 md:p-8 bg-white/5 backdrop-blur-md border border-white/10 rounded-2xl md:rounded-[32px] hover:bg-white/10 transition-colors">
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">Network</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">Global Partnerships</div>
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">{t('legacy.network')}</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">{t('legacy.networkDesc')}</div>
</div>
</div>
</div>
@@ -132,7 +132,7 @@ export default function TeamPage() {
<Reveal className="w-full lg:w-1/2 p-6 md:p-24 lg:p-32 flex flex-col justify-center bg-neutral-light text-primary relative order-2">
<div className="absolute top-0 left-0 w-32 h-full bg-primary/5 skew-x-12 -translate-x-1/2" />
<div className="relative z-10">
<Badge variant="primary" className="mb-4 md:mb-8">Founder & Visionary</Badge>
<Badge variant="primary" className="mb-4 md:mb-8">{t('klaus.role')}</Badge>
<Heading level={2} className="text-primary mb-6 md:mb-10 text-3xl md:text-6xl">
{t('klaus.name')}
</Heading>
@@ -165,11 +165,11 @@ export default function TeamPage() {
<div className="sticky-narrative-container">
<div className="sticky-narrative-sidebar mb-8 lg:mb-0">
<div className="lg:sticky lg:top-32">
<Heading level={2} subtitle="Our Values" className="mb-4 md:mb-8">
<Heading level={2} subtitle={t('manifesto.subtitle')} className="mb-4 md:mb-8">
{t('manifesto.title')}
</Heading>
<p className="text-base md:text-xl text-text-secondary leading-relaxed">
Our core principles guide every decision we make and every cable we deliver.
{t('manifesto.tagline')}
</p>
{/* Mobile-only progress indicator */}
@@ -200,8 +200,8 @@ export default function TeamPage() {
{/* Gallery Section - Premium Treatment */}
<Section className="bg-primary-dark py-16 md:py-32">
<Container>
<Heading level={2} subtitle="Behind the Scenes" align="center" className="text-white mb-12 md:mb-20">
<span className="text-white">Life at KLZ</span>
<Heading level={2} subtitle={t('gallery.subtitle')} align="center" className="text-white mb-12 md:mb-20">
<span className="text-white">{t('gallery.title')}</span>
</Heading>
<div className="grid grid-cols-2 md:grid-cols-5 gap-3 md:gap-6">
{[
@@ -212,7 +212,7 @@ export default function TeamPage() {
'/uploads/2024/12/DSC07387-Large-600x400.webp'
].map((src, idx) => (
<div key={idx} className="relative aspect-[3/4] rounded-2xl md:rounded-[32px] overflow-hidden group shadow-2xl">
<Image src={src} alt="Team Gallery" fill className="object-cover transition-transform duration-1000 group-hover:scale-110" />
<Image src={src} alt={t('gallery.title')} fill className="object-cover transition-transform duration-1000 group-hover:scale-110" />
<div className="absolute inset-0 bg-primary-dark/40 group-hover:bg-transparent transition-all duration-500" />
<div className="absolute inset-0 border-0 group-hover:border-[8px] md:group-hover:border-[12px] border-white/10 transition-all duration-500 pointer-events-none" />
</div>

View File

@@ -5,6 +5,7 @@ import { Container, Heading } from './ui';
export default function Footer() {
const t = useTranslations('Footer');
const navT = useTranslations('Navigation');
const locale = useLocale();
const currentYear = new Date().getFullYear();
@@ -19,7 +20,7 @@ export default function Footer() {
<Link href={`/${locale}`} className="inline-block group">
<Image
src="/logo-white.svg"
alt="KLZ Cables"
alt={t('products')}
width={150}
height={40}
className="h-10 w-auto transition-transform duration-500 group-hover:scale-110"
@@ -27,7 +28,7 @@ export default function Footer() {
/>
</Link>
<p className="text-white/60 text-lg leading-relaxed max-w-sm">
Leading the way in cable infrastructure and sustainable energy solutions. Quality, innovation, and reliability since 1998.
{t('tagline')}
</p>
<div className="flex gap-4">
<a href="https://www.linkedin.com/company/klz-vertriebs-gmbh/" target="_blank" rel="noopener noreferrer" className="w-12 h-12 rounded-full bg-white/5 flex items-center justify-center hover:bg-accent hover:text-primary-dark transition-all duration-300 border border-white/10">
@@ -50,12 +51,12 @@ export default function Footer() {
</div>
<div className="lg:col-span-2">
<h4 className="text-accent font-bold uppercase tracking-widest text-sm mb-8">Company</h4>
<h4 className="text-accent font-bold uppercase tracking-widest text-sm mb-8">{t('company')}</h4>
<ul className="space-y-4 text-white/70">
<li><Link href={`/${locale}/team`} className="hover:text-white transition-colors">Our Team</Link></li>
<li><Link href={`/${locale}/products`} className="hover:text-white transition-colors">Products</Link></li>
<li><Link href={`/${locale}/blog`} className="hover:text-white transition-colors">Blog</Link></li>
<li><Link href={`/${locale}/contact`} className="hover:text-white transition-colors">Contact</Link></li>
<li><Link href={`/${locale}/team`} className="hover:text-white transition-colors">{navT('team')}</Link></li>
<li><Link href={`/${locale}/products`} className="hover:text-white transition-colors">{navT('products')}</Link></li>
<li><Link href={`/${locale}/blog`} className="hover:text-white transition-colors">{navT('blog')}</Link></li>
<li><Link href={`/${locale}/contact`} className="hover:text-white transition-colors">{navT('contact')}</Link></li>
</ul>
</div>
@@ -72,7 +73,7 @@ export default function Footer() {
<p className="text-white/80 font-bold group-hover:text-accent transition-colors leading-snug mb-2">
{post}
</p>
<span className="text-xs text-white/40 uppercase tracking-widest">Read Article &rarr;</span>
<span className="text-xs text-white/40 uppercase tracking-widest">{t('readArticle')} &rarr;</span>
</Link>
</li>
))}
@@ -81,7 +82,7 @@ export default function Footer() {
</div>
<div className="pt-12 border-t border-white/10 flex flex-col md:flex-row justify-between items-center gap-8 text-white/40 text-sm font-medium">
<p>Copyright © {currentYear} KLZ Vertriebs GmbH. All rights reserved.</p>
<p>{t('copyright', { year: currentYear })}</p>
<div className="flex gap-8">
<Link href="/en" className="hover:text-white transition-colors">English</Link>
<Link href="/de" className="hover:text-white transition-colors">Deutsch</Link>

View File

@@ -75,7 +75,7 @@ export default function Header() {
<Link href={`/${currentLocale}`} className="flex-shrink-0 group touch-target">
<Image
src={logoSrc}
alt="KLZ Cables"
alt={t('home')}
width={120}
height={120}
className="h-10 md:h-14 w-auto transition-all duration-500 group-hover:scale-110"
@@ -132,7 +132,7 @@ export default function Header() {
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className={cn("lg:hidden touch-target p-2 rounded-xl bg-white/10 backdrop-blur-md border border-white/20 z-50", textColorClass)}
aria-label="Toggle Menu"
aria-label={t('toggleMenu')}
>
<svg className="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24">
{isMobileMenuOpen ? (
@@ -198,7 +198,7 @@ export default function Header() {
{/* Bottom Branding */}
<div className="p-12 flex justify-center opacity-20">
<Image src="/logo-white.svg" alt="KLZ" width={80} height={80} unoptimized />
<Image src="/logo-white.svg" alt={t('home')} width={80} height={80} unoptimized />
</div>
</div>
</header>

View File

@@ -14,11 +14,11 @@ export default function CTA() {
<Container className="relative z-10">
<div className="flex flex-col lg:flex-row items-center justify-between gap-16">
<div className="max-w-3xl text-center lg:text-left">
<Heading level={2} subtitle="Get Started" className="text-white mb-6">
<Heading level={2} subtitle={t('subtitle')} className="text-white mb-6">
<span className="text-white">{t('title')}</span>
</Heading>
<p className="text-xl text-white/70 leading-relaxed">
Partner with KLZ for reliable, high-performance cable solutions tailored to your project's unique requirements.
{t('description')}
</p>
</div>
<div className="flex-shrink-0">

View File

@@ -11,7 +11,7 @@ export default function Experience() {
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/1694273920124-copy-2.webp"
alt="Experience Background"
alt={t('subtitle')}
fill
className="object-cover object-center scale-105 animate-slow-zoom"
unoptimized
@@ -22,7 +22,7 @@ export default function Experience() {
<Container className="relative z-10">
<div className="max-w-3xl">
<Heading level={2} subtitle="Our Legacy" className="text-white">
<Heading level={2} subtitle={t('subtitle')} className="text-white">
<span className="text-white">{t('title')}</span>
</Heading>
<div className="space-y-8 text-xl text-white/90 leading-relaxed font-medium">
@@ -36,12 +36,12 @@ export default function Experience() {
<div className="mt-16 grid grid-cols-1 md:grid-cols-2 gap-12">
<div className="animate-fade-in">
<div className="text-4xl font-extrabold text-accent mb-4">Certified Quality</div>
<div className="text-lg font-bold uppercase tracking-widest text-white/60">VDE Approved & Trusted by Major Energy Suppliers</div>
<div className="text-4xl font-extrabold text-accent mb-4">{t('certifiedQuality')}</div>
<div className="text-lg font-bold uppercase tracking-widest text-white/60">{t('vdeApproved')}</div>
</div>
<div className="animate-fade-in" style={{ animationDelay: '100ms' }}>
<div className="text-4xl font-extrabold text-accent mb-4">Full Spectrum</div>
<div className="text-lg font-bold uppercase tracking-widest text-white/60">From 1kV to 220kV Solutions</div>
<div className="text-4xl font-extrabold text-accent mb-4">{t('fullSpectrum')}</div>
<div className="text-lg font-bold uppercase tracking-widest text-white/60">{t('solutionsRange')}</div>
</div>
</div>
</div>

View File

@@ -17,7 +17,7 @@ export default function GallerySection() {
return (
<Section className="bg-white text-neutral-dark py-32">
<Container>
<Heading level={2} subtitle="Visual Journey" align="center">
<Heading level={2} subtitle={t('subtitle')} align="center">
{t('title')}
</Heading>

View File

@@ -5,6 +5,7 @@ import { Section, Container, Button, Heading } from '../../components/ui';
export default function MeetTheTeam() {
const t = useTranslations('Home.meetTheTeam');
const teamT = useTranslations('Team');
const locale = useLocale();
return (
@@ -12,7 +13,7 @@ export default function MeetTheTeam() {
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/DSC08036-Large.webp"
alt="KLZ Team"
alt={t('subtitle')}
fill
className="object-cover scale-105 animate-slow-zoom"
unoptimized
@@ -23,7 +24,7 @@ export default function MeetTheTeam() {
<Container className="relative z-10">
<div className="max-w-3xl text-white animate-slide-up">
<Heading level={2} subtitle="The People Behind KLZ" className="text-white mb-8">
<Heading level={2} subtitle={t('subtitle')} className="text-white mb-8">
<span className="text-white">{t('title')}</span>
</Heading>
@@ -43,10 +44,10 @@ export default function MeetTheTeam() {
<div className="flex items-center gap-4">
<div className="flex -space-x-4">
<div className="w-14 h-14 rounded-full border-4 border-primary-dark overflow-hidden relative">
<Image src="/uploads/2024/12/DSC07768-Large.webp" alt="Michael Bodemer" fill className="object-cover" />
<Image src="/uploads/2024/12/DSC07768-Large.webp" alt={teamT('michael.name')} fill className="object-cover" />
</div>
<div className="w-14 h-14 rounded-full border-4 border-primary-dark overflow-hidden relative">
<Image src="/uploads/2024/12/DSC07963-Large.webp" alt="Klaus Mintel" fill className="object-cover" />
<Image src="/uploads/2024/12/DSC07963-Large.webp" alt={teamT('klaus.name')} fill className="object-cover" />
</div>
</div>
<span className="text-white/60 font-bold text-sm uppercase tracking-widest">

View File

@@ -9,6 +9,7 @@ interface RecentPostsProps {
}
export default async function RecentPosts({ locale }: RecentPostsProps) {
const t = await getTranslations('Blog');
const posts = await getAllPosts(locale);
const recentPosts = posts.slice(0, 3);
@@ -18,11 +19,11 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
<Section className="bg-neutral py-16 md:py-24">
<Container>
<div className="flex flex-col md:flex-row items-start md:items-end justify-between mb-12 md:mb-16 gap-6">
<Heading level={2} subtitle="Insights" className="mb-0">
{locale === 'de' ? 'Aktuelle Blogbeiträge' : 'Recent Blog Posts'}
<Heading level={2} subtitle={t('latestNews')} className="mb-0">
{t('allArticles')}
</Heading>
<Link href={`/${locale}/blog`} className="group flex items-center text-primary font-bold text-lg touch-target">
{locale === 'de' ? 'Alle Beiträge ansehen' : 'View all posts'}
{t('allArticles')}
<span className="ml-2 transition-transform group-hover:translate-x-2">&rarr;</span>
</Link>
</div>
@@ -59,7 +60,7 @@ export default async function RecentPosts({ locale }: RecentPostsProps) {
{post.frontmatter.title}
</h3>
<div className="mt-auto flex items-center text-primary font-bold group-hover:underline decoration-2 underline-offset-4">
{locale === 'de' ? 'Weiterlesen' : 'Read more'}
{t('readMore')}
<svg className="ml-2 w-5 h-5 transition-transform group-hover:translate-x-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>

View File

@@ -11,7 +11,7 @@ export default function WhatWeDo() {
<div className="sticky-narrative-container">
<div className="sticky-narrative-sidebar">
<div className="lg:sticky lg:top-32">
<Heading level={2} subtitle="Our Expertise">
<Heading level={2} subtitle={t('expertise')}>
{t('title')}
</Heading>
<p className="text-lg md:text-xl text-text-secondary leading-relaxed">

View File

@@ -11,7 +11,7 @@ export default function WhyChooseUs() {
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16 lg:gap-24">
<div className="lg:col-span-4 order-1 lg:order-2">
<div className="sticky top-32">
<Heading level={2} subtitle="Why KLZ">
<Heading level={2} subtitle={t('whyKlz')}>
{t('title')}
</Heading>
<p className="text-xl text-text-secondary leading-relaxed">
@@ -19,19 +19,14 @@ export default function WhyChooseUs() {
</p>
<div className="mt-12 space-y-6">
{[
'Certified Quality Standards',
'Sustainable Supply Chain',
'Expert Technical Support',
'Fast Global Delivery'
].map((item, i) => (
{[0, 1, 2, 3].map((i) => (
<div key={i} className="flex items-center gap-4">
<div className="flex-shrink-0 w-6 h-6 rounded-full bg-accent flex items-center justify-center">
<svg className="w-4 h-4 text-primary-dark" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={3} d="M5 13l4 4L19 7" />
</svg>
</div>
<span className="font-bold text-primary">{item}</span>
<span className="font-bold text-primary">{t(`features.${i}`)}</span>
</div>
))}
</div>

View File

@@ -1,14 +1,19 @@
{
"Index": {
"title": "KLZ Cables - Hochwertige Kabel",
"description": "Ihr Partner für hochwertige Kabel."
"description": "Ihr Partner für hochwertige Kabel.",
"meta": {
"title": "KLZ Cables",
"description": "Premium-Kabellösungen"
}
},
"Navigation": {
"home": "Start",
"team": "Team",
"products": "Produkte",
"blog": "Blog",
"contact": "Kontakt"
"contact": "Kontakt",
"toggleMenu": "Menü umschalten"
},
"Footer": {
"legal": "Rechtliches",
@@ -27,32 +32,46 @@
"languages": "Sprachen",
"archives": "Archiv",
"categories": "Kategorien",
"recentPosts": "Neueste Artikel"
"recentPosts": "Neueste Artikel",
"company": "Unternehmen",
"readArticle": "Artikel lesen",
"copyright": "Copyright © {year} KLZ Vertriebs GmbH. Alle Rechte vorbehalten.",
"tagline": "Wegweisend in der Kabelinfrastruktur und bei nachhaltigen Energielösungen. Qualität, Innovation und Zuverlässigkeit seit 1998."
},
"Team": {
"hero": {
"title": "Die Köpfe, die Energie zum Laufen bringen",
"subtitle": "Wir verbinden Energie, Know-how und Innovation, um eine nachhaltigere Zukunft zu gestalten."
"subtitle": "Wir verbinden Energie, Know-how und Innovation, um eine nachhaltigere Zukunft zu gestalten.",
"badge": "Unser Team"
},
"michael": {
"name": "Michael Bodemer",
"quote": "„Herausforderungen sind da, um gelöst zu werden nicht, um über ihre Komplexität zu diskutieren.“",
"description": "Michael Bodemer ist unser Mann, wenn es kompliziert wird und das ist bei Kabelnetzen oft der Fall. Mit seinem scharfen Blick und einem Händchen für praktikable Lösungen ist er eine unserer zentralen Säulen. Michael denkt nicht nur an Details, er treibt Projekte voran sei es in der Planung, im Kundengespräch oder bei der Auswahl der besten Kabel für jedes Vorhaben.",
"linkedin": "Michael's LinkedIn"
"linkedin": "Michael's LinkedIn",
"role": "Geschäftsführer"
},
"legacy": {
"title": "Verbindungen, die Geschichte schreiben",
"subtitle": "Unser Erbe",
"p1": "Bei KLZ vereinen wir Tradition und Innovation zu zuverlässigen Energielösungen. Unsere Wurzeln reichen tief in die Geschichte der Kabeltechnologie zurück mit jeder Menge praktischer Erfahrung und einem Blick für zukunftsweisende Entwicklungen.",
"p2": "In jedem Projekt steckt nicht nur technisches Know-how, sondern auch das Bewusstsein für das Handwerk, das die Welt seit Generationen verbindet. Historische Illustrationen aus den frühen Tagen der Energiebranche erinnern uns daran, wie weit wir gekommen sind und dass echte Exzellenz immer mit Sorgfalt beginnt."
"p2": "In jedem Projekt steckt nicht nur technisches Know-how, sondern auch das Bewusstsein für das Handwerk, das die Welt seit Generationen verbindet. Historische Illustrationen aus den frühen Tagen der Energiebranche erinnern uns daran, wie weit wir gekommen sind und dass echte Exzellenz immer mit Sorgfalt beginnt.",
"expertise": "Expertise",
"expertiseDesc": "Jahrzehntelanges Wissen",
"network": "Netzwerk",
"networkDesc": "Globale Partnerschaften"
},
"klaus": {
"name": "Klaus Mintel",
"quote": "„Manchmal braucht es nur einen klaren Kopf und das richtige Kabel, um die Welt ein Stück besser zu machen.“",
"description": "Klaus ist der Fels in der Brandung selbst wenn das Kabelchaos überhandnimmt. Mit jahrzehntelanger Erfahrung und einem stabilen Netzwerk sorgt er dafür, dass alles glatt läuft. Er denkt nicht nur in Lösungen, sondern bringt auch Humor und den nötigen Weitblick mit, um selbst komplexe Themen locker auf den Punkt zu bringen.",
"linkedin": "Klaus' LinkedIn"
"linkedin": "Klaus' LinkedIn",
"role": "Gründer & Visionär"
},
"manifesto": {
"title": "Unser Manifest",
"subtitle": "Unsere Werte",
"tagline": "Unsere Grundprinzipien leiten jede Entscheidung, die wir treffen, und jedes Kabel, das wir liefern.",
"items": [
{
"title": "Kompetenz",
@@ -79,14 +98,24 @@
"description": "Wir halten, was wir versprechen jedes Mal und ohne Ausnahme."
}
]
},
"gallery": {
"title": "Leben bei KLZ",
"subtitle": "Hinter den Kulissen"
}
},
"Contact": {
"title": "Kontaktieren Sie uns",
"subtitle": "Haben Sie Fragen zu unseren Produkten oder benötigen Sie eine maßgeschneiderte Lösung? Wir sind für Sie da.",
"heroSubtitle": "Kontakt aufnehmen",
"info": {
"title": "Kontaktinformationen",
"address": "Raiffeisenstraße 22\n73630 Remshalden\nDeutschland"
"subtitle": "Kontaktdetails",
"howToReachUs": "So erreichen Sie uns",
"address": "Raiffeisenstraße 22\n73630 Remshalden\nDeutschland",
"office": "Unser Büro",
"phone": "Telefon",
"email": "E-Mail"
},
"hours": {
"title": "Geschäftszeiten",
@@ -97,10 +126,17 @@
},
"form": {
"title": "Schreiben Sie uns eine Nachricht",
"subtitle": "Nachricht senden",
"name": "Name",
"namePlaceholder": "Ihr Name",
"email": "E-Mail",
"emailPlaceholder": "ihre@email.de",
"message": "Nachricht",
"messagePlaceholder": "Wie können wir Ihnen helfen?",
"submit": "Nachricht senden"
},
"map": {
"comingSoon": "Interaktive Karte demnächst verfügbar"
}
},
"Products": {
@@ -157,11 +193,13 @@
"hero": {
"title": "Wir helfen beim Ausbau der Energiekabelnetze für eine <green>grüne</green> Zukunft",
"cta": "Lassen Sie uns reden",
"exploreProducts": "Produkte entdecken"
"exploreProducts": "Produkte entdecken",
"subtitle": "Wegweisend in der Kabelinfrastruktur"
},
"whatWeDo": {
"title": "Was wir tun",
"subtitle": "Wir sorgen dafür, dass der Strom fließt mit qualitätsgeprüften Kabeln. Von der Niederspannung bis zur Hochspannung.",
"expertise": "Unsere Expertise",
"quote": "Wir liefern nicht nur Kabel; wir liefern die Infrastruktur für eine nachhaltige Zukunft.",
"items": [
{
@@ -185,6 +223,13 @@
"whyChooseUs": {
"title": "Warum wir",
"subtitle": "Erfahrung verhindert viele Fehler, aber wir lernen jeden Tag dazu",
"whyKlz": "Warum KLZ",
"features": [
"Zertifizierte Qualitätsstandards",
"Nachhaltige Lieferkette",
"Experten-Support",
"Schnelle weltweite Lieferung"
],
"items": [
{
"title": "Expertise mit Tiefgang",
@@ -206,17 +251,24 @@
},
"experience": {
"title": "Jahrzehntelange Erfahrung, verwurzelt in der Kabelgeschichte",
"p1": "Bei KLZ fließt Kabel durch unsere Adern. Klaus begann seine Reise bei der renommierten Firma Felten & Guilleaume und trat damit in die Fußstapfen seiner Eltern, die ihr Leben demselben ikonischen Unternehmen widmeten. Für Klaus ist das nicht nur Arbeit es ist ein Vermächtnis, das auf Handwerkskunst, Innovation und Stolz basiert.",
"p2": "Wir ehren diese Geschichte mit Original-Illustrationen aus der Ära von Felten & Guilleaume, die einst als Postkarten verwendet wurden. Diese Bilder erinnern uns an die Generationen, die die Welt miteinander vernetzt haben eine Tradition, die wir heute stolz fortsetzen."
"subtitle": "Unser Erbe",
"p1": "At KLZ, cables run in our veins. Klaus began his journey at the renowned Felten & Guilleaume, following in the footsteps of his parents, who dedicated their lives to the same iconic company. For Klaus, this isnt just work its a legacy built on craftsmanship, innovation, and pride.",
"p2": "Wir ehren diese Geschichte mit Original-Illustrationen aus der Ära von Felten & Guilleaume, die einst als Postkarten verwendet wurden. Diese Bilder erinnern uns an die Generationen, die die Welt miteinander vernetzt haben eine Tradition, die wir heute stolz fortsetzen.",
"certifiedQuality": "Zertifizierte Qualität",
"vdeApproved": "VDE-geprüft & Vertrauen von großen Energieversorgern",
"fullSpectrum": "Volles Spektrum",
"solutionsRange": "Lösungen von 1kV bis 220kV"
},
"meetTheTeam": {
"title": "Lernen Sie das Team hinter KLZ kennen",
"subtitle": "Die Köpfe hinter KLZ",
"description": "Bei KLZ ist unser Team die Kraft hinter den Kabeln. Von erfahrenen Experten wie Michael und Klaus bis hin zu einer engagierten Gruppe von Planern, Logistikspezialisten und Kundendienstmitarbeitern spielt jedes Mitglied eine entscheidende Rolle. Gemeinsam verbinden wir jahrzehntelange Erfahrung, innovatives Denken und das gemeinsame Engagement für die Bereitstellung zuverlässiger Energielösungen.",
"cta": "Unser Team ansehen",
"andNetwork": "& Unser Experten-Netzwerk"
},
"gallery": {
"title": "Starke Verbindungen für eine nachhaltige Welt.",
"subtitle": "Visuelle Reise",
"alt": "Galeriebild"
},
"video": {
@@ -224,7 +276,39 @@
},
"cta": {
"title": "Genug Informationen, lassen Sie uns gemeinsam etwas aufbauen!",
"subtitle": "Loslegen",
"description": "Partnern Sie mit KLZ für zuverlässige, leistungsstarke Kabellösungen, die auf die einzigartigen Anforderungen Ihres Projekts zugeschnitten sind.",
"button": "Jetzt Kontakt aufnehmen"
}
},
"Blog": {
"meta": {
"title": "Neuigkeiten zu Kabeln und Energielösungen",
"description": "Bleiben Sie auf dem Laufenden! Lesen Sie aktuelle Themen und Insights zu Kabeltechnologie, Energielösungen und branchenspezifischen Innovationen."
},
"featuredPost": "Hervorgehobener Beitrag",
"readFullArticle": "Vollständigen Artikel lesen",
"latestNews": "Aktuelle Neuigkeiten",
"allArticles": "Alle Artikel",
"readMore": "Weiterlesen",
"prev": "Zurück",
"next": "Weiter",
"categories": {
"all": "Alle",
"industry": "Industrie",
"technical": "Technisch",
"sustainability": "Nachhaltigkeit"
}
},
"StandardPage": {
"badge": "Information",
"overview": "Übersicht",
"details": "Details",
"support": "Support",
"quickNavigation": "Schnellnavigation",
"exploreDetails": "Entdecken Sie die Details von {title}. KLZ bietet umfassende Informationen zu all unseren Dienstleistungen und Unternehmensrichtlinien.",
"needHelp": "Brauchen Sie Hilfe?",
"supportTeamAvailable": "Unser Support-Team steht Ihnen bei Fragen zu diesem Thema gerne zur Verfügung.",
"contactUs": "Kontaktieren Sie uns"
}
}

View File

@@ -1,14 +1,19 @@
{
"Index": {
"title": "KLZ Cables - High Quality Cables",
"description": "Your partner for high quality cables."
"description": "Your partner for high quality cables.",
"meta": {
"title": "KLZ Cables",
"description": "Premium Cable Solutions"
}
},
"Navigation": {
"home": "Home",
"team": "Team",
"products": "Products",
"blog": "Blog",
"contact": "Contact"
"contact": "Contact",
"toggleMenu": "Toggle Menu"
},
"Footer": {
"legal": "Legal",
@@ -27,32 +32,46 @@
"languages": "Languages",
"archives": "Archives",
"categories": "Categories",
"recentPosts": "Recent Posts"
"recentPosts": "Recent Posts",
"company": "Company",
"readArticle": "Read Article",
"copyright": "Copyright © {year} KLZ Vertriebs GmbH. All rights reserved.",
"tagline": "Leading the way in cable infrastructure and sustainable energy solutions. Quality, innovation, and reliability since 1998."
},
"Team": {
"hero": {
"title": "The bright sparks behind the power",
"subtitle": "We connect energy, expertise, and innovation to power a greener future."
"subtitle": "We connect energy, expertise, and innovation to power a greener future.",
"badge": "Our People"
},
"michael": {
"name": "Michael Bodemer",
"quote": "\"Challenges exist to be solved, not to debate how complicated they are.\"",
"description": "Michael Bodemer is the go-to guy when things get complicated—and lets face it, thats often the case with cable networks. With sharp insight and a knack for practical solutions, Michael is one of our key players. Hes not just detail-oriented; hes a driving force—whether its in planning, customer interactions, or securing the best cables for every project.",
"linkedin": "Check Michael's LinkedIn"
"linkedin": "Check Michael's LinkedIn",
"role": "Managing Director"
},
"legacy": {
"title": "A Legacy of Excellence in Every Connection",
"subtitle": "Our Heritage",
"p1": "At KLZ, our expertise is built on generations of dedication to the energy industry. With decades of hands-on experience, weve grown alongside the evolution of cable technology, combining traditional craftsmanship with modern innovation. Each project we take on reflects a deep understanding of what it takes to create lasting, reliable energy solutions.",
"p2": "Paired with historic illustrations from the industrys early days, our story is a reminder of how far cables have come and how much care has always gone into connecting the world."
"p2": "Paired with historic illustrations from the industrys early days, our story is a reminder of how far cables have come and how much care has always gone into connecting the world.",
"expertise": "Expertise",
"expertiseDesc": "Decades of Knowledge",
"network": "Network",
"networkDesc": "Global Partnerships"
},
"klaus": {
"name": "Klaus Mintel",
"quote": "\"Sometimes all it takes is a clear head and a good cable to make the world a little better.\"",
"description": "Klaus is the man with the experience, bringing perspective and calm to the table—even when cable chaos threatens to take over. With impressive industry knowledge and a network as solid as our cables, he ensures everything runs smoothly. Klaus isnt just a problem solver; hes a strategic thinker who knows how to get to the point with a touch of humor.",
"linkedin": "Check Klaus' LinkedIn"
"linkedin": "Check Klaus' LinkedIn",
"role": "Founder & Visionary"
},
"manifesto": {
"title": "Our manifesto",
"subtitle": "Our Values",
"tagline": "Our core principles guide every decision we make and every cable we deliver.",
"items": [
{
"title": "Competence",
@@ -79,14 +98,24 @@
"description": "We deliver what we promise every time, without fail."
}
]
},
"gallery": {
"title": "Life at KLZ",
"subtitle": "Behind the Scenes"
}
},
"Contact": {
"title": "Get in Touch",
"subtitle": "Have questions about our products or need a custom solution? We're here to help.",
"heroSubtitle": "Get in Touch",
"info": {
"title": "Contact Information",
"address": "Raiffeisenstraße 22\n73630 Remshalden\nGermany"
"subtitle": "Contact Details",
"howToReachUs": "How to Reach Us",
"address": "Raiffeisenstraße 22\n73630 Remshalden\nGermany",
"office": "Our Office",
"phone": "Phone",
"email": "Email"
},
"hours": {
"title": "Business Hours",
@@ -97,10 +126,17 @@
},
"form": {
"title": "Send us a message",
"subtitle": "Send a Message",
"name": "Name",
"namePlaceholder": "Your Name",
"email": "Email",
"emailPlaceholder": "your@email.com",
"message": "Message",
"messagePlaceholder": "How can we help you?",
"submit": "Send Message"
},
"map": {
"comingSoon": "Interactive Map Coming Soon"
}
},
"Products": {
@@ -157,11 +193,13 @@
"hero": {
"title": "We are helping to expand the energy cable networks for a <green>green</green> future",
"cta": "Let's talk",
"exploreProducts": "Explore Products"
"exploreProducts": "Explore Products",
"subtitle": "Leading the way in cable infrastructure"
},
"whatWeDo": {
"title": "What we do",
"subtitle": "We ensure that the electricity flows with quality-tested cables. From low voltage up to high voltage.",
"expertise": "Our Expertise",
"quote": "We don't just deliver cables; we deliver the infrastructure for a sustainable future.",
"items": [
{
@@ -185,6 +223,13 @@
"whyChooseUs": {
"title": "Why choose us",
"subtitle": "Experience prevents many mistakes, but we learn something new every day",
"whyKlz": "Why KLZ",
"features": [
"Certified Quality Standards",
"Sustainable Supply Chain",
"Expert Technical Support",
"Fast Global Delivery"
],
"items": [
{
"title": "Expertise with depth",
@@ -206,17 +251,24 @@
},
"experience": {
"title": "Decades of experience rooted in cable history",
"subtitle": "Our Legacy",
"p1": "At KLZ, cables run in our veins. Klaus began his journey at the renowned Felten & Guilleaume, following in the footsteps of his parents, who dedicated their lives to the same iconic company. For Klaus, this isnt just work its a legacy built on craftsmanship, innovation, and pride.",
"p2": "We honor this history with original illustrations from Felten & Guilleaumes era, once used as postcards. These images remind us of the generations who wired the world together a tradition we proudly continue today."
"p2": "We honor this history with original illustrations from Felten & Guilleaumes era, once used as postcards. These images remind us of the generations who wired the world together a tradition we proudly continue today.",
"certifiedQuality": "Certified Quality",
"vdeApproved": "VDE Approved & Trusted by Major Energy Suppliers",
"fullSpectrum": "Full Spectrum",
"solutionsRange": "From 1kV to 220kV Solutions"
},
"meetTheTeam": {
"title": "Meet the team behind KLZ",
"subtitle": "The People Behind KLZ",
"description": "At KLZ, our team is the power behind the cables. From seasoned experts like Michael and Klaus to a dedicated group of planners, logistics specialists, and customer support professionals, every member plays a vital role. Together, we combine decades of experience, innovative thinking, and a shared commitment to delivering reliable energy solutions.",
"cta": "Checkout our team",
"andNetwork": "& Our Expert Network"
},
"gallery": {
"title": "Strong Connections for a Sustainable World.",
"subtitle": "Visual Journey",
"alt": "Gallery image"
},
"video": {
@@ -224,7 +276,39 @@
},
"cta": {
"title": "Enough information, let's build something together!",
"subtitle": "Get Started",
"description": "Partner with KLZ for reliable, high-performance cable solutions tailored to your project's unique requirements.",
"button": "Reach out now"
}
},
"Blog": {
"meta": {
"title": "News on Cables and Energy Solutions",
"description": "Stay up to date! Read current topics and insights on cable technology, energy solutions and industry-specific innovations."
},
"featuredPost": "Featured Post",
"readFullArticle": "Read Full Article",
"latestNews": "Latest News",
"allArticles": "All Articles",
"readMore": "Read more",
"prev": "Prev",
"next": "Next",
"categories": {
"all": "All",
"industry": "Industry",
"technical": "Technical",
"sustainability": "Sustainability"
}
},
"StandardPage": {
"badge": "Information",
"overview": "Overview",
"details": "Details",
"support": "Support",
"quickNavigation": "Quick Navigation",
"exploreDetails": "Explore the details of {title}. KLZ provides comprehensive information on all our services and corporate policies.",
"needHelp": "Need Help?",
"supportTeamAvailable": "Our support team is available for any questions regarding this topic.",
"contactUs": "Contact Us"
}
}

File diff suppressed because one or more lines are too long