Terminal-Config (Theme/Icon/Titel), UI-Überarbeitung, i18n de/en

- Terminal-Einstellungen pro Projekt in ai-control.json: 5 Themes
  (Paletten in terminal.ts, Fenster-BG gespiegelt in terminal.rs),
  Dock-Icon (PNG/ICNS via NSApplication in RunEvent::Ready),
  Fenstertitel mit Fallback Projektname; Zahnrad-Dialog mit Datei-Picker
  (tauri-plugin-dialog)
- UI: Catppuccin-Mocha-Token, JetBrains Mono für Namen/Pfade/Chips,
  feste Tabellenspalten, Status-Punkt mit Glow, Pool-Projekte als
  Hover-Popover, Buttons ausgerichtet (Zahnrad links von Starten/Beenden)
- i18n: vue-i18n, Deutsch/Englisch, Umschalter im Header (localStorage)
- generate_context nur noch einmal expandiert (Release-Build-Fehler)
This commit is contained in:
marcus.hinz
2026-07-04 12:58:25 +02:00
parent f7473797a9
commit fc560d4e5f
14 changed files with 1309 additions and 365 deletions
+146
View File
@@ -0,0 +1,146 @@
import { createI18n } from "vue-i18n";
const de = {
app: {
projects: "Projekte",
pools: "Pools",
autostart: "Autostart",
},
projects: {
project: "Projekt",
pool: "Pool",
noPool: " kein Pool ",
start: "Starten",
stop: "Beenden",
terminalSettings: "Terminal-Einstellungen",
stillRunning: "{name} läuft noch",
poolChangeSaved:
"Der Pool-Wechsel ist gespeichert. Die laufende Session arbeitet aber weiter im alten Pool — der neue gilt erst ab dem nächsten Start.",
restartHint:
"Der Neustart beendet die laufende Session. Der automatische commit+push von claude-sync nach Sessionende entfällt dabei — Ghostty fragt bei laufendem Prozess vor dem Beenden noch einmal nach.",
keepRunning: "Weiterlaufen lassen",
restartNow: "Jetzt neu starten",
restarting: "Starte neu …",
terminal: "Terminal — {name}",
title: "Titel",
theme: "Theme",
dockIcon: "Dock-Icon",
chooseFile: "Datei wählen …",
remove: "Entfernen",
defaultIcon: "Standard-Icon",
appliesNextStart: "Gilt ab dem nächsten Terminal-Start.",
cancel: "Abbrechen",
save: "Speichern",
noPoolAssigned: "kein Pool",
},
pools: {
pool: "Pool",
type: "Typ",
actions: "Aktionen",
newOauth: "+ oAuth",
newApikey: "+ apiKey",
relogin: "Neu anmelden",
renewToken: "Token erneuern",
changeKey: "Key ändern",
delete: "Löschen",
assigned: "kein Projekt | 1 Projekt | {count} Projekte",
empty: "Noch keine Pools angelegt.",
newOauthPool: "Neuen oAuth-Pool anlegen",
newApikeyPool: "Neuen API-Key-Pool anlegen",
editKey: "API-Key ändern {name}",
name: "Name",
apiKey: "API-Key",
oauthHint:
"Nach „Login starten“ öffnet sich der Browser zur Anmeldung gegen dein Abo.",
oauthWaiting: "Warte auf die Anmeldung im Browser…",
cancel: "Abbrechen",
startLogin: "Login starten",
save: "Speichern",
deletePool: "Pool löschen",
deleteWarning:
"Pool {name} und seine Credential-Datei werden gelöscht. Das lässt sich nicht rückgängig machen.",
},
};
const en: typeof de = {
app: {
projects: "Projects",
pools: "Pools",
autostart: "Autostart",
},
projects: {
project: "Project",
pool: "Pool",
noPool: " no pool ",
start: "Start",
stop: "Stop",
terminalSettings: "Terminal settings",
stillRunning: "{name} is still running",
poolChangeSaved:
"The pool change is saved. The running session keeps working in the old pool — the new one applies from the next start.",
restartHint:
"Restarting ends the running session. The automatic commit+push by claude-sync after the session is skipped — Ghostty asks once more before quitting a running process.",
keepRunning: "Keep running",
restartNow: "Restart now",
restarting: "Restarting …",
terminal: "Terminal — {name}",
title: "Title",
theme: "Theme",
dockIcon: "Dock icon",
chooseFile: "Choose file …",
remove: "Remove",
defaultIcon: "Default icon",
appliesNextStart: "Applies from the next terminal start.",
cancel: "Cancel",
save: "Save",
noPoolAssigned: "no pool",
},
pools: {
pool: "Pool",
type: "Type",
actions: "Actions",
newOauth: "+ oAuth",
newApikey: "+ apiKey",
relogin: "Sign in again",
renewToken: "Renew token",
changeKey: "Change key",
delete: "Delete",
assigned: "no projects | 1 project | {count} projects",
empty: "No pools yet.",
newOauthPool: "Create oAuth pool",
newApikeyPool: "Create API key pool",
editKey: "Change API key {name}",
name: "Name",
apiKey: "API key",
oauthHint:
"After “Start login” the browser opens to sign in against your subscription.",
oauthWaiting: "Waiting for the sign-in in the browser…",
cancel: "Cancel",
startLogin: "Start login",
save: "Save",
deletePool: "Delete pool",
deleteWarning:
"Pool {name} and its credential file will be deleted. This cannot be undone.",
},
};
const stored = localStorage.getItem("lang");
const initial =
stored === "de" || stored === "en"
? stored
: navigator.language.startsWith("de")
? "de"
: "en";
export const i18n = createI18n({
legacy: false,
globalInjection: true,
locale: initial,
fallbackLocale: "en",
messages: { de, en },
});
export function setLocale(lang: "de" | "en") {
i18n.global.locale.value = lang;
localStorage.setItem("lang", lang);
}