Best Practices für Internationalisierung in Next.js und Nuxt.js
James Reed
Infrastructure Engineer · Leapcell

Einleitung
In der heutigen globalisierten digitalen Landschaft ist die Reichweite eines vielfältigen Publikums für jede erfolgreiche Webanwendung von größter Bedeutung. Ein entscheidender Schritt zur Erreichung dieses Ziels ist die Internationalisierung oder i18n, der Prozess des Designs und der Entwicklung einer Anwendung zur Unterstützung mehrerer Sprachen und Regionen, ohne dass technische Änderungen erforderlich sind. Für Entwickler, die mit modernen, serverseitig gerenderten JavaScript-Frameworks wie Next.js und Nuxt.js arbeiten, ist die effektive Implementierung von i18n nicht nur wünschenswert, sondern eine Notwendigkeit. Dieser Artikel befasst sich mit den Best Practices für die Internationalisierung von Anwendungen, die mit Next.js und Nuxt.js erstellt wurden, und bietet praktische Anleitungen und Codebeispiele, um Ihnen bei der Erstellung wirklich globaler Benutzererlebnisse zu helfen.
Kernkonzepte der Internationalisierung
Bevor wir uns mit den Implementierungsdetails befassen, wollen wir ein gemeinsames Verständnis der Kernkonzepte im Zusammenhang mit i18n aufbauen:
- Internationalisierung (i18n): Der Prozess des Designs und der Entwicklung einer Anwendung, damit sie leicht an verschiedene Sprachen und Regionen angepasst werden kann, ohne dass Codeänderungen erforderlich sind. Es geht darum, Ihre Anwendung für die Lokalisierung vorzubereiten.
- Lokalisierung (l10n): Der Prozess der Anpassung einer internationalisierten Anwendung für ein bestimmtes Gebietsschema (eine Kombination aus Sprache und Region). Dies umfasst die Übersetzung von Texten, die Formatierung von Daten und Zahlen sowie die Berücksichtigung kultureller Nuancen.
- Gebietsschema (Locale): Ein Zeichenketten-Identifikator, der die Sprache und Region eines Benutzers definiert (z. B.
en-US
für amerikanisches Englisch,fr-FR
für Französisch gesprochen in Frankreich). - Nachrichtendateien/Übersetzungs-Wörterbücher: Sammlungen von Schlüssel-Wert-Paaren, bei denen Schlüssel eindeutige Identifikatoren für Textzeichenketten darstellen und Werte die übersetzten Zeichenketten für ein bestimmtes Gebietsschema sind. Dies sind typischerweise JSON-, YAML- oder PO-Dateien.
- Sprachverhandlung: Der Prozess der Bestimmung der bevorzugten Sprache des Benutzers, oft basierend auf Browsereinstellungen, URL-Parametern oder Benutzerauswahlen.
- Dynamisches Routing: Wie URLs strukturiert werden sollen, um Gebietsschema-Informationen einzuschließen, sodass Benutzer Inhalte in ihrer bevorzugten Sprache aufrufen können (z. B.
/en/about
vs./fr/about
).
Implementierung der Internationalisierung in Next.js und Nuxt.js
Sowohl Next.js als auch Nuxt.js bieten eine hervorragende Unterstützung für i18n und nutzen häufig beliebte Bibliotheken wie react-i18next
für Next.js und @nuxtjs/i18n
für Nuxt.js. Obwohl die spezifische Syntax unterschiedlich sein kann, bleiben die zugrundeliegenden Prinzipien ähnlich.
Auswahl einer i18n-Bibliothek
Für Next.js ist react-i18next
der De-facto-Standard, der oft mit dem Paket next-i18next
für nahtlose SSR- und SSG-Unterstützung integriert ist. Für Nuxt.js bietet das community-gepflegte Modul @nuxtjs/i18n
eine umfassende Lösung, die auf vue-i18n
aufbaut.
Konfiguration und Einrichtung
Lassen Sie uns dies mit next-i18next
für Next.js und @nuxtjs/i18n
für Nuxt.js veranschaulichen.
Next.js mit next-i18next
- Installation:
undefined
npm install next-i18next react-i18next i18next
2. **`next-i18next.config.js`**: Erstellen Sie eine Konfigurationsdatei im Stammverzeichnis Ihres Projekts.
```javascript
// next-i18next.config.js
module.exports = {
i18n: {
defaultLocale: 'en',
locales: ['en', 'fr', 'es'],
},
localePath: typeof window === 'undefined' ? require('path').resolve('./public/locales') : '/locales',
reloadOnPrerender: process.env.NODE_ENV === 'development',
};
```
3. **`_app.js`-Integration**: Wickeln Sie Ihre Anwendung mit `appWithTranslation` ein.
```javascript
// pages/_app.js
import { appWithTranslation } from 'next-i18next';
import nextI18nConfig from '../next-i18next.config';
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />;
}
export default appWithTranslation(MyApp, nextI18nConfig);
```
4. **Übersetzungsdateien**: Erstellen Sie `public/locales/[locale]/common.json` (oder andere Namespaces).
```json
// public/locales/en/common.json
{
"welcome": "Welcome!",
"greeting": "Hello, {{name}}!"
}
// public/locales/fr/common.json
{
"welcome": "Bienvenue !",
"greeting": "Bonjour, {{name}} !"
}
```
**Nuxt.js mit `@nuxtjs/i18n`**
1. **Installation**:
```bash
npm install @nuxtjs/i18n
-
nuxt.config.js
-Konfiguration: Fügen Sie das Modul hinzu und konfigurieren Sie es.// nuxt.config.js export default { modules: [ '@nuxtjs/i18n', ], i18n: { locales: [ { code: 'en', file: 'en.js', iso: 'en-US' }, { code: 'fr', file: 'fr.js', iso: 'fr-FR' }, { code: 'es', file: 'es.js', iso: 'es-ES' }, ], defaultLocale: 'en', langDir: 'locales/', // Verzeichnis für Ihre Übersetzungsdateien vueI18n: { fallbackLocale: 'en', }, strategy: 'prefix_and_default', // 'prefix_except_default', 'no_prefix', 'prefix' }, };
-
Übersetzungsdateien: Erstellen Sie
locales/[locale].js
.// locales/en.js export default { welcome: 'Welcome!', greeting: 'Hello, {name}!', }; // locales/fr.js export default { welcome: 'Bienvenue !', greeting: 'Bonjour, {name} !', };
Inhalte übersetzen
Nach der Konfiguration ist die Übersetzung von Inhalten ganz einfach.
Next.js (React-Komponente)
// pages/index.js import { useTranslation } from 'next-i18next'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; export default function Home() { const { t } = useTranslation('common'); // 'common' ist der Namespace return ( <div> <h1>{t('welcome')}</h1> <p>{t('greeting', { name: 'Alice' })}</p> </div> ); } export async function getStaticProps({ locale }) { return { props: { ...(await serverSideTranslations(locale, ['common'])) } }; }
Nuxt.js (Vue-Komponente)
<!-- pages/index.vue --> <template> <div> <h1>{{ $t('welcome') }}</h1> <p>{{ $t('greeting', { name: 'Alice' }) }}</p> </div> </template> <script> export default { // Zugriff auf die $i18n-Instanz mounted() { console.log(this.$i18n.locale); } } </script>
Sprachumschaltung
Die Bereitstellung eines Mechanismus zur Sprachumschaltung für Benutzer ist unerlässlich. Dies beinhaltet in der Regel die Aktualisierung des aktuellen Gebietsschemas in der i18n-Bibliothek und, falls URL-Präfixe verwendet werden, die Navigation zur entsprechenden lokalisierten Route.
Next.js (Sprachumschalt-Komponente)
// components/LanguageSwitcher.js import { useRouter } from 'next/router'; import Link from 'next/link'; export default function LanguageSwitcher() { const router = useRouter(); const { locales, locale: currentLocale } = router; return ( <div> {locales.map((locale) => ( <Link key={locale} href={router.asPath} locale={locale}> <a style={{ fontWeight: locale === currentLocale ? 'bold' : 'normal', marginRight: '10px' }}> {locale.toUpperCase()} </a> </Link> ))} </div> ); }
Nuxt.js (Sprachumschalt-Komponente)
<!-- components/LanguageSwitcher.vue --> <template> <div> <NuxtLink v-for="locale in availableLocales" :key="locale.code" :to="switchLocalePath(locale.code)" :class="{ 'font-bold': locale.code === $i18n.locale }" class="mr-2" > {{ locale.code.toUpperCase() }} </NuxtLink> </div> </template> <script> export default { computed: { availableLocales () { return this.$i18n.locales.filter(i => i.code !== this.$i18n.locale) } } } </script>
Dynamisches Routing und SEO
Sowohl next-i18next
als auch @nuxtjs/i18n
verarbeiten lokalisierte Routen. next-i18next
integriert sich direkt in das integrierte internationalisierte Routing von Next.js, während @nuxtjs/i18n
verschiedene Strategien wie prefix_and_default
zum Verwalten von URL-Strukturen (z. B. /en/about
, /fr/about
, /about
für Standard) anbietet. Stellen Sie für SEO sicher, dass jede lokalisierte Version einer Seite eine kanonische URL hat, die auf sich selbst verweist, und hreflang
-Tags, die auf andere Sprachversionen verweisen. Dies hilft Suchmaschinen, die internationale Struktur Ihrer Website zu verstehen.
Umgang mit Datums-, Zeit- und Zahlenformatierung
Über die Textübersetzung hinaus beeinflussen Gebietsschemata auch die Anzeige von Daten, Zeiten und Zahlen. Verwenden Sie die integrierte Intl
-API des Browsers oder Bibliotheken wie moment.js
oder date-fns
zusammen mit i18n-Bibliotheken für eine robuste Lokalisierung dieser Elemente.
Beispiel mit Intl.DateTimeFormat
const date = new Date(); const formattedDateEn = new Intl.DateTimeFormat('en-US').format(date); // 1/1/2023 const formattedDateFr = new Intl.DateTimeFormat('fr-FR').format(date); // 01/01/2023
Überlegungen zu Server Side Rendering (SSR) und Server Side Generation (SSG)
Sowohl Next.js als auch Nuxt.js zeichnen sich durch SSR/SSG aus, was für SEO und Leistung von Vorteil ist. Stellen Sie sicher, dass Ihre i18n-Einrichtung auf dem Client korrekt mit Daten gefüllt wird und die richtigen Übersetzungen auf dem Server abruft. Die serverSideTranslations
von next-i18next
und die automatische Gebietsschemaerkennung und Nachrichtenladung von @nuxtjs/i18n
sind dafür ausgelegt. Zur Build-Zeit generierte Seiten (SSG) sollten eine Version für jedes Gebietsschema erstellen.
Fortgeschrittene Verfahren und Überlegungen
- Übersetzungsmanagement-Tools: Bei größeren Projekten sollten Sie die Verwendung von Übersetzungsmanagement-Systemen (TMS) wie Lokalise, Phrase oder Crowdin in Betracht ziehen. Diese Tools rationalisieren den Übersetzungsprozess, ermöglichen kollaborative Übersetzungen und integrieren sich oft direkt in Ihre Codebasis, um Übersetzungsdateien abzurufen/zu pushen.
- Lazy Loading von Übersetzungen: Anstatt alle Übersetzungen für alle Gebietsschemata sofort zu laden, laden Sie nur die erforderlichen Sprachdateien oder sogar bestimmte Namespaces bei Bedarf per Lazy Loading. Dies reduziert die anfängliche Bundle-Größe erheblich.
- Fallback-Gebietsschemata: Definieren Sie immer ein Fallback-Gebietsschema (z. B.
en
), falls ein Übersetzungsschlüssel im primären Gebietsschema fehlt. - Pluralisierung: Sprachen haben unterschiedliche Regeln für die Pluralisierung. i18n-Bibliotheken bieten typischerweise Mechanismen, um dies korrekt zu handhaben.
react-i18next
: verwendett('key', { count: 1 })
und Pluralregeln in Übersetzungsdateien.vue-i18n
: verwendet spezielle Syntax wieplural: 'Your item | Your items'
.
- Rechts-nach-links (RTL)-Sprachen: Für Sprachen wie Arabisch oder Hebräisch passen Sie die CSS an, um RTL-Layouts zu unterstützen. Möglicherweise müssen Sie einem
html
-Tag dynamisch eindir="rtl"
-Attribut zuweisen und bedingt unterschiedliche CSS-Regeln laden. - SEO-Optimierung: Über
hreflang
-Tags hinaus stellen Sie sicher, dass Ihre Meta-Beschreibungen, Titel und Bild-Alt-Texte für jede Sprachversion einer Seite ebenfalls lokalisiert sind. - Testen der Internationalisierung: Testen Sie Ihre lokalisierten Inhalte gründlich in verschiedenen Gebietsschemata und achten Sie dabei auf Textüberläufe, Datums-/Zahlenformate und RTL-Layouts.
Fazit
Die Implementierung der Internationalisierung ist ein wesentlicher Schritt zum Aufbau wirklich globaler Anwendungen. Durch die Nutzung der robusten Funktionen von Next.js und Nuxt.js sowie spezialisierter i18n-Bibliotheken und Best Practices können Entwickler nahtlose, lokalisierte Benutzererlebnisse schaffen. Die Übernahme dieser Strategien stellt sicher, dass Ihre Anwendung nicht nur funktional, sondern auch kulturell relevant und für ein weltweites Publikum zugänglich ist. Bei der Internationalisierung geht es nicht nur um Übersetzung; es geht darum, mit Ihren Benutzern in ihrer eigenen Sprache und ihrem kulturellen Kontext in Verbindung zu treten.