xpulse.one ist die Plattform. Nicht nur eine Landing Page fΓΌr den Chat,
sondern der gemeinsame Heimatort fΓΌr alle xPulse Tools, Komponenten und
plattformweite Inhalte.
chat.xpulse.one ist das erste Tool. Weitere kΓΆnnen folgen.
Die Plattform-Rechtsseiten (/privacy/, /terms/, /disclaimer/) enthalten jeweils einen visuell abgesetzten Abschnitt mit den Chat-spezifischen ErgΓ€nzungen β keine separaten Tool-URLs nΓΆtig.
Verlinkung aus der Chat-App:
Ort
Ziel
/info β Datenschutz
xpulse.one/privacy/
/info β Nutzungsbedingungen
xpulse.one/terms/
/info β Haftungsausschluss
xpulse.one/disclaimer/
/info β Impressum
xpulse.one/imprint/
Seiten-Γbersicht
Route
Titel
Typ
Status
/
xPulse
Plattform Landing
v2.0.0
/status/
Status & Versionen
Plattform
v2.0.0
/doc/
Dokumentation
Plattform
v2.0.0
/privacy/
Datenschutz (Plattform)
Rechtlich
v2.0.0
/terms/
Nutzungsbedingungen (Plattform)
Rechtlich
v2.0.0
/disclaimer/
Haftungsausschluss (Plattform)
Rechtlich
v2.0.0
/contact/
Kontakt
Plattform
v2.0.0
/imprint/
Impressum
Rechtlich
v2.0.0
/doc/tool/chat/
Chat-Dokumentation
Docs
v2.0.0
/doc/component/*/
Component-Dokumentation
Docs
v2.0.0
Repo-Struktur
1
xpulse-web/
2
src/
3
index.js
4
controllers/
5
index.js
6
privacy.js
7
terms.js
8
disclaimer.js
9
contact.js
10
imprint.js
11
status.js
12
templates/
13
shared/base.tpl.html
14
platform.tpl.html
15
privacy.tpl.html
16
terms.tpl.html
17
disclaimer.tpl.html
18
contact.tpl.html
19
imprint.tpl.html
20
status.tpl.html
21
translations/
22
de/ platform.*.json
23
en/ platform.*.json
24
themes/
25
web.css
26
public/
27
assets/
28
favicon.svg
29
status/
30
status.json β gitignored, server-seitig
31
status.json.example
32
docs/
33
Dockerfile
34
docker-compose.yml
35
docker-compose.stage.yml
36
Makefile
37
package.json
38
xpulse.json
Infrastruktur
Docker / Traefik
Node.js 22 Alpine hinter Traefik, Port 3000. status.json wird als read-only Volume gemountet.
1
make stage # rc-2-0-0.stage.web.xpulse.one (.env.stage erforderlich)
Keine URL-Slugs fΓΌr Sprachen (/de/, /en/ entfΓ€llt).
Die Sprache ist eine Nutzer-PrΓ€ferenz, keine Route.
Default: de
Wechsel: ohne Page Reload, per JS
Speicherung: localStorage β Key xpulse_lang
<html lang="xx"> wird bei jedem Sprachwechsel aktualisiert
Screenreader-KompatibilitΓ€t
Texte stehen immer als echter Inhalt im DOM β nie leer.
Der Default-Text (Deutsch) ist direkt im HTML eingebettet.
Beim Sprachwechsel ersetzt JS den textContent / innerHTML der Elemente.
Data-Attribute dienen nur als Hook, nicht als Textquelle.
1
<!-- Korrekt: echter Text im HTML, data-i18n nur als Hook -->
2
<pdata-i18n="chat.guide.pairing.intro">
3
Um mit jemandem zu chatten, mΓΌsst ihr euch einmalig pairen...
4
</p>
5
6
<!-- Falsch: leeres Element, Text nur via JS -->
7
<pdata-i18n="chat.guide.pairing.intro"></p>
Dateistruktur
1
locales/
2
de/
3
platform.about.json
4
platform.privacy.json
5
platform.terms.json
6
platform.disclaimer.json
7
tool.chat.guide.json
8
tool.chat.security.json
9
tool.chat.changelog.json
10
tool.chat.privacy.json
11
tool.chat.terms.json
12
tool.chat.disclaimer.json
13
en/
14
platform.about.json
15
platform.privacy.json
16
...
Dateinamen spiegeln die URL-Struktur wider: {scope}.{tool?}.{page}.json.
Der locales/-Ordner wird beim Start vollstΓ€ndig geparst β
neue Dateien werden automatisch erkannt, kein manuelles Registrieren.
JSON-Format
1
{
2
"chat.guide.pairing.intro":"Um mit jemandem zu chatten...",
3
"chat.guide.pairing.step1":"Eine Person ΓΆffnet βPeer hinzufΓΌgen"...",
4
"chat.guide.faq.storage": "AusschlieΓlich lokal in deinem Browser..."
5
}
Flache Key-Value-Struktur. Keys folgen dem Schema {scope}.{page}.{block}.{element}.
Kein tief verschachteltes JSON β einfacher zu durchsuchen und zu pflegen.
JavaScript β i18n.js
1
// Verantwortlichkeiten von i18n.js:
2
// 1. Sprache aus localStorage lesen (Fallback: 'de')
3
// 2. Passendes JSON fΓΌr die aktuelle Seite laden
4
// 3. Alle [data-i18n] Elemente mit textContent/innerHTML befΓΌllen
5
// 4. <html lang="xx"> setzen
6
// 5. Lang-Switch: neue Sprache laden, DOM aktualisieren, localStorage schreiben
7
8
constSTORAGE_KEY = 'xpulse_lang';
9
constDEFAULT_LANG = 'de';
Jede Seite bindet nur das JSON ein das sie braucht β
kein monolithisches Translations-Bundle.