Stufe 4c (#764): Kommentare in C#, WebUI-Skripten, CSS und HTML auf Englisch

Rund 2.600 Kommentarblöcke in 310 C#-Dateien übersetzt, Begründungen vollständig
erhalten: blockweise gleiche Anzahl wie vorher, kein Block unter 60 % seiner
Länge, der Code außerhalb der Kommentare per Tokenizer byte-identisch geprüft.
Zitate deutscher Oberflächentexte und Testdaten bleiben deutsch.

WebUI: Kommentare in JS/CSS/HTML übersetzt, JSDoc-@param an die in 4b
umbenannten Parameter angeglichen.

Dabei behoben:
- 4b hatte "tag" (HTML-Tag) als deutsches "Tag" gelesen und zu "dayValue"
  gemacht (makeElement, svg, Tagesübersicht) - zurück auf tag/day.
- Aufgaben "InProgress" bekamen die Plakettenart "laufend", für die es nie eine
  CSS-Klasse gab - jetzt "success" wie laufende Instanzen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-04 12:45:03 +02:00
co-authored by Claude Opus 5.5
parent da4ceac7d5
commit 837a634a22
311 changed files with 7238 additions and 7252 deletions
@@ -5,13 +5,13 @@ using Shouldly;
namespace ClawdDotNet.App.Tests.Services;
/// <summary>
/// Die Regeln, die bis zum 2026-09-06 in den Avalonia-Ansichtsmodellen standen.
/// The rules that until 2026-09-06 lived in the Avalonia view models.
///
/// <para>Dass sie dort standen, war der Grund für diese Tests: Ein Ansichtsmodell hat
/// keine Testabdeckung — das sagt der Oberflächen-Leitfaden ausdrücklich —, und mit der
/// zweiten Oberfläche wären dieselben Regeln ein zweites Mal geschrieben worden. Jetzt
/// gibt es sie einmal, und ab hier ist geprüft, dass beide Oberflächen dasselbe
/// bekommen.</para>
/// <para>That they lived there was the reason for these tests: a view model has
/// no test coverage — the UI guide says so explicitly —, and with the
/// second user interface the same rules would have been written a second time. Now
/// they exist once, and from here on it is checked that both user interfaces get the same
/// thing.</para>
/// </summary>
public sealed class AgentAdministrationTests
{
@@ -30,8 +30,8 @@ public sealed class AgentAdministrationTests
[Fact]
public void Die_Pruefung_ignoriert_Gross_und_Kleinschreibung()
{
// Zwei Agenten, die sich nur darin unterscheiden, waeren auf der Zielplattform
// zwei Ordner und fuer jeden Menschen derselbe Agent.
// Two agents differing only in that would be two folders on the target platform
// and the same agent to every human.
using var host = new TestHost(TestHost.Agent("scout"));
host.Host.AgentAdmin.Add(new NewAgent("SCOUT", "Scout", "modell")).Ok.ShouldBeFalse();
@@ -49,10 +49,10 @@ public sealed class AgentAdministrationTests
[Fact]
public void Ein_angelegter_Agent_ueberlebt_den_Neustart()
{
// Der Kern des Befunds: LoadInstanceConfig leert die Agentenliste und baut sie
// aus den Ordnern Agents/Agent-* wieder auf. Ein Agent, der nur in
// InstanceSettings.json stand, war nach dem naechsten Start weg — genau das tat
// die Oberflaeche bis zum 2026-09-06.
// The core of the finding: LoadInstanceConfig clears the agent list and rebuilds it
// from the folders Agents/Agent-*. An agent that only stood in
// InstanceSettings.json was gone after the next start — exactly what
// the user interface did until 2026-09-06.
using var host = new TestHost();
host.Host.AgentAdmin.Add(new NewAgent("scout", "Scout", "modell", "Späher")).Ok.ShouldBeTrue();
@@ -65,9 +65,9 @@ public sealed class AgentAdministrationTests
[Fact]
public void Aenderungen_an_einem_Agenten_ueberleben_den_Neustart()
{
// Dieselbe Ursache aus der anderen Richtung: Bis zum 2026-09-06 rief niemand im
// laufenden Betrieb SaveAgentSettings. Modell, Prompt und Budget standen nur in
// InstanceSettings.json — es sah aus wie Speichern und war keines.
// The same cause from the other direction: until 2026-09-06 nobody called
// SaveAgentSettings during operation. Model, prompt and budget only stood in
// InstanceSettings.json — it looked like saving and wasn't.
using var host = new TestHost();
host.Host.AgentAdmin.Add(new NewAgent("scout", "Scout", "altes-modell"));
@@ -105,8 +105,8 @@ public sealed class AgentAdministrationTests
[Fact]
public void Jede_Aenderung_meldet_sich()
{
// Ohne diese Meldung erschiene ein in der Weboberflaeche angelegter Agent im
// laufenden Fenster nicht — der ganze Grund, warum es das Ereignis gibt.
// Without this notification an agent created in the web UI would not appear in the
// running window — the whole reason the event exists.
using var host = new TestHost();
host.Host.AgentAdmin.Add(new NewAgent("scout", "Scout", "modell"));
@@ -119,9 +119,9 @@ public sealed class AgentAdministrationTests
[Fact]
public void Ein_entfernter_Agent_kommt_nach_dem_Neustart_nicht_wieder()
{
// Die Gegenrichtung desselben Befunds: Nur aus der Liste zu streichen genuegte
// nicht — der Ordner blieb liegen, und beim naechsten Start stand der Agent
// wieder da.
// The opposite direction of the same finding: merely striking it from the list was not
// enough — the folder stayed behind, and at the next start the agent was
// back.
using var host = new TestHost();
host.Host.AgentAdmin.Add(new NewAgent("scout", "Scout", "modell"));
@@ -135,8 +135,8 @@ public sealed class AgentAdministrationTests
[Fact]
public void Ein_entfernter_Agent_behaelt_seine_Arbeit()
{
// Umbenannt, nicht geloescht. Im Arbeitsordner steht seine Arbeit, und ein Klick
// in einer Liste ist keine Entscheidung, sie wegzuwerfen.
// Renamed, not deleted. Its work is in the working folder, and a click
// in a list is no decision to throw it away.
using var host = new TestHost();
host.Host.AgentAdmin.Add(new NewAgent("scout", "Scout", "modell"));
@@ -167,7 +167,7 @@ public sealed class AgentAdministrationTests
host.Host.AgentAdmin.Find("scout")!.Tools["FileRW"].ShouldBeEmpty();
}
// ─── #641: Rechte in der Werkzeugkonfiguration ───
// ─── #641: permissions in the tool configuration ───
[Fact]
public void Rechte_werden_normalisiert_gespeichert_und_ueberleben_den_Neustart()
@@ -188,7 +188,7 @@ public sealed class AgentAdministrationTests
[Fact]
public void Einstellungen_speichern_loescht_die_Rechte_nicht()
{
// Die Einstellungsmasken schreiben ein frisches Woerterbuch ohne "erlaubt".
// The settings forms write a fresh dictionary without "erlaubt".
using var host = new TestHost(TestHost.Agent("scout"));
host.Host.AgentAdmin.SetToolEnabled("scout", "Database", enabled: true);
host.Host.AgentAdmin.SetToolRights("scout", "Database", ["select"], []);
@@ -278,7 +278,7 @@ public sealed class JobAdministrationTests
[Fact]
public void Ein_leerer_Zeitplan_ist_kein_Fehler()
{
// Leer heisst „nie" und ist eine gueltige Angabe. Nur unlesbar ist ein Fehler.
// Empty means "never" and is a valid statement. Only unreadable is an error.
using var host = new TestHost(TestHost.Agent("scout"));
host.Host.JobAdmin.Add(new JobDefinition("scout", JobKind.AgentWakeup)).Ok.ShouldBeTrue();
@@ -287,9 +287,9 @@ public sealed class JobAdministrationTests
[Fact]
public void Ein_Wakeup_laesst_sich_nicht_abschalten()
{
// SchedulerConfig hat keinen Schalter, und einen hier zu erfinden hiesse, dass
// der Scanner ihn erst einmal lesen muesste. Sonst liefe ein „abgeschalteter"
// Wakeup munter weiter.
// SchedulerConfig has no switch, and inventing one here would mean that
// the scanner would first have to read it. Otherwise a "disabled"
// wakeup would happily keep running.
using var host = new TestHost(TestHost.Agent("scout"));
host.Host.JobAdmin.Add(new JobDefinition("scout", JobKind.AgentWakeup, Cron: "0 * * * *"));
@@ -321,8 +321,8 @@ public sealed class JobAdministrationTests
[Fact]
public void Ohne_Scanner_gilt_ein_Wakeup_als_nicht_aktiv()
{
// Er laeuft, solange der Scanner laeuft — der ist der einzige periodische
// Treiber. Ohne ihn steht er, ohne dass jemand ihn abgeschaltet haette.
// It runs as long as the scanner runs — that is the only periodic
// driver. Without it, it stands still without anyone having disabled it.
using var host = new TestHost(TestHost.Agent("scout"));
host.Host.JobAdmin.Add(new JobDefinition("scout", JobKind.AgentWakeup, Cron: "0 * * * *"));