271 lines
9.4 KiB
TypeScript
271 lines
9.4 KiB
TypeScript
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);
|
||
}
|