feat(studio): Flows + Module sheet + System-AI editor i18n (v0.28.0)
- Localize Flows page: app-bar title and reload tooltip,
hub-unreachable / no-saved-flows empty states, run-flow input
dialog (title with flow name, description, hint, Cancel /
Run), running dialog (title, "Flow running…" status, no-output
message, Close button), flow-card Run button.
- Localize the module-sheet bottom sheet: failed-to-load text,
Capabilities and "Declared permissions" section headers,
no-permissions placeholder copy.
- Localize the System-AI configuration dialog: title, intro
paragraph, provider dropdown label, endpoint label, API-key
env-var label (required vs optional) and disclaimer, privacy
mode header and three options (Off / Redacted / Full) plus
their descriptions, test-result panel ("Connection ok" /
"Connection failed", "Reply: …" prefix), model picker (label,
hint fallback, helper text with Ollama variant, Refresh /
Pull / Pulling… buttons, list errors and empty states),
hardware banner ("Detected: …" + " · curation reviewed …"
suffix), suitability legend (recommended / balanced / small /
large / huge / unknown), cache row with pluralized count and
Clear button, cache cleared / clear-failed toasts, pull-empty
/ pull-failed errors. Suitability label moved off a getter
onto a `labelFor(BuildContext)` method so it can read the
current locale.
Provider preset descriptions and modelHint strings stay in
English in `_ProviderPreset.all` — they're tightly coupled to
the wire-protocol identifiers and would require a runtime
factory rebuild rather than a const list.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
parent
e2b2639a86
commit
b5a4c74c4b
10 changed files with 1120 additions and 91 deletions
|
|
@ -663,6 +663,60 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
@override
|
||||
String get modulesUninstalling => 'Wird deinstalliert…';
|
||||
|
||||
@override
|
||||
String moduleSheetFailedToLoad(String error) {
|
||||
return 'Laden fehlgeschlagen: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get moduleSheetCapabilities => 'Capabilities';
|
||||
|
||||
@override
|
||||
String get moduleSheetPermissions => 'Deklarierte Berechtigungen';
|
||||
|
||||
@override
|
||||
String get moduleSheetNoPermissions => '(keine — reines Berechnungsmodul)';
|
||||
|
||||
@override
|
||||
String get flowsTitle => 'Flows';
|
||||
|
||||
@override
|
||||
String get flowsReloadTooltip => 'Aktualisieren';
|
||||
|
||||
@override
|
||||
String get flowsNoneTitle => 'Keine gespeicherten Flows';
|
||||
|
||||
@override
|
||||
String get flowsNoneHint =>
|
||||
'Flow speichern mit `fai admin flows save <name> <flow.yaml>`, dann taucht er hier auf.';
|
||||
|
||||
@override
|
||||
String flowsRunDialogTitle(String name) {
|
||||
return '$name ausführen';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsRunDialogBody =>
|
||||
'Eingaben als key=value, eine pro Zeile. Alle Werte werden als Text-Payloads gesendet. Für binäre Eingaben die `fai run` CLI nutzen.';
|
||||
|
||||
@override
|
||||
String get flowsInputsHint =>
|
||||
'name=World\ntarget_language=English\nsummary_style=three bullet points';
|
||||
|
||||
@override
|
||||
String get flowsRunButton => 'Starten';
|
||||
|
||||
@override
|
||||
String flowsRunningTitle(String name) {
|
||||
return '$name läuft';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsRunning => 'Flow läuft…';
|
||||
|
||||
@override
|
||||
String get flowsNoOutputs => 'Flow abgeschlossen ohne deklarierte Outputs.';
|
||||
|
||||
@override
|
||||
String get approvalsTitle => 'Freigaben';
|
||||
|
||||
|
|
@ -1005,4 +1059,189 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get searchSavedFlowHint => 'gespeicherter Flow';
|
||||
|
||||
@override
|
||||
String get systemAiTitle => 'System-AI';
|
||||
|
||||
@override
|
||||
String get systemAiIntro =>
|
||||
'Die hub-interne LLM, die die Plattform selbst für Fehlererklärungen und Operator-Hilfe nutzt. Standardmäßig aus; hier konfigurieren. Siehe docs/architecture/system-ai.md, was über die Leitung geht.';
|
||||
|
||||
@override
|
||||
String get systemAiProviderLabel => 'Provider';
|
||||
|
||||
@override
|
||||
String get systemAiEndpointLabel => 'Endpunkt-URL (bis /v1)';
|
||||
|
||||
@override
|
||||
String get systemAiApiKeyRequired =>
|
||||
'API-Key-Umgebungsvariable (erforderlich)';
|
||||
|
||||
@override
|
||||
String get systemAiApiKeyOptional => 'API-Key-Umgebungsvariable (optional)';
|
||||
|
||||
@override
|
||||
String systemAiApiKeyDisclaimer(String name) {
|
||||
return 'Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest `\$$name` zur Anfragezeit.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiTestConnection => 'Verbindung testen';
|
||||
|
||||
@override
|
||||
String get systemAiTesting => 'Teste…';
|
||||
|
||||
@override
|
||||
String get systemAiSave => 'Speichern';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyHeader => 'PRIVACY-MODUS';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyOffLabel => 'Aus';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyOffDesc =>
|
||||
'Feature deaktiviert. Keine Anfragen verlassen den Hub.';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyRedactedLabel => 'Redigiert';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyRedactedDesc =>
|
||||
'Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyFullLabel => 'Voll';
|
||||
|
||||
@override
|
||||
String get systemAiPrivacyFullDesc =>
|
||||
'Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).';
|
||||
|
||||
@override
|
||||
String get systemAiConnectionOk => 'Verbindung ok';
|
||||
|
||||
@override
|
||||
String get systemAiConnectionFailed => 'Verbindung fehlgeschlagen';
|
||||
|
||||
@override
|
||||
String systemAiReplyPrefix(String text) {
|
||||
return 'Antwort: $text';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiModelLabel => 'Modell (erforderlich)';
|
||||
|
||||
@override
|
||||
String get systemAiModelHintFallback =>
|
||||
'Modell-Identifier, den der Provider erwartet';
|
||||
|
||||
@override
|
||||
String get systemAiModelHelperBase =>
|
||||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.';
|
||||
|
||||
@override
|
||||
String get systemAiModelHelperOllama =>
|
||||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.';
|
||||
|
||||
@override
|
||||
String get systemAiRefresh => 'Aktualisieren';
|
||||
|
||||
@override
|
||||
String get systemAiPull => 'Pull';
|
||||
|
||||
@override
|
||||
String get systemAiPulling => 'Lade…';
|
||||
|
||||
@override
|
||||
String systemAiCouldNotListModels(String error) {
|
||||
return 'Modelle konnten nicht aufgelistet werden: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiNoModelsOllama =>
|
||||
'Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.';
|
||||
|
||||
@override
|
||||
String get systemAiNoModelsGeneric => 'Provider lieferte keine Modelle.';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilityRecommended => 'empfohlen';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilityBalanced => 'ausgewogen';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilitySmall => 'klein — Qualität evtl. eingeschränkt';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilityLarge => 'groß — langsamer';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilityHuge =>
|
||||
'sehr groß — auf einem Laptop wahrscheinlich zu langsam';
|
||||
|
||||
@override
|
||||
String get systemAiSuitabilityUnknown => 'Größe unbekannt';
|
||||
|
||||
@override
|
||||
String systemAiHwDetected(String summary) {
|
||||
return 'Erkannt: $summary';
|
||||
}
|
||||
|
||||
@override
|
||||
String systemAiHwReviewed(String date) {
|
||||
return ' · Kuratierung geprüft $date';
|
||||
}
|
||||
|
||||
@override
|
||||
String systemAiLegendRecommended(String tier) {
|
||||
return 'empfohlen für diese Hardware$tier';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiLegendBalanced => 'ausgewogen (4-8B)';
|
||||
|
||||
@override
|
||||
String get systemAiLegendSmallLarge =>
|
||||
'klein <3B / groß 9-15B / über Hardware';
|
||||
|
||||
@override
|
||||
String get systemAiLegendHuge => 'sehr groß >15B';
|
||||
|
||||
@override
|
||||
String get systemAiLegendUnknown => 'Größe unbekannt';
|
||||
|
||||
@override
|
||||
String systemAiCacheRow(int n) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
n,
|
||||
locale: localeName,
|
||||
other: 'gespeicherte Erklärungen',
|
||||
one: 'gespeicherte Erklärung',
|
||||
);
|
||||
return 'Cache: $n $_temp0. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiCacheClear => 'Leeren';
|
||||
|
||||
@override
|
||||
String systemAiCacheClearedToast(int n) {
|
||||
return '$n gespeicherte System-AI-Erklärungen gelöscht.';
|
||||
}
|
||||
|
||||
@override
|
||||
String systemAiCacheClearFailed(String error) {
|
||||
return 'Cache-Löschen fehlgeschlagen: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get systemAiPullEmptyError =>
|
||||
'Erst eine Modell-ID eintippen (z.B. gemma3:4b).';
|
||||
|
||||
@override
|
||||
String systemAiPullFailedError(String error) {
|
||||
return 'Pull fehlgeschlagen: $error';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue