Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Der Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Neues Intlayer v9 – Was ist neu?
Willkommen bei Intlayer v9! Dieses Major Release markiert einen riesigen Meilenstein bei der Vereinfachung des Migrationspfads zu Intlayer mit Compat Adapter Packages für wichtige i18n-Bibliotheken (react-i18next, next-intl, vue-i18n, etc.) und fügt Unterstützung für reichhaltige Inhaltsstrukturen hinzu: Collections und Variants.
Inhaltsverzeichnis
Compat Adapter Packages
Die Migration von beliebten i18n-Bibliotheken zu Intlayer ist jetzt einfacher denn je. Wir haben fünf Kompatibilitätspakete erstellt, die die exakt gleichen öffentlichen APIs wie Standard-i18n-Bibliotheken bereitstellen, aber die gesamte Übersetzungsarbeit zur Laufzeit an Intlayer delegieren.
Gleiche öffentliche API mit strenger Typisierung
Durch das Ersetzen von Imports erhalten Sie alle Vorteile von Intlayer (einschließlich Compile-Time-Typsicherheit gegenüber Ihren tatsächlichen Dictionaries) mit minimalen Codeänderungen:
@intlayer/i18next@intlayer/react-i18next@intlayer/next-intl@intlayer/react-intl@intlayer/next-i18next@intlayer/vue-i18n@intlayer/lingui
Ändern Sie zum Beispiel einfach:
Kopieren Sie den Code in die Zwischenablage
import { useTranslation } from "react-i18next";zu:
Kopieren Sie den Code in die Zwischenablage
import { useTranslation } from "@intlayer/react-i18next";Ihre Keys werden nun streng typisiert gegenüber Ihren Intlayer-Dictionaries, was eine vollständige Dot-Path-Auto-Vervollständigung in Ihrer IDE bietet!
Bundler Alias Plugins (Vite, Next.js, Turbopack)
Um die Migration ohne manuelles Umschreiben aller Import-Statements zu ermöglichen, enthält jedes Compat Adapter Package ein benutzerdefiniertes Bundler-Plugin (Vite oder Next.js) unter dem Subpfad /plugin.
Diese Plugins schreiben bestehende Imports (z.B. react-i18next oder next-intl) zur Build-Zeit automatisch in ihre @intlayer/*-Äquivalente um.
Next.js (Webpack / Turbopack) Beispiel
Anstelle von withIntlayer umschließen Sie Ihre Next.js-Konfiguration mit dem Kompatibilitäts-Plugin:
Kopieren Sie den Code in die Zwischenablage
import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";import type { NextConfig } from "next";const withIntlayer = createNextI18nPlugin();const nextConfig: NextConfig = {};export default withIntlayer(nextConfig);Vite (React, Vue, Solid, Svelte) Beispiel
Kopieren Sie den Code in die Zwischenablage
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";export default defineConfig({ plugins: [vueI18nVitePlugin()],});Mutualized Runtime Resolver
Alle Kompatibilitätsadapter leiten die Übersetzungsauflösung nun über einen einzigen, hochoptimierten Runtime-Parser: @intlayer/core/messageFormat.
- Interpolate Message: Löst Standard
{{var}}(Leerzeichen & Dot-Pfade), ICU-formatierte Argumente ({v, number, percent}etc.) und einfache{var}-Templates auf. - Message Node Resolver: Löst verschachtelte Nodes auf:
insert(),plural()(CLDR-Pluralregeln),enu()(Aufzählung),gender(), HTML-Tags, Arrays und aufrufbare Funktions-Nodes. - Tokenized Tag Parser: Unterstützt Inline-XML/HTML-Tags und nummerierte Tags (z.B.
<1>children</1>), um Rich-Text-Rendering out-of-the-box zu ermöglichen.
Feature Spec: Collections & Variants
Intlayer v9 geht über statische Schlüssel-Wert-Objekte hinaus und ermöglicht es Dictionaries, dynamische Layout-Strukturen zu deklarieren, die End-to-End vollständig typisiert sind.
1. Collections
Definieren Sie eine CMS-verwaltete Liste geordneter Elemente (z.B. FAQs, Produkte oder Bloglisten):
Kopieren Sie den Code in die Zwischenablage
import { t, type Dictionary } from "intlayer";export default { key: "faq", item: 1, content: { question: t({ en: "What is Intlayer?", fr: "Qu'est-ce qu'Intlayer ?" }), answer: t({ en: "An i18n toolkit.", fr: "Une boîte à outils i18n." }), },} satisfies Dictionary;Kopieren Sie den Code in die Zwischenablage
import { t, type Dictionary } from "intlayer";export default { key: "faq", item: 2, content: { question: t({ en: "Is it free?", fr: "Est-ce gratuit ?" }), answer: t({ en: "Yes, open-source.", fr: "Oui, open-source." }), },} satisfies Dictionary;Verwendung:
Kopieren Sie den Code in die Zwischenablage
// Fetch all items as an arrayconst allFaqs = useIntlayer("faq"); // -> { question: string, answer: string }[]// Fetch a single item by indexconst faq = useIntlayer("faq", { item: 2 }); // -> { question: string, answer: string }2. Variants
Liefern Sie A/B-Tests, saisonale Header, Feature Flags oder benutzerdefinierte Landing Pages:
String-Varianten (z. B. A/B-Tests)
Kopieren Sie den Code in die Zwischenablage
import { t, type Dictionary } from "intlayer";export default { key: "hero-banner", variant: "default", content: { control: t({ de: "Willkommen", en: "Welcome", fr: "Bienvenue" }), black_friday: t({ de: "Jetzt einkaufen", en: "Shop now", fr: "Acheter maintenant", }), },} satisfies Dictionary;Verwendung:
Kopieren Sie den Code in die Zwischenablage
const banner = useIntlayer("hero-banner", { variant: "black_friday" });Objekt-Varianten (z. B. Dynamic Records)
Kopieren Sie den Code in die Zwischenablage
import { t, type Dictionary } from "intlayer";export default { key: "product-copy", variant: { id: "prod_123", category: "books", }, content: { title: t({ de: "Clean Code", en: "Clean Code", fr: "Code Propre" }), },} satisfies Dictionary;Verwendung:
Kopieren Sie den Code in die Zwischenablage
// Ruft nur das angeforderte Element dynamisch ab (erfordert Suspense)const product = useIntlayer("product-copy", { variant: { id: "prod_123", category: "books" },});Vite Plugin: Bundled Compiler & Proxy
Das intlayer() Vite Plugin bündelt nun den Compiler und den Locale-Routing Proxy direkt, sodass die meisten Projekte nur ein einzelnes Plugin in vite.config.ts benötigen:
Kopieren Sie den Code in die Zwischenablage
import { defineConfig } from "vite";import { intlayer } from "vite-intlayer";export default defineConfig({ plugins: [intlayer()],});- Compiler: Aktiviert sich automatisch, wenn
compiler.enabledauftruegesetzt ist und eincompiler.outputPfad konfiguriert ist. Sie müssenintlayerCompiler()nicht mehr separat registrieren. - Proxy: Aktiviert sich automatisch basierend auf der neuen
routing.enableProxyOption (truestandardmäßig). Es verbindet die Locale-Erkennung / Umleitung / Rewrite Middleware in Entwicklung, Preview und Production SSR. Sie müssenintlayerProxy()nicht mehr separat registrieren.
routing.enableProxy Option
Eine neue routing.enableProxy Option kontrolliert, ob der Locale-Routing-Proxy eingebunden ist. Sie ist standardmäßig auf true gesetzt. Deaktivieren Sie sie, wenn Sie das Locale-Routing selbst handhaben möchten:
Kopieren Sie den Code in die Zwischenablage
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { routing: { enableProxy: false, // Standard: true },};export default config;Die eigenständigen intlayerCompiler() und intlayerProxy() Plugins bleiben für erweiterte Setups exportiert. Die Registrierung neben intlayer() ist sicher — jedes Plugin dedupliziert sich selbst und läuft nur einmal.
Compiler standardmäßig deaktiviert
Ab Intlayer v9 ist der Compiler standardmäßig deaktiviert (compiler.enabled ist jetzt standardmäßig false). Um die Extraktion Ihrer .content.ts-Dateien zur Build-Zeit zu aktivieren, setzen Sie compiler.enabled: true in Ihrer Konfiguration:
Kopieren Sie den Code in die Zwischenablage
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { compiler: { enabled: true, // Standard: false — seit v9 erforderlich, um den Compiler zu aktivieren output: ({ fileName }) => `./${fileName}.content.ts`, },};export default config;Wenn der Compiler deaktiviert ist, überspringt Intlayer den Extraktionsschritt zur Build-Zeit und verlässt sich auf Ihre bereits deklarierten Dictionaries. Aktivieren Sie ihn nur, wenn das Bundler-Plugin (@intlayer/swc, @intlayer/babel oder das intlayer() Vite-Plugin) den Inhalt automatisch extrahieren soll.
React Native: Importe aus einem einzigen Paket
In einer React Native- oder Expo-App müssen Sie nicht mehr beide Pakete react-intlayer und react-native-intlayer jonglieren. Das Paket react-native-intlayer re-exportiert nun die vollständige react-intlayer API (Hooks, Utilities sowie die Subpfade /format, /html und /markdown), und sein IntlayerProvider wendet automatisch die React Native Polyfills an.
Importieren Sie alles aus dem einzigen Paket react-native-intlayer:
Kopieren Sie den Code in die Zwischenablage
import { IntlayerProvider, useIntlayer, useLocale,} from "react-native-intlayer";Kopieren Sie den Code in die Zwischenablage
npm install intlayer react-native-intlayerImporte ausreact-intlayerfunktionieren weiterhin, aberreact-native-intlayerist nun der empfohlene einzige Einstiegspunkt für React Native — sein Provider liefert die Polyfills, die der weborientiertereact-intlayer-Provider nicht enthält.
CMS SDK: Intlayer als Headless-Content-Datenbank nutzen
Intlayer v9 enthält ein sauberes, sich selbst authentifizierendes SDK in @intlayer/api, um programmgesteuert mit dem CMS zu interagieren – Projekte abrufen, Dictionaries abrufen sowie diese von Ihrem eigenen Server, Skripten oder CI aus pushen oder aktualisieren. Die Authentifizierung (OAuth2 client_credentials) wird für Sie übernommen und erneuert.
Das SDK ist in zwei getrennte Importe aufgeteilt, sodass Ihr Bundle nur die Domänen enthält, die Sie tatsächlich verwenden:
createIntlayerCMS– ein leichtgewichtiger Authentifikator, der die Anmeldedaten und das verwaltete Token hält (kein Domänen-Client gebündelt).dictionaryEndpoint,projectEndpoint, … – Endpoint-Binder pro Domäne, jeweils aus ihrem eigenen Unterpfad importiert.
Kopieren Sie den Code in die Zwischenablage
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";// Konfiguration ist optional: Anmeldedaten fallen auf INTLAYER_CLIENT_ID /// INTLAYER_CLIENT_SECRET zurück, aufgelöst durch `@intlayer/config/built`.const cms = createIntlayerCMS();// Lesenconst { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();// Schreiben – nutze das CMS wie eine Datenbankawait dictionaryEndpoint(cms).pushDictionaries([myDictionary]);Sicherheit: Die CMS-Anmeldedaten gewähren Schreibzugriff auf Ihre Inhalte. Erstellen Sie den Authentifikator immer nur serverseitig – senden SieclientId/clientSecretniemals an den Browser.
Self-Hosting
Intlayer v9 bietet erstklassige Unterstützung für den Betrieb Ihrer eigenen Intlayer-Instanz mit einem einzigen Befehl – kein Intlayer Cloud-Konto erforderlich.
Kopieren Sie den Code in die Zwischenablage
curl -fsSL https://intlayer.org/install.sh | shDas Installationsprogramm lädt eine docker-compose.yml und eine .env herunter, generiert automatisch die erforderlichen Secrets und führt docker compose up -d aus. Alles – das Dashboard, die API, die Datenbank, der Objektspeicher und die transaktionale E-Mail – läuft lokal in Containern.
Enthaltene Dienste
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Dienst | Zweck |
|---|---|
| app (TanStack Start) | Dashboard-Oberfläche auf Port 3000 |
| backend (Fastify/Bun) | REST API auf Port 3100 |
| MongoDB 7 (single-node replica set) | Primäre Datenbank |
| Redis 7 | Job-Warteschlangen und Caching |
| MinIO | S3-kompatibler Objektspeicher (Avatare, Screenshots) |
| Mailpit | Lokale SMTP-Senke + Web-UI für transaktionale E-Mails auf Port 8025 |
Chromium (für die Puppeteer-Screenshot-Generierung verwendet) ist im Backend-Image gebündelt – kein zusätzlicher Container erforderlich.
Migrationshinweise von v8
Wenn Sie von v8 upgraden, beachten Sie, dass v9 keine Breaking Changes enthält. Hier sind jedoch die wichtigsten Änderungen:
- Compiler standardmäßig deaktiviert:
compiler.enabledist jetzt standardmäßigfalse. Wenn Sie auf die Extraktion Ihrer.content.ts-Dateien zur Build-Zeit angewiesen sind, setzen Siecompiler.enabled: truein Ihrerintlayer.config.ts. - Vite-Plugin: Der Compiler und der Locale-Routing-Proxy sind nun in
intlayer()gebündelt. Falls Sie zuvorintlayerCompiler()oderintlayerProxy()manuell registriert haben, können Sie diese entfernen – sie werden automatisch dedupliziert, sodass das Beibehalten harmlos ist. Verwenden Sierouting.enableProxy: false, um den Proxy zu deaktivieren. - Locales & Dialects: Wenn Sie externe i18n-Abhängigkeiten verwenden, fügen Sie deren entsprechende Kompatibilitätsadapter-Plugins in Ihrer Konfiguration oder Ihrem Bundler-Setup hinzu, um Imports automatisch umzuschreiben.
- Custom Selectors: Beim Aufruf von
useIntlayerist der zweite Parameter nun für ein Options-Objekt reserviert, das{ locale, item, variant }enthält. Wenn Sie zuvor direkt einen Locale-String übergeben haben, können Sie dies weiterhin tun, aber die Verwendung des Options-Objekts wird für erweiterte Auswahlen empfohlen. - React Native:
react-native-intlayerre-exportiert nun die gesamtereact-intlayerAPI. Importieren Sie in einer React Native App alles ausreact-native-intlayerund entfernen Sie die direktereact-intlayer-Abhängigkeit. Bestehendereact-intlayer-Imports funktionieren weiterhin.