Files
apes-sidebar/src/client/locales-de.ts
T
Menghuan1918 36fbc5ac7e feat(sidebar): 文件页与文件变动页 UIUX 重构 + 全局组件抽取
文件页(FileTree/TreePanel)
- Ctrl/Cmd 多选 + Shift 按可见行序连选(Esc/点空白/右键收敛),批量条支持复制路径、批量删除(共享 ConfirmDialog + 顺序 fsRemove)
- Git 变更着色:行名按状态上色 + M/A/D/U 徽标,目录按 dirHasChanges 着色,非仓库静默降级(数据来自共享 git 状态存储)
- 新建文件夹:fs.mkdir 路由 + mkdirWorkspaceEntry + 内联输入行(Enter/Esc/blur/IME 守卫)
- 性能:FileRow/DirRow memo(含反向验证)、搜索 hidden 停车不再卸载树、level 拉取世代守卫 + AbortController、fs.tree truncated 提示、use-dir-watch 入参 memo
- 拖拽上传视觉 token 化(硬编码色清零);可见性下传后隐藏页签停止轮询
- 右键「打开方式」改为复用 DSH 自带 open-in-app(宿主探测的关联应用 + 文件管理器显示)

文件变动页(changes/diff)
- 36px 头(宿主 SegmentedControl)+ 单一 ChangeRow + SectionHeader 分组 + 吸底提交条单状态行 + 历史独立空态
- 修掉:双份空态、暂存失败 unhandled rejection、手动刷新被丢、仓库切换刷新两次、worktree 清单缺 repoRoot、工作树被自动切走、预览持旧快照、恢复高度未 clamp、session ops 无谓轮询
- DiffPane/DiffTab 共用 use-git-diff;修掉 DiffPane 的 untracked 预览从不渲染

全局组件与宿主接入
- 新增 src/client/ui(IconButton/Chip/SectionHeader/Notice/ConfirmDialog/StatusBadge + 共享 git 状态存储)
- 新增 src/client/open-in-app.ts(宿主 open-in-app 客户端适配),删除自研 open-with 全链路与 open.external 路由
- 客户端 inject 补 remote / remote.session:缺声明时 ctx.get('remote').session 会抛出并把整个面板打成错误条(真实挂载 lane 抓到)
- 词典:+25 键 / -20 openWith* / -noChanges,20 份同步

验证:typecheck / lint / test(126 文件 1322 通过)/ build 全绿;
DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过(含 tab sweep 与 perf lane)
2026-09-28 00:27:31 +08:00

491 lines
34 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.
/**
* German dictionary for better-sidebar.
*/
export const de: Record<string, string> = {
files: 'Dateien',
guideDescFiles: 'Dateibaum des Arbeitsbereichs durchsuchen; Klick öffnet Vorschau oder Editor',
guideDescGit: 'Git-Änderungen und Dateiänderungen dieser Sitzung in einem Tab',
guideDescSubagent: 'Workflow-Diagramm, Team-Aufgabenboard und Hintergrundaufgaben, live',
guideDescSidechat: 'Ein unabhängiger Folge-Thread mit dem Kontext dieser Sitzung',
guideDescTerminal: 'Eine echte Shell (xterm + pty) mit Wiederverbindung',
guideDescBrowser: 'Eingebetteter Browser, der Chat-Links übernehmen kann',
changesSessionEmpty: 'Noch keine Dateioperationen in dieser Sitzung',
changesRead: 'Lesen',
changesMdReading: 'Lesen',
changesHtmlRender: "Rendern",
changesHtmlRaw: "Quelltext",
changesPdfRender: "Rendern",
changesPdfRaw: "Quelltext",
changesMdRaw: 'Rohfassung',
changesWrite: 'Schreiben',
changesEdit: 'Bearbeiten',
changesRunning: 'läuft',
changesError: 'Fehler',
changesFold: '{count} Zeilen… zum Aufklappen klicken',
changesFoldLoading: 'Wird aufgeklappt…',
changesFoldUnavailable: 'Kontext nicht verfügbar',
changesContext: 'Kontext',
changesPriorUnknown: 'Inhalt vor der Änderung liegt außerhalb des Fensters; als vollständig neu angezeigt',
explorer: 'Explorer',
terminal: 'Terminal',
editor: 'Editor',
editorExplorer: 'Dateiöffnungsverhalten',
editorExplorerDesc: 'Steuert, wie Dateien geöffnet werden',
editorExplorerMerged: 'Zusammengeführt',
editorExplorerMergedDesc: 'Dateien wechseln im selben Fenster; neue Fenster starten mit geöffneter Baumansicht',
editorExplorerSplit: 'Getrennt',
editorExplorerSplitDesc: 'Fenster ohne Pfad sind der eigenständige Explorer (nur Dateibaum); jede Datei öffnet ein eigenes Fenster (mit angedocktem, standardmäßig eingeklapptem Baum)',
editorTreeToggle: 'Dateibaum-Panel',
editorPathPlaceholder: 'Dateipfad (relativ zum Sitzungsverzeichnis oder absolut), Enter zum Öffnen',
editorSearchPlaceholder: 'Nach Dateiname suchen…',
editorSearchNoResults: 'Keine passenden Dateien',
editorSearchTruncated: 'Zu viele Ergebnisse – nur ein Teil wird angezeigt',
editorEmptyHint: 'Wählen Sie eine Datei aus dem Dateibaum rechts oder dem Pfadeingabefeld oben, um mit der Vorschau zu beginnen',
openFileNewTab: 'In neuem Tab öffnen',
openFileSide: 'Seitlich öffnen',
openInApp: 'Öffnen mit',
openInAppDefault: 'Mit Standard-App öffnen',
openInAppEmpty: 'Keine App kann diese Datei öffnen',
openInAppFailed: 'Öffnen fehlgeschlagen: {path}',
revealInFileManager: 'Im Dateimanager anzeigen',
filesSelected: '{count} ausgewählt',
clearSelection: 'Auswahl aufheben',
copyPaths: 'Pfade kopieren',
deleteSelected: 'Auswahl löschen',
deleteSelectedTitle: '{count} ausgewählte Elemente löschen?',
deleteSelectedDesc: 'Diese Dateien und Ordner werden endgültig gelöscht. Das lässt sich nicht rückgängig machen.',
newFolder: 'Neuer Ordner',
newFolderPlaceholder: 'Ordnername',
newFolderInvalid: 'Ungültiger Ordnername',
filesTruncated: 'Dieser Ordner enthält zu viele Einträge; nur die ersten werden angezeigt',
gitStatusModified: 'Geändert',
gitStatusAdded: 'Hinzugefügt',
gitStatusDeleted: 'Gelöscht',
gitStatusUntracked: 'Nicht verfolgt',
gitStatusRenamed: 'Umbenannt',
gitStatusConflict: 'Konflikt',
changesClean: 'Keine Änderungen im Arbeitsbereich',
changesNoHistory: 'Noch keine Commit-Historie',
changesStageFailed: 'Staging fehlgeschlagen: {message}',
changesOpGone: 'Dieser Vorgang ist nicht mehr im Sitzungsprotokoll',
newTab: 'Neuer Tab',
brokenSymlink: 'Defekter Symlink',
close: 'Schließen',
closeOtherTabs: 'Andere Tabs schließen',
closeLeftTabs: 'Tabs links schließen',
closeRightTabs: 'Tabs rechts schließen',
pinTerminal: 'Terminal anheften',
pinAgentTerminal: 'Agent-Terminal anheften',
pinToWorkspace: 'An Arbeitsbereich anheften',
pinToGlobal: 'Global anheften',
unpinTerminal: 'Lösen',
collapseBottomPanel: 'Unteres Panel einklappen',
expandBottomPanel: 'Unteres Panel ausklappen',
terminalError: 'Terminalverbindung fehlgeschlagen',
terminalConnectFailed: 'Terminal konnte wiederholt keine Verbindung herstellen',
terminalRetry: 'Erneut versuchen',
terminalWaitBanner: 'Agent wartet auf {needle}',
terminalSkipWait: 'Warten überspringen',
terminalDepsFailed: 'Die Terminal-Abhängigkeit node-pty konnte nicht geladen werden',
terminalDepsHint: 'Führen Sie den folgenden Befehl in einem Terminal oder in cmd auf dem DSH-System aus, um dies zu beheben, und klicken Sie dann auf „Erneut versuchen“ (node-pty bleibt mit der DSH-Core-Version synchron):',
terminalDepsProfile: ' (erkanntes Profil: {profile})',
terminalShellNotFound: 'Konfigurierte Shell nicht gefunden: {name} — Shell-Pfad unter Einstellungen → Side card → Terminal prüfen',
preview: 'Vorschau',
toc: 'Inhaltsverzeichnis',
edit: 'Bearbeiten',
mermaidError: 'Mermaid-Rendering fehlgeschlagen',
mermaidZoomIn: 'Vergrößern',
mermaidZoomOut: 'Verkleinern',
mermaidZoomReset: 'Zurücksetzen',
mermaidZoomHint: 'Scrollen zum Zoomen · Ziehen zum Verschieben · Esc zum Schließen',
refresh: 'Aktualisieren',
showInFolder: 'Im Ordner anzeigen',
refreshUnsavedConfirm: 'Die Datei wurde geändert. Beim Aktualisieren gehen ungespeicherte Änderungen verloren. Fortfahren?',
save: 'Speichern',
saved: 'Gespeichert',
unsaved: 'Nicht gespeichert',
saveFailed: 'Speichern fehlgeschlagen',
truncation: 'Datei zu groß – nur die ersten 512KB werden angezeigt',
binary: 'Binärdatei, Vorschau nicht verfügbar',
loading: 'Wird geladen…',
error: 'Laden fehlgeschlagen',
retry: 'Erneut versuchen',
notRepo: 'Dieses Verzeichnis ist kein Git-Repository',
statusTruncated: 'Zu viele Änderungen; nur die ersten 2000 Einträge werden angezeigt',
stage: 'Stagen',
unstage: 'Unstagen',
stageAll: 'Alle stagen',
unstageAll: 'Alle unstagen',
commitPlaceholder: 'Commit-Nachricht (Ctrl+Enter)',
commit: 'Committen',
branch: 'Branch',
worktree: 'Worktree',
checkoutError: 'Branchenwechsel fehlgeschlagen',
history: 'Verlauf',
changes: 'Dateiänderungen',
changesGitLens: 'Git',
changesSessionLens: 'Sitzung',
changesFilterAll: 'Alle',
changesFilterEmpty: 'Keine Vorgänge dieser Art',
changesOpenDiffTab: 'In eigenem Tab öffnen',
changesClosePreview: 'Vorschau schließen',
changesResizePreview: 'Vorschauhöhe anpassen',
changesLoadError: 'Sitzungsdatei-Aufzeichnungen sind derzeit nicht verfügbar',
staged: 'Gestaged',
unstaged: 'Nicht gestaged',
cancel: 'Abbrechen',
diffEmpty: 'Keine Textunterschiede',
diffLoadError: 'Diff konnte nicht geladen werden',
diffBinary: 'Binär',
diffAdded: 'Hinzugefügt',
diffDeleted: 'Gelöscht',
diffRenamed: 'Umbenannt',
diffExpand: '{count} weitere Zeilen ausklappen',
discard: 'Änderungen verwerfen',
discardTitle: 'Änderungen verwerfen',
discardDesc: 'Dadurch werden die Arbeitsbereichsänderungen von „{path}“ verworfen (nicht wiederherstellbar).',
viewCommitDiff: 'Commit-Diff ansehen',
copyShortHash: 'Kurzen Hash kopieren',
copyFullHash: 'Vollständigen Hash kopieren',
copySubject: 'Commit-Titel kopieren',
revertCommit: 'Commit zurücknehmen',
revertTitle: 'Commit zurücknehmen',
revertDesc: 'Erstellt einen neuen Commit im aktuellen Branch, der „{subject}“ rückgängig macht.',
cherryPickCommit: 'Commit cherripicken',
cherryPickTitle: 'Commit cherripicken',
cherryPickDesc: 'Wendet die Änderungen von „{subject}“ auf den aktuellen Branch an.',
timeJustNow: 'gerade eben',
timeMinutesAgo: 'vor {n} Min.',
timeHoursAgo: 'vor {n} Std.',
timeYesterday: 'gestern',
loadMore: 'Mehr laden',
historyLoadError: 'Laden weiterer Verlaufseinträge fehlgeschlagen',
produced: 'Erstellt',
disconnected: 'Terminalverbindung getrennt, Verbindung wird wiederhergestellt…',
exited: 'Terminalprozess beendet',
noSession: 'Wählen Sie eine Sitzung, um die Seitenleiste zu verwenden',
pluginNotLoaded: 'Plugin nicht geladen; Tab vorübergehend nicht verfügbar:',
parent: 'Übergeordnetes Verzeichnis',
copied: 'Kopiert',
copy: 'Kopieren',
openEditor: 'Editor öffnen',
referenceFile: '@Datei',
addToConversation: 'Zur Unterhaltung hinzufügen',
copyRelative: 'Relativen Pfad kopieren',
copyAbsolute: 'Absoluten Pfad kopieren',
rename: 'Umbenennen',
renameInvalid: 'Der Name darf nicht leer sein und keine Pfadtrenner enthalten.',
delete: 'Löschen',
deleteTitle: '„{name}“ löschen?',
deleteDescFile: 'Dadurch wird die Datei dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.',
deleteDescDir: 'Dadurch werden das Verzeichnis und dessen gesamter Inhalt dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden.',
dismiss: 'Schließen',
download: 'Herunterladen',
uploadFiles: 'Dateien hochladen',
uploadFolder: 'Ordner hochladen',
uploadHere: 'Hierher hochladen',
uploadDropHint: 'Dateien/Ordner hierher ziehen, um sie hochzuladen',
uploadDropChat: 'In den Chatbereich ziehen: Bilder zur Unterhaltung hinzufügen',
uploadTo: 'Nach {dir} hochladen',
uploadingTo: 'Wird nach {dir} hochgeladen…',
uploadProgress: 'Lade {done}/{total} hoch: {name}',
uploadDone: '{count} Dateien hochgeladen',
uploadFailed: 'Upload fehlgeschlagen: {error}',
uploadFailedUnknown: 'Unbekannter Fehler',
uploadTooLarge: 'Datei zu groß (über dem Upload-Limit)',
uploadCancelled: 'Upload abgebrochen',
settingsNav: 'Seitenkarte',
settingsIntro: 'Verwalten Sie, was die Seitenkarte anzeigt und wie sie sich verhält',
settingsPopupDesc: 'Optionen für „{feature}“ konfigurieren',
settingsDone: 'Fertig',
settingsOpenToolsTitle: 'Seitenleisten-Öffnungswerkzeug für das Modell bereitstellen',
settingsOpenToolsDesc: 'Wenn aktiviert, kann das Modell über das sidebar_open-Werkzeug Dateien, Ordner und HTTP(S)-Seiten in der Seitenleiste öffnen (standardmäßig deaktiviert)',
settingsTitleBarTitle: 'Kompatibilitätsmodus der Position',
settingsTitleBarDesc: 'Kompatibilitätsschema der Titelleiste wählen: automatische Erkennung (Standard, konservativ) / offizielles DSH-Web / bekannte Desktop-Shells / benutzerdefiniert (Verschiebung + benutzerdefiniertes CSS)',
settingsTitleBarStripTitle: 'Verschiebungsabstand',
settingsTitleBarStripDesc: 'Höhe des Titelleisten-Streifens: um wie viele Pixel Seitenleisten-Buttons und -Inhalt nach unten rutschen (0–120, Standard 40; wirkt beim benutzerdefinierten Schema)',
settingsSchemeAutoTitle: 'Automatische Erkennung',
settingsSchemeAutoDesc: 'Konservativ: nur die Standard-API „Window Controls Overlay“ trägt bei (echte Caption-Overlay-Höhe); reine Web-Umgebungen erhalten keine Anpassung',
settingsSchemeWebTitle: 'Offizielles DSH-Web',
settingsSchemeWebDesc: 'Explizit die offizielle Webversion erklären: keinerlei Anpassung (nicht einmal die Standard-WCO-Geometrie)',
settingsSchemeCustomTitle: 'Benutzerdefiniert',
settingsSchemeCustomDesc: 'Volle Kontrolle: benutzerdefiniertes CSS einspielen (kann eingebaute Stile überschreiben) und den Verschiebungsabstand der Titelleiste festlegen',
settingsSchemeDetectedSuffix: 'erkannt',
settingsCustomCssTitle: 'Benutzerdefiniertes CSS',
settingsCustomCssPlaceholder: '/* z. B. 36px für eine Shell mit selbst gezeichneter Titelleiste reservieren */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
settingsSaveFailed: 'Speichern fehlgeschlagen',
settingsConflict: 'Die Einstellung wurde in einem anderen Fenster geändert – bitte erneut versuchen',
binaryNoPreview: 'Dieser Dateityp kann nicht in der Vorschau angezeigt werden',
downloadToView: 'Zum Ansehen herunterladen',
settingsSubagentTitle: 'Aufgaben-Seite bei einem neuen Subagenten automatisch aktivieren',
settingsSubagentDesc: 'Die Aufgaben-Seite aktivieren, wenn die aktuelle Unterhaltung einen neuen Subagenten erzeugt; auf breiten Ansichten wird zusätzlich die Seitenkarte ausgeklappt, auf schmalen Ansichten wird das Öffnen der Vollbild-Schublade nicht erzwungen; ausschalten, um sie manuell zu öffnen',
settingsJobsTitle: 'Aufgaben-Seite bei einer neuen Hintergrundaufgabe automatisch aktivieren',
settingsJobsDesc: 'Die Aufgaben-Seite aktivieren, sobald für die aktuelle Unterhaltung eine neue Hintergrundaufgabe erscheint (jede neue Aufgabe löst dies aus); auf breiten Ansichten wird zusätzlich die Seitenkarte ausgeklappt, auf schmalen Ansichten wird das Öffnen der Vollbild-Schublade nicht erzwungen; ausschalten, um sie manuell zu öffnen',
settingsToolsTitle: 'Terminal-Werkzeuge für das Modell bereitstellen',
settingsToolsDesc: 'Wenn aktiviert, kann das Modell über die 8 terminal_*-Werkzeuge Terminale in der Seitenleiste erstellen und steuern (standardmäßig deaktiviert)',
settingsFenceTitle: 'Workspace-Pfadkontrolle',
settingsFenceDesc: 'Wenn aktiv, erreichen die Dateifunktionen der Seitenleiste nur Pfade innerhalb des Session-Workspaces (Standard); ausgeschaltet sind Dateien überall auf dem Host erreichbar — Skripte der Seite erhalten solange dieselbe Reichweite',
fenceErrorReason: 'Dieser Pfad liegt außerhalb des Session-Workspaces und wurde von der Workspace-Kontrolle blockiert',
fenceDisableAction: 'Workspace-Kontrolle ausschalten',
settingsBottomTerminalTitle: 'Beim ersten Ausklappen des unteren Panels automatisch ein Terminal öffnen',
settingsBottomTerminalDesc: 'Wird das untere Panel in einer Sitzung zum ersten Mal ausgeklappt, wird dort versucht, einen neuen Terminal-Tab zu öffnen (das Terminal-Kontingent gilt weiterhin; standardmäßig aktiviert)',
settingsFontFamilyTitle: 'Terminal-Schriftart',
settingsFontFamilyDesc: 'Benutzerdefinierte Terminal-Schriftfamilie (ein CSS-font-family-Stapel wie "JetBrains Mono", monospace; leer lassen, um der Monospace-Schrift des Themas zu folgen)',
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
settingsFontSizeTitle: 'Terminal-Schriftgröße',
settingsFontSizeDesc: 'Terminal-Schriftgröße in px (9–32, Standard 13)',
settingsShellTitle: 'Shell-Pfad',
settingsShellDesc: 'Shell für UI- und Modell-Terminals (absoluter Pfad oder ausführbarer Name). Leer lassen für die bestehende Reihenfolge: config.shell aus der yaml → $SHELL / Login-Shell / powershell.exe unter Windows. Wirkt für danach geöffnete Terminals',
settingsShellPlaceholder: 'z. B. /bin/zsh (leer = automatisch)',
settingsShellArgsTitle: 'Shell-Argumente',
settingsShellArgsDesc: 'Explizite Shell-Startargumente, durch Leerzeichen getrennt; wenn nicht leer, ersetzen sie die Standardargumente vollständig (gleicher Vertrag wie shellArgs in der yaml)',
settingsShellArgsPlaceholder: 'z. B. -l (leer = Standardargumente)',
settingsTabsTitle: 'Seitenleisten-Inhalt',
settingsViewersTitle: 'Datei-Viewer',
settingsMobileTitle: "Mobil",
settingsMobileNoAutoOpenTitle: "Auf schmalen Bildschirmen nicht automatisch öffnen",
settingsMobileNoAutoOpenDesc: "Auf dem Handy / schmalen Viewport wechselt ein neuer Subagent oder Hintergrundjob nicht mehr von selbst zur Aufgabenseite (manuell weiterhin möglich)",
settingsMobileTreeTitle: "Aufgabenseite standardmäßig als Baum",
settingsMobileTreeDesc: "Auf dem Handy / schmalen Viewport öffnet die Aufgabenseite als klassischer Baum statt als Workflow-Diagramm; der Umschalter auf der Seite bleibt",
settingsGeneralTitle: 'Allgemein',
settingsPopup: 'Funktionseinstellungen',
settingsViewerCatchAll: 'Catch-all: beliebige Datei',
viewerMarkdown: 'Markdown',
viewerCode: 'Code',
viewerHtml: 'HTML',
browser: 'Browser',
browserPlaceholder: 'URL eingeben, z. B. example.com',
browserGo: 'Los',
browserBack: 'Zurück',
browserForward: 'Vor',
browserStart: 'URL eingeben, um mit dem Browsen zu beginnen (Sandbox-Modus)',
browserBlockedScheme: 'Blockiert: nur http/https-Links sind erlaubt',
browserBlockedLoopback: 'Blockiert: lokale und interne Adressen können hier nicht aufgerufen werden',
browserInvalid: 'Ungültige URL',
htmlNoSandboxWarning: 'Sandbox aus: Dieses HTML läuft mit vollen Benutzeroberflächen-Rechten (in den Einstellungen wieder aktivierbar)',
sandboxStatusOn: 'Sandbox-Modus: aktiviert · Seiten können weder auf die Daten der Oberfläche noch auf lokale Dateien zugreifen; Anmeldungen und Drittanbieter-Cookies funktionieren möglicherweise nicht',
sandboxUnlock: 'Vorübergehend deaktivieren (unsicher)',
sandboxRestore: 'Sandbox wiederherstellen',
settingsHtmlDefaultUnsafeTitle: 'HTML-Vorschauen standardmäßig ohne Sandbox öffnen (unsicher)',
settingsHtmlDefaultUnsafeDesc: 'Wenn aktiviert, startet jede neu geöffnete HTML-Vorschau ohne Sandbox (gleiche Herkunft wie die Oberfläche – sie kann Sitzungsdateien und interne APIs lesen); die Statuszeile bietet weiterhin eine einmalige Wiederherstellung',
settingsHtmlSandboxTitle: 'HTML-Vorschau-Sandbox deaktivieren (unsicher)',
settingsHtmlSandboxDesc: 'Ohne Sandbox läuft das angezeigte HTML mit der gleichen Herkunft wie die Oberfläche: Es kann Sitzungsdateien und lokalen Speicher lesen und interne APIs aufrufen. Nur für vollständig vertrauenswürdige Dateien aktivieren',
settingsBrowserSandboxTitle: 'Browser-Sandbox deaktivieren (unsicher)',
settingsBrowserSandboxDesc: 'Ohne Sandbox läuft jede besuchte Website mit der gleichen Herkunft wie die Oberfläche: Sie kann Sitzungsdaten lesen und sich als Ihre Anmeldung ausgeben. Nur für vollständig vertrauenswürdige Websites aktivieren',
settingsBrowserLoopbackTitle: 'Erlaubte lokale Adressen',
settingsBrowserLoopbackDesc: 'Kommagetrennte Allowlist von Loopback-Adressen (z. B. localhost:5174 oder 127.0.0.1:8080), die der Seitenleisten-Browser besuchen darf; leer blockiert standardmäßig alle lokalen Adressen. Die Sandbox bleibt aktiv — Seiten können keine GUI-Daten lesen',
settingsBrowserLoopbackPlaceholder: 'z. B. localhost:5174, 127.0.0.1:8080',
browserOpenExternal: 'Im Browser öffnen',
browserEmbedBlocked: '{host} hat die Einbettung verweigert',
browserEmbedBlockedDesc: 'Die Site verbietet die Anzeige in anderen Seiten (X-Frame-Options / frame-ancestors) und kann daher nicht in der Seitenleiste geladen werden. Öffnen Sie sie stattdessen direkt im Browser.',
browserEmbedAnyway: 'Trotzdem laden',
subagent: 'Aufgaben',
subagentMainAgent: 'Hauptagent',
subagentEmpty: 'Keine Subagenten',
subagentEmptyDesc: 'Subagenten, die unter dem Hauptagenten erzeugt werden, erscheinen hier',
subagentInactive: 'Inaktiv',
subagentModeOneShot: 'Einmalig',
subagentModeContinuable: 'Fortsetzbar',
subagentCount: '{count} Subagenten',
subagentCountRunning: '{count} Subagenten · {running} läuft',
subagentThinking: 'Denkt nach…',
sideChat: 'Seitenchat (beta)',
sideChatNew: 'Neuer Thread',
sideChatUntitled: 'Neuer Thread',
sideChatEmpty: 'Keine Seitenunterhaltungen',
sideChatEmptyDesc: 'Jede Seitenunterhaltung ist ein eigener Tab in der Tab-Leiste – sie erbt den Kontext der aktuellen Sitzung und wird nie Teil der Hauptunterhaltung',
sideChatCreating: 'Seitenunterhaltung wird erstellt…',
sideChatRetry: 'Erneut versuchen',
sideChatThreads: 'Thread wechseln / neu',
sideChatSave: 'Als neue Sitzung speichern',
sideChatSaveTitle: 'Diesen Thread in der Hauptsitzungsliste zu einer Top-Level-Sitzung erheben',
sideChatSaved: 'Als neue Sitzung gespeichert',
sideChatNoTurn: 'Das Speichern ist nach der ersten abgeschlossenen Runde verfügbar',
sideChatPendingDrop: 'Die letzte unbeantwortete Nachfrage wird in der gespeicherten Sitzung nicht enthalten sein',
sideChatFirstPlaceholder: 'Stellen Sie die erste Frage – der Kontext ist geerbt…',
sideChatComposerPlaceholder: 'Nachfrage stellen…',
sideChatThinking: 'Denkt vertieft…',
sideChatThink: 'Denkvorgang',
sideChatInjection: 'Kontext eingespielt',
sideChatSend: 'Senden',
sideChatCancelTitle: 'Laufende Runde abbrechen (wartende Nachrichten bleiben erhalten)',
sideChatError: 'Seitenchat-Fehler: {message}',
sideChatTurnUsage: 'Eingabe {input} tok · Ausgabe {output} tok',
sideChatBlockCollapse: 'Einklappen',
sideChatBlockCollapseAria: 'Einklappen',
sideChatBlockExpand: '{hidden} Zeilen ausklappen',
sideChatBlockExpandAria: '{hidden} weitere Zeilen ausklappen',
sideChatBlockSignal: 'Durch Signal beendet: {signal}',
sideChatBlockExitCode: 'Exit-Code {code}',
sideChatBlockNoExitCode: "Ohne Exit-Code beendet",
sideChatBlockRunning: 'Läuft',
sideChatBlockFailed: 'Fehlgeschlagen',
sideChatBlockDone: 'Fertig',
sideChatBlockNoOutput: '(keine Ausgabe)',
codeBlockTitle: 'Codeblock',
codeBlockWrap: 'Zeilen umbrechen',
codeBlockUnwrap: 'Zeilen nicht umbrechen',
sideChatBlockWindow: '{shown} von {total} Zeilen',
sideChatConnDisconnected: 'Verbindung verloren',
sideChatConnConnecting: 'Verbinde neu…',
sideChatConnRecovered: 'Verbindung wiederhergestellt',
sideChatConnReconnectAction: 'Jetzt neu verbinden',
sideChatConnRestartAction: 'Verbindung neu aufbauen',
jobs: 'Hintergrundaufgaben',
jobsCount: '{count} Hintergrundaufgaben',
jobsCountRunning: '{count} Hintergrundaufgaben · {running} läuft',
jobStatusRunning: 'Läuft',
jobStatusStopping: 'Wird beendet',
jobStatusCompleted: 'Abgeschlossen',
jobStatusKilled: 'Beendet',
jobStatusFailed: 'Fehlgeschlagen',
jobDurationSeconds: '{seconds} s',
jobDurationMinutes: '{minutes} m {seconds} s',
jobDurationHours: '{hours} h {minutes} m',
jobViewOutput: 'Ausgabe ansehen',
jobNoOutput: 'Noch keine Ausgabe',
jobNotReadYet: 'Warten, bis das Modell die Ausgabe dieser Aufgabe liest (nach Ausführung von job_output durch das Modell erscheint die Ausgabe hier)',
jobOutputTruncated: 'Ausgabe zu lang, gekürzt angezeigt',
jobOutputError: 'Ausgabe konnte nicht gelesen werden',
jobKill: 'Beenden',
jobKillConfirm: 'Zum Bestätigen erneut klicken',
jobKillError: 'Beenden fehlgeschlagen',
tasksViewGraph: 'Workflow-Diagramm',
tasksViewTree: 'Baum',
tasksViewSwitchToGraph: 'Zum Workflow-Diagramm wechseln',
tasksViewSwitchToTree: 'Zum Baum wechseln',
settingsViewModeTitle: 'Standardansicht der Aufgabenseite',
settingsViewModeDesc: 'Wie die Aufgabenseite beim Öffnen dargestellt wird (der Umschalter auf der Seite ändert es weiterhin ad hoc)',
settingsViewModeGraph: 'Workflow-Diagramm',
settingsViewModeGraphDesc: 'Geschichtetes Knotendiagramm mit Zoom und Schwenken',
settingsViewModeTree: 'Baum',
settingsViewModeTreeDesc: 'Klassischer Einrückungsbaum, per Tastatur navigierbar',
tasksFoldIdleGroup: 'N waiting',
tasksFoldIdle: 'Idle {count}',
tasksFoldCompleted: '✓ {count} abgeschlossen',
tasksFoldOne: 'Zu Erledigten falten',
tasksFoldExpand: 'Abgeschlossene Knoten ausklappen',
tasksFoldCollapse: 'Abgeschlossene Knoten einklappen',
tasksZoomIn: 'Vergrößern',
tasksZoomOut: 'Verkleinern',
tasksZoomFit: 'An die Canvas anpassen',
tasksNodeJump: 'Transkript öffnen',
tasksNodeDetail: 'Knotendetails',
workflowRun: 'Workflow',
tasksNodeState: 'Status',
tasksNodeMode: 'Modus',
tasksNodeModel: 'Modell',
tasksNodeTeamRole: 'Teamrolle',
tasksNodeActivity: 'Letzte Aktivität',
tasksStateRunning: 'Läuft',
tasksStateIdle: 'Bereit',
tasksStateProvisioning: 'Provisioning',
tasksStateDone: 'Abgeschlossen',
tasksStateError: 'Fehler',
tasksKindSubagent: 'Subagent',
tasksKindTeammate: 'Teammitglied',
tasksKindWorkflow: 'Workflow',
taskWindowCreate: 'New task',
taskWindowDetail: 'Task detail',
teamBoard: 'Team-Aufgabenboard',
teamChip: 'Team {members} Mitglieder · {tasks} Aufgaben',
teamTasksEmpty: 'Noch keine geteilten Aufgaben',
teamTaskCreate: 'Neue Aufgabe',
teamTaskSubject: 'Titel',
teamTaskDescription: 'Beschreibung',
teamTaskOwner: 'Verantwortlich',
teamTaskUnowned: 'Nicht übernommen',
teamTaskPending: 'Offen',
teamTaskInProgress: 'In Arbeit',
teamTaskCompleted: 'Abgeschlossen',
teamTaskBlocked: 'Blockiert',
teamTaskClaim: 'Claim',
teamTaskComplete: 'Abschließen',
teamTaskReopen: 'Wieder öffnen',
teamTaskDelete: 'Löschen',
teamTaskDeleteConfirm: 'Löschen bestätigen',
teamTaskEdit: 'Bearbeiten',
teamTaskSave: 'Speichern',
teamTaskCancel: 'Abbrechen',
teamTaskConflict: 'Die Aufgabe wurde anderweitig geändert; aktualisiert',
teamTaskError: 'Vorgang fehlgeschlagen: {message}',
teamTaskDeleted: 'Gelöscht',
teamTaskActions: 'Aufgabenaktionen',
teamTaskDetail: 'Aufgabendetails',
teamTaskNoDescription: 'Noch keine Beschreibung – über „Bearbeiten“ ergänzen',
teamTaskBlockedBy: 'Blockiert durch',
teamTaskSubjectPlaceholder: 'Eine Zeile, die die Arbeit beschreibt',
teamTaskDescriptionPlaceholder: 'Zusätzliche Details (optional)',
teamFilterAll: 'Alle',
tasksNodeTasks: 'Geteilte Aufgaben',
jobCopyOutput: 'Ausgabe kopieren',
jobCopied: 'Kopiert',
jobFollowTail: 'Neuestes verfolgen',
jobDragHint: 'Zum Verschieben ziehen',
workflowRunning: 'Läuft',
workflowCompleted: 'Abgeschlossen',
workflowCancelled: 'Abgebrochen',
workflowFailed: 'Fehlgeschlagen',
workflowPhaseUnnamed: 'Unbenannte Phase',
workflowMembers: '{done}/{total} Mitglieder',
jobsAutoCollapsed: 'Automatisch eingeklappt (viele Agenten)',
catalogLoadFailed: '{count} Branches konnten nicht geladen werden',
addPluginsTabCard: 'Tab-Plugins hinzufügen',
addPluginsTabCardDesc: 'Eine neue Seitenleisten-Seite registrieren',
addPluginsViewerCard: 'Vorschau-Plugins hinzufügen',
addPluginsViewerCardDesc: 'Eine Dateityp-Vorschau registrieren',
addPluginsTabDesc: 'Seitenleisten-Seiten (Tabs) können durch Plugins erweitert werden. Plugins registrieren sich über den ctx.betterSidebar-Dienst; ein Klick auf „Installieren“ kopiert den Installationsbefehl – fügen Sie ihn in einem Terminal ein, in dem Ihr DSH-Profil liegt, und führen Sie ihn aus.',
addPluginsViewerDesc: 'Datei-Viewer können durch Plugins erweitert werden. Plugins registrieren sich über den ctx.betterSidebar-Dienst; ein Klick auf „Installieren“ kopiert den Installationsbefehl – fügen Sie ihn in einem Terminal ein, in dem Ihr DSH-Profil liegt, und führen Sie ihn aus.',
addPluginsBrowseMore: 'Weitere Plugins auf GitHub durchsuchen (Topic: dsh-better-sidebar)',
addPluginsSearch: 'Nach Plugin-Name oder -Beschreibung suchen…',
addPluginsNoMatch: 'Keine passenden Plugins',
addPluginsRecommended: 'Empfohlene Plugins',
addPluginsEmpty: 'Noch keine Plugins katalogisiert – veröffentlichen Sie Ihre Plugin unter dem GitHub-Topic',
openPlugin: 'Öffnen',
copyInstall: 'Installationsbefehl kopieren',
pluginOfficeDesc: 'Office-Suite-Vorschau (.docx / .xlsx / .pptx) für den better-sidebar-Editor, die die schweren Office-Render-Bibliotheken aus dem Kernbundle heraushält',
pluginFlowglassDesc: 'Live-Sitzungsflussdiagramm: dreispurige Darstellung von Benutzer, Assistent und Werkzeugaufrufen mit parallelen Gruppen, Subagent-Zweigen, Drill-down und Live-Status; registriert bei installiertem better-sidebar einen nativen „Flowglass“-Tab und behält sonst eine eigenständige Schublade',
pluginGitForgeDesc: '„Git-Anmeldedaten“-Tab: Konto-Bibliothek für Forges wie GitHub/Gitea + projektbezogene Freigaben + harte Push-Richtlinie; Tokens liegen nur in lokalen Secrets, nie im Modellkontext; bietet ein schreibgeschütztes GitForge-Werkzeug und einen HTTPS-Credential-Helper für den Agenten',
pluginGithubWorkbenchDesc: '„GitHub Workbench“-Tab: Repository-Baum + Issues / Pull requests / Actions mit vollen Schreibrechten — Issue/PR erstellen, kommentieren, bearbeiten, schließen/wieder öffnen, squash·merge·rebase-Merge (mit starker Bestätigung), CI erneut ausführen/abbrechen; der Repo-Umschalter listet automatisch zugreifbare Repos auf und durchsucht öffentliche; ohne better-sidebar fällt er auf ein eigenständiges rechtes Panel zurück',
pluginMdExportDesc: 'Fügt einen „Export"-Button zur Markdown-Symbolleiste in better-sidebar hinzu: rendert die aktuelle .md per Klick in eigenständiges HTML (Tabellen/Codeblöcke/Mermaid-Diagramme inline, Layout folgt dem Vorschau-Theme) und speichert es neben der .md, oder exportiert über den Druckdialog als PDF',
pluginCodeNavDesc: 'Code-Vorschau-Navigation: erkennt die Sprache am Dateityp und hebt die Syntax hervor, Symbol-Gliederung (Filter für Klassen/Methoden/Variablen + Sprung mit einem Klick) und Suche in der Datei (alle Treffer hervorgehoben, vor/zurück, Groß-/Kleinschreibung) — übernimmt die Code-Dateivorschau im better-sidebar-Editor',
pluginSuhuangScrollDesc: 'Verbindet die lokale Suhuang Scroll Runtime mit den DSH-Einstellungen und better-sidebar für Modellkonfiguration, Verbindungstests und fortlaufende Bewertung; benötigt Suhuang Scroll Runtime und dsh-better-sidebar',
pluginBetterOverleafDesc: 'Overleaf-Tab für better-sidebar: Login direkt über CDP-Browser (Chromium von Drittanbietern unterstützt), Projekliste/-wechsel, lokale git-Spiegel unter <workspace>/overleaf/, bidirektionaler git-Abgleich mit Read-only-API-Fallback und Dateivorschau über die Sidebar-Workbench',
pluginGitRemotesDesc: '„Git-Remotes“-Tab: Branches/Upstream/ahead-behind ansehen, fetch (optional prune), ff-only pull und push erst nach Bestätigung im Tab. Ersetzt nicht den eingebauten Stagen/Commit-Tab und bietet weder force-push noch automatisches Push-Werkzeug für das Modell',
pluginSentinelDesc: 'Bedingungsgesteuertes Wecksystem für Agenten: Datei-/Prozess-/Port-/HTTP-/Befehls-/Webhook-Sensoren wecken ruhende Sitzungen, wenn Bedingungen zutreffen; registriert einen „Sentinel“-Tab mit der serverweiten Überwachungstabelle',
pluginServerDeckDesc: 'Server-Karten-Dashboard: eine Karte pro Host mit Onlinestatus, OS, Uptime sowie CPU-/RAM-/Festplattenauslastung und Latenz; ein Klick öffnet ein interaktives xterm.js-Terminal; ~/.ssh/config-Import mit einem Klick (Git-Hosting-Aliase werden übersprungen). Registriert einen nativen „Server“-Tab bei installiertem better-sidebar, sonst bleibt der eigenständige Drawer erhalten',
pluginSidebarQaDesc: 'Auswählen-und-Fragen mit Tab-Aufteilung: Text in der Unterhaltung auswählen → rechts im Panel fragen → eine eigene Folgesitzung (❓Nachfrage) im selben Arbeitsbereich; ein schnelles Modell ohne Denkvorgang komprimiert den Hauptkontext und spielt ihn samt Zitat ein, ohne die Hauptunterhaltung zu unterbrechen. Nachfragen lassen sich verschachteln, fortsetzen und archivieren',
pluginSidenoteDesc: 'Side-Chat im Codex-Stil + Auswahl-Annotationen: die aktuelle Sitzung per fork in ein dauerhaftes Seiten-Panel auslagern (aus der Sitzungsliste archiviert, mehrere Instanzen gleichzeitig, /side-Befehl, übersteht Neuladen, das Modell folgt der Haupt-Sitzung); assistant-Text markieren → nummeriertes Badge + Annotation-Editor → ein "N Annotationen"-Chip wird mit der nächsten Nachricht mitgesendet, oder direkt im Side-Chat fragen',
pluginSshTunnelDesc: '„SSH-Tunnel“-Tab: Multi-Host-Inventar + projektbezogene Freigaben + lokale Schlüsselverwahrung; Modellwerkzeug SSHManager (exec/SFTP/Sitzungsstrategien); zentrales interaktives Terminal und zweispaltiges SFTP',
pluginTurnReviewDesc: 'Eine menschliche Freigabestufe für den Diff der „gerade abgeschlossenen Runde“: Approve / Request changes pro Pfad mit optionalem Kommentar; Pfade gruppiert nach Hauptsitzung / Subagent / nicht zugeordnet; Inline-Diff von Snapshot-vs-jetzt, bevor Sie entscheiden. Kein Fork, kein /rewind',
pluginVideoPreviewDesc: 'Inline-Videovorschau (.mp4/.webm/.mov/.mkv/.avi usw.) für den better-sidebar-Editor, gestützt auf eine eigene /video-Hostroute mit HTTP-Range-Unterstützung (206) – das Scrubbing funktioniert und Dateien unterliegen nicht dem 20MB-mediaLimit',
pluginDocsPanelDesc: '„Globale Dokumente“ in der DSH-Seitenleiste: eigene Markdown-Notizen aus jedem Arbeitsbereich lesen – Dateiliste, Gliederung, Öffnen in Chrome / VS Code und Kopieren-Buttons; das Dokumentenverzeichnis ist konfigurierbar (Standard ~/.dsh/docs)',
pluginEgoBrowserDesc: 'Der Agent-Browser für DeepSeek Harness: 32 ego_*-Tools steuern ein echtes Chromium; ein nativer „ego-Browser“-Tab in der Seitenleiste zeigt live jede Seite, die der Agent besucht – Klicken, Ziehen und Tippen zum Übernehmen. Registriert den Tab automatisch, wenn better-sidebar vorhanden ist, sonst eine schwebende Blase',
pluginBilingualReaderDesc: 'PDFs im DSH-Seitenbereich lesen: native PDF-Anzeige, Text auswählen und mit dem LLM übersetzen — mit Kontext, vollständig vom Hauptgespräch isoliert',
changesRedactOn: "Schwärzung aktiv: Geheimnisse als [REDACTED]; Klicken zum Deaktivieren (auf eigenes Risiko)",
changesRedactOff: "Schwärzung aus: Inhalte werden unverändert angezeigt; Klicken zum Aktivieren",
changesRedactOnLabel: "Schwärzung",
changesRedactOffLabel: "Ohne Schwärzung",
changesRedactBanner: "Geschwärzt",
pluginSentinelName: 'dsh-sentinel Wecksystem',
pluginEgoBrowserName: 'ego-browser Agent-Browser',
pluginBetterOverleafName: 'dsh-better-overleaf Overleaf-Tab',
pluginDocsPanelName: 'dsh-docs-panel Globale Dokumente',
pluginFlowglassName: 'dsh-flowglass Flowglass',
pluginGitForgeName: 'dsh-git-forge Git-Zugangsdaten',
pluginGitRemotesName: 'dsh-git-remotes Git-Remotes',
pluginGithubWorkbenchName: 'dsh-github-workbench GitHub-Workbench',
pluginSidebarQaName: 'dsh-sidebar-qa Auswählen & Fragen',
pluginSidenoteName: 'dsh-sidenote Seiten-Chat',
pluginServerDeckName: 'dsh-server-deck Server-Deck',
pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll',
pluginSshTunnelName: 'dsh-ssh-tunnel SSH-Tunnel',
pluginTurnReviewName: 'dsh-turn-review Runden-Review',
pluginBilingualReaderName: 'dsh-bilingual-reader Zweisprachiger Reader',
pluginOfficeName: 'Office-Vorschau',
pluginMdExportName: 'Markdown-Export',
pluginCodeNavName: 'Code-Vorschau-Navigation',
pluginVideoPreviewName: 'Video-Vorschau',
presetDshDesktopDesc: 'Elektronischer Erweiterte-Modus (rahmenlos): macOS reserviert oben 20px; Windows reserviert ohne WCO 32px für die Titelleiste',
}