Seiten
Inhalt
Spec — @xpulse/i18n
Status: ACCEPTED · März 2026 Abhängigkeiten:
@xpulse/event,@xpulse/config,@xpulse/routerOptional:@xpulse/template
Prinzipien
- URL ist Source of Truth —
/doc/...= Defaultsprache,/en/doc/...= explizit EN - Kein Cookie, kein Server-State — Sprachpräferenz liegt im
localStorage(Client) - Kein Build-Step — Locale-JSONs werden zur Laufzeit geladen
- Opt-in für andere Packages — wer kein i18n braucht, merkt nichts
Route-Wrapping
@xpulse/i18n wrapped router.register() während seines eigenen Init.
Alle nachfolgenden Routen-Registrierungen (doc, controller, ...) werden automatisch
um /:lang/-Varianten erweitert — unabhängig von deren Init-Reihenfolge.
| @xpulse/router:init |
| └── router.register() = originalRegister() |
| @xpulse/i18n:init (depends: ["xpulse-router"]) |
| └── router.register() = wrapper() |
| @xpulse/doc:init |
| └── router.register('GET', '/doc/...', handler) |
| └── wrapper registriert automatisch: |
| GET /doc/... req.lang = detect(req) |
| GET /de/doc/... req.lang = 'de' |
| GET /en/doc/... req.lang = 'en' |
FOUC-Redirect-Script
Inline-Script im <head>, via http:response:before in alle HTML-Responses injiziert:
| (function(){try{ |
| var l=localStorage.getItem('xpulse_lang'); |
| var s=["en"]; // non-default langs |
| if(l&&s.includes(l)&&!location.pathname.startsWith('/'+l+'/')){ |
| location.replace('/'+l+location.pathname+location.search); |
| } |
| }catch(e){}})(); |
Kein FOUC — der Browser sieht nie die falsche Sprachversion.
SEO
Mit use-seo: true werden automatisch injiziert:
| <link rel="alternate" hreflang="de" href="https://xpulse.one/tool/chat/" /> |
| <link rel="alternate" hreflang="en" href="https://xpulse.one/en/tool/chat/" /> |
| <link rel="alternate" hreflang="x-default" href="https://xpulse.one/tool/chat/" /> |
Paket-Struktur
| @xpulse/i18n/ |
| src/ |
| index.js ← init, lang, t, router-wrap |
| detect.js ← detectLang, stripLang, langFromPath |
| middleware.js ← langHandler, detectHandler, hookResponses |
| template-methods/ |
| lang-switcher.js ← langSwitcher() |
| html-lang.js ← htmlLang() |
| xpulse.json |
| package.json |