mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +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>
1784 lines
118 KiB
TypeScript
1784 lines
118 KiB
TypeScript
import type { Dict } from '../types';
|
||
import { en } from './en';
|
||
|
||
export const fa: Dict = {
|
||
...en,
|
||
'chat.amrCard.switchTitle': 'فراخوانی مدل ناموفق بود — این اجرا متوقف شد',
|
||
'chat.amrCard.switchBody': 'به سرویس رسمی مدل AMR از Open Design سوئیچ کنید — بدون نیاز به تنظیم کلید API. پس از ورود، اعطای دسترسی و شارژ، این اجرا بهطور خودکار دوباره انجام میشود.',
|
||
'chat.amrCard.chipOfficial': 'میزبانی رسمی',
|
||
'chat.amrCard.chipNoKey': 'بدون کلید API',
|
||
'chat.amrCard.chipAutoRetry': 'تلاش مجدد خودکار پس از ورود',
|
||
'chat.amrCard.switchCta': 'سوئیچ به AMR و تلاش مجدد',
|
||
'chat.amrError.authMessage': 'حساب AMR شما هنوز مجاز نشده است. آن را مجاز کنید تا این اجرا بهطور خودکار دوباره انجام شود.',
|
||
'chat.amrError.balanceMessage': 'موجودی AMR شما تمام شده است. برای ادامه این اجرا شارژ کنید.',
|
||
'chat.amrError.authorizeCta': 'اعطای دسترسی و تلاش مجدد',
|
||
'chat.amrError.rechargeCta': 'شارژ AMR',
|
||
'plugins.actions.copyInstallCommand': 'کپی دستور نصب',
|
||
'plugins.actions.copyPluginId': 'کپی شناسهٔ افزونه',
|
||
'plugins.actions.copyReadmeBadge': 'کپی نشان README',
|
||
'plugins.actions.openSourceGithub': 'باز کردن منبع در GitHub',
|
||
'plugins.actions.openSource': 'باز کردن منبع',
|
||
'plugins.actions.openHomepage': 'باز کردن صفحهٔ اصلی',
|
||
'plugins.actions.openMarketplace': 'باز کردن در بازارچه',
|
||
'workingDirPicker.title': "Folder",
|
||
'workingDirPicker.homeTitle': "Choose where this project should live",
|
||
'workingDirPicker.processing': "Processing…",
|
||
'workingDirPicker.select': "Choose working directory",
|
||
'workingDirPicker.clearAria': "Clear working directory",
|
||
'workingDirPicker.replaceFailed': "Could not replace working directory",
|
||
'workingDirPicker.unavailable': "Folder picker is unavailable in this build. Run the desktop app to pick a folder.",
|
||
'workingDirPicker.openUnavailable': "Open this project in the desktop app to show the folder.",
|
||
'workingDirPicker.openFailed': "Could not show this folder",
|
||
'workingDirPicker.showInFileManager': "Show in file manager",
|
||
'workingDirPicker.replace': "Clear and replace directory…",
|
||
'workingDirPicker.recent': "Recent directories",
|
||
'handoff.toTarget': 'Hand off to {target}',
|
||
'handoff.action': 'Hand off',
|
||
'handoff.fallbackTitle': 'No editors found on $PATH - opens in {target}',
|
||
'handoff.chooseTargetAria': 'Choose hand-off target',
|
||
'handoff.notInstalled': 'Not installed',
|
||
'handoff.notDetectedTitle': '{target} - not detected on $PATH',
|
||
'homeHero.promptExamples': "نمونهها",
|
||
'homeHero.footer.designSystem': "سبک",
|
||
'homeHero.footer.autoDesignSystem': "خودکار",
|
||
'homeHero.footer.autoDesignSystemSummary': "بهصورت خودکار مناسبترین سیستم طراحی و سبک بصری را برای پرامپت فعلی انتخاب میکند.",
|
||
'homeHero.footer.ratio': "نسبت",
|
||
'homeHero.footer.duration': "مدت",
|
||
'homeHero.footer.resolution': "وضوح",
|
||
'homeHero.footer.speakerNotes': "Notes",
|
||
'homeHero.footer.noSpeakerNotes': "بدون یادداشت",
|
||
'homeHero.footer.availableCount': "{n} available",
|
||
'homeHero.footer.noMatches': "No matches",
|
||
'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': "Welcome",
|
||
'settings.welcomeSubtitle': "",
|
||
'settings.onboardingCreateTitle': 'Start from a brief',
|
||
'settings.onboardingCreateBody':
|
||
'Describe the site, app, deck, image, or video you want. Open Design will create a project and keep the work editable.',
|
||
'settings.onboardingMemoryTitle': 'Save working context',
|
||
'settings.onboardingMemoryBody':
|
||
'Add preferences, project facts, and recurring rules so future chats pick up the right context.',
|
||
'settings.onboardingSystemsTitle': 'Bring your design system',
|
||
'settings.onboardingSystemsBody':
|
||
'Pick or create a brand system so generated work follows real colors, typography, and product language.',
|
||
'settings.onboardingExecutionTitle': 'Choose how generation runs',
|
||
'settings.onboardingExecutionBody':
|
||
'Official CLI with one-click setup and ready-to-use defaults. Use one key to choose from many models with better pricing.',
|
||
'settings.onboardingAmrCloudBenefitOfficial': 'نگهداری رسمی',
|
||
'settings.onboardingAmrCloudBenefitReady': 'آماده استفاده',
|
||
'settings.onboardingAmrCloudBenefitModels': 'مدلهای فراوان',
|
||
'settings.onboardingAmrCloudBenefitPricing': 'قیمت بهتر',
|
||
'settings.onboardingAmrCloudAuthorizeAction': 'مجوزدهی AMR',
|
||
'settings.onboardingAmrCloudAuthorizedAction': 'مجوز داده شد',
|
||
'settings.onboardingStepConnect': "Connect",
|
||
'settings.onboardingStepDesignSystem': "Design system",
|
||
'settings.onboardingStepProfile': "About you",
|
||
'settings.onboardingConnectTitle': "Choose a runtime",
|
||
'settings.onboardingConnectBody': "",
|
||
'settings.onboardingRecommended': "Recommended",
|
||
'settings.onboardingLocalTitle': "Local coding agent",
|
||
'settings.onboardingLocalBody': "Use an installed CLI such as Claude Code, Codex, Cursor, Gemini, or OpenCode.",
|
||
'settings.onboardingLocalAction': "Open CLI settings",
|
||
'settings.onboardingCliScanHint': "This usually takes 5-10 seconds.",
|
||
'settings.onboardingByokTitle': "Bring your own key",
|
||
'settings.onboardingByokBody': "Use your own model provider credentials.",
|
||
'settings.onboardingByokAction': "Open BYOK settings",
|
||
'settings.onboardingDesignTitle': "Design system",
|
||
'settings.onboardingDesignBody': "Generate once, reuse everywhere.",
|
||
'settings.onboardingDesignIntroGenerateTitle': "Generate from existing work",
|
||
'settings.onboardingDesignIntroGenerateBody': "Upload your design system from GitHub or local code repositories, Figma files, images, and other content assets.",
|
||
'settings.onboardingDesignIntroReuseTitle': "Reuse in future work",
|
||
'settings.onboardingDesignIntroReuseBody': "Future prototypes, slides, and other content can reference your existing fonts, spacing, logo style, and color tone.",
|
||
'settings.onboardingDesignIntroSkipTitle': "Optional for now",
|
||
'settings.onboardingDesignIntroSkipBody': "Skip this step if you want to start without generating a design system.",
|
||
'settings.onboardingGithubTitle': "Import from GitHub",
|
||
'settings.onboardingGithubBody': "Use a frontend repository.",
|
||
'settings.onboardingUploadTitle': "Upload local files",
|
||
'settings.onboardingUploadBody': "Add project files, screenshots, CSS, docs, or assets.",
|
||
'settings.onboardingPromptTitle': "Generate from prompt",
|
||
'settings.onboardingPromptBody': "Describe the product or brand.",
|
||
'settings.onboardingProfileTitle': "About you",
|
||
'settings.onboardingProfileBody': "Optional details for better defaults.",
|
||
'settings.onboardingRoleLabel': "Your role",
|
||
'settings.onboardingOrgSizeLabel': "Organization size",
|
||
'settings.onboardingUseCaseLabel': "Use case",
|
||
'settings.onboardingSourceLabel': "Where did you hear about us?",
|
||
'settings.onboardingSelectPlaceholder': "Select one",
|
||
'settings.onboardingSelectMultiplePlaceholder': "Select one or more",
|
||
'settings.onboardingOrgSolo': "Solo / personal (1)",
|
||
'settings.onboardingOrgTeam': "Small team (2-10)",
|
||
'settings.onboardingOrgStartup': "Startup / SMB (11-50)",
|
||
'settings.onboardingOrgGrowth': "Growth company (51-200)",
|
||
'settings.onboardingOrgMidMarket': "Mid-market (201-1000)",
|
||
'settings.onboardingOrgEnterprise': "Enterprise (1000+)",
|
||
'settings.onboardingRolePm': "📋 Product manager",
|
||
'settings.onboardingRoleDesigner': "🎨 Designer",
|
||
'settings.onboardingRoleEngineer': "💻 Engineer",
|
||
'settings.onboardingRoleMarketing': "📣 Marketing",
|
||
'settings.onboardingRoleGrowth': "📈 Growth",
|
||
'settings.onboardingRoleOps': "⚙️ Operations",
|
||
'settings.onboardingRoleFounder': "🚀 Founder / executive",
|
||
'settings.onboardingRoleStudent': "🎓 Student / educator",
|
||
'settings.onboardingRoleOther': "✨ Other",
|
||
'settings.onboardingUseProduct': "🎨 Product design",
|
||
'settings.onboardingUseDesignSystem': "🧩 Design system",
|
||
'settings.onboardingUsePrototype': "📱 Prototype / app UI",
|
||
'settings.onboardingUseLanding': "🌐 Landing pages",
|
||
'settings.onboardingUseAds': "📣 Ads / social content",
|
||
'settings.onboardingUseDashboard': "📊 Dashboards / internal tools",
|
||
'settings.onboardingUseDeck': "🖥️ Presentation / deck",
|
||
'settings.onboardingUseMarketing': "📈 Marketing / growth",
|
||
'settings.onboardingUseEngineering': "🤝 Engineering handoff",
|
||
'settings.onboardingUseAgency': "💼 Agency / client work",
|
||
'settings.onboardingSourceGithub': "🐙 GitHub",
|
||
'settings.onboardingSourceFriend': "👥 Friend or coworker",
|
||
'settings.onboardingSourceSocial': "📱 Social media",
|
||
'settings.onboardingSourceProductHunt': "🅿️ Product Hunt",
|
||
'settings.onboardingSourceCommunity': "💬 Design / AI community",
|
||
'settings.onboardingSourceYoutube': "▶️ YouTube",
|
||
'settings.onboardingSourceBlog': "📰 Blog or newsletter",
|
||
'settings.onboardingSourceAiTool': "✨ AI tool recommendation",
|
||
'settings.onboardingSourceSearch': "🔍 Search",
|
||
'settings.onboardingSourceEvent': "🎤 Event or community",
|
||
'settings.onboardingBack': "Back",
|
||
'settings.onboardingContinue': "Continue",
|
||
'settings.onboardingFinish': "Finish setup",
|
||
'settings.onboardingSkip': "Skip for now",
|
||
'settings.kicker': 'تنظیمات',
|
||
'settings.title': 'حالت اجرا',
|
||
'settings.subtitle': 'بین CLI محلی و BYOK انتخاب کنید.',
|
||
'settings.modeAria': 'حالت اجرا',
|
||
'settings.protocolAria': 'پروتکل API',
|
||
'settings.modeDaemon': 'CLI محلی',
|
||
'settings.modeDaemonHelp': 'اجرا از طریق CLI عامل کد روی دستگاه شما',
|
||
'settings.modeDaemonOffline': 'Daemon در حال اجرا نیست',
|
||
'settings.modeDaemonOfflineMeta': 'daemon آفلاین',
|
||
'settings.modeDaemonInstalledMeta': '{count} نصب شده',
|
||
'settings.modeApi': 'ارائهدهنده API',
|
||
'settings.modeApiMeta': 'BYOK',
|
||
'settings.codeAgent': 'عامل کد',
|
||
'settings.codeAgentHint':
|
||
'با اسکن PATH شما شناسایی شده. CLI مورد نظر برای جریان تولیدات را انتخاب کنید.',
|
||
'settings.rescan': '↻ اسکن مجدد',
|
||
'settings.rescanTitle': 'اسکن مجدد PATH',
|
||
'settings.rescanRunning': 'در حال اسکن...',
|
||
'settings.rescanSuccess': 'اسکن کامل شد. {count} مورد در دسترس است.',
|
||
'settings.designSystemRenameFailed': 'تغییر نام ناموفق بود. daemon را بررسی کنید و دوباره تلاش کنید.',
|
||
'settings.rescanFailed': 'اسکن ناموفق بود. daemon را بررسی کنید و دوباره تلاش کنید.',
|
||
'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': 'شناسه مدل \'{model}\' نامعتبر است. شناسه سفارشی باید با حرف یا عدد شروع شود و فاصله نداشته باشد.',
|
||
'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':
|
||
'اگر CLI را با npm یا Homebrew نصب کردهاید اما هنوز بهصورت نصبنشده نمایش داده میشود، مطمئن شوید پوشه bin ابزار در PATHای باشد که daemon اوپن دیزاین به ارث میبرد (در macOS ممکن است PATH ترمینال و برنامههای GUI متفاوت باشد). بخش "Local agent CLI and PATH" در QUICKSTART.md را ببینید.',
|
||
'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 یا GitHub Copilot CLI را نصب کنید، سپس روی اسکن مجدد کلیک کنید.',
|
||
'settings.agentInstalledGroup': 'CLIهای شما ({count})',
|
||
'settings.agentInstallGroup': 'آماده نصب ({count})',
|
||
'settings.agentAuthRequired': 'احراز هویت لازم است',
|
||
'settings.agentAuthUnknown': 'وضعیت احراز هویت نامشخص است',
|
||
'settings.amrLogin': 'Sign in',
|
||
'settings.amrLogout': 'Sign out',
|
||
'settings.amrLoggingIn': 'Signing in…',
|
||
'settings.amrLoggingOut': 'Signing out…',
|
||
'settings.amrLoggedInAs': 'Signed in as {email}',
|
||
'settings.amrLoggedInWithPlan': 'Signed in as {email} · {plan}',
|
||
'settings.amrLoggedInPill': 'Signed in',
|
||
'settings.amrNotLoggedIn': 'Not signed in',
|
||
'settings.amrCloud': 'Open Design AMR',
|
||
'settings.amrAuthorize': 'Authorize',
|
||
'settings.amrBenefitOfficial': 'Officially maintained',
|
||
'settings.amrBenefitLowerPrice': 'Lower price',
|
||
'settings.amrBenefitManyModels': 'Many models',
|
||
'settings.amrPromoBonus': 'Limited bonus: +100%',
|
||
'settings.amrSignInToContinue': 'Sign in to continue',
|
||
'settings.amrSignIn': 'Sign in',
|
||
'settings.amrSignedIn': 'Signed in',
|
||
'settings.amrNotSignedIn': 'Not signed in',
|
||
'settings.amrSigningIn': 'Signing in…',
|
||
'settings.amrCancelSignIn': 'Cancel sign-in',
|
||
'settings.amrAccountStatus': 'AMR account status',
|
||
'settings.amrLoginErrorCompact': 'AMR sign-in failed.',
|
||
'settings.apiSection': 'Anthropic API',
|
||
'settings.quickFillProvider': 'پر کردن سریع ارائهدهنده',
|
||
'settings.customProvider': 'ارائهدهنده سفارشی',
|
||
'settings.apiKey': 'کلید API',
|
||
'settings.showKey': 'نمایش کلید',
|
||
'settings.hideKey': 'پنهان کردن کلید',
|
||
'settings.show': 'نمایش',
|
||
'settings.hide': 'پنهان',
|
||
'settings.model': 'مدل',
|
||
'settings.suggestedModelsHint':
|
||
'اینها مدلهای پیشنهادی برای این پروتکل هستند. ارائهدهنده شما ممکن است مدلهای دیگری را پشتیبانی کند.',
|
||
'settings.baseUrl': 'آدرس پایه',
|
||
'settings.baseUrlInvalid': 'یک URL عمومی معتبر با http:// یا https:// وارد کنید. 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': 'حداکثر توکن (اختیاری)',
|
||
'settings.maxTokensHint':
|
||
'سقف طول پاسخ. هر مدل مقدار پیشفرض تنظیمشدهٔ خود را دارد (در placeholder نمایش داده میشود)؛ برای استفاده از آن خالی بگذارید، یا برای جایگزینی، عددی وارد کنید.',
|
||
'settings.apiHint': 'درخواستها از طریق پراکسی daemon محلی به Base URL تنظیمشده ارسال میشوند. کلید فقط در همین مرورگر ذخیره میشود و همراه درخواستهای ارائهدهنده فرستاده میشود.',
|
||
'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 میپذیرد تایپ کنید.',
|
||
'settings.modelPickerLiveHint':
|
||
'مدلها از CLI نصبشده بهروزرسانی شدند. گزینه پیشفرض همچنان از تنظیمات CLI استفاده میکند.',
|
||
'settings.modelPickerFallbackHint':
|
||
'پیشفرضهای داخلی نمایش داده میشوند. برای دریافت مدلهای زنده از CLI روی اسکن مجدد کلیک کنید.',
|
||
'settings.cliEnvTitle': 'CLI config locations',
|
||
'settings.cliEnvHint':
|
||
'Set non-secret config directories for packaged app runs and agent detection.',
|
||
'settings.cliEnvClaudeConfigDir': 'Claude Code config directory',
|
||
'settings.cliEnvClaudeBaseUrl': 'Claude proxy base URL',
|
||
'settings.cliEnvClaudeApiKey': 'Claude proxy API key',
|
||
'settings.cliEnvCodexHome': 'Codex home',
|
||
'settings.cliEnvCodexBin': 'Codex executable path',
|
||
'settings.cliEnvCodexBaseUrl': 'Codex/OpenAI proxy base URL',
|
||
'settings.cliEnvCodexApiKey': 'Codex/OpenAI proxy API key',
|
||
'settings.modelCustom': 'سفارشی (در زیر تایپ کنید)…',
|
||
'settings.modelCustomLabel': 'شناسه مدل سفارشی',
|
||
'settings.modelCustomPlaceholder': 'مثلاً anthropic/claude-sonnet-4-6',
|
||
'settings.mediaProviders': 'ارائهدهندگان رسانه',
|
||
'settings.mediaProvidersHint':
|
||
'کلیدهای API برای تولید تصویر، ویدئو و صدا. به صورت محلی ذخیره و با daemon محلی همگام میشود.',
|
||
'settings.mcpServerTitle': 'سرور MCP',
|
||
'settings.mcpServerHint': 'Open Design را بهعنوان سرور MCP برای عامل برنامهنویسی خود در دسترس قرار دهید.',
|
||
'settings.externalMcpTitle': 'MCP خارجی',
|
||
'settings.externalMcpHint': 'افزودن ابزارهای MCP از سرویسهای خارجی (Higgsfield, GitHub, …).',
|
||
'settings.mediaProviderApiKey': 'کلید API',
|
||
'settings.mediaProviderBaseUrl': 'آدرس پایه',
|
||
'settings.mediaProviderConfigured': 'پیکربندی شده',
|
||
'settings.mediaProviderUnset': 'تنظیم نشده',
|
||
'settings.mediaProviderClear': 'پاک کردن',
|
||
'settings.mediaProviderClearConfirm': 'پاک کردن تنظیمات ذخیرهشدهی {name}؟ برای استفاده از {name} باید آنها را دوباره وارد کنید.',
|
||
'settings.mediaProviderPlaceholder': 'کلید API را وارد کنید',
|
||
'settings.mediaProviderBaseUrlPlaceholder': 'بازنویسی آدرس پایه پیشفرض',
|
||
'settings.mediaProviderReload': 'بارگذاری دوباره از دیمن محلی',
|
||
'settings.mediaProviderReloadError': 'بارگذاری دوبارهٔ تنظیمات ارائهدهندههای رسانه از دیمن محلی ممکن نشد.',
|
||
'settings.mediaProviderReloadSuccess': 'تنظیمات ارائهدهندههای رسانه از دیمن محلی دوباره بارگذاری شد.',
|
||
'settings.mediaProviderLoadError': 'بارگذاری تنظیمات ارائهدهندههای رسانه از دیمن محلی ممکن نشد. فعلاً از تنظیمات ذخیرهشده در مرورگر استفاده میشود.',
|
||
'settings.mediaProviderComingSoonHint': 'ما این موارد را برای نقشه راه پیگیری میکنیم؛ دیمون هنوز کلاینتی ارائه نمیدهد، بنابراین چیزی برای پیکربندی وجود ندارد.',
|
||
'settings.privacy': 'Privacy',
|
||
'settings.privacyHint': 'What data is shared with the Open Design team',
|
||
'settings.privacyConsentKicker': 'Help us improve Open Design',
|
||
'settings.privacyConsentLead': 'Open Design can share usage data with our team to help us improve. This includes:',
|
||
'settings.privacyConsentFooter': 'You can change either of these any time in Settings → Privacy. We never upload the contents of your generated artifact files.',
|
||
'settings.privacyConsentShare': 'Share usage data',
|
||
'settings.privacyConsentDecline': "Don't share",
|
||
'settings.privacyConsentAccept': 'I get it',
|
||
'settings.privacyConsentBannerFooter':
|
||
'Data sharing is on by default. You can turn it off any time in Settings → Privacy. We never upload the contents of your generated artifact files.',
|
||
'settings.privacyConsentPolicyLink': 'Read the privacy policy',
|
||
'settings.privacyMetrics': 'Anonymous metrics',
|
||
'settings.privacyMetricsHint': 'Run counts, token usage, error rate, duration. No prompts, no project data.',
|
||
'settings.privacyContent': 'Conversation content',
|
||
'settings.privacyContentHint': "Your prompts and the assistant's responses (truncated 8 KB / 16 KB). API keys, tokens, JWTs, emails, IPs, and credit-card numbers are stripped automatically before send.",
|
||
'settings.privacyArtifacts': 'Project artifacts manifest',
|
||
'settings.privacyArtifactsHint': 'Filenames, types, sizes of generated files. File contents are never sent.',
|
||
'settings.privacyInstallationId': 'Anonymous ID',
|
||
'settings.privacyOptedOut': 'opted out',
|
||
'settings.privacyDataDeletion': 'Delete my data',
|
||
'settings.privacyDataDeletionHint': 'Rotates your anonymous ID and stops sending. Existing traces age out under our retention policy.',
|
||
'settings.about': 'درباره',
|
||
'settings.aboutHint': 'جزئیات نسخه و اجرا',
|
||
'settings.appVersion': 'نسخه',
|
||
'settings.appChannel': 'کانال',
|
||
'settings.appRuntime': 'محیط اجرا',
|
||
'settings.appPlatform': 'سکو',
|
||
'settings.appArchitecture': 'معماری',
|
||
'settings.runtimePackaged': 'برنامه بستهبندیشده',
|
||
'settings.runtimeDevelopment': 'توسعه',
|
||
'settings.versionUnavailable': 'تا وقتی daemon آفلاین است جزئیات نسخه در دسترس نیست.',
|
||
'settings.installLatest': 'نصب جدیدترین',
|
||
'settings.alreadyLatest': 'شما آخرین نسخه را دارید',
|
||
|
||
'entry.tabDesigns': 'طرحها',
|
||
'entry.tabTemplates': 'قالبها',
|
||
'entry.tabDesignSystems': 'سیستمهای طراحی',
|
||
'entry.tabConnectors': 'اتصالدهندهها',
|
||
'entry.tabImageTemplates': 'قالبهای تصویر',
|
||
'entry.tabVideoTemplates': 'قالبهای ویدئو',
|
||
'entry.openSettingsTitle': 'تنظیمات',
|
||
'entry.openSettingsAria': 'باز کردن تنظیمات',
|
||
'entry.resizeAria': 'تغییر اندازه نوار کناری',
|
||
'entry.loadingWorkspace': 'در حال بارگذاری فضای کاری…',
|
||
'entry.useEverywhereTitle': 'استفاده در همهجا',
|
||
'entry.useEverywhereAria': 'باز کردن راهنمای «استفاده در همهجا» (CLI، MCP، HTTP، Skills)',
|
||
'entry.navNewProject': 'پروژه جدید',
|
||
'entry.navHome': 'خانه',
|
||
'entry.navProjects': 'پروژهها',
|
||
'entry.navDesignSystems': 'سیستمهای طراحی',
|
||
'entry.helpAria': 'راهنما',
|
||
'entry.helpMenuAria': 'منوی راهنما',
|
||
'entry.helpGetHelp': 'دریافت کمک در GitHub',
|
||
'entry.helpSubmitFeature': 'پیشنهاد قابلیت',
|
||
'entry.helpWhatsNew': 'تازهها',
|
||
'entry.helpDownloadDesktop': 'دانلود اپلیکیشن دسکتاپ',
|
||
'entry.githubStarLabel': 'ستاره',
|
||
'entry.githubStarTitle': 'برای ما در GitHub ستاره بگذارید',
|
||
'entry.githubStarAria': 'به Open Design در GitHub ستاره بدهید',
|
||
'promptTemplates.searchPlaceholder': 'جستجوی قالبها…',
|
||
'promptTemplates.countLabel': '{n} نتیجه',
|
||
'promptTemplates.emptyImage': 'هنوز قالب پرامپت تصویر نصب نشده است.',
|
||
'promptTemplates.emptyVideo': 'هنوز قالب پرامپت ویدئو نصب نشده است.',
|
||
'promptTemplates.emptyNoMatch': 'هیچ قالبی با جستجوی شما مطابقت ندارد.',
|
||
'promptTemplates.attributionFooter':
|
||
'برگرفته از کتابخانههای عمومی پرامپت. هر کارت به نویسنده اصلی لینک دارد.',
|
||
'promptTemplates.openPreviewTitle': 'باز کردن پرامپت و پیشنمایش',
|
||
'promptTemplates.sourcePrefix': 'منبع:',
|
||
'promptTemplates.fetchError': 'بارگذاری متن این قالب ممکن نبود.',
|
||
'promptTemplates.promptLabel': 'متن پرامپت',
|
||
'promptTemplates.copyPrompt': 'کپی پرامپت',
|
||
'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های اتصالدهنده در فاز ۳ میرسند؛ این فقط یک نمای پیشنمایش است.',
|
||
'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': 'پاک کردن جستجو',
|
||
|
||
'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.surfaceOptionsLabel': 'Companion surfaces',
|
||
'newproj.includeLandingPage': 'Include landing page',
|
||
'newproj.includeLandingPageHint':
|
||
'Add a responsive marketing page for ads, waitlists, launch campaigns, app downloads, or product explanation.',
|
||
'newproj.includeOsWidgets': 'Include OS widgets',
|
||
'newproj.includeOsWidgetsHint':
|
||
'Add platform-native home screen, lock screen, or quick-access widgets for mobile/tablet apps.',
|
||
'newproj.includeOsWidgetsDisabledHint':
|
||
'Available when iOS, Android, or tablet app is selected as a target platform.',
|
||
'newproj.templateLabel': 'قالب',
|
||
'newproj.noTemplatesTitle': 'هنوز هیچ قالبی وجود ندارد',
|
||
'newproj.noTemplatesBody':
|
||
'هر پروژهای را باز کنید، سپس از منوی اشتراکگذاری در داخل نمایشگر فایل آن را به قالب تبدیل کنید. قالبها اینجا نمایش داده میشوند.',
|
||
'newproj.savedTemplate': 'قالب ذخیره شده',
|
||
'newproj.fileSingular': 'فایل',
|
||
'newproj.filePlural': 'فایل',
|
||
'newproj.create': 'ایجاد',
|
||
'newproj.createLiveArtifact': 'ایجاد مصنوع زنده',
|
||
'newproj.createFromTemplate': 'ایجاد از قالب',
|
||
'newproj.createDisabledTitle':
|
||
'ابتدا یک پروژه را به عنوان قالب ذخیره کنید (منوی اشتراکگذاری در داخل هر پروژه).',
|
||
'newproj.importClaudeZip': 'وارد کردن ZIP طراحی Claude',
|
||
'newproj.importClaudeZipTitle': 'وارد کردن یک فایل .zip صادر شده از Claude Design',
|
||
'newproj.importingClaudeZip': 'در حال وارد کردن…',
|
||
'newproj.privacyFooter': 'به طور پیشفرض فقط شما میتوانید پروژه خود را ببینید.',
|
||
'newproj.designSystem': 'سیستم طراحی',
|
||
'newproj.dsNoneFreeform': 'هیچ — آزاد',
|
||
'newproj.dsNoneSubtitleEmpty': 'بدون توکنهای سیستم، پالت خود را انتخاب کنید',
|
||
'newproj.dsNoneSubtitleSelected': 'از توکنهای سیستم صرف نظر کنید. عامل پالت خود را انتخاب میکند.',
|
||
'newproj.dsCategoryFallback': 'سیستم طراحی',
|
||
'newproj.dsSearch': 'جستجوی سیستمهای طراحی…',
|
||
'newproj.dsModeAria': 'حالت انتخاب',
|
||
'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': 'شناسه صدای ارائهدهنده، اختیاری',
|
||
'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': 'پرامپت (قابل ویرایش)',
|
||
'newproj.promptTemplateOptimizeHint':
|
||
'هر چیزی را میتوانید ویرایش کنید — تغییرات شما به بریف ایجنت اضافه میشود.',
|
||
'newproj.promptTemplateBodyEmpty': 'متن خالی است — ایجنت هیچ مرجع قالبی دریافت نمیکند.',
|
||
'newproj.deleteTemplateTitle': 'حذف قالب',
|
||
'newproj.deleteTemplateConfirm': 'آیا «{name}» حذف شود؟ این عمل قابل بازگشت نیست.',
|
||
'newproj.deleteTemplateConfirmCta': 'حذف قالب',
|
||
'newproj.deleteTemplateError':
|
||
'حذف این قالب ممکن نشد. لطفاً دوباره تلاش کنید.',
|
||
'newproj.dsModeSingle': 'تکی',
|
||
'newproj.dsModeMulti': 'چندگانه',
|
||
'newproj.dsNoneTitle': 'هیچ — آزاد',
|
||
'newproj.dsNoneSub': 'از توکنهای سیستم صرف نظر کنید. عامل پالت خود را انتخاب میکند.',
|
||
'newproj.dsEmpty': 'هیچ سیستم طراحی با «{query}» مطابقت ندارد.',
|
||
'newproj.dsFootSingular': 'فقط الهامبخش است.',
|
||
'newproj.dsFootPlural': 'فقط الهامبخش هستند.',
|
||
'newproj.dsFootClear': 'پاک کردن',
|
||
'newproj.dsBadgeDefault': 'پیشفرض',
|
||
'newproj.dsPrimaryFallback': 'اصلی',
|
||
|
||
'designs.subRecent': 'اخیر',
|
||
'designs.subYours': 'طرحهای شما',
|
||
'designs.filterAria': 'فیلتر پروژهها',
|
||
'designs.searchPlaceholder': 'جستجو…',
|
||
'designs.emptyNoProjects': 'هنوز هیچ پروژهای وجود ندارد. یکی را از سمت چپ ایجاد کنید.',
|
||
'designs.emptyNoMatch': 'هیچ پروژهای با جستجوی شما مطابقت ندارد.',
|
||
'designs.deleteTitle': 'حذف پروژه',
|
||
'designs.deleteConfirm': 'آیا «{name}» حذف شود؟',
|
||
'designs.cardFreeform': 'آزاد',
|
||
'designs.badgeLive': 'زنده',
|
||
'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': 'More actions',
|
||
'designs.menuRename': 'Rename',
|
||
'designs.menuDelete': 'Delete',
|
||
'designs.renamePrompt': 'New name for "{name}"',
|
||
'designs.selectMode': 'Select',
|
||
'designs.cancelSelect': 'Cancel',
|
||
'designs.deleteSelected': 'Delete selected',
|
||
'designs.selectedCount': '{n} selected',
|
||
'designs.deleteSelectedConfirm': 'Delete {n} project(s)?',
|
||
'designs.deleteSelectedSuccess': '{n} project(s) deleted successfully.',
|
||
'designs.deleteSelectedPartial': 'Deleted {deleted} project(s); {failed} failed.',
|
||
'designs.tagPrototype': 'Prototype',
|
||
'designs.tagLiveArtifact': 'Live Artifact',
|
||
'designs.tagSlide': 'Slide',
|
||
'designs.tagMedia': 'Media',
|
||
'designs.renameTitle': 'Rename project',
|
||
'designs.renameSave': 'OK',
|
||
'designs.renameCancel': 'Cancel',
|
||
|
||
'examples.typeLabel': 'نوع',
|
||
'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': 'هیچ مهارتی موجود نیست. آیا daemon در حال اجرا است؟',
|
||
'examples.searchPlaceholder': 'جستجوی نمونهها…',
|
||
'examples.searchAria': 'جستجوی نمونهها بر اساس نام',
|
||
'examples.emptyNoMatch': 'هیچ نمونهای با این فیلترها مطابقت ندارد.',
|
||
'examples.openPreview': '⤢ باز کردن پیشنمایش',
|
||
'examples.loadingPreview': 'در حال بارگذاری پیشنمایش…',
|
||
'examples.hoverPreview': 'برای پیشنمایش هاور کنید',
|
||
'examples.usePrompt': 'استفاده از این پرامپت',
|
||
'examples.previewModalTitle': 'باز کردن پیشنمایش کامل (modal)',
|
||
'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': 'توکنها',
|
||
'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': 'BYOK',
|
||
'inlineSwitcher.modelDefault': 'پیشفرض',
|
||
'inlineSwitcher.noAgent': 'بدون عامل',
|
||
'inlineSwitcher.modeLabel': 'حالت',
|
||
'inlineSwitcher.agentLabel': 'عامل',
|
||
'inlineSwitcher.providerLabel': 'ارائهدهنده',
|
||
'inlineSwitcher.modelLabel': 'مدل',
|
||
'inlineSwitcher.useCli': 'استفاده از CLI محلی',
|
||
'inlineSwitcher.useByok': 'استفاده از کلید API شخصی',
|
||
'inlineSwitcher.daemonOffline': 'Daemon آفلاین — تنظیمات را باز کنید',
|
||
'inlineSwitcher.noAgentsDetected': 'هیچ CLI در PATH یافت نشد',
|
||
'inlineSwitcher.openSettingsForModel': 'ارائهدهنده را در تنظیمات پیکربندی کنید',
|
||
'inlineSwitcher.missingApiKey': 'کلید API تنظیم نشده — تنظیمات را باز کنید.',
|
||
'inlineSwitcher.openFullSettings': 'باز کردن تنظیمات اجرا',
|
||
'inlineSwitcher.customSuffix': '(سفارشی)',
|
||
|
||
'project.backToProjects': 'بازگشت به پروژهها',
|
||
'project.metaFreeform': 'آزاد',
|
||
'project.resizeChatPanel': 'تغییر اندازه پنل چت',
|
||
'project.instructionsActive': 'فعال — در هر پیام گنجانده میشود',
|
||
'chat.tabChat': 'چت',
|
||
'chat.tabComments': 'نظرات',
|
||
'chat.commentsSoon': 'نظرات — به زودی',
|
||
'chat.comments.attached': 'Attached to chat',
|
||
'chat.comments.emptyAttached': 'No comments attached.',
|
||
'chat.comments.saved': 'Saved comments',
|
||
'chat.comments.emptySaved': 'No saved comments.',
|
||
'chat.comments.add': 'Add',
|
||
'chat.comments.addAll': 'Add all',
|
||
'chat.comments.remove': 'Remove',
|
||
'chat.comments.placeholder': 'Comment on this element…',
|
||
'chat.comments.addSend': 'Add & send',
|
||
'chat.comments.updateSend': 'Update & send',
|
||
'chat.comments.removeAttachment': 'Remove comment attachment',
|
||
'chat.comments.removeAttachmentAria': 'Remove comment attachment for {name}',
|
||
'chat.comments.comment': '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.inspect.noEditableTargets': 'This page has no editable elements yet.',
|
||
'chat.inspect.noCommentTargets': 'This page has no commentable elements yet.',
|
||
'chat.inspect.editHint': 'Click an element in the canvas to edit its styles.',
|
||
'chat.inspect.commentHint': 'Click an element in the canvas to add a comment.',
|
||
'chat.conversationsTitle': 'مکالمات',
|
||
'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.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': 'Reference another project',
|
||
'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': 'ارائه سردبیری',
|
||
'chat.example1Tag': 'مجله',
|
||
'chat.example1Prompt':
|
||
'یک ارائه سردبیری ۱۰ اسلایدی برای یک استودیو طراحی که در حال جمعآوری یک دور سرمایهگذاری اولیه است — چیدمان شبکه سوئیسی، عناوین سریف بزرگ با حروف تزئینی پررنگ، شمارههای بخش با فونت monospace، فضای منفی سخاوتمندانه، و اسلایدهای تمام خون عکس که با اسلایدهای متنمحور در هم تنیده شدهاند. جلد، چشمانداز، بازار، محصول، کشش، تیم، درخواست، تماس.',
|
||
'chat.example2Title': 'داشبورد تحلیل SaaS',
|
||
'chat.example2Tag': 'داده',
|
||
'chat.example2Prompt':
|
||
'یک داشبورد تحلیل متراکم برای یک SaaS ابزار توسعهدهنده — نوار KPI با دلتاهای هفته به هفته، دو نمودار خط انباشته (MRR و فضاهای کاری فعال)، یک نقشه حرارتی جهانی از استفاده، یک شبکه ماندگاری کوهورت، یک جدول رهبری برترین مشتریان، و یک فید رویداد بلادرنگ. تم تاریک، اعداد جدولی monospace، تأکیدات sparkline.',
|
||
'chat.example3Title': 'گزارش سالانه اسکرول بلند',
|
||
'chat.example3Tag': 'سردبیری',
|
||
'chat.example3Prompt':
|
||
'یک گزارش سالانه تعاملی برای یک سازمان غیرانتفاعی آب و هوایی — چیدمان سردبیری اسکرول بلند که بلوکهای نقل قول بزرگ، تصویرسازیهای داده، عکاسی، دیوار اهداکنندگان و یک فراخوان به عمل نهایی را ترکیب میکند.',
|
||
|
||
'preview.shareMenu': 'اشتراکگذاری',
|
||
'preview.exportMenu': 'Export',
|
||
'preview.shareTemplateBadge': 'Template',
|
||
'preview.shareToX': 'X / Twitter',
|
||
'preview.shareToReddit': 'Reddit',
|
||
'preview.shareToFacebook': 'Facebook',
|
||
'preview.shareToLinkedIn': 'LinkedIn',
|
||
'preview.shareToInstagram': 'Instagram',
|
||
'preview.shareToXiaohongshu': '小红书',
|
||
'preview.copyTemplateLink': 'Copy template link',
|
||
'preview.copyShareText': 'Copy share text',
|
||
'preview.shareSocialGroup': 'Share to social',
|
||
'preview.shareCopyGroup': 'Copy',
|
||
'preview.shareExportGroup': 'Export files',
|
||
'preview.shareCopied': 'Copied',
|
||
'preview.shareCopyFailed': 'Copy failed',
|
||
'preview.shareTextDefault': 'Open Design template: {title}',
|
||
'preview.openInNewTab': 'باز کردن در تب جدید',
|
||
'preview.exit': '⤓ خروج',
|
||
'preview.fullscreen': '⤢ تمام صفحه',
|
||
'preview.closeTitle': 'بستن (Esc)',
|
||
'preview.loading': 'در حال بارگذاری {label}…',
|
||
'preview.errorTitle': 'بارگیری این نمونه ممکن نشد.',
|
||
'preview.errorBody': 'دریافت HTML نمونه با خطا مواجه شد. مطمئن شوید Open Design در حال اجراست و دوباره تلاش کنید.',
|
||
'preview.retry': 'تلاش دوباره',
|
||
'preview.unavailableTitle': 'برای این مهارت پیشنمایش همراهی وجود ندارد.',
|
||
'preview.unavailableBody': 'این مهارت خروجی {kind} تولید میکند — برای ساخت یکی، پرامپت را در گفتگو اجرا کنید.',
|
||
'preview.showSidebar': 'نمایش {label}',
|
||
'preview.hideSidebar': 'پنهان کردن {label}',
|
||
|
||
'misc.savedTemplate': 'قالب ذخیره شده',
|
||
'misc.primary': 'اصلی',
|
||
'misc.designSystem': 'سیستم طراحی',
|
||
|
||
'workspace.designFiles': 'فایلهای طراحی',
|
||
'workspace.focusMode': 'Focus workspace',
|
||
'workspace.showChat': 'Show chat',
|
||
'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.deleteSelected': 'حذف {n}',
|
||
'designFiles.searchPlaceholder': 'جستجوی فایلها…',
|
||
'designFiles.up': 'بالا',
|
||
'designFiles.back': 'بازگشت',
|
||
'designFiles.crumbs': 'پروژه',
|
||
'designFiles.rowMenu': 'منوی ردیف',
|
||
'designFiles.openInTab': 'باز کردن در تب',
|
||
'designFiles.download': 'دانلود',
|
||
'designFiles.downloadSelected': 'دانلود {n} به صورت ZIP',
|
||
'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': '۷ روز گذشته',
|
||
'designFiles.modifiedPrevious30Days': '۳۰ روز گذشته',
|
||
'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.markdownStreamingMeta': 'پیشنمایش در حال استریم…',
|
||
'fileViewer.markdownErrorMeta': 'پیشنمایش ممکن است ناقص باشد (خطای تولید).',
|
||
'fileViewer.markdownStreamingStatus': 'در حال استریم… Markdown ناقص نمایش داده میشود.',
|
||
'fileViewer.markdownErrorStatus': 'خطای تولید. آخرین محتوای در دسترس نمایش داده میشود.',
|
||
'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.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': "Hidden",
|
||
'manualEdit.title': "Manual editor",
|
||
'manualEdit.selectLayer': "Select a layer",
|
||
'manualEdit.empty': "Click an element in the preview or choose a layer.",
|
||
'manualEdit.noEditableLayers': "No editable layers found.",
|
||
'manualEdit.noClass': "no class",
|
||
'manualEdit.tabsAria': "Manual edit tabs",
|
||
'manualEdit.tabContent': "Content",
|
||
'manualEdit.tabStyle': "Style",
|
||
'manualEdit.tabAttributes': "Attributes",
|
||
'manualEdit.tabHtml': "Html",
|
||
'manualEdit.tabSource': "Source",
|
||
'manualEdit.attributesJson': "Attributes JSON",
|
||
'manualEdit.selectedHtml': "Selected element HTML",
|
||
'manualEdit.fullSource': "Full artifact source",
|
||
'manualEdit.applyContent': "Apply Content",
|
||
'manualEdit.applyStyle': "Apply Style",
|
||
'manualEdit.applyAttributes': "Apply Attributes",
|
||
'manualEdit.applyHtml': "Apply HTML",
|
||
'manualEdit.applySource': "Apply Source",
|
||
'manualEdit.invalidAttributes': "Invalid attributes JSON.",
|
||
'manualEdit.changes': "Changes",
|
||
'manualEdit.undo': "Undo",
|
||
'manualEdit.redo': "Redo",
|
||
'manualEdit.noChanges': "No manual edits yet.",
|
||
'manualEdit.imageUrl': "Image URL",
|
||
'manualEdit.altText': "Alt text",
|
||
'manualEdit.label': "Label",
|
||
'manualEdit.text': "Text",
|
||
'manualEdit.href': "Href",
|
||
'manualEdit.textColor': "Text color",
|
||
'manualEdit.background': "Background",
|
||
'manualEdit.fontSize': "Font size",
|
||
'manualEdit.weight': "Weight",
|
||
'manualEdit.align': "Align",
|
||
'manualEdit.padding': "Padding",
|
||
'manualEdit.margin': "Margin",
|
||
'manualEdit.radius': "Radius",
|
||
'manualEdit.border': "Border",
|
||
'manualEdit.width': "Width",
|
||
'manualEdit.minHeight': "Min height",
|
||
'fileViewer.zoomOut': 'کوچکنمایی',
|
||
'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': 'این مصنوع زنده را بازخوانی کن',
|
||
'liveArtifact.refresh.loadingTitle': 'در حال بارگذاری مصنوع زنده…',
|
||
'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': 'بازخوانی ناموفق بود',
|
||
|
||
'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': 'daemon خاموش',
|
||
'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': 'Tell us why',
|
||
'assistant.feedbackReasonPositiveMatched': 'Understood my request',
|
||
'assistant.feedbackReasonPositiveVisual': 'Looks good',
|
||
'assistant.feedbackReasonPositiveUseful': 'Useful structure',
|
||
'assistant.feedbackReasonPositiveEasy': 'Easy to keep editing',
|
||
'assistant.feedbackReasonPositiveDesignSystem': 'Followed the design system',
|
||
'assistant.feedbackReasonNegativeMissed': 'Missed my request',
|
||
'assistant.feedbackReasonNegativeVisual': 'Visual quality needs work',
|
||
'assistant.feedbackReasonNegativeIncomplete': 'Incomplete output',
|
||
'assistant.feedbackReasonNegativeHard': 'Hard to use',
|
||
'assistant.feedbackReasonNegativeDesignSystem': 'Did not follow the design system',
|
||
'assistant.feedbackReasonOther': 'Other',
|
||
'assistant.feedbackReasonPlaceholder': 'Add a short note...',
|
||
'assistant.feedbackReasonSubmit': 'Submit',
|
||
'assistant.emptyResponseLabel': 'No output',
|
||
'assistant.emptyResponseMessage': 'The provider ended the request without returning text or an artifact. Try another model or provider, check quota, or retry.',
|
||
'assistant.unfinishedLabel': 'با کار ناتمام متوقف شد',
|
||
'assistant.unfinishedSummary': '{n} وظیفه باقی مانده',
|
||
'assistant.unfinishedMore': '+{n} بیشتر',
|
||
'assistant.continueRemaining': 'ادامه وظایف باقی مانده',
|
||
'assistant.outTokens': '{n} خروجی',
|
||
'assistant.producedFiles': 'فایلهای این نوبت',
|
||
'assistant.openFile': 'باز کردن',
|
||
'assistant.downloadFile': 'دانلود',
|
||
'assistant.thinking': 'در حال فکر کردن',
|
||
'assistant.systemReminder': 'یادآور سیستم',
|
||
'assistant.waitingFirstOutput': 'در انتظار اولین خروجی',
|
||
'assistant.statusBootingAgent': 'راهاندازی عامل',
|
||
'assistant.statusStarting': 'در حال شروع',
|
||
'assistant.statusRequesting': 'در حال ارسال درخواست',
|
||
'assistant.statusThinking': 'در حال فکر کردن',
|
||
'assistant.statusStreaming': 'در حال استریم',
|
||
'assistant.slowHint':
|
||
'بیشتر از حد معمول طول میکشد. فرم معمولاً در ۵ تا ۱۰ ثانیه نمایش داده میشود — میتوانید متوقف کنید و عبارت را تغییر دهید.',
|
||
'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': 'روباه قهوهای سریع · ۰۱۲۳',
|
||
|
||
'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',
|
||
'fileViewer.vercelTokenGetLink': 'دریافت توکن Vercel',
|
||
'fileViewer.vercelTokenPlaceholder': 'توکن Vercel خود را وارد کنید',
|
||
'fileViewer.vercelTokenReuseHint': 'از توکن ذخیرهشده استفاده میشود. برای جایگزینی، توکن جدید وارد کنید.',
|
||
'fileViewer.vercelTokenRequired': 'ابتدا یک توکن Vercel وارد و ذخیره کنید.',
|
||
'fileViewer.cloudflareApiToken': 'توکن API کلادفلر',
|
||
'fileViewer.cloudflareApiTokenGetLink': 'دریافت توکن API کلادفلر',
|
||
'fileViewer.cloudflareApiTokenPlaceholder': 'توکن API کلادفلر خود را وارد کنید',
|
||
'fileViewer.cloudflareApiTokenReuseHint': 'از توکن API کلادفلر ذخیرهشده استفاده میشود. برای جایگزینی، توکن جدید وارد کنید.',
|
||
'fileViewer.cloudflareApiTokenRequired': 'ابتدا یک توکن API کلادفلر وارد و ذخیره کنید.',
|
||
'fileViewer.cloudflareApiTokenScopeHint': 'Pages Edit is required for deploys. Zone Read is required to list domains. DNS Edit is only needed when binding a custom domain.',
|
||
'fileViewer.vercelTeamId': 'شناسه تیم',
|
||
'fileViewer.vercelTeamSlug': 'اسلاگ تیم',
|
||
'fileViewer.cloudflareAccountId': 'شناسه حساب',
|
||
'fileViewer.cloudflareAccountIdHint': 'ضروری است. شناسه حساب را در داشبورد Cloudflare پیدا کنید.',
|
||
'fileViewer.cloudflareAccountIdRequired': 'ابتدا Cloudflare Account 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': 'URL مستقرشده',
|
||
'fileViewer.deployLinkReady': 'آماده',
|
||
'fileViewer.deployLinkPreparingLabel': 'لینک عمومی در انتظار است',
|
||
'fileViewer.deployLinkDelayed': 'سایت مستقر شده است. ارائهدهنده هنوز لینک عمومی را آماده میکند.',
|
||
'fileViewer.deployLinkFailed': 'دامنه سفارشی ناموفق بود',
|
||
'fileViewer.deployLinkProtectedLabel': 'محافظت استقرار فعال است',
|
||
'fileViewer.deployLinkProtected': 'سایت مستقر شده، اما این لینک پیشنمایش نیاز به احراز هویت دارد. Deployment Protection را غیرفعال کنید یا از دامنه سفارشی استفاده کنید.',
|
||
'fileViewer.retryLink': 'همین حالا دوباره تلاش کنید',
|
||
|
||
'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': 'افزودن متن',
|
||
|
||
'pet.title': 'حیوان خانگی',
|
||
'pet.tabBuiltIn': 'پیشفرض',
|
||
'pet.tabBuiltInHint': 'همراهان منتخب همراه Open Design — یکی را انتخاب و فرزندخوانده کن.',
|
||
'pet.builtInEmpty': 'حیوانات داخلی در حال حاضر در دسترس نیستند. وقتی دیمن دوباره فعال شد، تب جامعه را تازه کن.',
|
||
'pet.tabCustom': 'سفارشی',
|
||
'pet.tabCustomHint': 'نام، نشان، رنگ یا اسپرایت دلخواه خودت را تنظیم کن.',
|
||
'pet.tabCommunity': 'انجمن',
|
||
'pet.tabCommunityHint': 'حیوانات تولیدشدهٔ Codex — یکی را پذیرش کن یا با هوش مصنوعی بساز.',
|
||
'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': 'یک ایموجی بهترین کارایی را دارد (مثلاً 🐝، 🦄، 🐢).',
|
||
'pet.fieldGreeting': 'پیام خوشآمد',
|
||
'pet.fieldAccent': 'رنگ تأکید',
|
||
'pet.fieldAccentCustom': 'رنگ سفارشی',
|
||
'pet.fieldAccentDefault': 'رنگ تأکید پیشفرض',
|
||
'pet.overlayAria': 'همراه حیوان خانگی',
|
||
'pet.spriteAria': '{name} — برای جابجایی بکشید، برای گفتوگو کلیک کنید',
|
||
'pet.spriteTitle': 'سلام از طرف {name}! برای گفتوگو کلیک کنید.',
|
||
'pet.composerTitle': 'حیوانات خانگی — بیدار کردن، پنهان یا انتخاب',
|
||
'pet.composerMenuTitle': 'حیوانات خانگی',
|
||
'pet.composerMenuHint': 'نکته: /pet را تایپ کنید تا تغییر دهید',
|
||
'pet.composerOpenSettings': 'مدیریت حیوانات خانگی',
|
||
'pet.welcomeTeaserTitle': 'یک حیوان خانگی بپذیرید',
|
||
'pet.welcomeTeaserBody': 'یک همراه کوچک که بالای فضای کاری شما شناور میشود.',
|
||
'pet.welcomeTeaserCta': 'یکی انتخاب کنید',
|
||
'pet.imageUpload': 'بارگذاری اسپرایت',
|
||
'pet.imageReplace': 'جایگزینی اسپرایت',
|
||
'pet.imageRemove': 'استفاده از ایموجی',
|
||
'pet.imageHintIdle': 'PNG، JPG، WebP، GIF یا SVG. اسپرایتشیت؟ یک نوار افقی بارگذاری کنید و تعداد فریم را تنظیم کنید.',
|
||
'pet.imageHintActive': 'اسپرایت شما نمایش داده میشود. فریم را > ۱ تنظیم کنید تا یک اسپرایتشیت افقی متحرک شود.',
|
||
'pet.fieldFrames': 'فریمها',
|
||
'pet.fieldFramesHint': '۱ = ثابت. > ۱ = اسپرایتشیت افقی.',
|
||
'pet.fieldFps': 'سرعت (fps)',
|
||
'pet.fieldFpsHint': 'سرعت چرخش فریمها.',
|
||
'pet.atlasImport': 'وارد کردن اسپرایت Codex',
|
||
'pet.atlasImportTitle': 'یک اطلس hatch-pet با ابعاد 8x9 / 192x208 (PNG یا WebP) وارد کنید.',
|
||
'pet.atlasPickerTitle': 'یک ردیف انیمیشن انتخاب کنید',
|
||
'pet.atlasPickerHint': 'پتهای Codex با ۹ ردیف انیمیشن میآیند. بهطور پیشفرض کل اطلس را نگه میداریم تا پت با هاور، جهت کشیدن و بیکاری طولانی ردیف عوض کند. میتوانی به یک حلقهٔ ثابت هم محدودش کنی.',
|
||
'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': 'یک پت جدید با هوش مصنوعی پرورش بده',
|
||
'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': 'سیستمهای طراحی موجود را مرور و فعال کنید',
|
||
'settings.designSystemsInstalled': 'نصبشده',
|
||
'settings.designSystemsAdd': 'افزودن سیستم طراحی',
|
||
'settings.designSystemsHiddenCount': '{count} مورد از گالری خانه پنهان شده',
|
||
'settings.designSystemsShowAll': 'نمایش همه',
|
||
'settings.designSystemsShowHidden': 'نمایش پنهانها',
|
||
'settings.designSystemsSource': 'منبع',
|
||
'settings.designSystemsSourceLocal': 'محلی',
|
||
'settings.designSystemsSourceGithub': 'GitHub',
|
||
'settings.designSystemsStructure': 'ساختار',
|
||
'settings.designSystemsModeHybrid': 'ترکیبی',
|
||
'settings.designSystemsModeNormalized': 'نرمالشده',
|
||
'settings.designSystemsModeVerbatim': 'بدون تغییر',
|
||
'settings.designSystemsCraft': 'Craft',
|
||
'settings.designSystemsCraftColor': 'رنگ',
|
||
'settings.designSystemsCraftAccessibility': 'دسترسپذیری',
|
||
'settings.designSystemsGithubUrl': 'نشانی GitHub',
|
||
'settings.designSystemsProjectPath': 'مسیر پروژه',
|
||
'settings.designSystemsImportGithub': 'درونریزی از GitHub',
|
||
'settings.designSystemsImportProject': 'درونریزی از پروژه',
|
||
'settings.designSystemsImportedStatus': '{title} درونریزی شد',
|
||
'settings.designSystemsViewImported': 'مشاهده سیستم طراحی درونریزیشده',
|
||
'settings.designSystemsCategory': 'دستهبندی',
|
||
'settings.designSystemsAllCategories': 'همه دستهبندیها',
|
||
'settings.designSystemsShowInHomeGallery': 'نمایش در گالری خانه',
|
||
'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': 'کلید API کامپوزیو',
|
||
'settings.connectorsSavedTitle': 'در daemon محلی ذخیره شد',
|
||
'settings.connectorsSavedWithTail': 'ذخیره شد · ••••{tail}',
|
||
'settings.connectorsSaved': 'ذخیره شد',
|
||
'settings.connectorsGetApiKey': 'دریافت کلید API',
|
||
'settings.connectorsReplaceKeyPlaceholder': 'برای جایگزینی کلید ذخیرهشده، کلید جدید را جایگذاری کنید',
|
||
'settings.connectorsApiKeyPlaceholder': 'کلید API کامپوزیو را جایگذاری کنید',
|
||
'settings.connectorsClear': 'پاک کردن',
|
||
'settings.connectorsClearConfirmTitle': 'کلید API ذخیرهشدهٔ Composio پاک شود؟',
|
||
'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': 'Memory',
|
||
'settings.memoryHint': 'Personal facts auto-extracted from chats',
|
||
'settings.memoryDescription': 'Auto-extracted facts about you and your preferences. Saved as Markdown files and folded into every chat.',
|
||
'settings.memoryEnabled': 'Enabled',
|
||
'settings.memoryDisabled': 'Disabled',
|
||
'settings.memoryEnableLabel': 'Enable memory injection',
|
||
'settings.memoryDisabledBanner': 'Memory is currently OFF. Existing facts are preserved on disk but will not be folded into new chats and new turns will not extract anything new.',
|
||
'settings.memoryNew': 'New memory',
|
||
'settings.memoryEdit': 'Edit',
|
||
'settings.memoryDelete': 'Delete',
|
||
'settings.memoryPreview': 'Preview',
|
||
'settings.memoryEmpty': 'No memory yet.',
|
||
'settings.memoryEmptyHintZh': '记住: 用户偏好深色主题',
|
||
'settings.memoryEmptyHintEn': 'I prefer dark mode',
|
||
'settings.memoryName': 'Name',
|
||
'settings.memoryDesc': 'One-line description',
|
||
'settings.memoryBody': 'Memory body (Markdown supported)',
|
||
'settings.memoryBodyHint': 'Lead with the rule itself; add Why and How to apply lines.',
|
||
'settings.memoryStartersLabel': 'Need a starting point? Click to fill the form:',
|
||
'settings.memoryStarterUserName': 'My role',
|
||
'settings.memoryStarterUserDesc': 'I am a frontend engineer working on a SaaS design tool',
|
||
'settings.memoryStarterUserBody': '- Role: senior frontend engineer\n- Stack: React, TypeScript, Vite\n- Domain: design / collaboration tools\n- Timezone: GMT+8 (Asia/Shanghai)\n\nWhen to apply: any chat — frame examples around web frontend.',
|
||
'settings.memoryStarterFeedbackName': 'UI preferences',
|
||
'settings.memoryStarterFeedbackDesc': 'Dark mode, large body text, low information density',
|
||
'settings.memoryStarterFeedbackBody': '- Theme: dark by default\n- Body text: ≥ 18px\n- Information density: prefer whitespace, fewer items per screen\n\nWhy: less eye strain during long sessions.\nWhen to apply: whenever you generate UI, web pages, or slides.',
|
||
'settings.memoryStarterProjectName': 'Current project',
|
||
'settings.memoryStarterProjectDesc': 'Open Design v0.5 — chat-driven design editor',
|
||
'settings.memoryStarterProjectBody': '- Goal: ship the chat-driven editor this quarter\n- Priorities: streaming render, local multimodal, offline-first\n- Stack: Next.js 16, Express daemon, SQLite\n\nWhen to apply: in any conversation about this project.',
|
||
'settings.memorySaveHint': 'Not auto-saved — click Create / Save to apply.',
|
||
'settings.memoryIndexSaveHint': 'Edits to the index are not auto-saved — click Save index to apply.',
|
||
'settings.memoryIndexUnsaved': 'Unsaved changes',
|
||
'settings.memoryFlashCreated': '✓ Memory created',
|
||
'settings.memoryFlashSaved': '✓ Memory saved',
|
||
'settings.memoryFlashDeleted': '✓ Memory deleted',
|
||
'settings.memoryFlashIndexSaved': '✓ Index saved',
|
||
'settings.memoryFlashPathCopied': '✓ مسیر کپی شد',
|
||
'settings.memoryNameLabel': 'Title',
|
||
'settings.memoryTypeLabel': 'Type',
|
||
'settings.memoryDescLabel': 'Description',
|
||
'settings.memoryBodyLabel': 'Content',
|
||
'settings.memoryTypeUser': 'User',
|
||
'settings.memoryTypeFeedback': 'Feedback',
|
||
'settings.memoryTypeProject': 'Project',
|
||
'settings.memoryTypeReference': 'Reference',
|
||
'settings.memoryIndex': 'MEMORY.md (index)',
|
||
'settings.memoryIndexSave': 'Save index',
|
||
'settings.memoryIndexReset': 'Reset',
|
||
'settings.memoryToastChanged': 'Memory updated',
|
||
'settings.memoryToastClickHint': 'مشاهده',
|
||
'settings.memoryAll': 'All',
|
||
'settings.memoryExtractions': 'Extraction history',
|
||
'settings.memoryExtractionsHint': 'Recent LLM-backed extraction attempts. Heuristic regex extraction always runs first; LLM extraction runs in the background after each turn.',
|
||
'settings.memoryExtractionsEmpty': 'No extractions yet. The next chat turn will populate this list.',
|
||
'settings.memoryExtractionsRefresh': 'Refresh',
|
||
'settings.memoryExtractionsRefreshing': 'Refreshing…',
|
||
'settings.memoryExtractionPhaseRunning': 'Running…',
|
||
'settings.memoryExtractionPhaseSuccess': 'Success',
|
||
'settings.memoryExtractionPhaseSkipped': 'Skipped',
|
||
'settings.memoryExtractionPhaseFailed': 'Failed',
|
||
'settings.memoryExtractionSkipNoProvider': 'No API key configured for LLM memory extraction.',
|
||
'settings.memoryExtractionSkipDisabled': 'Memory is disabled.',
|
||
'settings.memoryExtractionSkipEmpty': 'Empty user message — nothing to extract.',
|
||
'settings.memoryExtractionSkipNoMatch': 'No regex pattern matched this turn.',
|
||
'settings.memoryExtractionKindHeuristic': 'regex',
|
||
'settings.memoryExtractionKindLlm': 'LLM',
|
||
'settings.memoryExtractionProviderEnv': 'env',
|
||
'settings.memoryExtractionProviderMediaConfig': 'media settings',
|
||
'settings.memoryExtractionProposed': 'proposed',
|
||
'settings.memoryExtractionWritten': 'written',
|
||
'settings.memoryExtractionDuration': 'in',
|
||
'settings.memoryNoProviderBannerTitle': 'LLM memory extraction is not running',
|
||
'settings.memoryNoProviderBannerBody': 'No API key found for the memory extractor. Add an OpenAI key under Media providers, or set ANTHROPIC_API_KEY / OPENAI_API_KEY in the environment, to enable LLM-driven extraction. Heuristic regex extraction is still active.',
|
||
'settings.memoryExtractionProviderOverride': 'memory settings',
|
||
'settings.memoryExtractionDelete': 'Delete',
|
||
'settings.memoryExtractionsClear': 'Clear',
|
||
'settings.memoryExtractionsClearTitle': 'Clear all extraction history',
|
||
'settings.libraryInstall': 'نصب',
|
||
'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 model',
|
||
'settings.memoryModelInlineSameAsChat': 'Same as chat',
|
||
'settings.memoryModelInlineSameAsChatWithModel': 'Same as chat ({model})',
|
||
'settings.memoryModelInlineSameAsChatWithProvider': 'Same as chat ({provider})',
|
||
'settings.memoryModelInlineHintCli': 'Optional. The memory extractor uses an env-var or media-providers API key on this provider; pinning a model here just overrides the auto-pick.',
|
||
'settings.memoryModelInlineHintCliConstrained': 'Optional. Memory will call {provider}; needs an env-var or media-providers API key for that provider, or pick a model below to override.',
|
||
'settings.memoryModelInlineHintByok': 'Optional. Reuses your chat API key on the same provider — picking a different (usually cheaper) model only changes the request body.',
|
||
'settings.memoryModelInlineFlashSaved': 'Saved',
|
||
'settings.memoryModelInlineFlashCleared': 'Cleared',
|
||
'settings.orbit.eyebrow': 'اتوماسیون',
|
||
'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': 'قالب prompt',
|
||
'settings.orbit.templateMissing': 'قالب {id} نصب نشده است.',
|
||
'settings.orbit.templateMissingOption': '{id} (موجود نیست)',
|
||
'settings.orbit.templateMissingInstall': 'برای هدایت prompt یک skill مربوط به Orbit نصب کنید.',
|
||
'settings.orbit.templateMissingPickAnother': 'از فهرست، قالب دیگری انتخاب کنید.',
|
||
'settings.orbit.templateResetTitle': 'بازنشانی به {id}',
|
||
'settings.orbit.templateReset': 'بازنشانی',
|
||
'settings.orbit.templateHelp': 'Orbit را با یک skill هدایت کنید — prompt نمونهٔ قالب انتخابشده در هر اجرای Orbit وارد میشود تا خلاصهها شکل همان قالب را دنبال کنند.',
|
||
'settings.orbit.templateAria': 'قالب prompt مربوط به Orbit',
|
||
'settings.orbit.templatesLoading': 'در حال بارگذاری قالبها…',
|
||
'settings.orbit.templatesOptgroup': 'قالبهای skills مربوط به Orbit',
|
||
'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 اجرا میشوند. یک کلید API از Composio در بخش اتصالدهندهها اضافه کنید تا کاتالوگ باز شود و اولین یکپارچهسازی خود را انتخاب کنید.",
|
||
'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': 'artifact HTML قابل تازهسازی که از فعالیت کانکتورها ساخته شده است.',
|
||
'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': '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}',
|
||
};
|