mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
* feat(daemon): add Antigravity agent adapter
Adds Google Antigravity (`agy` CLI) as a coding-agent runtime. Detection
picks up `agy` on PATH, the daemon spawns `agy -p "<prompt>"` for a
single non-interactive turn, and the assistant text reply streams back
on stdout. OAuth is shared with the Antigravity IDE through the system
keyring, so users who have signed into the desktop app are authenticated
on first run with no extra step.
`agy` v1.0.3 has no JSON / stream-json / ACP output mode (upstream issue
#119), no `--model` flag (issue #35), and no MCP forwarding hook yet —
the adapter ships with `streamFormat: 'plain'` and a single `default`
fallback model so the model picker doesn't mislead users into thinking
their choice is wired through. We will upgrade buildArgs + add a
dedicated event parser when upstream ships structured output.
Also gitignores `.antigravitycli/`, the project-local config directory
`agy` auto-creates on every run (upstream issue #175).
* fix(daemon): Antigravity adapter — stdin prompt, brand icon, form loop, empty-output guard
- Switch prompt delivery from argv to stdin (`agy -p -`) to avoid the
30KB maxPromptArgBytes limit that blocked real-world composed prompts
- Add official Antigravity brand SVG icon to agent picker
- Fix repeated question-form loop for plain agents by injecting an
OVERRIDE block when form answers are already present in the transcript
- Add empty-output guard for plain agents so expired auth or silent
failures surface a user-visible error instead of a blank "Done" turn
* feat(daemon): expand Antigravity adapter — model picker, form-loop fix, OAuth launcher, log-file classification
PR #3157 follow-up integrating four iterations from end-to-end manual
testing on Gemini 3.5 Flash + GPT-OSS 120B Medium through `agy` v1.0.3.
Each section is independently verifiable; combined they're what made
the first successful artifact generation work end-to-end.
## Model picker via settings.json (agy has no --model flag)
agy v1.0.3 ships no `--model` CLI flag (upstream issue #35), but the
TUI Switch-Model picker writes the chosen label to
`~/.gemini/antigravity-cli/settings.json`'s `"model"` field, and every
`-p` invocation re-reads that file on startup — verified by capturing
the `--log-file` line `Propagating selected model override to backend:
label="<model>"`. Antigravity's `fallbackModels` now lists the 8
labels its TUI exposes (Gemini 3.1 Pro / 3.5 Flash variants, Claude
Sonnet/Opus 4.6 Thinking, GPT-OSS 120B Medium) and `buildArgs`
persists the user's choice to settings.json right before spawn. The
synthetic `default` id is preserved — picking it leaves settings.json
untouched so a user who switches models from agy's own TUI keeps
their choice.
Introduces `RuntimeAgentDef.supportsCustomModel?: boolean`. AMR's
hardcoded blocklist in `SettingsDialog.tsx` migrates to the
declarative flag (it rejects free-form ids at the ACP layer), and
antigravity opts out because its label set is a server-side enum that
silently fails on unrecognised strings.
## Form-loop fix (transcript sanitizer + stronger OVERRIDE)
The discovery form loop on weak/medium plain-stream models (GPT-OSS
120B Medium, Gemini 3.5 Flash) had two reinforcing causes:
1. `buildDaemonTranscript` packed the prior assistant turn's
literal `<question-form>` markup into the user request on the
next turn, giving the model a template to echo. New
`sanitizePriorAssistantTurnForTranscript` strips
`<question-form>...</question-form>` blocks and ```json fences
that match form-schema shape, replacing them with a brief
placeholder. User content is preserved verbatim (a user who
legitimately mentions `<question-form>` in chat keeps their
message intact).
2. The OVERRIDE block on form-answered turns was 4 lines and only
banned the bare `<question-form>` tag — models still emitted the
fenced JSON, form-asking prose ("Got it — tell me the following"),
and fake system events ("subagents stopped"). The new
`FORM_ANSWERED_SYSTEM_OVERRIDE` enumerates each anti-pattern and
pins them via tests, so silently weakening any line reintroduces
the regression.
Also adds RuntimeAgentDef.resumesSessionViaCli + RuntimeContext.
hasPriorAssistantTurn as forward-looking abstractions (skipTranscript
option on composeChatUserRequestForAgent). Antigravity does NOT opt
in — agy's `-c` resume activates an internal agentic loop with tool
retries and fallback-to-cached-response on tool errors that the OD
system prompt cannot steer; reverted after seeing byte-identical
form re-emissions caused by agy's own retry logic, not OD's transcript.
## One-click OAuth via system terminal
agy print mode can't complete Google Sign-In on its own (the OAuth
callback page asks the user to paste an auth code back into agy, but
`-p` has no input field). Before this commit the auth banner only
told the user to "open a terminal yourself."
Adds `POST /api/agents/antigravity/oauth-launch` and a cross-platform
launcher in `runtimes/terminal-launch.ts`:
- macOS: osascript → Terminal.app `do script "agy"` + activate
- Linux: tries x-terminal-emulator, gnome-terminal, konsole,
xfce4-terminal, xterm in order
- Windows: `cmd /c start "Open Design" cmd /k agy`
The endpoint hardcodes the `agy` command (no user input → no shell
injection surface) and is loopback-gated like the other daemon
endpoints. The chat's `AGENT_AUTH_REQUIRED` banner now renders a
"Sign in via terminal" button next to Retry; clicking it spawns the
terminal so the user can finish OAuth in one click.
## Silent-failure classification (auth vs quota via --log-file)
agy print mode is silent on stdout/stderr for both missing-OAuth AND
quota-exhausted failures — the upstream
`RESOURCE_EXHAUSTED (code 429): Individual quota reached` and the
`not logged into Antigravity` line only surface in agy's
`--log-file`. Without log inspection the daemon misread quota as
"auth required" and showed the wrong banner.
`RuntimeContext.agentLogFilePath` carries a daemon-owned per-run temp
path that antigravity's buildArgs translates to `--log-file <path>`.
The empty-output guard now reads that log on a `code === 0 &&
!childStdoutSeen` exit, feeds the tail to
`classifyAgentServiceFailure`, and routes:
- "not logged into Antigravity" → AGENT_AUTH_REQUIRED with
antigravityAuthGuidance
- "RESOURCE_EXHAUSTED" / "quota" / → RATE_LIMITED with
"Individual quota reached" antigravityQuotaGuidance
- none of the above (rare) → fall back to auth guidance
as the most likely cause
Both surface a terminal launcher in the auth banner: auth gets "Sign
in via terminal", quota gets "Switch model in terminal" — same
endpoint, contextual label. The handler is identical (open agy in a
terminal); the user either signs in or uses agy's Switch Model
picker to pick a model with available quota.
## Validation
- `pnpm guard` pass
- `pnpm --filter @open-design/daemon` runtime + telemetry suites:
192 passed, 1 skipped (the 1 pre-existing `task-type` failure on
origin/main is unrelated to this change)
- `pnpm --filter @open-design/web` typecheck pass; sse / amr-guidance
/ AgentIcon suites pass (51 web tests)
- Manual end-to-end on darwin + Gemini 3.5 Flash and GPT-OSS 120B
Medium: turn-1 question-form rendered correctly, turn-2 produced
`<artifact>` with full HTML (3.3KB Modern Minimal design) instead
of re-emitting the form. agy `--log-file` content correctly
classified as RATE_LIMITED when Gemini Pro quota was exhausted,
and as AGENT_AUTH_REQUIRED when keychain was cleared.
* fix(web/test): align amrAgent fixture with supportsCustomModel contract
The AMR agent definition in the daemon ships `supportsCustomModel: false`
so the Settings model picker hides the free-text "Custom…" option. The
PR changed `allowCustomModel` from `selected.id !== 'amr'` (hardcoded)
to `selected.supportsCustomModel !== false` (declarative), but the test
fixture was not updated to carry the same field — causing the
`__custom__` sentinel to appear in the picker under test.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): align formAnswerTransition wording with main + scope build directive to discovery
CI surfaced two failures on the merge with main:
- chat-route.test marks submitted discovery form answers ... expected
the main-version wording 'Do not emit another <formId> form.'
- telemetry-message-finalization keeps non-discovery form answers
active ... expected task-type to fall through the else branch
('Treat these form answers as the active user turn'), not the
discovery RULE 2/RULE 3 build branch.
The colleague's earlier fba1e40b form-loop fix tightened both pieces
(stronger wording + grouped discovery|task-type into the build branch)
but didn't update the tests that pin the contract. Revert the
transition wording to main and re-scope the build directive to
'discovery' only. The aggressive form-loop suppression we added in
this PR now lives in the system-prompt FORM_ANSWERED_SYSTEM_OVERRIDE
block, which is far stronger than the user-request transition text
this commit reverts.
* fix(daemon): scope formOverride by form id, detach Linux terminal, move agy log cleanup to finally
- FORM_ANSWERED_GENERIC_OVERRIDE: new exported constant for non-discovery/
non-task-type form ids; contains only the "do not re-ask" suppression
without the RULE 2 / RULE 3 / artifact directive.
- formAnswerTransitionForCurrentPrompt: extend build-transition branch to
include task-type alongside discovery, keeping user-turn and system
override consistent.
- Prompt assembly (server.ts ~10848): derive formOverride from the parsed
form id — FORM_ANSWERED_SYSTEM_OVERRIDE for discovery/task-type,
FORM_ANSWERED_GENERIC_OVERRIDE for all other form ids, empty otherwise.
- launchOnLinux: replace execFileAsync (waited for terminal exit, 3 s cap)
with spawn({ detached: true, stdio: 'ignore' }) + unref(); resolve on
the 'spawn' event so long-lived interactive terminals (xterm, konsole)
are not killed mid-OAuth-flow.
- Antigravity log cleanup: move fs.promises.unlink(agentLogFilePath) into
a try/finally wrapper around the close handler so every exit path
(success, failure, cancel, non-zero exit) cleans up the per-run temp
file, preventing unbounded /tmp accumulation.
- Tests: rename task-type case to assert build-transition behaviour; add
generic-form-id case (preferences) pinning the non-build path; add
FORM_ANSWERED_GENERIC_OVERRIDE content assertions.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): switch Antigravity buildArgs to chat subcommand invocation
Replace top-level `-p -` with `agy chat [--log-file …] -` so the adapter
uses the documented chat subcommand and stdin sentinel instead of the
unrecognised global -p flag. Update the agent-args test description and
all four deepEqual assertions to assert the ['chat', '-'] shape.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* test(daemon): drop real-platform default-launch assertion from terminal-launch suite
The removed test called launchAgentInSystemTerminal('agy') with no
platform override, which invokes the real system terminal on every
developer machine running the daemon test suite (Terminal.app on macOS,
cmd.exe on Windows, xterm/gnome-terminal on Linux). That is an
unacceptable OS side effect for a unit test.
The behaviour being asserted — that omitting platform selects
process.platform — is a TypeScript default-parameter guarantee, not a
runtime invariant that needs an integration test. The remaining 'aix'
case continues to pin the unsupported-platform failure shape.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): buffer Antigravity stdout to suppress auth URL before close-time classifier
The plain-stream close handler at code===0 can detect an agy OAuth
prompt in agentStdoutTail and emit AGENT_AUTH_REQUIRED, but by the
time close fires the stdout chunk has already been forwarded to the
client via the plain-stream `send('stdout', { chunk })` path. This
leaves both the raw OAuth URL and the terminal-launch guidance visible
in chat.
Buffer all stdout chunks for the `antigravity` agent instead of
forwarding them immediately. The existing close-time auth-prompt guard
(code===0, !trackingSubstantiveOutput, childStdoutSeen) returns early
when it detects the auth pattern, leaving the buffer unflushed and the
OAuth URL out of the SSE stream. For legitimate assistant output the
buffer is flushed in order just before design.runs.finish so the
chunks still arrive before the run's finished event.
Adds a chat-route integration test using a fake `agy` that exits 0
after printing the canonical auth prompt; asserts that the run emits
AGENT_AUTH_REQUIRED with no event: stdout delta containing the URL.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* test(daemon): isolate antigravity buildArgs argv test from real settings file
Pass a temp antigravitySettingsPath in the RuntimeContext for the
withModel argv assertion so unit tests do not touch
~/.gemini/antigravity-cli/settings.json. Adds the optional
antigravitySettingsPath field to RuntimeContext and threads it
through buildArgs to writeAntigravityModelSelection; production
callers leave it undefined, preserving the existing default path.
Generated-By: looper 0.9.2 (runner=fixer, agent=claude-code)
* fix(daemon): revert Antigravity buildArgs to `-p -` (the only working agy v1.0.3 invocation)
The looper-reviewer-bot reported `chat` as agy's headless subcommand
based on its environment's agy build, and looper-fixer applied that
shape. The installed CLI (`agy --version` reports `1.0.3`) does NOT
expose a `chat` subcommand — `agy --help`'s `Available subcommands`
section lists only `changelog / help / install / plugin / update`,
and `agy chat - < prompt` exits 0 with empty stdout (the daemon then
forwards it as a 'successful' empty reply, exactly the failure mode
the auth/quota guard at server.ts ~12090 is meant to catch — for the
wrong reason).
`-p` is the documented print-mode flag (`Short alias for --print`)
and `agy -p -` reads the prompt from stdin and prints the model
reply, which the entire end-to-end test sequence in this PR has
verified against (form-loop fix, settings.json model routing,
log-file classification all confirmed working on Gemini 3.5 Flash
+ GPT-OSS 120B Medium with this invocation).
Updates the agent-args test to pin `['-p', '-']` instead of
`['chat', '-']` and adds an inline comment in antigravity.ts noting
that `chat` may exist in a future agy build but is not the contract
on the installed CLI today.
* fix(daemon): serialize Antigravity concrete-model spawns to dodge settings.json race
Reviewer (looper) flagged a concurrency race in the model-routing path:
~/.gemini/antigravity-cli/settings.json is process-global, so two OD
runs starting close together with different concrete models can race
the file — run A writes model A, run B writes model B, then A's agy
finally reads settings.json and executes on model B. The Settings
model picker becomes nondeterministic under parallel conversations.
Adds a per-process promise chain in antigravity.ts:
- acquireAntigravityModelLock(): chain-await + return release fn
- waitForAgyToReadModel(logPath, expected): polls agy's --log-file
for the upstream signal
'Propagating selected model override to backend: label="<X>"'
which model_config_manager.go emits once agy has finished reading
settings.json. Returns true on observed match, false on timeout.
Regex-escapes the expected label so '(' / ')' in 'GPT-OSS 120B
(Medium)' match literally, not as a capture group.
server.ts spawn pipeline now acquires the lock BEFORE buildArgs (which
performs the settings.json write) and schedules a release-once handler
that fires when EITHER (a) the log-file confirms agy read the model
or (b) the child exits — the exit fallback prevents a stuck/crashed
agy from starving the queue for every subsequent antigravity spawn.
Default-model spawns bypass the lock entirely: their buildArgs doesn't
touch settings.json, so there's nothing to serialize.
Tests pin:
- FIFO ordering across 2 / 3 concurrent acquirers
- Wait helper's regex correctly matches parenthesized labels
- Wait helper does NOT match a different model with shared prefix
- Wait helper swallows missing-log-file errors and returns false on
timeout (no spawn-pipeline crash if the log never appears)
194 → 198 passing runtime tests, 0 regressions.
* fix(daemon): close Antigravity lock release race on slow agy startup (looper #263fd2fe7)
Reviewer flagged that the previous serialization scheduled
`releaseOnce` in `.finally()` on waitForAgyToReadModel — meaning the
helper's `false` timeout return ALSO released the lock. If agy took
longer than the 15s polling window to read settings.json (cold start,
swap-thrash, slow network handshake to the upstream backend), run A's
lock dropped at 15s, run B rewrote settings.json with model B, and
run A's still-starting agy then read the wrong model. Same race the
original mutex was meant to close.
Fix the release semantics to be release-on-confirmation-only:
- waitForAgyToReadModel: `false` now strictly means 'I gave up
polling,' not 'agy definitely did not read this.' Document the
contract so a future caller can't conflate the two. Add an
optional AbortSignal so server.ts can stop polling when the child
exits — without it, the leftover watcher could outlive the run
and accidentally match a later concurrent run's log content,
releasing the wrong lock.
- server.ts: schedule `releaseOnce` only when waitForAgyToReadModel
returns true. The exit handler (which fires for crashes, fast
exits, normal completion) is now the canonical fallback that
releases the lock no matter what — the queue can't starve
permanently because agy always exits eventually. The exit
handler also fires the AbortController so the watcher cleans up.
New tests pin:
- timeout returns false WITHOUT any release-implying side effect
- already-aborted signal short-circuits (no readFile calls)
- abort mid-poll wakes the helper from its setTimeout (no
multi-hundred-ms hang waiting out a poll interval that no longer
matters)
198 → 201 passing runtime tests, 0 regressions.
---------
Co-authored-by: qiongyu1999 <2694684348@qq.com>
1826 lines
120 KiB
TypeScript
1826 lines
120 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',
|
||
'chat.antigravityError.launchTerminalCta': 'Sign in via terminal',
|
||
'chat.antigravityError.launchSwitchModelCta': 'Switch model in terminal',
|
||
'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.comments.targetImage': 'Image',
|
||
'chat.comments.targetControl': 'Control',
|
||
'chat.comments.targetLink': 'Link',
|
||
'chat.comments.targetText': 'Text',
|
||
'chat.comments.targetSection': 'Section',
|
||
'chat.comments.targetPage': 'Page',
|
||
'chat.comments.targetArea': 'Area',
|
||
'chat.annotationNotePlaceholder': 'Add a note for this annotation',
|
||
'chat.annotationQueue': 'Queue',
|
||
'chat.annotationQueueing': 'Queueing...',
|
||
'chat.annotationSending': 'Sending...',
|
||
'chat.annotationSendDisabledReason': 'A task is currently running',
|
||
'chat.annotationPreviewMissing': 'Could not capture the preview. Please try again.',
|
||
'chat.annotationPreviewMissingInk': 'Could not capture the preview. Try again to avoid sending only ink.',
|
||
'chat.annotationTimeout': 'Annotation send timed out. Please try again.',
|
||
'chat.annotationFailed': 'Annotation send failed. Please try again.',
|
||
'chat.annotationProjectCreateFailed': 'Could not create a project, so the annotation was not sent.',
|
||
'chat.annotationUploadFailed': 'Attachment upload failed. Please try again.',
|
||
'chat.inspect.noEditableTargets': 'This page has no editable elements yet.',
|
||
'chat.inspect.noCommentTargets': 'This page has no commentable elements yet.',
|
||
'chat.inspect.editHint': 'Click an element in the canvas to edit its styles.',
|
||
'chat.inspect.commentHint': 'Click an element in the canvas to add a comment.',
|
||
'chat.conversationsTitle': 'مکالمات',
|
||
'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': 'برای {noun} پیشنمایش همراهی وجود ندارد.',
|
||
'preview.unavailableBody': 'برای ساخت خروجی {kind}، پرامپت را در گفتگو اجرا کنید.',
|
||
'preview.nounSkill': 'این مهارت',
|
||
'preview.nounPlugin': 'این افزونه',
|
||
'preview.nounTemplate': 'این الگو',
|
||
'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.fallbackTitle': 'Edit',
|
||
'manualEdit.movePanel': 'Move edit panel',
|
||
'manualEdit.closePanel': 'Close edit panel',
|
||
'manualEdit.selectLayer': "Select a layer",
|
||
'manualEdit.empty': "Click an element in the preview or choose a layer.",
|
||
'manualEdit.noEditableLayers': "No editable layers found.",
|
||
'manualEdit.noClass': "no class",
|
||
'manualEdit.tabsAria': "Manual edit tabs",
|
||
'manualEdit.tabContent': "Content",
|
||
'manualEdit.tabStyle': "Style",
|
||
'manualEdit.tabAttributes': "Attributes",
|
||
'manualEdit.tabHtml': "Html",
|
||
'manualEdit.tabSource': "Source",
|
||
'manualEdit.attributesJson': "Attributes JSON",
|
||
'manualEdit.selectedHtml': "Selected element HTML",
|
||
'manualEdit.fullSource': "Full artifact source",
|
||
'manualEdit.applyContent': "Apply Content",
|
||
'manualEdit.applyStyle': "Apply Style",
|
||
'manualEdit.applyAttributes': "Apply Attributes",
|
||
'manualEdit.applyHtml': "Apply HTML",
|
||
'manualEdit.applySource': "Apply Source",
|
||
'manualEdit.invalidAttributes': "Invalid attributes JSON.",
|
||
'manualEdit.changes': "Changes",
|
||
'manualEdit.undo': "Undo",
|
||
'manualEdit.redo': "Redo",
|
||
'manualEdit.noChanges': "No manual edits yet.",
|
||
'manualEdit.imageUrl': "Image URL",
|
||
'manualEdit.altText': "Alt text",
|
||
'manualEdit.label': "Label",
|
||
'manualEdit.text': "Text",
|
||
'manualEdit.href': "Href",
|
||
'manualEdit.textColor': "Text color",
|
||
'manualEdit.background': "Background",
|
||
'manualEdit.fontSize': "Font size",
|
||
'manualEdit.weight': "Weight",
|
||
'manualEdit.align': "Align",
|
||
'manualEdit.padding': "Padding",
|
||
'manualEdit.margin': "Margin",
|
||
'manualEdit.radius': "Radius",
|
||
'manualEdit.border': "Border",
|
||
'manualEdit.width': "Width",
|
||
'manualEdit.minHeight': "Min height",
|
||
'fileViewer.zoomOut': 'کوچکنمایی',
|
||
'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.shareMenuShareLink': 'SHARE LINK',
|
||
'fileViewer.shareMenuPublishOnline': 'PUBLISH ONLINE',
|
||
'fileViewer.shareMenuDownload': 'DOWNLOAD',
|
||
'fileViewer.shareMenuPresentation': 'Presentation',
|
||
'fileViewer.shareMenuSourceFiles': 'Source files',
|
||
'fileViewer.shareMenuSave': 'SAVE',
|
||
'fileViewer.copyProviderLink': 'Copy {provider} link',
|
||
'fileViewer.copyCloudflareLink': 'Copy Cloudflare link',
|
||
'fileViewer.screenshotCopying': 'Copying screenshot...',
|
||
'fileViewer.screenshotCopied': 'Screenshot copied to clipboard',
|
||
'fileViewer.screenshotClipboardDenied': 'Browser blocked clipboard access',
|
||
'fileViewer.screenshotPreviewLoading': 'Preview is still loading. Try again in a moment.',
|
||
'fileViewer.screenshotCaptureFailed': 'Could not capture the preview. Please try again.',
|
||
'fileViewer.exportPdf': 'صادرکردن به 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.exportStarted': 'Export started',
|
||
'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.deploySuccessToast': 'استقرار با موفقیت آپلود شد',
|
||
'fileViewer.deploySuccessToastDetails': '{provider} · {url}',
|
||
'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}',
|
||
};
|