i18n: Englisch als Hauptsprache, Sprachpakete fuer Desktop und WebUI (#661)
Umbau durch Gemini Flash, Durchsicht und Nacharbeit durch Claude. Umfang: - Desktop: LocalizationManager (JSON-Pakete, Rueckfall auf Englisch, Umschalten zur Laufzeit), Localize-Markup-Erweiterung, Sprachwahl in den Einstellungen (AppSettings.Language, Vorgabe "en"); 317 Schluessel je Sprache - WebUI: alle Ansichten auf t()/data-i18n, 656 Schluessel je Sprache - Agenten-Werkzeuge: Beschreibungen, Schemata und Meldungen auf Englisch - Tests an die englischen Meldungen angepasst, keine Pruefung abgeschwaecht Nacharbeit bei der Durchsicht: - ~25 Kommentarbloecke mit Begruendungen waren ersatzlos entfallen, darunter sicherheitsrelevante (NTFS-Datenstrom beim shared:-Praefix, Bremse gegen Agentenschleifen, doppelter POST beim Anlegen einer Instanz). Wieder eingesetzt: auf Englisch, wo die Datei umgestellt ist, sonst im Wortlaut. - Drei WebUI-Schluessel fehlten (logs.paused, instances.instanceOfflineError, instances.noInstanceActiveError). Weil t() bei fehlendem Schluessel den Schluessel selbst liefert, griff der "|| err.message"-Rueckfall nie — die Oberflaeche haette den Schluesselnamen angezeigt. Geprueft: Schluesselgleichheit en/de, Platzhalter je Schluessel, jeder im Code benutzte Schluessel vorhanden, node --check fuer alle Module, 1.220 Tests gruen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
69718122f3
commit
ad71682c2d
@@ -10,9 +10,9 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
public string Name => "WebMonitor";
|
||||
|
||||
public string Description => """
|
||||
Überwacht Webseiten auf neue Einträge und liefert nur die Deltas seit dem letzten Check.
|
||||
Speichert den Stand in der Datenbank. Ideal für Capitol Trades, SEC-Filings, etc.
|
||||
Aktionen: check, history, status
|
||||
Monitors web pages for new entries and returns only the deltas since the last check.
|
||||
Stores the state in the database. Ideal for Capitol Trades, SEC filings, etc.
|
||||
Actions: check, history, status
|
||||
""";
|
||||
|
||||
public JsonElement InputSchema { get; } = JsonDocument.Parse("""
|
||||
@@ -23,15 +23,15 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
"action": {
|
||||
"type": "string",
|
||||
"enum": ["check", "history", "status"],
|
||||
"description": "check=jetzt prüfen und Deltas liefern, history=bisherige Einträge, status=letzter Check-Zeitpunkt"
|
||||
"description": "check=check now and return deltas, history=previous entries, status=last check timestamp"
|
||||
},
|
||||
"monitorId": {
|
||||
"type": "string",
|
||||
"description": "z.B. capitol_trades, sec_filings — muss in Config definiert sein"
|
||||
"description": "e.g. capitol_trades, sec_filings — must be defined in config"
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "max. Anzahl Einträge für history, default 50"
|
||||
"description": "max number of entries for history, default 50"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,11 +52,11 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
: context.ToolConfig;
|
||||
|
||||
if (config == null || !config.TryGetValue("monitors", out var m) || m is not JsonElement monitorsJe)
|
||||
return ToolResult.Fail("WebMonitor Konfiguration oder Monitore fehlen.");
|
||||
return ToolResult.Fail("WebMonitor configuration or monitors missing.");
|
||||
|
||||
var monitors = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(monitorsJe.GetRawText());
|
||||
if (monitors == null || !monitors.TryGetValue(monitorId, out var monitorConfigJe))
|
||||
return ToolResult.Fail($"Monitor '{monitorId}' nicht in der Config gefunden.");
|
||||
return ToolResult.Fail($"Monitor '{monitorId}' not found in configuration.");
|
||||
|
||||
var monitorConfig = JsonSerializer.Deserialize<Dictionary<string, object?>>(monitorConfigJe.GetRawText())!;
|
||||
|
||||
@@ -65,13 +65,13 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
"check" => await CheckForNewEntriesAsync(monitorId, monitorConfig, context, ct),
|
||||
"history" => await GetHistoryAsync(monitorId, input, context, ct),
|
||||
"status" => await GetStatusAsync(monitorId, context, ct),
|
||||
_ => ToolResult.Fail($"Unbekannte Aktion: {action}")
|
||||
_ => ToolResult.Fail($"Unknown action: {action}")
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Logger.LogError(ex, "Fehler in WebMonitor");
|
||||
return ToolResult.Fail($"Fehler: {ex.Message}");
|
||||
context.Logger.LogError(ex, "Error in WebMonitor");
|
||||
return ToolResult.Fail($"Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
data = new
|
||||
{
|
||||
newEntries = newEntries,
|
||||
message = newEntries.Count == 0 ? "Keine neuen Einträge." : $"{newEntries.Count} neue Einträge gefunden."
|
||||
message = newEntries.Count == 0 ? "No new entries." : $"{newEntries.Count} new entries found."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -177,7 +177,7 @@ public sealed class WebMonitorTool : IAgentTool
|
||||
private async Task<ToolResult> GetHistoryAsync(string monitorId, JsonElement input, AgentToolContext context, CancellationToken ct)
|
||||
{
|
||||
// Simple history from StateStore or just message for now as we don't have a separate DB table for this yet
|
||||
return ToolResult.Ok(JsonSerializer.Serialize(new { message = "History-Feature ist über den StateStore aktuell auf die letzte ID begrenzt." }));
|
||||
return ToolResult.Ok(JsonSerializer.Serialize(new { message = "History feature is currently limited to the last ID via StateStore." }));
|
||||
}
|
||||
|
||||
private async Task<ToolResult> GetStatusAsync(string monitorId, AgentToolContext context, CancellationToken ct)
|
||||
|
||||
Reference in New Issue
Block a user