Alpha
Der Lingo.dev Compiler befindet sich in der Alpha-Phase. Er ist instabil, nicht für den Produktionseinsatz empfohlen, und APIs können sich zwischen Releases ändern.
Mit benutzerdefinierten Sprache-Resolvern können Sie steuern, wie der Lingo.dev Compiler die Sprache des Benutzers erkennt und speichert. Standardmäßig nutzt der Compiler eine Cookie-basierte Speicherung, die über die Option localePersistence konfiguriert wird. Wenn Sie mehr Kontrolle benötigen – etwa für URL-basiertes Routing, Header-Erkennung, localStorage oder beliebige benutzerdefinierte Logik –, erstellen Sie Resolver-Dateien im Verzeichnis .lingo/.
Resolver-Dateien#
Der Compiler sucht nach zwei optionalen Dateien:
| Datei | Umgebung | Exporte |
|---|---|---|
.lingo/locale-resolver.server.ts | Serverseitig (SSR, RSC) | resolveLocale(request: Request): string |
.lingo/locale-resolver.client.ts | Clientseitig (Browser) | resolveLocale(): string und persistLocale(locale: string): void |
Wenn eine Resolver-Datei vorhanden ist, verwendet der Compiler sie anstelle des standardmäßigen Cookie-basierten Verhaltens. Ist nur eine Datei vorhanden, greift die andere Umgebung auf das Standardverhalten zurück.
Serverseitiger Resolver#
Der Server-Resolver erhält das eingehende Request-Objekt und gibt einen String mit dem Sprachcode zurück:
// .lingo/locale-resolver.server.ts
export function resolveLocale(request: Request): string {
const url = new URL(request.url);
// Check URL path prefix: /es/about -> "es"
const pathLocale = url.pathname.split("/")[1];
const supportedLocales = ["en", "es", "de", "fr", "ja"];
if (supportedLocales.includes(pathLocale)) {
return pathLocale;
}
// Fall back to Accept-Language header
const acceptLanguage = request.headers.get("Accept-Language");
if (acceptLanguage) {
const preferred = acceptLanguage.split(",")[0].split("-")[0];
if (supportedLocales.includes(preferred)) {
return preferred;
}
}
return "en";
}Clientseitiger Resolver#
Der Client-Resolver umfasst zwei Funktionen: eine zum Auslesen der aktuellen Sprache und eine zum Speichern einer Sprachänderung:
// .lingo/locale-resolver.client.ts
export function resolveLocale(): string {
// Check URL path prefix
const pathLocale = window.location.pathname.split("/")[1];
const supportedLocales = ["en", "es", "de", "fr", "ja"];
if (supportedLocales.includes(pathLocale)) {
return pathLocale;
}
// Fall back to localStorage
const stored = localStorage.getItem("locale");
if (stored && supportedLocales.includes(stored)) {
return stored;
}
return "en";
}
export function persistLocale(locale: string): void {
localStorage.setItem("locale", locale);
// Navigate to the locale-prefixed URL
const path = window.location.pathname.replace(/^\/[a-z]{2}/, "");
window.location.href = `/${locale}${path}`;
}Häufige Resolver-Muster#
Nach URL-Pfadpräfix routen (/es/about, /de/pricing):
// .lingo/locale-resolver.server.ts
export function resolveLocale(request: Request): string {
const url = new URL(request.url);
const locale = url.pathname.split("/")[1];
const supported = ["en", "es", "de", "fr"];
return supported.includes(locale) ? locale : "en";
}// .lingo/locale-resolver.client.ts
export function resolveLocale(): string {
const locale = window.location.pathname.split("/")[1];
const supported = ["en", "es", "de", "fr"];
return supported.includes(locale) ? locale : "en";
}
export function persistLocale(locale: string): void {
const path = window.location.pathname.replace(/^\/[a-z]{2}/, "");
window.location.href = `/${locale}${path}`;
}Die Funktion resolveLocale muss einen Sprachcode zurückgeben, der mit einem Ihrer konfigurierten targetLocales oder sourceLocale übereinstimmt. Wird ein nicht unterstützter Sprachcode zurückgegeben, fällt der Compiler auf die Ausgangssprache zurück.
