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,11 +5,11 @@ using Shouldly;
namespace ClawdDotNet.Core.Tests.Memory;
/// <summary>
/// K1 aus der Bestandsaufnahme: Geplante Agenten begannen bei jedem Cron-Lauf bei null.
/// K1 from the inventory: scheduled agents started from zero at every cron run.
///
/// Getestet wird gegen eine echte SQLite-Datei, nicht gegen eine Attrappe — nur so
/// werden Schema, Indizes, Sperrverhalten und die Behandlung gleichzeitiger Zugriffe
/// tatsächlich geprüft.
/// Testing is against a real SQLite file, not against a fake — only that way
/// are schema, indexes, locking behavior and the handling of simultaneous access
/// actually checked.
/// </summary>
public sealed class MemoryRepositoryTests : IDisposable
{
@@ -31,7 +31,7 @@ public sealed class MemoryRepositoryTests : IDisposable
{
ClawdDotNet.Core.Storage.SqliteStorage.ReleasePooledConnections(_directory);
try { Directory.Delete(_directory, recursive: true); }
catch { /* Aufräumen ist Nebensache */ }
catch { /* Cleaning up is secondary */ }
}
private Task<MemoryEntry> Remember(
@@ -66,7 +66,7 @@ public sealed class MemoryRepositoryTests : IDisposable
}, default);
// ═══════════════════════════════════════════════════════════
// Grundfunktionen
// Basic functions
// ═══════════════════════════════════════════════════════════
[Fact]
@@ -113,14 +113,14 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Schlüssel: aktualisieren statt zuwachsen
// Key: update instead of growing
// ═══════════════════════════════════════════════════════════
[Fact]
public async Task Ein_Schluessel_aktualisiert_statt_eine_zweite_Erinnerung_anzulegen()
{
// Sonst wüchse das Gedächtnis bei einem alle 30 Minuten laufenden Agenten
// binnen eines Tages um 48 Einträge zur selben Sache.
// Otherwise, with an agent running every 30 minutes, the memory would grow
// by 48 entries about the same thing within a day.
await Remember("NVDA", "Kursziel 120", key: "kursziel_nvda");
await Remember("NVDA", "Kursziel 145", key: "kursziel_nvda");
@@ -162,7 +162,7 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Bereiche
// Scopes
// ═══════════════════════════════════════════════════════════
[Fact]
@@ -195,13 +195,13 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Reihenfolge und Kappung
// Order and capping
// ═══════════════════════════════════════════════════════════
[Fact]
public async Task Wichtiges_kommt_zuerst()
{
// Entscheidend, weil der Abruf begrenzt wird — das Wichtigste muss überleben.
// Crucial, because recall is limited — the most important things must survive.
await Remember("A", "nebensächlich", importance: 1);
await Remember("B", "zentral", importance: 5);
await Remember("C", "mittel", importance: 3);
@@ -254,7 +254,7 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Schlagworte
// Keywords
// ═══════════════════════════════════════════════════════════
[Fact]
@@ -271,7 +271,7 @@ public sealed class MemoryRepositoryTests : IDisposable
[Fact]
public async Task Ein_Schlagwort_trifft_kein_laengeres_mit_gleichem_Anfang()
{
// "news" darf nicht "newsletter" treffen.
// "news" must not match "newsletter".
await Remember("A", "eins", tags: ["newsletter"]);
(await Recall(tags: "news")).ShouldBeEmpty();
@@ -289,7 +289,7 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Löschen und Überblick
// Deleting and overview
// ═══════════════════════════════════════════════════════════
[Fact]
@@ -334,13 +334,13 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Nebenläufigkeit — der eigentliche Grund für WAL und busy_timeout
// Concurrency — the actual reason for WAL and busy_timeout
// ═══════════════════════════════════════════════════════════
[Fact]
public async Task Viele_Agenten_koennen_gleichzeitig_schreiben()
{
// Ohne WAL und Sperr-Wartezeit quittiert SQLite das mit "database is locked".
// Without WAL and lock wait time SQLite answers this with "database is locked".
var tasks = Enumerable.Range(0, 60)
.Select(i => Remember($"Betreff {i % 5}", $"Notiz {i}", owner: $"agent-{i % 6}"));
@@ -367,7 +367,7 @@ public sealed class MemoryRepositoryTests : IDisposable
}
// ═══════════════════════════════════════════════════════════
// Sonderfälle
// Special cases
// ═══════════════════════════════════════════════════════════
[Fact]
@@ -376,7 +376,7 @@ public sealed class MemoryRepositoryTests : IDisposable
await Remember("A", "Erster Eintrag");
await Remember("B", "Zweiter Eintrag");
// Als LIKE-Muster würde "%" alles treffen.
// As a LIKE pattern "%" would match everything.
(await Recall("%")).ShouldBeEmpty();
}
@@ -402,7 +402,7 @@ public sealed class MemoryRepositoryTests : IDisposable
[Fact]
public async Task Erinnerungen_ueberdauern_das_Schliessen_der_Datenbank()
{
// Der eigentliche Zweck: Ein Neustart der Anwendung darf nichts kosten.
// The actual purpose: a restart of the application must cost nothing.
await Remember("Dauerhaft", "muss einen Neustart überleben");
var wiederEroeffnet = new SqliteMemoryRepository(