mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
* feat(daemon): add Antigravity agent adapter
Adds Google Antigravity (`agy` CLI) as a coding-agent runtime. Detection
picks up `agy` on PATH, the daemon spawns `agy -p "<prompt>"` for a
single non-interactive turn, and the assistant text reply streams back
on stdout. OAuth is shared with the Antigravity IDE through the system
keyring, so users who have signed into the desktop app are authenticated
on first run with no extra step.
`agy` v1.0.3 has no JSON / stream-json / ACP output mode (upstream issue
#119), no `--model` flag (issue #35), and no MCP forwarding hook yet —
the adapter ships with `streamFormat: 'plain'` and a single `default`
fallback model so the model picker doesn't mislead users into thinking
their choice is wired through. We will upgrade buildArgs + add a
dedicated event parser when upstream ships structured output.
Also gitignores `.antigravitycli/`, the project-local config directory
`agy` auto-creates on every run (upstream issue #175).
* fix(daemon): Antigravity adapter — stdin prompt, brand icon, form loop, empty-output guard
- Switch prompt delivery from argv to stdin (`agy -p -`) to avoid the
30KB maxPromptArgBytes limit that blocked real-world composed prompts
- Add official Antigravity brand SVG icon to agent picker
- Fix repeated question-form loop for plain agents by injecting an
OVERRIDE block when form answers are already present in the transcript
- Add empty-output guard for plain agents so expired auth or silent
failures surface a user-visible error instead of a blank "Done" turn
* feat(daemon): expand Antigravity adapter — model picker, form-loop fix, OAuth launcher, log-file classification
PR #3157 follow-up integrating four iterations from end-to-end manual
testing on Gemini 3.5 Flash + GPT-OSS 120B Medium through `agy` v1.0.3.
Each section is independently verifiable; combined they're what made
the first successful artifact generation work end-to-end.
## Model picker via settings.json (agy has no --model flag)
agy v1.0.3 ships no `--model` CLI flag (upstream issue #35), but the
TUI Switch-Model picker writes the chosen label to
`~/.gemini/antigravity-cli/settings.json`'s `"model"` field, and every
`-p` invocation re-reads that file on startup — verified by capturing
the `--log-file` line `Propagating selected model override to backend:
label="<model>"`. Antigravity's `fallbackModels` now lists the 8
labels its TUI exposes (Gemini 3.1 Pro / 3.5 Flash variants, Claude
Sonnet/Opus 4.6 Thinking, GPT-OSS 120B Medium) and `buildArgs`
persists the user's choice to settings.json right before spawn. The
synthetic `default` id is preserved — picking it leaves settings.json
untouched so a user who switches models from agy's own TUI keeps
their choice.
Introduces `RuntimeAgentDef.supportsCustomModel?: boolean`. AMR's
hardcoded blocklist in `SettingsDialog.tsx` migrates to the
declarative flag (it rejects free-form ids at the ACP layer), and
antigravity opts out because its label set is a server-side enum that
silently fails on unrecognised strings.
## Form-loop fix (transcript sanitizer + stronger OVERRIDE)
The discovery form loop on weak/medium plain-stream models (GPT-OSS
120B Medium, Gemini 3.5 Flash) had two reinforcing causes:
1. `buildDaemonTranscript` packed the prior assistant turn's
literal `<question-form>` markup into the user request on the
next turn, giving the model a template to echo. New
`sanitizePriorAssistantTurnForTranscript` strips
`<question-form>...</question-form>` blocks and ```json fences
that match form-schema shape, replacing them with a brief
placeholder. User content is preserved verbatim (a user who
legitimately mentions `<question-form>` in chat keeps their
message intact).
2. The OVERRIDE block on form-answered turns was 4 lines and only
banned the bare `<question-form>` tag — models still emitted the
fenced JSON, form-asking prose ("Got it — tell me the following"),
and fake system events ("subagents stopped"). The new
`FORM_ANSWERED_SYSTEM_OVERRIDE` enumerates each anti-pattern and
pins them via tests, so silently weakening any line reintroduces
the regression.
Also adds RuntimeAgentDef.resumesSessionViaCli + RuntimeContext.
hasPriorAssistantTurn as forward-looking abstractions (skipTranscript
option on composeChatUserRequestForAgent). Antigravity does NOT opt
in — agy's `-c` resume activates an internal agentic loop with tool
retries and fallback-to-cached-response on tool errors that the OD
system prompt cannot steer; reverted after seeing byte-identical
form re-emissions caused by agy's own retry logic, not OD's transcript.
## One-click OAuth via system terminal
agy print mode can't complete Google Sign-In on its own (the OAuth
callback page asks the user to paste an auth code back into agy, but
`-p` has no input field). Before this commit the auth banner only
told the user to "open a terminal yourself."
Adds `POST /api/agents/antigravity/oauth-launch` and a cross-platform
launcher in `runtimes/terminal-launch.ts`:
- macOS: osascript → Terminal.app `do script "agy"` + activate
- Linux: tries x-terminal-emulator, gnome-terminal, konsole,
xfce4-terminal, xterm in order
- Windows: `cmd /c start "Open Design" cmd /k agy`
The endpoint hardcodes the `agy` command (no user input → no shell
injection surface) and is loopback-gated like the other daemon
endpoints. The chat's `AGENT_AUTH_REQUIRED` banner now renders a
"Sign in via terminal" button next to Retry; clicking it spawns the
terminal so the user can finish OAuth in one click.
## Silent-failure classification (auth vs quota via --log-file)
agy print mode is silent on stdout/stderr for both missing-OAuth AND
quota-exhausted failures — the upstream
`RESOURCE_EXHAUSTED (code 429): Individual quota reached` and the
`not logged into Antigravity` line only surface in agy's
`--log-file`. Without log inspection the daemon misread quota as
"auth required" and showed the wrong banner.
`RuntimeContext.agentLogFilePath` carries a daemon-owned per-run temp
path that antigravity's buildArgs translates to `--log-file <path>`.
The empty-output guard now reads that log on a `code === 0 &&
!childStdoutSeen` exit, feeds the tail to
`classifyAgentServiceFailure`, and routes:
- "not logged into Antigravity" → AGENT_AUTH_REQUIRED with
antigravityAuthGuidance
- "RESOURCE_EXHAUSTED" / "quota" / → RATE_LIMITED with
"Individual quota reached" antigravityQuotaGuidance
- none of the above (rare) → fall back to auth guidance
as the most likely cause
Both surface a terminal launcher in the auth banner: auth gets "Sign
in via terminal", quota gets "Switch model in terminal" — same
endpoint, contextual label. The handler is identical (open agy in a
terminal); the user either signs in or uses agy's Switch Model
picker to pick a model with available quota.
## Validation
- `pnpm guard` pass
- `pnpm --filter @open-design/daemon` runtime + telemetry suites:
192 passed, 1 skipped (the 1 pre-existing `task-type` failure on
origin/main is unrelated to this change)
- `pnpm --filter @open-design/web` typecheck pass; sse / amr-guidance
/ AgentIcon suites pass (51 web tests)
- Manual end-to-end on darwin + Gemini 3.5 Flash and GPT-OSS 120B
Medium: turn-1 question-form rendered correctly, turn-2 produced
`<artifact>` with full HTML (3.3KB Modern Minimal design) instead
of re-emitting the form. agy `--log-file` content correctly
classified as RATE_LIMITED when Gemini Pro quota was exhausted,
and as AGENT_AUTH_REQUIRED when keychain was cleared.
* fix(web/test): align amrAgent fixture with supportsCustomModel contract
The AMR agent definition in the daemon ships `supportsCustomModel: false`
so the Settings model picker hides the free-text "Custom…" option. The
PR changed `allowCustomModel` from `selected.id !== 'amr'` (hardcoded)
to `selected.supportsCustomModel !== false` (declarative), but the test
fixture was not updated to carry the same field — causing the
`__custom__` sentinel to appear in the picker under test.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): align formAnswerTransition wording with main + scope build directive to discovery
CI surfaced two failures on the merge with main:
- chat-route.test marks submitted discovery form answers ... expected
the main-version wording 'Do not emit another <formId> form.'
- telemetry-message-finalization keeps non-discovery form answers
active ... expected task-type to fall through the else branch
('Treat these form answers as the active user turn'), not the
discovery RULE 2/RULE 3 build branch.
The colleague's earlier fba1e40b form-loop fix tightened both pieces
(stronger wording + grouped discovery|task-type into the build branch)
but didn't update the tests that pin the contract. Revert the
transition wording to main and re-scope the build directive to
'discovery' only. The aggressive form-loop suppression we added in
this PR now lives in the system-prompt FORM_ANSWERED_SYSTEM_OVERRIDE
block, which is far stronger than the user-request transition text
this commit reverts.
* fix(daemon): scope formOverride by form id, detach Linux terminal, move agy log cleanup to finally
- FORM_ANSWERED_GENERIC_OVERRIDE: new exported constant for non-discovery/
non-task-type form ids; contains only the "do not re-ask" suppression
without the RULE 2 / RULE 3 / artifact directive.
- formAnswerTransitionForCurrentPrompt: extend build-transition branch to
include task-type alongside discovery, keeping user-turn and system
override consistent.
- Prompt assembly (server.ts ~10848): derive formOverride from the parsed
form id — FORM_ANSWERED_SYSTEM_OVERRIDE for discovery/task-type,
FORM_ANSWERED_GENERIC_OVERRIDE for all other form ids, empty otherwise.
- launchOnLinux: replace execFileAsync (waited for terminal exit, 3 s cap)
with spawn({ detached: true, stdio: 'ignore' }) + unref(); resolve on
the 'spawn' event so long-lived interactive terminals (xterm, konsole)
are not killed mid-OAuth-flow.
- Antigravity log cleanup: move fs.promises.unlink(agentLogFilePath) into
a try/finally wrapper around the close handler so every exit path
(success, failure, cancel, non-zero exit) cleans up the per-run temp
file, preventing unbounded /tmp accumulation.
- Tests: rename task-type case to assert build-transition behaviour; add
generic-form-id case (preferences) pinning the non-build path; add
FORM_ANSWERED_GENERIC_OVERRIDE content assertions.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): switch Antigravity buildArgs to chat subcommand invocation
Replace top-level `-p -` with `agy chat [--log-file …] -` so the adapter
uses the documented chat subcommand and stdin sentinel instead of the
unrecognised global -p flag. Update the agent-args test description and
all four deepEqual assertions to assert the ['chat', '-'] shape.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* test(daemon): drop real-platform default-launch assertion from terminal-launch suite
The removed test called launchAgentInSystemTerminal('agy') with no
platform override, which invokes the real system terminal on every
developer machine running the daemon test suite (Terminal.app on macOS,
cmd.exe on Windows, xterm/gnome-terminal on Linux). That is an
unacceptable OS side effect for a unit test.
The behaviour being asserted — that omitting platform selects
process.platform — is a TypeScript default-parameter guarantee, not a
runtime invariant that needs an integration test. The remaining 'aix'
case continues to pin the unsupported-platform failure shape.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): buffer Antigravity stdout to suppress auth URL before close-time classifier
The plain-stream close handler at code===0 can detect an agy OAuth
prompt in agentStdoutTail and emit AGENT_AUTH_REQUIRED, but by the
time close fires the stdout chunk has already been forwarded to the
client via the plain-stream `send('stdout', { chunk })` path. This
leaves both the raw OAuth URL and the terminal-launch guidance visible
in chat.
Buffer all stdout chunks for the `antigravity` agent instead of
forwarding them immediately. The existing close-time auth-prompt guard
(code===0, !trackingSubstantiveOutput, childStdoutSeen) returns early
when it detects the auth pattern, leaving the buffer unflushed and the
OAuth URL out of the SSE stream. For legitimate assistant output the
buffer is flushed in order just before design.runs.finish so the
chunks still arrive before the run's finished event.
Adds a chat-route integration test using a fake `agy` that exits 0
after printing the canonical auth prompt; asserts that the run emits
AGENT_AUTH_REQUIRED with no event: stdout delta containing the URL.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* test(daemon): isolate antigravity buildArgs argv test from real settings file
Pass a temp antigravitySettingsPath in the RuntimeContext for the
withModel argv assertion so unit tests do not touch
~/.gemini/antigravity-cli/settings.json. Adds the optional
antigravitySettingsPath field to RuntimeContext and threads it
through buildArgs to writeAntigravityModelSelection; production
callers leave it undefined, preserving the existing default path.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): revert Antigravity buildArgs to `-p -` (the only working agy v1.0.3 invocation)
The looper-reviewer-bot reported `chat` as agy's headless subcommand
based on its environment's agy build, and looper-fixer applied that
shape. The installed CLI (`agy --version` reports `1.0.3`) does NOT
expose a `chat` subcommand — `agy --help`'s `Available subcommands`
section lists only `changelog / help / install / plugin / update`,
and `agy chat - < prompt` exits 0 with empty stdout (the daemon then
forwards it as a 'successful' empty reply, exactly the failure mode
the auth/quota guard at server.ts ~12090 is meant to catch — for the
wrong reason).
`-p` is the documented print-mode flag (`Short alias for --print`)
and `agy -p -` reads the prompt from stdin and prints the model
reply, which the entire end-to-end test sequence in this PR has
verified against (form-loop fix, settings.json model routing,
log-file classification all confirmed working on Gemini 3.5 Flash
+ GPT-OSS 120B Medium with this invocation).
Updates the agent-args test to pin `['-p', '-']` instead of
`['chat', '-']` and adds an inline comment in antigravity.ts noting
that `chat` may exist in a future agy build but is not the contract
on the installed CLI today.
* fix(daemon): serialize Antigravity concrete-model spawns to dodge settings.json race
Reviewer (looper) flagged a concurrency race in the model-routing path:
~/.gemini/antigravity-cli/settings.json is process-global, so two OD
runs starting close together with different concrete models can race
the file — run A writes model A, run B writes model B, then A's agy
finally reads settings.json and executes on model B. The Settings
model picker becomes nondeterministic under parallel conversations.
Adds a per-process promise chain in antigravity.ts:
- acquireAntigravityModelLock(): chain-await + return release fn
- waitForAgyToReadModel(logPath, expected): polls agy's --log-file
for the upstream signal
'Propagating selected model override to backend: label="<X>"'
which model_config_manager.go emits once agy has finished reading
settings.json. Returns true on observed match, false on timeout.
Regex-escapes the expected label so '(' / ')' in 'GPT-OSS 120B
(Medium)' match literally, not as a capture group.
server.ts spawn pipeline now acquires the lock BEFORE buildArgs (which
performs the settings.json write) and schedules a release-once handler
that fires when EITHER (a) the log-file confirms agy read the model
or (b) the child exits — the exit fallback prevents a stuck/crashed
agy from starving the queue for every subsequent antigravity spawn.
Default-model spawns bypass the lock entirely: their buildArgs doesn't
touch settings.json, so there's nothing to serialize.
Tests pin:
- FIFO ordering across 2 / 3 concurrent acquirers
- Wait helper's regex correctly matches parenthesized labels
- Wait helper does NOT match a different model with shared prefix
- Wait helper swallows missing-log-file errors and returns false on
timeout (no spawn-pipeline crash if the log never appears)
194 → 198 passing runtime tests, 0 regressions.
* fix(daemon): close Antigravity lock release race on slow agy startup (looper #263fd2fe7)
Reviewer flagged that the previous serialization scheduled
`releaseOnce` in `.finally()` on waitForAgyToReadModel — meaning the
helper's `false` timeout return ALSO released the lock. If agy took
longer than the 15s polling window to read settings.json (cold start,
swap-thrash, slow network handshake to the upstream backend), run A's
lock dropped at 15s, run B rewrote settings.json with model B, and
run A's still-starting agy then read the wrong model. Same race the
original mutex was meant to close.
Fix the release semantics to be release-on-confirmation-only:
- waitForAgyToReadModel: `false` now strictly means 'I gave up
polling,' not 'agy definitely did not read this.' Document the
contract so a future caller can't conflate the two. Add an
optional AbortSignal so server.ts can stop polling when the child
exits — without it, the leftover watcher could outlive the run
and accidentally match a later concurrent run's log content,
releasing the wrong lock.
- server.ts: schedule `releaseOnce` only when waitForAgyToReadModel
returns true. The exit handler (which fires for crashes, fast
exits, normal completion) is now the canonical fallback that
releases the lock no matter what — the queue can't starve
permanently because agy always exits eventually. The exit
handler also fires the AbortController so the watcher cleans up.
New tests pin:
- timeout returns false WITHOUT any release-implying side effect
- already-aborted signal short-circuits (no readFile calls)
- abort mid-poll wakes the helper from its setTimeout (no
multi-hundred-ms hang waiting out a poll interval that no longer
matters)
198 → 201 passing runtime tests, 0 regressions.
---------
Co-authored-by: qiongyu1999 <2694684348@qq.com>
1721 lines
98 KiB
TypeScript
1721 lines
98 KiB
TypeScript
import type { Dict } from '../types';
|
||
import { en } from './en';
|
||
|
||
export const de: Dict = {
|
||
...en,
|
||
'chat.amrCard.switchTitle': 'Modellaufruf fehlgeschlagen — dieser Lauf ist pausiert',
|
||
'chat.amrCard.switchBody': 'Wechsle zum offiziellen AMR-Modelldienst von Open Design — kein API-Key-Setup nötig. Nach Anmeldung, Autorisierung und Aufladung wird dieser Lauf automatisch wiederholt.',
|
||
'chat.amrCard.chipOfficial': 'Offizielles Hosting',
|
||
'chat.amrCard.chipNoKey': 'Kein API-Key',
|
||
'chat.amrCard.chipAutoRetry': 'Auto-Wiederholung nach Anmeldung',
|
||
'chat.amrCard.switchCta': 'Zu AMR wechseln und wiederholen',
|
||
'chat.amrError.authMessage': 'Dein AMR-Konto ist noch nicht autorisiert. Autorisiere es, und dieser Lauf wird automatisch wiederholt.',
|
||
'chat.amrError.balanceMessage': 'Dein AMR-Guthaben ist aufgebraucht. Lade auf, um diesen Lauf fortzusetzen.',
|
||
'chat.amrError.authorizeCta': 'Autorisieren und wiederholen',
|
||
'chat.amrError.rechargeCta': 'AMR aufladen',
|
||
'chat.antigravityError.launchTerminalCta': 'Sign in via terminal',
|
||
'chat.antigravityError.launchSwitchModelCta': 'Switch model in terminal',
|
||
'plugins.actions.copyInstallCommand': 'Installationsbefehl kopieren',
|
||
'plugins.actions.copyPluginId': 'Plugin-ID kopieren',
|
||
'plugins.actions.copyReadmeBadge': 'README-Badge kopieren',
|
||
'plugins.actions.openSourceGithub': 'Quelle auf GitHub öffnen',
|
||
'plugins.actions.openSource': 'Quelle öffnen',
|
||
'plugins.actions.openHomepage': 'Homepage öffnen',
|
||
'plugins.actions.openMarketplace': 'Im Marktplatz öffnen',
|
||
'workingDirPicker.title': "Folder",
|
||
'workingDirPicker.homeTitle': "Choose where this project should live",
|
||
'workingDirPicker.processing': "Processing…",
|
||
'workingDirPicker.select': "Choose working directory",
|
||
'workingDirPicker.clearAria': "Clear working directory",
|
||
'workingDirPicker.replaceFailed': "Could not replace working directory",
|
||
'workingDirPicker.unavailable': "Folder picker is unavailable in this build. Run the desktop app to pick a folder.",
|
||
'workingDirPicker.openUnavailable': "Open this project in the desktop app to show the folder.",
|
||
'workingDirPicker.openFailed': "Could not show this folder",
|
||
'workingDirPicker.showInFileManager': "Show in file manager",
|
||
'workingDirPicker.replace': "Clear and replace directory…",
|
||
'workingDirPicker.recent': "Recent directories",
|
||
'handoff.toTarget': 'Hand off to {target}',
|
||
'handoff.action': 'Hand off',
|
||
'handoff.fallbackTitle': 'No editors found on $PATH - opens in {target}',
|
||
'handoff.chooseTargetAria': 'Choose hand-off target',
|
||
'handoff.notInstalled': 'Not installed',
|
||
'handoff.notDetectedTitle': '{target} - not detected on $PATH',
|
||
'homeHero.promptExamples': "Beispiele",
|
||
'homeHero.footer.designSystem': "Stil",
|
||
'homeHero.footer.autoDesignSystem': "Auto",
|
||
'homeHero.footer.autoDesignSystemSummary': "Wählt automatisch das passende Designsystem und den visuellen Stil für den aktuellen Prompt.",
|
||
'homeHero.footer.ratio': "Format",
|
||
'homeHero.footer.duration': "Dauer",
|
||
'homeHero.footer.resolution': "Auflösung",
|
||
'homeHero.footer.speakerNotes': "Notes",
|
||
'homeHero.footer.noSpeakerNotes': "Keine Notizen",
|
||
'homeHero.footer.availableCount': "{n} available",
|
||
'homeHero.footer.noMatches': "No matches",
|
||
'homeHero.moreShortcuts': "Mehr",
|
||
'common.cancel': 'Abbrechen',
|
||
'common.save': 'Speichern',
|
||
'common.close': 'Schließen',
|
||
'common.delete': 'Löschen',
|
||
'common.rename': 'Umbenennen',
|
||
'common.edit': 'Bearbeiten',
|
||
'common.preview': 'Vorschau',
|
||
'common.share': 'Teilen',
|
||
'common.search': 'Suchen',
|
||
'common.searchEllipsis': 'Suchen…',
|
||
'common.loading': 'Wird geladen…',
|
||
'common.all': 'Alle',
|
||
'common.none': 'Keine',
|
||
'common.default': 'Standard',
|
||
'common.installed': 'installiert',
|
||
'common.notInstalled': 'nicht installiert',
|
||
'common.active': 'aktiv',
|
||
'common.offline': 'offline',
|
||
'common.selected': 'ausgewählt',
|
||
'common.create': 'Erstellen',
|
||
'common.openPreview': 'Vorschau öffnen',
|
||
'common.exitFullscreen': 'Vollbild verlassen',
|
||
'common.fullscreen': 'Vollbild',
|
||
'common.openInNewTab': 'In neuem Tab öffnen',
|
||
'common.exportPdf': 'Als PDF exportieren',
|
||
'common.exportZip': 'Als .zip herunterladen',
|
||
'common.exportHtml': 'Als eigenständiges HTML exportieren',
|
||
'common.justNow': 'gerade eben',
|
||
'common.minutesAgo': 'vor {n} Min.',
|
||
'common.hoursAgo': 'vor {n} Std.',
|
||
'common.daysAgo': 'vor {n} T.',
|
||
'common.weeksAgo': 'vor {n} Wo.',
|
||
'common.now': 'jetzt',
|
||
'common.minutesShort': '{n} Min.',
|
||
'common.hoursShort': '{n} Std.',
|
||
'common.daysShort': '{n} T.',
|
||
'common.untitled': 'Ohne Titel',
|
||
|
||
'app.brand': 'Open Design',
|
||
'app.brandPill': 'Forschungsvorschau',
|
||
'app.brandSubtitle': 'von Nexu Labs',
|
||
'app.welcomeLoading': 'Workspace wird geladen…',
|
||
|
||
'settings.welcomeKicker': "",
|
||
'settings.welcomeTitle': "Welcome",
|
||
'settings.welcomeSubtitle': "",
|
||
'settings.onboardingCreateTitle': 'Start from a brief',
|
||
'settings.onboardingCreateBody':
|
||
'Describe the site, app, deck, image, or video you want. Open Design will create a project and keep the work editable.',
|
||
'settings.onboardingMemoryTitle': 'Save working context',
|
||
'settings.onboardingMemoryBody':
|
||
'Add preferences, project facts, and recurring rules so future chats pick up the right context.',
|
||
'settings.onboardingSystemsTitle': 'Bring your design system',
|
||
'settings.onboardingSystemsBody':
|
||
'Pick or create a brand system so generated work follows real colors, typography, and product language.',
|
||
'settings.onboardingExecutionTitle': 'Choose how generation runs',
|
||
'settings.onboardingExecutionBody':
|
||
'Official CLI with one-click setup and ready-to-use defaults. Use one key to choose from many models with better pricing.',
|
||
'settings.onboardingAmrCloudBenefitOfficial': 'Offiziell gepflegt',
|
||
'settings.onboardingAmrCloudBenefitReady': 'Sofort einsatzbereit',
|
||
'settings.onboardingAmrCloudBenefitModels': 'Viele Modelle',
|
||
'settings.onboardingAmrCloudBenefitPricing': 'Günstigere Preise',
|
||
'settings.onboardingAmrCloudAuthorizeAction': 'AMR autorisieren',
|
||
'settings.onboardingAmrCloudAuthorizedAction': 'Autorisiert',
|
||
'settings.onboardingStepConnect': "Connect",
|
||
'settings.onboardingStepDesignSystem': "Design system",
|
||
'settings.onboardingStepProfile': "About you",
|
||
'settings.onboardingConnectTitle': "Choose a runtime",
|
||
'settings.onboardingConnectBody': "",
|
||
'settings.onboardingRecommended': "Recommended",
|
||
'settings.onboardingLocalTitle': "Local coding agent",
|
||
'settings.onboardingLocalBody': "Use an installed CLI such as Claude Code, Codex, Cursor, Gemini, or OpenCode.",
|
||
'settings.onboardingLocalAction': "Open CLI settings",
|
||
'settings.onboardingCliScanHint': "This usually takes 5-10 seconds.",
|
||
'settings.onboardingByokTitle': "Bring your own key",
|
||
'settings.onboardingByokBody': "Use your own model provider credentials.",
|
||
'settings.onboardingByokAction': "Open BYOK settings",
|
||
'settings.onboardingDesignTitle': "Design system",
|
||
'settings.onboardingDesignBody': "Generate once, reuse everywhere.",
|
||
'settings.onboardingDesignIntroGenerateTitle': "Generate from existing work",
|
||
'settings.onboardingDesignIntroGenerateBody': "Upload your design system from GitHub or local code repositories, Figma files, images, and other content assets.",
|
||
'settings.onboardingDesignIntroReuseTitle': "Reuse in future work",
|
||
'settings.onboardingDesignIntroReuseBody': "Future prototypes, slides, and other content can reference your existing fonts, spacing, logo style, and color tone.",
|
||
'settings.onboardingDesignIntroSkipTitle': "Optional for now",
|
||
'settings.onboardingDesignIntroSkipBody': "Skip this step if you want to start without generating a design system.",
|
||
'settings.onboardingGithubTitle': "Import from GitHub",
|
||
'settings.onboardingGithubBody': "Use a frontend repository.",
|
||
'settings.onboardingUploadTitle': "Upload local files",
|
||
'settings.onboardingUploadBody': "Add project files, screenshots, CSS, docs, or assets.",
|
||
'settings.onboardingPromptTitle': "Generate from prompt",
|
||
'settings.onboardingPromptBody': "Describe the product or brand.",
|
||
'settings.onboardingProfileTitle': "About you",
|
||
'settings.onboardingProfileBody': "Optional details for better defaults.",
|
||
'settings.onboardingRoleLabel': "Your role",
|
||
'settings.onboardingOrgSizeLabel': "Organization size",
|
||
'settings.onboardingUseCaseLabel': "Use case",
|
||
'settings.onboardingSourceLabel': "Where did you hear about us?",
|
||
'settings.onboardingSelectPlaceholder': "Select one",
|
||
'settings.onboardingSelectMultiplePlaceholder': "Select one or more",
|
||
'settings.onboardingOrgSolo': "Solo / personal (1)",
|
||
'settings.onboardingOrgTeam': "Small team (2-10)",
|
||
'settings.onboardingOrgStartup': "Startup / SMB (11-50)",
|
||
'settings.onboardingOrgGrowth': "Growth company (51-200)",
|
||
'settings.onboardingOrgMidMarket': "Mid-market (201-1000)",
|
||
'settings.onboardingOrgEnterprise': "Enterprise (1000+)",
|
||
'settings.onboardingRolePm': "📋 Product manager",
|
||
'settings.onboardingRoleDesigner': "🎨 Designer",
|
||
'settings.onboardingRoleEngineer': "💻 Engineer",
|
||
'settings.onboardingRoleMarketing': "📣 Marketing",
|
||
'settings.onboardingRoleGrowth': "📈 Growth",
|
||
'settings.onboardingRoleOps': "⚙️ Operations",
|
||
'settings.onboardingRoleFounder': "🚀 Founder / executive",
|
||
'settings.onboardingRoleStudent': "🎓 Student / educator",
|
||
'settings.onboardingRoleOther': "✨ Other",
|
||
'settings.onboardingUseProduct': "🎨 Product design",
|
||
'settings.onboardingUseDesignSystem': "🧩 Design system",
|
||
'settings.onboardingUsePrototype': "📱 Prototype / app UI",
|
||
'settings.onboardingUseLanding': "🌐 Landing pages",
|
||
'settings.onboardingUseAds': "📣 Ads / social content",
|
||
'settings.onboardingUseDashboard': "📊 Dashboards / internal tools",
|
||
'settings.onboardingUseDeck': "🖥️ Presentation / deck",
|
||
'settings.onboardingUseMarketing': "📈 Marketing / growth",
|
||
'settings.onboardingUseEngineering': "🤝 Engineering handoff",
|
||
'settings.onboardingUseAgency': "💼 Agency / client work",
|
||
'settings.onboardingSourceGithub': "🐙 GitHub",
|
||
'settings.onboardingSourceFriend': "👥 Friend or coworker",
|
||
'settings.onboardingSourceSocial': "📱 Social media",
|
||
'settings.onboardingSourceProductHunt': "🅿️ Product Hunt",
|
||
'settings.onboardingSourceCommunity': "💬 Design / AI community",
|
||
'settings.onboardingSourceYoutube': "▶️ YouTube",
|
||
'settings.onboardingSourceBlog': "📰 Blog or newsletter",
|
||
'settings.onboardingSourceAiTool': "✨ AI tool recommendation",
|
||
'settings.onboardingSourceSearch': "🔍 Search",
|
||
'settings.onboardingSourceEvent': "🎤 Event or community",
|
||
'settings.onboardingBack': "Back",
|
||
'settings.onboardingContinue': "Continue",
|
||
'settings.onboardingFinish': "Finish setup",
|
||
'settings.onboardingSkip': "Skip for now",
|
||
'settings.kicker': 'Einstellungen',
|
||
'settings.title': 'Ausführungsmodus',
|
||
'settings.subtitle': 'Wählen Sie zwischen lokaler CLI und BYOK.',
|
||
'settings.modeAria': 'Ausführungsmodus',
|
||
'settings.protocolAria': 'API-Protokoll',
|
||
'settings.modeDaemon': 'Lokale CLI',
|
||
'settings.modeDaemonHelp': 'Über eine Code-Agent-CLI auf Ihrem Rechner ausführen',
|
||
'settings.modeDaemonOffline': 'Daemon läuft nicht',
|
||
'settings.modeDaemonOfflineMeta': 'Daemon offline',
|
||
'settings.modeDaemonInstalledMeta': '{count} installiert',
|
||
'settings.modeApi': 'API-Anbieter',
|
||
'settings.modeApiMeta': 'BYOK',
|
||
'settings.codeAgent': 'Code-Agent',
|
||
'settings.codeAgentHint':
|
||
'Durch Scannen Ihres PATH erkannt. Wählen Sie die CLI, über die Generierungen laufen sollen.',
|
||
'settings.rescan': '↻ Neu scannen',
|
||
'settings.rescanTitle': 'PATH erneut scannen',
|
||
'settings.rescanRunning': 'Scannen...',
|
||
'settings.rescanSuccess': 'Scan abgeschlossen. {count} verfuegbar.',
|
||
'settings.designSystemRenameFailed': 'Umbenennen fehlgeschlagen. Pruefen Sie den Daemon und versuchen Sie es erneut.',
|
||
'settings.rescanFailed': 'Scan fehlgeschlagen. Pruefen Sie den Daemon und versuchen Sie es erneut.',
|
||
'settings.test': 'Test',
|
||
'settings.testTitle': 'Sende einen winzigen Testprompt, um die Verbindung zu pruefen',
|
||
'settings.testRunning': 'Verbindung wird geprueft…',
|
||
'settings.testCancel': 'Abbrechen',
|
||
'settings.testSuccessApi': 'Verbunden. Antwort in {ms} ms — \'{sample}\'',
|
||
'settings.testSuccessCli': '{agentName} antwortete in {ms} ms — \'{sample}\'',
|
||
'settings.testAuthFailed': 'Authentifizierung fehlgeschlagen. Pruefen Sie Ihren API-Schluessel.',
|
||
'settings.testForbidden': 'Zugriff verweigert. Pruefen Sie Konto, Region oder Organisation.',
|
||
'settings.testNotFoundModel': 'Modell \'{model}\' an diesem Endpunkt nicht gefunden.',
|
||
'settings.testInvalidModelId': 'Modell-ID \'{model}\' ist ungueltig. Benutzerdefinierte IDs muessen mit einem Buchstaben oder einer Zahl beginnen und duerfen keine Leerzeichen enthalten.',
|
||
'settings.testInvalidBaseUrl': 'Base URL ist ungueltig oder nicht erreichbar.',
|
||
'settings.testRateLimited': 'Anbieter hat den Test ratenbegrenzt. Konfiguration sieht gueltig aus.',
|
||
'settings.testUpstream': 'Anbieter antwortete mit {status}. Versuchen Sie es gleich erneut.',
|
||
'settings.testTimeout': 'Test abgebrochen nach {ms} ms.',
|
||
'settings.testAgentMissing': '{agentName} ist nicht installiert oder nicht im PATH.',
|
||
'settings.testAgentSpawn': '{agentName} konnte nicht gestartet werden: {detail}.',
|
||
'settings.testUnknown': 'Test fehlgeschlagen: {detail}',
|
||
'settings.agentInstall.install': 'Installieren',
|
||
'settings.agentInstall.docs': 'Doku',
|
||
'settings.agentInstall.pathHint':
|
||
'Wenn Sie eine CLI mit npm oder Homebrew installiert haben und sie weiterhin als nicht installiert angezeigt wird, stellen Sie sicher, dass das Bin-Verzeichnis der CLI im PATH enthalten ist, den der Open-Design-Daemon erbt (Terminal und GUI-Apps koennen sich unter macOS unterscheiden). Siehe QUICKSTART.md (Abschnitt "Local agent CLI and PATH").',
|
||
'settings.agentInstall.stepOpenLinks': 'Oeffnen Sie Installieren oder Doku fuer den gewuenschten Agenten.',
|
||
'settings.agentInstall.stepAuth':
|
||
'Authentifizieren Sie sich mit der Anbieter-CLI (anmelden oder API-Zugangsdaten setzen), bevor Sie zu Open Design zurueckkehren.',
|
||
'settings.agentInstall.stepRescan': 'Klicken Sie in diesem Bereich auf Neu scannen.',
|
||
'settings.agentInstall.stepSelect': 'Waehlen Sie die Agent-Karte aus, sobald sie als installiert angezeigt wird.',
|
||
'settings.noAgentsDetected':
|
||
'Noch keine Agents erkannt. Installieren Sie Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen oder GitHub Copilot CLI und klicken Sie dann auf Neu scannen.',
|
||
'settings.agentInstalledGroup': 'Ihre CLIs ({count})',
|
||
'settings.agentInstallGroup': 'Zur Installation verfügbar ({count})',
|
||
'settings.agentAuthRequired': 'Authentifizierung erforderlich',
|
||
'settings.agentAuthUnknown': 'Authentifizierungsstatus unbekannt',
|
||
'settings.amrLogin': 'Sign in',
|
||
'settings.amrLogout': 'Sign out',
|
||
'settings.amrLoggingIn': 'Signing in…',
|
||
'settings.amrLoggingOut': 'Signing out…',
|
||
'settings.amrLoggedInAs': 'Signed in as {email}',
|
||
'settings.amrLoggedInWithPlan': 'Signed in as {email} · {plan}',
|
||
'settings.amrLoggedInPill': 'Signed in',
|
||
'settings.amrNotLoggedIn': 'Not signed in',
|
||
'settings.amrCloud': 'Open Design AMR',
|
||
'settings.amrAuthorize': 'Authorize',
|
||
'settings.amrBenefitOfficial': 'Officially maintained',
|
||
'settings.amrBenefitLowerPrice': 'Lower price',
|
||
'settings.amrBenefitManyModels': 'Many models',
|
||
'settings.amrPromoBonus': 'Limited bonus: +100%',
|
||
'settings.amrSignInToContinue': 'Sign in to continue',
|
||
'settings.amrSignIn': 'Sign in',
|
||
'settings.amrSignedIn': 'Signed in',
|
||
'settings.amrNotSignedIn': 'Not signed in',
|
||
'settings.amrSigningIn': 'Signing in…',
|
||
'settings.amrCancelSignIn': 'Cancel sign-in',
|
||
'settings.amrAccountStatus': 'AMR account status',
|
||
'settings.amrLoginErrorCompact': 'AMR sign-in failed.',
|
||
'settings.apiSection': 'Anthropic API',
|
||
'settings.quickFillProvider': 'Anbieter schnell ausfüllen',
|
||
'settings.customProvider': 'Benutzerdefinierter Anbieter',
|
||
'settings.apiKey': 'API-Key',
|
||
'settings.showKey': 'Key anzeigen',
|
||
'settings.hideKey': 'Key ausblenden',
|
||
'settings.show': 'Anzeigen',
|
||
'settings.hide': 'Ausblenden',
|
||
'settings.model': 'Modell',
|
||
'settings.suggestedModelsHint':
|
||
'Dies sind vorgeschlagene Modelle für dieses Protokoll. Ihr Anbieter kann andere Modelle unterstützen.',
|
||
'settings.baseUrl': 'Base URL',
|
||
'settings.baseUrlInvalid': 'Geben Sie eine gültige öffentliche http://- oder https://-URL ein. Localhost ist erlaubt; private Netzwerk-IPs werden blockiert.',
|
||
'settings.baseUrlCustomize': 'Anpassen',
|
||
'settings.baseUrlDefaultHint': 'Standard-Endpunkt. Normalerweise muss dies nicht geändert werden.',
|
||
'settings.azureBaseUrlPlaceholder': 'https://my-resource.openai.azure.com',
|
||
'settings.azureBaseUrlHint': 'Find this in Azure portal → your resource → Endpoint.',
|
||
'settings.azureDeploymentModel': 'Deployment-Name',
|
||
'settings.azureDeploymentModelHint':
|
||
'Fuer Azure OpenAI wird dieses Feld als Deployment-Name in /openai/deployments/<model> verwendet. Geben Sie den in Azure angelegten Deployment-Namen ein.',
|
||
'settings.apiVersion': 'API-Version',
|
||
'settings.byokImageModel': 'Bilderzeugungsmodell',
|
||
'settings.maxTokens': 'Max. Tokens (optional)',
|
||
'settings.maxTokensHint':
|
||
'Obergrenze für die Antwortlänge. Jedes Modell hat einen abgestimmten Standardwert (im Platzhalter sichtbar); leer lassen, um ihn zu verwenden, oder eine Zahl eingeben, um ihn zu überschreiben.',
|
||
'settings.apiHint': 'Anfragen werden über den lokalen Daemon-Proxy an die festgelegte Base URL gesendet. Der Schlüssel wird nur in diesem Browser gespeichert und mit Provider-Anfragen gesendet.',
|
||
'settings.skipForNow': 'Vorerst überspringen',
|
||
'settings.getStarted': 'Loslegen',
|
||
'settings.envConfigure': 'Ausführungsmodus',
|
||
'settings.localCli': 'Lokale CLI',
|
||
'settings.anthropicApi': 'Anthropic API',
|
||
'settings.noAgentSelected': 'kein Agent ausgewählt',
|
||
'settings.language': 'Sprache',
|
||
'settings.languageHint': 'Wechseln Sie die Sprache der Oberfläche. Wird in diesem Browser gespeichert.',
|
||
'settings.appearance': 'Erscheinungsbild',
|
||
'settings.appearanceHint': 'Hell, dunkel oder Systemeinstellung übernehmen.',
|
||
'settings.themeSystem': 'System',
|
||
'settings.themeLight': 'Hell',
|
||
'settings.themeDark': 'Dunkel',
|
||
'settings.agentModelHead': 'Modell für:',
|
||
'settings.modelPicker': 'Modell',
|
||
'settings.modelSourceLive': 'Live aus der CLI',
|
||
'settings.modelSourceFallback': 'Integrierte Liste',
|
||
'settings.reasoningPicker': 'Reasoning-Aufwand',
|
||
'settings.modelPickerHint':
|
||
'Wird aus der CLI geladen, wenn sie einen `models`-Befehl anbietet. „Standard“ überlässt die Auswahl der CLI-Konfiguration; mit „Benutzerdefiniert…“ können Sie jede von der CLI akzeptierte Modell-ID eingeben.',
|
||
'settings.modelPickerLiveHint':
|
||
'Modelle wurden aus der installierten CLI aktualisiert. Standard verwendet weiterhin die CLI-Konfiguration.',
|
||
'settings.modelPickerFallbackHint':
|
||
'Integrierte Standardwerte werden angezeigt. Klicken Sie auf Neu scannen, um Live-Modelle aus der CLI abzurufen.',
|
||
'settings.cliEnvTitle': 'CLI config locations',
|
||
'settings.cliEnvHint':
|
||
'Set non-secret config directories for packaged app runs and agent detection.',
|
||
'settings.cliEnvClaudeConfigDir': 'Claude Code config directory',
|
||
'settings.cliEnvClaudeBaseUrl': 'Claude proxy base URL',
|
||
'settings.cliEnvClaudeApiKey': 'Claude proxy API key',
|
||
'settings.cliEnvCodexHome': 'Codex home',
|
||
'settings.cliEnvCodexBin': 'Codex executable path',
|
||
'settings.cliEnvCodexBaseUrl': 'Codex/OpenAI proxy base URL',
|
||
'settings.cliEnvCodexApiKey': 'Codex/OpenAI proxy API key',
|
||
'settings.modelCustom': 'Benutzerdefiniert (unten eingeben)…',
|
||
'settings.modelCustomLabel': 'Benutzerdefinierte Modell-ID',
|
||
'settings.modelCustomPlaceholder': 'z. B. anthropic/claude-sonnet-4-6',
|
||
'settings.mediaProviders': 'Medienanbieter',
|
||
'settings.mediaProvidersHint':
|
||
'API-Keys für Bild-, Video- und Audiogenerierung. Lokal gespeichert und mit dem lokalen Daemon synchronisiert.',
|
||
'settings.mcpServerTitle': 'MCP-Server',
|
||
'settings.mcpServerHint': 'Stelle Open Design als MCP-Server für deinen Coding-Agent bereit.',
|
||
'settings.externalMcpTitle': 'Externes MCP',
|
||
'settings.externalMcpHint': 'MCP-Tools aus externen Diensten hinzufügen (Higgsfield, GitHub, …).',
|
||
'settings.mediaProviderApiKey': 'API-Key',
|
||
'settings.mediaProviderBaseUrl': 'Base URL',
|
||
'settings.mediaProviderConfigured': 'Konfiguriert',
|
||
'settings.mediaProviderUnset': 'Nicht gesetzt',
|
||
'settings.mediaProviderClear': 'Leeren',
|
||
'settings.mediaProviderClearConfirm': 'Gespeicherte {name}-Einstellungen löschen? Du musst sie erneut eingeben, um {name} zu nutzen.',
|
||
'settings.mediaProviderPlaceholder': 'API-Key einfügen',
|
||
'settings.mediaProviderBaseUrlPlaceholder': 'Standard-Base-URL überschreiben',
|
||
'settings.mediaProviderReload': 'Vom lokalen Daemon neu laden',
|
||
'settings.mediaProviderReloadError': 'Die Einstellungen der Medienanbieter konnten nicht vom lokalen Daemon neu geladen werden.',
|
||
'settings.mediaProviderReloadSuccess': 'Die Einstellungen der Medienanbieter wurden vom lokalen Daemon neu geladen.',
|
||
'settings.mediaProviderLoadError': 'Die Einstellungen der Medienanbieter konnten nicht vom lokalen Daemon geladen werden. Vorerst werden die im Browser gespeicherten Einstellungen verwendet.',
|
||
'settings.mediaProviderComingSoonHint': 'Wir verfolgen diese für die Roadmap; der Daemon liefert noch keinen Client, daher gibt es nichts zu konfigurieren.',
|
||
'settings.privacy': 'Privacy',
|
||
'settings.privacyHint': 'What data is shared with the Open Design team',
|
||
'settings.privacyConsentKicker': 'Help us improve Open Design',
|
||
'settings.privacyConsentLead': 'Open Design can share usage data with our team to help us improve. This includes:',
|
||
'settings.privacyConsentFooter': 'You can change either of these any time in Settings → Privacy. We never upload the contents of your generated artifact files.',
|
||
'settings.privacyConsentShare': 'Share usage data',
|
||
'settings.privacyConsentDecline': "Don't share",
|
||
'settings.privacyConsentAccept': 'I get it',
|
||
'settings.privacyConsentBannerFooter':
|
||
'Data sharing is on by default. You can turn it off any time in Settings → Privacy. We never upload the contents of your generated artifact files.',
|
||
'settings.privacyConsentPolicyLink': 'Read the privacy policy',
|
||
'settings.privacyMetrics': 'Anonymous metrics',
|
||
'settings.privacyMetricsHint': 'Run counts, token usage, error rate, duration. No prompts, no project data.',
|
||
'settings.privacyContent': 'Conversation content',
|
||
'settings.privacyContentHint': "Your prompts and the assistant's responses (truncated 8 KB / 16 KB). API keys, tokens, JWTs, emails, IPs, and credit-card numbers are stripped automatically before send.",
|
||
'settings.privacyArtifacts': 'Project artifacts manifest',
|
||
'settings.privacyArtifactsHint': 'Filenames, types, sizes of generated files. File contents are never sent.',
|
||
'settings.privacyInstallationId': 'Anonymous ID',
|
||
'settings.privacyOptedOut': 'opted out',
|
||
'settings.privacyDataDeletion': 'Delete my data',
|
||
'settings.privacyDataDeletionHint': 'Rotates your anonymous ID and stops sending. Existing traces age out under our retention policy.',
|
||
'settings.about': 'Info',
|
||
'settings.aboutHint': 'Version und Laufzeitdetails',
|
||
'settings.appVersion': 'Version',
|
||
'settings.appChannel': 'Kanal',
|
||
'settings.appRuntime': 'Laufzeit',
|
||
'settings.appPlatform': 'Plattform',
|
||
'settings.appArchitecture': 'Architektur',
|
||
'settings.runtimePackaged': 'Paketierte App',
|
||
'settings.runtimeDevelopment': 'Entwicklung',
|
||
'settings.versionUnavailable': 'Versionsdetails sind nicht verfügbar, solange der Daemon offline ist.',
|
||
'settings.installLatest': 'Neueste Version installieren',
|
||
'settings.alreadyLatest': 'Sie verwenden die neueste Version',
|
||
|
||
'entry.tabDesigns': 'Designs',
|
||
'entry.tabTemplates': 'Vorlagen',
|
||
'entry.tabDesignSystems': 'Designsysteme',
|
||
'entry.openSettingsTitle': 'Einstellungen',
|
||
'entry.openSettingsAria': 'Einstellungen öffnen',
|
||
'entry.resizeAria': 'Seitenleiste skalieren',
|
||
'entry.loadingWorkspace': 'Workspace wird geladen…',
|
||
'entry.useEverywhereTitle': 'Überall verwenden',
|
||
'entry.useEverywhereAria': 'Anleitung „Überall verwenden“ öffnen (CLI, MCP, HTTP, Skills)',
|
||
'entry.navNewProject': 'Neues Projekt',
|
||
'entry.navHome': 'Start',
|
||
'entry.navProjects': 'Projekte',
|
||
'entry.navDesignSystems': 'Design-Systeme',
|
||
'entry.helpAria': 'Hilfe',
|
||
'entry.helpMenuAria': 'Hilfemenü',
|
||
'entry.helpGetHelp': 'Hilfe auf GitHub',
|
||
'entry.helpSubmitFeature': 'Feature vorschlagen',
|
||
'entry.helpWhatsNew': 'Neuigkeiten',
|
||
'entry.helpDownloadDesktop': 'Desktop-App herunterladen',
|
||
'entry.githubStarLabel': 'Star',
|
||
'entry.githubStarTitle': 'Klicken, um uns auf GitHub einen Stern zu geben',
|
||
'entry.githubStarAria': 'Open Design auf GitHub einen Stern geben',
|
||
'entry.tabImageTemplates': 'Bildvorlagen',
|
||
'entry.tabVideoTemplates': 'Videovorlagen',
|
||
'promptTemplates.searchPlaceholder': 'Templates suchen…',
|
||
'promptTemplates.countLabel': '{n} Ergebnisse',
|
||
'promptTemplates.emptyImage': 'Noch keine Bild-Prompt-Templates installiert.',
|
||
'promptTemplates.emptyVideo': 'Noch keine Video-Prompt-Templates installiert.',
|
||
'promptTemplates.emptyNoMatch': 'Keine Templates passen zu Ihrer Suche.',
|
||
'promptTemplates.attributionFooter': 'Aus öffentlichen Prompt-Bibliotheken adaptiert. Jede Karte verlinkt zum ursprünglichen Autor.',
|
||
'promptTemplates.openPreviewTitle': 'Prompt und Vorschau öffnen',
|
||
'promptTemplates.sourcePrefix': 'Quelle:',
|
||
'promptTemplates.fetchError': 'Dieser Template-Inhalt konnte nicht geladen werden.',
|
||
'promptTemplates.promptLabel': 'Prompt-Text',
|
||
'promptTemplates.copyPrompt': 'Prompt kopieren',
|
||
'promptTemplates.copyDone': 'Kopiert!',
|
||
'promptTemplates.modelHint': 'Vorgeschlagenes Modell: {model}',
|
||
'promptTemplates.openSource': 'Original anzeigen',
|
||
'promptTemplates.openFullscreen': 'Vollbildvorschau öffnen',
|
||
'promptTemplates.closeFullscreen': 'Vollbildvorschau schließen',
|
||
'promptTemplates.allSources': 'Alle Quellen',
|
||
'promptTemplates.sourceFilterAria': 'Nach Quelle filtern',
|
||
'promptTemplates.retry': 'Erneut versuchen',
|
||
|
||
'newproj.tabPrototype': 'Prototyp',
|
||
'newproj.tabDeck': 'Slide Deck',
|
||
'newproj.tabTemplate': 'Aus Template',
|
||
'newproj.tabMedia': 'Medien',
|
||
'newproj.tabOther': 'Andere',
|
||
'newproj.titlePrototype': 'Neuer Prototyp',
|
||
'newproj.titleDeck': 'Neues Slide Deck',
|
||
'newproj.titleTemplate': 'Mit Template starten',
|
||
'newproj.titleImage': 'Neues Bild',
|
||
'newproj.titleVideo': 'Neues Video',
|
||
'newproj.titleAudio': 'Neues Audio',
|
||
'newproj.titleMedia': 'Neue Medien',
|
||
'newproj.titleOther': 'Neues Projekt',
|
||
'newproj.namePlaceholder': 'Projektname',
|
||
'newproj.fidelityLabel': 'Detailgrad',
|
||
'newproj.fidelityWireframe': 'Wireframe',
|
||
'newproj.fidelityHigh': 'High Fidelity',
|
||
'newproj.toggleSpeakerNotes': 'Sprechernotizen verwenden',
|
||
'newproj.toggleSpeakerNotesHint': 'Weniger Text auf Slides — Gesprächspunkte in Notizen halten.',
|
||
'newproj.toggleAnimations': 'Animationen einbeziehen',
|
||
'newproj.toggleAnimationsHint':
|
||
'Bewegung (Einstiege, Hover, Übergänge) zusätzlich zum Template hinzufügen.',
|
||
'newproj.templateLabel': 'Template',
|
||
'newproj.noTemplatesTitle': 'Noch keine Templates',
|
||
'newproj.noTemplatesBody':
|
||
'Öffnen Sie ein Projekt und nutzen Sie dann das Teilen-Menü im File Viewer, um es in ein Template umzuwandeln. Templates erscheinen hier.',
|
||
'newproj.savedTemplate': 'Gespeichertes Template',
|
||
'newproj.fileSingular': 'Datei',
|
||
'newproj.filePlural': 'Dateien',
|
||
'newproj.create': 'Erstellen',
|
||
'newproj.createFromTemplate': 'Aus Template erstellen',
|
||
'newproj.createDisabledTitle':
|
||
'Speichern Sie zuerst ein Projekt als Template (Teilen-Menü in einem beliebigen Projekt).',
|
||
'newproj.importClaudeZip': 'Claude Design ZIP importieren',
|
||
'newproj.importClaudeZipTitle': 'Einen Claude Design .zip-Export importieren',
|
||
'newproj.importingClaudeZip': 'Import läuft…',
|
||
'newproj.privacyFooter': 'Standardmäßig können nur Sie Ihr Projekt sehen.',
|
||
'newproj.designSystem': 'Designsystem',
|
||
'newproj.dsNoneFreeform': 'Keines — frei',
|
||
'newproj.dsNoneSubtitleEmpty': 'Keine System-Tokens, eigene Palette wählen',
|
||
'newproj.dsNoneSubtitleSelected': 'System-Tokens überspringen. Der Agent wählt eine eigene Palette.',
|
||
'newproj.dsCategoryFallback': 'Designsystem',
|
||
'newproj.dsSearch': 'Designsysteme suchen…',
|
||
'newproj.dsModeAria': 'Auswahlmodus',
|
||
'newproj.dsModeSingle': 'Einzeln',
|
||
'newproj.dsModeMulti': 'Mehrfach',
|
||
'newproj.dsNoneTitle': 'Keines — frei',
|
||
'newproj.dsNoneSub': 'System-Tokens überspringen. Der Agent wählt eine eigene Palette.',
|
||
'newproj.dsEmpty': 'Keine Designsysteme passen zu „{query}“.',
|
||
'newproj.dsFootSingular': 'dient nur als Inspiration.',
|
||
'newproj.dsFootPlural': 'dienen nur als Inspiration.',
|
||
'newproj.dsFootClear': 'Leeren',
|
||
'newproj.dsBadgeDefault': 'STANDARD',
|
||
'newproj.dsPrimaryFallback': 'Primär',
|
||
'newproj.surfaceImage': 'Bild',
|
||
'newproj.surfaceVideo': 'Video',
|
||
'newproj.surfaceAudio': 'Audio',
|
||
'newproj.modelLabel': 'Modell',
|
||
'newproj.modelSearch': 'Modelle suchen…',
|
||
'newproj.modelEmpty': 'Keine passenden Modelle.',
|
||
'newproj.modelRecommended': 'Empfohlen',
|
||
'newproj.modelMissingTitle': 'Modell auswählen',
|
||
'newproj.modelMissingSub': 'Wähle ein Modell für diese Oberfläche.',
|
||
'newproj.aspectLabel': 'Format',
|
||
'newproj.videoLengthLabel': 'Länge',
|
||
'newproj.videoLengthSeconds': '{n}s',
|
||
'newproj.audioKindLabel': 'Audiotyp',
|
||
'newproj.audioKindMusic': 'Musik',
|
||
'newproj.audioKindSpeech': 'Sprache / TTS',
|
||
'newproj.audioKindSfx': 'SFX',
|
||
'newproj.audioDurationLabel': 'Dauer',
|
||
'newproj.audioDurationSeconds': '{n}s',
|
||
'newproj.voiceLabel': 'Stimme',
|
||
'newproj.voicePlaceholder': 'Provider-Voice-ID, optional',
|
||
'newproj.promptTemplateLabel': 'Referenzvorlage',
|
||
'newproj.promptTemplateNoneTitle': 'Keine — eigene schreiben',
|
||
'newproj.promptTemplateNoneSub': 'Galerie überspringen und eigenes Briefing verfassen',
|
||
'newproj.promptTemplateRefSub': 'Referenzvorlage',
|
||
'newproj.promptTemplateSearch': 'Vorlagen suchen…',
|
||
'newproj.promptTemplateEmpty': 'Für dieses Format sind noch keine Vorlagen installiert.',
|
||
'newproj.promptTemplateBodyLabel': 'Prompt (kann angepasst werden)',
|
||
'newproj.promptTemplateOptimizeHint':
|
||
'Beliebig editierbar — deine Änderungen fließen in das Agenten-Briefing ein.',
|
||
'newproj.promptTemplateBodyEmpty':
|
||
'Leerer Body — der Agent erhält keine Vorlagenreferenz.',
|
||
'newproj.deleteTemplateTitle': 'Template löschen',
|
||
'newproj.deleteTemplateConfirm': '„{name}" löschen? Dies kann nicht rückgängig gemacht werden.',
|
||
'newproj.deleteTemplateConfirmCta': 'Template löschen',
|
||
'newproj.deleteTemplateError':
|
||
'Dieses Template konnte nicht gelöscht werden. Bitte erneut versuchen.',
|
||
|
||
'designs.subRecent': 'Aktuell',
|
||
'designs.subYours': 'Ihre Designs',
|
||
'designs.filterAria': 'Projekte filtern',
|
||
'designs.searchPlaceholder': 'Suchen…',
|
||
'designs.emptyNoProjects': 'Noch keine Projekte.',
|
||
'designs.emptyNoMatch': 'Keine Projekte passen zu Ihrer Suche.',
|
||
'designs.deleteTitle': 'Projekt löschen',
|
||
'designs.deleteConfirm': '„{name}“ löschen?',
|
||
'designs.cardFreeform': 'frei',
|
||
'designs.status.notStarted': 'Nicht gestartet',
|
||
'designs.status.queued': 'In Warteschlange',
|
||
'designs.status.running': 'Läuft',
|
||
'designs.status.awaitingInput': 'Eingabe nötig',
|
||
'designs.status.succeeded': 'Abgeschlossen',
|
||
'designs.status.published': 'Veröffentlicht',
|
||
'designs.status.failed': 'Fehlgeschlagen',
|
||
'designs.status.canceled': 'Abgebrochen',
|
||
'designs.viewToggleAria': 'Ansichtsmodus',
|
||
'designs.viewGrid': 'Rasteransicht',
|
||
'designs.viewKanban': 'Board-Ansicht',
|
||
'designs.kanbanEmptyColumn': 'Keine Designs',
|
||
'designs.deleteAria': 'Projekt {name} löschen',
|
||
'designs.menuMore': 'More actions',
|
||
'designs.menuRename': 'Rename',
|
||
'designs.menuDelete': 'Delete',
|
||
'designs.renamePrompt': 'New name for "{name}"',
|
||
'designs.selectMode': 'Select',
|
||
'designs.cancelSelect': 'Cancel',
|
||
'designs.deleteSelected': 'Delete selected',
|
||
'designs.selectedCount': '{n} selected',
|
||
'designs.deleteSelectedConfirm': 'Delete {n} project(s)?',
|
||
'designs.deleteSelectedSuccess': '{n} project(s) deleted successfully.',
|
||
'designs.deleteSelectedPartial': 'Deleted {deleted} project(s); {failed} failed.',
|
||
'designs.tagPrototype': 'Prototype',
|
||
'designs.tagLiveArtifact': 'Live Artifact',
|
||
'designs.tagSlide': 'Slide',
|
||
'designs.tagMedia': 'Media',
|
||
'designs.renameTitle': 'Rename project',
|
||
'designs.renameSave': 'OK',
|
||
'designs.renameCancel': 'Cancel',
|
||
|
||
'examples.typeLabel': 'Typ',
|
||
'examples.surfaceLabel': 'Oberfläche',
|
||
'examples.surfaceWeb': 'Web',
|
||
'examples.surfaceImage': 'Bild',
|
||
'examples.surfaceVideo': 'Video',
|
||
'examples.surfaceAudio': 'Audio',
|
||
'examples.scenarioLabel': 'Szenario',
|
||
'examples.modeAll': 'Alle',
|
||
'examples.modePrototypeDesktop': 'Prototypen · Desktop',
|
||
'examples.modePrototypeMobile': 'Prototypen · Mobil',
|
||
'examples.modeDeck': 'Folien',
|
||
'examples.modeDocument': 'Dokumente & Templates',
|
||
'examples.modeOrbit': 'Orbit',
|
||
'examples.modeLive': 'Live',
|
||
'examples.scenarioGeneral': 'Allgemein',
|
||
'examples.scenarioEngineering': 'Engineering',
|
||
'examples.scenarioProduct': 'Produkt',
|
||
'examples.scenarioDesign': 'Design',
|
||
'examples.scenarioMarketing': 'Marketing',
|
||
'examples.scenarioSales': 'Vertrieb',
|
||
'examples.scenarioFinance': 'Finanzen',
|
||
'examples.scenarioHr': 'Personal',
|
||
'examples.scenarioOperations': 'Betrieb',
|
||
'examples.scenarioSupport': 'Support',
|
||
'examples.scenarioLegal': 'Recht',
|
||
'examples.scenarioEducation': 'Bildung',
|
||
'examples.scenarioPersonal': 'Persönlich',
|
||
'examples.emptyNoSkills': 'Keine Skills verfügbar. Läuft der Daemon?',
|
||
'examples.searchPlaceholder': 'Beispiele suchen…',
|
||
'examples.searchAria': 'Beispiele nach Namen suchen',
|
||
'examples.emptyNoMatch': 'Keine Beispiele passen zu diesen Filtern.',
|
||
'examples.openPreview': '⤢ Vorschau öffnen',
|
||
'examples.loadingPreview': 'Vorschau wird geladen…',
|
||
'examples.hoverPreview': 'Für Vorschau hovern',
|
||
'examples.usePrompt': 'Diesen Prompt verwenden',
|
||
'examples.previewModalTitle': 'Vollständige Vorschau öffnen (Modal)',
|
||
'examples.shareTitle': 'Dieses Beispiel teilen',
|
||
'examples.shareLoadFirst': 'Zuerst hovern, um die Vorschau zu laden',
|
||
'examples.unavailablePlaceholder': 'Keine mitgelieferte {kind}-Vorschau — öffnen für mehr Infos',
|
||
'examples.shareUnavailable': 'Keine mitgelieferte {kind}-Vorschau zum Teilen',
|
||
'examples.shareMenu': 'Teilen ▾',
|
||
'examples.exportPdfAllSlides': 'Als PDF exportieren (alle Slides)',
|
||
'examples.exportPptxLocked': 'Als PPTX exportieren… (zuerst Template öffnen)',
|
||
'examples.tagSlideDeck': 'Foliendeck',
|
||
'examples.tagTemplate': 'Template',
|
||
'examples.tagDesignSystem': 'Designsystem',
|
||
'examples.tagMobilePrototype': 'Mobiler Prototyp',
|
||
'examples.tagDesktopPrototype': 'Desktop-Prototyp',
|
||
'examples.tagImage': 'Bild',
|
||
'examples.tagVideo': 'Video',
|
||
'examples.tagAudio': 'Audio',
|
||
'examples.previewLabel': 'Vorschau',
|
||
|
||
'ds.surfaceLabel': 'Oberfläche',
|
||
'ds.surfaceWeb': 'Web',
|
||
'ds.surfaceImage': 'Bild',
|
||
'ds.surfaceVideo': 'Video',
|
||
'ds.surfaceAudio': 'Audio',
|
||
'ds.searchPlaceholder': 'Designsysteme suchen…',
|
||
'ds.emptyNoMatch': 'Keine Designsysteme passen zu Ihrer Suche.',
|
||
'ds.badgeDefault': 'STANDARD',
|
||
'ds.preview': 'Vorschau',
|
||
'ds.previewTitle': 'Designsystem-Vorschau',
|
||
'ds.categoryAll': 'Alle',
|
||
'ds.categoryUncategorized': 'Nicht kategorisiert',
|
||
'ds.showcase': 'Showcase',
|
||
'ds.tokens': 'Tokens',
|
||
'ds.specToggle': 'DESIGN.md',
|
||
'ds.specLoading': 'DESIGN.md wird geladen…',
|
||
|
||
'avatar.title': 'Konto & Einstellungen',
|
||
'avatar.localCli': 'Lokale CLI',
|
||
'avatar.anthropicApi': 'Anthropic API',
|
||
'avatar.useLocal': 'Lokale CLI verwenden',
|
||
'avatar.useApi': 'API · BYOK verwenden',
|
||
'avatar.codeAgent': 'Code-Agent',
|
||
'avatar.rescan': 'PATH neu scannen',
|
||
'avatar.settings': 'Einstellungen',
|
||
'avatar.backToProjects': 'Zurück zu Projekten',
|
||
'avatar.metaActive': 'aktiv',
|
||
'avatar.metaOffline': 'offline',
|
||
'avatar.metaSelected': 'ausgewählt',
|
||
'avatar.noAgentSelected': 'kein Agent ausgewählt',
|
||
'avatar.modelSection': 'Modell',
|
||
'avatar.modelLabel': 'Modell',
|
||
'avatar.reasoningLabel': 'Reasoning',
|
||
'avatar.customSuffix': '(benutzerdefiniert)',
|
||
|
||
'inlineSwitcher.chipTitle': 'CLI / Modell wechseln',
|
||
'inlineSwitcher.chipCli': 'Lokales CLI',
|
||
'inlineSwitcher.chipByok': 'BYOK',
|
||
'inlineSwitcher.modelDefault': 'Standard',
|
||
'inlineSwitcher.noAgent': 'kein Agent',
|
||
'inlineSwitcher.modeLabel': 'Modus',
|
||
'inlineSwitcher.agentLabel': 'Agent',
|
||
'inlineSwitcher.providerLabel': 'Anbieter',
|
||
'inlineSwitcher.modelLabel': 'Modell',
|
||
'inlineSwitcher.useCli': 'Lokales CLI verwenden',
|
||
'inlineSwitcher.useByok': 'Eigenen API-Schlüssel verwenden',
|
||
'inlineSwitcher.daemonOffline': 'Daemon offline — Einstellungen öffnen',
|
||
'inlineSwitcher.noAgentsDetected': 'Kein CLI im PATH gefunden',
|
||
'inlineSwitcher.openSettingsForModel': 'Anbieter in den Einstellungen konfigurieren',
|
||
'inlineSwitcher.missingApiKey': 'API-Schlüssel fehlt — in den Einstellungen ergänzen.',
|
||
'inlineSwitcher.openFullSettings': 'Ausführungseinstellungen öffnen',
|
||
'inlineSwitcher.customSuffix': '(benutzerdefiniert)',
|
||
|
||
'project.backToProjects': 'Zurück zu Projekten',
|
||
'project.metaFreeform': 'frei',
|
||
'project.resizeChatPanel': 'Größe des Chat-Bereichs ändern',
|
||
'project.instructionsActive': 'Aktiv – in jeder Nachricht enthalten',
|
||
'chat.tabChat': 'Chat',
|
||
'chat.tabComments': 'Kommentare',
|
||
'chat.commentsSoon': 'Kommentare — demnächst',
|
||
'chat.comments.attached': 'Attached to chat',
|
||
'chat.comments.emptyAttached': 'No comments attached.',
|
||
'chat.comments.saved': 'Saved comments',
|
||
'chat.comments.emptySaved': 'No saved comments.',
|
||
'chat.comments.add': 'Add',
|
||
'chat.comments.addAll': 'Add all',
|
||
'chat.comments.remove': 'Remove',
|
||
'chat.comments.placeholder': 'Comment on this element…',
|
||
'chat.comments.addSend': 'Add & send',
|
||
'chat.comments.updateSend': 'Update & send',
|
||
'chat.comments.removeAttachment': 'Remove comment attachment',
|
||
'chat.comments.removeAttachmentAria': 'Remove comment attachment for {name}',
|
||
'chat.comments.comment': 'Kommentar',
|
||
'chat.comments.sendToChat': 'An Chat senden',
|
||
'chat.comments.sending': 'Wird gesendet…',
|
||
'chat.comments.edit': 'Bearbeiten',
|
||
'chat.comments.select': 'Auswählen',
|
||
'chat.comments.deselect': 'Abwählen',
|
||
'chat.comments.nSelected': '{n} ausgewählt',
|
||
'chat.comments.pin': 'Pin',
|
||
'chat.comments.addNote': 'Notiz hinzufügen',
|
||
'chat.comments.savedToast': 'Kommentar gespeichert',
|
||
'chat.comments.pinSavedToast': 'Pin gespeichert',
|
||
'chat.comments.pinAtCoords': 'bei {x}, {y}',
|
||
'chat.comments.capturedItems': '{n} erfasste Elemente',
|
||
'chat.comments.clear': 'Löschen',
|
||
'chat.comments.targetImage': 'Image',
|
||
'chat.comments.targetControl': 'Control',
|
||
'chat.comments.targetLink': 'Link',
|
||
'chat.comments.targetText': 'Text',
|
||
'chat.comments.targetSection': 'Section',
|
||
'chat.comments.targetPage': 'Page',
|
||
'chat.comments.targetArea': 'Area',
|
||
'chat.annotationNotePlaceholder': 'Add a note for this annotation',
|
||
'chat.annotationQueue': 'Queue',
|
||
'chat.annotationQueueing': 'Queueing...',
|
||
'chat.annotationSending': 'Sending...',
|
||
'chat.annotationSendDisabledReason': 'A task is currently running',
|
||
'chat.annotationPreviewMissing': 'Could not capture the preview. Please try again.',
|
||
'chat.annotationPreviewMissingInk': 'Could not capture the preview. Try again to avoid sending only ink.',
|
||
'chat.annotationTimeout': 'Annotation send timed out. Please try again.',
|
||
'chat.annotationFailed': 'Annotation send failed. Please try again.',
|
||
'chat.annotationProjectCreateFailed': 'Could not create a project, so the annotation was not sent.',
|
||
'chat.annotationUploadFailed': 'Attachment upload failed. Please try again.',
|
||
'chat.inspect.noEditableTargets': 'This page has no editable elements yet.',
|
||
'chat.inspect.noCommentTargets': 'This page has no commentable elements yet.',
|
||
'chat.inspect.editHint': 'Click an element in the canvas to edit its styles.',
|
||
'chat.inspect.commentHint': 'Click an element in the canvas to add a comment.',
|
||
'chat.conversationsTitle': 'Konversationen',
|
||
'chat.conversationsAria': 'Konversationsverlauf',
|
||
'chat.newConversation': 'Neue Konversation',
|
||
'chat.newConversationsTitle': 'Neue Konversation',
|
||
'chat.conversationsHeading': 'Konversationen',
|
||
'chat.new': 'Neu',
|
||
'chat.emptyConversations': 'Noch keine Konversationen.',
|
||
'chat.deleteConversation': 'Konversation löschen',
|
||
'chat.renameConversationLabel': '„{title}“ umbenennen',
|
||
'chat.deleteConversationConfirm':
|
||
'„{title}“ löschen? Dadurch werden die Nachrichten entfernt.',
|
||
'chat.untitledConversation': 'Konversation ohne Titel',
|
||
'chat.startTitle': 'Konversation starten',
|
||
'chat.startHint': "Beschreiben Sie, was Sie generieren möchten, oder starten Sie mit einem dieser Beispiele:",
|
||
'chat.fillInputTitle': 'Klicken, um die Eingabe zu füllen',
|
||
'chat.jumpToLatest': 'Zur neuesten springen',
|
||
'chat.scrollToLatest': 'Zur neuesten scrollen',
|
||
'chat.you': 'Sie',
|
||
'chat.openFile': '{name} öffnen',
|
||
'chat.copyPrompt': 'Prompt kopieren',
|
||
'chat.copyDone': 'Kopiert!',
|
||
'chat.composerPlaceholder': "Beschreiben Sie, was Sie generieren möchten…",
|
||
'chat.composerHint': "⌘/Ctrl + Enter zum Senden · Ziel, Inhalt, Stil und Format angeben",
|
||
'chat.cliSettingsTitle': 'CLI- & Modelleinstellungen',
|
||
'chat.cliSettingsAria': 'CLI- und Modelleinstellungen öffnen',
|
||
'chat.attachTitle': 'Dateien anhängen (oder einfügen / ablegen)',
|
||
'chat.attachAria': 'Dateien anhängen',
|
||
'chat.importTitle': 'Quellen importieren (demnächst)',
|
||
'chat.importLabel': 'Importieren',
|
||
'chat.importComingSoon': 'Demnächst',
|
||
'chat.importSoon': 'Bald',
|
||
'chat.importFig': '.fig-Datei hochladen',
|
||
'chat.importGitHub': 'GitHub verbinden',
|
||
'chat.importWeb': 'Webelement erfassen',
|
||
'chat.importFolder': 'Code-Ordner verknüpfen',
|
||
'chat.importSkills': 'Skills und Designsysteme',
|
||
'chat.importProject': 'Reference another project',
|
||
'chat.linkedFolderRemoveAria': 'Verknüpften Ordner {path} entfernen',
|
||
'chat.linkedFolderNotFound': 'Ordner existiert nicht',
|
||
'chat.linkedFolderAlready': 'Dieser Ordner ist bereits verknüpft',
|
||
'chat.linkedFolderPickError': 'Ordnerauswahl konnte nicht geöffnet werden',
|
||
'chat.queuedHeader': 'Queued',
|
||
'chat.queuedToSend': 'to Send',
|
||
'chat.queuedEditQueuedTaskAria': 'Edit queued task',
|
||
'chat.queuedSave': 'Save',
|
||
'chat.queuedCancel': 'Cancel',
|
||
'chat.queuedEdit': 'Edit',
|
||
'chat.queuedMore': 'more queued',
|
||
'chat.queuedFollowUpFallback': 'Queued follow-up',
|
||
'chat.send': 'Senden',
|
||
'chat.stop': 'Stoppen',
|
||
'chat.removeAria': '{name} entfernen',
|
||
'chat.example1Title': 'Editorial Pitch Deck',
|
||
'chat.example1Tag': 'Magazin',
|
||
'chat.example1Prompt':
|
||
'Ein 10-Slide-Editorial-Pitch-Deck für ein Designstudio, das eine Seed-Runde aufnimmt — Swiss-Grid-Layout, übergroße Serif-Headlines mit markanten Initialen, Monospace-Abschnittsnummern, großzügiger Negativraum und Full-Bleed-Fotoslides im Wechsel mit textlastigen Slides. Cover, Vision, Markt, Produkt, Traction, Team, Ask, Kontakt.',
|
||
'chat.example2Title': 'SaaS-Analytics-Dashboard',
|
||
'chat.example2Tag': 'Daten',
|
||
'chat.example2Prompt':
|
||
'Ein dichtes Analytics-Dashboard für ein Developer-Tools-SaaS — KPI-Leiste mit Week-over-Week-Deltas, zwei gestapelte Liniendiagramme (MRR und aktive Workspaces), eine Welt-Heatmap der Nutzung, ein Kohorten-Retention-Raster, eine Top-Customers-Bestenliste und ein Echtzeit-Event-Feed. Dark Theme, tabellarische Monospace-Ziffern, Sparkline-Akzente.',
|
||
'chat.example3Title': 'Annual Report Long-Scroll',
|
||
'chat.example3Tag': 'Editorial',
|
||
'chat.example3Prompt':
|
||
'Ein interaktiver Annual Report für eine Klima-Non-Profit-Organisation — Long-Scroll-Editorial-Layout mit großen Pull-Quote-Blöcken, Datenvisualisierungen (gestapelte Balken, animierte Counter, Choropleth-Karte der Projektstandorte), Fotobrechern, Spenderwand und finalem Call-to-Action. Moderne Serifenschrift für Body, Sans-Serif-Chartlabels, erdige Papierpalette.',
|
||
|
||
'preview.shareMenu': 'Teilen',
|
||
'preview.exportMenu': 'Export',
|
||
'preview.shareTemplateBadge': 'Template',
|
||
'preview.shareToX': 'X / Twitter',
|
||
'preview.shareToReddit': 'Reddit',
|
||
'preview.shareToFacebook': 'Facebook',
|
||
'preview.shareToLinkedIn': 'LinkedIn',
|
||
'preview.shareToInstagram': 'Instagram',
|
||
'preview.shareToXiaohongshu': '小红书',
|
||
'preview.copyTemplateLink': 'Copy template link',
|
||
'preview.copyShareText': 'Copy share text',
|
||
'preview.shareSocialGroup': 'Share to social',
|
||
'preview.shareCopyGroup': 'Copy',
|
||
'preview.shareExportGroup': 'Export files',
|
||
'preview.shareCopied': 'Copied',
|
||
'preview.shareCopyFailed': 'Copy failed',
|
||
'preview.shareTextDefault': 'Open Design template: {title}',
|
||
'preview.openInNewTab': 'In neuem Tab öffnen',
|
||
'preview.exit': '⤓ Beenden',
|
||
'preview.fullscreen': '⤢ Vollbild',
|
||
'preview.closeTitle': 'Schließen (Esc)',
|
||
'preview.loading': '{label} wird geladen…',
|
||
'preview.errorTitle': 'Beispiel konnte nicht geladen werden.',
|
||
'preview.errorBody': 'Das Beispiel-HTML konnte nicht abgerufen werden. Stelle sicher, dass Open Design läuft, und versuche es erneut.',
|
||
'preview.retry': 'Erneut versuchen',
|
||
'preview.unavailableTitle': 'Für {noun} ist keine Vorschau verfügbar.',
|
||
'preview.unavailableBody': 'Führe den Prompt im Chat aus, um {kind}-Output zu erzeugen.',
|
||
'preview.nounSkill': 'diesen Skill',
|
||
'preview.nounPlugin': 'dieses Plugin',
|
||
'preview.nounTemplate': 'diese Vorlage',
|
||
'preview.showSidebar': '{label} einblenden',
|
||
'preview.hideSidebar': '{label} ausblenden',
|
||
|
||
'misc.savedTemplate': 'Gespeichertes Template',
|
||
'misc.primary': 'Primär',
|
||
'misc.designSystem': 'Designsystem',
|
||
|
||
'workspace.designFiles': 'Design-Dateien',
|
||
'workspace.focusMode': 'Focus workspace',
|
||
'workspace.showChat': 'Show chat',
|
||
'workspace.closeTab': 'Tab schließen',
|
||
'workspace.deleteFileConfirm': '„{name}“ aus dem Projektordner löschen?',
|
||
'workspace.deleteSelectedFilesConfirm': '{n} ausgewählte Datei(en) aus dem Projektordner löschen?',
|
||
'workspace.deleteSelectedFilesPartial': '{n} Datei(en) konnten nicht gelöscht werden.',
|
||
'workspace.openFromDesignFiles': 'Datei öffnen aus',
|
||
'workspace.designFilesLink': 'Design-Dateien',
|
||
'workspace.loadingSketch': 'Sketch wird geladen…',
|
||
'designFiles.title': 'Design-Dateien',
|
||
'designFiles.upload': 'Dateien hochladen',
|
||
'designFiles.pasteText': 'Als Textdatei einfügen',
|
||
'designFiles.newSketch': 'Neuer Sketch',
|
||
'designFiles.empty': 'Kreationen erscheinen hier',
|
||
'designFiles.refresh': 'Aktualisieren',
|
||
'designFiles.delete': 'Löschen',
|
||
'designFiles.searchPlaceholder': 'Dateien suchen…',
|
||
'designFiles.up': 'Nach oben',
|
||
'designFiles.back': 'Zurück',
|
||
'designFiles.crumbs': 'Projekt',
|
||
'designFiles.rowMenu': 'Zeilenmenü',
|
||
'designFiles.openInTab': 'In Tab öffnen',
|
||
'designFiles.download': 'Herunterladen',
|
||
'designFiles.downloadSelected': '{n} als ZIP herunterladen',
|
||
'designFiles.deleteSelected': '{n} löschen',
|
||
'designFiles.clearSelection': 'Auswahl aufheben',
|
||
'designFiles.selectPage': 'Alle auf dieser Seite auswählen',
|
||
'designFiles.selectAll': 'Alle auswählen',
|
||
'designFiles.dropTitle': '⤓ Dateien hier ablegen',
|
||
'designFiles.dropDesc':
|
||
'Bilder, Docs, Referenzen oder Ordner — der Agent nutzt sie als Kontext.',
|
||
'designFiles.upload.title': 'Dateien hochladen',
|
||
'designFiles.paste.title': 'Text als Datei einfügen',
|
||
'designFiles.upload.label': 'Hochladen',
|
||
'designFiles.paste.label': 'Einfügen',
|
||
'designFiles.previewOpen': 'Öffnen',
|
||
'designFiles.previewClose': 'Vorschau schließen',
|
||
'designFiles.modified': 'Geändert {time} · {size}',
|
||
'designFiles.weeksAgo': 'vor {n} W.',
|
||
'designFiles.groupBy': 'Gruppieren nach',
|
||
'designFiles.groupByKind': 'Typ',
|
||
'designFiles.groupByModified': 'Geändert',
|
||
'designFiles.expandGroup': 'Erweitern',
|
||
'designFiles.collapseGroup': 'Einklappen',
|
||
'designFiles.sectionPages': 'Seiten',
|
||
'designFiles.sectionScripts': 'Skripte',
|
||
'designFiles.sectionImages': 'Bilder',
|
||
'designFiles.sectionSketches': 'Sketches',
|
||
'designFiles.sectionOther': 'Andere',
|
||
'designFiles.modifiedToday': 'Heute',
|
||
'designFiles.modifiedYesterday': 'Gestern',
|
||
'designFiles.modifiedPrevious7Days': 'Letzte 7 Tage',
|
||
'designFiles.modifiedPrevious30Days': 'Letzte 30 Tage',
|
||
'designFiles.modifiedOlder': 'Älter',
|
||
'designFiles.showMore': '+{n} weitere anzeigen',
|
||
'designFiles.kindHtml': 'HTML-Seite',
|
||
'designFiles.kindImage': 'Bild',
|
||
'designFiles.kindSketch': 'Sketch',
|
||
'designFiles.kindText': 'Text',
|
||
'designFiles.kindCode': 'Skript',
|
||
'designFiles.kindPdf': 'PDF',
|
||
'designFiles.kindDocument': 'Dokument',
|
||
'designFiles.kindPresentation': 'Präsentation',
|
||
'designFiles.kindSpreadsheet': 'Tabellenblatt',
|
||
'designFiles.kindBinary': 'Binärdatei',
|
||
'designFiles.kindFolder': 'Ordner',
|
||
'designFiles.folderCount': '{n} Dateien',
|
||
'designFiles.colName': 'Name',
|
||
'designFiles.colKind': 'Art',
|
||
'designFiles.colModified': 'Geändert',
|
||
'designFiles.perPage': 'Anzeigen',
|
||
'designFiles.all': 'Alle',
|
||
'designFiles.prev': 'Zurück',
|
||
'designFiles.next': 'Weiter',
|
||
'designFiles.jumpToPage': 'Gehe zu Seite',
|
||
'designFiles.pageInfo': '{start}–{end} von {total}',
|
||
'quickSwitcher.placeholder': 'Datei öffnen…',
|
||
'quickSwitcher.empty': 'Keine Dateien in diesem Projekt',
|
||
'quickSwitcher.noMatches': 'Keine Treffer',
|
||
'quickSwitcher.navigate': 'navigieren',
|
||
'quickSwitcher.open': 'öffnen',
|
||
'quickSwitcher.close': 'schließen',
|
||
'pasteDialog.title': 'Text einfügen',
|
||
'pasteDialog.hint': 'Wird im Projektordner gespeichert. Wählen Sie einen beliebigen Namen.',
|
||
'pasteDialog.fileNameLabel': 'Dateiname',
|
||
'pasteDialog.namePlaceholder': 'notes.txt',
|
||
'pasteDialog.contentLabel': 'Inhalt',
|
||
'pasteDialog.contentPlaceholder': 'Beliebigen Text einfügen…',
|
||
'pasteDialog.save': 'Speichern',
|
||
'pasteDialog.cancel': 'Abbrechen',
|
||
'sketch.save': 'Sketch speichern',
|
||
'sketch.cancel': 'Abbrechen',
|
||
'sketch.saving': 'Speichern…',
|
||
'sketch.saved': 'Gespeichert',
|
||
'sketch.tooltipDirty': 'Ungespeicherte Änderungen',
|
||
'sketch.tooltipClean': 'Gespeichert',
|
||
'fileViewer.empty': 'Wählen Sie eine Datei zur Ansicht aus.',
|
||
'fileViewer.loading': 'Wird geladen…',
|
||
'fileViewer.exportPptx': 'Als PPTX exportieren',
|
||
'fileViewer.openInNewTab': 'In neuem Tab öffnen',
|
||
'fileViewer.copyPath': 'Pfad kopieren',
|
||
'fileViewer.copied': 'Kopiert!',
|
||
'fileViewer.share': 'Teilen',
|
||
'fileViewer.binaryMeta': 'Binärdatei · {size}',
|
||
'fileViewer.binaryNote':
|
||
'Binärdatei ({size} Bytes). Laden Sie sie herunter oder öffnen Sie sie von der Festplatte, um sie zu prüfen.',
|
||
'fileViewer.pdfMeta': 'PDF · {size}',
|
||
'fileViewer.documentMeta': 'Dokument',
|
||
'fileViewer.presentationMeta': 'Präsentation',
|
||
'fileViewer.spreadsheetMeta': 'Tabellenblatt',
|
||
'fileViewer.previewUnavailable': 'Vorschau nicht verfügbar. Laden Sie die Datei herunter oder öffnen Sie sie zur Prüfung.',
|
||
'fileViewer.download': 'Herunterladen',
|
||
'fileViewer.open': 'Öffnen',
|
||
'fileViewer.imageMeta': 'Bild · {size}',
|
||
'fileViewer.reactMeta': 'React-Komponente · {size}',
|
||
'fileViewer.sketchMeta': 'Sketch · {size}',
|
||
'fileViewer.markdownStreamingMeta': 'Streaming-Vorschau…',
|
||
'fileViewer.markdownErrorMeta': 'Vorschau ist möglicherweise unvollständig (Generierungsfehler).',
|
||
'fileViewer.markdownStreamingStatus': 'Streaming… zeige partielles Markdown.',
|
||
'fileViewer.markdownErrorStatus': 'Generierungsfehler. Zeige letzten verfügbaren Inhalt.',
|
||
'fileViewer.videoMeta': 'Video · {size}',
|
||
'fileViewer.audioMeta': 'Audio · {size}',
|
||
'fileViewer.reload': 'Neu laden',
|
||
'fileViewer.reloadDisk': 'Von Festplatte neu laden',
|
||
'fileViewer.copy': 'Kopieren',
|
||
'fileViewer.copyTitle': 'Dateiinhalte kopieren',
|
||
'fileViewer.saveDisabled': 'Speichern (Read-only-Viewer)',
|
||
'fileViewer.save': 'Speichern',
|
||
'fileViewer.preview': 'Vorschau',
|
||
'fileViewer.source': 'Quelle',
|
||
'fileViewer.tweaks': 'Tweaks',
|
||
'fileViewer.tweaksUnavailable': 'Kein Tweaks-Panel in diesem Artefakt',
|
||
'fileViewer.jsxModuleTitle': 'Keine eigenständige Vorschau',
|
||
'fileViewer.jsxModuleBody': 'Diese Datei ist ein Komponentenmodul, das von einer anderen Seite geladen wird.',
|
||
'fileViewer.jsxModuleCta': 'Öffne die Seite, die es rendert:',
|
||
'fileViewer.comment': 'Kommentieren',
|
||
'fileViewer.edit': 'Bearbeiten',
|
||
'fileViewer.draw': 'Zeichnen',
|
||
'manualEdit.layers': "Layers",
|
||
'manualEdit.editableCount': "{count} editable",
|
||
'manualEdit.hiddenBadge': "Hidden",
|
||
'manualEdit.title': "Manual editor",
|
||
'manualEdit.fallbackTitle': 'Edit',
|
||
'manualEdit.movePanel': 'Move edit panel',
|
||
'manualEdit.closePanel': 'Close edit panel',
|
||
'manualEdit.selectLayer': "Select a layer",
|
||
'manualEdit.empty': "Click an element in the preview or choose a layer.",
|
||
'manualEdit.noEditableLayers': "No editable layers found.",
|
||
'manualEdit.noClass': "no class",
|
||
'manualEdit.tabsAria': "Manual edit tabs",
|
||
'manualEdit.tabContent': "Content",
|
||
'manualEdit.tabStyle': "Style",
|
||
'manualEdit.tabAttributes': "Attributes",
|
||
'manualEdit.tabHtml': "Html",
|
||
'manualEdit.tabSource': "Source",
|
||
'manualEdit.attributesJson': "Attributes JSON",
|
||
'manualEdit.selectedHtml': "Selected element HTML",
|
||
'manualEdit.fullSource': "Full artifact source",
|
||
'manualEdit.applyContent': "Apply Content",
|
||
'manualEdit.applyStyle': "Apply Style",
|
||
'manualEdit.applyAttributes': "Apply Attributes",
|
||
'manualEdit.applyHtml': "Apply HTML",
|
||
'manualEdit.applySource': "Apply Source",
|
||
'manualEdit.invalidAttributes': "Invalid attributes JSON.",
|
||
'manualEdit.changes': "Changes",
|
||
'manualEdit.undo': "Undo",
|
||
'manualEdit.redo': "Redo",
|
||
'manualEdit.noChanges': "No manual edits yet.",
|
||
'manualEdit.imageUrl': "Image URL",
|
||
'manualEdit.altText': "Alt text",
|
||
'manualEdit.label': "Label",
|
||
'manualEdit.text': "Text",
|
||
'manualEdit.href': "Href",
|
||
'manualEdit.textColor': "Text color",
|
||
'manualEdit.background': "Background",
|
||
'manualEdit.fontSize': "Font size",
|
||
'manualEdit.weight': "Weight",
|
||
'manualEdit.align': "Align",
|
||
'manualEdit.padding': "Padding",
|
||
'manualEdit.margin': "Margin",
|
||
'manualEdit.radius': "Radius",
|
||
'manualEdit.border': "Border",
|
||
'manualEdit.width': "Width",
|
||
'manualEdit.minHeight': "Min height",
|
||
'fileViewer.zoomOut': 'Verkleinern',
|
||
'fileViewer.zoomIn': 'Vergrößern',
|
||
'fileViewer.resetZoom': 'Zoom zurücksetzen',
|
||
'fileViewer.viewportAria': 'Preview viewport',
|
||
'fileViewer.viewportDesktop': 'Desktop',
|
||
'fileViewer.viewportDesktopTitle': 'Full-width desktop preview',
|
||
'fileViewer.viewportTablet': 'Tablet',
|
||
'fileViewer.viewportTabletTitle': 'Tablet preview at 820 × 1180 (modern portrait baseline)',
|
||
'fileViewer.viewportMobile': 'Mobile',
|
||
'fileViewer.viewportMobileTitle': 'Mobile preview at 390 × 844',
|
||
'fileViewer.reloadAria': 'Neu laden',
|
||
'fileViewer.previousSlide': 'Vorherige Slide',
|
||
'fileViewer.nextSlide': 'Nächste Slide',
|
||
'fileViewer.slideNavAria': 'Slide-Navigation',
|
||
'fileViewer.present': 'Präsentieren',
|
||
'fileViewer.presentInTab': 'In diesem Tab',
|
||
'fileViewer.presentFullscreen': 'Vollbild',
|
||
'fileViewer.presentNewTab': 'Neuer Tab',
|
||
'fileViewer.exitPresentation': 'Präsentation beenden',
|
||
'fileViewer.shareLabel': "Teilen",
|
||
'fileViewer.shareMenuShareLink': 'SHARE LINK',
|
||
'fileViewer.shareMenuPublishOnline': 'PUBLISH ONLINE',
|
||
'fileViewer.shareMenuDownload': 'DOWNLOAD',
|
||
'fileViewer.shareMenuPresentation': 'Presentation',
|
||
'fileViewer.shareMenuSourceFiles': 'Source files',
|
||
'fileViewer.shareMenuSave': 'SAVE',
|
||
'fileViewer.copyProviderLink': 'Copy {provider} link',
|
||
'fileViewer.copyCloudflareLink': 'Copy Cloudflare link',
|
||
'fileViewer.screenshotCopying': 'Copying screenshot...',
|
||
'fileViewer.screenshotCopied': 'Screenshot copied to clipboard',
|
||
'fileViewer.screenshotClipboardDenied': 'Browser blocked clipboard access',
|
||
'fileViewer.screenshotPreviewLoading': 'Preview is still loading. Try again in a moment.',
|
||
'fileViewer.screenshotCaptureFailed': 'Could not capture the preview. Please try again.',
|
||
'fileViewer.exportPdf': 'Als PDF exportieren',
|
||
'fileViewer.exportPdfAllSlides': 'Als PDF exportieren (alle Slides)',
|
||
'fileViewer.exportPptxBusy': 'Warten Sie, bis der aktuelle Turn abgeschlossen ist.',
|
||
'fileViewer.exportPptxHint':
|
||
'Senden Sie eine Anfrage an den Agent, um dieses Design in PPTX umzuwandeln.',
|
||
'fileViewer.exportPptxNa': 'PPTX-Export ist hier nicht verfügbar.',
|
||
'fileViewer.exportZip': 'Als .zip herunterladen',
|
||
'fileViewer.exportHtml': 'Als eigenständiges HTML exportieren',
|
||
'fileViewer.exportMd': 'Als Markdown exportieren',
|
||
'fileViewer.exportImage': 'Als Bild exportieren',
|
||
'fileViewer.exportImageFailed': 'Bildaufnahme fehlgeschlagen. Bitte versuchen Sie es erneut oder verwenden Sie das Screenshot-Tool Ihres Browsers.',
|
||
'fileViewer.exportJsx': 'Als JSX exportieren',
|
||
'fileViewer.exportReactHtml': 'Vorschau als HTML exportieren',
|
||
'fileViewer.exportStarted': 'Export started',
|
||
'fileViewer.saveAsTemplate': 'Als Template speichern…',
|
||
'fileViewer.savingTemplate': 'Template wird gespeichert…',
|
||
'fileViewer.savedTemplate': 'Als „{name}“ gespeichert',
|
||
'fileViewer.savedTemplateFail': 'Template konnte nicht gespeichert werden — bitte erneut versuchen.',
|
||
'fileViewer.templateNamePrompt': 'Template-Name',
|
||
'fileViewer.templateNameDefault': 'Template ohne Titel',
|
||
'fileViewer.templateDescPrompt':
|
||
'Kurze Beschreibung (optional — was macht dieses Template nützlich?)',
|
||
'fileViewer.deployToVercel': 'Auf Vercel deployen',
|
||
'fileViewer.redeployToVercel': 'Erneut deployen',
|
||
'fileViewer.deployingToVercel': 'Deployment auf Vercel…',
|
||
'fileViewer.deployProviderLabel': 'Anbieter',
|
||
'fileViewer.vercelProvider': 'Vercel',
|
||
'fileViewer.cloudflarePagesProvider': 'Cloudflare Pages',
|
||
'fileViewer.deployToProvider': 'Auf {provider} deployen',
|
||
'fileViewer.redeployToProvider': 'Erneut auf {provider} deployen',
|
||
'fileViewer.deployingToProvider': 'Deployment auf {provider}…',
|
||
'fileViewer.preparingPublicLink': 'Öffentlicher Link wird vorbereitet…',
|
||
'fileViewer.copyDeployLink': 'Link kopieren',
|
||
'fileViewer.deployModalTitle': 'Bereitstellen',
|
||
'fileViewer.deployModalSubtitle': 'Verwende das Konto des gewählten Anbieters, um diese HTML-Vorschau zu deployen.',
|
||
'fileViewer.vercelToken': 'Vercel Token',
|
||
'fileViewer.vercelTokenGetLink': 'Vercel Token abrufen',
|
||
'fileViewer.vercelTokenPlaceholder': 'Vercel Token einfügen',
|
||
'fileViewer.vercelTokenReuseHint': 'Gespeicherter Token wird verwendet. Gib einen neuen Token ein, um ihn zu ersetzen.',
|
||
'fileViewer.vercelTokenRequired': 'Gib zuerst einen Vercel Token ein und speichere ihn.',
|
||
'fileViewer.cloudflareApiToken': 'Cloudflare API-Token',
|
||
'fileViewer.cloudflareApiTokenGetLink': 'Cloudflare API-Token abrufen',
|
||
'fileViewer.cloudflareApiTokenPlaceholder': 'Cloudflare API-Token einfügen',
|
||
'fileViewer.cloudflareApiTokenReuseHint': 'Der gespeicherte Cloudflare API-Token wird verwendet. Gib einen neuen Token ein, um ihn zu ersetzen.',
|
||
'fileViewer.cloudflareApiTokenRequired': 'Gib zuerst einen Cloudflare API-Token ein und speichere ihn.',
|
||
'fileViewer.cloudflareApiTokenScopeHint': 'Pages Edit is required for deploys. Zone Read is required to list domains. DNS Edit is only needed when binding a custom domain.',
|
||
'fileViewer.vercelTeamId': 'Team-ID',
|
||
'fileViewer.vercelTeamSlug': 'Team-Slug',
|
||
'fileViewer.cloudflareAccountId': 'Account-ID',
|
||
'fileViewer.cloudflareAccountIdHint': 'Erforderlich. Die Account-ID findest du im Cloudflare-Dashboard.',
|
||
'fileViewer.cloudflareAccountIdRequired': 'Gib zuerst eine Cloudflare Account ID ein und speichere sie.',
|
||
'fileViewer.cloudflareZoneLabel': 'Domain',
|
||
'fileViewer.cloudflareZonePlaceholder': 'Save Cloudflare settings to load domains',
|
||
'fileViewer.cloudflareZoneRequired': 'Select a Cloudflare domain first.',
|
||
'fileViewer.cloudflareZonesLoading': 'Loading Cloudflare domains…',
|
||
'fileViewer.cloudflareZonesRefresh': 'Refresh domains',
|
||
'fileViewer.cloudflareZonesLoadFailed': 'Could not load Cloudflare domains.',
|
||
'fileViewer.cloudflareZonesEmpty': 'No active full Cloudflare domains were found for this account.',
|
||
'fileViewer.cloudflareDomainPrefixLabel': 'Subdomain prefix',
|
||
'fileViewer.cloudflareDomainPrefixPlaceholder': 'demo',
|
||
'fileViewer.cloudflareDomainPrefixInvalid': 'Use one DNS label only: lowercase letters, numbers, and hyphens.',
|
||
'fileViewer.cloudflareHostnamePreview': 'Custom domain preview: {hostname}',
|
||
'fileViewer.cloudflareCustomDomainHint': 'Optional: choose a Cloudflare domain and prefix to bind a custom subdomain. pages.dev will still be available.',
|
||
'fileViewer.cloudflarePagesDevLinkLabel': 'pages.dev URL',
|
||
'fileViewer.cloudflareCustomDomainLinkLabel': 'Custom domain',
|
||
'fileViewer.optional': 'Optional',
|
||
'fileViewer.vercelPreviewOnly': 'Deployments sind derzeit nur Preview-Deployments.',
|
||
'fileViewer.cloudflarePagesPreviewHint': 'Cloudflare Pages nutzt Direct Upload.',
|
||
'fileViewer.savingConfig': 'Speichern…',
|
||
'fileViewer.deployConfigSaveFailed': 'Vercel-Einstellungen konnten nicht gespeichert werden.',
|
||
'fileViewer.deployFailed': 'Deployment fehlgeschlagen. Prüfe die Vercel-Einstellungen und versuche es erneut.',
|
||
'fileViewer.deployProviderConfigSaveFailed': '{provider}-Einstellungen konnten nicht gespeichert werden.',
|
||
'fileViewer.deployProviderFailed': '{provider}-Deployment fehlgeschlagen. Prüfe die Einstellungen und versuche es erneut.',
|
||
'fileViewer.deployResultLabel': 'Deployment-URL',
|
||
'fileViewer.deployLinkReady': 'Bereit',
|
||
'fileViewer.deploySuccessToast': 'Deployment erfolgreich hochgeladen',
|
||
'fileViewer.deploySuccessToastDetails': '{provider} · {url}',
|
||
'fileViewer.deployLinkPreparingLabel': 'Öffentlicher Link ausstehend',
|
||
'fileViewer.deployLinkDelayed': 'Die Seite wurde deployt. Der Anbieter bereitet den öffentlichen Link noch vor.',
|
||
'fileViewer.deployLinkFailed': 'Benutzerdefinierte Domain fehlgeschlagen',
|
||
'fileViewer.deployLinkProtectedLabel': 'Deployment-Schutz aktiviert',
|
||
'fileViewer.deployLinkProtected': 'Die Seite wurde deployt, aber dieser Vorschau-Link erfordert eine Anmeldung. Deaktiviere Deployment Protection oder nutze eine eigene Domain.',
|
||
'fileViewer.retryLink': 'Jetzt erneut versuchen',
|
||
|
||
'questionForm.submit': 'Absenden',
|
||
'questionForm.skip': 'Überspringen',
|
||
'questionForm.locked': 'Beantwortet',
|
||
|
||
'conv.switch': 'Konversation wechseln',
|
||
'conv.label': 'Konversation',
|
||
'conv.heading': 'Konversationen',
|
||
'conv.new': '+ Neu',
|
||
'conv.empty': 'Noch keine Konversationen.',
|
||
'conv.untitled': 'Konversation ohne Titel',
|
||
'conv.renameTooltip': 'Doppelklicken zum Umbenennen',
|
||
'conv.delete': 'Konversation löschen',
|
||
'conv.deleteConfirm': '„{title}“ löschen? Dadurch werden die Nachrichten entfernt.',
|
||
|
||
'agentPicker.label': 'Agent',
|
||
'agentPicker.modeChoose': 'Ausführungsmodus wählen',
|
||
'agentPicker.localCli': 'Lokale CLI',
|
||
'agentPicker.daemonOff': 'Daemon aus',
|
||
'agentPicker.byok': 'API · BYOK',
|
||
'agentPicker.selectAgent': 'Erkannte Code-Agent-CLI auswählen',
|
||
'agentPicker.noAgents': 'keine Agents im PATH',
|
||
'agentPicker.notInstalled': 'nicht installiert',
|
||
'agentPicker.rescan': 'Lokalen PATH erneut nach Agents scannen',
|
||
|
||
'tool.openInTab': '{name} in einem Tab öffnen',
|
||
'tool.open': 'öffnen',
|
||
'tool.todos': 'Todos',
|
||
'tool.askQuestion': 'Frage',
|
||
'tool.askQuestionSubmit': 'Senden',
|
||
'tool.askQuestionPending': 'Warte auf deine Antwort',
|
||
'tool.askQuestionAnswered': 'Beantwortet',
|
||
'tool.todosExpand': 'Aufgaben einblenden',
|
||
'tool.todosCollapse': 'Aufgaben ausblenden',
|
||
'tool.todosDone': 'Fertig',
|
||
'tool.todosDismiss': 'Aufgabenliste schließen',
|
||
'tool.write': 'Write',
|
||
'tool.edit': 'Edit',
|
||
'tool.read': 'Read',
|
||
'tool.bash': 'Bash',
|
||
'tool.glob': 'Glob',
|
||
'tool.grep': 'Grep',
|
||
'tool.fetch': 'Fetch',
|
||
'tool.search': 'Search',
|
||
'tool.lines': '{n} Zeilen',
|
||
'tool.changeSingular': 'Änderung',
|
||
'tool.changePlural': 'Änderungen',
|
||
'tool.in': 'in {path}',
|
||
'tool.hide': 'ausblenden',
|
||
'tool.output': 'Ausgabe',
|
||
'tool.running': 'läuft…',
|
||
'tool.error': 'Fehler',
|
||
'tool.done': 'fertig',
|
||
|
||
'assistant.role': 'Assistent',
|
||
'assistant.workingLabel': 'Arbeitet',
|
||
'assistant.doneLabel': 'Fertig',
|
||
'assistant.feedbackPrompt': 'Feedback',
|
||
'assistant.feedbackPositive': 'Hilfreich',
|
||
'assistant.feedbackNegative': 'Nicht hilfreich',
|
||
'assistant.feedbackReasonTitle': 'Tell us why',
|
||
'assistant.feedbackReasonPositiveMatched': 'Understood my request',
|
||
'assistant.feedbackReasonPositiveVisual': 'Looks good',
|
||
'assistant.feedbackReasonPositiveUseful': 'Useful structure',
|
||
'assistant.feedbackReasonPositiveEasy': 'Easy to keep editing',
|
||
'assistant.feedbackReasonPositiveDesignSystem': 'Followed the design system',
|
||
'assistant.feedbackReasonNegativeMissed': 'Missed my request',
|
||
'assistant.feedbackReasonNegativeVisual': 'Visual quality needs work',
|
||
'assistant.feedbackReasonNegativeIncomplete': 'Incomplete output',
|
||
'assistant.feedbackReasonNegativeHard': 'Hard to use',
|
||
'assistant.feedbackReasonNegativeDesignSystem': 'Did not follow the design system',
|
||
'assistant.feedbackReasonOther': 'Other',
|
||
'assistant.feedbackReasonPlaceholder': 'Add a short note...',
|
||
'assistant.feedbackReasonSubmit': 'Submit',
|
||
'assistant.emptyResponseLabel': 'No output',
|
||
'assistant.emptyResponseMessage': 'The provider ended the request without returning text or an artifact. Try another model or provider, check quota, or retry.',
|
||
'assistant.unfinishedLabel': 'Mit unerledigter Arbeit gestoppt',
|
||
'assistant.unfinishedSummary': '{n} Aufgabe(n) offen',
|
||
'assistant.unfinishedMore': '+{n} weitere',
|
||
'assistant.continueRemaining': 'Offene Aufgaben fortsetzen',
|
||
'assistant.outTokens': '{n} ausgehend',
|
||
'assistant.producedFiles': 'Dateien aus diesem Turn',
|
||
'assistant.openFile': 'Öffnen',
|
||
'assistant.downloadFile': 'Herunterladen',
|
||
'assistant.thinking': 'Denkt',
|
||
'assistant.systemReminder': 'Systemhinweis',
|
||
'assistant.waitingFirstOutput': 'Warte auf erste Ausgabe',
|
||
'assistant.statusBootingAgent': 'Agent wird gestartet',
|
||
'assistant.statusStarting': 'Startet',
|
||
'assistant.statusRequesting': 'Anfrage wird gesendet',
|
||
'assistant.statusThinking': 'Denkt',
|
||
'assistant.statusStreaming': 'Streamt',
|
||
'assistant.slowHint':
|
||
'Dauert länger als üblich. Das Formular erscheint normalerweise nach 5–10 s — Sie können Stoppen und umformulieren.',
|
||
'assistant.verbEditing': 'Bearbeitet',
|
||
'assistant.verbWriting': 'Schreibt',
|
||
'assistant.verbReading': 'Liest',
|
||
'assistant.verbSearching': 'Sucht',
|
||
'assistant.verbRunning': 'Führt aus',
|
||
'assistant.verbTodos': 'Todos',
|
||
'assistant.verbFetching': 'Holt',
|
||
'assistant.verbCalling': 'Ruft auf',
|
||
|
||
'qf.answered': 'beantwortet',
|
||
'qf.choose': 'Auswählen…',
|
||
'qf.required': 'erforderlich',
|
||
'qf.lockedSubmitted':
|
||
'Antworten gesendet — der Agent nutzt sie für den Rest der Sitzung.',
|
||
'qf.lockedPrev': 'Dieses Formular stammt aus einem vorherigen Turn.',
|
||
'qf.hint':
|
||
'Wählen Sie, was passt. Überspringen Sie optionale Felder, die Ihnen egal sind — der Agent nutzt sinnvolle Standards.',
|
||
'qf.submitDefault': 'Antworten senden',
|
||
'qf.submitDisabledTitle': 'Füllen Sie zuerst die erforderlichen Felder aus',
|
||
'qf.submitTitle': 'Antworten senden',
|
||
'qf.cardSelected': 'ausgewählt',
|
||
'qf.cardRefs': 'Refs:',
|
||
'qf.cardSampleText': 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern · 0123',
|
||
|
||
'sketch.toolSelect': 'Auswählen (no-op)',
|
||
'sketch.toolPen': 'Stift',
|
||
'sketch.toolText': 'Text',
|
||
'sketch.toolRect': 'Rechteck',
|
||
'sketch.toolArrow': 'Pfeil',
|
||
'sketch.toolEraser': 'Radierer',
|
||
'sketch.color': 'Farbe',
|
||
'sketch.strokeSize': 'Strichstärke',
|
||
'sketch.undo': 'Rückgängig',
|
||
'sketch.clear': 'Leeren',
|
||
'sketch.close': 'Schließen',
|
||
'sketch.closeConfirm': 'Skizze schließen und ungespeicherte Änderungen verwerfen?',
|
||
'sketch.textPrompt': 'Text:',
|
||
'sketch.textModalTitle': 'Text hinzufügen',
|
||
|
||
'critiqueTheater.userFacingName': 'Design-Jury',
|
||
'critiqueTheater.roleDesigner': 'Designer',
|
||
'critiqueTheater.roleCritic': 'Kritiker',
|
||
'critiqueTheater.roleBrand': 'Marke',
|
||
'critiqueTheater.roleA11y': 'Barrierefreiheit',
|
||
'critiqueTheater.roleCopy': 'Text',
|
||
'critiqueTheater.roundLabel': 'Runde {n} von {m}',
|
||
'critiqueTheater.mustFix': '{n} Pflichtkorrekturen',
|
||
'critiqueTheater.composite': 'Gesamtscore',
|
||
'critiqueTheater.threshold': 'Schwelle',
|
||
'critiqueTheater.consensus': 'Konsens',
|
||
'critiqueTheater.interrupt': 'Abbrechen',
|
||
'critiqueTheater.interrupting': 'Wird abgebrochen…',
|
||
'critiqueTheater.interrupted': 'Abgebrochen',
|
||
'critiqueTheater.interruptedSummary': 'In Runde {round} abgebrochen · bester Gesamtscore {composite}',
|
||
'critiqueTheater.degradedHeading': 'Jury für diesen Lauf offline',
|
||
'critiqueTheater.degradedReasonMalformed': 'Ungültige Jury-Ausgabe (Parser hat den Block abgelehnt).',
|
||
'critiqueTheater.degradedReasonOversize': 'Jury-Ausgabe hat das sichere Byte-Budget überschritten.',
|
||
'critiqueTheater.degradedReasonAdapter': 'Adapter {adapter} unterstützt das Critique-Protokoll nicht.',
|
||
'critiqueTheater.degradedReasonProtocol': 'Adapter {adapter} verwendet eine nicht unterstützte Protokollversion.',
|
||
'critiqueTheater.degradedReasonMissingArtifact': 'Der Lauf endete ohne ein finales Artefakt.',
|
||
'critiqueTheater.replay': 'Wiedergabe',
|
||
'critiqueTheater.replaySpeed': 'Wiedergabegeschwindigkeit',
|
||
'critiqueTheater.readOnly': 'Nur lesen',
|
||
'critiqueTheater.shippedSummary': 'In Runde {round} freigegeben · Gesamtscore {composite}',
|
||
'critiqueTheater.shippedBadge': 'Freigegeben',
|
||
'critiqueTheater.belowThresholdBadge': 'Unter der Schwelle',
|
||
'critiqueTheater.timedOutBadge': 'Zeitüberschreitung',
|
||
'critiqueTheater.failedHeading': 'Lauf fehlgeschlagen',
|
||
'critiqueTheater.failedReasonCliExit': 'Agent-CLI hat vor Ende der Jury mit einem Fehler beendet.',
|
||
'critiqueTheater.failedReasonPerRoundTimeout': 'Eine Runde hat ihr Zeitbudget überschritten.',
|
||
'critiqueTheater.failedReasonTotalTimeout': 'Der gesamte Lauf hat sein Zeitbudget überschritten.',
|
||
'critiqueTheater.failedReasonOrchestrator': 'Interner Orchestrierungsfehler.',
|
||
'critiqueTheater.transcriptEmpty': 'Noch keine Wiedergabe verfügbar. Starte eine Jury, um eine aufzuzeichnen.',
|
||
'critiqueTheater.transcriptLoading': 'Wiedergabe wird geladen…',
|
||
'critiqueTheater.transcriptError': 'Wiedergabe konnte nicht geladen werden: {error}',
|
||
'critiqueTheater.replaySpeedPaused': 'Pausiert',
|
||
'critiqueTheater.replaySpeedInstant': 'Sofort',
|
||
'critiqueTheater.replaySpeedLive': 'Live',
|
||
'critiqueTheater.replaySpeedFast': 'Schnell',
|
||
'critiqueTheater.settingsNav': 'Design Jury',
|
||
'critiqueTheater.settingsNavHint': 'Fünf-Panel-Review für deine Agent-Runs',
|
||
'critiqueTheater.settingsEnabledLabel': 'Design Jury während Agent-Runs anzeigen',
|
||
'critiqueTheater.settingsEnabledDescription':
|
||
'Aktiviert, läuft während jeder Agent-Generierung eine Fünf-Panel-Review mit, die das Ergebnis vor der Auslieferung bewertet. Du kannst jederzeit unterbrechen.',
|
||
'critiqueTheater.settingsEnabledProjectHint':
|
||
'Für dieses Projekt gespeichert. Neue Runs in diesem Projekt laufen serverseitig durch die Design Jury.',
|
||
'critiqueTheater.settingsEnabledNoProjectHint':
|
||
'Öffne ein Projekt, damit dies serverseitig persistiert. Bis dahin ändert sich nur die Browser-Voreinstellung.',
|
||
|
||
'pet.title': 'Haustiere',
|
||
'pet.tabBuiltIn': 'Vorgegeben',
|
||
'pet.tabBuiltInHint': 'Mit Open Design gebündelte Begleiter — auswählen und adoptieren.',
|
||
'pet.builtInEmpty': 'Eingebaute Pets sind gerade nicht verfügbar. Aktualisiere den Community-Tab, sobald der Daemon wieder online ist.',
|
||
'pet.tabCustom': 'Eigenes',
|
||
'pet.tabCustomHint': 'Eigener Name, Glyph, Farbe oder Sprite.',
|
||
'pet.tabCommunity': 'Community',
|
||
'pet.tabCommunityHint': 'Von Codex geschlüpfte Pets — adoptieren oder neue generieren.',
|
||
'pet.tabsAria': 'Pet-Quelle',
|
||
'pet.subtitle': 'Adoptiere ein kleines Maskottchen, das über deinem Workspace schwebt.',
|
||
'pet.navTitle': 'Haustiere',
|
||
'pet.navHint': 'Adoptieren oder anpassen',
|
||
'pet.adopt': 'Adoptieren',
|
||
'pet.adoptedBadge': 'Adoptiert',
|
||
'pet.adoptCallout': 'Ein Haustier adoptieren',
|
||
'pet.changePet': 'Haustier wechseln',
|
||
'pet.wake': 'Wecken',
|
||
'pet.tuck': 'Verstecken',
|
||
'pet.wakeTitle': 'Haustier wecken — Overlay anzeigen.',
|
||
'pet.tuckTitle': 'Haustier verstecken — Overlay ausblenden.',
|
||
'pet.settingsTitle': 'Haustier-Einstellungen öffnen',
|
||
'pet.useCustom': 'Mein Haustier verwenden',
|
||
'pet.customTitle': 'Selbst gestalten',
|
||
'pet.customHint': 'Wähle Name, Symbol und Akzentfarbe — das Overlay aktualisiert sich live.',
|
||
'pet.customGreetingPlaceholder': 'Eine Begrüßung von deinem Haustier…',
|
||
'pet.fieldName': 'Name',
|
||
'pet.fieldGlyph': 'Symbol',
|
||
'pet.fieldGlyphHint': 'Ein einzelnes Emoji passt am besten (z. B. 🐝, 🦄, 🐢).',
|
||
'pet.fieldGreeting': 'Begrüßung',
|
||
'pet.fieldAccent': 'Akzentfarbe',
|
||
'pet.fieldAccentCustom': 'Eigene Farbe',
|
||
'pet.fieldAccentDefault': 'Standard-Akzentfarbe',
|
||
'pet.overlayAria': 'Haustier-Begleiter',
|
||
'pet.spriteAria': '{name} — zum Bewegen ziehen, zum Plaudern klicken',
|
||
'pet.spriteTitle': 'Hallo von {name}! Klick zum Plaudern.',
|
||
'pet.composerTitle': 'Haustiere — wecken, verstecken oder auswählen',
|
||
'pet.composerMenuTitle': 'Haustiere',
|
||
'pet.composerMenuHint': 'Tipp: tippe /pet zum Umschalten',
|
||
'pet.composerOpenSettings': 'Haustiere verwalten',
|
||
'pet.welcomeTeaserTitle': 'Adoptiere ein Haustier',
|
||
'pet.welcomeTeaserBody': 'Ein kleiner schwebender Begleiter für deinen Workspace.',
|
||
'pet.welcomeTeaserCta': 'Eines wählen',
|
||
'pet.imageUpload': 'Sprite hochladen',
|
||
'pet.imageReplace': 'Sprite ersetzen',
|
||
'pet.imageRemove': 'Emoji verwenden',
|
||
'pet.imageHintIdle': 'PNG, JPG, WebP, GIF oder SVG. Spritesheet? Lade einen horizontalen Streifen hoch und setze die Frame-Anzahl.',
|
||
'pet.imageHintActive': 'Dein Sprite wird angezeigt. Setze Frames > 1, um einen horizontalen Spritesheet zu animieren.',
|
||
'pet.fieldFrames': 'Frames',
|
||
'pet.fieldFramesHint': '1 = statisch. > 1 = horizontaler Spritesheet.',
|
||
'pet.fieldFps': 'Geschwindigkeit (fps)',
|
||
'pet.fieldFpsHint': 'Wie schnell die Frames durchlaufen.',
|
||
'pet.atlasImport': 'Codex-Sprite importieren',
|
||
'pet.atlasImportTitle': 'Importiere ein hatch-pet 8x9 / 192x208 Atlas (PNG oder WebP).',
|
||
'pet.atlasPickerTitle': 'Animationszeile wählen',
|
||
'pet.atlasPickerHint': 'Codex-Pets bringen 9 Animationszeilen mit. Standardmäßig behalten wir den ganzen Atlas, damit das Pet bei Hover, Drag-Richtung und langer Untätigkeit die Reihen wechselt. Du kannst es auch auf eine Schleife festlegen.',
|
||
'pet.atlasCancel': 'Atlas verwerfen',
|
||
'pet.atlasAdopt': 'Auf diese Zeile festlegen',
|
||
'pet.atlasAdoptFull': 'Ganzen Atlas verwenden (animiert)',
|
||
'pet.atlasAdoptFullTitle': 'Alle Zeilen behalten, damit das Pet auf Hover, Drag-Richtung und lange Untätigkeit reagiert.',
|
||
'pet.atlasAdoptRowTitle': 'Nur die markierte Zeile als einzelne Endlosschleife herausschneiden.',
|
||
'pet.atlasActiveHint': 'Animierter Atlas aktiv — das Pet wählt anhand deiner Interaktion (Hover, Drag, Untätigkeit) eine Zeile aus.',
|
||
'pet.atlasRow.idle': 'Idle',
|
||
'pet.atlasRow.running-right': 'Lauf rechts',
|
||
'pet.atlasRow.running-left': 'Lauf links',
|
||
'pet.atlasRow.waving': 'Winken',
|
||
'pet.atlasRow.jumping': 'Springen',
|
||
'pet.atlasRow.failed': 'Gescheitert',
|
||
'pet.atlasRow.waiting': 'Warten',
|
||
'pet.atlasRow.running': 'Laufen',
|
||
'pet.atlasRow.review': 'Prüfen',
|
||
'pet.hatchTitle': 'Neues Pet mit KI ausbrüten',
|
||
'pet.hatchHint': 'Nutze das mitgelieferte hatch-pet-Skill im Chat, um ein Codex-Spritesheet zu erzeugen, und importiere es danach hier.',
|
||
'pet.hatchConcept': 'Pet-Konzept (optional)',
|
||
'pet.hatchConceptPlaceholder': 'z. B. ein winziger Pixel-Shiba im kuscheligen Pulli',
|
||
'pet.hatchCopy': 'Prompt kopieren',
|
||
'pet.hatchCopied': 'Kopiert!',
|
||
'pet.hatchFoot': 'Sobald das Skill dein Pet gespeichert hat, kommst du zurück und wählst „Codex-Sprite importieren".',
|
||
'pet.slashPopoverAria': 'Slash-Befehle',
|
||
'pet.slashPopoverTitle': 'Befehle',
|
||
'pet.slashPopoverHint': '↑↓ navigieren · enter auswählen · esc schließen',
|
||
'pet.slashPet': 'Pet umschalten, adoptieren oder Einstellungen öffnen.',
|
||
'pet.slashPetWake': 'Schwebende Pet-Anzeige aufwecken.',
|
||
'pet.slashPetTuck': 'Pet vorerst wegstecken.',
|
||
'pet.slashHatch': 'Codex-Pet mit dem hatch-pet-Skill erzeugen.',
|
||
'pet.slashHatchArg': '<Konzept>',
|
||
'pet.slashSearch': 'Suche im Web über den OD-Research-Befehl.',
|
||
'pet.slashSearchArg': '<Suchanfrage>',
|
||
'pet.codexTitle': 'Kürzlich ausgebrütet',
|
||
'pet.codexSubtitle': 'Vom hatch-pet-Skill gepackte Pets erscheinen hier zur Ein-Klick-Adoption.',
|
||
'pet.codexSubtitleWithDir': 'Suche in {dir} nach hatch-pet-Paketen.',
|
||
'pet.codexEmpty': 'Noch keine ausgebrüteten Pets. Tippe /hatch im Chat, um eines zu erzeugen.',
|
||
'pet.codexLoading': 'Suche nach ausgebrüteten Pets…',
|
||
'pet.codexRefresh': 'Aktualisieren',
|
||
'pet.codexAdopt': 'Adoptieren',
|
||
'pet.codexAdopting': 'Adoptiere…',
|
||
'pet.communitySync': 'Community-Pets herunterladen',
|
||
'pet.communitySyncing': 'Lade…',
|
||
'pet.communitySyncTitle': 'Synchronisiere die neuesten Pets aus Codex Pet Share + j20 Hatchery nach ~/.codex/pets/.',
|
||
'pet.communitySyncDone': '{wrote} neue Pets synchronisiert ({total} insgesamt).',
|
||
'pet.communitySyncFailed': 'Sync fehlgeschlagen: {error}',
|
||
'pet.codexBundled': 'Mitgeliefert',
|
||
'pet.codexBundledTitle': 'Wird mit Open Design ausgeliefert — kein Download nötig.',
|
||
|
||
'settings.notifications': 'Benachrichtigungen',
|
||
'settings.notificationsHint': 'Ton und Desktop-Benachrichtigung beim Abschluss von Aufgaben',
|
||
'settings.notifyCompletionSound': 'Abschluss-Ton',
|
||
'settings.notifyCompletionSoundHint': 'Wird abgespielt, wenn eine Runde endet. Standardmäßig aus.',
|
||
'settings.notifySuccessSound': 'Erfolgs-Ton',
|
||
'settings.notifyFailureSound': 'Fehler-Ton',
|
||
'settings.notifyDesktop': 'Desktop-Benachrichtigung',
|
||
'settings.notifyDesktopHint': 'Wird gesendet, wenn das Fenster nicht im Vordergrund ist.',
|
||
'settings.notifyDesktopBlocked': 'Vom Browser blockiert. Bitte in den Website-Einstellungen erlauben.',
|
||
'settings.notifyDesktopUnsupported': 'Desktop-Benachrichtigungen werden in dieser Umgebung nicht unterstützt.',
|
||
'settings.notifyTest': 'Test senden',
|
||
'settings.notifyTestSent': 'Testbenachrichtigung gesendet. Wenn kein Banner erscheint, Browser- und Systembenachrichtigungen prüfen.',
|
||
'settings.notifyTestFailed': 'Benachrichtigungsaufruf fehlgeschlagen. Browser- und Systembenachrichtigungen prüfen.',
|
||
'settings.notifySoundDing': 'Ding',
|
||
'settings.notifySoundChime': 'Glockenspiel',
|
||
'settings.notifySoundTwoToneUp': 'Zweiton aufwärts',
|
||
'settings.notifySoundPluck': 'Zupfen',
|
||
'settings.notifySoundBuzz': 'Summen',
|
||
'settings.notifySoundTwoToneDown': 'Zweiton abwärts',
|
||
'settings.notifySoundThud': 'Dumpfer Schlag',
|
||
'settings.skills': 'Skills',
|
||
'settings.skillsHint': 'Funktionale Skills, die der Agent während einer Aufgabe aufrufen kann',
|
||
'settings.skillsNew': 'Neuer Skill',
|
||
'settings.skillsEmpty': 'Wähle links einen Skill aus oder erstelle einen neuen.',
|
||
'settings.skillsEdit': 'Bearbeiten',
|
||
'settings.skillsDelete': 'Löschen',
|
||
'settings.skillsDeleteConfirm': 'Löschen bestätigen',
|
||
'settings.skillsName': 'Name',
|
||
'settings.skillsTriggers': 'Trigger (Komma- oder zeilengetrennt)',
|
||
'settings.skillsDescription': 'Beschreibung',
|
||
'settings.skillsBody': 'SKILL.md-Inhalt',
|
||
'settings.skillsCreate': 'Erstellen',
|
||
'settings.skillsSave': 'Speichern',
|
||
'settings.skillsSaving': 'Speichern…',
|
||
'settings.skillsFiles': 'Dateien',
|
||
'settings.skillsNoFiles': 'Keine Dateien in diesem Skill-Ordner.',
|
||
'settings.skillsNameRequired': 'Skill-Name ist erforderlich.',
|
||
'settings.skillsBodyRequired': 'Skill-Inhalt ist erforderlich.',
|
||
'settings.designSystems': 'Design-Systeme',
|
||
'settings.designSystemsHint': 'Verfügbare Design-Systeme durchsuchen und umschalten',
|
||
'settings.designSystemsInstalled': 'Installiert',
|
||
'settings.designSystemsAdd': 'Design-System hinzufügen',
|
||
'settings.designSystemsHiddenCount': '{count} in der Home-Galerie ausgeblendet',
|
||
'settings.designSystemsShowAll': 'Alle anzeigen',
|
||
'settings.designSystemsShowHidden': 'Ausgeblendete anzeigen',
|
||
'settings.designSystemsSource': 'Quelle',
|
||
'settings.designSystemsSourceLocal': 'Lokal',
|
||
'settings.designSystemsSourceGithub': 'GitHub',
|
||
'settings.designSystemsStructure': 'Struktur',
|
||
'settings.designSystemsModeHybrid': 'Hybrid',
|
||
'settings.designSystemsModeNormalized': 'Normalisiert',
|
||
'settings.designSystemsModeVerbatim': 'Unverändert',
|
||
'settings.designSystemsCraft': 'Craft',
|
||
'settings.designSystemsCraftColor': 'Farbe',
|
||
'settings.designSystemsCraftAccessibility': 'Barrierefreiheit',
|
||
'settings.designSystemsGithubUrl': 'GitHub-URL',
|
||
'settings.designSystemsProjectPath': 'Projektpfad',
|
||
'settings.designSystemsImportGithub': 'Aus GitHub importieren',
|
||
'settings.designSystemsImportProject': 'Aus Projekt importieren',
|
||
'settings.designSystemsImportedStatus': '{title} importiert',
|
||
'settings.designSystemsViewImported': 'Importiertes Design-System anzeigen',
|
||
'settings.designSystemsCategory': 'Kategorie',
|
||
'settings.designSystemsAllCategories': 'Alle Kategorien',
|
||
'settings.designSystemsShowInHomeGallery': 'In Home-Galerie anzeigen',
|
||
'settings.librarySkills': 'Fähigkeiten',
|
||
'settings.libraryDesignSystems': 'Designsysteme',
|
||
'settings.librarySearch': 'Suchen...',
|
||
'settings.libraryAll': 'Alle',
|
||
'settings.libraryPreview': 'Vorschau',
|
||
'settings.libraryPreviewClose': 'Schließen',
|
||
'settings.libraryLoading': 'Laden...',
|
||
'settings.libraryNoResults': 'Keine Elemente entsprechen Ihrer Suche.',
|
||
'settings.libraryEnabled': 'Aktiviert',
|
||
'settings.libraryDisabled': 'Deaktiviert',
|
||
'settings.connectorsNavHint': 'Externe Systemverbindungen',
|
||
'settings.connectorsHint': 'Verwalte Connector- und Tool-Anbieter-Einstellungen für dieses Gerät.',
|
||
'settings.connectorsComposioApiKey': 'Composio-API-Schlüssel',
|
||
'settings.connectorsSavedTitle': 'Im lokalen Daemon gespeichert',
|
||
'settings.connectorsSavedWithTail': 'Gespeichert · ••••{tail}',
|
||
'settings.connectorsSaved': 'Gespeichert',
|
||
'settings.connectorsGetApiKey': 'API-Schlüssel abrufen',
|
||
'settings.connectorsReplaceKeyPlaceholder': 'Neuen Schlüssel einfügen, um den gespeicherten zu ersetzen',
|
||
'settings.connectorsApiKeyPlaceholder': 'Composio-API-Schlüssel einfügen',
|
||
'settings.connectorsClear': 'Löschen',
|
||
'settings.connectorsClearConfirmTitle': 'Gespeicherten Composio-API-Schlüssel löschen?',
|
||
'settings.connectorsClearConfirmBody': 'Beim Entfernen des Schlüssels werden alle Composio-Connectors dieses Workspaces getrennt. Verknüpfte Konten, OAuth-Freigaben und Tool-Zugriffe werden allesamt entfernt.',
|
||
'settings.connectorsClearConfirmContinue': 'Weiter',
|
||
'settings.connectorsClearFinalTitle': 'Damit werden alle Connectors getrennt',
|
||
'settings.connectorsClearFinalBody': 'Dieser Schritt lässt sich nicht rückgängig machen. Nach dem Einfügen eines neuen Schlüssels musst du jede Integration neu verbinden.',
|
||
'settings.connectorsClearFinalConfirm': 'Schlüssel löschen & trennen',
|
||
'settings.connectorsClearArming': 'Einen Moment\u2026',
|
||
'settings.connectorsClearCancel': 'Abbrechen',
|
||
'settings.connectorsSaveKey': "Key speichern",
|
||
'settings.connectorsSaveKeyTitle': "Diesen Key an den lokalen Daemon senden",
|
||
'settings.connectorsKeySaving': "Speichere…",
|
||
'settings.connectorsKeySaved': "Gespeichert ✓",
|
||
'settings.connectorsKeyError': "Key konnte nicht gespeichert werden. Prüfe, ob der lokale Daemon läuft, und versuche es erneut.",
|
||
'settings.connectorsHelpSaved': 'Dein Schlüssel entsperrt den Katalog unten und bleibt im lokalen Daemon. Füge einen neuen Schlüssel ein, um ihn zu ersetzen, oder lösche ihn.',
|
||
'settings.connectorsHelpUnsaved': "Ungespeicherte Änderungen — klicke auf „Key speichern“, um diesen Schlüssel im lokalen Daemon abzulegen und den Katalog unten freizuschalten.",
|
||
'settings.connectorsHelpEmpty': 'Füge einen Schlüssel hinzu, um den Katalog unten zu entsperren. Schlüssel werden lokal im Daemon gespeichert und nie über Umgebungsvariablen gesendet.',
|
||
'settings.connectorsLoadingSavedKey': 'Im lokalen Daemon wird nach einem gespeicherten Schlüssel gesucht…',
|
||
'settings.autosaveSaving': "Speichere…",
|
||
'settings.autosaveSaved': "Alle Änderungen gespeichert",
|
||
'settings.autosaveError': "Änderungen konnten nicht gespeichert werden. Der lokale Daemon ist möglicherweise offline.",
|
||
'settings.libraryToggleLabel': 'Umschalten',
|
||
// Memory (auto-extracted personalization saved as on-disk markdown)
|
||
'settings.memory': 'Speicher',
|
||
'settings.memoryHint': 'Persönliche Fakten, automatisch aus Chats extrahiert',
|
||
'settings.memoryDescription': 'Aus Chats extrahierte Fakten zu deinen Präferenzen, gespeichert als Markdown-Dateien und in jeden Chat eingespielt.',
|
||
'settings.memoryEnabled': 'Aktiviert',
|
||
'settings.memoryDisabled': 'Deaktiviert',
|
||
'settings.memoryEnableLabel': 'Speicher-Injektion aktivieren',
|
||
'settings.memoryDisabledBanner': 'Der Speicher ist derzeit AUS. Bestehende Fakten bleiben auf der Festplatte, werden aber nicht in neue Chats eingespielt.',
|
||
'settings.memoryNew': 'Neuer Eintrag',
|
||
'settings.memoryEdit': 'Bearbeiten',
|
||
'settings.memoryDelete': 'Löschen',
|
||
'settings.memoryPreview': 'Vorschau',
|
||
'settings.memoryEmpty': 'Noch keine Erinnerungen.',
|
||
'settings.memoryEmptyHintZh': '记住: 用户偏好深色主题',
|
||
'settings.memoryEmptyHintEn': 'I prefer dark mode',
|
||
'settings.memoryName': 'Name',
|
||
'settings.memoryDesc': 'Einzeilige Beschreibung',
|
||
'settings.memoryBody': 'Inhalt (Markdown unterstützt)',
|
||
'settings.memoryBodyHint': 'Regel zuerst, dann Zeilen Why und How to apply.',
|
||
'settings.memoryStartersLabel': 'Need a starting point? Click to fill the form:',
|
||
'settings.memoryStarterUserName': 'My role',
|
||
'settings.memoryStarterUserDesc': 'I am a frontend engineer working on a SaaS design tool',
|
||
'settings.memoryStarterUserBody': '- Role: senior frontend engineer\n- Stack: React, TypeScript, Vite\n- Domain: design / collaboration tools\n- Timezone: GMT+8 (Asia/Shanghai)\n\nWhen to apply: any chat — frame examples around web frontend.',
|
||
'settings.memoryStarterFeedbackName': 'UI preferences',
|
||
'settings.memoryStarterFeedbackDesc': 'Dark mode, large body text, low information density',
|
||
'settings.memoryStarterFeedbackBody': '- Theme: dark by default\n- Body text: ≥ 18px\n- Information density: prefer whitespace, fewer items per screen\n\nWhy: less eye strain during long sessions.\nWhen to apply: whenever you generate UI, web pages, or slides.',
|
||
'settings.memoryStarterProjectName': 'Current project',
|
||
'settings.memoryStarterProjectDesc': 'Open Design v0.5 — chat-driven design editor',
|
||
'settings.memoryStarterProjectBody': '- Goal: ship the chat-driven editor this quarter\n- Priorities: streaming render, local multimodal, offline-first\n- Stack: Next.js 16, Express daemon, SQLite\n\nWhen to apply: in any conversation about this project.',
|
||
'settings.memorySaveHint': 'Not auto-saved — click Create / Save to apply.',
|
||
'settings.memoryIndexSaveHint': 'Edits to the index are not auto-saved — click Save index to apply.',
|
||
'settings.memoryIndexUnsaved': 'Unsaved changes',
|
||
'settings.memoryFlashCreated': '✓ Memory created',
|
||
'settings.memoryFlashSaved': '✓ Memory saved',
|
||
'settings.memoryFlashDeleted': '✓ Memory deleted',
|
||
'settings.memoryFlashIndexSaved': '✓ Index saved',
|
||
'settings.memoryFlashPathCopied': '✓ Pfad kopiert',
|
||
'settings.memoryNameLabel': 'Title',
|
||
'settings.memoryTypeLabel': 'Type',
|
||
'settings.memoryDescLabel': 'Description',
|
||
'settings.memoryBodyLabel': 'Content',
|
||
'settings.memoryTypeUser': 'Benutzer',
|
||
'settings.memoryTypeFeedback': 'Feedback',
|
||
'settings.memoryTypeProject': 'Projekt',
|
||
'settings.memoryTypeReference': 'Referenz',
|
||
'settings.memoryIndex': 'MEMORY.md (Index)',
|
||
'settings.memoryIndexSave': 'Index speichern',
|
||
'settings.memoryIndexReset': 'Zurücksetzen',
|
||
'settings.memoryToastChanged': 'Speicher aktualisiert',
|
||
'settings.memoryToastClickHint': 'Anzeigen',
|
||
'settings.memoryAll': 'Alle',
|
||
'settings.memoryExtractions': 'Extraction history',
|
||
'settings.memoryExtractionsHint': 'Recent LLM-backed extraction attempts. Heuristic regex extraction always runs first; LLM extraction runs in the background after each turn.',
|
||
'settings.memoryExtractionsEmpty': 'No extractions yet. The next chat turn will populate this list.',
|
||
'settings.memoryExtractionsRefresh': 'Refresh',
|
||
'settings.memoryExtractionsRefreshing': 'Refreshing…',
|
||
'settings.memoryExtractionPhaseRunning': 'Running…',
|
||
'settings.memoryExtractionPhaseSuccess': 'Success',
|
||
'settings.memoryExtractionPhaseSkipped': 'Skipped',
|
||
'settings.memoryExtractionPhaseFailed': 'Failed',
|
||
'settings.memoryExtractionSkipNoProvider': 'No API key configured for LLM memory extraction.',
|
||
'settings.memoryExtractionSkipDisabled': 'Memory is disabled.',
|
||
'settings.memoryExtractionSkipEmpty': 'Empty user message — nothing to extract.',
|
||
'settings.memoryExtractionSkipNoMatch': 'No regex pattern matched this turn.',
|
||
'settings.memoryExtractionKindHeuristic': 'regex',
|
||
'settings.memoryExtractionKindLlm': 'LLM',
|
||
'settings.memoryExtractionProviderEnv': 'env',
|
||
'settings.memoryExtractionProviderMediaConfig': 'media settings',
|
||
'settings.memoryExtractionProposed': 'proposed',
|
||
'settings.memoryExtractionWritten': 'written',
|
||
'settings.memoryExtractionDuration': 'in',
|
||
'settings.memoryNoProviderBannerTitle': 'LLM memory extraction is not running',
|
||
'settings.memoryNoProviderBannerBody': 'No API key found for the memory extractor. Add an OpenAI key under Media providers, or set ANTHROPIC_API_KEY / OPENAI_API_KEY in the environment, to enable LLM-driven extraction. Heuristic regex extraction is still active.',
|
||
'settings.memoryExtractionProviderOverride': 'memory settings',
|
||
'settings.memoryExtractionDelete': 'Delete',
|
||
'settings.memoryExtractionsClear': 'Clear',
|
||
'settings.memoryExtractionsClearTitle': 'Clear all extraction history',
|
||
'settings.libraryInstall': 'Installieren',
|
||
'settings.libraryInstallGithub': 'GitHub',
|
||
'settings.libraryInstallLocal': 'Lokaler Pfad',
|
||
'settings.libraryInstallUrl': 'https://github.com/owner/repo',
|
||
'settings.libraryInstallPath': '/path/to/skill-folder',
|
||
'settings.libraryInstallButton': 'Installieren',
|
||
'settings.libraryUninstall': 'Deinstallieren',
|
||
'settings.libraryBuiltIn': 'Integriert',
|
||
'settings.libraryInstalled': 'Installiert',
|
||
'notify.successTitle': 'Aufgabe abgeschlossen',
|
||
'notify.failureTitle': 'Aufgabe fehlgeschlagen',
|
||
'notify.successBody': 'Eine Runde ist abgeschlossen.',
|
||
'notify.failureBody': 'Die Aufgabe wurde mit einem Fehler beendet.',
|
||
'updater.available': 'Update verfügbar',
|
||
'updater.availableBody': 'Open Design {version} ist verfügbar. Es wird heruntergeladen, bevor der Installer geöffnet werden kann.',
|
||
'updater.checking': 'Suche nach Updates',
|
||
'updater.download': 'Update herunterladen',
|
||
'updater.downloading': 'Update wird heruntergeladen',
|
||
'updater.downloadingPercent': 'Update wird heruntergeladen {percent}%',
|
||
'updater.done': 'Fertig',
|
||
'updater.failed': 'Update fehlgeschlagen',
|
||
'updater.installerOpenBody': 'Der Installer ist geöffnet. Open Design wird beendet, damit Sie das Update abschließen können.',
|
||
'updater.installerOpened': 'Installer geöffnet',
|
||
'updater.later': 'Später',
|
||
'updater.openFailedFallback': 'Der Installer konnte nicht geöffnet werden.',
|
||
'updater.openInstaller': 'Update installieren',
|
||
'updater.opening': 'Installer wird geöffnet...',
|
||
'updater.quitButton': 'Open Design beenden',
|
||
'updater.quitFailedBody': 'Der Installer ist geöffnet, aber Open Design konnte nicht beendet werden. Beenden Sie Open Design, bevor Sie die App ersetzen.',
|
||
'updater.quitFailedTitle': 'Beenden fehlgeschlagen',
|
||
'updater.quitting': 'Wird beendet...',
|
||
'updater.ready': 'Update bereit',
|
||
'updater.readyGeneric': 'Eine neue Version ist bereit. Open Design wird geschlossen und der Installer geöffnet.',
|
||
'updater.readyVersion': 'Open Design {version} ist bereit. Open Design wird geschlossen und der Installer geöffnet.',
|
||
'updater.upToDate': 'Sie verwenden bereits die neueste Version.',
|
||
'settings.memoryModelInlineLabel': 'Memory model',
|
||
'settings.memoryModelInlineSameAsChat': 'Same as chat',
|
||
'settings.memoryModelInlineSameAsChatWithModel': 'Same as chat ({model})',
|
||
'settings.memoryModelInlineSameAsChatWithProvider': 'Same as chat ({provider})',
|
||
'settings.memoryModelInlineHintCli': 'Optional. The memory extractor uses an env-var or media-providers API key on this provider; pinning a model here just overrides the auto-pick.',
|
||
'settings.memoryModelInlineHintCliConstrained': 'Optional. Memory will call {provider}; needs an env-var or media-providers API key for that provider, or pick a model below to override.',
|
||
'settings.memoryModelInlineHintByok': 'Optional. Reuses your chat API key on the same provider — picking a different (usually cheaper) model only changes the request body.',
|
||
'settings.memoryModelInlineFlashSaved': 'Saved',
|
||
'settings.memoryModelInlineFlashCleared': 'Cleared',
|
||
'settings.orbit.eyebrow': 'Automatisierung',
|
||
'settings.orbit.title': 'Orbit',
|
||
'settings.orbit.navHint': 'Tägliche Connector-Zusammenfassung',
|
||
'settings.orbit.lede': 'Connector-Aktivität nach Zeitplan sammeln und das Ergebnis als aktualisierbares live artifact veröffentlichen.',
|
||
'settings.orbit.statusOnTitle': 'Geplante tägliche Läufe sind aktiv',
|
||
'settings.orbit.statusOffTitle': 'Geplante tägliche Läufe sind deaktiviert',
|
||
'settings.orbit.statusActive': 'Aktiv',
|
||
'settings.orbit.statusOff': 'Aus',
|
||
'settings.orbit.runTitle': 'Einen Orbit-Lauf starten und die Live-Konversation öffnen',
|
||
'settings.orbit.running': 'Läuft…',
|
||
'settings.orbit.runOpen': 'Jetzt ausführen',
|
||
'settings.orbit.dailySummaryTitle': 'Tägliche Zusammenfassung',
|
||
'settings.orbit.dailySummarySub': 'Wird einmal pro Tag zur geplanten lokalen Zeit ausgeführt.',
|
||
'settings.orbit.on': 'Ein',
|
||
'settings.orbit.off': 'Aus',
|
||
'settings.orbit.runTimeTitle': 'Ausführungszeit',
|
||
'settings.orbit.runTimeSub': 'Standard 08:00. Speichern, um den Daemon-Zeitplan anzuwenden.',
|
||
'settings.orbit.runTimeAria': 'Tägliche Orbit-Ausführungszeit',
|
||
'settings.orbit.nextRun': 'Nächster Lauf',
|
||
'settings.orbit.nextRunScheduledAfterSave': 'Nach dem Speichern geplant',
|
||
'settings.orbit.schedule': 'Zeitplan',
|
||
'settings.orbit.pausedManualOnly': 'Pausiert — nur manuelle Läufe',
|
||
'settings.orbit.templateTitle': 'Prompt-Vorlage',
|
||
'settings.orbit.templateMissing': 'Vorlage {id} ist nicht installiert.',
|
||
'settings.orbit.templateMissingOption': '{id} (fehlt)',
|
||
'settings.orbit.templateMissingInstall': 'Installiere eine Orbit-Skill, um den Prompt zu steuern.',
|
||
'settings.orbit.templateMissingPickAnother': 'Wähle eine andere Vorlage aus dem Dropdown.',
|
||
'settings.orbit.templateResetTitle': 'Auf {id} zurücksetzen',
|
||
'settings.orbit.templateReset': 'Zurücksetzen',
|
||
'settings.orbit.templateHelp': 'Steuere Orbit mit einer Skill — der Beispiel-Prompt der ausgewählten Vorlage wird in jeden Orbit-Lauf eingefügt, damit Zusammenfassungen dieser Vorlagenform folgen.',
|
||
'settings.orbit.templateAria': 'Orbit-Prompt-Vorlage',
|
||
'settings.orbit.templatesLoading': 'Vorlagen werden geladen…',
|
||
'settings.orbit.templatesOptgroup': 'Orbit-Skill-Vorlagen',
|
||
'settings.orbit.lastRun': 'Letzter Lauf',
|
||
'settings.orbit.triggerManual': 'Manuell',
|
||
'settings.orbit.triggerScheduled': 'Geplant',
|
||
'settings.orbit.meterAria': '{succeeded} erfolgreich, {skipped} übersprungen, {failed} fehlgeschlagen von {checked} geprüft',
|
||
'settings.orbit.countChecked': 'Geprüft',
|
||
'settings.orbit.countSucceeded': 'Erfolgreich',
|
||
'settings.orbit.countSkipped': 'Übersprungen',
|
||
'settings.orbit.countFailed': 'Fehlgeschlagen',
|
||
'settings.orbit.runError': 'Orbit konnte nicht ausgeführt werden. Stelle sicher, dass der lokale Daemon läuft und Connectors konfiguriert sind.',
|
||
'settings.orbit.gateAriaLabel': "Connectors werden für Orbit benötigt",
|
||
'settings.orbit.gateEyebrow': "Einrichtung erforderlich",
|
||
'settings.orbit.gateTitle': "Verbinde ein Tool, um Orbit zu nutzen",
|
||
'settings.orbit.gateBody': "Orbit fasst die Aktivität deiner Connectors zusammen. Du hast noch nichts verbunden — füge mindestens eine Integration hinzu, damit Orbit etwas zu berichten hat.",
|
||
'settings.orbit.gateBodyNoKey': "Orbit fasst die Aktivität deiner Connectors zusammen, und Connectors laufen über Composio. Trage einen Composio-API-Key unter Connectors ein, um den Katalog freizuschalten und deine erste Integration zu wählen.",
|
||
'settings.orbit.gateAction': "Connectors öffnen",
|
||
'settings.orbit.gateActionNoKey': "Composio konfigurieren",
|
||
'settings.orbit.gateLoading': "Connectors werden geprüft…",
|
||
'settings.orbit.controlsLockedBadge': "Gesperrt",
|
||
'settings.orbit.controlsLockedHint': "Verbinde ein Tool, um Zeitplan und Vorlage von Orbit freizuschalten.",
|
||
'settings.orbit.artifactKickerLive': 'live artifact',
|
||
'settings.orbit.artifactKickerLegacy': 'Legacy-Zusammenfassung',
|
||
'settings.orbit.artifactTitle': 'Tägliche Orbit-Aktivitätszusammenfassung',
|
||
'settings.orbit.artifactMetaLive': 'Aktualisierbares HTML-Artefakt, erzeugt aus Connector-Aktivität.',
|
||
'settings.orbit.artifactMetaLegacy': 'Erzeugt, bevor live artifact-Unterstützung aktiviert wurde — führe Orbit erneut aus, um eines zu veröffentlichen.',
|
||
'settings.orbit.copyMarkdownTitle': 'Markdown-Zusammenfassung in die Zwischenablage kopieren',
|
||
'settings.orbit.copied': 'Kopiert',
|
||
'settings.orbit.copy': 'Kopieren',
|
||
'settings.orbit.openArtifact': 'Artefakt öffnen',
|
||
'settings.orbit.sourceMarkdown': 'Quell-Markdown',
|
||
'liveArtifact.viewer.tabPreview': 'Vorschau',
|
||
'liveArtifact.viewer.tabCode': 'Code',
|
||
'liveArtifact.viewer.tabData': 'Daten',
|
||
'liveArtifact.viewer.tabRefreshHistory': 'Aktualisierungsverlauf',
|
||
'liveArtifact.viewer.dataEmpty': 'Kein data.json-Cache verfügbar.',
|
||
'liveArtifact.viewer.code.templateHeading': 'Vorlagen-HTML',
|
||
'liveArtifact.viewer.code.renderedHeading': 'Gerendertes HTML',
|
||
'liveArtifact.viewer.code.templateHelp': 'Die bearbeitbare Vorlage, die mit data.json zum Erzeugen der Vorschau verwendet wird.',
|
||
'liveArtifact.viewer.code.renderedHelp': 'Die erzeugte index.html, die derzeit von der Vorschau geladen wird.',
|
||
'liveArtifact.viewer.code.variantAria': 'Code-Variante',
|
||
'liveArtifact.viewer.code.variantTemplate': 'Vorlage',
|
||
'liveArtifact.viewer.code.variantRendered': 'Gerendert',
|
||
'liveArtifact.viewer.code.loading': 'Code wird geladen…',
|
||
'liveArtifact.viewer.code.unavailable': 'Code ist noch nicht verfügbar.',
|
||
'liveArtifact.viewer.code.empty': 'Diese Codedatei ist leer.',
|
||
// Diagnostics export
|
||
'diagnostics.exportTitle': 'Diagnose exportieren',
|
||
'diagnostics.exportButton': 'Diagnose exportieren',
|
||
'diagnostics.exportHint': 'Bündelt die aktuellen App-Logs und Geräteinformationen in ein Zip-Archiv, das du mit dem Team teilen kannst.',
|
||
'diagnostics.exporting': 'Exportiere…',
|
||
'diagnostics.exportSuccess': 'Diagnose gespeichert: {path}',
|
||
'diagnostics.exportFailed': 'Diagnose-Export fehlgeschlagen: {message}',
|
||
};
|