Einen Sprachumschalter erstellen
Nutzer:innen ermöglichen, auf jeder Seite die Sprache zu wechseln
Problem
Ein:e Nutzer:in befindet sich auf einer bestimmten Seite, zum Beispiel /en/products/123, und möchte dieselbe Seite in einer anderen Sprache anzeigen. Beim Klick auf einen Sprachumschalter (z. B. 'Français') wird man jedoch häufig auf die Startseite (/fr/) weitergeleitet, anstatt auf die entsprechende Produktseite. Das unterbricht den Workflow und zwingt dazu, die gewünschte Seite erneut zu suchen.
Lösung
Erstellen Sie eine Client-Komponente, die den aktuellen URL-Pfad ausliest. Sie generiert eine Liste von Links für alle anderen unterstützten Sprachen, indem sie das aktuelle Sprachsegment im Pfad ersetzt. Beim Klick wird außerdem ein Präferenz-Cookie gesetzt, sodass die Auswahl für zukünftige Besuche gespeichert bleibt.
Schritte
1. Sprachkonfiguration definieren
Stellen Sie sicher, dass Ihre i18n.config.ts-Datei die Liste der unterstützten Locales und den Namen des zu verwendenden Cookies enthält.
// i18n.config.ts
export const locales = ['en', 'es', 'fr'];
export const defaultLocale = 'en';
export const localeCookieName = 'NEXT_LOCALE';
2. Sprachumschalter-Komponente erstellen
Erstellen Sie eine neue Datei, zum Beispiel app/components/LanguageSwitcher.tsx. Dies muss eine Client-Komponente sein, um Hooks wie usePathname verwenden zu können.
// app/components/LanguageSwitcher.tsx
'use client';
import { usePathname } from 'next/navigation';
import Link from 'next/link';
import { locales, localeCookieName } from '@/i18n.config';
export default function LanguageSwitcher() {
const pathname = usePathname();
// This function sets the cookie
const setLocaleCookie = (locale: string) => {
document.cookie = `${localeCookieName}=${locale}; path=/; max-age=31536000; samesite=lax`;
};
// This function strips the current locale from the path
const getRedirectedPath = (locale: string) => {
if (!pathname) return '/';
const segments = pathname.split('/');
segments[1] = locale; // The locale is always the first segment
return segments.join('/');
};
return (
<div>
{locales.map((locale) => (
<Link
key={locale}
href={getRedirectedPath(locale)}
onClick={() => setLocaleCookie(locale)}
style={{
display: 'inline-block',
padding: '0.5rem',
textDecoration: 'underline',
}}
>
{locale.toUpperCase()}
</Link>
))}
</div>
);
}
3. Umschalter ins Layout einfügen
Importieren und platzieren Sie Ihre neue Komponente in der Root-Layout-Datei app/[lang]/layout.tsx. Dadurch ist sie auf allen Seiten sichtbar.
// app/[lang]/layout.tsx
import LanguageSwitcher from '@/app/components/LanguageSwitcher';
export async function generateStaticParams() {
// This tells Next.js to pre-render 'en', 'es', and 'fr'
return [{ lang: 'en' }, { lang: 'es' }, { lang: 'fr' }];
}
export default function RootLayout({
children,
params,
}: {
children: React.ReactNode;
params: { lang: string };
}) {
return (
<html lang={params.lang}>
<body>
<header>
{/* Add the switcher to your header or nav */}
<LanguageSwitcher />
</header>
<main>{children}</main>
</body>
</html>
);
}
Wenn sich ein:e Nutzer:in nun auf /es/products/123 befindet und auf "EN" klickt, berechnet die Komponente den neuen Pfad als /en/products/123 und setzt das NEXT_LOCALE-Cookie auf 'en'.