feat(studio): first-run UX, recovery affordances, l10n, bundled fonts
- Connection-aware Welcome: when the hub is down, show a hero with a primary "Start hub" CTA + install fallback instead of a dead, all-unchecked onboarding checklist (the first-run cliff). - Actionable binary-not-found (file picker + install link, not a "set FAI_BIN" dead end) and a connect-failure banner after repeated failed health polls. - Localize six hardcoded English error/toast clusters (DE+EN ARB). - Bundle Inter + JetBrains Mono as assets; drop the runtime google_fonts fetch (air-gap / KRITIS safe, no font-swap flash). Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
parent
7511867774
commit
5313266cc4
25 changed files with 1231 additions and 234 deletions
|
|
@ -2502,4 +2502,134 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
String installFailed(String error) {
|
||||
return 'Installation fehlgeschlagen: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get welcomeHubDownTitle => 'Der Hub läuft noch nicht';
|
||||
|
||||
@override
|
||||
String get welcomeHubDownBody =>
|
||||
'Studio spricht mit einem lokalen Hub — der Engine, die Module lädt und Flows ausführt. Sie ist gerade nicht erreichbar. Starte sie, um loszulegen.';
|
||||
|
||||
@override
|
||||
String get welcomeHubDownStart => 'Hub starten';
|
||||
|
||||
@override
|
||||
String get welcomeHubDownStarting => 'Wird gestartet …';
|
||||
|
||||
@override
|
||||
String get welcomeHubDownDocsLink =>
|
||||
'Klappt der Start nicht? Zur Erste-Schritte-Anleitung';
|
||||
|
||||
@override
|
||||
String welcomeHubDownEndpoint(String endpoint) {
|
||||
return 'Endpunkt: $endpoint';
|
||||
}
|
||||
|
||||
@override
|
||||
String get daemonStartRequested =>
|
||||
'Start des Daemons angefordert. Verbinde neu …';
|
||||
|
||||
@override
|
||||
String daemonStartFailed(String detail) {
|
||||
return 'Daemon konnte nicht gestartet werden: $detail';
|
||||
}
|
||||
|
||||
@override
|
||||
String get faiBinaryNotFound =>
|
||||
'Das Programm `fai` wurde auf diesem Rechner nicht gefunden.';
|
||||
|
||||
@override
|
||||
String get faiBinaryNotFoundHint =>
|
||||
'Installiere die F∆I-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.';
|
||||
|
||||
@override
|
||||
String get faiBinaryLocateButton => '`fai`-Programm suchen …';
|
||||
|
||||
@override
|
||||
String get faiBinaryInstallDocsButton => 'Installationsanleitung öffnen';
|
||||
|
||||
@override
|
||||
String get faiBinaryPickerTitle => '`fai`-Programm auswählen';
|
||||
|
||||
@override
|
||||
String faiBinarySetOk(String path) {
|
||||
return 'Verwende `fai` unter $path';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sysAiFixParse =>
|
||||
'Der Anbieter hat in einem unerwarteten Format geantwortet. Anbieter, die nicht OpenAI-kompatibel sind, brauchen ggf. einen Übersetzungs-Proxy.';
|
||||
|
||||
@override
|
||||
String sysAiFixUnknown(String kind) {
|
||||
return 'Unerwarteter Fehler ($kind). Siehe System-KI-Dokumentation.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sysAiFixDisabled =>
|
||||
'Richte die System-KI in den Einstellungen (Cmd+,) → Bereich System-KI ein.';
|
||||
|
||||
@override
|
||||
String get sysAiFixEnvMissing =>
|
||||
'Die Umgebungsvariable für den API-Schlüssel ist leer. Setze sie in deiner Shell und starte den Daemon neu.';
|
||||
|
||||
@override
|
||||
String get sysAiFixNetwork =>
|
||||
'Der Hub erreicht den konfigurierten Endpunkt nicht. Läuft dein Anbieter?';
|
||||
|
||||
@override
|
||||
String get sysAiFixHttp =>
|
||||
'Der Anbieter hat einen Status außerhalb 2xx geliefert. Prüfe Endpunkt, Modellname und API-Schlüssel.';
|
||||
|
||||
@override
|
||||
String get sysAiFixEmptyResponse =>
|
||||
'Der Anbieter hat keinen Inhalt geliefert. Probiere ein anderes Modell oder formuliere den Prompt um.';
|
||||
|
||||
@override
|
||||
String channelSwitchOk(String name) {
|
||||
return 'Aktiver Kanal auf \"$name\" umgeschaltet. Daemon neu gestartet.';
|
||||
}
|
||||
|
||||
@override
|
||||
String channelSwitchFailed(String detail) {
|
||||
return 'Kanalwechsel fehlgeschlagen: $detail';
|
||||
}
|
||||
|
||||
@override
|
||||
String get providerDescOllama =>
|
||||
'Lokales `ollama serve`. Die Modelle bleiben auf deinem Rechner. Kein API-Schlüssel nötig.';
|
||||
|
||||
@override
|
||||
String get providerDescOpenai =>
|
||||
'Gehostete OpenAI-API. Erfordert einen API-Schlüssel. Daten verlassen deinen Rechner.';
|
||||
|
||||
@override
|
||||
String get providerDescLmstudio =>
|
||||
'Lokaler LM-Studio-Server. Die Modelle bleiben auf deinem Rechner. Kein API-Schlüssel nötig.';
|
||||
|
||||
@override
|
||||
String get providerDescVllm =>
|
||||
'Selbst gehostetes vLLM oder ein anderer OpenAI-kompatibler Server. Endpunkt erforderlich.';
|
||||
|
||||
@override
|
||||
String get providerDescCustom =>
|
||||
'Alles andere, das die OpenAI-kompatible Chat-Completions-Schnittstelle spricht (LiteLLM-Proxy, interner Spiegel, …).';
|
||||
|
||||
@override
|
||||
String welcomeDocLoadFailedBody(
|
||||
String slug,
|
||||
String locale,
|
||||
String attempted,
|
||||
String underlying,
|
||||
) {
|
||||
return 'Die mitgelieferte Doku \"$slug\" ($locale) konnte nicht geladen werden.\nVersucht: $attempted\nUrsache: $underlying\nMeist ist der installierte Studio-Build älter als das Doku-Bundle. Baue Studio neu oder öffne die Online-Kopie.';
|
||||
}
|
||||
|
||||
@override
|
||||
String hubUnreachableBanner(String endpoint) {
|
||||
return '$endpoint nicht erreichbar — Einstellungen öffnen';
|
||||
}
|
||||
|
||||
@override
|
||||
String get hubUnreachableOpenSettings => 'Einstellungen öffnen';
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue