Einen i18n-Schlüssel hinzufügen
Die Web-UI von SupaCloud verwendet Paraglide für
die Internationaliserung. Die Nachrichtenkataloge befinden sich in web/messages/en.json und web/messages/de.json.
Der generierte Code in web/src/lib/paraglide/ wird aus diesen Dateien erzeugt — bearbeite die
generierten Dateien nicht direkt.
-
Den Schlüssel zu
web/messages/en.jsonhinzufügen.Schlüssel müssen dem Muster
[a-z0-9_]+entsprechen (nur Kleinbuchstaben, Ziffern und Unterstriche). Wähle einen Namen, der aussagekräftig ist und zum Feature passt, zum Beispielworkspace_rename_label.web/messages/en.json "workspace_rename_label": "Rename workspace" -
Denselben Schlüssel mit einer deutschen Übersetzung zu
web/messages/de.jsonhinzufügen.Beide Kataloge müssen synchron gehalten werden — der Architekturtest
"uses Paraglide-safe message ids"schlägt fehl, wenn sich die Schlüsselsätze unterscheiden.web/messages/de.json "workspace_rename_label": "Workspace umbenennen" -
Die Paraglide-Ausgabe neu generieren.
Terminal window cd webnpm run i18n:compileDieser Befehl führt die
paraglide-js compile-Pipeline und denclean-paraglide.mjs-Postprozessor aus. Die Dateien unterweb/src/lib/paraglide/werden direkt aktualisiert. -
Den Schlüssel in einer Svelte-Komponente verwenden.
Importiere
maus dem generierten Modul und rufe es als Funktion auf:<script lang="ts">import { m } from "$lib/paraglide/messages.js";</script><button>{m.workspace_rename_label()}</button>Bette niemals einen rohen String-Literal für benutzersichtbaren Text ein — der Architekturtest
"keeps obvious Svelte template copy behind Paraglide calls"schlägt bei wörtlichem Text innerhalb von Svelte-Templates fehl. -
Vor dem Commit lokal überprüfen.
Terminal window cd webnpx svelte-check --threshold error # 0 Typfehlernpm run lint # oxlint — 0 Befundenpx vitest run # Architekturtests bestehen
i18n-Lint-Schutz — „team“ für den Tenant
Abschnitt betitelt „i18n-Lint-Schutz — „team“ für den Tenant“Der Frontend-Architekturtest "forbids new user-facing Workspace/Teams copy outside the agent/delivery namespaces" durchsucht alle Werte in beiden Katalogen nach dem Wort team/teams (Groß-/Kleinschreibung wird ignoriert).
Ein neuer Schlüssel, dessen Wert „team“ oder „teams“ enthält, schlägt in CI fehl, sofern sein Schlüsselname nicht einem der erlaubten Namespaces entspricht:
| Erlaubtes Schlüsselmuster | Zweck |
|---|---|
teammate |
Multi-Agent-Feature „Teammates“ |
agent_teams |
Agenten-Team-Gruppierung |
delivery_* |
Anzeigetexte des Delivery-Boards |
issue_tracker_team_key |
Feldbezeichnung „Team key“ in Linear |
notify_to_placeholder |
Beispieltext für Benachrichtigungsadresse |
Wenn der Text, den du hinzufügst, einen Tenant (einen Workspace oder eine Organisation) bezeichnet, verwende stattdessen diese Begriffe. „Team“ und „Teams“ sind der Agenten-Domäne vorbehalten. Siehe das Glossar der ubiquitären Sprache und ADR 0040.
Parametrisierte Nachrichten
Abschnitt betitelt „Parametrisierte Nachrichten“Wenn der String einen Laufzeitwert benötigt, füge einen Platzhalter in der ICU-MessageFormat-Syntax ein:
"task_cost_summary": "Total cost: {amount}"Die generierte Funktion akzeptiert dann ein typisiertes Argument:
{m.task_cost_summary({ amount: formattedCost })}Halte Platzhalternamen kurz, in Kleinbuchstaben und aussagekräftig.