Erkennung der bevorzugten Sprache eines Benutzers
Weiterleitung neuer Besucher zu ihrer wahrscheinlichsten Sprache
Problem
Wenn ein Benutzer zum ersten Mal die Root-Ebene einer Anwendung besucht (z. B. /), wird eine Standardsprache angezeigt, beispielsweise Englisch. Dies führt zu sofortiger Reibung für Benutzer, die andere Sprachen sprechen, da sie manuell nach einem Sprachwechsler suchen müssen, obwohl ihr Browser bereits ihre Präferenz kommuniziert.
Lösung
Verwenden Sie Middleware, um Anfragen für den Root-Pfad (/) abzufangen. Überprüfen Sie den Accept-Language HTTP-Header des Benutzers, um dessen bevorzugte Sprache zu ermitteln. Wenn diese Sprache von der Anwendung unterstützt wird, leiten Sie den Benutzer zur Root-Ebene dieser Sprache weiter (z. B. /fr). Andernfalls leiten Sie ihn zu einer Standardsprache weiter (z. B. /en).
Schritte
1. Installieren Sie einen Sprach-Parser
Der Accept-Language Header kann komplex sein (z. B. fr-CH, fr;q=0.9, en;q=0.8). Eine kleine Bibliothek hilft dabei, diesen Header zu parsen und die beste Übereinstimmung aus unserer Liste unterstützter Sprachen zu finden.
Führen Sie diesen Befehl in Ihrem Terminal aus:
npm install accept-language-parser
2. Definieren Sie Ihre Sprachen und Standardsprache
Erstellen Sie eine zentrale Konfigurationsdatei, um Ihre Liste unterstützter Sprachen zu speichern und eine Standardsprache zu definieren. Diese Standardsprache wird verwendet, wenn die Browser-Präferenzen eines Benutzers mit keiner von Ihnen unterstützten Sprache übereinstimmen.
// i18n.config.ts
export const locales = ['en', 'es', 'fr'];
export const defaultLocale = 'en';
3. Erstellen Sie die Middleware
Erstellen Sie eine middleware.ts Datei im Root-Verzeichnis Ihres Projekts. Diese Datei wird bei eingehenden Anfragen ausgeführt und ermöglicht es Ihnen, den Pfad und die Header zu überprüfen.
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import parser from 'accept-language-parser';
import { locales, defaultLocale } from './i18n.config';
// Helper function to find the best language match
function getBestLocale(acceptLangHeader: string | null) {
if (!acceptLangHeader) {
return defaultLocale;
}
// Use the parser to find the best supported language
const bestMatch = parser.pick(locales, acceptLangHeader, {
loose: true,
});
return bestMatch || defaultLocale;
}
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// 1. Check if the request is for the root path
if (pathname === '/') {
// Get the user's preferred language
const acceptLang = request.headers.get('Accept-Language');
const bestLocale = getBestLocale(acceptLang);
// Redirect to the best-matched language path
request.nextUrl.pathname = `/${bestLocale}`;
return NextResponse.redirect(request.nextUrl);
}
// 2. For all other paths, continue as normal
return NextResponse.next();
}
export const config = {
matcher: [
// Skip all paths that start with:
// - api (API routes)
// - _next/static (static files)
// - _next/image (image optimization files)
// - favicon.ico (favicon file)
'/((?!api|_next/static|_next/image|favicon.ico).*)',
],
};
Dieser Code führt die Logik nur für den Root-Pfad (/) aus. Wenn ein Benutzer / besucht, überprüft er dessen Accept-Language Header, findet die beste Übereinstimmung (z. B. es) und leitet ihn zu /es weiter. Alle anderen Anfragen, wie /en/about, werden von dieser Logik ignoriert und durchgelassen.