Zum Inhalt springen

Message-Dateien

Ein flaches oder verschachteltes JSON-Objekt pro Namespace, eine Datei pro Locale. Schlüssel haben die Form namespace:dot.path; verschachtelte Objekte werden zu Punktpfaden verflacht.

Aufbau und Schlüssel #

src/lib/messages/<locale>/<namespace>.json. Aus { "nav": { "home": "Startseite" } } wird t('common:nav.home').

src/lib/messages/en/common.json
{ "nav": { "home": "Home" } }

t('common:nav.home') // → "Home"

Parameter #

{$name} setzt einen Wert ein, der als zweites Argument an t übergeben wird.

// message
{ "greeting": "Hello, {$name}!" }

t('home:greeting', { name: 'Kat' }) // → "Hello, Kat!"

Plurale und Selektoren #

Mit .match wählt MF2 anhand des Werts einen Zweig — nach Plural-Kategorien, nicht nur one/other, und diese stammen aus den Regeln der jeweiligen Locale, nicht aus der Bibliothek.

{
	"items": ".input {$count :number}\n.match $count\none {{{$count} item}}\n* {{{$count} items}}"
}

1 Eintrag · 3 Einträge · 5 Einträge

Zahlen, Datum und Geld #

Die Formatierung ist Intl in MF2-Schreibweise: Dieselbe Nachricht rendert €1,234.50 auf Englisch und 1.234,50 € auf Deutsch, ohne dass dein Code etwas Locale-Spezifisches enthält. In jeder Nachricht verfügbar: :number, :integer, :offset, :string (Pflicht), dazu :currency, :date, :datetime, :time, :percent, :unit (Entwurf).

{
	"price": "Total: {$amount :currency currency=EUR}",
	"due": "Due {$when :date length=long}"
}

Gesamt: 1.234,50 € · Fällig am 30. September 2026

Wenn eine Nachricht Probleme macht #

Es wird nie eine Exception geworfen. Eine Quelle, die sich nicht kompilieren lässt, wird als ihr eigener Schlüssel gerendert; bei einem fehlenden Parameter bleibt der Fallback-Text von MF2 stehen. Fehlt ein Schlüssel in der aktiven Locale, durchläuft er eine Kette: Varianten derselben Sprache, dann defaultLocale, dann der Schlüssel selbst.

createDialect({
	defaultLocale: 'en',
	onError: (error, { key, locale }) => report(error, { key, locale })
});