mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
* feat(runtimes): register AMR (vela) as an ACP stdio agent
AMR is the vela CLI's ACP runtime mode. `vela agent run --runtime opencode`
speaks ACP JSON-RPC over stdio (see vela's
`specs/current/runtime/manual-agent-run-openrouter.md`); per
`docs/new-agent-runtime-acp.md` we expose it through the same `streamFormat:
'acp-json-rpc'` transport that already powers Hermes, Devin, Kimi, etc.
The new `defs/amr.ts` is the entire wiring — `buildArgs` returns
`['agent', 'run', '--runtime', 'opencode']`, `fetchModels` reuses
`detectAcpModels`, and the fallback list seeds the OpenRouter ids vela's
e2e baseline uses. `executables.ts`/`app-config.ts`/`metadata.ts` get the
matching `VELA_BIN`/`VELA_LINK_URL`/`VELA_RUNTIME_KEY`/`VELA_OPENCODE_BIN`
allowlist + install/docs URLs, so users can configure the per-agent env in
Settings without leaking into other adapters.
Coverage: `tests/fixtures/fake-vela.mjs` is a minimal ACP stub that returns
the documented `initialize` / `session/new` / `session/set_model` /
`session/prompt` shapes; `tests/amr-acp-integration.test.ts` spawns it via
`child_process.spawn` and drives a full turn through `attachAcpSession` and
`detectAcpModels`, so the ACP transport contract for AMR is end-to-end
verified locally even before a real `vela` binary is installed.
Validated:
- pnpm guard
- pnpm typecheck (all workspace projects)
- pnpm --filter @open-design/daemon test (2881/2881)
Deferred: real OpenRouter-backed turn through a built `vela` binary —
the runtime def needs no changes for that path, only `VELA_RUNTIME_KEY`
and `VELA_LINK_URL` in env (or Settings).
* fix(runtimes/amr): pin a concrete default model and bare openai ids
End-to-end validation against a freshly-built `vela` (nexu-io/vela@main)
+ OpenRouter surfaced two contract details the first AMR runtime def
got wrong:
1. vela rejects `session/prompt` with `session/set_model must be called
before session/prompt`. attachAcpSession in apps/daemon/src/acp.ts
skips set_model whenever the picked model is the synthetic 'default'
id, so AMR's fallback list must NOT include DEFAULT_MODEL_OPTION. The
def now ships a concrete `gpt-5.4-mini` as both `fetchModels`'
default option and `fallbackModels[0]`, which makes attachAcpSession
always send a real `session/set_model` for AMR turns.
2. `vela --runtime opencode` auto-prepends `openai/` to whatever modelId
it forwards to opencode's openai provider. With OpenRouter-style ids
like `openai/gpt-5.4-mini`, opencode receives the double-prefixed
`openai/openai/gpt-5.4-mini` and replies `ProviderModelNotFoundError`.
The new fallback list ships the bare ids opencode's openai registry
actually knows about (gpt-5.4, gpt-5.4-mini, gpt-5.4-fast, etc.).
Stub + tests:
- tests/fixtures/fake-vela.mjs now enforces the set_model gate the same
way real vela does, so a regression that silently goes back to
model: 'default' would surface as a fatal error in tests instead of a
hidden production failure.
- tests/amr-acp-integration.test.ts pins both contracts: no 'default' /
no 'openai/' prefix in fallbackModels, and a negative case that
asserts session/prompt fails when no model is set.
Adds `apps/daemon/scripts/verify-amr-real-vela.mjs` — a small dev-time
runner that drives `attachAcpSession` against a real `vela` binary and
prints the daemon's chat events, so future protocol drift can be checked
against an actual OpenRouter call.
Verified locally: `vela agent run --runtime opencode` + OpenRouter
returns the prompted string ("AMR-E2E-PASS") through the full daemon
pipeline; daemon test suite stays 2883/2883.
* fix(runtimes/amr): substitute concrete model when chat run sends 'default'
A plugin-driven AMR run from the UI surfaced a real-world hole in the
prior commit:
json-rpc id 3: session/set_model must be called before session/prompt
The Default-design-router plugin (and any caller that doesn't pin a
real model) sends `model: 'default'` straight through, which the AMR
runtime def cannot accept — vela rejects `session/prompt` without
`session/set_model` and attachAcpSession skips set_model whenever
model === 'default'. Just leaving DEFAULT_MODEL_OPTION out of the
adapter's `fallbackModels` is not enough: the chat-run handler in
server.ts still forwarded 'default' verbatim.
This adds `resolveModelForAgent(def, resolved, env?)` as the
single source of truth for the substitution:
1. If the caller picked a real id, pass it through.
2. Else, if `def.defaultModelEnvVar` is set and the daemon process
env has a non-empty value for it, return that (operator escape
hatch — see below).
3. Else, if the def's `fallbackModels` does NOT contain a 'default'
id, return `fallbackModels[0].id`.
4. Else, return the original value (the historic shape — defs that
list 'default' themselves are untouched).
AMR sets `defaultModelEnvVar: 'VELA_DEFAULT_MODEL'`, so when
opencode's openai-provider registry deprecates `gpt-5.4-mini`
upstream, an operator can swap the fallback id without a code change
by exporting `VELA_DEFAULT_MODEL=gpt-5.5` before launching tools-dev
/ od. Worth noting the env var must live in the daemon's `process.env`
(Settings-UI per-agent env values only reach the spawned child, not
the daemon's resolver) — the new field's docblock spells this out.
Coverage:
- `tests/runtimes/resolve-model.test.ts` — 8 unit tests covering all
four resolver branches plus the env-override happy path / fallback /
ignore-when-user-picked-a-real-id case.
- `pnpm --filter @open-design/daemon typecheck` clean.
* chore(runtimes/amr): move AMR to the top of the base agent list
So `AMR (vela)` shows up first in the agent picker / status views,
ahead of claude / codex. Pure ordering change; no behavior delta.
* feat(amr): Sign-in / Sign-out button on the AMR Settings card
The first half of the AMR work assumed the operator would set
VELA_RUNTIME_KEY / VELA_LINK_URL on the daemon process and never
surfaced login state to users. This adds the missing UX so a fresh
install can drive the full path from Settings:
- GET /api/integrations/vela/status reads ~/.vela/config.json
for the active profile and returns { loggedIn, profile, user }
(without leaking the runtime/control keys themselves).
- POST /api/integrations/vela/login spawns `vela login` once
(409 if one is already in flight). The vela CLI opens the user's
browser to the device-authorization page itself — Open Design
only needs to kick the subprocess off.
- POST /api/integrations/vela/logout removes ~/.vela/config.json
so the next status read returns logged-out.
`AmrAgentCard` is a dedicated agent-card component for AMR because
the existing `<button>` row can't host an interactive sub-control
(nested interactive elements). It polls /status after a login click
until the daemon reports loggedIn=true (or 5 minutes elapse), and
exposes a Sign-out action on hover. Other adapters (claude, codex,
hermes, …) keep their existing `<button>` card.
i18n: 8 new keys (settings.amrLogin / Logout / LoggingIn / etc.)
added to en + zh-CN. Other locales spread `en` and inherit the
English copy until translations land.
Coverage:
- `tests/integrations/vela.test.ts` pins the config.json reader
against a tmp HOME — including the negative case where a profile
has user info but no runtimeKey (still logged-out), and the
secret-leak guard ("rt-secret-*" must not appear in the projection
payload).
- `tests/components/AmrAgentCard.test.tsx` covers all four UI
states (logged-out, logging-in, logged-in, logging-out) plus the
click-propagation invariant the divergent card was built to keep.
`pnpm --filter @open-design/daemon test` 2901 / 2901 passing.
`pnpm --filter @open-design/web test` 1719 / 1719 passing.
`pnpm typecheck` + `pnpm guard` clean.
Dev script side-effects: `apps/daemon/scripts/verify-amr-real-vela.mjs`
no longer requires both VELA_RUNTIME_KEY and VELA_LINK_URL — if
VELA_PROFILE is set, the vela CLI is allowed to resolve credentials
from `~/.vela/config.json`. Added the two AMR `.mjs` fixtures to
`scripts/guard.ts` allowlist with the executable-fixture / dev-runner
rationale.
* fix(connection-test): substitute model for AMR before attachAcpSession
The chat-run path in server.ts already routes the requested model through
`resolveModelForAgent` so AMR / vela (whose CLI demands an explicit
`session/set_model` before `session/prompt`) gets the def's first
concrete fallback id when the chat run ships `model: 'default'`.
`connectionTest.ts` was wiring `attachAcpSession({ ..., model: model ?? null })`
directly, which made the Test Connection button on the AMR Settings
card deadlock with the same `session/set_model must be called before
session/prompt` error the chat-run path already handles — surfaced as a
permanent "Testing connection…" spinner in the UI.
Reuse the same helper here so Test Connection mirrors chat-run behavior.
* test(amr): three-layer end-to-end coverage for the AMR login + turn flow
The PR up to this point shipped runtime + UI code with unit-level Vitest
coverage. This commit adds the cross-layer regression net the live demo
relied on:
1. apps/daemon/tests/integrations/vela.routes.test.ts (HTTP, Vitest)
Spins up the real daemon Express app via `startServer({port:0,...})`,
persists `agentCliEnv.amr.VELA_BIN = <fake>` into app-config.json,
and exercises every /api/integrations/vela/* endpoint against the
extended fake-vela stub:
- status reads ~/.vela/config.json under various states
- login spawns the fake, waits for config.json to appear, returns
pid + startedAt + profile
- 409 already-running guard with the stub's delay knob
- logout removes the file (idempotent)
- secrets (runtimeKey / controlKey) never leak in the projection
- login → status round-trip flips loggedIn=false → true
2. e2e/tests/amr/turn.test.ts (tools-dev orchestrated, Vitest)
Boots a namespaced daemon + web pair through `createSmokeSuite`,
inlines a self-contained fake `vela` binary that handles BOTH
`vela login` (writes ~/.vela/config.json) and
`vela agent run --runtime opencode` (ACP stdio with the
`session/set_model must precede session/prompt` gate the real binary
enforces), then drives a complete /api/runs lifecycle for
`agentId: 'amr', model: 'default'` and asserts the assistant message
captures the fake's streamed text. This is the test that would have
surfaced today's plugin-default-model regression (the `set_model
before prompt` error) at PR time instead of demo time.
3. e2e/ui/amr-login-pill.test.ts (Playwright)
Mocks /api/agents + /api/integrations/vela/{status,login,logout}
to drive the Settings AMR card through the full Sign in → Signed in
→ Sign out cycle. Pins the AmrLoginPill polling contract and the
aria-label semantics (the pill's accessible name is "Sign out" once
logged in, regardless of which label the hover-state text shows).
fake-vela.mjs extensions:
- Handles `vela login` argv by writing
~/.vela/config.json for the active VELA_PROFILE and exiting 0 —
mirrors real vela's on-disk side-effect without the device-auth
loop.
- FAKE_VELA_LOGIN_DELAY_MS knob so route tests can observe the
in-flight state of the spawn lifecycle.
- FAKE_VELA_LOGIN_USER_EMAIL / _USER_PLAN to assert the surfaced
user fields end-to-end.
Validated:
- `pnpm guard` + `pnpm typecheck` (all workspace projects)
- `pnpm --filter @open-design/daemon test`: 2998 / 2998 passing,
including the new 8-test integration suite.
- `cd e2e && pnpm test tests/amr`: 1 / 1 passing.
- `cd e2e && pnpm exec playwright test ui/amr-login-pill.test.ts`:
1 / 1 passing (6.7s).
* feat(amr): package native cli and refine login ui
* feat(amr): wire vela cli beta packaging
* docs(amr): document vela ci packaging review
* docs(amr): refine vela ci integration review
* fix(ci): refresh nix pnpm dependency hashes
* fix(pack): clean up Vela CLI packaging
* fix(pack): bundle Vela CLI support files
* fix(amr): recover login attempts from stale auth state
* test: expand AMR and automations coverage
* fix(amr): address review follow-ups
* test(web): align tasks fixtures with contracts
* fix(daemon): type wildcard route params
* fix(ci): refresh PR merge validation
* fix(amr): clear env credentials on logout
* feat(settings): inline local CLI model configuration
* fix(amr): recognize daemon env credentials
* [codex] Fix Vela companion packaging (#2979)
* Fix Vela companion packaging
* Update Nix pnpm dependency hashes
* [codex] Surface AMR account failures (#2980)
* fix: surface AMR account failures
* fix: cover AMR recovery error guidance
* chore: bump beta base version to 0.8.1 (#2990)
* Fix AMR profile and packaged runtime review issues
* Detect packaged AMR OpenCode companion tree
* feat(web): polish AMR frontend flows
* Polish AMR onboarding card
* fix: read AMR login state from dot-amr config (#3048)
* test: tighten AMR credential and packaging coverage
* test: restore AMR executable test env helper
* [codex] Fix packaged mac Dock identity and AMR label (#3076)
* Fix packaged mac sidecar Dock identity
* Rename AMR assistant label
* Fix AMR live models and dot-amr login state (#3073)
* fix: read AMR login state from dot-amr config
* fix: load live AMR models before runs
* fix: point AMR onboarding link to production wallet
* fix: address AMR model review feedback
* fix: persist live AMR model fallback
* [codex] Fix AMR link catalog model ids (#3088)
* Fix packaged mac sidecar Dock identity
* Rename AMR assistant label
* Fix AMR link catalog model ids
* Fix AMR model normalization typecheck
* Use live AMR model for default runs
* fix: polish AMR runtime settings UI
* Accelerate AMR startup defaults (#3092)
* Surface AMR insufficient balance wallet URL (#3099)
* fix(web): polish onboarding controls (#3112)
* fix(web): show CLI scan loading state
* Avoid duplicate AMR wallet recharge links (#3117)
* Avoid duplicate AMR wallet recharge links
* Use Vela CLI 0.0.3 test package
* chore(nix): refresh pnpm deps hash
* Fix AMR wallet guidance display
---------
Co-authored-by: open-design-bot[bot] <282769551+open-design-bot[bot]@users.noreply.github.com>
* chore(pack): pin Vela CLI 0.0.3-test.1 (#3127)
* chore(nix): refresh pnpm deps hash
* chore(pack): pin Vela CLI 0.0.3
* chore(nix): refresh pnpm deps hash
* fix(web): suppress AMR exit 130 fallback (#3136)
* feat(web): nudge users to hosted AMR on model/auth/quota failures (#3083)
* feat(web): nudge users to hosted AMR on model/auth/quota failures
When a non-AMR agent run fails with an auth / quota / upstream model
error, surface an inline nudge under the error pill linking to Open
Design's hosted AMR gateway (https://open-design.ai/amr). The nudge
fires `surface_view` (element=run_failed_toast) on impression and
`ui_click` (element=go_amr) on the link.
Also teach the daemon to classify CLI-agent auth/quota/upstream failures
(Claude Code, codex, ...) into specific API error codes
(AGENT_AUTH_REQUIRED / RATE_LIMITED / UPSTREAM_UNAVAILABLE) instead of
the generic AGENT_EXECUTION_FAILED, so both the error message and the
nudge key off accurate codes. AMR's own runs are excluded from the
nudge — they keep the dedicated sign-in / recharge affordances.
* feat(web): rework failed-run AMR guidance into per-case error UI
Replace the single inline nudge with a per-case failed-run experience
driven by the run's error code + agent:
- The error card is now neutral gray (was red) and always carries a
retry button; it is driven by the persisted per-message error event so
it survives a reload.
- Non-AMR agent hitting a model/auth/quota wall: a theme-color promotion
card under the error card offers "switch to AMR & retry" — switches the
run to AMR, opens Settings on the AMR card, and auto-retries once the
account signs in (ProjectView polls vela login status, independent of
the Settings pill lifecycle, with success / 5-min-timeout / unmount
exits).
- AMR agent unauthorized: clearer copy + an "authorize & retry" button.
- AMR agent out of balance: clearer copy + a "top up" button to the AMR
wallet, with manual retry.
- Settings AMR card: when opened from the nudge, it scrolls into view and
pulses, and an authorize-button coachmark (a fake hand cursor that
rises in and dismisses on hover) points at the sign-in control when not
yet authorized.
analytics: surface_view (run_failed_toast) on the promotion card and
ui_click (go_amr) on its action are retained. i18n adds chat.amrCard.*
and chat.amrError.* (en / zh-CN / zh-TW translated; other locales fall
back to en) and drops the old chat.amrErrorGuidance keys.
* fix(daemon): require status context for numeric service-failure codes
Per review on #3083: the model-service classifier matched bare HTTP
status numbers (`500`, `502`, `429`, `401`), so ordinary CLI output like
`line 500`, `read 502 bytes`, or `exit code 401` could be misclassified
as a provider outage / auth wall and wrongly surface the AMR nudge. Now
a status number only counts when it carries explicit context (`HTTP 500`,
`status 503`, `code: 401`, `502 Bad Gateway`); textual provider phrases
(overloaded, bad gateway, service unavailable, rate limit, …) are
unchanged. Adds fixtures proving unrelated numeric output stays null.
* fix(web): keep error pill for failed runs ChatPane's card doesn't cover
Per review on #3083: the per-message gray error pill was suppressed for
every persisted error status event, but ChatPane only renders the
replacement top-level error card for `retryableAssistantMessage` (the
last failed assistant). So a failed turn that is no longer last (after a
follow-up) or an older failed run in history showed neither the pill nor
the card — its error detail vanished, undercutting reload/history
survival. ChatPane now passes `errorCardOwnerId` (the assistant id whose
error the card represents); AssistantMessage suppresses only that one
pill and keeps rendering StatusPill for all other error events.
* fix(daemon): don't treat a process exit code as an HTTP status
Follow-up to review on #3083: the status-context helper accepted a bare
`code` prefix, so `exit code 401` / `process exited with code 429` still
matched and got classified as AGENT_AUTH_REQUIRED / RATE_LIMITED (the
very `exit code 401` case the comment calls out as noise). `code` now
only counts when qualified (`status code` / `error code` / `response
code`) or punctuation-bound (`code: 401`); bare `exit code N` no longer
matches. Adds fixtures for exit-code lines returning null.
* chore(web): translate AMR card / error keys for 16 remaining locales
PR #3083 added 10 new `chat.amrCard.*` / `chat.amrError.*` keys but only
provided en/zh-CN/zh-TW translations; the other 16 locales fell back to
English. Translate the card title/body, three chips, primary CTA, and
the AMR self-error (auth / balance) messages and buttons for ar, de,
es-ES, fa, fr, hu, id, it, ja, ko, pl, pt-BR, ru, th, tr, uk.
* fix(amr): address review feedback on #2355
Targeted fixes for the unresolved review threads on #2355. Each fix
includes / updates a focused test.
- runtimes/executables.ts: `packagedVelaOpenCodeCompanionTree` now
verifies the inner `opencode` executable exists + is runnable, not
just the directory. This closes the false-positive availability path
that let `detectAgents()` surface AMR as available even when the
packaged companion was empty / partially copied (mrcfps, 4 threads).
- runtimes/executables.ts: `resolveAmrOpenCodeExecutable` now prefers
the bundled `<OD_RESOURCE_ROOT>/bin/libexec/opencode/opencode` over a
stale `opencode` on the user's PATH, so packaged AMR builds can't be
hijacked by a global installation.
- web/EntryShell.tsx: when the Local CLI scan returns an available
agent and the previously-selected agent is AMR, switch the selection
to the first available local agent so the runtime and persisted
agent agree before Continue.
- server.ts (model-probe branch): for AMR, check `readVelaLoginStatus`
BEFORE rejecting on an empty live-model catalog — a signed-out user
was getting `AMR_MODEL_UNAVAILABLE` ("choose a model") instead of
the correct `AMR_AUTH_REQUIRED` (sign-in affordance).
- server.ts (default model fallback): if the user asked for the AMR
agent default and the cached id is no longer in the FRESH catalog,
fall back to `liveModels[0]` from the probe instead of rejecting the
run as `AMR_MODEL_UNAVAILABLE`.
- integrations/vela.ts: route `vela login` through
`createCommandInvocation` so an npm/Node-style `vela.cmd` / `.bat`
shim on Windows gets the correct `cmd.exe /d /s /c …` wrapping with
verbatim args (matches `execAgentFile` / chat-run spawning).
- tools/pack/src/linux.ts: in containerized Linux builds, bind-mount
the host directory of `OPEN_DESIGN_VELA_CLI_BIN` and rewrite the env
to the container-side path. The host path was being passed in as-is
even though the default container only mounts /project, /tools-pack
and cache/home — `copyOptionalVelaCliBinary` saw a missing path.
Deferred (out of scope for this PR):
- `od amr status/login/logout/cancel` CLI subcommands (AGENTS.md
UI/CLI dual-track rule, server.ts:5763) — sizable surface; tracked
for a separate focused PR.
- Strict `--require-vela-cli` for Windows + mac-x64 beta builds:
prematurely blocked — `@powerformer/vela-cli` only publishes the
`darwin-arm64` platform binary today; adding the flag elsewhere
would fail the builds. Revisit once win/x64/linux binaries ship.
* fix(amr): hoist sendAmrAccountFailure above the AMR catalog preflight (TDZ)
The new signed-out AMR branch in the catalog preflight at server.ts:10875
calls `sendAmrAccountFailure(...)` to emit AMR_AUTH_REQUIRED, but the
const declaration sat ~100 lines below at the outer function scope. Because
`const` is TDZ-aware, that branch would have thrown `ReferenceError:
Cannot access 'sendAmrAccountFailure' before initialization` for the
exact users it tries to help — defeating the original intent.
Hoist the helper to just above the AMR preflight block so it's available
to every AMR code path in this function. Behavior elsewhere is unchanged.
Also rerun the daemon test suite: `launch.test.ts > resolveAgentLaunch
uses packaged built-in Vela for AMR` was creating the
`<resourceRoot>/bin/libexec/opencode/` companion *directory* only, but
this PR's earlier tightening of `packagedVelaOpenCodeCompanionTree`
also requires the inner `opencode` executable. Add it to that fixture
to match the new contract; the test was a sibling of the executables /
env-and-detection fixtures already updated in 13fc4f4.
Addresses #2355 review (mrcfps, 2026-05-28).
* feat(web): add hover cancel for AMR login (#3158)
* feat(web): add hover cancel for AMR login
* fix(web): don't bounce AmrLoginPill back to 'Signing in…' after local cancel
Both codex-connector (P2) and looper (CHANGES_REQUESTED) on this PR
flagged the same race in the new local-cancel path: `handleCancelLogin`
dispatches `notifyAmrLoginStatusChanged('login-canceled')` immediately
after `/login/cancel` returns, but the `AMR_LOGIN_STATUS_EVENT` listener
unconditionally re-enters `refresh()` and then restarts polling
whenever `/api/integrations/vela/status` still reports
`loginInFlight: true`.
That is a real race because the daemon's `cancelVelaLogin()` only sends
SIGTERM (escalating to SIGKILL after `LOGIN_CANCEL_KILL_GRACE_MS` =
2000 ms) and keeps the child in `activeLoginProcs` until it actually
exits — so the first `/status` read after a successful cancel can
legally still come back as in-flight. Under that window the pill flips
back to 'Signing in…' and can later surface the timeout/error path even
though the user already canceled, defeating the behavior promised in
the PR description.
Fix the listener instead of every dispatch site: in the
`login-canceled` branch, after the local reset (stopPolling +
setPending(null) + clear refs), optimistically mark every subscribed
pill instance as not-in-flight (`setStatus((c) => c ? { ...c,
loginInFlight: false } : c)`) and `return` — skip the
refresh-and-reconcile branch below entirely. The next explicit refresh
(component mount, user interaction, or a `status-changed` event) will
pick up the daemon's confirmed state once the child has actually
exited.
Add a focused regression test that holds `/api/integrations/vela/status`
at `loginInFlight: true` even after a successful `/login/cancel`,
asserting that the pill stays at the Canceled → Authorize sequence and
never bounces back to 'Signing in…'. This test fails on the pre-fix
listener and passes on the new behavior; existing
'cancels an in-flight AMR sign-in…' and 'reconciles late AMR browser
completion to Signed in after local cancel' tests continue to pass.
Addresses review feedback on #3158 (chatgpt-codex-connector, nettee).
---------
Co-authored-by: lefarcen <935902669@qq.com>
---------
Co-authored-by: a1chzt <chizblank@gmail.com>
Co-authored-by: Amy <1184569493@qq.com>
Co-authored-by: Mason <jinmeihong0201@gmail.com>
Co-authored-by: Caprika <56862773+alchemistklk@users.noreply.github.com>
Co-authored-by: open-design-bot[bot] <282769551+open-design-bot[bot]@users.noreply.github.com>
2042 lines
111 KiB
TypeScript
2042 lines
111 KiB
TypeScript
import type { Dict } from '../types';
|
||
import { en } from './en';
|
||
|
||
export const zhTW: Dict = {
|
||
...en,
|
||
'chat.amrCard.switchTitle': "模型呼叫失敗,目前任務已暫停",
|
||
'chat.amrCard.switchBody': "可切換到 Open Design 官方 AMR 模型服務,無需設定 API Key。完成登入、授權與儲值後,將自動重試目前任務。",
|
||
'chat.amrCard.chipOfficial': "官方代管",
|
||
'chat.amrCard.chipNoKey': "無需 API Key",
|
||
'chat.amrCard.chipAutoRetry': "授權後自動重試",
|
||
'chat.amrCard.switchCta': "切換到 AMR 並重試",
|
||
'chat.amrError.authMessage': "AMR 帳號尚未授權。完成授權後將自動重試目前任務。",
|
||
'chat.amrError.balanceMessage': "AMR 帳戶餘額不足。儲值後即可繼續執行目前任務。",
|
||
'chat.amrError.authorizeCta': "授權並重試",
|
||
'chat.amrError.rechargeCta': "前往儲值",
|
||
'plugins.actions.copyInstallCommand': '複製安裝命令',
|
||
'plugins.actions.copyPluginId': '複製外掛 ID',
|
||
'plugins.actions.copyReadmeBadge': '複製 README 徽章',
|
||
'plugins.actions.openSourceGithub': '在 GitHub 開啟原始碼',
|
||
'plugins.actions.openSource': '開啟原始碼',
|
||
'plugins.actions.openHomepage': '開啟專案首頁',
|
||
'plugins.actions.openMarketplace': '在外掛市場開啟',
|
||
'workingDirPicker.title': "目錄",
|
||
'workingDirPicker.homeTitle': "選擇專案要放在哪個目錄下",
|
||
'workingDirPicker.processing': "處理中…",
|
||
'workingDirPicker.select': "選擇工作目錄",
|
||
'workingDirPicker.clearAria': "清除工作目錄",
|
||
'workingDirPicker.replaceFailed': "替換工作目錄失敗",
|
||
'workingDirPicker.unavailable': "未選擇目錄 — 啟動桌面版以使用原生選擇器",
|
||
'workingDirPicker.openUnavailable': "請在桌面版中開啟此專案以顯示資料夾。",
|
||
'workingDirPicker.openFailed': "無法顯示此資料夾",
|
||
'workingDirPicker.showInFileManager': "在檔案管理器中顯示",
|
||
'workingDirPicker.replace': "清空並替換目錄…",
|
||
'workingDirPicker.recent': "最近使用的目錄",
|
||
'handoff.toTarget': '交付給 {target}',
|
||
'handoff.openInTarget': '在 {target} 中開啟',
|
||
'handoff.openAction': '開啟',
|
||
'handoff.menuTitle': '在哪個編輯器中開啟?',
|
||
'handoff.action': '交付',
|
||
'handoff.fallbackTitle': '未找到編輯器 - 使用 {target} 開啟',
|
||
'handoff.chooseTargetAria': '選擇交付目標',
|
||
'handoff.notInstalled': '未安裝',
|
||
'handoff.notDetectedTitle': '{target} - 未在 $PATH 中偵測到',
|
||
'homeHero.promptExamples': "範例提示詞",
|
||
'homeHero.footer.designSystem': "風格",
|
||
'homeHero.footer.autoDesignSystem': "自動",
|
||
'homeHero.footer.autoDesignSystemSummary': "根據目前 Prompt 自動匹配合適的設計系統與視覺風格。",
|
||
'homeHero.footer.ratio': "比例",
|
||
'homeHero.footer.duration': "時長",
|
||
'homeHero.footer.resolution': "解析度",
|
||
'homeHero.footer.speakerNotes': "备注",
|
||
'homeHero.footer.noSpeakerNotes': "無備忘稿",
|
||
'homeHero.footer.availableCount': "{n} 个可用",
|
||
'homeHero.footer.noMatches': "无匹配结果",
|
||
'homeHero.moreShortcuts': "更多",
|
||
'common.cancel': '取消',
|
||
'common.save': '儲存',
|
||
'common.close': '關閉',
|
||
'common.delete': '刪除',
|
||
'common.rename': '重新命名',
|
||
'common.edit': '編輯',
|
||
'common.preview': '預覽',
|
||
'common.share': '分享',
|
||
'common.search': '搜尋',
|
||
'common.searchEllipsis': '搜尋…',
|
||
'common.loading': '載入中…',
|
||
'common.all': '全部',
|
||
'common.none': '無',
|
||
'common.default': '預設',
|
||
'common.installed': '已安裝',
|
||
'common.notInstalled': '未安裝',
|
||
'common.active': '使用中',
|
||
'common.offline': '未執行',
|
||
'common.selected': '已選',
|
||
'common.create': '建立',
|
||
'common.openPreview': '開啟預覽',
|
||
'common.exitFullscreen': '離開全螢幕',
|
||
'common.fullscreen': '全螢幕',
|
||
'common.openInNewTab': '在新分頁中開啟',
|
||
'common.exportPdf': '匯出為 PDF',
|
||
'common.exportZip': '下載為 .zip',
|
||
'common.exportHtml': '匯出為獨立 HTML',
|
||
'common.justNow': '剛剛',
|
||
'common.minutesAgo': '{n} 分鐘前',
|
||
'common.hoursAgo': '{n} 小時前',
|
||
'common.daysAgo': '{n} 天前',
|
||
'common.weeksAgo': '{n}w ago',
|
||
'common.now': '剛剛',
|
||
'common.minutesShort': '{n}分',
|
||
'common.hoursShort': '{n}時',
|
||
'common.daysShort': '{n}天',
|
||
'common.untitled': '未命名',
|
||
|
||
'app.brand': 'Open Design',
|
||
'app.brandPill': '研究預覽版',
|
||
'app.brandSubtitle': '由 Nexu Labs 出品',
|
||
'app.welcomeLoading': '正在載入工作區…',
|
||
|
||
'settings.welcomeKicker': "",
|
||
'settings.welcomeTitle': "歡迎",
|
||
'settings.welcomeSubtitle': "",
|
||
'settings.onboardingCreateTitle': '從一句需求開始',
|
||
'settings.onboardingCreateBody':
|
||
'描述你想做的網站、應用、Deck、圖片或影片,Open Design 會建立專案,並保留可繼續編輯的產出。',
|
||
'settings.onboardingMemoryTitle': '保存工作上下文',
|
||
'settings.onboardingMemoryBody':
|
||
'把偏好、專案事實和長期規則寫入 Memory,後續對話會自動帶上正確背景。',
|
||
'settings.onboardingSystemsTitle': '接入你的設計系統',
|
||
'settings.onboardingSystemsBody':
|
||
'選擇或建立品牌系統,讓生成結果跟隨真實的顏色、字體和產品語言。',
|
||
'settings.onboardingExecutionTitle': '選擇生成方式',
|
||
'settings.onboardingExecutionBody':
|
||
'官方 CLI,一鍵配置、開箱即用。一個 Key 自由選擇海量模型,價格更優惠。',
|
||
'settings.onboardingAmrCloudBenefitOfficial': '官方維護',
|
||
'settings.onboardingAmrCloudBenefitReady': '開箱即用',
|
||
'settings.onboardingAmrCloudBenefitModels': '海量模型可選',
|
||
'settings.onboardingAmrCloudBenefitPricing': '價格優惠',
|
||
'settings.onboardingAmrCloudAuthorizeAction': '授權使用',
|
||
'settings.onboardingAmrCloudAuthorizedAction': '已授權',
|
||
'settings.onboardingStepConnect': "連接",
|
||
'settings.onboardingStepDesignSystem': "設計系統",
|
||
'settings.onboardingStepProfile': "關於你",
|
||
'settings.onboardingConnectTitle': "選擇執行方式",
|
||
'settings.onboardingConnectBody': "",
|
||
'settings.onboardingRecommended': "推荐",
|
||
'settings.onboardingAmrCloudOfficialBadge': "官方",
|
||
'settings.onboardingLocalTitle': "本地 Coding Agent",
|
||
'settings.onboardingLocalBody': "使用已安裝的 CLI,如 Claude Code、Codex、Cursor、Gemini 或 OpenCode。",
|
||
'settings.onboardingLocalAction': "開啟 CLI 設定",
|
||
'settings.onboardingCliScanHint': "通常 5 到 10 秒內完成掃描。",
|
||
'settings.onboardingByokTitle': "自己的模型 Key",
|
||
'settings.onboardingByokBody': "使用你自己的模型服務憑證。",
|
||
'settings.onboardingByokAction': "開啟 BYOK 設定",
|
||
'settings.onboardingDesignTitle': "設計系統",
|
||
'settings.onboardingDesignBody': "生成一次,後續複用。",
|
||
'settings.onboardingDesignIntroGenerateTitle': "用既有內容生成",
|
||
'settings.onboardingDesignIntroGenerateBody': "從 GitHub、本地程式碼倉庫、Figma 檔案,或現成圖片等內容資產中上傳你的設計系統。",
|
||
'settings.onboardingDesignIntroReuseTitle': "後續產物直接複用",
|
||
'settings.onboardingDesignIntroReuseBody': "後續生成原型、Slide 和其他內容時,都可以參考現有的字體、間距、Logo 樣式、色調等。",
|
||
'settings.onboardingDesignIntroSkipTitle': "也可以先跳過",
|
||
'settings.onboardingDesignIntroSkipBody': "現在不想生成也沒關係,可以直接進入產品。",
|
||
'settings.onboardingGithubTitle': "從 GitHub 匯入",
|
||
'settings.onboardingGithubBody': "使用前端倉庫。",
|
||
'settings.onboardingUploadTitle': "上傳本地檔案",
|
||
'settings.onboardingUploadBody': "添加專案文件、截圖、CSS、文件或素材。",
|
||
'settings.onboardingPromptTitle': "用一句話生成",
|
||
'settings.onboardingPromptBody': "描述產品或品牌。",
|
||
'settings.onboardingProfileTitle': "關於你",
|
||
'settings.onboardingProfileBody': "可選資訊,用於優化預設配置。",
|
||
'settings.onboardingRoleLabel': "你的身份",
|
||
'settings.onboardingOrgSizeLabel': "組織規模",
|
||
'settings.onboardingUseCaseLabel': "使用場景",
|
||
'settings.onboardingSourceLabel': "從哪裡聽說的",
|
||
'settings.onboardingSelectPlaceholder': "請選擇",
|
||
'settings.onboardingSelectMultiplePlaceholder': "可選擇多個",
|
||
'settings.onboardingOrgSolo': "個人使用(1 人)",
|
||
'settings.onboardingOrgTeam': "小團隊(2-10 人)",
|
||
'settings.onboardingOrgStartup': "新創 / 中小企業(11-50 人)",
|
||
'settings.onboardingOrgGrowth': "成長期公司(51-200 人)",
|
||
'settings.onboardingOrgMidMarket': "中大型公司(201-1000 人)",
|
||
'settings.onboardingOrgEnterprise': "大型企業(1000+ 人)",
|
||
'settings.onboardingRolePm': "📋 產品經理",
|
||
'settings.onboardingRoleDesigner': "🎨 設計師",
|
||
'settings.onboardingRoleEngineer': "💻 研發",
|
||
'settings.onboardingRoleMarketing': "📣 行銷",
|
||
'settings.onboardingRoleGrowth': "📈 增長",
|
||
'settings.onboardingRoleOps': "⚙️ 營運",
|
||
'settings.onboardingRoleFounder': "🚀 創辦人 / 管理者",
|
||
'settings.onboardingRoleStudent': "🎓 學生 / 教育者",
|
||
'settings.onboardingRoleOther': "✨ 其他",
|
||
'settings.onboardingUseProduct': "🎨 產品設計",
|
||
'settings.onboardingUseDesignSystem': "🧩 設計系統",
|
||
'settings.onboardingUsePrototype': "📱 原型 / 應用介面",
|
||
'settings.onboardingUseLanding': "🌐 落地頁",
|
||
'settings.onboardingUseAds': "📣 廣告 / 社群內容",
|
||
'settings.onboardingUseDashboard': "📊 儀表板 / 內部工具",
|
||
'settings.onboardingUseDeck': "🖥️ 簡報 / 提案",
|
||
'settings.onboardingUseMarketing': "📈 行銷 / 成長",
|
||
'settings.onboardingUseEngineering': "🤝 工程交付",
|
||
'settings.onboardingUseAgency': "💼 代理商 / 客戶專案",
|
||
'settings.onboardingSourceGithub': "🐙 GitHub",
|
||
'settings.onboardingSourceFriend': "👥 朋友或同事",
|
||
'settings.onboardingSourceSocial': "📱 社交媒體",
|
||
'settings.onboardingSourceProductHunt': "🅿️ Product Hunt",
|
||
'settings.onboardingSourceCommunity': "💬 設計 / AI 社群",
|
||
'settings.onboardingSourceYoutube': "▶️ YouTube",
|
||
'settings.onboardingSourceBlog': "📰 部落格或 Newsletter",
|
||
'settings.onboardingSourceAiTool': "✨ AI 工具推薦",
|
||
'settings.onboardingSourceSearch': "🔍 搜尋",
|
||
'settings.onboardingSourceEvent': "🎤 活動或社群",
|
||
'settings.onboardingBack': "上一步",
|
||
'settings.onboardingContinue': "继续",
|
||
'settings.onboardingFinish': "完成設定",
|
||
'settings.onboardingSkip': "先跳過",
|
||
'settings.kicker': '設定',
|
||
'settings.title': '執行模式',
|
||
'settings.subtitle': '在本機 CLI 與 BYOK 之間選擇。',
|
||
'settings.modeAria': '執行模式',
|
||
'settings.protocolAria': 'API 協定',
|
||
'settings.modeDaemon': '本機 CLI',
|
||
'settings.modeDaemonHelp': '透過本機的程式碼代理 CLI 執行',
|
||
'settings.modeDaemonOffline': '背景守護程序未執行',
|
||
'settings.modeDaemonOfflineMeta': '守護程序未執行',
|
||
'settings.modeDaemonInstalledMeta': '已安裝 {count} 個',
|
||
'settings.modeApi': 'API 提供方',
|
||
'settings.modeApiMeta': 'BYOK',
|
||
'settings.codeAgent': '程式碼代理',
|
||
'settings.codeAgentHint': '選擇用來執行提示詞的 CLI。',
|
||
'settings.rescan': '↻ 重新掃描',
|
||
'settings.rescanTitle': '重新掃描 PATH',
|
||
'settings.rescanRunning': '掃描中...',
|
||
'settings.rescanSuccess': '掃描完成,{count} 個可用。',
|
||
'settings.designSystemRenameFailed': '重新命名失敗,請檢查背景守護程序後重試。',
|
||
'settings.rescanFailed': '掃描失敗,請檢查背景守護程序後重試。',
|
||
'settings.test': '測試',
|
||
'settings.testTitle': '傳送極小的測試提示以驗證連線',
|
||
'settings.testRunning': '正在測試連線…',
|
||
'settings.testCancel': '取消',
|
||
'settings.testSuccessApi': '已連線。{ms} 毫秒回應 — \'{sample}\'',
|
||
'settings.testSuccessCli': '{agentName} 在 {ms} 毫秒內回應 — \'{sample}\'',
|
||
'settings.testAuthFailed': '驗證失敗,請檢查 API 金鑰。',
|
||
'settings.testForbidden': '存取被拒絕,請確認帳戶、地區或組織。',
|
||
'settings.testNotFoundModel': '此端點找不到模型 \'{model}\'。',
|
||
'settings.testInvalidModelId': '模型 ID \'{model}\' 格式無效。自訂 ID 必須以字母或數字開頭,且不能包含空格。',
|
||
'settings.testInvalidBaseUrl': 'Base URL 無效或無法連線。',
|
||
'settings.testRateLimited': '供應商對測試進行了限流,設定看起來有效。',
|
||
'settings.testUpstream': '供應商回傳 {status},請稍後再試。',
|
||
'settings.testTimeout': '測試在 {ms} 毫秒後逾時。',
|
||
'settings.testAgentMissing': '{agentName} 未安裝,或不在 PATH 中。',
|
||
'settings.testAgentSpawn': '無法啟動 {agentName}:{detail}。',
|
||
'settings.testUnknown': '測試失敗:{detail}',
|
||
'settings.agentInstall.install': '安裝',
|
||
'settings.agentInstall.docs': '文件',
|
||
'settings.agentInstall.pathHint':
|
||
'如果你透過 npm 或 Homebrew 安裝了 CLI,但仍顯示為未安裝,請確認該工具的 bin 目錄已加入 Open Design daemon 繼承的 PATH(在 macOS 上,Terminal 與 GUI 應用的 PATH 可能不同)。請參閱 QUICKSTART.md(「Local agent CLI and PATH」章節)。',
|
||
'settings.agentInstall.stepOpenLinks': '在目標代理卡片上開啟「安裝」或「文件」連結。',
|
||
'settings.agentInstall.stepAuth':
|
||
'返回 Open Design 前,請先在對應 CLI 完成驗證(登入或新增 API 憑證)。',
|
||
'settings.agentInstall.stepRescan': '在此區域點擊「重新掃描」。',
|
||
'settings.agentInstall.stepSelect': '當代理顯示為已安裝後,選擇該代理卡片。',
|
||
'settings.noAgentsDetected':
|
||
'尚未偵測到任何代理。請安裝 Claude Code、Codex、Gemini CLI、OpenCode、Cursor Agent 或 Qwen 其中之一,然後點擊「重新掃描」。',
|
||
'settings.agentInstalledGroup': '你的 CLI({count})',
|
||
'settings.agentInstallGroup': '可安裝({count})',
|
||
'settings.agentAuthRequired': '需要認證',
|
||
'settings.agentAuthUnknown': '認證狀態未知',
|
||
'settings.amrLogin': '登入',
|
||
'settings.amrLogout': '登出',
|
||
'settings.amrLoggingIn': '登入中…',
|
||
'settings.amrLoggingOut': '登出中…',
|
||
'settings.amrLoggedInAs': '已登入 {email}',
|
||
'settings.amrLoggedInWithPlan': '已登入 {email} · {plan}',
|
||
'settings.amrLoggedInPill': '已登入',
|
||
'settings.amrNotLoggedIn': '未授權',
|
||
'settings.amrCloud': 'Open Design AMR',
|
||
'settings.amrAuthorize': '授權',
|
||
'settings.amrBenefitOfficial': '官方維護',
|
||
'settings.amrBenefitLowerPrice': '價格更低',
|
||
'settings.amrBenefitManyModels': '海量模型',
|
||
'settings.amrPromoBonus': '限時儲值贈 100%',
|
||
'settings.amrSignInToContinue': '授權後繼續',
|
||
'settings.amrSignIn': '登入',
|
||
'settings.amrSignedIn': '已登入',
|
||
'settings.amrNotSignedIn': '未授權',
|
||
'settings.amrSigningIn': '登入中…',
|
||
'settings.amrCancelSignIn': '取消登入',
|
||
'settings.amrAccountStatus': 'AMR 帳戶狀態',
|
||
'settings.amrLoginErrorCompact': 'AMR 登入失敗。',
|
||
'settings.apiSection': 'API 設定',
|
||
'settings.quickFillProvider': '快速填入提供方',
|
||
'settings.customProvider': '自訂提供方',
|
||
'settings.apiKey': 'API Key',
|
||
'settings.showKey': '顯示 Key',
|
||
'settings.hideKey': '隱藏 Key',
|
||
'settings.show': '顯示',
|
||
'settings.hide': '隱藏',
|
||
'settings.model': '模型',
|
||
'settings.suggestedModelsHint':
|
||
'這些是此協定的建議模型。你的提供方可能支援不同的模型。',
|
||
'settings.baseUrl': 'Base URL',
|
||
'settings.baseUrlInvalid': '請輸入有效的公網 http:// 或 https:// URL。允許 localhost;會阻止私有網路 IP。',
|
||
'settings.baseUrlCustomize': '自訂',
|
||
'settings.baseUrlDefaultHint': '預設端點,通常不需要修改。',
|
||
'settings.azureBaseUrlPlaceholder': 'https://my-resource.openai.azure.com',
|
||
'settings.azureBaseUrlHint': 'Find this in Azure portal → your resource → Endpoint.',
|
||
'settings.azureDeploymentModel': '部署名稱',
|
||
'settings.azureDeploymentModelHint':
|
||
'對於 Azure OpenAI,此欄位會作為 /openai/deployments/<model> 中的部署名稱使用。請填入你在 Azure 中建立的部署名稱。',
|
||
'settings.apiVersion': 'API 版本',
|
||
'settings.byokImageModel': '圖片生成模型',
|
||
'settings.maxTokens': '最大 tokens(可選)',
|
||
'settings.maxTokensHint':
|
||
'回應長度上限。每個 model 有調過的預設值(在 placeholder 顯示),留空即使用,輸入數字則覆蓋。',
|
||
'settings.apiHint': '請求會透過本機 daemon 代理送到你設定的 Base URL。Key 只儲存在目前瀏覽器中,並隨提供方請求送出。',
|
||
'settings.skipForNow': '暫時跳過',
|
||
'settings.getStarted': '開始使用',
|
||
'settings.envConfigure': '執行模式',
|
||
'settings.localCli': '本機 CLI',
|
||
'settings.anthropicApi': 'Anthropic API',
|
||
'settings.noAgentSelected': '尚未選擇代理',
|
||
'settings.language': '介面語言',
|
||
'settings.languageHint': '切換介面語言,設定僅儲存在當前瀏覽器。',
|
||
'settings.appearance': '外觀',
|
||
'settings.appearanceHint': '選擇淺色、深色或跟隨系統設定。',
|
||
'settings.themeSystem': '系統',
|
||
'settings.themeLight': '淺色',
|
||
'settings.themeDark': '深色',
|
||
'settings.agentModelHead': '模型:',
|
||
'settings.modelPicker': '模型',
|
||
'settings.modelSourceLive': '來自 CLI 的即時列表',
|
||
'settings.modelSourceFallback': '內建列表',
|
||
'settings.reasoningPicker': '推理強度',
|
||
'settings.modelPickerHint':
|
||
'當 CLI 提供 `models` 命令時會自動拉取。選擇「預設」則沿用 CLI 自身的設定;選擇「自訂」可手動輸入任何 CLI 支援的模型 id。',
|
||
'settings.modelPickerLiveHint':
|
||
'模型列表來自這個 CLI;選「預設」會沿用 CLI 自己的設定。',
|
||
'settings.modelPickerFallbackHint':
|
||
'正在顯示內建預設值。點擊「重新掃描」可從 CLI 拉取即時模型。',
|
||
'settings.cliEnvTitle': 'CLI 設定位置',
|
||
'settings.cliEnvHint':
|
||
'為打包版應用執行和 agent 偵測設定非敏感設定目錄。',
|
||
'settings.cliEnvClaudeConfigDir': 'Claude Code 設定目錄',
|
||
'settings.cliEnvClaudeBaseUrl': 'Claude proxy base URL',
|
||
'settings.cliEnvClaudeApiKey': 'Claude proxy API key',
|
||
'settings.cliEnvCodexHome': 'Codex home',
|
||
'settings.cliEnvCodexBin': 'Codex 可執行檔路徑',
|
||
'settings.cliEnvCodexBaseUrl': 'Codex/OpenAI proxy base URL',
|
||
'settings.cliEnvCodexApiKey': 'Codex/OpenAI proxy API key',
|
||
'settings.modelCustom': '自訂(在下方填寫)…',
|
||
'settings.modelCustomLabel': '自訂模型 id',
|
||
'settings.modelCustomPlaceholder': '例如 anthropic/claude-sonnet-4-6',
|
||
'settings.mediaProviders': '媒體生成提供商',
|
||
'settings.mediaProvidersHint': '圖片、影片、音訊生成的 API key。存於本機並同步到本地守護程序。',
|
||
'settings.mcpServerTitle': 'MCP 伺服器',
|
||
'settings.mcpServerHint': '將 Open Design 作為 MCP 伺服器暴露給你的編碼代理。',
|
||
'settings.externalMcpTitle': '外部 MCP',
|
||
'settings.externalMcpHint': '接入外部服務的 MCP 工具(Higgsfield、GitHub 等)。',
|
||
'settings.mediaProviderApiKey': 'API key',
|
||
'settings.mediaProviderBaseUrl': 'Base URL',
|
||
'settings.mediaProviderConfigured': '已設定',
|
||
'settings.mediaProviderUnset': '未設定',
|
||
'settings.mediaProviderClear': '清除',
|
||
'settings.mediaProviderClearConfirm': '清除已儲存的 {name} 設定?您需要再次輸入才能使用 {name}。',
|
||
'settings.mediaProviderPlaceholder': '貼上 API key',
|
||
'settings.mediaProviderBaseUrlPlaceholder': '覆蓋預設 Base URL',
|
||
'settings.mediaProviderReload': '從本機守護程序重新載入',
|
||
'settings.mediaProviderReloadError': '無法從本機守護程序重新載入媒體供應商設定。',
|
||
'settings.mediaProviderReloadSuccess': '已從本機守護程序重新載入媒體供應商設定。',
|
||
'settings.mediaProviderLoadError': '無法從本機守護程序載入媒體供應商設定。目前將使用瀏覽器中儲存的設定。',
|
||
'settings.mediaProviderComingSoonHint': '我們在路線圖中追蹤這些提供者;守護程式尚未提供客戶端,因此暫無可配置項。',
|
||
'settings.privacy': '隱私',
|
||
'settings.privacyHint': '與 Open Design 團隊共享哪些資料',
|
||
'settings.privacyConsentKicker': '協助我們改進 Open Design',
|
||
'settings.privacyConsentLead': 'Open Design 可以將使用資料分享給我們的團隊以協助改進。包含:',
|
||
'settings.privacyConsentFooter': '你可以隨時在 設定 → 隱私 中變更任一項。我們絕不上傳你產生的產出檔案內容。',
|
||
'settings.privacyConsentShare': '分享使用資料',
|
||
'settings.privacyConsentDecline': '不分享',
|
||
'settings.privacyConsentAccept': '我知道了',
|
||
'settings.privacyConsentBannerFooter':
|
||
'預設開啟資料分享。你可以隨時在 設定 → 隱私 中關閉。我們絕不上傳你產生的產出檔案內容。',
|
||
'settings.privacyConsentPolicyLink': '閱讀隱私政策',
|
||
'settings.privacyMetrics': '匿名指標',
|
||
'settings.privacyMetricsHint': '執行次數、token 用量、錯誤率、時長。不包含 prompt,不包含專案資料。',
|
||
'settings.privacyContent': '對話內容',
|
||
'settings.privacyContentHint': '你送出的 prompt 與助理的回覆(分別截斷至 8 KB / 16 KB)。API key、token、JWT、信箱、IP 與信用卡號會在傳送前自動剝離。',
|
||
'settings.privacyArtifacts': '專案產出清單',
|
||
'settings.privacyArtifactsHint': '產生檔案的名稱、類型、大小。檔案內容絕不傳送。',
|
||
'settings.privacyInstallationId': '匿名 ID',
|
||
'settings.privacyOptedOut': '已退出',
|
||
'settings.privacyDataDeletion': '刪除我的資料',
|
||
'settings.privacyDataDeletionHint': '輪換你的匿名 ID 並停止傳送。既有資料依保留政策自然過期。',
|
||
'settings.about': '關於',
|
||
'settings.aboutHint': '版本與執行環境詳情',
|
||
'settings.appVersion': '版本',
|
||
'settings.appChannel': '通道',
|
||
'settings.appRuntime': '執行環境',
|
||
'settings.appPlatform': '平台',
|
||
'settings.appArchitecture': '架構',
|
||
'settings.runtimePackaged': '已封裝應用程式',
|
||
'settings.runtimeDevelopment': '開發環境',
|
||
'settings.versionUnavailable': '守護程式離線時無法取得版本詳情。',
|
||
'settings.installLatest': '安裝最新版本',
|
||
'settings.alreadyLatest': '目前已是最新版本',
|
||
|
||
// MCP server settings
|
||
'settings.mcpTitle': 'MCP server',
|
||
'settings.mcpHint':
|
||
'讓其他專案中的程式碼代理(Claude Code、Cursor、VS Code、Antigravity、Zed、Windsurf)讀取您的 Open Design 專案。您可以直接將設計匯入應用程式,無需先匯出 zip。',
|
||
'settings.mcpDaemonError':
|
||
'無法連線到本地守護程序以解析安裝路徑({error})。請確認 Open Design 正在執行,然後重新開啟此面板。',
|
||
'settings.mcpBuildDaemon': '請先建置守護行程。',
|
||
'settings.mcpNodeMissing': '缺少 Node 執行檔。',
|
||
'settings.mcpBuildHint':
|
||
'缺少 apps/daemon/dist/cli.js。請執行 `pnpm --filter @open-design/daemon build` 後重新整理。',
|
||
'settings.mcpMethodCli': 'CLI 指令',
|
||
'settings.mcpInstructionCli': '在您的終端機中執行此指令。',
|
||
'settings.mcpMethodToml': 'TOML 設定檔',
|
||
'settings.mcpInstructionCodex':
|
||
'將此表格附加到 {path}。Codex CLI 與 Codex IDE 擴充功能共用相同的設定。',
|
||
'settings.mcpMethodOneClick': '一鍵安裝',
|
||
'settings.mcpInstructionCursor':
|
||
'點擊「在 Cursor 中安裝」以透過核准對話框安裝,或將此 JSON 合併至 {path}。',
|
||
'settings.mcpDeeplinkInstallCursor': '在 Cursor 中安裝',
|
||
'settings.mcpMethodJson': 'JSON 設定檔',
|
||
'settings.mcpInstructionCopilot':
|
||
'開啟 Command Palette({shortcut}),執行「MCP: Open User Configuration」,然後合併此 JSON。Copilot Chat 必須處於 Agent 模式,工具才會顯示。',
|
||
'settings.mcpInstructionAntigravity':
|
||
'在 Antigravity 中:Agent 面板「⋯」選單 → MCP Servers → Manage MCP Servers → View raw config。合併此 JSON。',
|
||
'settings.mcpInstructionZed':
|
||
'開啟 Zed Settings({shortcut}),然後將此內容合併至最上層物件。Zed 使用「context_servers」,而非「mcpServers」。',
|
||
'settings.mcpInstructionWindsurf':
|
||
'開啟 {path}(或使用 Cascade 中的 MCPs 圖示 → Configure)並合併:',
|
||
'settings.mcpCopyAria': '複製 MCP 設定片段',
|
||
'settings.mcpResolvingFailed': '# 解析路徑失敗,請見上方錯誤',
|
||
'settings.mcpLoadingPaths': '# 正在從本地守護行程載入安裝路徑…',
|
||
'settings.mcpCopied': '已複製',
|
||
'settings.mcpCopy': '複製',
|
||
'settings.mcpCursorApproval': 'Cursor 會在寫入設定檔前彈出核准對話框。',
|
||
'settings.mcpRestartNote': '重新啟動您的客戶端以套用新的 server。',
|
||
'settings.mcpRestartDetail':
|
||
'大部分編輯器只在啟動時載入 MCP server。在 Cursor / VS Code / Antigravity / Windsurf 中,您可以從 Command Palette 執行「Developer: Reload Window」,無需完整重新啟動。Zed 與 Claude Code 則需要結束並重新開啟。',
|
||
'settings.mcpCapabilitiesTitle': '您的 agent 可以執行的操作',
|
||
'settings.mcpCapabilityRead':
|
||
'讀取或搜尋專案中的任何檔案(HTML、JSX、CSS、JSON、SVG、Markdown)。',
|
||
'settings.mcpCapabilityPull':
|
||
'透過單一呼叫拉取設計套件:包含進入點檔案以及所有引用的 CSS 變數、元件與字型。',
|
||
'settings.mcpCapabilityDefault':
|
||
'預設使用您在 Open Design 中開啟的專案與檔案,因此您可以說「在我的應用程式中建置這個」,無需重新說明是哪個設計。',
|
||
'settings.mcpRunningNote':
|
||
'Open Design 必須正在執行,MCP 工具呼叫才能成功。如果您在開啟 Open Design 之前就已啟動 coding agent,請重新啟動 agent,使其能夠連線到正在執行的守護行程。',
|
||
|
||
'entry.tabDesigns': '我的設計',
|
||
'entry.tabTemplates': '範本',
|
||
'entry.tabDesignSystems': '設計系統',
|
||
'entry.tabConnectors': '連接器',
|
||
'entry.openSettingsTitle': '設定',
|
||
'entry.openSettingsAria': '開啟設定',
|
||
'entry.resizeAria': '調整側邊欄寬度',
|
||
'entry.loadingWorkspace': '正在載入工作區…',
|
||
'entry.useEverywhereTitle': '隨處使用',
|
||
'entry.useEverywhereAria': '開啟「隨處使用」指南(CLI、MCP、HTTP、Skills)',
|
||
'entry.navNewProject': '新建專案',
|
||
'entry.navHome': '主頁',
|
||
'entry.navProjects': '專案',
|
||
'entry.navIntegrations': '整合',
|
||
'entry.navDesignSystems': '設計體系',
|
||
'designSystemPicker.select': '選擇設計系統',
|
||
'designSystemPicker.loading': '正在載入設計系統…',
|
||
'designSystemPicker.searchPlaceholder': '搜尋設計系統(標題 / 分類 / 摘要)',
|
||
'designSystemPicker.searchCompactPlaceholder': '搜尋設計系統',
|
||
'designSystemPicker.noneTitle': '不指定設計系統',
|
||
'designSystemPicker.noneSummary': '讓模型自由發揮',
|
||
'designSystemPicker.empty': '沒有符合的設計系統',
|
||
'designSystemPicker.openPreview': '開啟預覽',
|
||
'designSystemPicker.loadingPreview': '正在載入預覽…',
|
||
'designSystemPicker.noPreview': '沒有預覽頁面 — 請在「設計系統」中查看完整預覽',
|
||
'designSystemPicker.previewHint': '將滑鼠懸停在左側項目上查看預覽',
|
||
'designSystemPicker.fullscreenAria': '{title} 全螢幕預覽',
|
||
'designSystemPicker.closeFullscreen': '關閉全螢幕預覽',
|
||
'designSystemPicker.closeEsc': '關閉 (Esc)',
|
||
'designSystemPicker.previewFrameTitle': '{title} 預覽',
|
||
'designSystemPicker.fullscreenFrameTitle': '{title} 全螢幕預覽',
|
||
'entry.helpAria': '說明',
|
||
'entry.helpMenuAria': '說明選單',
|
||
'entry.helpGetHelp': '在 GitHub 取得協助',
|
||
'entry.helpSubmitFeature': '提交功能建議',
|
||
'entry.helpWhatsNew': '最新動態',
|
||
'entry.helpDownloadDesktop': '下載桌面端',
|
||
'entry.githubStarLabel': 'Star',
|
||
'entry.githubStarTitle': '在 GitHub 為我們點亮 Star',
|
||
'entry.githubStarAria': '在 GitHub 為 Open Design 點亮 Star',
|
||
'entry.tabImageTemplates': '圖片範本',
|
||
'entry.tabVideoTemplates': '影片範本',
|
||
'promptTemplates.searchPlaceholder': '搜尋範本…',
|
||
'promptTemplates.countLabel': '{n} 個結果',
|
||
'promptTemplates.emptyImage': '還沒有安裝圖片 Prompt 範本。',
|
||
'promptTemplates.emptyVideo': '還沒有安裝影片 Prompt 範本。',
|
||
'promptTemplates.emptyNoMatch': '沒有符合的範本。',
|
||
'promptTemplates.attributionFooter': '改編自公開 Prompt 庫,每張卡片都連結到原作者。',
|
||
'promptTemplates.openPreviewTitle': '開啟 Prompt 與預覽',
|
||
'promptTemplates.sourcePrefix': '來源:',
|
||
'promptTemplates.fetchError': '無法載入此範本文字。',
|
||
'promptTemplates.promptLabel': 'Prompt 內容',
|
||
'promptTemplates.copyPrompt': '複製 Prompt',
|
||
'promptTemplates.copyDone': '已複製!',
|
||
'promptTemplates.modelHint': '建議模型:{model}',
|
||
'promptTemplates.openSource': '查看原始來源',
|
||
'promptTemplates.openFullscreen': '開啟全螢幕預覽',
|
||
'promptTemplates.closeFullscreen': '關閉全螢幕預覽',
|
||
'promptTemplates.allSources': '所有來源',
|
||
'promptTemplates.sourceFilterAria': '依來源篩選',
|
||
'promptTemplates.retry': '重試',
|
||
|
||
'connectors.title': '連接器',
|
||
'connectors.subtitle': '可為即時製品提供資料的本地和未來資料來源。',
|
||
'connectors.account': '帳號',
|
||
'connectors.noAccount': '未連接',
|
||
'connectors.tools': '工具',
|
||
'connectors.connect': '連接',
|
||
'connectors.disconnect': '中斷連接',
|
||
'connectors.authorizationPending': '等待授權中...',
|
||
'connectors.authorizationPendingHint': '請在已開啟的視窗中完成授權。',
|
||
'connectors.cancelAuthorization': '取消',
|
||
'connectors.configure': '設定',
|
||
'connectors.unavailable': '不可用',
|
||
'connectors.phaseStubTitle': '連接器 API 將在 Phase 3 提供;這裡是預覽入口。',
|
||
'connectors.statusAvailable': '可用',
|
||
'connectors.statusConnected': '已連接',
|
||
'connectors.statusError': '錯誤',
|
||
'connectors.statusDisabled': '已停用',
|
||
'connectors.gateTitle': '新增 Composio API 金鑰以繼續',
|
||
'connectors.gateBody': '在上方貼上金鑰並點擊「儲存金鑰」,即可載入可用的整合。',
|
||
'connectors.aboutLabel': '簡介',
|
||
'connectors.detailsLabel': '詳情',
|
||
'connectors.statusLabel': '狀態',
|
||
'connectors.category.aiAgents': 'AI 代理',
|
||
'connectors.category.aiInfrastructure': 'AI 基礎設施',
|
||
'connectors.category.accounting': '會計',
|
||
'connectors.category.admin': '管理',
|
||
'connectors.category.advertising': '廣告',
|
||
'connectors.category.analytics': '分析',
|
||
'connectors.category.automation': '自動化',
|
||
'connectors.category.cms': 'CMS',
|
||
'connectors.category.crm': 'CRM',
|
||
'connectors.category.calendar': '日曆',
|
||
'connectors.category.commerce': '電商',
|
||
'connectors.category.communication': '溝通',
|
||
'connectors.category.contacts': '聯絡人',
|
||
'connectors.category.dataPlatform': '資料平台',
|
||
'connectors.category.database': '資料庫',
|
||
'connectors.category.design': '設計',
|
||
'connectors.category.developer': '開發者工具',
|
||
'connectors.category.documentation': '文件',
|
||
'connectors.category.erp': 'ERP',
|
||
'connectors.category.education': '教育',
|
||
'connectors.category.email': '郵件',
|
||
'connectors.category.events': '活動',
|
||
'connectors.category.fieldService': '現場服務',
|
||
'connectors.category.finance': '財務',
|
||
'connectors.category.fitness': '健身',
|
||
'connectors.category.forms': '表單',
|
||
'connectors.category.gaming': '遊戲',
|
||
'connectors.category.hr': '人力資源',
|
||
'connectors.category.hospitality': '旅宿與款待',
|
||
'connectors.category.itsm': 'ITSM',
|
||
'connectors.category.integration': '整合',
|
||
'connectors.category.localization': '在地化',
|
||
'connectors.category.logistics': '物流',
|
||
'connectors.category.maps': '地圖',
|
||
'connectors.category.marketing': '行銷',
|
||
'connectors.category.media': '媒體',
|
||
'connectors.category.meetings': '會議',
|
||
'connectors.category.nonprofit': '非營利',
|
||
'connectors.category.observability': '可觀測性',
|
||
'connectors.category.payments': '付款',
|
||
'connectors.category.personal': '個人',
|
||
'connectors.category.presentations': '簡報',
|
||
'connectors.category.procurement': '採購',
|
||
'connectors.category.product': '產品',
|
||
'connectors.category.productivity': '生產力',
|
||
'connectors.category.projectManagement': '專案管理',
|
||
'connectors.category.recruiting': '招募',
|
||
'connectors.category.research': '研究',
|
||
'connectors.category.salesIntelligence': '銷售情報',
|
||
'connectors.category.scheduling': '排程',
|
||
'connectors.category.search': '搜尋',
|
||
'connectors.category.security': '安全',
|
||
'connectors.category.signing': '簽署',
|
||
'connectors.category.social': '社交',
|
||
'connectors.category.spreadsheets': '試算表',
|
||
'connectors.category.storage': '儲存',
|
||
'connectors.category.support': '支援',
|
||
'connectors.category.surveys': '問卷',
|
||
'connectors.category.tasks': '任務',
|
||
'connectors.category.timeTracking': '時間追蹤',
|
||
'connectors.category.video': '影片',
|
||
'connectors.category.whiteboard': '白板',
|
||
'connectors.categoryLabel': '類別',
|
||
'connectors.providerLabel': '提供方',
|
||
'connectors.toolsSection': '工具',
|
||
'connectors.toolsLoading': '正在載入工具…',
|
||
'connectors.noToolsAvailable': '目前沒有可用工具,連接後即可發現此整合提供的能力。',
|
||
'connectors.toolDetailsUnavailable': 'Tool details are unavailable, but this connector reports {n} tools.',
|
||
'connectors.loadMoreTools': 'Load more tools',
|
||
'connectors.openDetailsAria': '檢視 {name} 詳情',
|
||
'connectors.toolsBadgeNone': '尚無工具',
|
||
'connectors.toolsBadgeOne': '{n} 個工具',
|
||
'connectors.toolsBadgeMany': '{n} 個工具',
|
||
'connectors.searchPlaceholder': '搜尋連接器…',
|
||
'connectors.searchAriaLabel': '依名稱、提供者或工具搜尋連接器',
|
||
'connectors.searchClear': '清除搜尋',
|
||
'connectors.emptyNoMatchTitle': '沒有符合「{query}」的連接器',
|
||
'connectors.emptyNoMatchBody': '試試其他關鍵字,或清除搜尋以瀏覽完整目錄。',
|
||
'connectors.emptyNoMatchAction': '清除搜尋',
|
||
'integrations.kicker': '整合',
|
||
'integrations.lede': '連接外部系統,把 MCP 工具帶入智能體迴圈,並在其他 IDE、腳本與自動化流程中使用 Open Design。',
|
||
'integrations.agentReady': '智能體就緒',
|
||
'integrations.areasAria': '整合區域',
|
||
'integrations.tabLabel.mcp': 'MCP 伺服器',
|
||
'integrations.tabLabel.skills': '技能',
|
||
'integrations.tabHint.mcp': '外部工具',
|
||
'integrations.tabHint.connectors': '帳號與 API',
|
||
'integrations.tabHint.useEverywhere': 'CLI、HTTP、MCP',
|
||
'integrations.skillsTitle': '技能整合',
|
||
'integrations.skillsBody': '技能層級的整合管理正從另一個分支搬移過來。此分頁預留給 MCP、連接器與未來的技能設定,讓它們集中在同一個整合路由中。',
|
||
'mcpClient.title': '外部 MCP 伺服器',
|
||
'mcpClient.subtitle': '提供給編碼智能體使用的第三方工具。',
|
||
'mcpClient.addServer': '新增伺服器',
|
||
'mcpClient.emptyTitle': '尚未設定 MCP 伺服器。',
|
||
'mcpClient.emptyBody': '點擊「新增伺服器」即可開始 — 選擇範本(Higgsfield OpenClaw、Pollinations、Allyson、Imagician、EdgeOne Pages、GitHub、Filesystem…),或設定自訂 stdio / HTTP 伺服器。',
|
||
'mcpClient.saveChanges': '儲存變更',
|
||
'mcpClient.storedAt': '儲存於',
|
||
'mcpClient.daemonError': '無法連線到本機 daemon。請確認 Open Design 正在執行,然後重新開啟此面板。',
|
||
'mcpClient.saveFailed': '儲存失敗。請確認 daemon 正在執行後再試一次。',
|
||
'tasks.comingSoon': '即將推出',
|
||
|
||
'routines.title': '自動化',
|
||
'routines.subtitle': '無需值守、依排程執行的自動化工作。',
|
||
'routines.newAutomation': '新增自動化',
|
||
'routines.loading': '載入中…',
|
||
'routines.empty': '尚無自動化工作。',
|
||
'routines.emptyHint': '點選「新增自動化」即可安排一次無人值守的代理執行。',
|
||
'routines.runHistoryLoading': '正在載入執行記錄…',
|
||
'routines.runHistoryEmpty': '尚無執行記錄。',
|
||
'routines.fieldName': '名稱',
|
||
'routines.fieldNamePlaceholder': '晨間簡報',
|
||
'routines.fieldPrompt': 'Prompt',
|
||
'routines.fieldPromptPlaceholder': '擷取昨天的 GitHub 與 Linear 活動並總結有哪些變更。',
|
||
'routines.fieldSchedule': '排程',
|
||
'routines.fieldMinute': '每小時的第幾分鐘',
|
||
'routines.fieldTime': '時間',
|
||
'routines.fieldTimezone': '時區',
|
||
'routines.fieldsetProject': '專案',
|
||
'routines.kind.hourly': '每小時',
|
||
'routines.kind.daily': '每天',
|
||
'routines.kind.weekdays': '工作日',
|
||
'routines.kind.weekly': '每週',
|
||
'routines.weekday.short.0': '週日',
|
||
'routines.weekday.short.1': '週一',
|
||
'routines.weekday.short.2': '週二',
|
||
'routines.weekday.short.3': '週三',
|
||
'routines.weekday.short.4': '週四',
|
||
'routines.weekday.short.5': '週五',
|
||
'routines.weekday.short.6': '週六',
|
||
'routines.weekday.long.0': '週日',
|
||
'routines.weekday.long.1': '週一',
|
||
'routines.weekday.long.2': '週二',
|
||
'routines.weekday.long.3': '週三',
|
||
'routines.weekday.long.4': '週四',
|
||
'routines.weekday.long.5': '週五',
|
||
'routines.weekday.long.6': '週六',
|
||
'routines.timeAm': '上午',
|
||
'routines.timePm': '下午',
|
||
'routines.describe.hourly': '每小時的第 {minute} 分執行',
|
||
'routines.describe.daily': '每天 {time}({tz})執行',
|
||
'routines.describe.weekdays': '週一至週五 {time}({tz})執行',
|
||
'routines.describe.weekly': '每{day} {time}({tz})執行',
|
||
'routines.modeCreate': '每次執行建立新專案',
|
||
'routines.modeCreateHint': '每次觸發都使用全新且隔離的工作區。',
|
||
'routines.modeReuse': '重複使用現有專案',
|
||
'routines.modeReuseHint': '每次執行會成為該專案中的一段新對話。',
|
||
'routines.pickProject': '— 選擇專案 —',
|
||
'routines.targetReuse': '→ {project}',
|
||
'routines.targetCreate': '→ 每次執行建立新專案',
|
||
'routines.tagPaused': '已暫停',
|
||
'routines.metaNext': '下次:{when}',
|
||
'routines.metaLast': '上次:',
|
||
'routines.triggerManual': '手動',
|
||
'routines.triggerScheduled': '排程',
|
||
'routines.openProject': '開啟專案',
|
||
'routines.openProjectTitle': '開啟本次執行寫入的專案',
|
||
'routines.runNow': '立即執行',
|
||
'routines.edit': '編輯',
|
||
'routines.pause': '暫停',
|
||
'routines.resume': '繼續',
|
||
'routines.history': '歷史記錄',
|
||
'routines.hideHistory': '隱藏歷史記錄',
|
||
'routines.delete': '刪除',
|
||
'routines.deleteTitle': '刪除此自動化',
|
||
'routines.cancel': '取消',
|
||
'routines.save': '儲存',
|
||
'routines.saving': '儲存中…',
|
||
'routines.create': '建立',
|
||
'routines.creating': '建立中…',
|
||
'routines.status.queued': '佇列中',
|
||
'routines.status.running': '執行中',
|
||
'routines.status.succeeded': '成功',
|
||
'routines.status.failed': '失敗',
|
||
'routines.status.canceled': '已取消',
|
||
'routines.confirmDelete': '刪除此自動化?過往執行記錄及其專案將予以保留。',
|
||
'routines.errorPickProject': '請選擇要重複使用的專案,或切換為「每次執行建立新專案」。',
|
||
|
||
'newproj.tabPrototype': '原型',
|
||
'newproj.tabLiveArtifact': '即時成品',
|
||
'newproj.tabDeck': '投影片',
|
||
'newproj.tabTemplate': '從範本',
|
||
'newproj.tabMedia': '媒體',
|
||
'newproj.tabOther': '其它',
|
||
'newproj.titlePrototype': '新建原型',
|
||
'newproj.titleLiveArtifact': '新建即時成品',
|
||
'newproj.titleDeck': '新建投影片',
|
||
'newproj.titleTemplate': '從範本開始',
|
||
'newproj.titleImage': '新建圖片',
|
||
'newproj.titleVideo': '新建影片',
|
||
'newproj.titleAudio': '新建音訊',
|
||
'newproj.titleMedia': '新建媒體',
|
||
'newproj.titleOther': '新建專案',
|
||
'newproj.namePlaceholder': '專案名稱',
|
||
'newproj.fidelityLabel': '精細度',
|
||
'newproj.fidelityWireframe': '線框圖',
|
||
'newproj.fidelityHigh': '高擬真',
|
||
'newproj.toggleSpeakerNotes': '使用演講備忘稿',
|
||
'newproj.toggleSpeakerNotesHint': '減少投影片上的文字,重點放到備忘稿中。',
|
||
'newproj.toggleAnimations': '加入動畫效果',
|
||
'newproj.toggleAnimationsHint': '在範本基礎上疊加動畫效果(入場、懸停、過渡)。',
|
||
'newproj.targetPlatformsLabel': '目標平台',
|
||
'newproj.targetPlatformsHint':
|
||
'可多選。響應式 Web 僅涵蓋瀏覽器斷點;如需原生跨平台版本,請加入 iOS、Android、平板應用或桌面應用。',
|
||
'newproj.platform.responsive.label': '響應式 Web',
|
||
'newproj.platform.responsive.hint': '一套 Web 體驗,適配桌面、平板與行動瀏覽器',
|
||
'newproj.platform.webDesktop.label': '桌面 Web',
|
||
'newproj.platform.webDesktop.hint': '瀏覽器優先的產品或著陸頁',
|
||
'newproj.platform.mobileIos.label': 'iOS 應用',
|
||
'newproj.platform.mobileIos.hint': 'iPhone 畫框與 iOS 互動規範',
|
||
'newproj.platform.mobileAndroid.label': 'Android 應用',
|
||
'newproj.platform.mobileAndroid.hint': 'Pixel 畫框與 Material 互動規範',
|
||
'newproj.platform.tablet.label': '平板應用',
|
||
'newproj.platform.tablet.hint': '原生風格的平板體驗,支援分割畫面',
|
||
'newproj.platform.desktopApp.label': '桌面應用',
|
||
'newproj.platform.desktopApp.hint': 'macOS/Windows 應用外觀',
|
||
'newproj.surfaceOptionsLabel': '配套介面',
|
||
'newproj.includeLandingPage': '包含著陸頁',
|
||
'newproj.includeLandingPageHint':
|
||
'為廣告、候補名單、發布活動、應用下載或產品說明加入一個響應式行銷頁面。',
|
||
'newproj.includeOsWidgets': '包含系統小工具',
|
||
'newproj.includeOsWidgetsHint':
|
||
'為行動/平板應用加入平台原生的主畫面、鎖定畫面或快捷小工具。',
|
||
'newproj.includeOsWidgetsDisabledHint':
|
||
'選擇 iOS、Android 或平板應用作為目標平台時可用。',
|
||
'newproj.templateLabel': '範本',
|
||
'newproj.noTemplatesTitle': '還沒有範本',
|
||
'newproj.noTemplatesBody':
|
||
'開啟任意專案,在檔案檢視器內的「分享」選單將其儲存為範本,範本將出現在這裡。',
|
||
'newproj.savedTemplate': '已儲存的範本',
|
||
'newproj.fileSingular': '個檔案',
|
||
'newproj.filePlural': '個檔案',
|
||
'newproj.create': '建立',
|
||
'newproj.createLiveArtifact': '建立即時成品',
|
||
'newproj.createFromTemplate': '基於範本建立',
|
||
'newproj.createDisabledTitle': '請先在任意專案內透過「分享」選單將其儲存為範本。',
|
||
'newproj.importClaudeZip': '匯入 Claude Design ZIP',
|
||
'newproj.importClaudeZipTitle': '匯入 Claude Design 匯出的 .zip 檔案',
|
||
'newproj.importingClaudeZip': '正在匯入…',
|
||
'newproj.privacyFooter': '預設情況下只有你能看到自己的專案。',
|
||
'newproj.designSystem': '設計系統',
|
||
'newproj.dsNoneFreeform': '不指定 — 自由發揮',
|
||
'newproj.dsNoneSubtitleEmpty': '不使用系統 token,由你決定整體配色',
|
||
'newproj.dsNoneSubtitleSelected': '跳過系統 token,由代理自行選擇配色。',
|
||
'newproj.dsCategoryFallback': '設計系統',
|
||
'newproj.dsSearch': '搜尋設計系統…',
|
||
'newproj.dsModeAria': '選擇模式',
|
||
'newproj.dsModeSingle': '單選',
|
||
'newproj.dsModeMulti': '多選',
|
||
'newproj.dsNoneTitle': '不指定 — 自由發揮',
|
||
'newproj.dsNoneSub': '跳過系統 token,由代理自行選擇配色。',
|
||
'newproj.dsEmpty': '沒有符合「{query}」的設計系統。',
|
||
'newproj.dsFootSingular': '只作為靈感參考。',
|
||
'newproj.dsFootPlural': '只作為靈感參考。',
|
||
'newproj.dsFootClear': '清除',
|
||
'newproj.dsBadgeDefault': '預設',
|
||
'newproj.dsPrimaryFallback': '主系統',
|
||
'newproj.surfaceImage': '圖片',
|
||
'newproj.surfaceVideo': '影片',
|
||
'newproj.surfaceAudio': '音訊',
|
||
'newproj.modelLabel': '模型',
|
||
'newproj.modelSearch': '搜尋模型…',
|
||
'newproj.modelEmpty': '沒有符合的模型。',
|
||
'newproj.modelRecommended': '推薦',
|
||
'newproj.modelMissingTitle': '選擇模型',
|
||
'newproj.modelMissingSub': '為此情境選一個模型。',
|
||
'newproj.aspectLabel': '比例',
|
||
'newproj.videoLengthLabel': '時長',
|
||
'newproj.videoLengthSeconds': '{n} 秒',
|
||
'newproj.audioKindLabel': '音訊類型',
|
||
'newproj.audioKindMusic': '音樂',
|
||
'newproj.audioKindSpeech': '配音 / TTS',
|
||
'newproj.audioKindSfx': '音效',
|
||
'newproj.audioDurationLabel': '時長',
|
||
'newproj.audioDurationSeconds': '{n} 秒',
|
||
'newproj.voiceLabel': '聲音',
|
||
'newproj.voicePlaceholder': '提供商 voice id,可選',
|
||
'newproj.connectorsLabel': '連接器',
|
||
'newproj.connectorsHint': '即時製品可以從這些資料來源拉取資訊。',
|
||
'newproj.connectorsEmptyTitle': '尚未配置連接器',
|
||
'newproj.connectorsEmptyBody': '連接一個資料來源,讓即時製品載入真實資料而非佔位內容。',
|
||
'newproj.connectorsEmptyCta': '前往配置連接器 →',
|
||
'newproj.connectorsLoading': '正在載入連接器…',
|
||
'newproj.connectorsCountOne': '已連接 {n} 個',
|
||
'newproj.connectorsCountMany': '已連接 {n} 個',
|
||
'newproj.connectorsManage': '管理',
|
||
'newproj.promptTemplateLabel': '參考範本',
|
||
'newproj.promptTemplateNoneTitle': '不指定 — 自由發揮',
|
||
'newproj.promptTemplateNoneSub': '跳過範本庫,自行描述需求',
|
||
'newproj.promptTemplateRefSub': '參考範本',
|
||
'newproj.promptTemplateSearch': '搜尋範本…',
|
||
'newproj.promptTemplateEmpty': '目前沒有此類型的範本。',
|
||
'newproj.promptTemplateBodyLabel': 'Prompt(可繼續優化)',
|
||
'newproj.promptTemplateOptimizeHint':
|
||
'可隨意編輯 — 修改後的內容會作為 agent 生成時的參考。',
|
||
'newproj.promptTemplateBodyEmpty': '內容為空 — agent 不會拿到範本參考。',
|
||
|
||
'newproj.deleteTemplateTitle': '刪除範本',
|
||
'newproj.deleteTemplateConfirm': '確定刪除「{name}」?此操作無法復原。',
|
||
'newproj.deleteTemplateConfirmCta': '刪除範本',
|
||
'newproj.deleteTemplateError':
|
||
'無法刪除此範本,請重試。',
|
||
'designs.subRecent': '最近',
|
||
'designs.subYours': '我的設計',
|
||
'designs.filterAria': '篩選專案',
|
||
'designs.searchPlaceholder': '搜尋…',
|
||
'designs.emptyNoProjects': '還沒有專案。請在左側建立一個。',
|
||
'designs.emptyNoMatch': '沒有符合的專案。',
|
||
'designs.deleteTitle': '刪除專案',
|
||
'designs.deleteConfirm': '確定刪除「{name}」?',
|
||
'designs.cardFreeform': '自由設計',
|
||
'designs.badgeLive': 'Live',
|
||
'designs.liveArtifactBadgesAria': '即時產物標記',
|
||
'designs.liveCount': '{n} 個即時',
|
||
'designs.statusLive': '即時產物',
|
||
'designs.statusArchived': '已封存',
|
||
'designs.statusError': '錯誤',
|
||
'designs.statusRefreshing': '重新整理中…',
|
||
'designs.statusRefreshFailed': '重新整理失敗',
|
||
'designs.statusRefreshed': '已重新整理',
|
||
'designs.status.notStarted': '未開始',
|
||
'designs.status.queued': '等待中',
|
||
'designs.status.running': '執行中',
|
||
'designs.status.awaitingInput': '等待回覆',
|
||
'designs.status.succeeded': '已完成',
|
||
'designs.status.published': '已發佈',
|
||
'designs.status.failed': '失敗',
|
||
'designs.status.canceled': '已取消',
|
||
'designs.viewToggleAria': '檢視模式',
|
||
'designs.viewGrid': '網格檢視',
|
||
'designs.viewKanban': '看板檢視',
|
||
'designs.kanbanEmptyColumn': '暫無設計',
|
||
'designs.deleteAria': '刪除專案 {name}',
|
||
'designs.menuMore': '更多操作',
|
||
'designs.menuRename': '重新命名',
|
||
'designs.menuDelete': '刪除',
|
||
'designs.renamePrompt': '為「{name}」輸入新名稱',
|
||
'designs.selectMode': '選擇',
|
||
'designs.cancelSelect': '取消',
|
||
'designs.deleteSelected': '刪除所選',
|
||
'designs.selectedCount': '已選擇 {n} 項',
|
||
'designs.deleteSelectedConfirm': '確定刪除選取的 {n} 個專案?',
|
||
'designs.deleteSelectedSuccess': '已成功刪除 {n} 個專案。',
|
||
'designs.deleteSelectedPartial': '已刪除 {deleted} 個專案;{failed} 個失敗。',
|
||
'designs.tagPrototype': '原型',
|
||
'designs.tagLiveArtifact': 'Live Artifact',
|
||
'designs.tagSlide': 'Slide',
|
||
'designs.tagMedia': 'Media',
|
||
'designs.renameTitle': '重新命名專案',
|
||
'designs.renameSave': '確定',
|
||
'designs.renameCancel': '取消',
|
||
|
||
'examples.typeLabel': '類型',
|
||
'examples.surfaceLabel': '類型',
|
||
'examples.surfaceWeb': '網頁',
|
||
'examples.surfaceImage': '圖片',
|
||
'examples.surfaceVideo': '影片',
|
||
'examples.surfaceAudio': '音訊',
|
||
'examples.scenarioLabel': '情境',
|
||
'examples.modeAll': '全部',
|
||
'examples.modePrototypeDesktop': '原型 · 桌面版',
|
||
'examples.modePrototypeMobile': '原型 · 行動版',
|
||
'examples.modeDeck': '投影片',
|
||
'examples.modeDocument': '文件與範本',
|
||
'examples.modeOrbit': 'Orbit',
|
||
'examples.modeLive': '即時',
|
||
'examples.scenarioGeneral': '通用',
|
||
'examples.scenarioEngineering': '工程',
|
||
'examples.scenarioProduct': '產品',
|
||
'examples.scenarioDesign': '設計',
|
||
'examples.scenarioMarketing': '行銷',
|
||
'examples.scenarioSales': '業務',
|
||
'examples.scenarioFinance': '財務',
|
||
'examples.scenarioHr': '人力資源',
|
||
'examples.scenarioOperations': '營運',
|
||
'examples.scenarioSupport': '支援',
|
||
'examples.scenarioLegal': '法務',
|
||
'examples.scenarioEducation': '教育',
|
||
'examples.scenarioPersonal': '個人',
|
||
'examples.emptyNoSkills': '沒有可用的技能,守護程序是否在執行?',
|
||
'examples.searchPlaceholder': '搜尋範例…',
|
||
'examples.searchAria': '依名稱搜尋範例',
|
||
'examples.emptyNoMatch': '沒有符合當前篩選的範例。',
|
||
'examples.openPreview': '⤢ 開啟預覽',
|
||
'examples.loadingPreview': '正在載入預覽…',
|
||
'examples.hoverPreview': '將滑鼠懸停以檢視預覽',
|
||
'examples.usePrompt': '使用此 Prompt',
|
||
'examples.previewModalTitle': '在彈窗中檢視完整預覽',
|
||
'examples.shareTitle': '分享此範例',
|
||
'examples.shareLoadFirst': '請先懸停以載入預覽',
|
||
'examples.unavailablePlaceholder': '此技能未附帶 {kind} 預覽範例 — 開啟查看詳情',
|
||
'examples.shareUnavailable': '此技能未附帶 {kind} 預覽範例可分享',
|
||
'examples.shareMenu': '分享 ▾',
|
||
'examples.exportPdfAllSlides': '匯出為 PDF(全部投影片)',
|
||
'examples.exportPptxLocked': '匯出為 PPTX…(請先開啟範本)',
|
||
'examples.tagSlideDeck': '投影片',
|
||
'examples.tagTemplate': '範本',
|
||
'examples.tagDesignSystem': '設計系統',
|
||
'examples.tagMobilePrototype': '行動版原型',
|
||
'examples.tagDesktopPrototype': '桌面版原型',
|
||
'examples.tagImage': '圖片',
|
||
'examples.tagVideo': '影片',
|
||
'examples.tagAudio': '音訊',
|
||
'examples.previewLabel': '預覽',
|
||
|
||
'ds.surfaceLabel': '類型',
|
||
'ds.surfaceWeb': '網頁',
|
||
'ds.surfaceImage': '圖片',
|
||
'ds.surfaceVideo': '影片',
|
||
'ds.surfaceAudio': '音訊',
|
||
'ds.searchPlaceholder': '搜尋設計系統…',
|
||
'ds.emptyNoMatch': '沒有符合的設計系統。',
|
||
'ds.badgeDefault': '預設',
|
||
'ds.preview': '預覽',
|
||
'ds.previewTitle': '預覽設計系統',
|
||
'ds.categoryAll': '全部',
|
||
'ds.categoryUncategorized': '未分類',
|
||
'ds.showcase': '展示',
|
||
'ds.tokens': 'Token',
|
||
'ds.specToggle': 'DESIGN.md',
|
||
'ds.specLoading': '正在載入 DESIGN.md…',
|
||
|
||
'avatar.title': '帳號與設定',
|
||
'avatar.localCli': '本機 CLI',
|
||
'avatar.anthropicApi': 'Anthropic API',
|
||
'avatar.useLocal': '使用本機 CLI',
|
||
'avatar.useApi': '使用 API · BYOK',
|
||
'avatar.codeAgent': '程式碼代理',
|
||
'avatar.rescan': '重新掃描 PATH',
|
||
'avatar.settings': '設定',
|
||
'avatar.backToProjects': '返回專案列表',
|
||
'avatar.metaActive': '使用中',
|
||
'avatar.metaOffline': '未執行',
|
||
'avatar.metaSelected': '已選',
|
||
'avatar.noAgentSelected': '尚未選擇代理',
|
||
'avatar.modelSection': '模型',
|
||
'avatar.modelLabel': '模型',
|
||
'avatar.reasoningLabel': '推理',
|
||
'avatar.customSuffix': '(自訂)',
|
||
|
||
'inlineSwitcher.chipTitle': '切換 CLI / 模型',
|
||
'inlineSwitcher.chipCli': '本機 CLI',
|
||
'inlineSwitcher.chipByok': '自備 Key',
|
||
'inlineSwitcher.modelDefault': '預設',
|
||
'inlineSwitcher.noAgent': '未選擇',
|
||
'inlineSwitcher.modeLabel': '模式',
|
||
'inlineSwitcher.agentLabel': '代理',
|
||
'inlineSwitcher.providerLabel': '服務商',
|
||
'inlineSwitcher.modelLabel': '模型',
|
||
'inlineSwitcher.useCli': '使用本機 CLI',
|
||
'inlineSwitcher.useByok': '使用自備 API Key',
|
||
'inlineSwitcher.daemonOffline': '守護程序離線 — 開啟設定',
|
||
'inlineSwitcher.noAgentsDetected': 'PATH 中未偵測到可用 CLI',
|
||
'inlineSwitcher.openSettingsForModel': '在「設定」中設定該服務商',
|
||
'inlineSwitcher.missingApiKey': '尚未填寫 API Key — 在「設定」中新增。',
|
||
'inlineSwitcher.openFullSettings': '開啟執行設定',
|
||
'inlineSwitcher.customSuffix': '(自訂)',
|
||
|
||
'project.backToProjects': '返回專案列表',
|
||
'project.metaFreeform': '自由設計',
|
||
'project.resizeChatPanel': '調整聊天面板大小',
|
||
'project.instructionsActive': '已生效 — 每則訊息都會附帶',
|
||
'chat.tabChat': '對話',
|
||
'chat.tabComments': '評論',
|
||
'chat.commentsSoon': '評論 — 即將上線',
|
||
'chat.comments.attached': '已附加到對話',
|
||
'chat.comments.emptyAttached': '沒有已附加的評論。',
|
||
'chat.comments.saved': '已儲存的評論',
|
||
'chat.comments.emptySaved': '沒有已儲存的評論。',
|
||
'chat.comments.add': '新增',
|
||
'chat.comments.addAll': '全部新增',
|
||
'chat.comments.remove': '移除',
|
||
'chat.comments.placeholder': '評論此元素…',
|
||
'chat.comments.addSend': '新增並傳送',
|
||
'chat.comments.updateSend': '更新並傳送',
|
||
'chat.comments.removeAttachment': '移除評論附件',
|
||
'chat.comments.removeAttachmentAria': '移除 {name} 的評論附件',
|
||
'chat.comments.comment': 'Comment',
|
||
'chat.comments.sendToChat': 'Send to chat',
|
||
'chat.comments.sending': 'Sending…',
|
||
'chat.comments.edit': 'Edit',
|
||
'chat.comments.select': 'Select',
|
||
'chat.comments.deselect': 'Deselect',
|
||
'chat.comments.nSelected': '{n} selected',
|
||
'chat.comments.pin': 'Pin',
|
||
'chat.comments.addNote': 'Add note',
|
||
'chat.comments.savedToast': 'Comment saved',
|
||
'chat.comments.pinSavedToast': 'Pin saved',
|
||
'chat.comments.pinAtCoords': 'at {x}, {y}',
|
||
'chat.comments.capturedItems': '{n} captured items',
|
||
'chat.comments.clear': 'Clear',
|
||
'chat.conversationsTitle': '對話紀錄',
|
||
'chat.conversationsAria': '對話紀錄',
|
||
'chat.newConversation': '新建對話',
|
||
'chat.newConversationsTitle': '新建對話',
|
||
'chat.conversationsHeading': '對話',
|
||
'chat.new': '新建',
|
||
'chat.emptyConversations': '還沒有對話。',
|
||
'chat.deleteConversation': '刪除對話',
|
||
'chat.renameConversationLabel': '重新命名「{title}」',
|
||
'chat.deleteConversationConfirm': '確定刪除「{title}」?該操作會刪除其訊息。',
|
||
'chat.untitledConversation': '未命名對話',
|
||
'chat.startTitle': '開始一個對話',
|
||
'chat.startHint': "描述你想生成的內容,或從下面的範例開始:",
|
||
'chat.fillInputTitle': '點擊填充到輸入框',
|
||
'chat.jumpToLatest': '回到最新',
|
||
'chat.scrollToLatest': '捲動到最新',
|
||
'chat.you': '你',
|
||
'chat.openFile': '開啟 {name}',
|
||
'chat.copyPrompt': '複製提示詞',
|
||
'chat.copyDone': '已複製!',
|
||
'chat.inspect.noEditableTargets': '未找到可編輯的文字或樣式目標。',
|
||
'chat.inspect.noCommentTargets': '未找到可評論的文字或視覺目標。',
|
||
'chat.inspect.editHint': '在預覽中選擇文字或樣式目標進行編輯。',
|
||
'chat.inspect.commentHint': '在預覽中選擇文字或區域進行評論。',
|
||
'chat.composerPlaceholder': "描述你想生成的內容…",
|
||
'chat.composerHint': "⌘/Ctrl + Enter 傳送 · 說清目標、內容、風格和格式",
|
||
'chat.cliSettingsTitle': 'CLI 與模型設定',
|
||
'chat.cliSettingsAria': '開啟 CLI 與模型設定',
|
||
'chat.attachTitle': '附加檔案(也可以貼上/拖入)',
|
||
'chat.attachAria': '附加檔案',
|
||
'chat.importTitle': '匯入素材(即將上線)',
|
||
'chat.importLabel': '匯入',
|
||
'chat.importComingSoon': '即將上線',
|
||
'chat.importSoon': '即將',
|
||
'chat.importFig': '上傳 .fig 檔案',
|
||
'chat.importGitHub': '連接 GitHub',
|
||
'chat.importWeb': '擷取網頁元素',
|
||
'chat.importFolder': '關聯程式碼目錄',
|
||
'chat.importSkills': '技能與設計系統',
|
||
'chat.importProject': '引用其它專案',
|
||
'chat.linkedFolderRemoveAria': '移除關聯資料夾 {path}',
|
||
'chat.linkedFolderNotFound': '資料夾不存在',
|
||
'chat.linkedFolderAlready': '該資料夾已關聯',
|
||
'chat.linkedFolderPickError': '無法開啟資料夾選擇器',
|
||
'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': '傳送',
|
||
'chat.stop': '停止',
|
||
'chat.removeAria': '移除 {name}',
|
||
'chat.example1Title': '編輯風路演 PPT',
|
||
'chat.example1Tag': '雜誌',
|
||
'chat.example1Prompt':
|
||
'為一家正在融種子輪的設計工作室製作 10 張編輯風路演 PPT —— 瑞士格線佈局,超大號襯線標題加粗體首字下沉,等寬字體的章節編號,留白充足,整頁大圖與文字密集頁穿插出現。封面、願景、市場、產品、成長、團隊、融資需求、聯絡方式。',
|
||
'chat.example2Title': 'SaaS 分析儀表板',
|
||
'chat.example2Tag': '資料',
|
||
'chat.example2Prompt':
|
||
'為一款面向開發者的 SaaS 設計一份資訊密度高的分析儀表板 —— 頂端 KPI 條帶(含週環比變化)、兩張堆疊折線圖(MRR 與活躍工作區)、全球使用熱力圖、留存矩陣、客戶排行榜以及即時事件流。深色主題,等寬數字,迷你圖作為點綴。',
|
||
'chat.example3Title': '長捲動年度報告',
|
||
'chat.example3Tag': '編輯',
|
||
'chat.example3Prompt':
|
||
'為一家關注氣候議題的非營利機構製作互動式年度報告 —— 長捲動編輯式佈局,混合大段引言區塊、資料視覺化(堆疊柱狀圖、動態計數器、專案地點分布的等值線地圖)、攝影分隔頁、捐贈者牆,以及最終行動號召。現代襯線內文、無襯線圖表標籤、大地紙張配色。',
|
||
|
||
'preview.shareMenu': '分享',
|
||
'preview.exportMenu': '匯出',
|
||
'preview.shareTemplateBadge': '範本',
|
||
'preview.shareToX': 'X / Twitter',
|
||
'preview.shareToReddit': 'Reddit',
|
||
'preview.shareToFacebook': 'Facebook',
|
||
'preview.shareToLinkedIn': 'LinkedIn',
|
||
'preview.shareToInstagram': 'Instagram',
|
||
'preview.shareToXiaohongshu': '小红书',
|
||
'preview.copyTemplateLink': '複製範本連結',
|
||
'preview.copyShareText': '複製分享文案',
|
||
'preview.shareSocialGroup': '分享到社群',
|
||
'preview.shareCopyGroup': '複製',
|
||
'preview.shareExportGroup': '匯出檔案',
|
||
'preview.shareCopied': '已複製',
|
||
'preview.shareCopyFailed': '複製失敗',
|
||
'preview.shareTextDefault': 'Open Design 模板:{title}',
|
||
'preview.openInNewTab': '在新分頁中開啟',
|
||
'preview.exit': '⤓ 離開',
|
||
'preview.fullscreen': '⤢ 全螢幕',
|
||
'preview.closeTitle': '關閉(Esc)',
|
||
'preview.loading': '正在載入{label}…',
|
||
'preview.errorTitle': '無法載入此範例。',
|
||
'preview.errorBody': '範例 HTML 載入失敗。請確認 Open Design 正在執行後重試。',
|
||
'preview.retry': '重試',
|
||
'preview.unavailableTitle': '此技能尚未附帶預覽範例。',
|
||
'preview.unavailableBody': '此技能用於產生 {kind} 產物 — 請在對話中執行此 Prompt 來產生。',
|
||
'preview.showSidebar': '展開{label}',
|
||
'preview.hideSidebar': '收合{label}',
|
||
|
||
'misc.savedTemplate': '已儲存的範本',
|
||
'misc.primary': '主系統',
|
||
'misc.designSystem': '設計系統',
|
||
|
||
'workspace.designFiles': '設計檔案',
|
||
'workspace.focusMode': '專注工作區',
|
||
'workspace.showChat': '顯示聊天',
|
||
'workspace.closeTab': '關閉分頁',
|
||
'workspace.deleteFileConfirm': '從專案資料夾中刪除「{name}」?',
|
||
'workspace.deleteSelectedFilesConfirm': '從專案資料夾中刪除選中的 {n} 個檔案?',
|
||
'workspace.deleteSelectedFilesPartial': '有 {n} 個檔案刪除失敗。',
|
||
'workspace.openFromDesignFiles': '請從',
|
||
'workspace.designFilesLink': '設計檔案',
|
||
'workspace.loadingSketch': '正在載入草圖…',
|
||
'designFiles.title': '設計檔案',
|
||
'designFiles.upload': '上傳圖片',
|
||
'designFiles.pasteText': '貼上為文字檔案',
|
||
'designFiles.newSketch': '新建草圖',
|
||
'designFiles.empty': '生成的設計會出現在這裡',
|
||
'designFiles.refresh': '重新整理',
|
||
'designFiles.delete': '刪除',
|
||
'designFiles.searchPlaceholder': '搜尋檔案…',
|
||
'designFiles.up': '上一層',
|
||
'designFiles.back': '返回',
|
||
'designFiles.crumbs': '專案',
|
||
'designFiles.rowMenu': '列選單',
|
||
'designFiles.openInTab': '在分頁中開啟',
|
||
'designFiles.download': '下載',
|
||
'designFiles.downloadSelected': '下載選中的 {n} 個檔案為 ZIP',
|
||
'designFiles.deleteSelected': '刪除 {n} 個',
|
||
'designFiles.clearSelection': '取消選擇',
|
||
'designFiles.selectPage': '全選此頁',
|
||
'designFiles.selectAll': '全選',
|
||
'designFiles.dropTitle': '⤓ 把檔案拖到這裡',
|
||
'designFiles.dropDesc': '圖片、文件、參考資料或資料夾 — 智慧體都會用作上下文。',
|
||
'designFiles.upload.title': '上傳一張圖片',
|
||
'designFiles.paste.title': '將文字貼上為檔案',
|
||
'designFiles.upload.label': '上傳',
|
||
'designFiles.paste.label': '貼上',
|
||
'designFiles.previewOpen': '開啟',
|
||
'designFiles.previewClose': '關閉預覽',
|
||
'designFiles.modified': '修改於 {time} · {size}',
|
||
'designFiles.weeksAgo': '{n} 週前',
|
||
'designFiles.groupBy': '分組方式',
|
||
'designFiles.groupByKind': '類型',
|
||
'designFiles.groupByModified': '修改時間',
|
||
'designFiles.expandGroup': '展開',
|
||
'designFiles.collapseGroup': '折疊',
|
||
'designFiles.sectionPages': '頁面',
|
||
'designFiles.sectionScripts': '腳本',
|
||
'designFiles.sectionImages': '圖片',
|
||
'designFiles.sectionSketches': '草圖',
|
||
'designFiles.sectionLiveArtifacts': '即時成品',
|
||
'designFiles.sectionOther': '其它',
|
||
'designFiles.modifiedToday': '今天',
|
||
'designFiles.modifiedYesterday': '昨天',
|
||
'designFiles.modifiedPrevious7Days': '最近 7 天',
|
||
'designFiles.modifiedPrevious30Days': '最近 30 天',
|
||
'designFiles.modifiedOlder': '更早',
|
||
'designFiles.showMore': '再顯示 {n} 個',
|
||
'designFiles.kindHtml': 'HTML 頁面',
|
||
'designFiles.kindImage': '圖片',
|
||
'designFiles.kindSketch': '草圖',
|
||
'designFiles.kindText': '文字',
|
||
'designFiles.kindCode': '腳本',
|
||
'designFiles.kindPdf': 'PDF',
|
||
'designFiles.kindDocument': '文件',
|
||
'designFiles.kindPresentation': '簡報',
|
||
'designFiles.kindSpreadsheet': '試算表',
|
||
'designFiles.kindLiveArtifact': '即時成品',
|
||
'designFiles.kindBinary': '二進位',
|
||
'designFiles.kindFolder': '資料夾',
|
||
'designFiles.folderCount': '{n} 個檔案',
|
||
'designFiles.colName': '名稱',
|
||
'designFiles.colKind': '類型',
|
||
'designFiles.colModified': '修改時間',
|
||
'designFiles.perPage': '顯示',
|
||
'designFiles.all': '全部',
|
||
'designFiles.prev': '上一頁',
|
||
'designFiles.next': '下一頁',
|
||
'designFiles.jumpToPage': '跳轉到頁面',
|
||
'designFiles.pageInfo': '{start}–{end} / {total}',
|
||
'quickSwitcher.placeholder': '開啟檔案…',
|
||
'quickSwitcher.empty': '此專案中沒有檔案',
|
||
'quickSwitcher.noMatches': '無符合項目',
|
||
'quickSwitcher.navigate': '導覽',
|
||
'quickSwitcher.open': '開啟',
|
||
'quickSwitcher.close': '關閉',
|
||
'pasteDialog.title': '貼上文字',
|
||
'pasteDialog.hint': '將儲存到專案資料夾中,名稱隨你定。',
|
||
'pasteDialog.fileNameLabel': '檔案名稱',
|
||
'pasteDialog.namePlaceholder': 'notes.txt',
|
||
'pasteDialog.contentLabel': '內容',
|
||
'pasteDialog.contentPlaceholder': '在此貼上任何內容…',
|
||
'pasteDialog.save': '儲存',
|
||
'pasteDialog.cancel': '取消',
|
||
'sketch.save': '儲存草圖',
|
||
'sketch.cancel': '取消',
|
||
'sketch.saving': '儲存中…',
|
||
'sketch.saved': '已儲存',
|
||
'sketch.tooltipDirty': '尚未儲存',
|
||
'sketch.tooltipClean': '已儲存',
|
||
'fileViewer.empty': '請選擇一個檔案檢視。',
|
||
'fileViewer.loading': '載入中…',
|
||
'fileViewer.exportPptx': '匯出為 PPTX',
|
||
'fileViewer.openInNewTab': '在新分頁中開啟',
|
||
'fileViewer.copyPath': '複製路徑',
|
||
'fileViewer.copied': '已複製!',
|
||
'fileViewer.share': '分享',
|
||
'fileViewer.binaryMeta': '二進位 · {size}',
|
||
'fileViewer.binaryNote': '二進位檔案({size} 位元組)。請下載或在本機開啟檢視。',
|
||
'fileViewer.pdfMeta': 'PDF · {size}',
|
||
'fileViewer.documentMeta': '文件',
|
||
'fileViewer.presentationMeta': '簡報',
|
||
'fileViewer.spreadsheetMeta': '試算表',
|
||
'fileViewer.previewUnavailable': '無法產生預覽,請下載或開啟檔案檢視。',
|
||
'fileViewer.download': '下載',
|
||
'fileViewer.open': '開啟',
|
||
'fileViewer.imageMeta': '圖片 · {size}',
|
||
'fileViewer.reactMeta': 'React 元件 · {size}',
|
||
'fileViewer.sketchMeta': '草圖 · {size}',
|
||
'fileViewer.markdownStreamingMeta': '正在串流預覽…',
|
||
'fileViewer.markdownErrorMeta': '預覽可能不完整(產生錯誤)。',
|
||
'fileViewer.markdownStreamingStatus': '正在串流產生…顯示部分 Markdown。',
|
||
'fileViewer.markdownErrorStatus': '產生錯誤。正在顯示最後可用內容。',
|
||
'fileViewer.videoMeta': '影片 · {size}',
|
||
'fileViewer.audioMeta': '音訊 · {size}',
|
||
'fileViewer.reload': '重新載入',
|
||
'fileViewer.reloadDisk': '從磁碟重新載入',
|
||
'fileViewer.copy': '複製',
|
||
'fileViewer.copyTitle': '複製檔案內容',
|
||
'fileViewer.saveDisabled': '儲存(唯讀預覽)',
|
||
'fileViewer.save': '儲存',
|
||
'fileViewer.preview': '預覽',
|
||
'fileViewer.source': '程式碼',
|
||
'fileViewer.tweaks': '調整',
|
||
'fileViewer.tweaksUnavailable': '此作品中沒有調整面板',
|
||
'fileViewer.jsxModuleTitle': '無獨立預覽',
|
||
'fileViewer.jsxModuleBody': '此檔案是由其他頁面載入的元件模組。',
|
||
'fileViewer.jsxModuleCta': '請開啟轉譯它的頁面:',
|
||
'fileViewer.comment': '註釋',
|
||
'fileViewer.edit': '編輯',
|
||
'fileViewer.draw': '繪製',
|
||
'manualEdit.layers': "Layers",
|
||
'manualEdit.editableCount': "{count} editable",
|
||
'manualEdit.hiddenBadge': "隱藏",
|
||
'manualEdit.title': "Manual editor",
|
||
'manualEdit.selectLayer': "Select a layer",
|
||
'manualEdit.empty': "Click an element in the preview or choose a layer.",
|
||
'manualEdit.noEditableLayers': "未找到可編輯圖層。",
|
||
'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': '縮小',
|
||
'fileViewer.zoomIn': '放大',
|
||
'fileViewer.resetZoom': '重設縮放',
|
||
'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': '重新載入',
|
||
'fileViewer.previousSlide': '上一張',
|
||
'fileViewer.nextSlide': '下一張',
|
||
'fileViewer.slideNavAria': '投影片導覽',
|
||
'fileViewer.present': '簡報',
|
||
'fileViewer.presentInTab': '在當前分頁',
|
||
'fileViewer.presentFullscreen': '全螢幕',
|
||
'fileViewer.presentNewTab': '新分頁',
|
||
'fileViewer.exitPresentation': '離開簡報',
|
||
'fileViewer.shareLabel': "分享",
|
||
'fileViewer.exportPdf': '匯出為 PDF',
|
||
'fileViewer.exportPdfAllSlides': '匯出為 PDF(全部投影片)',
|
||
'fileViewer.exportPptxBusy': '請等待當前任務完成。',
|
||
'fileViewer.exportPptxHint': '請求代理將此設計轉換為 PPTX。',
|
||
'fileViewer.exportPptxNa': '此處暫不支援匯出 PPTX。',
|
||
'fileViewer.exportZip': '下載為 .zip',
|
||
'fileViewer.exportHtml': '匯出為獨立 HTML',
|
||
'fileViewer.exportMd': '匯出為 Markdown',
|
||
'fileViewer.exportImage': '匯出為圖片',
|
||
'fileViewer.exportImageFailed': '圖片擷取失敗,請重試或使用瀏覽器的截圖工具。',
|
||
'fileViewer.exportJsx': '匯出為 JSX',
|
||
'fileViewer.exportReactHtml': '匯出預覽 HTML',
|
||
'fileViewer.saveAsTemplate': '儲存為範本…',
|
||
'fileViewer.savingTemplate': '正在儲存範本…',
|
||
'fileViewer.savedTemplate': '已儲存為「{name}」',
|
||
'fileViewer.savedTemplateFail': '儲存範本失敗,請重試。',
|
||
'fileViewer.templateNamePrompt': '範本名稱',
|
||
'fileViewer.templateNameDefault': '未命名範本',
|
||
'fileViewer.templateDescPrompt': '簡短描述(可選 — 這個範本用於什麼情境?)',
|
||
'liveArtifact.refresh.button': '重新整理',
|
||
'liveArtifact.refresh.buttonTitle': '刷新此 live artifact',
|
||
'liveArtifact.refresh.loadingTitle': '正在載入 live artifact…',
|
||
'liveArtifact.refresh.noSourceTitle': '尚無已核准的唯讀重新整理來源。',
|
||
'liveArtifact.refresh.running': '重新整理中…',
|
||
'liveArtifact.refresh.runningMessage': '正在重新整理資料和預覽,可能需要一點時間。',
|
||
'liveArtifact.refresh.runningAction': '重新整理成功前會繼續顯示上一次預覽。',
|
||
'liveArtifact.refresh.successOne': '重新整理完成,資料已更新。',
|
||
'liveArtifact.refresh.successMany': '重新整理完成,資料已更新。',
|
||
'liveArtifact.refresh.successAction': '預覽已使用最新提交的資料重新載入。',
|
||
'liveArtifact.refresh.previousFailure': '上次重新整理失敗:{message}',
|
||
'liveArtifact.refresh.failureAction': '請檢查「重新整理紀錄」,修復來源或權限問題後重試。',
|
||
'liveArtifact.refresh.networkFailure': '重新整理請求失敗。請檢查網路連線後重試。',
|
||
'liveArtifact.refresh.genericFailure': '重新整理失敗。',
|
||
'liveArtifact.refresh.statusNever': '不可重新整理',
|
||
'liveArtifact.refresh.statusReady': '可重新整理',
|
||
'liveArtifact.refresh.statusSucceeded': '已是最新',
|
||
'liveArtifact.refresh.statusFailed': '重新整理失敗',
|
||
'fileViewer.deployToVercel': '部署到 Vercel',
|
||
'fileViewer.redeployToVercel': '重新部署',
|
||
'fileViewer.deployingToVercel': '正在部署到 Vercel…',
|
||
'fileViewer.deployProviderLabel': '部署平台',
|
||
'fileViewer.vercelProvider': 'Vercel',
|
||
'fileViewer.cloudflarePagesProvider': 'Cloudflare Pages',
|
||
'fileViewer.deployToProvider': '部署到 {provider}',
|
||
'fileViewer.redeployToProvider': '重新部署到 {provider}',
|
||
'fileViewer.deployingToProvider': '正在部署到 {provider}…',
|
||
'fileViewer.preparingPublicLink': '正在準備公開連結…',
|
||
'fileViewer.copyDeployLink': '複製連結',
|
||
'fileViewer.deployModalTitle': '部署',
|
||
'fileViewer.deployModalSubtitle': '使用所選平台帳號部署目前 HTML 預覽。',
|
||
'fileViewer.vercelToken': 'Vercel token',
|
||
'fileViewer.vercelTokenGetLink': '取得 Vercel token',
|
||
'fileViewer.vercelTokenPlaceholder': '貼上你的 Vercel token',
|
||
'fileViewer.vercelTokenReuseHint': '將使用已儲存的代碼。輸入新代碼可替換。',
|
||
'fileViewer.vercelTokenRequired': '請先輸入並儲存 Vercel 代碼。',
|
||
'fileViewer.cloudflareApiToken': 'Cloudflare API 代碼',
|
||
'fileViewer.cloudflareApiTokenGetLink': '取得 Cloudflare API 代碼',
|
||
'fileViewer.cloudflareApiTokenPlaceholder': '貼上你的 Cloudflare API 代碼',
|
||
'fileViewer.cloudflareApiTokenReuseHint': '將使用已儲存的 Cloudflare API 代碼。輸入新代碼可替換。',
|
||
'fileViewer.cloudflareApiTokenRequired': '請先輸入並儲存 Cloudflare API 代碼。',
|
||
'fileViewer.cloudflareApiTokenScopeHint': '代碼需要 Account: Cloudflare Pages: Edit 權限,以及帳號讀取權限。',
|
||
'fileViewer.vercelTeamId': '團隊 ID',
|
||
'fileViewer.vercelTeamSlug': '團隊標記',
|
||
'fileViewer.cloudflareAccountId': '帳戶 ID',
|
||
'fileViewer.cloudflareAccountIdHint': '必填。可在 Cloudflare 控制台中找到帳戶 ID。',
|
||
'fileViewer.cloudflareAccountIdRequired': '請先輸入並儲存 Cloudflare 帳戶 ID。',
|
||
'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': '可選',
|
||
'fileViewer.vercelPreviewOnly': '目前僅部署 Preview。',
|
||
'fileViewer.cloudflarePagesPreviewHint': 'Cloudflare Pages 使用 Direct Upload。',
|
||
'fileViewer.savingConfig': '儲存中…',
|
||
'fileViewer.deployConfigSaveFailed': '儲存 Vercel 設定失敗。',
|
||
'fileViewer.deployFailed': '部署失敗,請檢查 Vercel 設定後重試。',
|
||
'fileViewer.deployProviderConfigSaveFailed': '無法儲存 {provider} 設定。',
|
||
'fileViewer.deployProviderFailed': '{provider} 部署失敗。請檢查設定後重試。',
|
||
'fileViewer.deployResultLabel': '部署連結',
|
||
'fileViewer.deployLinkReady': '已就緒',
|
||
'fileViewer.deployLinkPreparingLabel': '公開連結準備中',
|
||
'fileViewer.deployLinkDelayed': '站點已部署,平台仍在準備公開連結。',
|
||
'fileViewer.deployLinkFailed': '自訂網域失敗',
|
||
'fileViewer.deployLinkProtectedLabel': '部署存取保護已開啟',
|
||
'fileViewer.deployLinkProtected': '站點已部署,但此預覽連結要求登入後才能存取。請關閉 Deployment Protection 或使用自訂網域。',
|
||
'fileViewer.retryLink': '立即重試',
|
||
|
||
'questionForm.submit': '提交',
|
||
'questionForm.skip': '跳過',
|
||
'questionForm.locked': '已回答',
|
||
|
||
'conv.switch': '切換對話',
|
||
'conv.label': '對話',
|
||
'conv.heading': '對話紀錄',
|
||
'conv.new': '+ 新建',
|
||
'conv.empty': '還沒有對話。',
|
||
'conv.untitled': '未命名對話',
|
||
'conv.renameTooltip': '雙擊重新命名',
|
||
'conv.delete': '刪除對話',
|
||
'conv.deleteConfirm': '確定刪除「{title}」?該操作會刪除其訊息。',
|
||
|
||
'agentPicker.label': '代理',
|
||
'agentPicker.modeChoose': '選擇執行模式',
|
||
'agentPicker.localCli': '本機 CLI',
|
||
'agentPicker.daemonOff': '守護程序未執行',
|
||
'agentPicker.byok': 'API · BYOK',
|
||
'agentPicker.selectAgent': '選擇已偵測到的程式碼代理 CLI',
|
||
'agentPicker.noAgents': 'PATH 中未發現代理',
|
||
'agentPicker.notInstalled': '未安裝',
|
||
'agentPicker.rescan': '重新掃描 PATH 中的代理',
|
||
|
||
'tool.openInTab': '在分頁中開啟 {name}',
|
||
'tool.open': '開啟',
|
||
'tool.todos': '待辦',
|
||
'tool.askQuestion': '問題',
|
||
'tool.askQuestionSubmit': '提交',
|
||
'tool.askQuestionPending': '等待你的回答',
|
||
'tool.askQuestionAnswered': '已回答',
|
||
'tool.todosExpand': '展開任務',
|
||
'tool.todosCollapse': '收起任務',
|
||
'tool.todosDone': '完成',
|
||
'tool.todosDismiss': '關閉任務清單',
|
||
'tool.write': '寫入',
|
||
'tool.edit': '編輯',
|
||
'tool.read': '讀取',
|
||
'tool.bash': 'Bash',
|
||
'tool.glob': 'Glob',
|
||
'tool.grep': 'Grep',
|
||
'tool.fetch': '擷取',
|
||
'tool.search': '搜尋',
|
||
'tool.lines': '{n} 行',
|
||
'tool.changeSingular': '處變更',
|
||
'tool.changePlural': '處變更',
|
||
'tool.in': '於 {path}',
|
||
'tool.hide': '隱藏',
|
||
'tool.output': '輸出',
|
||
'tool.running': '執行中…',
|
||
'tool.error': '錯誤',
|
||
'tool.done': '完成',
|
||
|
||
'assistant.role': '助手',
|
||
'assistant.workingLabel': '執行中',
|
||
'assistant.doneLabel': '已完成',
|
||
'assistant.feedbackPrompt': '意見回饋',
|
||
'assistant.feedbackPositive': '有幫助',
|
||
'assistant.feedbackNegative': '沒有幫助',
|
||
'assistant.feedbackReasonTitle': '選擇原因',
|
||
'assistant.feedbackReasonPositiveMatched': '理解了我的需求',
|
||
'assistant.feedbackReasonPositiveVisual': '視覺效果滿意',
|
||
'assistant.feedbackReasonPositiveUseful': '結構有幫助',
|
||
'assistant.feedbackReasonPositiveEasy': '方便繼續修改',
|
||
'assistant.feedbackReasonPositiveDesignSystem': '嚴格按照設計系統生成',
|
||
'assistant.feedbackReasonNegativeMissed': '沒有理解需求',
|
||
'assistant.feedbackReasonNegativeVisual': '視覺效果不理想',
|
||
'assistant.feedbackReasonNegativeIncomplete': '產物不完整',
|
||
'assistant.feedbackReasonNegativeHard': '不方便使用',
|
||
'assistant.feedbackReasonNegativeDesignSystem': '沒有嚴格按照設計系統生成',
|
||
'assistant.feedbackReasonOther': '其他',
|
||
'assistant.feedbackReasonPlaceholder': '補充說明...',
|
||
'assistant.feedbackReasonSubmit': '提交',
|
||
'assistant.emptyResponseLabel': '無輸出',
|
||
'assistant.emptyResponseMessage': '服務商結束了請求,但沒有返回文字或設計產物。請嘗試更換模型或服務商、檢查額度,或重試。',
|
||
'assistant.outTokens': '{n} 輸出',
|
||
'assistant.producedFiles': '本輪產出的檔案',
|
||
'assistant.openFile': '開啟',
|
||
'assistant.downloadFile': '下載',
|
||
'assistant.unfinishedLabel': '已停止,仍有未完成任務',
|
||
'assistant.unfinishedSummary': '剩餘 {n} 個任務',
|
||
'assistant.unfinishedMore': '還有 {n} 個',
|
||
'assistant.continueRemaining': '繼續剩餘任務',
|
||
'assistant.thinking': '思考中',
|
||
'assistant.systemReminder': '系統提示',
|
||
'assistant.waitingFirstOutput': '等待首批輸出中',
|
||
'assistant.statusBootingAgent': '正在啟動代理',
|
||
'assistant.statusStarting': '啟動中',
|
||
'assistant.statusRequesting': '正在傳送請求',
|
||
'assistant.statusThinking': '思考中',
|
||
'assistant.statusStreaming': '串流輸出中',
|
||
'assistant.slowHint':
|
||
'耗時比平時更久。一般 5–10 秒內會出現表單,可以「停止」後重新表達。',
|
||
'assistant.verbEditing': '編輯',
|
||
'assistant.verbWriting': '寫入',
|
||
'assistant.verbReading': '讀取',
|
||
'assistant.verbSearching': '搜尋',
|
||
'assistant.verbRunning': '執行',
|
||
'assistant.verbTodos': '待辦',
|
||
'assistant.verbFetching': '擷取',
|
||
'assistant.verbCalling': '呼叫',
|
||
|
||
'qf.answered': '已回答',
|
||
'qf.choose': '請選擇…',
|
||
'qf.required': '必填',
|
||
'qf.lockedSubmitted': '答案已傳送,代理將在本次工作階段後續使用。',
|
||
'qf.lockedPrev': '該表單來自先前的對話。',
|
||
'qf.hint': '挑選合適的選項;可選項可以跳過,代理會使用合理的預設值。',
|
||
'qf.submitDefault': '傳送答案',
|
||
'qf.submitDisabledTitle': '請先填寫必填項',
|
||
'qf.submitTitle': '傳送答案',
|
||
'qf.cardSelected': '已選',
|
||
'qf.cardRefs': '參考:',
|
||
'qf.cardSampleText': '飛燕環宇 · 0123',
|
||
|
||
'sketch.toolSelect': '選擇(佔位)',
|
||
'sketch.toolPen': '鋼筆',
|
||
'sketch.toolText': '文字',
|
||
'sketch.toolRect': '矩形',
|
||
'sketch.toolArrow': '箭頭',
|
||
'sketch.toolEraser': '橡皮擦',
|
||
'sketch.color': '顏色',
|
||
'sketch.strokeSize': '描邊粗細',
|
||
'sketch.undo': '復原',
|
||
'sketch.clear': '清除',
|
||
'sketch.close': '關閉',
|
||
'sketch.closeConfirm': '關閉草圖並放棄未儲存的變更嗎?',
|
||
'sketch.textPrompt': '請輸入文字:',
|
||
'sketch.textModalTitle': '新增文字',
|
||
|
||
'critiqueTheater.userFacingName': '設計評審團',
|
||
'critiqueTheater.roleDesigner': '設計師',
|
||
'critiqueTheater.roleCritic': '評審',
|
||
'critiqueTheater.roleBrand': '品牌',
|
||
'critiqueTheater.roleA11y': '無障礙',
|
||
'critiqueTheater.roleCopy': '文案',
|
||
'critiqueTheater.roundLabel': '第 {n} 輪 / 共 {m} 輪',
|
||
'critiqueTheater.mustFix': '{n} 項必改',
|
||
'critiqueTheater.composite': '綜合分',
|
||
'critiqueTheater.threshold': '門檻',
|
||
'critiqueTheater.consensus': '共識',
|
||
'critiqueTheater.interrupt': '中斷',
|
||
'critiqueTheater.interrupting': '中斷中…',
|
||
'critiqueTheater.interrupted': '已中斷',
|
||
'critiqueTheater.interruptedSummary': '已於第 {round} 輪中斷 · 最佳綜合分 {composite}',
|
||
'critiqueTheater.degradedHeading': '本次評審不可用',
|
||
'critiqueTheater.degradedReasonMalformed': '評審區塊格式錯誤,剖析器已拒絕。',
|
||
'critiqueTheater.degradedReasonOversize': '評審輸出超出了安全位元組預算。',
|
||
'critiqueTheater.degradedReasonAdapter': '介接器 {adapter} 不支援評審協定。',
|
||
'critiqueTheater.degradedReasonProtocol': '介接器 {adapter} 使用了不支援的協定版本。',
|
||
'critiqueTheater.degradedReasonMissingArtifact': '執行結束但未產出最終成果。',
|
||
'critiqueTheater.replay': '回放',
|
||
'critiqueTheater.replaySpeed': '回放速度',
|
||
'critiqueTheater.readOnly': '唯讀',
|
||
'critiqueTheater.shippedSummary': '已於第 {round} 輪發布 · 綜合分 {composite}',
|
||
'critiqueTheater.shippedBadge': '已發布',
|
||
'critiqueTheater.belowThresholdBadge': '低於門檻',
|
||
'critiqueTheater.timedOutBadge': '已逾時',
|
||
'critiqueTheater.failedHeading': '執行失敗',
|
||
'critiqueTheater.failedReasonCliExit': '智慧體 CLI 在評審完成前異常結束。',
|
||
'critiqueTheater.failedReasonPerRoundTimeout': '某一輪超出了時間預算。',
|
||
'critiqueTheater.failedReasonTotalTimeout': '整次執行超出了總時間預算。',
|
||
'critiqueTheater.failedReasonOrchestrator': '編排器內部錯誤。',
|
||
'critiqueTheater.transcriptEmpty': '尚無可回放的記錄。執行一次評審即可記錄。',
|
||
'critiqueTheater.transcriptLoading': '正在載入會談記錄…',
|
||
'critiqueTheater.transcriptError': '無法載入會談記錄:{error}',
|
||
'critiqueTheater.replaySpeedPaused': '暫停',
|
||
'critiqueTheater.replaySpeedInstant': '瞬時',
|
||
'critiqueTheater.replaySpeedLive': '即時',
|
||
'critiqueTheater.replaySpeedFast': '快進',
|
||
'critiqueTheater.settingsNav': '設計評審團',
|
||
'critiqueTheater.settingsNavHint': '為代理執行啟用五人設計評審',
|
||
'critiqueTheater.settingsEnabledLabel': '在代理執行期間顯示設計評審團',
|
||
'critiqueTheater.settingsEnabledDescription':
|
||
'啟用後,五人評審面板會在代理產生時同步進行,並在交付前為結果評分。可隨時中斷。',
|
||
'critiqueTheater.settingsEnabledProjectHint':
|
||
'已為此專案儲存。此專案的新執行將在伺服器端經過設計評審團。',
|
||
'critiqueTheater.settingsEnabledNoProjectHint':
|
||
'請開啟專案以將設定持久化至伺服器端。目前僅修改瀏覽器內偏好。',
|
||
|
||
'pet.title': '寵物',
|
||
'pet.tabBuiltIn': '內建',
|
||
'pet.tabBuiltInHint': 'Open Design 內建的精選寵物 — 一鍵領養。',
|
||
'pet.builtInEmpty': '目前無法載入內建寵物。等本地服務恢復後,重新整理「社群」頁籤再試。',
|
||
'pet.tabCustom': '自訂',
|
||
'pet.tabCustomHint': '自己命名、選符號或上傳精靈圖。',
|
||
'pet.tabCommunity': '社群',
|
||
'pet.tabCommunityHint': '來自 Codex 的孵化寵物 — 領養或用 AI 生成新的。',
|
||
'pet.tabsAria': '選擇寵物',
|
||
'pet.subtitle': '「顯示寵物」控制它是否出現在工作區;下方可以選擇內建、自訂或社群寵物。',
|
||
'pet.navTitle': '寵物',
|
||
'pet.navHint': '領養與自訂',
|
||
'pet.adopt': '領養',
|
||
'pet.adoptedBadge': '已領養',
|
||
'pet.adoptCallout': '領養一隻寵物',
|
||
'pet.changePet': '更換寵物',
|
||
'pet.wake': '顯示寵物',
|
||
'pet.tuck': '隱藏寵物',
|
||
'pet.wakeTitle': '在工作區顯示寵物。尚未選擇時,會預設使用第一隻內建寵物。',
|
||
'pet.tuckTitle': '從工作區隱藏寵物。',
|
||
'pet.settingsTitle': '開啟寵物設定',
|
||
'pet.useCustom': '使用我的寵物',
|
||
'pet.customTitle': '自訂你的寵物',
|
||
'pet.customHint': '挑一個名字、表情和主題色,浮窗會即時更新。',
|
||
'pet.customGreetingPlaceholder': '來自寵物的問候…',
|
||
'pet.fieldName': '名字',
|
||
'pet.fieldGlyph': '表情',
|
||
'pet.fieldGlyphHint': '建議使用單個 emoji(例如 🐝、🦄、🐢)。',
|
||
'pet.fieldGreeting': '問候語',
|
||
'pet.fieldAccent': '主題色',
|
||
'pet.fieldAccentCustom': '自訂顏色',
|
||
'pet.fieldAccentDefault': '預設主題色',
|
||
'pet.overlayAria': '寵物夥伴',
|
||
'pet.spriteAria': '{name} — 拖曳可移動,點擊與它互動',
|
||
'pet.spriteTitle': '{name} 來打招呼啦!點擊聊天。',
|
||
'pet.taskSummarySingle': '正在執行 {count} 個 Agent 任務。',
|
||
'pet.taskSummaryMultiple': '正在執行 {count} 個 Agent 任務,分布在 {projects} 個專案。',
|
||
'pet.taskSummaryRecentSingle': '最近完成 {count} 個 Agent 任務。',
|
||
'pet.taskSummaryRecentMultiple': '最近完成 {count} 個 Agent 任務。',
|
||
'pet.taskListAria': '執行中的 Agent 任務',
|
||
'pet.taskOpenProject': '開啟 {project}',
|
||
'pet.taskGroup.running': '正在執行',
|
||
'pet.taskGroup.queued': '等待中',
|
||
'pet.taskGroup.recent': '最近完成',
|
||
'pet.idleQuote.leonardo.text': '學習從不會使心靈疲憊。',
|
||
'pet.idleQuote.leonardo.author': '李奧納多·達文西',
|
||
'pet.idleQuote.michelangelo.text': '我看見天使在大理石中,於是不斷雕刻,直到讓他自由。',
|
||
'pet.idleQuote.michelangelo.author': '米開朗基羅',
|
||
'pet.idleQuote.bernini.text': '有兩樣東西能幫助雕塑家:光與影。',
|
||
'pet.idleQuote.bernini.author': '吉安·洛倫佐·貝尼尼',
|
||
'pet.idleQuote.raphael.text': '作畫時,人並不思考。',
|
||
'pet.idleQuote.raphael.author': '拉斐爾',
|
||
'pet.idleQuote.caravaggio.text': '作品若不是從生活中來,終究只是細枝末節。',
|
||
'pet.idleQuote.caravaggio.author': '卡拉瓦喬',
|
||
'pet.idleQuote.rodin.text': '最重要的是被打動、去愛、去希望、去顫抖、去生活。',
|
||
'pet.idleQuote.rodin.author': '奧古斯特·羅丹',
|
||
'pet.composerTitle': '寵物 — 喚醒、收起或挑一隻',
|
||
'pet.composerMenuTitle': '寵物',
|
||
'pet.composerMenuHint': '小提示:輸入 /pet 即可切換',
|
||
'pet.composerOpenSettings': '管理寵物',
|
||
'pet.welcomeTeaserTitle': '領養一隻寵物',
|
||
'pet.welcomeTeaserBody': '一隻小小的浮窗夥伴,會陪你工作。',
|
||
'pet.welcomeTeaserCta': '挑一隻',
|
||
'pet.imageUpload': '上傳形象',
|
||
'pet.imageReplace': '替換形象',
|
||
'pet.imageRemove': '改用 emoji',
|
||
'pet.imageHintIdle': '支援 PNG / JPG / WebP / GIF / SVG。要做精靈動畫?傳一張橫向序列圖並設定影格數。',
|
||
'pet.imageHintActive': '正在使用你上傳的形象。把影格數設為 > 1,橫向序列圖就會動起來。',
|
||
'pet.fieldFrames': '影格數',
|
||
'pet.fieldFramesHint': '1 = 靜態;> 1 = 橫向序列圖。',
|
||
'pet.fieldFps': '速度 (fps)',
|
||
'pet.fieldFpsHint': '控制序列圖播放速度。',
|
||
'pet.atlasImport': '匯入 Codex 精靈圖',
|
||
'pet.atlasImportTitle': '匯入 hatch-pet 8x9 / 192x208 精靈圖(PNG 或 WebP)。',
|
||
'pet.atlasPickerTitle': '選擇動畫列',
|
||
'pet.atlasPickerHint': 'Codex 寵物自帶 9 個動畫狀態。預設會保留完整精靈圖,寵物會根據懸停、拖曳方向、長時間閒置自動切換動畫。也可以只保留一個迴圈。',
|
||
'pet.atlasCancel': '捨棄精靈圖',
|
||
'pet.atlasAdopt': '鎖定這一列',
|
||
'pet.atlasAdoptFull': '使用完整精靈圖(動態)',
|
||
'pet.atlasAdoptFullTitle': '保留所有動畫列,讓寵物對懸停、拖曳方向以及長時間閒置做出反應。',
|
||
'pet.atlasAdoptRowTitle': '只把高亮的這一列切成單迴圈條帶。',
|
||
'pet.atlasActiveHint': '動態精靈圖已啟用 — 寵物會依據你的互動(懸停、拖曳、閒置)自動切換動畫。',
|
||
'pet.atlasRow.idle': '待機',
|
||
'pet.atlasRow.running-right': '向右跑',
|
||
'pet.atlasRow.running-left': '向左跑',
|
||
'pet.atlasRow.waving': '揮手',
|
||
'pet.atlasRow.jumping': '跳躍',
|
||
'pet.atlasRow.failed': '失敗',
|
||
'pet.atlasRow.waiting': '等待',
|
||
'pet.atlasRow.running': '奔跑',
|
||
'pet.atlasRow.review': '審視',
|
||
'pet.hatchTitle': '用 AI 孵化新寵物',
|
||
'pet.hatchHint': '透過聊天呼叫內建的 hatch-pet 技能產生 Codex 風格的精靈圖,完成後回到這裡匯入。',
|
||
'pet.hatchConcept': '寵物概念(可選)',
|
||
'pet.hatchConceptPlaceholder': '例如:一隻穿著毛衣的像素風柴犬',
|
||
'pet.hatchCopy': '複製提示詞',
|
||
'pet.hatchCopied': '已複製!',
|
||
'pet.hatchFoot': '技能儲存好寵物後,回到這裡點擊「匯入 Codex 精靈圖」即可。',
|
||
'pet.slashPopoverAria': '斜線命令',
|
||
'pet.slashPopoverTitle': '命令',
|
||
'pet.slashPopoverHint': '↑↓ 切換 · enter 選擇 · esc 關閉',
|
||
'pet.slashPet': '切換、領養或跳到寵物設定。',
|
||
'pet.slashPetWake': '喚醒漂浮的寵物。',
|
||
'pet.slashPetTuck': '把寵物收起來。',
|
||
'pet.slashHatch': '呼叫 hatch-pet 技能生成一隻 Codex 寵物。',
|
||
'pet.slashHatchArg': '<概念>',
|
||
'pet.slashSearch': '透過 OD research 指令搜尋網頁。',
|
||
'pet.slashSearchArg': '<查詢>',
|
||
'pet.codexTitle': '最近孵化',
|
||
'pet.codexSubtitle': 'hatch-pet 技能打包的寵物會出現在這裡,可一鍵領養。',
|
||
'pet.codexSubtitleWithDir': '正在掃描 {dir},尋找 hatch-pet 技能打包的寵物。',
|
||
'pet.codexEmpty': '還沒有孵化的寵物。在聊天中輸入 /hatch 來生成一隻。',
|
||
'pet.codexLoading': '正在尋找已孵化的寵物…',
|
||
'pet.codexRefresh': '重新整理',
|
||
'pet.codexAdopt': '領養',
|
||
'pet.codexAdopting': '領養中…',
|
||
'pet.communitySync': '下載社群寵物',
|
||
'pet.communitySyncing': '下載中…',
|
||
'pet.communitySyncTitle': '從 Codex Pet Share 與 j20 Hatchery 同步最新寵物到 ~/.codex/pets/。',
|
||
'pet.communitySyncDone': '已同步 {wrote} 個新寵物(共 {total} 個)。',
|
||
'pet.communitySyncFailed': '同步失敗:{error}',
|
||
'pet.codexBundled': '內建',
|
||
'pet.codexBundledTitle': 'Open Design 內建寵物,無需下載。',
|
||
|
||
'settings.notifications': '通知',
|
||
'settings.notificationsHint': '任務完成時的音效和桌面通知',
|
||
'settings.notifyCompletionSound': '完成提示音',
|
||
'settings.notifyCompletionSoundHint': '一輪任務結束時播放,預設關閉',
|
||
'settings.notifySuccessSound': '成功音色',
|
||
'settings.notifyFailureSound': '失敗音色',
|
||
'settings.notifyDesktop': '桌面通知',
|
||
'settings.notifyDesktopHint': '視窗不在前景時跳出系統通知',
|
||
'settings.notifyDesktopBlocked': '瀏覽器已拒絕通知權限,請在網站設定中開啟',
|
||
'settings.notifyDesktopUnsupported': '當前環境不支援桌面通知',
|
||
'settings.notifyTest': '測試通知',
|
||
'settings.notifyTestSent': '測試通知已送出;如果沒有彈窗,請檢查瀏覽器和系統通知設定。',
|
||
'settings.notifyTestFailed': '通知呼叫失敗,請檢查瀏覽器和系統通知設定。',
|
||
'settings.notifySoundDing': '叮',
|
||
'settings.notifySoundChime': '風鈴',
|
||
'settings.notifySoundTwoToneUp': '上行雙音',
|
||
'settings.notifySoundPluck': '撥弦',
|
||
'settings.notifySoundBuzz': '蜂鳴',
|
||
'settings.notifySoundTwoToneDown': '下行雙音',
|
||
'settings.notifySoundThud': '低響',
|
||
'settings.skills': '技能',
|
||
'settings.skillsHint': '代理可在任務中呼叫的功能技能',
|
||
'settings.skillsNew': '新增技能',
|
||
'settings.skillsEmpty': '請於左側選擇一個技能,或新增一個。',
|
||
'settings.skillsEdit': '編輯',
|
||
'settings.skillsDelete': '刪除',
|
||
'settings.skillsDeleteConfirm': '確認刪除',
|
||
'settings.skillsName': '名稱',
|
||
'settings.skillsTriggers': '觸發詞(逗號或換行分隔)',
|
||
'settings.skillsDescription': '描述',
|
||
'settings.skillsBody': 'SKILL.md 內容',
|
||
'settings.skillsCreate': '建立',
|
||
'settings.skillsSave': '儲存',
|
||
'settings.skillsSaving': '儲存中…',
|
||
'settings.skillsFiles': '檔案',
|
||
'settings.skillsNoFiles': '此技能資料夾沒有檔案。',
|
||
'settings.skillsNameRequired': '技能名稱為必填項。',
|
||
'settings.skillsBodyRequired': '技能內容為必填項。',
|
||
'settings.designSystems': '設計系統',
|
||
'settings.designSystemsHint': '管理首頁 Gallery 中顯示的設計系統',
|
||
'settings.designSystemsInstalled': '已安裝',
|
||
'settings.designSystemsAdd': '新增設計系統',
|
||
'settings.designSystemsHiddenCount': '{count} 個已從首頁 Gallery 隱藏',
|
||
'settings.designSystemsShowAll': '顯示全部',
|
||
'settings.designSystemsShowHidden': '顯示隱藏項目',
|
||
'settings.designSystemsSource': '來源',
|
||
'settings.designSystemsSourceLocal': '本機',
|
||
'settings.designSystemsSourceGithub': 'GitHub',
|
||
'settings.designSystemsStructure': '結構',
|
||
'settings.designSystemsModeHybrid': '混合',
|
||
'settings.designSystemsModeNormalized': '規範化',
|
||
'settings.designSystemsModeVerbatim': '原樣保留',
|
||
'settings.designSystemsCraft': '工藝',
|
||
'settings.designSystemsCraftColor': '色彩',
|
||
'settings.designSystemsCraftAccessibility': '無障礙',
|
||
'settings.designSystemsGithubUrl': 'GitHub URL',
|
||
'settings.designSystemsProjectPath': '專案路徑',
|
||
'settings.designSystemsImportGithub': '從 GitHub 匯入',
|
||
'settings.designSystemsImportProject': '從專案匯入',
|
||
'settings.designSystemsImportedStatus': '已匯入 {title}',
|
||
'settings.designSystemsViewImported': '查看匯入的設計系統',
|
||
'settings.designSystemsCategory': '分類',
|
||
'settings.designSystemsAllCategories': '所有分類',
|
||
'settings.designSystemsShowInHomeGallery': '在首頁 Gallery 中顯示',
|
||
'settings.librarySkills': '技能',
|
||
'settings.libraryDesignSystems': '設計系統',
|
||
'settings.librarySearch': '搜尋...',
|
||
'settings.libraryAll': '全部',
|
||
'settings.libraryPreview': '預覽',
|
||
'settings.libraryPreviewClose': '關閉',
|
||
'settings.libraryLoading': '載入中...',
|
||
'settings.libraryNoResults': '沒有符合的項目。',
|
||
'settings.libraryEnabled': '已啟用',
|
||
'settings.libraryDisabled': '已停用',
|
||
'settings.connectorsNavHint': '外部系統連線',
|
||
'settings.connectorsHint': '管理此裝置的連接器與工具供應商設定。',
|
||
'settings.connectorsComposioApiKey': 'Composio API 金鑰',
|
||
'settings.connectorsSavedTitle': '已儲存到本機 daemon',
|
||
'settings.connectorsSavedWithTail': '已儲存 · ••••{tail}',
|
||
'settings.connectorsSaved': '已儲存',
|
||
'settings.connectorsGetApiKey': '取得 API 金鑰',
|
||
'settings.connectorsReplaceKeyPlaceholder': '貼上新金鑰以取代已儲存的金鑰',
|
||
'settings.connectorsApiKeyPlaceholder': '貼上 Composio API 金鑰',
|
||
'settings.connectorsClear': '清除',
|
||
'settings.connectorsClearConfirmTitle': '清除已儲存的 Composio API 金鑰?',
|
||
'settings.connectorsClearConfirmBody': '移除金鑰會將此工作區下所有的 Composio 連接器全部斷開。已連線的帳戶、OAuth 授權與工具存取權限都將一併移除。',
|
||
'settings.connectorsClearConfirmContinue': '繼續',
|
||
'settings.connectorsClearFinalTitle': '此動作會斷開所有連接器',
|
||
'settings.connectorsClearFinalBody': '無法復原。貼上新金鑰後,每個整合都必須從頭重新連線。',
|
||
'settings.connectorsClearFinalConfirm': '刪除金鑰並斷線',
|
||
'settings.connectorsClearArming': '稍候\u2026',
|
||
'settings.connectorsClearCancel': '取消',
|
||
'settings.connectorsSaveKey': "儲存金鑰",
|
||
'settings.connectorsSaveKeyTitle': "將此金鑰送往本機 daemon",
|
||
'settings.connectorsKeySaving': "儲存中…",
|
||
'settings.connectorsKeySaved': "已儲存 ✓",
|
||
'settings.connectorsKeyError': "儲存金鑰失敗。請確認本機 daemon 已啟動後再試。",
|
||
'settings.connectorsHelpSaved': '你的金鑰會解鎖下方目錄,並保留在本機 daemon 中。貼上新金鑰可取代,或清除以移除。',
|
||
'settings.connectorsHelpUnsaved': "尚未儲存 — 點擊「儲存金鑰」即可將其存入本機 daemon,並解鎖下方目錄。",
|
||
'settings.connectorsHelpEmpty': '新增金鑰以解鎖下方目錄。金鑰會本機儲存在 daemon 中,絕不會透過環境變數傳送。',
|
||
'settings.connectorsLoadingSavedKey': '正在從本機 daemon 檢查已儲存的金鑰…',
|
||
'settings.autosaveSaving': "儲存中…",
|
||
'settings.autosaveSaved': "所有變更已儲存",
|
||
'settings.autosaveError': "無法儲存變更。本機 daemon 可能離線。",
|
||
'settings.libraryToggleLabel': '切換',
|
||
// Memory (auto-extracted personalization saved as on-disk markdown)
|
||
'settings.memory': '記憶',
|
||
'settings.memoryHint': '從對話中自動沉澱的個人化資訊',
|
||
'settings.memoryDescription': '自動從聊天中提取出的關於你的偏好和上下文的事實,以 Markdown 檔案形式保存,並自動注入到每次對話中。',
|
||
'settings.memoryEnabled': '已啟用',
|
||
'settings.memoryDisabled': '已關閉',
|
||
'settings.memoryEnableLabel': '啟用記憶注入',
|
||
'settings.memoryDisabledBanner': '記憶目前已關閉。已有的事實檔案保留在磁碟上,但不會被注入到新對話,也不會從新對話中提取新事實。',
|
||
'settings.memoryNew': '新增記憶',
|
||
'settings.memoryEdit': '編輯',
|
||
'settings.memoryDelete': '刪除',
|
||
'settings.memoryPreview': '預覽',
|
||
'settings.memoryEmpty': '還沒有記憶。',
|
||
'settings.memoryEmptyHintZh': '记住: 用户偏好深色主题',
|
||
'settings.memoryEmptyHintEn': 'I prefer dark mode',
|
||
'settings.memoryName': '名稱',
|
||
'settings.memoryDesc': '一行描述',
|
||
'settings.memoryBody': '記憶正文(支援 Markdown)',
|
||
'settings.memoryBodyHint': '先寫規則本身,再補「為什麼」和「何時適用」兩行。',
|
||
'settings.memoryStartersLabel': '不知道寫什麼?點一下填到表單裡:',
|
||
'settings.memoryStarterUserName': '我的角色',
|
||
'settings.memoryStarterUserDesc': '我是一名前端工程師,主要做 SaaS 設計工具',
|
||
'settings.memoryStarterUserBody': '- 角色:高級前端工程師\n- 技術棧:React、TypeScript、Vite\n- 方向:設計 / 協作工具\n- 時區:GMT+8(Asia/Shanghai)\n\n何時適用:任何對話裡舉例時優先用前端 / Web 場景。',
|
||
'settings.memoryStarterFeedbackName': 'UI 偏好',
|
||
'settings.memoryStarterFeedbackDesc': '深色主題、字號偏大、資訊密度低',
|
||
'settings.memoryStarterFeedbackBody': '- 主題:預設深色\n- 正文字號:≥ 18px\n- 資訊密度:留白多一些,一屏不要塞太多東西\n\n為什麼:長時間使用眼睛不容易累。\n何時適用:讓你畫 UI、網頁、PPT 時都按這個走。',
|
||
'settings.memoryStarterProjectName': '當前專案',
|
||
'settings.memoryStarterProjectDesc': 'Open Design v0.5 — 聊天驅動的設計編輯器',
|
||
'settings.memoryStarterProjectBody': '- 目標:本季交付聊天驅動的編輯體驗\n- 優先級:串流渲染、本地多模態、離線優先\n- 技術棧:Next.js 16、Express daemon、SQLite\n\n何時適用:與本專案相關的所有對話。',
|
||
'settings.memorySaveHint': '不會自動儲存 — 點擊「建立」/「儲存」才會生效。',
|
||
'settings.memoryIndexSaveHint': '索引不會自動儲存 — 改完後點擊「儲存索引」才會生效。',
|
||
'settings.memoryIndexUnsaved': '有尚未儲存的修改',
|
||
'settings.memoryFlashCreated': '✓ 已建立',
|
||
'settings.memoryFlashSaved': '✓ 已儲存',
|
||
'settings.memoryFlashDeleted': '✓ 已刪除',
|
||
'settings.memoryFlashIndexSaved': '✓ 索引已儲存',
|
||
'settings.memoryFlashPathCopied': '✓ 路徑已複製',
|
||
'settings.memoryNameLabel': '標題',
|
||
'settings.memoryTypeLabel': '類型',
|
||
'settings.memoryDescLabel': '描述',
|
||
'settings.memoryBodyLabel': '內容',
|
||
'settings.memoryTypeUser': '使用者',
|
||
'settings.memoryTypeFeedback': '回饋',
|
||
'settings.memoryTypeProject': '專案',
|
||
'settings.memoryTypeReference': '參考',
|
||
'settings.memoryIndex': 'MEMORY.md(索引)',
|
||
'settings.memoryIndexSave': '儲存索引',
|
||
'settings.memoryIndexReset': '重設',
|
||
'settings.memoryToastChanged': '記憶已更新',
|
||
'settings.memoryToastClickHint': '查看',
|
||
'settings.memoryAll': '全部',
|
||
'settings.memoryExtractions': '抽取歷史',
|
||
'settings.memoryExtractionsHint': '最近的 LLM 抽取記錄。每次對話結束後,啟發式正則會先跑,LLM 抽取在背景非同步進行。',
|
||
'settings.memoryExtractionsEmpty': '暫無抽取記錄。下一次對話結束後會出現在這裡。',
|
||
'settings.memoryExtractionsRefresh': '重新整理',
|
||
'settings.memoryExtractionsRefreshing': '重新整理中…',
|
||
'settings.memoryExtractionPhaseRunning': '抽取中…',
|
||
'settings.memoryExtractionPhaseSuccess': '成功',
|
||
'settings.memoryExtractionPhaseSkipped': '已跳過',
|
||
'settings.memoryExtractionPhaseFailed': '失敗',
|
||
'settings.memoryExtractionSkipNoProvider': '未設定 API key,LLM 抽取未執行。',
|
||
'settings.memoryExtractionSkipDisabled': '記憶功能已關閉。',
|
||
'settings.memoryExtractionSkipEmpty': '使用者訊息為空,沒有可抽取的內容。',
|
||
'settings.memoryExtractionSkipNoMatch': '本輪沒有命中任何正則規則。',
|
||
'settings.memoryExtractionKindHeuristic': '正則',
|
||
'settings.memoryExtractionKindLlm': 'LLM',
|
||
'settings.memoryExtractionProviderEnv': '環境變數',
|
||
'settings.memoryExtractionProviderMediaConfig': '媒體設定',
|
||
'settings.memoryExtractionProposed': '候選',
|
||
'settings.memoryExtractionWritten': '寫入',
|
||
'settings.memoryExtractionDuration': '耗時',
|
||
'settings.memoryNoProviderBannerTitle': 'LLM 抽取未啟用',
|
||
'settings.memoryNoProviderBannerBody': '未找到可用的 API key,LLM 抽取已跳過。可以在媒體提供者裡填入 OpenAI key,或設定環境變數 ANTHROPIC_API_KEY / OPENAI_API_KEY 來啟用。啟發式抽取仍在執行。',
|
||
'settings.memoryExtractionProviderOverride': '記憶設定',
|
||
'settings.memoryExtractionDelete': '刪除',
|
||
'settings.memoryExtractionsClear': '清空',
|
||
'settings.memoryExtractionsClearTitle': '清空整個抽取歷史',
|
||
'settings.libraryInstall': '安裝',
|
||
'settings.libraryInstallGithub': 'GitHub',
|
||
'settings.libraryInstallLocal': '本機路徑',
|
||
'settings.libraryInstallUrl': 'https://github.com/owner/repo',
|
||
'settings.libraryInstallPath': '/path/to/skill-folder',
|
||
'settings.libraryInstallButton': '安裝',
|
||
'settings.libraryUninstall': '解除安裝',
|
||
'settings.libraryBuiltIn': '內建',
|
||
'settings.libraryInstalled': '已安裝',
|
||
'notify.successTitle': '任務已完成',
|
||
'notify.failureTitle': '任務失敗',
|
||
'notify.successBody': '一輪回答已經寫完。',
|
||
'notify.failureBody': '本輪任務出錯,請查看錯誤訊息。',
|
||
'updater.available': '有可用更新',
|
||
'updater.availableBody': 'Open Design {version} 可用。下載完成後即可開啟安裝器。',
|
||
'updater.checking': '正在檢查更新',
|
||
'updater.download': '下載更新',
|
||
'updater.downloading': '正在下載更新',
|
||
'updater.downloadingPercent': '正在下載更新 {percent}%',
|
||
'updater.done': '完成',
|
||
'updater.failed': '更新失敗',
|
||
'updater.installerOpenBody': '安裝器已開啟。Open Design 正在結束,以便你完成更新。',
|
||
'updater.installerOpened': '安裝器已開啟',
|
||
'updater.later': '稍後',
|
||
'updater.openFailedFallback': '無法開啟安裝器。',
|
||
'updater.openInstaller': '安裝更新',
|
||
'updater.opening': '正在開啟安裝器…',
|
||
'updater.quitButton': '結束 Open Design',
|
||
'updater.quitFailedBody': '安裝器已開啟,但 Open Design 無法結束。替換應用程式前請先結束 Open Design。',
|
||
'updater.quitFailedTitle': '無法結束',
|
||
'updater.quitting': '正在結束…',
|
||
'updater.ready': '更新已就緒',
|
||
'updater.readyGeneric': '新版本已就緒。Open Design 會關閉並開啟安裝器。',
|
||
'updater.readyVersion': 'Open Design {version} 已就緒。Open Design 會關閉並開啟安裝器。',
|
||
'updater.upToDate': '您已經是最新版本啦',
|
||
'settings.memoryModelInlineLabel': 'Memory 模型',
|
||
'settings.memoryModelInlineSameAsChat': '與聊天一致',
|
||
'settings.memoryModelInlineSameAsChatWithModel': '與聊天一致({model})',
|
||
'settings.memoryModelInlineSameAsChatWithProvider': '與聊天一致({provider})',
|
||
'settings.memoryModelInlineHintCli': '可選。支援時會直接使用目前的 Local CLI;只在想覆寫預設模型時選擇。',
|
||
'settings.memoryModelInlineHintCliConstrained': '可選。支援時會直接使用目前的 Local CLI;{provider} 只作為不支援 CLI 時的備用供應商。',
|
||
'settings.memoryModelInlineHintByok': '可選。沿用你聊天用的 API key,在同供應商上換成(通常更便宜的)模型跑背景 memory 擷取。',
|
||
'settings.memoryModelInlineFlashSaved': '已儲存',
|
||
'settings.memoryModelInlineFlashCleared': '已清除',
|
||
'settings.orbit.eyebrow': '自動化',
|
||
'settings.orbit.title': 'Orbit',
|
||
'settings.orbit.navHint': '每日連接器摘要',
|
||
'settings.orbit.lede': '依排程收集連接器活動,並將結果發布為可重新整理的 live artifact。',
|
||
'settings.orbit.statusOnTitle': '每日排程執行已開啟',
|
||
'settings.orbit.statusOffTitle': '每日排程執行已關閉',
|
||
'settings.orbit.statusActive': '啟用',
|
||
'settings.orbit.statusOff': '關閉',
|
||
'settings.orbit.runTitle': '啟動一次 Orbit 執行並開啟即時對話',
|
||
'settings.orbit.running': '執行中…',
|
||
'settings.orbit.runOpen': '立即執行',
|
||
'settings.orbit.dailySummaryTitle': '每日摘要',
|
||
'settings.orbit.dailySummarySub': '每天在排定的本地時間執行一次。',
|
||
'settings.orbit.on': '開啟',
|
||
'settings.orbit.off': '關閉',
|
||
'settings.orbit.runTimeTitle': '執行時間',
|
||
'settings.orbit.runTimeSub': '預設 08:00。儲存後套用到 daemon 排程。',
|
||
'settings.orbit.runTimeAria': '每日 Orbit 執行時間',
|
||
'settings.orbit.nextRun': '下次執行',
|
||
'settings.orbit.nextRunScheduledAfterSave': '儲存後排程',
|
||
'settings.orbit.schedule': '排程',
|
||
'settings.orbit.pausedManualOnly': '已暫停 — 僅手動執行',
|
||
'settings.orbit.templateTitle': '提示詞範本',
|
||
'settings.orbit.templateMissing': '範本 {id} 尚未安裝。',
|
||
'settings.orbit.templateMissingOption': '{id}(缺少)',
|
||
'settings.orbit.templateMissingInstall': '安裝 Orbit skill 以引導提示詞。',
|
||
'settings.orbit.templateMissingPickAnother': '從下拉選單選擇其他範本。',
|
||
'settings.orbit.templateResetTitle': '重設為 {id}',
|
||
'settings.orbit.templateReset': '重設',
|
||
'settings.orbit.templateHelp': '用 skill 引導 Orbit — 所選範本的範例提示詞會注入每次 Orbit 執行,讓摘要遵循該範本結構。',
|
||
'settings.orbit.templateAria': 'Orbit 提示詞範本',
|
||
'settings.orbit.templatesLoading': '正在載入範本…',
|
||
'settings.orbit.templatesOptgroup': 'Orbit skill 範本',
|
||
'settings.orbit.lastRun': '上次執行',
|
||
'settings.orbit.triggerManual': '手動',
|
||
'settings.orbit.triggerScheduled': '排程',
|
||
'settings.orbit.meterAria': '成功 {succeeded},略過 {skipped},失敗 {failed},共檢查 {checked}',
|
||
'settings.orbit.countChecked': '已檢查',
|
||
'settings.orbit.countSucceeded': '成功',
|
||
'settings.orbit.countSkipped': '已略過',
|
||
'settings.orbit.countFailed': '失敗',
|
||
'settings.orbit.runError': '無法執行 Orbit。請確認本機 daemon 正在執行且連接器已設定。',
|
||
'settings.orbit.gateAriaLabel': "使用 Orbit 需要先設定連接器",
|
||
'settings.orbit.gateEyebrow': "需要先完成設定",
|
||
'settings.orbit.gateTitle': "連接一個工具,讓 Orbit 開始運作",
|
||
'settings.orbit.gateBody': "Orbit 會彙整你已連接服務的活動。你目前還沒有任何連接 —— 至少加入一個整合,讓 Orbit 有內容可回報。",
|
||
'settings.orbit.gateBodyNoKey': "Orbit 會彙整連接器的活動,而連接器透過 Composio 執行。在「連接器」中填入 Composio API 金鑰即可解鎖目錄並挑選第一個整合。",
|
||
'settings.orbit.gateAction': "開啟連接器",
|
||
'settings.orbit.gateActionNoKey': "設定 Composio",
|
||
'settings.orbit.gateLoading': "正在檢查連接器…",
|
||
'settings.orbit.controlsLockedBadge': "已鎖定",
|
||
'settings.orbit.controlsLockedHint': "連接一個工具後即可解鎖 Orbit 的排程與範本設定。",
|
||
'settings.orbit.artifactKickerLive': 'live artifact',
|
||
'settings.orbit.artifactKickerLegacy': '舊版摘要',
|
||
'settings.orbit.artifactTitle': '每日 Orbit 活動摘要',
|
||
'settings.orbit.artifactMetaLive': '由連接器活動產生的可重新整理 HTML artifact。',
|
||
'settings.orbit.artifactMetaLegacy': '在啟用 live artifact 支援之前產生 — 再次執行 Orbit 以發布一個。',
|
||
'settings.orbit.copyMarkdownTitle': '複製 Markdown 摘要到剪貼簿',
|
||
'settings.orbit.copied': '已複製',
|
||
'settings.orbit.copy': '複製',
|
||
'settings.orbit.openArtifact': '開啟 artifact',
|
||
'settings.orbit.sourceMarkdown': '來源 Markdown',
|
||
'liveArtifact.viewer.tabPreview': '預覽',
|
||
'liveArtifact.viewer.tabCode': '程式碼',
|
||
'liveArtifact.viewer.tabData': '資料',
|
||
'liveArtifact.viewer.tabRefreshHistory': '重新整理歷史',
|
||
'liveArtifact.viewer.dataEmpty': '沒有可用的 data.json 快取。',
|
||
'liveArtifact.viewer.code.templateHeading': '範本 HTML',
|
||
'liveArtifact.viewer.code.renderedHeading': '渲染後 HTML',
|
||
'liveArtifact.viewer.code.templateHelp': '與 data.json 搭配產生預覽的可編輯範本。',
|
||
'liveArtifact.viewer.code.renderedHelp': 'Preview 目前載入的已產生 index.html。',
|
||
'liveArtifact.viewer.code.variantAria': '程式碼版本',
|
||
'liveArtifact.viewer.code.variantTemplate': '範本',
|
||
'liveArtifact.viewer.code.variantRendered': '已渲染',
|
||
'liveArtifact.viewer.code.loading': '正在載入程式碼…',
|
||
'liveArtifact.viewer.code.unavailable': '程式碼尚不可用。',
|
||
'liveArtifact.viewer.code.empty': '此程式碼檔案是空的。',
|
||
// Diagnostics export
|
||
'diagnostics.exportTitle': '匯出診斷日誌',
|
||
'diagnostics.exportButton': '匯出診斷日誌',
|
||
'diagnostics.exportHint': '將近期的應用日誌與機器資訊打包成 zip,方便傳給我們排查問題。',
|
||
'diagnostics.exporting': '匯出中…',
|
||
'diagnostics.exportSuccess': '診斷日誌已儲存至 {path}',
|
||
'diagnostics.exportFailed': '匯出診斷日誌失敗:{message}',
|
||
// Plugin card actions (issue #2079)
|
||
'pluginCard.details': '詳情',
|
||
'pluginCard.use': '使用',
|
||
'pluginCard.useWithQuery': '帶查詢使用',
|
||
'pluginCard.applying': '正在套用…',
|
||
'pluginCard.publish': '發布',
|
||
'pluginCard.contribute': '貢獻',
|
||
'pluginCard.starting': '正在啟動…',
|
||
'pluginCard.detailsAria': '檢視 {title} 的詳情',
|
||
'pluginCard.chooseUseAria': '選擇 {title} 的使用方式',
|
||
'pluginCard.useOptionsAria': '{title} 的使用選項',
|
||
'pluginCard.shareAria': '分享 {title}',
|
||
'pluginCard.publishAria': '將 {title} 發布為 GitHub 儲存庫',
|
||
'pluginCard.publishTitle': '將外掛發布為 GitHub 儲存庫',
|
||
'pluginCard.contributeAria': '將 {title} 貢獻至 Open Design',
|
||
'pluginCard.contributeTitle': '透過 pull request 將外掛貢獻至 Open Design',
|
||
'skillPluginCandidate.createForMe': '幫我建立',
|
||
'skillPluginCandidate.contributeToMain': '貢獻到主倉庫',
|
||
'skillPluginCandidate.publishRepo': '發布倉庫',
|
||
'skillPluginCandidate.dismiss': '忽略',
|
||
'skillPluginCandidate.repoDescription': '這個倉庫看起來可以做成外掛。',
|
||
};
|