fix: i18n button text stripping and German translation corrections (v0.42.1)
Three sidebar buttons (+ New job/skill/profile) and three suggestion buttons had data-i18n on the outer element, causing applyLocaleToDOM to strip the + prefix and emoji characters when switching locales. Fixed by wrapping only the label text in a <span data-i18n=...>. Also corrects German translations: - cancelling: imperative -> progressive (Wird abgebrochen...) - editing: first-person verb -> noun (Bearbeitung) - empty_subtitle: add missing 'explore files' clause - settings_desc_check_updates: add git fetch detail - settings_desc_cli_sessions: add 'continue the conversation' clause Co-authored-by: Nathan Esquenazi <nesquena@gmail.com>
This commit is contained in:
@@ -6,6 +6,12 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
## [v0.42.1] — 2026-04-11
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- **i18n button text stripping** (post-review): Three sidebar buttons (`+ New job`, `+ New skill`, `+ New profile`) and three suggestion buttons had `data-i18n` on the outer element, which caused `applyLocaleToDOM` to replace the entire `textContent` — stripping the `+` prefix and emoji characters on locale switch. Fixed by wrapping only the translatable label text in a `<span data-i18n="...">`.
|
||||||
|
- **German translation corrections** (post-review): Fixed `cancelling` (imperative → progressive `"Wird abgebrochen…"`), `editing` (first-person verb → noun `"Bearbeitung"`), and completed truncated descriptions for `empty_subtitle`, `settings_desc_check_updates`, and `settings_desc_cli_sessions`.
|
||||||
|
|
||||||
## [v0.42.0] — 2026-04-10
|
## [v0.42.0] — 2026-04-10
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ const LOCALES = {
|
|||||||
_label: 'Deutsch',
|
_label: 'Deutsch',
|
||||||
_speech: 'de-DE',
|
_speech: 'de-DE',
|
||||||
// boot.js
|
// boot.js
|
||||||
cancelling: 'Abbrechen\u2026',
|
cancelling: 'Wird abgebrochen\u2026',
|
||||||
cancel_failed: 'Abbrechen fehlgeschlagen: ',
|
cancel_failed: 'Abbrechen fehlgeschlagen: ',
|
||||||
mic_denied: 'Mikrofonzugriff verweigert. Überprüfen Sie die Browserberechtigungen.',
|
mic_denied: 'Mikrofonzugriff verweigert. Überprüfen Sie die Browserberechtigungen.',
|
||||||
mic_no_speech: 'Keine Sprache erkannt. Versuchen Sie es erneut.',
|
mic_no_speech: 'Keine Sprache erkannt. Versuchen Sie es erneut.',
|
||||||
@@ -344,9 +344,9 @@ const LOCALES = {
|
|||||||
settings_label_notifications: 'Browser-Benachrichtigungen',
|
settings_label_notifications: 'Browser-Benachrichtigungen',
|
||||||
settings_desc_notifications: 'Zeigt eine Systembenachrichtigung an, wenn eine Antwort fertiggestellt wird, während der Tab im Hintergrund ist.',
|
settings_desc_notifications: 'Zeigt eine Systembenachrichtigung an, wenn eine Antwort fertiggestellt wird, während der Tab im Hintergrund ist.',
|
||||||
settings_desc_token_usage: 'Zeigt die Anzahl der Input/Output-Token unter jeder Antwort des Assistenten an. Auch umschaltbar mit /usage.',
|
settings_desc_token_usage: 'Zeigt die Anzahl der Input/Output-Token unter jeder Antwort des Assistenten an. Auch umschaltbar mit /usage.',
|
||||||
settings_desc_cli_sessions: 'Fügt Sitzungen aus der Hermes CLI (state.db) in die Sitzungsliste ein. Klicken Sie auf eine CLI-Sitzung, um sie zu importieren.',
|
settings_desc_cli_sessions: 'Fügt Sitzungen aus der Hermes CLI (state.db) in die Sitzungsliste ein. Klicken Sie auf eine CLI-Sitzung, um sie zu importieren und das Gespräch fortzusetzen.',
|
||||||
settings_desc_sync_insights: 'Spiegelt den WebUI-Token-Verbrauch in die state.db, sodass hermes /insights Browser-Sitzungsdaten enthält. Standardmäßig aus.',
|
settings_desc_sync_insights: 'Spiegelt den WebUI-Token-Verbrauch in die state.db, sodass hermes /insights Browser-Sitzungsdaten enthält. Standardmäßig aus.',
|
||||||
settings_desc_check_updates: 'Zeigt ein Banner an, wenn neuere Versionen der WebUI oder des Agenten verfügbar sind.',
|
settings_desc_check_updates: 'Zeigt ein Banner an, wenn neuere Versionen der WebUI oder des Agenten verfügbar sind. Führt regelmäßig einen Git-Fetch im Hintergrund aus.',
|
||||||
settings_desc_bot_name: 'Anzeigename für den Assistenten in der UI. Standardmäßig Hermes.',
|
settings_desc_bot_name: 'Anzeigename für den Assistenten in der UI. Standardmäßig Hermes.',
|
||||||
settings_desc_password: 'Geben Sie ein neues Passwort ein, um es zu setzen oder zu ändern. Leer lassen, um die aktuelle Einstellung beizubehalten.',
|
settings_desc_password: 'Geben Sie ein neues Passwort ein, um es zu setzen oder zu ändern. Leer lassen, um die aktuelle Einstellung beizubehalten.',
|
||||||
password_placeholder: 'Neues Passwort eingeben…',
|
password_placeholder: 'Neues Passwort eingeben…',
|
||||||
@@ -355,10 +355,10 @@ const LOCALES = {
|
|||||||
cancel: 'Abbrechen',
|
cancel: 'Abbrechen',
|
||||||
create_job: 'Job erstellen',
|
create_job: 'Job erstellen',
|
||||||
save_skill: 'Skill speichern',
|
save_skill: 'Skill speichern',
|
||||||
editing: 'Bearbeite',
|
editing: 'Bearbeitung',
|
||||||
// Empty state
|
// Empty state
|
||||||
empty_title: 'Wie kann ich helfen?',
|
empty_title: 'Wie kann ich helfen?',
|
||||||
empty_subtitle: 'Frage mich alles, führe Befehle aus oder verwalte deine Aufgaben.',
|
empty_subtitle: 'Frage mich alles, führe Befehle aus, erkunde Dateien oder verwalte deine Aufgaben.',
|
||||||
suggest_files: 'Welche Dateien sind in diesem Workspace?',
|
suggest_files: 'Welche Dateien sind in diesem Workspace?',
|
||||||
suggest_schedule: 'Was steht heute auf meinem Plan?',
|
suggest_schedule: 'Was steht heute auf meinem Plan?',
|
||||||
suggest_plan: 'Hilf mir, ein kleines Projekt zu planen.',
|
suggest_plan: 'Hilf mir, ein kleines Projekt zu planen.',
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="layout">
|
<div class="layout">
|
||||||
<aside class="sidebar">
|
<aside class="sidebar">
|
||||||
<div class="sidebar-header"><div class="logo">H</div><div><h1 style="margin:0;font-size:15px;font-weight:700;letter-spacing:-.01em">Hermes</h1><div style="font-size:10px;color:var(--muted);opacity:.8;margin-top:1px">v0.42.0</div></div></div>
|
<div class="sidebar-header"><div class="logo">H</div><div><h1 style="margin:0;font-size:15px;font-weight:700;letter-spacing:-.01em">Hermes</h1><div style="font-size:10px;color:var(--muted);opacity:.8;margin-top:1px">v0.42.1</div></div></div>
|
||||||
<div class="sidebar-nav">
|
<div class="sidebar-nav">
|
||||||
<button class="nav-tab active" data-panel="chat" data-label="Chat" onclick="switchPanel('chat')" title="Chat" data-i18n-title="tab_chat">💬</button>
|
<button class="nav-tab active" data-panel="chat" data-label="Chat" onclick="switchPanel('chat')" title="Chat" data-i18n-title="tab_chat">💬</button>
|
||||||
<button class="nav-tab" data-panel="tasks" data-label="Tasks" onclick="switchPanel('tasks')" title="Tasks" data-i18n-title="tab_tasks">📅</button>
|
<button class="nav-tab" data-panel="tasks" data-label="Tasks" onclick="switchPanel('tasks')" title="Tasks" data-i18n-title="tab_tasks">📅</button>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<div class="panel-view" id="panelTasks">
|
<div class="panel-view" id="panelTasks">
|
||||||
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
||||||
<div style="font-size:11px;color:var(--muted)" data-i18n="scheduled_jobs">Scheduled jobs</div>
|
<div style="font-size:11px;color:var(--muted)" data-i18n="scheduled_jobs">Scheduled jobs</div>
|
||||||
<button class="cron-btn run" style="padding:3px 8px;font-size:10px" onclick="toggleCronForm()" data-i18n="new_job">+ New job</button>
|
<button class="cron-btn run" style="padding:3px 8px;font-size:10px" onclick="toggleCronForm()">+ <span data-i18n="new_job">New job</span></button>
|
||||||
</div>
|
</div>
|
||||||
<!-- Create job form (hidden by default) -->
|
<!-- Create job form (hidden by default) -->
|
||||||
<div id="cronCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
<div id="cronCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<div class="panel-view" id="panelSkills">
|
<div class="panel-view" id="panelSkills">
|
||||||
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
||||||
<div class="skills-search" style="flex:1;padding:0"><input id="skillsSearch" placeholder="Search skills..." data-i18n-placeholder="search_skills" oninput="filterSkills()"></div>
|
<div class="skills-search" style="flex:1;padding:0"><input id="skillsSearch" placeholder="Search skills..." data-i18n-placeholder="search_skills" oninput="filterSkills()"></div>
|
||||||
<button class="cron-btn run" style="padding:3px 8px;font-size:10px;flex-shrink:0;margin-left:6px" onclick="toggleSkillForm()" data-i18n="new_skill">+ New skill</button>
|
<button class="cron-btn run" style="padding:3px 8px;font-size:10px;flex-shrink:0;margin-left:6px" onclick="toggleSkillForm()">+ <span data-i18n="new_skill">New skill</span></button>
|
||||||
</div>
|
</div>
|
||||||
<!-- Skill create/edit form (hidden by default) -->
|
<!-- Skill create/edit form (hidden by default) -->
|
||||||
<div id="skillCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
<div id="skillCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
<div class="panel-view" id="panelProfiles">
|
<div class="panel-view" id="panelProfiles">
|
||||||
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
<div class="sidebar-section" style="padding-bottom:4px;display:flex;align-items:center;justify-content:space-between">
|
||||||
<div style="font-size:11px;color:var(--muted)" data-i18n="tab_profiles">Agent profiles</div>
|
<div style="font-size:11px;color:var(--muted)" data-i18n="tab_profiles">Agent profiles</div>
|
||||||
<button class="cron-btn run" style="padding:3px 8px;font-size:10px" onclick="toggleProfileForm()" data-i18n="new_profile">+ New profile</button>
|
<button class="cron-btn run" style="padding:3px 8px;font-size:10px" onclick="toggleProfileForm()">+ <span data-i18n="new_profile">New profile</span></button>
|
||||||
</div>
|
</div>
|
||||||
<!-- Profile create form (hidden by default) -->
|
<!-- Profile create form (hidden by default) -->
|
||||||
<div id="profileCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
<div id="profileCreateForm" style="display:none;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0">
|
||||||
@@ -195,9 +195,9 @@
|
|||||||
<h2 data-i18n="empty_title">What can I help with?</h2>
|
<h2 data-i18n="empty_title">What can I help with?</h2>
|
||||||
<p data-i18n="empty_subtitle">Ask anything, run commands, explore files, or manage your scheduled tasks.</p>
|
<p data-i18n="empty_subtitle">Ask anything, run commands, explore files, or manage your scheduled tasks.</p>
|
||||||
<div class="suggestion-grid">
|
<div class="suggestion-grid">
|
||||||
<button class="suggestion" data-msg="What files are in this workspace?" data-i18n="suggest_files">📁 What files are in this workspace?</button>
|
<button class="suggestion" data-msg="What files are in this workspace?">📁 <span data-i18n="suggest_files">What files are in this workspace?</span></button>
|
||||||
<button class="suggestion" data-msg="What's on my schedule today?" data-i18n="suggest_schedule">📋 What's on my schedule today?</button>
|
<button class="suggestion" data-msg="What's on my schedule today?">📋 <span data-i18n="suggest_schedule">What's on my schedule today?</span></button>
|
||||||
<button class="suggestion" data-msg="Help me plan a small project." data-i18n="suggest_plan">🗺 Help me plan a small project.</button>
|
<button class="suggestion" data-msg="Help me plan a small project.">🗺 <span data-i18n="suggest_plan">Help me plan a small project.</span></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="messages-inner" id="msgInner"></div>
|
<div class="messages-inner" id="msgInner"></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user