xPulse
🇩🇪 DE
Seiten
Inhalt

Spec — @xpulse/i18n

Status: ACCEPTED · März 2026 Abhängigkeiten: @xpulse/event, @xpulse/config, @xpulse/router Optional: @xpulse/template

Prinzipien

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.jslangSwitcher()
html-lang.jshtmlLang()
xpulse.json
package.json
de/spec.md 2026-03-31