Zum Inhalt springen
Farbschema wählenSprache wählen

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.

  1. Den Schlüssel zu web/messages/en.json hinzufü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 Beispiel workspace_rename_label.

    web/messages/en.json
    "workspace_rename_label": "Rename workspace"
  2. Denselben Schlüssel mit einer deutschen Übersetzung zu web/messages/de.json hinzufü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"
  3. Die Paraglide-Ausgabe neu generieren.

    Terminal window
    cd web
    npm run i18n:compile

    Dieser Befehl führt die paraglide-js compile-Pipeline und den clean-paraglide.mjs-Postprozessor aus. Die Dateien unter web/src/lib/paraglide/ werden direkt aktualisiert.

  4. Den Schlüssel in einer Svelte-Komponente verwenden.

    Importiere m aus 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.

  5. Vor dem Commit lokal überprüfen.

    Terminal window
    cd web
    npx svelte-check --threshold error # 0 Typfehler
    npm run lint # oxlint — 0 Befunde
    npx vitest run # Architekturtests bestehen

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.

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.