Sprachwechsel
Implementieren Sie Sprachumschalter, damit Benutzer ihre bevorzugte Sprache ändern können.
Grundlegende Implementierung
Verwenden Sie den useLingoContext-Hook, um die aktuelle Locale und eine Funktion zum Ändern zu erhalten:
"use client"; // For Next.js
import { useLingoContext } from "@lingo.dev/compiler/react";
export function LanguageSwitcher() {
const { locale, setLocale } = useLingoContext();
return (
<select value={locale} onChange={(e) => setLocale(e.target.value)}>
<option value="en">English</option>
<option value="es">Español</option>
<option value="de">Deutsch</option>
<option value="fr">Français</option>
</select>
);
}
Wenn setLocale() aufgerufen wird:
- Die neue Sprache wird gespeichert (über einen benutzerdefinierten Resolver oder das Standard-Cookie)
- Die Seite wird neu geladen, um die neue Sprache anzuwenden
Benutzerdefinierte Benutzeroberfläche
Dropdown mit Flaggen
"use client";
import { useLingoContext } from "@lingo.dev/compiler/react";
const locales = [
{ code: "en", name: "English", flag: "🇺🇸" },
{ code: "es", name: "Español", flag: "🇪🇸" },
{ code: "de", name: "Deutsch", flag: "🇩🇪" },
{ code: "fr", name: "Français", flag: "🇫🇷" },
];
export function LanguageSwitcher() {
const { locale: currentLocale, setLocale } = useLingoContext();
return (
<div className="relative">
<select
value={currentLocale}
onChange={(e) => setLocale(e.target.value)}
className="px-4 py-2 border rounded-md"
>
{locales.map((locale) => (
<option key={locale.code} value={locale.code}>
{locale.flag} {locale.name}
</option>
))}
</select>
</div>
);
}
Button-Gruppe
"use client";
import { useLingoContext } from "@lingo.dev/compiler/react";
export function LanguageSwitcher() {
const { locale, setLocale } = useLingoContext();
const locales = ["en", "es", "de", "fr"];
return (
<div className="flex gap-2">
{locales.map((loc) => (
<button
key={loc}
onClick={() => setLocale(loc)}
className={`px-3 py-1 rounded ${
locale === loc ? "bg-blue-500 text-white" : "bg-gray-200"
}`}
>
{loc.toUpperCase()}
</button>
))}
</div>
);
}
Dropdown-Menü
"use client";
import { useState } from "react";
import { useLingoContext } from "@lingo.dev/compiler/react";
export function LanguageSwitcher() {
const { locale, setLocale } = useLingoContext();
const [isOpen, setIsOpen] = useState(false);
const locales = [
{ code: "en", name: "English" },
{ code: "es", name: "Español" },
{ code: "de", name: "Deutsch" },
{ code: "fr", name: "Français" },
];
const currentLocaleName = locales.find((l) => l.code === locale)?.name;
return (
<div className="relative">
<button
onClick={() => setIsOpen(!isOpen)}
className="px-4 py-2 border rounded-md flex items-center gap-2"
>
<span>{currentLocaleName}</span>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</button>
{isOpen && (
<div className="absolute top-full mt-2 bg-white border rounded-md shadow-lg">
{locales.map((loc) => (
<button
key={loc.code}
onClick={() => {
setLocale(loc.code);
setIsOpen(false);
}}
className={`block w-full text-left px-4 py-2 hover:bg-gray-100 ${
locale === loc.code ? "bg-blue-50" : ""
}`}
>
{loc.name}
</button>
))}
</div>
)}
</div>
);
}
Persistierung
Standardmäßig verwendet setLocale() Ihre konfigurierte Sprachpersistierung (standardmäßig Cookie).
Benutzerdefinierte Persistierung
Implementieren Sie benutzerdefinierte Persistierung über benutzerdefinierte Locale-Resolver:
// .lingo/locale-resolver.client.ts
export function persistLocale(locale: string): void {
// Custom logic: localStorage, URL params, API call, etc.
localStorage.setItem("locale", locale);
window.location.reload();
}
setLocale() ruft automatisch Ihre Funktion persistLocale() auf.
Vermeidung des Seitenneuladen
Standardmäßig lädt setLocale() die Seite neu, um die neue Sprache anzuwenden. Um das Neuladen zu vermeiden:
- Verwenden Sie clientseitiges State-Management
- Laden Sie Übersetzungen für alle Sprachen vorab
- Wechseln Sie Übersetzungen ohne Seitenneuladung
Hinweis: Dies erfordert eine benutzerdefinierte Implementierung – das Standardverhalten des Compilers lädt die Seite aus Gründen der Einfachheit neu.
URL-basierter Sprachwechsel
Für URL-basiertes Sprach-Routing (/en/about, /es/about):
"use client";
import { useRouter, usePathname } from "next/navigation";
export function LanguageSwitcher() {
const router = useRouter();
const pathname = usePathname();
// Extract current locale from path: /es/about → es
const currentLocale = pathname.split("/")[1];
function switchLocale(newLocale: string) {
// Replace locale in path: /es/about → /de/about
const newPath = pathname.replace(`/${currentLocale}`, `/${newLocale}`);
router.push(newPath);
}
return (
<select value={currentLocale} onChange={(e) => switchLocale(e.target.value)}>
<option value="en">English</option>
<option value="es">Español</option>
<option value="de">Deutsch</option>
</select>
);
}
Subdomain-basiertes Umschalten
Für Subdomain-basiertes Routing (es.example.com):
"use client";
export function LanguageSwitcher() {
const currentLocale = window.location.hostname.split(".")[0];
function switchLocale(newLocale: string) {
const host = window.location.hostname;
const domain = host.split(".").slice(1).join(".");
const newHost = `${newLocale}.${domain}`;
window.location.href = `${window.location.protocol}//${newHost}${window.location.pathname}`;
}
return (
<select value={currentLocale} onChange={(e) => switchLocale(e.target.value)}>
<option value="en">English</option>
<option value="es">Español</option>
<option value="de">Deutsch</option>
</select>
);
}
Native Sprachnamen
Zeigen Sie Sprachnamen in ihrer nativen Sprache an für bessere UX:
const locales = [
{ code: "en", name: "English" },
{ code: "es", name: "Español" },
{ code: "de", name: "Deutsch" },
{ code: "fr", name: "Français" },
{ code: "ja", name: "日本語" },
{ code: "zh", name: "中文" },
{ code: "ar", name: "العربية" },
{ code: "ru", name: "Русский" },
];
Barrierefreiheit
Machen Sie Ihren Sprachumschalter barrierefrei:
const { locale, setLocale } = useLingoContext();
<div role="group" aria-label="Language selector">
<label htmlFor="language-select" className="sr-only">
Choose language
</label>
<select
id="language-select"
value={locale}
onChange={(e) => setLocale(e.target.value)}
aria-label="Select language"
>
{locales.map((loc) => (
<option key={loc.code} value={loc.code}>
{loc.name}
</option>
))}
</select>
</div>
Gängige Muster
Navbar-Integration
export function Navbar() {
return (
<nav className="flex items-center justify-between p-4">
<Logo />
<div className="flex items-center gap-4">
<NavLinks />
<LanguageSwitcher />
</div>
</nav>
);
}
Footer-Integration
export function Footer() {
return (
<footer className="p-4 border-t">
<div className="flex justify-between items-center">
<p>© 2024 Your Company</p>
<LanguageSwitcher />
</div>
</footer>
);
}
Mobile-Menü
export function MobileMenu() {
return (
<div className="mobile-menu">
<NavLinks />
<div className="border-t pt-4 mt-4">
<p className="text-sm text-gray-500 mb-2">Language</p>
<LanguageSwitcher />
</div>
</div>
);
}
Testen
Testen Sie das Locale-Umschalten in der Entwicklung:
- Language-Switcher-Komponente hinzufügen
- Dev-Server starten
- Klicken, um Locales umzuschalten
- Überprüfen, dass die Seite mit neuem Locale neu lädt
- Prüfen, dass Übersetzungen aktualisiert werden
Mit aktiviertem Pseudotranslator sehen Sie sofort gefälschte Übersetzungen.
Häufige Fragen
Warum lädt die Seite neu? Der Compiler lädt die Seite neu, um das neue Locale anzuwenden. Dies stellt sicher, dass alle Server-Komponenten und Metadaten korrekt aktualisiert werden.
Kann ich das Neuladen vermeiden? Ja, erfordert aber eine benutzerdefinierte Implementierung. Laden Sie alle Übersetzungen vorab und verwalten Sie den Client-seitigen State manuell.
Muss ich LanguageSwitcher in Suspense einbetten?
Nein. useLingoContext ist synchron – kein Suspense erforderlich.
Kann ich die Browsersprache der Benutzer automatisch erkennen? Ja. Implementieren Sie dies in Custom Locale Resolvers:
export function getClientLocale(): string {
return navigator.language.split("-")[0] || "en";
}
Sollte ich alle unterstützten Sprachen oder nur einige wenige anzeigen? Zeigen Sie alle in einem Dropdown-Menü an. Bei vielen Sprachen gruppieren Sie nach Region oder verwenden Sie eine Such-/Filter-UI.
Nächste Schritte
- Custom Locale Resolvers — Persistierung anpassen
- Framework-Integration — Framework-spezifische Routing-Muster
- Best Practices — UX-Empfehlungen für den Sprachwechsel