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,9 +5,9 @@ using Shouldly;
namespace ClawdDotNet.Core.Tests.Tasks;
/// <summary>
/// Die Wahrheitsaufteilung in Aktion: Der Dienst hält Markdown-Datei (Definition) und
/// DB (Ausführungszustand) im Gleichschritt. Getestet gegen echtes Dateisystem und echte
/// SQLite — beide Seiten sind der Punkt.
/// The split of truth in action: the service keeps the Markdown file (definition) and
/// DB (execution state) in step. Tested against a real file system and real
/// SQLite — both sides are the point.
/// </summary>
public sealed class TaskboardServiceTests : IDisposable
{
@@ -30,7 +30,7 @@ public sealed class TaskboardServiceTests : IDisposable
{
ClawdDotNet.Core.Storage.SqliteStorage.ReleasePooledConnections(_directory);
try { Directory.Delete(_directory, recursive: true); }
catch { /* Aufräumen ist Nebensache */ }
catch { /* Cleaning up is secondary */ }
}
private static TaskItem Def(string title = "Aufgabe", string assignee = "@new")
@@ -44,10 +44,10 @@ public sealed class TaskboardServiceTests : IDisposable
created.Id.ShouldNotBeNullOrWhiteSpace();
created.Id.ShouldStartWith("t-");
// DB-Seite
// DB side
(await _repo.GetAsync(created.Id, default)).ShouldNotBeNull();
// Datei-Seite: existiert und lässt sich zur selben Definition zurücklesen
// File side: exists and can be read back to the same definition
var path = Path.Combine(_tasksDir, created.FileName);
File.Exists(path).ShouldBeTrue();
@@ -76,7 +76,7 @@ public sealed class TaskboardServiceTests : IDisposable
updated!.Title.ShouldBe("Neu");
updated.Status.ShouldBe(TaskItemStatus.Done);
// Beide Seiten spiegeln die Änderung
// Both sides mirror the change
(await _repo.GetAsync(created.Id, default))!.Status.ShouldBe(TaskItemStatus.Done);
TaskFrontmatter.TryParse(
File.ReadAllText(Path.Combine(_tasksDir, created.FileName)), out var fromFile, out _);
@@ -126,7 +126,7 @@ public sealed class TaskboardServiceTests : IDisposable
imported.ShouldNotBeNull();
imported!.Id.ShouldNotBeNullOrWhiteSpace();
// Die Id wurde in die Datei zurückgeschrieben — überlebt den nächsten Start.
// The ID was written back into the file — survives the next start.
TaskFrontmatter.TryParse(File.ReadAllText(path), out var fromFile, out _);
fromFile.Id.ShouldBe(imported.Id);
}
@@ -139,7 +139,7 @@ public sealed class TaskboardServiceTests : IDisposable
await _board.ImportAllAsync(default);
// Die Historie bleibt: die Zeile ist archiviert, nicht weg.
// The history stays: the row is archived, not gone.
var after = await _repo.GetAsync(created.Id, default);
after.ShouldNotBeNull();
after!.Status.ShouldBe(TaskItemStatus.Archived);
@@ -148,14 +148,14 @@ public sealed class TaskboardServiceTests : IDisposable
[Fact]
public async Task Ein_Re_Import_setzt_einen_laufenden_Status_nicht_zurueck()
{
// Die Kernregel der Wahrheitsaufteilung über den Dienst geprüft.
// The core rule of the split of truth, checked via the service.
var created = await _board.CreateAsync(Def(), default);
await _repo.TryClaimAsync(created.Id, "2026-07-31T07:00:00.0000000Z", "tok",
DateTime.UtcNow, DateTime.UtcNow.AddHours(-1), default);
await _repo.CompleteClaimAsync(created.Id, "tok", TaskItemStatus.Done, DateTime.UtcNow, default);
// Die Datei sagt weiterhin "todo" (so wurde sie angelegt) — ein Import darf das
// nicht über den erreichten Done-Status stülpen.
// The file still says "todo" (that is how it was created) — an import must not
// impose that over the done status reached.
await _board.ImportAllAsync(default);
(await _repo.GetAsync(created.Id, default))!.Status.ShouldBe(TaskItemStatus.Done);