Die Architektur
/en/blog/hello ← Default-Locale, trotzdem mit Prefix (sauberer als ein Sonderfall)
/ru/blog/hello
/zh/blog/hello
/ja/blog/hello
/de/blog/hello
Drei bewegliche Teile:
- Dictionaries — ein JSON pro Locale, identische Form, typisiert als
Record<Locale, typeof en>, sodass TypeScript schreit, wenn ein Key abweicht. - Dynamische Routen —
src/pages/[locale]/...mitgetStaticPaths(), das jede Locale zurückgibt. - Content-Fallback — Posts einmal in
en/schreiben und unter jeder Locale rendern, bis Übersetzungen existieren.
Der Type-Trick, der dich rettet
export type Locale = "en" | "ru" | "zh" | "ja" | "de";
const dictionaries: Record<Locale, typeof en> = { en, ru, zh, ja, de };
typeof en ist das Schema. Füge einen Key zu en.json hinzu, und der Build schlägt fehl, bis die vier anderen Dictionaries nachziehen.
Vergiss den head nicht
<link rel="alternate" hreflang="..."> für jede Locale plus x-default, Canonical pro Seite und aus Astro.url abgeleitete Pfade. Suchmaschinen belohnen die langweilige Klempnerarbeit.