Files
ai-control/src/i18n.ts
T

271 lines
9.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createI18n } from "vue-i18n";
const de = {
app: {
projects: "Projekte",
pools: "Pools",
usage: "Verbrauch",
autostart: "Autostart",
},
usage: {
days7: "7 Tage",
days30: "30 Tage",
pool: "Pool",
project: "Projekt",
input: "Input",
output: "Output",
cacheWrite: "Cache ↑",
cacheRead: "Cache ↓",
cost: "≈ Kosten",
total: "Summe",
empty: "Keine Verbrauchsdaten im Zeitraum.",
estimateNote:
"API-Gegenwert aus den lokalen Transcripts — keine Abrechnung, Historie nur solange claude sie vorhält.",
},
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.",
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",
needsPool: "Kein Pool zugeordnet",
needsKey: "Pool hat keinen API-Key",
newProject: "+ Projekt",
addFolder: "Projekt importieren …",
addFolderTitle: "Bestehenden Ordner als Projekt aufnehmen",
addWorkDir: "Ordner hinzufügen …",
changeDir: "Ändern …",
wizardTitle: "Neues Projekt",
name: "Name",
projectDir: "Projektordner",
projectDirCustom: "Ordner wählen …",
workDir: "Arbeitsordner",
workDirNone: "keiner",
workDirCustom: "vorhandenen Ordner verknüpfen",
chooseFolder: "Ordner wählen …",
create: "Anlegen",
wizardHint:
"Angelegt werden Projektordner mit memory/, Sentinel-.gitignore, settings.json (Memory-Verzeichnis + Berechtigungen) und die Pool-/Terminal-Zuordnung.",
delete: "Projekt löschen",
deleteRunning: "Läuft noch — erst beenden",
deleteTitle: "{name} löschen",
deleteWarning:
"Der Projektordner (inkl. memory/, Settings und Pool-Zuordnung) wird endgültig gelöscht.",
deleteWorkDirs: "Arbeitsordner mitlöschen:",
workDirsStay: "Die Arbeitsordner bleiben unangetastet.",
unlink: "Nur aus Liste nehmen",
unlinkHint:
"Nur aus Liste nehmen entfernt den Eintrag; der Ordner bleibt unangetastet.",
todo: "Todoliste",
todoDesc: "OFFENE-PUNKTE.md bei jedem Sessionstart einspielen",
},
pools: {
pool: "Pool",
type: "Typ",
actions: "Aktionen",
newOauth: "+ oAuth",
newApikey: "+ apiKey",
relogin: "Zurücksetzen",
rename: "Umbenennen",
renameTitle: "{name} umbenennen",
changeKey: "Key ändern",
insertKey: "Key eintragen",
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:
"Der Pool wird angelegt; die Anmeldung macht claude beim ersten Start selbst per /login (Browser gegen dein Abo).",
cancel: "Abbrechen",
createPool: "Anlegen",
reset: "Zurücksetzen",
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.",
deleteUnassigns: "Diese Projekte verlieren ihre Pool-Zuordnung:",
deleteBlockedTooltip:
"Löschen gesperrt — {projects} läuft gerade. Erst beenden.",
reloginTitle: "{name} zurücksetzen",
reloginWarning:
"Der im Schlüsselbund gespeicherte Zugriffstoken von {name} wird gelöscht. Beim nächsten Start verlangt claude erneut /login.",
reloginNoEntry:
"Kein Schlüsselbund-Eintrag vorhanden — beim nächsten Start meldet sich claude ohnehin per /login an.",
reloginBlocked:
"Zurücksetzen ist nur bei ungenutztem Pool möglich. Diese Projekte laufen noch:",
keychainUnavailableTitle: "Keine sichere Ablage",
keychainUnavailable:
"Keychain/Keyring ist nicht verfügbar. Der Key kann stattdessen ungesichert als Datei im Pool-Ordner liegen (0600).",
storeAsFile: "Als Datei ablegen",
},
};
const en: typeof de = {
app: {
projects: "Projects",
pools: "Pools",
usage: "Usage",
autostart: "Autostart",
},
usage: {
days7: "7 days",
days30: "30 days",
pool: "Pool",
project: "Project",
input: "Input",
output: "Output",
cacheWrite: "Cache ↑",
cacheRead: "Cache ↓",
cost: "≈ cost",
total: "Total",
empty: "No usage data in this period.",
estimateNote:
"API equivalent from local transcripts — not a bill; history only as long as claude keeps it.",
},
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.",
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",
needsPool: "No pool assigned",
needsKey: "Pool has no API key",
newProject: "+ Project",
addFolder: "Import project …",
addFolderTitle: "Add an existing folder as a project",
addWorkDir: "Add folder …",
changeDir: "Change …",
wizardTitle: "New project",
name: "Name",
projectDir: "Project folder",
projectDirCustom: "Choose folder …",
workDir: "Working folder",
workDirNone: "none",
workDirCustom: "link existing folder",
chooseFolder: "Choose folder …",
create: "Create",
wizardHint:
"Creates the project folder with memory/, sentinel .gitignore, settings.json (memory dir + permissions), and the pool/terminal assignment.",
delete: "Delete project",
deleteRunning: "Still running — stop it first",
deleteTitle: "Delete {name}",
deleteWarning:
"The project folder (incl. memory/, settings and pool assignment) will be deleted permanently.",
deleteWorkDirs: "Also delete working folders:",
workDirsStay: "The working folders stay untouched.",
unlink: "Remove from list only",
unlinkHint:
"Remove from list only drops the entry; the folder stays untouched.",
todo: "Todo list",
todoDesc: "Inject OFFENE-PUNKTE.md at every session start",
},
pools: {
pool: "Pool",
type: "Type",
actions: "Actions",
newOauth: "+ oAuth",
newApikey: "+ apiKey",
relogin: "Reset",
rename: "Rename",
renameTitle: "Rename {name}",
changeKey: "Change key",
insertKey: "Insert 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:
"The pool is created; claude signs in itself on first start via /login (browser against your subscription).",
cancel: "Cancel",
createPool: "Create",
reset: "Reset",
save: "Save",
deletePool: "Delete pool",
deleteWarning:
"Pool {name} and its credential file will be deleted. This cannot be undone.",
deleteUnassigns: "These projects lose their pool assignment:",
deleteBlockedTooltip:
"Deletion blocked — active: {projects}. Stop the session first.",
reloginTitle: "Reset {name}",
reloginWarning:
"The access token for {name} stored in the keychain will be deleted. On the next start claude asks for /login again.",
reloginNoEntry:
"No keychain entry present — claude signs in via /login on the next start anyway.",
reloginBlocked:
"Resetting requires an unused pool. These projects are still running:",
keychainUnavailableTitle: "No secure storage",
keychainUnavailable:
"Keychain/keyring is unavailable. The key can instead be stored unprotected as a file in the pool folder (0600).",
storeAsFile: "Store as file",
},
};
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);
}