diff --git a/src/ClaudeDo.Localization/locales/de.json b/src/ClaudeDo.Localization/locales/de.json index d3d94c95..d40850a9 100644 --- a/src/ClaudeDo.Localization/locales/de.json +++ b/src/ClaudeDo.Localization/locales/de.json @@ -11,6 +11,7 @@ "categoryGeneral": "Allgemein", "categoryExecution": "Ausführung", "categoryPrime": "Prime Claude", + "categoryPrimeHint": "Geplante Claude-Läufe: Ping, My Day füllen oder ein eigener Prompt, zu festen Zeiten.", "categoryWorktrees": "Worktrees", "categoryFiles": "Dateien & Prompts", "categorySkills": "Session Skills", @@ -27,6 +28,7 @@ "model": "Modell", "maxTurns": "Max. Durchläufe", "effort": "Effort", + "effortHint": "Denkaufwand, den das Modell anwendet. Höher kostet mehr und denkt tiefer.", "modelPresets": "Vorgaben pro Modell", "modelPresetsHint": "Effort und Durchlauf-Budget, mit denen eine Sitzung unter diesem Modell läuft. Overrides auf Listen- und Aufgabenebene gewinnen weiterhin.", "maxTurnsCeiling": "Max. Durchläufe – Obergrenze", @@ -50,6 +52,7 @@ "powerUseWindowPlaceholder": "HH:mm", "powerUseHandoffPct": "Übergabe bei (% von 5h)", "powerUseWindowHint": "Beide Zeiten leer = rund um die Uhr. Das Fenster wird bei jedem Start einer Handler-Phase geprüft — eine Kette, die über das Ende hinausläuft, macht ohne PowerUse weiter.", + "powerUseWindowInvalid": "PowerUse-Zeiten müssen im Format HH:mm sein oder leer bleiben.", "throttleStagesHeading": "Throttle-Stufen", "throttleStagesHint": "Die Parallelität wird vor dem harten Gate begrenzt: soft auf 2 Slots, hard auf 1. Eingestellt wird das durch Ziehen der Marker an den Gauges im Usage-Monitor. Der Monitor schließt diese Einstellungen — vorher speichern, wenn du etwas geändert hast.", "throttleStagesValues": "5h: soft {0}% / hard {1}% · 7d: soft {2}% / hard {3}%", diff --git a/src/ClaudeDo.Localization/locales/en.json b/src/ClaudeDo.Localization/locales/en.json index db94367c..3c27cca8 100644 --- a/src/ClaudeDo.Localization/locales/en.json +++ b/src/ClaudeDo.Localization/locales/en.json @@ -11,6 +11,7 @@ "categoryGeneral": "General", "categoryExecution": "Execution", "categoryPrime": "Prime Claude", + "categoryPrimeHint": "Scheduled Claude runs: Ping, Fill My Day, or a custom prompt, at fixed times.", "categoryWorktrees": "Worktrees", "categoryFiles": "Files & Prompts", "categorySkills": "Session Skills", @@ -27,6 +28,7 @@ "model": "Model", "maxTurns": "Max turns", "effort": "Effort", + "effortHint": "Reasoning effort the model applies. Higher costs more and reasons deeper.", "modelPresets": "Per-model defaults", "modelPresetsHint": "Reasoning effort and turn budget used when a session runs under that model. List- and task-level max-turn overrides still win.", "maxTurnsCeiling": "Max turns ceiling", @@ -50,6 +52,7 @@ "powerUseWindowPlaceholder": "HH:mm", "powerUseHandoffPct": "Hand off at (% of 5h)", "powerUseWindowHint": "Leave both times empty for round the clock. A window is checked whenever a handler phase starts, so a chain that runs past the end time continues without PowerUse.", + "powerUseWindowInvalid": "PowerUse window times must be HH:mm, or left blank.", "throttleStagesHeading": "Throttle stages", "throttleStagesHint": "Parallelism is capped before the hard gate: soft caps at 2 slots, hard at 1. Edited by dragging the markers on the usage-monitor gauges. Opening the monitor closes these settings — save first if you changed anything.", "throttleStagesValues": "5h: soft {0}% / hard {1}% · 7d: soft {2}% / hard {3}%", diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs index 7fb528cd..571ba865 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs @@ -119,8 +119,13 @@ public sealed partial class GeneralSettingsTabViewModel : ViewModelBase foreach (var row in ModelPresets) if (row.MaxTurns is < 1 or > 200) return $"Max turns for {row.Model} must be between 1 and 200."; + if (!IsValidWindowBound(PowerUseWindowStart) || !IsValidWindowBound(PowerUseWindowEnd)) + return Loc.T("settings.general.powerUseWindowInvalid"); return null; } + + private static bool IsValidWindowBound(string? value) + => string.IsNullOrWhiteSpace(value) || PowerUseWindow.Parse(value) is not null; } /// One row of the per-model preset table. Single consumer, so it lives here. diff --git a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml index 4325820b..26a48f19 100644 --- a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml +++ b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml @@ -190,7 +190,8 @@ Opacity="0.6" FontSize="12" TextWrapping="Wrap"/> - + @@ -307,7 +308,8 @@ - +