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,12 +5,12 @@ using Shouldly;
namespace ClawdDotNet.Web.Tests;
/// <summary>
/// Kein Zugangsdatum verlässt die API.
/// No credential leaves the API.
///
/// <para>Das ist die Prüfung, die man nicht von Hand machen will: Werkzeug-Einstellungen
/// sind ein freies Wörterbuch, und ob darin ein Passwort steckt, entscheidet der Name des
/// Schlüssels. Ein <c>return agent.Tools;</c> hätte den ganzen Baum samt Passwörtern ins
/// Netz geschickt — die Sorte Fehler, die niemandem auffällt, weil alles funktioniert.</para>
/// <para>This is the check nobody wants to do by hand: tool settings
/// are a free dictionary, and whether there is a password in it is decided by the name of the
/// key. A <c>return agent.Tools;</c> would have sent the whole tree including passwords onto the
/// network — the kind of error nobody notices, because everything works.</para>
/// </summary>
public sealed class SecretMaskingTests
{
@@ -26,15 +26,15 @@ public sealed class SecretMaskingTests
var dto = Mapping.ToDto("Mail", einstellungen);
// Keys.ShouldContain statt ShouldContainKey: Die DTOs geben
// IReadOnlyDictionary heraus, und Shouldlys Woerterbuch-Erweiterungen sitzen
// auf IDictionary.
// Keys.ShouldContain instead of ShouldContainKey: the DTOs hand out
// IReadOnlyDictionary, and Shouldly's dictionary extensions sit
// on IDictionary.
dto.Values.Keys.ShouldContain("host");
dto.Values.Keys.ShouldContain("port");
dto.Values.Keys.ShouldNotContain("password");
// Was herauskommt, ist die Auskunft „da steht etwas" — mehr braucht eine
// Anzeige nicht, und mehr darf sie nicht wissen.
// What comes out is the information "something is there" — a display
// needs no more, and may know no more.
dto.Secrets["password"].ShouldBeTrue();
}
@@ -65,8 +65,8 @@ public sealed class SecretMaskingTests
[InlineData("webUiToken")]
public void Jeder_bekannte_Geheimnisname_wird_maskiert(string schluessel)
{
// Die Liste kommt aus ConfigSecrets und nicht aus einer zweiten hier: Eine
// zweite waere die, die beim naechsten neuen Werkzeug vergessen wird.
// The list comes from ConfigSecrets and not from a second one here: a
// second would be the one forgotten with the next new tool.
ConfigSecrets.IsSecretKey(schluessel).ShouldBeTrue();
Mapping.ToDto("X", new Dictionary<string, object?> { [schluessel] = "geheim" })
@@ -83,8 +83,8 @@ public sealed class SecretMaskingTests
[Fact]
public void Ein_serialisiertes_DTO_enthaelt_das_Geheimnis_nicht()
{
// Der Test, der wirklich zaehlt: nicht die Struktur, sondern das, was ueber die
// Leitung geht.
// The test that really counts: not the structure, but what goes over the
// line.
var dto = Mapping.ToDto("Mail", new Dictionary<string, object?>
{
["host"] = "mail.example",