fix(i18n): localize sidebar, settings tabs, and settings section titles

Three connected bugs where the Label/SettingsSection APIs took a `String`,
which routes through the StringProtocol overloads and bypasses localization
entirely. Identified by the user after testing zh-Hans / de / fr — the
sidebar menu items, Settings tab bar, and Settings section headers all
remained English under any App Language override.

- SidebarSection now exposes displayName: LocalizedStringResource; SidebarView
  builds Label via the Text/Image builders so the catalog key is actually
  used.
- SettingsTab gets the same displayName treatment; the .tabItem Label builds
  through the Text/Image builder too.
- SettingsSection.title changes from String → LocalizedStringKey so literal
  call sites (all ~20 of them) now extract into the catalog. Two call sites
  that were passing String variables (PlatformsView, CredentialPoolsView) are
  wrapped via LocalizedStringKey(...) — brand/provider names fall through to
  English as before. AuxiliaryTab's static task list gets a LocalizedStringKey
  column so its section titles extract too.

This change newly extracts 65 previously-invisible section-title keys into
the catalog; translations added for all six locales. Catalog: 575 → 644
source keys, each locale translated for 583 of them (brand names / protocol
names / format-only keys intentionally fall through).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alan Wizemann
2026-04-21 03:32:32 +02:00
parent 1726a613a5
commit f47034d4ad
14 changed files with 3078 additions and 17 deletions
+65
View File
@@ -20,11 +20,14 @@
"%lld tools": "%lld Tools",
"30 Days": "30 Tage",
"7 Days": "7 Tage",
"90 Days": "90 Tage",
"A QR code will appear below. Scan it with WhatsApp on your phone. The session is saved to ~/.hermes/platforms/whatsapp/ so you won't need to scan again after restarts.": "Unten erscheint ein QR-Code. Scanne ihn mit WhatsApp auf deinem Telefon. Die Sitzung wird unter ~/.hermes/platforms/whatsapp/ gespeichert, damit nach Neustarts kein erneuter Scan nötig ist.",
"API Key": "API-Schlüssel",
"API keys are never displayed in full. Scarf only shows the last 4 characters for identification. Full key values are stored by hermes in ~/.hermes/auth.json.": "API-Schlüssel werden nie vollständig angezeigt. Scarf zeigt nur die letzten 4 Zeichen zur Identifikation. Die vollständigen Werte speichert hermes in ~/.hermes/auth.json.",
"Access Control": "Zugriffskontrolle",
"Actions": "Aktionen",
"Active": "Aktiv",
"Active Personality": "Aktive Persönlichkeit",
"Active profile": "Aktives Profil",
"Activity": "Aktivität",
"Activity Patterns": "Aktivitätsmuster",
@@ -42,6 +45,7 @@
"Add from Preset": "Aus Voreinstellung hinzufügen",
"Add rotation credentials so hermes can failover between keys when one hits rate limits.": "Rotations-Anmeldedaten hinzufügen, damit hermes zwischen Schlüsseln wechseln kann, wenn einer ein Rate-Limit erreicht.",
"Add your first command": "Füge deinen ersten Befehl hinzu",
"Advanced": "Erweitert",
"After approving in your browser, the provider shows a code. Paste it below and submit.": "Nach der Genehmigung im Browser zeigt der Anbieter einen Code. Füge ihn unten ein und sende ab.",
"Agent": "Agent",
"All": "Alle",
@@ -49,25 +53,34 @@
"All Sessions": "Alle Sitzungen",
"All Time": "Gesamter Zeitraum",
"All installed hub skills are up to date.": "Alle installierten Hub-Skills sind aktuell.",
"App Credentials": "App-Anmeldedaten",
"Approval": "Genehmigung",
"Approvals": "Genehmigungen",
"Approve": "Genehmigen",
"Archive": "Archivieren",
"Args (one per line)": "Argumente (eines pro Zeile)",
"Arguments": "Argumente",
"Assistant Message": "Assistentennachricht",
"Auth": "Auth",
"Authentication": "Authentifizierung",
"Authentication uses ssh-agent": "Authentifizierung nutzt ssh-agent",
"Authorization Code": "Autorisierungscode",
"Authorization URL": "Autorisierungs-URL",
"Aux Models": "Hilfsmodelle",
"Auxiliary tasks use separate, typically cheaper models. Leave Provider as `auto` to inherit the main provider.": "Hilfsaufgaben nutzen separate, typischerweise günstigere Modelle. Provider auf `auto` lassen, um den Hauptanbieter zu übernehmen.",
"Back": "Zurück",
"Back to Catalog": "Zurück zum Katalog",
"Backend": "Backend",
"Backup & Restore": "Sicherung & Wiederherstellung",
"Backup Now": "Jetzt sichern",
"Becomes the key under mcp_servers: in config.yaml.": "Wird zum Schlüssel unter mcp_servers: in config.yaml.",
"Behavior": "Verhalten",
"Browse": "Durchsuchen",
"Browse Hub": "Hub durchsuchen",
"Browse the Hub": "Hub durchsuchen",
"Browse...": "Durchsuchen...",
"Browser": "Browser",
"Built-in Memory": "Integrierter Speicher",
"By Day": "Nach Tag",
"By Hour": "Nach Stunde",
"Call timeout": "Aufruf-Timeout",
@@ -81,6 +94,7 @@
"Check for Updates": "Nach Updates suchen",
"Check for Updates…": "Nach Updates suchen…",
"Checking…": "Prüfe…",
"Checkpoints": "Checkpoints",
"Choose a cron job from the list": "Wähle einen Cron-Job aus der Liste",
"Choose a profile to inspect.": "Wähle ein Profil zur Ansicht.",
"Choose a project from the sidebar to view its dashboard.": "Wähle ein Projekt aus der Seitenleiste, um sein Dashboard zu sehen.",
@@ -98,16 +112,21 @@
"Close Window": "Fenster schließen",
"Code: %@": "Code: %@",
"Command": "Befehl",
"Command Allowlist": "Befehls-Allowlist",
"Command looks destructive. Double-check before saving.": "Der Befehl wirkt destruktiv. Vor dem Speichern noch einmal prüfen.",
"Component": "Komponente",
"Compress": "Komprimieren",
"Compress Conversation": "Unterhaltung komprimieren",
"Compress conversation (/compress)": "Unterhaltung komprimieren (/compress)",
"Compression": "Komprimierung",
"Config Diagnostics": "Konfigurations-Diagnose",
"Configure": "Konfigurieren",
"Connect timeout": "Verbindungs-Timeout",
"Connected": "Verbunden",
"Connected — can't read Hermes state": "Verbunden — Hermes-Status nicht lesbar",
"Connection": "Verbindung",
"Container Limits": "Container-Limits",
"Context & Compression": "Kontext & Komprimierung",
"Continue Last Session": "Letzte Sitzung fortsetzen",
"Copied": "Kopiert",
"Copy": "Kopieren",
@@ -132,21 +151,26 @@
"Cron Jobs": "Cron-Jobs",
"Current: %@": "Aktuell: %@",
"Custom…": "Benutzerdefiniert…",
"Daemon Endpoint": "Daemon-Endpunkt",
"Daemon running": "Daemon läuft",
"Dashboard": "Dashboard",
"Default": "Standard",
"Default: ~/.hermes": "Standard: ~/.hermes",
"Defaults to ~/.ssh/config or current user": "Standard ist ~/.ssh/config oder der aktuelle Benutzer",
"Defined Personalities": "Definierte Persönlichkeiten",
"Delegation": "Delegation",
"Delete": "Löschen",
"Delete %@?": "%@ löschen?",
"Delete Session?": "Sitzung löschen?",
"Delete profile '%@'?": "Profil '%@' löschen?",
"Delete...": "Löschen...",
"Deliver: %@": "Zustellen: %@",
"Details": "Details",
"Diagnostic Output": "Diagnose-Ausgabe",
"Diagnostics": "Diagnose",
"Disable": "Deaktivieren",
"Disabled": "Deaktiviert",
"Display": "Anzeige",
"Docs": "Dokumentation",
"Done": "Fertig",
"Edit": "Bearbeiten",
@@ -160,10 +184,13 @@
"Enable 2FA on your email account and generate an app password. Regular account passwords will fail. Always set allowed senders — otherwise anyone knowing the address can message the agent.": "Aktiviere 2FA für dein E-Mail-Konto und erzeuge ein App-Passwort. Normale Kontopasswörter funktionieren nicht. Setze immer erlaubte Absender — sonst kann jeder, der die Adresse kennt, dem Agent Nachrichten schicken.",
"Enable the webhook platform to accept event-driven agent triggers. The HMAC secret is used as a fallback when individual routes don't provide their own.": "Aktiviere die Webhook-Plattform, um ereignisgesteuerte Agent-Trigger zu akzeptieren. Das HMAC-Secret dient als Fallback, wenn einzelne Routen keines liefern.",
"Enabled": "Aktiviert",
"End-to-End Encryption (experimental)": "Ende-zu-Ende-Verschlüsselung (experimentell)",
"Entity Filters (config.yaml only)": "Entity-Filter (nur config.yaml)",
"Env vars, headers, and tool filters can be edited after the server is added.": "Umgebungsvariablen, Header und Tool-Filter können nach dem Hinzufügen des Servers bearbeitet werden.",
"Environment Variables": "Umgebungsvariablen",
"Error": "Fehler",
"Errors": "Fehler",
"Event Filters": "Ereignisfilter",
"Exclude": "Ausschließen",
"Execute": "Ausführen",
"Expected at %@": "Erwartet unter %@",
@@ -172,18 +199,23 @@
"Export…": "Exportieren…",
"Expose prompts": "Prompts verfügbar machen",
"Expose resources": "Ressourcen verfügbar machen",
"External Provider": "Externer Anbieter",
"Feedback": "Feedback",
"Fetch": "Abrufen",
"Files": "Dateien",
"Filter logs...": "Logs filtern...",
"Filter servers...": "Server filtern...",
"Filter skills...": "Skills filtern...",
"Filter to session %@": "Auf Sitzung %@ filtern",
"Flush Memories": "Speicher leeren",
"Focus topic (optional)": "Fokusthema (optional)",
"Full copy of active profile (all state)": "Vollständige Kopie des aktiven Profils (gesamter Zustand)",
"Gateway": "Gateway",
"Gateway Running": "Gateway läuft",
"Gateway Stopped": "Gateway gestoppt",
"Gateway restart required": "Gateway-Neustart erforderlich",
"General": "Allgemein",
"Global Settings": "Globale Einstellungen",
"Header": "Header",
"Headers": "Header",
"Health": "Zustand",
@@ -195,7 +227,10 @@
"Hide": "Ausblenden",
"Hide Output": "Ausgabe ausblenden",
"Hide details": "Details ausblenden",
"Home Channel": "Home-Kanal",
"Homeserver": "Homeserver",
"Host key changed": "Host-Schlüssel geändert",
"Human Delay": "Menschliche Verzögerung",
"ID: %@": "ID: %@",
"If this is the first connection, ensure your key is loaded with `ssh-add` and that the remote accepts it.": "Wenn dies die erste Verbindung ist, stelle sicher, dass dein Schlüssel mit `ssh-add` geladen wurde und der Remote ihn akzeptiert.",
"If you trust the change, remove the stale entry and reconnect:": "Wenn du der Änderung vertraust, entferne den veralteten Eintrag und verbinde dich erneut:",
@@ -217,6 +252,7 @@
"Last probe: %@": "Letzte Prüfung: %@",
"Last run: %@": "Letzter Lauf: %@",
"Last updated: %@": "Zuletzt aktualisiert: %@",
"Layout": "Layout",
"Leave blank to infer from the model ID's prefix (\"openai/...\" → openai).": "Leer lassen, um aus dem Präfix der Modell-ID abzuleiten (\"openai/...\" → openai).",
"Leave blank unless Hermes is installed at a non-default path (systemd services often live at /var/lib/hermes/.hermes; Docker sidecars vary). Test Connection auto-suggests a value when it detects one of the known alternates.": "Leer lassen, außer Hermes liegt nicht am Standardpfad (systemd-Dienste oft unter /var/lib/hermes/.hermes; Docker-Sidecars variieren). Test Connection schlägt automatisch einen Wert vor, wenn es eine bekannte Alternative erkennt.",
"Level": "Ebene",
@@ -227,7 +263,9 @@
"Loading session…": "Lade Sitzung…",
"Local": "Lokal",
"Local (stdio)": "Lokal (stdio)",
"Locale": "Sprache & Region",
"Log File": "Log-Datei",
"Logging": "Logging",
"Logs": "Logs",
"MCP Servers": "MCP-Server",
"MCP Servers (%lld)": "MCP-Server (%lld)",
@@ -241,11 +279,14 @@
"Messages will appear here as the conversation progresses.": "Nachrichten erscheinen hier im Laufe der Unterhaltung.",
"Migrate": "Migrieren",
"Missing required config:": "Fehlende erforderliche Konfiguration:",
"Modal": "Modal",
"Model": "Modell",
"Model ID": "Modell-ID",
"Models": "Modelle",
"Monitor": "Überwachen",
"Name": "Name",
"Name (no leading slash)": "Name (ohne führenden Schrägstrich)",
"Network": "Netzwerk",
"New Session": "Neue Sitzung",
"New Webhook Subscription": "Neues Webhook-Abonnement",
"New name for '%@'": "Neuer Name für '%@'",
@@ -283,6 +324,7 @@
"None": "Keine",
"Notable Sessions": "Bemerkenswerte Sitzungen",
"OAuth login for %@": "OAuth-Anmeldung für %@",
"OK": "OK",
"Open BotFather": "BotFather öffnen",
"Open Developer Portal": "Developer Portal öffnen",
"Open Local": "Lokal öffnen",
@@ -294,6 +336,7 @@
"Open in Editor": "Im Editor öffnen",
"Open in new window": "In neuem Fenster öffnen",
"Open session": "Sitzung öffnen",
"Optional": "Optional",
"Optional — defaults to hostname": "Optional — Standard ist der Hostname",
"Optionally focus the summary on a specific topic. Leave blank to compress evenly.": "Fokussiere die Zusammenfassung optional auf ein bestimmtes Thema. Leer lassen, um gleichmäßig zu komprimieren.",
"Other": "Andere",
@@ -304,11 +347,13 @@
"Pair Device": "Gerät koppeln",
"Paired Users": "Gekoppelte Nutzer",
"Paste code here…": "Code hier einfügen…",
"Paths": "Pfade",
"Pause": "Pausieren",
"Pending Approvals": "Ausstehende Genehmigungen",
"Per-route subscriptions (events, prompt template, delivery target) are managed in the Webhooks sidebar — not here. This panel only controls whether the webhook platform is listening at all.": "Abonnements pro Route (Ereignisse, Prompt-Vorlage, Zustellziel) werden in der Webhooks-Seitenleiste verwaltet — nicht hier. Dieses Panel steuert nur, ob die Webhook-Plattform überhaupt zuhört.",
"Period": "Zeitraum",
"Personalities": "Persönlichkeiten",
"Personality": "Persönlichkeit",
"Pick an MCP server to add.": "Wähle einen MCP-Server zum Hinzufügen.",
"Pick one from the list, or add a new server from the toolbar.": "Wähle einen aus der Liste oder füge über die Symbolleiste einen neuen Server hinzu.",
"Platforms": "Plattformen",
@@ -327,6 +372,7 @@
"Provider": "Anbieter",
"Push to Talk": "Push-to-Talk",
"Push to talk (Ctrl+B)": "Push-to-Talk (Strg+B)",
"Push-to-Talk": "Push-to-Talk",
"Quick Commands": "Schnellbefehle",
"Quick commands are shell shortcuts hermes exposes in chat as `/command_name`. They live under `quick_commands:` in config.yaml.": "Schnellbefehle sind Shell-Shortcuts, die hermes im Chat als `/command_name` verfügbar macht. Sie stehen unter `quick_commands:` in config.yaml.",
"Quit Scarf": "Scarf beenden",
@@ -338,6 +384,7 @@
"Recent Sessions": "Letzte Sitzungen",
"Reconnect": "Erneut verbinden",
"Recording…": "Nehme auf…",
"Redaction": "Redaktion",
"Refresh": "Aktualisieren",
"Reload": "Neu laden",
"Remote (HTTP)": "Remote (HTTP)",
@@ -353,6 +400,8 @@
"Rename Profile": "Profil umbenennen",
"Rename Session": "Sitzung umbenennen",
"Rename...": "Umbenennen...",
"Required": "Erforderlich",
"Required Tokens": "Erforderliche Tokens",
"Requires: %@": "Erfordert: %@",
"Reset Cooldowns": "Cooldowns zurücksetzen",
"Restart": "Neu starten",
@@ -391,6 +440,7 @@
"Search or browse skills published to registries like skills.sh, GitHub, and the official hub.": "Durchsuche oder browse Skills, die in Registries wie skills.sh, GitHub und dem offiziellen Hub veröffentlicht sind.",
"Search registries": "Registries durchsuchen",
"Search…": "Suchen…",
"Security": "Sicherheit",
"Select": "Auswählen",
"Select Model": "Modell auswählen",
"Select a Job": "Job auswählen",
@@ -402,12 +452,14 @@
"Select an MCP Server": "MCP-Server auswählen",
"Send message (Enter)": "Nachricht senden (Enter)",
"Series": "Serie",
"Server": "Server",
"Server No Longer Exists": "Server existiert nicht mehr",
"Server name": "Servername",
"Servers": "Server",
"Service": "Dienst",
"Service definition stale": "Dienstdefinition veraltet",
"Session": "Sitzung",
"Session Search": "Sitzungssuche",
"Session title": "Sitzungstitel",
"Sessions": "Sitzungen",
"Settings": "Einstellungen",
@@ -424,7 +476,9 @@
"Site": "Seite",
"Skills": "Skills",
"Skills (%lld)": "Skills (%lld)",
"Skills Hub": "Skills-Hub",
"Source": "Quelle",
"Speech-to-Text": "Spracherkennung",
"Start": "Starten",
"Start Daemon": "Daemon starten",
"Start Hermes": "Hermes starten",
@@ -449,6 +503,7 @@
"Test Connection": "Verbindung testen",
"Test failed": "Test fehlgeschlagen",
"Test passed": "Test bestanden",
"Text-to-Speech": "Text-to-Speech",
"The agent hasn't advertised any slash commands yet. Keep typing to send as a message, or press Esc.": "Der Agent hat bisher keine Slash-Befehle angeboten. Weitertippen, um als Nachricht zu senden, oder Esc drücken.",
"The remote's SSH fingerprint no longer matches what your `~/.ssh/known_hosts` file expected. This usually means the remote was reinstalled — or, less commonly, that someone is intercepting the connection.": "Der SSH-Fingerabdruck des Remote passt nicht mehr zu dem, was deine `~/.ssh/known_hosts`-Datei erwartet. Meist bedeutet das, dass der Remote neu installiert wurde — seltener, dass jemand die Verbindung abfängt.",
"The server this window was opened with has been removed from your registry.": "Der Server, mit dem dieses Fenster geöffnet wurde, wurde aus deiner Registrierung entfernt.",
@@ -465,14 +520,17 @@
"This will permanently delete the session and all its messages.": "Damit werden die Sitzung und alle ihre Nachrichten dauerhaft gelöscht.",
"Timeout: %llds (%@)": "Timeout: %1$lld s (%2$@)",
"Timeouts": "Timeouts",
"Tirith Sandbox": "Tirith-Sandbox",
"To skip the passphrase prompt at every reboot, add `--apple-use-keychain` to cache it in macOS Keychain.": "Um die Passphrase-Abfrage bei jedem Neustart zu überspringen, füge `--apple-use-keychain` hinzu, um sie im macOS-Schlüsselbund zu cachen.",
"Toggle text-to-speech (/voice tts)": "Text-to-Speech umschalten (/voice tts)",
"Toggle voice mode (/voice)": "Sprachmodus umschalten (/voice)",
"Token on disk. Clear to re-authenticate next time the gateway connects.": "Token auf der Festplatte. Löschen, damit sich das Gateway beim nächsten Verbinden neu authentifiziert.",
"Tool Approval Required": "Tool-Genehmigung erforderlich",
"Tool Filters": "Tool-Filter",
"Tool Progress": "Tool-Fortschritt",
"Tools": "Tools",
"Top Tools": "Top-Tools",
"Turns & Reasoning": "Turns & Reasoning",
"Uninstall": "Deinstallieren",
"Unknown: %@": "Unbekannt: %@",
"Update": "Aktualisieren",
@@ -489,14 +547,21 @@
"Used as the YAML key. Lowercase, no spaces.": "Wird als YAML-Schlüssel verwendet. Kleinbuchstaben, keine Leerzeichen.",
"View": "Anzeigen",
"View All": "Alle anzeigen",
"Vision": "Vision",
"Voice": "Stimme",
"Voice Off": "Stimme aus",
"Voice On": "Stimme an",
"Waiting for authorization URL…": "Warte auf Autorisierungs-URL…",
"Waiting for first probe": "Warte auf erste Prüfung",
"Waiting for hermes to prompt for the code…": "Warte, bis hermes nach dem Code fragt…",
"Web Extract": "Web-Extraktion",
"Webhook (advanced)": "Webhook (erweitert)",
"Webhook (hermes side)": "Webhook (hermes-Seite)",
"Webhook Security": "Webhook-Sicherheit",
"Webhook platform not enabled": "Webhook-Plattform nicht aktiviert",
"Webhooks": "Webhooks",
"Webhooks let external services trigger agent responses. Each subscription gets its own URL endpoint.": "Webhooks ermöglichen externen Diensten, Agent-Antworten auszulösen. Jedes Abonnement hat seinen eigenen URL-Endpunkt.",
"Website Blocklist": "Website-Blockliste",
"WhatsApp uses the Baileys library to emulate a WhatsApp Web session. Pair this Mac as a linked device by running the pairing wizard and scanning the QR code with your phone (Settings → Linked Devices → Link a Device).": "WhatsApp nutzt die Baileys-Bibliothek, um eine WhatsApp-Web-Sitzung zu emulieren. Kopple diesen Mac als verknüpftes Gerät, indem du den Kopplungsassistenten ausführst und den QR-Code mit deinem Telefon scannst (Einstellungen → Verknüpfte Geräte → Gerät verknüpfen).",
"Working": "In Arbeit",
"e.g. anthropic": "z. B. anthropic",