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
@@ -9,8 +9,8 @@ using Shouldly;
namespace ClawdDotNet.Tools.Tests.Database;
/// <summary>
/// Vorpruefung (#579), Freigabeschluessel (#609) und Rechte (#641) des Database-Werkzeugs -
/// alles ohne Datenbankverbindung pruefbar, weil es nur Konfiguration und Statement ansieht.
/// Pre-check (#579), approval key (#609) and permissions (#641) of the Database tool -
/// all checkable without a database connection, because it only looks at configuration and statement.
/// </summary>
public sealed class DatabaseVorpruefungTests
{
@@ -48,8 +48,8 @@ public sealed class DatabaseVorpruefungTests
[InlineData("DESCRIBE messwerte", "ReadOnly")]
public void Die_Vorpruefung_urteilt_nicht_mehr_ueber_die_Operation(string sql, string level)
{
// #641: Ob ein INSERT eines lesenden Agenten laeuft, vorgelegt oder verboten wird,
// entscheidet die Freigabestelle - nicht mehr eine stille Ablehnung im Werkzeug.
// #641: Whether an INSERT of a reading agent runs, is presented or is forbidden
// is decided by the approval point - no longer by a silent refusal in the tool.
Tool.Preflight(Sql(sql), Kontext(level, "messwerte")).ShouldBeNull();
}
@@ -88,8 +88,8 @@ public sealed class DatabaseVorpruefungTests
[Fact]
public async Task Ohne_Freigabestelle_bleibt_die_Zugriffsstufe_eine_harte_Grenze()
{
// Kein Gate, keine Pruefung: dann muss das Werkzeug selbst verweigern, bevor es
// ueberhaupt eine Verbindung aufbaut.
// No gate, no check: then the tool itself has to refuse before it
// even establishes a connection.
var ergebnis = await Tool.ExecuteAsync(
Sql("INSERT INTO messwerte (ort) VALUES ('Berlin')"), Kontext("ReadOnly", "messwerte"), default);
@@ -4,13 +4,13 @@ using Shouldly;
namespace ClawdDotNet.Tools.Tests.Database;
/// <summary>
/// S1 aus der Bestandsaufnahme: Die Tabellen-Whitelist suchte den erlaubten Namen als
/// Teilzeichenkette irgendwo im Statement — auch in einem Kommentar. Bei
/// allowedTables ["prices"] genügte deshalb "DELETE FROM users -- prices", um eine
/// beliebige andere Tabelle zu löschen.
/// S1 from the inventory: the table whitelist looked for the allowed name as a
/// substring anywhere in the statement — including in a comment. With
/// allowedTables ["prices"] therefore "DELETE FROM users -- prices" was enough to delete
/// any other table.
///
/// Die Gegenproben sind genauso wichtig wie die Angriffe: Ein zu strenger Filter, der
/// legitime Abfragen blockiert, wäre im Betrieb genauso unbrauchbar.
/// The counter-checks are just as important as the attacks: a filter that is too strict and
/// blocks legitimate queries would be just as useless in operation.
/// </summary>
public sealed class SqlGuardTests
{
@@ -19,10 +19,10 @@ public sealed class SqlGuardTests
private static SqlInspection Inspect(string sql) => SqlGuard.Inspect(sql, Allowed);
// ═══════════════════════════════════════════════════════════
// Angriffe — alle müssen abgelehnt werden
// Attacks — all must be rejected
// ═══════════════════════════════════════════════════════════
// ─── #610: wiederholbares Anlegen und Strukturabfragen ───
// ─── #610: repeatable creation and structure queries ───
[Theory]
[InlineData("CREATE TABLE IF NOT EXISTS prices (id INT)", SqlOperation.Schema)]
@@ -86,7 +86,7 @@ public sealed class SqlGuardTests
[InlineData("INSERT INTO users SELECT * FROM prices")]
public void Ein_einziger_unerlaubter_Join_reicht_zur_Ablehnung(string sql)
{
// Entscheidend: JEDE referenzierte Tabelle muss erlaubt sein, nicht irgendeine.
// Crucial: EVERY referenced table must be allowed, not just any one.
var result = Inspect(sql);
result.IsValid.ShouldBeFalse();
@@ -109,7 +109,7 @@ public sealed class SqlGuardTests
}
// ═══════════════════════════════════════════════════════════
// Gegenproben — legitime Abfragen müssen durchgehen
// Counter-checks — legitimate queries must get through
// ═══════════════════════════════════════════════════════════
[Theory]
@@ -132,8 +132,8 @@ public sealed class SqlGuardTests
[InlineData("SELECT * FROM prices WHERE aktion = 'drop'")]
public void Harmlose_Schluesselwoerter_in_Werten_gelten_nicht_als_Schreibzugriff(string sql)
{
// Der alte Substring-Test stufte diese Abfragen fälschlich als Schreib- bzw.
// Strukturzugriff ein und blockierte sie für ReadOnly-Agenten.
// The old substring test wrongly classified these queries as write or
// structure access and blocked them for read-only agents.
var result = Inspect(sql);
result.IsValid.ShouldBeTrue(result.Error);