[Lv3] Nuxt 3 Mehrsprachigkeit (i18n) und SEO Best Practices
Die Implementierung von Mehrsprachigkeit (Internationalization) unter einer SSR-Architektur umfasst nicht nur die Übersetzung von Texten, sondern auch Routing-Strategien, SEO-Tags (hreflang), Zustandsverwaltung und Hydration-Konsistenz.
1. Kernpunkte für die Interviewantwort
- Routing-Strategie: Die URL-Präfix-Strategie von
@nuxtjs/i18n(z.B./en/about,/jp/about) zur Unterscheidung der Sprachen verwenden. Dies ist am SEO-freundlichsten. - SEO-Tags: Sicherstellen, dass korrekte
<link rel="alternate" hreflang="..." />und Canonical URL automatisch generiert werden, um Strafen für doppelten Inhalt zu vermeiden. - Zustandsverwaltung: In der SSR-Phase die Benutzersprache korrekt erkennen (Cookie/Header) und sicherstellen, dass die Sprache bei der Client-seitigen Hydration konsistent ist.
2. Nuxt 3 i18n Implementierungsstrategie
2.1 Warum @nuxtjs/i18n wählen?
Das offizielle Modul @nuxtjs/i18n basiert auf vue-i18n und ist speziell für Nuxt optimiert. Es löst die häufigen Probleme bei der manuellen i18n-Implementierung:
- Automatische Generierung von Routen mit Sprachpräfix (Auto-generated routes).
- Automatische Verarbeitung von SEO Meta Tags (hreflang, og:locale).
- Unterstützung für Lazy Loading von Sprachpaketen (Optimierung der Bundle-Größe).
2.2 Installation und Konfiguration
npm install @nuxtjs/i18n
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxtjs/i18n'],
i18n: {
locales: [
{ code: 'en', iso: 'en-US', file: 'en.json', name: 'English' },
{ code: 'tw', iso: 'zh-TW', file: 'tw.json', name: 'Traditionelles Chinesisch' },
],
defaultLocale: 'tw',
lazy: true, // Lazy Loading aktivieren
langDir: 'locales', // Verzeichnis für Sprachdateien
strategy: 'prefix_and_default', // Wichtige Routing-Strategie
detectBrowserLanguage: {
useCookie: true,
cookieKey: 'i18n_redirected',
redirectOn: 'root', // Nur am Root-Pfad erkennen und umleiten
},
},
});
2.3 Routing-Strategie (Routing Strategy)
Dies ist der Schlüssel für SEO. @nuxtjs/i18n bietet mehrere Strategien:
-
prefix_except_default (empfohlen):
- Standardsprache (tw) ohne Präfix:
example.com/about - Andere Sprachen (en) mit Präfix:
example.com/en/about - Vorteil: Saubere URL, konzentriertes SEO-Gewicht.
- Standardsprache (tw) ohne Präfix:
-
prefix_and_default:
- Alle Sprachen mit Präfix:
example.com/tw/about,example.com/en/about - Vorteil: Einheitliche Struktur, einfache Handhabung von Weiterleitungen.
- Alle Sprachen mit Präfix:
-
no_prefix (nicht für SEO empfohlen):
- Alle Sprachen mit der gleichen URL, Umschaltung per Cookie.
- Nachteil: Suchmaschinen können verschiedene Sprachversionen nicht indexieren.
3. Wichtige SEO-Implementierung
3.1 hreflang Tag
Suchmaschinen müssen wissen, "welche Sprachversionen hat diese Seite". @nuxtjs/i18n generiert automatisch im <head>:
<link rel="alternate" href="https://example.com/about" hreflang="zh-TW" />
<link rel="alternate" href="https://example.com/en/about" hreflang="en-US" />
<link rel="alternate" href="https://example.com/about" hreflang="x-default" />
Hinweis: baseUrl muss in nuxt.config.ts gesetzt werden, sonst generiert hreflang relative Pfade (ungültig).
export default defineNuxtConfig({
i18n: {
baseUrl: 'https://example.com', // Muss gesetzt werden!
},
});
3.2 Canonical URL
Sicherstellen, dass jede Sprachversion der Seite eine auf sich selbst verweisende Canonical URL hat, um nicht als doppelter Inhalt betrachtet zu werden.
3.3 Dynamische Inhaltsübersetzung (API)
Die Backend-API muss ebenfalls Mehrsprachigkeit unterstützen. Normalerweise wird der Accept-Language Header bei Anfragen mitgeschickt.
// composables/useApi.ts
export const useApi = (url: string) => {
const { locale } = useI18n();
return useFetch(url, {
headers: {
'Accept-Language': locale.value, // Aktuelle Sprache an das Backend senden
},
});
};
4. Häufige Herausforderungen und Lösungen
4.1 Hydration Mismatch
Problem: Server erkennt Englisch und rendert englisches HTML; der Client-Browser hat Chinesisch als Standard, Vue i18n initialisiert auf Chinesisch, was zu Bildschirmflackern oder Hydration Error führt.
Lösung:
detectBrowserLanguageEinstellung verwenden, damit der Client bei der Initialisierung die URL- oder Cookie-Einstellung respektiert, nicht die Browser-Einstellung.- Sicherstellen, dass die
defaultLocaleEinstellung von Server und Client konsistent ist.
4.2 Sprachwechsel
switchLocalePath verwenden, um Links zu generieren, anstatt Zeichenketten manuell zusammenzusetzen.
<script setup>
const switchLocalePath = useSwitchLocalePath();
</script>
<template>
<nav>
<NuxtLink :to="switchLocalePath('en')">English</NuxtLink>
<NuxtLink :to="switchLocalePath('tw')">Traditionelles Chinesisch</NuxtLink>
</nav>
</template>
5. Interview-Schwerpunkte
5.1 i18n und SEO
Q: Worauf muss man bei Mehrsprachigkeit (i18n) in einer SSR-Umgebung achten? Wie wird SEO behandelt?
Beispielantwort: Bei i18n in einer SSR-Umgebung sind SEO und Hydration-Konsistenz am wichtigsten.
Bezüglich SEO:
- URL-Struktur: Ich verwende die "Unterpfad"-Strategie (z.B.
/en/,/tw/), um verschiedenen Sprachen unabhängige URLs zu geben, damit Suchmaschinen indexieren können.- hreflang:
<link rel="alternate" hreflang="..." />muss korrekt gesetzt werden, um Google mitzuteilen, dass diese Seiten verschiedene Sprachversionen desselben Inhalts sind, und Strafen für doppelten Inhalt zu vermeiden. Normalerweise verwende ich das@nuxtjs/i18nModul, um diese Tags automatisch zu generieren.Bezüglich Hydration: Sicherstellen, dass die vom Server gerenderte Sprache und die vom Client initialisierte Sprache konsistent sind. Ich konfiguriere die Sprachbestimmung über URL-Präfix oder Cookie und füge die entsprechende Locale im API-Anfrage-Header hinzu.
5.2 Routing und Zustand
Q: Wie implementiert man die Sprachwechsel-Funktion?
Beispielantwort: Ich verwende das von
@nuxtjs/i18nbereitgestellteuseSwitchLocalePathComposable. Es generiert automatisch die URL der entsprechenden Sprache basierend auf der aktuellen Route (unter Beibehaltung der Query-Parameter) und behandelt die Umwandlung der Routenpräfixe. Dies vermeidet Fehler bei der manuellen Zeichenkettenverkettung und stellt sicher, dass der Benutzer beim Sprachwechsel auf dem ursprünglichen Seiteninhalt bleibt.