mirror of
https://github.com/anomalyco/opencode.git
synced 2026-08-08 10:09:52 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d1b6cbc6a0 |
@@ -322,7 +322,6 @@ jobs:
|
|||||||
working-directory: packages/desktop
|
working-directory: packages/desktop
|
||||||
env:
|
env:
|
||||||
NODE_OPTIONS: --max-old-space-size=4096
|
NODE_OPTIONS: --max-old-space-size=4096
|
||||||
OPENCODE_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
|
OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
|
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
---
|
|
||||||
name: rtl-aware-development
|
|
||||||
description: OpenCode Desktop should be RTL-aware. Use when implementing or reviewing RTL/LTR behavior in the web app, desktop app, CSS, menus, scrolling, resizing, icons, mixed-direction text, or Electron title bars.
|
|
||||||
---
|
|
||||||
|
|
||||||
# RTL-Aware Development
|
|
||||||
|
|
||||||
Treat direction as independent from language. Test English in both directions as well as real RTL and mixed-script content.
|
|
||||||
|
|
||||||
## Guidelines
|
|
||||||
|
|
||||||
- Set `lang` and `dir` on the document, and propagate direction through component providers used by portaled menus and popovers. Do not change the selected locale merely to force RTL.
|
|
||||||
- Keep DOM and focus order semantic. Flexbox and Grid already follow `dir`; do not add `row-reverse`, CSS `order`, or reversed markup just to mirror a layout.
|
|
||||||
- Prefer logical CSS for semantic layout. Reserve physical coordinates for pointer positions, canvas geometry, native window controls, and other genuinely physical placement.
|
|
||||||
|
|
||||||
```css
|
|
||||||
/* Avoid */
|
|
||||||
padding-left: 12px;
|
|
||||||
right: 0;
|
|
||||||
border-right: 1px solid;
|
|
||||||
text-align: left;
|
|
||||||
|
|
||||||
/* Prefer */
|
|
||||||
padding-inline-start: 12px;
|
|
||||||
inset-inline-end: 0;
|
|
||||||
border-inline-end: 1px solid;
|
|
||||||
text-align: start;
|
|
||||||
```
|
|
||||||
|
|
||||||
- Isolate mixed-direction text. Use `dir="auto"` or `<bdi>` for unknown text; keep code, URLs, IDs, and filesystem paths LTR without forcing the surrounding component LTR.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<span class="file-row"><bdi dir="auto">README.md</bdi></span> <bdi dir="ltr"><code>C:\src\app.ts</code></bdi>
|
|
||||||
```
|
|
||||||
|
|
||||||
- Mirror directional meaning, not every image. Back/forward, previous/next, disclosure, indentation, and directional progress may need mirroring. Do not mirror brands, clocks, media controls, charts, or text. Reverse physical gradients, `translateX`, SVG transforms, and animation deltas explicitly.
|
|
||||||
- Map interactions through direction. `clientX` remains physical; resizing a logical edge needs an RTL-aware delta. Logical previous/next keyboard controls may swap ArrowLeft/ArrowRight. Follow the relevant WAI-ARIA widget pattern.
|
|
||||||
- Do not assume LTR scrolling. RTL `scrollLeft` can start at `0` and become negative. Prefer `scrollIntoView({ inline: "nearest" })` or a tested direction-normalizing helper.
|
|
||||||
- For Electron title bars, prefer native caption controls and use `titleBarOverlay` plus `env(titlebar-area-*)` for the safe content rectangle. Keep Windows/macOS native-control avoidance and `trafficLightPosition` physical; keep app navigation inside that rectangle logical. Mark interactive titlebar children `app-region: no-drag`.
|
|
||||||
- Verify behavior, not screenshots alone. Check computed styles, pseudo-element geometry, hit zones, focus order, keyboard behavior, submenu direction, zoom/scaling, and both LTR and RTL scroll endpoints.
|
|
||||||
|
|
||||||
## Test Matrix
|
|
||||||
|
|
||||||
- English + LTR
|
|
||||||
- English + forced RTL
|
|
||||||
- A real RTL locale + RTL
|
|
||||||
- Mixed RTL/LTR content, long labels, numbers, code, and paths
|
|
||||||
- Keyboard, pointer resize, scrolling, menus/submenus, and Electron titlebar controls in both directions
|
|
||||||
|
|
||||||
## References
|
|
||||||
|
|
||||||
- [RTL Styling 101, Ahmad Shadeed](https://rtlstyling.com/posts/rtl-styling/)
|
|
||||||
- [CSS-Tricks: RTL Styling 101](https://css-tricks.com/rtl-styling-101/)
|
|
||||||
- [CSS-Tricks: CSS Logical Properties and Values](https://css-tricks.com/css-logical-properties-and-values/)
|
|
||||||
- [W3C: Structural markup and right-to-left text](https://www.w3.org/International/questions/qa-html-dir)
|
|
||||||
- [W3C: Inline bidirectional markup](https://www.w3.org/International/articles/inline-bidi-markup/)
|
|
||||||
- [MDN: CSS logical properties and values](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Logical_properties_and_values)
|
|
||||||
- [MDN: `dir`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/dir)
|
|
||||||
- [MDN: `scrollLeft`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft)
|
|
||||||
- [web.dev: Logical properties](https://web.dev/learn/css/logical-properties/)
|
|
||||||
- [Electron: Custom title bar](https://www.electronjs.org/docs/latest/tutorial/custom-title-bar)
|
|
||||||
- [WAI-ARIA: Window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/)
|
|
||||||
- [Kobalte: I18n Provider](https://kobalte.dev/docs/core/components/i18n-provider/)
|
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
"packages/app": {
|
"packages/app": {
|
||||||
"name": "@opencode-ai/app",
|
"name": "@opencode-ai/app",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@corvu/drawer": "catalog:",
|
"@corvu/drawer": "catalog:",
|
||||||
"@dnd-kit/abstract": "0.5.0",
|
"@dnd-kit/abstract": "0.5.0",
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
},
|
},
|
||||||
"packages/cli": {
|
"packages/cli": {
|
||||||
"name": "@opencode-ai/cli",
|
"name": "@opencode-ai/cli",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"bin": {
|
"bin": {
|
||||||
"lildax": "./bin/lildax.cjs",
|
"lildax": "./bin/lildax.cjs",
|
||||||
},
|
},
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
},
|
},
|
||||||
"packages/codemode": {
|
"packages/codemode": {
|
||||||
"name": "@opencode-ai/codemode",
|
"name": "@opencode-ai/codemode",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"acorn": "8.15.0",
|
"acorn": "8.15.0",
|
||||||
"effect": "catalog:",
|
"effect": "catalog:",
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
},
|
},
|
||||||
"packages/console/app": {
|
"packages/console/app": {
|
||||||
"name": "@opencode-ai/console-app",
|
"name": "@opencode-ai/console-app",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cloudflare/vite-plugin": "1.15.2",
|
"@cloudflare/vite-plugin": "1.15.2",
|
||||||
"@ibm/plex": "6.4.1",
|
"@ibm/plex": "6.4.1",
|
||||||
@@ -194,7 +194,7 @@
|
|||||||
},
|
},
|
||||||
"packages/console/core": {
|
"packages/console/core": {
|
||||||
"name": "@opencode-ai/console-core",
|
"name": "@opencode-ai/console-core",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-sts": "3.782.0",
|
"@aws-sdk/client-sts": "3.782.0",
|
||||||
"@jsx-email/render": "1.1.1",
|
"@jsx-email/render": "1.1.1",
|
||||||
@@ -221,7 +221,7 @@
|
|||||||
},
|
},
|
||||||
"packages/console/function": {
|
"packages/console/function": {
|
||||||
"name": "@opencode-ai/console-function",
|
"name": "@opencode-ai/console-function",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ai-sdk/anthropic": "3.0.82",
|
"@ai-sdk/anthropic": "3.0.82",
|
||||||
"@ai-sdk/openai": "3.0.48",
|
"@ai-sdk/openai": "3.0.48",
|
||||||
@@ -243,7 +243,7 @@
|
|||||||
},
|
},
|
||||||
"packages/console/mail": {
|
"packages/console/mail": {
|
||||||
"name": "@opencode-ai/console-mail",
|
"name": "@opencode-ai/console-mail",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jsx-email/all": "2.2.3",
|
"@jsx-email/all": "2.2.3",
|
||||||
"@jsx-email/cli": "1.4.3",
|
"@jsx-email/cli": "1.4.3",
|
||||||
@@ -267,7 +267,7 @@
|
|||||||
},
|
},
|
||||||
"packages/console/support": {
|
"packages/console/support": {
|
||||||
"name": "@opencode-ai/console-support",
|
"name": "@opencode-ai/console-support",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cloudflare/vite-plugin": "1.15.2",
|
"@cloudflare/vite-plugin": "1.15.2",
|
||||||
"@opencode-ai/console-core": "workspace:*",
|
"@opencode-ai/console-core": "workspace:*",
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
},
|
},
|
||||||
"packages/core": {
|
"packages/core": {
|
||||||
"name": "@opencode-ai/core",
|
"name": "@opencode-ai/core",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"bin": {
|
"bin": {
|
||||||
"opencode": "./bin/opencode",
|
"opencode": "./bin/opencode",
|
||||||
},
|
},
|
||||||
@@ -381,7 +381,7 @@
|
|||||||
},
|
},
|
||||||
"packages/desktop": {
|
"packages/desktop": {
|
||||||
"name": "@opencode-ai/desktop",
|
"name": "@opencode-ai/desktop",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@zip.js/zip.js": "2.7.62",
|
"@zip.js/zip.js": "2.7.62",
|
||||||
"drizzle-orm": "catalog:",
|
"drizzle-orm": "catalog:",
|
||||||
@@ -435,7 +435,7 @@
|
|||||||
},
|
},
|
||||||
"packages/effect-drizzle-sqlite": {
|
"packages/effect-drizzle-sqlite": {
|
||||||
"name": "@opencode-ai/effect-drizzle-sqlite",
|
"name": "@opencode-ai/effect-drizzle-sqlite",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"drizzle-orm": "catalog:",
|
"drizzle-orm": "catalog:",
|
||||||
"effect": "catalog:",
|
"effect": "catalog:",
|
||||||
@@ -449,7 +449,7 @@
|
|||||||
},
|
},
|
||||||
"packages/effect-sqlite-node": {
|
"packages/effect-sqlite-node": {
|
||||||
"name": "@opencode-ai/effect-sqlite-node",
|
"name": "@opencode-ai/effect-sqlite-node",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"effect": "catalog:",
|
"effect": "catalog:",
|
||||||
},
|
},
|
||||||
@@ -461,7 +461,7 @@
|
|||||||
},
|
},
|
||||||
"packages/enterprise": {
|
"packages/enterprise": {
|
||||||
"name": "@opencode-ai/enterprise",
|
"name": "@opencode-ai/enterprise",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hono/standard-validator": "catalog:",
|
"@hono/standard-validator": "catalog:",
|
||||||
"@opencode-ai/core": "workspace:*",
|
"@opencode-ai/core": "workspace:*",
|
||||||
@@ -493,7 +493,7 @@
|
|||||||
},
|
},
|
||||||
"packages/function": {
|
"packages/function": {
|
||||||
"name": "@opencode-ai/function",
|
"name": "@opencode-ai/function",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/auth-app": "8.0.1",
|
"@octokit/auth-app": "8.0.1",
|
||||||
"@octokit/rest": "catalog:",
|
"@octokit/rest": "catalog:",
|
||||||
@@ -509,7 +509,7 @@
|
|||||||
},
|
},
|
||||||
"packages/http-recorder": {
|
"packages/http-recorder": {
|
||||||
"name": "@opencode-ai/http-recorder",
|
"name": "@opencode-ai/http-recorder",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@effect/platform-node": "4.0.0-beta.83",
|
"@effect/platform-node": "4.0.0-beta.83",
|
||||||
"@effect/platform-node-shared": "4.0.0-beta.83",
|
"@effect/platform-node-shared": "4.0.0-beta.83",
|
||||||
@@ -540,7 +540,7 @@
|
|||||||
},
|
},
|
||||||
"packages/llm": {
|
"packages/llm": {
|
||||||
"name": "@opencode-ai/llm",
|
"name": "@opencode-ai/llm",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@opencode-ai/schema": "workspace:*",
|
"@opencode-ai/schema": "workspace:*",
|
||||||
"@smithy/eventstream-codec": "4.2.14",
|
"@smithy/eventstream-codec": "4.2.14",
|
||||||
@@ -559,7 +559,7 @@
|
|||||||
},
|
},
|
||||||
"packages/opencode": {
|
"packages/opencode": {
|
||||||
"name": "opencode",
|
"name": "opencode",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"bin": {
|
"bin": {
|
||||||
"opencode": "./bin/opencode",
|
"opencode": "./bin/opencode",
|
||||||
},
|
},
|
||||||
@@ -690,7 +690,7 @@
|
|||||||
},
|
},
|
||||||
"packages/plugin": {
|
"packages/plugin": {
|
||||||
"name": "@opencode-ai/plugin",
|
"name": "@opencode-ai/plugin",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ai-sdk/provider": "3.0.8",
|
"@ai-sdk/provider": "3.0.8",
|
||||||
"@opencode-ai/sdk": "workspace:*",
|
"@opencode-ai/sdk": "workspace:*",
|
||||||
@@ -766,7 +766,7 @@
|
|||||||
},
|
},
|
||||||
"packages/sdk/js": {
|
"packages/sdk/js": {
|
||||||
"name": "@opencode-ai/sdk",
|
"name": "@opencode-ai/sdk",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cross-spawn": "catalog:",
|
"cross-spawn": "catalog:",
|
||||||
},
|
},
|
||||||
@@ -781,7 +781,7 @@
|
|||||||
},
|
},
|
||||||
"packages/server": {
|
"packages/server": {
|
||||||
"name": "@opencode-ai/server",
|
"name": "@opencode-ai/server",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@opencode-ai/core": "workspace:*",
|
"@opencode-ai/core": "workspace:*",
|
||||||
"@opencode-ai/protocol": "workspace:*",
|
"@opencode-ai/protocol": "workspace:*",
|
||||||
@@ -796,7 +796,7 @@
|
|||||||
},
|
},
|
||||||
"packages/session-ui": {
|
"packages/session-ui": {
|
||||||
"name": "@opencode-ai/session-ui",
|
"name": "@opencode-ai/session-ui",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kobalte/core": "catalog:",
|
"@kobalte/core": "catalog:",
|
||||||
"@opencode-ai/client": "file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz",
|
"@opencode-ai/client": "file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz",
|
||||||
@@ -814,8 +814,11 @@
|
|||||||
"diff": "catalog:",
|
"diff": "catalog:",
|
||||||
"dompurify": "3.3.1",
|
"dompurify": "3.3.1",
|
||||||
"fuzzysort": "catalog:",
|
"fuzzysort": "catalog:",
|
||||||
|
"katex": "0.16.27",
|
||||||
"luxon": "catalog:",
|
"luxon": "catalog:",
|
||||||
"marked": "catalog:",
|
"marked": "catalog:",
|
||||||
|
"marked-katex-extension": "5.1.6",
|
||||||
|
"marked-shiki": "catalog:",
|
||||||
"morphdom": "2.7.8",
|
"morphdom": "2.7.8",
|
||||||
"motion": "12.34.5",
|
"motion": "12.34.5",
|
||||||
"remeda": "catalog:",
|
"remeda": "catalog:",
|
||||||
@@ -828,6 +831,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tsconfig/node22": "catalog:",
|
"@tsconfig/node22": "catalog:",
|
||||||
"@types/bun": "catalog:",
|
"@types/bun": "catalog:",
|
||||||
|
"@types/katex": "0.16.7",
|
||||||
"@types/luxon": "catalog:",
|
"@types/luxon": "catalog:",
|
||||||
"@typescript/native-preview": "catalog:",
|
"@typescript/native-preview": "catalog:",
|
||||||
"typescript": "catalog:",
|
"typescript": "catalog:",
|
||||||
@@ -836,7 +840,7 @@
|
|||||||
},
|
},
|
||||||
"packages/slack": {
|
"packages/slack": {
|
||||||
"name": "@opencode-ai/slack",
|
"name": "@opencode-ai/slack",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@opencode-ai/sdk": "workspace:*",
|
"@opencode-ai/sdk": "workspace:*",
|
||||||
"@slack/bolt": "^3.17.1",
|
"@slack/bolt": "^3.17.1",
|
||||||
@@ -849,7 +853,7 @@
|
|||||||
},
|
},
|
||||||
"packages/stats/app": {
|
"packages/stats/app": {
|
||||||
"name": "@opencode-ai/stats-app",
|
"name": "@opencode-ai/stats-app",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ibm/plex": "6.4.1",
|
"@ibm/plex": "6.4.1",
|
||||||
"@kobalte/core": "catalog:",
|
"@kobalte/core": "catalog:",
|
||||||
@@ -883,7 +887,7 @@
|
|||||||
},
|
},
|
||||||
"packages/stats/core": {
|
"packages/stats/core": {
|
||||||
"name": "@opencode-ai/stats-core",
|
"name": "@opencode-ai/stats-core",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-athena": "3.933.0",
|
"@aws-sdk/client-athena": "3.933.0",
|
||||||
"@planetscale/database": "1.19.0",
|
"@planetscale/database": "1.19.0",
|
||||||
@@ -902,7 +906,7 @@
|
|||||||
},
|
},
|
||||||
"packages/stats/server": {
|
"packages/stats/server": {
|
||||||
"name": "@opencode-ai/stats-server",
|
"name": "@opencode-ai/stats-server",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-firehose": "3.933.0",
|
"@aws-sdk/client-firehose": "3.933.0",
|
||||||
"@effect/platform-node": "catalog:",
|
"@effect/platform-node": "catalog:",
|
||||||
@@ -944,7 +948,7 @@
|
|||||||
},
|
},
|
||||||
"packages/tui": {
|
"packages/tui": {
|
||||||
"name": "@opencode-ai/tui",
|
"name": "@opencode-ai/tui",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@opencode-ai/core": "workspace:*",
|
"@opencode-ai/core": "workspace:*",
|
||||||
"@opencode-ai/plugin": "workspace:*",
|
"@opencode-ai/plugin": "workspace:*",
|
||||||
@@ -971,7 +975,7 @@
|
|||||||
},
|
},
|
||||||
"packages/ui": {
|
"packages/ui": {
|
||||||
"name": "@opencode-ai/ui",
|
"name": "@opencode-ai/ui",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kobalte/core": "catalog:",
|
"@kobalte/core": "catalog:",
|
||||||
"@pierre/diffs": "catalog:",
|
"@pierre/diffs": "catalog:",
|
||||||
@@ -987,6 +991,7 @@
|
|||||||
"katex": "0.16.27",
|
"katex": "0.16.27",
|
||||||
"luxon": "catalog:",
|
"luxon": "catalog:",
|
||||||
"marked": "catalog:",
|
"marked": "catalog:",
|
||||||
|
"marked-katex-extension": "5.1.6",
|
||||||
"marked-shiki": "catalog:",
|
"marked-shiki": "catalog:",
|
||||||
"morphdom": "2.7.8",
|
"morphdom": "2.7.8",
|
||||||
"motion": "12.34.5",
|
"motion": "12.34.5",
|
||||||
@@ -1022,7 +1027,7 @@
|
|||||||
},
|
},
|
||||||
"packages/web": {
|
"packages/web": {
|
||||||
"name": "@opencode-ai/web",
|
"name": "@opencode-ai/web",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/cloudflare": "12.6.3",
|
"@astrojs/cloudflare": "12.6.3",
|
||||||
"@astrojs/markdown-remark": "6.3.1",
|
"@astrojs/markdown-remark": "6.3.1",
|
||||||
@@ -1078,7 +1083,6 @@
|
|||||||
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
|
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
|
||||||
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
|
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
|
||||||
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
|
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
|
||||||
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
|
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"@opentui/core": "catalog:",
|
"@opentui/core": "catalog:",
|
||||||
@@ -1133,7 +1137,7 @@
|
|||||||
"hono": "4.10.7",
|
"hono": "4.10.7",
|
||||||
"hono-openapi": "1.1.2",
|
"hono-openapi": "1.1.2",
|
||||||
"luxon": "3.6.1",
|
"luxon": "3.6.1",
|
||||||
"marked": "18.0.7",
|
"marked": "17.0.6",
|
||||||
"marked-shiki": "1.2.1",
|
"marked-shiki": "1.2.1",
|
||||||
"opentui-spinner": "0.0.7",
|
"opentui-spinner": "0.0.7",
|
||||||
"remeda": "2.26.0",
|
"remeda": "2.26.0",
|
||||||
@@ -4314,7 +4318,9 @@
|
|||||||
|
|
||||||
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
|
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
|
||||||
|
|
||||||
"marked": ["marked@18.0.7", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-iDVQ5ldaiKXn6b2JroX5kgRfmwgqolW7NpaEzTl1k/2Zh1njIEN9yniyLV/mOvWwtsE8OGgkjsCYvijuPk1dtA=="],
|
"marked": ["marked@17.0.6", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA=="],
|
||||||
|
|
||||||
|
"marked-katex-extension": ["marked-katex-extension@5.1.6", "", { "peerDependencies": { "katex": ">=0.16 <0.17", "marked": ">=4 <18" } }, "sha512-vYpLXwmlIDKILIhJtiRTgdyZRn5sEYdFBuTmbpjD7lbCIzg0/DWyK3HXIntN3Tp8zV6hvOUgpZNLWRCgWVc24A=="],
|
||||||
|
|
||||||
"marked-shiki": ["marked-shiki@1.2.1", "", { "peerDependencies": { "marked": ">=7.0.0", "shiki": ">=1.0.0" } }, "sha512-yHxYQhPY5oYaIRnROn98foKhuClark7M373/VpLxiy5TrDu9Jd/LsMwo8w+U91Up4oDb9IXFrP0N1MFRz8W/DQ=="],
|
"marked-shiki": ["marked-shiki@1.2.1", "", { "peerDependencies": { "marked": ">=7.0.0", "shiki": ">=1.0.0" } }, "sha512-yHxYQhPY5oYaIRnROn98foKhuClark7M373/VpLxiy5TrDu9Jd/LsMwo8w+U91Up4oDb9IXFrP0N1MFRz8W/DQ=="],
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"nodeModules": {
|
"nodeModules": {
|
||||||
"x86_64-linux": "sha256-uduwrM143NDSc+tXsi4lVVfoMll2a3BDHRUjuO7GB68=",
|
"x86_64-linux": "sha256-a7NyYa9vRUEqDfZNDPXXmFO58RDEgioyuGSl5CPBvxo=",
|
||||||
"aarch64-linux": "sha256-6DUda78XdXY6DP86lIUkweSjys3iG4Y4mo1PiaNuXbg=",
|
"aarch64-linux": "sha256-l4OJtSEllHvRhktjcaJYwkXBSaJvsIoyoLusbZfYMcM=",
|
||||||
"aarch64-darwin": "sha256-AkJwfLULLZVwwz+XU1QcFUZoIS7oVPCn+n/MXEaxrqE=",
|
"aarch64-darwin": "sha256-IIl0BQGs1/HLFh0auiQjiwfSQ2nfHcK2G2BAphYW59c=",
|
||||||
"x86_64-darwin": "sha256-hAxKGdiITTxQ2uujQt6prNjo3NxGAMMeo+9HlMWK6GU="
|
"x86_64-darwin": "sha256-vVeuPyd4ZIRYrHouphTuEb4rkRZLKKTAHe840jNh9rU="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -70,7 +70,7 @@
|
|||||||
"hono-openapi": "1.1.2",
|
"hono-openapi": "1.1.2",
|
||||||
"fuzzysort": "3.1.0",
|
"fuzzysort": "3.1.0",
|
||||||
"luxon": "3.6.1",
|
"luxon": "3.6.1",
|
||||||
"marked": "18.0.7",
|
"marked": "17.0.6",
|
||||||
"marked-shiki": "1.2.1",
|
"marked-shiki": "1.2.1",
|
||||||
"remend": "1.3.0",
|
"remend": "1.3.0",
|
||||||
"@playwright/test": "1.59.1",
|
"@playwright/test": "1.59.1",
|
||||||
@@ -158,7 +158,6 @@
|
|||||||
"@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch",
|
"@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch",
|
||||||
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
|
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
|
||||||
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
|
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
|
||||||
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch",
|
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch"
|
||||||
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,21 +19,6 @@
|
|||||||
|
|
||||||
- Always prefer `createStore` over multiple `createSignal` calls
|
- Always prefer `createStore` over multiple `createSignal` calls
|
||||||
|
|
||||||
## Localization
|
|
||||||
|
|
||||||
- NEVER hardcode user-visible English strings in production code. ALWAYS use an i18n key for visible copy, placeholders, accessible labels, tooltips, menus, dialogs, toasts, empty states, and displayed errors.
|
|
||||||
- When migrating existing copy to i18n, preserve the English text byte-for-byte unless the task explicitly requests a copy change.
|
|
||||||
- NEVER change existing English text or English keys to facilitate translation. English is intentional, designer-written source copy; adapt locale-specific translations and i18n mechanics around it.
|
|
||||||
- Keep locale complexity behind the shared typed i18n APIs. Feature and component code should use `language.t(...)` for ordinary copy and `language.plural(baseKey, count, params)` for count-sensitive copy. It must not inspect the locale, call `Intl.PluralRules`, construct or select plural-category keys such as `.one` or `.other`, or branch on locale-specific grammar.
|
|
||||||
- Prefer complete translated phrases. Do not concatenate grammatical fragments or make call sites assemble sentences. Keep placeholders to irreducible dynamic values such as names, paths, and counts.
|
|
||||||
- If a translation cannot be expressed by the current API, deepen the shared language/UI i18n module so one typed call owns locale selection, plural resolution, fallback, and interpolation. Do not leak that machinery into product code.
|
|
||||||
- Do not translate from model knowledge alone. Verify terminology and grammar with Unicode CLDR locale/plural data, Microsoft Localization Style Guides and terminology, Apple localization/style guidance and localized platform UI, Mozilla localization style guides, Mozilla Pontoon, and the Firefox localization corpus at `github.com/mozilla-l10n/firefox-l10n`.
|
|
||||||
- For developer-facing terminology, prefer the words already used by the target language's developer community over literal dictionary translations. Cross-check maintained localized developer products such as Firefox, KDE, and VS Code; use at least two independent corpora when they are available. If established practice keeps an English loanword or acronym, keep it rather than inventing a translation.
|
|
||||||
- Translate complete UI phrases in context. A glossary hit is evidence, not permission to translate word-by-word. Check terse labels such as session, prompt, agent, model, fork, shell, terminal, workspace, and worktree in the same grammatical role before choosing a term.
|
|
||||||
- Before a locale is ready, audit recurring concepts for one consistent translation and review every value that still equals English. Classify retained English as a product name, provider/tool name, URL, code token, keyboard legend, acronym, asset name, or established borrowing; translate unexplained leftovers.
|
|
||||||
- In translation review notes, name the corpora used and call out uncertain or region-specific terminology so native speakers can focus review where it matters.
|
|
||||||
- Also use the relevant language authority or official dictionary for the locale (for example RAE/Fundéu, FranceTerme, Duden, TDK, Kotus/Kielitoimiston sanakirja, Språkrådet/Bokmålsordboka, Rada Języka Polskiego/PWN, the Russian and Arabic language academies, the Ukrainian Orthography, Taiwan MOE dictionaries, or the Royal Society of Thailand). Treat the English dictionary as the semantic source of truth and preserve placeholders, code identifiers, product names, and keyboard labels.
|
|
||||||
|
|
||||||
## Tool Calling
|
## Tool Calling
|
||||||
|
|
||||||
- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.
|
- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
## Required Reading
|
|
||||||
|
|
||||||
- Before writing, changing, or reviewing E2E tests, ALWAYS read and follow Playwright's official [Best Practices](https://playwright.dev/docs/best-practices), [Auto-waiting](https://playwright.dev/docs/actionability), and [Assertions](https://playwright.dev/docs/test-assertions) guides.
|
|
||||||
- Use the official [Locators](https://playwright.dev/docs/locators), [Network](https://playwright.dev/docs/network), and [Test Isolation](https://playwright.dev/docs/browser-contexts) guides when those concerns apply.
|
|
||||||
|
|
||||||
## Test Hygiene
|
|
||||||
|
|
||||||
- Test user-visible behavior with isolated, deterministic data and scoped, unique locators.
|
|
||||||
- Prefer role, label, text, and explicit test-contract locators. Do not use `.first()` or `.last()` merely to silence strictness errors.
|
|
||||||
- Use locator actions, Playwright auto-waiting, and web-first assertions for observable readiness and outcomes.
|
|
||||||
- NEVER use `waitForTimeout`, `setTimeout`, sleeps, animation-frame counts, or other wall-clock delays to synchronize a test. Wait for the specific UI state, request, response, event, or application outcome instead.
|
|
||||||
- Do not treat navigation, a network response, DOM attachment, or visibility alone as proof that asynchronously rendered UI is ready. Assert the state the next action actually requires.
|
|
||||||
- Register event and network waits before the action that triggers them.
|
|
||||||
- Do not retry state-changing actions. Retry idempotent readiness checks, then perform the action once and assert its outcome.
|
|
||||||
- Keep action and assertion timeouts adaptive. Do not use short timeouts as readiness probes or rely on retries to hide flakes.
|
|
||||||
- Assert exact outcomes and identities so stale state, duplicate rendering, and interactions with the wrong element cannot pass.
|
|
||||||
@@ -197,9 +197,7 @@ export async function setupTimeline(
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
async waitForPart(partID: string) {
|
async waitForPart(partID: string) {
|
||||||
const part = page.locator(`[data-timeline-part-id="${partID}"]`)
|
await expect(page.locator(`[data-timeline-part-id="${partID}"]`).first()).toBeVisible()
|
||||||
await expect(part).toHaveCount(1)
|
|
||||||
await expect(part).toBeVisible()
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ test("opens the comment editor when code is clicked", async ({ page }) => {
|
|||||||
await line.click()
|
await line.click()
|
||||||
|
|
||||||
await expect(review.getByRole("textbox")).toBeVisible()
|
await expect(review.getByRole("textbox")).toBeVisible()
|
||||||
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 2")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("opens the comment editor when a line number is clicked", async ({ page }) => {
|
test("opens the comment editor when a line number is clicked", async ({ page }) => {
|
||||||
@@ -28,7 +27,6 @@ test("opens the comment editor when a line number is clicked", async ({ page })
|
|||||||
await lineNumber.click()
|
await lineNumber.click()
|
||||||
|
|
||||||
await expect(review.getByRole("textbox")).toBeVisible()
|
await expect(review.getByRole("textbox")).toBeVisible()
|
||||||
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 1")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("opens the comment editor for a line number range", async ({ page }) => {
|
test("opens the comment editor for a line number range", async ({ page }) => {
|
||||||
@@ -38,10 +36,15 @@ test("opens the comment editor for a line number range", async ({ page }) => {
|
|||||||
await expectAppVisible(start)
|
await expectAppVisible(start)
|
||||||
await expectAppVisible(end)
|
await expectAppVisible(end)
|
||||||
|
|
||||||
await start.dragTo(end)
|
const from = await start.boundingBox()
|
||||||
|
const to = await end.boundingBox()
|
||||||
|
if (!from || !to) throw new Error("Missing line number bounds")
|
||||||
|
await page.mouse.move(from.x + from.width / 2, from.y + from.height / 2)
|
||||||
|
await page.mouse.down()
|
||||||
|
await page.mouse.move(to.x + to.width / 2, to.y + to.height / 2)
|
||||||
|
await page.mouse.up()
|
||||||
|
|
||||||
await expect(review.getByRole("textbox")).toBeVisible()
|
await expect(review.getByRole("textbox")).toBeVisible()
|
||||||
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on lines 1-3")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("shows a comment button when a line number is hovered", async ({ page }) => {
|
test("shows a comment button when a line number is hovered", async ({ page }) => {
|
||||||
@@ -51,38 +54,31 @@ test("shows a comment button when a line number is hovered", async ({ page }) =>
|
|||||||
|
|
||||||
const comment = review.getByRole("button", { name: "Comment", exact: true })
|
const comment = review.getByRole("button", { name: "Comment", exact: true })
|
||||||
await expect(async () => {
|
await expect(async () => {
|
||||||
|
await page.mouse.move(0, 0)
|
||||||
await lineNumber.hover()
|
await lineNumber.hover()
|
||||||
await expect(lineNumber).toHaveAttribute("data-hovered", "")
|
await expect(comment).toBeVisible({ timeout: 500 })
|
||||||
await expect(comment).toHaveCount(1)
|
await comment.click({ timeout: 500 })
|
||||||
await expect(comment).toHaveCSS("pointer-events", "auto")
|
}).toPass()
|
||||||
await comment.focus()
|
|
||||||
await expect(comment).toBeFocused()
|
|
||||||
}).toPass({ timeout: 10_000 })
|
|
||||||
await comment.press("Enter")
|
|
||||||
await expect(review.getByRole("textbox")).toBeVisible()
|
await expect(review.getByRole("textbox")).toBeVisible()
|
||||||
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 1")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("stages a submitted line comment in the prompt context", async ({ page }) => {
|
test("stages a submitted line comment in the prompt context", async ({ page }) => {
|
||||||
|
const requests: string[] = []
|
||||||
page.on("request", (request) => {
|
page.on("request", (request) => {
|
||||||
expect.soft(request.method(), `unexpected ${request.method()} ${new URL(request.url()).pathname}`).toBe("GET")
|
if (request.method() !== "GET") requests.push(`${request.method()} ${new URL(request.url()).pathname}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
const review = page.locator('[data-component="session-review"]')
|
const review = page.locator('[data-component="session-review"]')
|
||||||
await review.getByText("export const value = 'after'", { exact: true }).click()
|
await review.getByText("export const value = 'after'", { exact: true }).click()
|
||||||
const textbox = review.getByRole("textbox")
|
await review.getByRole("textbox").fill("Use the existing value instead")
|
||||||
await expect(textbox).toBeVisible()
|
await review.locator('[data-slot="line-comment-action"][data-variant="primary"]').click()
|
||||||
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 2")
|
|
||||||
await textbox.fill("Use the existing value instead")
|
|
||||||
const submit = review.locator('[data-slot="line-comment-action"][data-variant="primary"]')
|
|
||||||
await expect(submit).toBeEnabled()
|
|
||||||
await submit.click()
|
|
||||||
|
|
||||||
await expect(review.getByText("Use the existing value instead", { exact: true })).toBeVisible()
|
await expect(review.getByText("Use the existing value instead", { exact: true })).toBeVisible()
|
||||||
await page.getByRole("tab", { name: "Session" }).click()
|
await page.getByRole("tab", { name: "Session" }).click()
|
||||||
const context = page.getByText("Use the existing value instead", { exact: true }).last()
|
const context = page.getByText("Use the existing value instead", { exact: true }).last()
|
||||||
await expect(context).toBeVisible()
|
await expect(context).toBeVisible()
|
||||||
await expect(context.locator("..")).toContainText("review.ts:2")
|
await expect(context.locator("..")).toContainText("review.ts:2")
|
||||||
|
expect(requests).toEqual([])
|
||||||
})
|
})
|
||||||
|
|
||||||
async function openReview(page: Page) {
|
async function openReview(page: Page) {
|
||||||
@@ -148,22 +144,15 @@ async function openReview(page: Page) {
|
|||||||
|
|
||||||
await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
|
await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
|
||||||
await expectSessionTitle(page, title)
|
await expectSessionTitle(page, title)
|
||||||
const changes = page.getByRole("tab", { name: "Changes" })
|
const diffResponse = page.waitForResponse((response) => new URL(response.url()).pathname === "/api/vcs/diff")
|
||||||
const diffResponse = page.waitForResponse(
|
await page.getByRole("tab", { name: "Changes" }).click()
|
||||||
(response) =>
|
|
||||||
response.request().method() === "GET" && response.ok() && new URL(response.url()).pathname === "/api/vcs/diff",
|
|
||||||
)
|
|
||||||
await changes.click()
|
|
||||||
expect((await (await diffResponse).json()).data).toHaveLength(1)
|
expect((await (await diffResponse).json()).data).toHaveLength(1)
|
||||||
await expect(page.getByRole("tab", { selected: true })).toHaveAccessibleName(/Files Changed/)
|
|
||||||
|
|
||||||
const review = page.locator('[data-component="session-review"]')
|
const review = page.locator('[data-component="session-review"]')
|
||||||
await expectAppVisible(review)
|
await expectAppVisible(review)
|
||||||
const file = review.locator('[data-file="src/review.ts"]')
|
await review
|
||||||
await expectAppVisible(file)
|
.getByRole("heading", { name: /review\.ts/ })
|
||||||
const trigger = file.getByRole("button", { expanded: false })
|
.getByRole("button")
|
||||||
await expect(trigger).toHaveCount(1)
|
.first()
|
||||||
await trigger.click()
|
.click()
|
||||||
await expect(file.getByRole("button", { expanded: true })).toBeVisible()
|
|
||||||
await expect(file.getByText("export const value = 'after'", { exact: true })).toBeVisible()
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test"
|
|||||||
import { assistantMessage, setupTimeline, toolPart, userMessage } from "../performance/timeline-stability/fixture"
|
import { assistantMessage, setupTimeline, toolPart, userMessage } from "../performance/timeline-stability/fixture"
|
||||||
|
|
||||||
for (const profile of [
|
for (const profile of [
|
||||||
{ locale: "de", label: "Erkundung abgeschlossen" },
|
{ locale: "de", label: "Erkundet" },
|
||||||
{ locale: "ar", label: "تم الاستكشاف" },
|
{ locale: "ar", label: "تم الاستكشاف" },
|
||||||
] as const) {
|
] as const) {
|
||||||
test(`projects translated context status in ${profile.locale}`, async ({ page }) => {
|
test(`projects translated context status in ${profile.locale}`, async ({ page }) => {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { expect, test, type Page } from "@playwright/test"
|
import { expect, test } from "@playwright/test"
|
||||||
import {
|
import {
|
||||||
assistantMessage,
|
assistantMessage,
|
||||||
partUpdated,
|
partUpdated,
|
||||||
setupTimeline,
|
setupTimeline,
|
||||||
|
status,
|
||||||
textPart,
|
textPart,
|
||||||
userMessage,
|
userMessage,
|
||||||
} from "../performance/timeline-stability/fixture"
|
} from "../performance/timeline-stability/fixture"
|
||||||
@@ -16,7 +17,7 @@ test("keeps one connection open while delivering multiple events", async ({ page
|
|||||||
await timeline.waitForPart("prt_transport_first")
|
await timeline.waitForPart("prt_transport_first")
|
||||||
await timeline.waitForPart("prt_transport_second")
|
await timeline.waitForPart("prt_transport_second")
|
||||||
expect(first.connectionID).toBe(second.connectionID)
|
expect(first.connectionID).toBe(second.connectionID)
|
||||||
await expect.poll(async () => (await timeline.transport.connections()).length).toBe(1)
|
expect(await timeline.transport.connections()).toHaveLength(1)
|
||||||
expect(await timeline.transport.acknowledgements()).toHaveLength(2)
|
expect(await timeline.transport.acknowledgements()).toHaveLength(2)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -50,28 +51,20 @@ test("parses split JSON and a split multibyte code point", async ({ page }) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test("delivers server heartbeat without mutating the timeline", async ({ page }) => {
|
test("delivers server heartbeat without mutating the timeline", async ({ page }) => {
|
||||||
const sentinelID = "prt_transport_heartbeat_sentinel"
|
|
||||||
const timeline = await setupTimeline(page, {
|
const timeline = await setupTimeline(page, {
|
||||||
messages: [userMessage(), assistantMessage([textPart("prt_transport_steady", "steady")])],
|
messages: [userMessage(), assistantMessage([textPart("prt_transport_steady", "steady")])],
|
||||||
})
|
})
|
||||||
await timeline.waitForPart("prt_transport_steady")
|
const before = await page.locator("[data-timeline-row]").allTextContents()
|
||||||
const before = await stableTimelineRows(page)
|
|
||||||
|
|
||||||
await timeline.transport.writeRaw(": heartbeat\n\n")
|
await timeline.transport.heartbeat()
|
||||||
await timeline.transport.send(partUpdated(textPart(sentinelID, "heartbeat processed")))
|
await timeline.settle()
|
||||||
await timeline.waitForPart(sentinelID)
|
|
||||||
|
|
||||||
await expect
|
expect(await page.locator("[data-timeline-row]").allTextContents()).toEqual(before)
|
||||||
.poll(async () => {
|
expect(await timeline.transport.connections()).toHaveLength(1)
|
||||||
const rows = await timelineRows(page)
|
|
||||||
return rows.filter((row) => before.some((item) => item.key === row.key))
|
|
||||||
})
|
|
||||||
.toEqual(before)
|
|
||||||
await expect.poll(async () => (await timeline.transport.connections()).length).toBe(1)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("reconnects after a clean close", async ({ page }) => {
|
test("reconnects after a clean close", async ({ page }) => {
|
||||||
const timeline = await setupTimeline(page)
|
const timeline = await setupTimeline(page, { eventRetry: 10 })
|
||||||
const first = await timeline.transport.waitForConnection()
|
const first = await timeline.transport.waitForConnection()
|
||||||
|
|
||||||
await timeline.transport.close()
|
await timeline.transport.close()
|
||||||
@@ -84,21 +77,20 @@ test("reconnects after a clean close", async ({ page }) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test("reconnects after a stream error", async ({ page }) => {
|
test("reconnects after a stream error", async ({ page }) => {
|
||||||
const timeline = await setupTimeline(page)
|
const timeline = await setupTimeline(page, { eventRetry: 10 })
|
||||||
const first = await timeline.transport.waitForConnection()
|
const first = await timeline.transport.waitForConnection()
|
||||||
|
|
||||||
await timeline.transport.error("contract failure")
|
await timeline.transport.error("contract failure")
|
||||||
const second = await timeline.transport.waitForConnection({ after: first.id })
|
const second = await timeline.transport.waitForConnection({ after: first.id })
|
||||||
await timeline.transport.send(partUpdated(textPart("prt_transport_error", "after error")))
|
await timeline.transport.send(status("busy"))
|
||||||
|
|
||||||
await timeline.waitForPart("prt_transport_error")
|
|
||||||
await expect.poll(async () => (await timeline.transport.connections()).length).toBe(2)
|
await expect.poll(async () => (await timeline.transport.connections()).length).toBe(2)
|
||||||
expect(second.id).toBeGreaterThan(first.id)
|
expect(second.id).toBeGreaterThan(first.id)
|
||||||
expect((await timeline.transport.connections())[0]?.endedBy).toBe("error")
|
expect((await timeline.transport.connections())[0]?.endedBy).toBe("error")
|
||||||
})
|
})
|
||||||
|
|
||||||
test("does not request replay when reconnecting the volatile V2 event stream", async ({ page }) => {
|
test("does not request replay when reconnecting the volatile V2 event stream", async ({ page }) => {
|
||||||
const timeline = await setupTimeline(page, { protocol: "v2" })
|
const timeline = await setupTimeline(page, { eventRetry: 10, protocol: "v2" })
|
||||||
const first = await timeline.transport.send(partUpdated(textPart("prt_transport_id", "event with id")), {
|
const first = await timeline.transport.send(partUpdated(textPart("prt_transport_id", "event with id")), {
|
||||||
id: "timeline-event-7",
|
id: "timeline-event-7",
|
||||||
})
|
})
|
||||||
@@ -120,35 +112,5 @@ test("passes through non-event fetches", async ({ page }) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
expect(health).toEqual({ healthy: true })
|
expect(health).toEqual({ healthy: true })
|
||||||
await expect.poll(async () => (await timeline.transport.connections()).length).toBe(1)
|
expect(await timeline.transport.connections()).toHaveLength(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
async function stableTimelineRows(page: Page) {
|
|
||||||
let previous: Awaited<ReturnType<typeof timelineRows>> | undefined
|
|
||||||
let stable = 0
|
|
||||||
await expect
|
|
||||||
.poll(
|
|
||||||
async () => {
|
|
||||||
const next = await timelineRows(page)
|
|
||||||
stable = JSON.stringify(next) === JSON.stringify(previous) ? stable + 1 : 0
|
|
||||||
previous = next
|
|
||||||
return stable
|
|
||||||
},
|
|
||||||
{ intervals: [50, 50, 100] },
|
|
||||||
)
|
|
||||||
.toBeGreaterThanOrEqual(2)
|
|
||||||
return previous!
|
|
||||||
}
|
|
||||||
|
|
||||||
function timelineRows(page: Page) {
|
|
||||||
return page.locator("[data-timeline-key]").evaluateAll((elements) =>
|
|
||||||
elements.map((element) => ({
|
|
||||||
key: element.getAttribute("data-timeline-key"),
|
|
||||||
row: element.querySelector("[data-timeline-row]")?.getAttribute("data-timeline-row"),
|
|
||||||
parts: Array.from(element.querySelectorAll("[data-timeline-part-id]"), (part) =>
|
|
||||||
part.getAttribute("data-timeline-part-id"),
|
|
||||||
),
|
|
||||||
text: element.textContent,
|
|
||||||
})),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -247,23 +247,18 @@ export async function installSseTransport<T>(
|
|||||||
return {
|
return {
|
||||||
server,
|
server,
|
||||||
async waitForConnection(input = {}) {
|
async waitForConnection(input = {}) {
|
||||||
const connection = await page.waitForFunction(
|
await page.waitForFunction(
|
||||||
(after) => {
|
(after) => {
|
||||||
const transport = (window as BrowserTransport).__testSseTransport
|
const transport = (window as BrowserTransport).__testSseTransport
|
||||||
const connections = transport?.command({ type: "connections" }) as SseConnectionRecord[] | undefined
|
const connections = transport?.command({ type: "connections" }) as SseConnectionRecord[] | undefined
|
||||||
return connections?.findLast((connection) => connection.id > after && connection.endedAt === undefined)
|
return connections?.some((connection) => connection.id > after)
|
||||||
},
|
},
|
||||||
input.after ?? 0,
|
input.after ?? 0,
|
||||||
{ timeout: input.timeout },
|
{ timeout: input.timeout },
|
||||||
)
|
)
|
||||||
let result: SseConnectionRecord | undefined
|
return (await command<SseConnectionRecord[]>({ type: "connections" })).findLast(
|
||||||
try {
|
(connection) => connection.id > (input.after ?? 0),
|
||||||
result = await connection.jsonValue()
|
)!
|
||||||
} finally {
|
|
||||||
await connection.dispose()
|
|
||||||
}
|
|
||||||
if (!result) throw new Error("SSE transport connection disappeared while waiting")
|
|
||||||
return result
|
|
||||||
},
|
},
|
||||||
send(payload, eventOptions) {
|
send(payload, eventOptions) {
|
||||||
return command({ type: "send", deliveries: [{ payload, options: eventOptions }], burst: false })
|
return command({ type: "send", deliveries: [{ payload, options: eventOptions }], burst: false })
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "@opencode-ai/app",
|
"name": "@opencode-ai/app",
|
||||||
"version": "1.18.15",
|
"version": "1.18.12",
|
||||||
"description": "",
|
"description": "",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts",
|
".": "./src/index.ts",
|
||||||
"./desktop-menu": "./src/desktop-menu.ts",
|
"./desktop-menu": "./src/desktop-menu.ts",
|
||||||
"./i18n/desktop-native": "./src/i18n/desktop-native.ts",
|
|
||||||
"./updater": "./src/updater.ts",
|
"./updater": "./src/updater.ts",
|
||||||
"./wsl/types": "./src/wsl/types.ts",
|
"./wsl/types": "./src/wsl/types.ts",
|
||||||
"./vite": "./vite.js",
|
"./vite": "./vite.js",
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import * as Sentry from "@sentry/solid"
|
|||||||
import { I18nProvider } from "@opencode-ai/ui/context"
|
import { I18nProvider } from "@opencode-ai/ui/context"
|
||||||
import { DialogProvider } from "@opencode-ai/ui/context/dialog"
|
import { DialogProvider } from "@opencode-ai/ui/context/dialog"
|
||||||
import { FileComponentProvider } from "@opencode-ai/ui/context/file"
|
import { FileComponentProvider } from "@opencode-ai/ui/context/file"
|
||||||
|
import { MarkedProvider } from "@opencode-ai/ui/context/marked"
|
||||||
import { File } from "@opencode-ai/session-ui/file"
|
import { File } from "@opencode-ai/session-ui/file"
|
||||||
import { Font } from "@opencode-ai/ui/font"
|
import { Font } from "@opencode-ai/ui/font"
|
||||||
import { Splash } from "@opencode-ai/ui/logo"
|
import { Splash } from "@opencode-ai/ui/logo"
|
||||||
@@ -233,13 +234,7 @@ function ResolvedDraftRoute(props: { draft: DraftTab }) {
|
|||||||
|
|
||||||
function UiI18nBridge(props: ParentProps) {
|
function UiI18nBridge(props: ParentProps) {
|
||||||
const language = useLanguage()
|
const language = useLanguage()
|
||||||
return (
|
return <I18nProvider value={{ locale: language.intl, t: language.t }}>{props.children}</I18nProvider>
|
||||||
<I18nProvider
|
|
||||||
value={{ locale: language.intl, layoutLocale: language.layoutLocale, t: language.t, plural: language.plural }}
|
|
||||||
>
|
|
||||||
{props.children}
|
|
||||||
</I18nProvider>
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function LayoutCompatibility(props: ParentProps) {
|
function LayoutCompatibility(props: ParentProps) {
|
||||||
@@ -332,7 +327,7 @@ function DesktopCommands() {
|
|||||||
if (platform.platform === "desktop" && platform.exportDebugLogs) {
|
if (platform.platform === "desktop" && platform.exportDebugLogs) {
|
||||||
commands.push({
|
commands.push({
|
||||||
id: "logs.export",
|
id: "logs.export",
|
||||||
title: language.t("command.logs.export"),
|
title: "Export logs",
|
||||||
category: language.t("command.category.settings"),
|
category: language.t("command.category.settings"),
|
||||||
onSelect: () => {
|
onSelect: () => {
|
||||||
void platform.exportDebugLogs?.()
|
void platform.exportDebugLogs?.()
|
||||||
@@ -390,12 +385,7 @@ function DraftProviders(props: ParentProps) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function AppBaseProviders(
|
export function AppBaseProviders(props: ParentProps<{ locale?: Locale }>) {
|
||||||
props: ParentProps<{
|
|
||||||
locale?: Locale
|
|
||||||
onNativeTranslations?: Parameters<typeof LanguageProvider>[0]["onNativeTranslations"]
|
|
||||||
}>,
|
|
||||||
) {
|
|
||||||
return (
|
return (
|
||||||
<MetaProvider>
|
<MetaProvider>
|
||||||
<Font />
|
<Font />
|
||||||
@@ -404,7 +394,7 @@ export function AppBaseProviders(
|
|||||||
void window.api?.setTitlebar?.({ mode, scheme })
|
void window.api?.setTitlebar?.({ mode, scheme })
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<LanguageProvider locale={props.locale} onNativeTranslations={props.onNativeTranslations}>
|
<LanguageProvider locale={props.locale}>
|
||||||
<UiI18nBridge>
|
<UiI18nBridge>
|
||||||
<ErrorBoundary
|
<ErrorBoundary
|
||||||
fallback={(error) => {
|
fallback={(error) => {
|
||||||
@@ -415,7 +405,9 @@ export function AppBaseProviders(
|
|||||||
<QueryProvider>
|
<QueryProvider>
|
||||||
<WslServersProvider>
|
<WslServersProvider>
|
||||||
<DialogProvider>
|
<DialogProvider>
|
||||||
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
|
<MarkedProvider>
|
||||||
|
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
|
||||||
|
</MarkedProvider>
|
||||||
</DialogProvider>
|
</DialogProvider>
|
||||||
</WslServersProvider>
|
</WslServersProvider>
|
||||||
</QueryProvider>
|
</QueryProvider>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ function Cell(props: {
|
|||||||
label: string
|
label: string
|
||||||
tip: string
|
tip: string
|
||||||
value: string
|
value: string
|
||||||
span?: 2 | 3
|
wide?: boolean
|
||||||
}) {
|
}) {
|
||||||
const content = () => (
|
const content = () => (
|
||||||
<div
|
<div
|
||||||
@@ -69,8 +69,7 @@ function Cell(props: {
|
|||||||
"min-h-[20px] w-fit justify-start px-1.5 py-0.5 text-left": !!props.inline,
|
"min-h-[20px] w-fit justify-start px-1.5 py-0.5 text-left": !!props.inline,
|
||||||
"justify-center text-center": !props.inline,
|
"justify-center text-center": !props.inline,
|
||||||
"min-h-[42px] w-full flex-col rounded-[8px] px-0.5 py-1": !props.inline,
|
"min-h-[42px] w-full flex-col rounded-[8px] px-0.5 py-1": !props.inline,
|
||||||
"col-span-2": props.span === 2 && !props.inline,
|
"col-span-2": !!props.wide && !props.inline,
|
||||||
"col-span-3": props.span === 3 && !props.inline,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -117,18 +116,11 @@ function Cell(props: {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function ToggleCell(props: {
|
function FocusCell(props: { active: boolean; inline?: boolean; onClick: () => void }) {
|
||||||
active: boolean
|
|
||||||
inline?: boolean
|
|
||||||
label: string
|
|
||||||
onClick: () => void
|
|
||||||
tip: string
|
|
||||||
value: string
|
|
||||||
}) {
|
|
||||||
const content = () => (
|
const content = () => (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
aria-label={`${props.label}: ${props.value}`}
|
aria-label="Force focus styles on all interactive elements"
|
||||||
aria-pressed={props.active}
|
aria-pressed={props.active}
|
||||||
classList={{
|
classList={{
|
||||||
"flex min-w-0 items-center font-mono uppercase hover:bg-surface-raised-base focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-border-focus": true,
|
"flex min-w-0 items-center font-mono uppercase hover:bg-surface-raised-base focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-border-focus": true,
|
||||||
@@ -145,22 +137,26 @@ function ToggleCell(props: {
|
|||||||
"flex-col items-center": !props.inline,
|
"flex-col items-center": !props.inline,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span class="text-[10px] leading-none font-black tracking-[0.04em] opacity-70">{props.label}</span>
|
<span class="text-[10px] leading-none font-black tracking-[0.04em] opacity-70">FOCUS</span>
|
||||||
<span class="text-[11px] leading-none font-bold">{props.value}</span>
|
<span
|
||||||
|
classList={{ "leading-none font-bold": true, "text-[11px]": !!props.inline, "text-[13px]": !props.inline }}
|
||||||
|
>
|
||||||
|
{props.active ? "ON" : "OFF"}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
)
|
)
|
||||||
|
|
||||||
if (props.inline) {
|
if (props.inline) {
|
||||||
return (
|
return (
|
||||||
<TooltipV2 value={props.tip} placement="top">
|
<TooltipV2 value="Force focus styles on all interactive elements" placement="top">
|
||||||
{content()}
|
{content()}
|
||||||
</TooltipV2>
|
</TooltipV2>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tooltip value={props.tip} placement="top">
|
<Tooltip value="Force focus styles on all interactive elements" placement="top">
|
||||||
{content()}
|
{content()}
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)
|
)
|
||||||
@@ -479,7 +475,7 @@ export function DebugBar(props: { inline?: boolean } = {}) {
|
|||||||
"gap-[9px]": !!props.inline,
|
"gap-[9px]": !!props.inline,
|
||||||
"gap-px": !props.inline,
|
"gap-px": !props.inline,
|
||||||
"flex w-full flex-nowrap items-center justify-start": !!props.inline,
|
"flex w-full flex-nowrap items-center justify-start": !!props.inline,
|
||||||
"grid-cols-4": !props.inline,
|
"grid-cols-5": !props.inline,
|
||||||
grid: !props.inline,
|
grid: !props.inline,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -561,25 +557,10 @@ export function DebugBar(props: { inline?: boolean } = {}) {
|
|||||||
bad={bad(heap(), 0.8)}
|
bad={bad(heap(), 0.8)}
|
||||||
dim={state.heap.used === undefined}
|
dim={state.heap.used === undefined}
|
||||||
inline={props.inline}
|
inline={props.inline}
|
||||||
span={platform.setForceFocus ? 2 : 3}
|
wide={!platform.setForceFocus}
|
||||||
/>
|
|
||||||
<ToggleCell
|
|
||||||
active={language.direction() === "rtl"}
|
|
||||||
inline={props.inline}
|
|
||||||
label={language.t("debugBar.direction.label")}
|
|
||||||
tip={language.t("debugBar.direction.tip")}
|
|
||||||
value={language.t(`debugBar.direction.${language.direction()}`)}
|
|
||||||
onClick={() => language.setDirection(language.direction() === "rtl" ? "ltr" : "rtl")}
|
|
||||||
/>
|
/>
|
||||||
{platform.setForceFocus && (
|
{platform.setForceFocus && (
|
||||||
<ToggleCell
|
<FocusCell active={state.focus} inline={props.inline} onClick={() => void toggleFocus()} />
|
||||||
active={state.focus}
|
|
||||||
inline={props.inline}
|
|
||||||
label={language.t("debugBar.focus.label")}
|
|
||||||
tip={language.t("debugBar.focus.tip")}
|
|
||||||
value={language.t(state.focus ? "debugBar.focus.on" : "debugBar.focus.off")}
|
|
||||||
onClick={() => void toggleFocus()}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
@@ -509,12 +509,7 @@ function ProviderConnection(props: {
|
|||||||
const hint = suffix?.[1]
|
const hint = suffix?.[1]
|
||||||
return {
|
return {
|
||||||
label: suffix ? label.slice(0, -suffix[0].length) : label,
|
label: suffix ? label.slice(0, -suffix[0].length) : label,
|
||||||
hint:
|
hint: hint ? hint[0].toUpperCase() + hint.slice(1) : value?.type === "key" ? "Browser" : undefined,
|
||||||
hint?.toLowerCase() === "headless"
|
|
||||||
? language.t("provider.connect.method.headless")
|
|
||||||
: hint?.toLowerCase() === "browser" || (!hint && value?.type === "key")
|
|
||||||
? language.t("provider.connect.method.browser")
|
|
||||||
: undefined,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ export function CustomProviderForm(props: { autofocus?: boolean } = {}) {
|
|||||||
|
|
||||||
const saveMutation = useMutation(() => ({
|
const saveMutation = useMutation(() => ({
|
||||||
mutationFn: async (result: NonNullable<ReturnType<typeof validate>>) => {
|
mutationFn: async (result: NonNullable<ReturnType<typeof validate>>) => {
|
||||||
if ((await serverSDK().protocol) !== "v1") throw new Error(language.t("provider.custom.unavailable"))
|
if ((await serverSDK().protocol) !== "v1") throw new Error("Custom providers are unavailable on this server")
|
||||||
const disabledProviders = serverSync().data.config.disabled_providers ?? []
|
const disabledProviders = serverSync().data.config.disabled_providers ?? []
|
||||||
const nextDisabled = disabledProviders.filter((id) => id !== result.providerID)
|
const nextDisabled = disabledProviders.filter((id) => id !== result.providerID)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { usePlatform } from "@/context/platform"
|
import { usePlatform } from "@/context/platform"
|
||||||
import { useLanguage } from "@/context/language"
|
|
||||||
import { Button } from "@opencode-ai/ui/button"
|
import { Button } from "@opencode-ai/ui/button"
|
||||||
import { useDialog } from "@opencode-ai/ui/context/dialog"
|
import { useDialog } from "@opencode-ai/ui/context/dialog"
|
||||||
import { Dialog } from "@opencode-ai/ui/dialog"
|
import { Dialog } from "@opencode-ai/ui/dialog"
|
||||||
@@ -15,7 +14,6 @@ export type DialogGoUpsellProps = {
|
|||||||
|
|
||||||
export function DialogUsageExceeded(props: DialogGoUpsellProps) {
|
export function DialogUsageExceeded(props: DialogGoUpsellProps) {
|
||||||
const dialog = useDialog()
|
const dialog = useDialog()
|
||||||
const language = useLanguage()
|
|
||||||
const platform = usePlatform()
|
const platform = usePlatform()
|
||||||
|
|
||||||
const runAction = () => {
|
const runAction = () => {
|
||||||
@@ -34,7 +32,7 @@ export function DialogUsageExceeded(props: DialogGoUpsellProps) {
|
|||||||
<div class="flex flex-col gap-4 pl-6 pr-2.5 pb-3">
|
<div class="flex flex-col gap-4 pl-6 pr-2.5 pb-3">
|
||||||
<div class="flex justify-end gap-2">
|
<div class="flex justify-end gap-2">
|
||||||
<Button variant="ghost" size="large" onClick={dismiss}>
|
<Button variant="ghost" size="large" onClick={dismiss}>
|
||||||
{language.t("dialog.usageExceeded.dontShowAgain")}
|
Don't show again
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="primary" size="large" onClick={runAction}>
|
<Button variant="primary" size="large" onClick={runAction}>
|
||||||
{props.actionLabel}
|
{props.actionLabel}
|
||||||
|
|||||||
@@ -139,7 +139,6 @@ test("resolves directory autocomplete from the current browser root", async () =
|
|||||||
directories.push(input.location?.directory ?? "")
|
directories.push(input.location?.directory ?? "")
|
||||||
return Promise.resolve({ data: [] })
|
return Promise.resolve({ data: [] })
|
||||||
},
|
},
|
||||||
list: () => Promise.resolve({ data: [] }),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as unknown as Parameters<typeof createDirectorySearch>[0]["sdk"]
|
} as unknown as Parameters<typeof createDirectorySearch>[0]["sdk"]
|
||||||
@@ -153,67 +152,6 @@ test("resolves directory autocomplete from the current browser root", async () =
|
|||||||
expect(directories).toEqual(["/repo", "/repo/src"])
|
expect(directories).toEqual(["/repo", "/repo/src"])
|
||||||
})
|
})
|
||||||
|
|
||||||
test("keeps indexed directory results for servers that support empty search", async () => {
|
|
||||||
const sdk = {
|
|
||||||
api: {
|
|
||||||
file: {
|
|
||||||
find: () => Promise.resolve({ data: [{ path: "projects/", type: "directory" }] }),
|
|
||||||
list: () => Promise.reject(new Error("listing should not run when search returns results")),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} as unknown as Parameters<typeof createDirectorySearch>[0]["sdk"]
|
|
||||||
const search = createDirectorySearch({ sdk, home: () => "/home/luke", base: () => "/home/luke" })
|
|
||||||
|
|
||||||
expect(await search("")).toEqual(["/home/luke/projects"])
|
|
||||||
})
|
|
||||||
|
|
||||||
test("lists the default directory when empty search is unsupported", async () => {
|
|
||||||
const calls: string[] = []
|
|
||||||
const directories = Array.from({ length: 60 }, (_, index) => ({
|
|
||||||
path: `project-${index}/`,
|
|
||||||
type: "directory" as const,
|
|
||||||
}))
|
|
||||||
const sdk = {
|
|
||||||
api: {
|
|
||||||
file: {
|
|
||||||
find: () => Promise.resolve({ data: [] }),
|
|
||||||
list: (input: { location?: { directory?: string } }) => {
|
|
||||||
calls.push(input.location?.directory ?? "")
|
|
||||||
return Promise.resolve({
|
|
||||||
data: [...directories, { path: "README.md", type: "file" }],
|
|
||||||
})
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} as unknown as Parameters<typeof createDirectorySearch>[0]["sdk"]
|
|
||||||
const search = createDirectorySearch({ sdk, home: () => "/home/luke", base: () => "/home/luke" })
|
|
||||||
|
|
||||||
const results = await search("")
|
|
||||||
expect(results).toHaveLength(60)
|
|
||||||
expect(results.at(-1)).toBe("/home/luke/project-59")
|
|
||||||
expect(calls).toEqual(["/home/luke"])
|
|
||||||
})
|
|
||||||
|
|
||||||
test("matches the default directory listing when typed search is unsupported", async () => {
|
|
||||||
const sdk = {
|
|
||||||
api: {
|
|
||||||
file: {
|
|
||||||
find: () => Promise.resolve({ data: [] }),
|
|
||||||
list: () =>
|
|
||||||
Promise.resolve({
|
|
||||||
data: [
|
|
||||||
{ path: "Documents/", type: "directory" },
|
|
||||||
{ path: "Downloads/", type: "directory" },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} as unknown as Parameters<typeof createDirectorySearch>[0]["sdk"]
|
|
||||||
const search = createDirectorySearch({ sdk, home: () => "/home/luke", base: () => "/home/luke" })
|
|
||||||
|
|
||||||
expect(await search("documents")).toEqual(["/home/luke/Documents"])
|
|
||||||
})
|
|
||||||
|
|
||||||
test("searches from an absolute root without a default base", async () => {
|
test("searches from an absolute root without a default base", async () => {
|
||||||
const directories: string[] = []
|
const directories: string[] = []
|
||||||
const sdk = {
|
const sdk = {
|
||||||
|
|||||||
@@ -379,14 +379,7 @@ export function createDirectorySearch(args: { sdk: ServerSDK; base: () => string
|
|||||||
.then((result) => result.data.map((entry) => entry.path))
|
.then((result) => result.data.map((entry) => entry.path))
|
||||||
.catch(() => [])
|
.catch(() => [])
|
||||||
if (!active()) return []
|
if (!active()) return []
|
||||||
if (results.length) {
|
return results.map((path) => joinPickerPath(input.directory, path)).slice(0, 50)
|
||||||
return results.map((path) => joinPickerPath(input.directory, path)).slice(0, 50)
|
|
||||||
}
|
|
||||||
const fallback = query
|
|
||||||
? await match(input.directory, query, 50)
|
|
||||||
: (await directories(input.directory)).map((item) => item.absolute)
|
|
||||||
if (!active()) return []
|
|
||||||
return fallback
|
|
||||||
}
|
}
|
||||||
const segments = query.replace(/^\/+/, "").split("/")
|
const segments = query.replace(/^\/+/, "").split("/")
|
||||||
const head = segments.slice(0, -1).filter((part) => part && part !== ".")
|
const head = segments.slice(0, -1).filter((part) => part && part !== ".")
|
||||||
|
|||||||
@@ -29,14 +29,14 @@ export type { Kind } from "@/components/file-tree"
|
|||||||
|
|
||||||
const INDENT_STEP = 16
|
const INDENT_STEP = 16
|
||||||
|
|
||||||
function rowPaddingStart(level: number, type: FileNode["type"]) {
|
function rowPaddingLeft(level: number, type: FileNode["type"]) {
|
||||||
if (type === "directory") return 8 + level * INDENT_STEP
|
if (type === "directory") return 8 + level * INDENT_STEP
|
||||||
if (level === 0) return 8
|
if (level === 0) return 8
|
||||||
return 8 + level * INDENT_STEP - INDENT_STEP
|
return 8 + level * INDENT_STEP - INDENT_STEP
|
||||||
}
|
}
|
||||||
|
|
||||||
function guideLineStart(level: number) {
|
function guideLineLeft(level: number) {
|
||||||
return rowPaddingStart(level, "directory") + 8
|
return rowPaddingLeft(level, "directory") + 8
|
||||||
}
|
}
|
||||||
|
|
||||||
export const kindLabel = (kind: Kind) => {
|
export const kindLabel = (kind: Kind) => {
|
||||||
@@ -87,7 +87,7 @@ const FileTreeNodeV2 = (
|
|||||||
...local.classList,
|
...local.classList,
|
||||||
[local.class ?? ""]: !!local.class,
|
[local.class ?? ""]: !!local.class,
|
||||||
}}
|
}}
|
||||||
style={`padding-inline-start: ${rowPaddingStart(local.level, local.node.type)}px`}
|
style={`padding-left: ${rowPaddingLeft(local.level, local.node.type)}px`}
|
||||||
draggable={local.draggable}
|
draggable={local.draggable}
|
||||||
onDragStart={(event: DragEvent) => {
|
onDragStart={(event: DragEvent) => {
|
||||||
if (!local.draggable) return
|
if (!local.draggable) return
|
||||||
@@ -99,9 +99,7 @@ const FileTreeNodeV2 = (
|
|||||||
{...rest}
|
{...rest}
|
||||||
>
|
>
|
||||||
{local.children}
|
{local.children}
|
||||||
<span class="flex-1 min-w-0 text-start text-12-medium whitespace-nowrap truncate">
|
<span class="flex-1 min-w-0 text-12-medium whitespace-nowrap truncate">{local.node.name}</span>
|
||||||
<bdi dir="auto">{local.node.name}</bdi>
|
|
||||||
</span>
|
|
||||||
{(() => {
|
{(() => {
|
||||||
const value = kind()
|
const value = kind()
|
||||||
if (!value || local.node.type !== "file") return null
|
if (!value || local.node.type !== "file") return null
|
||||||
@@ -118,7 +116,7 @@ const FileTreeNodeV2 = (
|
|||||||
function GuideLines(props: { level: number }) {
|
function GuideLines(props: { level: number }) {
|
||||||
return (
|
return (
|
||||||
<For each={Array.from({ length: props.level })}>
|
<For each={Array.from({ length: props.level })}>
|
||||||
{(_, index) => <div data-slot="file-tree-v2-guide" style={`inset-inline-start: ${guideLineStart(index())}px`} />}
|
{(_, index) => <div data-slot="file-tree-v2-guide" style={`left: ${guideLineLeft(index())}px`} />}
|
||||||
</For>
|
</For>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -229,7 +227,7 @@ export default function FileTreeV2(props: {
|
|||||||
style={{
|
style={{
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
top: "0",
|
top: "0",
|
||||||
"inset-inline-start": "0",
|
left: "0",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
height: `${item().size}px`,
|
height: `${item().size}px`,
|
||||||
transform: `translateY(${item().start}px)`,
|
transform: `translateY(${item().start}px)`,
|
||||||
|
|||||||
@@ -146,13 +146,13 @@ const FileTreeNode = (
|
|||||||
<Dynamic
|
<Dynamic
|
||||||
component={local.as ?? "div"}
|
component={local.as ?? "div"}
|
||||||
classList={{
|
classList={{
|
||||||
"w-full min-w-0 h-6 flex items-center justify-start gap-x-1.5 rounded-md px-1.5 py-0 text-start hover:bg-surface-raised-base-hover active:bg-surface-base-active transition-colors cursor-pointer": true,
|
"w-full min-w-0 h-6 flex items-center justify-start gap-x-1.5 rounded-md px-1.5 py-0 text-left hover:bg-surface-raised-base-hover active:bg-surface-base-active transition-colors cursor-pointer": true,
|
||||||
"bg-surface-base-active": local.node.path === local.active,
|
"bg-surface-base-active": local.node.path === local.active,
|
||||||
...local.classList,
|
...local.classList,
|
||||||
[local.class ?? ""]: !!local.class,
|
[local.class ?? ""]: !!local.class,
|
||||||
[local.nodeClass ?? ""]: !!local.nodeClass,
|
[local.nodeClass ?? ""]: !!local.nodeClass,
|
||||||
}}
|
}}
|
||||||
style={`padding-inline-start: ${Math.max(0, 8 + local.level * 12 - (local.node.type === "file" ? 24 : 4))}px`}
|
style={`padding-left: ${Math.max(0, 8 + local.level * 12 - (local.node.type === "file" ? 24 : 4))}px`}
|
||||||
draggable={local.draggable}
|
draggable={local.draggable}
|
||||||
onDragStart={(event: DragEvent) => {
|
onDragStart={(event: DragEvent) => {
|
||||||
if (!local.draggable) return
|
if (!local.draggable) return
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
||||||
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
||||||
import { isRTL } from "@kobalte/core/i18n"
|
|
||||||
import { createSignal, Show } from "solid-js"
|
import { createSignal, Show } from "solid-js"
|
||||||
import { Drawer, DrawerClose, DrawerContent } from "@/components/ui/drawer"
|
import { Drawer, DrawerClose, DrawerContent } from "@/components/ui/drawer"
|
||||||
import { usePlatform } from "@/context/platform"
|
import { usePlatform } from "@/context/platform"
|
||||||
import { useSettings } from "@/context/settings"
|
import { useSettings } from "@/context/settings"
|
||||||
import { useLanguage } from "@/context/language"
|
|
||||||
import introducingTabsVideo from "@/assets/help/introducing-tabs.mp4"
|
import introducingTabsVideo from "@/assets/help/introducing-tabs.mp4"
|
||||||
import homeImage from "@/assets/help/home.png"
|
import homeImage from "@/assets/help/home.png"
|
||||||
import tabsImage from "@/assets/help/tabs.png"
|
import tabsImage from "@/assets/help/tabs.png"
|
||||||
@@ -17,22 +15,20 @@ const showPopover = () => true
|
|||||||
export function TabsInfoPopup() {
|
export function TabsInfoPopup() {
|
||||||
const settings = useSettings()
|
const settings = useSettings()
|
||||||
const platform = usePlatform()
|
const platform = usePlatform()
|
||||||
const language = useLanguage()
|
|
||||||
const [drawerOpen, setDrawerOpen] = createSignal(false)
|
const [drawerOpen, setDrawerOpen] = createSignal(false)
|
||||||
const windows = () => platform.platform === "desktop" && platform.os === "windows"
|
const windows = () => platform.platform === "desktop" && platform.os === "windows"
|
||||||
const rtl = () => isRTL(language.intl())
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Drawer open={drawerOpen()} onOpenChange={setDrawerOpen} side={rtl() ? "left" : "right"}>
|
<Drawer open={drawerOpen()} onOpenChange={setDrawerOpen} side="right">
|
||||||
<Show when={settings.general.shouldDisplayTabsToast()}>
|
<Show when={settings.general.shouldDisplayTabsToast()}>
|
||||||
<div
|
<div
|
||||||
class="fixed bottom-5 end-5 z-50 h-[240px] w-[192px] rounded-[8px] bg-v2-background-bg-base p-1 shadow-[var(--v2-elevation-floating)]"
|
class="fixed bottom-5 right-5 z-50 h-[240px] w-[192px] rounded-[8px] bg-v2-background-bg-base p-1 shadow-[var(--v2-elevation-floating)]"
|
||||||
aria-label={language.t("help.tabs.toast.ariaLabel")}
|
aria-label="Introducing Tabs. Organize your work and active sessions with tabs"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
aria-label={language.t("help.tabs.toast.dismiss")}
|
aria-label="Dismiss Tabs information"
|
||||||
class="absolute top-3 end-3 z-10 size-5 flex items-center justify-center rounded-[4px] bg-[rgba(0,0,0,0.4)]"
|
class="absolute top-3 right-3 z-10 size-5 flex items-center justify-center rounded-[4px] bg-[rgba(0,0,0,0.4)]"
|
||||||
onClick={settings.general.dismissTabsToast}
|
onClick={settings.general.dismissTabsToast}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
@@ -48,7 +44,7 @@ export function TabsInfoPopup() {
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative block h-[232px] w-[184px] cursor-pointer overflow-hidden rounded-[4px] text-start"
|
class="relative block h-[232px] w-[184px] cursor-pointer overflow-hidden rounded-[4px] text-left"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
settings.general.dismissTabsToast()
|
settings.general.dismissTabsToast()
|
||||||
setDrawerOpen(true)
|
setDrawerOpen(true)
|
||||||
@@ -66,10 +62,10 @@ export function TabsInfoPopup() {
|
|||||||
/>
|
/>
|
||||||
<div class="absolute inset-x-0 bottom-0 flex w-full flex-col items-start gap-1.5 bg-[linear-gradient(180deg,rgba(0,0,0,0)_0%,#000000_100%)] px-3 py-5">
|
<div class="absolute inset-x-0 bottom-0 flex w-full flex-col items-start gap-1.5 bg-[linear-gradient(180deg,rgba(0,0,0,0)_0%,#000000_100%)] px-3 py-5">
|
||||||
<p class="w-full select-none text-[13px] font-[530] leading-none tracking-[-0.04px] text-[#FFFFFF]">
|
<p class="w-full select-none text-[13px] font-[530] leading-none tracking-[-0.04px] text-[#FFFFFF]">
|
||||||
{language.t("help.tabs.title")}
|
Introducing Tabs
|
||||||
</p>
|
</p>
|
||||||
<p class="w-full select-none text-[13px] font-[440] leading-[140%] tracking-[-0.04px] text-[#808080]">
|
<p class="w-full select-none text-[13px] font-[440] leading-[140%] tracking-[-0.04px] text-[#808080]">
|
||||||
{language.t("help.tabs.description")}
|
Organize your work and active sessions with tabs
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
@@ -79,10 +75,7 @@ export function TabsInfoPopup() {
|
|||||||
style={
|
style={
|
||||||
windows()
|
windows()
|
||||||
? {
|
? {
|
||||||
top: "0",
|
inset: "0 0 0 auto",
|
||||||
bottom: "0",
|
|
||||||
"inset-inline-end": "0",
|
|
||||||
"inset-inline-start": "auto",
|
|
||||||
"max-height": "100vh",
|
"max-height": "100vh",
|
||||||
"max-width": "100vw",
|
"max-width": "100vw",
|
||||||
"border-radius": "0",
|
"border-radius": "0",
|
||||||
@@ -96,9 +89,9 @@ export function TabsInfoPopup() {
|
|||||||
type="button"
|
type="button"
|
||||||
size="small"
|
size="small"
|
||||||
variant="neutral"
|
variant="neutral"
|
||||||
aria-label={language.t("common.close")}
|
aria-label="Close"
|
||||||
icon={<IconV2 name="xmark-small" />}
|
icon={<IconV2 name="xmark-small" />}
|
||||||
class="absolute top-[10px] start-[-36px]"
|
class="absolute top-[10px] left-[-36px]"
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
<div
|
<div
|
||||||
@@ -109,7 +102,7 @@ export function TabsInfoPopup() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<p class="min-h-0 min-w-0 flex-1 text-[13px] font-[530] leading-5 tracking-[-0.04px] tabular-nums text-v2-text-text-muted">
|
<p class="min-h-0 min-w-0 flex-1 text-[13px] font-[530] leading-5 tracking-[-0.04px] tabular-nums text-v2-text-text-muted">
|
||||||
{language.t("help.tabs.date")}
|
July 14
|
||||||
</p>
|
</p>
|
||||||
<Show when={!windows()}>
|
<Show when={!windows()}>
|
||||||
<DrawerClose
|
<DrawerClose
|
||||||
@@ -117,24 +110,36 @@ export function TabsInfoPopup() {
|
|||||||
type="button"
|
type="button"
|
||||||
size="small"
|
size="small"
|
||||||
variant="ghost-muted"
|
variant="ghost-muted"
|
||||||
aria-label={language.t("common.close")}
|
aria-label="Close"
|
||||||
icon={<IconV2 name="xmark-small" />}
|
icon={<IconV2 name="xmark-small" />}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
<div class="relative flex min-h-0 w-full flex-1 flex-col items-start gap-6 overflow-y-auto p-8">
|
<div class="relative flex min-h-0 w-full flex-1 flex-col items-start gap-6 overflow-y-auto p-8">
|
||||||
<p class="w-full shrink-0 self-stretch text-[21px] font-[610] leading-6 tracking-[-0.37px] tabular-nums text-v2-text-text-base">
|
<p class="w-full shrink-0 self-stretch text-[21px] font-[610] leading-6 tracking-[-0.37px] tabular-nums text-v2-text-text-base">
|
||||||
{language.t("help.tabs.title")}
|
Introducing Tabs
|
||||||
</p>
|
</p>
|
||||||
<div class="flex w-full flex-1 flex-col gap-4 text-[13px] font-[440] leading-5 tracking-[-0.04px] text-v2-text-text-base">
|
<div class="flex w-full flex-1 flex-col gap-4 text-[13px] font-[440] leading-5 tracking-[-0.04px] text-v2-text-text-base">
|
||||||
<p>{language.t("help.tabs.introduction")}</p>
|
<p>OpenCode Desktop is now built around tabs.</p>
|
||||||
<img src={tabsImage} alt="" class="aspect-video w-full rounded-[6px] object-cover" />
|
<img src={tabsImage} alt="" class="aspect-video w-full rounded-[6px] object-cover" />
|
||||||
<p>{language.t("help.tabs.sessions")}</p>
|
<p>
|
||||||
<p>{language.t("help.tabs.organize")}</p>
|
Start a new session in a tab, or open an existing session from any of your projects. Open a new tab when
|
||||||
<p>{language.t("help.tabs.home")}</p>
|
you're starting something new, and close it when you're done.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Keeping a few tabs open makes it easier to organize your active sessions. Rename tabs to something
|
||||||
|
memorable if you plan to keep them around.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You'll find all your sessions and projects on the new Home screen. Selecting a session opens it in a tab.
|
||||||
|
</p>
|
||||||
<img src={homeImage} alt="" class="aspect-video w-full rounded-[6px] object-cover" />
|
<img src={homeImage} alt="" class="aspect-video w-full rounded-[6px] object-cover" />
|
||||||
<p>{language.t("help.tabs.persistence")}</p>
|
<p>When you reopen the app, your tabs are still open.</p>
|
||||||
<p>{language.t("help.tabs.worktrees")}</p>
|
<p>
|
||||||
|
The new design does not support Git Worktrees yet, it's coming soon. So if you'd prefer to continue using
|
||||||
|
the previous layout, you can switch between layouts in Settings. Just keep in mind that the new layout
|
||||||
|
will become permanent in a few weeks.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</DrawerContent>
|
</DrawerContent>
|
||||||
|
|||||||
@@ -137,10 +137,7 @@ export function usePromptInputV2Controller(props: PromptInputV2ControllerProps):
|
|||||||
t: (key, params) => language.t(key as Parameters<typeof language.t>[0], params as never),
|
t: (key, params) => language.t(key as Parameters<typeof language.t>[0], params as never),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
const designPlaceholder = () =>
|
const designPlaceholder = () => promptDesignPlaceholder(mode(), placeholder())
|
||||||
promptDesignPlaceholder(mode(), placeholder(), (key, params) =>
|
|
||||||
language.t(key as Parameters<typeof language.t>[0], params as never),
|
|
||||||
)
|
|
||||||
|
|
||||||
const historyComments = () => {
|
const historyComments = () => {
|
||||||
const byID = new Map(comments.all().map((item) => [`${item.file}\n${item.id}`, item] as const))
|
const byID = new Map(comments.all().map((item) => [`${item.file}\n${item.id}`, item] as const))
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ import { PromptPopover, type AtOption, type SlashCommand } from "./prompt-input/
|
|||||||
import { PromptContextItems } from "./prompt-input/context-items"
|
import { PromptContextItems } from "./prompt-input/context-items"
|
||||||
import { PromptImageAttachments } from "./prompt-input/image-attachments"
|
import { PromptImageAttachments } from "./prompt-input/image-attachments"
|
||||||
import { PromptDragOverlay } from "./prompt-input/drag-overlay"
|
import { PromptDragOverlay } from "./prompt-input/drag-overlay"
|
||||||
import { promptPlaceholder } from "./prompt-input/placeholder"
|
import { promptDesignPlaceholder, promptPlaceholder } from "./prompt-input/placeholder"
|
||||||
import { createPromptInputTransientState } from "./prompt-input/transient-state"
|
import { createPromptInputTransientState } from "./prompt-input/transient-state"
|
||||||
import { showToast } from "@/utils/toast"
|
import { showToast } from "@/utils/toast"
|
||||||
import { ImagePreview } from "@opencode-ai/ui/image-preview"
|
import { ImagePreview } from "@opencode-ai/ui/image-preview"
|
||||||
@@ -1493,7 +1493,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|||||||
}
|
}
|
||||||
onRemove={removeAttachment}
|
onRemove={removeAttachment}
|
||||||
removeLabel={language.t("prompt.attachment.remove")}
|
removeLabel={language.t("prompt.attachment.remove")}
|
||||||
fileLabel={language.t("ui.common.file")}
|
|
||||||
newLayoutDesigns={false}
|
newLayoutDesigns={false}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ type PromptImageAttachmentsProps = {
|
|||||||
onOpen: (attachment: ImageAttachmentPart) => void
|
onOpen: (attachment: ImageAttachmentPart) => void
|
||||||
onRemove: (id: string) => void
|
onRemove: (id: string) => void
|
||||||
removeLabel: string
|
removeLabel: string
|
||||||
fileLabel: string
|
|
||||||
newLayoutDesigns: boolean
|
newLayoutDesigns: boolean
|
||||||
comments?: PromptCommentItem[]
|
comments?: PromptCommentItem[]
|
||||||
commentActive?: (item: PromptCommentItem) => boolean
|
commentActive?: (item: PromptCommentItem) => boolean
|
||||||
@@ -95,7 +94,7 @@ export const PromptImageAttachments: Component<PromptImageAttachmentsProps> = (p
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<AttachmentCardV2 title={attachment.filename}>
|
<AttachmentCardV2 title={attachment.filename}>
|
||||||
{typeLabel(attachment.filename, attachment.mime, props.fileLabel)}
|
{typeLabel(attachment.filename, attachment.mime)}
|
||||||
</AttachmentCardV2>
|
</AttachmentCardV2>
|
||||||
</Show>
|
</Show>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, expect, test } from "bun:test"
|
import { describe, expect, test } from "bun:test"
|
||||||
import { promptDesignPlaceholder, promptPlaceholder } from "./placeholder"
|
import { promptPlaceholder } from "./placeholder"
|
||||||
|
|
||||||
describe("promptPlaceholder", () => {
|
describe("promptPlaceholder", () => {
|
||||||
const t = (key: string, params?: Record<string, string>) => `${key}${params?.example ? `:${params.example}` : ""}`
|
const t = (key: string, params?: Record<string, string>) => `${key}${params?.example ? `:${params.example}` : ""}`
|
||||||
@@ -46,18 +46,3 @@ describe("promptPlaceholder", () => {
|
|||||||
expect(value).toBe("prompt.placeholder.simple")
|
expect(value).toBe("prompt.placeholder.simple")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("promptDesignPlaceholder", () => {
|
|
||||||
const t = (key: string, params?: Record<string, string>) => {
|
|
||||||
if (key !== "ui.promptInput.placeholder.normal") return key
|
|
||||||
return `Ask anything, ${params?.slash} for commands, ${params?.at} for context...`
|
|
||||||
}
|
|
||||||
|
|
||||||
test("composes the design placeholder from localized fragments", () => {
|
|
||||||
expect(promptDesignPlaceholder("normal", "fallback", t)).toBe("Ask anything, / for commands, @ for context...")
|
|
||||||
})
|
|
||||||
|
|
||||||
test("preserves the shell placeholder", () => {
|
|
||||||
expect(promptDesignPlaceholder("shell", "Enter shell command...", t)).toBe("Enter shell command...")
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|||||||
@@ -14,11 +14,7 @@ export function promptPlaceholder(input: PromptPlaceholderInput) {
|
|||||||
return input.t("prompt.placeholder.normal", { example: input.example })
|
return input.t("prompt.placeholder.normal", { example: input.example })
|
||||||
}
|
}
|
||||||
|
|
||||||
export function promptDesignPlaceholder(
|
export function promptDesignPlaceholder(mode: PromptPlaceholderInput["mode"], placeholder: string) {
|
||||||
mode: PromptPlaceholderInput["mode"],
|
|
||||||
placeholder: string,
|
|
||||||
t: PromptPlaceholderInput["t"],
|
|
||||||
) {
|
|
||||||
if (mode === "shell") return placeholder
|
if (mode === "shell") return placeholder
|
||||||
return t("ui.promptInput.placeholder.normal", { slash: "/", at: "@" })
|
return "Ask anything, / for commands, @ for context..."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,15 +5,12 @@ import { checksum } from "@opencode-ai/core/util/encode"
|
|||||||
import { findLast } from "@opencode-ai/core/util/array"
|
import { findLast } from "@opencode-ai/core/util/array"
|
||||||
import { same } from "@/utils/same"
|
import { same } from "@/utils/same"
|
||||||
import { Icon } from "@opencode-ai/ui/icon"
|
import { Icon } from "@opencode-ai/ui/icon"
|
||||||
import { Button } from "@opencode-ai/ui/button"
|
|
||||||
import { Accordion } from "@opencode-ai/ui/accordion"
|
import { Accordion } from "@opencode-ai/ui/accordion"
|
||||||
import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header"
|
import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header"
|
||||||
import { File } from "@opencode-ai/session-ui/file"
|
import { File } from "@opencode-ai/session-ui/file"
|
||||||
import { Markdown } from "@opencode-ai/session-ui/markdown"
|
import { Markdown } from "@opencode-ai/session-ui/markdown"
|
||||||
import { ScrollView } from "@opencode-ai/ui/scroll-view"
|
import { ScrollView } from "@opencode-ai/ui/scroll-view"
|
||||||
import type { Message, Part, UserMessage } from "@opencode-ai/sdk/v2/client"
|
import type { Message, Part, UserMessage } from "@opencode-ai/sdk/v2/client"
|
||||||
import { showToast } from "@/utils/toast"
|
|
||||||
import { downloadSessionExport, fetchSessionExport, sessionExportFilename } from "@/utils/session-export"
|
|
||||||
import { useLanguage } from "@/context/language"
|
import { useLanguage } from "@/context/language"
|
||||||
import { useProviders } from "@/hooks/use-providers"
|
import { useProviders } from "@/hooks/use-providers"
|
||||||
import { useSDK } from "@/context/sdk"
|
import { useSDK } from "@/context/sdk"
|
||||||
@@ -123,8 +120,7 @@ export function SessionContextTab() {
|
|||||||
() => {
|
() => {
|
||||||
const revert = info()?.revert?.messageID
|
const revert = info()?.revert?.messageID
|
||||||
if (!revert) return userMessages()
|
if (!revert) return userMessages()
|
||||||
const boundary = userMessages().findIndex((message) => message.id === revert)
|
return userMessages().filter((m) => m.id < revert)
|
||||||
return boundary < 0 ? userMessages() : userMessages().slice(0, boundary)
|
|
||||||
},
|
},
|
||||||
emptyUserMessages,
|
emptyUserMessages,
|
||||||
{ equals: same },
|
{ equals: same },
|
||||||
@@ -224,31 +220,6 @@ export function SessionContextTab() {
|
|||||||
{ label: "context.stats.lastActivity", value: () => formatter().time(ctx()?.message.time.created) },
|
{ label: "context.stats.lastActivity", value: () => formatter().time(ctx()?.message.time.created) },
|
||||||
] satisfies { label: string; value: () => JSX.Element }[]
|
] satisfies { label: string; value: () => JSX.Element }[]
|
||||||
|
|
||||||
const exportSession = async () => {
|
|
||||||
const sessionID = params.id
|
|
||||||
if (!sessionID) return
|
|
||||||
try {
|
|
||||||
const data = await fetchSessionExport({
|
|
||||||
sessionID,
|
|
||||||
client: sdk().client,
|
|
||||||
})
|
|
||||||
const filename = sessionExportFilename(data.info)
|
|
||||||
downloadSessionExport(filename, data)
|
|
||||||
showToast({
|
|
||||||
variant: "success",
|
|
||||||
icon: "circle-check",
|
|
||||||
title: language.t("toast.session.export.success.title"),
|
|
||||||
description: language.t("toast.session.export.success.description", { filename }),
|
|
||||||
})
|
|
||||||
} catch (err) {
|
|
||||||
showToast({
|
|
||||||
variant: "error",
|
|
||||||
title: language.t("toast.session.export.failed.title"),
|
|
||||||
description: err instanceof Error ? err.message : language.t("toast.session.export.failed.description"),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let scroll: HTMLDivElement | undefined
|
let scroll: HTMLDivElement | undefined
|
||||||
let frame: number | undefined
|
let frame: number | undefined
|
||||||
let pending: { x: number; y: number } | undefined
|
let pending: { x: number; y: number } | undefined
|
||||||
@@ -357,18 +328,7 @@ export function SessionContextTab() {
|
|||||||
</Show>
|
</Show>
|
||||||
|
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex items-center justify-between">
|
<div class="text-12-regular text-text-weak">{language.t("context.rawMessages.title")}</div>
|
||||||
<div class="text-12-regular text-text-weak">{language.t("context.rawMessages.title")}</div>
|
|
||||||
<Button
|
|
||||||
size="small"
|
|
||||||
variant="ghost"
|
|
||||||
class="gap-1.5 px-2 text-text-weak hover:text-text-base"
|
|
||||||
onClick={exportSession}
|
|
||||||
>
|
|
||||||
<Icon name="download" size="small" />
|
|
||||||
<span>{language.t("context.export.session")}</span>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
<Accordion multiple>
|
<Accordion multiple>
|
||||||
<For each={messages()}>
|
<For each={messages()}>
|
||||||
{(message) => (
|
{(message) => (
|
||||||
|
|||||||
@@ -287,7 +287,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.settings-v2-provider-env-hint {
|
.settings-v2-provider-env-hint {
|
||||||
padding-inline-end: 12px;
|
padding-right: 12px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 440;
|
font-weight: 440;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
@@ -311,7 +311,7 @@
|
|||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: var(--v2-text-text-accent);
|
color: var(--v2-text-text-accent);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-align: start;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-v2-providers-view-all:hover {
|
.settings-v2-providers-view-all:hover {
|
||||||
@@ -361,13 +361,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.settings-v2-tab-search [data-slot="text-input-v2-input"] {
|
.settings-v2-tab-search [data-slot="text-input-v2-input"] {
|
||||||
padding-inline-end: 28px;
|
padding-right: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-v2-tab-search-clear {
|
.settings-v2-tab-search-clear {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
inset-inline-end: 6px;
|
right: 6px;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -573,8 +573,9 @@ export const Terminal = (props: TerminalProps) => {
|
|||||||
if (!result) return
|
if (!result) return
|
||||||
if (result.response.status === 200 && result.data?.ticket) return result.data.ticket
|
if (result.response.status === 200 && result.data?.ticket) return result.data.ticket
|
||||||
if (result.response.status === 404 || result.response.status === 405) return
|
if (result.response.status === 404 || result.response.status === 405) return
|
||||||
if (result.response.status === 403) throw new Error(language.t("terminal.connectTicket.csrfError"))
|
if (result.response.status === 403)
|
||||||
throw new Error(language.t("terminal.connectTicket.statusError", { status: result.response.status }))
|
throw new Error("PTY connect ticket rejected by origin or CSRF checks. Check the server CORS config.")
|
||||||
|
throw new Error(`PTY connect ticket failed with ${result.response.status}`)
|
||||||
}
|
}
|
||||||
// return sdk()
|
// return sdk()
|
||||||
// .api.pty.connectToken({
|
// .api.pty.connectToken({
|
||||||
@@ -741,7 +742,6 @@ export const Terminal = (props: TerminalProps) => {
|
|||||||
<div
|
<div
|
||||||
ref={container}
|
ref={container}
|
||||||
data-component="terminal"
|
data-component="terminal"
|
||||||
dir="ltr"
|
|
||||||
data-prevent-autofocus
|
data-prevent-autofocus
|
||||||
tabIndex={-1}
|
tabIndex={-1}
|
||||||
style={{ "background-color": terminalColors().background }}
|
style={{ "background-color": terminalColors().background }}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[data-titlebar-tab] [data-slot="tab-close"] {
|
[data-titlebar-tab] [data-slot="tab-close"] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 4px;
|
top: 4px;
|
||||||
inset-inline-end: 4px;
|
right: 4px;
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 20px;
|
width: 20px;
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 8px;
|
top: 8px;
|
||||||
inset-inline-start: -3.75px;
|
left: -3.75px;
|
||||||
width: 1.5px;
|
width: 1.5px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
border-radius: 9999px;
|
border-radius: 9999px;
|
||||||
@@ -86,23 +86,6 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-titlebar-tab][data-title-overflow="true"]:not([data-editing="true"]):dir(rtl) [data-slot="tab-link"] {
|
|
||||||
-webkit-mask-image: linear-gradient(
|
|
||||||
to left,
|
|
||||||
black 0,
|
|
||||||
black calc(100% - var(--tab-title-fade-offset) - 16px),
|
|
||||||
transparent calc(100% - var(--tab-title-fade-offset)),
|
|
||||||
transparent 100%
|
|
||||||
);
|
|
||||||
mask-image: linear-gradient(
|
|
||||||
to left,
|
|
||||||
black 0,
|
|
||||||
black calc(100% - var(--tab-title-fade-offset) - 16px),
|
|
||||||
transparent calc(100% - var(--tab-title-fade-offset)),
|
|
||||||
transparent 100%
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-titlebar-tab][data-title-overflow="true"]:is(:hover, [data-active="true"]):not([data-editing="true"])
|
[data-titlebar-tab][data-title-overflow="true"]:is(:hover, [data-active="true"]):not([data-editing="true"])
|
||||||
[data-slot="tab-link"] {
|
[data-slot="tab-link"] {
|
||||||
--tab-title-fade-offset: 24px;
|
--tab-title-fade-offset: 24px;
|
||||||
@@ -110,7 +93,7 @@
|
|||||||
|
|
||||||
[data-titlebar-tab][data-title-overflow="true"]:not(:hover):not([data-active="true"]):not([data-editing="true"])
|
[data-titlebar-tab][data-title-overflow="true"]:not(:hover):not([data-active="true"]):not([data-editing="true"])
|
||||||
[data-slot="tab-link"] {
|
[data-slot="tab-link"] {
|
||||||
padding-inline-end: 0;
|
padding-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-titlebar-tab] [data-slot="tab-title"] {
|
[data-titlebar-tab] [data-slot="tab-title"] {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { createMutation } from "@tanstack/solid-query"
|
|||||||
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
||||||
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
||||||
import { useGlobal } from "@/context/global"
|
import { useGlobal } from "@/context/global"
|
||||||
import { useLanguage } from "@/context/language"
|
|
||||||
import { ServerConnection, serverName } from "@/context/server"
|
import { ServerConnection, serverName } from "@/context/server"
|
||||||
import { displayName, projectForSession } from "@/pages/layout/helpers"
|
import { displayName, projectForSession } from "@/pages/layout/helpers"
|
||||||
import { SessionTabAvatar } from "@/pages/layout/session-tab-avatar"
|
import { SessionTabAvatar } from "@/pages/layout/session-tab-avatar"
|
||||||
@@ -324,7 +323,6 @@ export function DraftTabItem(props: {
|
|||||||
pressed?: boolean
|
pressed?: boolean
|
||||||
hidden?: boolean
|
hidden?: boolean
|
||||||
}) {
|
}) {
|
||||||
const language = useLanguage()
|
|
||||||
const closeTab = (event: MouseEvent) => {
|
const closeTab = (event: MouseEvent) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
@@ -399,7 +397,7 @@ export function DraftTabItem(props: {
|
|||||||
class="hover-reveal relative z-10 group-hover:opacity-100 group-data-[active=true]:opacity-100 group-data-[editing=true]:opacity-100"
|
class="hover-reveal relative z-10 group-hover:opacity-100 group-data-[active=true]:opacity-100 group-data-[editing=true]:opacity-100"
|
||||||
onClick={closeTab}
|
onClick={closeTab}
|
||||||
icon={<IconV2 name="xmark-small" />}
|
icon={<IconV2 name="xmark-small" />}
|
||||||
aria-label={language.t("common.closeTab")}
|
aria-label="Close tab"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,15 +1,4 @@
|
|||||||
import {
|
import { createEffect, createMemo, createResource, createSignal, Match, onMount, Show, Switch, untrack } from "solid-js"
|
||||||
createEffect,
|
|
||||||
createMemo,
|
|
||||||
createResource,
|
|
||||||
createSignal,
|
|
||||||
Match,
|
|
||||||
on,
|
|
||||||
onMount,
|
|
||||||
Show,
|
|
||||||
Switch,
|
|
||||||
untrack,
|
|
||||||
} from "solid-js"
|
|
||||||
import { createStore } from "solid-js/store"
|
import { createStore } from "solid-js/store"
|
||||||
import { useLocation, useNavigate, useParams } from "@solidjs/router"
|
import { useLocation, useNavigate, useParams } from "@solidjs/router"
|
||||||
import { IconButton } from "@opencode-ai/ui/icon-button"
|
import { IconButton } from "@opencode-ai/ui/icon-button"
|
||||||
@@ -53,11 +42,8 @@ export type TitlebarUpdate = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function useTitlebarRightMount() {
|
export function useTitlebarRightMount() {
|
||||||
const language = useLanguage()
|
|
||||||
const [mount, setMount] = createSignal<HTMLElement | null>(null)
|
const [mount, setMount] = createSignal<HTMLElement | null>(null)
|
||||||
const sync = () => setMount(document.getElementById("opencode-titlebar-right"))
|
onMount(() => setMount(document.getElementById("opencode-titlebar-right")))
|
||||||
onMount(sync)
|
|
||||||
createEffect(on(language.direction, sync, { defer: true }))
|
|
||||||
return mount
|
return mount
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,9 +113,9 @@ export function Titlebar(props: { update?: TitlebarUpdate; debugTools?: { visibl
|
|||||||
return {
|
return {
|
||||||
visible: version !== undefined || installing,
|
visible: version !== undefined || installing,
|
||||||
installing,
|
installing,
|
||||||
label: language.t("titlebar.update"),
|
label: "Update",
|
||||||
ariaLabel: language.t("toast.update.action.installRestart"),
|
ariaLabel: language.t("toast.update.action.installRestart"),
|
||||||
title: version ? language.t("titlebar.updateVersion", { version }) : undefined,
|
title: version ? `Update ${version}` : undefined,
|
||||||
onInstall: () => props.update?.install(),
|
onInstall: () => props.update?.install(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -183,8 +169,7 @@ export function Titlebar(props: { update?: TitlebarUpdate; debugTools?: { visibl
|
|||||||
"padding-left": macTrafficLights() ? `${macTrafficLightsBaseWidth / zoom()}px` : 0,
|
"padding-left": macTrafficLights() ? `${macTrafficLightsBaseWidth / zoom()}px` : 0,
|
||||||
width: windows() ? `env(titlebar-area-width, calc(100vw - ${windowsControlsWidth()}))` : undefined,
|
width: windows() ? `env(titlebar-area-width, calc(100vw - ${windowsControlsWidth()}))` : undefined,
|
||||||
"max-width": windows() ? `env(titlebar-area-width, calc(100vw - ${windowsControlsWidth()}))` : undefined,
|
"max-width": windows() ? `env(titlebar-area-width, calc(100vw - ${windowsControlsWidth()}))` : undefined,
|
||||||
// Native Windows caption controls remain on the physical right in both writing directions.
|
"align-self": windows() ? "flex-start" : undefined,
|
||||||
"margin-right": windows() ? "auto" : undefined,
|
|
||||||
}}
|
}}
|
||||||
data-tauri-drag-region
|
data-tauri-drag-region
|
||||||
>
|
>
|
||||||
@@ -530,7 +515,7 @@ export function Titlebar(props: { update?: TitlebarUpdate; debugTools?: { visibl
|
|||||||
<div
|
<div
|
||||||
class="flex items-center shrink-0"
|
class="flex items-center shrink-0"
|
||||||
classList={{
|
classList={{
|
||||||
"ltr:-translate-x-[36px] rtl:translate-x-[36px]": layout.sidebar.opened() && !!params.dir,
|
"-translate-x-[36px]": layout.sidebar.opened() && !!params.dir,
|
||||||
"duration-180 ease-out": !layout.sidebar.opened(),
|
"duration-180 ease-out": !layout.sidebar.opened(),
|
||||||
"duration-180 ease-in": layout.sidebar.opened(),
|
"duration-180 ease-in": layout.sidebar.opened(),
|
||||||
}}
|
}}
|
||||||
@@ -628,7 +613,7 @@ function TitlebarUpdateIconButton(props: { state: TitlebarUpdatePillState }) {
|
|||||||
aria-label={props.state.ariaLabel}
|
aria-label={props.state.ariaLabel}
|
||||||
>
|
>
|
||||||
<span class="shrink-0 ml-[8px] mr-px text-[11px] text-v2-text-text-accent [font-weight:530] opacity-0 translate-x-2 motion-safe:transition-all duration-150 ease-out group-hover:opacity-100 group-hover:translate-x-0 group-focus-within:opacity-100 group-focus-within:translate-x-0 motion-reduce:translate-x-0">
|
<span class="shrink-0 ml-[8px] mr-px text-[11px] text-v2-text-text-accent [font-weight:530] opacity-0 translate-x-2 motion-safe:transition-all duration-150 ease-out group-hover:opacity-100 group-hover:translate-x-0 group-focus-within:opacity-100 group-focus-within:translate-x-0 motion-reduce:translate-x-0">
|
||||||
{props.state.label}
|
Update
|
||||||
</span>
|
</span>
|
||||||
<span class="flex size-5 shrink-0 items-center justify-center">
|
<span class="flex size-5 shrink-0 items-center justify-center">
|
||||||
<Show
|
<Show
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ const DrawerContent = <T extends ValidComponent = "div">(props: DynamicProps<T,
|
|||||||
<DrawerPrimitive.Content
|
<DrawerPrimitive.Content
|
||||||
class={props.class}
|
class={props.class}
|
||||||
classList={{
|
classList={{
|
||||||
"group/drawer-content fixed inset-y-[6px] end-[6px] start-auto z-[100] flex h-auto max-h-[calc(100vh-12px)] w-[560px] max-w-[calc(100vw-12px)] flex-col items-start rounded-[8px] bg-v2-background-bg-base p-0 shadow-[var(--v2-elevation-overlay)] data-[transitioning]:transition-transform data-[transitioning]:duration-300 md:select-none": true,
|
"group/drawer-content fixed inset-y-[6px] right-[6px] left-auto z-[100] flex h-auto max-h-[calc(100vh-12px)] w-[560px] max-w-[calc(100vw-12px)] flex-col items-start rounded-[8px] bg-v2-background-bg-base p-0 shadow-[var(--v2-elevation-overlay)] data-[transitioning]:transition-transform data-[transitioning]:duration-300 md:select-none": true,
|
||||||
}}
|
}}
|
||||||
{...rest}
|
{...rest}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
|||||||
import { useCommand } from "@/context/command"
|
import { useCommand } from "@/context/command"
|
||||||
import { DESKTOP_MENU, desktopMenuVisible, type DesktopMenuAction, type DesktopMenuEntry } from "@/desktop-menu"
|
import { DESKTOP_MENU, desktopMenuVisible, type DesktopMenuAction, type DesktopMenuEntry } from "@/desktop-menu"
|
||||||
import { usePlatform } from "@/context/platform"
|
import { usePlatform } from "@/context/platform"
|
||||||
import { useLanguage } from "@/context/language"
|
|
||||||
|
|
||||||
export function WindowsAppMenu(props: {
|
export function WindowsAppMenu(props: {
|
||||||
command: ReturnType<typeof useCommand>
|
command: ReturnType<typeof useCommand>
|
||||||
@@ -16,7 +15,6 @@ export function WindowsAppMenu(props: {
|
|||||||
variant?: "legacy" | "v2"
|
variant?: "legacy" | "v2"
|
||||||
}) {
|
}) {
|
||||||
let lastFocused: HTMLElement | undefined
|
let lastFocused: HTMLElement | undefined
|
||||||
const language = useLanguage()
|
|
||||||
|
|
||||||
const rememberFocus = () => {
|
const rememberFocus = () => {
|
||||||
const active = document.activeElement
|
const active = document.activeElement
|
||||||
@@ -60,7 +58,7 @@ export function WindowsAppMenu(props: {
|
|||||||
variant="ghost-muted"
|
variant="ghost-muted"
|
||||||
size="large"
|
size="large"
|
||||||
icon={<IconV2 name="menu" />}
|
icon={<IconV2 name="menu" />}
|
||||||
aria-label={language.t("desktop.menu.ariaLabel")}
|
aria-label="OpenCode menu"
|
||||||
onPointerDown={rememberFocus}
|
onPointerDown={rememberFocus}
|
||||||
onKeyDown={rememberFocus}
|
onKeyDown={rememberFocus}
|
||||||
/>
|
/>
|
||||||
@@ -71,7 +69,7 @@ export function WindowsAppMenu(props: {
|
|||||||
icon="menu"
|
icon="menu"
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
class="titlebar-icon rounded-md shrink-0"
|
class="titlebar-icon rounded-md shrink-0"
|
||||||
aria-label={language.t("desktop.menu.ariaLabel")}
|
aria-label="OpenCode menu"
|
||||||
onPointerDown={rememberFocus}
|
onPointerDown={rememberFocus}
|
||||||
onKeyDown={rememberFocus}
|
onKeyDown={rememberFocus}
|
||||||
/>
|
/>
|
||||||
@@ -81,7 +79,7 @@ export function WindowsAppMenu(props: {
|
|||||||
<DropdownMenu.Group>
|
<DropdownMenu.Group>
|
||||||
<DropdownMenu.GroupLabel class="desktop-app-menu-heading">OpenCode</DropdownMenu.GroupLabel>
|
<DropdownMenu.GroupLabel class="desktop-app-menu-heading">OpenCode</DropdownMenu.GroupLabel>
|
||||||
{DESKTOP_MENU.filter((menu) => desktopMenuVisible(menu, "windows")).map((menu) => (
|
{DESKTOP_MENU.filter((menu) => desktopMenuVisible(menu, "windows")).map((menu) => (
|
||||||
<DesktopMenuSubmenu label={language.t(menu.labelKey)}>
|
<DesktopMenuSubmenu label={menu.label}>
|
||||||
{menu.items
|
{menu.items
|
||||||
?.filter((entry) => desktopMenuVisible(entry, "windows"))
|
?.filter((entry) => desktopMenuVisible(entry, "windows"))
|
||||||
.map((entry) =>
|
.map((entry) =>
|
||||||
@@ -89,7 +87,7 @@ export function WindowsAppMenu(props: {
|
|||||||
<DropdownMenu.Separator />
|
<DropdownMenu.Separator />
|
||||||
) : (
|
) : (
|
||||||
<DesktopMenuItem
|
<DesktopMenuItem
|
||||||
label={entry.labelKey ? language.t(entry.labelKey) : ""}
|
label={entry.label ?? ""}
|
||||||
keybind={entry.command ? props.command.keybind(entry.command) : entry.accelerator?.windows}
|
keybind={entry.command ? props.command.keybind(entry.command) : entry.accelerator?.windows}
|
||||||
disabled={entry.command ? commandDisabled(entry.command) : false}
|
disabled={entry.command ? commandDisabled(entry.command) : false}
|
||||||
onSelect={() => runEntry(entry)}
|
onSelect={() => runEntry(entry)}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ export const ACCEPTED_FILE_EXTENSIONS = Array.from(
|
|||||||
),
|
),
|
||||||
).sort()
|
).sort()
|
||||||
|
|
||||||
export function filePickerFilters(name: string, ext?: string[]) {
|
export function filePickerFilters(ext?: string[]) {
|
||||||
if (!ext || ext.length === 0) return undefined
|
if (!ext || ext.length === 0) return undefined
|
||||||
return [{ name, extensions: ext }]
|
return [{ name: "Files", extensions: ext }]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ const rootSession = (input: { id: string; parentID?: string; archived?: number }
|
|||||||
},
|
},
|
||||||
}) as Session
|
}) as Session
|
||||||
|
|
||||||
const userMessage = (id: string, sessionID: string, created = 1) =>
|
const userMessage = (id: string, sessionID: string) =>
|
||||||
({
|
({
|
||||||
id,
|
id,
|
||||||
sessionID,
|
sessionID,
|
||||||
role: "user",
|
role: "user",
|
||||||
time: { created },
|
time: { created: 1 },
|
||||||
agent: "assistant",
|
agent: "assistant",
|
||||||
model: { providerID: "openai", modelID: "gpt" },
|
model: { providerID: "openai", modelID: "gpt" },
|
||||||
}) as Message
|
}) as Message
|
||||||
@@ -370,13 +370,13 @@ describe("applyDirectoryEvent", () => {
|
|||||||
const sessionID = "ses_1"
|
const sessionID = "ses_1"
|
||||||
const [store, setStore] = createStore(
|
const [store, setStore] = createStore(
|
||||||
baseState({
|
baseState({
|
||||||
message: { [sessionID]: [userMessage("msg_z", sessionID, 1), userMessage("msg_b", sessionID, 3)] },
|
message: { [sessionID]: [userMessage("msg_1", sessionID), userMessage("msg_3", sessionID)] },
|
||||||
part: { msg_a: [textPart("prt_1", sessionID, "msg_a")] },
|
part: { msg_2: [textPart("prt_1", sessionID, "msg_2")] },
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
applyDirectoryEvent({
|
applyDirectoryEvent({
|
||||||
event: { type: "message.updated", properties: { info: userMessage("msg_a", sessionID, 2) } },
|
event: { type: "message.updated", properties: { info: userMessage("msg_2", sessionID) } },
|
||||||
store,
|
store,
|
||||||
setStore,
|
setStore,
|
||||||
push() {},
|
push() {},
|
||||||
@@ -384,14 +384,14 @@ describe("applyDirectoryEvent", () => {
|
|||||||
loadLsp() {},
|
loadLsp() {},
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(store.message[sessionID]?.map((x) => x.id)).toEqual(["msg_z", "msg_a", "msg_b"])
|
expect(store.message[sessionID]?.map((x) => x.id)).toEqual(["msg_1", "msg_2", "msg_3"])
|
||||||
|
|
||||||
applyDirectoryEvent({
|
applyDirectoryEvent({
|
||||||
event: {
|
event: {
|
||||||
type: "message.updated",
|
type: "message.updated",
|
||||||
properties: {
|
properties: {
|
||||||
info: {
|
info: {
|
||||||
...userMessage("msg_a", sessionID, 2),
|
...userMessage("msg_2", sessionID),
|
||||||
role: "assistant",
|
role: "assistant",
|
||||||
} as Message,
|
} as Message,
|
||||||
},
|
},
|
||||||
@@ -403,10 +403,10 @@ describe("applyDirectoryEvent", () => {
|
|||||||
loadLsp() {},
|
loadLsp() {},
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(store.message[sessionID]?.find((x) => x.id === "msg_a")?.role).toBe("assistant")
|
expect(store.message[sessionID]?.find((x) => x.id === "msg_2")?.role).toBe("assistant")
|
||||||
|
|
||||||
applyDirectoryEvent({
|
applyDirectoryEvent({
|
||||||
event: { type: "message.removed", properties: { sessionID, messageID: "msg_a" } },
|
event: { type: "message.removed", properties: { sessionID, messageID: "msg_2" } },
|
||||||
store,
|
store,
|
||||||
setStore,
|
setStore,
|
||||||
push() {},
|
push() {},
|
||||||
@@ -414,8 +414,8 @@ describe("applyDirectoryEvent", () => {
|
|||||||
loadLsp() {},
|
loadLsp() {},
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(store.message[sessionID]?.map((x) => x.id)).toEqual(["msg_z", "msg_b"])
|
expect(store.message[sessionID]?.map((x) => x.id)).toEqual(["msg_1", "msg_3"])
|
||||||
expect(store.part.msg_a).toBeUndefined()
|
expect(store.part.msg_2).toBeUndefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
test("upserts and prunes message parts", () => {
|
test("upserts and prunes message parts", () => {
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import type { State, VcsCache } from "./types"
|
|||||||
import { trimSessions } from "./session-trim"
|
import { trimSessions } from "./session-trim"
|
||||||
import { dropSessionCaches } from "./session-cache"
|
import { dropSessionCaches } from "./session-cache"
|
||||||
import { diffs as list, message as clean } from "@/utils/diffs"
|
import { diffs as list, message as clean } from "@/utils/diffs"
|
||||||
import { messageKey } from "@/utils/session-message"
|
|
||||||
|
|
||||||
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
||||||
const SESSION_CONTENT_EVENTS = new Set([
|
const SESSION_CONTENT_EVENTS = new Set([
|
||||||
@@ -276,7 +275,7 @@ export function applyDirectoryEvent(input: {
|
|||||||
input.setStore("message", info.sessionID, [info])
|
input.setStore("message", info.sessionID, [info])
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
const result = Binary.search(messages, messageKey(info), messageKey)
|
const result = Binary.search(messages, info.id, (m) => m.id)
|
||||||
if (result.found) {
|
if (result.found) {
|
||||||
input.setStore("message", info.sessionID, result.index, reconcile(info))
|
input.setStore("message", info.sessionID, result.index, reconcile(info))
|
||||||
break
|
break
|
||||||
@@ -296,8 +295,8 @@ export function applyDirectoryEvent(input: {
|
|||||||
produce((draft) => {
|
produce((draft) => {
|
||||||
const messages = draft.message[props.sessionID]
|
const messages = draft.message[props.sessionID]
|
||||||
if (messages) {
|
if (messages) {
|
||||||
const index = messages.findIndex((message) => message.id === props.messageID)
|
const result = Binary.search(messages, props.messageID, (m) => m.id)
|
||||||
if (index >= 0) messages.splice(index, 1)
|
if (result.found) messages.splice(result.index, 1)
|
||||||
}
|
}
|
||||||
const parts = draft.part[props.messageID]
|
const parts = draft.part[props.messageID]
|
||||||
if (parts) {
|
if (parts) {
|
||||||
@@ -323,7 +322,7 @@ export function applyDirectoryEvent(input: {
|
|||||||
input.setStore("part", part.messageID, [part])
|
input.setStore("part", part.messageID, [part])
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
const result = Binary.search(parts, part.id, (item) => item.id)
|
const result = Binary.search(parts, part.id, (p) => p.id)
|
||||||
if (result.found) {
|
if (result.found) {
|
||||||
input.setStore("part", part.messageID, result.index, reconcile(part))
|
input.setStore("part", part.messageID, result.index, reconcile(part))
|
||||||
break
|
break
|
||||||
@@ -346,13 +345,13 @@ export function applyDirectoryEvent(input: {
|
|||||||
)
|
)
|
||||||
const parts = input.store.part[props.messageID]
|
const parts = input.store.part[props.messageID]
|
||||||
if (!parts) break
|
if (!parts) break
|
||||||
const result = Binary.search(parts, props.partID, (part) => part.id)
|
const result = Binary.search(parts, props.partID, (p) => p.id)
|
||||||
if (result.found) {
|
if (result.found) {
|
||||||
input.setStore(
|
input.setStore(
|
||||||
produce((draft) => {
|
produce((draft) => {
|
||||||
const list = draft.part[props.messageID]
|
const list = draft.part[props.messageID]
|
||||||
if (!list) return
|
if (!list) return
|
||||||
const next = Binary.search(list, props.partID, (part) => part.id)
|
const next = Binary.search(list, props.partID, (p) => p.id)
|
||||||
if (!next.found) return
|
if (!next.found) return
|
||||||
list.splice(next.index, 1)
|
list.splice(next.index, 1)
|
||||||
if (list.length === 0) delete draft.part[props.messageID]
|
if (list.length === 0) delete draft.part[props.messageID]
|
||||||
@@ -365,7 +364,7 @@ export function applyDirectoryEvent(input: {
|
|||||||
const props = event.properties as { messageID: string; partID: string; field: string; delta: string }
|
const props = event.properties as { messageID: string; partID: string; field: string; delta: string }
|
||||||
const parts = input.store.part[props.messageID]
|
const parts = input.store.part[props.messageID]
|
||||||
if (!parts) break
|
if (!parts) break
|
||||||
const result = Binary.search(parts, props.partID, (part) => part.id)
|
const result = Binary.search(parts, props.partID, (p) => p.id)
|
||||||
if (!result.found) break
|
if (!result.found) break
|
||||||
const field = props.field as keyof (typeof parts)[number]
|
const field = props.field as keyof (typeof parts)[number]
|
||||||
const current = parts[result.index]?.[field]
|
const current = parts[result.index]?.[field]
|
||||||
|
|||||||
@@ -2,46 +2,100 @@ import * as i18n from "@solid-primitives/i18n"
|
|||||||
import { createEffect, createMemo, createResource } from "solid-js"
|
import { createEffect, createMemo, createResource } from "solid-js"
|
||||||
import { createStore } from "solid-js/store"
|
import { createStore } from "solid-js/store"
|
||||||
import { createSimpleContext } from "@opencode-ai/ui/context"
|
import { createSimpleContext } from "@opencode-ai/ui/context"
|
||||||
import { pluralCategory, type UiI18nPluralKey } from "@opencode-ai/ui/context/i18n"
|
|
||||||
import { Persist, persisted } from "@/utils/persist"
|
import { Persist, persisted } from "@/utils/persist"
|
||||||
import { dict as en } from "@/i18n/en"
|
import { dict as en } from "@/i18n/en"
|
||||||
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
|
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
|
||||||
import {
|
|
||||||
createDesktopNativeBundle,
|
|
||||||
detectDesktopNativeLocale,
|
|
||||||
DESKTOP_NATIVE_ENGLISH,
|
|
||||||
DESKTOP_NATIVE_LABELS,
|
|
||||||
DESKTOP_NATIVE_LOCALES,
|
|
||||||
DESKTOP_NATIVE_LOCALE_TAGS,
|
|
||||||
type DesktopNativeBundle,
|
|
||||||
type DesktopNativeLocale,
|
|
||||||
} from "@/i18n/desktop-native"
|
|
||||||
|
|
||||||
export type Locale = DesktopNativeLocale
|
export type Locale =
|
||||||
export type Direction = "ltr" | "rtl"
|
| "en"
|
||||||
|
| "zh"
|
||||||
const RTL_LOCALES: ReadonlySet<Locale> = new Set(["ar", "ur", "pa", "fa", "dv"])
|
| "zht"
|
||||||
|
| "ko"
|
||||||
function localeDirection(locale: Locale): Direction {
|
| "de"
|
||||||
return RTL_LOCALES.has(locale) ? "rtl" : "ltr"
|
| "es"
|
||||||
}
|
| "fr"
|
||||||
|
| "da"
|
||||||
|
| "ja"
|
||||||
|
| "pl"
|
||||||
|
| "ru"
|
||||||
|
| "uk"
|
||||||
|
| "ar"
|
||||||
|
| "no"
|
||||||
|
| "br"
|
||||||
|
| "th"
|
||||||
|
| "bs"
|
||||||
|
| "tr"
|
||||||
|
|
||||||
type RawDictionary = typeof en & typeof uiEn
|
type RawDictionary = typeof en & typeof uiEn
|
||||||
type Dictionary = i18n.Flatten<RawDictionary>
|
type Dictionary = i18n.Flatten<RawDictionary>
|
||||||
type PluralKey =
|
|
||||||
| UiI18nPluralKey
|
|
||||||
| "session.question.pending"
|
|
||||||
| "session.followupDock.summary"
|
|
||||||
| "session.revertDock.summary"
|
|
||||||
type Source = { dict: Record<string, string> }
|
type Source = { dict: Record<string, string> }
|
||||||
|
|
||||||
function cookie(locale: Locale) {
|
function cookie(locale: Locale) {
|
||||||
return `oc_locale=${encodeURIComponent(locale)}; Path=/; Max-Age=31536000; SameSite=Lax`
|
return `oc_locale=${encodeURIComponent(locale)}; Path=/; Max-Age=31536000; SameSite=Lax`
|
||||||
}
|
}
|
||||||
|
|
||||||
const LOCALES: readonly Locale[] = DESKTOP_NATIVE_LOCALES
|
const LOCALES: readonly Locale[] = [
|
||||||
|
"en",
|
||||||
|
"zh",
|
||||||
|
"zht",
|
||||||
|
"ko",
|
||||||
|
"de",
|
||||||
|
"es",
|
||||||
|
"fr",
|
||||||
|
"da",
|
||||||
|
"ja",
|
||||||
|
"pl",
|
||||||
|
"ru",
|
||||||
|
"uk",
|
||||||
|
"bs",
|
||||||
|
"ar",
|
||||||
|
"no",
|
||||||
|
"br",
|
||||||
|
"th",
|
||||||
|
"tr",
|
||||||
|
]
|
||||||
|
|
||||||
const INTL = DESKTOP_NATIVE_LOCALE_TAGS
|
const INTL: Record<Locale, string> = {
|
||||||
|
en: "en",
|
||||||
|
zh: "zh-Hans",
|
||||||
|
zht: "zh-Hant",
|
||||||
|
ko: "ko",
|
||||||
|
de: "de",
|
||||||
|
es: "es",
|
||||||
|
fr: "fr",
|
||||||
|
da: "da",
|
||||||
|
ja: "ja",
|
||||||
|
pl: "pl",
|
||||||
|
ru: "ru",
|
||||||
|
uk: "uk",
|
||||||
|
ar: "ar",
|
||||||
|
no: "nb-NO",
|
||||||
|
br: "pt-BR",
|
||||||
|
th: "th",
|
||||||
|
bs: "bs",
|
||||||
|
tr: "tr",
|
||||||
|
}
|
||||||
|
|
||||||
|
const LABEL_KEY: Record<Locale, keyof Dictionary> = {
|
||||||
|
en: "language.en",
|
||||||
|
zh: "language.zh",
|
||||||
|
zht: "language.zht",
|
||||||
|
ko: "language.ko",
|
||||||
|
de: "language.de",
|
||||||
|
es: "language.es",
|
||||||
|
fr: "language.fr",
|
||||||
|
da: "language.da",
|
||||||
|
ja: "language.ja",
|
||||||
|
pl: "language.pl",
|
||||||
|
ru: "language.ru",
|
||||||
|
uk: "language.uk",
|
||||||
|
ar: "language.ar",
|
||||||
|
no: "language.no",
|
||||||
|
br: "language.br",
|
||||||
|
th: "language.th",
|
||||||
|
bs: "language.bs",
|
||||||
|
tr: "language.tr",
|
||||||
|
}
|
||||||
|
|
||||||
const base = i18n.flatten({ ...en, ...uiEn })
|
const base = i18n.flatten({ ...en, ...uiEn })
|
||||||
const dicts = new Map<Locale, Dictionary>([["en", base]])
|
const dicts = new Map<Locale, Dictionary>([["en", base]])
|
||||||
@@ -67,50 +121,6 @@ const loaders: Record<Exclude<Locale, "en">, () => Promise<Dictionary>> = {
|
|||||||
th: () => merge(import("@/i18n/th"), import("@opencode-ai/ui/i18n/th")),
|
th: () => merge(import("@/i18n/th"), import("@opencode-ai/ui/i18n/th")),
|
||||||
bs: () => merge(import("@/i18n/bs"), import("@opencode-ai/ui/i18n/bs")),
|
bs: () => merge(import("@/i18n/bs"), import("@opencode-ai/ui/i18n/bs")),
|
||||||
tr: () => merge(import("@/i18n/tr"), import("@opencode-ai/ui/i18n/tr")),
|
tr: () => merge(import("@/i18n/tr"), import("@opencode-ai/ui/i18n/tr")),
|
||||||
hi: () => merge(import("@/i18n/hi"), import("@opencode-ai/ui/i18n/hi")),
|
|
||||||
nl: () => merge(import("@/i18n/nl"), import("@opencode-ai/ui/i18n/nl")),
|
|
||||||
id: () => merge(import("@/i18n/id"), import("@opencode-ai/ui/i18n/id")),
|
|
||||||
vi: () => merge(import("@/i18n/vi"), import("@opencode-ai/ui/i18n/vi")),
|
|
||||||
it: () => merge(import("@/i18n/it"), import("@opencode-ai/ui/i18n/it")),
|
|
||||||
ur: () => merge(import("@/i18n/ur"), import("@opencode-ai/ui/i18n/ur")),
|
|
||||||
pa: () => merge(import("@/i18n/pa"), import("@opencode-ai/ui/i18n/pa")),
|
|
||||||
az: () => merge(import("@/i18n/az"), import("@opencode-ai/ui/i18n/az")),
|
|
||||||
fi: () => merge(import("@/i18n/fi"), import("@opencode-ai/ui/i18n/fi")),
|
|
||||||
sv: () => merge(import("@/i18n/sv"), import("@opencode-ai/ui/i18n/sv")),
|
|
||||||
am: () => merge(import("@/i18n/am"), import("@opencode-ai/ui/i18n/am")),
|
|
||||||
bg: () => merge(import("@/i18n/bg"), import("@opencode-ai/ui/i18n/bg")),
|
|
||||||
bn: () => merge(import("@/i18n/bn"), import("@opencode-ai/ui/i18n/bn")),
|
|
||||||
ca: () => merge(import("@/i18n/ca"), import("@opencode-ai/ui/i18n/ca")),
|
|
||||||
cs: () => merge(import("@/i18n/cs"), import("@opencode-ai/ui/i18n/cs")),
|
|
||||||
dv: () => merge(import("@/i18n/dv"), import("@opencode-ai/ui/i18n/dv")),
|
|
||||||
dz: () => merge(import("@/i18n/dz"), import("@opencode-ai/ui/i18n/dz")),
|
|
||||||
el: () => merge(import("@/i18n/el"), import("@opencode-ai/ui/i18n/el")),
|
|
||||||
et: () => merge(import("@/i18n/et"), import("@opencode-ai/ui/i18n/et")),
|
|
||||||
fa: () => merge(import("@/i18n/fa"), import("@opencode-ai/ui/i18n/fa")),
|
|
||||||
fo: () => merge(import("@/i18n/fo"), import("@opencode-ai/ui/i18n/fo")),
|
|
||||||
hr: () => merge(import("@/i18n/hr"), import("@opencode-ai/ui/i18n/hr")),
|
|
||||||
hu: () => merge(import("@/i18n/hu"), import("@opencode-ai/ui/i18n/hu")),
|
|
||||||
hy: () => merge(import("@/i18n/hy"), import("@opencode-ai/ui/i18n/hy")),
|
|
||||||
is: () => merge(import("@/i18n/is"), import("@opencode-ai/ui/i18n/is")),
|
|
||||||
ka: () => merge(import("@/i18n/ka"), import("@opencode-ai/ui/i18n/ka")),
|
|
||||||
km: () => merge(import("@/i18n/km"), import("@opencode-ai/ui/i18n/km")),
|
|
||||||
lo: () => merge(import("@/i18n/lo"), import("@opencode-ai/ui/i18n/lo")),
|
|
||||||
lt: () => merge(import("@/i18n/lt"), import("@opencode-ai/ui/i18n/lt")),
|
|
||||||
lv: () => merge(import("@/i18n/lv"), import("@opencode-ai/ui/i18n/lv")),
|
|
||||||
mk: () => merge(import("@/i18n/mk"), import("@opencode-ai/ui/i18n/mk")),
|
|
||||||
mn: () => merge(import("@/i18n/mn"), import("@opencode-ai/ui/i18n/mn")),
|
|
||||||
ms: () => merge(import("@/i18n/ms"), import("@opencode-ai/ui/i18n/ms")),
|
|
||||||
my: () => merge(import("@/i18n/my"), import("@opencode-ai/ui/i18n/my")),
|
|
||||||
ne: () => merge(import("@/i18n/ne"), import("@opencode-ai/ui/i18n/ne")),
|
|
||||||
ro: () => merge(import("@/i18n/ro"), import("@opencode-ai/ui/i18n/ro")),
|
|
||||||
si: () => merge(import("@/i18n/si"), import("@opencode-ai/ui/i18n/si")),
|
|
||||||
sk: () => merge(import("@/i18n/sk"), import("@opencode-ai/ui/i18n/sk")),
|
|
||||||
sl: () => merge(import("@/i18n/sl"), import("@opencode-ai/ui/i18n/sl")),
|
|
||||||
sq: () => merge(import("@/i18n/sq"), import("@opencode-ai/ui/i18n/sq")),
|
|
||||||
sr: () => merge(import("@/i18n/sr"), import("@opencode-ai/ui/i18n/sr")),
|
|
||||||
tg: () => merge(import("@/i18n/tg"), import("@opencode-ai/ui/i18n/tg")),
|
|
||||||
tk: () => merge(import("@/i18n/tk"), import("@opencode-ai/ui/i18n/tk")),
|
|
||||||
uz: () => merge(import("@/i18n/uz"), import("@opencode-ai/ui/i18n/uz")),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadDict(locale: Locale) {
|
function loadDict(locale: Locale) {
|
||||||
@@ -128,9 +138,42 @@ export function loadLocaleDict(locale: Locale) {
|
|||||||
return loadDict(locale).then(() => undefined)
|
return loadDict(locale).then(() => undefined)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const localeMatchers: Array<{ locale: Locale; match: (language: string) => boolean }> = [
|
||||||
|
{ locale: "en", match: (language) => language.startsWith("en") },
|
||||||
|
{ locale: "zht", match: (language) => language.startsWith("zh") && language.includes("hant") },
|
||||||
|
{ locale: "zh", match: (language) => language.startsWith("zh") },
|
||||||
|
{ locale: "ko", match: (language) => language.startsWith("ko") },
|
||||||
|
{ locale: "de", match: (language) => language.startsWith("de") },
|
||||||
|
{ locale: "es", match: (language) => language.startsWith("es") },
|
||||||
|
{ locale: "fr", match: (language) => language.startsWith("fr") },
|
||||||
|
{ locale: "da", match: (language) => language.startsWith("da") },
|
||||||
|
{ locale: "ja", match: (language) => language.startsWith("ja") },
|
||||||
|
{ locale: "pl", match: (language) => language.startsWith("pl") },
|
||||||
|
{ locale: "ru", match: (language) => language.startsWith("ru") },
|
||||||
|
{ locale: "uk", match: (language) => language.startsWith("uk") },
|
||||||
|
{ locale: "ar", match: (language) => language.startsWith("ar") },
|
||||||
|
{
|
||||||
|
locale: "no",
|
||||||
|
match: (language) => language.startsWith("no") || language.startsWith("nb") || language.startsWith("nn"),
|
||||||
|
},
|
||||||
|
{ locale: "br", match: (language) => language.startsWith("pt") },
|
||||||
|
{ locale: "th", match: (language) => language.startsWith("th") },
|
||||||
|
{ locale: "bs", match: (language) => language.startsWith("bs") },
|
||||||
|
{ locale: "tr", match: (language) => language.startsWith("tr") },
|
||||||
|
]
|
||||||
|
|
||||||
function detectLocale(): Locale {
|
function detectLocale(): Locale {
|
||||||
if (typeof navigator !== "object") return "en"
|
if (typeof navigator !== "object") return "en"
|
||||||
return detectDesktopNativeLocale(navigator.languages?.length ? navigator.languages : [navigator.language])
|
|
||||||
|
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
|
||||||
|
for (const language of languages) {
|
||||||
|
if (!language) continue
|
||||||
|
const normalized = language.toLowerCase()
|
||||||
|
const match = localeMatchers.find((entry) => entry.match(normalized))
|
||||||
|
if (match) return match.locale
|
||||||
|
}
|
||||||
|
|
||||||
|
return "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
export function normalizeLocale(value: string): Locale {
|
export function normalizeLocale(value: string): Locale {
|
||||||
@@ -151,22 +194,12 @@ function readStoredLocale() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const warm = readStoredLocale() ?? detectLocale()
|
const warm = readStoredLocale() ?? detectLocale()
|
||||||
const initialLocale =
|
if (warm !== "en") void loadDict(warm)
|
||||||
warm === "en"
|
|
||||||
? Promise.resolve(warm)
|
|
||||||
: loadDict(warm).then(
|
|
||||||
() => warm,
|
|
||||||
() => "en" as const,
|
|
||||||
)
|
|
||||||
|
|
||||||
export function loadInitialLocale() {
|
|
||||||
return initialLocale
|
|
||||||
}
|
|
||||||
|
|
||||||
export const { use: useLanguage, provider: LanguageProvider } = createSimpleContext({
|
export const { use: useLanguage, provider: LanguageProvider } = createSimpleContext({
|
||||||
name: "Language",
|
name: "Language",
|
||||||
gate: false,
|
gate: false,
|
||||||
init: (props: { locale?: Locale; onNativeTranslations?: (bundle: DesktopNativeBundle) => void }) => {
|
init: (props: { locale?: Locale }) => {
|
||||||
const initial = props.locale ?? readStoredLocale() ?? detectLocale()
|
const initial = props.locale ?? readStoredLocale() ?? detectLocale()
|
||||||
const [store, setStore, _, ready] = persisted(
|
const [store, setStore, _, ready] = persisted(
|
||||||
Persist.global("language", ["language.v1"]),
|
Persist.global("language", ["language.v1"]),
|
||||||
@@ -177,13 +210,6 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
|
|||||||
|
|
||||||
const locale = createMemo<Locale>(() => normalizeLocale(store.locale))
|
const locale = createMemo<Locale>(() => normalizeLocale(store.locale))
|
||||||
const intl = createMemo(() => INTL[locale()])
|
const intl = createMemo(() => INTL[locale()])
|
||||||
const [layout, setLayout] = createStore({ direction: undefined as Direction | undefined })
|
|
||||||
const direction = createMemo(() => layout.direction ?? localeDirection(locale()))
|
|
||||||
const layoutLocale = createMemo(() => {
|
|
||||||
if (!layout.direction) return intl()
|
|
||||||
// Kobalte derives menu direction from locale rather than accepting a direction override.
|
|
||||||
return layout.direction === "rtl" ? "ar" : "en"
|
|
||||||
})
|
|
||||||
|
|
||||||
const [dict] = createResource(locale, loadDict, {
|
const [dict] = createResource(locale, loadDict, {
|
||||||
initialValue: dicts.get(initial) ?? base,
|
initialValue: dicts.get(initial) ?? base,
|
||||||
@@ -194,49 +220,24 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
|
|||||||
params?: Record<string, string | number | boolean>,
|
params?: Record<string, string | number | boolean>,
|
||||||
) => string
|
) => string
|
||||||
|
|
||||||
const plural = (key: PluralKey, count: number, params?: Record<string, string | number | boolean>) => {
|
const label = (value: Locale) => t(LABEL_KEY[value])
|
||||||
const category = pluralCategory(intl(), count)
|
|
||||||
const current = (dict.loading ? base : (dict() ?? base)) as Record<string, string>
|
|
||||||
const candidate = `${key}.${category}`
|
|
||||||
const fallback = `${key}.other`
|
|
||||||
return i18n.resolveTemplate(current[candidate] ?? current[fallback] ?? fallback, { ...params, count })
|
|
||||||
}
|
|
||||||
|
|
||||||
const label = (value: Locale) => DESKTOP_NATIVE_LABELS[value]
|
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (typeof document !== "object") return
|
if (typeof document !== "object") return
|
||||||
const value = locale()
|
document.documentElement.lang = locale()
|
||||||
document.documentElement.lang = intl()
|
document.cookie = cookie(locale())
|
||||||
document.documentElement.dir = direction()
|
|
||||||
document.cookie = cookie(value)
|
|
||||||
})
|
|
||||||
|
|
||||||
createEffect(() => {
|
|
||||||
if (!props.onNativeTranslations || dict.loading) return
|
|
||||||
const current = dict()
|
|
||||||
if (!current) return
|
|
||||||
props.onNativeTranslations(
|
|
||||||
createDesktopNativeBundle(locale(), (key) => current[key] ?? DESKTOP_NATIVE_ENGLISH[key]),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ready,
|
ready,
|
||||||
locale,
|
locale,
|
||||||
intl,
|
intl,
|
||||||
direction,
|
|
||||||
layoutLocale,
|
|
||||||
locales: LOCALES,
|
locales: LOCALES,
|
||||||
label,
|
label,
|
||||||
t,
|
t,
|
||||||
plural,
|
|
||||||
setLocale(next: Locale) {
|
setLocale(next: Locale) {
|
||||||
setStore("locale", normalizeLocale(next))
|
setStore("locale", normalizeLocale(next))
|
||||||
},
|
},
|
||||||
setDirection(next: Direction) {
|
|
||||||
setLayout("direction", next === localeDirection(locale()) ? undefined : next)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import type { FileSelection } from "@/context/file"
|
|||||||
import { Persist, persisted } from "@/utils/persist"
|
import { Persist, persisted } from "@/utils/persist"
|
||||||
import type { ServerScope } from "@/utils/server-scope"
|
import type { ServerScope } from "@/utils/server-scope"
|
||||||
import type { BlobReference } from "@/utils/draft-store"
|
import type { BlobReference } from "@/utils/draft-store"
|
||||||
import type { Platform } from "@/context/platform"
|
|
||||||
|
|
||||||
interface PartBase {
|
interface PartBase {
|
||||||
content: string
|
content: string
|
||||||
@@ -237,18 +236,13 @@ function createPromptStateValue(store: PromptStore, setStore: SetStoreFunction<P
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPersistedPrompt(target: ReturnType<typeof promptTarget>, initial?: InitialPrompt, platform?: Platform) {
|
function createPersistedPrompt(target: ReturnType<typeof promptTarget>, initial?: InitialPrompt) {
|
||||||
const [store, setStore, _, ready] = persisted(target, createStore<PromptStore>(promptStore(initial)), platform)
|
const [store, setStore, _, ready] = persisted(target, createStore<PromptStore>(promptStore(initial)))
|
||||||
return { ready, ...createPromptStateValue(store, setStore) }
|
return { ready, ...createPromptStateValue(store, setStore) }
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createPromptSession(
|
export function createPromptSession(serverScope: ServerScope, scope: PromptScope, initial?: InitialPrompt) {
|
||||||
serverScope: ServerScope,
|
return createPersistedPrompt(promptTarget(serverScope, scope), initial)
|
||||||
scope: PromptScope,
|
|
||||||
initial?: InitialPrompt,
|
|
||||||
platform?: Platform,
|
|
||||||
) {
|
|
||||||
return createPersistedPrompt(promptTarget(serverScope, scope), initial, platform)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createDraftPromptSession(draftID: string, initial?: InitialPrompt) {
|
export function createDraftPromptSession(draftID: string, initial?: InitialPrompt) {
|
||||||
|
|||||||
@@ -264,7 +264,6 @@ describe("server session", () => {
|
|||||||
|
|
||||||
expect(requests).toEqual([{ sessionID: "root", limit: 20, order: "desc" }])
|
expect(requests).toEqual([{ sessionID: "root", limit: 20, order: "desc" }])
|
||||||
expect(store.data.session_message.root.map((message) => message.id)).toEqual([user.id, assistant.id])
|
expect(store.data.session_message.root.map((message) => message.id)).toEqual([user.id, assistant.id])
|
||||||
expect(store.data.message.root.map((message) => message.id)).toEqual([user.id, assistant.id])
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test("extends a current page to include the user for split assistant turns", async () => {
|
test("extends a current page to include the user for split assistant turns", async () => {
|
||||||
@@ -1498,7 +1497,7 @@ describe("server session", () => {
|
|||||||
|
|
||||||
await store.sync("child", { force: true })
|
await store.sync("child", { force: true })
|
||||||
|
|
||||||
expect(store.data.message.child).toEqual([older, boundary])
|
expect(store.data.message.child).toEqual([boundary, older])
|
||||||
})
|
})
|
||||||
|
|
||||||
test("preserves a part update for a message being loaded from history", async () => {
|
test("preserves a part update for a message being loaded from history", async () => {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import { message as cleanMessage } from "@/utils/diffs"
|
|||||||
import { sessionNotFoundError } from "@/utils/server-errors"
|
import { sessionNotFoundError } from "@/utils/server-errors"
|
||||||
import { rootSession } from "@/utils/session-route"
|
import { rootSession } from "@/utils/session-route"
|
||||||
import { normalizeSessionInfo } from "@/utils/session"
|
import { normalizeSessionInfo } from "@/utils/session"
|
||||||
import { compareMessages, messageKey, normalizeSessionMessages } from "@/utils/session-message"
|
import { normalizeSessionMessages } from "@/utils/session-message"
|
||||||
import { dropSessionCaches, pickSessionCacheEvictions, SESSION_CACHE_LIMIT } from "./global-sync/session-cache"
|
import { dropSessionCaches, pickSessionCacheEvictions, SESSION_CACHE_LIMIT } from "./global-sync/session-cache"
|
||||||
import { createV2SessionReducer, type V2SessionReduction } from "./server-session-v2-reducer"
|
import { createV2SessionReducer, type V2SessionReduction } from "./server-session-v2-reducer"
|
||||||
import type { ServerApi } from "@/utils/server"
|
import type { ServerApi } from "@/utils/server"
|
||||||
@@ -26,6 +26,7 @@ import type { ServerApi } from "@/utils/server"
|
|||||||
type MessageApi = ServerApi["message"]
|
type MessageApi = ServerApi["message"]
|
||||||
|
|
||||||
const cmp = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0)
|
const cmp = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0)
|
||||||
|
const cmpMessage = (a: Message, b: Message) => a.time.created - b.time.created || cmp(a.id, b.id)
|
||||||
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
||||||
const initialMessagePageSize = 20
|
const initialMessagePageSize = 20
|
||||||
const historyMessagePageSize = 200
|
const historyMessagePageSize = 200
|
||||||
@@ -63,7 +64,7 @@ type MessagePage = {
|
|||||||
function legacyMessageSource(items: { info: Message; parts: Part[] }[]): SessionMessageInfo[] {
|
function legacyMessageSource(items: { info: Message; parts: Part[] }[]): SessionMessageInfo[] {
|
||||||
return items
|
return items
|
||||||
.slice()
|
.slice()
|
||||||
.sort((a, b) => compareMessages(a.info, b.info))
|
.sort((a, b) => cmp(a.info.id, b.info.id))
|
||||||
.map((item) => {
|
.map((item) => {
|
||||||
if (item.info.role === "user") {
|
if (item.info.role === "user") {
|
||||||
return {
|
return {
|
||||||
@@ -110,16 +111,17 @@ function mergeOptimisticPage(page: MessagePage, items: OptimisticItem[]) {
|
|||||||
const part = new Map(page.part.map((item) => [item.id, item.part]))
|
const part = new Map(page.part.map((item) => [item.id, item.part]))
|
||||||
const observed: { messageID: string; parts: Part[] }[] = []
|
const observed: { messageID: string; parts: Part[] }[] = []
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
const result = Binary.search(session, messageKey(item.message), messageKey)
|
const result = Binary.search(session, item.message.id, (message) => message.id)
|
||||||
const found = result.found
|
if (!result.found) session.splice(result.index, 0, item.message)
|
||||||
if (!found) session.splice(result.index, 0, item.message)
|
|
||||||
const current = part.get(item.message.id)
|
const current = part.get(item.message.id)
|
||||||
const confirmed = found ? item.parts.filter((part) => current?.some((value) => value.id === part.id)) : []
|
const confirmed = result.found
|
||||||
if (found) observed.push({ messageID: item.message.id, parts: confirmed })
|
? item.parts.filter((part) => Binary.search(current ?? [], part.id, (value) => value.id).found)
|
||||||
|
: []
|
||||||
|
if (result.found) observed.push({ messageID: item.message.id, parts: confirmed })
|
||||||
part.set(
|
part.set(
|
||||||
item.message.id,
|
item.message.id,
|
||||||
merge(
|
merge(
|
||||||
found ? (current ?? []) : merge(item.confirmedParts ?? [], current ?? []),
|
result.found ? (current ?? []) : merge(item.confirmedParts ?? [], current ?? []),
|
||||||
item.parts.filter((part) => !confirmed.includes(part)),
|
item.parts.filter((part) => !confirmed.includes(part)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -156,7 +158,6 @@ function reconcileFetched<T extends { id: string }>(
|
|||||||
retained?: ReadonlySet<string>
|
retained?: ReadonlySet<string>
|
||||||
removed?: ReadonlySet<string>
|
removed?: ReadonlySet<string>
|
||||||
preserveUnfetched?: boolean | ((item: T) => boolean)
|
preserveUnfetched?: boolean | ((item: T) => boolean)
|
||||||
compare?: (a: T, b: T) => number
|
|
||||||
} = {},
|
} = {},
|
||||||
) {
|
) {
|
||||||
const result = new Map(fetched.map((item) => [item.id, item]))
|
const result = new Map(fetched.map((item) => [item.id, item]))
|
||||||
@@ -179,8 +180,7 @@ function reconcileFetched<T extends { id: string }>(
|
|||||||
if (!item) result.delete(id)
|
if (!item) result.delete(id)
|
||||||
}
|
}
|
||||||
for (const id of options.removed ?? emptyIDs) result.delete(id)
|
for (const id of options.removed ?? emptyIDs) result.delete(id)
|
||||||
const items = [...result.values()]
|
return [...result.values()].sort((a, b) => cmp(a.id, b.id))
|
||||||
return options.compare ? items.sort(options.compare) : items
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerSessionOptions = { retry?: typeof retry; protocol?: Promise<"v1" | "v2"> }
|
type ServerSessionOptions = { retry?: typeof retry; protocol?: Promise<"v1" | "v2"> }
|
||||||
@@ -413,7 +413,8 @@ export function createServerSession(
|
|||||||
if (!load) return
|
if (!load) return
|
||||||
// A part event keeps an existing parent when the fetched page omits it without overriding fetched metadata.
|
// A part event keeps an existing parent when the fetched page omits it without overriding fetched metadata.
|
||||||
const messages = data.message[sessionID]
|
const messages = data.message[sessionID]
|
||||||
if (messages?.some((message) => message.id === messageID)) load.retainedMessages.add(messageID)
|
if (messages && Binary.search(messages, messageID, (message) => message.id).found)
|
||||||
|
load.retainedMessages.add(messageID)
|
||||||
const parts = load.touchedParts.get(messageID)
|
const parts = load.touchedParts.get(messageID)
|
||||||
if (parts) {
|
if (parts) {
|
||||||
parts.add(partID)
|
parts.add(partID)
|
||||||
@@ -436,14 +437,16 @@ export function createServerSession(
|
|||||||
load.touchedParts.set(messageID, new Set(parts))
|
load.touchedParts.set(messageID, new Set(parts))
|
||||||
load.carriedDeltaParts.set(messageID, new Set(parts))
|
load.carriedDeltaParts.set(messageID, new Set(parts))
|
||||||
const messages = data.message[sessionID]
|
const messages = data.message[sessionID]
|
||||||
if (messages?.some((message) => message.id === messageID)) load.retainedMessages.add(messageID)
|
if (messages && Binary.search(messages, messageID, (message) => message.id).found)
|
||||||
|
load.retainedMessages.add(messageID)
|
||||||
}
|
}
|
||||||
for (const [messageID, parts] of load.removedParts) {
|
for (const [messageID, parts] of load.removedParts) {
|
||||||
const touched = load.touchedParts.get(messageID) ?? new Set<string>()
|
const touched = load.touchedParts.get(messageID) ?? new Set<string>()
|
||||||
parts.forEach((partID) => touched.add(partID))
|
parts.forEach((partID) => touched.add(partID))
|
||||||
load.touchedParts.set(messageID, touched)
|
load.touchedParts.set(messageID, touched)
|
||||||
const messages = data.message[sessionID]
|
const messages = data.message[sessionID]
|
||||||
if (messages?.some((message) => message.id === messageID)) load.retainedMessages.add(messageID)
|
if (messages && Binary.search(messages, messageID, (message) => message.id).found)
|
||||||
|
load.retainedMessages.add(messageID)
|
||||||
}
|
}
|
||||||
for (const [messageID, parts] of load.optimisticParts) {
|
for (const [messageID, parts] of load.optimisticParts) {
|
||||||
load.removedMessages.delete(messageID)
|
load.removedMessages.delete(messageID)
|
||||||
@@ -552,7 +555,7 @@ export function createServerSession(
|
|||||||
const source = pages.flatMap((page) => page.data).toReversed()
|
const source = pages.flatMap((page) => page.data).toReversed()
|
||||||
const normalized = normalizeSessionMessages(sessionID, source)
|
const normalized = normalizeSessionMessages(sessionID, source)
|
||||||
return {
|
return {
|
||||||
session: normalized.messages.sort(compareMessages),
|
session: normalized.messages.sort((a, b) => cmp(a.id, b.id)),
|
||||||
part: [...normalized.parts.entries()]
|
part: [...normalized.parts.entries()]
|
||||||
.map(([id, part]) => ({ id, part: part.sort((a, b) => cmp(a.id, b.id)) }))
|
.map(([id, part]) => ({ id, part: part.sort((a, b) => cmp(a.id, b.id)) }))
|
||||||
.sort((a, b) => cmp(a.id, b.id)),
|
.sort((a, b) => cmp(a.id, b.id)),
|
||||||
@@ -569,7 +572,7 @@ export function createServerSession(
|
|||||||
})
|
})
|
||||||
const items = (response.data ?? []).filter((item) => !!item?.info?.id)
|
const items = (response.data ?? []).filter((item) => !!item?.info?.id)
|
||||||
return {
|
return {
|
||||||
session: items.map((item) => cleanMessage(item.info)).sort(compareMessages),
|
session: items.map((item) => cleanMessage(item.info)).sort((a, b) => cmp(a.id, b.id)),
|
||||||
part: items.map((item) => ({
|
part: items.map((item) => ({
|
||||||
id: item.info.id,
|
id: item.info.id,
|
||||||
part: item.parts.filter((part) => !!part?.id).sort((a, b) => cmp(a.id, b.id)),
|
part: item.parts.filter((part) => !!part?.id).sort((a, b) => cmp(a.id, b.id)),
|
||||||
@@ -693,7 +696,7 @@ export function createServerSession(
|
|||||||
const normalized = normalizeSessionMessages(sessionID, source)
|
const normalized = normalizeSessionMessages(sessionID, source)
|
||||||
return {
|
return {
|
||||||
...page,
|
...page,
|
||||||
session: normalized.messages.sort(compareMessages),
|
session: normalized.messages.sort((a, b) => cmp(a.id, b.id)),
|
||||||
part: [...normalized.parts.entries()]
|
part: [...normalized.parts.entries()]
|
||||||
.map(([id, part]) => ({ id, part: part.sort((a, b) => cmp(a.id, b.id)) }))
|
.map(([id, part]) => ({ id, part: part.sort((a, b) => cmp(a.id, b.id)) }))
|
||||||
.sort((a, b) => cmp(a.id, b.id)),
|
.sort((a, b) => cmp(a.id, b.id)),
|
||||||
@@ -710,7 +713,6 @@ export function createServerSession(
|
|||||||
retained: load?.retainedMessages,
|
retained: load?.retainedMessages,
|
||||||
removed: load?.removedMessages,
|
removed: load?.removedMessages,
|
||||||
preserveUnfetched,
|
preserveUnfetched,
|
||||||
compare: compareMessages,
|
|
||||||
})
|
})
|
||||||
batch(() => {
|
batch(() => {
|
||||||
if (source) setData("session_message", sessionID, reconcile(source))
|
if (source) setData("session_message", sessionID, reconcile(source))
|
||||||
@@ -752,7 +754,7 @@ export function createServerSession(
|
|||||||
try {
|
try {
|
||||||
const page = await fetchMessages(sessionID, limit, before, () => resetMessageLoad(sessionID, load))
|
const page = await fetchMessages(sessionID, limit, before, () => resetMessageLoad(sessionID, load))
|
||||||
const first = page.session.reduce<Message | undefined>(
|
const first = page.session.reduce<Message | undefined>(
|
||||||
(oldest, message) => (!oldest || compareMessages(message, oldest) < 0 ? message : oldest),
|
(oldest, message) => (!oldest || cmpMessage(message, oldest) < 0 ? message : oldest),
|
||||||
undefined,
|
undefined,
|
||||||
)
|
)
|
||||||
if (generations.get(sessionID) !== active) return
|
if (generations.get(sessionID) !== active) return
|
||||||
@@ -802,15 +804,14 @@ export function createServerSession(
|
|||||||
session: merge(
|
session: merge(
|
||||||
page.session,
|
page.session,
|
||||||
parents.map((parent) => parent.message),
|
parents.map((parent) => parent.message),
|
||||||
).sort(compareMessages),
|
),
|
||||||
part: merge(
|
part: merge(
|
||||||
page.part,
|
page.part,
|
||||||
parents.map((parent) => ({ id: parent.message.id, part: parent.parts })),
|
parents.map((parent) => ({ id: parent.message.id, part: parent.parts })),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
const preserveUnfetched =
|
const preserveUnfetched =
|
||||||
mode === "prepend" ||
|
mode === "prepend" || (!result.complete && (!first || ((message: Message) => cmpMessage(message, first) < 0)))
|
||||||
(!result.complete && (!first || ((message: Message) => compareMessages(message, first) < 0)))
|
|
||||||
applyMessagePage(
|
applyMessagePage(
|
||||||
sessionID,
|
sessionID,
|
||||||
result,
|
result,
|
||||||
@@ -927,7 +928,7 @@ export function createServerSession(
|
|||||||
.message({ sessionID, messageID })
|
.message({ sessionID, messageID })
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
const current = data.session_message[sessionID] ?? []
|
const current = data.session_message[sessionID] ?? []
|
||||||
const messages = [...current.filter((item) => item.id !== message.id), message].sort(compareMessages)
|
const messages = [...current.filter((item) => item.id !== message.id), message].sort((a, b) => cmp(a.id, b.id))
|
||||||
projectV2({ sessionID, messages, touched: [message.id] })
|
projectV2({ sessionID, messages, touched: [message.id] })
|
||||||
})
|
})
|
||||||
.catch(() => {})
|
.catch(() => {})
|
||||||
@@ -1050,7 +1051,7 @@ export function createServerSession(
|
|||||||
setData("message", info.sessionID, [info])
|
setData("message", info.sessionID, [info])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const result = Binary.search(messages, messageKey(info), messageKey)
|
const result = Binary.search(messages, info.id, (message) => message.id)
|
||||||
if (result.found) setData("message", info.sessionID, result.index, reconcile(info))
|
if (result.found) setData("message", info.sessionID, result.index, reconcile(info))
|
||||||
if (!result.found)
|
if (!result.found)
|
||||||
setData("message", info.sessionID, (value = []) => {
|
setData("message", info.sessionID, (value = []) => {
|
||||||
@@ -1083,8 +1084,8 @@ export function createServerSession(
|
|||||||
produce((draft) => {
|
produce((draft) => {
|
||||||
const messages = draft.message[props.sessionID]
|
const messages = draft.message[props.sessionID]
|
||||||
if (messages) {
|
if (messages) {
|
||||||
const index = messages.findIndex((message) => message.id === props.messageID)
|
const result = Binary.search(messages, props.messageID, (message) => message.id)
|
||||||
if (index >= 0) messages.splice(index, 1)
|
if (result.found) messages.splice(result.index, 1)
|
||||||
}
|
}
|
||||||
deleteMessageParts(draft, props.messageID)
|
deleteMessageParts(draft, props.messageID)
|
||||||
}),
|
}),
|
||||||
@@ -1096,7 +1097,7 @@ export function createServerSession(
|
|||||||
if (SKIP_PARTS.has(part.type)) return
|
if (SKIP_PARTS.has(part.type)) return
|
||||||
const messages = data.message[part.sessionID]
|
const messages = data.message[part.sessionID]
|
||||||
const load = messageLoads.get(part.sessionID)
|
const load = messageLoads.get(part.sessionID)
|
||||||
const missing = !messages?.some((message) => message.id === part.messageID)
|
const missing = !messages || !Binary.search(messages, part.messageID, (message) => message.id).found
|
||||||
// Outside a page load, accepting a part without its ordered parent event would create an unbounded orphan.
|
// Outside a page load, accepting a part without its ordered parent event would create an unbounded orphan.
|
||||||
if (
|
if (
|
||||||
missing &&
|
missing &&
|
||||||
@@ -1340,7 +1341,7 @@ export function createServerSession(
|
|||||||
if (items) items.set(input.message.id, { ...input, parts, confirmedParts: [] })
|
if (items) items.set(input.message.id, { ...input, parts, confirmedParts: [] })
|
||||||
if (!items)
|
if (!items)
|
||||||
optimistic.set(input.sessionID, new Map([[input.message.id, { ...input, parts, confirmedParts: [] }]]))
|
optimistic.set(input.sessionID, new Map([[input.message.id, { ...input, parts, confirmedParts: [] }]]))
|
||||||
setData("message", input.sessionID, (messages = []) => merge(messages, [input.message]).sort(compareMessages))
|
setData("message", input.sessionID, (messages = []) => merge(messages, [input.message]))
|
||||||
setData(
|
setData(
|
||||||
"part_text_accum_delta",
|
"part_text_accum_delta",
|
||||||
produce((draft) => {
|
produce((draft) => {
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import { applyOptimisticAdd, applyOptimisticRemove, mergeOptimisticPage } from "
|
|||||||
|
|
||||||
type Text = Extract<Part, { type: "text" }>
|
type Text = Extract<Part, { type: "text" }>
|
||||||
|
|
||||||
const userMessage = (id: string, sessionID: string, created = 1): Message => ({
|
const userMessage = (id: string, sessionID: string): Message => ({
|
||||||
id,
|
id,
|
||||||
sessionID,
|
sessionID,
|
||||||
role: "user",
|
role: "user",
|
||||||
time: { created },
|
time: { created: 1 },
|
||||||
agent: "assistant",
|
agent: "assistant",
|
||||||
model: { providerID: "openai", modelID: "gpt" },
|
model: { providerID: "openai", modelID: "gpt" },
|
||||||
})
|
})
|
||||||
@@ -22,21 +22,21 @@ const textPart = (id: string, sessionID: string, messageID: string): Text => ({
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe("sync optimistic reducers", () => {
|
describe("sync optimistic reducers", () => {
|
||||||
test("applyOptimisticAdd inserts by creation time", () => {
|
test("applyOptimisticAdd inserts message in sorted order and stores parts", () => {
|
||||||
const sessionID = "ses_1"
|
const sessionID = "ses_1"
|
||||||
const draft = {
|
const draft = {
|
||||||
message: { [sessionID]: [userMessage("msg_z", sessionID, 1)] },
|
message: { [sessionID]: [userMessage("msg_2", sessionID)] },
|
||||||
part: {} as Record<string, Part[] | undefined>,
|
part: {} as Record<string, Part[] | undefined>,
|
||||||
}
|
}
|
||||||
|
|
||||||
applyOptimisticAdd(draft, {
|
applyOptimisticAdd(draft, {
|
||||||
sessionID,
|
sessionID,
|
||||||
message: userMessage("msg_a", sessionID, 2),
|
message: userMessage("msg_1", sessionID),
|
||||||
parts: [textPart("prt_2", sessionID, "msg_a"), textPart("prt_1", sessionID, "msg_a")],
|
parts: [textPart("prt_2", sessionID, "msg_1"), textPart("prt_1", sessionID, "msg_1")],
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(draft.message[sessionID]?.map((x) => x.id)).toEqual(["msg_z", "msg_a"])
|
expect(draft.message[sessionID]?.map((x) => x.id)).toEqual(["msg_1", "msg_2"])
|
||||||
expect(draft.part.msg_a?.map((x) => x.id)).toEqual(["prt_1", "prt_2"])
|
expect(draft.part.msg_1?.map((x) => x.id)).toEqual(["prt_1", "prt_2"])
|
||||||
})
|
})
|
||||||
|
|
||||||
test("applyOptimisticRemove removes message and part entries", () => {
|
test("applyOptimisticRemove removes message and part entries", () => {
|
||||||
@@ -60,33 +60,19 @@ describe("sync optimistic reducers", () => {
|
|||||||
const sessionID = "ses_1"
|
const sessionID = "ses_1"
|
||||||
const page = mergeOptimisticPage(
|
const page = mergeOptimisticPage(
|
||||||
{
|
{
|
||||||
session: [userMessage("msg_z", sessionID, 1)],
|
session: [userMessage("msg_1", sessionID)],
|
||||||
part: [{ id: "msg_z", part: [textPart("prt_1", sessionID, "msg_z")] }],
|
part: [{ id: "msg_1", part: [textPart("prt_1", sessionID, "msg_1")] }],
|
||||||
complete: true,
|
complete: true,
|
||||||
},
|
},
|
||||||
[{ message: userMessage("msg_a", sessionID, 2), parts: [textPart("prt_2", sessionID, "msg_a")] }],
|
[{ message: userMessage("msg_2", sessionID), parts: [textPart("prt_2", sessionID, "msg_2")] }],
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(page.session.map((x) => x.id)).toEqual(["msg_z", "msg_a"])
|
expect(page.session.map((x) => x.id)).toEqual(["msg_1", "msg_2"])
|
||||||
expect(page.part.find((x) => x.id === "msg_a")?.part.map((x) => x.id)).toEqual(["prt_2"])
|
expect(page.part.find((x) => x.id === "msg_2")?.part.map((x) => x.id)).toEqual(["prt_2"])
|
||||||
expect(page.confirmed).toEqual([])
|
expect(page.confirmed).toEqual([])
|
||||||
expect(page.complete).toBe(true)
|
expect(page.complete).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
test("mergeOptimisticPage uses IDs only to break equal-time ties", () => {
|
|
||||||
const sessionID = "ses_1"
|
|
||||||
const page = mergeOptimisticPage(
|
|
||||||
{
|
|
||||||
session: [userMessage("msg_z", sessionID, 1)],
|
|
||||||
part: [],
|
|
||||||
complete: true,
|
|
||||||
},
|
|
||||||
[{ message: userMessage("msg_a", sessionID, 1), parts: [] }],
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(page.session.map((message) => message.id)).toEqual(["msg_a", "msg_z"])
|
|
||||||
})
|
|
||||||
|
|
||||||
test("mergeOptimisticPage keeps missing optimistic parts until the server has them", () => {
|
test("mergeOptimisticPage keeps missing optimistic parts until the server has them", () => {
|
||||||
const sessionID = "ses_1"
|
const sessionID = "ses_1"
|
||||||
const page = mergeOptimisticPage(
|
const page = mergeOptimisticPage(
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { createMemo } from "solid-js"
|
|||||||
import { useServerSync } from "./server-sync"
|
import { useServerSync } from "./server-sync"
|
||||||
import { useSDK } from "./sdk"
|
import { useSDK } from "./sdk"
|
||||||
import type { Message, Part } from "@opencode-ai/sdk/v2/client"
|
import type { Message, Part } from "@opencode-ai/sdk/v2/client"
|
||||||
import { messageKey } from "@/utils/session-message"
|
|
||||||
|
|
||||||
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
|
||||||
|
|
||||||
@@ -68,7 +67,7 @@ export function mergeOptimisticPage(page: MessagePage, items: OptimisticItem[])
|
|||||||
const confirmed: string[] = []
|
const confirmed: string[] = []
|
||||||
|
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
const result = Binary.search(session, messageKey(item.message), messageKey)
|
const result = Binary.search(session, item.message.id, (message) => message.id)
|
||||||
const found = result.found
|
const found = result.found
|
||||||
if (!found) session.splice(result.index, 0, item.message)
|
if (!found) session.splice(result.index, 0, item.message)
|
||||||
|
|
||||||
@@ -93,7 +92,7 @@ export function mergeOptimisticPage(page: MessagePage, items: OptimisticItem[])
|
|||||||
export function applyOptimisticAdd(draft: OptimisticStore, input: OptimisticAddInput) {
|
export function applyOptimisticAdd(draft: OptimisticStore, input: OptimisticAddInput) {
|
||||||
const messages = draft.message[input.sessionID]
|
const messages = draft.message[input.sessionID]
|
||||||
if (messages) {
|
if (messages) {
|
||||||
const result = Binary.search(messages, messageKey(input.message), messageKey)
|
const result = Binary.search(messages, input.message.id, (m) => m.id)
|
||||||
messages.splice(result.index, 0, input.message)
|
messages.splice(result.index, 0, input.message)
|
||||||
} else {
|
} else {
|
||||||
draft.message[input.sessionID] = [input.message]
|
draft.message[input.sessionID] = [input.message]
|
||||||
@@ -104,8 +103,8 @@ export function applyOptimisticAdd(draft: OptimisticStore, input: OptimisticAddI
|
|||||||
export function applyOptimisticRemove(draft: OptimisticStore, input: OptimisticRemoveInput) {
|
export function applyOptimisticRemove(draft: OptimisticStore, input: OptimisticRemoveInput) {
|
||||||
const messages = draft.message[input.sessionID]
|
const messages = draft.message[input.sessionID]
|
||||||
if (messages) {
|
if (messages) {
|
||||||
const index = messages.findIndex((message) => message.id === input.messageID)
|
const result = Binary.search(messages, input.messageID, (m) => m.id)
|
||||||
if (index >= 0) messages.splice(index, 1)
|
if (result.found) messages.splice(result.index, 1)
|
||||||
}
|
}
|
||||||
delete draft.part[input.messageID]
|
delete draft.part[input.messageID]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,20 +4,10 @@ import { DESKTOP_MENU } from "./desktop-menu"
|
|||||||
describe("desktop menu", () => {
|
describe("desktop menu", () => {
|
||||||
test("exports logs through the desktop command registry", () => {
|
test("exports logs through the desktop command registry", () => {
|
||||||
const items = DESKTOP_MENU.flatMap((menu) => menu.items ?? []).filter(
|
const items = DESKTOP_MENU.flatMap((menu) => menu.items ?? []).filter(
|
||||||
(item) => item.type === "item" && item.labelKey === "desktop.menu.exportLogs",
|
(item) => item.type === "item" && item.label === "Export Logs...",
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(items).toHaveLength(2)
|
expect(items).toHaveLength(2)
|
||||||
expect(items.every((item) => item.type === "item" && item.command === "logs.export" && !item.action)).toBe(true)
|
expect(items.every((item) => item.type === "item" && item.command === "logs.export" && !item.action)).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
test("provides translated labels for role-backed entries", () => {
|
|
||||||
const windowMenu = DESKTOP_MENU.find((menu) => menu.role === "windowMenu")
|
|
||||||
const roleItems = DESKTOP_MENU.flatMap((menu) => menu.items ?? []).filter(
|
|
||||||
(item) => item.type === "item" && item.role && item.labelKey,
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(windowMenu?.labelKey).toBe("desktop.menu.window")
|
|
||||||
expect(roleItems.length).toBeGreaterThan(0)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import type { DesktopNativeKey } from "./i18n/desktop-native"
|
|
||||||
|
|
||||||
export type DesktopMenuPlatform = "macos" | "windows"
|
export type DesktopMenuPlatform = "macos" | "windows"
|
||||||
|
|
||||||
export type DesktopMenuAction =
|
export type DesktopMenuAction =
|
||||||
@@ -46,7 +44,7 @@ export type DesktopMenuRole =
|
|||||||
|
|
||||||
export type DesktopMenuItem = {
|
export type DesktopMenuItem = {
|
||||||
type: "item"
|
type: "item"
|
||||||
labelKey?: DesktopNativeKey
|
label?: string
|
||||||
command?: string
|
command?: string
|
||||||
action?: DesktopMenuAction
|
action?: DesktopMenuAction
|
||||||
role?: DesktopMenuRole
|
role?: DesktopMenuRole
|
||||||
@@ -65,7 +63,7 @@ export type DesktopMenuEntry = DesktopMenuItem | DesktopMenuSeparator
|
|||||||
|
|
||||||
export type DesktopMenu = {
|
export type DesktopMenu = {
|
||||||
id: string
|
id: string
|
||||||
labelKey: DesktopNativeKey
|
label: string
|
||||||
role?: DesktopMenuRole
|
role?: DesktopMenuRole
|
||||||
items?: DesktopMenuEntry[]
|
items?: DesktopMenuEntry[]
|
||||||
platforms?: DesktopMenuPlatform[]
|
platforms?: DesktopMenuPlatform[]
|
||||||
@@ -74,20 +72,15 @@ export type DesktopMenu = {
|
|||||||
export const DESKTOP_MENU: DesktopMenu[] = [
|
export const DESKTOP_MENU: DesktopMenu[] = [
|
||||||
{
|
{
|
||||||
id: "app",
|
id: "app",
|
||||||
labelKey: "desktop.menu.app",
|
label: "OpenCode",
|
||||||
platforms: ["macos"],
|
platforms: ["macos"],
|
||||||
items: [
|
items: [
|
||||||
{ type: "item", role: "about" },
|
{ type: "item", role: "about" },
|
||||||
{
|
{ type: "item", label: "Check for Updates...", action: "app.checkForUpdates", enabled: "updater" },
|
||||||
type: "item",
|
{ type: "item", label: "Settings", command: "settings.open", accelerator: { macos: "Cmd+," } },
|
||||||
labelKey: "desktop.menu.checkForUpdates",
|
{ type: "item", label: "Reload Webview", action: "view.reload" },
|
||||||
action: "app.checkForUpdates",
|
{ type: "item", label: "Restart", action: "app.relaunch" },
|
||||||
enabled: "updater",
|
{ type: "item", label: "Export Logs...", command: "logs.export" },
|
||||||
},
|
|
||||||
{ type: "item", labelKey: "desktop.menu.settings", command: "settings.open", accelerator: { macos: "Cmd+," } },
|
|
||||||
{ type: "item", labelKey: "desktop.menu.reloadWebview", action: "view.reload" },
|
|
||||||
{ type: "item", labelKey: "desktop.menu.restart", action: "app.relaunch" },
|
|
||||||
{ type: "item", labelKey: "desktop.menu.exportLogs", command: "logs.export" },
|
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{ type: "item", role: "hide" },
|
{ type: "item", role: "hide" },
|
||||||
{ type: "item", role: "hideOthers" },
|
{ type: "item", role: "hideOthers" },
|
||||||
@@ -98,81 +91,46 @@ export const DESKTOP_MENU: DesktopMenu[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "file",
|
id: "file",
|
||||||
labelKey: "desktop.menu.file",
|
label: "File",
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.newSession",
|
label: "New Session",
|
||||||
command: "session.new",
|
command: "session.new",
|
||||||
accelerator: { macos: "Shift+Cmd+S" },
|
accelerator: { macos: "Shift+Cmd+S" },
|
||||||
},
|
},
|
||||||
|
{ type: "item", label: "Open Project...", command: "project.open", accelerator: { macos: "Cmd+O" } },
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.openProject",
|
label: "Settings",
|
||||||
command: "project.open",
|
|
||||||
accelerator: { macos: "Cmd+O" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.settings",
|
|
||||||
command: "settings.open",
|
command: "settings.open",
|
||||||
accelerator: { windows: "Ctrl+," },
|
accelerator: { windows: "Ctrl+," },
|
||||||
platforms: ["windows"],
|
platforms: ["windows"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.newWindow",
|
label: "New Window",
|
||||||
action: "window.new",
|
action: "window.new",
|
||||||
accelerator: { macos: "Cmd+Shift+N", windows: "Ctrl+Shift+N" },
|
accelerator: { macos: "Cmd+Shift+N", windows: "Ctrl+Shift+N" },
|
||||||
},
|
},
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{ type: "item", labelKey: "desktop.menu.closeWindow", action: "window.close", role: "close" },
|
{ type: "item", label: "Close Window", action: "window.close", role: "close" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "edit",
|
id: "edit",
|
||||||
labelKey: "desktop.menu.edit",
|
label: "Edit",
|
||||||
items: [
|
items: [
|
||||||
{
|
{ type: "item", label: "Undo", action: "edit.undo", role: "undo", accelerator: { windows: "Ctrl+Z" } },
|
||||||
type: "item",
|
{ type: "item", label: "Redo", action: "edit.redo", role: "redo", accelerator: { windows: "Ctrl+Y" } },
|
||||||
labelKey: "desktop.menu.undo",
|
|
||||||
action: "edit.undo",
|
|
||||||
role: "undo",
|
|
||||||
accelerator: { windows: "Ctrl+Z" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.redo",
|
|
||||||
action: "edit.redo",
|
|
||||||
role: "redo",
|
|
||||||
accelerator: { windows: "Ctrl+Y" },
|
|
||||||
},
|
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
|
{ type: "item", label: "Cut", action: "edit.cut", role: "cut", accelerator: { windows: "Ctrl+X" } },
|
||||||
|
{ type: "item", label: "Copy", action: "edit.copy", role: "copy", accelerator: { windows: "Ctrl+C" } },
|
||||||
|
{ type: "item", label: "Paste", action: "edit.paste", role: "paste", accelerator: { windows: "Ctrl+V" } },
|
||||||
|
{ type: "item", label: "Delete", action: "edit.delete" },
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.cut",
|
label: "Select All",
|
||||||
action: "edit.cut",
|
|
||||||
role: "cut",
|
|
||||||
accelerator: { windows: "Ctrl+X" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.copy",
|
|
||||||
action: "edit.copy",
|
|
||||||
role: "copy",
|
|
||||||
accelerator: { windows: "Ctrl+C" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.paste",
|
|
||||||
action: "edit.paste",
|
|
||||||
role: "paste",
|
|
||||||
accelerator: { windows: "Ctrl+V" },
|
|
||||||
},
|
|
||||||
{ type: "item", labelKey: "desktop.menu.delete", action: "edit.delete" },
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.selectAll",
|
|
||||||
action: "edit.selectAll",
|
action: "edit.selectAll",
|
||||||
role: "selectAll",
|
role: "selectAll",
|
||||||
accelerator: { windows: "Ctrl+A" },
|
accelerator: { windows: "Ctrl+A" },
|
||||||
@@ -181,84 +139,47 @@ export const DESKTOP_MENU: DesktopMenu[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "view",
|
id: "view",
|
||||||
labelKey: "desktop.menu.view",
|
label: "View",
|
||||||
items: [
|
items: [
|
||||||
{ type: "item", labelKey: "desktop.menu.toggleSidebar", command: "sidebar.toggle" },
|
{ type: "item", label: "Toggle Sidebar", command: "sidebar.toggle" },
|
||||||
{
|
{ type: "item", label: "Toggle Terminal", command: "terminal.toggle", accelerator: { macos: "Ctrl+`" } },
|
||||||
type: "item",
|
{ type: "item", label: "Toggle File Tree", command: "fileTree.toggle" },
|
||||||
labelKey: "desktop.menu.toggleTerminal",
|
|
||||||
command: "terminal.toggle",
|
|
||||||
accelerator: { macos: "Ctrl+`" },
|
|
||||||
},
|
|
||||||
{ type: "item", labelKey: "desktop.menu.toggleFileTree", command: "fileTree.toggle" },
|
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{ type: "item", labelKey: "desktop.menu.reload", action: "view.reload", role: "reload" },
|
{ type: "item", label: "Reload", action: "view.reload", role: "reload" },
|
||||||
{
|
{ type: "item", label: "Toggle Developer Tools", action: "view.toggleDevTools", role: "toggleDevTools" },
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.toggleDeveloperTools",
|
|
||||||
action: "view.toggleDevTools",
|
|
||||||
role: "toggleDevTools",
|
|
||||||
},
|
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.actualSize",
|
label: "Actual Size",
|
||||||
action: "view.resetZoom",
|
action: "view.resetZoom",
|
||||||
role: "resetZoom",
|
role: "resetZoom",
|
||||||
accelerator: { windows: "Ctrl+0" },
|
accelerator: { windows: "Ctrl+0" },
|
||||||
},
|
},
|
||||||
{
|
{ type: "item", label: "Zoom In", action: "view.zoomIn", role: "zoomIn", accelerator: { windows: "Ctrl++" } },
|
||||||
type: "item",
|
{ type: "item", label: "Zoom Out", action: "view.zoomOut", role: "zoomOut", accelerator: { windows: "Ctrl+-" } },
|
||||||
labelKey: "desktop.menu.zoomIn",
|
|
||||||
action: "view.zoomIn",
|
|
||||||
role: "zoomIn",
|
|
||||||
accelerator: { windows: "Ctrl++" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.zoomOut",
|
|
||||||
action: "view.zoomOut",
|
|
||||||
role: "zoomOut",
|
|
||||||
accelerator: { windows: "Ctrl+-" },
|
|
||||||
},
|
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{
|
{ type: "item", label: "Toggle Full Screen", action: "view.toggleFullscreen", role: "togglefullscreen" },
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.toggleFullScreen",
|
|
||||||
action: "view.toggleFullscreen",
|
|
||||||
role: "togglefullscreen",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "go",
|
id: "go",
|
||||||
labelKey: "desktop.menu.go",
|
label: "Go",
|
||||||
items: [
|
items: [
|
||||||
{ type: "item", labelKey: "desktop.menu.back", command: "common.goBack", accelerator: { macos: "Cmd+[" } },
|
{ type: "item", label: "Back", command: "common.goBack", accelerator: { macos: "Cmd+[" } },
|
||||||
{ type: "item", labelKey: "desktop.menu.forward", command: "common.goForward", accelerator: { macos: "Cmd+]" } },
|
{ type: "item", label: "Forward", command: "common.goForward", accelerator: { macos: "Cmd+]" } },
|
||||||
|
{ type: "separator" },
|
||||||
|
{ type: "item", label: "Previous Session", command: "session.previous", accelerator: { macos: "Option+Up" } },
|
||||||
|
{ type: "item", label: "Next Session", command: "session.next", accelerator: { macos: "Option+Down" } },
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.previousSession",
|
label: "Previous Project",
|
||||||
command: "session.previous",
|
|
||||||
accelerator: { macos: "Option+Up" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.nextSession",
|
|
||||||
command: "session.next",
|
|
||||||
accelerator: { macos: "Option+Down" },
|
|
||||||
},
|
|
||||||
{ type: "separator" },
|
|
||||||
{
|
|
||||||
type: "item",
|
|
||||||
labelKey: "desktop.menu.previousProject",
|
|
||||||
command: "project.previous",
|
command: "project.previous",
|
||||||
accelerator: { macos: "Cmd+Option+Up" },
|
accelerator: { macos: "Cmd+Option+Up" },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.nextProject",
|
label: "Next Project",
|
||||||
command: "project.next",
|
command: "project.next",
|
||||||
accelerator: { macos: "Cmd+Option+Down" },
|
accelerator: { macos: "Cmd+Option+Down" },
|
||||||
},
|
},
|
||||||
@@ -266,31 +187,31 @@ export const DESKTOP_MENU: DesktopMenu[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "window",
|
id: "window",
|
||||||
labelKey: "desktop.menu.window",
|
label: "Window",
|
||||||
role: "windowMenu",
|
role: "windowMenu",
|
||||||
items: [
|
items: [
|
||||||
{ type: "item", labelKey: "desktop.menu.minimize", action: "window.minimize" },
|
{ type: "item", label: "Minimize", action: "window.minimize" },
|
||||||
{ type: "item", labelKey: "desktop.menu.maximize", action: "window.toggleMaximize" },
|
{ type: "item", label: "Maximize", action: "window.toggleMaximize" },
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{ type: "item", labelKey: "desktop.menu.closeWindow", action: "window.close" },
|
{ type: "item", label: "Close Window", action: "window.close" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "help",
|
id: "help",
|
||||||
labelKey: "desktop.menu.help",
|
label: "Help",
|
||||||
items: [
|
items: [
|
||||||
{ type: "item", labelKey: "desktop.menu.documentation", href: "https://opencode.ai/docs" },
|
{ type: "item", label: "OpenCode Documentation", href: "https://opencode.ai/docs" },
|
||||||
{ type: "item", labelKey: "desktop.menu.supportForum", href: "https://discord.com/invite/opencode" },
|
{ type: "item", label: "Support Forum", href: "https://discord.com/invite/opencode" },
|
||||||
{ type: "item", labelKey: "desktop.menu.exportLogs", command: "logs.export" },
|
{ type: "item", label: "Export Logs...", command: "logs.export" },
|
||||||
{ type: "separator" },
|
{ type: "separator" },
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.shareFeedback",
|
label: "Share Feedback",
|
||||||
href: "https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml",
|
href: "https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "item",
|
type: "item",
|
||||||
labelKey: "desktop.menu.reportBug",
|
label: "Report a Bug",
|
||||||
href: "https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml",
|
href: "https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
+25
-28
@@ -3,7 +3,6 @@
|
|||||||
import * as Sentry from "@sentry/solid"
|
import * as Sentry from "@sentry/solid"
|
||||||
import { render } from "solid-js/web"
|
import { render } from "solid-js/web"
|
||||||
import { AppBaseProviders, AppInterface } from "@/app"
|
import { AppBaseProviders, AppInterface } from "@/app"
|
||||||
import { loadInitialLocale } from "@/context/language"
|
|
||||||
import { type Platform, PlatformProvider } from "@/context/platform"
|
import { type Platform, PlatformProvider } from "@/context/platform"
|
||||||
import { createBrowserDraftStore } from "@/utils/draft-store"
|
import { createBrowserDraftStore } from "@/utils/draft-store"
|
||||||
import { dict as en } from "@/i18n/en"
|
import { dict as en } from "@/i18n/en"
|
||||||
@@ -150,31 +149,29 @@ if (import.meta.env.VITE_SENTRY_DSN) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (root instanceof HTMLElement) {
|
if (root instanceof HTMLElement) {
|
||||||
void loadInitialLocale().then((locale) => {
|
const auth = authFromToken(new URLSearchParams(location.search).get("auth_token"))
|
||||||
const auth = authFromToken(new URLSearchParams(location.search).get("auth_token"))
|
clearAuthToken()
|
||||||
clearAuthToken()
|
const server: ServerConnection.Http = {
|
||||||
const server: ServerConnection.Http = {
|
type: "http",
|
||||||
type: "http",
|
authToken: !!auth,
|
||||||
authToken: !!auth,
|
http: {
|
||||||
http: {
|
url: getCurrentUrl(),
|
||||||
url: getCurrentUrl(),
|
...auth,
|
||||||
...auth,
|
},
|
||||||
},
|
}
|
||||||
}
|
render(
|
||||||
render(
|
() => (
|
||||||
() => (
|
<PlatformProvider value={platform}>
|
||||||
<PlatformProvider value={platform}>
|
<AppBaseProviders>
|
||||||
<AppBaseProviders locale={locale}>
|
<AppInterface
|
||||||
<AppInterface
|
defaultServer={ServerConnection.Key.make(getDefaultUrl())}
|
||||||
defaultServer={ServerConnection.Key.make(getDefaultUrl())}
|
canonicalLocalServer={ServerConnection.key(server)}
|
||||||
canonicalLocalServer={ServerConnection.key(server)}
|
servers={[server]}
|
||||||
servers={[server]}
|
disableHealthCheck
|
||||||
disableHealthCheck
|
/>
|
||||||
/>
|
</AppBaseProviders>
|
||||||
</AppBaseProviders>
|
</PlatformProvider>
|
||||||
</PlatformProvider>
|
),
|
||||||
),
|
root,
|
||||||
root,
|
)
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+82
-244
@@ -1,102 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "ملف",
|
|
||||||
"desktop.menu.edit": "تحرير",
|
|
||||||
"desktop.menu.view": "عرض",
|
|
||||||
"desktop.menu.go": "انتقال",
|
|
||||||
"desktop.menu.window": "نافذة",
|
|
||||||
"desktop.menu.help": "مساعدة",
|
|
||||||
"desktop.menu.checkForUpdates": "التحقق من وجود تحديثات...",
|
|
||||||
"desktop.menu.settings": "الإعدادات",
|
|
||||||
"desktop.menu.reloadWebview": "إعادة تحميل Webview",
|
|
||||||
"desktop.menu.restart": "إعادة التشغيل",
|
|
||||||
"desktop.menu.exportLogs": "تصدير السجلات...",
|
|
||||||
"desktop.menu.newSession": "جلسة جديدة",
|
|
||||||
"desktop.menu.openProject": "فتح مشروع...",
|
|
||||||
"desktop.menu.newWindow": "نافذة جديدة",
|
|
||||||
"desktop.menu.closeWindow": "إغلاق النافذة",
|
|
||||||
"desktop.menu.undo": "تراجع",
|
|
||||||
"desktop.menu.redo": "إعادة",
|
|
||||||
"desktop.menu.cut": "قص",
|
|
||||||
"desktop.menu.copy": "نسخ",
|
|
||||||
"desktop.menu.paste": "لصق",
|
|
||||||
"desktop.menu.delete": "حذف",
|
|
||||||
"desktop.menu.selectAll": "تحديد الكل",
|
|
||||||
"desktop.menu.toggleSidebar": "إظهار الشريط الجانبي أو إخفاؤه",
|
|
||||||
"desktop.menu.toggleTerminal": "إظهار المحطة الطرفية أو إخفاؤها",
|
|
||||||
"desktop.menu.toggleFileTree": "إظهار شجرة الملفات أو إخفاؤها",
|
|
||||||
"desktop.menu.reload": "إعادة التحميل",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "إظهار أدوات المطور أو إخفاؤها",
|
|
||||||
"desktop.menu.actualSize": "الحجم الفعلي",
|
|
||||||
"desktop.menu.zoomIn": "تكبير",
|
|
||||||
"desktop.menu.zoomOut": "تصغير",
|
|
||||||
"desktop.menu.toggleFullScreen": "الدخول إلى ملء الشاشة أو الخروج منه",
|
|
||||||
"desktop.menu.back": "رجوع",
|
|
||||||
"desktop.menu.forward": "تقدم",
|
|
||||||
"desktop.menu.previousSession": "الجلسة السابقة",
|
|
||||||
"desktop.menu.nextSession": "الجلسة التالية",
|
|
||||||
"desktop.menu.previousProject": "المشروع السابق",
|
|
||||||
"desktop.menu.nextProject": "المشروع التالي",
|
|
||||||
"desktop.menu.minimize": "تصغير النافذة",
|
|
||||||
"desktop.menu.maximize": "تكبير النافذة",
|
|
||||||
"desktop.menu.documentation": "وثائق OpenCode",
|
|
||||||
"desktop.menu.supportForum": "منتدى الدعم",
|
|
||||||
"desktop.menu.shareFeedback": "إرسال الملاحظات",
|
|
||||||
"desktop.menu.reportBug": "الإبلاغ عن خلل",
|
|
||||||
"desktop.menu.ariaLabel": "قائمة OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "فشل التحقق من وجود تحديثات.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "خطأ في التحديث",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "لديك أحدث إصدار.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "لا توجد تحديثات",
|
|
||||||
"desktop.updater.dialog.ready.message": "تم تنزيل التحديث {{version}}. هل تريد إعادة التشغيل الآن؟",
|
|
||||||
"desktop.updater.dialog.ready.title": "التحديث جاهز",
|
|
||||||
"desktop.updater.dialog.restart": "إعادة التشغيل",
|
|
||||||
"desktop.updater.dialog.later": "لاحقًا",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "إعادة تشغيل التطبيق",
|
|
||||||
"desktop.recovery.action.exportLogs": "تصدير السجلات",
|
|
||||||
"desktop.recovery.action.keepWaiting": "متابعة الانتظار",
|
|
||||||
"desktop.recovery.action.quit": "إنهاء",
|
|
||||||
"desktop.recovery.loadFailed": "فشل تحميل OpenCode",
|
|
||||||
"desktop.recovery.terminated": "توقفت نافذة OpenCode بشكل غير متوقع",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode لا يستجيب",
|
|
||||||
"desktop.recovery.unresponsive.detail": "يمكنك إعادة تشغيل التطبيق أو فتح السجلات أو متابعة الانتظار.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "النافذة: {{window}}\nعنوان URL: {{url}}\nالخطأ: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "النافذة: {{window}}\nالسبب: {{reason}}\nالرمز: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<غير معروف>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "اختيار مجلد",
|
|
||||||
"desktop.dialog.chooseFile": "اختيار ملف",
|
|
||||||
"desktop.dialog.saveFile": "حفظ الملف",
|
|
||||||
"desktop.dialog.files": "الملفات",
|
|
||||||
"desktop.server.local": "الخادم المحلي",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "لا يتوفر WSL إلا على Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL غير متاح",
|
|
||||||
"desktop.wsl.error.listInstalled": "فشل سرد توزيعات WSL المثبتة",
|
|
||||||
"desktop.wsl.error.listOnline": "فشل سرد توزيعات WSL المتاحة عبر الإنترنت",
|
|
||||||
"desktop.wsl.error.executeDistro": "تعذر تنفيذ الأوامر في التوزيعة",
|
|
||||||
"desktop.wsl.error.installWsl": "فشل تثبيت WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "فشل تثبيت التوزيعة: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "فشل تثبيت OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "تمت إضافة {{distro}} بالفعل",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode غير مثبت في هذه التوزيعة",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode مثبت، لكن تعذر تشغيله",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode غير مثبت في {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"اكتمل تحديث OpenCode، لكن {{distro}} ما زالت تعرض الإصدار {{installed}}؛ الإصدار المتوقع هو {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "لا يوجد إصدار",
|
|
||||||
"desktop.wsl.error.serverExited": "خرج خادم WSL بعد بدء التشغيل (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"خرج خادم WSL قبل أن يصبح سليمًا (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout": "انتهت مهلة فحص سلامة العملية المصاحبة للتوزيعة {{distro}} بعد {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "انتهت مهلة {{command}} {{args}} بعد {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.failedPort": "فشل الحصول على المنفذ",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "لم يحدد منتقي الملفات ملفًا",
|
|
||||||
"desktop.picker.error.sizeLimit": "تتجاوز المرفقات المحددة الحد البالغ {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "مقترح",
|
"command.category.suggested": "مقترح",
|
||||||
"command.category.view": "عرض",
|
"command.category.view": "عرض",
|
||||||
"command.category.project": "مشروع",
|
"command.category.project": "مشروع",
|
||||||
@@ -114,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "أذونات",
|
"command.category.permissions": "أذونات",
|
||||||
"command.category.workspace": "مساحة عمل",
|
"command.category.workspace": "مساحة عمل",
|
||||||
"command.category.settings": "إعدادات",
|
"command.category.settings": "إعدادات",
|
||||||
"command.logs.export": "تصدير السجلات",
|
|
||||||
"theme.scheme.system": "نظام",
|
"theme.scheme.system": "نظام",
|
||||||
"theme.scheme.light": "فاتح",
|
"theme.scheme.light": "فاتح",
|
||||||
"theme.scheme.dark": "داكن",
|
"theme.scheme.dark": "داكن",
|
||||||
@@ -158,16 +59,16 @@ export const dict = {
|
|||||||
"command.message.next.description": "انتقل إلى رسالة المستخدم التالية",
|
"command.message.next.description": "انتقل إلى رسالة المستخدم التالية",
|
||||||
"command.model.choose": "اختيار نموذج",
|
"command.model.choose": "اختيار نموذج",
|
||||||
"command.model.choose.description": "حدد نموذجًا مختلفًا",
|
"command.model.choose.description": "حدد نموذجًا مختلفًا",
|
||||||
"command.mcp.toggle": "تبديل خوادم MCP",
|
"command.mcp.toggle": "تبديل MCPs",
|
||||||
"command.mcp.toggle.description": "تبديل خوادم MCP",
|
"command.mcp.toggle.description": "تبديل MCPs",
|
||||||
"command.agent.cycle": "تغيير الوكيل",
|
"command.agent.cycle": "تغيير الوكيل",
|
||||||
"command.agent.cycle.description": "التبديل إلى الوكيل التالي",
|
"command.agent.cycle.description": "التبديل إلى الوكيل التالي",
|
||||||
"command.agent.cycle.reverse": "تغيير الوكيل للخلف",
|
"command.agent.cycle.reverse": "تغيير الوكيل للخلف",
|
||||||
"command.agent.cycle.reverse.description": "التبديل إلى الوكيل السابق",
|
"command.agent.cycle.reverse.description": "التبديل إلى الوكيل السابق",
|
||||||
"command.model.variant.cycle": "تغيير جهد الاستدلال",
|
"command.model.variant.cycle": "تغيير جهد التفكير",
|
||||||
"command.model.variant.cycle.description": "التبديل إلى مستوى الجهد التالي",
|
"command.model.variant.cycle.description": "التبديل إلى مستوى الجهد التالي",
|
||||||
"command.prompt.mode.shell": "Shell",
|
"command.prompt.mode.shell": "Shell",
|
||||||
"command.prompt.mode.normal": "موجّه",
|
"command.prompt.mode.normal": "Prompt",
|
||||||
"command.permissions.autoaccept.enable": "قبول الأذونات تلقائيًا",
|
"command.permissions.autoaccept.enable": "قبول الأذونات تلقائيًا",
|
||||||
"command.permissions.autoaccept.disable": "إيقاف قبول الأذونات تلقائيًا",
|
"command.permissions.autoaccept.disable": "إيقاف قبول الأذونات تلقائيًا",
|
||||||
"command.workspace.toggle": "تبديل مساحات العمل",
|
"command.workspace.toggle": "تبديل مساحات العمل",
|
||||||
@@ -184,9 +85,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "مشاركة هذه الجلسة ونسخ الرابط إلى الحافظة",
|
"command.session.share.description": "مشاركة هذه الجلسة ونسخ الرابط إلى الحافظة",
|
||||||
"command.session.unshare": "إلغاء مشاركة الجلسة",
|
"command.session.unshare": "إلغاء مشاركة الجلسة",
|
||||||
"command.session.unshare.description": "إيقاف مشاركة هذه الجلسة",
|
"command.session.unshare.description": "إيقاف مشاركة هذه الجلسة",
|
||||||
"command.session.export": "تصدير الجلسة",
|
|
||||||
"command.session.export.description": "تصدير النص الكامل للجلسة بصيغة JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "البحث في الملفات والأوامر والجلسات",
|
"palette.search.placeholder": "البحث في الملفات والأوامر والجلسات",
|
||||||
"palette.search.placeholder.home": "البحث في الأوامر والجلسات",
|
"palette.search.placeholder.home": "البحث في الأوامر والجلسات",
|
||||||
"palette.empty": "لا توجد نتائج",
|
"palette.empty": "لا توجد نتائج",
|
||||||
@@ -196,14 +94,13 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "لم يتم العثور على موفرين",
|
"dialog.provider.empty": "لم يتم العثور على موفرين",
|
||||||
"dialog.provider.group.popular": "شائع",
|
"dialog.provider.group.popular": "شائع",
|
||||||
"dialog.provider.group.other": "آخر",
|
"dialog.provider.group.other": "آخر",
|
||||||
"dialog.provider.custom.label": "موفر مخصص متوافق مع OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "موصى به",
|
"dialog.provider.tag.recommended": "موصى به",
|
||||||
"dialog.provider.opencode.note": "نماذج مختارة تتضمن Claude و GPT و Gemini والمزيد",
|
"dialog.provider.opencode.note": "نماذج مختارة تتضمن Claude و GPT و Gemini والمزيد",
|
||||||
"dialog.provider.opencode.tagline": "نماذج موثوقة ومحسنة",
|
"dialog.provider.opencode.tagline": "نماذج موثوقة ومحسنة",
|
||||||
"dialog.provider.opencodeGo.tagline": "اشتراك منخفض التكلفة للجميع",
|
"dialog.provider.opencodeGo.tagline": "اشتراك منخفض التكلفة للجميع",
|
||||||
"dialog.provider.anthropic.note": "وصول مباشر إلى نماذج Claude، بما فيها Pro و Max",
|
"dialog.provider.anthropic.note": "اتصل باستخدام Claude Pro/Max أو مفتاح API",
|
||||||
"dialog.provider.copilot.note": "نماذج ذكاء اصطناعي للمساعدة في البرمجة عبر GitHub Copilot",
|
"dialog.provider.copilot.note": "اتصل باستخدام Copilot أو مفتاح API",
|
||||||
"dialog.provider.openai.note": "نماذج GPT لمهام الذكاء الاصطناعي العامة السريعة والمتقدمة",
|
"dialog.provider.openai.note": "اتصل باستخدام ChatGPT Pro/Plus أو مفتاح API",
|
||||||
"dialog.provider.google.note": "نماذج Gemini لاستجابات سريعة ومنظمة",
|
"dialog.provider.google.note": "نماذج Gemini لاستجابات سريعة ومنظمة",
|
||||||
"dialog.provider.openrouter.note": "الوصول إلى جميع النماذج المدعومة من موفر واحد",
|
"dialog.provider.openrouter.note": "الوصول إلى جميع النماذج المدعومة من موفر واحد",
|
||||||
"dialog.provider.vercel.note": "وصول موحد إلى نماذج الذكاء الاصطناعي مع توجيه ذكي",
|
"dialog.provider.vercel.note": "وصول موحد إلى نماذج الذكاء الاصطناعي مع توجيه ذكي",
|
||||||
@@ -215,20 +112,17 @@ export const dict = {
|
|||||||
"dialog.model.manage.provider.toggle": "تبديل جميع نماذج {{provider}}",
|
"dialog.model.manage.provider.toggle": "تبديل جميع نماذج {{provider}}",
|
||||||
"dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode",
|
"dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين",
|
"dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "عرض أكثر من 70 موفرًا إضافيًا",
|
|
||||||
"dialog.provider.viewAll": "عرض المزيد من الموفرين",
|
"dialog.provider.viewAll": "عرض المزيد من الموفرين",
|
||||||
"provider.connect.title": "الاتصال بـ {{provider}}",
|
"provider.connect.title": "اتصال {{provider}}",
|
||||||
"provider.connect.title.anthropicProMax": "تسجيل الدخول باستخدام Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "تسجيل الدخول باستخدام Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "حدد طريقة تسجيل الدخول لـ {{provider}}.",
|
"provider.connect.selectMethod": "حدد طريقة تسجيل الدخول لـ {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "مفتاح API",
|
"provider.connect.method.apiKey": "مفتاح API",
|
||||||
"provider.connect.method.browser": "المتصفح",
|
|
||||||
"provider.connect.method.headless": "بدون واجهة رسومية",
|
|
||||||
"provider.connect.status.inProgress": "جارٍ التفويض...",
|
"provider.connect.status.inProgress": "جارٍ التفويض...",
|
||||||
"provider.connect.status.waiting": "في انتظار التفويض...",
|
"provider.connect.status.waiting": "في انتظار التفويض...",
|
||||||
"provider.connect.status.failed": "فشل التفويض: {{error}}",
|
"provider.connect.status.failed": "فشل التفويض: {{error}}",
|
||||||
"provider.connect.apiKey.description":
|
"provider.connect.apiKey.description":
|
||||||
"أدخل مفتاح API الخاص بـ {{provider}} لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
|
"أدخل مفتاح واجهة برمجة تطبيقات {{provider}} الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
|
||||||
"provider.connect.apiKey.label": "مفتاح API لـ {{provider}}",
|
"provider.connect.apiKey.label": "مفتاح واجهة برمجة تطبيقات {{provider}}",
|
||||||
"provider.connect.apiKey.placeholder": "مفتاح API",
|
"provider.connect.apiKey.placeholder": "مفتاح API",
|
||||||
"provider.connect.apiKey.required": "مفتاح API مطلوب",
|
"provider.connect.apiKey.required": "مفتاح API مطلوب",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
@@ -254,7 +148,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "تم توصيل {{provider}}",
|
"provider.connect.toast.connected.title": "تم توصيل {{provider}}",
|
||||||
"provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.",
|
"provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.",
|
||||||
"provider.custom.title": "موفر مخصص",
|
"provider.custom.title": "موفر مخصص",
|
||||||
"provider.custom.unavailable": "الموفرون المخصصون غير متاحين على هذا الخادم",
|
|
||||||
"provider.custom.description.prefix": "تكوين موفر متوافق مع OpenAI. راجع ",
|
"provider.custom.description.prefix": "تكوين موفر متوافق مع OpenAI. راجع ",
|
||||||
"provider.custom.description.link": "وثائق تكوين الموفر",
|
"provider.custom.description.link": "وثائق تكوين الموفر",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -303,26 +196,26 @@ export const dict = {
|
|||||||
"model.input.image": "صورة",
|
"model.input.image": "صورة",
|
||||||
"model.input.audio": "صوت",
|
"model.input.audio": "صوت",
|
||||||
"model.input.video": "فيديو",
|
"model.input.video": "فيديو",
|
||||||
"model.input.pdf": "PDF",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "يسمح: {{inputs}}",
|
"model.tooltip.allows": "يسمح: {{inputs}}",
|
||||||
"model.tooltip.context.label": "السياق",
|
"model.tooltip.context.label": "السياق",
|
||||||
"model.tooltip.inputs": "المدخلات",
|
"model.tooltip.inputs": "المدخلات",
|
||||||
"model.tooltip.model": "النموذج",
|
"model.tooltip.model": "النموذج",
|
||||||
"model.tooltip.provider": "الموفر",
|
"model.tooltip.provider": "الموفر",
|
||||||
"model.tooltip.reasoning": "الاستدلال",
|
"model.tooltip.reasoning": "الاستنتاج",
|
||||||
"model.tooltip.reasoning.allowed": "يدعم الاستدلال",
|
"model.tooltip.reasoning.allowed": "يسمح بالاستنتاج",
|
||||||
"model.tooltip.reasoning.none": "بدون استدلال",
|
"model.tooltip.reasoning.none": "بدون استنتاج",
|
||||||
"model.tooltip.context": "حد السياق {{limit}}",
|
"model.tooltip.context": "حد السياق {{limit}}",
|
||||||
"common.search.placeholder": "بحث",
|
"common.search.placeholder": "بحث",
|
||||||
"common.goBack": "رجوع",
|
"common.goBack": "رجوع",
|
||||||
"common.goForward": "التقدم",
|
"common.goForward": "انتقل للأمام",
|
||||||
"common.loading": "جارٍ التحميل",
|
"common.loading": "جارٍ التحميل",
|
||||||
"common.loading.ellipsis": "...",
|
"common.loading.ellipsis": "...",
|
||||||
"common.cancel": "إلغاء",
|
"common.cancel": "إلغاء",
|
||||||
"common.clear": "مسح",
|
"common.clear": "مسح",
|
||||||
"common.connect": "اتصال",
|
"common.connect": "اتصال",
|
||||||
"common.disconnect": "قطع الاتصال",
|
"common.disconnect": "قطع الاتصال",
|
||||||
"common.continue": "متابعة",
|
"common.continue": "إرسال",
|
||||||
"common.submit": "إرسال",
|
"common.submit": "إرسال",
|
||||||
"common.save": "حفظ",
|
"common.save": "حفظ",
|
||||||
"common.saving": "جارٍ الحفظ...",
|
"common.saving": "جارٍ الحفظ...",
|
||||||
@@ -334,7 +227,7 @@ export const dict = {
|
|||||||
"prompt.placeholder.summarizeComments": "لخّص التعليقات…",
|
"prompt.placeholder.summarizeComments": "لخّص التعليقات…",
|
||||||
"prompt.placeholder.summarizeComment": "لخّص التعليق…",
|
"prompt.placeholder.summarizeComment": "لخّص التعليق…",
|
||||||
"prompt.mode.shell": "Shell",
|
"prompt.mode.shell": "Shell",
|
||||||
"prompt.mode.normal": "موجّه",
|
"prompt.mode.normal": "Prompt",
|
||||||
"prompt.mode.shell.exit": "esc للخروج",
|
"prompt.mode.shell.exit": "esc للخروج",
|
||||||
"session.child.promptDisabled": "لا يمكن إرسال موجّهات إلى جلسات الوكلاء الفرعيين.",
|
"session.child.promptDisabled": "لا يمكن إرسال موجّهات إلى جلسات الوكلاء الفرعيين.",
|
||||||
"session.child.backToParent": "العودة إلى الجلسة الرئيسية.",
|
"session.child.backToParent": "العودة إلى الجلسة الرئيسية.",
|
||||||
@@ -356,17 +249,17 @@ export const dict = {
|
|||||||
"prompt.example.16": "إضافة معالجة الأخطاء لهذه الدالة",
|
"prompt.example.16": "إضافة معالجة الأخطاء لهذه الدالة",
|
||||||
"prompt.example.17": "اشرح نمط regex هذا",
|
"prompt.example.17": "اشرح نمط regex هذا",
|
||||||
"prompt.example.18": "تحويل هذا إلى TypeScript",
|
"prompt.example.18": "تحويل هذا إلى TypeScript",
|
||||||
"prompt.example.19": "إضافة التسجيل في جميع أنحاء قاعدة التعليمات البرمجية",
|
"prompt.example.19": "إضافة تسجيل الدخول (logging) في جميع أنحاء قاعدة التعليمات البرمجية",
|
||||||
"prompt.example.20": "ما هي التبعيات القديمة؟",
|
"prompt.example.20": "ما هي التبعيات القديمة؟",
|
||||||
"prompt.example.21": "ساعدني في كتابة برنامج نصي للترحيل",
|
"prompt.example.21": "ساعدني في كتابة برنامج نصي للهجرة",
|
||||||
"prompt.example.22": "تنفيذ التخزين المؤقت لنقطة النهاية هذه",
|
"prompt.example.22": "تنفيذ التخزين المؤقت لهذه النقطة النهائية",
|
||||||
"prompt.example.23": "إضافة ترقيم الصفحات إلى هذه القائمة",
|
"prompt.example.23": "إضافة ترقيم الصفحات إلى هذه القائمة",
|
||||||
"prompt.example.24": "إنشاء أمر CLI لـ...",
|
"prompt.example.24": "إنشاء أمر CLI لـ...",
|
||||||
"prompt.example.25": "كيف تعمل متغيرات البيئة هنا؟",
|
"prompt.example.25": "كيف تعمل متغيرات البيئة هنا؟",
|
||||||
"prompt.popover.emptyResults": "لا توجد نتائج مطابقة",
|
"prompt.popover.emptyResults": "لا توجد نتائج مطابقة",
|
||||||
"prompt.popover.emptyCommands": "لا توجد أوامر مطابقة",
|
"prompt.popover.emptyCommands": "لا توجد أوامر مطابقة",
|
||||||
"prompt.dropzone.label": "أفلت الصور أو ملفات PDF أو الملفات النصية هنا",
|
"prompt.dropzone.label": "أفلت الصور أو ملفات PDF أو الملفات النصية هنا",
|
||||||
"prompt.dropzone.file.label": "أفلت الملف للإشارة إليه باستخدام @",
|
"prompt.dropzone.file.label": "أفلت لإشارة @ للملف",
|
||||||
"prompt.slash.badge.custom": "مخصص",
|
"prompt.slash.badge.custom": "مخصص",
|
||||||
"prompt.slash.badge.skill": "مهارة",
|
"prompt.slash.badge.skill": "مهارة",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
@@ -374,7 +267,7 @@ export const dict = {
|
|||||||
"prompt.context.includeActiveFile": "تضمين الملف النشط",
|
"prompt.context.includeActiveFile": "تضمين الملف النشط",
|
||||||
"prompt.context.removeActiveFile": "إزالة الملف النشط من السياق",
|
"prompt.context.removeActiveFile": "إزالة الملف النشط من السياق",
|
||||||
"prompt.context.removeFile": "إزالة الملف من السياق",
|
"prompt.context.removeFile": "إزالة الملف من السياق",
|
||||||
"prompt.action.attachFile": "إضافة ملفات",
|
"prompt.action.attachFile": "إرفاق ملف",
|
||||||
"prompt.menu.addImagesAndFiles": "إضافة ملفات والمزيد",
|
"prompt.menu.addImagesAndFiles": "إضافة ملفات والمزيد",
|
||||||
"prompt.menu.imagesAndFiles": "الصور والملفات",
|
"prompt.menu.imagesAndFiles": "الصور والملفات",
|
||||||
"prompt.menu.commands": "الأوامر",
|
"prompt.menu.commands": "الأوامر",
|
||||||
@@ -382,7 +275,7 @@ export const dict = {
|
|||||||
"prompt.menu.shellCommand": "أمر shell",
|
"prompt.menu.shellCommand": "أمر shell",
|
||||||
"prompt.attachment.remove": "إزالة المرفق",
|
"prompt.attachment.remove": "إزالة المرفق",
|
||||||
"prompt.action.send": "إرسال",
|
"prompt.action.send": "إرسال",
|
||||||
"prompt.action.stop": "إيقاف",
|
"prompt.action.stop": "توقف",
|
||||||
"prompt.toast.pasteUnsupported.title": "مرفق غير مدعوم",
|
"prompt.toast.pasteUnsupported.title": "مرفق غير مدعوم",
|
||||||
"prompt.toast.attachmentDuplicate.title": "تم تحميل هذا الملف بالفعل",
|
"prompt.toast.attachmentDuplicate.title": "تم تحميل هذا الملف بالفعل",
|
||||||
"prompt.toast.pasteUnsupported.description": "يمكن إرفاق الصور أو ملفات PDF أو الملفات النصية فقط هنا.",
|
"prompt.toast.pasteUnsupported.description": "يمكن إرفاق الصور أو ملفات PDF أو الملفات النصية فقط هنا.",
|
||||||
@@ -394,10 +287,10 @@ export const dict = {
|
|||||||
"prompt.toast.commandSendFailed.title": "فشل إرسال الأمر",
|
"prompt.toast.commandSendFailed.title": "فشل إرسال الأمر",
|
||||||
"prompt.toast.promptSendFailed.title": "فشل إرسال الموجه",
|
"prompt.toast.promptSendFailed.title": "فشل إرسال الموجه",
|
||||||
"prompt.toast.promptSendFailed.description": "تعذر استرداد الجلسة",
|
"prompt.toast.promptSendFailed.description": "تعذر استرداد الجلسة",
|
||||||
"dialog.mcp.title": "خوادم MCP",
|
"dialog.mcp.title": "MCPs",
|
||||||
"dialog.mcp.description": "تم تفعيل {{enabled}} من أصل {{total}}",
|
"dialog.mcp.description": "{{enabled}} من {{total}} مفعل",
|
||||||
"dialog.mcp.empty": "لم يتم تكوين أي خوادم MCP",
|
"dialog.mcp.empty": "لم يتم تكوين MCPs",
|
||||||
"dialog.lsp.empty": "تُكتشف خوادم LSP تلقائيًا من أنواع الملفات",
|
"dialog.lsp.empty": "تم الكشف تلقائيًا عن LSPs من أنواع الملفات",
|
||||||
"dialog.plugins.empty": "الإضافات المكونة في opencode.json",
|
"dialog.plugins.empty": "الإضافات المكونة في opencode.json",
|
||||||
"mcp.status.connected": "متصل",
|
"mcp.status.connected": "متصل",
|
||||||
"mcp.status.failed": "فشل",
|
"mcp.status.failed": "فشل",
|
||||||
@@ -508,21 +401,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.desktopVersion": "سطح المكتب {{version}}",
|
"wsl.onboarding.desktopVersion": "سطح المكتب {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "لا يتطابق الإصدار المثبت مع إصدار تطبيق سطح المكتب.",
|
"wsl.onboarding.versionMismatch": "لا يتطابق الإصدار المثبت مع إصدار تطبيق سطح المكتب.",
|
||||||
"wsl.onboarding.adding": "جارٍ الإضافة...",
|
"wsl.onboarding.adding": "جارٍ الإضافة...",
|
||||||
"help.tabs.toast.ariaLabel": "نقدّم علامات التبويب. نظّم عملك وجلساتك النشطة باستخدام علامات التبويب",
|
|
||||||
"help.tabs.toast.dismiss": "إغلاق معلومات علامات التبويب",
|
|
||||||
"help.tabs.title": "نقدّم علامات التبويب",
|
|
||||||
"help.tabs.description": "نظّم عملك وجلساتك النشطة باستخدام علامات التبويب",
|
|
||||||
"help.tabs.date": "14 يوليو",
|
|
||||||
"help.tabs.introduction": "أصبح OpenCode Desktop الآن قائمًا على علامات التبويب.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"ابدأ جلسة جديدة في علامة تبويب، أو افتح جلسة حالية من أي من مشاريعك. افتح علامة تبويب جديدة عندما تبدأ عملاً جديدًا، وأغلقها عند الانتهاء.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"يسهّل إبقاء بضع علامات تبويب مفتوحة تنظيم جلساتك النشطة. أعد تسمية علامات التبويب بأسماء يسهل تذكرها إذا كنت تنوي إبقاءها مفتوحة.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"ستجد جميع جلساتك ومشاريعك في شاشة الصفحة الرئيسية الجديدة. يؤدي تحديد جلسة إلى فتحها في علامة تبويب.",
|
|
||||||
"help.tabs.persistence": "عندما تعيد فتح التطبيق، تظل علامات تبويبك مفتوحة.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"لا يدعم التصميم الجديد أشجار عمل Git حتى الآن، وستتوفر قريبًا. لذلك، إذا كنت تفضل مواصلة استخدام التخطيط السابق، فيمكنك التبديل بين التخطيطات في الإعدادات. ضع في اعتبارك أن التخطيط الجديد سيصبح دائمًا خلال بضعة أسابيع.",
|
|
||||||
"dialog.project.edit.title": "تحرير المشروع",
|
"dialog.project.edit.title": "تحرير المشروع",
|
||||||
"dialog.project.edit.name": "الاسم",
|
"dialog.project.edit.name": "الاسم",
|
||||||
"dialog.project.edit.icon": "أيقونة",
|
"dialog.project.edit.icon": "أيقونة",
|
||||||
@@ -531,39 +409,35 @@ export const dict = {
|
|||||||
"dialog.project.edit.icon.recommended": "موصى به: 128x128px",
|
"dialog.project.edit.icon.recommended": "موصى به: 128x128px",
|
||||||
"dialog.project.edit.color": "لون",
|
"dialog.project.edit.color": "لون",
|
||||||
"dialog.project.edit.color.select": "اختر لون {{color}}",
|
"dialog.project.edit.color.select": "اختر لون {{color}}",
|
||||||
"dialog.project.edit.worktree.startup": "برنامج نصي لبدء تشغيل مساحة العمل",
|
"dialog.project.edit.worktree.startup": "سكريبت بدء تشغيل مساحة العمل",
|
||||||
"dialog.project.edit.worktree.startup.description": "يتم تشغيله بعد إنشاء مساحة عمل جديدة (شجرة عمل).",
|
"dialog.project.edit.worktree.startup.description": "يتم تشغيله بعد إنشاء مساحة عمل جديدة (شجرة عمل).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "مثال: bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "مثال: bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "عدم الإظهار مرة أخرى",
|
|
||||||
|
|
||||||
"context.breakdown.title": "تفصيل السياق",
|
"context.breakdown.title": "تفصيل السياق",
|
||||||
"context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال المميزة. يشمل "أخرى" تعريفات الأدوات والأعباء الإضافية.',
|
"context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال. يشمل "أخرى" تعريفات الأدوات والنفقات العامة.',
|
||||||
"context.breakdown.system": "النظام",
|
"context.breakdown.system": "النظام",
|
||||||
"context.breakdown.user": "المستخدم",
|
"context.breakdown.user": "المستخدم",
|
||||||
"context.breakdown.assistant": "المساعد",
|
"context.breakdown.assistant": "المساعد",
|
||||||
"context.breakdown.tool": "استدعاءات الأدوات",
|
"context.breakdown.tool": "استدعاءات الأداة",
|
||||||
"context.breakdown.other": "أخرى",
|
"context.breakdown.other": "أخرى",
|
||||||
"context.systemPrompt.title": "موجّه النظام",
|
"context.systemPrompt.title": "موجه النظام",
|
||||||
"context.rawMessages.title": "الرسائل الخام",
|
"context.rawMessages.title": "الرسائل الخام",
|
||||||
"context.export.session": "تصدير الجلسة",
|
|
||||||
|
|
||||||
"context.stats.session": "جلسة",
|
"context.stats.session": "جلسة",
|
||||||
"context.stats.messages": "رسائل",
|
"context.stats.messages": "رسائل",
|
||||||
"context.stats.provider": "موفر",
|
"context.stats.provider": "موفر",
|
||||||
"context.stats.model": "نموذج",
|
"context.stats.model": "نموذج",
|
||||||
"context.stats.limit": "حد السياق",
|
"context.stats.limit": "حد السياق",
|
||||||
"context.stats.totalTokens": "إجمالي الرموز المميزة",
|
"context.stats.totalTokens": "إجمالي الرموز",
|
||||||
"context.stats.usage": "استخدام",
|
"context.stats.usage": "استخدام",
|
||||||
"context.stats.inputTokens": "رموز الإدخال المميزة",
|
"context.stats.inputTokens": "رموز الإدخال",
|
||||||
"context.stats.outputTokens": "رموز الإخراج المميزة",
|
"context.stats.outputTokens": "رموز الإخراج",
|
||||||
"context.stats.reasoningTokens": "رموز الاستدلال المميزة",
|
"context.stats.reasoningTokens": "رموز الاستنتاج",
|
||||||
"context.stats.cacheTokens": "رموز التخزين المؤقت المميزة (قراءة/كتابة)",
|
"context.stats.cacheTokens": "رموز التخزين المؤقت (قراءة/كتابة)",
|
||||||
"context.stats.userMessages": "رسائل المستخدم",
|
"context.stats.userMessages": "رسائل المستخدم",
|
||||||
"context.stats.assistantMessages": "رسائل المساعد",
|
"context.stats.assistantMessages": "رسائل المساعد",
|
||||||
"context.stats.totalCost": "التكلفة الإجمالية",
|
"context.stats.totalCost": "التكلفة الإجمالية",
|
||||||
"context.stats.sessionCreated": "تم إنشاء الجلسة",
|
"context.stats.sessionCreated": "تم إنشاء الجلسة",
|
||||||
"context.stats.lastActivity": "آخر نشاط",
|
"context.stats.lastActivity": "آخر نشاط",
|
||||||
"context.usage.tokens": "الرموز المميزة",
|
"context.usage.tokens": "رموز",
|
||||||
"context.usage.usage": "استخدام",
|
"context.usage.usage": "استخدام",
|
||||||
"context.usage.cost": "تكلفة",
|
"context.usage.cost": "تكلفة",
|
||||||
"context.usage.clickToView": "انقر لعرض السياق",
|
"context.usage.clickToView": "انقر لعرض السياق",
|
||||||
@@ -591,9 +465,9 @@ export const dict = {
|
|||||||
"toast.theme.title": "تم تبديل السمة",
|
"toast.theme.title": "تم تبديل السمة",
|
||||||
"toast.scheme.title": "مخطط الألوان",
|
"toast.scheme.title": "مخطط الألوان",
|
||||||
"toast.workspace.enabled.title": "تم تمكين مساحات العمل",
|
"toast.workspace.enabled.title": "تم تمكين مساحات العمل",
|
||||||
"toast.workspace.enabled.description": "تُعرض الآن عدة أشجار عمل في الشريط الجانبي",
|
"toast.workspace.enabled.description": "الآن يتم عرض عدة worktrees في الشريط الجانبي",
|
||||||
"toast.workspace.disabled.title": "تم تعطيل مساحات العمل",
|
"toast.workspace.disabled.title": "تم تعطيل مساحات العمل",
|
||||||
"toast.workspace.disabled.description": "تُعرض شجرة العمل الرئيسية فقط في الشريط الجانبي",
|
"toast.workspace.disabled.description": "يتم عرض worktree الرئيسي فقط في الشريط الجانبي",
|
||||||
"toast.permissions.autoaccept.on.title": "يتم قبول الأذونات تلقائيًا",
|
"toast.permissions.autoaccept.on.title": "يتم قبول الأذونات تلقائيًا",
|
||||||
"toast.permissions.autoaccept.on.description": "ستتم الموافقة على طلبات الأذونات تلقائيًا",
|
"toast.permissions.autoaccept.on.description": "ستتم الموافقة على طلبات الأذونات تلقائيًا",
|
||||||
"toast.permissions.autoaccept.off.title": "تم إيقاف قبول الأذونات تلقائيًا",
|
"toast.permissions.autoaccept.off.title": "تم إيقاف قبول الأذونات تلقائيًا",
|
||||||
@@ -613,14 +487,9 @@ export const dict = {
|
|||||||
"toast.session.unshare.success.description": "تم إلغاء مشاركة الجلسة بنجاح!",
|
"toast.session.unshare.success.description": "تم إلغاء مشاركة الجلسة بنجاح!",
|
||||||
"toast.session.unshare.failed.title": "فشل إلغاء مشاركة الجلسة",
|
"toast.session.unshare.failed.title": "فشل إلغاء مشاركة الجلسة",
|
||||||
"toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة",
|
"toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة",
|
||||||
"toast.session.export.success.title": "تم تصدير الجلسة",
|
|
||||||
"toast.session.export.success.description": "تم حفظ الجلسة في \u2068{{filename}}\u2069",
|
|
||||||
"toast.session.export.failed.title": "فشل تصدير الجلسة",
|
|
||||||
"toast.session.export.failed.description": "حدث خطأ أثناء تصدير الجلسة",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}",
|
"toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}",
|
||||||
"toast.update.title": "تحديث متاح",
|
"toast.update.title": "تحديث متاح",
|
||||||
"toast.update.description": "يتوفر الآن إصدار جديد من OpenCode ({{version}}) للتثبيت.",
|
"toast.update.description": "نسخة جديدة من OpenCode ({{version}}) متاحة الآن للتثبيت.",
|
||||||
"toast.update.action.installRestart": "تثبيت وإعادة تشغيل",
|
"toast.update.action.installRestart": "تثبيت وإعادة تشغيل",
|
||||||
"toast.update.action.notYet": "ليس الآن",
|
"toast.update.action.notYet": "ليس الآن",
|
||||||
"error.page.title": "حدث خطأ ما",
|
"error.page.title": "حدث خطأ ما",
|
||||||
@@ -640,7 +509,7 @@ export const dict = {
|
|||||||
"error.dev.rootNotFound":
|
"error.dev.rootNotFound":
|
||||||
"لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
|
"لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
|
||||||
"error.serverSync.connectFailed": "تعذر الاتصال بالخادم. هل هناك خادم يعمل في `{{url}}`؟",
|
"error.serverSync.connectFailed": "تعذر الاتصال بالخادم. هل هناك خادم يعمل في `{{url}}`؟",
|
||||||
"directory.error.invalidUrl": "مجلد غير صالح في عنوان URL.",
|
"directory.error.invalidUrl": "دليل غير صالح في عنوان URL.",
|
||||||
"error.chain.unknown": "خطأ غير معروف",
|
"error.chain.unknown": "خطأ غير معروف",
|
||||||
"error.chain.causedBy": "بسبب:",
|
"error.chain.causedBy": "بسبب:",
|
||||||
"error.chain.apiError": "خطأ API",
|
"error.chain.apiError": "خطأ API",
|
||||||
@@ -668,7 +537,7 @@ export const dict = {
|
|||||||
"notification.session.responseReady.title": "الاستجابة جاهزة",
|
"notification.session.responseReady.title": "الاستجابة جاهزة",
|
||||||
"notification.session.error.title": "خطأ في الجلسة",
|
"notification.session.error.title": "خطأ في الجلسة",
|
||||||
"notification.session.error.fallbackDescription": "حدث خطأ",
|
"notification.session.error.fallbackDescription": "حدث خطأ",
|
||||||
"home.recentProjects": "المشاريع الأخيرة",
|
"home.recentProjects": "المشاريع الحديثة",
|
||||||
"home.empty.title": "لا توجد مشاريع حديثة",
|
"home.empty.title": "لا توجد مشاريع حديثة",
|
||||||
"home.empty.description": "ابدأ بفتح مشروع محلي",
|
"home.empty.description": "ابدأ بفتح مشروع محلي",
|
||||||
"home.title": "الرئيسية",
|
"home.title": "الرئيسية",
|
||||||
@@ -686,7 +555,7 @@ export const dict = {
|
|||||||
"home.sessions.group.today": "اليوم",
|
"home.sessions.group.today": "اليوم",
|
||||||
"home.sessions.group.yesterday": "أمس",
|
"home.sessions.group.yesterday": "أمس",
|
||||||
"home.sessions.group.older": "الأقدم",
|
"home.sessions.group.older": "الأقدم",
|
||||||
"home.providerTip": "اتصل بأكثر من 75 موفرًا لاستخدام نماذج أخرى، بما فيها Claude وGPT وGemini وغيرها",
|
"home.providerTip": "اتصل بأكثر من 75 مزودًا لاستخدام نماذج أخرى، بما فيها Claude وGPT وGemini وغيرها",
|
||||||
"session.tab.session": "جلسة",
|
"session.tab.session": "جلسة",
|
||||||
"session.tab.review": "مراجعة",
|
"session.tab.review": "مراجعة",
|
||||||
"session.tab.context": "سياق",
|
"session.tab.context": "سياق",
|
||||||
@@ -696,7 +565,7 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "يشير هذا التبويب إلى جلسة لم تعد موجودة على هذا الخادم.",
|
"session.error.notFound.description": "يشير هذا التبويب إلى جلسة لم تعد موجودة على هذا الخادم.",
|
||||||
"session.error.notFound.closeTab": "إغلاق علامة التبويب",
|
"session.error.notFound.closeTab": "إغلاق علامة التبويب",
|
||||||
"session.error.serverConnection": "تعذر الاتصال بهذا الخادم",
|
"session.error.serverConnection": "تعذر الاتصال بهذا الخادم",
|
||||||
"session.review.filesChanged": "الملفات المتغيرة: {{count}}",
|
"session.review.filesChanged": "تم تغيير {{count}} ملفات",
|
||||||
"session.review.change.one": "تغيير",
|
"session.review.change.one": "تغيير",
|
||||||
"session.review.change.other": "تغييرات",
|
"session.review.change.other": "تغييرات",
|
||||||
"session.review.loadingChanges": "جارٍ تحميل التغييرات...",
|
"session.review.loadingChanges": "جارٍ تحميل التغييرات...",
|
||||||
@@ -704,7 +573,7 @@ export const dict = {
|
|||||||
"session.review.noChanges": "لا توجد تغييرات",
|
"session.review.noChanges": "لا توجد تغييرات",
|
||||||
"session.review.noUncommittedChanges": "لا توجد تغييرات غير مُودَعة بعد",
|
"session.review.noUncommittedChanges": "لا توجد تغييرات غير مُودَعة بعد",
|
||||||
"session.review.noBranchChanges": "لا توجد تغييرات في الفرع بعد",
|
"session.review.noBranchChanges": "لا توجد تغييرات في الفرع بعد",
|
||||||
"session.review.noVcs": "لم يُكتشف نظام Git للتحكم في الإصدارات، لذا لن تُعرض التغييرات",
|
"session.review.noVcs": "لم يتم اكتشاف نظام التحكم في الإصدار Git، لن يتم عرض التغييرات",
|
||||||
"session.review.noSnapshot": "تم تعطيل تتبع اللقطات في التكوين، لذا فإن تغييرات الجلسة غير متوفرة",
|
"session.review.noSnapshot": "تم تعطيل تتبع اللقطات في التكوين، لذا فإن تغييرات الجلسة غير متوفرة",
|
||||||
"session.files.selectToOpen": "اختر ملفًا لفتحه",
|
"session.files.selectToOpen": "اختر ملفًا لفتحه",
|
||||||
"session.files.all": "كل الملفات",
|
"session.files.all": "كل الملفات",
|
||||||
@@ -722,26 +591,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "تصغير السؤال",
|
"session.question.minimize": "تصغير السؤال",
|
||||||
"session.question.restore": "استعادة السؤال",
|
"session.question.restore": "استعادة السؤال",
|
||||||
"session.question.pending.one": "{{count}} سؤال معلق",
|
"session.question.pending.one": "{{count}} سؤال معلق",
|
||||||
"session.question.pending.zero": "عدد الأسئلة المعلقة: {{count}}",
|
|
||||||
"session.question.pending.two": "عدد الأسئلة المعلقة: {{count}}",
|
|
||||||
"session.question.pending.few": "{{count}} أسئلة معلقة",
|
|
||||||
"session.question.pending.many": "{{count}} سؤالًا معلقًا",
|
|
||||||
"session.question.pending.other": "الأسئلة المعلقة: {{count}}",
|
"session.question.pending.other": "الأسئلة المعلقة: {{count}}",
|
||||||
"session.followupDock.summary.one": "{{count}} رسالة في قائمة الانتظار",
|
"session.followupDock.summary.one": "{{count}} رسالة في الانتظار",
|
||||||
"session.followupDock.summary.zero": "عدد الرسائل في قائمة الانتظار: {{count}}",
|
"session.followupDock.summary.other": "{{count}} رسائل في الانتظار",
|
||||||
"session.followupDock.summary.two": "عدد الرسائل في قائمة الانتظار: {{count}}",
|
|
||||||
"session.followupDock.summary.few": "{{count}} رسائل في قائمة الانتظار",
|
|
||||||
"session.followupDock.summary.many": "{{count}} رسالةً في قائمة الانتظار",
|
|
||||||
"session.followupDock.summary.other": "{{count}} رسائل في قائمة الانتظار",
|
|
||||||
"session.followupDock.sendNow": "إرسال الآن",
|
"session.followupDock.sendNow": "إرسال الآن",
|
||||||
"session.followupDock.edit": "تحرير",
|
"session.followupDock.edit": "تحرير",
|
||||||
"session.followupDock.collapse": "طي الرسائل المنتظرة",
|
"session.followupDock.collapse": "طي الرسائل المنتظرة",
|
||||||
"session.followupDock.expand": "توسيع الرسائل المنتظرة",
|
"session.followupDock.expand": "توسيع الرسائل المنتظرة",
|
||||||
"session.revertDock.summary.one": "{{count}} رسالة تم التراجع عنها",
|
"session.revertDock.summary.one": "{{count}} رسالة تم التراجع عنها",
|
||||||
"session.revertDock.summary.zero": "عدد الرسائل التي تم التراجع عنها: {{count}}",
|
|
||||||
"session.revertDock.summary.two": "عدد الرسائل التي تم التراجع عنها: {{count}}",
|
|
||||||
"session.revertDock.summary.few": "{{count}} رسائل تم التراجع عنها",
|
|
||||||
"session.revertDock.summary.many": "{{count}} رسالةً تم التراجع عنها",
|
|
||||||
"session.revertDock.summary.other": "{{count}} رسائل تم التراجع عنها",
|
"session.revertDock.summary.other": "{{count}} رسائل تم التراجع عنها",
|
||||||
"session.revertDock.collapse": "طي الرسائل التي تم التراجع عنها",
|
"session.revertDock.collapse": "طي الرسائل التي تم التراجع عنها",
|
||||||
"session.revertDock.expand": "توسيع الرسائل التي تم التراجع عنها",
|
"session.revertDock.expand": "توسيع الرسائل التي تم التراجع عنها",
|
||||||
@@ -793,19 +650,12 @@ export const dict = {
|
|||||||
"terminal.close": "إغلاق المحطة الطرفية",
|
"terminal.close": "إغلاق المحطة الطرفية",
|
||||||
"terminal.connectionLost.title": "فقد الاتصال",
|
"terminal.connectionLost.title": "فقد الاتصال",
|
||||||
"terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
|
"terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
|
||||||
"terminal.connectTicket.csrfError": "رُفضت تذكرة اتصال PTY بسبب فحوصات الأصل أو CSRF. تحقق من إعداد CORS للخادم.",
|
|
||||||
"terminal.connectTicket.statusError": "فشلت تذكرة اتصال PTY بالحالة {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "تحديث",
|
|
||||||
"titlebar.updateVersion": "تحديث {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "إغلاق علامة التبويب",
|
"common.closeTab": "إغلاق علامة التبويب",
|
||||||
"common.dismiss": "إهمال",
|
"common.dismiss": "رفض",
|
||||||
"common.requestFailed": "فشل الطلب",
|
"common.requestFailed": "فشل الطلب",
|
||||||
"common.moreOptions": "مزيد من الخيارات",
|
"common.moreOptions": "مزيد من الخيارات",
|
||||||
"common.learnMore": "اطّلع على المزيد",
|
"common.learnMore": "اعرف المزيد",
|
||||||
"common.rename": "إعادة تسمية",
|
"common.rename": "إعادة تسمية",
|
||||||
"common.export": "تصدير",
|
|
||||||
"common.reset": "إعادة تعيين",
|
"common.reset": "إعادة تعيين",
|
||||||
"common.archive": "أرشفة",
|
"common.archive": "أرشفة",
|
||||||
"common.delete": "حذف",
|
"common.delete": "حذف",
|
||||||
@@ -822,7 +672,7 @@ export const dict = {
|
|||||||
"sidebar.gettingStarted.title": "البدء",
|
"sidebar.gettingStarted.title": "البدء",
|
||||||
"sidebar.gettingStarted.line1": "يتضمن OpenCode نماذج مجانية حتى تتمكن من البدء فورًا.",
|
"sidebar.gettingStarted.line1": "يتضمن OpenCode نماذج مجانية حتى تتمكن من البدء فورًا.",
|
||||||
"sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.",
|
"sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.",
|
||||||
"sidebar.project.recentSessions": "الجلسات الأخيرة",
|
"sidebar.project.recentSessions": "الجلسات الحديثة",
|
||||||
"sidebar.project.viewAllSessions": "عرض جميع الجلسات",
|
"sidebar.project.viewAllSessions": "عرض جميع الجلسات",
|
||||||
"sidebar.project.clearNotifications": "مسح الإشعارات",
|
"sidebar.project.clearNotifications": "مسح الإشعارات",
|
||||||
"sidebar.empty.title": "لا توجد مشاريع مفتوحة",
|
"sidebar.empty.title": "لا توجد مشاريع مفتوحة",
|
||||||
@@ -841,7 +691,7 @@ export const dict = {
|
|||||||
"settings.general.section.updates": "التحديثات",
|
"settings.general.section.updates": "التحديثات",
|
||||||
"settings.general.section.sounds": "المؤثرات الصوتية",
|
"settings.general.section.sounds": "المؤثرات الصوتية",
|
||||||
"settings.general.section.feed": "الخلاصة",
|
"settings.general.section.feed": "الخلاصة",
|
||||||
"settings.general.section.display": "العرض",
|
"settings.general.section.display": "شاشة العرض",
|
||||||
"settings.general.row.language.title": "اللغة",
|
"settings.general.row.language.title": "اللغة",
|
||||||
"settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode",
|
"settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode",
|
||||||
"settings.general.row.shell.title": "Shell المحطة الطرفية",
|
"settings.general.row.shell.title": "Shell المحطة الطرفية",
|
||||||
@@ -878,11 +728,10 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "التنقل السفلي",
|
"settings.general.row.mobileTitlebarBottom.title": "التنقل السفلي",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"وضع شريط العنوان وعلامات تبويب الجلسات أسفل الشاشة على الأجهزة المحمولة",
|
"وضع شريط العنوان وعلامات تبويب الجلسات أسفل الشاشة على الأجهزة المحمولة",
|
||||||
"settings.general.row.showCustomAgents.title": "إظهار الوكيل",
|
"settings.general.row.showCustomAgents.title": "الوكلاء المخصصون",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "إظهار محدد الوكلاء في محرر الرسائل",
|
||||||
"التبديل بين الوكلاء في محرر الرسائل. عند إخفائه، يُستخدم وكيل Build افتراضيًا.",
|
"settings.general.row.reasoningSummaries.title": "إظهار ملخصات الاستنتاج",
|
||||||
"settings.general.row.reasoningSummaries.title": "إظهار ملخصات الاستدلال",
|
"settings.general.row.reasoningSummaries.description": "عرض ملخصات استنتاج النموذج في الشريط الزمني",
|
||||||
"settings.general.row.reasoningSummaries.description": "عرض ملخصات استدلال النموذج في الشريط الزمني",
|
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "توسيع أجزاء أداة shell",
|
"settings.general.row.shellToolPartsExpanded.title": "توسيع أجزاء أداة shell",
|
||||||
"settings.general.row.shellToolPartsExpanded.description":
|
"settings.general.row.shellToolPartsExpanded.description":
|
||||||
"إظهار أجزاء أداة shell موسعة بشكل افتراضي في الشريط الزمني",
|
"إظهار أجزاء أداة shell موسعة بشكل افتراضي في الشريط الزمني",
|
||||||
@@ -895,12 +744,11 @@ export const dict = {
|
|||||||
"استخدم علامات التبويب الجديدة وتخطيط الصفحة الرئيسية. يمكنك التبديل بين التخطيطات لفترة محدودة.",
|
"استخدم علامات التبويب الجديدة وتخطيط الصفحة الرئيسية. يمكنك التبديل بين التخطيطات لفترة محدودة.",
|
||||||
"settings.general.row.newInterfaceNotice.title": "أنت تستخدم الآن التخطيط الجديد",
|
"settings.general.row.newInterfaceNotice.title": "أنت تستخدم الآن التخطيط الجديد",
|
||||||
"settings.general.row.newInterfaceNotice.description": "التخطيط السابق لم يعد متاحًا",
|
"settings.general.row.newInterfaceNotice.description": "التخطيط السابق لم يعد متاحًا",
|
||||||
"settings.general.row.newInterfaceNotice.dismiss": "إهمال",
|
"settings.general.row.newInterfaceNotice.dismiss": "رفض",
|
||||||
"settings.general.row.pinchZoom.title": "التكبير بالمقاربة والمباعدة",
|
"settings.general.row.pinchZoom.title": "التكبير بإيماءة القرص",
|
||||||
"settings.general.row.pinchZoom.description":
|
"settings.general.row.pinchZoom.description": "السماح بإيماءة القرص على لوحة اللمس وإيماءة Ctrl-scroll للتكبير",
|
||||||
"السماح بإيماءات مقاربة الأصابع ومباعدتها على لوحة التعقب والتمرير مع الضغط على Ctrl للتكبير",
|
|
||||||
"settings.general.row.wayland.title": "استخدام Wayland الأصلي",
|
"settings.general.row.wayland.title": "استخدام Wayland الأصلي",
|
||||||
"settings.general.row.wayland.description": "تعطيل الرجوع إلى X11 على Wayland. يتطلب إعادة التشغيل.",
|
"settings.general.row.wayland.description": "تعطيل التراجع إلى X11 على Wayland. يتطلب إعادة التشغيل.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"على Linux مع شاشات بمعدلات تحديث مختلطة، يمكن أن يكون Wayland الأصلي أكثر استقرارًا.",
|
"على Linux مع شاشات بمعدلات تحديث مختلطة، يمكن أن يكون Wayland الأصلي أكثر استقرارًا.",
|
||||||
"settings.general.row.releaseNotes.title": "ملاحظات الإصدار",
|
"settings.general.row.releaseNotes.title": "ملاحظات الإصدار",
|
||||||
@@ -913,7 +761,7 @@ export const dict = {
|
|||||||
"settings.updates.action.checking": "جارٍ التحقق...",
|
"settings.updates.action.checking": "جارٍ التحقق...",
|
||||||
"settings.updates.action.downloading": "جارٍ التنزيل...",
|
"settings.updates.action.downloading": "جارٍ التنزيل...",
|
||||||
"settings.updates.action.installing": "جارٍ التثبيت...",
|
"settings.updates.action.installing": "جارٍ التثبيت...",
|
||||||
"settings.updates.toast.latest.title": "لديك أحدث إصدار",
|
"settings.updates.toast.latest.title": "أنت على آخر إصدار",
|
||||||
"settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من OpenCode.",
|
"settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من OpenCode.",
|
||||||
"sound.option.none": "بلا",
|
"sound.option.none": "بلا",
|
||||||
"sound.option.alert01": "تنبيه 01",
|
"sound.option.alert01": "تنبيه 01",
|
||||||
@@ -975,17 +823,17 @@ export const dict = {
|
|||||||
"settings.general.sounds.errors.description": "تشغيل صوت عند حدوث خطأ",
|
"settings.general.sounds.errors.description": "تشغيل صوت عند حدوث خطأ",
|
||||||
"settings.shortcuts.title": "اختصارات لوحة المفاتيح",
|
"settings.shortcuts.title": "اختصارات لوحة المفاتيح",
|
||||||
"settings.shortcuts.reset.button": "إعادة التعيين إلى الافتراضيات",
|
"settings.shortcuts.reset.button": "إعادة التعيين إلى الافتراضيات",
|
||||||
"settings.shortcuts.reset.toast.title": "أُعيد تعيين الاختصارات",
|
"settings.shortcuts.reset.toast.title": "تم إعادة تعيين الاختصارات",
|
||||||
"settings.shortcuts.reset.toast.description": "أُعيد تعيين اختصارات لوحة المفاتيح إلى الإعدادات الافتراضية.",
|
"settings.shortcuts.reset.toast.description": "تم إعادة تعيين اختصارات لوحة المفاتيح إلى الافتراضيات.",
|
||||||
"settings.shortcuts.conflict.title": "الاختصار قيد الاستخدام بالفعل",
|
"settings.shortcuts.conflict.title": "الاختصار قيد الاستخدام بالفعل",
|
||||||
"settings.shortcuts.conflict.description": "الاختصار {{keybind}} مخصص بالفعل لـ {{titles}}.",
|
"settings.shortcuts.conflict.description": "{{keybind}} معين بالفعل لـ {{titles}}.",
|
||||||
"settings.shortcuts.unassigned": "غير مخصص",
|
"settings.shortcuts.unassigned": "غير معين",
|
||||||
"settings.shortcuts.pressKeys": "اضغط على المفاتيح",
|
"settings.shortcuts.pressKeys": "اضغط على المفاتيح",
|
||||||
"settings.shortcuts.search.placeholder": "البحث في الاختصارات",
|
"settings.shortcuts.search.placeholder": "البحث في الاختصارات",
|
||||||
"settings.shortcuts.search.empty": "لم يتم العثور على اختصارات",
|
"settings.shortcuts.search.empty": "لم يتم العثور على اختصارات",
|
||||||
"settings.shortcuts.group.general": "عام",
|
"settings.shortcuts.group.general": "عام",
|
||||||
"settings.shortcuts.group.session": "جلسة",
|
"settings.shortcuts.group.session": "جلسة",
|
||||||
"settings.shortcuts.group.navigation": "التنقل",
|
"settings.shortcuts.group.navigation": "تصفح",
|
||||||
"settings.shortcuts.group.modelAndAgent": "النموذج والوكيل",
|
"settings.shortcuts.group.modelAndAgent": "النموذج والوكيل",
|
||||||
"settings.shortcuts.group.terminal": "المحطة الطرفية",
|
"settings.shortcuts.group.terminal": "المحطة الطرفية",
|
||||||
"settings.shortcuts.group.prompt": "موجه",
|
"settings.shortcuts.group.prompt": "موجه",
|
||||||
@@ -1010,18 +858,19 @@ export const dict = {
|
|||||||
"settings.permissions.description": "تحكم في الأدوات التي يمكن للخادم استخدامها بشكل افتراضي.",
|
"settings.permissions.description": "تحكم في الأدوات التي يمكن للخادم استخدامها بشكل افتراضي.",
|
||||||
"settings.permissions.section.tools": "الأدوات",
|
"settings.permissions.section.tools": "الأدوات",
|
||||||
"settings.permissions.toast.updateFailed.title": "فشل تحديث الأذونات",
|
"settings.permissions.toast.updateFailed.title": "فشل تحديث الأذونات",
|
||||||
"settings.permissions.action.allow": "السماح",
|
"settings.permissions.action.allow": "سماح",
|
||||||
"settings.permissions.action.ask": "طلب الإذن",
|
"settings.permissions.action.ask": "سؤال",
|
||||||
"settings.permissions.action.deny": "الرفض",
|
"settings.permissions.action.deny": "رفض",
|
||||||
"settings.permissions.tool.read.title": "قراءة",
|
"settings.permissions.tool.read.title": "قراءة",
|
||||||
"settings.permissions.tool.read.description": "قراءة ملف (يطابق مسار الملف)",
|
"settings.permissions.tool.read.description": "قراءة ملف (يطابق مسار الملف)",
|
||||||
"settings.permissions.tool.edit.title": "تحرير",
|
"settings.permissions.tool.edit.title": "تحرير",
|
||||||
"settings.permissions.tool.edit.description": "تعديل الملفات، بما في ذلك عمليات التحرير والكتابة وتطبيق الرقع",
|
"settings.permissions.tool.edit.description":
|
||||||
|
"تعديل الملفات، بما في ذلك التحرير والكتابة والتصحيحات والتحرير المتعدد",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "مطابقة الملفات باستخدام أنماط glob",
|
"settings.permissions.tool.glob.description": "مطابقة الملفات باستخدام أنماط glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
"settings.permissions.tool.grep.description": "البحث في محتويات الملف باستخدام التعبيرات العادية",
|
"settings.permissions.tool.grep.description": "البحث في محتويات الملف باستخدام التعبيرات العادية",
|
||||||
"settings.permissions.tool.list.title": "سرد",
|
"settings.permissions.tool.list.title": "قائمة",
|
||||||
"settings.permissions.tool.list.description": "سرد الملفات داخل دليل",
|
"settings.permissions.tool.list.description": "سرد الملفات داخل دليل",
|
||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "تشغيل أوامر shell",
|
"settings.permissions.tool.bash.description": "تشغيل أوامر shell",
|
||||||
@@ -1039,7 +888,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.websearch.description": "البحث في الويب",
|
"settings.permissions.tool.websearch.description": "البحث في الويب",
|
||||||
"settings.permissions.tool.external_directory.title": "دليل خارجي",
|
"settings.permissions.tool.external_directory.title": "دليل خارجي",
|
||||||
"settings.permissions.tool.external_directory.description": "الوصول إلى الملفات خارج دليل المشروع",
|
"settings.permissions.tool.external_directory.description": "الوصول إلى الملفات خارج دليل المشروع",
|
||||||
"settings.permissions.tool.doom_loop.title": "حلقة مفرغة",
|
"settings.permissions.tool.doom_loop.title": "حلقة الموت",
|
||||||
"settings.permissions.tool.doom_loop.description": "اكتشاف استدعاءات الأدوات المتكررة بمدخلات متطابقة",
|
"settings.permissions.tool.doom_loop.description": "اكتشاف استدعاءات الأدوات المتكررة بمدخلات متطابقة",
|
||||||
"session.delete.failed.title": "فشل حذف الجلسة",
|
"session.delete.failed.title": "فشل حذف الجلسة",
|
||||||
"session.delete.title": "حذف الجلسة",
|
"session.delete.title": "حذف الجلسة",
|
||||||
@@ -1047,7 +896,7 @@ export const dict = {
|
|||||||
"session.delete.button": "حذف الجلسة",
|
"session.delete.button": "حذف الجلسة",
|
||||||
"workspace.new": "مساحة عمل جديدة",
|
"workspace.new": "مساحة عمل جديدة",
|
||||||
"workspace.type.local": "محلي",
|
"workspace.type.local": "محلي",
|
||||||
"workspace.type.sandbox": "بيئة معزولة",
|
"workspace.type.sandbox": "صندوق رمل",
|
||||||
"workspace.create.failed.title": "فشل إنشاء مساحة العمل",
|
"workspace.create.failed.title": "فشل إنشاء مساحة العمل",
|
||||||
"workspace.delete.failed.title": "فشل حذف مساحة العمل",
|
"workspace.delete.failed.title": "فشل حذف مساحة العمل",
|
||||||
"workspace.resetting.title": "إعادة تعيين مساحة العمل",
|
"workspace.resetting.title": "إعادة تعيين مساحة العمل",
|
||||||
@@ -1057,7 +906,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.description": "مساحة العمل تطابق الآن الفرع الافتراضي.",
|
"workspace.reset.success.description": "مساحة العمل تطابق الآن الفرع الافتراضي.",
|
||||||
"workspace.error.stillPreparing": "مساحة العمل لا تزال قيد الإعداد",
|
"workspace.error.stillPreparing": "مساحة العمل لا تزال قيد الإعداد",
|
||||||
"workspace.status.checking": "التحقق من التغييرات غير المدمجة...",
|
"workspace.status.checking": "التحقق من التغييرات غير المدمجة...",
|
||||||
"workspace.status.error": "تعذر التحقق من حالة Git.",
|
"workspace.status.error": "تعذر التحقق من حالة git.",
|
||||||
"workspace.status.clean": "لم يتم اكتشاف تغييرات غير مدمجة.",
|
"workspace.status.clean": "لم يتم اكتشاف تغييرات غير مدمجة.",
|
||||||
"workspace.status.dirty": "تم اكتشاف تغييرات غير مدمجة في مساحة العمل هذه.",
|
"workspace.status.dirty": "تم اكتشاف تغييرات غير مدمجة في مساحة العمل هذه.",
|
||||||
"workspace.delete.title": "حذف مساحة العمل",
|
"workspace.delete.title": "حذف مساحة العمل",
|
||||||
@@ -1073,7 +922,7 @@ export const dict = {
|
|||||||
"common.open": "فتح",
|
"common.open": "فتح",
|
||||||
"dialog.releaseNotes.action.getStarted": "البدء",
|
"dialog.releaseNotes.action.getStarted": "البدء",
|
||||||
"dialog.releaseNotes.action.next": "التالي",
|
"dialog.releaseNotes.action.next": "التالي",
|
||||||
"dialog.releaseNotes.action.hideFuture": "عدم إظهارها مستقبلاً",
|
"dialog.releaseNotes.action.hideFuture": "عدم إظهار هذا في المستقبل",
|
||||||
"dialog.releaseNotes.media.alt": "معاينة الإصدار",
|
"dialog.releaseNotes.media.alt": "معاينة الإصدار",
|
||||||
"toast.project.reloadFailed.title": "فشل في إعادة تحميل {{project}}",
|
"toast.project.reloadFailed.title": "فشل في إعادة تحميل {{project}}",
|
||||||
"error.server.invalidConfiguration": "تكوين غير صالح",
|
"error.server.invalidConfiguration": "تكوين غير صالح",
|
||||||
@@ -1083,25 +932,22 @@ export const dict = {
|
|||||||
"common.time.hoursAgo.short": "قبل {{count}} س",
|
"common.time.hoursAgo.short": "قبل {{count}} س",
|
||||||
"common.time.daysAgo.short": "قبل {{count}} ي",
|
"common.time.daysAgo.short": "قبل {{count}} ي",
|
||||||
"settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك",
|
"settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك",
|
||||||
"settings.providers.custom.description": "أضف موفرًا متوافقًا مع OpenAI باستخدام عنوان URL الأساسي.",
|
"settings.providers.custom.description": "أضف مزود متوافق مع OpenAI بواسطة عنوان URL الأساسي.",
|
||||||
|
|
||||||
"app.server.unreachable": "تعذر الوصول إلى {{server}}",
|
"app.server.unreachable": "تعذر الوصول إلى {{server}}",
|
||||||
"app.server.retrying": "جارٍ إعادة المحاولة تلقائيًا...",
|
"app.server.retrying": "جاري إعادة المحاولة تلقائيًا...",
|
||||||
"app.server.otherServers": "خوادم أخرى",
|
"app.server.otherServers": "خوادم أخرى",
|
||||||
"dialog.server.add.usernamePlaceholder": "اسم المستخدم",
|
"dialog.server.add.usernamePlaceholder": "اسم المستخدم",
|
||||||
"dialog.server.add.passwordPlaceholder": "كلمة المرور",
|
"dialog.server.add.passwordPlaceholder": "كلمة المرور",
|
||||||
"server.row.noUsername": "لا يوجد اسم مستخدم",
|
"server.row.noUsername": "لا يوجد اسم مستخدم",
|
||||||
"session.review.noVcs.createGit.title": "إنشاء مستودع Git",
|
"session.review.noVcs.createGit.title": "إنشاء مستودع Git",
|
||||||
"session.review.noVcs.createGit.description": "تتبع ومراجعة والتراجع عن التغييرات في هذا المشروع",
|
"session.review.noVcs.createGit.description": "تتبع ومراجعة والتراجع عن التغييرات في هذا المشروع",
|
||||||
"session.review.noVcs.createGit.actionLoading": "جارٍ إنشاء مستودع Git...",
|
"session.review.noVcs.createGit.actionLoading": "جاري إنشاء مستودع Git...",
|
||||||
"session.review.noVcs.createGit.action": "إنشاء مستودع Git",
|
"session.review.noVcs.createGit.action": "إنشاء مستودع Git",
|
||||||
"session.todo.progress": "تم إكمال {{done}} من {{total}} مهام",
|
"session.todo.progress": "تم إكمال {{done}} من {{total}} مهام",
|
||||||
"session.question.progress": "{{current}} من {{total}} أسئلة",
|
"session.question.progress": "{{current}} من {{total}} أسئلة",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "مستكشف الملفات",
|
"session.header.open.fileExplorer": "مستكشف الملفات",
|
||||||
"session.header.reveal.finder": "إظهار في Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "إظهار في مستكشف الملفات",
|
|
||||||
"session.header.reveal.containingFolder": "فتح المجلد الحاوي",
|
|
||||||
"session.header.open.fileManager": "مدير الملفات",
|
"session.header.open.fileManager": "مدير الملفات",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1119,9 +965,9 @@ export const dict = {
|
|||||||
"debugBar.ariaLabel": "تشخيص أداء التطوير",
|
"debugBar.ariaLabel": "تشخيص أداء التطوير",
|
||||||
"debugBar.na": "غير متاح",
|
"debugBar.na": "غير متاح",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip": "آخر انتقال مكتمل للمسار يتضمن صفحة جلسة، مُقاسًا من بدء التوجيه حتى أول رسم بعد استقراره.",
|
"debugBar.nav.tip": "آخر انتقال مكتمل للمسار يمس صفحة جلسة، مُقاسًا من بدء التوجيه حتى أول رسم بعد استقراره.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "متوسط متحرك لمعدل الإطارات في الثانية خلال آخر 5 ثوانٍ.",
|
"debugBar.fps.tip": "الإطارات المتجددة في الثانية خلال آخر 5 ثوانٍ.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "أسوأ وقت للإطار خلال آخر 5 ثوانٍ.",
|
"debugBar.frame.tip": "أسوأ وقت للإطار خلال آخر 5 ثوانٍ.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
@@ -1133,18 +979,10 @@ export const dict = {
|
|||||||
"debugBar.inp.label": "INP",
|
"debugBar.inp.label": "INP",
|
||||||
"debugBar.inp.tip": "مدة التفاعل التقريبية خلال آخر 5 ثوانٍ. هذا يشبه INP، وليس Web Vitals INP الرسمي.",
|
"debugBar.inp.tip": "مدة التفاعل التقريبية خلال آخر 5 ثوانٍ. هذا يشبه INP، وليس Web Vitals INP الرسمي.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "التحول التخطيطي التراكمي منذ تشغيل التطبيق الحالي.",
|
"debugBar.cls.tip": "التحول التخطيطي التراكمي لعمر التطبيق الحالي.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "كومة JS المستخدمة مقابل حد الكومة. Chromium فقط.",
|
"debugBar.mem.tipUnavailable": "كومة JS المستخدمة مقابل حد الكومة. Chromium فقط.",
|
||||||
"debugBar.mem.tip": "كومة JS المستخدمة مقابل حد الكومة. {{used}} من {{limit}}.",
|
"debugBar.mem.tip": "كومة JS المستخدمة مقابل حد الكومة. {{used}} من {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "فرض أنماط التركيز على جميع العناصر التفاعلية",
|
|
||||||
"debugBar.focus.on": "تشغيل",
|
|
||||||
"debugBar.focus.off": "إيقاف",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "فرض اتجاه التخطيط على التطبيق بالكامل دون تغيير اللغة المحددة",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -1160,7 +998,7 @@ export const dict = {
|
|||||||
"common.key.pageDown": "Page Down",
|
"common.key.pageDown": "Page Down",
|
||||||
"common.key.insert": "Insert",
|
"common.key.insert": "Insert",
|
||||||
"common.unknown": "غير معروف",
|
"common.unknown": "غير معروف",
|
||||||
"error.page.circular": "[مرجع دائري]",
|
"error.page.circular": "[دائري]",
|
||||||
"error.serverSDK.noServerAvailable": "لا يوجد خادم متاح",
|
"error.serverSDK.noServerAvailable": "لا يوجد خادم متاح",
|
||||||
"error.serverSDK.serverNotAvailable": "الخادم غير متاح",
|
"error.serverSDK.serverNotAvailable": "الخادم غير متاح",
|
||||||
"error.childStore.persistedCacheCreateFailed": "فشل إنشاء ذاكرة التخزين المؤقت الدائمة",
|
"error.childStore.persistedCacheCreateFailed": "فشل إنشاء ذاكرة التخزين المؤقت الدائمة",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+44
-200
@@ -1,104 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Arquivo",
|
|
||||||
"desktop.menu.edit": "Editar",
|
|
||||||
"desktop.menu.view": "Visualizar",
|
|
||||||
"desktop.menu.go": "Ir",
|
|
||||||
"desktop.menu.window": "Janela",
|
|
||||||
"desktop.menu.help": "Ajuda",
|
|
||||||
"desktop.menu.checkForUpdates": "Verificar atualizações...",
|
|
||||||
"desktop.menu.settings": "Configurações",
|
|
||||||
"desktop.menu.reloadWebview": "Recarregar WebView",
|
|
||||||
"desktop.menu.restart": "Reiniciar",
|
|
||||||
"desktop.menu.exportLogs": "Exportar logs...",
|
|
||||||
"desktop.menu.newSession": "Nova sessão",
|
|
||||||
"desktop.menu.openProject": "Abrir projeto...",
|
|
||||||
"desktop.menu.newWindow": "Nova janela",
|
|
||||||
"desktop.menu.closeWindow": "Fechar janela",
|
|
||||||
"desktop.menu.undo": "Desfazer",
|
|
||||||
"desktop.menu.redo": "Refazer",
|
|
||||||
"desktop.menu.cut": "Recortar",
|
|
||||||
"desktop.menu.copy": "Copiar",
|
|
||||||
"desktop.menu.paste": "Colar",
|
|
||||||
"desktop.menu.delete": "Excluir",
|
|
||||||
"desktop.menu.selectAll": "Selecionar tudo",
|
|
||||||
"desktop.menu.toggleSidebar": "Alternar barra lateral",
|
|
||||||
"desktop.menu.toggleTerminal": "Alternar terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Alternar árvore de arquivos",
|
|
||||||
"desktop.menu.reload": "Recarregar",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Alternar ferramentas de desenvolvedor",
|
|
||||||
"desktop.menu.actualSize": "Tamanho real",
|
|
||||||
"desktop.menu.zoomIn": "Ampliar",
|
|
||||||
"desktop.menu.zoomOut": "Reduzir",
|
|
||||||
"desktop.menu.toggleFullScreen": "Alternar tela inteira",
|
|
||||||
"desktop.menu.back": "Voltar",
|
|
||||||
"desktop.menu.forward": "Avançar",
|
|
||||||
"desktop.menu.previousSession": "Sessão anterior",
|
|
||||||
"desktop.menu.nextSession": "Próxima sessão",
|
|
||||||
"desktop.menu.previousProject": "Projeto anterior",
|
|
||||||
"desktop.menu.nextProject": "Próximo projeto",
|
|
||||||
"desktop.menu.minimize": "Minimizar",
|
|
||||||
"desktop.menu.maximize": "Maximizar",
|
|
||||||
"desktop.menu.documentation": "Documentação do OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Fórum de suporte",
|
|
||||||
"desktop.menu.shareFeedback": "Enviar comentários",
|
|
||||||
"desktop.menu.reportBug": "Relatar um bug",
|
|
||||||
"desktop.menu.ariaLabel": "Menu do OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Falha ao verificar atualizações.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Erro de atualização",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Você está em dia.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Nenhuma atualização",
|
|
||||||
"desktop.updater.dialog.ready.message": "A atualização {{version}} foi baixada. Deseja reiniciar agora?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Atualização pronta",
|
|
||||||
"desktop.updater.dialog.restart": "Reiniciar",
|
|
||||||
"desktop.updater.dialog.later": "Mais tarde",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Reabrir",
|
|
||||||
"desktop.recovery.action.exportLogs": "Exportar logs",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Continuar aguardando",
|
|
||||||
"desktop.recovery.action.quit": "Encerrar",
|
|
||||||
"desktop.recovery.loadFailed": "Falha ao carregar o OpenCode",
|
|
||||||
"desktop.recovery.terminated": "A janela do OpenCode foi encerrada inesperadamente",
|
|
||||||
"desktop.recovery.unresponsive": "O OpenCode não está respondendo",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Você pode reabrir o aplicativo, abrir os logs ou continuar aguardando.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Janela: {{window}}\nURL: {{url}}\nErro: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Janela: {{window}}\nMotivo: {{reason}}\nCódigo: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<desconhecido>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Escolher uma pasta",
|
|
||||||
"desktop.dialog.chooseFile": "Escolher um arquivo",
|
|
||||||
"desktop.dialog.saveFile": "Salvar arquivo",
|
|
||||||
"desktop.dialog.files": "Arquivos",
|
|
||||||
"desktop.server.local": "Servidor local",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "O WSL está disponível somente no Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "O WSL está indisponível",
|
|
||||||
"desktop.wsl.error.listInstalled": "Falha ao listar as distribuições WSL instaladas",
|
|
||||||
"desktop.wsl.error.listOnline": "Falha ao listar as distribuições WSL disponíveis online",
|
|
||||||
"desktop.wsl.error.executeDistro": "Não é possível executar comandos na distribuição",
|
|
||||||
"desktop.wsl.error.installWsl": "Falha na instalação do WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "Falha ao instalar a distribuição: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Falha na instalação do OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} já foi adicionada",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "O opencode não está instalado nesta distribuição",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "O opencode está instalado, mas não pôde ser executado",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "O OpenCode não está instalado em {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"A atualização do OpenCode foi concluída, mas {{distro}} ainda informa a versão {{installed}}; a versão esperada é {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "sem versão",
|
|
||||||
"desktop.wsl.error.serverExited":
|
|
||||||
"O servidor WSL foi encerrado após a inicialização (código={{code}} sinal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"O servidor WSL foi encerrado antes de ficar íntegro (código={{code}} sinal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"O tempo limite da verificação de integridade do sidecar de {{distro}} foi excedido após {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "O tempo limite de {{command}} {{args}} foi excedido após {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Falha ao obter a porta",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "O arquivo não foi selecionado pelo seletor",
|
|
||||||
"desktop.picker.error.sizeLimit": "Os anexos selecionados excedem o limite de {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "Sugerido",
|
"command.category.suggested": "Sugerido",
|
||||||
"command.category.view": "Visualizar",
|
"command.category.view": "Visualizar",
|
||||||
"command.category.project": "Projeto",
|
"command.category.project": "Projeto",
|
||||||
@@ -116,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Permissões",
|
"command.category.permissions": "Permissões",
|
||||||
"command.category.workspace": "Espaço de trabalho",
|
"command.category.workspace": "Espaço de trabalho",
|
||||||
"command.category.settings": "Configurações",
|
"command.category.settings": "Configurações",
|
||||||
"command.logs.export": "Exportar logs",
|
|
||||||
"theme.scheme.system": "Sistema",
|
"theme.scheme.system": "Sistema",
|
||||||
"theme.scheme.light": "Claro",
|
"theme.scheme.light": "Claro",
|
||||||
"theme.scheme.dark": "Escuro",
|
"theme.scheme.dark": "Escuro",
|
||||||
@@ -186,9 +85,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "Compartilhar esta sessão e copiar a URL para a área de transferência",
|
"command.session.share.description": "Compartilhar esta sessão e copiar a URL para a área de transferência",
|
||||||
"command.session.unshare": "Parar de compartilhar sessão",
|
"command.session.unshare": "Parar de compartilhar sessão",
|
||||||
"command.session.unshare.description": "Parar de compartilhar esta sessão",
|
"command.session.unshare.description": "Parar de compartilhar esta sessão",
|
||||||
"command.session.export": "Exportar sessão",
|
|
||||||
"command.session.export.description": "Exportar a transcrição completa da sessão como JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Buscar arquivos, comandos e sessões",
|
"palette.search.placeholder": "Buscar arquivos, comandos e sessões",
|
||||||
"palette.search.placeholder.home": "Buscar comandos e sessões",
|
"palette.search.placeholder.home": "Buscar comandos e sessões",
|
||||||
"palette.empty": "Nenhum resultado encontrado",
|
"palette.empty": "Nenhum resultado encontrado",
|
||||||
@@ -198,14 +94,13 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Nenhum provedor encontrado",
|
"dialog.provider.empty": "Nenhum provedor encontrado",
|
||||||
"dialog.provider.group.popular": "Popular",
|
"dialog.provider.group.popular": "Popular",
|
||||||
"dialog.provider.group.other": "Outro",
|
"dialog.provider.group.other": "Outro",
|
||||||
"dialog.provider.custom.label": "Provedor personalizado compatível com OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "Recomendado",
|
"dialog.provider.tag.recommended": "Recomendado",
|
||||||
"dialog.provider.opencode.note": "Modelos selecionados incluindo Claude, GPT, Gemini e mais",
|
"dialog.provider.opencode.note": "Modelos selecionados incluindo Claude, GPT, Gemini e mais",
|
||||||
"dialog.provider.opencode.tagline": "Modelos otimizados e confiáveis",
|
"dialog.provider.opencode.tagline": "Modelos otimizados e confiáveis",
|
||||||
"dialog.provider.opencodeGo.tagline": "Assinatura de baixo custo para todos",
|
"dialog.provider.opencodeGo.tagline": "Assinatura de baixo custo para todos",
|
||||||
"dialog.provider.anthropic.note": "Acesso direto aos modelos Claude, incluindo Pro e Max",
|
"dialog.provider.anthropic.note": "Conectar com Claude Pro/Max ou chave de API",
|
||||||
"dialog.provider.copilot.note": "Modelos de IA para auxílio à programação pelo GitHub Copilot",
|
"dialog.provider.copilot.note": "Conectar com Copilot ou chave de API",
|
||||||
"dialog.provider.openai.note": "Modelos GPT rápidos e avançados para tarefas gerais de IA",
|
"dialog.provider.openai.note": "Conectar com ChatGPT Pro/Plus ou chave de API",
|
||||||
"dialog.provider.google.note": "Modelos Gemini para respostas rápidas e estruturadas",
|
"dialog.provider.google.note": "Modelos Gemini para respostas rápidas e estruturadas",
|
||||||
"dialog.provider.openrouter.note": "Acesse todos os modelos suportados de um único provedor",
|
"dialog.provider.openrouter.note": "Acesse todos os modelos suportados de um único provedor",
|
||||||
"dialog.provider.vercel.note": "Acesso unificado a modelos de IA com roteamento inteligente",
|
"dialog.provider.vercel.note": "Acesso unificado a modelos de IA com roteamento inteligente",
|
||||||
@@ -217,14 +112,11 @@ export const dict = {
|
|||||||
"dialog.model.manage.provider.toggle": "Alternar todos os modelos {{provider}}",
|
"dialog.model.manage.provider.toggle": "Alternar todos os modelos {{provider}}",
|
||||||
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Adicionar mais modelos de provedores populares",
|
"dialog.model.unpaid.addMore.title": "Adicionar mais modelos de provedores populares",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Ver mais de 70 provedores",
|
|
||||||
"dialog.provider.viewAll": "Ver mais provedores",
|
"dialog.provider.viewAll": "Ver mais provedores",
|
||||||
"provider.connect.title": "Conectar {{provider}}",
|
"provider.connect.title": "Conectar {{provider}}",
|
||||||
"provider.connect.title.anthropicProMax": "Entrar com Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Entrar com Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Selecionar método de login para {{provider}}.",
|
"provider.connect.selectMethod": "Selecionar método de login para {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "Chave de API",
|
"provider.connect.method.apiKey": "Chave de API",
|
||||||
"provider.connect.method.browser": "Navegador",
|
|
||||||
"provider.connect.method.headless": "Sem interface gráfica",
|
|
||||||
"provider.connect.status.inProgress": "Autorização em andamento...",
|
"provider.connect.status.inProgress": "Autorização em andamento...",
|
||||||
"provider.connect.status.waiting": "Aguardando autorização...",
|
"provider.connect.status.waiting": "Aguardando autorização...",
|
||||||
"provider.connect.status.failed": "Autorização falhou: {{error}}",
|
"provider.connect.status.failed": "Autorização falhou: {{error}}",
|
||||||
@@ -256,16 +148,15 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "{{provider}} conectado",
|
"provider.connect.toast.connected.title": "{{provider}} conectado",
|
||||||
"provider.connect.toast.connected.description": "Modelos do {{provider}} agora estão disponíveis para uso.",
|
"provider.connect.toast.connected.description": "Modelos do {{provider}} agora estão disponíveis para uso.",
|
||||||
"provider.custom.title": "Provedor personalizado",
|
"provider.custom.title": "Provedor personalizado",
|
||||||
"provider.custom.unavailable": "Provedores personalizados não estão disponíveis neste servidor",
|
|
||||||
"provider.custom.description.prefix": "Configure um provedor compatível com OpenAI. Veja a ",
|
"provider.custom.description.prefix": "Configure um provedor compatível com OpenAI. Veja a ",
|
||||||
"provider.custom.description.link": "documentação de configuração do provedor",
|
"provider.custom.description.link": "documentação de configuração do provedor",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
"provider.custom.field.providerID.label": "ID do provedor",
|
"provider.custom.field.providerID.label": "ID do Provedor",
|
||||||
"provider.custom.field.providerID.placeholder": "meuprovedor",
|
"provider.custom.field.providerID.placeholder": "meuprovedor",
|
||||||
"provider.custom.field.providerID.description": "Letras minúsculas, números, hifens ou sublinhados",
|
"provider.custom.field.providerID.description": "Letras minúsculas, números, hifens ou sublinhados",
|
||||||
"provider.custom.field.name.label": "Nome de exibição",
|
"provider.custom.field.name.label": "Nome de exibição",
|
||||||
"provider.custom.field.name.placeholder": "Meu provedor de IA",
|
"provider.custom.field.name.placeholder": "Meu Provedor de IA",
|
||||||
"provider.custom.field.baseURL.label": "URL base",
|
"provider.custom.field.baseURL.label": "URL Base",
|
||||||
"provider.custom.field.baseURL.placeholder": "https://api.meuprovedor.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.meuprovedor.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "Chave de API",
|
"provider.custom.field.apiKey.label": "Chave de API",
|
||||||
"provider.custom.field.apiKey.placeholder": "Chave de API",
|
"provider.custom.field.apiKey.placeholder": "Chave de API",
|
||||||
@@ -274,7 +165,7 @@ export const dict = {
|
|||||||
"provider.custom.models.id.label": "ID",
|
"provider.custom.models.id.label": "ID",
|
||||||
"provider.custom.models.id.placeholder": "id-do-modelo",
|
"provider.custom.models.id.placeholder": "id-do-modelo",
|
||||||
"provider.custom.models.name.label": "Nome",
|
"provider.custom.models.name.label": "Nome",
|
||||||
"provider.custom.models.name.placeholder": "Nome de exibição",
|
"provider.custom.models.name.placeholder": "Nome de Exibição",
|
||||||
"provider.custom.models.remove": "Remover modelo",
|
"provider.custom.models.remove": "Remover modelo",
|
||||||
"provider.custom.models.add": "Adicionar modelo",
|
"provider.custom.models.add": "Adicionar modelo",
|
||||||
"provider.custom.headers.label": "Cabeçalhos (opcional)",
|
"provider.custom.headers.label": "Cabeçalhos (opcional)",
|
||||||
@@ -284,11 +175,11 @@ export const dict = {
|
|||||||
"provider.custom.headers.value.placeholder": "valor",
|
"provider.custom.headers.value.placeholder": "valor",
|
||||||
"provider.custom.headers.remove": "Remover cabeçalho",
|
"provider.custom.headers.remove": "Remover cabeçalho",
|
||||||
"provider.custom.headers.add": "Adicionar cabeçalho",
|
"provider.custom.headers.add": "Adicionar cabeçalho",
|
||||||
"provider.custom.error.providerID.required": "O ID do provedor é obrigatório",
|
"provider.custom.error.providerID.required": "ID do Provedor é obrigatório",
|
||||||
"provider.custom.error.providerID.format": "Use letras minúsculas, números, hifens ou sublinhados",
|
"provider.custom.error.providerID.format": "Use letras minúsculas, números, hifens ou sublinhados",
|
||||||
"provider.custom.error.providerID.exists": "Esse ID de provedor já existe",
|
"provider.custom.error.providerID.exists": "Esse ID de provedor já existe",
|
||||||
"provider.custom.error.name.required": "O nome de exibição é obrigatório",
|
"provider.custom.error.name.required": "Nome de exibição é obrigatório",
|
||||||
"provider.custom.error.baseURL.required": "A URL base é obrigatória",
|
"provider.custom.error.baseURL.required": "URL Base é obrigatória",
|
||||||
"provider.custom.error.baseURL.format": "Deve começar com http:// ou https://",
|
"provider.custom.error.baseURL.format": "Deve começar com http:// ou https://",
|
||||||
"provider.custom.error.required": "Obrigatório",
|
"provider.custom.error.required": "Obrigatório",
|
||||||
"provider.custom.error.duplicate": "Duplicado",
|
"provider.custom.error.duplicate": "Duplicado",
|
||||||
@@ -324,7 +215,7 @@ export const dict = {
|
|||||||
"common.clear": "Limpar",
|
"common.clear": "Limpar",
|
||||||
"common.connect": "Conectar",
|
"common.connect": "Conectar",
|
||||||
"common.disconnect": "Desconectar",
|
"common.disconnect": "Desconectar",
|
||||||
"common.continue": "Continuar",
|
"common.continue": "Enviar",
|
||||||
"common.submit": "Enviar",
|
"common.submit": "Enviar",
|
||||||
"common.save": "Salvar",
|
"common.save": "Salvar",
|
||||||
"common.saving": "Salvando...",
|
"common.saving": "Salvando...",
|
||||||
@@ -376,7 +267,7 @@ export const dict = {
|
|||||||
"prompt.context.includeActiveFile": "Incluir arquivo ativo",
|
"prompt.context.includeActiveFile": "Incluir arquivo ativo",
|
||||||
"prompt.context.removeActiveFile": "Remover arquivo ativo do contexto",
|
"prompt.context.removeActiveFile": "Remover arquivo ativo do contexto",
|
||||||
"prompt.context.removeFile": "Remover arquivo do contexto",
|
"prompt.context.removeFile": "Remover arquivo do contexto",
|
||||||
"prompt.action.attachFile": "Adicionar arquivos",
|
"prompt.action.attachFile": "Anexar arquivo",
|
||||||
"prompt.menu.addImagesAndFiles": "Adicionar arquivos e mais",
|
"prompt.menu.addImagesAndFiles": "Adicionar arquivos e mais",
|
||||||
"prompt.menu.imagesAndFiles": "Imagens e arquivos",
|
"prompt.menu.imagesAndFiles": "Imagens e arquivos",
|
||||||
"prompt.menu.commands": "Comandos",
|
"prompt.menu.commands": "Comandos",
|
||||||
@@ -397,7 +288,7 @@ export const dict = {
|
|||||||
"prompt.toast.promptSendFailed.title": "Falha ao enviar prompt",
|
"prompt.toast.promptSendFailed.title": "Falha ao enviar prompt",
|
||||||
"prompt.toast.promptSendFailed.description": "Não foi possível recuperar a sessão",
|
"prompt.toast.promptSendFailed.description": "Não foi possível recuperar a sessão",
|
||||||
"dialog.mcp.title": "MCPs",
|
"dialog.mcp.title": "MCPs",
|
||||||
"dialog.mcp.description": "{{enabled}} de {{total}} ativados",
|
"dialog.mcp.description": "{{enabled}} of {{total}} habilitados",
|
||||||
"dialog.mcp.empty": "Nenhum MCP configurado",
|
"dialog.mcp.empty": "Nenhum MCP configurado",
|
||||||
"dialog.lsp.empty": "LSPs detectados automaticamente pelos tipos de arquivo",
|
"dialog.lsp.empty": "LSPs detectados automaticamente pelos tipos de arquivo",
|
||||||
"dialog.plugins.empty": "Plugins configurados em opencode.json",
|
"dialog.plugins.empty": "Plugins configurados em opencode.json",
|
||||||
@@ -419,11 +310,11 @@ export const dict = {
|
|||||||
"dialog.server.search.placeholder": "Buscar servidores",
|
"dialog.server.search.placeholder": "Buscar servidores",
|
||||||
"dialog.server.empty": "Nenhum servidor ainda",
|
"dialog.server.empty": "Nenhum servidor ainda",
|
||||||
"dialog.server.add.title": "Adicionar um servidor",
|
"dialog.server.add.title": "Adicionar um servidor",
|
||||||
"dialog.server.add.url": "Endereço do servidor",
|
"dialog.server.add.url": "URL do servidor",
|
||||||
"dialog.server.add.placeholder": "http://localhost:4096",
|
"dialog.server.add.placeholder": "http://localhost:4096",
|
||||||
"dialog.server.add.error": "Não foi possível conectar ao servidor",
|
"dialog.server.add.error": "Não foi possível conectar ao servidor",
|
||||||
"dialog.server.add.checking": "Verificando...",
|
"dialog.server.add.checking": "Verificando...",
|
||||||
"dialog.server.add.button": "Adicionar servidor",
|
"dialog.server.add.button": "Adicionar",
|
||||||
"dialog.server.add.name": "Nome do servidor (opcional)",
|
"dialog.server.add.name": "Nome do servidor (opcional)",
|
||||||
"dialog.server.add.namePlaceholder": "Localhost",
|
"dialog.server.add.namePlaceholder": "Localhost",
|
||||||
"dialog.server.add.username": "Nome de usuário (opcional)",
|
"dialog.server.add.username": "Nome de usuário (opcional)",
|
||||||
@@ -431,7 +322,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Editar servidor",
|
"dialog.server.edit.title": "Editar servidor",
|
||||||
"dialog.server.default.title": "Servidor padrão",
|
"dialog.server.default.title": "Servidor padrão",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Conectar a este servidor na inicialização do aplicativo em vez de iniciar um servidor local. Requer reinicialização.",
|
"Conectar a este servidor na inicialização do aplicativo ao invés de iniciar um servidor local. Requer reinicialização.",
|
||||||
"dialog.server.default.none": "Nenhum servidor selecionado",
|
"dialog.server.default.none": "Nenhum servidor selecionado",
|
||||||
"dialog.server.default.set": "Definir servidor atual como padrão",
|
"dialog.server.default.set": "Definir servidor atual como padrão",
|
||||||
"dialog.server.default.clear": "Limpar",
|
"dialog.server.default.clear": "Limpar",
|
||||||
@@ -511,21 +402,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.desktopVersion": "desktop {{version}}",
|
"wsl.onboarding.desktopVersion": "desktop {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "A versão instalada não corresponde à versão do aplicativo para desktop.",
|
"wsl.onboarding.versionMismatch": "A versão instalada não corresponde à versão do aplicativo para desktop.",
|
||||||
"wsl.onboarding.adding": "Adicionando...",
|
"wsl.onboarding.adding": "Adicionando...",
|
||||||
"help.tabs.toast.ariaLabel": "Apresentamos as abas. Organize seu trabalho e suas sessões ativas com abas",
|
|
||||||
"help.tabs.toast.dismiss": "Dispensar informações sobre as abas",
|
|
||||||
"help.tabs.title": "Apresentamos as abas",
|
|
||||||
"help.tabs.description": "Organize seu trabalho e suas sessões ativas com abas",
|
|
||||||
"help.tabs.date": "14 de julho",
|
|
||||||
"help.tabs.introduction": "Agora, o OpenCode Desktop é organizado em abas.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Inicie uma nova sessão em uma aba ou abra uma sessão existente de qualquer um dos seus projetos. Abra uma nova aba quando começar algo novo e feche-a quando terminar.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Manter algumas abas abertas facilita a organização das sessões ativas. Renomeie as abas com nomes fáceis de lembrar se pretende mantê-las abertas.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Você encontrará todas as suas sessões e projetos na nova tela Início. Ao selecionar uma sessão, ela será aberta em uma aba.",
|
|
||||||
"help.tabs.persistence": "Quando você reabrir o aplicativo, suas abas ainda estarão abertas.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"O novo design ainda não oferece suporte a Git Worktrees, mas esse recurso estará disponível em breve. Se preferir continuar usando o layout anterior, você poderá alternar entre os layouts nas Configurações. Lembre-se apenas de que o novo layout se tornará permanente em algumas semanas.",
|
|
||||||
"dialog.project.edit.title": "Editar projeto",
|
"dialog.project.edit.title": "Editar projeto",
|
||||||
"dialog.project.edit.name": "Nome",
|
"dialog.project.edit.name": "Nome",
|
||||||
"dialog.project.edit.icon": "Ícone",
|
"dialog.project.edit.icon": "Ícone",
|
||||||
@@ -536,37 +412,33 @@ export const dict = {
|
|||||||
"dialog.project.edit.color.select": "Selecionar cor {{color}}",
|
"dialog.project.edit.color.select": "Selecionar cor {{color}}",
|
||||||
"dialog.project.edit.worktree.startup": "Script de inicialização do espaço de trabalho",
|
"dialog.project.edit.worktree.startup": "Script de inicialização do espaço de trabalho",
|
||||||
"dialog.project.edit.worktree.startup.description": "Executa após criar um novo espaço de trabalho (worktree).",
|
"dialog.project.edit.worktree.startup.description": "Executa após criar um novo espaço de trabalho (worktree).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "Ex.: bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "ex: bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Não mostrar novamente",
|
"context.breakdown.title": "Detalhamento do Contexto",
|
||||||
|
|
||||||
"context.breakdown.title": "Detalhamento do contexto",
|
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Detalhamento aproximado dos tokens de entrada. "Outros" inclui definições de ferramentas e sobrecarga.',
|
'Detalhamento aproximado dos tokens de entrada. "Outros" inclui definições de ferramentas e overhead.',
|
||||||
"context.breakdown.system": "Sistema",
|
"context.breakdown.system": "Sistema",
|
||||||
"context.breakdown.user": "Usuário",
|
"context.breakdown.user": "Usuário",
|
||||||
"context.breakdown.assistant": "Assistente",
|
"context.breakdown.assistant": "Assistente",
|
||||||
"context.breakdown.tool": "Chamadas de ferramentas",
|
"context.breakdown.tool": "Chamadas de Ferramentas",
|
||||||
"context.breakdown.other": "Outros",
|
"context.breakdown.other": "Outros",
|
||||||
"context.systemPrompt.title": "Prompt do sistema",
|
"context.systemPrompt.title": "Prompt do Sistema",
|
||||||
"context.rawMessages.title": "Mensagens brutas",
|
"context.rawMessages.title": "Mensagens brutas",
|
||||||
"context.export.session": "Exportar sessão",
|
|
||||||
|
|
||||||
"context.stats.session": "Sessão",
|
"context.stats.session": "Sessão",
|
||||||
"context.stats.messages": "Mensagens",
|
"context.stats.messages": "Mensagens",
|
||||||
"context.stats.provider": "Provedor",
|
"context.stats.provider": "Provedor",
|
||||||
"context.stats.model": "Modelo",
|
"context.stats.model": "Modelo",
|
||||||
"context.stats.limit": "Limite de contexto",
|
"context.stats.limit": "Limite de Contexto",
|
||||||
"context.stats.totalTokens": "Total de tokens",
|
"context.stats.totalTokens": "Total de Tokens",
|
||||||
"context.stats.usage": "Uso",
|
"context.stats.usage": "Uso",
|
||||||
"context.stats.inputTokens": "Tokens de entrada",
|
"context.stats.inputTokens": "Tokens de Entrada",
|
||||||
"context.stats.outputTokens": "Tokens de saída",
|
"context.stats.outputTokens": "Tokens de Saída",
|
||||||
"context.stats.reasoningTokens": "Tokens de raciocínio",
|
"context.stats.reasoningTokens": "Tokens de Raciocínio",
|
||||||
"context.stats.cacheTokens": "Tokens de cache (leitura/escrita)",
|
"context.stats.cacheTokens": "Tokens de Cache (leitura/escrita)",
|
||||||
"context.stats.userMessages": "Mensagens do usuário",
|
"context.stats.userMessages": "Mensagens de Usuário",
|
||||||
"context.stats.assistantMessages": "Mensagens do assistente",
|
"context.stats.assistantMessages": "Mensagens do Assistente",
|
||||||
"context.stats.totalCost": "Custo total",
|
"context.stats.totalCost": "Custo Total",
|
||||||
"context.stats.sessionCreated": "Sessão criada",
|
"context.stats.sessionCreated": "Sessão Criada",
|
||||||
"context.stats.lastActivity": "Última atividade",
|
"context.stats.lastActivity": "Última Atividade",
|
||||||
"context.usage.tokens": "Tokens",
|
"context.usage.tokens": "Tokens",
|
||||||
"context.usage.usage": "Uso",
|
"context.usage.usage": "Uso",
|
||||||
"context.usage.cost": "Custo",
|
"context.usage.cost": "Custo",
|
||||||
@@ -617,11 +489,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.success.description": "Sessão deixou de ser compartilhada com sucesso!",
|
"toast.session.unshare.success.description": "Sessão deixou de ser compartilhada com sucesso!",
|
||||||
"toast.session.unshare.failed.title": "Falha ao parar de compartilhar sessão",
|
"toast.session.unshare.failed.title": "Falha ao parar de compartilhar sessão",
|
||||||
"toast.session.unshare.failed.description": "Ocorreu um erro ao parar de compartilhar a sessão",
|
"toast.session.unshare.failed.description": "Ocorreu um erro ao parar de compartilhar a sessão",
|
||||||
"toast.session.export.success.title": "Sessão exportada",
|
|
||||||
"toast.session.export.success.description": "Sessão salva em {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Falha ao exportar sessão",
|
|
||||||
"toast.session.export.failed.description": "Ocorreu um erro ao exportar a sessão",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Falha ao carregar sessões para {{project}}",
|
"toast.session.listFailed.title": "Falha ao carregar sessões para {{project}}",
|
||||||
"toast.update.title": "Atualização disponível",
|
"toast.update.title": "Atualização disponível",
|
||||||
"toast.update.description": "Uma nova versão do OpenCode ({{version}}) está disponível para instalação.",
|
"toast.update.description": "Uma nova versão do OpenCode ({{version}}) está disponível para instalação.",
|
||||||
@@ -630,7 +497,7 @@ export const dict = {
|
|||||||
"error.page.title": "Algo deu errado",
|
"error.page.title": "Algo deu errado",
|
||||||
"error.page.description": "Ocorreu um erro ao carregar a aplicação.",
|
"error.page.description": "Ocorreu um erro ao carregar a aplicação.",
|
||||||
"error.page.description.localServerStartup": "Ocorreu um erro ao iniciar o servidor local.",
|
"error.page.description.localServerStartup": "Ocorreu um erro ao iniciar o servidor local.",
|
||||||
"error.page.details.label": "Detalhes do erro",
|
"error.page.details.label": "Detalhes do Erro",
|
||||||
"error.page.action.restart": "Reiniciar",
|
"error.page.action.restart": "Reiniciar",
|
||||||
"error.page.action.report": "Reportar erro",
|
"error.page.action.report": "Reportar erro",
|
||||||
"error.page.action.reported": "Erro reportado",
|
"error.page.action.reported": "Erro reportado",
|
||||||
@@ -703,7 +570,7 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "Esta aba aponta para uma sessão que não existe mais neste servidor.",
|
"session.error.notFound.description": "Esta aba aponta para uma sessão que não existe mais neste servidor.",
|
||||||
"session.error.notFound.closeTab": "Fechar aba",
|
"session.error.notFound.closeTab": "Fechar aba",
|
||||||
"session.error.serverConnection": "Não é possível conectar a este servidor",
|
"session.error.serverConnection": "Não é possível conectar a este servidor",
|
||||||
"session.review.filesChanged": "{{count}} arquivos alterados",
|
"session.review.filesChanged": "{{count}} Arquivos Alterados",
|
||||||
"session.review.change.one": "Alteração",
|
"session.review.change.one": "Alteração",
|
||||||
"session.review.change.other": "Alterações",
|
"session.review.change.other": "Alterações",
|
||||||
"session.review.loadingChanges": "Carregando alterações...",
|
"session.review.loadingChanges": "Carregando alterações...",
|
||||||
@@ -730,17 +597,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "Minimizar pergunta",
|
"session.question.minimize": "Minimizar pergunta",
|
||||||
"session.question.restore": "Restaurar pergunta",
|
"session.question.restore": "Restaurar pergunta",
|
||||||
"session.question.pending.one": "{{count}} pergunta pendente",
|
"session.question.pending.one": "{{count}} pergunta pendente",
|
||||||
"session.question.pending.many": "{{count}} de perguntas pendentes",
|
|
||||||
"session.question.pending.other": "{{count}} perguntas pendentes",
|
"session.question.pending.other": "{{count}} perguntas pendentes",
|
||||||
"session.followupDock.summary.one": "{{count}} mensagem na fila",
|
"session.followupDock.summary.one": "{{count}} mensagem na fila",
|
||||||
"session.followupDock.summary.many": "{{count}} de mensagens na fila",
|
|
||||||
"session.followupDock.summary.other": "{{count}} mensagens na fila",
|
"session.followupDock.summary.other": "{{count}} mensagens na fila",
|
||||||
"session.followupDock.sendNow": "Enviar agora",
|
"session.followupDock.sendNow": "Enviar agora",
|
||||||
"session.followupDock.edit": "Editar",
|
"session.followupDock.edit": "Editar",
|
||||||
"session.followupDock.collapse": "Recolher mensagens na fila",
|
"session.followupDock.collapse": "Recolher mensagens na fila",
|
||||||
"session.followupDock.expand": "Expandir mensagens na fila",
|
"session.followupDock.expand": "Expandir mensagens na fila",
|
||||||
"session.revertDock.summary.one": "{{count}} mensagem revertida",
|
"session.revertDock.summary.one": "{{count}} mensagem revertida",
|
||||||
"session.revertDock.summary.many": "{{count}} de mensagens revertidas",
|
|
||||||
"session.revertDock.summary.other": "{{count}} mensagens revertidas",
|
"session.revertDock.summary.other": "{{count}} mensagens revertidas",
|
||||||
"session.revertDock.collapse": "Recolher mensagens revertidas",
|
"session.revertDock.collapse": "Recolher mensagens revertidas",
|
||||||
"session.revertDock.expand": "Expandir mensagens revertidas",
|
"session.revertDock.expand": "Expandir mensagens revertidas",
|
||||||
@@ -792,23 +656,15 @@ export const dict = {
|
|||||||
"terminal.title": "Terminal",
|
"terminal.title": "Terminal",
|
||||||
"terminal.title.numbered": "Terminal {{number}}",
|
"terminal.title.numbered": "Terminal {{number}}",
|
||||||
"terminal.close": "Fechar terminal",
|
"terminal.close": "Fechar terminal",
|
||||||
"terminal.connectionLost.title": "Conexão perdida",
|
"terminal.connectionLost.title": "Conexão Perdida",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"A conexão do terminal foi interrompida. Isso pode acontecer quando o servidor reinicia.",
|
"A conexão do terminal foi interrompida. Isso pode acontecer quando o servidor reinicia.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"O tíquete de conexão PTY foi rejeitado pelas verificações de origem ou CSRF. Verifique a configuração de CORS do servidor.",
|
|
||||||
"terminal.connectTicket.statusError": "O tíquete de conexão PTY falhou com o status {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Atualizar",
|
|
||||||
"titlebar.updateVersion": "Atualizar {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Fechar aba",
|
"common.closeTab": "Fechar aba",
|
||||||
"common.dismiss": "Descartar",
|
"common.dismiss": "Descartar",
|
||||||
"common.requestFailed": "Requisição falhou",
|
"common.requestFailed": "Requisição falhou",
|
||||||
"common.moreOptions": "Mais opções",
|
"common.moreOptions": "Mais opções",
|
||||||
"common.learnMore": "Saiba mais",
|
"common.learnMore": "Saiba mais",
|
||||||
"common.rename": "Renomear",
|
"common.rename": "Renomear",
|
||||||
"common.export": "Exportar",
|
|
||||||
"common.reset": "Redefinir",
|
"common.reset": "Redefinir",
|
||||||
"common.archive": "Arquivar",
|
"common.archive": "Arquivar",
|
||||||
"common.delete": "Excluir",
|
"common.delete": "Excluir",
|
||||||
@@ -850,7 +706,7 @@ export const dict = {
|
|||||||
"settings.general.row.shell.title": "Shell do terminal",
|
"settings.general.row.shell.title": "Shell do terminal",
|
||||||
"settings.general.row.shell.description":
|
"settings.general.row.shell.description":
|
||||||
"Escolha o shell usado no terminal. Os shells compatíveis também são usados nas chamadas de ferramentas do agente.",
|
"Escolha o shell usado no terminal. Os shells compatíveis também são usados nas chamadas de ferramentas do agente.",
|
||||||
"settings.general.row.shell.autoDefault": "Automático (padrão)",
|
"settings.general.row.shell.autoDefault": "Automático (Padrão)",
|
||||||
"settings.general.row.shell.terminalOnly": "somente no terminal",
|
"settings.general.row.shell.terminalOnly": "somente no terminal",
|
||||||
"settings.general.row.appearance.title": "Aparência",
|
"settings.general.row.appearance.title": "Aparência",
|
||||||
"settings.general.row.appearance.description": "Personalize como o OpenCode aparece no seu dispositivo",
|
"settings.general.row.appearance.description": "Personalize como o OpenCode aparece no seu dispositivo",
|
||||||
@@ -883,9 +739,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Navegação inferior",
|
"settings.general.row.mobileTitlebarBottom.title": "Navegação inferior",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Posicionar a barra de título e as abas da sessão na parte inferior da tela em dispositivos móveis",
|
"Posicionar a barra de título e as abas da sessão na parte inferior da tela em dispositivos móveis",
|
||||||
"settings.general.row.showCustomAgents.title": "Mostrar agente",
|
"settings.general.row.showCustomAgents.title": "Agentes personalizados",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Mostrar o seletor de agentes na área de composição",
|
||||||
"Alternar entre agentes na área de composição. Quando oculto, usa o agente Build como padrão.",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "Mostrar resumos de raciocínio",
|
"settings.general.row.reasoningSummaries.title": "Mostrar resumos de raciocínio",
|
||||||
"settings.general.row.reasoningSummaries.description": "Exibir resumos de raciocínio do modelo na linha do tempo",
|
"settings.general.row.reasoningSummaries.description": "Exibir resumos de raciocínio do modelo na linha do tempo",
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "Expandir partes da ferramenta shell",
|
"settings.general.row.shellToolPartsExpanded.title": "Expandir partes da ferramenta shell",
|
||||||
@@ -968,15 +823,14 @@ export const dict = {
|
|||||||
"sound.option.yup06": "Sim 06",
|
"sound.option.yup06": "Sim 06",
|
||||||
"settings.general.notifications.agent.title": "Agente",
|
"settings.general.notifications.agent.title": "Agente",
|
||||||
"settings.general.notifications.agent.description":
|
"settings.general.notifications.agent.description":
|
||||||
"Mostrar notificação do sistema quando o agente concluir o trabalho ou precisar de atenção",
|
"Mostrar notificação do sistema quando o agente estiver completo ou precisar de atenção",
|
||||||
"settings.general.notifications.permissions.title": "Permissões",
|
"settings.general.notifications.permissions.title": "Permissões",
|
||||||
"settings.general.notifications.permissions.description":
|
"settings.general.notifications.permissions.description":
|
||||||
"Mostrar notificação do sistema quando uma permissão for necessária",
|
"Mostrar notificação do sistema quando uma permissão for necessária",
|
||||||
"settings.general.notifications.errors.title": "Erros",
|
"settings.general.notifications.errors.title": "Erros",
|
||||||
"settings.general.notifications.errors.description": "Mostrar notificação do sistema quando ocorrer um erro",
|
"settings.general.notifications.errors.description": "Mostrar notificação do sistema quando ocorrer um erro",
|
||||||
"settings.general.sounds.agent.title": "Agente",
|
"settings.general.sounds.agent.title": "Agente",
|
||||||
"settings.general.sounds.agent.description":
|
"settings.general.sounds.agent.description": "Reproduzir som quando o agente estiver completo ou precisar de atenção",
|
||||||
"Reproduzir som quando o agente concluir o trabalho ou precisar de atenção",
|
|
||||||
"settings.general.sounds.permissions.title": "Permissões",
|
"settings.general.sounds.permissions.title": "Permissões",
|
||||||
"settings.general.sounds.permissions.description": "Reproduzir som quando uma permissão for necessária",
|
"settings.general.sounds.permissions.description": "Reproduzir som quando uma permissão for necessária",
|
||||||
"settings.general.sounds.errors.title": "Erros",
|
"settings.general.sounds.errors.title": "Erros",
|
||||||
@@ -1024,7 +878,8 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.title": "Ler",
|
"settings.permissions.tool.read.title": "Ler",
|
||||||
"settings.permissions.tool.read.description": "Ler um arquivo (corresponde ao caminho do arquivo)",
|
"settings.permissions.tool.read.description": "Ler um arquivo (corresponde ao caminho do arquivo)",
|
||||||
"settings.permissions.tool.edit.title": "Editar",
|
"settings.permissions.tool.edit.title": "Editar",
|
||||||
"settings.permissions.tool.edit.description": "Modificar arquivos, incluindo edições, escritas e patches",
|
"settings.permissions.tool.edit.description":
|
||||||
|
"Modificar arquivos, incluindo edições, escritas, patches e multi-edições",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Corresponder arquivos usando padrões glob",
|
"settings.permissions.tool.glob.description": "Corresponder arquivos usando padrões glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
@@ -1034,7 +889,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "Executar comandos shell",
|
"settings.permissions.tool.bash.description": "Executar comandos shell",
|
||||||
"settings.permissions.tool.task.title": "Tarefa",
|
"settings.permissions.tool.task.title": "Tarefa",
|
||||||
"settings.permissions.tool.task.description": "Iniciar subagentes",
|
"settings.permissions.tool.task.description": "Lançar sub-agentes",
|
||||||
"settings.permissions.tool.skill.title": "Habilidade",
|
"settings.permissions.tool.skill.title": "Habilidade",
|
||||||
"settings.permissions.tool.skill.description": "Carregar uma habilidade por nome",
|
"settings.permissions.tool.skill.description": "Carregar uma habilidade por nome",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
@@ -1091,7 +946,7 @@ export const dict = {
|
|||||||
"common.time.hoursAgo.short": "{{count}}h atrás",
|
"common.time.hoursAgo.short": "{{count}}h atrás",
|
||||||
"common.time.daysAgo.short": "{{count}}d atrás",
|
"common.time.daysAgo.short": "{{count}}d atrás",
|
||||||
"settings.providers.connected.environmentDescription": "Conectado a partir de suas variáveis de ambiente",
|
"settings.providers.connected.environmentDescription": "Conectado a partir de suas variáveis de ambiente",
|
||||||
"settings.providers.custom.description": "Adicionar um provedor compatível com OpenAI por meio da URL base.",
|
"settings.providers.custom.description": "Adicionar um provedor compatível com a OpenAI através do URL base.",
|
||||||
|
|
||||||
"app.server.unreachable": "Não foi possível conectar a {{server}}",
|
"app.server.unreachable": "Não foi possível conectar a {{server}}",
|
||||||
"app.server.retrying": "Tentando novamente automaticamente...",
|
"app.server.retrying": "Tentando novamente automaticamente...",
|
||||||
@@ -1107,9 +962,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} de {{total}} perguntas",
|
"session.question.progress": "{{current}} de {{total}} perguntas",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Explorador de Arquivos",
|
"session.header.open.fileExplorer": "Explorador de Arquivos",
|
||||||
"session.header.reveal.finder": "Revelar no Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Revelar no Explorador de Arquivos",
|
|
||||||
"session.header.reveal.containingFolder": "Abrir pasta que contém este item",
|
|
||||||
"session.header.open.fileManager": "Gerenciador de Arquivos",
|
"session.header.open.fileManager": "Gerenciador de Arquivos",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1147,14 +999,6 @@ export const dict = {
|
|||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Heap JS usado vs limite de heap. Apenas Chromium.",
|
"debugBar.mem.tipUnavailable": "Heap JS usado vs limite de heap. Apenas Chromium.",
|
||||||
"debugBar.mem.tip": "Heap JS usado vs limite de heap. {{used}} de {{limit}}.",
|
"debugBar.mem.tip": "Heap JS usado vs limite de heap. {{used}} de {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Forçar estilos de foco em todos os elementos interativos",
|
|
||||||
"debugBar.focus.on": "LIGADO",
|
|
||||||
"debugBar.focus.off": "DESLIGADO",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Forçar a direção do layout de todo o aplicativo sem alterar o idioma selecionado",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
|
|||||||
+42
-198
@@ -1,104 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Datoteka",
|
|
||||||
"desktop.menu.edit": "Uredi",
|
|
||||||
"desktop.menu.view": "Prikaz",
|
|
||||||
"desktop.menu.go": "Idi",
|
|
||||||
"desktop.menu.window": "Prozor",
|
|
||||||
"desktop.menu.help": "Pomoć",
|
|
||||||
"desktop.menu.checkForUpdates": "Provjeri ima li ažuriranja...",
|
|
||||||
"desktop.menu.settings": "Postavke",
|
|
||||||
"desktop.menu.reloadWebview": "Ponovo učitaj Webview",
|
|
||||||
"desktop.menu.restart": "Ponovo pokreni",
|
|
||||||
"desktop.menu.exportLogs": "Izvezi zapisnike...",
|
|
||||||
"desktop.menu.newSession": "Nova sesija",
|
|
||||||
"desktop.menu.openProject": "Otvori projekat...",
|
|
||||||
"desktop.menu.newWindow": "Novi prozor",
|
|
||||||
"desktop.menu.closeWindow": "Zatvori prozor",
|
|
||||||
"desktop.menu.undo": "Poništi",
|
|
||||||
"desktop.menu.redo": "Vrati",
|
|
||||||
"desktop.menu.cut": "Izreži",
|
|
||||||
"desktop.menu.copy": "Kopiraj",
|
|
||||||
"desktop.menu.paste": "Zalijepi",
|
|
||||||
"desktop.menu.delete": "Izbriši",
|
|
||||||
"desktop.menu.selectAll": "Odaberi sve",
|
|
||||||
"desktop.menu.toggleSidebar": "Prikaži ili sakrij bočnu traku",
|
|
||||||
"desktop.menu.toggleTerminal": "Prikaži ili sakrij terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Prikaži ili sakrij stablo datoteka",
|
|
||||||
"desktop.menu.reload": "Ponovo učitaj",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Prikaži ili sakrij alate za programere",
|
|
||||||
"desktop.menu.actualSize": "Stvarna veličina",
|
|
||||||
"desktop.menu.zoomIn": "Uvećaj",
|
|
||||||
"desktop.menu.zoomOut": "Umanji",
|
|
||||||
"desktop.menu.toggleFullScreen": "Prikaži ili sakrij prikaz preko cijelog ekrana",
|
|
||||||
"desktop.menu.back": "Nazad",
|
|
||||||
"desktop.menu.forward": "Naprijed",
|
|
||||||
"desktop.menu.previousSession": "Prethodna sesija",
|
|
||||||
"desktop.menu.nextSession": "Sljedeća sesija",
|
|
||||||
"desktop.menu.previousProject": "Prethodni projekat",
|
|
||||||
"desktop.menu.nextProject": "Sljedeći projekat",
|
|
||||||
"desktop.menu.minimize": "Minimiziraj",
|
|
||||||
"desktop.menu.maximize": "Maksimiziraj",
|
|
||||||
"desktop.menu.documentation": "Dokumentacija za OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Forum za podršku",
|
|
||||||
"desktop.menu.shareFeedback": "Pošalji povratne informacije",
|
|
||||||
"desktop.menu.reportBug": "Prijavi grešku",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode meni",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Provjera ažuriranja nije uspjela.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Greška pri ažuriranju",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Sve je ažurno.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Nema ažuriranja",
|
|
||||||
"desktop.updater.dialog.ready.message":
|
|
||||||
"Ažuriranje {{version}} je preuzeto. Želiš li sada ponovo pokrenuti aplikaciju?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Ažuriranje je spremno",
|
|
||||||
"desktop.updater.dialog.restart": "Ponovo pokreni",
|
|
||||||
"desktop.updater.dialog.later": "Kasnije",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Ponovo pokreni",
|
|
||||||
"desktop.recovery.action.exportLogs": "Izvezi zapisnike",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Nastavi čekati",
|
|
||||||
"desktop.recovery.action.quit": "Izađi",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode se nije uspio učitati",
|
|
||||||
"desktop.recovery.terminated": "Prozor OpenCode-a neočekivano je zatvoren",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode ne reaguje",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Možeš ponovo pokrenuti aplikaciju, otvoriti zapisnike ili nastaviti čekati.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Prozor: {{window}}\nURL: {{url}}\nGreška: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Prozor: {{window}}\nRazlog: {{reason}}\nKod: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<nepoznato>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Odaberi fasciklu",
|
|
||||||
"desktop.dialog.chooseFile": "Odaberi datoteku",
|
|
||||||
"desktop.dialog.saveFile": "Sačuvaj datoteku",
|
|
||||||
"desktop.dialog.files": "Datoteke",
|
|
||||||
"desktop.server.local": "Lokalni server",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL je dostupan samo u Windowsu",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL nije dostupan",
|
|
||||||
"desktop.wsl.error.listInstalled": "Nije uspjelo prikazivanje instaliranih WSL distribucija",
|
|
||||||
"desktop.wsl.error.listOnline": "Nije uspjelo prikazivanje dostupnih WSL distribucija",
|
|
||||||
"desktop.wsl.error.executeDistro": "Nije moguće izvršiti komande u distribuciji",
|
|
||||||
"desktop.wsl.error.installWsl": "Instalacija WSL-a nije uspjela",
|
|
||||||
"desktop.wsl.error.installDistro": "Instalacija distribucije nije uspjela: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Instalacija OpenCode-a nije uspjela",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "Distribucija {{distro}} je već dodana",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode nije instaliran u ovoj distribuciji",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode je instaliran, ali se ne može pokrenuti",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode nije instaliran u distribuciji {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Ažuriranje OpenCode-a je završeno, ali {{distro}} i dalje prijavljuje {{installed}}; očekivano je {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "nema verzije",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL server se zatvorio nakon pokretanja (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL server se zatvorio prije nego što je postao dostupan (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Isteklo je vrijeme provjere dostupnosti komponente Sidecar za {{distro}} nakon {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Isteklo je vrijeme za {{command}} {{args}} nakon {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Nije uspjelo dohvaćanje porta",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "Datoteka nije odabrana u izborniku",
|
|
||||||
"desktop.picker.error.sizeLimit": "Odabrani prilozi premašuju ograničenje od {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "Predloženo",
|
"command.category.suggested": "Predloženo",
|
||||||
"command.category.view": "Prikaz",
|
"command.category.view": "Prikaz",
|
||||||
"command.category.project": "Projekat",
|
"command.category.project": "Projekat",
|
||||||
@@ -116,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Dozvole",
|
"command.category.permissions": "Dozvole",
|
||||||
"command.category.workspace": "Radni prostor",
|
"command.category.workspace": "Radni prostor",
|
||||||
"command.category.settings": "Postavke",
|
"command.category.settings": "Postavke",
|
||||||
"command.logs.export": "Izvezi zapisnike",
|
|
||||||
|
|
||||||
"theme.scheme.system": "Sistem",
|
"theme.scheme.system": "Sistem",
|
||||||
"theme.scheme.light": "Svijetlo",
|
"theme.scheme.light": "Svijetlo",
|
||||||
@@ -193,9 +92,6 @@ export const dict = {
|
|||||||
"command.session.unshare": "Ukini dijeljenje sesije",
|
"command.session.unshare": "Ukini dijeljenje sesije",
|
||||||
"command.session.unshare.description": "Zaustavi dijeljenje ove sesije",
|
"command.session.unshare.description": "Zaustavi dijeljenje ove sesije",
|
||||||
|
|
||||||
"command.session.export": "Izvezi sesiju",
|
|
||||||
"command.session.export.description": "Izvezi cijeli zapis sesije u JSON formatu",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Pretraži datoteke, komande i sesije",
|
"palette.search.placeholder": "Pretraži datoteke, komande i sesije",
|
||||||
"palette.search.placeholder.home": "Pretraži komande i sesije",
|
"palette.search.placeholder.home": "Pretraži komande i sesije",
|
||||||
"palette.empty": "Nema rezultata",
|
"palette.empty": "Nema rezultata",
|
||||||
@@ -206,7 +102,6 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Nema pronađenih provajdera",
|
"dialog.provider.empty": "Nema pronađenih provajdera",
|
||||||
"dialog.provider.group.popular": "Popularno",
|
"dialog.provider.group.popular": "Popularno",
|
||||||
"dialog.provider.group.other": "Ostalo",
|
"dialog.provider.group.other": "Ostalo",
|
||||||
"dialog.provider.custom.label": "Prilagođeni provajder kompatibilan s OpenAI-jem",
|
|
||||||
"dialog.provider.tag.recommended": "Preporučeno",
|
"dialog.provider.tag.recommended": "Preporučeno",
|
||||||
"dialog.provider.opencode.note": "Kurirani modeli uključujući Claude, GPT, Gemini i druge",
|
"dialog.provider.opencode.note": "Kurirani modeli uključujući Claude, GPT, Gemini i druge",
|
||||||
"dialog.provider.opencode.tagline": "Pouzdani optimizovani modeli",
|
"dialog.provider.opencode.tagline": "Pouzdani optimizovani modeli",
|
||||||
@@ -227,7 +122,6 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.model.unpaid.freeModels.title": "Besplatni modeli koje obezbjeđuje OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Besplatni modeli koje obezbjeđuje OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Dodaj još modela od popularnih provajdera",
|
"dialog.model.unpaid.addMore.title": "Dodaj još modela od popularnih provajdera",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Pogledaj još više od 70 provajdera",
|
|
||||||
|
|
||||||
"dialog.provider.viewAll": "Prikaži više provajdera",
|
"dialog.provider.viewAll": "Prikaži više provajdera",
|
||||||
|
|
||||||
@@ -235,8 +129,6 @@ export const dict = {
|
|||||||
"provider.connect.title.anthropicProMax": "Prijavi se putem Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Prijavi se putem Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Odaberi način prijave za {{provider}}.",
|
"provider.connect.selectMethod": "Odaberi način prijave za {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "API ključ",
|
"provider.connect.method.apiKey": "API ključ",
|
||||||
"provider.connect.method.browser": "Preglednik",
|
|
||||||
"provider.connect.method.headless": "Bez grafičkog interfejsa",
|
|
||||||
"provider.connect.status.inProgress": "Autorizacija je u toku...",
|
"provider.connect.status.inProgress": "Autorizacija je u toku...",
|
||||||
"provider.connect.status.waiting": "Čekanje na autorizaciju...",
|
"provider.connect.status.waiting": "Čekanje na autorizaciju...",
|
||||||
"provider.connect.status.failed": "Autorizacija nije uspjela: {{error}}",
|
"provider.connect.status.failed": "Autorizacija nije uspjela: {{error}}",
|
||||||
@@ -269,7 +161,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.description": "{{provider}} modeli su sada dostupni za korištenje.",
|
"provider.connect.toast.connected.description": "{{provider}} modeli su sada dostupni za korištenje.",
|
||||||
|
|
||||||
"provider.custom.title": "Prilagođeni provajder",
|
"provider.custom.title": "Prilagođeni provajder",
|
||||||
"provider.custom.unavailable": "Prilagođeni provajderi nisu dostupni na ovom serveru",
|
|
||||||
"provider.custom.description.prefix": "Konfiguriši OpenAI-kompatibilnog provajdera. Pogledaj ",
|
"provider.custom.description.prefix": "Konfiguriši OpenAI-kompatibilnog provajdera. Pogledaj ",
|
||||||
"provider.custom.description.link": "dokumentaciju za konfiguraciju provajdera",
|
"provider.custom.description.link": "dokumentaciju za konfiguraciju provajdera",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -341,7 +232,7 @@ export const dict = {
|
|||||||
"common.clear": "Očisti",
|
"common.clear": "Očisti",
|
||||||
"common.connect": "Poveži",
|
"common.connect": "Poveži",
|
||||||
"common.disconnect": "Prekini vezu",
|
"common.disconnect": "Prekini vezu",
|
||||||
"common.continue": "Nastavi",
|
"common.continue": "Pošalji",
|
||||||
"common.submit": "Pošalji",
|
"common.submit": "Pošalji",
|
||||||
"common.save": "Sačuvaj",
|
"common.save": "Sačuvaj",
|
||||||
"common.saving": "Čuvanje...",
|
"common.saving": "Čuvanje...",
|
||||||
@@ -372,7 +263,7 @@ export const dict = {
|
|||||||
"prompt.example.11": "Optimizuj upite prema bazi podataka",
|
"prompt.example.11": "Optimizuj upite prema bazi podataka",
|
||||||
"prompt.example.12": "Dodaj validaciju ulaza",
|
"prompt.example.12": "Dodaj validaciju ulaza",
|
||||||
"prompt.example.13": "Napravi novu komponentu za...",
|
"prompt.example.13": "Napravi novu komponentu za...",
|
||||||
"prompt.example.14": "Kako da postavim ovaj projekat?",
|
"prompt.example.14": "Kako da deployam ovaj projekat?",
|
||||||
"prompt.example.15": "Pregledaj moj kod prema najboljim praksama",
|
"prompt.example.15": "Pregledaj moj kod prema najboljim praksama",
|
||||||
"prompt.example.16": "Dodaj obradu grešaka u ovu funkciju",
|
"prompt.example.16": "Dodaj obradu grešaka u ovu funkciju",
|
||||||
"prompt.example.17": "Objasni ovaj regex obrazac",
|
"prompt.example.17": "Objasni ovaj regex obrazac",
|
||||||
@@ -380,14 +271,14 @@ export const dict = {
|
|||||||
"prompt.example.19": "Dodaj logovanje kroz cijelu bazu koda",
|
"prompt.example.19": "Dodaj logovanje kroz cijelu bazu koda",
|
||||||
"prompt.example.20": "Koje su zavisnosti zastarjele?",
|
"prompt.example.20": "Koje su zavisnosti zastarjele?",
|
||||||
"prompt.example.21": "Pomozi mi da napišem migracijsku skriptu",
|
"prompt.example.21": "Pomozi mi da napišem migracijsku skriptu",
|
||||||
"prompt.example.22": "Implementiraj keširanje za ovu krajnju tačku",
|
"prompt.example.22": "Implementiraj keširanje za ovaj endpoint",
|
||||||
"prompt.example.23": "Dodaj paginaciju u ovu listu",
|
"prompt.example.23": "Dodaj paginaciju u ovu listu",
|
||||||
"prompt.example.24": "Napravi CLI komandu za...",
|
"prompt.example.24": "Napravi CLI komandu za...",
|
||||||
"prompt.example.25": "Kako ovdje rade varijable okruženja?",
|
"prompt.example.25": "Kako ovdje rade varijable okruženja?",
|
||||||
|
|
||||||
"prompt.popover.emptyResults": "Nema rezultata",
|
"prompt.popover.emptyResults": "Nema rezultata",
|
||||||
"prompt.popover.emptyCommands": "Nema komandi",
|
"prompt.popover.emptyCommands": "Nema komandi",
|
||||||
"prompt.dropzone.label": "Ovdje prevuci slike, PDF-ove ili tekstualne datoteke",
|
"prompt.dropzone.label": "Ovdje prevucite slike, PDF-ove ili tekstualne datoteke",
|
||||||
"prompt.dropzone.file.label": "Spusti za @spominjanje datoteke",
|
"prompt.dropzone.file.label": "Spusti za @spominjanje datoteke",
|
||||||
"prompt.slash.badge.custom": "prilagođeno",
|
"prompt.slash.badge.custom": "prilagođeno",
|
||||||
"prompt.slash.badge.skill": "skill",
|
"prompt.slash.badge.skill": "skill",
|
||||||
@@ -396,7 +287,7 @@ export const dict = {
|
|||||||
"prompt.context.includeActiveFile": "Uključi aktivnu datoteku",
|
"prompt.context.includeActiveFile": "Uključi aktivnu datoteku",
|
||||||
"prompt.context.removeActiveFile": "Ukloni aktivnu datoteku iz konteksta",
|
"prompt.context.removeActiveFile": "Ukloni aktivnu datoteku iz konteksta",
|
||||||
"prompt.context.removeFile": "Ukloni datoteku iz konteksta",
|
"prompt.context.removeFile": "Ukloni datoteku iz konteksta",
|
||||||
"prompt.action.attachFile": "Dodaj datoteke",
|
"prompt.action.attachFile": "Priloži datoteku",
|
||||||
"prompt.menu.addImagesAndFiles": "Dodaj datoteke i više",
|
"prompt.menu.addImagesAndFiles": "Dodaj datoteke i više",
|
||||||
"prompt.menu.imagesAndFiles": "Slike i datoteke",
|
"prompt.menu.imagesAndFiles": "Slike i datoteke",
|
||||||
"prompt.menu.commands": "Komande",
|
"prompt.menu.commands": "Komande",
|
||||||
@@ -420,7 +311,7 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.mcp.title": "MCP-ovi",
|
"dialog.mcp.title": "MCP-ovi",
|
||||||
"dialog.mcp.description": "{{enabled}} od {{total}} omogućeno",
|
"dialog.mcp.description": "{{enabled}} od {{total}} omogućeno",
|
||||||
"dialog.mcp.empty": "Nema konfigurisanih MCP-ova",
|
"dialog.mcp.empty": "Nema konfigurisnih MCP-ova",
|
||||||
|
|
||||||
"dialog.lsp.empty": "LSP-ovi se automatski otkrivaju prema tipu datoteke",
|
"dialog.lsp.empty": "LSP-ovi se automatski otkrivaju prema tipu datoteke",
|
||||||
"dialog.plugins.empty": "Plugini su konfigurisani u opencode.json",
|
"dialog.plugins.empty": "Plugini su konfigurisani u opencode.json",
|
||||||
@@ -428,18 +319,18 @@ export const dict = {
|
|||||||
"mcp.status.connected": "povezano",
|
"mcp.status.connected": "povezano",
|
||||||
"mcp.status.failed": "neuspjelo",
|
"mcp.status.failed": "neuspjelo",
|
||||||
"mcp.status.needs_auth": "potrebna autentifikacija",
|
"mcp.status.needs_auth": "potrebna autentifikacija",
|
||||||
"mcp.auth.clickToAuthenticate": "Klikni za autentifikaciju",
|
"mcp.auth.clickToAuthenticate": "Kliknite za autentifikaciju",
|
||||||
"mcp.status.disabled": "onemogućeno",
|
"mcp.status.disabled": "onemogućeno",
|
||||||
|
|
||||||
"dialog.fork.empty": "Nema poruka za fork",
|
"dialog.fork.empty": "Nema poruka za fork",
|
||||||
|
|
||||||
"dialog.directory.search.placeholder": "Pretraži fascikle",
|
"dialog.directory.search.placeholder": "Pretraži foldere",
|
||||||
"dialog.directory.empty": "Nema pronađenih fascikli",
|
"dialog.directory.empty": "Nema pronađenih foldera",
|
||||||
"dialog.directory.action.selectFile": "Odaberi datoteku",
|
"dialog.directory.action.selectFile": "Odaberi datoteku",
|
||||||
"dialog.directory.action.selectFolder": "Odaberi fasciklu",
|
"dialog.directory.action.selectFolder": "Odaberi folder",
|
||||||
"dialog.directory.root": "Korijen",
|
"dialog.directory.root": "Korijen",
|
||||||
"dialog.directory.parent": "Nadređena fascikla",
|
"dialog.directory.parent": "Nadređeni folder",
|
||||||
"dialog.directory.readError": "Nije moguće pročitati ovu fasciklu",
|
"dialog.directory.readError": "Nije moguće pročitati ovaj folder",
|
||||||
|
|
||||||
"dialog.server.title": "Serveri",
|
"dialog.server.title": "Serveri",
|
||||||
"dialog.server.description": "Promijeni na koji se OpenCode server ova aplikacija povezuje.",
|
"dialog.server.description": "Promijeni na koji se OpenCode server ova aplikacija povezuje.",
|
||||||
@@ -458,7 +349,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Uredi server",
|
"dialog.server.edit.title": "Uredi server",
|
||||||
"dialog.server.default.title": "Podrazumijevani server",
|
"dialog.server.default.title": "Podrazumijevani server",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Poveži se na ovaj server pri pokretanju aplikacije umjesto pokretanja lokalnog servera. Potrebno je ponovo pokrenuti aplikaciju.",
|
"Poveži se na ovaj server pri pokretanju aplikacije umjesto pokretanja lokalnog servera. Potreban je restart.",
|
||||||
"dialog.server.default.none": "Nije odabran server",
|
"dialog.server.default.none": "Nije odabran server",
|
||||||
"dialog.server.default.set": "Postavi trenutni server kao podrazumijevani",
|
"dialog.server.default.set": "Postavi trenutni server kao podrazumijevani",
|
||||||
"dialog.server.default.clear": "Očisti",
|
"dialog.server.default.clear": "Očisti",
|
||||||
@@ -540,22 +431,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.versionMismatch": "Instalirana verzija ne odgovara verziji desktop aplikacije.",
|
"wsl.onboarding.versionMismatch": "Instalirana verzija ne odgovara verziji desktop aplikacije.",
|
||||||
"wsl.onboarding.adding": "Dodavanje...",
|
"wsl.onboarding.adding": "Dodavanje...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Predstavljamo kartice. Organizuj svoj rad i aktivne sesije pomoću kartica",
|
|
||||||
"help.tabs.toast.dismiss": "Odbaci informacije o karticama",
|
|
||||||
"help.tabs.title": "Predstavljamo kartice",
|
|
||||||
"help.tabs.description": "Organizuj svoj rad i aktivne sesije pomoću kartica",
|
|
||||||
"help.tabs.date": "14. juli",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop sada je organizovan oko kartica.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Započni novu sesiju u kartici ili otvori postojeću sesiju iz bilo kojeg projekta. Otvori novu karticu kada započinješ nešto novo, a zatvori je kada završiš.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Nekoliko otvorenih kartica olakšava organizovanje aktivnih sesija. Preimenuj kartice tako da ih možeš lako prepoznati ako ih namjeravaš zadržati.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Sve svoje sesije i projekte pronaći ćeš na novom početnom ekranu. Odabirom sesije ona se otvara u kartici.",
|
|
||||||
"help.tabs.persistence": "Kada ponovo otvoriš aplikaciju, tvoje kartice ostaju otvorene.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Novi dizajn još ne podržava Git Worktrees, ali podrška stiže uskoro. Ako želiš nastaviti koristiti prethodni raspored, možeš mijenjati rasporede u Postavkama. Imaj na umu da će novi raspored za nekoliko sedmica postati trajan.",
|
|
||||||
|
|
||||||
"dialog.project.edit.title": "Uredi projekat",
|
"dialog.project.edit.title": "Uredi projekat",
|
||||||
"dialog.project.edit.name": "Naziv",
|
"dialog.project.edit.name": "Naziv",
|
||||||
"dialog.project.edit.icon": "Ikonica",
|
"dialog.project.edit.icon": "Ikonica",
|
||||||
@@ -568,11 +443,9 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup.description": "Pokreće se nakon kreiranja novog radnog prostora (worktree).",
|
"dialog.project.edit.worktree.startup.description": "Pokreće se nakon kreiranja novog radnog prostora (worktree).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "npr. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "npr. bun install",
|
||||||
|
|
||||||
"dialog.usageExceeded.dontShowAgain": "Nemoj više prikazivati",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Razlaganje konteksta",
|
"context.breakdown.title": "Razlaganje konteksta",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Približna raspodjela ulaznih tokena. "Ostalo" uključuje definicije alata i dodatno opterećenje.',
|
'Približna raspodjela ulaznih tokena. "Ostalo" uključuje definicije alata i dodatni overhead.',
|
||||||
"context.breakdown.system": "Sistem",
|
"context.breakdown.system": "Sistem",
|
||||||
"context.breakdown.user": "Korisnik",
|
"context.breakdown.user": "Korisnik",
|
||||||
"context.breakdown.assistant": "Asistent",
|
"context.breakdown.assistant": "Asistent",
|
||||||
@@ -582,8 +455,6 @@ export const dict = {
|
|||||||
"context.systemPrompt.title": "Sistemski prompt",
|
"context.systemPrompt.title": "Sistemski prompt",
|
||||||
"context.rawMessages.title": "Sirove poruke",
|
"context.rawMessages.title": "Sirove poruke",
|
||||||
|
|
||||||
"context.export.session": "Izvezi sesiju",
|
|
||||||
|
|
||||||
"context.stats.session": "Sesija",
|
"context.stats.session": "Sesija",
|
||||||
"context.stats.messages": "Poruke",
|
"context.stats.messages": "Poruke",
|
||||||
"context.stats.provider": "Provajder",
|
"context.stats.provider": "Provajder",
|
||||||
@@ -594,7 +465,7 @@ export const dict = {
|
|||||||
"context.stats.inputTokens": "Ulazni tokeni",
|
"context.stats.inputTokens": "Ulazni tokeni",
|
||||||
"context.stats.outputTokens": "Izlazni tokeni",
|
"context.stats.outputTokens": "Izlazni tokeni",
|
||||||
"context.stats.reasoningTokens": "Tokeni za rasuđivanje",
|
"context.stats.reasoningTokens": "Tokeni za rasuđivanje",
|
||||||
"context.stats.cacheTokens": "Keširani tokeni (čitanje/pisanje)",
|
"context.stats.cacheTokens": "Cache tokeni (čitanje/pisanje)",
|
||||||
"context.stats.userMessages": "Korisničke poruke",
|
"context.stats.userMessages": "Korisničke poruke",
|
||||||
"context.stats.assistantMessages": "Poruke asistenta",
|
"context.stats.assistantMessages": "Poruke asistenta",
|
||||||
"context.stats.totalCost": "Ukupni trošak",
|
"context.stats.totalCost": "Ukupni trošak",
|
||||||
@@ -662,23 +533,18 @@ export const dict = {
|
|||||||
"toast.session.unshare.failed.title": "Neuspjelo ukidanje dijeljenja",
|
"toast.session.unshare.failed.title": "Neuspjelo ukidanje dijeljenja",
|
||||||
"toast.session.unshare.failed.description": "Došlo je do greške prilikom ukidanja dijeljenja",
|
"toast.session.unshare.failed.description": "Došlo je do greške prilikom ukidanja dijeljenja",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Sesija izvezena",
|
|
||||||
"toast.session.export.success.description": "Sesija je sačuvana kao {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Izvoz sesije nije uspio",
|
|
||||||
"toast.session.export.failed.description": "Došlo je do greške prilikom izvoza sesije",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Neuspjelo učitavanje sesija za {{project}}",
|
"toast.session.listFailed.title": "Neuspjelo učitavanje sesija za {{project}}",
|
||||||
|
|
||||||
"toast.update.title": "Dostupno ažuriranje",
|
"toast.update.title": "Dostupno ažuriranje",
|
||||||
"toast.update.description": "Nova verzija OpenCode-a ({{version}}) je dostupna za instalaciju.",
|
"toast.update.description": "Nova verzija OpenCode-a ({{version}}) je dostupna za instalaciju.",
|
||||||
"toast.update.action.installRestart": "Instaliraj i ponovo pokreni",
|
"toast.update.action.installRestart": "Instaliraj i restartuj",
|
||||||
"toast.update.action.notYet": "Ne još",
|
"toast.update.action.notYet": "Ne još",
|
||||||
|
|
||||||
"error.page.title": "Nešto je pošlo po zlu",
|
"error.page.title": "Nešto je pošlo po zlu",
|
||||||
"error.page.description": "Došlo je do greške prilikom učitavanja aplikacije.",
|
"error.page.description": "Došlo je do greške prilikom učitavanja aplikacije.",
|
||||||
"error.page.description.localServerStartup": "Došlo je do greške pri pokretanju lokalnog servera.",
|
"error.page.description.localServerStartup": "Došlo je do greške pri pokretanju lokalnog servera.",
|
||||||
"error.page.details.label": "Detalji greške",
|
"error.page.details.label": "Detalji greške",
|
||||||
"error.page.action.restart": "Ponovo pokreni",
|
"error.page.action.restart": "Restartuj",
|
||||||
"error.page.action.report": "Prijavi grešku",
|
"error.page.action.report": "Prijavi grešku",
|
||||||
"error.page.action.reported": "Greška prijavljena",
|
"error.page.action.reported": "Greška prijavljena",
|
||||||
"error.page.action.exportLogs": "Izvezi logove",
|
"error.page.action.exportLogs": "Izvezi logove",
|
||||||
@@ -703,7 +569,7 @@ export const dict = {
|
|||||||
"error.chain.responseBody": "Tijelo odgovora:\n{{body}}",
|
"error.chain.responseBody": "Tijelo odgovora:\n{{body}}",
|
||||||
"error.chain.didYouMean": "Da li si mislio: {{suggestions}}",
|
"error.chain.didYouMean": "Da li si mislio: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Model nije pronađen: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Model nije pronađen: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Provjeri nazive provajdera/modela u konfiguraciji (opencode.json)",
|
"error.chain.checkConfig": "Provjeri konfiguraciju (opencode.json) provider/model names",
|
||||||
"error.chain.mcpFailed": 'MCP server "{{name}}" nije uspio. Napomena: OpenCode još ne podržava MCP autentifikaciju.',
|
"error.chain.mcpFailed": 'MCP server "{{name}}" nije uspio. Napomena: OpenCode još ne podržava MCP autentifikaciju.',
|
||||||
"error.chain.providerAuthFailed": "Autentifikacija provajdera nije uspjela ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Autentifikacija provajdera nije uspjela ({{provider}}): {{message}}",
|
||||||
"error.chain.providerInitFailed":
|
"error.chain.providerInitFailed":
|
||||||
@@ -745,7 +611,7 @@ export const dict = {
|
|||||||
"home.sessions.group.yesterday": "Jučer",
|
"home.sessions.group.yesterday": "Jučer",
|
||||||
"home.sessions.group.older": "Starije",
|
"home.sessions.group.older": "Starije",
|
||||||
"home.providerTip":
|
"home.providerTip":
|
||||||
"Poveži se s više od 75 provajdera da koristiš druge modele, uključujući Claude, GPT, Gemini i druge",
|
"Povežite se s više od 75 pružalaca usluga kako biste koristili druge modele, uključujući Claude, GPT, Gemini i druge",
|
||||||
|
|
||||||
"session.tab.session": "Sesija",
|
"session.tab.session": "Sesija",
|
||||||
"session.tab.review": "Pregled",
|
"session.tab.review": "Pregled",
|
||||||
@@ -761,11 +627,11 @@ export const dict = {
|
|||||||
"session.review.change.other": "Izmjene",
|
"session.review.change.other": "Izmjene",
|
||||||
"session.review.loadingChanges": "Učitavanje izmjena...",
|
"session.review.loadingChanges": "Učitavanje izmjena...",
|
||||||
"session.review.empty": "Još nema izmjena u ovoj sesiji",
|
"session.review.empty": "Još nema izmjena u ovoj sesiji",
|
||||||
"session.review.noVcs": "Nije otkriven Git sistem za kontrolu verzija, pa se promjene ne prikazuju",
|
"session.review.noVcs": "Nije detektovan Git sistem kontrole verzija, promjene se ne prikazuju",
|
||||||
"session.review.noSnapshot":
|
"session.review.noSnapshot":
|
||||||
"Praćenje snimaka (snapshot) je onemogućeno u konfiguraciji, pa promjene sesije nisu dostupne",
|
"Praćenje snimaka (snapshot) je onemogućeno u konfiguraciji, pa promjene sesije nisu dostupne",
|
||||||
"session.review.noChanges": "Nema izmjena",
|
"session.review.noChanges": "Nema izmjena",
|
||||||
"session.review.noUncommittedChanges": "Još nema promjena koje nisu commitovane",
|
"session.review.noUncommittedChanges": "Još nema nepotvrđenih promjena",
|
||||||
"session.review.noBranchChanges": "Još nema promjena na grani",
|
"session.review.noBranchChanges": "Još nema promjena na grani",
|
||||||
|
|
||||||
"session.files.selectToOpen": "Odaberi datoteku za otvaranje",
|
"session.files.selectToOpen": "Odaberi datoteku za otvaranje",
|
||||||
@@ -786,17 +652,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "Minimiziraj pitanje",
|
"session.question.minimize": "Minimiziraj pitanje",
|
||||||
"session.question.restore": "Vrati pitanje",
|
"session.question.restore": "Vrati pitanje",
|
||||||
"session.question.pending.one": "{{count}} pitanje na čekanju",
|
"session.question.pending.one": "{{count}} pitanje na čekanju",
|
||||||
"session.question.pending.few": "{{count}} pitanja na čekanju",
|
|
||||||
"session.question.pending.other": "{{count}} pitanja na čekanju",
|
"session.question.pending.other": "{{count}} pitanja na čekanju",
|
||||||
"session.followupDock.summary.one": "{{count}} poruka na čekanju",
|
"session.followupDock.summary.one": "{{count}} poruka na čekanju",
|
||||||
"session.followupDock.summary.few": "{{count}} poruke na čekanju",
|
|
||||||
"session.followupDock.summary.other": "{{count}} poruka na čekanju",
|
"session.followupDock.summary.other": "{{count}} poruka na čekanju",
|
||||||
"session.followupDock.sendNow": "Pošalji sada",
|
"session.followupDock.sendNow": "Pošalji sada",
|
||||||
"session.followupDock.edit": "Uredi",
|
"session.followupDock.edit": "Uredi",
|
||||||
"session.followupDock.collapse": "Sažmi poruke na čekanju",
|
"session.followupDock.collapse": "Sažmi poruke na čekanju",
|
||||||
"session.followupDock.expand": "Proširi poruke na čekanju",
|
"session.followupDock.expand": "Proširi poruke na čekanju",
|
||||||
"session.revertDock.summary.one": "{{count}} vraćena poruka",
|
"session.revertDock.summary.one": "{{count}} vraćena poruka",
|
||||||
"session.revertDock.summary.few": "{{count}} vraćene poruke",
|
|
||||||
"session.revertDock.summary.other": "{{count}} vraćenih poruka",
|
"session.revertDock.summary.other": "{{count}} vraćenih poruka",
|
||||||
"session.revertDock.collapse": "Sažmi vraćene poruke",
|
"session.revertDock.collapse": "Sažmi vraćene poruke",
|
||||||
"session.revertDock.expand": "Proširi vraćene poruke",
|
"session.revertDock.expand": "Proširi vraćene poruke",
|
||||||
@@ -854,13 +717,7 @@ export const dict = {
|
|||||||
"terminal.close": "Zatvori terminal",
|
"terminal.close": "Zatvori terminal",
|
||||||
"terminal.connectionLost.title": "Veza prekinuta",
|
"terminal.connectionLost.title": "Veza prekinuta",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"Veza s terminalom je prekinuta. Ovo se može desiti kada se server ponovo pokrene.",
|
"Veza s terminalom je prekinuta. Ovo se može desiti kada se server restartuje.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"PTY tiket za povezivanje odbijen je zbog provjera porijekla ili CSRF-a. Provjeri CORS konfiguraciju servera.",
|
|
||||||
"terminal.connectTicket.statusError": "PTY tiket za povezivanje nije uspio sa statusom {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Ažuriraj",
|
|
||||||
"titlebar.updateVersion": "Ažuriraj {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Zatvori karticu",
|
"common.closeTab": "Zatvori karticu",
|
||||||
"common.dismiss": "Odbaci",
|
"common.dismiss": "Odbaci",
|
||||||
@@ -868,8 +725,7 @@ export const dict = {
|
|||||||
"common.moreOptions": "Više opcija",
|
"common.moreOptions": "Više opcija",
|
||||||
"common.learnMore": "Saznaj više",
|
"common.learnMore": "Saznaj više",
|
||||||
"common.rename": "Preimenuj",
|
"common.rename": "Preimenuj",
|
||||||
"common.export": "Izvezi",
|
"common.reset": "Resetuj",
|
||||||
"common.reset": "Vrati na početno stanje",
|
|
||||||
"common.archive": "Arhiviraj",
|
"common.archive": "Arhiviraj",
|
||||||
"common.delete": "Izbriši",
|
"common.delete": "Izbriši",
|
||||||
"common.close": "Zatvori",
|
"common.close": "Zatvori",
|
||||||
@@ -926,7 +782,7 @@ export const dict = {
|
|||||||
"settings.general.row.font.title": "Font za kod",
|
"settings.general.row.font.title": "Font za kod",
|
||||||
"settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda",
|
"settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda",
|
||||||
"settings.general.row.terminalFont.title": "Font terminala",
|
"settings.general.row.terminalFont.title": "Font terminala",
|
||||||
"settings.general.row.terminalFont.description": "Prilagodi font koji se koristi u terminalu",
|
"settings.general.row.terminalFont.description": "Prilagodite font koji se koristi u terminalu",
|
||||||
"settings.general.row.uiFont.title": "UI font",
|
"settings.general.row.uiFont.title": "UI font",
|
||||||
"settings.general.row.uiFont.description": "Prilagodi font koji se koristi u cijelom interfejsu",
|
"settings.general.row.uiFont.description": "Prilagodi font koji se koristi u cijelom interfejsu",
|
||||||
"settings.general.row.followup.title": "Ponašanje nadovezivanja",
|
"settings.general.row.followup.title": "Ponašanje nadovezivanja",
|
||||||
@@ -961,16 +817,15 @@ export const dict = {
|
|||||||
"settings.general.row.newInterface.title": "Novi raspored",
|
"settings.general.row.newInterface.title": "Novi raspored",
|
||||||
"settings.general.row.newInterface.badge": "Novo",
|
"settings.general.row.newInterface.badge": "Novo",
|
||||||
"settings.general.row.newInterface.description":
|
"settings.general.row.newInterface.description":
|
||||||
"Koristi nove kartice i raspored početne stranice. Ograničeno vrijeme možeš se prebacivati između rasporeda.",
|
"Koristite nove kartice i raspored početne stranice. Ograničeno vrijeme možete se prebacivati između rasporeda.",
|
||||||
"settings.general.row.newInterfaceNotice.title": "Sada koristiš novi raspored",
|
"settings.general.row.newInterfaceNotice.title": "Sada koristite novi raspored",
|
||||||
"settings.general.row.newInterfaceNotice.description": "Prethodni raspored više nije dostupan",
|
"settings.general.row.newInterfaceNotice.description": "Prethodni raspored više nije dostupan",
|
||||||
"settings.general.row.newInterfaceNotice.dismiss": "Odbaci",
|
"settings.general.row.newInterfaceNotice.dismiss": "Odbaci",
|
||||||
"settings.general.row.pinchZoom.title": "Zumiranje štipanjem",
|
"settings.general.row.pinchZoom.title": "Zumiranje štipanjem",
|
||||||
"settings.general.row.pinchZoom.description":
|
"settings.general.row.pinchZoom.description":
|
||||||
"Dozvoli zumiranje gestom štipanja na dodirnoj ploči i pomoću Ctrl-pomjeranja",
|
"Dozvoli zumiranje gestom štipanja na dodirnoj ploči i pomoću Ctrl-pomjeranja",
|
||||||
"settings.general.row.wayland.title": "Koristi nativni Wayland",
|
"settings.general.row.wayland.title": "Koristi nativni Wayland",
|
||||||
"settings.general.row.wayland.description":
|
"settings.general.row.wayland.description": "Onemogući X11 fallback na Waylandu. Zahtijeva restart.",
|
||||||
"Onemogući rezervni X11 način rada na Waylandu. Zahtijeva ponovno pokretanje.",
|
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"Na Linuxu sa monitorima miješanih stopa osvježavanja, nativni Wayland može biti stabilniji.",
|
"Na Linuxu sa monitorima miješanih stopa osvježavanja, nativni Wayland može biti stabilniji.",
|
||||||
|
|
||||||
@@ -1086,7 +941,7 @@ export const dict = {
|
|||||||
"settings.mcp.description": "MCP postavke će se ovdje moći podešavati.",
|
"settings.mcp.description": "MCP postavke će se ovdje moći podešavati.",
|
||||||
|
|
||||||
"settings.permissions.title": "Dozvole",
|
"settings.permissions.title": "Dozvole",
|
||||||
"settings.permissions.description": "Kontroliši koje alate server smije koristiti zadano.",
|
"settings.permissions.description": "Kontroliši koje alate server smije koristiti po defaultu.",
|
||||||
"settings.permissions.section.tools": "Alati",
|
"settings.permissions.section.tools": "Alati",
|
||||||
"settings.permissions.toast.updateFailed.title": "Neuspjelo ažuriranje dozvola",
|
"settings.permissions.toast.updateFailed.title": "Neuspjelo ažuriranje dozvola",
|
||||||
|
|
||||||
@@ -1098,7 +953,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.description": "Čitanje datoteke (podudara se s putanjom datoteke)",
|
"settings.permissions.tool.read.description": "Čitanje datoteke (podudara se s putanjom datoteke)",
|
||||||
"settings.permissions.tool.edit.title": "Uređivanje",
|
"settings.permissions.tool.edit.title": "Uređivanje",
|
||||||
"settings.permissions.tool.edit.description":
|
"settings.permissions.tool.edit.description":
|
||||||
"Mijenjanje datoteka, uključujući uređivanje, pisanje, zakrpe i višestruke izmjene",
|
"Mijenjanje datoteka, uključujući izmjene, pisanja, patch-eve i multi-izmjene",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Podudaranje datoteka pomoću glob šablona",
|
"settings.permissions.tool.glob.description": "Podudaranje datoteka pomoću glob šablona",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
@@ -1134,26 +989,26 @@ export const dict = {
|
|||||||
"workspace.type.sandbox": "sandbox",
|
"workspace.type.sandbox": "sandbox",
|
||||||
"workspace.create.failed.title": "Neuspješno kreiranje radnog prostora",
|
"workspace.create.failed.title": "Neuspješno kreiranje radnog prostora",
|
||||||
"workspace.delete.failed.title": "Neuspješno brisanje radnog prostora",
|
"workspace.delete.failed.title": "Neuspješno brisanje radnog prostora",
|
||||||
"workspace.resetting.title": "Vraćanje radnog prostora na početno stanje",
|
"workspace.resetting.title": "Resetovanje radnog prostora",
|
||||||
"workspace.resetting.description": "Ovo može potrajati minut.",
|
"workspace.resetting.description": "Ovo može potrajati minut.",
|
||||||
"workspace.reset.failed.title": "Neuspješno vraćanje radnog prostora na početno stanje",
|
"workspace.reset.failed.title": "Neuspješno resetovanje radnog prostora",
|
||||||
"workspace.reset.success.title": "Radni prostor vraćen na početno stanje",
|
"workspace.reset.success.title": "Radni prostor resetovan",
|
||||||
"workspace.reset.success.description": "Radni prostor sada odgovara podrazumijevanoj grani.",
|
"workspace.reset.success.description": "Radni prostor sada odgovara podrazumijevanoj grani.",
|
||||||
"workspace.error.stillPreparing": "Radni prostor se još priprema",
|
"workspace.error.stillPreparing": "Radni prostor se još priprema",
|
||||||
"workspace.status.checking": "Provjera promjena koje nisu commitovane...",
|
"workspace.status.checking": "Provjera neobjedinjenih promjena...",
|
||||||
"workspace.status.error": "Nije moguće provjeriti git status.",
|
"workspace.status.error": "Nije moguće provjeriti git status.",
|
||||||
"workspace.status.clean": "Nisu pronađene promjene koje nisu commitovane.",
|
"workspace.status.clean": "Nisu pronađene neobjedinjene promjene.",
|
||||||
"workspace.status.dirty": "Pronađene su promjene koje nisu commitovane u ovom radnom prostoru.",
|
"workspace.status.dirty": "Pronađene su neobjedinjene promjene u ovom radnom prostoru.",
|
||||||
"workspace.delete.title": "Izbriši radni prostor",
|
"workspace.delete.title": "Izbriši radni prostor",
|
||||||
"workspace.delete.confirm": 'Izbriši radni prostor "{{name}}"?',
|
"workspace.delete.confirm": 'Izbriši radni prostor "{{name}}"?',
|
||||||
"workspace.delete.button": "Izbriši radni prostor",
|
"workspace.delete.button": "Izbriši radni prostor",
|
||||||
"workspace.reset.title": "Vrati radni prostor na početno stanje",
|
"workspace.reset.title": "Resetuj radni prostor",
|
||||||
"workspace.reset.confirm": 'Vrati radni prostor "{{name}}" na početno stanje?',
|
"workspace.reset.confirm": 'Resetuj radni prostor "{{name}}"?',
|
||||||
"workspace.reset.button": "Vrati radni prostor na početno stanje",
|
"workspace.reset.button": "Resetuj radni prostor",
|
||||||
"workspace.reset.archived.none": "Nijedna aktivna sesija neće biti arhivirana.",
|
"workspace.reset.archived.none": "Nijedna aktivna sesija neće biti arhivirana.",
|
||||||
"workspace.reset.archived.one": "1 sesija će biti arhivirana.",
|
"workspace.reset.archived.one": "1 sesija će biti arhivirana.",
|
||||||
"workspace.reset.archived.many": "Biće arhivirano {{count}} sesija.",
|
"workspace.reset.archived.many": "Biće arhivirano {{count}} sesija.",
|
||||||
"workspace.reset.note": "Ovo će vratiti radni prostor na stanje podrazumijevane grane.",
|
"workspace.reset.note": "Ovo će resetovati radni prostor da odgovara podrazumijevanoj grani.",
|
||||||
"common.open": "Otvori",
|
"common.open": "Otvori",
|
||||||
"dialog.releaseNotes.action.getStarted": "Započni",
|
"dialog.releaseNotes.action.getStarted": "Započni",
|
||||||
"dialog.releaseNotes.action.next": "Sljedeće",
|
"dialog.releaseNotes.action.next": "Sljedeće",
|
||||||
@@ -1166,8 +1021,8 @@ export const dict = {
|
|||||||
"common.time.minutesAgo.short": "prije {{count}} min",
|
"common.time.minutesAgo.short": "prije {{count}} min",
|
||||||
"common.time.hoursAgo.short": "prije {{count}} h",
|
"common.time.hoursAgo.short": "prije {{count}} h",
|
||||||
"common.time.daysAgo.short": "prije {{count}} d",
|
"common.time.daysAgo.short": "prije {{count}} d",
|
||||||
"settings.providers.connected.environmentDescription": "Povezano s tvojim varijablama okruženja",
|
"settings.providers.connected.environmentDescription": "Povezano sa vašim varijablama okruženja",
|
||||||
"settings.providers.custom.description": "Dodaj provajdera kompatibilnog s OpenAI putem baznog URL-a.",
|
"settings.providers.custom.description": "Dodajte provajdera kompatibilnog s OpenAI putem osnovnog URL-a.",
|
||||||
|
|
||||||
"app.server.unreachable": "Nije moguće pristupiti {{server}}",
|
"app.server.unreachable": "Nije moguće pristupiti {{server}}",
|
||||||
"app.server.retrying": "Automatski ponovni pokušaj...",
|
"app.server.retrying": "Automatski ponovni pokušaj...",
|
||||||
@@ -1176,16 +1031,13 @@ export const dict = {
|
|||||||
"dialog.server.add.passwordPlaceholder": "lozinka",
|
"dialog.server.add.passwordPlaceholder": "lozinka",
|
||||||
"server.row.noUsername": "nema korisničkog imena",
|
"server.row.noUsername": "nema korisničkog imena",
|
||||||
"session.review.noVcs.createGit.title": "Kreiraj Git repozitorij",
|
"session.review.noVcs.createGit.title": "Kreiraj Git repozitorij",
|
||||||
"session.review.noVcs.createGit.description": "Prati, pregledaj i poništi promjene u ovom projektu",
|
"session.review.noVcs.createGit.description": "Pratite, pregledajte i poništite promjene u ovom projektu",
|
||||||
"session.review.noVcs.createGit.actionLoading": "Kreiranje Git repozitorija...",
|
"session.review.noVcs.createGit.actionLoading": "Kreiranje Git repozitorija...",
|
||||||
"session.review.noVcs.createGit.action": "Kreiraj Git repozitorij",
|
"session.review.noVcs.createGit.action": "Kreiraj Git repozitorij",
|
||||||
"session.todo.progress": "{{done}} od {{total}} zadataka završeno",
|
"session.todo.progress": "{{done}} od {{total}} zadataka završeno",
|
||||||
"session.question.progress": "{{current}} od {{total}} pitanja",
|
"session.question.progress": "{{current}} od {{total}} pitanja",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "File Explorer",
|
"session.header.open.fileExplorer": "File Explorer",
|
||||||
"session.header.reveal.finder": "Prikaži u Finderu",
|
|
||||||
"session.header.reveal.fileExplorer": "Prikaži u File Exploreru",
|
|
||||||
"session.header.reveal.containingFolder": "Otvori fasciklu koja sadrži ovu stavku",
|
|
||||||
"session.header.open.fileManager": "File Manager",
|
"session.header.open.fileManager": "File Manager",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1223,14 +1075,6 @@ export const dict = {
|
|||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Korišteni JS heap naspram limita heapa. Samo Chromium.",
|
"debugBar.mem.tipUnavailable": "Korišteni JS heap naspram limita heapa. Samo Chromium.",
|
||||||
"debugBar.mem.tip": "Korišteni JS heap naspram limita heapa. {{used}} od {{limit}}.",
|
"debugBar.mem.tip": "Korišteni JS heap naspram limita heapa. {{used}} od {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Prisilno primijeni stilove fokusa na sve interaktivne elemente",
|
|
||||||
"debugBar.focus.on": "UKLJUČENO",
|
|
||||||
"debugBar.focus.off": "ISKLJUČENO",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Prisilno postavi smjer rasporeda cijele aplikacije bez promjene odabranog jezika",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+38
-193
@@ -92,9 +92,6 @@ export const dict = {
|
|||||||
"command.session.unshare": "Stop deling af session",
|
"command.session.unshare": "Stop deling af session",
|
||||||
"command.session.unshare.description": "Stop med at dele denne session",
|
"command.session.unshare.description": "Stop med at dele denne session",
|
||||||
|
|
||||||
"command.session.export": "Eksportér session",
|
|
||||||
"command.session.export.description": "Eksportér hele sessionsudskriften som JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Søg i filer, kommandoer og sessioner",
|
"palette.search.placeholder": "Søg i filer, kommandoer og sessioner",
|
||||||
"palette.search.placeholder.home": "Søg i kommandoer og sessioner",
|
"palette.search.placeholder.home": "Søg i kommandoer og sessioner",
|
||||||
"palette.empty": "Ingen resultater fundet",
|
"palette.empty": "Ingen resultater fundet",
|
||||||
@@ -105,7 +102,6 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Ingen udbydere fundet",
|
"dialog.provider.empty": "Ingen udbydere fundet",
|
||||||
"dialog.provider.group.popular": "Populære",
|
"dialog.provider.group.popular": "Populære",
|
||||||
"dialog.provider.group.other": "Andre",
|
"dialog.provider.group.other": "Andre",
|
||||||
"dialog.provider.custom.label": "Brugerdefineret OpenAI-kompatibel udbyder",
|
|
||||||
"dialog.provider.tag.recommended": "Anbefalet",
|
"dialog.provider.tag.recommended": "Anbefalet",
|
||||||
"dialog.provider.opencode.note": "Udvalgte modeller inklusive Claude, GPT, Gemini og flere",
|
"dialog.provider.opencode.note": "Udvalgte modeller inklusive Claude, GPT, Gemini og flere",
|
||||||
"dialog.provider.opencode.tagline": "Pålidelige optimerede modeller",
|
"dialog.provider.opencode.tagline": "Pålidelige optimerede modeller",
|
||||||
@@ -126,7 +122,6 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.model.unpaid.freeModels.title": "Gratis modeller leveret af OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Gratis modeller leveret af OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Tilføj flere modeller fra populære udbydere",
|
"dialog.model.unpaid.addMore.title": "Tilføj flere modeller fra populære udbydere",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Se mere end 70 yderligere udbydere",
|
|
||||||
|
|
||||||
"dialog.provider.viewAll": "Vis flere udbydere",
|
"dialog.provider.viewAll": "Vis flere udbydere",
|
||||||
|
|
||||||
@@ -134,14 +129,12 @@ export const dict = {
|
|||||||
"provider.connect.title.anthropicProMax": "Log ind med Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Log ind med Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Vælg loginmetode for {{provider}}.",
|
"provider.connect.selectMethod": "Vælg loginmetode for {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "API-nøgle",
|
"provider.connect.method.apiKey": "API-nøgle",
|
||||||
"provider.connect.method.browser": "Browser",
|
|
||||||
"provider.connect.method.headless": "Browserløs",
|
|
||||||
"provider.connect.status.inProgress": "Godkendelse i gang...",
|
"provider.connect.status.inProgress": "Godkendelse i gang...",
|
||||||
"provider.connect.status.waiting": "Venter på godkendelse...",
|
"provider.connect.status.waiting": "Venter på godkendelse...",
|
||||||
"provider.connect.status.failed": "Godkendelse mislykkedes: {{error}}",
|
"provider.connect.status.failed": "Godkendelse mislykkedes: {{error}}",
|
||||||
"provider.connect.apiKey.description":
|
"provider.connect.apiKey.description":
|
||||||
"Indtast din API-nøgle til {{provider}} for at forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
|
"Indtast din {{provider}} API-nøgle for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
|
||||||
"provider.connect.apiKey.label": "API-nøgle til {{provider}}",
|
"provider.connect.apiKey.label": "{{provider}} API-nøgle",
|
||||||
"provider.connect.apiKey.placeholder": "API-nøgle",
|
"provider.connect.apiKey.placeholder": "API-nøgle",
|
||||||
"provider.connect.apiKey.required": "API-nøgle er påkrævet",
|
"provider.connect.apiKey.required": "API-nøgle er påkrævet",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
@@ -154,7 +147,7 @@ export const dict = {
|
|||||||
"provider.connect.oauth.code.visit.prefix": "Besøg ",
|
"provider.connect.oauth.code.visit.prefix": "Besøg ",
|
||||||
"provider.connect.oauth.code.visit.link": "dette link",
|
"provider.connect.oauth.code.visit.link": "dette link",
|
||||||
"provider.connect.oauth.code.visit.suffix":
|
"provider.connect.oauth.code.visit.suffix":
|
||||||
" for at hente din godkendelseskode, forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
|
" for at hente din godkendelseskode for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
|
||||||
"provider.connect.oauth.code.label": "{{method}} godkendelseskode",
|
"provider.connect.oauth.code.label": "{{method}} godkendelseskode",
|
||||||
"provider.connect.oauth.code.placeholder": "Godkendelseskode",
|
"provider.connect.oauth.code.placeholder": "Godkendelseskode",
|
||||||
"provider.connect.oauth.code.required": "Godkendelseskode er påkrævet",
|
"provider.connect.oauth.code.required": "Godkendelseskode er påkrævet",
|
||||||
@@ -162,13 +155,12 @@ export const dict = {
|
|||||||
"provider.connect.oauth.auto.visit.prefix": "Besøg ",
|
"provider.connect.oauth.auto.visit.prefix": "Besøg ",
|
||||||
"provider.connect.oauth.auto.visit.link": "dette link",
|
"provider.connect.oauth.auto.visit.link": "dette link",
|
||||||
"provider.connect.oauth.auto.visit.suffix":
|
"provider.connect.oauth.auto.visit.suffix":
|
||||||
" og indtast koden nedenfor for at forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
|
" og indtast koden nedenfor for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
|
||||||
"provider.connect.oauth.auto.confirmationCode": "Bekræftelseskode",
|
"provider.connect.oauth.auto.confirmationCode": "Bekræftelseskode",
|
||||||
"provider.connect.toast.connected.title": "{{provider}} forbundet",
|
"provider.connect.toast.connected.title": "{{provider}} forbundet",
|
||||||
"provider.connect.toast.connected.description": "Modeller fra {{provider}} er nu tilgængelige.",
|
"provider.connect.toast.connected.description": "{{provider}} modeller er nu tilgængelige.",
|
||||||
|
|
||||||
"provider.custom.title": "Brugerdefineret udbyder",
|
"provider.custom.title": "Brugerdefineret udbyder",
|
||||||
"provider.custom.unavailable": "Brugerdefinerede udbydere er ikke tilgængelige på denne server",
|
|
||||||
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel udbyder. Se ",
|
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel udbyder. Se ",
|
||||||
"provider.custom.description.link": "dokumentation for udbyderkonfiguration",
|
"provider.custom.description.link": "dokumentation for udbyderkonfiguration",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -225,9 +217,9 @@ export const dict = {
|
|||||||
"model.tooltip.inputs": "Input",
|
"model.tooltip.inputs": "Input",
|
||||||
"model.tooltip.model": "Model",
|
"model.tooltip.model": "Model",
|
||||||
"model.tooltip.provider": "Udbyder",
|
"model.tooltip.provider": "Udbyder",
|
||||||
"model.tooltip.reasoning": "Ræsonnering",
|
"model.tooltip.reasoning": "Tænkning",
|
||||||
"model.tooltip.reasoning.allowed": "Tillader ræsonnering",
|
"model.tooltip.reasoning.allowed": "Tillader tænkning",
|
||||||
"model.tooltip.reasoning.none": "Ingen ræsonnering",
|
"model.tooltip.reasoning.none": "Ingen tænkning",
|
||||||
"model.tooltip.context": "Kontekstgrænse {{limit}}",
|
"model.tooltip.context": "Kontekstgrænse {{limit}}",
|
||||||
"common.search.placeholder": "Søg",
|
"common.search.placeholder": "Søg",
|
||||||
"common.goBack": "Gå tilbage",
|
"common.goBack": "Gå tilbage",
|
||||||
@@ -238,7 +230,7 @@ export const dict = {
|
|||||||
"common.clear": "Ryd",
|
"common.clear": "Ryd",
|
||||||
"common.connect": "Forbind",
|
"common.connect": "Forbind",
|
||||||
"common.disconnect": "Frakobl",
|
"common.disconnect": "Frakobl",
|
||||||
"common.continue": "Fortsæt",
|
"common.continue": "Indsend",
|
||||||
"common.submit": "Indsend",
|
"common.submit": "Indsend",
|
||||||
"common.save": "Gem",
|
"common.save": "Gem",
|
||||||
"common.saving": "Gemmer...",
|
"common.saving": "Gemmer...",
|
||||||
@@ -261,7 +253,7 @@ export const dict = {
|
|||||||
"prompt.example.3": "Ret ødelagte tests",
|
"prompt.example.3": "Ret ødelagte tests",
|
||||||
"prompt.example.4": "Forklar hvordan godkendelse fungerer",
|
"prompt.example.4": "Forklar hvordan godkendelse fungerer",
|
||||||
"prompt.example.5": "Find og ret sikkerhedshuller",
|
"prompt.example.5": "Find og ret sikkerhedshuller",
|
||||||
"prompt.example.6": "Tilføj enhedstests for brugertjenesten",
|
"prompt.example.6": "Tilføj enhedstests for brugerservice",
|
||||||
"prompt.example.7": "Refaktorer denne funktion så den er mere læsbar",
|
"prompt.example.7": "Refaktorer denne funktion så den er mere læsbar",
|
||||||
"prompt.example.8": "Hvad betyder denne fejl?",
|
"prompt.example.8": "Hvad betyder denne fejl?",
|
||||||
"prompt.example.9": "Hjælp mig med at debugge dette problem",
|
"prompt.example.9": "Hjælp mig med at debugge dette problem",
|
||||||
@@ -343,7 +335,7 @@ export const dict = {
|
|||||||
"dialog.server.search.placeholder": "Søg servere",
|
"dialog.server.search.placeholder": "Søg servere",
|
||||||
"dialog.server.empty": "Ingen servere endnu",
|
"dialog.server.empty": "Ingen servere endnu",
|
||||||
"dialog.server.add.title": "Tilføj en server",
|
"dialog.server.add.title": "Tilføj en server",
|
||||||
"dialog.server.add.url": "Serveradresse",
|
"dialog.server.add.url": "Server URL",
|
||||||
"dialog.server.add.placeholder": "http://localhost:4096",
|
"dialog.server.add.placeholder": "http://localhost:4096",
|
||||||
"dialog.server.add.error": "Kunne ikke forbinde til server",
|
"dialog.server.add.error": "Kunne ikke forbinde til server",
|
||||||
"dialog.server.add.checking": "Tjekker...",
|
"dialog.server.add.checking": "Tjekker...",
|
||||||
@@ -355,7 +347,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Rediger server",
|
"dialog.server.edit.title": "Rediger server",
|
||||||
"dialog.server.default.title": "Standardserver",
|
"dialog.server.default.title": "Standardserver",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Opret forbindelse til denne server, når appen starter, i stedet for at starte en lokal server. Kræver genstart.",
|
"Forbind til denne server ved start af app i stedet for at starte en lokal server. Kræver genstart.",
|
||||||
"dialog.server.default.none": "Ingen server valgt",
|
"dialog.server.default.none": "Ingen server valgt",
|
||||||
"dialog.server.default.set": "Sæt nuværende server som standard",
|
"dialog.server.default.set": "Sæt nuværende server som standard",
|
||||||
"dialog.server.default.clear": "Ryd",
|
"dialog.server.default.clear": "Ryd",
|
||||||
@@ -449,8 +441,6 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup": "Opstartsscript for arbejdsområde",
|
"dialog.project.edit.worktree.startup": "Opstartsscript for arbejdsområde",
|
||||||
"dialog.project.edit.worktree.startup.description": "Køres efter oprettelse af et nyt arbejdsområde (worktree).",
|
"dialog.project.edit.worktree.startup.description": "Køres efter oprettelse af et nyt arbejdsområde (worktree).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Vis ikke igen",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Kontekstfordeling",
|
"context.breakdown.title": "Kontekstfordeling",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Omtrentlig fordeling af input-tokens. "Andre" inkluderer værktøjsdefinitioner og overhead.',
|
'Omtrentlig fordeling af input-tokens. "Andre" inkluderer værktøjsdefinitioner og overhead.',
|
||||||
@@ -463,8 +453,6 @@ export const dict = {
|
|||||||
"context.systemPrompt.title": "Systemprompt",
|
"context.systemPrompt.title": "Systemprompt",
|
||||||
"context.rawMessages.title": "Rå beskeder",
|
"context.rawMessages.title": "Rå beskeder",
|
||||||
|
|
||||||
"context.export.session": "Eksportér session",
|
|
||||||
|
|
||||||
"context.stats.session": "Session",
|
"context.stats.session": "Session",
|
||||||
"context.stats.messages": "Beskeder",
|
"context.stats.messages": "Beskeder",
|
||||||
"context.stats.provider": "Udbyder",
|
"context.stats.provider": "Udbyder",
|
||||||
@@ -474,8 +462,8 @@ export const dict = {
|
|||||||
"context.stats.usage": "Forbrug",
|
"context.stats.usage": "Forbrug",
|
||||||
"context.stats.inputTokens": "Input-tokens",
|
"context.stats.inputTokens": "Input-tokens",
|
||||||
"context.stats.outputTokens": "Output-tokens",
|
"context.stats.outputTokens": "Output-tokens",
|
||||||
"context.stats.reasoningTokens": "Ræsonneringstokens",
|
"context.stats.reasoningTokens": "Tænke Tokens",
|
||||||
"context.stats.cacheTokens": "Cachetokens (læsning/skrivning)",
|
"context.stats.cacheTokens": "Cache Tokens (læs/skriv)",
|
||||||
"context.stats.userMessages": "Brugerbeskeder",
|
"context.stats.userMessages": "Brugerbeskeder",
|
||||||
"context.stats.assistantMessages": "Assistentbeskeder",
|
"context.stats.assistantMessages": "Assistentbeskeder",
|
||||||
"context.stats.totalCost": "Samlede omkostninger",
|
"context.stats.totalCost": "Samlede omkostninger",
|
||||||
@@ -542,11 +530,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.failed.title": "Kunne ikke stoppe deling af session",
|
"toast.session.unshare.failed.title": "Kunne ikke stoppe deling af session",
|
||||||
"toast.session.unshare.failed.description": "Der opstod en fejl under stop af sessionsdeling",
|
"toast.session.unshare.failed.description": "Der opstod en fejl under stop af sessionsdeling",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Session eksporteret",
|
|
||||||
"toast.session.export.success.description": "Sessionen blev gemt i {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Kunne ikke eksportere session",
|
|
||||||
"toast.session.export.failed.description": "Der opstod en fejl under eksport af sessionen",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Kunne ikke indlæse sessioner for {{project}}",
|
"toast.session.listFailed.title": "Kunne ikke indlæse sessioner for {{project}}",
|
||||||
|
|
||||||
"toast.update.title": "Opdatering tilgængelig",
|
"toast.update.title": "Opdatering tilgængelig",
|
||||||
@@ -583,7 +566,7 @@ export const dict = {
|
|||||||
"error.chain.responseBody": "Svarindhold:\n{{body}}",
|
"error.chain.responseBody": "Svarindhold:\n{{body}}",
|
||||||
"error.chain.didYouMean": "Mente du: {{suggestions}}",
|
"error.chain.didYouMean": "Mente du: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Model ikke fundet: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Model ikke fundet: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Kontrollér udbyder- og modelnavnene i din konfiguration (opencode.json)",
|
"error.chain.checkConfig": "Tjek dine konfigurations (opencode.json) udbyder/modelnavne",
|
||||||
"error.chain.mcpFailed": 'MCP-server "{{name}}" fejlede. Bemærk, OpenCode understøtter ikke MCP-godkendelse endnu.',
|
"error.chain.mcpFailed": 'MCP-server "{{name}}" fejlede. Bemærk, OpenCode understøtter ikke MCP-godkendelse endnu.',
|
||||||
"error.chain.providerAuthFailed": "Udbydergodkendelse mislykkedes ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Udbydergodkendelse mislykkedes ({{provider}}): {{message}}",
|
||||||
"error.chain.providerInitFailed":
|
"error.chain.providerInitFailed":
|
||||||
@@ -636,12 +619,12 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "Denne fane henviser til en session, der ikke længere findes på denne server.",
|
"session.error.notFound.description": "Denne fane henviser til en session, der ikke længere findes på denne server.",
|
||||||
"session.error.notFound.closeTab": "Luk fane",
|
"session.error.notFound.closeTab": "Luk fane",
|
||||||
"session.error.serverConnection": "Kan ikke oprette forbindelse til denne server",
|
"session.error.serverConnection": "Kan ikke oprette forbindelse til denne server",
|
||||||
"session.review.filesChanged": "{{count}} ændrede filer",
|
"session.review.filesChanged": "{{count}} Filer ændret",
|
||||||
"session.review.change.one": "Ændring",
|
"session.review.change.one": "Ændring",
|
||||||
"session.review.change.other": "Ændringer",
|
"session.review.change.other": "Ændringer",
|
||||||
"session.review.loadingChanges": "Indlæser ændringer...",
|
"session.review.loadingChanges": "Indlæser ændringer...",
|
||||||
"session.review.empty": "Ingen ændringer i denne session endnu",
|
"session.review.empty": "Ingen ændringer i denne session endnu",
|
||||||
"session.review.noVcs": "Intet Git-versionsstyringssystem fundet, så ændringer vises ikke",
|
"session.review.noVcs": "Intet Git versionsstyringssystem fundet, ændringer vises ikke",
|
||||||
"session.review.noSnapshot":
|
"session.review.noSnapshot":
|
||||||
"Snapshot-sporing er deaktiveret i konfigurationen, så sessionsændringer er ikke tilgængelige",
|
"Snapshot-sporing er deaktiveret i konfigurationen, så sessionsændringer er ikke tilgængelige",
|
||||||
"session.review.noChanges": "Ingen ændringer",
|
"session.review.noChanges": "Ingen ændringer",
|
||||||
@@ -732,20 +715,12 @@ export const dict = {
|
|||||||
|
|
||||||
"terminal.connectionLost.title": "Forbindelse mistet",
|
"terminal.connectionLost.title": "Forbindelse mistet",
|
||||||
"terminal.connectionLost.description": "Terminalforbindelsen blev afbrudt. Dette kan ske, når serveren genstarter.",
|
"terminal.connectionLost.description": "Terminalforbindelsen blev afbrudt. Dette kan ske, når serveren genstarter.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"PTY-forbindelsesticket blev afvist ved kontrollen af oprindelse eller CSRF. Kontrollér serverens CORS-konfiguration.",
|
|
||||||
"terminal.connectTicket.statusError": "PTY-forbindelsesticket mislykkedes med {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Opdater",
|
|
||||||
"titlebar.updateVersion": "Opdater {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Luk fane",
|
"common.closeTab": "Luk fane",
|
||||||
"common.dismiss": "Afvis",
|
"common.dismiss": "Afvis",
|
||||||
"common.requestFailed": "Forespørgsel mislykkedes",
|
"common.requestFailed": "Forespørgsel mislykkedes",
|
||||||
"common.moreOptions": "Flere muligheder",
|
"common.moreOptions": "Flere muligheder",
|
||||||
"common.learnMore": "Lær mere",
|
"common.learnMore": "Lær mere",
|
||||||
"common.rename": "Omdøb",
|
"common.rename": "Omdøb",
|
||||||
"common.export": "Eksportér",
|
|
||||||
"common.reset": "Nulstil",
|
"common.reset": "Nulstil",
|
||||||
"common.archive": "Arkivér",
|
"common.archive": "Arkivér",
|
||||||
"common.delete": "Slet",
|
"common.delete": "Slet",
|
||||||
@@ -775,7 +750,7 @@ export const dict = {
|
|||||||
"settings.tab.general": "Generelt",
|
"settings.tab.general": "Generelt",
|
||||||
"settings.tab.shortcuts": "Genveje",
|
"settings.tab.shortcuts": "Genveje",
|
||||||
"settings.desktop.section.wsl": "WSL",
|
"settings.desktop.section.wsl": "WSL",
|
||||||
"settings.desktop.wsl.title": "WSL-integration",
|
"settings.desktop.wsl.title": "WSL integration",
|
||||||
"settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.",
|
"settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.",
|
||||||
|
|
||||||
"settings.general.section.appearance": "Udseende",
|
"settings.general.section.appearance": "Udseende",
|
||||||
@@ -796,16 +771,15 @@ export const dict = {
|
|||||||
"settings.general.row.appearance.title": "Udseende",
|
"settings.general.row.appearance.title": "Udseende",
|
||||||
"settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed",
|
"settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed",
|
||||||
"settings.general.row.colorScheme.title": "Farveskema",
|
"settings.general.row.colorScheme.title": "Farveskema",
|
||||||
"settings.general.row.colorScheme.description":
|
"settings.general.row.colorScheme.description": "Vælg om OpenCode følger systemets, lyst eller mørkt tema",
|
||||||
"Vælg, om OpenCode skal følge systemtemaet eller bruge et lyst eller mørkt tema",
|
|
||||||
"settings.general.row.theme.title": "Tema",
|
"settings.general.row.theme.title": "Tema",
|
||||||
"settings.general.row.theme.description": "Tilpas OpenCodes tema.",
|
"settings.general.row.theme.description": "Tilpas hvordan OpenCode er temabestemt.",
|
||||||
"settings.general.row.font.title": "Kode-skrifttype",
|
"settings.general.row.font.title": "Kode-skrifttype",
|
||||||
"settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke",
|
"settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke",
|
||||||
"settings.general.row.terminalFont.title": "Terminalskrifttype",
|
"settings.general.row.terminalFont.title": "Terminalskrifttype",
|
||||||
"settings.general.row.terminalFont.description": "Tilpas den skrifttype, der bruges i terminalen",
|
"settings.general.row.terminalFont.description": "Tilpas den skrifttype, der bruges i terminalen",
|
||||||
"settings.general.row.uiFont.title": "UI-skrifttype",
|
"settings.general.row.uiFont.title": "UI-skrifttype",
|
||||||
"settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugergrænsefladen",
|
"settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugerfladen",
|
||||||
"settings.general.row.followup.title": "Opfølgningsadfærd",
|
"settings.general.row.followup.title": "Opfølgningsadfærd",
|
||||||
"settings.general.row.followup.description": "Vælg om opfølgende forespørgsler skal styre straks eller vente i kø",
|
"settings.general.row.followup.description": "Vælg om opfølgende forespørgsler skal styre straks eller vente i kø",
|
||||||
"settings.general.row.followup.option.queue": "Kø",
|
"settings.general.row.followup.option.queue": "Kø",
|
||||||
@@ -823,11 +797,10 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Navigation nederst",
|
"settings.general.row.mobileTitlebarBottom.title": "Navigation nederst",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Placer titellinjen og sessionsfanerne nederst på skærmen på mobilenheder",
|
"Placer titellinjen og sessionsfanerne nederst på skærmen på mobilenheder",
|
||||||
"settings.general.row.showCustomAgents.title": "Vis agent",
|
"settings.general.row.showCustomAgents.title": "Brugerdefinerede agenter",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Vis agentvælgeren i promptfeltet",
|
||||||
"Skift mellem agenter i promptfeltet. Når vælgeren er skjult, bruges Build-agenten som standard.",
|
"settings.general.row.reasoningSummaries.title": "Vis tænkeoversigter",
|
||||||
"settings.general.row.reasoningSummaries.title": "Vis ræsonneringsoversigter",
|
"settings.general.row.reasoningSummaries.description": "Vis model tænkeoversigter i tidslinjen",
|
||||||
"settings.general.row.reasoningSummaries.description": "Vis oversigter over modellens ræsonnering på tidslinjen",
|
|
||||||
|
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "Udvid shell-værktøjsdele",
|
"settings.general.row.shellToolPartsExpanded.title": "Udvid shell-værktøjsdele",
|
||||||
"settings.general.row.shellToolPartsExpanded.description": "Vis shell-værktøjsdele udvidet som standard i tidslinjen",
|
"settings.general.row.shellToolPartsExpanded.description": "Vis shell-værktøjsdele udvidet som standard i tidslinjen",
|
||||||
@@ -843,13 +816,13 @@ export const dict = {
|
|||||||
"settings.general.row.newInterfaceNotice.dismiss": "Afvis",
|
"settings.general.row.newInterfaceNotice.dismiss": "Afvis",
|
||||||
"settings.general.row.pinchZoom.title": "Knib for at zoome",
|
"settings.general.row.pinchZoom.title": "Knib for at zoome",
|
||||||
"settings.general.row.pinchZoom.description": "Tillad knibebevægelser på pegefeltet og Ctrl-rulning for at zoome",
|
"settings.general.row.pinchZoom.description": "Tillad knibebevægelser på pegefeltet og Ctrl-rulning for at zoome",
|
||||||
"settings.general.row.wayland.title": "Brug indbygget Wayland",
|
"settings.general.row.wayland.title": "Brug native Wayland",
|
||||||
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.",
|
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"På Linux med skærme med forskellige opdateringshastigheder kan indbygget Wayland være mere stabilt.",
|
"På Linux med skærme med blandet opdateringshastighed kan native Wayland være mere stabilt.",
|
||||||
|
|
||||||
"settings.general.row.releaseNotes.title": "Udgivelsesnoter",
|
"settings.general.row.releaseNotes.title": "Udgivelsesnoter",
|
||||||
"settings.general.row.releaseNotes.description": 'Vis pop op-vinduer med "Hvad er nyt" efter opdateringer',
|
"settings.general.row.releaseNotes.description": 'Vis "Hvad er nyt"-popups efter opdateringer',
|
||||||
|
|
||||||
"settings.updates.row.startup.title": "Tjek for opdateringer ved opstart",
|
"settings.updates.row.startup.title": "Tjek for opdateringer ved opstart",
|
||||||
"settings.updates.row.startup.description": "Tjek automatisk for opdateringer, når OpenCode starter",
|
"settings.updates.row.startup.description": "Tjek automatisk for opdateringer, når OpenCode starter",
|
||||||
@@ -972,9 +945,9 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.description": "Læsning af en fil (matcher filstien)",
|
"settings.permissions.tool.read.description": "Læsning af en fil (matcher filstien)",
|
||||||
"settings.permissions.tool.edit.title": "Rediger",
|
"settings.permissions.tool.edit.title": "Rediger",
|
||||||
"settings.permissions.tool.edit.description":
|
"settings.permissions.tool.edit.description":
|
||||||
"Rediger filer, herunder med redigeringer, skrivning, patches og multiredigeringer",
|
"Ændre filer, herunder redigeringer, skrivninger, patches og multi-redigeringer",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Find filer ved hjælp af globmønstre",
|
"settings.permissions.tool.glob.description": "Match filer ved hjælp af glob-mønstre",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
"settings.permissions.tool.grep.description": "Søg i filindhold ved hjælp af regulære udtryk",
|
"settings.permissions.tool.grep.description": "Søg i filindhold ved hjælp af regulære udtryk",
|
||||||
"settings.permissions.tool.list.title": "Liste",
|
"settings.permissions.tool.list.title": "Liste",
|
||||||
@@ -987,8 +960,8 @@ export const dict = {
|
|||||||
"settings.permissions.tool.skill.description": "Indlæs en færdighed efter navn",
|
"settings.permissions.tool.skill.description": "Indlæs en færdighed efter navn",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
"settings.permissions.tool.lsp.description": "Kør sprogserverforespørgsler",
|
"settings.permissions.tool.lsp.description": "Kør sprogserverforespørgsler",
|
||||||
"settings.permissions.tool.todowrite.title": "Skriv to-do",
|
"settings.permissions.tool.todowrite.title": "Skriv To-do",
|
||||||
"settings.permissions.tool.todowrite.description": "Opdater to-do-listen",
|
"settings.permissions.tool.todowrite.description": "Opdater to-do listen",
|
||||||
"settings.permissions.tool.webfetch.title": "Webhentning",
|
"settings.permissions.tool.webfetch.title": "Webhentning",
|
||||||
"settings.permissions.tool.webfetch.description": "Hent indhold fra en URL",
|
"settings.permissions.tool.webfetch.description": "Hent indhold fra en URL",
|
||||||
"settings.permissions.tool.websearch.title": "Websøgning",
|
"settings.permissions.tool.websearch.title": "Websøgning",
|
||||||
@@ -1015,7 +988,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.description": "Arbejdsområdet matcher nu hovedgrenen.",
|
"workspace.reset.success.description": "Arbejdsområdet matcher nu hovedgrenen.",
|
||||||
"workspace.error.stillPreparing": "Arbejdsområdet er stadig ved at blive klargjort",
|
"workspace.error.stillPreparing": "Arbejdsområdet er stadig ved at blive klargjort",
|
||||||
"workspace.status.checking": "Tjekker for uflettede ændringer...",
|
"workspace.status.checking": "Tjekker for uflettede ændringer...",
|
||||||
"workspace.status.error": "Kunne ikke bekræfte Git-status.",
|
"workspace.status.error": "Kunne ikke bekræfte git-status.",
|
||||||
"workspace.status.clean": "Ingen uflettede ændringer fundet.",
|
"workspace.status.clean": "Ingen uflettede ændringer fundet.",
|
||||||
"workspace.status.dirty": "Uflettede ændringer fundet i dette arbejdsområde.",
|
"workspace.status.dirty": "Uflettede ændringer fundet i dette arbejdsområde.",
|
||||||
"workspace.delete.title": "Slet arbejdsområde",
|
"workspace.delete.title": "Slet arbejdsområde",
|
||||||
@@ -1057,9 +1030,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} af {{total}} spørgsmål",
|
"session.question.progress": "{{current}} af {{total}} spørgsmål",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Stifinder",
|
"session.header.open.fileExplorer": "Stifinder",
|
||||||
"session.header.reveal.finder": "Vis i Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Vis i Stifinder",
|
|
||||||
"session.header.reveal.containingFolder": "Åbn den overordnede mappe",
|
|
||||||
"session.header.open.fileManager": "Filhåndtering",
|
"session.header.open.fileManager": "Filhåndtering",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1080,11 +1050,11 @@ export const dict = {
|
|||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Sidste gennemførte ruteovergang, der berører en sessionsside, målt fra routerstart til den første optegning efter den falder til ro.",
|
"Sidste gennemførte ruteovergang, der berører en sessionsside, målt fra routerstart til den første optegning efter den falder til ro.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Rullende antal billedrammer pr. sekund over de sidste 5 sekunder.",
|
"debugBar.fps.tip": "Rullende billeder pr. sekund over de sidste 5 sekunder.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Længste billedrammetid over de sidste 5 sekunder.",
|
"debugBar.frame.tip": "Værste billedtid over de sidste 5 sekunder.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Billedrammer over 32 ms i de sidste 5 sekunder.",
|
"debugBar.jank.tip": "Billeder over 32ms i de sidste 5 sekunder.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip": "Blokeret tid og antal lange opgaver i de sidste 5 sekunder. Maks opgave: {{max}}.",
|
"debugBar.long.tip": "Blokeret tid og antal lange opgaver i de sidste 5 sekunder. Maks opgave: {{max}}.",
|
||||||
"debugBar.delay.label": "DELAY",
|
"debugBar.delay.label": "DELAY",
|
||||||
@@ -1095,16 +1065,8 @@ export const dict = {
|
|||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Kumulativt layoutskift for den nuværende app-levetid.",
|
"debugBar.cls.tip": "Kumulativt layoutskift for den nuværende app-levetid.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Brugt JS-heap sammenholdt med heapgrænsen. Kun Chromium.",
|
"debugBar.mem.tipUnavailable": "Brugt JS-heap vs heap-grænse. Kun Chromium.",
|
||||||
"debugBar.mem.tip": "Brugt JS-heap sammenholdt med heapgrænsen. {{used}} af {{limit}}.",
|
"debugBar.mem.tip": "Brugt JS-heap vs heap-grænse. {{used}} af {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Gennemtving fokusstile for alle interaktive elementer",
|
|
||||||
"debugBar.focus.on": "TIL",
|
|
||||||
"debugBar.focus.off": "FRA",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Gennemtving layoutretningen for hele appen uden at ændre det valgte sprog",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -1128,121 +1090,4 @@ export const dict = {
|
|||||||
"error.childStore.persistedProjectIconCreateFailed": "Kunne ikke oprette vedvarende projektikon",
|
"error.childStore.persistedProjectIconCreateFailed": "Kunne ikke oprette vedvarende projektikon",
|
||||||
"error.childStore.storeCreateFailed": "Kunne ikke oprette lager",
|
"error.childStore.storeCreateFailed": "Kunne ikke oprette lager",
|
||||||
"terminal.connectionLost.abnormalClose": "WebSocket lukkede unormalt: {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket lukkede unormalt: {{code}}",
|
||||||
|
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Arkiv",
|
|
||||||
"desktop.menu.edit": "Rediger",
|
|
||||||
"desktop.menu.view": "Oversigt",
|
|
||||||
"desktop.menu.go": "Gå",
|
|
||||||
"desktop.menu.window": "Vindue",
|
|
||||||
"desktop.menu.help": "Hjælp",
|
|
||||||
"desktop.menu.checkForUpdates": "Søg efter opdateringer...",
|
|
||||||
"desktop.menu.settings": "Indstillinger",
|
|
||||||
"desktop.menu.reloadWebview": "Genindlæs webvisning",
|
|
||||||
"desktop.menu.restart": "Genstart",
|
|
||||||
"desktop.menu.exportLogs": "Eksportér logfiler...",
|
|
||||||
"desktop.menu.newSession": "Ny session",
|
|
||||||
"desktop.menu.openProject": "Åbn projekt...",
|
|
||||||
"desktop.menu.newWindow": "Nyt vindue",
|
|
||||||
"desktop.menu.closeWindow": "Luk vindue",
|
|
||||||
"desktop.menu.undo": "Fortryd",
|
|
||||||
"desktop.menu.redo": "Gentag",
|
|
||||||
"desktop.menu.cut": "Klip",
|
|
||||||
"desktop.menu.copy": "Kopier",
|
|
||||||
"desktop.menu.paste": "Sæt ind",
|
|
||||||
"desktop.menu.delete": "Slet",
|
|
||||||
"desktop.menu.selectAll": "Vælg alt",
|
|
||||||
"desktop.menu.toggleSidebar": "Vis eller skjul indholdsoversigt",
|
|
||||||
"desktop.menu.toggleTerminal": "Vis eller skjul terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Vis eller skjul filtræ",
|
|
||||||
"desktop.menu.reload": "Genindlæs",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Vis eller skjul udviklerværktøjer",
|
|
||||||
"desktop.menu.actualSize": "Faktisk størrelse",
|
|
||||||
"desktop.menu.zoomIn": "Zoom ind",
|
|
||||||
"desktop.menu.zoomOut": "Zoom ud",
|
|
||||||
"desktop.menu.toggleFullScreen": "Slå fuldskærmsvisning til eller fra",
|
|
||||||
"desktop.menu.back": "Tilbage",
|
|
||||||
"desktop.menu.forward": "Frem",
|
|
||||||
"desktop.menu.previousSession": "Forrige session",
|
|
||||||
"desktop.menu.nextSession": "Næste session",
|
|
||||||
"desktop.menu.previousProject": "Forrige projekt",
|
|
||||||
"desktop.menu.nextProject": "Næste projekt",
|
|
||||||
"desktop.menu.minimize": "Minimer",
|
|
||||||
"desktop.menu.maximize": "Maksimer",
|
|
||||||
"desktop.menu.documentation": "OpenCode-dokumentation",
|
|
||||||
"desktop.menu.supportForum": "Supportforum",
|
|
||||||
"desktop.menu.shareFeedback": "Giv feedback",
|
|
||||||
"desktop.menu.reportBug": "Rapportér en fejl",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode-menu",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Søgningen efter opdateringer mislykkedes.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Opdateringsfejl",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Du er opdateret.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Ingen opdateringer",
|
|
||||||
"desktop.updater.dialog.ready.message": "Opdatering {{version}} er downloadet. Vil du genstarte nu?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Opdateringen er klar",
|
|
||||||
"desktop.updater.dialog.restart": "Genstart",
|
|
||||||
"desktop.updater.dialog.later": "Senere",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Start igen",
|
|
||||||
"desktop.recovery.action.exportLogs": "Eksportér logfiler",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Vent fortsat",
|
|
||||||
"desktop.recovery.action.quit": "Afslut",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode kunne ikke indlæses",
|
|
||||||
"desktop.recovery.terminated": "OpenCode-vinduet blev uventet afsluttet",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode svarer ikke",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Du kan starte appen igen, åbne logfilerne eller fortsætte med at vente.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Vindue: {{window}}\nURL: {{url}}\nFejl: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Vindue: {{window}}\nÅrsag: {{reason}}\nKode: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<ukendt>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Vælg en mappe",
|
|
||||||
"desktop.dialog.chooseFile": "Vælg en fil",
|
|
||||||
"desktop.dialog.saveFile": "Gem fil",
|
|
||||||
"desktop.dialog.files": "Filer",
|
|
||||||
"desktop.server.local": "Lokal server",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL er kun tilgængelig i Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL er ikke tilgængelig",
|
|
||||||
"desktop.wsl.error.listInstalled": "Kunne ikke vise installerede WSL-distributioner",
|
|
||||||
"desktop.wsl.error.listOnline": "Kunne ikke vise WSL-distributioner på nettet",
|
|
||||||
"desktop.wsl.error.executeDistro": "Kan ikke udføre kommandoer i distributionen",
|
|
||||||
"desktop.wsl.error.installWsl": "Installationen af WSL mislykkedes",
|
|
||||||
"desktop.wsl.error.installDistro": "Kunne ikke installere distributionen: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Installationen af OpenCode mislykkedes",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} er allerede tilføjet",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode er ikke installeret i denne distribution",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode er installeret, men kunne ikke køre",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode er ikke installeret i {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Opdateringen af OpenCode er fuldført, men {{distro}} rapporterer stadig {{installed}}. Forventet: {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "ingen version",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL-serveren blev afsluttet efter opstart (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL-serveren blev afsluttet, før den var klar (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Tilstandskontrollen af sidecar-processen for {{distro}} fik timeout efter {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "{{command}} {{args}} fik timeout efter {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Kunne ikke hente porten",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "Filen blev ikke valgt i filvælgeren",
|
|
||||||
"desktop.picker.error.sizeLimit": "De valgte vedhæftede filer overskrider grænsen på {{limit}} MB",
|
|
||||||
|
|
||||||
"command.logs.export": "Eksportér logfiler",
|
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Introduktion til faner. Organiser dit arbejde og dine aktive sessioner med faner",
|
|
||||||
"help.tabs.toast.dismiss": "Luk oplysninger om faner",
|
|
||||||
"help.tabs.title": "Introduktion til faner",
|
|
||||||
"help.tabs.description": "Organiser dit arbejde og dine aktive sessioner med faner",
|
|
||||||
"help.tabs.date": "14. juli",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop er nu bygget op omkring faner.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Start en ny session i en fane, eller åbn en eksisterende session fra et af dine projekter. Åbn en ny fane, når du går i gang med noget nyt, og luk den, når du er færdig.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Når du holder nogle få faner åbne, er det nemmere at organisere dine aktive sessioner. Giv fanerne navne, der er nemme at huske, hvis du vil beholde dem.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Du finder alle dine sessioner og projekter på den nye startskærm. Når du vælger en session, åbnes den i en fane.",
|
|
||||||
"help.tabs.persistence": "Dine faner er stadig åbne, når du åbner appen igen.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Det nye design understøtter endnu ikke Git Worktrees, men understøttelsen kommer snart. Hvis du foretrækker at fortsætte med det tidligere layout, kan du skifte mellem layoutene under Indstillinger. Bemærk, at det nye layout bliver permanent om nogle få uger.",
|
|
||||||
}
|
}
|
||||||
|
|||||||
+94
-241
@@ -89,9 +89,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "Diese Sitzung teilen und URL in die Zwischenablage kopieren",
|
"command.session.share.description": "Diese Sitzung teilen und URL in die Zwischenablage kopieren",
|
||||||
"command.session.unshare": "Teilen der Sitzung aufheben",
|
"command.session.unshare": "Teilen der Sitzung aufheben",
|
||||||
"command.session.unshare.description": "Teilen dieser Sitzung beenden",
|
"command.session.unshare.description": "Teilen dieser Sitzung beenden",
|
||||||
"command.session.export": "Sitzung exportieren",
|
|
||||||
"command.session.export.description": "Das vollständige Transkript der Sitzung als JSON exportieren",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Dateien, Befehle und Sitzungen durchsuchen",
|
"palette.search.placeholder": "Dateien, Befehle und Sitzungen durchsuchen",
|
||||||
"palette.search.placeholder.home": "Befehle und Sitzungen durchsuchen",
|
"palette.search.placeholder.home": "Befehle und Sitzungen durchsuchen",
|
||||||
"palette.empty": "Keine Ergebnisse gefunden",
|
"palette.empty": "Keine Ergebnisse gefunden",
|
||||||
@@ -101,14 +98,13 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Keine Anbieter gefunden",
|
"dialog.provider.empty": "Keine Anbieter gefunden",
|
||||||
"dialog.provider.group.popular": "Beliebt",
|
"dialog.provider.group.popular": "Beliebt",
|
||||||
"dialog.provider.group.other": "Andere",
|
"dialog.provider.group.other": "Andere",
|
||||||
"dialog.provider.custom.label": "Benutzerdefinierter OpenAI-kompatibler Anbieter",
|
|
||||||
"dialog.provider.tag.recommended": "Empfohlen",
|
"dialog.provider.tag.recommended": "Empfohlen",
|
||||||
"dialog.provider.opencode.note": "Kuratierte Modelle inklusive Claude, GPT, Gemini und mehr",
|
"dialog.provider.opencode.note": "Kuratierte Modelle inklusive Claude, GPT, Gemini und mehr",
|
||||||
"dialog.provider.opencode.tagline": "Zuverlässige, optimierte Modelle",
|
"dialog.provider.opencode.tagline": "Zuverlässige, optimierte Modelle",
|
||||||
"dialog.provider.opencodeGo.tagline": "Kostengünstiges Abo für alle",
|
"dialog.provider.opencodeGo.tagline": "Kostengünstiges Abo für alle",
|
||||||
"dialog.provider.anthropic.note": "Direkter Zugriff auf Claude-Modelle, einschließlich Pro und Max",
|
"dialog.provider.anthropic.note": "Mit Claude Pro/Max oder API-Schlüssel verbinden",
|
||||||
"dialog.provider.copilot.note": "KI-Modelle zur Programmierunterstützung über GitHub Copilot",
|
"dialog.provider.copilot.note": "Mit Copilot oder API-Schlüssel verbinden",
|
||||||
"dialog.provider.openai.note": "GPT-Modelle für schnelle, leistungsfähige allgemeine KI-Aufgaben",
|
"dialog.provider.openai.note": "Mit ChatGPT Pro/Plus oder API-Schlüssel verbinden",
|
||||||
"dialog.provider.google.note": "Gemini-Modelle für schnelle, strukturierte Antworten",
|
"dialog.provider.google.note": "Gemini-Modelle für schnelle, strukturierte Antworten",
|
||||||
"dialog.provider.openrouter.note": "Zugriff auf alle unterstützten Modelle über einen Anbieter",
|
"dialog.provider.openrouter.note": "Zugriff auf alle unterstützten Modelle über einen Anbieter",
|
||||||
"dialog.provider.vercel.note": "Einheitlicher Zugriff auf KI-Modelle mit intelligentem Routing",
|
"dialog.provider.vercel.note": "Einheitlicher Zugriff auf KI-Modelle mit intelligentem Routing",
|
||||||
@@ -120,20 +116,17 @@ export const dict = {
|
|||||||
"dialog.model.manage.provider.toggle": "Alle {{provider}}-Modelle umschalten",
|
"dialog.model.manage.provider.toggle": "Alle {{provider}}-Modelle umschalten",
|
||||||
"dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Weitere Modelle von beliebten Anbietern hinzufügen",
|
"dialog.model.unpaid.addMore.title": "Weitere Modelle von beliebten Anbietern hinzufügen",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Über 70 weitere Anbieter anzeigen",
|
|
||||||
"dialog.provider.viewAll": "Mehr Anbieter anzeigen",
|
"dialog.provider.viewAll": "Mehr Anbieter anzeigen",
|
||||||
"provider.connect.title": "{{provider}} verbinden",
|
"provider.connect.title": "{{provider}} verbinden",
|
||||||
"provider.connect.title.anthropicProMax": "Mit Claude Pro/Max anmelden",
|
"provider.connect.title.anthropicProMax": "Mit Claude Pro/Max anmelden",
|
||||||
"provider.connect.selectMethod": "Anmeldemethode für {{provider}} auswählen.",
|
"provider.connect.selectMethod": "Anmeldemethode für {{provider}} auswählen.",
|
||||||
"provider.connect.method.apiKey": "API-Schlüssel",
|
"provider.connect.method.apiKey": "API-Schlüssel",
|
||||||
"provider.connect.method.browser": "Browser",
|
"provider.connect.status.inProgress": "Autorisierung läuft...",
|
||||||
"provider.connect.method.headless": "Browserlos",
|
"provider.connect.status.waiting": "Warten auf Autorisierung...",
|
||||||
"provider.connect.status.inProgress": "Autorisierung läuft…",
|
|
||||||
"provider.connect.status.waiting": "Warten auf Autorisierung…",
|
|
||||||
"provider.connect.status.failed": "Autorisierung fehlgeschlagen: {{error}}",
|
"provider.connect.status.failed": "Autorisierung fehlgeschlagen: {{error}}",
|
||||||
"provider.connect.apiKey.description":
|
"provider.connect.apiKey.description":
|
||||||
"Geben Sie Ihren API-Schlüssel für {{provider}} ein, um Ihr Konto zu verbinden und {{provider}}-Modelle in OpenCode zu nutzen.",
|
"Geben Sie Ihren {{provider}} API-Schlüssel ein, um Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.",
|
||||||
"provider.connect.apiKey.label": "API-Schlüssel für {{provider}}",
|
"provider.connect.apiKey.label": "{{provider}} API-Schlüssel",
|
||||||
"provider.connect.apiKey.placeholder": "API-Schlüssel",
|
"provider.connect.apiKey.placeholder": "API-Schlüssel",
|
||||||
"provider.connect.apiKey.required": "API-Schlüssel ist erforderlich",
|
"provider.connect.apiKey.required": "API-Schlüssel ist erforderlich",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
@@ -146,22 +139,21 @@ export const dict = {
|
|||||||
"provider.connect.oauth.code.visit.prefix": "Besuchen Sie ",
|
"provider.connect.oauth.code.visit.prefix": "Besuchen Sie ",
|
||||||
"provider.connect.oauth.code.visit.link": "diesen Link",
|
"provider.connect.oauth.code.visit.link": "diesen Link",
|
||||||
"provider.connect.oauth.code.visit.suffix":
|
"provider.connect.oauth.code.visit.suffix":
|
||||||
", um Ihren Autorisierungscode zu erhalten, Ihr Konto zu verbinden und {{provider}}-Modelle in OpenCode zu nutzen.",
|
", um Ihren Autorisierungscode zu erhalten, Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.",
|
||||||
"provider.connect.oauth.code.label": "{{method}}-Autorisierungscode",
|
"provider.connect.oauth.code.label": "{{method}} Autorisierungscode",
|
||||||
"provider.connect.oauth.code.placeholder": "Autorisierungscode",
|
"provider.connect.oauth.code.placeholder": "Autorisierungscode",
|
||||||
"provider.connect.oauth.code.required": "Autorisierungscode ist erforderlich",
|
"provider.connect.oauth.code.required": "Autorisierungscode ist erforderlich",
|
||||||
"provider.connect.oauth.code.invalid": "Ungültiger Autorisierungscode",
|
"provider.connect.oauth.code.invalid": "Ungültiger Autorisierungscode",
|
||||||
"provider.connect.oauth.auto.visit.prefix": "Besuchen Sie ",
|
"provider.connect.oauth.auto.visit.prefix": "Besuchen Sie ",
|
||||||
"provider.connect.oauth.auto.visit.link": "diesen Link",
|
"provider.connect.oauth.auto.visit.link": "diesen Link",
|
||||||
"provider.connect.oauth.auto.visit.suffix":
|
"provider.connect.oauth.auto.visit.suffix":
|
||||||
" und geben Sie den untenstehenden Code ein, um Ihr Konto zu verbinden und {{provider}}-Modelle in OpenCode zu nutzen.",
|
" und geben Sie den untenstehenden Code ein, um Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.",
|
||||||
"provider.connect.oauth.auto.confirmationCode": "Bestätigungscode",
|
"provider.connect.oauth.auto.confirmationCode": "Bestätigungscode",
|
||||||
"provider.connect.toast.connected.title": "{{provider}} verbunden",
|
"provider.connect.toast.connected.title": "{{provider}} verbunden",
|
||||||
"provider.connect.toast.connected.description": "{{provider}}-Modelle sind jetzt verfügbar.",
|
"provider.connect.toast.connected.description": "{{provider}} Modelle sind jetzt verfügbar.",
|
||||||
"provider.custom.title": "Benutzerdefinierter Anbieter",
|
"provider.custom.title": "Benutzerdefinierter Anbieter",
|
||||||
"provider.custom.unavailable": "Benutzerdefinierte Anbieter sind auf diesem Server nicht verfügbar",
|
|
||||||
"provider.custom.description.prefix": "Konfigurieren Sie einen OpenAI-kompatiblen Anbieter. Siehe die ",
|
"provider.custom.description.prefix": "Konfigurieren Sie einen OpenAI-kompatiblen Anbieter. Siehe die ",
|
||||||
"provider.custom.description.link": "Dokumentation zur Anbieterkonfiguration",
|
"provider.custom.description.link": "Anbieter-Konfigurationsdokumente",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
"provider.custom.field.providerID.label": "Anbieter-ID",
|
"provider.custom.field.providerID.label": "Anbieter-ID",
|
||||||
"provider.custom.field.providerID.placeholder": "myprovider",
|
"provider.custom.field.providerID.placeholder": "myprovider",
|
||||||
@@ -216,32 +208,32 @@ export const dict = {
|
|||||||
"model.tooltip.model": "Modell",
|
"model.tooltip.model": "Modell",
|
||||||
"model.tooltip.provider": "Anbieter",
|
"model.tooltip.provider": "Anbieter",
|
||||||
"model.tooltip.reasoning": "Reasoning",
|
"model.tooltip.reasoning": "Reasoning",
|
||||||
"model.tooltip.reasoning.allowed": "Reasoning möglich",
|
"model.tooltip.reasoning.allowed": "Erlaubt Reasoning",
|
||||||
"model.tooltip.reasoning.none": "Kein Reasoning",
|
"model.tooltip.reasoning.none": "Kein Reasoning",
|
||||||
"model.tooltip.context": "Kontextlimit {{limit}}",
|
"model.tooltip.context": "Kontextlimit {{limit}}",
|
||||||
"common.search.placeholder": "Suchen",
|
"common.search.placeholder": "Suchen",
|
||||||
"common.goBack": "Zurück",
|
"common.goBack": "Zurück",
|
||||||
"common.goForward": "Vorwärts navigieren",
|
"common.goForward": "Vorwärts navigieren",
|
||||||
"common.loading": "Wird geladen",
|
"common.loading": "Laden",
|
||||||
"common.loading.ellipsis": "…",
|
"common.loading.ellipsis": "...",
|
||||||
"common.cancel": "Abbrechen",
|
"common.cancel": "Abbrechen",
|
||||||
"common.clear": "Leeren",
|
"common.clear": "Leeren",
|
||||||
"common.connect": "Verbinden",
|
"common.connect": "Verbinden",
|
||||||
"common.disconnect": "Trennen",
|
"common.disconnect": "Trennen",
|
||||||
"common.continue": "Weiter",
|
"common.continue": "Absenden",
|
||||||
"common.submit": "Absenden",
|
"common.submit": "Absenden",
|
||||||
"common.save": "Speichern",
|
"common.save": "Speichern",
|
||||||
"common.saving": "Wird gespeichert…",
|
"common.saving": "Speichert...",
|
||||||
"common.default": "Standard",
|
"common.default": "Standard",
|
||||||
"common.attachment": "Anhang",
|
"common.attachment": "Anhang",
|
||||||
"prompt.placeholder.shell": "Shell-Befehl eingeben… {{example}}",
|
"prompt.placeholder.shell": "Shell-Befehl eingeben... {{example}}",
|
||||||
"prompt.placeholder.normal": 'Beliebige Frage stellen… "{{example}}"',
|
"prompt.placeholder.normal": 'Fragen Sie alles... "{{example}}"',
|
||||||
"prompt.placeholder.simple": "Beliebige Frage stellen…",
|
"prompt.placeholder.simple": "Fragen Sie alles...",
|
||||||
"prompt.placeholder.summarizeComments": "Kommentare zusammenfassen…",
|
"prompt.placeholder.summarizeComments": "Kommentare zusammenfassen…",
|
||||||
"prompt.placeholder.summarizeComment": "Kommentar zusammenfassen…",
|
"prompt.placeholder.summarizeComment": "Kommentar zusammenfassen…",
|
||||||
"prompt.mode.shell": "Shell",
|
"prompt.mode.shell": "Shell",
|
||||||
"prompt.mode.normal": "Prompt",
|
"prompt.mode.normal": "Prompt",
|
||||||
"prompt.mode.shell.exit": "Esc zum Verlassen",
|
"prompt.mode.shell.exit": "esc zum Verlassen",
|
||||||
"session.child.promptDisabled": "Unteragenten-Sitzungen können keine Prompts erhalten.",
|
"session.child.promptDisabled": "Unteragenten-Sitzungen können keine Prompts erhalten.",
|
||||||
"session.child.backToParent": "Zurück zur Hauptsitzung.",
|
"session.child.backToParent": "Zurück zur Hauptsitzung.",
|
||||||
"prompt.example.1": "Ein TODO in der Codebasis beheben",
|
"prompt.example.1": "Ein TODO in der Codebasis beheben",
|
||||||
@@ -256,8 +248,8 @@ export const dict = {
|
|||||||
"prompt.example.10": "API-Dokumentation generieren",
|
"prompt.example.10": "API-Dokumentation generieren",
|
||||||
"prompt.example.11": "Datenbankabfragen optimieren",
|
"prompt.example.11": "Datenbankabfragen optimieren",
|
||||||
"prompt.example.12": "Eingabevalidierung hinzufügen",
|
"prompt.example.12": "Eingabevalidierung hinzufügen",
|
||||||
"prompt.example.13": "Neue Komponente erstellen für…",
|
"prompt.example.13": "Neue Komponente erstellen für...",
|
||||||
"prompt.example.14": "Wie stelle ich dieses Projekt bereit?",
|
"prompt.example.14": "Wie deploye ich dieses Projekt?",
|
||||||
"prompt.example.15": "Meinen Code auf Best Practices überprüfen",
|
"prompt.example.15": "Meinen Code auf Best Practices überprüfen",
|
||||||
"prompt.example.16": "Fehlerbehandlung zu dieser Funktion hinzufügen",
|
"prompt.example.16": "Fehlerbehandlung zu dieser Funktion hinzufügen",
|
||||||
"prompt.example.17": "Erkläre dieses Regex-Muster",
|
"prompt.example.17": "Erkläre dieses Regex-Muster",
|
||||||
@@ -267,12 +259,12 @@ export const dict = {
|
|||||||
"prompt.example.21": "Hilf mir, ein Migrationsskript zu schreiben",
|
"prompt.example.21": "Hilf mir, ein Migrationsskript zu schreiben",
|
||||||
"prompt.example.22": "Caching für diesen Endpunkt implementieren",
|
"prompt.example.22": "Caching für diesen Endpunkt implementieren",
|
||||||
"prompt.example.23": "Paginierung zu dieser Liste hinzufügen",
|
"prompt.example.23": "Paginierung zu dieser Liste hinzufügen",
|
||||||
"prompt.example.24": "CLI-Befehl erstellen für…",
|
"prompt.example.24": "CLI-Befehl erstellen für...",
|
||||||
"prompt.example.25": "Wie funktionieren Umgebungsvariablen hier?",
|
"prompt.example.25": "Wie funktionieren Umgebungsvariablen hier?",
|
||||||
"prompt.popover.emptyResults": "Keine passenden Ergebnisse",
|
"prompt.popover.emptyResults": "Keine passenden Ergebnisse",
|
||||||
"prompt.popover.emptyCommands": "Keine passenden Befehle",
|
"prompt.popover.emptyCommands": "Keine passenden Befehle",
|
||||||
"prompt.dropzone.label": "Bilder, PDFs oder Textdateien hier ablegen",
|
"prompt.dropzone.label": "Bilder, PDFs oder Textdateien hier ablegen",
|
||||||
"prompt.dropzone.file.label": "Ablegen, um die Datei mit @ zu erwähnen",
|
"prompt.dropzone.file.label": "Ablegen zum @Erwähnen der Datei",
|
||||||
"prompt.slash.badge.custom": "benutzerdefiniert",
|
"prompt.slash.badge.custom": "benutzerdefiniert",
|
||||||
"prompt.slash.badge.skill": "Skill",
|
"prompt.slash.badge.skill": "Skill",
|
||||||
"prompt.slash.badge.mcp": "MCP",
|
"prompt.slash.badge.mcp": "MCP",
|
||||||
@@ -288,14 +280,14 @@ export const dict = {
|
|||||||
"prompt.menu.shellCommand": "Shell-Befehl",
|
"prompt.menu.shellCommand": "Shell-Befehl",
|
||||||
"prompt.attachment.remove": "Anhang entfernen",
|
"prompt.attachment.remove": "Anhang entfernen",
|
||||||
"prompt.action.send": "Senden",
|
"prompt.action.send": "Senden",
|
||||||
"prompt.action.stop": "Stoppen",
|
"prompt.action.stop": "Stopp",
|
||||||
"prompt.toast.pasteUnsupported.title": "Nicht unterstützter Anhang",
|
"prompt.toast.pasteUnsupported.title": "Nicht unterstützter Anhang",
|
||||||
"prompt.toast.attachmentDuplicate.title": "Diese Datei wurde bereits hochgeladen",
|
"prompt.toast.attachmentDuplicate.title": "Diese Datei wurde bereits hochgeladen",
|
||||||
"prompt.toast.pasteUnsupported.description": "Hier können nur Bilder, PDFs oder Textdateien angehängt werden.",
|
"prompt.toast.pasteUnsupported.description": "Hier können nur Bilder, PDFs oder Textdateien angehängt werden.",
|
||||||
"prompt.toast.modelAgentRequired.title": "Wählen Sie einen Agenten und ein Modell",
|
"prompt.toast.modelAgentRequired.title": "Wählen Sie einen Agenten und ein Modell",
|
||||||
"prompt.toast.modelAgentRequired.description":
|
"prompt.toast.modelAgentRequired.description":
|
||||||
"Wählen Sie einen Agenten und ein Modell, bevor Sie eine Eingabe senden.",
|
"Wählen Sie einen Agenten und ein Modell, bevor Sie eine Eingabe senden.",
|
||||||
"prompt.toast.worktreeCreateFailed.title": "Der Worktree konnte nicht erstellt werden",
|
"prompt.toast.worktreeCreateFailed.title": "Worktree konnte nicht erstellt werden",
|
||||||
"prompt.toast.sessionCreateFailed.title": "Sitzung konnte nicht erstellt werden",
|
"prompt.toast.sessionCreateFailed.title": "Sitzung konnte nicht erstellt werden",
|
||||||
"prompt.toast.shellSendFailed.title": "Shell-Befehl konnte nicht gesendet werden",
|
"prompt.toast.shellSendFailed.title": "Shell-Befehl konnte nicht gesendet werden",
|
||||||
"prompt.toast.commandSendFailed.title": "Befehl konnte nicht gesendet werden",
|
"prompt.toast.commandSendFailed.title": "Befehl konnte nicht gesendet werden",
|
||||||
@@ -308,7 +300,7 @@ export const dict = {
|
|||||||
"dialog.plugins.empty": "In opencode.json konfigurierte Plugins",
|
"dialog.plugins.empty": "In opencode.json konfigurierte Plugins",
|
||||||
"mcp.status.connected": "verbunden",
|
"mcp.status.connected": "verbunden",
|
||||||
"mcp.status.failed": "fehlgeschlagen",
|
"mcp.status.failed": "fehlgeschlagen",
|
||||||
"mcp.status.needs_auth": "Authentifizierung erforderlich",
|
"mcp.status.needs_auth": "benötigt Authentifizierung",
|
||||||
"mcp.auth.clickToAuthenticate": "Zum Authentifizieren klicken",
|
"mcp.auth.clickToAuthenticate": "Zum Authentifizieren klicken",
|
||||||
"mcp.status.disabled": "deaktiviert",
|
"mcp.status.disabled": "deaktiviert",
|
||||||
"dialog.fork.empty": "Keine Nachrichten zum Abzweigen vorhanden",
|
"dialog.fork.empty": "Keine Nachrichten zum Abzweigen vorhanden",
|
||||||
@@ -324,10 +316,10 @@ export const dict = {
|
|||||||
"dialog.server.search.placeholder": "Server durchsuchen",
|
"dialog.server.search.placeholder": "Server durchsuchen",
|
||||||
"dialog.server.empty": "Noch keine Server",
|
"dialog.server.empty": "Noch keine Server",
|
||||||
"dialog.server.add.title": "Server hinzufügen",
|
"dialog.server.add.title": "Server hinzufügen",
|
||||||
"dialog.server.add.url": "Serveradresse",
|
"dialog.server.add.url": "Server-URL",
|
||||||
"dialog.server.add.placeholder": "http://localhost:4096",
|
"dialog.server.add.placeholder": "http://localhost:4096",
|
||||||
"dialog.server.add.error": "Verbindung zum Server fehlgeschlagen",
|
"dialog.server.add.error": "Verbindung zum Server fehlgeschlagen",
|
||||||
"dialog.server.add.checking": "Prüfen…",
|
"dialog.server.add.checking": "Prüfen...",
|
||||||
"dialog.server.add.button": "Server hinzufügen",
|
"dialog.server.add.button": "Server hinzufügen",
|
||||||
"dialog.server.add.name": "Servername (optional)",
|
"dialog.server.add.name": "Servername (optional)",
|
||||||
"dialog.server.add.namePlaceholder": "Localhost",
|
"dialog.server.add.namePlaceholder": "Localhost",
|
||||||
@@ -336,7 +328,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Server bearbeiten",
|
"dialog.server.edit.title": "Server bearbeiten",
|
||||||
"dialog.server.default.title": "Standardserver",
|
"dialog.server.default.title": "Standardserver",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Beim App-Start mit diesem Server verbinden, anstatt einen lokalen Server zu starten. Ein Neustart ist erforderlich.",
|
"Beim App-Start mit diesem Server verbinden, anstatt einen lokalen Server zu starten. Erfordert Neustart.",
|
||||||
"dialog.server.default.none": "Kein Server ausgewählt",
|
"dialog.server.default.none": "Kein Server ausgewählt",
|
||||||
"dialog.server.default.set": "Aktuellen Server als Standard setzen",
|
"dialog.server.default.set": "Aktuellen Server als Standard setzen",
|
||||||
"dialog.server.default.clear": "Löschen",
|
"dialog.server.default.clear": "Löschen",
|
||||||
@@ -352,26 +344,26 @@ export const dict = {
|
|||||||
"wsl.server.label": "WSL",
|
"wsl.server.label": "WSL",
|
||||||
"wsl.server.menu.label": "WSL-Server",
|
"wsl.server.menu.label": "WSL-Server",
|
||||||
"wsl.server.retryStart": "Start erneut versuchen",
|
"wsl.server.retryStart": "Start erneut versuchen",
|
||||||
"wsl.server.updating": "Wird aktualisiert…",
|
"wsl.server.updating": "Wird aktualisiert...",
|
||||||
"wsl.onboarding.step.distro": "Distribution auswählen",
|
"wsl.onboarding.step.distro": "Distribution auswählen",
|
||||||
"wsl.onboarding.step.opencode": "OpenCode",
|
"wsl.onboarding.step.opencode": "OpenCode",
|
||||||
"wsl.onboarding.checkingRuntime": "WSL wird geprüft…",
|
"wsl.onboarding.checkingRuntime": "WSL wird geprüft...",
|
||||||
"wsl.onboarding.restartRequired": "Windows muss neu gestartet werden, um die WSL-Installation abzuschließen.",
|
"wsl.onboarding.restartRequired": "Windows muss neu gestartet werden, um die WSL-Installation abzuschließen.",
|
||||||
"wsl.onboarding.ready": "WSL ist bereit.",
|
"wsl.onboarding.ready": "WSL ist bereit.",
|
||||||
"wsl.onboarding.required": "WSL ist erforderlich, um fortzufahren.",
|
"wsl.onboarding.required": "WSL ist erforderlich, um fortzufahren.",
|
||||||
"wsl.onboarding.checkingDistros": "Distributionen werden geprüft…",
|
"wsl.onboarding.checkingDistros": "Distributionen werden geprüft...",
|
||||||
"wsl.onboarding.installingDistro": "{{distro}} wird installiert…",
|
"wsl.onboarding.installingDistro": "{{distro}} wird installiert...",
|
||||||
"wsl.onboarding.checkingDistro": "{{distro}} wird geprüft…",
|
"wsl.onboarding.checkingDistro": "{{distro}} wird geprüft...",
|
||||||
"wsl.onboarding.listingDistros": "Distributionen werden aufgelistet…",
|
"wsl.onboarding.listingDistros": "Distributionen werden aufgelistet...",
|
||||||
"wsl.onboarding.distroReady": "{{distro}} ist bereit.",
|
"wsl.onboarding.distroReady": "{{distro}} ist bereit.",
|
||||||
"wsl.onboarding.distroNotInstalled": "{{distro}} ist noch nicht installiert.",
|
"wsl.onboarding.distroNotInstalled": "{{distro}} ist noch nicht installiert.",
|
||||||
"wsl.onboarding.openDistroOnce": "Öffnen Sie {{distro}} einmal, um die Einrichtung abzuschließen.",
|
"wsl.onboarding.openDistroOnce": "Öffnen Sie {{distro}} einmal, um die Einrichtung abzuschließen.",
|
||||||
"wsl.onboarding.finishingDistro": "Einrichtung von {{distro}} wird abgeschlossen.",
|
"wsl.onboarding.finishingDistro": "Einrichtung von {{distro}} wird abgeschlossen.",
|
||||||
"wsl.onboarding.pickDistro": "Wählen Sie eine Distribution aus oder installieren Sie unten eine.",
|
"wsl.onboarding.pickDistro": "Wählen Sie eine Distribution aus oder installieren Sie unten eine.",
|
||||||
"wsl.onboarding.checkingOpencode": "OpenCode wird geprüft…",
|
"wsl.onboarding.checkingOpencode": "OpenCode wird geprüft...",
|
||||||
"wsl.onboarding.checkingOpencodeIn": "OpenCode in {{distro}} wird geprüft…",
|
"wsl.onboarding.checkingOpencodeIn": "OpenCode in {{distro}} wird geprüft...",
|
||||||
"wsl.onboarding.updatingOpencode": "OpenCode wird aktualisiert…",
|
"wsl.onboarding.updatingOpencode": "OpenCode wird aktualisiert...",
|
||||||
"wsl.onboarding.updatingOpencodeIn": "OpenCode in {{distro}} wird aktualisiert…",
|
"wsl.onboarding.updatingOpencodeIn": "OpenCode in {{distro}} wird aktualisiert...",
|
||||||
"wsl.onboarding.updateOpencodeIn": "Aktualisieren Sie OpenCode in {{distro}}.",
|
"wsl.onboarding.updateOpencodeIn": "Aktualisieren Sie OpenCode in {{distro}}.",
|
||||||
"wsl.onboarding.updateOpencode": "OpenCode aktualisieren",
|
"wsl.onboarding.updateOpencode": "OpenCode aktualisieren",
|
||||||
"wsl.onboarding.opencodeReadyIn": "OpenCode ist in {{distro}} bereit.",
|
"wsl.onboarding.opencodeReadyIn": "OpenCode ist in {{distro}} bereit.",
|
||||||
@@ -380,11 +372,11 @@ export const dict = {
|
|||||||
"wsl.onboarding.installOpencode": "OpenCode installieren",
|
"wsl.onboarding.installOpencode": "OpenCode installieren",
|
||||||
"wsl.onboarding.chooseDistroFirst": "Wählen Sie zuerst eine Distribution aus.",
|
"wsl.onboarding.chooseDistroFirst": "Wählen Sie zuerst eine Distribution aus.",
|
||||||
"wsl.onboarding.loadFailed": "WSL-Status konnte nicht geladen werden.",
|
"wsl.onboarding.loadFailed": "WSL-Status konnte nicht geladen werden.",
|
||||||
"wsl.onboarding.loading": "Wird geladen…",
|
"wsl.onboarding.loading": "Wird geladen...",
|
||||||
"wsl.onboarding.installedDistros": "Installierte Distributionen",
|
"wsl.onboarding.installedDistros": "Installierte Distributionen",
|
||||||
"wsl.onboarding.checkAgain": "Erneut prüfen",
|
"wsl.onboarding.checkAgain": "Erneut prüfen",
|
||||||
"wsl.onboarding.distroStatus.ready": "Bereit",
|
"wsl.onboarding.distroStatus.ready": "Bereit",
|
||||||
"wsl.onboarding.distroStatus.checking": "Wird geprüft…",
|
"wsl.onboarding.distroStatus.checking": "Wird geprüft...",
|
||||||
"wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nicht installiert",
|
"wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nicht installiert",
|
||||||
"wsl.onboarding.distroStatus.missingTools": "Fehlend: bash, curl",
|
"wsl.onboarding.distroStatus.missingTools": "Fehlend: bash, curl",
|
||||||
"wsl.onboarding.distroStatus.unsupported": "Nicht unterstützt · WSL 2 verwenden",
|
"wsl.onboarding.distroStatus.unsupported": "Nicht unterstützt · WSL 2 verwenden",
|
||||||
@@ -403,7 +395,7 @@ export const dict = {
|
|||||||
"wsl.onboarding.allDistrosAdded": "Alle installierten Distributionen wurden bereits hinzugefügt.",
|
"wsl.onboarding.allDistrosAdded": "Alle installierten Distributionen wurden bereits hinzugefügt.",
|
||||||
"wsl.onboarding.noDistros": "Noch keine Distributionen erkannt.",
|
"wsl.onboarding.noDistros": "Noch keine Distributionen erkannt.",
|
||||||
"wsl.onboarding.install": "Installieren",
|
"wsl.onboarding.install": "Installieren",
|
||||||
"wsl.onboarding.installing": "Wird installiert…",
|
"wsl.onboarding.installing": "Wird installiert...",
|
||||||
"wsl.onboarding.installDistro": "Distribution installieren",
|
"wsl.onboarding.installDistro": "Distribution installieren",
|
||||||
"wsl.onboarding.searchDistros": "Distributionen durchsuchen",
|
"wsl.onboarding.searchDistros": "Distributionen durchsuchen",
|
||||||
"wsl.onboarding.wsl2Required": "WSL 2 ist erforderlich.",
|
"wsl.onboarding.wsl2Required": "WSL 2 ist erforderlich.",
|
||||||
@@ -415,21 +407,19 @@ export const dict = {
|
|||||||
"wsl.onboarding.unknown": "unbekannt",
|
"wsl.onboarding.unknown": "unbekannt",
|
||||||
"wsl.onboarding.desktopVersion": "Desktop {{version}}",
|
"wsl.onboarding.desktopVersion": "Desktop {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "Die installierte Version entspricht nicht der Version der Desktop-App.",
|
"wsl.onboarding.versionMismatch": "Die installierte Version entspricht nicht der Version der Desktop-App.",
|
||||||
"wsl.onboarding.adding": "Wird hinzugefügt…",
|
"wsl.onboarding.adding": "Wird hinzugefügt...",
|
||||||
"dialog.project.edit.title": "Projekt bearbeiten",
|
"dialog.project.edit.title": "Projekt bearbeiten",
|
||||||
"dialog.project.edit.name": "Name",
|
"dialog.project.edit.name": "Name",
|
||||||
"dialog.project.edit.icon": "Symbol",
|
"dialog.project.edit.icon": "Icon",
|
||||||
"dialog.project.edit.icon.alt": "Projektsymbol",
|
"dialog.project.edit.icon.alt": "Projekt-Icon",
|
||||||
"dialog.project.edit.icon.hint": "Klicken oder Bild ziehen",
|
"dialog.project.edit.icon.hint": "Klicken oder Bild ziehen",
|
||||||
"dialog.project.edit.icon.recommended": "Empfohlen: 128 × 128 px",
|
"dialog.project.edit.icon.recommended": "Empfohlen: 128x128px",
|
||||||
"dialog.project.edit.color": "Farbe",
|
"dialog.project.edit.color": "Farbe",
|
||||||
"dialog.project.edit.color.select": "{{color}}-Farbe auswählen",
|
"dialog.project.edit.color.select": "{{color}}-Farbe auswählen",
|
||||||
"dialog.project.edit.worktree.startup": "Startup-Skript für Arbeitsbereich",
|
"dialog.project.edit.worktree.startup": "Startup-Skript für Arbeitsbereich",
|
||||||
"dialog.project.edit.worktree.startup.description":
|
"dialog.project.edit.worktree.startup.description":
|
||||||
"Wird nach dem Erstellen eines neuen Arbeitsbereichs (Worktree) ausgeführt.",
|
"Wird nach dem Erstellen eines neuen Arbeitsbereichs (Worktree) ausgeführt.",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "z. B. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "z. B. bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Nicht mehr anzeigen",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Kontext-Aufschlüsselung",
|
"context.breakdown.title": "Kontext-Aufschlüsselung",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Ungefähre Aufschlüsselung der Eingabe-Token. "Andere" beinhaltet Werkzeugdefinitionen und Overhead.',
|
'Ungefähre Aufschlüsselung der Eingabe-Token. "Andere" beinhaltet Werkzeugdefinitionen und Overhead.',
|
||||||
@@ -440,8 +430,6 @@ export const dict = {
|
|||||||
"context.breakdown.other": "Andere",
|
"context.breakdown.other": "Andere",
|
||||||
"context.systemPrompt.title": "System-Prompt",
|
"context.systemPrompt.title": "System-Prompt",
|
||||||
"context.rawMessages.title": "Rohdaten der Nachrichten",
|
"context.rawMessages.title": "Rohdaten der Nachrichten",
|
||||||
"context.export.session": "Sitzung exportieren",
|
|
||||||
|
|
||||||
"context.stats.session": "Sitzung",
|
"context.stats.session": "Sitzung",
|
||||||
"context.stats.messages": "Nachrichten",
|
"context.stats.messages": "Nachrichten",
|
||||||
"context.stats.provider": "Anbieter",
|
"context.stats.provider": "Anbieter",
|
||||||
@@ -501,18 +489,13 @@ export const dict = {
|
|||||||
"toast.context.noLineSelection.description": "Wählen Sie zuerst einen Zeilenbereich in einem Datei-Tab aus.",
|
"toast.context.noLineSelection.description": "Wählen Sie zuerst einen Zeilenbereich in einem Datei-Tab aus.",
|
||||||
"toast.session.share.copyFailed.title": "URL konnte nicht in die Zwischenablage kopiert werden",
|
"toast.session.share.copyFailed.title": "URL konnte nicht in die Zwischenablage kopiert werden",
|
||||||
"toast.session.share.success.title": "Sitzung geteilt",
|
"toast.session.share.success.title": "Sitzung geteilt",
|
||||||
"toast.session.share.success.description": "URL zum Teilen in die Zwischenablage kopiert!",
|
"toast.session.share.success.description": "Teilen-URL in die Zwischenablage kopiert!",
|
||||||
"toast.session.share.failed.title": "Sitzung konnte nicht geteilt werden",
|
"toast.session.share.failed.title": "Sitzung konnte nicht geteilt werden",
|
||||||
"toast.session.share.failed.description": "Beim Teilen der Sitzung ist ein Fehler aufgetreten",
|
"toast.session.share.failed.description": "Beim Teilen der Sitzung ist ein Fehler aufgetreten",
|
||||||
"toast.session.unshare.success.title": "Teilen der Sitzung aufgehoben",
|
"toast.session.unshare.success.title": "Teilen der Sitzung aufgehoben",
|
||||||
"toast.session.unshare.success.description": "Teilen der Sitzung erfolgreich aufgehoben!",
|
"toast.session.unshare.success.description": "Teilen der Sitzung erfolgreich aufgehoben!",
|
||||||
"toast.session.unshare.failed.title": "Aufheben des Teilens fehlgeschlagen",
|
"toast.session.unshare.failed.title": "Aufheben des Teilens fehlgeschlagen",
|
||||||
"toast.session.unshare.failed.description": "Beim Aufheben des Teilens ist ein Fehler aufgetreten",
|
"toast.session.unshare.failed.description": "Beim Aufheben des Teilens ist ein Fehler aufgetreten",
|
||||||
"toast.session.export.success.title": "Sitzung exportiert",
|
|
||||||
"toast.session.export.success.description": "Sitzung unter {{filename}} gespeichert",
|
|
||||||
"toast.session.export.failed.title": "Sitzung konnte nicht exportiert werden",
|
|
||||||
"toast.session.export.failed.description": "Beim Exportieren der Sitzung ist ein Fehler aufgetreten",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Sitzungen für {{project}} konnten nicht geladen werden",
|
"toast.session.listFailed.title": "Sitzungen für {{project}} konnten nicht geladen werden",
|
||||||
"toast.update.title": "Update verfügbar",
|
"toast.update.title": "Update verfügbar",
|
||||||
"toast.update.description": "Eine neue Version von OpenCode ({{version}}) ist zur Installation verfügbar.",
|
"toast.update.description": "Eine neue Version von OpenCode ({{version}}) ist zur Installation verfügbar.",
|
||||||
@@ -526,14 +509,14 @@ export const dict = {
|
|||||||
"error.page.action.report": "Fehler melden",
|
"error.page.action.report": "Fehler melden",
|
||||||
"error.page.action.reported": "Fehler gemeldet",
|
"error.page.action.reported": "Fehler gemeldet",
|
||||||
"error.page.action.exportLogs": "Protokolle exportieren",
|
"error.page.action.exportLogs": "Protokolle exportieren",
|
||||||
"error.page.action.checking": "Prüfen…",
|
"error.page.action.checking": "Prüfen...",
|
||||||
"error.page.action.checkUpdates": "Nach Updates suchen",
|
"error.page.action.checkUpdates": "Nach Updates suchen",
|
||||||
"error.page.action.updateTo": "Auf {{version}} aktualisieren",
|
"error.page.action.updateTo": "Auf {{version}} aktualisieren",
|
||||||
"error.page.report.prefix": "Bitte melden Sie diesen Fehler dem OpenCode-Team",
|
"error.page.report.prefix": "Bitte melden Sie diesen Fehler dem OpenCode-Team",
|
||||||
"error.page.report.discord": "auf Discord",
|
"error.page.report.discord": "auf Discord",
|
||||||
"error.page.version": "Version: {{version}}",
|
"error.page.version": "Version: {{version}}",
|
||||||
"error.dev.rootNotFound":
|
"error.dev.rootNotFound":
|
||||||
"Wurzelelement nicht gefunden. Haben Sie vergessen, es in Ihre index.html aufzunehmen? Oder wurde das ID-Attribut falsch geschrieben?",
|
"Wurzelelement nicht gefunden. Haben Sie vergessen, es in Ihre index.html aufzunehmen? Oder wurde das id-Attribut falsch geschrieben?",
|
||||||
"error.serverSync.connectFailed": "Verbindung zum Server fehlgeschlagen. Läuft ein Server unter `{{url}}`?",
|
"error.serverSync.connectFailed": "Verbindung zum Server fehlgeschlagen. Läuft ein Server unter `{{url}}`?",
|
||||||
"directory.error.invalidUrl": "Ungültiges Verzeichnis in der URL.",
|
"directory.error.invalidUrl": "Ungültiges Verzeichnis in der URL.",
|
||||||
"error.chain.unknown": "Unbekannter Fehler",
|
"error.chain.unknown": "Unbekannter Fehler",
|
||||||
@@ -541,10 +524,10 @@ export const dict = {
|
|||||||
"error.chain.apiError": "API-Fehler",
|
"error.chain.apiError": "API-Fehler",
|
||||||
"error.chain.status": "Status: {{status}}",
|
"error.chain.status": "Status: {{status}}",
|
||||||
"error.chain.retryable": "Wiederholbar: {{retryable}}",
|
"error.chain.retryable": "Wiederholbar: {{retryable}}",
|
||||||
"error.chain.responseBody": "Antwortinhalt:\n{{body}}",
|
"error.chain.responseBody": "Antwort-Body:\n{{body}}",
|
||||||
"error.chain.didYouMean": "Meinten Sie: {{suggestions}}",
|
"error.chain.didYouMean": "Meinten Sie: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Modell nicht gefunden: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Modell nicht gefunden: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Überprüfen Sie die Anbieter- und Modellnamen in Ihrer Konfiguration (opencode.json)",
|
"error.chain.checkConfig": "Überprüfen Sie Ihre Konfiguration (opencode.json) auf Anbieter-/Modellnamen",
|
||||||
"error.chain.mcpFailed":
|
"error.chain.mcpFailed":
|
||||||
'MCP-Server "{{name}}" fehlgeschlagen. Hinweis: OpenCode unterstützt noch keine MCP-Authentifizierung.',
|
'MCP-Server "{{name}}" fehlgeschlagen. Hinweis: OpenCode unterstützt noch keine MCP-Authentifizierung.',
|
||||||
"error.chain.providerAuthFailed": "Anbieter-Authentifizierung fehlgeschlagen ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Anbieter-Authentifizierung fehlgeschlagen ({{provider}}): {{message}}",
|
||||||
@@ -585,7 +568,7 @@ export const dict = {
|
|||||||
"home.sessions.group.yesterday": "Gestern",
|
"home.sessions.group.yesterday": "Gestern",
|
||||||
"home.sessions.group.older": "Älter",
|
"home.sessions.group.older": "Älter",
|
||||||
"home.providerTip":
|
"home.providerTip":
|
||||||
"OpenCode mit über 75 Anbietern verbinden, um weitere Modelle wie Claude, GPT, Gemini und andere zu nutzen",
|
"Verbinde dich mit über 75 Anbietern, um weitere Modelle wie Claude, GPT, Gemini und andere zu nutzen",
|
||||||
"session.tab.session": "Sitzung",
|
"session.tab.session": "Sitzung",
|
||||||
"session.tab.review": "Überprüfung",
|
"session.tab.review": "Überprüfung",
|
||||||
"session.tab.context": "Kontext",
|
"session.tab.context": "Kontext",
|
||||||
@@ -596,12 +579,12 @@ export const dict = {
|
|||||||
"Dieser Tab verweist auf eine Sitzung, die auf diesem Server nicht mehr existiert.",
|
"Dieser Tab verweist auf eine Sitzung, die auf diesem Server nicht mehr existiert.",
|
||||||
"session.error.notFound.closeTab": "Tab schließen",
|
"session.error.notFound.closeTab": "Tab schließen",
|
||||||
"session.error.serverConnection": "Verbindung zu diesem Server nicht möglich",
|
"session.error.serverConnection": "Verbindung zu diesem Server nicht möglich",
|
||||||
"session.review.filesChanged": "Geänderte Dateien: {{count}}",
|
"session.review.filesChanged": "{{count}} Dateien geändert",
|
||||||
"session.review.change.one": "Änderung",
|
"session.review.change.one": "Änderung",
|
||||||
"session.review.change.other": "Änderungen",
|
"session.review.change.other": "Änderungen",
|
||||||
"session.review.loadingChanges": "Änderungen werden geladen…",
|
"session.review.loadingChanges": "Lade Änderungen...",
|
||||||
"session.review.empty": "Noch keine Änderungen in dieser Sitzung",
|
"session.review.empty": "Noch keine Änderungen in dieser Sitzung",
|
||||||
"session.review.noVcs": "Kein Git-Versionskontrollsystem erkannt. Änderungen werden nicht angezeigt",
|
"session.review.noVcs": "Kein Git-Versionskontrollsystem erkannt, Änderungen werden nicht angezeigt",
|
||||||
"session.review.noSnapshot":
|
"session.review.noSnapshot":
|
||||||
"Snapshot-Tracking ist in der Konfiguration deaktiviert, daher sind Sitzungsänderungen nicht verfügbar",
|
"Snapshot-Tracking ist in der Konfiguration deaktiviert, daher sind Sitzungsänderungen nicht verfügbar",
|
||||||
"session.review.noChanges": "Keine Änderungen",
|
"session.review.noChanges": "Keine Änderungen",
|
||||||
@@ -612,10 +595,10 @@ export const dict = {
|
|||||||
"session.files.empty": "Keine Dateien",
|
"session.files.empty": "Keine Dateien",
|
||||||
"session.files.binaryContent": "Binärdatei (Inhalt kann nicht angezeigt werden)",
|
"session.files.binaryContent": "Binärdatei (Inhalt kann nicht angezeigt werden)",
|
||||||
"session.messages.renderEarlier": "Frühere Nachrichten rendern",
|
"session.messages.renderEarlier": "Frühere Nachrichten rendern",
|
||||||
"session.messages.loadingEarlier": "Frühere Nachrichten werden geladen…",
|
"session.messages.loadingEarlier": "Lade frühere Nachrichten...",
|
||||||
"session.messages.loadEarlier": "Frühere Nachrichten laden",
|
"session.messages.loadEarlier": "Frühere Nachrichten laden",
|
||||||
"session.messages.loading": "Nachrichten werden geladen…",
|
"session.messages.loading": "Lade Nachrichten...",
|
||||||
"session.messages.jumpToLatest": "Zur neuesten Nachricht springen",
|
"session.messages.jumpToLatest": "Zum neuesten springen",
|
||||||
"session.context.addToContext": "{{selection}} zum Kontext hinzufügen",
|
"session.context.addToContext": "{{selection}} zum Kontext hinzufügen",
|
||||||
"session.todo.title": "Aufgaben",
|
"session.todo.title": "Aufgaben",
|
||||||
"session.todo.collapse": "Einklappen",
|
"session.todo.collapse": "Einklappen",
|
||||||
@@ -635,7 +618,7 @@ export const dict = {
|
|||||||
"session.revertDock.collapse": "Zurückgesetzte Nachrichten einklappen",
|
"session.revertDock.collapse": "Zurückgesetzte Nachrichten einklappen",
|
||||||
"session.revertDock.expand": "Zurückgesetzte Nachrichten ausklappen",
|
"session.revertDock.expand": "Zurückgesetzte Nachrichten ausklappen",
|
||||||
"session.revertDock.restore": "Nachricht wiederherstellen",
|
"session.revertDock.restore": "Nachricht wiederherstellen",
|
||||||
"session.new.title": "Alles entwickeln",
|
"session.new.title": "Baue, was du willst",
|
||||||
"session.new.project.new": "Neues Projekt",
|
"session.new.project.new": "Neues Projekt",
|
||||||
"session.new.project.search": "Projekte durchsuchen",
|
"session.new.project.search": "Projekte durchsuchen",
|
||||||
"session.new.project.add": "Projekt hinzufügen",
|
"session.new.project.add": "Projekt hinzufügen",
|
||||||
@@ -669,36 +652,28 @@ export const dict = {
|
|||||||
"Sitzung öffentlich im Web teilen. Sie wird für jeden mit dem Link zugänglich sein.",
|
"Sitzung öffentlich im Web teilen. Sie wird für jeden mit dem Link zugänglich sein.",
|
||||||
"session.share.action.share": "Teilen",
|
"session.share.action.share": "Teilen",
|
||||||
"session.share.action.publish": "Veröffentlichen",
|
"session.share.action.publish": "Veröffentlichen",
|
||||||
"session.share.action.publishing": "Wird veröffentlicht…",
|
"session.share.action.publishing": "Veröffentliche...",
|
||||||
"session.share.action.unpublish": "Veröffentlichung aufheben",
|
"session.share.action.unpublish": "Veröffentlichung aufheben",
|
||||||
"session.share.action.unpublishing": "Veröffentlichung wird aufgehoben…",
|
"session.share.action.unpublishing": "Hebe Veröffentlichung auf...",
|
||||||
"session.share.action.view": "Ansehen",
|
"session.share.action.view": "Ansehen",
|
||||||
"session.share.copy.copied": "Kopiert",
|
"session.share.copy.copied": "Kopiert",
|
||||||
"session.share.copy.copyLink": "Link kopieren",
|
"session.share.copy.copyLink": "Link kopieren",
|
||||||
"lsp.tooltip.none": "Keine LSP-Server",
|
"lsp.tooltip.none": "Keine LSP-Server",
|
||||||
"lsp.label.connected": "{{count}} LSP",
|
"lsp.label.connected": "{{count}} LSP",
|
||||||
"prompt.loading": "Prompt wird geladen…",
|
"prompt.loading": "Lade Prompt...",
|
||||||
"terminal.loading": "Terminal wird geladen…",
|
"terminal.loading": "Lade Terminal...",
|
||||||
"terminal.title": "Terminal",
|
"terminal.title": "Terminal",
|
||||||
"terminal.title.numbered": "Terminal {{number}}",
|
"terminal.title.numbered": "Terminal {{number}}",
|
||||||
"terminal.close": "Terminal schließen",
|
"terminal.close": "Terminal schließen",
|
||||||
"terminal.connectionLost.title": "Verbindung verloren",
|
"terminal.connectionLost.title": "Verbindung verloren",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"Die Terminalverbindung wurde unterbrochen. Das kann passieren, wenn der Server neu startet.",
|
"Die Terminalverbindung wurde unterbrochen. Das kann passieren, wenn der Server neu startet.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"Das PTY-Verbindungsticket wurde bei der Ursprungs- oder CSRF-Prüfung abgelehnt. Überprüfen Sie die CORS-Konfiguration des Servers.",
|
|
||||||
"terminal.connectTicket.statusError": "Das PTY-Verbindungsticket ist mit {{status}} fehlgeschlagen",
|
|
||||||
|
|
||||||
"titlebar.update": "Aktualisieren",
|
|
||||||
"titlebar.updateVersion": "Aktualisieren {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Tab schließen",
|
"common.closeTab": "Tab schließen",
|
||||||
"common.dismiss": "Verwerfen",
|
"common.dismiss": "Verwerfen",
|
||||||
"common.requestFailed": "Anfrage fehlgeschlagen",
|
"common.requestFailed": "Anfrage fehlgeschlagen",
|
||||||
"common.moreOptions": "Weitere Optionen",
|
"common.moreOptions": "Weitere Optionen",
|
||||||
"common.learnMore": "Mehr erfahren",
|
"common.learnMore": "Mehr erfahren",
|
||||||
"common.rename": "Umbenennen",
|
"common.rename": "Umbenennen",
|
||||||
"common.export": "Exportieren",
|
|
||||||
"common.reset": "Zurücksetzen",
|
"common.reset": "Zurücksetzen",
|
||||||
"common.archive": "Archivieren",
|
"common.archive": "Archivieren",
|
||||||
"common.delete": "Löschen",
|
"common.delete": "Löschen",
|
||||||
@@ -753,12 +728,12 @@ export const dict = {
|
|||||||
"settings.general.row.font.title": "Code-Schriftart",
|
"settings.general.row.font.title": "Code-Schriftart",
|
||||||
"settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen",
|
"settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen",
|
||||||
"settings.general.row.terminalFont.title": "Terminalschriftart",
|
"settings.general.row.terminalFont.title": "Terminalschriftart",
|
||||||
"settings.general.row.terminalFont.description": "Die im Terminal verwendete Schriftart anpassen",
|
"settings.general.row.terminalFont.description": "Passe die im Terminal verwendete Schriftart an",
|
||||||
"settings.general.row.uiFont.title": "UI-Schriftart",
|
"settings.general.row.uiFont.title": "UI-Schriftart",
|
||||||
"settings.general.row.uiFont.description": "Die in der gesamten Benutzeroberfläche verwendete Schriftart anpassen",
|
"settings.general.row.uiFont.description": "Die im gesamten Interface verwendete Schriftart anpassen",
|
||||||
"settings.general.row.followup.title": "Verhalten bei Folgeeingaben",
|
"settings.general.row.followup.title": "Verhalten bei Folgefragen",
|
||||||
"settings.general.row.followup.description":
|
"settings.general.row.followup.description":
|
||||||
"Wählen Sie, ob Folgeeingaben die laufende Sitzung sofort steuern oder in einer Warteschlange warten",
|
"Wählen Sie, ob Folgefragen sofort steuern oder in einer Warteschlange warten",
|
||||||
"settings.general.row.followup.option.queue": "Warteschlange",
|
"settings.general.row.followup.option.queue": "Warteschlange",
|
||||||
"settings.general.row.followup.option.steer": "Steuern",
|
"settings.general.row.followup.option.steer": "Steuern",
|
||||||
"settings.general.row.showFileTree.title": "Dateibaum",
|
"settings.general.row.showFileTree.title": "Dateibaum",
|
||||||
@@ -776,9 +751,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Navigation unten",
|
"settings.general.row.mobileTitlebarBottom.title": "Navigation unten",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Titelleiste und Sitzungs-Tabs auf Mobilgeräten am unteren Bildschirmrand platzieren",
|
"Titelleiste und Sitzungs-Tabs auf Mobilgeräten am unteren Bildschirmrand platzieren",
|
||||||
"settings.general.row.showCustomAgents.title": "Agent anzeigen",
|
"settings.general.row.showCustomAgents.title": "Benutzerdefinierte Agenten",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Agentenauswahl im Eingabebereich anzeigen",
|
||||||
"Im Eingabebereich zwischen Agenten wechseln. Ist die Auswahl ausgeblendet, wird standardmäßig der Build-Agent verwendet.",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "Reasoning-Zusammenfassungen anzeigen",
|
"settings.general.row.reasoningSummaries.title": "Reasoning-Zusammenfassungen anzeigen",
|
||||||
"settings.general.row.reasoningSummaries.description":
|
"settings.general.row.reasoningSummaries.description":
|
||||||
"Zusammenfassungen des Modell-Reasonings in der Timeline anzeigen",
|
"Zusammenfassungen des Modell-Reasonings in der Timeline anzeigen",
|
||||||
@@ -798,7 +772,7 @@ export const dict = {
|
|||||||
"settings.general.row.pinchZoom.title": "Zoom per Fingergeste",
|
"settings.general.row.pinchZoom.title": "Zoom per Fingergeste",
|
||||||
"settings.general.row.pinchZoom.description": "Zoomen per Zwei-Finger- und Ctrl-Scroll-Geste erlauben",
|
"settings.general.row.pinchZoom.description": "Zoomen per Zwei-Finger- und Ctrl-Scroll-Geste erlauben",
|
||||||
"settings.general.row.wayland.title": "Natives Wayland verwenden",
|
"settings.general.row.wayland.title": "Natives Wayland verwenden",
|
||||||
"settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Ein Neustart ist erforderlich.",
|
"settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Erfordert Neustart.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"Unter Linux mit Monitoren unterschiedlicher Bildwiederholraten kann natives Wayland stabiler sein.",
|
"Unter Linux mit Monitoren unterschiedlicher Bildwiederholraten kann natives Wayland stabiler sein.",
|
||||||
"settings.general.row.releaseNotes.title": "Versionshinweise",
|
"settings.general.row.releaseNotes.title": "Versionshinweise",
|
||||||
@@ -808,11 +782,11 @@ export const dict = {
|
|||||||
"settings.updates.row.check.title": "Nach Updates suchen",
|
"settings.updates.row.check.title": "Nach Updates suchen",
|
||||||
"settings.updates.row.check.description": "Manuell nach Updates suchen und installieren, wenn verfügbar",
|
"settings.updates.row.check.description": "Manuell nach Updates suchen und installieren, wenn verfügbar",
|
||||||
"settings.updates.action.checkNow": "Jetzt prüfen",
|
"settings.updates.action.checkNow": "Jetzt prüfen",
|
||||||
"settings.updates.action.checking": "Wird geprüft…",
|
"settings.updates.action.checking": "Wird geprüft...",
|
||||||
"settings.updates.action.downloading": "Wird heruntergeladen…",
|
"settings.updates.action.downloading": "Wird heruntergeladen...",
|
||||||
"settings.updates.action.installing": "Wird installiert…",
|
"settings.updates.action.installing": "Wird installiert...",
|
||||||
"settings.updates.toast.latest.title": "OpenCode ist auf dem neuesten Stand",
|
"settings.updates.toast.latest.title": "Du bist auf dem neuesten Stand",
|
||||||
"settings.updates.toast.latest.description": "Die aktuelle Version von OpenCode wird verwendet.",
|
"settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von OpenCode.",
|
||||||
"sound.option.none": "Keine",
|
"sound.option.none": "Keine",
|
||||||
"sound.option.alert01": "Alarm 01",
|
"sound.option.alert01": "Alarm 01",
|
||||||
"sound.option.alert02": "Alarm 02",
|
"sound.option.alert02": "Alarm 02",
|
||||||
@@ -928,8 +902,8 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.description": "Shell-Befehle ausführen",
|
"settings.permissions.tool.bash.description": "Shell-Befehle ausführen",
|
||||||
"settings.permissions.tool.task.title": "Aufgabe",
|
"settings.permissions.tool.task.title": "Aufgabe",
|
||||||
"settings.permissions.tool.task.description": "Unteragenten starten",
|
"settings.permissions.tool.task.description": "Unteragenten starten",
|
||||||
"settings.permissions.tool.skill.title": "Skill",
|
"settings.permissions.tool.skill.title": "Fähigkeit",
|
||||||
"settings.permissions.tool.skill.description": "Einen Skill anhand des Namens laden",
|
"settings.permissions.tool.skill.description": "Eine Fähigkeit nach Namen laden",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
"settings.permissions.tool.lsp.description": "Language-Server-Abfragen ausführen",
|
"settings.permissions.tool.lsp.description": "Language-Server-Abfragen ausführen",
|
||||||
"settings.permissions.tool.todowrite.title": "Todo schreiben",
|
"settings.permissions.tool.todowrite.title": "Todo schreiben",
|
||||||
@@ -957,7 +931,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.title": "Arbeitsbereich zurückgesetzt",
|
"workspace.reset.success.title": "Arbeitsbereich zurückgesetzt",
|
||||||
"workspace.reset.success.description": "Der Arbeitsbereich entspricht jetzt dem Standard-Branch.",
|
"workspace.reset.success.description": "Der Arbeitsbereich entspricht jetzt dem Standard-Branch.",
|
||||||
"workspace.error.stillPreparing": "Arbeitsbereich wird noch vorbereitet",
|
"workspace.error.stillPreparing": "Arbeitsbereich wird noch vorbereitet",
|
||||||
"workspace.status.checking": "Suche nach nicht zusammengeführten Änderungen…",
|
"workspace.status.checking": "Suche nach nicht zusammengeführten Änderungen...",
|
||||||
"workspace.status.error": "Git-Status konnte nicht überprüft werden.",
|
"workspace.status.error": "Git-Status konnte nicht überprüft werden.",
|
||||||
"workspace.status.clean": "Keine nicht zusammengeführten Änderungen erkannt.",
|
"workspace.status.clean": "Keine nicht zusammengeführten Änderungen erkannt.",
|
||||||
"workspace.status.dirty": "Nicht zusammengeführte Änderungen in diesem Arbeitsbereich erkannt.",
|
"workspace.status.dirty": "Nicht zusammengeführte Änderungen in diesem Arbeitsbereich erkannt.",
|
||||||
@@ -987,7 +961,7 @@ export const dict = {
|
|||||||
"settings.providers.custom.description": "Fügen Sie einen OpenAI-kompatiblen Anbieter per Basis-URL hinzu.",
|
"settings.providers.custom.description": "Fügen Sie einen OpenAI-kompatiblen Anbieter per Basis-URL hinzu.",
|
||||||
|
|
||||||
"app.server.unreachable": "Konnte {{server}} nicht erreichen",
|
"app.server.unreachable": "Konnte {{server}} nicht erreichen",
|
||||||
"app.server.retrying": "Verbindung wird automatisch erneut hergestellt…",
|
"app.server.retrying": "Automatische erneute Verbindung...",
|
||||||
"app.server.otherServers": "Andere Server",
|
"app.server.otherServers": "Andere Server",
|
||||||
"dialog.server.add.usernamePlaceholder": "Benutzername",
|
"dialog.server.add.usernamePlaceholder": "Benutzername",
|
||||||
"dialog.server.add.passwordPlaceholder": "Passwort",
|
"dialog.server.add.passwordPlaceholder": "Passwort",
|
||||||
@@ -995,15 +969,12 @@ export const dict = {
|
|||||||
"session.review.noVcs.createGit.title": "Git-Repository erstellen",
|
"session.review.noVcs.createGit.title": "Git-Repository erstellen",
|
||||||
"session.review.noVcs.createGit.description":
|
"session.review.noVcs.createGit.description":
|
||||||
"Änderungen in diesem Projekt verfolgen, überprüfen und rückgängig machen",
|
"Änderungen in diesem Projekt verfolgen, überprüfen und rückgängig machen",
|
||||||
"session.review.noVcs.createGit.actionLoading": "Git-Repository wird erstellt…",
|
"session.review.noVcs.createGit.actionLoading": "Git-Repository wird erstellt...",
|
||||||
"session.review.noVcs.createGit.action": "Git-Repository erstellen",
|
"session.review.noVcs.createGit.action": "Git-Repository erstellen",
|
||||||
"session.todo.progress": "{{done}} von {{total}} Aufgaben erledigt",
|
"session.todo.progress": "{{done}} von {{total}} Aufgaben erledigt",
|
||||||
"session.question.progress": "{{current}} von {{total}} Fragen",
|
"session.question.progress": "{{current}} von {{total}} Fragen",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Datei-Explorer",
|
"session.header.open.fileExplorer": "Datei-Explorer",
|
||||||
"session.header.reveal.finder": "Im Finder anzeigen",
|
|
||||||
"session.header.reveal.fileExplorer": "Im Datei-Explorer anzeigen",
|
|
||||||
"session.header.reveal.containingFolder": "Übergeordneten Ordner öffnen",
|
|
||||||
"session.header.open.fileManager": "Dateimanager",
|
"session.header.open.fileManager": "Dateimanager",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1018,38 +989,29 @@ export const dict = {
|
|||||||
"session.header.open.app.androidStudio": "Android Studio",
|
"session.header.open.app.androidStudio": "Android Studio",
|
||||||
"session.header.open.app.powershell": "PowerShell",
|
"session.header.open.app.powershell": "PowerShell",
|
||||||
"session.header.open.app.sublimeText": "Sublime Text",
|
"session.header.open.app.sublimeText": "Sublime Text",
|
||||||
"debugBar.ariaLabel": "Leistungsdiagnose für die Entwicklung",
|
"debugBar.ariaLabel": "Entwicklungs-Leistungsdiagnose",
|
||||||
"debugBar.na": "n.v.",
|
"debugBar.na": "n.v.",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Letzter abgeschlossener Routenübergang zu einer Sitzungsseite, gemessen vom Start des Routers bis zum ersten Rendering nach Abschluss des Übergangs.",
|
"Letzter abgeschlossener Routenübergang, der eine Sitzungsseite berührt, gemessen vom Start des Routers bis zum ersten Rendern nach dem Einschwingen.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Gleitender Mittelwert der Frames pro Sekunde in den letzten 5 Sekunden.",
|
"debugBar.fps.tip": "Gleitende Bilder pro Sekunde in den letzten 5 Sekunden.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Längste Framedauer in den letzten 5 Sekunden.",
|
"debugBar.frame.tip": "Schlechteste Frame-Zeit in den letzten 5 Sekunden.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Frames über 32 ms in den letzten 5 Sekunden.",
|
"debugBar.jank.tip": "Frames über 32ms in den letzten 5 Sekunden.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip":
|
"debugBar.long.tip": "Blockierte Zeit und Anzahl langer Aufgaben in den letzten 5 Sekunden. Max Aufgabe: {{max}}.",
|
||||||
"Blockierte Zeit und Anzahl langer Aufgaben in den letzten 5 Sekunden. Längste Aufgabe: {{max}}.",
|
|
||||||
"debugBar.delay.label": "DELAY",
|
"debugBar.delay.label": "DELAY",
|
||||||
"debugBar.delay.tip": "Schlechteste beobachtete Eingabeverzögerung in den letzten 5 Sekunden.",
|
"debugBar.delay.tip": "Schlechteste beobachtete Eingabeverzögerung in den letzten 5 Sekunden.",
|
||||||
"debugBar.inp.label": "INP",
|
"debugBar.inp.label": "INP",
|
||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Ungefähre Interaktionsdauer in den letzten 5 Sekunden. Dies ist INP-ähnlich, nicht das offizielle Web-Vitals-INP.",
|
"Ungefähre Interaktionsdauer in den letzten 5 Sekunden. Dies ist INP-ähnlich, nicht das offizielle Web Vitals INP.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Kumulative Layoutverschiebung während der aktuellen App-Laufzeit.",
|
"debugBar.cls.tip": "Kumulative Layoutverschiebung für die aktuelle App-Lebensdauer.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Belegter JS-Heap im Verhältnis zum Heap-Limit. Nur Chromium.",
|
"debugBar.mem.tipUnavailable": "Verwendeter JS-Heap vs Heap-Limit. Nur Chromium.",
|
||||||
"debugBar.mem.tip": "Belegter JS-Heap im Verhältnis zum Heap-Limit. {{used}} von {{limit}}.",
|
"debugBar.mem.tip": "Verwendeter JS-Heap vs Heap-Limit. {{used}} von {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Fokusstile für alle interaktiven Elemente erzwingen",
|
|
||||||
"debugBar.focus.on": "EIN",
|
|
||||||
"debugBar.focus.off": "AUS",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Layoutrichtung für die gesamte App erzwingen, ohne die ausgewählte Sprache zu ändern",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Strg",
|
"common.key.ctrl": "Strg",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Umschalt",
|
"common.key.shift": "Umschalt",
|
||||||
@@ -1070,116 +1032,7 @@ export const dict = {
|
|||||||
"error.serverSDK.serverNotAvailable": "Server nicht verfügbar",
|
"error.serverSDK.serverNotAvailable": "Server nicht verfügbar",
|
||||||
"error.childStore.persistedCacheCreateFailed": "Dauerhafter Cache konnte nicht erstellt werden",
|
"error.childStore.persistedCacheCreateFailed": "Dauerhafter Cache konnte nicht erstellt werden",
|
||||||
"error.childStore.persistedProjectMetadataCreateFailed": "Dauerhafte Projektmetadaten konnten nicht erstellt werden",
|
"error.childStore.persistedProjectMetadataCreateFailed": "Dauerhafte Projektmetadaten konnten nicht erstellt werden",
|
||||||
"error.childStore.persistedProjectIconCreateFailed": "Dauerhaftes Projektsymbol konnte nicht erstellt werden",
|
"error.childStore.persistedProjectIconCreateFailed": "Dauerhaftes Projekticon konnte nicht erstellt werden",
|
||||||
"error.childStore.storeCreateFailed": "Speicher konnte nicht erstellt werden",
|
"error.childStore.storeCreateFailed": "Speicher konnte nicht erstellt werden",
|
||||||
"terminal.connectionLost.abnormalClose": "WebSocket unerwartet geschlossen: {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket abnormal geschlossen: {{code}}",
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Datei",
|
|
||||||
"desktop.menu.edit": "Bearbeiten",
|
|
||||||
"desktop.menu.view": "Ansicht",
|
|
||||||
"desktop.menu.go": "Gehe zu",
|
|
||||||
"desktop.menu.window": "Fenster",
|
|
||||||
"desktop.menu.help": "Hilfe",
|
|
||||||
"desktop.menu.checkForUpdates": "Nach Updates suchen…",
|
|
||||||
"desktop.menu.settings": "Einstellungen",
|
|
||||||
"desktop.menu.reloadWebview": "Webview neu laden",
|
|
||||||
"desktop.menu.restart": "Neu starten",
|
|
||||||
"desktop.menu.exportLogs": "Protokolle exportieren…",
|
|
||||||
"desktop.menu.newSession": "Neue Sitzung",
|
|
||||||
"desktop.menu.openProject": "Projekt öffnen…",
|
|
||||||
"desktop.menu.newWindow": "Neues Fenster",
|
|
||||||
"desktop.menu.closeWindow": "Fenster schließen",
|
|
||||||
"desktop.menu.undo": "Rückgängig",
|
|
||||||
"desktop.menu.redo": "Wiederholen",
|
|
||||||
"desktop.menu.cut": "Ausschneiden",
|
|
||||||
"desktop.menu.copy": "Kopieren",
|
|
||||||
"desktop.menu.paste": "Einfügen",
|
|
||||||
"desktop.menu.delete": "Löschen",
|
|
||||||
"desktop.menu.selectAll": "Alles auswählen",
|
|
||||||
"desktop.menu.toggleSidebar": "Seitenleiste umschalten",
|
|
||||||
"desktop.menu.toggleTerminal": "Terminal umschalten",
|
|
||||||
"desktop.menu.toggleFileTree": "Dateibaum umschalten",
|
|
||||||
"desktop.menu.reload": "Neu laden",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Entwicklertools umschalten",
|
|
||||||
"desktop.menu.actualSize": "Tatsächliche Größe",
|
|
||||||
"desktop.menu.zoomIn": "Vergrößern",
|
|
||||||
"desktop.menu.zoomOut": "Verkleinern",
|
|
||||||
"desktop.menu.toggleFullScreen": "Vollbildmodus umschalten",
|
|
||||||
"desktop.menu.back": "Zurück",
|
|
||||||
"desktop.menu.forward": "Vorwärts",
|
|
||||||
"desktop.menu.previousSession": "Vorherige Sitzung",
|
|
||||||
"desktop.menu.nextSession": "Nächste Sitzung",
|
|
||||||
"desktop.menu.previousProject": "Vorheriges Projekt",
|
|
||||||
"desktop.menu.nextProject": "Nächstes Projekt",
|
|
||||||
"desktop.menu.minimize": "Minimieren",
|
|
||||||
"desktop.menu.maximize": "Maximieren",
|
|
||||||
"desktop.menu.documentation": "OpenCode-Dokumentation",
|
|
||||||
"desktop.menu.supportForum": "Supportforum",
|
|
||||||
"desktop.menu.shareFeedback": "Feedback senden",
|
|
||||||
"desktop.menu.reportBug": "Fehler melden",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode-Menü",
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Die Suche nach Updates ist fehlgeschlagen.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Updatefehler",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Sie sind auf dem neuesten Stand.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Keine Updates",
|
|
||||||
"desktop.updater.dialog.ready.message": "Update {{version}} wurde heruntergeladen. Jetzt neu starten?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Update bereit",
|
|
||||||
"desktop.updater.dialog.restart": "Neu starten",
|
|
||||||
"desktop.updater.dialog.later": "Später",
|
|
||||||
"desktop.recovery.action.relaunch": "Neu starten",
|
|
||||||
"desktop.recovery.action.exportLogs": "Protokolle exportieren",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Weiter warten",
|
|
||||||
"desktop.recovery.action.quit": "Beenden",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode konnte nicht geladen werden",
|
|
||||||
"desktop.recovery.terminated": "Das OpenCode-Fenster wurde unerwartet beendet",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode reagiert nicht",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Sie können die App neu starten, die Protokolle öffnen oder weiter warten.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Fenster: {{window}}\nURL: {{url}}\nFehler: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Fenster: {{window}}\nGrund: {{reason}}\nCode: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<unbekannt>",
|
|
||||||
"desktop.dialog.chooseFolder": "Ordner auswählen",
|
|
||||||
"desktop.dialog.chooseFile": "Datei auswählen",
|
|
||||||
"desktop.dialog.saveFile": "Datei speichern",
|
|
||||||
"desktop.dialog.files": "Dateien",
|
|
||||||
"desktop.server.local": "Lokaler Server",
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL ist nur unter Windows verfügbar",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL ist nicht verfügbar",
|
|
||||||
"desktop.wsl.error.listInstalled": "Installierte WSL-Distributionen konnten nicht aufgelistet werden",
|
|
||||||
"desktop.wsl.error.listOnline": "Verfügbare WSL-Distributionen konnten nicht aufgelistet werden",
|
|
||||||
"desktop.wsl.error.executeDistro": "In der Distribution können keine Befehle ausgeführt werden",
|
|
||||||
"desktop.wsl.error.installWsl": "WSL-Installation fehlgeschlagen",
|
|
||||||
"desktop.wsl.error.installDistro": "Distribution konnte nicht installiert werden: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "OpenCode-Installation fehlgeschlagen",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} wurde bereits hinzugefügt",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode ist in dieser Distribution nicht installiert",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode ist installiert, konnte aber nicht ausgeführt werden",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode ist in {{distro}} nicht installiert",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Das OpenCode-Update wurde abgeschlossen, aber {{distro}} meldet weiterhin {{installed}}; erwartet wurde {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "keine Version",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL-Server wurde nach dem Start beendet (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL-Server wurde beendet, bevor er betriebsbereit war (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Zeitüberschreitung bei der Integritätsprüfung des Sidecars für {{distro}} nach {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Zeitüberschreitung bei {{command}} {{args}} nach {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Port konnte nicht abgerufen werden",
|
|
||||||
"desktop.picker.error.notSelected": "Im Auswahldialog wurde keine Datei ausgewählt",
|
|
||||||
"desktop.picker.error.sizeLimit": "Die ausgewählten Anhänge überschreiten das Limit von {{limit}} MB",
|
|
||||||
"command.logs.export": "Protokolle exportieren",
|
|
||||||
"help.tabs.toast.ariaLabel": "Neu: Tabs. Organisieren Sie Ihre Arbeit und aktiven Sitzungen mithilfe von Tabs",
|
|
||||||
"help.tabs.toast.dismiss": "Informationen zu Tabs schließen",
|
|
||||||
"help.tabs.title": "Neu: Tabs",
|
|
||||||
"help.tabs.description": "Organisieren Sie Ihre Arbeit und aktiven Sitzungen mithilfe von Tabs",
|
|
||||||
"help.tabs.date": "14. Juli",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop basiert jetzt auf Tabs.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Starten Sie eine neue Sitzung in einem Tab oder öffnen Sie eine vorhandene Sitzung aus einem Ihrer Projekte. Öffnen Sie einen neuen Tab, wenn Sie etwas Neues beginnen, und schließen Sie ihn, wenn Sie fertig sind.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Wenn Sie einige Tabs geöffnet lassen, können Sie Ihre aktiven Sitzungen leichter organisieren. Benennen Sie Tabs einprägsam, wenn Sie sie länger behalten möchten.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Auf der neuen Startseite finden Sie alle Ihre Sitzungen und Projekte. Wenn Sie eine Sitzung auswählen, wird sie in einem Tab geöffnet.",
|
|
||||||
"help.tabs.persistence": "Wenn Sie die App erneut öffnen, sind Ihre Tabs weiterhin geöffnet.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Das neue Design unterstützt Git-Worktrees noch nicht. Diese Funktion folgt in Kürze. Wenn Sie das bisherige Layout vorerst weiterverwenden möchten, können Sie in den Einstellungen zwischen den Layouts wechseln. Beachten Sie jedoch, dass das neue Layout in einigen Wochen dauerhaft verwendet wird.",
|
|
||||||
} satisfies Partial<Record<Keys, string>>
|
} satisfies Partial<Record<Keys, string>>
|
||||||
|
|||||||
@@ -1,151 +0,0 @@
|
|||||||
import { describe, expect, test } from "bun:test"
|
|
||||||
import {
|
|
||||||
createDesktopNativeBundle,
|
|
||||||
DESKTOP_NATIVE_ENGLISH,
|
|
||||||
DESKTOP_NATIVE_KEYS,
|
|
||||||
DESKTOP_NATIVE_LABELS,
|
|
||||||
DESKTOP_NATIVE_LOCALES,
|
|
||||||
DESKTOP_NATIVE_LOCALE_TAGS,
|
|
||||||
detectDesktopNativeLocale,
|
|
||||||
DESKTOP_NATIVE_MAX_PAYLOAD_BYTES,
|
|
||||||
formatDesktopNativeMessage,
|
|
||||||
parseDesktopNativeBundle,
|
|
||||||
} from "./desktop-native"
|
|
||||||
|
|
||||||
describe("desktop native translations", () => {
|
|
||||||
test("uses native language names independent of the active locale", () => {
|
|
||||||
expect(DESKTOP_NATIVE_LOCALES.map((locale) => DESKTOP_NATIVE_LABELS[locale])).toEqual([
|
|
||||||
"English",
|
|
||||||
"简体中文",
|
|
||||||
"繁體中文",
|
|
||||||
"한국어",
|
|
||||||
"Deutsch",
|
|
||||||
"Español",
|
|
||||||
"Français",
|
|
||||||
"Dansk",
|
|
||||||
"日本語",
|
|
||||||
"Polski",
|
|
||||||
"Русский",
|
|
||||||
"Українська",
|
|
||||||
"Bosanski",
|
|
||||||
"العربية",
|
|
||||||
"Norsk",
|
|
||||||
"Português (Brasil)",
|
|
||||||
"ไทย",
|
|
||||||
"Türkçe",
|
|
||||||
"हिन्दी",
|
|
||||||
"Nederlands",
|
|
||||||
"Bahasa Indonesia",
|
|
||||||
"Tiếng Việt",
|
|
||||||
"Italiano",
|
|
||||||
"اردو",
|
|
||||||
"پنجابی",
|
|
||||||
"Azərbaycanca",
|
|
||||||
"Suomi",
|
|
||||||
"Svenska",
|
|
||||||
"አማርኛ",
|
|
||||||
"Български",
|
|
||||||
"বাংলা",
|
|
||||||
"Català",
|
|
||||||
"Čeština",
|
|
||||||
"ދިވެހި",
|
|
||||||
"རྫོང་ཁ",
|
|
||||||
"Ελληνικά",
|
|
||||||
"Eesti",
|
|
||||||
"فارسی",
|
|
||||||
"Føroyskt",
|
|
||||||
"Hrvatski",
|
|
||||||
"Magyar",
|
|
||||||
"Հայերեն",
|
|
||||||
"Íslenska",
|
|
||||||
"ქართული",
|
|
||||||
"ខ្មែរ",
|
|
||||||
"ລາວ",
|
|
||||||
"Lietuvių",
|
|
||||||
"Latviešu",
|
|
||||||
"Македонски",
|
|
||||||
"Монгол",
|
|
||||||
"Bahasa Melayu",
|
|
||||||
"မြန်မာ",
|
|
||||||
"नेपाली",
|
|
||||||
"Română",
|
|
||||||
"සිංහල",
|
|
||||||
"Slovenčina",
|
|
||||||
"Slovenščina",
|
|
||||||
"Shqip",
|
|
||||||
"Српски",
|
|
||||||
"Тоҷикӣ",
|
|
||||||
"Türkmençe",
|
|
||||||
"Oʻzbekcha",
|
|
||||||
])
|
|
||||||
})
|
|
||||||
|
|
||||||
test("accepts the exact typed bundle", () => {
|
|
||||||
const bundle = createDesktopNativeBundle("en", (key) => DESKTOP_NATIVE_ENGLISH[key])
|
|
||||||
expect(parseDesktopNativeBundle(bundle)).toEqual(bundle)
|
|
||||||
})
|
|
||||||
|
|
||||||
test("rejects unsupported locales and mismatched key sets", () => {
|
|
||||||
const bundle = createDesktopNativeBundle("en", (key) => DESKTOP_NATIVE_ENGLISH[key])
|
|
||||||
expect(parseDesktopNativeBundle({ ...bundle, locale: "en-US" })).toBeUndefined()
|
|
||||||
expect(
|
|
||||||
parseDesktopNativeBundle({
|
|
||||||
...bundle,
|
|
||||||
messages: Object.fromEntries(DESKTOP_NATIVE_KEYS.slice(1).map((key) => [key, bundle.messages[key]])),
|
|
||||||
}),
|
|
||||||
).toBeUndefined()
|
|
||||||
expect(parseDesktopNativeBundle({ ...bundle, messages: { ...bundle.messages, extra: "no" } })).toBeUndefined()
|
|
||||||
expect(
|
|
||||||
parseDesktopNativeBundle({
|
|
||||||
...bundle,
|
|
||||||
messages: { ...bundle.messages, [DESKTOP_NATIVE_KEYS[0]]: "x".repeat(DESKTOP_NATIVE_MAX_PAYLOAD_BYTES) },
|
|
||||||
}),
|
|
||||||
).toBeUndefined()
|
|
||||||
expect(
|
|
||||||
parseDesktopNativeBundle({ ...bundle, messages: { ...bundle.messages, [DESKTOP_NATIVE_KEYS[0]]: 1 } }),
|
|
||||||
).toBeUndefined()
|
|
||||||
})
|
|
||||||
|
|
||||||
test("interpolates native templates without changing unknown placeholders", () => {
|
|
||||||
expect(formatDesktopNativeMessage("{{known}} {{unknown}}", { known: "yes" })).toBe("yes {{unknown}}")
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("desktop native locale detection", () => {
|
|
||||||
test("follows preference order and skips invalid or unsupported tags", () => {
|
|
||||||
expect(detectDesktopNativeLocale(["not_a_locale", "fr-FR"])).toBe("fr")
|
|
||||||
expect(detectDesktopNativeLocale(["eo", "de-DE"])).toBe("de")
|
|
||||||
})
|
|
||||||
|
|
||||||
test("uses Unicode likely subtags for script-sensitive bundles", () => {
|
|
||||||
expect(detectDesktopNativeLocale(["zh-TW"])).toBe("zht")
|
|
||||||
expect(detectDesktopNativeLocale(["zh-SG"])).toBe("zh")
|
|
||||||
expect(detectDesktopNativeLocale(["pa-PK"])).toBe("pa")
|
|
||||||
expect(detectDesktopNativeLocale(["pa-IN", "fr"])).toBe("fr")
|
|
||||||
expect(detectDesktopNativeLocale(["az-Cyrl", "de"])).toBe("de")
|
|
||||||
expect(detectDesktopNativeLocale(["sr-Cyrl"])).toBe("sr")
|
|
||||||
expect(detectDesktopNativeLocale(["sr-Latn", "en"])).toBe("en")
|
|
||||||
expect(detectDesktopNativeLocale(["uz-Latn"])).toBe("uz")
|
|
||||||
})
|
|
||||||
|
|
||||||
test("recognizes Norwegian language tags", () => {
|
|
||||||
expect(detectDesktopNativeLocale(["no"])).toBe("no")
|
|
||||||
expect(detectDesktopNativeLocale(["nb-NO"])).toBe("no")
|
|
||||||
expect(detectDesktopNativeLocale(["nn-NO"])).toBe("no")
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("desktop native ICU data", () => {
|
|
||||||
test("accepts every locale in standard Intl formatters", () => {
|
|
||||||
for (const locale of DESKTOP_NATIVE_LOCALES) {
|
|
||||||
const tag = DESKTOP_NATIVE_LOCALE_TAGS[locale]
|
|
||||||
expect(() => new Intl.Locale(tag), `${locale} locale`).not.toThrow()
|
|
||||||
expect(() => new Intl.NumberFormat(tag), `${locale} number`).not.toThrow()
|
|
||||||
expect(() => new Intl.DateTimeFormat(tag), `${locale} date`).not.toThrow()
|
|
||||||
expect(() => new Intl.PluralRules(tag), `${locale} plural`).not.toThrow()
|
|
||||||
expect(() => new Intl.ListFormat(tag), `${locale} list`).not.toThrow()
|
|
||||||
expect(() => new Intl.DisplayNames(tag, { type: "language" }), `${locale} names`).not.toThrow()
|
|
||||||
expect(() => new Intl.Segmenter(tag), `${locale} segmenter`).not.toThrow()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -1,365 +0,0 @@
|
|||||||
export const DESKTOP_NATIVE_LOCALES = [
|
|
||||||
"en",
|
|
||||||
"zh",
|
|
||||||
"zht",
|
|
||||||
"ko",
|
|
||||||
"de",
|
|
||||||
"es",
|
|
||||||
"fr",
|
|
||||||
"da",
|
|
||||||
"ja",
|
|
||||||
"pl",
|
|
||||||
"ru",
|
|
||||||
"uk",
|
|
||||||
"bs",
|
|
||||||
"ar",
|
|
||||||
"no",
|
|
||||||
"br",
|
|
||||||
"th",
|
|
||||||
"tr",
|
|
||||||
"hi",
|
|
||||||
"nl",
|
|
||||||
"id",
|
|
||||||
"vi",
|
|
||||||
"it",
|
|
||||||
"ur",
|
|
||||||
"pa",
|
|
||||||
"az",
|
|
||||||
"fi",
|
|
||||||
"sv",
|
|
||||||
"am",
|
|
||||||
"bg",
|
|
||||||
"bn",
|
|
||||||
"ca",
|
|
||||||
"cs",
|
|
||||||
"dv",
|
|
||||||
"dz",
|
|
||||||
"el",
|
|
||||||
"et",
|
|
||||||
"fa",
|
|
||||||
"fo",
|
|
||||||
"hr",
|
|
||||||
"hu",
|
|
||||||
"hy",
|
|
||||||
"is",
|
|
||||||
"ka",
|
|
||||||
"km",
|
|
||||||
"lo",
|
|
||||||
"lt",
|
|
||||||
"lv",
|
|
||||||
"mk",
|
|
||||||
"mn",
|
|
||||||
"ms",
|
|
||||||
"my",
|
|
||||||
"ne",
|
|
||||||
"ro",
|
|
||||||
"si",
|
|
||||||
"sk",
|
|
||||||
"sl",
|
|
||||||
"sq",
|
|
||||||
"sr",
|
|
||||||
"tg",
|
|
||||||
"tk",
|
|
||||||
"uz",
|
|
||||||
] as const
|
|
||||||
|
|
||||||
export type DesktopNativeLocale = (typeof DESKTOP_NATIVE_LOCALES)[number]
|
|
||||||
|
|
||||||
export const DESKTOP_NATIVE_LABELS: Record<DesktopNativeLocale, string> = {
|
|
||||||
en: "English",
|
|
||||||
zh: "简体中文",
|
|
||||||
zht: "繁體中文",
|
|
||||||
ko: "한국어",
|
|
||||||
de: "Deutsch",
|
|
||||||
es: "Español",
|
|
||||||
fr: "Français",
|
|
||||||
da: "Dansk",
|
|
||||||
ja: "日本語",
|
|
||||||
pl: "Polski",
|
|
||||||
ru: "Русский",
|
|
||||||
uk: "Українська",
|
|
||||||
bs: "Bosanski",
|
|
||||||
ar: "العربية",
|
|
||||||
no: "Norsk",
|
|
||||||
br: "Português (Brasil)",
|
|
||||||
th: "ไทย",
|
|
||||||
tr: "Türkçe",
|
|
||||||
hi: "हिन्दी",
|
|
||||||
nl: "Nederlands",
|
|
||||||
id: "Bahasa Indonesia",
|
|
||||||
vi: "Tiếng Việt",
|
|
||||||
it: "Italiano",
|
|
||||||
ur: "اردو",
|
|
||||||
pa: "پنجابی",
|
|
||||||
az: "Azərbaycanca",
|
|
||||||
fi: "Suomi",
|
|
||||||
sv: "Svenska",
|
|
||||||
am: "አማርኛ",
|
|
||||||
bg: "Български",
|
|
||||||
bn: "বাংলা",
|
|
||||||
ca: "Català",
|
|
||||||
cs: "Čeština",
|
|
||||||
dv: "ދިވެހި",
|
|
||||||
dz: "རྫོང་ཁ",
|
|
||||||
el: "Ελληνικά",
|
|
||||||
et: "Eesti",
|
|
||||||
fa: "فارسی",
|
|
||||||
fo: "Føroyskt",
|
|
||||||
hr: "Hrvatski",
|
|
||||||
hu: "Magyar",
|
|
||||||
hy: "Հայերեն",
|
|
||||||
is: "Íslenska",
|
|
||||||
ka: "ქართული",
|
|
||||||
km: "ខ្មែរ",
|
|
||||||
lo: "ລາວ",
|
|
||||||
lt: "Lietuvių",
|
|
||||||
lv: "Latviešu",
|
|
||||||
mk: "Македонски",
|
|
||||||
mn: "Монгол",
|
|
||||||
ms: "Bahasa Melayu",
|
|
||||||
my: "မြန်မာ",
|
|
||||||
ne: "नेपाली",
|
|
||||||
ro: "Română",
|
|
||||||
si: "සිංහල",
|
|
||||||
sk: "Slovenčina",
|
|
||||||
sl: "Slovenščina",
|
|
||||||
sq: "Shqip",
|
|
||||||
sr: "Српски",
|
|
||||||
tg: "Тоҷикӣ",
|
|
||||||
tk: "Türkmençe",
|
|
||||||
uz: "Oʻzbekcha",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DESKTOP_NATIVE_LOCALE_TAGS: Record<DesktopNativeLocale, string> = {
|
|
||||||
en: "en",
|
|
||||||
zh: "zh-Hans",
|
|
||||||
zht: "zh-Hant",
|
|
||||||
ko: "ko",
|
|
||||||
de: "de",
|
|
||||||
es: "es",
|
|
||||||
fr: "fr",
|
|
||||||
da: "da",
|
|
||||||
ja: "ja",
|
|
||||||
pl: "pl",
|
|
||||||
ru: "ru",
|
|
||||||
uk: "uk",
|
|
||||||
bs: "bs",
|
|
||||||
ar: "ar",
|
|
||||||
no: "nb-NO",
|
|
||||||
br: "pt-BR",
|
|
||||||
th: "th",
|
|
||||||
tr: "tr",
|
|
||||||
hi: "hi-IN",
|
|
||||||
nl: "nl-NL",
|
|
||||||
id: "id-ID",
|
|
||||||
vi: "vi-VN",
|
|
||||||
it: "it-IT",
|
|
||||||
ur: "ur-PK",
|
|
||||||
pa: "pa-Arab-PK",
|
|
||||||
az: "az-Latn-AZ",
|
|
||||||
fi: "fi-FI",
|
|
||||||
sv: "sv-SE",
|
|
||||||
am: "am-ET",
|
|
||||||
bg: "bg-BG",
|
|
||||||
bn: "bn-BD",
|
|
||||||
ca: "ca-AD",
|
|
||||||
cs: "cs-CZ",
|
|
||||||
dv: "dv-MV",
|
|
||||||
dz: "dz-BT",
|
|
||||||
el: "el-GR",
|
|
||||||
et: "et-EE",
|
|
||||||
fa: "fa-IR",
|
|
||||||
fo: "fo-FO",
|
|
||||||
hr: "hr-HR",
|
|
||||||
hu: "hu-HU",
|
|
||||||
hy: "hy-AM",
|
|
||||||
is: "is-IS",
|
|
||||||
ka: "ka-GE",
|
|
||||||
km: "km-KH",
|
|
||||||
lo: "lo-LA",
|
|
||||||
lt: "lt-LT",
|
|
||||||
lv: "lv-LV",
|
|
||||||
mk: "mk-MK",
|
|
||||||
mn: "mn-MN",
|
|
||||||
ms: "ms-MY",
|
|
||||||
my: "my-MM",
|
|
||||||
ne: "ne-NP",
|
|
||||||
ro: "ro-RO",
|
|
||||||
si: "si-LK",
|
|
||||||
sk: "sk-SK",
|
|
||||||
sl: "sl-SI",
|
|
||||||
sq: "sq-AL",
|
|
||||||
sr: "sr-Cyrl-RS",
|
|
||||||
tg: "tg-Cyrl-TJ",
|
|
||||||
tk: "tk-Latn-TM",
|
|
||||||
uz: "uz-Latn-UZ",
|
|
||||||
}
|
|
||||||
|
|
||||||
export function detectDesktopNativeLocale(languages: readonly string[]): DesktopNativeLocale {
|
|
||||||
for (const language of languages) {
|
|
||||||
const source = locale(language)
|
|
||||||
if (!source) continue
|
|
||||||
if (["no", "nb", "nn"].includes(source.language)) return "no"
|
|
||||||
const match = DESKTOP_NATIVE_LOCALES.find((candidate) => {
|
|
||||||
const target = locale(DESKTOP_NATIVE_LOCALE_TAGS[candidate])
|
|
||||||
return target?.language === source.language && target.script === source.script
|
|
||||||
})
|
|
||||||
if (match) return match
|
|
||||||
}
|
|
||||||
return "en"
|
|
||||||
}
|
|
||||||
|
|
||||||
export function desktopNativePluralCategories(locale: DesktopNativeLocale) {
|
|
||||||
return new Intl.PluralRules(DESKTOP_NATIVE_LOCALE_TAGS[locale]).resolvedOptions().pluralCategories
|
|
||||||
}
|
|
||||||
|
|
||||||
function locale(value: string) {
|
|
||||||
try {
|
|
||||||
return new Intl.Locale(value).maximize()
|
|
||||||
} catch {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DESKTOP_NATIVE_ENGLISH = {
|
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "File",
|
|
||||||
"desktop.menu.edit": "Edit",
|
|
||||||
"desktop.menu.view": "View",
|
|
||||||
"desktop.menu.go": "Go",
|
|
||||||
"desktop.menu.window": "Window",
|
|
||||||
"desktop.menu.help": "Help",
|
|
||||||
"desktop.menu.checkForUpdates": "Check for Updates...",
|
|
||||||
"desktop.menu.settings": "Settings",
|
|
||||||
"desktop.menu.reloadWebview": "Reload Webview",
|
|
||||||
"desktop.menu.restart": "Restart",
|
|
||||||
"desktop.menu.exportLogs": "Export Logs...",
|
|
||||||
"desktop.menu.newSession": "New Session",
|
|
||||||
"desktop.menu.openProject": "Open Project...",
|
|
||||||
"desktop.menu.newWindow": "New Window",
|
|
||||||
"desktop.menu.closeWindow": "Close Window",
|
|
||||||
"desktop.menu.undo": "Undo",
|
|
||||||
"desktop.menu.redo": "Redo",
|
|
||||||
"desktop.menu.cut": "Cut",
|
|
||||||
"desktop.menu.copy": "Copy",
|
|
||||||
"desktop.menu.paste": "Paste",
|
|
||||||
"desktop.menu.delete": "Delete",
|
|
||||||
"desktop.menu.selectAll": "Select All",
|
|
||||||
"desktop.menu.toggleSidebar": "Toggle Sidebar",
|
|
||||||
"desktop.menu.toggleTerminal": "Toggle Terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Toggle File Tree",
|
|
||||||
"desktop.menu.reload": "Reload",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Toggle Developer Tools",
|
|
||||||
"desktop.menu.actualSize": "Actual Size",
|
|
||||||
"desktop.menu.zoomIn": "Zoom In",
|
|
||||||
"desktop.menu.zoomOut": "Zoom Out",
|
|
||||||
"desktop.menu.toggleFullScreen": "Toggle Full Screen",
|
|
||||||
"desktop.menu.back": "Back",
|
|
||||||
"desktop.menu.forward": "Forward",
|
|
||||||
"desktop.menu.previousSession": "Previous Session",
|
|
||||||
"desktop.menu.nextSession": "Next Session",
|
|
||||||
"desktop.menu.previousProject": "Previous Project",
|
|
||||||
"desktop.menu.nextProject": "Next Project",
|
|
||||||
"desktop.menu.minimize": "Minimize",
|
|
||||||
"desktop.menu.maximize": "Maximize",
|
|
||||||
"desktop.menu.documentation": "OpenCode Documentation",
|
|
||||||
"desktop.menu.supportForum": "Support Forum",
|
|
||||||
"desktop.menu.shareFeedback": "Share Feedback",
|
|
||||||
"desktop.menu.reportBug": "Report a Bug",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode menu",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Update check failed.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Update Error",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "You're up to date.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "No Updates",
|
|
||||||
"desktop.updater.dialog.ready.message": "Update {{version}} downloaded. Restart now?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Update Ready",
|
|
||||||
"desktop.updater.dialog.restart": "Restart",
|
|
||||||
"desktop.updater.dialog.later": "Later",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Relaunch",
|
|
||||||
"desktop.recovery.action.exportLogs": "Export Logs",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Keep Waiting",
|
|
||||||
"desktop.recovery.action.quit": "Quit",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode failed to load",
|
|
||||||
"desktop.recovery.terminated": "OpenCode window terminated unexpectedly",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode is not responding",
|
|
||||||
"desktop.recovery.unresponsive.detail": "You can relaunch the app, open the logs, or keep waiting.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Window: {{window}}\nURL: {{url}}\nError: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Window: {{window}}\nReason: {{reason}}\nCode: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<unknown>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Choose a folder",
|
|
||||||
"desktop.dialog.chooseFile": "Choose a file",
|
|
||||||
"desktop.dialog.saveFile": "Save file",
|
|
||||||
"desktop.dialog.files": "Files",
|
|
||||||
"desktop.server.local": "Local Server",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL is only available on Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL is unavailable",
|
|
||||||
"desktop.wsl.error.listInstalled": "Failed to list installed WSL distros",
|
|
||||||
"desktop.wsl.error.listOnline": "Failed to list online WSL distros",
|
|
||||||
"desktop.wsl.error.executeDistro": "Cannot execute commands in distro",
|
|
||||||
"desktop.wsl.error.installWsl": "WSL installation failed",
|
|
||||||
"desktop.wsl.error.installDistro": "Failed to install distro: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "OpenCode installation failed",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} is already added",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode is not installed in this distro",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode is installed but could not run",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode is not installed in {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"OpenCode update finished but {{distro}} still reports {{installed}}; expected {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "no version",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL server exited after startup (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL server exited before becoming healthy (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout": "Sidecar for {{distro}} health check timed out after {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "{{command}} {{args}} timed out after {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Failed to get port",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "File was not selected by the picker",
|
|
||||||
"desktop.picker.error.sizeLimit": "Selected attachments exceed the {{limit}} MB limit",
|
|
||||||
} as const
|
|
||||||
|
|
||||||
export type DesktopNativeKey = keyof typeof DESKTOP_NATIVE_ENGLISH
|
|
||||||
export type DesktopNativeMessages = Record<DesktopNativeKey, string>
|
|
||||||
export type DesktopNativeBundle = { locale: DesktopNativeLocale; messages: DesktopNativeMessages }
|
|
||||||
|
|
||||||
export const DESKTOP_NATIVE_KEYS = Object.keys(DESKTOP_NATIVE_ENGLISH) as DesktopNativeKey[]
|
|
||||||
export const DESKTOP_NATIVE_MAX_PAYLOAD_BYTES = 64 * 1024
|
|
||||||
|
|
||||||
export function createDesktopNativeBundle(
|
|
||||||
locale: DesktopNativeLocale,
|
|
||||||
translate: (key: DesktopNativeKey) => string,
|
|
||||||
): DesktopNativeBundle {
|
|
||||||
return {
|
|
||||||
locale,
|
|
||||||
messages: Object.fromEntries(DESKTOP_NATIVE_KEYS.map((key) => [key, translate(key)])) as DesktopNativeMessages,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function parseDesktopNativeBundle(value: unknown): DesktopNativeBundle | undefined {
|
|
||||||
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined
|
|
||||||
try {
|
|
||||||
if (new TextEncoder().encode(JSON.stringify(value)).byteLength > DESKTOP_NATIVE_MAX_PAYLOAD_BYTES) return undefined
|
|
||||||
} catch {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
const bundle = value as { locale?: unknown; messages?: unknown }
|
|
||||||
if (!DESKTOP_NATIVE_LOCALES.some((locale) => locale === bundle.locale)) return undefined
|
|
||||||
if (!bundle.messages || typeof bundle.messages !== "object" || Array.isArray(bundle.messages)) return undefined
|
|
||||||
const messages = bundle.messages as Record<string, unknown>
|
|
||||||
const keys = Object.keys(messages)
|
|
||||||
if (keys.length !== DESKTOP_NATIVE_KEYS.length) return undefined
|
|
||||||
if (!DESKTOP_NATIVE_KEYS.every((key) => typeof messages[key] === "string")) return undefined
|
|
||||||
if (!keys.every((key) => key in DESKTOP_NATIVE_ENGLISH)) return undefined
|
|
||||||
return bundle as DesktopNativeBundle
|
|
||||||
}
|
|
||||||
|
|
||||||
export function formatDesktopNativeMessage(message: string, params?: Record<string, string | number>) {
|
|
||||||
if (!params) return message
|
|
||||||
return message.replace(/\{\{([^{}]+)\}\}/g, (match, key: string) => {
|
|
||||||
const value = params[key]
|
|
||||||
return value === undefined ? match : String(value)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,4 @@
|
|||||||
import { DESKTOP_NATIVE_ENGLISH } from "./desktop-native"
|
|
||||||
|
|
||||||
export const dict = {
|
export const dict = {
|
||||||
...DESKTOP_NATIVE_ENGLISH,
|
|
||||||
"command.category.suggested": "Suggested",
|
"command.category.suggested": "Suggested",
|
||||||
"command.category.view": "View",
|
"command.category.view": "View",
|
||||||
"command.category.project": "Project",
|
"command.category.project": "Project",
|
||||||
@@ -19,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Permissions",
|
"command.category.permissions": "Permissions",
|
||||||
"command.category.workspace": "Workspace",
|
"command.category.workspace": "Workspace",
|
||||||
"command.category.settings": "Settings",
|
"command.category.settings": "Settings",
|
||||||
"command.logs.export": "Export logs",
|
|
||||||
|
|
||||||
"theme.scheme.system": "System",
|
"theme.scheme.system": "System",
|
||||||
"theme.scheme.light": "Light",
|
"theme.scheme.light": "Light",
|
||||||
@@ -95,8 +91,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "Share this session and copy the URL to clipboard",
|
"command.session.share.description": "Share this session and copy the URL to clipboard",
|
||||||
"command.session.unshare": "Unshare session",
|
"command.session.unshare": "Unshare session",
|
||||||
"command.session.unshare.description": "Stop sharing this session",
|
"command.session.unshare.description": "Stop sharing this session",
|
||||||
"command.session.export": "Export session",
|
|
||||||
"command.session.export.description": "Export the full session transcript as JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Search files, commands, and sessions",
|
"palette.search.placeholder": "Search files, commands, and sessions",
|
||||||
"palette.search.placeholder.home": "Search commands and sessions",
|
"palette.search.placeholder.home": "Search commands and sessions",
|
||||||
@@ -137,8 +131,6 @@ export const dict = {
|
|||||||
"provider.connect.title.anthropicProMax": "Login with Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Login with Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Select login method for {{provider}}.",
|
"provider.connect.selectMethod": "Select login method for {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "API key",
|
"provider.connect.method.apiKey": "API key",
|
||||||
"provider.connect.method.browser": "Browser",
|
|
||||||
"provider.connect.method.headless": "Headless",
|
|
||||||
"provider.connect.status.inProgress": "Authorization in progress...",
|
"provider.connect.status.inProgress": "Authorization in progress...",
|
||||||
"provider.connect.status.waiting": "Waiting for authorization...",
|
"provider.connect.status.waiting": "Waiting for authorization...",
|
||||||
"provider.connect.status.failed": "Authorization failed: {{error}}",
|
"provider.connect.status.failed": "Authorization failed: {{error}}",
|
||||||
@@ -171,7 +163,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.description": "{{provider}} models are now available to use.",
|
"provider.connect.toast.connected.description": "{{provider}} models are now available to use.",
|
||||||
|
|
||||||
"provider.custom.title": "Custom provider",
|
"provider.custom.title": "Custom provider",
|
||||||
"provider.custom.unavailable": "Custom providers are unavailable on this server",
|
|
||||||
"provider.custom.description.prefix": "Configure an OpenAI-compatible provider. See the ",
|
"provider.custom.description.prefix": "Configure an OpenAI-compatible provider. See the ",
|
||||||
"provider.custom.description.link": "provider config docs",
|
"provider.custom.description.link": "provider config docs",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -446,22 +437,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.desktopVersion": "desktop {{version}}",
|
"wsl.onboarding.desktopVersion": "desktop {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "Installed version does not match the desktop app version.",
|
"wsl.onboarding.versionMismatch": "Installed version does not match the desktop app version.",
|
||||||
"wsl.onboarding.adding": "Adding...",
|
"wsl.onboarding.adding": "Adding...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Introducing Tabs. Organize your work and active sessions with tabs",
|
|
||||||
"help.tabs.toast.dismiss": "Dismiss Tabs information",
|
|
||||||
"help.tabs.title": "Introducing Tabs",
|
|
||||||
"help.tabs.description": "Organize your work and active sessions with tabs",
|
|
||||||
"help.tabs.date": "July 14",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop is now built around tabs.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Start a new session in a tab, or open an existing session from any of your projects. Open a new tab when you're starting something new, and close it when you're done.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Keeping a few tabs open makes it easier to organize your active sessions. Rename tabs to something memorable if you plan to keep them around.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"You'll find all your sessions and projects on the new Home screen. Selecting a session opens it in a tab.",
|
|
||||||
"help.tabs.persistence": "When you reopen the app, your tabs are still open.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"The new design does not support Git Worktrees yet, it's coming soon. So if you'd prefer to continue using the previous layout, you can switch between layouts in Settings. Just keep in mind that the new layout will become permanent in a few weeks.",
|
|
||||||
"server.row.noUsername": "no username",
|
"server.row.noUsername": "no username",
|
||||||
|
|
||||||
"dialog.project.edit.title": "Edit project",
|
"dialog.project.edit.title": "Edit project",
|
||||||
@@ -480,7 +455,6 @@ export const dict = {
|
|||||||
"dialog.releaseNotes.action.next": "Next",
|
"dialog.releaseNotes.action.next": "Next",
|
||||||
"dialog.releaseNotes.action.hideFuture": "Don't show these in the future",
|
"dialog.releaseNotes.action.hideFuture": "Don't show these in the future",
|
||||||
"dialog.releaseNotes.media.alt": "Release preview",
|
"dialog.releaseNotes.media.alt": "Release preview",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Don't show again",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Context Breakdown",
|
"context.breakdown.title": "Context Breakdown",
|
||||||
"context.breakdown.note": 'Approximate breakdown of input tokens. "Other" includes tool definitions and overhead.',
|
"context.breakdown.note": 'Approximate breakdown of input tokens. "Other" includes tool definitions and overhead.',
|
||||||
@@ -492,7 +466,6 @@ export const dict = {
|
|||||||
|
|
||||||
"context.systemPrompt.title": "System Prompt",
|
"context.systemPrompt.title": "System Prompt",
|
||||||
"context.rawMessages.title": "Raw messages",
|
"context.rawMessages.title": "Raw messages",
|
||||||
"context.export.session": "Export session",
|
|
||||||
|
|
||||||
"context.stats.session": "Session",
|
"context.stats.session": "Session",
|
||||||
"context.stats.messages": "Messages",
|
"context.stats.messages": "Messages",
|
||||||
@@ -572,11 +545,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.failed.title": "Failed to unshare session",
|
"toast.session.unshare.failed.title": "Failed to unshare session",
|
||||||
"toast.session.unshare.failed.description": "An error occurred while unsharing the session",
|
"toast.session.unshare.failed.description": "An error occurred while unsharing the session",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Session exported",
|
|
||||||
"toast.session.export.success.description": "Saved session to {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Failed to export session",
|
|
||||||
"toast.session.export.failed.description": "An error occurred while exporting the session",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Failed to load sessions for {{project}}",
|
"toast.session.listFailed.title": "Failed to load sessions for {{project}}",
|
||||||
"toast.project.reloadFailed.title": "Failed to reload {{project}}",
|
"toast.project.reloadFailed.title": "Failed to reload {{project}}",
|
||||||
|
|
||||||
@@ -797,12 +765,6 @@ export const dict = {
|
|||||||
"terminal.connectionLost.abnormalClose": "WebSocket closed abnormally: {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket closed abnormally: {{code}}",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"The terminal connection was interrupted. This can happen when the server restarts.",
|
"The terminal connection was interrupted. This can happen when the server restarts.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"PTY connect ticket rejected by origin or CSRF checks. Check the server CORS config.",
|
|
||||||
"terminal.connectTicket.statusError": "PTY connect ticket failed with {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Update",
|
|
||||||
"titlebar.updateVersion": "Update {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Close tab",
|
"common.closeTab": "Close tab",
|
||||||
"common.dismiss": "Dismiss",
|
"common.dismiss": "Dismiss",
|
||||||
@@ -811,7 +773,6 @@ export const dict = {
|
|||||||
"common.moreOptions": "More options",
|
"common.moreOptions": "More options",
|
||||||
"common.learnMore": "Learn more",
|
"common.learnMore": "Learn more",
|
||||||
"common.rename": "Rename",
|
"common.rename": "Rename",
|
||||||
"common.export": "Export",
|
|
||||||
"common.reset": "Reset",
|
"common.reset": "Reset",
|
||||||
"common.archive": "Archive",
|
"common.archive": "Archive",
|
||||||
"common.delete": "Delete",
|
"common.delete": "Delete",
|
||||||
@@ -878,14 +839,6 @@ export const dict = {
|
|||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Used JS heap vs heap limit. Chromium only.",
|
"debugBar.mem.tipUnavailable": "Used JS heap vs heap limit. Chromium only.",
|
||||||
"debugBar.mem.tip": "Used JS heap vs heap limit. {{used}} of {{limit}}.",
|
"debugBar.mem.tip": "Used JS heap vs heap limit. {{used}} of {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Force focus styles on all interactive elements",
|
|
||||||
"debugBar.focus.on": "ON",
|
|
||||||
"debugBar.focus.off": "OFF",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Force the full app layout direction without changing the selected language",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
|
|
||||||
"app.name.desktop": "OpenCode Desktop",
|
"app.name.desktop": "OpenCode Desktop",
|
||||||
|
|
||||||
|
|||||||
+101
-257
@@ -1,104 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Archivo",
|
|
||||||
"desktop.menu.edit": "Editar",
|
|
||||||
"desktop.menu.view": "Ver",
|
|
||||||
"desktop.menu.go": "Ir",
|
|
||||||
"desktop.menu.window": "Ventana",
|
|
||||||
"desktop.menu.help": "Ayuda",
|
|
||||||
"desktop.menu.checkForUpdates": "Buscar actualizaciones...",
|
|
||||||
"desktop.menu.settings": "Ajustes",
|
|
||||||
"desktop.menu.reloadWebview": "Volver a cargar la vista web",
|
|
||||||
"desktop.menu.restart": "Reiniciar",
|
|
||||||
"desktop.menu.exportLogs": "Exportar registros...",
|
|
||||||
"desktop.menu.newSession": "Nueva sesión",
|
|
||||||
"desktop.menu.openProject": "Abrir proyecto...",
|
|
||||||
"desktop.menu.newWindow": "Nueva ventana",
|
|
||||||
"desktop.menu.closeWindow": "Cerrar ventana",
|
|
||||||
"desktop.menu.undo": "Deshacer",
|
|
||||||
"desktop.menu.redo": "Rehacer",
|
|
||||||
"desktop.menu.cut": "Cortar",
|
|
||||||
"desktop.menu.copy": "Copiar",
|
|
||||||
"desktop.menu.paste": "Pegar",
|
|
||||||
"desktop.menu.delete": "Eliminar",
|
|
||||||
"desktop.menu.selectAll": "Seleccionar todo",
|
|
||||||
"desktop.menu.toggleSidebar": "Mostrar u ocultar barra lateral",
|
|
||||||
"desktop.menu.toggleTerminal": "Mostrar u ocultar terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Mostrar u ocultar árbol de archivos",
|
|
||||||
"desktop.menu.reload": "Volver a cargar",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Mostrar u ocultar herramientas para desarrolladores",
|
|
||||||
"desktop.menu.actualSize": "Tamaño real",
|
|
||||||
"desktop.menu.zoomIn": "Ampliar",
|
|
||||||
"desktop.menu.zoomOut": "Reducir",
|
|
||||||
"desktop.menu.toggleFullScreen": "Mostrar u ocultar pantalla completa",
|
|
||||||
"desktop.menu.back": "Atrás",
|
|
||||||
"desktop.menu.forward": "Adelante",
|
|
||||||
"desktop.menu.previousSession": "Sesión anterior",
|
|
||||||
"desktop.menu.nextSession": "Siguiente sesión",
|
|
||||||
"desktop.menu.previousProject": "Proyecto anterior",
|
|
||||||
"desktop.menu.nextProject": "Siguiente proyecto",
|
|
||||||
"desktop.menu.minimize": "Minimizar",
|
|
||||||
"desktop.menu.maximize": "Maximizar",
|
|
||||||
"desktop.menu.documentation": "Documentación de OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Foro de asistencia",
|
|
||||||
"desktop.menu.shareFeedback": "Enviar comentarios",
|
|
||||||
"desktop.menu.reportBug": "Informar de un error",
|
|
||||||
"desktop.menu.ariaLabel": "Menú de OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "No se pudo buscar actualizaciones.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Error de actualización",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Estás al día.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "No hay actualizaciones",
|
|
||||||
"desktop.updater.dialog.ready.message": "Se ha descargado la actualización {{version}}. ¿Quieres reiniciar ahora?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Actualización lista",
|
|
||||||
"desktop.updater.dialog.restart": "Reiniciar",
|
|
||||||
"desktop.updater.dialog.later": "Más tarde",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Volver a iniciar",
|
|
||||||
"desktop.recovery.action.exportLogs": "Exportar registros",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Seguir esperando",
|
|
||||||
"desktop.recovery.action.quit": "Salir",
|
|
||||||
"desktop.recovery.loadFailed": "No se pudo cargar OpenCode",
|
|
||||||
"desktop.recovery.terminated": "La ventana de OpenCode se cerró de forma inesperada",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode no responde",
|
|
||||||
"desktop.recovery.unresponsive.detail":
|
|
||||||
"Puedes volver a iniciar la aplicación, abrir los registros o seguir esperando.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Ventana: {{window}}\nURL: {{url}}\nError: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Ventana: {{window}}\nMotivo: {{reason}}\nCódigo: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<desconocido>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Elegir una carpeta",
|
|
||||||
"desktop.dialog.chooseFile": "Elegir un archivo",
|
|
||||||
"desktop.dialog.saveFile": "Guardar archivo",
|
|
||||||
"desktop.dialog.files": "Archivos",
|
|
||||||
"desktop.server.local": "Servidor local",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL solo está disponible en Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL no está disponible",
|
|
||||||
"desktop.wsl.error.listInstalled": "No se pudieron listar las distribuciones WSL instaladas",
|
|
||||||
"desktop.wsl.error.listOnline": "No se pudieron listar las distribuciones WSL en línea",
|
|
||||||
"desktop.wsl.error.executeDistro": "No se pueden ejecutar comandos en la distribución",
|
|
||||||
"desktop.wsl.error.installWsl": "No se pudo instalar WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "No se pudo instalar la distribución: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "No se pudo instalar OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "Ya se ha añadido {{distro}}",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode no está instalado en esta distribución",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode está instalado, pero no se pudo ejecutar",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode no está instalado en {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"La actualización de OpenCode finalizó, pero {{distro}} sigue indicando {{installed}}; se esperaba {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "sin versión",
|
|
||||||
"desktop.wsl.error.serverExited": "El servidor WSL se cerró después de iniciarse (código={{code}} señal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"El servidor WSL se cerró antes de estar operativo (código={{code}} señal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Se agotó el tiempo de espera de la comprobación de estado del sidecar de {{distro}} tras {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Se agotó el tiempo de espera de {{command}} {{args}} tras {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "No se pudo obtener el puerto",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "No se seleccionó ningún archivo en el selector",
|
|
||||||
"desktop.picker.error.sizeLimit": "Los adjuntos seleccionados superan el límite de {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "Sugerido",
|
"command.category.suggested": "Sugerido",
|
||||||
"command.category.view": "Ver",
|
"command.category.view": "Ver",
|
||||||
"command.category.project": "Proyecto",
|
"command.category.project": "Proyecto",
|
||||||
@@ -116,13 +16,12 @@ export const dict = {
|
|||||||
"command.category.permissions": "Permisos",
|
"command.category.permissions": "Permisos",
|
||||||
"command.category.workspace": "Espacio de trabajo",
|
"command.category.workspace": "Espacio de trabajo",
|
||||||
"command.category.settings": "Ajustes",
|
"command.category.settings": "Ajustes",
|
||||||
"command.logs.export": "Exportar registros",
|
|
||||||
|
|
||||||
"theme.scheme.system": "Sistema",
|
"theme.scheme.system": "Sistema",
|
||||||
"theme.scheme.light": "Claro",
|
"theme.scheme.light": "Claro",
|
||||||
"theme.scheme.dark": "Oscuro",
|
"theme.scheme.dark": "Oscuro",
|
||||||
|
|
||||||
"command.sidebar.toggle": "Mostrar u ocultar barra lateral",
|
"command.sidebar.toggle": "Alternar barra lateral",
|
||||||
"command.project.open": "Abrir proyecto",
|
"command.project.open": "Abrir proyecto",
|
||||||
"command.project.previous": "Proyecto anterior",
|
"command.project.previous": "Proyecto anterior",
|
||||||
"command.project.next": "Siguiente proyecto",
|
"command.project.next": "Siguiente proyecto",
|
||||||
@@ -138,12 +37,12 @@ export const dict = {
|
|||||||
|
|
||||||
"command.palette": "Paleta de comandos",
|
"command.palette": "Paleta de comandos",
|
||||||
|
|
||||||
"command.theme.cycle": "Cambiar tema",
|
"command.theme.cycle": "Alternar tema",
|
||||||
"command.theme.set": "Usar tema: {{theme}}",
|
"command.theme.set": "Usar tema: {{theme}}",
|
||||||
"command.theme.scheme.cycle": "Cambiar esquema de color",
|
"command.theme.scheme.cycle": "Alternar esquema de color",
|
||||||
"command.theme.scheme.set": "Usar esquema de color: {{scheme}}",
|
"command.theme.scheme.set": "Usar esquema de color: {{scheme}}",
|
||||||
|
|
||||||
"command.language.cycle": "Cambiar idioma",
|
"command.language.cycle": "Alternar idioma",
|
||||||
"command.language.set": "Usar idioma: {{language}}",
|
"command.language.set": "Usar idioma: {{language}}",
|
||||||
|
|
||||||
"command.session.new": "Nueva sesión",
|
"command.session.new": "Nueva sesión",
|
||||||
@@ -153,12 +52,12 @@ export const dict = {
|
|||||||
"command.context.addSelection": "Añadir selección al contexto",
|
"command.context.addSelection": "Añadir selección al contexto",
|
||||||
"command.context.addSelection.description": "Añadir las líneas seleccionadas del archivo actual",
|
"command.context.addSelection.description": "Añadir las líneas seleccionadas del archivo actual",
|
||||||
"command.input.focus": "Enfocar entrada",
|
"command.input.focus": "Enfocar entrada",
|
||||||
"command.terminal.toggle": "Mostrar u ocultar terminal",
|
"command.terminal.toggle": "Alternar terminal",
|
||||||
"command.fileTree.toggle": "Mostrar u ocultar árbol de archivos",
|
"command.fileTree.toggle": "Alternar árbol de archivos",
|
||||||
"command.review.toggle": "Mostrar u ocultar revisión",
|
"command.review.toggle": "Alternar revisión",
|
||||||
"command.terminal.new": "Nueva terminal",
|
"command.terminal.new": "Nueva terminal",
|
||||||
"command.terminal.new.description": "Crear una nueva pestaña de terminal",
|
"command.terminal.new.description": "Crear una nueva pestaña de terminal",
|
||||||
"command.steps.toggle": "Mostrar u ocultar pasos",
|
"command.steps.toggle": "Alternar pasos",
|
||||||
"command.steps.toggle.description": "Mostrar u ocultar pasos para el mensaje actual",
|
"command.steps.toggle.description": "Mostrar u ocultar pasos para el mensaje actual",
|
||||||
"command.message.previous": "Mensaje anterior",
|
"command.message.previous": "Mensaje anterior",
|
||||||
"command.message.previous.description": "Ir al mensaje de usuario anterior",
|
"command.message.previous.description": "Ir al mensaje de usuario anterior",
|
||||||
@@ -166,19 +65,19 @@ export const dict = {
|
|||||||
"command.message.next.description": "Ir al siguiente mensaje de usuario",
|
"command.message.next.description": "Ir al siguiente mensaje de usuario",
|
||||||
"command.model.choose": "Elegir modelo",
|
"command.model.choose": "Elegir modelo",
|
||||||
"command.model.choose.description": "Seleccionar un modelo diferente",
|
"command.model.choose.description": "Seleccionar un modelo diferente",
|
||||||
"command.mcp.toggle": "Activar o desactivar servidores MCP",
|
"command.mcp.toggle": "Alternar MCPs",
|
||||||
"command.mcp.toggle.description": "Activar o desactivar servidores MCP",
|
"command.mcp.toggle.description": "Alternar MCPs",
|
||||||
"command.agent.cycle": "Cambiar de agente",
|
"command.agent.cycle": "Alternar agente",
|
||||||
"command.agent.cycle.description": "Cambiar al siguiente agente",
|
"command.agent.cycle.description": "Cambiar al siguiente agente",
|
||||||
"command.agent.cycle.reverse": "Cambiar al agente anterior",
|
"command.agent.cycle.reverse": "Alternar agente hacia atrás",
|
||||||
"command.agent.cycle.reverse.description": "Cambiar al agente anterior",
|
"command.agent.cycle.reverse.description": "Cambiar al agente anterior",
|
||||||
"command.model.variant.cycle": "Cambiar esfuerzo de razonamiento",
|
"command.model.variant.cycle": "Alternar esfuerzo de pensamiento",
|
||||||
"command.model.variant.cycle.description": "Cambiar al siguiente nivel de esfuerzo",
|
"command.model.variant.cycle.description": "Cambiar al siguiente nivel de esfuerzo",
|
||||||
"command.prompt.mode.shell": "Shell",
|
"command.prompt.mode.shell": "Shell",
|
||||||
"command.prompt.mode.normal": "Prompt",
|
"command.prompt.mode.normal": "Prompt",
|
||||||
"command.permissions.autoaccept.enable": "Aceptar permisos automáticamente",
|
"command.permissions.autoaccept.enable": "Aceptar permisos automáticamente",
|
||||||
"command.permissions.autoaccept.disable": "Dejar de aceptar permisos automáticamente",
|
"command.permissions.autoaccept.disable": "Dejar de aceptar permisos automáticamente",
|
||||||
"command.workspace.toggle": "Activar o desactivar espacios de trabajo",
|
"command.workspace.toggle": "Alternar espacios de trabajo",
|
||||||
"command.workspace.toggle.description": "Habilitar o deshabilitar múltiples espacios de trabajo en la barra lateral",
|
"command.workspace.toggle.description": "Habilitar o deshabilitar múltiples espacios de trabajo en la barra lateral",
|
||||||
"command.session.undo": "Deshacer",
|
"command.session.undo": "Deshacer",
|
||||||
"command.session.undo.description": "Deshacer el último mensaje",
|
"command.session.undo.description": "Deshacer el último mensaje",
|
||||||
@@ -193,9 +92,6 @@ export const dict = {
|
|||||||
"command.session.unshare": "Dejar de compartir sesión",
|
"command.session.unshare": "Dejar de compartir sesión",
|
||||||
"command.session.unshare.description": "Dejar de compartir esta sesión",
|
"command.session.unshare.description": "Dejar de compartir esta sesión",
|
||||||
|
|
||||||
"command.session.export": "Exportar sesión",
|
|
||||||
"command.session.export.description": "Exportar la transcripción completa de la sesión como JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Buscar archivos, comandos y sesiones",
|
"palette.search.placeholder": "Buscar archivos, comandos y sesiones",
|
||||||
"palette.search.placeholder.home": "Buscar comandos y sesiones",
|
"palette.search.placeholder.home": "Buscar comandos y sesiones",
|
||||||
"palette.empty": "No se encontraron resultados",
|
"palette.empty": "No se encontraron resultados",
|
||||||
@@ -204,18 +100,17 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.provider.search.placeholder": "Buscar proveedores",
|
"dialog.provider.search.placeholder": "Buscar proveedores",
|
||||||
"dialog.provider.empty": "No se encontraron proveedores",
|
"dialog.provider.empty": "No se encontraron proveedores",
|
||||||
"dialog.provider.group.popular": "Populares",
|
"dialog.provider.group.popular": "Popular",
|
||||||
"dialog.provider.group.other": "Otros",
|
"dialog.provider.group.other": "Otro",
|
||||||
"dialog.provider.custom.label": "Proveedor personalizado compatible con OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "Recomendado",
|
"dialog.provider.tag.recommended": "Recomendado",
|
||||||
"dialog.provider.opencode.note": "Selección de modelos como Claude, GPT, Gemini y otros",
|
"dialog.provider.opencode.note": "Modelos seleccionados incluyendo Claude, GPT, Gemini y más",
|
||||||
"dialog.provider.opencode.tagline": "Modelos optimizados y fiables",
|
"dialog.provider.opencode.tagline": "Modelos optimizados y fiables",
|
||||||
"dialog.provider.opencodeGo.tagline": "Suscripción económica para todos",
|
"dialog.provider.opencodeGo.tagline": "Suscripción económica para todos",
|
||||||
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluidos Pro y Max",
|
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluyendo Pro y Max",
|
||||||
"dialog.provider.copilot.note": "Modelos de IA para asistencia de codificación a través de GitHub Copilot",
|
"dialog.provider.copilot.note": "Modelos de IA para asistencia de codificación a través de GitHub Copilot",
|
||||||
"dialog.provider.openai.note": "Modelos GPT para tareas de IA generales rápidas y capaces",
|
"dialog.provider.openai.note": "Modelos GPT para tareas de IA generales rápidas y capaces",
|
||||||
"dialog.provider.google.note": "Modelos Gemini para respuestas rápidas y estructuradas",
|
"dialog.provider.google.note": "Modelos Gemini para respuestas rápidas y estructuradas",
|
||||||
"dialog.provider.openrouter.note": "Accede a todos los modelos compatibles desde un solo proveedor",
|
"dialog.provider.openrouter.note": "Accede a todos los modelos soportados desde un solo proveedor",
|
||||||
"dialog.provider.vercel.note": "Acceso unificado a modelos de IA con enrutamiento inteligente",
|
"dialog.provider.vercel.note": "Acceso unificado a modelos de IA con enrutamiento inteligente",
|
||||||
|
|
||||||
"dialog.model.select.title": "Seleccionar modelo",
|
"dialog.model.select.title": "Seleccionar modelo",
|
||||||
@@ -223,11 +118,10 @@ export const dict = {
|
|||||||
"dialog.model.empty": "Sin resultados de modelos",
|
"dialog.model.empty": "Sin resultados de modelos",
|
||||||
"dialog.model.manage": "Gestionar modelos",
|
"dialog.model.manage": "Gestionar modelos",
|
||||||
"dialog.model.manage.description": "Personalizar qué modelos aparecen en el selector de modelos.",
|
"dialog.model.manage.description": "Personalizar qué modelos aparecen en el selector de modelos.",
|
||||||
"dialog.model.manage.provider.toggle": "Mostrar u ocultar todos los modelos de {{provider}}",
|
"dialog.model.manage.provider.toggle": "Alternar todos los modelos de {{provider}}",
|
||||||
|
|
||||||
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos proporcionados por OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos proporcionados por OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Añadir más modelos de proveedores populares",
|
"dialog.model.unpaid.addMore.title": "Añadir más modelos de proveedores populares",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Ver más de 70 proveedores",
|
|
||||||
|
|
||||||
"dialog.provider.viewAll": "Ver más proveedores",
|
"dialog.provider.viewAll": "Ver más proveedores",
|
||||||
|
|
||||||
@@ -235,8 +129,6 @@ export const dict = {
|
|||||||
"provider.connect.title.anthropicProMax": "Iniciar sesión con Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Iniciar sesión con Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Seleccionar método de inicio de sesión para {{provider}}.",
|
"provider.connect.selectMethod": "Seleccionar método de inicio de sesión para {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "Clave API",
|
"provider.connect.method.apiKey": "Clave API",
|
||||||
"provider.connect.method.browser": "Navegador",
|
|
||||||
"provider.connect.method.headless": "Sin navegador",
|
|
||||||
"provider.connect.status.inProgress": "Autorización en progreso...",
|
"provider.connect.status.inProgress": "Autorización en progreso...",
|
||||||
"provider.connect.status.waiting": "Esperando autorización...",
|
"provider.connect.status.waiting": "Esperando autorización...",
|
||||||
"provider.connect.status.failed": "Autorización fallida: {{error}}",
|
"provider.connect.status.failed": "Autorización fallida: {{error}}",
|
||||||
@@ -269,7 +161,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.description": "Los modelos de {{provider}} ahora están disponibles para usar.",
|
"provider.connect.toast.connected.description": "Los modelos de {{provider}} ahora están disponibles para usar.",
|
||||||
|
|
||||||
"provider.custom.title": "Proveedor personalizado",
|
"provider.custom.title": "Proveedor personalizado",
|
||||||
"provider.custom.unavailable": "Los proveedores personalizados no están disponibles en este servidor",
|
|
||||||
"provider.custom.description.prefix": "Configurar un proveedor compatible con OpenAI. Ver la ",
|
"provider.custom.description.prefix": "Configurar un proveedor compatible con OpenAI. Ver la ",
|
||||||
"provider.custom.description.link": "documentación de configuración del proveedor",
|
"provider.custom.description.link": "documentación de configuración del proveedor",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -282,8 +173,7 @@ export const dict = {
|
|||||||
"provider.custom.field.baseURL.placeholder": "https://api.miproveedor.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.miproveedor.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "Clave API",
|
"provider.custom.field.apiKey.label": "Clave API",
|
||||||
"provider.custom.field.apiKey.placeholder": "Clave API",
|
"provider.custom.field.apiKey.placeholder": "Clave API",
|
||||||
"provider.custom.field.apiKey.description":
|
"provider.custom.field.apiKey.description": "Opcional. Dejar vacío si gestionas la autenticación mediante cabeceras.",
|
||||||
"Opcional. Déjalo vacío si gestionas la autenticación mediante encabezados.",
|
|
||||||
"provider.custom.models.label": "Modelos",
|
"provider.custom.models.label": "Modelos",
|
||||||
"provider.custom.models.id.label": "ID",
|
"provider.custom.models.id.label": "ID",
|
||||||
"provider.custom.models.id.placeholder": "id-modelo",
|
"provider.custom.models.id.placeholder": "id-modelo",
|
||||||
@@ -291,13 +181,13 @@ export const dict = {
|
|||||||
"provider.custom.models.name.placeholder": "Nombre para mostrar",
|
"provider.custom.models.name.placeholder": "Nombre para mostrar",
|
||||||
"provider.custom.models.remove": "Eliminar modelo",
|
"provider.custom.models.remove": "Eliminar modelo",
|
||||||
"provider.custom.models.add": "Añadir modelo",
|
"provider.custom.models.add": "Añadir modelo",
|
||||||
"provider.custom.headers.label": "Encabezados (opcional)",
|
"provider.custom.headers.label": "Cabeceras (opcional)",
|
||||||
"provider.custom.headers.key.label": "Encabezado",
|
"provider.custom.headers.key.label": "Cabecera",
|
||||||
"provider.custom.headers.key.placeholder": "Nombre-Encabezado",
|
"provider.custom.headers.key.placeholder": "Nombre-Cabecera",
|
||||||
"provider.custom.headers.value.label": "Valor",
|
"provider.custom.headers.value.label": "Valor",
|
||||||
"provider.custom.headers.value.placeholder": "valor",
|
"provider.custom.headers.value.placeholder": "valor",
|
||||||
"provider.custom.headers.remove": "Eliminar encabezado",
|
"provider.custom.headers.remove": "Eliminar cabecera",
|
||||||
"provider.custom.headers.add": "Añadir encabezado",
|
"provider.custom.headers.add": "Añadir cabecera",
|
||||||
"provider.custom.error.providerID.required": "El ID del proveedor es obligatorio",
|
"provider.custom.error.providerID.required": "El ID del proveedor es obligatorio",
|
||||||
"provider.custom.error.providerID.format": "Usa letras minúsculas, números, guiones o guiones bajos",
|
"provider.custom.error.providerID.format": "Usa letras minúsculas, números, guiones o guiones bajos",
|
||||||
"provider.custom.error.providerID.exists": "Ese ID de proveedor ya existe",
|
"provider.custom.error.providerID.exists": "Ese ID de proveedor ya existe",
|
||||||
@@ -311,7 +201,7 @@ export const dict = {
|
|||||||
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
|
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
|
||||||
|
|
||||||
"model.tag.free": "Gratis",
|
"model.tag.free": "Gratis",
|
||||||
"model.tag.latest": "Más reciente",
|
"model.tag.latest": "Último",
|
||||||
"model.provider.anthropic": "Anthropic",
|
"model.provider.anthropic": "Anthropic",
|
||||||
"model.provider.openai": "OpenAI",
|
"model.provider.openai": "OpenAI",
|
||||||
"model.provider.google": "Google",
|
"model.provider.google": "Google",
|
||||||
@@ -321,7 +211,7 @@ export const dict = {
|
|||||||
"model.input.image": "imagen",
|
"model.input.image": "imagen",
|
||||||
"model.input.audio": "audio",
|
"model.input.audio": "audio",
|
||||||
"model.input.video": "video",
|
"model.input.video": "video",
|
||||||
"model.input.pdf": "PDF",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "Permite: {{inputs}}",
|
"model.tooltip.allows": "Permite: {{inputs}}",
|
||||||
"model.tooltip.context.label": "Contexto",
|
"model.tooltip.context.label": "Contexto",
|
||||||
"model.tooltip.inputs": "Entradas",
|
"model.tooltip.inputs": "Entradas",
|
||||||
@@ -341,7 +231,7 @@ export const dict = {
|
|||||||
"common.clear": "Limpiar",
|
"common.clear": "Limpiar",
|
||||||
"common.connect": "Conectar",
|
"common.connect": "Conectar",
|
||||||
"common.disconnect": "Desconectar",
|
"common.disconnect": "Desconectar",
|
||||||
"common.continue": "Continuar",
|
"common.continue": "Enviar",
|
||||||
"common.submit": "Enviar",
|
"common.submit": "Enviar",
|
||||||
"common.save": "Guardar",
|
"common.save": "Guardar",
|
||||||
"common.saving": "Guardando...",
|
"common.saving": "Guardando...",
|
||||||
@@ -360,7 +250,7 @@ export const dict = {
|
|||||||
"session.child.backToParent": "Volver a la sesión principal.",
|
"session.child.backToParent": "Volver a la sesión principal.",
|
||||||
|
|
||||||
"prompt.example.1": "Arreglar un TODO en el código",
|
"prompt.example.1": "Arreglar un TODO en el código",
|
||||||
"prompt.example.2": "¿Qué tecnologías usa este proyecto?",
|
"prompt.example.2": "¿Cuál es el stack tecnológico de este proyecto?",
|
||||||
"prompt.example.3": "Arreglar pruebas rotas",
|
"prompt.example.3": "Arreglar pruebas rotas",
|
||||||
"prompt.example.4": "Explicar cómo funciona la autenticación",
|
"prompt.example.4": "Explicar cómo funciona la autenticación",
|
||||||
"prompt.example.5": "Encontrar y arreglar vulnerabilidades de seguridad",
|
"prompt.example.5": "Encontrar y arreglar vulnerabilidades de seguridad",
|
||||||
@@ -373,22 +263,22 @@ export const dict = {
|
|||||||
"prompt.example.12": "Añadir validación de entrada",
|
"prompt.example.12": "Añadir validación de entrada",
|
||||||
"prompt.example.13": "Crear un nuevo componente para...",
|
"prompt.example.13": "Crear un nuevo componente para...",
|
||||||
"prompt.example.14": "¿Cómo despliego este proyecto?",
|
"prompt.example.14": "¿Cómo despliego este proyecto?",
|
||||||
"prompt.example.15": "Revisar si mi código sigue las prácticas recomendadas",
|
"prompt.example.15": "Revisar mi código para mejores prácticas",
|
||||||
"prompt.example.16": "Añadir gestión de errores a esta función",
|
"prompt.example.16": "Añadir manejo de errores a esta función",
|
||||||
"prompt.example.17": "Explicar este patrón de expresión regular",
|
"prompt.example.17": "Explicar este patrón de regex",
|
||||||
"prompt.example.18": "Convertir esto a TypeScript",
|
"prompt.example.18": "Convertir esto a TypeScript",
|
||||||
"prompt.example.19": "Añadir registros en todo el código",
|
"prompt.example.19": "Añadir logging en todo el código",
|
||||||
"prompt.example.20": "¿Qué dependencias están desactualizadas?",
|
"prompt.example.20": "¿Qué dependencias están desactualizadas?",
|
||||||
"prompt.example.21": "Ayúdame a escribir un script de migración",
|
"prompt.example.21": "Ayúdame a escribir un script de migración",
|
||||||
"prompt.example.22": "Implementar caché para este punto de conexión",
|
"prompt.example.22": "Implementar caché para este endpoint",
|
||||||
"prompt.example.23": "Añadir paginación a esta lista",
|
"prompt.example.23": "Añadir paginación a esta lista",
|
||||||
"prompt.example.24": "Crear un comando CLI para...",
|
"prompt.example.24": "Crear un comando CLI para...",
|
||||||
"prompt.example.25": "¿Cómo funcionan las variables de entorno aquí?",
|
"prompt.example.25": "¿Cómo funcionan las variables de entorno aquí?",
|
||||||
|
|
||||||
"prompt.popover.emptyResults": "Sin resultados coincidentes",
|
"prompt.popover.emptyResults": "Sin resultados coincidentes",
|
||||||
"prompt.popover.emptyCommands": "Sin comandos coincidentes",
|
"prompt.popover.emptyCommands": "Sin comandos coincidentes",
|
||||||
"prompt.dropzone.label": "Suelta aquí imágenes, archivos PDF o archivos de texto",
|
"prompt.dropzone.label": "Suelta imágenes, PDFs o archivos de texto aquí",
|
||||||
"prompt.dropzone.file.label": "Suelta para @mencionar el archivo",
|
"prompt.dropzone.file.label": "Suelta para @mencionar archivo",
|
||||||
"prompt.slash.badge.custom": "personalizado",
|
"prompt.slash.badge.custom": "personalizado",
|
||||||
"prompt.slash.badge.skill": "skill",
|
"prompt.slash.badge.skill": "skill",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
@@ -396,7 +286,7 @@ export const dict = {
|
|||||||
"prompt.context.includeActiveFile": "Incluir archivo activo",
|
"prompt.context.includeActiveFile": "Incluir archivo activo",
|
||||||
"prompt.context.removeActiveFile": "Eliminar archivo activo del contexto",
|
"prompt.context.removeActiveFile": "Eliminar archivo activo del contexto",
|
||||||
"prompt.context.removeFile": "Eliminar archivo del contexto",
|
"prompt.context.removeFile": "Eliminar archivo del contexto",
|
||||||
"prompt.action.attachFile": "Añadir archivos",
|
"prompt.action.attachFile": "Adjuntar archivo",
|
||||||
"prompt.menu.addImagesAndFiles": "Añadir archivos y más",
|
"prompt.menu.addImagesAndFiles": "Añadir archivos y más",
|
||||||
"prompt.menu.imagesAndFiles": "Imágenes y archivos",
|
"prompt.menu.imagesAndFiles": "Imágenes y archivos",
|
||||||
"prompt.menu.commands": "Comandos",
|
"prompt.menu.commands": "Comandos",
|
||||||
@@ -408,8 +298,7 @@ export const dict = {
|
|||||||
|
|
||||||
"prompt.toast.pasteUnsupported.title": "Adjunto no compatible",
|
"prompt.toast.pasteUnsupported.title": "Adjunto no compatible",
|
||||||
"prompt.toast.attachmentDuplicate.title": "Este archivo ya se ha subido",
|
"prompt.toast.attachmentDuplicate.title": "Este archivo ya se ha subido",
|
||||||
"prompt.toast.pasteUnsupported.description":
|
"prompt.toast.pasteUnsupported.description": "Solo se pueden adjuntar imágenes, PDFs o archivos de texto aquí.",
|
||||||
"Aquí solo se pueden adjuntar imágenes, archivos PDF o archivos de texto.",
|
|
||||||
"prompt.toast.modelAgentRequired.title": "Selecciona un agente y modelo",
|
"prompt.toast.modelAgentRequired.title": "Selecciona un agente y modelo",
|
||||||
"prompt.toast.modelAgentRequired.description": "Elige un agente y modelo antes de enviar un prompt.",
|
"prompt.toast.modelAgentRequired.description": "Elige un agente y modelo antes de enviar un prompt.",
|
||||||
"prompt.toast.worktreeCreateFailed.title": "Fallo al crear el árbol de trabajo",
|
"prompt.toast.worktreeCreateFailed.title": "Fallo al crear el árbol de trabajo",
|
||||||
@@ -419,16 +308,16 @@ export const dict = {
|
|||||||
"prompt.toast.promptSendFailed.title": "Fallo al enviar prompt",
|
"prompt.toast.promptSendFailed.title": "Fallo al enviar prompt",
|
||||||
"prompt.toast.promptSendFailed.description": "No se pudo recuperar la sesión",
|
"prompt.toast.promptSendFailed.description": "No se pudo recuperar la sesión",
|
||||||
|
|
||||||
"dialog.mcp.title": "Servidores MCP",
|
"dialog.mcp.title": "MCPs",
|
||||||
"dialog.mcp.description": "{{enabled}} de {{total}} habilitados",
|
"dialog.mcp.description": "{{enabled}} de {{total}} habilitados",
|
||||||
"dialog.mcp.empty": "No hay servidores MCP configurados",
|
"dialog.mcp.empty": "No hay MCPs configurados",
|
||||||
|
|
||||||
"dialog.lsp.empty": "Servidores LSP detectados automáticamente por tipo de archivo",
|
"dialog.lsp.empty": "LSPs detectados automáticamente por tipo de archivo",
|
||||||
"dialog.plugins.empty": "Plugins configurados en opencode.json",
|
"dialog.plugins.empty": "Plugins configurados en opencode.json",
|
||||||
|
|
||||||
"mcp.status.connected": "conectado",
|
"mcp.status.connected": "conectado",
|
||||||
"mcp.status.failed": "fallido",
|
"mcp.status.failed": "fallido",
|
||||||
"mcp.status.needs_auth": "requiere autenticación",
|
"mcp.status.needs_auth": "necesita auth",
|
||||||
"mcp.auth.clickToAuthenticate": "Haz clic para autenticar",
|
"mcp.auth.clickToAuthenticate": "Haz clic para autenticar",
|
||||||
"mcp.status.disabled": "deshabilitado",
|
"mcp.status.disabled": "deshabilitado",
|
||||||
|
|
||||||
@@ -439,13 +328,13 @@ export const dict = {
|
|||||||
"dialog.directory.action.selectFile": "Seleccionar archivo",
|
"dialog.directory.action.selectFile": "Seleccionar archivo",
|
||||||
"dialog.directory.action.selectFolder": "Seleccionar carpeta",
|
"dialog.directory.action.selectFolder": "Seleccionar carpeta",
|
||||||
"dialog.directory.root": "Raíz",
|
"dialog.directory.root": "Raíz",
|
||||||
"dialog.directory.parent": "Carpeta superior",
|
"dialog.directory.parent": "Superior",
|
||||||
"dialog.directory.readError": "No se puede leer esta carpeta",
|
"dialog.directory.readError": "No se puede leer esta carpeta",
|
||||||
|
|
||||||
"dialog.server.title": "Servidores",
|
"dialog.server.title": "Servidores",
|
||||||
"dialog.server.description": "Cambiar el servidor de OpenCode al que se conecta esta aplicación.",
|
"dialog.server.description": "Cambiar a qué servidor de OpenCode se conecta esta app.",
|
||||||
"dialog.server.search.placeholder": "Buscar servidores",
|
"dialog.server.search.placeholder": "Buscar servidores",
|
||||||
"dialog.server.empty": "Aún no hay servidores",
|
"dialog.server.empty": "No hay servidores aún",
|
||||||
"dialog.server.add.title": "Añadir un servidor",
|
"dialog.server.add.title": "Añadir un servidor",
|
||||||
"dialog.server.add.url": "URL del servidor",
|
"dialog.server.add.url": "URL del servidor",
|
||||||
"dialog.server.add.placeholder": "http://localhost:4096",
|
"dialog.server.add.placeholder": "http://localhost:4096",
|
||||||
@@ -459,7 +348,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Editar servidor",
|
"dialog.server.edit.title": "Editar servidor",
|
||||||
"dialog.server.default.title": "Servidor predeterminado",
|
"dialog.server.default.title": "Servidor predeterminado",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Conectar a este servidor al iniciar la aplicación en lugar de iniciar un servidor local. Requiere reiniciar.",
|
"Conectar a este servidor al iniciar la app en lugar de iniciar un servidor local. Requiere reinicio.",
|
||||||
"dialog.server.default.none": "Ningún servidor seleccionado",
|
"dialog.server.default.none": "Ningún servidor seleccionado",
|
||||||
"dialog.server.default.set": "Establecer servidor actual como predeterminado",
|
"dialog.server.default.set": "Establecer servidor actual como predeterminado",
|
||||||
"dialog.server.default.clear": "Limpiar",
|
"dialog.server.default.clear": "Limpiar",
|
||||||
@@ -467,7 +356,7 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.server.menu.edit": "Editar",
|
"dialog.server.menu.edit": "Editar",
|
||||||
"dialog.server.menu.default": "Establecer como predeterminado",
|
"dialog.server.menu.default": "Establecer como predeterminado",
|
||||||
"dialog.server.menu.defaultRemove": "Quitar como predeterminado",
|
"dialog.server.menu.defaultRemove": "Quitar predeterminado",
|
||||||
"dialog.server.menu.delete": "Eliminar",
|
"dialog.server.menu.delete": "Eliminar",
|
||||||
"dialog.server.current": "Servidor actual",
|
"dialog.server.current": "Servidor actual",
|
||||||
"dialog.server.status.default": "Predeterminado",
|
"dialog.server.status.default": "Predeterminado",
|
||||||
@@ -541,22 +430,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.versionMismatch": "La versión instalada no coincide con la versión de la aplicación de escritorio.",
|
"wsl.onboarding.versionMismatch": "La versión instalada no coincide con la versión de la aplicación de escritorio.",
|
||||||
"wsl.onboarding.adding": "Añadiendo...",
|
"wsl.onboarding.adding": "Añadiendo...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Presentamos las pestañas. Organiza tu trabajo y las sesiones activas con pestañas",
|
|
||||||
"help.tabs.toast.dismiss": "Descartar información sobre las pestañas",
|
|
||||||
"help.tabs.title": "Presentamos las pestañas",
|
|
||||||
"help.tabs.description": "Organiza tu trabajo y las sesiones activas con pestañas",
|
|
||||||
"help.tabs.date": "14 de julio",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop ahora se organiza en torno a pestañas.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Inicia una nueva sesión en una pestaña o abre una sesión existente de cualquiera de tus proyectos. Abre una pestaña nueva cuando empieces algo nuevo y ciérrala cuando termines.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Mantener algunas pestañas abiertas facilita la organización de las sesiones activas. Cambia el nombre de las pestañas por uno fácil de recordar si piensas conservarlas.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Encontrarás todas tus sesiones y proyectos en la nueva pantalla Inicio. Al seleccionar una sesión, se abre en una pestaña.",
|
|
||||||
"help.tabs.persistence": "Cuando vuelvas a abrir la aplicación, las pestañas seguirán abiertas.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"El nuevo diseño aún no admite Git Worktrees, pero estarán disponibles pronto. Si prefieres seguir usando el diseño anterior, puedes cambiar de diseño en Ajustes. Ten en cuenta que el nuevo diseño será permanente dentro de unas semanas.",
|
|
||||||
|
|
||||||
"dialog.project.edit.title": "Editar proyecto",
|
"dialog.project.edit.title": "Editar proyecto",
|
||||||
"dialog.project.edit.name": "Nombre",
|
"dialog.project.edit.name": "Nombre",
|
||||||
"dialog.project.edit.icon": "Icono",
|
"dialog.project.edit.icon": "Icono",
|
||||||
@@ -570,9 +443,7 @@ export const dict = {
|
|||||||
"Se ejecuta después de crear un nuevo espacio de trabajo (árbol de trabajo).",
|
"Se ejecuta después de crear un nuevo espacio de trabajo (árbol de trabajo).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "p. ej. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "p. ej. bun install",
|
||||||
|
|
||||||
"dialog.usageExceeded.dontShowAgain": "No volver a mostrar",
|
"context.breakdown.title": "Desglose de Contexto",
|
||||||
|
|
||||||
"context.breakdown.title": "Desglose del contexto",
|
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Desglose aproximado de tokens de entrada. "Otro" incluye definiciones de herramientas y sobrecarga.',
|
'Desglose aproximado de tokens de entrada. "Otro" incluye definiciones de herramientas y sobrecarga.',
|
||||||
"context.breakdown.system": "Sistema",
|
"context.breakdown.system": "Sistema",
|
||||||
@@ -581,27 +452,25 @@ export const dict = {
|
|||||||
"context.breakdown.tool": "Llamadas a herramientas",
|
"context.breakdown.tool": "Llamadas a herramientas",
|
||||||
"context.breakdown.other": "Otro",
|
"context.breakdown.other": "Otro",
|
||||||
|
|
||||||
"context.systemPrompt.title": "Prompt del sistema",
|
"context.systemPrompt.title": "Prompt del Sistema",
|
||||||
"context.rawMessages.title": "Mensajes en bruto",
|
"context.rawMessages.title": "Mensajes en bruto",
|
||||||
|
|
||||||
"context.export.session": "Exportar sesión",
|
|
||||||
|
|
||||||
"context.stats.session": "Sesión",
|
"context.stats.session": "Sesión",
|
||||||
"context.stats.messages": "Mensajes",
|
"context.stats.messages": "Mensajes",
|
||||||
"context.stats.provider": "Proveedor",
|
"context.stats.provider": "Proveedor",
|
||||||
"context.stats.model": "Modelo",
|
"context.stats.model": "Modelo",
|
||||||
"context.stats.limit": "Límite de contexto",
|
"context.stats.limit": "Límite de Contexto",
|
||||||
"context.stats.totalTokens": "Tokens totales",
|
"context.stats.totalTokens": "Tokens Totales",
|
||||||
"context.stats.usage": "Uso",
|
"context.stats.usage": "Uso",
|
||||||
"context.stats.inputTokens": "Tokens de entrada",
|
"context.stats.inputTokens": "Tokens de Entrada",
|
||||||
"context.stats.outputTokens": "Tokens de salida",
|
"context.stats.outputTokens": "Tokens de Salida",
|
||||||
"context.stats.reasoningTokens": "Tokens de razonamiento",
|
"context.stats.reasoningTokens": "Tokens de Razonamiento",
|
||||||
"context.stats.cacheTokens": "Tokens de caché (lectura/escritura)",
|
"context.stats.cacheTokens": "Tokens de Caché (lectura/escritura)",
|
||||||
"context.stats.userMessages": "Mensajes de usuario",
|
"context.stats.userMessages": "Mensajes de Usuario",
|
||||||
"context.stats.assistantMessages": "Mensajes de asistente",
|
"context.stats.assistantMessages": "Mensajes de Asistente",
|
||||||
"context.stats.totalCost": "Costo total",
|
"context.stats.totalCost": "Costo Total",
|
||||||
"context.stats.sessionCreated": "Sesión creada",
|
"context.stats.sessionCreated": "Sesión Creada",
|
||||||
"context.stats.lastActivity": "Última actividad",
|
"context.stats.lastActivity": "Última Actividad",
|
||||||
|
|
||||||
"context.usage.tokens": "Tokens",
|
"context.usage.tokens": "Tokens",
|
||||||
"context.usage.usage": "Uso",
|
"context.usage.usage": "Uso",
|
||||||
@@ -655,20 +524,15 @@ export const dict = {
|
|||||||
|
|
||||||
"toast.session.share.copyFailed.title": "Fallo al copiar URL al portapapeles",
|
"toast.session.share.copyFailed.title": "Fallo al copiar URL al portapapeles",
|
||||||
"toast.session.share.success.title": "Sesión compartida",
|
"toast.session.share.success.title": "Sesión compartida",
|
||||||
"toast.session.share.success.description": "Enlace para compartir copiado al portapapeles.",
|
"toast.session.share.success.description": "¡URL compartida copiada al portapapeles!",
|
||||||
"toast.session.share.failed.title": "Fallo al compartir sesión",
|
"toast.session.share.failed.title": "Fallo al compartir sesión",
|
||||||
"toast.session.share.failed.description": "Ocurrió un error al compartir la sesión",
|
"toast.session.share.failed.description": "Ocurrió un error al compartir la sesión",
|
||||||
|
|
||||||
"toast.session.unshare.success.title": "La sesión dejó de compartirse",
|
"toast.session.unshare.success.title": "Sesión dejó de compartirse",
|
||||||
"toast.session.unshare.success.description": "La sesión dejó de compartirse correctamente.",
|
"toast.session.unshare.success.description": "¡La sesión dejó de compartirse exitosamente!",
|
||||||
"toast.session.unshare.failed.title": "Fallo al dejar de compartir sesión",
|
"toast.session.unshare.failed.title": "Fallo al dejar de compartir sesión",
|
||||||
"toast.session.unshare.failed.description": "Ocurrió un error al dejar de compartir la sesión",
|
"toast.session.unshare.failed.description": "Ocurrió un error al dejar de compartir la sesión",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Sesión exportada",
|
|
||||||
"toast.session.export.success.description": "Sesión guardada en {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "No se pudo exportar la sesión",
|
|
||||||
"toast.session.export.failed.description": "Se produjo un error al exportar la sesión",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Fallo al cargar sesiones para {{project}}",
|
"toast.session.listFailed.title": "Fallo al cargar sesiones para {{project}}",
|
||||||
|
|
||||||
"toast.update.title": "Actualización disponible",
|
"toast.update.title": "Actualización disponible",
|
||||||
@@ -681,13 +545,13 @@ export const dict = {
|
|||||||
"error.page.description.localServerStartup": "Ocurrió un error al iniciar el servidor local.",
|
"error.page.description.localServerStartup": "Ocurrió un error al iniciar el servidor local.",
|
||||||
"error.page.details.label": "Detalles del error",
|
"error.page.details.label": "Detalles del error",
|
||||||
"error.page.action.restart": "Reiniciar",
|
"error.page.action.restart": "Reiniciar",
|
||||||
"error.page.action.report": "Informar del error",
|
"error.page.action.report": "Informar error",
|
||||||
"error.page.action.reported": "Error notificado",
|
"error.page.action.reported": "Error informado",
|
||||||
"error.page.action.exportLogs": "Exportar registros",
|
"error.page.action.exportLogs": "Exportar registros",
|
||||||
"error.page.action.checking": "Comprobando...",
|
"error.page.action.checking": "Comprobando...",
|
||||||
"error.page.action.checkUpdates": "Buscar actualizaciones",
|
"error.page.action.checkUpdates": "Buscar actualizaciones",
|
||||||
"error.page.action.updateTo": "Actualizar a {{version}}",
|
"error.page.action.updateTo": "Actualizar a {{version}}",
|
||||||
"error.page.report.prefix": "Informa de este error al equipo de OpenCode",
|
"error.page.report.prefix": "Por favor reporta este error al equipo de OpenCode",
|
||||||
"error.page.report.discord": "en Discord",
|
"error.page.report.discord": "en Discord",
|
||||||
"error.page.version": "Versión: {{version}}",
|
"error.page.version": "Versión: {{version}}",
|
||||||
|
|
||||||
@@ -703,10 +567,10 @@ export const dict = {
|
|||||||
"error.chain.status": "Estado: {{status}}",
|
"error.chain.status": "Estado: {{status}}",
|
||||||
"error.chain.retryable": "Reintentable: {{retryable}}",
|
"error.chain.retryable": "Reintentable: {{retryable}}",
|
||||||
"error.chain.responseBody": "Cuerpo de la respuesta:\n{{body}}",
|
"error.chain.responseBody": "Cuerpo de la respuesta:\n{{body}}",
|
||||||
"error.chain.didYouMean": "¿Quizá quisiste decir {{suggestions}}?",
|
"error.chain.didYouMean": "¿Quisiste decir: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Modelo no encontrado: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Modelo no encontrado: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Comprueba los nombres de proveedor/modelo en tu configuración (opencode.json)",
|
"error.chain.checkConfig": "Comprueba los nombres de proveedor/modelo en tu configuración (opencode.json)",
|
||||||
"error.chain.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota: OpenCode aún no admite la autenticación MCP.',
|
"error.chain.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota, OpenCode no soporta autenticación MCP todavía.',
|
||||||
"error.chain.providerAuthFailed": "Autenticación de proveedor fallida ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Autenticación de proveedor fallida ({{provider}}): {{message}}",
|
||||||
"error.chain.providerInitFailed":
|
"error.chain.providerInitFailed":
|
||||||
'Fallo al inicializar proveedor "{{provider}}". Comprueba credenciales y configuración.',
|
'Fallo al inicializar proveedor "{{provider}}". Comprueba credenciales y configuración.',
|
||||||
@@ -759,12 +623,12 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "Esta pestaña apunta a una sesión que ya no existe en este servidor.",
|
"session.error.notFound.description": "Esta pestaña apunta a una sesión que ya no existe en este servidor.",
|
||||||
"session.error.notFound.closeTab": "Cerrar pestaña",
|
"session.error.notFound.closeTab": "Cerrar pestaña",
|
||||||
"session.error.serverConnection": "No se puede conectar a este servidor",
|
"session.error.serverConnection": "No se puede conectar a este servidor",
|
||||||
"session.review.filesChanged": "Archivos modificados: {{count}}",
|
"session.review.filesChanged": "{{count}} Archivos Cambiados",
|
||||||
"session.review.change.one": "Cambio",
|
"session.review.change.one": "Cambio",
|
||||||
"session.review.change.other": "Cambios",
|
"session.review.change.other": "Cambios",
|
||||||
"session.review.loadingChanges": "Cargando cambios...",
|
"session.review.loadingChanges": "Cargando cambios...",
|
||||||
"session.review.empty": "Aún no hay cambios en esta sesión",
|
"session.review.empty": "No hay cambios en esta sesión aún",
|
||||||
"session.review.noVcs": "No se detectó ningún sistema de control de versiones Git; no se muestran los cambios",
|
"session.review.noVcs": "No se detectó Sistema de Control de Versiones Git, los cambios no se muestran",
|
||||||
"session.review.noSnapshot":
|
"session.review.noSnapshot":
|
||||||
"El seguimiento de instantáneas está deshabilitado en la configuración, por lo que los cambios de sesión no están disponibles",
|
"El seguimiento de instantáneas está deshabilitado en la configuración, por lo que los cambios de sesión no están disponibles",
|
||||||
"session.review.noChanges": "Sin cambios",
|
"session.review.noChanges": "Sin cambios",
|
||||||
@@ -774,13 +638,13 @@ export const dict = {
|
|||||||
"session.files.selectToOpen": "Selecciona un archivo para abrir",
|
"session.files.selectToOpen": "Selecciona un archivo para abrir",
|
||||||
"session.files.all": "Todos los archivos",
|
"session.files.all": "Todos los archivos",
|
||||||
"session.files.empty": "Sin archivos",
|
"session.files.empty": "Sin archivos",
|
||||||
"session.files.binaryContent": "Archivo binario (no se puede mostrar el contenido)",
|
"session.files.binaryContent": "Archivo binario (el contenido no puede ser mostrado)",
|
||||||
|
|
||||||
"session.messages.renderEarlier": "Mostrar mensajes anteriores",
|
"session.messages.renderEarlier": "Renderizar mensajes anteriores",
|
||||||
"session.messages.loadingEarlier": "Cargando mensajes anteriores...",
|
"session.messages.loadingEarlier": "Cargando mensajes anteriores...",
|
||||||
"session.messages.loadEarlier": "Cargar mensajes anteriores",
|
"session.messages.loadEarlier": "Cargar mensajes anteriores",
|
||||||
"session.messages.loading": "Cargando mensajes...",
|
"session.messages.loading": "Cargando mensajes...",
|
||||||
"session.messages.jumpToLatest": "Ir al mensaje más reciente",
|
"session.messages.jumpToLatest": "Ir al último",
|
||||||
|
|
||||||
"session.context.addToContext": "Añadir {{selection}} al contexto",
|
"session.context.addToContext": "Añadir {{selection}} al contexto",
|
||||||
"session.todo.title": "Tareas",
|
"session.todo.title": "Tareas",
|
||||||
@@ -789,17 +653,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "Minimizar pregunta",
|
"session.question.minimize": "Minimizar pregunta",
|
||||||
"session.question.restore": "Restaurar pregunta",
|
"session.question.restore": "Restaurar pregunta",
|
||||||
"session.question.pending.one": "{{count}} pregunta pendiente",
|
"session.question.pending.one": "{{count}} pregunta pendiente",
|
||||||
"session.question.pending.many": "{{count}} de preguntas pendientes",
|
|
||||||
"session.question.pending.other": "{{count}} preguntas pendientes",
|
"session.question.pending.other": "{{count}} preguntas pendientes",
|
||||||
"session.followupDock.summary.one": "{{count}} mensaje en cola",
|
"session.followupDock.summary.one": "{{count}} mensaje en cola",
|
||||||
"session.followupDock.summary.many": "{{count}} de mensajes en cola",
|
|
||||||
"session.followupDock.summary.other": "{{count}} mensajes en cola",
|
"session.followupDock.summary.other": "{{count}} mensajes en cola",
|
||||||
"session.followupDock.sendNow": "Enviar ahora",
|
"session.followupDock.sendNow": "Enviar ahora",
|
||||||
"session.followupDock.edit": "Editar",
|
"session.followupDock.edit": "Editar",
|
||||||
"session.followupDock.collapse": "Contraer mensajes en cola",
|
"session.followupDock.collapse": "Contraer mensajes en cola",
|
||||||
"session.followupDock.expand": "Expandir mensajes en cola",
|
"session.followupDock.expand": "Expandir mensajes en cola",
|
||||||
"session.revertDock.summary.one": "{{count}} mensaje revertido",
|
"session.revertDock.summary.one": "{{count}} mensaje revertido",
|
||||||
"session.revertDock.summary.many": "{{count}} de mensajes revertidos",
|
|
||||||
"session.revertDock.summary.other": "{{count}} mensajes revertidos",
|
"session.revertDock.summary.other": "{{count}} mensajes revertidos",
|
||||||
"session.revertDock.collapse": "Contraer mensajes revertidos",
|
"session.revertDock.collapse": "Contraer mensajes revertidos",
|
||||||
"session.revertDock.expand": "Expandir mensajes revertidos",
|
"session.revertDock.expand": "Expandir mensajes revertidos",
|
||||||
@@ -833,9 +694,9 @@ export const dict = {
|
|||||||
"status.popover.tab.mcp": "MCP",
|
"status.popover.tab.mcp": "MCP",
|
||||||
"status.popover.tab.lsp": "LSP",
|
"status.popover.tab.lsp": "LSP",
|
||||||
"status.popover.tab.plugins": "Plugins",
|
"status.popover.tab.plugins": "Plugins",
|
||||||
"status.popover.action.manageServers": "Gestionar servidores",
|
"status.popover.action.manageServers": "Administrar servidores",
|
||||||
|
|
||||||
"session.share.popover.title": "Publicar en la web",
|
"session.share.popover.title": "Publicar en web",
|
||||||
"session.share.popover.description.shared":
|
"session.share.popover.description.shared":
|
||||||
"Esta sesión es pública en la web. Es accesible para cualquiera con el enlace.",
|
"Esta sesión es pública en la web. Es accesible para cualquiera con el enlace.",
|
||||||
"session.share.popover.description.unshared":
|
"session.share.popover.description.unshared":
|
||||||
@@ -860,20 +721,13 @@ export const dict = {
|
|||||||
"terminal.connectionLost.title": "Conexión perdida",
|
"terminal.connectionLost.title": "Conexión perdida",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"La conexión del terminal se interrumpió. Esto puede ocurrir cuando el servidor se reinicia.",
|
"La conexión del terminal se interrumpió. Esto puede ocurrir cuando el servidor se reinicia.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"El ticket de conexión PTY fue rechazado por las comprobaciones de origen o CSRF. Comprueba la configuración CORS del servidor.",
|
|
||||||
"terminal.connectTicket.statusError": "El ticket de conexión PTY falló con {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Actualizar",
|
|
||||||
"titlebar.updateVersion": "Actualizar {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Cerrar pestaña",
|
"common.closeTab": "Cerrar pestaña",
|
||||||
"common.dismiss": "Descartar",
|
"common.dismiss": "Descartar",
|
||||||
"common.requestFailed": "Solicitud fallida",
|
"common.requestFailed": "Solicitud fallida",
|
||||||
"common.moreOptions": "Más opciones",
|
"common.moreOptions": "Más opciones",
|
||||||
"common.learnMore": "Más información",
|
"common.learnMore": "Saber más",
|
||||||
"common.rename": "Renombrar",
|
"common.rename": "Renombrar",
|
||||||
"common.export": "Exportar",
|
|
||||||
"common.reset": "Restablecer",
|
"common.reset": "Restablecer",
|
||||||
"common.archive": "Archivar",
|
"common.archive": "Archivar",
|
||||||
"common.delete": "Eliminar",
|
"common.delete": "Eliminar",
|
||||||
@@ -882,15 +736,15 @@ export const dict = {
|
|||||||
"common.loadMore": "Cargar más",
|
"common.loadMore": "Cargar más",
|
||||||
"common.key.esc": "ESC",
|
"common.key.esc": "ESC",
|
||||||
|
|
||||||
"sidebar.menu.toggle": "Mostrar u ocultar menú",
|
"sidebar.menu.toggle": "Alternar menú",
|
||||||
"sidebar.nav.projectsAndSessions": "Proyectos y sesiones",
|
"sidebar.nav.projectsAndSessions": "Proyectos y sesiones",
|
||||||
"sidebar.settings": "Ajustes",
|
"sidebar.settings": "Ajustes",
|
||||||
"sidebar.help": "Ayuda",
|
"sidebar.help": "Ayuda",
|
||||||
"sidebar.workspaces.enable": "Habilitar espacios de trabajo",
|
"sidebar.workspaces.enable": "Habilitar espacios de trabajo",
|
||||||
"sidebar.workspaces.disable": "Deshabilitar espacios de trabajo",
|
"sidebar.workspaces.disable": "Deshabilitar espacios de trabajo",
|
||||||
"sidebar.gettingStarted.title": "Primeros pasos",
|
"sidebar.gettingStarted.title": "Empezando",
|
||||||
"sidebar.gettingStarted.line1": "OpenCode incluye modelos gratuitos para que puedas empezar inmediatamente.",
|
"sidebar.gettingStarted.line1": "OpenCode incluye modelos gratuitos para que puedas empezar inmediatamente.",
|
||||||
"sidebar.gettingStarted.line2": "Conecta cualquier proveedor para usar modelos como Claude, GPT o Gemini.",
|
"sidebar.gettingStarted.line2": "Conecta cualquier proveedor para usar modelos, inc. Claude, GPT, Gemini etc.",
|
||||||
"sidebar.project.recentSessions": "Sesiones recientes",
|
"sidebar.project.recentSessions": "Sesiones recientes",
|
||||||
"sidebar.project.viewAllSessions": "Ver todas las sesiones",
|
"sidebar.project.viewAllSessions": "Ver todas las sesiones",
|
||||||
"sidebar.project.clearNotifications": "Borrar notificaciones",
|
"sidebar.project.clearNotifications": "Borrar notificaciones",
|
||||||
@@ -918,8 +772,9 @@ export const dict = {
|
|||||||
"settings.general.row.language.title": "Idioma",
|
"settings.general.row.language.title": "Idioma",
|
||||||
"settings.general.row.language.description": "Cambiar el idioma de visualización para OpenCode",
|
"settings.general.row.language.description": "Cambiar el idioma de visualización para OpenCode",
|
||||||
"settings.general.row.shell.title": "Shell del terminal",
|
"settings.general.row.shell.title": "Shell del terminal",
|
||||||
"settings.general.row.shell.description": "Shell que usan el terminal y las herramientas del agente",
|
"settings.general.row.shell.description":
|
||||||
"settings.general.row.shell.autoDefault": "Automático (predeterminado)",
|
"Elige el shell que se usará en el terminal. Los shells compatibles también se usarán para las llamadas a herramientas del agente.",
|
||||||
|
"settings.general.row.shell.autoDefault": "Automático (Predeterminado)",
|
||||||
"settings.general.row.shell.terminalOnly": "solo en el terminal",
|
"settings.general.row.shell.terminalOnly": "solo en el terminal",
|
||||||
"settings.general.row.appearance.title": "Apariencia",
|
"settings.general.row.appearance.title": "Apariencia",
|
||||||
"settings.general.row.appearance.description": "Personaliza cómo se ve OpenCode en tu dispositivo",
|
"settings.general.row.appearance.description": "Personaliza cómo se ve OpenCode en tu dispositivo",
|
||||||
@@ -953,9 +808,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Navegación inferior",
|
"settings.general.row.mobileTitlebarBottom.title": "Navegación inferior",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Colocar la barra de título y las pestañas de sesión en la parte inferior de la pantalla en dispositivos móviles",
|
"Colocar la barra de título y las pestañas de sesión en la parte inferior de la pantalla en dispositivos móviles",
|
||||||
"settings.general.row.showCustomAgents.title": "Mostrar agente",
|
"settings.general.row.showCustomAgents.title": "Agentes personalizados",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Mostrar el selector de agentes en el editor",
|
||||||
"Cambiar de agente en el editor. Si se oculta, se usa el agente Build de forma predeterminada.",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "Mostrar resúmenes de razonamiento",
|
"settings.general.row.reasoningSummaries.title": "Mostrar resúmenes de razonamiento",
|
||||||
"settings.general.row.reasoningSummaries.description":
|
"settings.general.row.reasoningSummaries.description":
|
||||||
"Mostrar resúmenes del razonamiento del modelo en la línea de tiempo",
|
"Mostrar resúmenes del razonamiento del modelo en la línea de tiempo",
|
||||||
@@ -974,9 +828,9 @@ export const dict = {
|
|||||||
"settings.general.row.newInterfaceNotice.dismiss": "Descartar",
|
"settings.general.row.newInterfaceNotice.dismiss": "Descartar",
|
||||||
"settings.general.row.pinchZoom.title": "Pellizcar para ampliar",
|
"settings.general.row.pinchZoom.title": "Pellizcar para ampliar",
|
||||||
"settings.general.row.pinchZoom.description":
|
"settings.general.row.pinchZoom.description":
|
||||||
"Permitir ampliar con el gesto de pellizco del panel táctil y con Ctrl + desplazamiento",
|
"Permitir ampliar con el gesto de pellizco del panel táctil y con Ctrl-scroll",
|
||||||
"settings.general.row.wayland.title": "Usar Wayland nativo",
|
"settings.general.row.wayland.title": "Usar Wayland nativo",
|
||||||
"settings.general.row.wayland.description": "Deshabilitar el uso alternativo de X11 en Wayland. Requiere reiniciar.",
|
"settings.general.row.wayland.description": "Deshabilitar fallback a X11 en Wayland. Requiere reinicio.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"En Linux con monitores de frecuencia de actualización mixta, Wayland nativo puede ser más estable.",
|
"En Linux con monitores de frecuencia de actualización mixta, Wayland nativo puede ser más estable.",
|
||||||
|
|
||||||
@@ -1106,7 +960,8 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.title": "Leer",
|
"settings.permissions.tool.read.title": "Leer",
|
||||||
"settings.permissions.tool.read.description": "Leer un archivo (coincide con la ruta del archivo)",
|
"settings.permissions.tool.read.description": "Leer un archivo (coincide con la ruta del archivo)",
|
||||||
"settings.permissions.tool.edit.title": "Editar",
|
"settings.permissions.tool.edit.title": "Editar",
|
||||||
"settings.permissions.tool.edit.description": "Modificar archivos mediante ediciones, escrituras y parches",
|
"settings.permissions.tool.edit.description":
|
||||||
|
"Modificar archivos, incluyendo ediciones, escrituras, parches y multi-ediciones",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Coincidir archivos usando patrones glob",
|
"settings.permissions.tool.glob.description": "Coincidir archivos usando patrones glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
@@ -1116,20 +971,20 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "Ejecutar comandos de shell",
|
"settings.permissions.tool.bash.description": "Ejecutar comandos de shell",
|
||||||
"settings.permissions.tool.task.title": "Tarea",
|
"settings.permissions.tool.task.title": "Tarea",
|
||||||
"settings.permissions.tool.task.description": "Iniciar subagentes",
|
"settings.permissions.tool.task.description": "Lanzar sub-agentes",
|
||||||
"settings.permissions.tool.skill.title": "Habilidad",
|
"settings.permissions.tool.skill.title": "Habilidad",
|
||||||
"settings.permissions.tool.skill.description": "Cargar una habilidad por nombre",
|
"settings.permissions.tool.skill.description": "Cargar una habilidad por nombre",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
"settings.permissions.tool.lsp.description": "Ejecutar consultas de servidor de lenguaje",
|
"settings.permissions.tool.lsp.description": "Ejecutar consultas de servidor de lenguaje",
|
||||||
"settings.permissions.tool.todowrite.title": "Escribir tareas",
|
"settings.permissions.tool.todowrite.title": "Escribir Todo",
|
||||||
"settings.permissions.tool.todowrite.description": "Actualizar la lista de tareas",
|
"settings.permissions.tool.todowrite.description": "Actualizar la lista de tareas",
|
||||||
"settings.permissions.tool.webfetch.title": "Obtener contenido web",
|
"settings.permissions.tool.webfetch.title": "Web Fetch",
|
||||||
"settings.permissions.tool.webfetch.description": "Obtener contenido de una URL",
|
"settings.permissions.tool.webfetch.description": "Obtener contenido de una URL",
|
||||||
"settings.permissions.tool.websearch.title": "Búsqueda web",
|
"settings.permissions.tool.websearch.title": "Búsqueda Web",
|
||||||
"settings.permissions.tool.websearch.description": "Buscar en la web",
|
"settings.permissions.tool.websearch.description": "Buscar en la web",
|
||||||
"settings.permissions.tool.external_directory.title": "Directorio externo",
|
"settings.permissions.tool.external_directory.title": "Directorio Externo",
|
||||||
"settings.permissions.tool.external_directory.description": "Acceder a archivos fuera del directorio del proyecto",
|
"settings.permissions.tool.external_directory.description": "Acceder a archivos fuera del directorio del proyecto",
|
||||||
"settings.permissions.tool.doom_loop.title": "Bucle infinito",
|
"settings.permissions.tool.doom_loop.title": "Bucle Infinito",
|
||||||
"settings.permissions.tool.doom_loop.description": "Detectar llamadas a herramientas repetidas con entrada idéntica",
|
"settings.permissions.tool.doom_loop.description": "Detectar llamadas a herramientas repetidas con entrada idéntica",
|
||||||
|
|
||||||
"session.delete.failed.title": "Fallo al eliminar sesión",
|
"session.delete.failed.title": "Fallo al eliminar sesión",
|
||||||
@@ -1143,13 +998,13 @@ export const dict = {
|
|||||||
"workspace.create.failed.title": "Fallo al crear espacio de trabajo",
|
"workspace.create.failed.title": "Fallo al crear espacio de trabajo",
|
||||||
"workspace.delete.failed.title": "Fallo al eliminar espacio de trabajo",
|
"workspace.delete.failed.title": "Fallo al eliminar espacio de trabajo",
|
||||||
"workspace.resetting.title": "Restableciendo espacio de trabajo",
|
"workspace.resetting.title": "Restableciendo espacio de trabajo",
|
||||||
"workspace.resetting.description": "Esto puede tardar un minuto.",
|
"workspace.resetting.description": "Esto puede tomar un minuto.",
|
||||||
"workspace.reset.failed.title": "Fallo al restablecer espacio de trabajo",
|
"workspace.reset.failed.title": "Fallo al restablecer espacio de trabajo",
|
||||||
"workspace.reset.success.title": "Espacio de trabajo restablecido",
|
"workspace.reset.success.title": "Espacio de trabajo restablecido",
|
||||||
"workspace.reset.success.description": "El espacio de trabajo ahora coincide con la rama predeterminada.",
|
"workspace.reset.success.description": "El espacio de trabajo ahora coincide con la rama predeterminada.",
|
||||||
"workspace.error.stillPreparing": "El espacio de trabajo aún se está preparando",
|
"workspace.error.stillPreparing": "El espacio de trabajo aún se está preparando",
|
||||||
"workspace.status.checking": "Comprobando cambios no fusionados...",
|
"workspace.status.checking": "Comprobando cambios no fusionados...",
|
||||||
"workspace.status.error": "No se pudo verificar el estado de Git.",
|
"workspace.status.error": "No se pudo verificar el estado de git.",
|
||||||
"workspace.status.clean": "No se detectaron cambios no fusionados.",
|
"workspace.status.clean": "No se detectaron cambios no fusionados.",
|
||||||
"workspace.status.dirty": "Cambios no fusionados detectados en este espacio de trabajo.",
|
"workspace.status.dirty": "Cambios no fusionados detectados en este espacio de trabajo.",
|
||||||
"workspace.delete.title": "Eliminar espacio de trabajo",
|
"workspace.delete.title": "Eliminar espacio de trabajo",
|
||||||
@@ -1191,9 +1046,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} de {{total}} preguntas",
|
"session.question.progress": "{{current}} de {{total}} preguntas",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Explorador de archivos",
|
"session.header.open.fileExplorer": "Explorador de archivos",
|
||||||
"session.header.reveal.finder": "Mostrar en Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Mostrar en el Explorador de archivos",
|
|
||||||
"session.header.reveal.containingFolder": "Abrir carpeta contenedora",
|
|
||||||
"session.header.open.fileManager": "Gestor de archivos",
|
"session.header.open.fileManager": "Gestor de archivos",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1212,13 +1064,13 @@ export const dict = {
|
|||||||
"debugBar.na": "n/d",
|
"debugBar.na": "n/d",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Última transición de ruta completada que afecta a una página de sesión, medida desde el inicio del enrutador hasta el primer renderizado tras estabilizarse.",
|
"Última transición de ruta completada tocando una página de sesión, medida desde el inicio del router hasta el primer pintado después de asentarse.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Cuadros por segundo en los últimos 5 segundos.",
|
"debugBar.fps.tip": "Cuadros por segundo en los últimos 5 segundos.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Peor tiempo de cuadro en los últimos 5 segundos.",
|
"debugBar.frame.tip": "Peor tiempo de cuadro en los últimos 5 segundos.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Cuadros superiores a 32 ms en los últimos 5 segundos.",
|
"debugBar.jank.tip": "Cuadros superiores a 32ms en los últimos 5 segundos.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip": "Tiempo bloqueado y recuento de tareas largas en los últimos 5 segundos. Tarea máx: {{max}}.",
|
"debugBar.long.tip": "Tiempo bloqueado y recuento de tareas largas en los últimos 5 segundos. Tarea máx: {{max}}.",
|
||||||
"debugBar.delay.label": "DELAY",
|
"debugBar.delay.label": "DELAY",
|
||||||
@@ -1227,18 +1079,10 @@ export const dict = {
|
|||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Duración aproximada de la interacción en los últimos 5 segundos. Esto es similar a INP, no el INP oficial de Web Vitals.",
|
"Duración aproximada de la interacción en los últimos 5 segundos. Esto es similar a INP, no el INP oficial de Web Vitals.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Cambio de diseño acumulativo durante la ejecución actual de la aplicación.",
|
"debugBar.cls.tip": "Cambio de diseño acumulativo para la vida útil actual de la aplicación.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Heap JS usado vs límite de heap. Solo Chromium.",
|
"debugBar.mem.tipUnavailable": "Heap JS usado vs límite de heap. Solo Chromium.",
|
||||||
"debugBar.mem.tip": "Heap JS usado vs límite de heap. {{used}} de {{limit}}.",
|
"debugBar.mem.tip": "Heap JS usado vs límite de heap. {{used}} de {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Forzar los estilos de foco en todos los elementos interactivos",
|
|
||||||
"debugBar.focus.on": "SÍ",
|
|
||||||
"debugBar.focus.off": "NO",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Forzar la dirección del diseño de toda la aplicación sin cambiar el idioma seleccionado",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Mayús",
|
"common.key.shift": "Mayús",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+88
-249
@@ -1,104 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Fichier",
|
|
||||||
"desktop.menu.edit": "Édition",
|
|
||||||
"desktop.menu.view": "Affichage",
|
|
||||||
"desktop.menu.go": "Aller",
|
|
||||||
"desktop.menu.window": "Fenêtre",
|
|
||||||
"desktop.menu.help": "Aide",
|
|
||||||
"desktop.menu.checkForUpdates": "Rechercher les mises à jour...",
|
|
||||||
"desktop.menu.settings": "Paramètres",
|
|
||||||
"desktop.menu.reloadWebview": "Recharger la vue Web",
|
|
||||||
"desktop.menu.restart": "Redémarrer",
|
|
||||||
"desktop.menu.exportLogs": "Exporter les journaux...",
|
|
||||||
"desktop.menu.newSession": "Nouvelle session",
|
|
||||||
"desktop.menu.openProject": "Ouvrir un projet...",
|
|
||||||
"desktop.menu.newWindow": "Nouvelle fenêtre",
|
|
||||||
"desktop.menu.closeWindow": "Fermer la fenêtre",
|
|
||||||
"desktop.menu.undo": "Annuler",
|
|
||||||
"desktop.menu.redo": "Rétablir",
|
|
||||||
"desktop.menu.cut": "Couper",
|
|
||||||
"desktop.menu.copy": "Copier",
|
|
||||||
"desktop.menu.paste": "Coller",
|
|
||||||
"desktop.menu.delete": "Supprimer",
|
|
||||||
"desktop.menu.selectAll": "Tout sélectionner",
|
|
||||||
"desktop.menu.toggleSidebar": "Afficher ou masquer la barre latérale",
|
|
||||||
"desktop.menu.toggleTerminal": "Afficher ou masquer le terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Afficher ou masquer l'arborescence des fichiers",
|
|
||||||
"desktop.menu.reload": "Recharger",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Afficher ou masquer les outils de développement",
|
|
||||||
"desktop.menu.actualSize": "Taille réelle",
|
|
||||||
"desktop.menu.zoomIn": "Zoom avant",
|
|
||||||
"desktop.menu.zoomOut": "Zoom arrière",
|
|
||||||
"desktop.menu.toggleFullScreen": "Activer ou désactiver le mode plein écran",
|
|
||||||
"desktop.menu.back": "Précédent",
|
|
||||||
"desktop.menu.forward": "Suivant",
|
|
||||||
"desktop.menu.previousSession": "Session précédente",
|
|
||||||
"desktop.menu.nextSession": "Session suivante",
|
|
||||||
"desktop.menu.previousProject": "Projet précédent",
|
|
||||||
"desktop.menu.nextProject": "Projet suivant",
|
|
||||||
"desktop.menu.minimize": "Réduire",
|
|
||||||
"desktop.menu.maximize": "Agrandir",
|
|
||||||
"desktop.menu.documentation": "Documentation d'OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Forum d'assistance",
|
|
||||||
"desktop.menu.shareFeedback": "Envoyer des commentaires",
|
|
||||||
"desktop.menu.reportBug": "Signaler un bogue",
|
|
||||||
"desktop.menu.ariaLabel": "Menu OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "La recherche de mises à jour a échoué.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Erreur de mise à jour",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Vous êtes à jour.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Aucune mise à jour",
|
|
||||||
"desktop.updater.dialog.ready.message": "La mise à jour {{version}} a été téléchargée. Redémarrer maintenant ?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Mise à jour prête",
|
|
||||||
"desktop.updater.dialog.restart": "Redémarrer",
|
|
||||||
"desktop.updater.dialog.later": "Plus tard",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Relancer",
|
|
||||||
"desktop.recovery.action.exportLogs": "Exporter les journaux",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Continuer d'attendre",
|
|
||||||
"desktop.recovery.action.quit": "Quitter",
|
|
||||||
"desktop.recovery.loadFailed": "Échec du chargement d'OpenCode",
|
|
||||||
"desktop.recovery.terminated": "La fenêtre OpenCode s'est arrêtée de manière inattendue",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode ne répond pas",
|
|
||||||
"desktop.recovery.unresponsive.detail":
|
|
||||||
"Vous pouvez relancer l'application, ouvrir les journaux ou continuer d'attendre.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Fenêtre : {{window}}\nURL : {{url}}\nErreur : {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Fenêtre : {{window}}\nMotif : {{reason}}\nCode : {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<inconnu>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Sélectionner un dossier",
|
|
||||||
"desktop.dialog.chooseFile": "Sélectionner un fichier",
|
|
||||||
"desktop.dialog.saveFile": "Enregistrer le fichier",
|
|
||||||
"desktop.dialog.files": "Fichiers",
|
|
||||||
"desktop.server.local": "Serveur local",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL est disponible uniquement sous Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL est indisponible",
|
|
||||||
"desktop.wsl.error.listInstalled": "Impossible de répertorier les distributions WSL installées",
|
|
||||||
"desktop.wsl.error.listOnline": "Impossible de répertorier les distributions WSL en ligne",
|
|
||||||
"desktop.wsl.error.executeDistro": "Impossible d'exécuter des commandes dans la distribution",
|
|
||||||
"desktop.wsl.error.installWsl": "Échec de l'installation de WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "Échec de l'installation de la distribution : {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Échec de l'installation d'OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} a déjà été ajoutée",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode n'est pas installé dans cette distribution",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode est installé, mais n'a pas pu s'exécuter",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode n'est pas installé dans {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"La mise à jour d'OpenCode est terminée, mais {{distro}} indique toujours {{installed}} au lieu de {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "aucune version",
|
|
||||||
"desktop.wsl.error.serverExited": "Le serveur WSL s'est arrêté après son démarrage (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"Le serveur WSL s'est arrêté avant d'être opérationnel (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"La vérification de l'état du processus auxiliaire pour {{distro}} a dépassé le délai de {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "{{command}} {{args}} a dépassé le délai de {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Impossible d'obtenir le port",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "Aucun fichier n'a été sélectionné dans le sélecteur",
|
|
||||||
"desktop.picker.error.sizeLimit": "Les pièces jointes sélectionnées dépassent la limite de {{limit}} Mo",
|
|
||||||
|
|
||||||
"command.category.suggested": "Suggéré",
|
"command.category.suggested": "Suggéré",
|
||||||
"command.category.view": "Affichage",
|
"command.category.view": "Affichage",
|
||||||
"command.category.project": "Projet",
|
"command.category.project": "Projet",
|
||||||
@@ -116,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Permissions",
|
"command.category.permissions": "Permissions",
|
||||||
"command.category.workspace": "Espace de travail",
|
"command.category.workspace": "Espace de travail",
|
||||||
"command.category.settings": "Paramètres",
|
"command.category.settings": "Paramètres",
|
||||||
"command.logs.export": "Exporter les journaux",
|
|
||||||
"theme.scheme.system": "Système",
|
"theme.scheme.system": "Système",
|
||||||
"theme.scheme.light": "Clair",
|
"theme.scheme.light": "Clair",
|
||||||
"theme.scheme.dark": "Sombre",
|
"theme.scheme.dark": "Sombre",
|
||||||
@@ -130,8 +29,8 @@ export const dict = {
|
|||||||
"command.settings.open": "Ouvrir les paramètres",
|
"command.settings.open": "Ouvrir les paramètres",
|
||||||
"command.session.previous": "Session précédente",
|
"command.session.previous": "Session précédente",
|
||||||
"command.session.next": "Session suivante",
|
"command.session.next": "Session suivante",
|
||||||
"command.session.previous.unseen": "Session précédente non lue",
|
"command.session.previous.unseen": "Session non lue précédente",
|
||||||
"command.session.next.unseen": "Session suivante non lue",
|
"command.session.next.unseen": "Session non lue suivante",
|
||||||
"command.session.archive": "Archiver la session",
|
"command.session.archive": "Archiver la session",
|
||||||
"command.palette": "Palette de commandes",
|
"command.palette": "Palette de commandes",
|
||||||
"command.theme.cycle": "Changer de thème",
|
"command.theme.cycle": "Changer de thème",
|
||||||
@@ -146,7 +45,7 @@ export const dict = {
|
|||||||
"command.tab.reopenClosed": "Rouvrir l'onglet fermé",
|
"command.tab.reopenClosed": "Rouvrir l'onglet fermé",
|
||||||
"command.context.addSelection": "Ajouter la sélection au contexte",
|
"command.context.addSelection": "Ajouter la sélection au contexte",
|
||||||
"command.context.addSelection.description": "Ajouter les lignes sélectionnées du fichier actuel",
|
"command.context.addSelection.description": "Ajouter les lignes sélectionnées du fichier actuel",
|
||||||
"command.input.focus": "Activer la zone de saisie",
|
"command.input.focus": "Focus sur l'entrée",
|
||||||
"command.terminal.toggle": "Basculer le terminal",
|
"command.terminal.toggle": "Basculer le terminal",
|
||||||
"command.fileTree.toggle": "Basculer l'arborescence des fichiers",
|
"command.fileTree.toggle": "Basculer l'arborescence des fichiers",
|
||||||
"command.review.toggle": "Basculer la revue",
|
"command.review.toggle": "Basculer la revue",
|
||||||
@@ -160,8 +59,8 @@ export const dict = {
|
|||||||
"command.message.next.description": "Aller au message utilisateur suivant",
|
"command.message.next.description": "Aller au message utilisateur suivant",
|
||||||
"command.model.choose": "Choisir le modèle",
|
"command.model.choose": "Choisir le modèle",
|
||||||
"command.model.choose.description": "Sélectionner un modèle différent",
|
"command.model.choose.description": "Sélectionner un modèle différent",
|
||||||
"command.mcp.toggle": "Activer ou désactiver les MCP",
|
"command.mcp.toggle": "Basculer MCP",
|
||||||
"command.mcp.toggle.description": "Activer ou désactiver les MCP",
|
"command.mcp.toggle.description": "Basculer les MCPs",
|
||||||
"command.agent.cycle": "Changer d'agent",
|
"command.agent.cycle": "Changer d'agent",
|
||||||
"command.agent.cycle.description": "Passer à l'agent suivant",
|
"command.agent.cycle.description": "Passer à l'agent suivant",
|
||||||
"command.agent.cycle.reverse": "Changer d'agent (inverse)",
|
"command.agent.cycle.reverse": "Changer d'agent (inverse)",
|
||||||
@@ -169,7 +68,7 @@ export const dict = {
|
|||||||
"command.model.variant.cycle": "Changer l'effort de réflexion",
|
"command.model.variant.cycle": "Changer l'effort de réflexion",
|
||||||
"command.model.variant.cycle.description": "Passer au niveau d'effort suivant",
|
"command.model.variant.cycle.description": "Passer au niveau d'effort suivant",
|
||||||
"command.prompt.mode.shell": "Shell",
|
"command.prompt.mode.shell": "Shell",
|
||||||
"command.prompt.mode.normal": "Invite",
|
"command.prompt.mode.normal": "Prompt",
|
||||||
"command.permissions.autoaccept.enable": "Accepter automatiquement les permissions",
|
"command.permissions.autoaccept.enable": "Accepter automatiquement les permissions",
|
||||||
"command.permissions.autoaccept.disable": "Arrêter d'accepter automatiquement les permissions",
|
"command.permissions.autoaccept.disable": "Arrêter d'accepter automatiquement les permissions",
|
||||||
"command.workspace.toggle": "Basculer les espaces de travail",
|
"command.workspace.toggle": "Basculer les espaces de travail",
|
||||||
@@ -186,9 +85,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "Partager cette session et copier l'URL dans le presse-papiers",
|
"command.session.share.description": "Partager cette session et copier l'URL dans le presse-papiers",
|
||||||
"command.session.unshare": "Ne plus partager la session",
|
"command.session.unshare": "Ne plus partager la session",
|
||||||
"command.session.unshare.description": "Arrêter de partager cette session",
|
"command.session.unshare.description": "Arrêter de partager cette session",
|
||||||
"command.session.export": "Exporter la session",
|
|
||||||
"command.session.export.description": "Exporter la transcription intégrale de la session au format JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Rechercher des fichiers, des commandes et des sessions",
|
"palette.search.placeholder": "Rechercher des fichiers, des commandes et des sessions",
|
||||||
"palette.search.placeholder.home": "Rechercher des commandes et des sessions",
|
"palette.search.placeholder.home": "Rechercher des commandes et des sessions",
|
||||||
"palette.empty": "Aucun résultat trouvé",
|
"palette.empty": "Aucun résultat trouvé",
|
||||||
@@ -196,9 +92,8 @@ export const dict = {
|
|||||||
"palette.group.files": "Fichiers",
|
"palette.group.files": "Fichiers",
|
||||||
"dialog.provider.search.placeholder": "Rechercher des fournisseurs",
|
"dialog.provider.search.placeholder": "Rechercher des fournisseurs",
|
||||||
"dialog.provider.empty": "Aucun fournisseur trouvé",
|
"dialog.provider.empty": "Aucun fournisseur trouvé",
|
||||||
"dialog.provider.group.popular": "Populaires",
|
"dialog.provider.group.popular": "Populaire",
|
||||||
"dialog.provider.group.other": "Autres",
|
"dialog.provider.group.other": "Autre",
|
||||||
"dialog.provider.custom.label": "Fournisseur personnalisé compatible avec OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "Recommandé",
|
"dialog.provider.tag.recommended": "Recommandé",
|
||||||
"dialog.provider.opencode.note": "Modèles sélectionnés incluant Claude, GPT, Gemini et plus",
|
"dialog.provider.opencode.note": "Modèles sélectionnés incluant Claude, GPT, Gemini et plus",
|
||||||
"dialog.provider.opencode.tagline": "Modèles optimisés et fiables",
|
"dialog.provider.opencode.tagline": "Modèles optimisés et fiables",
|
||||||
@@ -214,17 +109,14 @@ export const dict = {
|
|||||||
"dialog.model.empty": "Aucun résultat de modèle",
|
"dialog.model.empty": "Aucun résultat de modèle",
|
||||||
"dialog.model.manage": "Gérer les modèles",
|
"dialog.model.manage": "Gérer les modèles",
|
||||||
"dialog.model.manage.description": "Personnalisez les modèles qui apparaissent dans le sélecteur.",
|
"dialog.model.manage.description": "Personnalisez les modèles qui apparaissent dans le sélecteur.",
|
||||||
"dialog.model.manage.provider.toggle": "Activer ou désactiver tous les modèles {{provider}}",
|
"dialog.model.manage.provider.toggle": "Basculer tous les modèles {{provider}}",
|
||||||
"dialog.model.unpaid.freeModels.title": "Modèles gratuits fournis par OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Modèles gratuits fournis par OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Ajouter plus de modèles de fournisseurs populaires",
|
"dialog.model.unpaid.addMore.title": "Ajouter plus de modèles de fournisseurs populaires",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Voir plus de 70 autres fournisseurs",
|
|
||||||
"dialog.provider.viewAll": "Voir plus de fournisseurs",
|
"dialog.provider.viewAll": "Voir plus de fournisseurs",
|
||||||
"provider.connect.title": "Connecter {{provider}}",
|
"provider.connect.title": "Connecter {{provider}}",
|
||||||
"provider.connect.title.anthropicProMax": "Connexion avec Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Connexion avec Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Sélectionnez la méthode de connexion pour {{provider}}.",
|
"provider.connect.selectMethod": "Sélectionnez la méthode de connexion pour {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "Clé API",
|
"provider.connect.method.apiKey": "Clé API",
|
||||||
"provider.connect.method.browser": "Navigateur",
|
|
||||||
"provider.connect.method.headless": "Mode headless",
|
|
||||||
"provider.connect.status.inProgress": "Autorisation en cours...",
|
"provider.connect.status.inProgress": "Autorisation en cours...",
|
||||||
"provider.connect.status.waiting": "En attente d'autorisation...",
|
"provider.connect.status.waiting": "En attente d'autorisation...",
|
||||||
"provider.connect.status.failed": "Échec de l'autorisation : {{error}}",
|
"provider.connect.status.failed": "Échec de l'autorisation : {{error}}",
|
||||||
@@ -256,22 +148,19 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "{{provider}} connecté",
|
"provider.connect.toast.connected.title": "{{provider}} connecté",
|
||||||
"provider.connect.toast.connected.description": "Les modèles {{provider}} sont maintenant disponibles.",
|
"provider.connect.toast.connected.description": "Les modèles {{provider}} sont maintenant disponibles.",
|
||||||
"provider.custom.title": "Fournisseur personnalisé",
|
"provider.custom.title": "Fournisseur personnalisé",
|
||||||
"provider.custom.unavailable": "Les fournisseurs personnalisés ne sont pas disponibles sur ce serveur",
|
"provider.custom.description.prefix": "Configurer un fournisseur compatible OpenAI. Voir la ",
|
||||||
"provider.custom.description.prefix": "Configurez un fournisseur compatible avec OpenAI. Consultez la ",
|
"provider.custom.description.link": "doc de config fournisseur",
|
||||||
"provider.custom.description.link": "documentation sur la configuration des fournisseurs",
|
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
"provider.custom.field.providerID.label": "ID du fournisseur",
|
"provider.custom.field.providerID.label": "ID du fournisseur",
|
||||||
"provider.custom.field.providerID.placeholder": "monfournisseur",
|
"provider.custom.field.providerID.placeholder": "monfournisseur",
|
||||||
"provider.custom.field.providerID.description":
|
"provider.custom.field.providerID.description": "Lettres minuscules, chiffres, traits d'union ou tirets bas",
|
||||||
"Lettres minuscules, chiffres, traits d'union ou traits de soulignement",
|
|
||||||
"provider.custom.field.name.label": "Nom d'affichage",
|
"provider.custom.field.name.label": "Nom d'affichage",
|
||||||
"provider.custom.field.name.placeholder": "Mon fournisseur IA",
|
"provider.custom.field.name.placeholder": "Mon fournisseur IA",
|
||||||
"provider.custom.field.baseURL.label": "URL de base",
|
"provider.custom.field.baseURL.label": "URL de base",
|
||||||
"provider.custom.field.baseURL.placeholder": "https://api.monfournisseur.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.monfournisseur.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "Clé API",
|
"provider.custom.field.apiKey.label": "Clé API",
|
||||||
"provider.custom.field.apiKey.placeholder": "Clé API",
|
"provider.custom.field.apiKey.placeholder": "Clé API",
|
||||||
"provider.custom.field.apiKey.description":
|
"provider.custom.field.apiKey.description": "Optionnel. Laisser vide si vous gérez l'auth via les en-têtes.",
|
||||||
"Facultatif. Laissez ce champ vide si vous gérez l'authentification au moyen des en-têtes.",
|
|
||||||
"provider.custom.models.label": "Modèles",
|
"provider.custom.models.label": "Modèles",
|
||||||
"provider.custom.models.id.label": "ID",
|
"provider.custom.models.id.label": "ID",
|
||||||
"provider.custom.models.id.placeholder": "id-modele",
|
"provider.custom.models.id.placeholder": "id-modele",
|
||||||
@@ -287,8 +176,7 @@ export const dict = {
|
|||||||
"provider.custom.headers.remove": "Supprimer l'en-tête",
|
"provider.custom.headers.remove": "Supprimer l'en-tête",
|
||||||
"provider.custom.headers.add": "Ajouter un en-tête",
|
"provider.custom.headers.add": "Ajouter un en-tête",
|
||||||
"provider.custom.error.providerID.required": "L'ID du fournisseur est requis",
|
"provider.custom.error.providerID.required": "L'ID du fournisseur est requis",
|
||||||
"provider.custom.error.providerID.format":
|
"provider.custom.error.providerID.format": "Utilisez des lettres minuscules, chiffres, traits d'union ou tirets bas",
|
||||||
"Utilisez des lettres minuscules, des chiffres, des traits d'union ou des traits de soulignement",
|
|
||||||
"provider.custom.error.providerID.exists": "Cet ID de fournisseur existe déjà",
|
"provider.custom.error.providerID.exists": "Cet ID de fournisseur existe déjà",
|
||||||
"provider.custom.error.name.required": "Le nom d'affichage est requis",
|
"provider.custom.error.name.required": "Le nom d'affichage est requis",
|
||||||
"provider.custom.error.baseURL.required": "L'URL de base est requise",
|
"provider.custom.error.baseURL.required": "L'URL de base est requise",
|
||||||
@@ -298,7 +186,7 @@ export const dict = {
|
|||||||
"provider.disconnect.toast.disconnected.title": "{{provider}} déconnecté",
|
"provider.disconnect.toast.disconnected.title": "{{provider}} déconnecté",
|
||||||
"provider.disconnect.toast.disconnected.description": "Les modèles {{provider}} ne sont plus disponibles.",
|
"provider.disconnect.toast.disconnected.description": "Les modèles {{provider}} ne sont plus disponibles.",
|
||||||
"model.tag.free": "Gratuit",
|
"model.tag.free": "Gratuit",
|
||||||
"model.tag.latest": "Le plus récent",
|
"model.tag.latest": "Dernier",
|
||||||
"model.provider.anthropic": "Anthropic",
|
"model.provider.anthropic": "Anthropic",
|
||||||
"model.provider.openai": "OpenAI",
|
"model.provider.openai": "OpenAI",
|
||||||
"model.provider.google": "Google",
|
"model.provider.google": "Google",
|
||||||
@@ -309,29 +197,29 @@ export const dict = {
|
|||||||
"model.input.audio": "audio",
|
"model.input.audio": "audio",
|
||||||
"model.input.video": "vidéo",
|
"model.input.video": "vidéo",
|
||||||
"model.input.pdf": "pdf",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "Formats pris en charge : {{inputs}}",
|
"model.tooltip.allows": "Autorise : {{inputs}}",
|
||||||
"model.tooltip.context.label": "Contexte",
|
"model.tooltip.context.label": "Contexte",
|
||||||
"model.tooltip.inputs": "Entrées",
|
"model.tooltip.inputs": "Entrées",
|
||||||
"model.tooltip.model": "Modèle",
|
"model.tooltip.model": "Modèle",
|
||||||
"model.tooltip.provider": "Fournisseur",
|
"model.tooltip.provider": "Fournisseur",
|
||||||
"model.tooltip.reasoning": "Raisonnement",
|
"model.tooltip.reasoning": "Raisonnement",
|
||||||
"model.tooltip.reasoning.allowed": "Raisonnement pris en charge",
|
"model.tooltip.reasoning.allowed": "Autorise le raisonnement",
|
||||||
"model.tooltip.reasoning.none": "Sans raisonnement",
|
"model.tooltip.reasoning.none": "Sans raisonnement",
|
||||||
"model.tooltip.context": "Limite de contexte {{limit}}",
|
"model.tooltip.context": "Limite de contexte {{limit}}",
|
||||||
"common.search.placeholder": "Rechercher",
|
"common.search.placeholder": "Rechercher",
|
||||||
"common.goBack": "Retour",
|
"common.goBack": "Retour",
|
||||||
"common.goForward": "Suivant",
|
"common.goForward": "Avancer",
|
||||||
"common.loading": "Chargement",
|
"common.loading": "Chargement",
|
||||||
"common.loading.ellipsis": "...",
|
"common.loading.ellipsis": "...",
|
||||||
"common.cancel": "Annuler",
|
"common.cancel": "Annuler",
|
||||||
"common.clear": "Effacer",
|
"common.clear": "Effacer",
|
||||||
"common.connect": "Connecter",
|
"common.connect": "Connecter",
|
||||||
"common.disconnect": "Déconnecter",
|
"common.disconnect": "Déconnecter",
|
||||||
"common.continue": "Continuer",
|
"common.continue": "Soumettre",
|
||||||
"common.submit": "Soumettre",
|
"common.submit": "Soumettre",
|
||||||
"common.save": "Enregistrer",
|
"common.save": "Enregistrer",
|
||||||
"common.saving": "Enregistrement...",
|
"common.saving": "Enregistrement...",
|
||||||
"common.default": "Par défaut",
|
"common.default": "Défaut",
|
||||||
"common.attachment": "pièce jointe",
|
"common.attachment": "pièce jointe",
|
||||||
"prompt.placeholder.shell": "Entrez une commande shell... {{example}}",
|
"prompt.placeholder.shell": "Entrez une commande shell... {{example}}",
|
||||||
"prompt.placeholder.normal": 'Demandez n\'importe quoi... "{{example}}"',
|
"prompt.placeholder.normal": 'Demandez n\'importe quoi... "{{example}}"',
|
||||||
@@ -339,8 +227,8 @@ export const dict = {
|
|||||||
"prompt.placeholder.summarizeComments": "Résumer les commentaires…",
|
"prompt.placeholder.summarizeComments": "Résumer les commentaires…",
|
||||||
"prompt.placeholder.summarizeComment": "Résumer le commentaire…",
|
"prompt.placeholder.summarizeComment": "Résumer le commentaire…",
|
||||||
"prompt.mode.shell": "Shell",
|
"prompt.mode.shell": "Shell",
|
||||||
"prompt.mode.normal": "Invite",
|
"prompt.mode.normal": "Prompt",
|
||||||
"prompt.mode.shell.exit": "Échap pour quitter",
|
"prompt.mode.shell.exit": "esc pour quitter",
|
||||||
"session.child.promptDisabled": "Les sessions de sous-agents ne peuvent pas recevoir de messages.",
|
"session.child.promptDisabled": "Les sessions de sous-agents ne peuvent pas recevoir de messages.",
|
||||||
"session.child.backToParent": "Revenir à la session principale.",
|
"session.child.backToParent": "Revenir à la session principale.",
|
||||||
"prompt.example.1": "Corriger un TODO dans la base de code",
|
"prompt.example.1": "Corriger un TODO dans la base de code",
|
||||||
@@ -349,7 +237,7 @@ export const dict = {
|
|||||||
"prompt.example.4": "Expliquer comment fonctionne l'authentification",
|
"prompt.example.4": "Expliquer comment fonctionne l'authentification",
|
||||||
"prompt.example.5": "Trouver et corriger les vulnérabilités de sécurité",
|
"prompt.example.5": "Trouver et corriger les vulnérabilités de sécurité",
|
||||||
"prompt.example.6": "Ajouter des tests unitaires pour le service utilisateur",
|
"prompt.example.6": "Ajouter des tests unitaires pour le service utilisateur",
|
||||||
"prompt.example.7": "Refactoriser cette fonction pour la rendre plus lisible",
|
"prompt.example.7": "Refactoriser cette fonction pour être plus lisible",
|
||||||
"prompt.example.8": "Que signifie cette erreur ?",
|
"prompt.example.8": "Que signifie cette erreur ?",
|
||||||
"prompt.example.9": "Aidez-moi à déboguer ce problème",
|
"prompt.example.9": "Aidez-moi à déboguer ce problème",
|
||||||
"prompt.example.10": "Générer la documentation de l'API",
|
"prompt.example.10": "Générer la documentation de l'API",
|
||||||
@@ -357,11 +245,11 @@ export const dict = {
|
|||||||
"prompt.example.12": "Ajouter une validation d'entrée",
|
"prompt.example.12": "Ajouter une validation d'entrée",
|
||||||
"prompt.example.13": "Créer un nouveau composant pour...",
|
"prompt.example.13": "Créer un nouveau composant pour...",
|
||||||
"prompt.example.14": "Comment déployer ce projet ?",
|
"prompt.example.14": "Comment déployer ce projet ?",
|
||||||
"prompt.example.15": "Vérifier que mon code respecte les bonnes pratiques",
|
"prompt.example.15": "Vérifier mon code pour les meilleures pratiques",
|
||||||
"prompt.example.16": "Ajouter la gestion des erreurs à cette fonction",
|
"prompt.example.16": "Ajouter la gestion des erreurs à cette fonction",
|
||||||
"prompt.example.17": "Expliquer cette expression régulière",
|
"prompt.example.17": "Expliquer ce modèle regex",
|
||||||
"prompt.example.18": "Convertir ceci en TypeScript",
|
"prompt.example.18": "Convertir ceci en TypeScript",
|
||||||
"prompt.example.19": "Ajouter une journalisation dans toute la base de code",
|
"prompt.example.19": "Ajouter des logs dans toute la base de code",
|
||||||
"prompt.example.20": "Quelles dépendances sont obsolètes ?",
|
"prompt.example.20": "Quelles dépendances sont obsolètes ?",
|
||||||
"prompt.example.21": "Aidez-moi à écrire un script de migration",
|
"prompt.example.21": "Aidez-moi à écrire un script de migration",
|
||||||
"prompt.example.22": "Implémenter la mise en cache pour ce point de terminaison",
|
"prompt.example.22": "Implémenter la mise en cache pour ce point de terminaison",
|
||||||
@@ -373,7 +261,7 @@ export const dict = {
|
|||||||
"prompt.dropzone.label": "Déposez des images, des PDF ou des fichiers texte ici",
|
"prompt.dropzone.label": "Déposez des images, des PDF ou des fichiers texte ici",
|
||||||
"prompt.dropzone.file.label": "Déposez pour @mentionner le fichier",
|
"prompt.dropzone.file.label": "Déposez pour @mentionner le fichier",
|
||||||
"prompt.slash.badge.custom": "personnalisé",
|
"prompt.slash.badge.custom": "personnalisé",
|
||||||
"prompt.slash.badge.skill": "compétence",
|
"prompt.slash.badge.skill": "skill",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
"prompt.context.active": "actif",
|
"prompt.context.active": "actif",
|
||||||
"prompt.context.includeActiveFile": "Inclure le fichier actif",
|
"prompt.context.includeActiveFile": "Inclure le fichier actif",
|
||||||
@@ -393,21 +281,21 @@ export const dict = {
|
|||||||
"prompt.toast.pasteUnsupported.description":
|
"prompt.toast.pasteUnsupported.description":
|
||||||
"Seules les images, les PDF ou les fichiers texte peuvent être joints ici.",
|
"Seules les images, les PDF ou les fichiers texte peuvent être joints ici.",
|
||||||
"prompt.toast.modelAgentRequired.title": "Sélectionnez un agent et un modèle",
|
"prompt.toast.modelAgentRequired.title": "Sélectionnez un agent et un modèle",
|
||||||
"prompt.toast.modelAgentRequired.description": "Choisissez un agent et un modèle avant d'envoyer une invite.",
|
"prompt.toast.modelAgentRequired.description": "Choisissez un agent et un modèle avant d'envoyer un message.",
|
||||||
"prompt.toast.worktreeCreateFailed.title": "Échec de la création de l'arbre de travail",
|
"prompt.toast.worktreeCreateFailed.title": "Échec de la création de l'arbre de travail",
|
||||||
"prompt.toast.sessionCreateFailed.title": "Échec de la création de la session",
|
"prompt.toast.sessionCreateFailed.title": "Échec de la création de la session",
|
||||||
"prompt.toast.shellSendFailed.title": "Échec de l'envoi de la commande shell",
|
"prompt.toast.shellSendFailed.title": "Échec de l'envoi de la commande shell",
|
||||||
"prompt.toast.commandSendFailed.title": "Échec de l'envoi de la commande",
|
"prompt.toast.commandSendFailed.title": "Échec de l'envoi de la commande",
|
||||||
"prompt.toast.promptSendFailed.title": "Échec de l'envoi de l'invite",
|
"prompt.toast.promptSendFailed.title": "Échec de l'envoi du message",
|
||||||
"prompt.toast.promptSendFailed.description": "Impossible de récupérer la session",
|
"prompt.toast.promptSendFailed.description": "Impossible de récupérer la session",
|
||||||
"dialog.mcp.title": "MCP",
|
"dialog.mcp.title": "MCPs",
|
||||||
"dialog.mcp.description": "MCP actifs : {{enabled}} sur {{total}}",
|
"dialog.mcp.description": "{{enabled}} sur {{total}} activés",
|
||||||
"dialog.mcp.empty": "Aucun MCP configuré",
|
"dialog.mcp.empty": "Aucun MCP configuré",
|
||||||
"dialog.lsp.empty": "Serveurs LSP détectés automatiquement selon le type de fichier",
|
"dialog.lsp.empty": "LSPs détectés automatiquement par type de fichier",
|
||||||
"dialog.plugins.empty": "Extensions configurées dans opencode.json",
|
"dialog.plugins.empty": "Plugins configurés dans opencode.json",
|
||||||
"mcp.status.connected": "connecté",
|
"mcp.status.connected": "connecté",
|
||||||
"mcp.status.failed": "en échec",
|
"mcp.status.failed": "échoué",
|
||||||
"mcp.status.needs_auth": "authentification requise",
|
"mcp.status.needs_auth": "nécessite auth",
|
||||||
"mcp.auth.clickToAuthenticate": "Cliquez pour vous authentifier",
|
"mcp.auth.clickToAuthenticate": "Cliquez pour vous authentifier",
|
||||||
"mcp.status.disabled": "désactivé",
|
"mcp.status.disabled": "désactivé",
|
||||||
"dialog.fork.empty": "Aucun message à partir duquel bifurquer",
|
"dialog.fork.empty": "Aucun message à partir duquel bifurquer",
|
||||||
@@ -442,7 +330,7 @@ export const dict = {
|
|||||||
"dialog.server.action.remove": "Supprimer le serveur",
|
"dialog.server.action.remove": "Supprimer le serveur",
|
||||||
"dialog.server.menu.edit": "Modifier",
|
"dialog.server.menu.edit": "Modifier",
|
||||||
"dialog.server.menu.default": "Définir par défaut",
|
"dialog.server.menu.default": "Définir par défaut",
|
||||||
"dialog.server.menu.defaultRemove": "Ne plus utiliser par défaut",
|
"dialog.server.menu.defaultRemove": "Supprimer par défaut",
|
||||||
"dialog.server.menu.delete": "Supprimer",
|
"dialog.server.menu.delete": "Supprimer",
|
||||||
"dialog.server.current": "Serveur actuel",
|
"dialog.server.current": "Serveur actuel",
|
||||||
"dialog.server.status.default": "Défaut",
|
"dialog.server.status.default": "Défaut",
|
||||||
@@ -512,25 +400,9 @@ export const dict = {
|
|||||||
"wsl.onboarding.notFound": "introuvable",
|
"wsl.onboarding.notFound": "introuvable",
|
||||||
"wsl.onboarding.version": "Version : {{version}}",
|
"wsl.onboarding.version": "Version : {{version}}",
|
||||||
"wsl.onboarding.unknown": "inconnue",
|
"wsl.onboarding.unknown": "inconnue",
|
||||||
"wsl.onboarding.desktopVersion": "application de bureau {{version}}",
|
"wsl.onboarding.desktopVersion": "desktop {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "La version installée ne correspond pas à celle de l'application de bureau.",
|
"wsl.onboarding.versionMismatch": "La version installée ne correspond pas à celle de l'application desktop.",
|
||||||
"wsl.onboarding.adding": "Ajout...",
|
"wsl.onboarding.adding": "Ajout...",
|
||||||
"help.tabs.toast.ariaLabel":
|
|
||||||
"Présentation des onglets. Organisez votre travail et vos sessions actives à l'aide d'onglets",
|
|
||||||
"help.tabs.toast.dismiss": "Ignorer les informations sur les onglets",
|
|
||||||
"help.tabs.title": "Présentation des onglets",
|
|
||||||
"help.tabs.description": "Organisez votre travail et vos sessions actives à l'aide d'onglets",
|
|
||||||
"help.tabs.date": "14 juillet",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop s'articule désormais autour d'onglets.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Démarrez une nouvelle session dans un onglet ou ouvrez une session existante depuis l'un de vos projets. Ouvrez un nouvel onglet lorsque vous commencez une nouvelle tâche et fermez-le une fois celle-ci terminée.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Garder quelques onglets ouverts facilite l'organisation de vos sessions actives. Si vous comptez les conserver, renommez-les pour pouvoir les reconnaître facilement.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Vous trouverez toutes vos sessions et tous vos projets sur le nouvel écran d'accueil. La sélection d'une session l'ouvre dans un onglet.",
|
|
||||||
"help.tabs.persistence": "Lorsque vous rouvrez l'application, vos onglets sont toujours ouverts.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"La nouvelle interface ne prend pas encore en charge les arbres de travail Git, mais cette fonctionnalité sera bientôt disponible. Si vous préférez continuer à utiliser la mise en page précédente, vous pouvez changer de mise en page dans les paramètres. N'oubliez pas que la nouvelle mise en page deviendra définitive dans quelques semaines.",
|
|
||||||
"dialog.project.edit.title": "Modifier le projet",
|
"dialog.project.edit.title": "Modifier le projet",
|
||||||
"dialog.project.edit.name": "Nom",
|
"dialog.project.edit.name": "Nom",
|
||||||
"dialog.project.edit.icon": "Icône",
|
"dialog.project.edit.icon": "Icône",
|
||||||
@@ -543,20 +415,16 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup.description":
|
"dialog.project.edit.worktree.startup.description":
|
||||||
"S'exécute après la création d'un nouvel espace de travail (arbre de travail).",
|
"S'exécute après la création d'un nouvel espace de travail (arbre de travail).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "p. ex. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "p. ex. bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Ne plus afficher",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Répartition du contexte",
|
"context.breakdown.title": "Répartition du contexte",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
"Répartition approximative des jetons d'entrée. \"Autre\" inclut les définitions d'outils et les données annexes.",
|
"Répartition approximative des jetons d'entrée. \"Autre\" inclut les définitions d'outils et les frais généraux.",
|
||||||
"context.breakdown.system": "Système",
|
"context.breakdown.system": "Système",
|
||||||
"context.breakdown.user": "Utilisateur",
|
"context.breakdown.user": "Utilisateur",
|
||||||
"context.breakdown.assistant": "Assistant",
|
"context.breakdown.assistant": "Assistant",
|
||||||
"context.breakdown.tool": "Appels d'outils",
|
"context.breakdown.tool": "Appels d'outils",
|
||||||
"context.breakdown.other": "Autre",
|
"context.breakdown.other": "Autre",
|
||||||
"context.systemPrompt.title": "Invite système",
|
"context.systemPrompt.title": "Prompt système",
|
||||||
"context.rawMessages.title": "Messages bruts",
|
"context.rawMessages.title": "Messages bruts",
|
||||||
"context.export.session": "Exporter la session",
|
|
||||||
|
|
||||||
"context.stats.session": "Session",
|
"context.stats.session": "Session",
|
||||||
"context.stats.messages": "Messages",
|
"context.stats.messages": "Messages",
|
||||||
"context.stats.provider": "Fournisseur",
|
"context.stats.provider": "Fournisseur",
|
||||||
@@ -569,7 +437,7 @@ export const dict = {
|
|||||||
"context.stats.reasoningTokens": "Jetons de raisonnement",
|
"context.stats.reasoningTokens": "Jetons de raisonnement",
|
||||||
"context.stats.cacheTokens": "Jetons de cache (lecture/écriture)",
|
"context.stats.cacheTokens": "Jetons de cache (lecture/écriture)",
|
||||||
"context.stats.userMessages": "Messages utilisateur",
|
"context.stats.userMessages": "Messages utilisateur",
|
||||||
"context.stats.assistantMessages": "Messages de l'assistant",
|
"context.stats.assistantMessages": "Messages assistant",
|
||||||
"context.stats.totalCost": "Coût total",
|
"context.stats.totalCost": "Coût total",
|
||||||
"context.stats.sessionCreated": "Session créée",
|
"context.stats.sessionCreated": "Session créée",
|
||||||
"context.stats.lastActivity": "Dernière activité",
|
"context.stats.lastActivity": "Dernière activité",
|
||||||
@@ -597,16 +465,16 @@ export const dict = {
|
|||||||
"language.th": "ไทย",
|
"language.th": "ไทย",
|
||||||
"language.tr": "Türkçe",
|
"language.tr": "Türkçe",
|
||||||
"toast.language.title": "Langue",
|
"toast.language.title": "Langue",
|
||||||
"toast.language.description": "Langue définie sur {{language}}",
|
"toast.language.description": "Passé à {{language}}",
|
||||||
"toast.theme.title": "Thème changé",
|
"toast.theme.title": "Thème changé",
|
||||||
"toast.scheme.title": "Schéma de couleurs",
|
"toast.scheme.title": "Schéma de couleurs",
|
||||||
"toast.workspace.enabled.title": "Espaces de travail activés",
|
"toast.workspace.enabled.title": "Espaces de travail activés",
|
||||||
"toast.workspace.enabled.description": "Plusieurs arbres de travail sont désormais affichés dans la barre latérale",
|
"toast.workspace.enabled.description": "Plusieurs worktrees sont désormais affichés dans la barre latérale",
|
||||||
"toast.workspace.disabled.title": "Espaces de travail désactivés",
|
"toast.workspace.disabled.title": "Espaces de travail désactivés",
|
||||||
"toast.workspace.disabled.description": "Seul l'arbre de travail principal est affiché dans la barre latérale",
|
"toast.workspace.disabled.description": "Seul le worktree principal est affiché dans la barre latérale",
|
||||||
"toast.permissions.autoaccept.on.title": "Acceptation automatique des permissions",
|
"toast.permissions.autoaccept.on.title": "Acceptation automatique des permissions",
|
||||||
"toast.permissions.autoaccept.on.description": "Les demandes de permission seront approuvées automatiquement",
|
"toast.permissions.autoaccept.on.description": "Les demandes de permission seront approuvées automatiquement",
|
||||||
"toast.permissions.autoaccept.off.title": "Acceptation automatique des permissions désactivée",
|
"toast.permissions.autoaccept.off.title": "Acceptation automatique des permissions arrêtée",
|
||||||
"toast.permissions.autoaccept.off.description": "Les demandes de permission nécessiteront une approbation",
|
"toast.permissions.autoaccept.off.description": "Les demandes de permission nécessiteront une approbation",
|
||||||
"toast.model.none.title": "Aucun modèle sélectionné",
|
"toast.model.none.title": "Aucun modèle sélectionné",
|
||||||
"toast.model.none.description": "Connectez un fournisseur pour résumer cette session",
|
"toast.model.none.description": "Connectez un fournisseur pour résumer cette session",
|
||||||
@@ -619,23 +487,17 @@ export const dict = {
|
|||||||
"toast.session.share.success.description": "URL de partage copiée dans le presse-papiers !",
|
"toast.session.share.success.description": "URL de partage copiée dans le presse-papiers !",
|
||||||
"toast.session.share.failed.title": "Échec du partage de la session",
|
"toast.session.share.failed.title": "Échec du partage de la session",
|
||||||
"toast.session.share.failed.description": "Une erreur s'est produite lors du partage de la session",
|
"toast.session.share.failed.description": "Une erreur s'est produite lors du partage de la session",
|
||||||
"toast.session.unshare.success.title": "Partage de la session désactivé",
|
"toast.session.unshare.success.title": "Session non partagée",
|
||||||
"toast.session.unshare.success.description": "Le partage de la session a bien été désactivé.",
|
"toast.session.unshare.success.description": "Session non partagée avec succès !",
|
||||||
"toast.session.unshare.failed.title": "Échec de la désactivation du partage",
|
"toast.session.unshare.failed.title": "Échec de l'annulation du partage",
|
||||||
"toast.session.unshare.failed.description":
|
"toast.session.unshare.failed.description": "Une erreur s'est produite lors de l'annulation du partage de la session",
|
||||||
"Une erreur s'est produite lors de la désactivation du partage de la session",
|
|
||||||
"toast.session.export.success.title": "Session exportée",
|
|
||||||
"toast.session.export.success.description": "Session enregistrée dans {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Échec de l’exportation de la session",
|
|
||||||
"toast.session.export.failed.description": "Une erreur s’est produite lors de l’exportation de la session",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}",
|
"toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}",
|
||||||
"toast.update.title": "Mise à jour disponible",
|
"toast.update.title": "Mise à jour disponible",
|
||||||
"toast.update.description":
|
"toast.update.description":
|
||||||
"Une nouvelle version d'OpenCode ({{version}}) est maintenant disponible pour installation.",
|
"Une nouvelle version d'OpenCode ({{version}}) est maintenant disponible pour installation.",
|
||||||
"toast.update.action.installRestart": "Installer et redémarrer",
|
"toast.update.action.installRestart": "Installer et redémarrer",
|
||||||
"toast.update.action.notYet": "Plus tard",
|
"toast.update.action.notYet": "Pas encore",
|
||||||
"error.page.title": "Un problème est survenu",
|
"error.page.title": "Quelque chose s'est mal passé",
|
||||||
"error.page.description": "Une erreur s'est produite lors du chargement de l'application.",
|
"error.page.description": "Une erreur s'est produite lors du chargement de l'application.",
|
||||||
"error.page.description.localServerStartup": "Une erreur s'est produite lors du démarrage du serveur local.",
|
"error.page.description.localServerStartup": "Une erreur s'est produite lors du démarrage du serveur local.",
|
||||||
"error.page.details.label": "Détails de l'erreur",
|
"error.page.details.label": "Détails de l'erreur",
|
||||||
@@ -658,13 +520,13 @@ export const dict = {
|
|||||||
"error.chain.causedBy": "Causé par :",
|
"error.chain.causedBy": "Causé par :",
|
||||||
"error.chain.apiError": "Erreur API",
|
"error.chain.apiError": "Erreur API",
|
||||||
"error.chain.status": "Statut : {{status}}",
|
"error.chain.status": "Statut : {{status}}",
|
||||||
"error.chain.retryable": "Nouvelle tentative possible : {{retryable}}",
|
"error.chain.retryable": "Réessayable : {{retryable}}",
|
||||||
"error.chain.responseBody": "Corps de la réponse :\n{{body}}",
|
"error.chain.responseBody": "Corps de la réponse :\n{{body}}",
|
||||||
"error.chain.didYouMean": "Vouliez-vous dire : {{suggestions}}",
|
"error.chain.didYouMean": "Vouliez-vous dire : {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Modèle introuvable : {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Modèle introuvable : {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Vérifiez les noms de fournisseur et de modèle dans votre configuration (opencode.json)",
|
"error.chain.checkConfig": "Vérifiez votre configuration (opencode.json) pour les noms de fournisseur/modèle",
|
||||||
"error.chain.mcpFailed":
|
"error.chain.mcpFailed":
|
||||||
"Le serveur MCP \"{{name}}\" a échoué. Notez qu'OpenCode ne prend pas encore en charge l'authentification MCP.",
|
"Le serveur MCP \"{{name}}\" a échoué. Notez qu'OpenCode ne supporte pas encore l'authentification MCP.",
|
||||||
"error.chain.providerAuthFailed": "Échec de l'authentification du fournisseur ({{provider}}) : {{message}}",
|
"error.chain.providerAuthFailed": "Échec de l'authentification du fournisseur ({{provider}}) : {{message}}",
|
||||||
"error.chain.providerInitFailed":
|
"error.chain.providerInitFailed":
|
||||||
'Échec de l\'initialisation du fournisseur "{{provider}}". Vérifiez les identifiants et la configuration.',
|
'Échec de l\'initialisation du fournisseur "{{provider}}". Vérifiez les identifiants et la configuration.',
|
||||||
@@ -673,7 +535,7 @@ export const dict = {
|
|||||||
"Le fichier de configuration à {{path}} n'est pas un JSON(C) valide : {{message}}",
|
"Le fichier de configuration à {{path}} n'est pas un JSON(C) valide : {{message}}",
|
||||||
"error.chain.configDirectoryTypo":
|
"error.chain.configDirectoryTypo":
|
||||||
'Le répertoire "{{dir}}" dans {{path}} n\'est pas valide. Renommez le répertoire en "{{suggestion}}" ou supprimez-le. C\'est une faute de frappe courante.',
|
'Le répertoire "{{dir}}" dans {{path}} n\'est pas valide. Renommez le répertoire en "{{suggestion}}" ou supprimez-le. C\'est une faute de frappe courante.',
|
||||||
"error.chain.configFrontmatterError": "Échec de l'analyse de l'en-tête dans {{path}} :\n{{message}}",
|
"error.chain.configFrontmatterError": "Échec de l'analyse du frontmatter dans {{path}} :\n{{message}}",
|
||||||
"error.chain.configInvalid": "Le fichier de configuration à {{path}} est invalide",
|
"error.chain.configInvalid": "Le fichier de configuration à {{path}} est invalide",
|
||||||
"error.chain.configInvalidWithMessage": "Le fichier de configuration à {{path}} est invalide : {{message}}",
|
"error.chain.configInvalidWithMessage": "Le fichier de configuration à {{path}} est invalide : {{message}}",
|
||||||
"notification.permission.title": "Permission requise",
|
"notification.permission.title": "Permission requise",
|
||||||
@@ -721,7 +583,7 @@ export const dict = {
|
|||||||
"session.review.noChanges": "Aucune modification",
|
"session.review.noChanges": "Aucune modification",
|
||||||
"session.review.noUncommittedChanges": "Aucune modification non validée pour l'instant",
|
"session.review.noUncommittedChanges": "Aucune modification non validée pour l'instant",
|
||||||
"session.review.noBranchChanges": "Aucune modification de branche pour l'instant",
|
"session.review.noBranchChanges": "Aucune modification de branche pour l'instant",
|
||||||
"session.review.noVcs": "Aucun système de gestion de versions Git détecté ; modifications non affichées",
|
"session.review.noVcs": "Aucun système de contrôle de version Git détecté, modifications non affichées",
|
||||||
"session.review.noSnapshot":
|
"session.review.noSnapshot":
|
||||||
"Le suivi des instantanés est désactivé dans la configuration, les modifications de session sont donc indisponibles",
|
"Le suivi des instantanés est désactivé dans la configuration, les modifications de session sont donc indisponibles",
|
||||||
"session.files.selectToOpen": "Sélectionnez un fichier à ouvrir",
|
"session.files.selectToOpen": "Sélectionnez un fichier à ouvrir",
|
||||||
@@ -732,7 +594,7 @@ export const dict = {
|
|||||||
"session.messages.loadingEarlier": "Chargement des messages précédents...",
|
"session.messages.loadingEarlier": "Chargement des messages précédents...",
|
||||||
"session.messages.loadEarlier": "Charger les messages précédents",
|
"session.messages.loadEarlier": "Charger les messages précédents",
|
||||||
"session.messages.loading": "Chargement des messages...",
|
"session.messages.loading": "Chargement des messages...",
|
||||||
"session.messages.jumpToLatest": "Aller au message le plus récent",
|
"session.messages.jumpToLatest": "Aller au dernier",
|
||||||
"session.context.addToContext": "Ajouter {{selection}} au contexte",
|
"session.context.addToContext": "Ajouter {{selection}} au contexte",
|
||||||
"session.todo.title": "Tâches",
|
"session.todo.title": "Tâches",
|
||||||
"session.todo.collapse": "Réduire",
|
"session.todo.collapse": "Réduire",
|
||||||
@@ -740,17 +602,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "Réduire la question",
|
"session.question.minimize": "Réduire la question",
|
||||||
"session.question.restore": "Restaurer la question",
|
"session.question.restore": "Restaurer la question",
|
||||||
"session.question.pending.one": "{{count}} question en attente",
|
"session.question.pending.one": "{{count}} question en attente",
|
||||||
"session.question.pending.many": "{{count}} de questions en attente",
|
|
||||||
"session.question.pending.other": "{{count}} questions en attente",
|
"session.question.pending.other": "{{count}} questions en attente",
|
||||||
"session.followupDock.summary.one": "{{count}} message en file d'attente",
|
"session.followupDock.summary.one": "{{count}} message en file d'attente",
|
||||||
"session.followupDock.summary.many": "{{count}} de messages en file d'attente",
|
|
||||||
"session.followupDock.summary.other": "{{count}} messages en file d'attente",
|
"session.followupDock.summary.other": "{{count}} messages en file d'attente",
|
||||||
"session.followupDock.sendNow": "Envoyer maintenant",
|
"session.followupDock.sendNow": "Envoyer maintenant",
|
||||||
"session.followupDock.edit": "Modifier",
|
"session.followupDock.edit": "Modifier",
|
||||||
"session.followupDock.collapse": "Réduire les messages en file d'attente",
|
"session.followupDock.collapse": "Réduire les messages en file d'attente",
|
||||||
"session.followupDock.expand": "Développer les messages en file d'attente",
|
"session.followupDock.expand": "Développer les messages en file d'attente",
|
||||||
"session.revertDock.summary.one": "{{count}} message annulé",
|
"session.revertDock.summary.one": "{{count}} message annulé",
|
||||||
"session.revertDock.summary.many": "{{count}} de messages annulés",
|
|
||||||
"session.revertDock.summary.other": "{{count}} messages annulés",
|
"session.revertDock.summary.other": "{{count}} messages annulés",
|
||||||
"session.revertDock.collapse": "Réduire les messages annulés",
|
"session.revertDock.collapse": "Réduire les messages annulés",
|
||||||
"session.revertDock.expand": "Développer les messages annulés",
|
"session.revertDock.expand": "Développer les messages annulés",
|
||||||
@@ -776,17 +635,17 @@ export const dict = {
|
|||||||
"session.header.open.menu": "Options d'ouverture",
|
"session.header.open.menu": "Options d'ouverture",
|
||||||
"session.header.open.copyPath": "Copier le chemin",
|
"session.header.open.copyPath": "Copier le chemin",
|
||||||
"status.popover.trigger": "Statut",
|
"status.popover.trigger": "Statut",
|
||||||
"status.popover.ariaLabel": "Configuration des serveurs",
|
"status.popover.ariaLabel": "Configurations des serveurs",
|
||||||
"status.popover.tab.servers": "Serveurs",
|
"status.popover.tab.servers": "Serveurs",
|
||||||
"status.popover.tab.mcp": "MCP",
|
"status.popover.tab.mcp": "MCP",
|
||||||
"status.popover.tab.lsp": "LSP",
|
"status.popover.tab.lsp": "LSP",
|
||||||
"status.popover.tab.plugins": "Plugins",
|
"status.popover.tab.plugins": "Plugins",
|
||||||
"status.popover.action.manageServers": "Gérer les serveurs",
|
"status.popover.action.manageServers": "Gérer les serveurs",
|
||||||
"session.share.popover.title": "Publier sur le Web",
|
"session.share.popover.title": "Publier sur le web",
|
||||||
"session.share.popover.description.shared":
|
"session.share.popover.description.shared":
|
||||||
"Cette session est publique sur le Web. Elle est accessible à toute personne disposant du lien.",
|
"Cette session est publique sur le web. Elle est accessible à toute personne disposant du lien.",
|
||||||
"session.share.popover.description.unshared":
|
"session.share.popover.description.unshared":
|
||||||
"Rendre la session publique sur le Web. Elle sera accessible à toute personne disposant du lien.",
|
"Partager la session publiquement sur le web. Elle sera accessible à toute personne disposant du lien.",
|
||||||
"session.share.action.share": "Partager",
|
"session.share.action.share": "Partager",
|
||||||
"session.share.action.publish": "Publier",
|
"session.share.action.publish": "Publier",
|
||||||
"session.share.action.publishing": "Publication...",
|
"session.share.action.publishing": "Publication...",
|
||||||
@@ -797,7 +656,7 @@ export const dict = {
|
|||||||
"session.share.copy.copyLink": "Copier le lien",
|
"session.share.copy.copyLink": "Copier le lien",
|
||||||
"lsp.tooltip.none": "Aucun serveur LSP",
|
"lsp.tooltip.none": "Aucun serveur LSP",
|
||||||
"lsp.label.connected": "{{count}} LSP",
|
"lsp.label.connected": "{{count}} LSP",
|
||||||
"prompt.loading": "Chargement de l'invite...",
|
"prompt.loading": "Chargement du prompt...",
|
||||||
"terminal.loading": "Chargement du terminal...",
|
"terminal.loading": "Chargement du terminal...",
|
||||||
"terminal.title": "Terminal",
|
"terminal.title": "Terminal",
|
||||||
"terminal.title.numbered": "Terminal {{number}}",
|
"terminal.title.numbered": "Terminal {{number}}",
|
||||||
@@ -811,7 +670,6 @@ export const dict = {
|
|||||||
"common.moreOptions": "Plus d'options",
|
"common.moreOptions": "Plus d'options",
|
||||||
"common.learnMore": "En savoir plus",
|
"common.learnMore": "En savoir plus",
|
||||||
"common.rename": "Renommer",
|
"common.rename": "Renommer",
|
||||||
"common.export": "Exporter",
|
|
||||||
"common.reset": "Réinitialiser",
|
"common.reset": "Réinitialiser",
|
||||||
"common.archive": "Archiver",
|
"common.archive": "Archiver",
|
||||||
"common.delete": "Supprimer",
|
"common.delete": "Supprimer",
|
||||||
@@ -836,7 +694,7 @@ export const dict = {
|
|||||||
"sidebar.empty.title": "Aucun projet ouvert",
|
"sidebar.empty.title": "Aucun projet ouvert",
|
||||||
"sidebar.empty.description": "Ouvrez un projet pour commencer",
|
"sidebar.empty.description": "Ouvrez un projet pour commencer",
|
||||||
"app.name.desktop": "OpenCode Desktop",
|
"app.name.desktop": "OpenCode Desktop",
|
||||||
"settings.section.desktop": "Application de bureau",
|
"settings.section.desktop": "Bureau",
|
||||||
"settings.section.server": "Serveur",
|
"settings.section.server": "Serveur",
|
||||||
"settings.tab.general": "Général",
|
"settings.tab.general": "Général",
|
||||||
"settings.tab.shortcuts": "Raccourcis",
|
"settings.tab.shortcuts": "Raccourcis",
|
||||||
@@ -852,10 +710,10 @@ export const dict = {
|
|||||||
"settings.general.section.display": "Affichage",
|
"settings.general.section.display": "Affichage",
|
||||||
"settings.general.row.language.title": "Langue",
|
"settings.general.row.language.title": "Langue",
|
||||||
"settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode",
|
"settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode",
|
||||||
"settings.general.row.shell.title": "Interpréteur de commandes du terminal",
|
"settings.general.row.shell.title": "Shell du terminal",
|
||||||
"settings.general.row.shell.description":
|
"settings.general.row.shell.description":
|
||||||
"Choisissez le shell utilisé par votre terminal. Les shells compatibles sont également utilisés pour les appels d'outils de l'agent.",
|
"Choisissez le shell utilisé par votre terminal. Les shells compatibles sont également utilisés pour les appels d'outils de l'agent.",
|
||||||
"settings.general.row.shell.autoDefault": "Automatique (par défaut)",
|
"settings.general.row.shell.autoDefault": "Auto (par défaut)",
|
||||||
"settings.general.row.shell.terminalOnly": "terminal uniquement",
|
"settings.general.row.shell.terminalOnly": "terminal uniquement",
|
||||||
"settings.general.row.appearance.title": "Apparence",
|
"settings.general.row.appearance.title": "Apparence",
|
||||||
"settings.general.row.appearance.description": "Personnaliser l'apparence d'OpenCode sur votre appareil",
|
"settings.general.row.appearance.description": "Personnaliser l'apparence d'OpenCode sur votre appareil",
|
||||||
@@ -869,22 +727,22 @@ export const dict = {
|
|||||||
"settings.general.row.terminalFont.description": "Personnalisez la police utilisée dans le terminal",
|
"settings.general.row.terminalFont.description": "Personnalisez la police utilisée dans le terminal",
|
||||||
"settings.general.row.uiFont.title": "Police de l'interface",
|
"settings.general.row.uiFont.title": "Police de l'interface",
|
||||||
"settings.general.row.uiFont.description": "Personnaliser la police utilisée dans toute l'interface",
|
"settings.general.row.uiFont.description": "Personnaliser la police utilisée dans toute l'interface",
|
||||||
"settings.general.row.followup.title": "Comportement des messages de suivi",
|
"settings.general.row.followup.title": "Comportement de suivi",
|
||||||
"settings.general.row.followup.description":
|
"settings.general.row.followup.description":
|
||||||
"Choisissez si les messages de suivi orientent immédiatement l'agent ou sont placés dans une file d'attente",
|
"Choisissez si les messages de suivi dirigent immédiatement ou attendent dans une file d'attente",
|
||||||
"settings.general.row.followup.option.queue": "File d'attente",
|
"settings.general.row.followup.option.queue": "File d'attente",
|
||||||
"settings.general.row.followup.option.steer": "Orienter",
|
"settings.general.row.followup.option.steer": "Diriger",
|
||||||
"settings.general.row.showFileTree.title": "Arborescence des fichiers",
|
"settings.general.row.showFileTree.title": "Arborescence des fichiers",
|
||||||
"settings.general.row.showFileTree.description": "Afficher le panneau d'arborescence des fichiers dans les sessions",
|
"settings.general.row.showFileTree.description": "Afficher le panneau d'arborescence des fichiers dans les sessions",
|
||||||
"settings.general.row.showNavigation.title": "Commandes de navigation",
|
"settings.general.row.showNavigation.title": "Commandes de navigation",
|
||||||
"settings.general.row.showNavigation.description":
|
"settings.general.row.showNavigation.description":
|
||||||
"Afficher les boutons précédent et suivant dans la barre de titre de l'application de bureau",
|
"Afficher les boutons précédent et suivant dans la barre de titre de l'application desktop",
|
||||||
"settings.general.row.showSearch.title": "Palette de commandes",
|
"settings.general.row.showSearch.title": "Palette de commandes",
|
||||||
"settings.general.row.showSearch.description":
|
"settings.general.row.showSearch.description":
|
||||||
"Afficher le bouton de recherche et de palette de commandes dans la barre de titre",
|
"Afficher le bouton de recherche et de palette de commandes dans la barre de titre",
|
||||||
"settings.general.row.showTerminal.title": "Terminal",
|
"settings.general.row.showTerminal.title": "Terminal",
|
||||||
"settings.general.row.showTerminal.description":
|
"settings.general.row.showTerminal.description":
|
||||||
"Afficher le bouton du terminal dans la barre de titre de l'application de bureau",
|
"Afficher le bouton du terminal dans la barre de titre de l'application desktop",
|
||||||
"settings.general.row.showStatus.title": "État du serveur",
|
"settings.general.row.showStatus.title": "État du serveur",
|
||||||
"settings.general.row.showStatus.description": "Afficher le bouton d'état du serveur dans la barre de titre",
|
"settings.general.row.showStatus.description": "Afficher le bouton d'état du serveur dans la barre de titre",
|
||||||
"settings.general.row.mobileTitlebarBottom.title": "Navigation en bas",
|
"settings.general.row.mobileTitlebarBottom.title": "Navigation en bas",
|
||||||
@@ -916,13 +774,11 @@ export const dict = {
|
|||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"Sur Linux avec des moniteurs à taux de rafraîchissement mixte, Wayland natif peut être plus stable.",
|
"Sur Linux avec des moniteurs à taux de rafraîchissement mixte, Wayland natif peut être plus stable.",
|
||||||
"settings.general.row.releaseNotes.title": "Notes de version",
|
"settings.general.row.releaseNotes.title": "Notes de version",
|
||||||
"settings.general.row.releaseNotes.description":
|
"settings.general.row.releaseNotes.description": 'Afficher des pop-ups "Quoi de neuf" après les mises à jour',
|
||||||
"Afficher les fenêtres contextuelles « Quoi de neuf » après les mises à jour",
|
|
||||||
"settings.updates.row.startup.title": "Vérifier les mises à jour au démarrage",
|
"settings.updates.row.startup.title": "Vérifier les mises à jour au démarrage",
|
||||||
"settings.updates.row.startup.description": "Vérifier automatiquement les mises à jour au lancement d'OpenCode",
|
"settings.updates.row.startup.description": "Vérifier automatiquement les mises à jour au lancement d'OpenCode",
|
||||||
"settings.updates.row.check.title": "Vérifier les mises à jour",
|
"settings.updates.row.check.title": "Vérifier les mises à jour",
|
||||||
"settings.updates.row.check.description":
|
"settings.updates.row.check.description": "Vérifier manuellement les mises à jour et installer si disponible",
|
||||||
"Rechercher manuellement les mises à jour et installer toute mise à jour disponible",
|
|
||||||
"settings.updates.action.checkNow": "Vérifier maintenant",
|
"settings.updates.action.checkNow": "Vérifier maintenant",
|
||||||
"settings.updates.action.checking": "Vérification...",
|
"settings.updates.action.checking": "Vérification...",
|
||||||
"settings.updates.action.downloading": "Téléchargement...",
|
"settings.updates.action.downloading": "Téléchargement...",
|
||||||
@@ -990,12 +846,12 @@ export const dict = {
|
|||||||
"settings.general.sounds.errors.title": "Erreurs",
|
"settings.general.sounds.errors.title": "Erreurs",
|
||||||
"settings.general.sounds.errors.description": "Jouer un son lorsqu'une erreur se produit",
|
"settings.general.sounds.errors.description": "Jouer un son lorsqu'une erreur se produit",
|
||||||
"settings.shortcuts.title": "Raccourcis clavier",
|
"settings.shortcuts.title": "Raccourcis clavier",
|
||||||
"settings.shortcuts.reset.button": "Rétablir les valeurs par défaut",
|
"settings.shortcuts.reset.button": "Rétablir les défauts",
|
||||||
"settings.shortcuts.reset.toast.title": "Raccourcis réinitialisés",
|
"settings.shortcuts.reset.toast.title": "Raccourcis réinitialisés",
|
||||||
"settings.shortcuts.reset.toast.description": "Les raccourcis clavier ont été réinitialisés aux valeurs par défaut.",
|
"settings.shortcuts.reset.toast.description": "Les raccourcis clavier ont été réinitialisés aux valeurs par défaut.",
|
||||||
"settings.shortcuts.conflict.title": "Raccourci déjà utilisé",
|
"settings.shortcuts.conflict.title": "Raccourci déjà utilisé",
|
||||||
"settings.shortcuts.conflict.description": "{{keybind}} est déjà attribué à {{titles}}.",
|
"settings.shortcuts.conflict.description": "{{keybind}} est déjà assigné à {{titles}}.",
|
||||||
"settings.shortcuts.unassigned": "Non attribué",
|
"settings.shortcuts.unassigned": "Non assigné",
|
||||||
"settings.shortcuts.pressKeys": "Appuyez sur les touches",
|
"settings.shortcuts.pressKeys": "Appuyez sur les touches",
|
||||||
"settings.shortcuts.search.placeholder": "Rechercher des raccourcis",
|
"settings.shortcuts.search.placeholder": "Rechercher des raccourcis",
|
||||||
"settings.shortcuts.search.empty": "Aucun raccourci trouvé",
|
"settings.shortcuts.search.empty": "Aucun raccourci trouvé",
|
||||||
@@ -1004,7 +860,7 @@ export const dict = {
|
|||||||
"settings.shortcuts.group.navigation": "Navigation",
|
"settings.shortcuts.group.navigation": "Navigation",
|
||||||
"settings.shortcuts.group.modelAndAgent": "Modèle et agent",
|
"settings.shortcuts.group.modelAndAgent": "Modèle et agent",
|
||||||
"settings.shortcuts.group.terminal": "Terminal",
|
"settings.shortcuts.group.terminal": "Terminal",
|
||||||
"settings.shortcuts.group.prompt": "Invite",
|
"settings.shortcuts.group.prompt": "Prompt",
|
||||||
"settings.providers.title": "Fournisseurs",
|
"settings.providers.title": "Fournisseurs",
|
||||||
"settings.providers.description": "Les paramètres des fournisseurs seront configurables ici.",
|
"settings.providers.description": "Les paramètres des fournisseurs seront configurables ici.",
|
||||||
"settings.providers.section.connected": "Fournisseurs connectés",
|
"settings.providers.section.connected": "Fournisseurs connectés",
|
||||||
@@ -1033,9 +889,9 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.description": "Lecture d'un fichier (correspond au chemin du fichier)",
|
"settings.permissions.tool.read.description": "Lecture d'un fichier (correspond au chemin du fichier)",
|
||||||
"settings.permissions.tool.edit.title": "Modifier",
|
"settings.permissions.tool.edit.title": "Modifier",
|
||||||
"settings.permissions.tool.edit.description":
|
"settings.permissions.tool.edit.description":
|
||||||
"Modifier des fichiers, notamment au moyen des outils edit, write et patch",
|
"Modifier des fichiers, y compris les modifications, écritures, patchs et multi-modifications",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Rechercher des fichiers à l'aide de motifs glob",
|
"settings.permissions.tool.glob.description": "Correspondre aux fichiers utilisant des modèles glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
"settings.permissions.tool.grep.description":
|
"settings.permissions.tool.grep.description":
|
||||||
"Rechercher dans le contenu des fichiers à l'aide d'expressions régulières",
|
"Rechercher dans le contenu des fichiers à l'aide d'expressions régulières",
|
||||||
@@ -1049,12 +905,12 @@ export const dict = {
|
|||||||
"settings.permissions.tool.skill.description": "Charger une compétence par son nom",
|
"settings.permissions.tool.skill.description": "Charger une compétence par son nom",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
"settings.permissions.tool.lsp.description": "Exécuter des requêtes de serveur de langage",
|
"settings.permissions.tool.lsp.description": "Exécuter des requêtes de serveur de langage",
|
||||||
"settings.permissions.tool.todowrite.title": "Écrire les tâches",
|
"settings.permissions.tool.todowrite.title": "Écrire Todo",
|
||||||
"settings.permissions.tool.todowrite.description": "Mettre à jour la liste de tâches",
|
"settings.permissions.tool.todowrite.description": "Mettre à jour la liste de tâches",
|
||||||
"settings.permissions.tool.webfetch.title": "Récupération Web",
|
"settings.permissions.tool.webfetch.title": "Récupération Web",
|
||||||
"settings.permissions.tool.webfetch.description": "Récupérer le contenu d'une URL",
|
"settings.permissions.tool.webfetch.description": "Récupérer le contenu d'une URL",
|
||||||
"settings.permissions.tool.websearch.title": "Recherche Web",
|
"settings.permissions.tool.websearch.title": "Recherche Web",
|
||||||
"settings.permissions.tool.websearch.description": "Rechercher sur le Web",
|
"settings.permissions.tool.websearch.description": "Rechercher sur le web",
|
||||||
"settings.permissions.tool.external_directory.title": "Répertoire externe",
|
"settings.permissions.tool.external_directory.title": "Répertoire externe",
|
||||||
"settings.permissions.tool.external_directory.description": "Accéder aux fichiers en dehors du répertoire du projet",
|
"settings.permissions.tool.external_directory.description": "Accéder aux fichiers en dehors du répertoire du projet",
|
||||||
"settings.permissions.tool.doom_loop.title": "Boucle infernale",
|
"settings.permissions.tool.doom_loop.title": "Boucle infernale",
|
||||||
@@ -1075,7 +931,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.description": "L'espace de travail correspond maintenant à la branche par défaut.",
|
"workspace.reset.success.description": "L'espace de travail correspond maintenant à la branche par défaut.",
|
||||||
"workspace.error.stillPreparing": "L'espace de travail est encore en cours de préparation",
|
"workspace.error.stillPreparing": "L'espace de travail est encore en cours de préparation",
|
||||||
"workspace.status.checking": "Vérification des modifications non fusionnées...",
|
"workspace.status.checking": "Vérification des modifications non fusionnées...",
|
||||||
"workspace.status.error": "Impossible de vérifier l'état de Git.",
|
"workspace.status.error": "Impossible de vérifier le statut git.",
|
||||||
"workspace.status.clean": "Aucune modification non fusionnée détectée.",
|
"workspace.status.clean": "Aucune modification non fusionnée détectée.",
|
||||||
"workspace.status.dirty": "Modifications non fusionnées détectées dans cet espace de travail.",
|
"workspace.status.dirty": "Modifications non fusionnées détectées dans cet espace de travail.",
|
||||||
"workspace.delete.title": "Supprimer l'espace de travail",
|
"workspace.delete.title": "Supprimer l'espace de travail",
|
||||||
@@ -1097,9 +953,9 @@ export const dict = {
|
|||||||
"error.server.invalidConfiguration": "Configuration invalide",
|
"error.server.invalidConfiguration": "Configuration invalide",
|
||||||
"common.moreCountSuffix": " (+{{count}} de plus)",
|
"common.moreCountSuffix": " (+{{count}} de plus)",
|
||||||
"common.time.justNow": "À l'instant",
|
"common.time.justNow": "À l'instant",
|
||||||
"common.time.minutesAgo.short": "il y a {{count}} min",
|
"common.time.minutesAgo.short": "il y a {{count}}m",
|
||||||
"common.time.hoursAgo.short": "il y a {{count}} h",
|
"common.time.hoursAgo.short": "il y a {{count}}h",
|
||||||
"common.time.daysAgo.short": "il y a {{count}} j",
|
"common.time.daysAgo.short": "il y a {{count}}j",
|
||||||
"settings.providers.connected.environmentDescription": "Connecté à partir de vos variables d'environnement",
|
"settings.providers.connected.environmentDescription": "Connecté à partir de vos variables d'environnement",
|
||||||
"settings.providers.custom.description": "Ajouter un fournisseur compatible avec OpenAI via l'URL de base.",
|
"settings.providers.custom.description": "Ajouter un fournisseur compatible avec OpenAI via l'URL de base.",
|
||||||
|
|
||||||
@@ -1117,9 +973,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} questions sur {{total}}",
|
"session.question.progress": "{{current}} questions sur {{total}}",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Explorateur de fichiers",
|
"session.header.open.fileExplorer": "Explorateur de fichiers",
|
||||||
"session.header.reveal.finder": "Afficher dans le Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Afficher dans l’Explorateur de fichiers",
|
|
||||||
"session.header.reveal.containingFolder": "Ouvrir le dossier contenant",
|
|
||||||
"session.header.open.fileManager": "Gestionnaire de fichiers",
|
"session.header.open.fileManager": "Gestionnaire de fichiers",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1140,11 +993,11 @@ export const dict = {
|
|||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Dernière transition de route terminée touchant une page de session, mesurée du début du routeur jusqu'au premier affichage après stabilisation.",
|
"Dernière transition de route terminée touchant une page de session, mesurée du début du routeur jusqu'au premier affichage après stabilisation.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Fréquence d'images calculée sur les 5 dernières secondes.",
|
"debugBar.fps.tip": "Images par seconde glissantes sur les 5 dernières secondes.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Durée d'image maximale sur les 5 dernières secondes.",
|
"debugBar.frame.tip": "Pire temps d'image sur les 5 dernières secondes.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Images de plus de 32 ms au cours des 5 dernières secondes.",
|
"debugBar.jank.tip": "Images de plus de 32ms au cours des 5 dernières secondes.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip":
|
"debugBar.long.tip":
|
||||||
"Temps bloqué et nombre de tâches longues au cours des 5 dernières secondes. Tâche max : {{max}}.",
|
"Temps bloqué et nombre de tâches longues au cours des 5 dernières secondes. Tâche max : {{max}}.",
|
||||||
@@ -1152,20 +1005,12 @@ export const dict = {
|
|||||||
"debugBar.delay.tip": "Pire délai d'entrée observé au cours des 5 dernières secondes.",
|
"debugBar.delay.tip": "Pire délai d'entrée observé au cours des 5 dernières secondes.",
|
||||||
"debugBar.inp.label": "INP",
|
"debugBar.inp.label": "INP",
|
||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Durée approximative d'interaction au cours des 5 dernières secondes. Il s'agit d'une mesure similaire à l'INP, et non de l'INP officiel des Web Vitals.",
|
"Durée approximative d'interaction au cours des 5 dernières secondes. Ceci est similaire à INP, pas le INP officiel des Web Vitals.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Décalage cumulatif de la mise en page pour la durée de vie actuelle de l'application.",
|
"debugBar.cls.tip": "Décalage cumulatif de la mise en page pour la durée de vie actuelle de l'application.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Tas JS utilisé vs limite de tas. Chromium uniquement.",
|
"debugBar.mem.tipUnavailable": "Tas JS utilisé vs limite de tas. Chromium uniquement.",
|
||||||
"debugBar.mem.tip": "Tas JS utilisé vs limite de tas. {{used}} sur {{limit}}.",
|
"debugBar.mem.tip": "Tas JS utilisé vs limite de tas. {{used}} sur {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Forcer les styles de focus sur tous les éléments interactifs",
|
|
||||||
"debugBar.focus.on": "ACTIVÉ",
|
|
||||||
"debugBar.focus.off": "DÉSACTIVÉ",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Forcer le sens de disposition de toute l’application sans changer la langue sélectionnée",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Maj",
|
"common.key.shift": "Maj",
|
||||||
@@ -1190,10 +1035,4 @@ export const dict = {
|
|||||||
"error.childStore.persistedProjectIconCreateFailed": "Échec de la création de l'icône de projet persistante",
|
"error.childStore.persistedProjectIconCreateFailed": "Échec de la création de l'icône de projet persistante",
|
||||||
"error.childStore.storeCreateFailed": "Échec de la création du stockage",
|
"error.childStore.storeCreateFailed": "Échec de la création du stockage",
|
||||||
"terminal.connectionLost.abnormalClose": "WebSocket fermé anormalement : {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket fermé anormalement : {{code}}",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"Le ticket de connexion PTY a été rejeté par les contrôles d'origine ou CSRF. Vérifiez la configuration CORS du serveur.",
|
|
||||||
"terminal.connectTicket.statusError": "Le ticket de connexion PTY a échoué avec le statut {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Mettre à jour",
|
|
||||||
"titlebar.updateVersion": "Mettre à jour {{version}}",
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+17
-169
@@ -1,102 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "ファイル",
|
|
||||||
"desktop.menu.edit": "編集",
|
|
||||||
"desktop.menu.view": "表示",
|
|
||||||
"desktop.menu.go": "移動",
|
|
||||||
"desktop.menu.window": "ウインドウ",
|
|
||||||
"desktop.menu.help": "ヘルプ",
|
|
||||||
"desktop.menu.checkForUpdates": "アップデートを確認...",
|
|
||||||
"desktop.menu.settings": "設定",
|
|
||||||
"desktop.menu.reloadWebview": "Webビューを再読み込み",
|
|
||||||
"desktop.menu.restart": "再起動",
|
|
||||||
"desktop.menu.exportLogs": "ログをエクスポート...",
|
|
||||||
"desktop.menu.newSession": "新しいセッション",
|
|
||||||
"desktop.menu.openProject": "プロジェクトを開く...",
|
|
||||||
"desktop.menu.newWindow": "新しいウインドウ",
|
|
||||||
"desktop.menu.closeWindow": "ウインドウを閉じる",
|
|
||||||
"desktop.menu.undo": "取り消す",
|
|
||||||
"desktop.menu.redo": "やり直す",
|
|
||||||
"desktop.menu.cut": "切り取り",
|
|
||||||
"desktop.menu.copy": "コピー",
|
|
||||||
"desktop.menu.paste": "ペースト",
|
|
||||||
"desktop.menu.delete": "削除",
|
|
||||||
"desktop.menu.selectAll": "すべてを選択",
|
|
||||||
"desktop.menu.toggleSidebar": "サイドバーの表示を切り替える",
|
|
||||||
"desktop.menu.toggleTerminal": "ターミナルの表示を切り替える",
|
|
||||||
"desktop.menu.toggleFileTree": "ファイルツリーの表示を切り替える",
|
|
||||||
"desktop.menu.reload": "再読み込み",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "開発者ツールの表示を切り替える",
|
|
||||||
"desktop.menu.actualSize": "実際のサイズ",
|
|
||||||
"desktop.menu.zoomIn": "拡大",
|
|
||||||
"desktop.menu.zoomOut": "縮小",
|
|
||||||
"desktop.menu.toggleFullScreen": "フルスクリーン表示を切り替える",
|
|
||||||
"desktop.menu.back": "戻る",
|
|
||||||
"desktop.menu.forward": "進む",
|
|
||||||
"desktop.menu.previousSession": "前のセッション",
|
|
||||||
"desktop.menu.nextSession": "次のセッション",
|
|
||||||
"desktop.menu.previousProject": "前のプロジェクト",
|
|
||||||
"desktop.menu.nextProject": "次のプロジェクト",
|
|
||||||
"desktop.menu.minimize": "最小化",
|
|
||||||
"desktop.menu.maximize": "最大化",
|
|
||||||
"desktop.menu.documentation": "OpenCodeドキュメント",
|
|
||||||
"desktop.menu.supportForum": "サポートフォーラム",
|
|
||||||
"desktop.menu.shareFeedback": "フィードバックを送信",
|
|
||||||
"desktop.menu.reportBug": "バグを報告",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCodeメニュー",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "アップデートを確認できませんでした。",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "アップデートエラー",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "最新の状態です。",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "アップデートはありません",
|
|
||||||
"desktop.updater.dialog.ready.message": "アップデート{{version}}をダウンロードしました。今すぐ再起動しますか?",
|
|
||||||
"desktop.updater.dialog.ready.title": "アップデートの準備ができました",
|
|
||||||
"desktop.updater.dialog.restart": "再起動",
|
|
||||||
"desktop.updater.dialog.later": "後で",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "再起動",
|
|
||||||
"desktop.recovery.action.exportLogs": "ログをエクスポート",
|
|
||||||
"desktop.recovery.action.keepWaiting": "待機を続ける",
|
|
||||||
"desktop.recovery.action.quit": "終了",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCodeを読み込めませんでした",
|
|
||||||
"desktop.recovery.terminated": "OpenCodeのウインドウが予期せず終了しました",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCodeが応答していません",
|
|
||||||
"desktop.recovery.unresponsive.detail": "アプリを再起動するか、ログを開くか、待機を続けることができます。",
|
|
||||||
"desktop.recovery.loadFailed.detail": "ウインドウ: {{window}}\nURL: {{url}}\nエラー: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "ウインドウ: {{window}}\n理由: {{reason}}\nコード: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<不明>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "フォルダを選択",
|
|
||||||
"desktop.dialog.chooseFile": "ファイルを選択",
|
|
||||||
"desktop.dialog.saveFile": "ファイルを保存",
|
|
||||||
"desktop.dialog.files": "ファイル",
|
|
||||||
"desktop.server.local": "ローカルサーバー",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSLはWindowsでのみ利用できます",
|
|
||||||
"desktop.wsl.error.unavailable": "WSLを利用できません",
|
|
||||||
"desktop.wsl.error.listInstalled": "インストール済みのWSLディストリビューションの一覧を取得できませんでした",
|
|
||||||
"desktop.wsl.error.listOnline": "オンラインのWSLディストリビューションの一覧を取得できませんでした",
|
|
||||||
"desktop.wsl.error.executeDistro": "ディストリビューションでコマンドを実行できません",
|
|
||||||
"desktop.wsl.error.installWsl": "WSLのインストールに失敗しました",
|
|
||||||
"desktop.wsl.error.installDistro": "ディストリビューションのインストールに失敗しました: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "OpenCodeのインストールに失敗しました",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}}はすでに追加されています",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "このディストリビューションにはopencodeがインストールされていません",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencodeはインストールされていますが、実行できませんでした",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "{{distro}}にはOpenCodeがインストールされていません",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"OpenCodeのアップデートは完了しましたが、{{distro}}から報告されたバージョンはまだ{{installed}}です。想定されるバージョンは{{expected}}です",
|
|
||||||
"desktop.wsl.error.noVersion": "バージョンなし",
|
|
||||||
"desktop.wsl.error.serverExited": "WSLサーバーが起動後に終了しました (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSLサーバーが正常に稼働する前に終了しました (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout": "{{distro}}のSidecarのヘルスチェックが{{timeout}}ms後にタイムアウトしました",
|
|
||||||
"desktop.wsl.error.commandTimeout": "{{command}} {{args}}が{{timeout}}ms後にタイムアウトしました",
|
|
||||||
"desktop.wsl.error.failedPort": "ポートを取得できませんでした",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "ピッカーでファイルが選択されませんでした",
|
|
||||||
"desktop.picker.error.sizeLimit": "選択した添付ファイルが上限の{{limit}} MBを超えています",
|
|
||||||
|
|
||||||
"command.category.suggested": "おすすめ",
|
"command.category.suggested": "おすすめ",
|
||||||
"command.category.view": "表示",
|
"command.category.view": "表示",
|
||||||
"command.category.project": "プロジェクト",
|
"command.category.project": "プロジェクト",
|
||||||
@@ -114,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "権限",
|
"command.category.permissions": "権限",
|
||||||
"command.category.workspace": "ワークスペース",
|
"command.category.workspace": "ワークスペース",
|
||||||
"command.category.settings": "設定",
|
"command.category.settings": "設定",
|
||||||
"command.logs.export": "ログをエクスポート",
|
|
||||||
"theme.scheme.system": "システム",
|
"theme.scheme.system": "システム",
|
||||||
"theme.scheme.light": "ライト",
|
"theme.scheme.light": "ライト",
|
||||||
"theme.scheme.dark": "ダーク",
|
"theme.scheme.dark": "ダーク",
|
||||||
@@ -184,9 +85,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "このセッションを共有しURLをクリップボードにコピー",
|
"command.session.share.description": "このセッションを共有しURLをクリップボードにコピー",
|
||||||
"command.session.unshare": "セッションの共有を停止",
|
"command.session.unshare": "セッションの共有を停止",
|
||||||
"command.session.unshare.description": "このセッションの共有を停止",
|
"command.session.unshare.description": "このセッションの共有を停止",
|
||||||
"command.session.export": "セッションをエクスポート",
|
|
||||||
"command.session.export.description": "セッションの全記録を JSON としてエクスポート",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "ファイル、コマンド、セッションを検索",
|
"palette.search.placeholder": "ファイル、コマンド、セッションを検索",
|
||||||
"palette.search.placeholder.home": "コマンドとセッションを検索",
|
"palette.search.placeholder.home": "コマンドとセッションを検索",
|
||||||
"palette.empty": "結果が見つかりません",
|
"palette.empty": "結果が見つかりません",
|
||||||
@@ -196,14 +94,13 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "プロバイダーが見つかりません",
|
"dialog.provider.empty": "プロバイダーが見つかりません",
|
||||||
"dialog.provider.group.popular": "人気",
|
"dialog.provider.group.popular": "人気",
|
||||||
"dialog.provider.group.other": "その他",
|
"dialog.provider.group.other": "その他",
|
||||||
"dialog.provider.custom.label": "OpenAI互換のカスタムプロバイダー",
|
|
||||||
"dialog.provider.tag.recommended": "推奨",
|
"dialog.provider.tag.recommended": "推奨",
|
||||||
"dialog.provider.opencode.note": "Claude, GPT, Geminiなどを含む厳選されたモデル",
|
"dialog.provider.opencode.note": "Claude, GPT, Geminiなどを含む厳選されたモデル",
|
||||||
"dialog.provider.opencode.tagline": "信頼性の高い最適化モデル",
|
"dialog.provider.opencode.tagline": "信頼性の高い最適化モデル",
|
||||||
"dialog.provider.opencodeGo.tagline": "すべての人に低価格のサブスクリプション",
|
"dialog.provider.opencodeGo.tagline": "すべての人に低価格のサブスクリプション",
|
||||||
"dialog.provider.anthropic.note": "ProやMaxを含むClaudeモデルに直接アクセス",
|
"dialog.provider.anthropic.note": "Claude Pro/MaxまたはAPIキーで接続",
|
||||||
"dialog.provider.copilot.note": "GitHub Copilotを通じてコーディングを支援するAIモデル",
|
"dialog.provider.copilot.note": "CopilotまたはAPIキーで接続",
|
||||||
"dialog.provider.openai.note": "高速で高性能な汎用AIタスク向けのGPTモデル",
|
"dialog.provider.openai.note": "ChatGPT Pro/PlusまたはAPIキーで接続",
|
||||||
"dialog.provider.google.note": "高速で構造化された応答のためのGeminiモデル",
|
"dialog.provider.google.note": "高速で構造化された応答のためのGeminiモデル",
|
||||||
"dialog.provider.openrouter.note": "1つのプロバイダーからすべてのサポートされているモデルにアクセス",
|
"dialog.provider.openrouter.note": "1つのプロバイダーからすべてのサポートされているモデルにアクセス",
|
||||||
"dialog.provider.vercel.note": "スマートルーターによるAIモデルへの統合アクセス",
|
"dialog.provider.vercel.note": "スマートルーターによるAIモデルへの統合アクセス",
|
||||||
@@ -215,14 +112,11 @@ export const dict = {
|
|||||||
"dialog.model.manage.provider.toggle": "すべての{{provider}}モデルを切り替え",
|
"dialog.model.manage.provider.toggle": "すべての{{provider}}モデルを切り替え",
|
||||||
"dialog.model.unpaid.freeModels.title": "OpenCodeが提供する無料モデル",
|
"dialog.model.unpaid.freeModels.title": "OpenCodeが提供する無料モデル",
|
||||||
"dialog.model.unpaid.addMore.title": "人気のプロバイダーからモデルを追加",
|
"dialog.model.unpaid.addMore.title": "人気のプロバイダーからモデルを追加",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "その他70以上のプロバイダーを見る",
|
|
||||||
"dialog.provider.viewAll": "さらにプロバイダーを表示",
|
"dialog.provider.viewAll": "さらにプロバイダーを表示",
|
||||||
"provider.connect.title": "{{provider}}を接続",
|
"provider.connect.title": "{{provider}}を接続",
|
||||||
"provider.connect.title.anthropicProMax": "Claude Pro/Maxでログイン",
|
"provider.connect.title.anthropicProMax": "Claude Pro/Maxでログイン",
|
||||||
"provider.connect.selectMethod": "{{provider}}のログイン方法を選択してください。",
|
"provider.connect.selectMethod": "{{provider}}のログイン方法を選択してください。",
|
||||||
"provider.connect.method.apiKey": "APIキー",
|
"provider.connect.method.apiKey": "APIキー",
|
||||||
"provider.connect.method.browser": "ブラウザ",
|
|
||||||
"provider.connect.method.headless": "ヘッドレス モード",
|
|
||||||
"provider.connect.status.inProgress": "認証中...",
|
"provider.connect.status.inProgress": "認証中...",
|
||||||
"provider.connect.status.waiting": "認証を待機中...",
|
"provider.connect.status.waiting": "認証を待機中...",
|
||||||
"provider.connect.status.failed": "認証に失敗しました: {{error}}",
|
"provider.connect.status.failed": "認証に失敗しました: {{error}}",
|
||||||
@@ -253,7 +147,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "{{provider}}が接続されました",
|
"provider.connect.toast.connected.title": "{{provider}}が接続されました",
|
||||||
"provider.connect.toast.connected.description": "{{provider}}モデルが使用可能になりました。",
|
"provider.connect.toast.connected.description": "{{provider}}モデルが使用可能になりました。",
|
||||||
"provider.custom.title": "カスタムプロバイダー",
|
"provider.custom.title": "カスタムプロバイダー",
|
||||||
"provider.custom.unavailable": "このサーバーではカスタムプロバイダーを利用できません",
|
|
||||||
"provider.custom.description.prefix": "OpenAI互換のプロバイダーを設定します。詳細は",
|
"provider.custom.description.prefix": "OpenAI互換のプロバイダーを設定します。詳細は",
|
||||||
"provider.custom.description.link": "プロバイダー設定ドキュメント",
|
"provider.custom.description.link": "プロバイダー設定ドキュメント",
|
||||||
"provider.custom.description.suffix": "をご覧ください。",
|
"provider.custom.description.suffix": "をご覧ください。",
|
||||||
@@ -302,7 +195,7 @@ export const dict = {
|
|||||||
"model.input.image": "画像",
|
"model.input.image": "画像",
|
||||||
"model.input.audio": "音声",
|
"model.input.audio": "音声",
|
||||||
"model.input.video": "動画",
|
"model.input.video": "動画",
|
||||||
"model.input.pdf": "PDF",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "対応: {{inputs}}",
|
"model.tooltip.allows": "対応: {{inputs}}",
|
||||||
"model.tooltip.context.label": "コンテキスト",
|
"model.tooltip.context.label": "コンテキスト",
|
||||||
"model.tooltip.inputs": "入力",
|
"model.tooltip.inputs": "入力",
|
||||||
@@ -321,7 +214,7 @@ export const dict = {
|
|||||||
"common.clear": "クリア",
|
"common.clear": "クリア",
|
||||||
"common.connect": "接続",
|
"common.connect": "接続",
|
||||||
"common.disconnect": "切断",
|
"common.disconnect": "切断",
|
||||||
"common.continue": "続行",
|
"common.continue": "送信",
|
||||||
"common.submit": "送信",
|
"common.submit": "送信",
|
||||||
"common.save": "保存",
|
"common.save": "保存",
|
||||||
"common.saving": "保存中...",
|
"common.saving": "保存中...",
|
||||||
@@ -365,7 +258,7 @@ export const dict = {
|
|||||||
"prompt.popover.emptyResults": "一致する結果がありません",
|
"prompt.popover.emptyResults": "一致する結果がありません",
|
||||||
"prompt.popover.emptyCommands": "一致するコマンドがありません",
|
"prompt.popover.emptyCommands": "一致するコマンドがありません",
|
||||||
"prompt.dropzone.label": "画像、PDF、またはテキストファイルをここにドロップしてください",
|
"prompt.dropzone.label": "画像、PDF、またはテキストファイルをここにドロップしてください",
|
||||||
"prompt.dropzone.file.label": "ドロップしてファイルを@メンション",
|
"prompt.dropzone.file.label": "ドロップして@メンションファイルを追加",
|
||||||
"prompt.slash.badge.custom": "カスタム",
|
"prompt.slash.badge.custom": "カスタム",
|
||||||
"prompt.slash.badge.skill": "スキル",
|
"prompt.slash.badge.skill": "スキル",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
@@ -508,22 +401,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.desktopVersion": "デスクトップ {{version}}",
|
"wsl.onboarding.desktopVersion": "デスクトップ {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "インストールされているバージョンがデスクトップアプリのバージョンと一致しません。",
|
"wsl.onboarding.versionMismatch": "インストールされているバージョンがデスクトップアプリのバージョンと一致しません。",
|
||||||
"wsl.onboarding.adding": "追加中...",
|
"wsl.onboarding.adding": "追加中...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "タブのご紹介。タブを使って作業と進行中のセッションを整理できます",
|
|
||||||
"help.tabs.toast.dismiss": "タブに関する案内を閉じる",
|
|
||||||
"help.tabs.title": "タブのご紹介",
|
|
||||||
"help.tabs.description": "タブを使って作業と進行中のセッションを整理できます",
|
|
||||||
"help.tabs.date": "7月14日",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktopでタブを中心とした操作ができるようになりました。",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"新しいセッションをタブで開始したり、プロジェクトから既存のセッションを開いたりできます。新しい作業を始めるときは新しいタブを開き、作業が終わったら閉じます。",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"複数のタブを開いておくと、進行中のセッションを整理しやすくなります。タブを残しておく場合は、覚えやすい名前に変更できます。",
|
|
||||||
"help.tabs.home":
|
|
||||||
"新しいホーム画面には、すべてのセッションとプロジェクトが表示されます。セッションを選択するとタブで開きます。",
|
|
||||||
"help.tabs.persistence": "アプリを再度開いたときも、タブは開いたままです。",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"新しいデザインはまだGitワークツリーに対応していませんが、近日中に対応する予定です。以前のレイアウトを引き続き使用する場合は、設定でレイアウトを切り替えることができます。新しいレイアウトは数週間後に標準となる予定です。",
|
|
||||||
"dialog.project.edit.title": "プロジェクトを編集",
|
"dialog.project.edit.title": "プロジェクトを編集",
|
||||||
"dialog.project.edit.name": "名前",
|
"dialog.project.edit.name": "名前",
|
||||||
"dialog.project.edit.icon": "アイコン",
|
"dialog.project.edit.icon": "アイコン",
|
||||||
@@ -536,8 +413,6 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup.description":
|
"dialog.project.edit.worktree.startup.description":
|
||||||
"新しいワークスペース (ワークツリー) を作成した後に実行されます。",
|
"新しいワークスペース (ワークツリー) を作成した後に実行されます。",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "例: bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "例: bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "今後表示しない",
|
|
||||||
|
|
||||||
"context.breakdown.title": "コンテキストの内訳",
|
"context.breakdown.title": "コンテキストの内訳",
|
||||||
"context.breakdown.note": '入力トークンのおおよその内訳です。"その他"にはツールの定義やオーバーヘッドが含まれます。',
|
"context.breakdown.note": '入力トークンのおおよその内訳です。"その他"にはツールの定義やオーバーヘッドが含まれます。',
|
||||||
"context.breakdown.system": "システム",
|
"context.breakdown.system": "システム",
|
||||||
@@ -547,8 +422,6 @@ export const dict = {
|
|||||||
"context.breakdown.other": "その他",
|
"context.breakdown.other": "その他",
|
||||||
"context.systemPrompt.title": "システムプロンプト",
|
"context.systemPrompt.title": "システムプロンプト",
|
||||||
"context.rawMessages.title": "生のメッセージ",
|
"context.rawMessages.title": "生のメッセージ",
|
||||||
"context.export.session": "セッションをエクスポート",
|
|
||||||
|
|
||||||
"context.stats.session": "セッション",
|
"context.stats.session": "セッション",
|
||||||
"context.stats.messages": "メッセージ",
|
"context.stats.messages": "メッセージ",
|
||||||
"context.stats.provider": "プロバイダー",
|
"context.stats.provider": "プロバイダー",
|
||||||
@@ -615,11 +488,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.success.description": "セッションの共有解除に成功しました!",
|
"toast.session.unshare.success.description": "セッションの共有解除に成功しました!",
|
||||||
"toast.session.unshare.failed.title": "セッションの共有解除に失敗しました",
|
"toast.session.unshare.failed.title": "セッションの共有解除に失敗しました",
|
||||||
"toast.session.unshare.failed.description": "セッションの共有解除中にエラーが発生しました",
|
"toast.session.unshare.failed.description": "セッションの共有解除中にエラーが発生しました",
|
||||||
"toast.session.export.success.title": "セッションをエクスポートしました",
|
|
||||||
"toast.session.export.success.description": "セッションを {{filename}} に保存しました",
|
|
||||||
"toast.session.export.failed.title": "セッションのエクスポートに失敗しました",
|
|
||||||
"toast.session.export.failed.description": "セッションのエクスポート中にエラーが発生しました",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "{{project}}のセッション読み込みに失敗しました",
|
"toast.session.listFailed.title": "{{project}}のセッション読み込みに失敗しました",
|
||||||
"toast.update.title": "アップデートが利用可能です",
|
"toast.update.title": "アップデートが利用可能です",
|
||||||
"toast.update.description": "OpenCodeの新しいバージョン ({{version}}) がインストール可能です。",
|
"toast.update.description": "OpenCodeの新しいバージョン ({{version}}) がインストール可能です。",
|
||||||
@@ -699,7 +567,7 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "このタブが参照するセッションは、このサーバーには存在しません。",
|
"session.error.notFound.description": "このタブが参照するセッションは、このサーバーには存在しません。",
|
||||||
"session.error.notFound.closeTab": "タブを閉じる",
|
"session.error.notFound.closeTab": "タブを閉じる",
|
||||||
"session.error.serverConnection": "このサーバーに接続できません",
|
"session.error.serverConnection": "このサーバーに接続できません",
|
||||||
"session.review.filesChanged": "変更されたファイル: {{count}}件",
|
"session.review.filesChanged": "{{count}} ファイル変更",
|
||||||
"session.review.change.one": "変更",
|
"session.review.change.one": "変更",
|
||||||
"session.review.change.other": "変更",
|
"session.review.change.other": "変更",
|
||||||
"session.review.loadingChanges": "変更を読み込み中...",
|
"session.review.loadingChanges": "変更を読み込み中...",
|
||||||
@@ -789,11 +657,10 @@ export const dict = {
|
|||||||
"ターミナルの接続が中断されました。これはサーバーが再起動したときに発生することがあります。",
|
"ターミナルの接続が中断されました。これはサーバーが再起動したときに発生することがあります。",
|
||||||
"common.closeTab": "タブを閉じる",
|
"common.closeTab": "タブを閉じる",
|
||||||
"common.dismiss": "閉じる",
|
"common.dismiss": "閉じる",
|
||||||
"common.requestFailed": "リクエストに失敗しました",
|
"common.requestFailed": "リクエスト失敗",
|
||||||
"common.moreOptions": "その他のオプション",
|
"common.moreOptions": "その他のオプション",
|
||||||
"common.learnMore": "詳細",
|
"common.learnMore": "詳細",
|
||||||
"common.rename": "名前を変更",
|
"common.rename": "名前変更",
|
||||||
"common.export": "エクスポート",
|
|
||||||
"common.reset": "リセット",
|
"common.reset": "リセット",
|
||||||
"common.archive": "アーカイブ",
|
"common.archive": "アーカイブ",
|
||||||
"common.delete": "削除",
|
"common.delete": "削除",
|
||||||
@@ -867,9 +734,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "下部ナビゲーション",
|
"settings.general.row.mobileTitlebarBottom.title": "下部ナビゲーション",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"モバイルではタイトルバーとセッションタブを画面下部に配置します",
|
"モバイルではタイトルバーとセッションタブを画面下部に配置します",
|
||||||
"settings.general.row.showCustomAgents.title": "エージェントを表示",
|
"settings.general.row.showCustomAgents.title": "カスタムエージェント",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "コンポーザーにエージェント選択を表示します",
|
||||||
"コンポーザーでエージェントを切り替えます。非表示の場合は、デフォルトでBuildエージェントが使用されます。",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "推論の要約を表示",
|
"settings.general.row.reasoningSummaries.title": "推論の要約を表示",
|
||||||
"settings.general.row.reasoningSummaries.description": "タイムラインにモデルの推論の要約を表示します",
|
"settings.general.row.reasoningSummaries.description": "タイムラインにモデルの推論の要約を表示します",
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "shell ツールパーツを展開",
|
"settings.general.row.shellToolPartsExpanded.title": "shell ツールパーツを展開",
|
||||||
@@ -980,7 +846,7 @@ export const dict = {
|
|||||||
"settings.shortcuts.group.terminal": "ターミナル",
|
"settings.shortcuts.group.terminal": "ターミナル",
|
||||||
"settings.shortcuts.group.prompt": "プロンプト",
|
"settings.shortcuts.group.prompt": "プロンプト",
|
||||||
"settings.providers.title": "プロバイダー",
|
"settings.providers.title": "プロバイダー",
|
||||||
"settings.providers.description": "プロバイダー設定は今後ここで構成できるようになります。",
|
"settings.providers.description": "プロバイダー設定はここで構成できます。",
|
||||||
"settings.providers.section.connected": "接続済みプロバイダー",
|
"settings.providers.section.connected": "接続済みプロバイダー",
|
||||||
"settings.providers.connected.empty": "接続済みプロバイダーはありません",
|
"settings.providers.connected.empty": "接続済みプロバイダーはありません",
|
||||||
"settings.providers.section.popular": "人気のプロバイダー",
|
"settings.providers.section.popular": "人気のプロバイダー",
|
||||||
@@ -989,13 +855,13 @@ export const dict = {
|
|||||||
"settings.providers.tag.custom": "カスタム",
|
"settings.providers.tag.custom": "カスタム",
|
||||||
"settings.providers.tag.other": "その他",
|
"settings.providers.tag.other": "その他",
|
||||||
"settings.models.title": "モデル",
|
"settings.models.title": "モデル",
|
||||||
"settings.models.description": "モデル設定は今後ここで構成できるようになります。",
|
"settings.models.description": "モデル設定はここで構成できます。",
|
||||||
"settings.agents.title": "エージェント",
|
"settings.agents.title": "エージェント",
|
||||||
"settings.agents.description": "エージェント設定は今後ここで構成できるようになります。",
|
"settings.agents.description": "エージェント設定はここで構成できます。",
|
||||||
"settings.commands.title": "コマンド",
|
"settings.commands.title": "コマンド",
|
||||||
"settings.commands.description": "コマンド設定は今後ここで構成できるようになります。",
|
"settings.commands.description": "コマンド設定はここで構成できます。",
|
||||||
"settings.mcp.title": "MCP",
|
"settings.mcp.title": "MCP",
|
||||||
"settings.mcp.description": "MCP設定は今後ここで構成できるようになります。",
|
"settings.mcp.description": "MCP設定はここで構成できます。",
|
||||||
"settings.permissions.title": "権限",
|
"settings.permissions.title": "権限",
|
||||||
"settings.permissions.description": "サーバーがデフォルトで使用できるツールを制御します。",
|
"settings.permissions.description": "サーバーがデフォルトで使用できるツールを制御します。",
|
||||||
"settings.permissions.section.tools": "ツール",
|
"settings.permissions.section.tools": "ツール",
|
||||||
@@ -1089,9 +955,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{total}} 問中 {{current}} 問",
|
"session.question.progress": "{{total}} 問中 {{current}} 問",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "エクスプローラー",
|
"session.header.open.fileExplorer": "エクスプローラー",
|
||||||
"session.header.reveal.finder": "Finderで表示",
|
|
||||||
"session.header.reveal.fileExplorer": "エクスプローラーで表示",
|
|
||||||
"session.header.reveal.containingFolder": "親フォルダーを開く",
|
|
||||||
"session.header.open.fileManager": "ファイルマネージャー",
|
"session.header.open.fileManager": "ファイルマネージャー",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1109,8 +972,7 @@ export const dict = {
|
|||||||
"debugBar.ariaLabel": "開発パフォーマンス診断",
|
"debugBar.ariaLabel": "開発パフォーマンス診断",
|
||||||
"debugBar.na": "n/a",
|
"debugBar.na": "n/a",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip": "セッションページに触れる最後に完了したルート遷移。ルーター開始から安定後の最初の描画まで測定。",
|
||||||
"セッションページに関係する最後に完了したルート遷移。ルーターの開始から処理完了後の最初の描画までを測定。",
|
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "過去5秒間のローリングフレーム/秒。",
|
"debugBar.fps.tip": "過去5秒間のローリングフレーム/秒。",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
@@ -1129,14 +991,6 @@ export const dict = {
|
|||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "使用中の JS ヒープ対ヒープ制限。Chromium のみ。",
|
"debugBar.mem.tipUnavailable": "使用中の JS ヒープ対ヒープ制限。Chromium のみ。",
|
||||||
"debugBar.mem.tip": "使用中の JS ヒープ対ヒープ制限。{{limit}} 中 {{used}}。",
|
"debugBar.mem.tip": "使用中の JS ヒープ対ヒープ制限。{{limit}} 中 {{used}}。",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "すべてのインタラクティブ要素にフォーカススタイルを強制適用",
|
|
||||||
"debugBar.focus.on": "オン",
|
|
||||||
"debugBar.focus.off": "オフ",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "選択中の言語を変更せずに、アプリ全体のレイアウト方向を強制設定",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -1160,10 +1014,4 @@ export const dict = {
|
|||||||
"error.childStore.persistedProjectIconCreateFailed": "永続プロジェクトアイコンの作成に失敗しました",
|
"error.childStore.persistedProjectIconCreateFailed": "永続プロジェクトアイコンの作成に失敗しました",
|
||||||
"error.childStore.storeCreateFailed": "ストアの作成に失敗しました",
|
"error.childStore.storeCreateFailed": "ストアの作成に失敗しました",
|
||||||
"terminal.connectionLost.abnormalClose": "WebSocket が異常終了しました: {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket が異常終了しました: {{code}}",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"PTY接続チケットは、オリジンまたはCSRFチェックによって拒否されました。サーバーのCORS設定を確認してください。",
|
|
||||||
"terminal.connectTicket.statusError": "PTY接続チケットがステータス {{status}} で失敗しました",
|
|
||||||
|
|
||||||
"titlebar.update": "アップデート",
|
|
||||||
"titlebar.updateVersion": "アップデート {{version}}",
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+23
-174
@@ -19,7 +19,7 @@ export const dict = {
|
|||||||
"theme.scheme.system": "시스템",
|
"theme.scheme.system": "시스템",
|
||||||
"theme.scheme.light": "라이트",
|
"theme.scheme.light": "라이트",
|
||||||
"theme.scheme.dark": "다크",
|
"theme.scheme.dark": "다크",
|
||||||
"command.sidebar.toggle": "사이드바 표시/숨기기",
|
"command.sidebar.toggle": "사이드바 토글",
|
||||||
"command.project.open": "프로젝트 열기",
|
"command.project.open": "프로젝트 열기",
|
||||||
"command.provider.connect": "공급자 연결",
|
"command.provider.connect": "공급자 연결",
|
||||||
"command.server.switch": "서버 전환",
|
"command.server.switch": "서버 전환",
|
||||||
@@ -42,12 +42,12 @@ export const dict = {
|
|||||||
"command.context.addSelection": "선택 영역을 컨텍스트에 추가",
|
"command.context.addSelection": "선택 영역을 컨텍스트에 추가",
|
||||||
"command.context.addSelection.description": "현재 파일에서 선택한 줄을 추가",
|
"command.context.addSelection.description": "현재 파일에서 선택한 줄을 추가",
|
||||||
"command.input.focus": "입력창 포커스",
|
"command.input.focus": "입력창 포커스",
|
||||||
"command.terminal.toggle": "터미널 표시/숨기기",
|
"command.terminal.toggle": "터미널 토글",
|
||||||
"command.fileTree.toggle": "파일 트리 표시/숨기기",
|
"command.fileTree.toggle": "파일 트리 토글",
|
||||||
"command.review.toggle": "검토 표시/숨기기",
|
"command.review.toggle": "검토 토글",
|
||||||
"command.terminal.new": "새 터미널",
|
"command.terminal.new": "새 터미널",
|
||||||
"command.terminal.new.description": "새 터미널 탭 생성",
|
"command.terminal.new.description": "새 터미널 탭 생성",
|
||||||
"command.steps.toggle": "단계 표시/숨기기",
|
"command.steps.toggle": "단계 토글",
|
||||||
"command.steps.toggle.description": "현재 메시지의 단계 표시/숨기기",
|
"command.steps.toggle.description": "현재 메시지의 단계 표시/숨기기",
|
||||||
"command.message.previous": "이전 메시지",
|
"command.message.previous": "이전 메시지",
|
||||||
"command.message.previous.description": "이전 사용자 메시지로 이동",
|
"command.message.previous.description": "이전 사용자 메시지로 이동",
|
||||||
@@ -55,8 +55,8 @@ export const dict = {
|
|||||||
"command.message.next.description": "다음 사용자 메시지로 이동",
|
"command.message.next.description": "다음 사용자 메시지로 이동",
|
||||||
"command.model.choose": "모델 선택",
|
"command.model.choose": "모델 선택",
|
||||||
"command.model.choose.description": "다른 모델 선택",
|
"command.model.choose.description": "다른 모델 선택",
|
||||||
"command.mcp.toggle": "MCP 전환",
|
"command.mcp.toggle": "MCP 토글",
|
||||||
"command.mcp.toggle.description": "MCP 전환",
|
"command.mcp.toggle.description": "MCP 토글",
|
||||||
"command.agent.cycle": "에이전트 순환",
|
"command.agent.cycle": "에이전트 순환",
|
||||||
"command.agent.cycle.description": "다음 에이전트로 전환",
|
"command.agent.cycle.description": "다음 에이전트로 전환",
|
||||||
"command.agent.cycle.reverse": "에이전트 역순환",
|
"command.agent.cycle.reverse": "에이전트 역순환",
|
||||||
@@ -81,9 +81,6 @@ export const dict = {
|
|||||||
"command.session.share.description": "이 세션을 공유하고 URL을 클립보드에 복사",
|
"command.session.share.description": "이 세션을 공유하고 URL을 클립보드에 복사",
|
||||||
"command.session.unshare": "세션 공유 중지",
|
"command.session.unshare": "세션 공유 중지",
|
||||||
"command.session.unshare.description": "이 세션 공유 중지",
|
"command.session.unshare.description": "이 세션 공유 중지",
|
||||||
"command.session.export": "세션 내보내기",
|
|
||||||
"command.session.export.description": "전체 세션 기록을 JSON으로 내보내기",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "파일, 명령어 및 세션 검색",
|
"palette.search.placeholder": "파일, 명령어 및 세션 검색",
|
||||||
"palette.search.placeholder.home": "명령어 및 세션 검색",
|
"palette.search.placeholder.home": "명령어 및 세션 검색",
|
||||||
"palette.empty": "결과 없음",
|
"palette.empty": "결과 없음",
|
||||||
@@ -93,14 +90,13 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "공급자 없음",
|
"dialog.provider.empty": "공급자 없음",
|
||||||
"dialog.provider.group.popular": "인기",
|
"dialog.provider.group.popular": "인기",
|
||||||
"dialog.provider.group.other": "기타",
|
"dialog.provider.group.other": "기타",
|
||||||
"dialog.provider.custom.label": "OpenAI 호환 사용자 지정 공급자",
|
|
||||||
"dialog.provider.tag.recommended": "추천",
|
"dialog.provider.tag.recommended": "추천",
|
||||||
"dialog.provider.opencode.note": "Claude, GPT, Gemini 등을 포함한 엄선된 모델",
|
"dialog.provider.opencode.note": "Claude, GPT, Gemini 등을 포함한 엄선된 모델",
|
||||||
"dialog.provider.opencode.tagline": "신뢰할 수 있는 최적화 모델",
|
"dialog.provider.opencode.tagline": "신뢰할 수 있는 최적화 모델",
|
||||||
"dialog.provider.opencodeGo.tagline": "모두를 위한 저렴한 구독",
|
"dialog.provider.opencodeGo.tagline": "모두를 위한 저렴한 구독",
|
||||||
"dialog.provider.anthropic.note": "Pro 및 Max를 포함한 Claude 모델에 직접 액세스",
|
"dialog.provider.anthropic.note": "Claude Pro/Max 또는 API 키로 연결",
|
||||||
"dialog.provider.copilot.note": "GitHub Copilot을 통한 코딩 지원용 AI 모델",
|
"dialog.provider.copilot.note": "Copilot 또는 API 키로 연결",
|
||||||
"dialog.provider.openai.note": "빠르고 강력한 범용 AI 작업을 위한 GPT 모델",
|
"dialog.provider.openai.note": "ChatGPT Pro/Plus 또는 API 키로 연결",
|
||||||
"dialog.provider.google.note": "빠르고 구조화된 응답을 위한 Gemini 모델",
|
"dialog.provider.google.note": "빠르고 구조화된 응답을 위한 Gemini 모델",
|
||||||
"dialog.provider.openrouter.note": "모든 지원 모델을 단일 공급자에서 액세스",
|
"dialog.provider.openrouter.note": "모든 지원 모델을 단일 공급자에서 액세스",
|
||||||
"dialog.provider.vercel.note": "스마트 라우팅을 통한 AI 모델 통합 액세스",
|
"dialog.provider.vercel.note": "스마트 라우팅을 통한 AI 모델 통합 액세스",
|
||||||
@@ -112,14 +108,11 @@ export const dict = {
|
|||||||
"dialog.model.manage.provider.toggle": "모든 {{provider}} 모델 토글",
|
"dialog.model.manage.provider.toggle": "모든 {{provider}} 모델 토글",
|
||||||
"dialog.model.unpaid.freeModels.title": "OpenCode에서 제공하는 무료 모델",
|
"dialog.model.unpaid.freeModels.title": "OpenCode에서 제공하는 무료 모델",
|
||||||
"dialog.model.unpaid.addMore.title": "인기 공급자의 모델 추가",
|
"dialog.model.unpaid.addMore.title": "인기 공급자의 모델 추가",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "70개 이상의 공급자 더 보기",
|
|
||||||
"dialog.provider.viewAll": "더 많은 공급자 보기",
|
"dialog.provider.viewAll": "더 많은 공급자 보기",
|
||||||
"provider.connect.title": "{{provider}} 연결",
|
"provider.connect.title": "{{provider}} 연결",
|
||||||
"provider.connect.title.anthropicProMax": "Claude Pro/Max로 로그인",
|
"provider.connect.title.anthropicProMax": "Claude Pro/Max로 로그인",
|
||||||
"provider.connect.selectMethod": "{{provider}} 로그인 방법 선택",
|
"provider.connect.selectMethod": "{{provider}} 로그인 방법 선택",
|
||||||
"provider.connect.method.apiKey": "API 키",
|
"provider.connect.method.apiKey": "API 키",
|
||||||
"provider.connect.method.browser": "브라우저",
|
|
||||||
"provider.connect.method.headless": "헤드리스 모드",
|
|
||||||
"provider.connect.status.inProgress": "인증 진행 중...",
|
"provider.connect.status.inProgress": "인증 진행 중...",
|
||||||
"provider.connect.status.waiting": "인증 대기 중...",
|
"provider.connect.status.waiting": "인증 대기 중...",
|
||||||
"provider.connect.status.failed": "인증 실패: {{error}}",
|
"provider.connect.status.failed": "인증 실패: {{error}}",
|
||||||
@@ -150,7 +143,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "{{provider}} 연결됨",
|
"provider.connect.toast.connected.title": "{{provider}} 연결됨",
|
||||||
"provider.connect.toast.connected.description": "이제 {{provider}} 모델을 사용할 수 있습니다.",
|
"provider.connect.toast.connected.description": "이제 {{provider}} 모델을 사용할 수 있습니다.",
|
||||||
"provider.custom.title": "사용자 지정 공급자",
|
"provider.custom.title": "사용자 지정 공급자",
|
||||||
"provider.custom.unavailable": "이 서버에서는 사용자 지정 공급자를 사용할 수 없습니다",
|
|
||||||
"provider.custom.description.prefix": "OpenAI 호환 공급자를 구성합니다. ",
|
"provider.custom.description.prefix": "OpenAI 호환 공급자를 구성합니다. ",
|
||||||
"provider.custom.description.link": "공급자 구성 문서",
|
"provider.custom.description.link": "공급자 구성 문서",
|
||||||
"provider.custom.description.suffix": "를 참조하세요.",
|
"provider.custom.description.suffix": "를 참조하세요.",
|
||||||
@@ -199,7 +191,7 @@ export const dict = {
|
|||||||
"model.input.image": "이미지",
|
"model.input.image": "이미지",
|
||||||
"model.input.audio": "오디오",
|
"model.input.audio": "오디오",
|
||||||
"model.input.video": "비디오",
|
"model.input.video": "비디오",
|
||||||
"model.input.pdf": "PDF",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "지원: {{inputs}}",
|
"model.tooltip.allows": "지원: {{inputs}}",
|
||||||
"model.tooltip.reasoning.allowed": "추론 허용",
|
"model.tooltip.reasoning.allowed": "추론 허용",
|
||||||
"model.tooltip.reasoning.none": "추론 없음",
|
"model.tooltip.reasoning.none": "추론 없음",
|
||||||
@@ -212,7 +204,7 @@ export const dict = {
|
|||||||
"common.cancel": "취소",
|
"common.cancel": "취소",
|
||||||
"common.connect": "연결",
|
"common.connect": "연결",
|
||||||
"common.disconnect": "연결 해제",
|
"common.disconnect": "연결 해제",
|
||||||
"common.continue": "계속",
|
"common.continue": "제출",
|
||||||
"common.submit": "제출",
|
"common.submit": "제출",
|
||||||
"common.save": "저장",
|
"common.save": "저장",
|
||||||
"common.saving": "저장 중...",
|
"common.saving": "저장 중...",
|
||||||
@@ -262,7 +254,7 @@ export const dict = {
|
|||||||
"prompt.context.includeActiveFile": "활성 파일 포함",
|
"prompt.context.includeActiveFile": "활성 파일 포함",
|
||||||
"prompt.context.removeActiveFile": "컨텍스트에서 활성 파일 제거",
|
"prompt.context.removeActiveFile": "컨텍스트에서 활성 파일 제거",
|
||||||
"prompt.context.removeFile": "컨텍스트에서 파일 제거",
|
"prompt.context.removeFile": "컨텍스트에서 파일 제거",
|
||||||
"prompt.action.attachFile": "파일 추가",
|
"prompt.action.attachFile": "파일 첨부",
|
||||||
"prompt.menu.addImagesAndFiles": "파일 및 기타 항목 추가",
|
"prompt.menu.addImagesAndFiles": "파일 및 기타 항목 추가",
|
||||||
"prompt.menu.imagesAndFiles": "이미지 및 파일",
|
"prompt.menu.imagesAndFiles": "이미지 및 파일",
|
||||||
"prompt.menu.commands": "명령어",
|
"prompt.menu.commands": "명령어",
|
||||||
@@ -339,8 +331,6 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup": "작업 공간 시작 스크립트",
|
"dialog.project.edit.worktree.startup": "작업 공간 시작 스크립트",
|
||||||
"dialog.project.edit.worktree.startup.description": "새 작업 공간(작업 트리)을 만든 뒤 실행됩니다.",
|
"dialog.project.edit.worktree.startup.description": "새 작업 공간(작업 트리)을 만든 뒤 실행됩니다.",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "예: bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "예: bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "다시 표시하지 않기",
|
|
||||||
|
|
||||||
"context.breakdown.title": "컨텍스트 분석",
|
"context.breakdown.title": "컨텍스트 분석",
|
||||||
"context.breakdown.note": '입력 토큰의 대략적인 분석입니다. "기타"에는 도구 정의 및 오버헤드가 포함됩니다.',
|
"context.breakdown.note": '입력 토큰의 대략적인 분석입니다. "기타"에는 도구 정의 및 오버헤드가 포함됩니다.',
|
||||||
"context.breakdown.system": "시스템",
|
"context.breakdown.system": "시스템",
|
||||||
@@ -350,8 +340,6 @@ export const dict = {
|
|||||||
"context.breakdown.other": "기타",
|
"context.breakdown.other": "기타",
|
||||||
"context.systemPrompt.title": "시스템 프롬프트",
|
"context.systemPrompt.title": "시스템 프롬프트",
|
||||||
"context.rawMessages.title": "원시 메시지",
|
"context.rawMessages.title": "원시 메시지",
|
||||||
"context.export.session": "세션 내보내기",
|
|
||||||
|
|
||||||
"context.stats.session": "세션",
|
"context.stats.session": "세션",
|
||||||
"context.stats.messages": "메시지",
|
"context.stats.messages": "메시지",
|
||||||
"context.stats.provider": "공급자",
|
"context.stats.provider": "공급자",
|
||||||
@@ -417,11 +405,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.success.description": "세션 공유가 성공적으로 해제되었습니다!",
|
"toast.session.unshare.success.description": "세션 공유가 성공적으로 해제되었습니다!",
|
||||||
"toast.session.unshare.failed.title": "세션 공유 해제 실패",
|
"toast.session.unshare.failed.title": "세션 공유 해제 실패",
|
||||||
"toast.session.unshare.failed.description": "세션 공유를 해제하는 동안 오류가 발생했습니다",
|
"toast.session.unshare.failed.description": "세션 공유를 해제하는 동안 오류가 발생했습니다",
|
||||||
"toast.session.export.success.title": "세션을 내보냈습니다",
|
|
||||||
"toast.session.export.success.description": "세션 저장 위치: {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "세션 내보내기 실패",
|
|
||||||
"toast.session.export.failed.description": "세션을 내보내는 동안 오류가 발생했습니다",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "{{project}}에 대한 세션을 로드하지 못했습니다",
|
"toast.session.listFailed.title": "{{project}}에 대한 세션을 로드하지 못했습니다",
|
||||||
"toast.update.title": "업데이트 가능",
|
"toast.update.title": "업데이트 가능",
|
||||||
"toast.update.description": "OpenCode의 새 버전({{version}})을 설치할 수 있습니다.",
|
"toast.update.description": "OpenCode의 새 버전({{version}})을 설치할 수 있습니다.",
|
||||||
@@ -556,7 +539,6 @@ export const dict = {
|
|||||||
"common.moreOptions": "더 많은 옵션",
|
"common.moreOptions": "더 많은 옵션",
|
||||||
"common.learnMore": "더 알아보기",
|
"common.learnMore": "더 알아보기",
|
||||||
"common.rename": "이름 바꾸기",
|
"common.rename": "이름 바꾸기",
|
||||||
"common.export": "내보내기",
|
|
||||||
"common.reset": "초기화",
|
"common.reset": "초기화",
|
||||||
"common.archive": "보관",
|
"common.archive": "보관",
|
||||||
"common.delete": "삭제",
|
"common.delete": "삭제",
|
||||||
@@ -607,15 +589,15 @@ export const dict = {
|
|||||||
"settings.general.row.followup.title": "후속 조치 동작",
|
"settings.general.row.followup.title": "후속 조치 동작",
|
||||||
"settings.general.row.followup.description": "후속 프롬프트를 즉시 실행할지 대기열에 넣을지 선택하세요",
|
"settings.general.row.followup.description": "후속 프롬프트를 즉시 실행할지 대기열에 넣을지 선택하세요",
|
||||||
"settings.general.row.followup.option.queue": "대기열",
|
"settings.general.row.followup.option.queue": "대기열",
|
||||||
"settings.general.row.followup.option.steer": "즉시 반영",
|
"settings.general.row.followup.option.steer": "조종",
|
||||||
"settings.general.row.reasoningSummaries.title": "추론 요약 표시",
|
"settings.general.row.reasoningSummaries.title": "추론 요약 표시",
|
||||||
"settings.general.row.reasoningSummaries.description": "타임라인에 모델 추론 요약 표시",
|
"settings.general.row.reasoningSummaries.description": "타임라인에 모델 추론 요약 표시",
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "shell 도구 항목 펼치기",
|
"settings.general.row.shellToolPartsExpanded.title": "shell 도구 파트 펼치기",
|
||||||
"settings.general.row.shellToolPartsExpanded.description":
|
"settings.general.row.shellToolPartsExpanded.description":
|
||||||
"타임라인에서 기본적으로 shell 도구 항목을 펼친 상태로 표시합니다",
|
"타임라인에서 기본적으로 shell 도구 파트를 펼친 상태로 표시합니다",
|
||||||
"settings.general.row.editToolPartsExpanded.title": "edit 도구 항목 펼치기",
|
"settings.general.row.editToolPartsExpanded.title": "edit 도구 파트 펼치기",
|
||||||
"settings.general.row.editToolPartsExpanded.description":
|
"settings.general.row.editToolPartsExpanded.description":
|
||||||
"타임라인에서 기본적으로 edit, write, patch 도구 항목을 펼친 상태로 표시합니다",
|
"타임라인에서 기본적으로 edit, write, patch 도구 파트를 펼친 상태로 표시합니다",
|
||||||
"settings.general.row.wayland.title": "네이티브 Wayland 사용",
|
"settings.general.row.wayland.title": "네이티브 Wayland 사용",
|
||||||
"settings.general.row.wayland.description": "Wayland에서 X11 폴백을 비활성화합니다. 다시 시작해야 합니다.",
|
"settings.general.row.wayland.description": "Wayland에서 X11 폴백을 비활성화합니다. 다시 시작해야 합니다.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
@@ -742,8 +724,8 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.description": "셸 명령어 실행",
|
"settings.permissions.tool.bash.description": "셸 명령어 실행",
|
||||||
"settings.permissions.tool.task.title": "작업",
|
"settings.permissions.tool.task.title": "작업",
|
||||||
"settings.permissions.tool.task.description": "하위 에이전트 실행",
|
"settings.permissions.tool.task.description": "하위 에이전트 실행",
|
||||||
"settings.permissions.tool.skill.title": "스킬",
|
"settings.permissions.tool.skill.title": "기술",
|
||||||
"settings.permissions.tool.skill.description": "이름으로 스킬 불러오기",
|
"settings.permissions.tool.skill.description": "이름으로 기술 로드",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
"settings.permissions.tool.lsp.description": "언어 서버 쿼리 실행",
|
"settings.permissions.tool.lsp.description": "언어 서버 쿼리 실행",
|
||||||
"settings.permissions.tool.todowrite.title": "할 일 쓰기",
|
"settings.permissions.tool.todowrite.title": "할 일 쓰기",
|
||||||
@@ -814,9 +796,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{total}}개의 질문 중 {{current}}개",
|
"session.question.progress": "{{total}}개의 질문 중 {{current}}개",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "파일 탐색기",
|
"session.header.open.fileExplorer": "파일 탐색기",
|
||||||
"session.header.reveal.finder": "Finder에서 보기",
|
|
||||||
"session.header.reveal.fileExplorer": "파일 탐색기에서 보기",
|
|
||||||
"session.header.reveal.containingFolder": "이 항목이 있는 폴더 열기",
|
|
||||||
"session.header.open.fileManager": "파일 관리자",
|
"session.header.open.fileManager": "파일 관리자",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -853,14 +832,6 @@ export const dict = {
|
|||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "사용된 JS 힙 대 힙 제한. Chromium 전용.",
|
"debugBar.mem.tipUnavailable": "사용된 JS 힙 대 힙 제한. Chromium 전용.",
|
||||||
"debugBar.mem.tip": "사용된 JS 힙 대 힙 제한. {{limit}} 중 {{used}}.",
|
"debugBar.mem.tip": "사용된 JS 힙 대 힙 제한. {{limit}} 중 {{used}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "모든 대화형 요소에 포커스 스타일 강제 적용",
|
|
||||||
"debugBar.focus.on": "켬",
|
|
||||||
"debugBar.focus.off": "끔",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "선택한 언어를 변경하지 않고 전체 앱의 레이아웃 방향 강제 설정",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -884,12 +855,6 @@ export const dict = {
|
|||||||
"error.childStore.persistedProjectIconCreateFailed": "영구 프로젝트 아이콘 생성 실패",
|
"error.childStore.persistedProjectIconCreateFailed": "영구 프로젝트 아이콘 생성 실패",
|
||||||
"error.childStore.storeCreateFailed": "저장소 생성 실패",
|
"error.childStore.storeCreateFailed": "저장소 생성 실패",
|
||||||
"terminal.connectionLost.abnormalClose": "WebSocket이 비정상적으로 닫힘: {{code}}",
|
"terminal.connectionLost.abnormalClose": "WebSocket이 비정상적으로 닫힘: {{code}}",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"PTY 연결 티켓이 오리진 또는 CSRF 검사에서 거부되었습니다. 서버의 CORS 구성을 확인하세요.",
|
|
||||||
"terminal.connectTicket.statusError": "PTY 연결 티켓 실패(상태: {{status}})",
|
|
||||||
|
|
||||||
"titlebar.update": "업데이트",
|
|
||||||
"titlebar.updateVersion": "업데이트 {{version}}",
|
|
||||||
|
|
||||||
"command.project.previous": "이전 프로젝트",
|
"command.project.previous": "이전 프로젝트",
|
||||||
"command.project.next": "다음 프로젝트",
|
"command.project.next": "다음 프로젝트",
|
||||||
@@ -992,7 +957,7 @@ export const dict = {
|
|||||||
"home.sessions.group.today": "오늘",
|
"home.sessions.group.today": "오늘",
|
||||||
"home.sessions.group.yesterday": "어제",
|
"home.sessions.group.yesterday": "어제",
|
||||||
"home.sessions.group.older": "이전",
|
"home.sessions.group.older": "이전",
|
||||||
"home.providerTip": "75개 이상의 공급자에 연결하여 Claude, GPT, Gemini 등의 다른 모델을 사용하세요",
|
"home.providerTip": "75개 이상의 제공업체에 연결하여 Claude, GPT, Gemini 등의 다른 모델을 사용하세요",
|
||||||
|
|
||||||
"session.tab.unknown": "알 수 없는 세션",
|
"session.tab.unknown": "알 수 없는 세션",
|
||||||
"session.error.notFound": "이 세션을 찾을 수 없습니다",
|
"session.error.notFound": "이 세션을 찾을 수 없습니다",
|
||||||
@@ -1035,9 +1000,8 @@ export const dict = {
|
|||||||
"settings.general.row.showStatus.description": "제목 표시줄에 서버 상태 버튼 표시",
|
"settings.general.row.showStatus.description": "제목 표시줄에 서버 상태 버튼 표시",
|
||||||
"settings.general.row.mobileTitlebarBottom.title": "하단 탐색",
|
"settings.general.row.mobileTitlebarBottom.title": "하단 탐색",
|
||||||
"settings.general.row.mobileTitlebarBottom.description": "모바일에서 제목 표시줄과 세션 탭을 화면 하단에 배치",
|
"settings.general.row.mobileTitlebarBottom.description": "모바일에서 제목 표시줄과 세션 탭을 화면 하단에 배치",
|
||||||
"settings.general.row.showCustomAgents.title": "에이전트 표시",
|
"settings.general.row.showCustomAgents.title": "사용자 지정 에이전트",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "입력창에 에이전트 선택기 표시",
|
||||||
"입력창에서 에이전트를 전환합니다. 숨기면 기본적으로 Build 에이전트를 사용합니다.",
|
|
||||||
"settings.general.row.newInterface.title": "새 레이아웃",
|
"settings.general.row.newInterface.title": "새 레이아웃",
|
||||||
"settings.general.row.newInterface.badge": "신규",
|
"settings.general.row.newInterface.badge": "신규",
|
||||||
"settings.general.row.newInterface.description":
|
"settings.general.row.newInterface.description":
|
||||||
@@ -1049,119 +1013,4 @@ export const dict = {
|
|||||||
"settings.general.row.pinchZoom.description": "트랙패드 핀치 및 Ctrl-스크롤 제스처로 확대/축소 허용",
|
"settings.general.row.pinchZoom.description": "트랙패드 핀치 및 Ctrl-스크롤 제스처로 확대/축소 허용",
|
||||||
"settings.updates.action.downloading": "다운로드 중...",
|
"settings.updates.action.downloading": "다운로드 중...",
|
||||||
"settings.updates.action.installing": "설치 중...",
|
"settings.updates.action.installing": "설치 중...",
|
||||||
|
|
||||||
"command.logs.export": "로그 내보내기",
|
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "탭을 소개합니다. 탭으로 작업과 활성 세션을 정리하세요",
|
|
||||||
"help.tabs.toast.dismiss": "탭 정보 닫기",
|
|
||||||
"help.tabs.title": "탭 소개",
|
|
||||||
"help.tabs.description": "탭으로 작업과 활성 세션을 정리하세요",
|
|
||||||
"help.tabs.date": "7월 14일",
|
|
||||||
"help.tabs.introduction": "이제 OpenCode Desktop은 탭을 중심으로 구성됩니다.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"탭에서 새 세션을 시작하거나 프로젝트에서 기존 세션을 여세요. 새로운 작업을 시작할 때 새 탭을 열고, 작업을 마치면 닫으세요.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"탭을 몇 개 열어 두면 활성 세션을 더 쉽게 정리할 수 있습니다. 탭을 계속 열어 둘 예정이라면 기억하기 쉬운 이름으로 바꾸세요.",
|
|
||||||
"help.tabs.home": "새 홈 화면에서 모든 세션과 프로젝트를 확인할 수 있습니다. 세션을 선택하면 탭에서 열립니다.",
|
|
||||||
"help.tabs.persistence": "앱을 다시 열어도 탭은 그대로 열려 있습니다.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"새 디자인은 아직 Git Worktrees를 지원하지 않지만 곧 지원할 예정입니다. 이전 레이아웃을 계속 사용하려면 설정에서 레이아웃을 전환할 수 있습니다. 단, 몇 주 후에는 새 레이아웃이 영구 적용됩니다.",
|
|
||||||
|
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "파일",
|
|
||||||
"desktop.menu.edit": "편집",
|
|
||||||
"desktop.menu.view": "보기",
|
|
||||||
"desktop.menu.go": "이동",
|
|
||||||
"desktop.menu.window": "윈도우",
|
|
||||||
"desktop.menu.help": "도움말",
|
|
||||||
"desktop.menu.checkForUpdates": "업데이트 확인...",
|
|
||||||
"desktop.menu.settings": "설정",
|
|
||||||
"desktop.menu.reloadWebview": "WebView 새로 고침",
|
|
||||||
"desktop.menu.restart": "다시 시작",
|
|
||||||
"desktop.menu.exportLogs": "로그 내보내기...",
|
|
||||||
"desktop.menu.newSession": "새 세션",
|
|
||||||
"desktop.menu.openProject": "프로젝트 열기...",
|
|
||||||
"desktop.menu.newWindow": "새 윈도우",
|
|
||||||
"desktop.menu.closeWindow": "윈도우 닫기",
|
|
||||||
"desktop.menu.undo": "실행 취소",
|
|
||||||
"desktop.menu.redo": "다시 실행",
|
|
||||||
"desktop.menu.cut": "잘라내기",
|
|
||||||
"desktop.menu.copy": "복사",
|
|
||||||
"desktop.menu.paste": "붙여넣기",
|
|
||||||
"desktop.menu.delete": "삭제",
|
|
||||||
"desktop.menu.selectAll": "모두 선택",
|
|
||||||
"desktop.menu.toggleSidebar": "사이드바 표시/숨기기",
|
|
||||||
"desktop.menu.toggleTerminal": "터미널 표시/숨기기",
|
|
||||||
"desktop.menu.toggleFileTree": "파일 트리 표시/숨기기",
|
|
||||||
"desktop.menu.reload": "새로 고침",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "개발자 도구 표시/숨기기",
|
|
||||||
"desktop.menu.actualSize": "실제 크기",
|
|
||||||
"desktop.menu.zoomIn": "확대",
|
|
||||||
"desktop.menu.zoomOut": "축소",
|
|
||||||
"desktop.menu.toggleFullScreen": "전체 화면 전환",
|
|
||||||
"desktop.menu.back": "뒤로",
|
|
||||||
"desktop.menu.forward": "앞으로",
|
|
||||||
"desktop.menu.previousSession": "이전 세션",
|
|
||||||
"desktop.menu.nextSession": "다음 세션",
|
|
||||||
"desktop.menu.previousProject": "이전 프로젝트",
|
|
||||||
"desktop.menu.nextProject": "다음 프로젝트",
|
|
||||||
"desktop.menu.minimize": "최소화",
|
|
||||||
"desktop.menu.maximize": "최대화",
|
|
||||||
"desktop.menu.documentation": "OpenCode 문서",
|
|
||||||
"desktop.menu.supportForum": "지원 포럼",
|
|
||||||
"desktop.menu.shareFeedback": "피드백 보내기",
|
|
||||||
"desktop.menu.reportBug": "버그 신고",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode 메뉴",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "업데이트를 확인하지 못했습니다.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "업데이트 오류",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "최신 버전을 사용 중입니다.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "업데이트 없음",
|
|
||||||
"desktop.updater.dialog.ready.message": "업데이트 {{version}} 다운로드가 완료되었습니다. 지금 다시 시작할까요?",
|
|
||||||
"desktop.updater.dialog.ready.title": "업데이트 준비 완료",
|
|
||||||
"desktop.updater.dialog.restart": "다시 시작",
|
|
||||||
"desktop.updater.dialog.later": "나중에",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "다시 실행",
|
|
||||||
"desktop.recovery.action.exportLogs": "로그 내보내기",
|
|
||||||
"desktop.recovery.action.keepWaiting": "계속 기다리기",
|
|
||||||
"desktop.recovery.action.quit": "종료",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode를 불러오지 못했습니다",
|
|
||||||
"desktop.recovery.terminated": "OpenCode 윈도우가 예기치 않게 종료되었습니다",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode가 응답하지 않습니다",
|
|
||||||
"desktop.recovery.unresponsive.detail": "앱을 다시 실행하거나 로그를 열거나 계속 기다릴 수 있습니다.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "윈도우: {{window}}\nURL: {{url}}\n오류: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "윈도우: {{window}}\n원인: {{reason}}\n코드: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<알 수 없음>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "폴더 선택",
|
|
||||||
"desktop.dialog.chooseFile": "파일 선택",
|
|
||||||
"desktop.dialog.saveFile": "파일 저장",
|
|
||||||
"desktop.dialog.files": "파일",
|
|
||||||
"desktop.server.local": "로컬 서버",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL은 Windows에서만 사용할 수 있습니다",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL을 사용할 수 없습니다",
|
|
||||||
"desktop.wsl.error.listInstalled": "설치된 WSL 배포판 목록을 가져오지 못했습니다",
|
|
||||||
"desktop.wsl.error.listOnline": "온라인 WSL 배포판 목록을 가져오지 못했습니다",
|
|
||||||
"desktop.wsl.error.executeDistro": "배포판에서 명령을 실행할 수 없습니다",
|
|
||||||
"desktop.wsl.error.installWsl": "WSL 설치 실패",
|
|
||||||
"desktop.wsl.error.installDistro": "배포판 설치 실패: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "OpenCode 설치 실패",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} 배포판은 이미 추가되었습니다",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "이 배포판에 opencode가 설치되어 있지 않습니다",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode가 설치되어 있지만 실행할 수 없습니다",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "{{distro}}에 OpenCode가 설치되어 있지 않습니다",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"OpenCode 업데이트가 완료되었지만 {{distro}}에서 여전히 {{installed}} 버전으로 표시됩니다. 예상 버전: {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "버전 없음",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL 서버가 시작 후 종료되었습니다(코드={{code}} 신호={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL 서버가 정상 상태가 되기 전에 종료되었습니다(코드={{code}} 신호={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout": "{{distro}} 사이드카의 상태 확인이 {{timeout}}ms 후 시간 초과되었습니다",
|
|
||||||
"desktop.wsl.error.commandTimeout": "{{command}} {{args}} 명령이 {{timeout}}ms 후 시간 초과되었습니다",
|
|
||||||
"desktop.wsl.error.failedPort": "포트를 가져오지 못했습니다",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "선택기에서 파일을 선택하지 않았습니다",
|
|
||||||
"desktop.picker.error.sizeLimit": "선택한 첨부 파일이 {{limit}} MB 제한을 초과합니다",
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+55
-210
@@ -2,105 +2,6 @@ import { dict as en } from "./en"
|
|||||||
type Keys = keyof typeof en
|
type Keys = keyof typeof en
|
||||||
|
|
||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Arkiv",
|
|
||||||
"desktop.menu.edit": "Rediger",
|
|
||||||
"desktop.menu.view": "Vis",
|
|
||||||
"desktop.menu.go": "Gå",
|
|
||||||
"desktop.menu.window": "Vindu",
|
|
||||||
"desktop.menu.help": "Hjelp",
|
|
||||||
"desktop.menu.checkForUpdates": "Søk etter oppdateringer...",
|
|
||||||
"desktop.menu.settings": "Innstillinger",
|
|
||||||
"desktop.menu.reloadWebview": "Last inn WebView på nytt",
|
|
||||||
"desktop.menu.restart": "Start på nytt",
|
|
||||||
"desktop.menu.exportLogs": "Eksporter logger...",
|
|
||||||
"desktop.menu.newSession": "Ny sesjon",
|
|
||||||
"desktop.menu.openProject": "Åpne prosjekt...",
|
|
||||||
"desktop.menu.newWindow": "Nytt vindu",
|
|
||||||
"desktop.menu.closeWindow": "Lukk vindu",
|
|
||||||
"desktop.menu.undo": "Angre",
|
|
||||||
"desktop.menu.redo": "Gjør om",
|
|
||||||
"desktop.menu.cut": "Klipp ut",
|
|
||||||
"desktop.menu.copy": "Kopier",
|
|
||||||
"desktop.menu.paste": "Lim inn",
|
|
||||||
"desktop.menu.delete": "Slett",
|
|
||||||
"desktop.menu.selectAll": "Merk alt",
|
|
||||||
"desktop.menu.toggleSidebar": "Vis eller skjul sidepanel",
|
|
||||||
"desktop.menu.toggleTerminal": "Vis eller skjul terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Vis eller skjul filtreet",
|
|
||||||
"desktop.menu.reload": "Last inn på nytt",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Vis eller skjul utviklerverktøy",
|
|
||||||
"desktop.menu.actualSize": "Faktisk størrelse",
|
|
||||||
"desktop.menu.zoomIn": "Zoom inn",
|
|
||||||
"desktop.menu.zoomOut": "Zoom ut",
|
|
||||||
"desktop.menu.toggleFullScreen": "Slå fullskjerm av eller på",
|
|
||||||
"desktop.menu.back": "Tilbake",
|
|
||||||
"desktop.menu.forward": "Frem",
|
|
||||||
"desktop.menu.previousSession": "Forrige sesjon",
|
|
||||||
"desktop.menu.nextSession": "Neste sesjon",
|
|
||||||
"desktop.menu.previousProject": "Forrige prosjekt",
|
|
||||||
"desktop.menu.nextProject": "Neste prosjekt",
|
|
||||||
"desktop.menu.minimize": "Minimer",
|
|
||||||
"desktop.menu.maximize": "Maksimer",
|
|
||||||
"desktop.menu.documentation": "OpenCode-dokumentasjon",
|
|
||||||
"desktop.menu.supportForum": "Brukerstøtteforum",
|
|
||||||
"desktop.menu.shareFeedback": "Del tilbakemelding",
|
|
||||||
"desktop.menu.reportBug": "Rapporter en feil",
|
|
||||||
"desktop.menu.ariaLabel": "OpenCode-meny",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Søket etter oppdateringer mislyktes.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Oppdateringsfeil",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Du har den nyeste versjonen.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Ingen oppdateringer",
|
|
||||||
"desktop.updater.dialog.ready.message": "Oppdateringen {{version}} er lastet ned. Vil du starte på nytt nå?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Oppdateringen er klar",
|
|
||||||
"desktop.updater.dialog.restart": "Start på nytt",
|
|
||||||
"desktop.updater.dialog.later": "Senere",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Start appen på nytt",
|
|
||||||
"desktop.recovery.action.exportLogs": "Eksporter logger",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Fortsett å vente",
|
|
||||||
"desktop.recovery.action.quit": "Avslutt",
|
|
||||||
"desktop.recovery.loadFailed": "OpenCode kunne ikke lastes inn",
|
|
||||||
"desktop.recovery.terminated": "OpenCode-vinduet ble uventet avsluttet",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode svarer ikke",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Du kan starte appen på nytt, åpne loggene eller fortsette å vente.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Vindu: {{window}}\nURL: {{url}}\nFeil: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Vindu: {{window}}\nÅrsak: {{reason}}\nKode: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<ukjent>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Velg en mappe",
|
|
||||||
"desktop.dialog.chooseFile": "Velg en fil",
|
|
||||||
"desktop.dialog.saveFile": "Lagre fil",
|
|
||||||
"desktop.dialog.files": "Filer",
|
|
||||||
"desktop.server.local": "Lokal server",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL er bare tilgjengelig på Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL er utilgjengelig",
|
|
||||||
"desktop.wsl.error.listInstalled": "Kunne ikke vise installerte WSL-distribusjoner",
|
|
||||||
"desktop.wsl.error.listOnline": "Kunne ikke vise tilgjengelige WSL-distribusjoner",
|
|
||||||
"desktop.wsl.error.executeDistro": "Kan ikke kjøre kommandoer i distribusjonen",
|
|
||||||
"desktop.wsl.error.installWsl": "Installasjonen av WSL mislyktes",
|
|
||||||
"desktop.wsl.error.installDistro": "Kunne ikke installere distribusjonen: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Installasjonen av OpenCode mislyktes",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "{{distro}} er allerede lagt til",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode er ikke installert i denne distribusjonen",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode er installert, men kunne ikke kjøres",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode er ikke installert i {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Oppdateringen av OpenCode er fullført, men {{distro}} rapporterer fortsatt {{installed}}; forventet {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "ingen versjon",
|
|
||||||
"desktop.wsl.error.serverExited": "WSL-serveren ble avsluttet etter oppstart (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"WSL-serveren ble avsluttet før den var klar (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Tidsavbrudd for tilstandskontrollen av sidecar for {{distro}} etter {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Tidsavbrudd for {{command}} {{args}} etter {{timeout}} ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Kunne ikke hente port",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "Ingen fil ble valgt i filvelgeren",
|
|
||||||
"desktop.picker.error.sizeLimit": "De valgte vedleggene overskrider grensen på {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "Foreslått",
|
"command.category.suggested": "Foreslått",
|
||||||
"command.category.view": "Visning",
|
"command.category.view": "Visning",
|
||||||
"command.category.project": "Prosjekt",
|
"command.category.project": "Prosjekt",
|
||||||
@@ -118,7 +19,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Tillatelser",
|
"command.category.permissions": "Tillatelser",
|
||||||
"command.category.workspace": "Arbeidsområde",
|
"command.category.workspace": "Arbeidsområde",
|
||||||
"command.category.settings": "Innstillinger",
|
"command.category.settings": "Innstillinger",
|
||||||
"command.logs.export": "Eksporter logger",
|
|
||||||
|
|
||||||
"theme.scheme.system": "System",
|
"theme.scheme.system": "System",
|
||||||
"theme.scheme.light": "Lys",
|
"theme.scheme.light": "Lys",
|
||||||
@@ -131,8 +31,8 @@ export const dict = {
|
|||||||
"command.settings.open": "Åpne innstillinger",
|
"command.settings.open": "Åpne innstillinger",
|
||||||
"command.session.previous": "Forrige sesjon",
|
"command.session.previous": "Forrige sesjon",
|
||||||
"command.session.next": "Neste sesjon",
|
"command.session.next": "Neste sesjon",
|
||||||
"command.session.previous.unseen": "Forrige uleste sesjon",
|
"command.session.previous.unseen": "Forrige uleste økt",
|
||||||
"command.session.next.unseen": "Neste uleste sesjon",
|
"command.session.next.unseen": "Neste uleste økt",
|
||||||
"command.session.archive": "Arkiver sesjon",
|
"command.session.archive": "Arkiver sesjon",
|
||||||
|
|
||||||
"command.palette": "Kommandopalett",
|
"command.palette": "Kommandopalett",
|
||||||
@@ -191,9 +91,6 @@ export const dict = {
|
|||||||
"command.session.unshare": "Slutt å dele sesjon",
|
"command.session.unshare": "Slutt å dele sesjon",
|
||||||
"command.session.unshare.description": "Slutt å dele denne sesjonen",
|
"command.session.unshare.description": "Slutt å dele denne sesjonen",
|
||||||
|
|
||||||
"command.session.export": "Eksporter sesjon",
|
|
||||||
"command.session.export.description": "Eksporter hele sesjonsutskriften som JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Søk i filer, kommandoer og sesjoner",
|
"palette.search.placeholder": "Søk i filer, kommandoer og sesjoner",
|
||||||
"palette.search.placeholder.home": "Søk i kommandoer og sesjoner",
|
"palette.search.placeholder.home": "Søk i kommandoer og sesjoner",
|
||||||
"palette.empty": "Ingen resultater funnet",
|
"palette.empty": "Ingen resultater funnet",
|
||||||
@@ -204,7 +101,6 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Ingen leverandører funnet",
|
"dialog.provider.empty": "Ingen leverandører funnet",
|
||||||
"dialog.provider.group.popular": "Populære",
|
"dialog.provider.group.popular": "Populære",
|
||||||
"dialog.provider.group.other": "Andre",
|
"dialog.provider.group.other": "Andre",
|
||||||
"dialog.provider.custom.label": "Egendefinert OpenAI-kompatibel leverandør",
|
|
||||||
"dialog.provider.tag.recommended": "Anbefalt",
|
"dialog.provider.tag.recommended": "Anbefalt",
|
||||||
"dialog.provider.opencode.note": "Utvalgte modeller inkludert Claude, GPT, Gemini og mer",
|
"dialog.provider.opencode.note": "Utvalgte modeller inkludert Claude, GPT, Gemini og mer",
|
||||||
"dialog.provider.opencode.tagline": "Pålitelige, optimaliserte modeller",
|
"dialog.provider.opencode.tagline": "Pålitelige, optimaliserte modeller",
|
||||||
@@ -225,7 +121,6 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.model.unpaid.freeModels.title": "Gratis modeller levert av OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Gratis modeller levert av OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Legg til flere modeller fra populære leverandører",
|
"dialog.model.unpaid.addMore.title": "Legg til flere modeller fra populære leverandører",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Se over 70 flere leverandører",
|
|
||||||
|
|
||||||
"dialog.provider.viewAll": "Vis flere leverandører",
|
"dialog.provider.viewAll": "Vis flere leverandører",
|
||||||
|
|
||||||
@@ -233,14 +128,12 @@ export const dict = {
|
|||||||
"provider.connect.title.anthropicProMax": "Logg inn med Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Logg inn med Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Velg innloggingsmetode for {{provider}}.",
|
"provider.connect.selectMethod": "Velg innloggingsmetode for {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "API-nøkkel",
|
"provider.connect.method.apiKey": "API-nøkkel",
|
||||||
"provider.connect.method.browser": "Nettleser",
|
|
||||||
"provider.connect.method.headless": "Uten nettleser",
|
|
||||||
"provider.connect.status.inProgress": "Autorisering pågår...",
|
"provider.connect.status.inProgress": "Autorisering pågår...",
|
||||||
"provider.connect.status.waiting": "Venter på autorisering...",
|
"provider.connect.status.waiting": "Venter på autorisering...",
|
||||||
"provider.connect.status.failed": "Autorisering mislyktes: {{error}}",
|
"provider.connect.status.failed": "Autorisering mislyktes: {{error}}",
|
||||||
"provider.connect.apiKey.description":
|
"provider.connect.apiKey.description":
|
||||||
"Skriv inn API-nøkkelen din for {{provider}} for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
|
"Skriv inn din {{provider}} API-nøkkel for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
|
||||||
"provider.connect.apiKey.label": "{{provider}}-API-nøkkel",
|
"provider.connect.apiKey.label": "{{provider}} API-nøkkel",
|
||||||
"provider.connect.apiKey.placeholder": "API-nøkkel",
|
"provider.connect.apiKey.placeholder": "API-nøkkel",
|
||||||
"provider.connect.apiKey.required": "API-nøkkel er påkrevd",
|
"provider.connect.apiKey.required": "API-nøkkel er påkrevd",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
@@ -254,7 +147,7 @@ export const dict = {
|
|||||||
"provider.connect.oauth.code.visit.link": "denne lenken",
|
"provider.connect.oauth.code.visit.link": "denne lenken",
|
||||||
"provider.connect.oauth.code.visit.suffix":
|
"provider.connect.oauth.code.visit.suffix":
|
||||||
" for å hente autorisasjonskoden din for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
|
" for å hente autorisasjonskoden din for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
|
||||||
"provider.connect.oauth.code.label": "{{method}}-autorisasjonskode",
|
"provider.connect.oauth.code.label": "{{method}} autorisasjonskode",
|
||||||
"provider.connect.oauth.code.placeholder": "Autorisasjonskode",
|
"provider.connect.oauth.code.placeholder": "Autorisasjonskode",
|
||||||
"provider.connect.oauth.code.required": "Autorisasjonskode er påkrevd",
|
"provider.connect.oauth.code.required": "Autorisasjonskode er påkrevd",
|
||||||
"provider.connect.oauth.code.invalid": "Ugyldig autorisasjonskode",
|
"provider.connect.oauth.code.invalid": "Ugyldig autorisasjonskode",
|
||||||
@@ -267,7 +160,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.description": "{{provider}}-modeller er nå tilgjengelige.",
|
"provider.connect.toast.connected.description": "{{provider}}-modeller er nå tilgjengelige.",
|
||||||
|
|
||||||
"provider.custom.title": "Egendefinert leverandør",
|
"provider.custom.title": "Egendefinert leverandør",
|
||||||
"provider.custom.unavailable": "Egendefinerte leverandører er ikke tilgjengelige på denne serveren",
|
|
||||||
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel leverandør. Se ",
|
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel leverandør. Se ",
|
||||||
"provider.custom.description.link": "dokumentasjon for leverandørkonfigurasjon",
|
"provider.custom.description.link": "dokumentasjon for leverandørkonfigurasjon",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -276,12 +168,11 @@ export const dict = {
|
|||||||
"provider.custom.field.providerID.description": "Små bokstaver, tall, bindestreker eller understreker",
|
"provider.custom.field.providerID.description": "Små bokstaver, tall, bindestreker eller understreker",
|
||||||
"provider.custom.field.name.label": "Visningsnavn",
|
"provider.custom.field.name.label": "Visningsnavn",
|
||||||
"provider.custom.field.name.placeholder": "Min AI-leverandør",
|
"provider.custom.field.name.placeholder": "Min AI-leverandør",
|
||||||
"provider.custom.field.baseURL.label": "Basis-URL",
|
"provider.custom.field.baseURL.label": "Base-URL",
|
||||||
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "API-nøkkel",
|
"provider.custom.field.apiKey.label": "API-nøkkel",
|
||||||
"provider.custom.field.apiKey.placeholder": "API-nøkkel",
|
"provider.custom.field.apiKey.placeholder": "API-nøkkel",
|
||||||
"provider.custom.field.apiKey.description":
|
"provider.custom.field.apiKey.description": "Valgfritt. La stå tomt hvis du administrerer autentisering via headers.",
|
||||||
"Valgfritt. La stå tomt hvis du administrerer autentisering via HTTP-hoder.",
|
|
||||||
"provider.custom.models.label": "Modeller",
|
"provider.custom.models.label": "Modeller",
|
||||||
"provider.custom.models.id.label": "ID",
|
"provider.custom.models.id.label": "ID",
|
||||||
"provider.custom.models.id.placeholder": "modell-id",
|
"provider.custom.models.id.placeholder": "modell-id",
|
||||||
@@ -289,18 +180,18 @@ export const dict = {
|
|||||||
"provider.custom.models.name.placeholder": "Visningsnavn",
|
"provider.custom.models.name.placeholder": "Visningsnavn",
|
||||||
"provider.custom.models.remove": "Fjern modell",
|
"provider.custom.models.remove": "Fjern modell",
|
||||||
"provider.custom.models.add": "Legg til modell",
|
"provider.custom.models.add": "Legg til modell",
|
||||||
"provider.custom.headers.label": "HTTP-hoder (valgfritt)",
|
"provider.custom.headers.label": "Headers (valgfritt)",
|
||||||
"provider.custom.headers.key.label": "HTTP-hode",
|
"provider.custom.headers.key.label": "Header",
|
||||||
"provider.custom.headers.key.placeholder": "Navn på HTTP-hode",
|
"provider.custom.headers.key.placeholder": "Header-Navn",
|
||||||
"provider.custom.headers.value.label": "Verdi",
|
"provider.custom.headers.value.label": "Verdi",
|
||||||
"provider.custom.headers.value.placeholder": "verdi",
|
"provider.custom.headers.value.placeholder": "verdi",
|
||||||
"provider.custom.headers.remove": "Fjern HTTP-hode",
|
"provider.custom.headers.remove": "Fjern header",
|
||||||
"provider.custom.headers.add": "Legg til HTTP-hode",
|
"provider.custom.headers.add": "Legg til header",
|
||||||
"provider.custom.error.providerID.required": "Leverandør-ID er påkrevd",
|
"provider.custom.error.providerID.required": "Leverandør-ID er påkrevd",
|
||||||
"provider.custom.error.providerID.format": "Bruk små bokstaver, tall, bindestreker eller understreker",
|
"provider.custom.error.providerID.format": "Bruk små bokstaver, tall, bindestreker eller understreker",
|
||||||
"provider.custom.error.providerID.exists": "Denne leverandør-ID-en finnes allerede",
|
"provider.custom.error.providerID.exists": "Den leverandør-IDen finnes allerede",
|
||||||
"provider.custom.error.name.required": "Visningsnavn er påkrevd",
|
"provider.custom.error.name.required": "Visningsnavn er påkrevd",
|
||||||
"provider.custom.error.baseURL.required": "Basis-URL er påkrevd",
|
"provider.custom.error.baseURL.required": "Base-URL er påkrevd",
|
||||||
"provider.custom.error.baseURL.format": "Må starte med http:// eller https://",
|
"provider.custom.error.baseURL.format": "Må starte med http:// eller https://",
|
||||||
"provider.custom.error.required": "Påkrevd",
|
"provider.custom.error.required": "Påkrevd",
|
||||||
"provider.custom.error.duplicate": "Duplikat",
|
"provider.custom.error.duplicate": "Duplikat",
|
||||||
@@ -333,7 +224,7 @@ export const dict = {
|
|||||||
"common.cancel": "Avbryt",
|
"common.cancel": "Avbryt",
|
||||||
"common.connect": "Koble til",
|
"common.connect": "Koble til",
|
||||||
"common.disconnect": "Koble fra",
|
"common.disconnect": "Koble fra",
|
||||||
"common.continue": "Fortsett",
|
"common.continue": "Send inn",
|
||||||
"common.submit": "Send inn",
|
"common.submit": "Send inn",
|
||||||
"common.save": "Lagre",
|
"common.save": "Lagre",
|
||||||
"common.saving": "Lagrer...",
|
"common.saving": "Lagrer...",
|
||||||
@@ -354,13 +245,13 @@ export const dict = {
|
|||||||
"prompt.example.3": "Fiks ødelagte tester",
|
"prompt.example.3": "Fiks ødelagte tester",
|
||||||
"prompt.example.4": "Forklar hvordan autentisering fungerer",
|
"prompt.example.4": "Forklar hvordan autentisering fungerer",
|
||||||
"prompt.example.5": "Finn og fiks sikkerhetssårbarheter",
|
"prompt.example.5": "Finn og fiks sikkerhetssårbarheter",
|
||||||
"prompt.example.6": "Legg til enhetstester for brukertjenesten",
|
"prompt.example.6": "Legg til enhetstester for brukerservicen",
|
||||||
"prompt.example.7": "Refaktorer denne funksjonen for bedre lesbarhet",
|
"prompt.example.7": "Refaktorer denne funksjonen for bedre lesbarhet",
|
||||||
"prompt.example.8": "Hva betyr denne feilen?",
|
"prompt.example.8": "Hva betyr denne feilen?",
|
||||||
"prompt.example.9": "Hjelp meg med å feilsøke dette problemet",
|
"prompt.example.9": "Hjelp meg med å feilsøke dette problemet",
|
||||||
"prompt.example.10": "Generer API-dokumentasjon",
|
"prompt.example.10": "Generer API-dokumentasjon",
|
||||||
"prompt.example.11": "Optimaliser databasespørringer",
|
"prompt.example.11": "Optimaliser databasespørringer",
|
||||||
"prompt.example.12": "Legg til inndatavalidering",
|
"prompt.example.12": "Legg til inputvalidering",
|
||||||
"prompt.example.13": "Lag en ny komponent for...",
|
"prompt.example.13": "Lag en ny komponent for...",
|
||||||
"prompt.example.14": "Hvordan deployer jeg dette prosjektet?",
|
"prompt.example.14": "Hvordan deployer jeg dette prosjektet?",
|
||||||
"prompt.example.15": "Gjennomgå koden min for beste praksis",
|
"prompt.example.15": "Gjennomgå koden min for beste praksis",
|
||||||
@@ -370,7 +261,7 @@ export const dict = {
|
|||||||
"prompt.example.19": "Legg til logging i hele kodebasen",
|
"prompt.example.19": "Legg til logging i hele kodebasen",
|
||||||
"prompt.example.20": "Hvilke avhengigheter er utdaterte?",
|
"prompt.example.20": "Hvilke avhengigheter er utdaterte?",
|
||||||
"prompt.example.21": "Hjelp meg med å skrive et migreringsskript",
|
"prompt.example.21": "Hjelp meg med å skrive et migreringsskript",
|
||||||
"prompt.example.22": "Implementer hurtigbufring for dette endepunktet",
|
"prompt.example.22": "Implementer caching for dette endepunktet",
|
||||||
"prompt.example.23": "Legg til paginering i denne listen",
|
"prompt.example.23": "Legg til paginering i denne listen",
|
||||||
"prompt.example.24": "Lag en CLI-kommando for...",
|
"prompt.example.24": "Lag en CLI-kommando for...",
|
||||||
"prompt.example.25": "Hvordan fungerer miljøvariabler her?",
|
"prompt.example.25": "Hvordan fungerer miljøvariabler her?",
|
||||||
@@ -380,7 +271,7 @@ export const dict = {
|
|||||||
"prompt.dropzone.label": "Slipp bilder, PDF-er eller tekstfiler her",
|
"prompt.dropzone.label": "Slipp bilder, PDF-er eller tekstfiler her",
|
||||||
"prompt.dropzone.file.label": "Slipp for å @nevne fil",
|
"prompt.dropzone.file.label": "Slipp for å @nevne fil",
|
||||||
"prompt.slash.badge.custom": "egendefinert",
|
"prompt.slash.badge.custom": "egendefinert",
|
||||||
"prompt.slash.badge.skill": "ferdighet",
|
"prompt.slash.badge.skill": "skill",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
"prompt.context.active": "aktiv",
|
"prompt.context.active": "aktiv",
|
||||||
"prompt.context.includeActiveFile": "Inkluder aktiv fil",
|
"prompt.context.includeActiveFile": "Inkluder aktiv fil",
|
||||||
@@ -406,14 +297,14 @@ export const dict = {
|
|||||||
"prompt.toast.shellSendFailed.title": "Kunne ikke sende shell-kommando",
|
"prompt.toast.shellSendFailed.title": "Kunne ikke sende shell-kommando",
|
||||||
"prompt.toast.commandSendFailed.title": "Kunne ikke sende kommando",
|
"prompt.toast.commandSendFailed.title": "Kunne ikke sende kommando",
|
||||||
"prompt.toast.promptSendFailed.title": "Kunne ikke sende forespørsel",
|
"prompt.toast.promptSendFailed.title": "Kunne ikke sende forespørsel",
|
||||||
"prompt.toast.promptSendFailed.description": "Kunne ikke hente sesjon",
|
"prompt.toast.promptSendFailed.description": "Kunne ikke hente økt",
|
||||||
|
|
||||||
"dialog.mcp.title": "MCP-er",
|
"dialog.mcp.title": "MCP-er",
|
||||||
"dialog.mcp.description": "{{enabled}} av {{total}} aktivert",
|
"dialog.mcp.description": "{{enabled}} av {{total}} aktivert",
|
||||||
"dialog.mcp.empty": "Ingen MCP-er konfigurert",
|
"dialog.mcp.empty": "Ingen MCP-er konfigurert",
|
||||||
|
|
||||||
"dialog.lsp.empty": "LSP-er automatisk oppdaget fra filtyper",
|
"dialog.lsp.empty": "LSP-er automatisk oppdaget fra filtyper",
|
||||||
"dialog.plugins.empty": "Programtillegg konfigurert i opencode.json",
|
"dialog.plugins.empty": "Plugins konfigurert i opencode.json",
|
||||||
|
|
||||||
"mcp.status.connected": "tilkoblet",
|
"mcp.status.connected": "tilkoblet",
|
||||||
"mcp.status.failed": "mislyktes",
|
"mcp.status.failed": "mislyktes",
|
||||||
@@ -473,11 +364,8 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup.description": "Kjører etter at et nytt arbeidsområde (worktree) er opprettet.",
|
"dialog.project.edit.worktree.startup.description": "Kjører etter at et nytt arbeidsområde (worktree) er opprettet.",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
|
||||||
|
|
||||||
"dialog.usageExceeded.dontShowAgain": "Ikke vis igjen",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Kontekstfordeling",
|
"context.breakdown.title": "Kontekstfordeling",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note": 'Omtrentlig fordeling av input-tokens. "Annet" inkluderer verktøydefinisjoner og overhead.',
|
||||||
'Omtrentlig fordeling av inndatatokener. "Annet" inkluderer verktøydefinisjoner og overhead.',
|
|
||||||
"context.breakdown.system": "System",
|
"context.breakdown.system": "System",
|
||||||
"context.breakdown.user": "Bruker",
|
"context.breakdown.user": "Bruker",
|
||||||
"context.breakdown.assistant": "Assistent",
|
"context.breakdown.assistant": "Assistent",
|
||||||
@@ -487,26 +375,24 @@ export const dict = {
|
|||||||
"context.systemPrompt.title": "Systemprompt",
|
"context.systemPrompt.title": "Systemprompt",
|
||||||
"context.rawMessages.title": "Rå meldinger",
|
"context.rawMessages.title": "Rå meldinger",
|
||||||
|
|
||||||
"context.export.session": "Eksporter sesjon",
|
|
||||||
|
|
||||||
"context.stats.session": "Sesjon",
|
"context.stats.session": "Sesjon",
|
||||||
"context.stats.messages": "Meldinger",
|
"context.stats.messages": "Meldinger",
|
||||||
"context.stats.provider": "Leverandør",
|
"context.stats.provider": "Leverandør",
|
||||||
"context.stats.model": "Modell",
|
"context.stats.model": "Modell",
|
||||||
"context.stats.limit": "Kontekstgrense",
|
"context.stats.limit": "Kontekstgrense",
|
||||||
"context.stats.totalTokens": "Totalt antall tokener",
|
"context.stats.totalTokens": "Totalt antall tokens",
|
||||||
"context.stats.usage": "Forbruk",
|
"context.stats.usage": "Forbruk",
|
||||||
"context.stats.inputTokens": "Inndatatokener",
|
"context.stats.inputTokens": "Input-tokens",
|
||||||
"context.stats.outputTokens": "Utdatatokener",
|
"context.stats.outputTokens": "Output-tokens",
|
||||||
"context.stats.reasoningTokens": "Resonneringstokener",
|
"context.stats.reasoningTokens": "Resonnerings-tokens",
|
||||||
"context.stats.cacheTokens": "Hurtigbuffertokener (les/skriv)",
|
"context.stats.cacheTokens": "Cache-tokens (les/skriv)",
|
||||||
"context.stats.userMessages": "Brukermeldinger",
|
"context.stats.userMessages": "Brukermeldinger",
|
||||||
"context.stats.assistantMessages": "Assistentmeldinger",
|
"context.stats.assistantMessages": "Assistentmeldinger",
|
||||||
"context.stats.totalCost": "Total kostnad",
|
"context.stats.totalCost": "Total kostnad",
|
||||||
"context.stats.sessionCreated": "Sesjon opprettet",
|
"context.stats.sessionCreated": "Sesjon opprettet",
|
||||||
"context.stats.lastActivity": "Siste aktivitet",
|
"context.stats.lastActivity": "Siste aktivitet",
|
||||||
|
|
||||||
"context.usage.tokens": "Tokener",
|
"context.usage.tokens": "Tokens",
|
||||||
"context.usage.usage": "Forbruk",
|
"context.usage.usage": "Forbruk",
|
||||||
"context.usage.cost": "Kostnad",
|
"context.usage.cost": "Kostnad",
|
||||||
"context.usage.clickToView": "Klikk for å se kontekst",
|
"context.usage.clickToView": "Klikk for å se kontekst",
|
||||||
@@ -537,9 +423,9 @@ export const dict = {
|
|||||||
"toast.scheme.title": "Fargevalg",
|
"toast.scheme.title": "Fargevalg",
|
||||||
|
|
||||||
"toast.workspace.enabled.title": "Arbeidsområder aktivert",
|
"toast.workspace.enabled.title": "Arbeidsområder aktivert",
|
||||||
"toast.workspace.enabled.description": "Flere arbeidsområder vises nå i sidefeltet",
|
"toast.workspace.enabled.description": "Flere worktrees vises nå i sidefeltet",
|
||||||
"toast.workspace.disabled.title": "Arbeidsområder deaktivert",
|
"toast.workspace.disabled.title": "Arbeidsområder deaktivert",
|
||||||
"toast.workspace.disabled.description": "Kun hovedarbeidsområdet vises i sidefeltet",
|
"toast.workspace.disabled.description": "Kun hoved-worktree vises i sidefeltet",
|
||||||
|
|
||||||
"toast.permissions.autoaccept.on.title": "Aksepterer tillatelser automatisk",
|
"toast.permissions.autoaccept.on.title": "Aksepterer tillatelser automatisk",
|
||||||
"toast.permissions.autoaccept.on.description": "Forespørsler om tillatelse vil bli godkjent automatisk",
|
"toast.permissions.autoaccept.on.description": "Forespørsler om tillatelse vil bli godkjent automatisk",
|
||||||
@@ -566,11 +452,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.failed.title": "Kunne ikke stoppe deling av sesjon",
|
"toast.session.unshare.failed.title": "Kunne ikke stoppe deling av sesjon",
|
||||||
"toast.session.unshare.failed.description": "Det oppstod en feil da delingen av sesjonen skulle stoppes",
|
"toast.session.unshare.failed.description": "Det oppstod en feil da delingen av sesjonen skulle stoppes",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Sesjon eksportert",
|
|
||||||
"toast.session.export.success.description": "Sesjonen ble lagret i {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Kunne ikke eksportere sesjon",
|
|
||||||
"toast.session.export.failed.description": "Det oppstod en feil under eksport av sesjonen",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Kunne ikke laste sesjoner for {{project}}",
|
"toast.session.listFailed.title": "Kunne ikke laste sesjoner for {{project}}",
|
||||||
|
|
||||||
"toast.update.title": "Oppdatering tilgjengelig",
|
"toast.update.title": "Oppdatering tilgjengelig",
|
||||||
@@ -592,7 +473,7 @@ export const dict = {
|
|||||||
"error.page.version": "Versjon: {{version}}",
|
"error.page.version": "Versjon: {{version}}",
|
||||||
|
|
||||||
"error.dev.rootNotFound":
|
"error.dev.rootNotFound":
|
||||||
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributtet er feilstavet?",
|
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributten er feilstavet?",
|
||||||
|
|
||||||
"error.serverSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?",
|
"error.serverSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?",
|
||||||
"directory.error.invalidUrl": "Ugyldig mappe i URL-en.",
|
"directory.error.invalidUrl": "Ugyldig mappe i URL-en.",
|
||||||
@@ -692,7 +573,7 @@ export const dict = {
|
|||||||
"status.popover.tab.servers": "Servere",
|
"status.popover.tab.servers": "Servere",
|
||||||
"status.popover.tab.mcp": "MCP",
|
"status.popover.tab.mcp": "MCP",
|
||||||
"status.popover.tab.lsp": "LSP",
|
"status.popover.tab.lsp": "LSP",
|
||||||
"status.popover.tab.plugins": "Programtillegg",
|
"status.popover.tab.plugins": "Plugins",
|
||||||
"status.popover.action.manageServers": "Administrer servere",
|
"status.popover.action.manageServers": "Administrer servere",
|
||||||
|
|
||||||
"session.share.popover.title": "Publiser på nett",
|
"session.share.popover.title": "Publiser på nett",
|
||||||
@@ -720,12 +601,6 @@ export const dict = {
|
|||||||
"terminal.connectionLost.title": "Tilkobling mistet",
|
"terminal.connectionLost.title": "Tilkobling mistet",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"Terminalforbindelsen ble avbrutt. Dette kan skje når serveren starter på nytt.",
|
"Terminalforbindelsen ble avbrutt. Dette kan skje når serveren starter på nytt.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"Tilkoblingsbilletten for PTY ble avvist av opprinnelses- eller CSRF-kontroller. Kontroller serverens CORS-konfigurasjon.",
|
|
||||||
"terminal.connectTicket.statusError": "Tilkoblingsbilletten for PTY mislyktes med {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Oppdater",
|
|
||||||
"titlebar.updateVersion": "Oppdater {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Lukk fane",
|
"common.closeTab": "Lukk fane",
|
||||||
"common.dismiss": "Avvis",
|
"common.dismiss": "Avvis",
|
||||||
@@ -733,13 +608,12 @@ export const dict = {
|
|||||||
"common.moreOptions": "Flere alternativer",
|
"common.moreOptions": "Flere alternativer",
|
||||||
"common.learnMore": "Lær mer",
|
"common.learnMore": "Lær mer",
|
||||||
"common.rename": "Gi nytt navn",
|
"common.rename": "Gi nytt navn",
|
||||||
"common.export": "Eksporter",
|
|
||||||
"common.reset": "Tilbakestill",
|
"common.reset": "Tilbakestill",
|
||||||
"common.archive": "Arkiver",
|
"common.archive": "Arkiver",
|
||||||
"common.delete": "Slett",
|
"common.delete": "Slett",
|
||||||
"common.close": "Lukk",
|
"common.close": "Lukk",
|
||||||
"common.edit": "Rediger",
|
"common.edit": "Rediger",
|
||||||
"common.loadMore": "Last inn flere",
|
"common.loadMore": "Last flere",
|
||||||
"common.key.esc": "ESC",
|
"common.key.esc": "ESC",
|
||||||
|
|
||||||
"sidebar.menu.toggle": "Veksle meny",
|
"sidebar.menu.toggle": "Veksle meny",
|
||||||
@@ -777,17 +651,16 @@ export const dict = {
|
|||||||
"settings.general.row.appearance.title": "Utseende",
|
"settings.general.row.appearance.title": "Utseende",
|
||||||
"settings.general.row.appearance.description": "Tilpass hvordan OpenCode ser ut på enheten din",
|
"settings.general.row.appearance.description": "Tilpass hvordan OpenCode ser ut på enheten din",
|
||||||
"settings.general.row.colorScheme.title": "Fargevalg",
|
"settings.general.row.colorScheme.title": "Fargevalg",
|
||||||
"settings.general.row.colorScheme.description":
|
"settings.general.row.colorScheme.description": "Velg om OpenCode skal følge systemets, lyst eller mørkt tema",
|
||||||
"Velg om OpenCode skal følge systeminnstillingen eller bruke lyst eller mørkt tema",
|
|
||||||
"settings.general.row.theme.title": "Tema",
|
"settings.general.row.theme.title": "Tema",
|
||||||
"settings.general.row.theme.description": "Tilpass temaet i OpenCode.",
|
"settings.general.row.theme.description": "Tilpass hvordan OpenCode er tematisert.",
|
||||||
"settings.general.row.font.title": "Kodefont",
|
"settings.general.row.font.title": "Kodefont",
|
||||||
"settings.general.row.font.description": "Tilpass skrifttypen som brukes i kodeblokker",
|
"settings.general.row.font.description": "Tilpass skrifttypen som brukes i kodeblokker",
|
||||||
"settings.general.row.terminalFont.title": "Terminalskrift",
|
"settings.general.row.terminalFont.title": "Terminalskrift",
|
||||||
"settings.general.row.terminalFont.description": "Tilpass skrifttypen som brukes i terminalen",
|
"settings.general.row.terminalFont.description": "Tilpass skrifttypen som brukes i terminalen",
|
||||||
"settings.general.row.uiFont.title": "UI-skrift",
|
"settings.general.row.uiFont.title": "UI-skrift",
|
||||||
"settings.general.row.uiFont.description": "Tilpass skrifttypen som brukes i hele grensesnittet",
|
"settings.general.row.uiFont.description": "Tilpass skrifttypen som brukes i hele grensesnittet",
|
||||||
"settings.general.row.followup.title": "Oppfølgingsatferd",
|
"settings.general.row.followup.title": "Oppfølgingsadferd",
|
||||||
"settings.general.row.followup.description": "Velg om oppfølgingsspørsmål skal kjøres umiddelbart eller vente i kø",
|
"settings.general.row.followup.description": "Velg om oppfølgingsspørsmål skal kjøres umiddelbart eller vente i kø",
|
||||||
"settings.general.row.followup.option.queue": "Kø",
|
"settings.general.row.followup.option.queue": "Kø",
|
||||||
"settings.general.row.followup.option.steer": "Styr",
|
"settings.general.row.followup.option.steer": "Styr",
|
||||||
@@ -798,10 +671,10 @@ export const dict = {
|
|||||||
"settings.general.row.editToolPartsExpanded.title": "Utvid edit-verktøydeler",
|
"settings.general.row.editToolPartsExpanded.title": "Utvid edit-verktøydeler",
|
||||||
"settings.general.row.editToolPartsExpanded.description":
|
"settings.general.row.editToolPartsExpanded.description":
|
||||||
"Vis edit-, write- og patch-verktøydeler utvidet som standard i tidslinjen",
|
"Vis edit-, write- og patch-verktøydeler utvidet som standard i tidslinjen",
|
||||||
"settings.general.row.wayland.title": "Bruk Wayland direkte",
|
"settings.general.row.wayland.title": "Bruk innebygd Wayland",
|
||||||
"settings.general.row.wayland.description": "Deaktiver X11-reserveløsningen på Wayland. Krever omstart.",
|
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Krever omstart.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"På Linux med skjermer med blandet oppdateringsfrekvens kan direkte Wayland-støtte være mer stabilt.",
|
"På Linux med skjermer med blandet oppdateringsfrekvens kan innebygd Wayland være mer stabilt.",
|
||||||
|
|
||||||
"settings.general.row.releaseNotes.title": "Utgivelsesnotater",
|
"settings.general.row.releaseNotes.title": "Utgivelsesnotater",
|
||||||
"settings.general.row.releaseNotes.description": 'Vis "Hva er nytt"-vinduer etter oppdateringer',
|
"settings.general.row.releaseNotes.description": 'Vis "Hva er nytt"-vinduer etter oppdateringer',
|
||||||
@@ -812,7 +685,7 @@ export const dict = {
|
|||||||
"settings.updates.row.check.description": "Se etter oppdateringer manuelt og installer hvis tilgjengelig",
|
"settings.updates.row.check.description": "Se etter oppdateringer manuelt og installer hvis tilgjengelig",
|
||||||
"settings.updates.action.checkNow": "Sjekk nå",
|
"settings.updates.action.checkNow": "Sjekk nå",
|
||||||
"settings.updates.action.checking": "Sjekker...",
|
"settings.updates.action.checking": "Sjekker...",
|
||||||
"settings.updates.toast.latest.title": "OpenCode er oppdatert",
|
"settings.updates.toast.latest.title": "Du er oppdatert",
|
||||||
"settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av OpenCode.",
|
"settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av OpenCode.",
|
||||||
"sound.option.none": "Ingen",
|
"sound.option.none": "Ingen",
|
||||||
"sound.option.alert01": "Varsel 01",
|
"sound.option.alert01": "Varsel 01",
|
||||||
@@ -881,7 +754,7 @@ export const dict = {
|
|||||||
"settings.shortcuts.reset.toast.title": "Snarveier tilbakestilt",
|
"settings.shortcuts.reset.toast.title": "Snarveier tilbakestilt",
|
||||||
"settings.shortcuts.reset.toast.description": "Tastatursnarveier er tilbakestilt til standard.",
|
"settings.shortcuts.reset.toast.description": "Tastatursnarveier er tilbakestilt til standard.",
|
||||||
"settings.shortcuts.conflict.title": "Snarvei allerede i bruk",
|
"settings.shortcuts.conflict.title": "Snarvei allerede i bruk",
|
||||||
"settings.shortcuts.conflict.description": "{{keybind}} er allerede tilordnet {{titles}}.",
|
"settings.shortcuts.conflict.description": "{{keybind}} er allerede tilordnet til {{titles}}.",
|
||||||
"settings.shortcuts.unassigned": "Ikke tilordnet",
|
"settings.shortcuts.unassigned": "Ikke tilordnet",
|
||||||
"settings.shortcuts.pressKeys": "Trykk taster",
|
"settings.shortcuts.pressKeys": "Trykk taster",
|
||||||
"settings.shortcuts.search.placeholder": "Søk etter snarveier",
|
"settings.shortcuts.search.placeholder": "Søk etter snarveier",
|
||||||
@@ -931,7 +804,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
"settings.permissions.tool.grep.description": "Søk i filinnhold ved hjelp av regulære uttrykk",
|
"settings.permissions.tool.grep.description": "Søk i filinnhold ved hjelp av regulære uttrykk",
|
||||||
"settings.permissions.tool.list.title": "Liste",
|
"settings.permissions.tool.list.title": "Liste",
|
||||||
"settings.permissions.tool.list.description": "List opp filer i en mappe",
|
"settings.permissions.tool.list.description": "List filer i en mappe",
|
||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "Kjør shell-kommandoer",
|
"settings.permissions.tool.bash.description": "Kjør shell-kommandoer",
|
||||||
"settings.permissions.tool.task.title": "Oppgave",
|
"settings.permissions.tool.task.title": "Oppgave",
|
||||||
@@ -949,7 +822,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.external_directory.title": "Ekstern mappe",
|
"settings.permissions.tool.external_directory.title": "Ekstern mappe",
|
||||||
"settings.permissions.tool.external_directory.description": "Få tilgang til filer utenfor prosjektmappen",
|
"settings.permissions.tool.external_directory.description": "Få tilgang til filer utenfor prosjektmappen",
|
||||||
"settings.permissions.tool.doom_loop.title": "Doom Loop",
|
"settings.permissions.tool.doom_loop.title": "Doom Loop",
|
||||||
"settings.permissions.tool.doom_loop.description": "Oppdager gjentatte verktøykall med identiske inndata",
|
"settings.permissions.tool.doom_loop.description": "Oppdager gjentatte verktøykall med identisk input",
|
||||||
|
|
||||||
"session.delete.failed.title": "Kunne ikke slette sesjon",
|
"session.delete.failed.title": "Kunne ikke slette sesjon",
|
||||||
"session.delete.title": "Slett sesjon",
|
"session.delete.title": "Slett sesjon",
|
||||||
@@ -994,14 +867,14 @@ export const dict = {
|
|||||||
"common.time.hoursAgo.short": "{{count}} t siden",
|
"common.time.hoursAgo.short": "{{count}} t siden",
|
||||||
"common.time.daysAgo.short": "{{count}} d siden",
|
"common.time.daysAgo.short": "{{count}} d siden",
|
||||||
"settings.providers.connected.environmentDescription": "Koblet til fra miljøvariablene dine",
|
"settings.providers.connected.environmentDescription": "Koblet til fra miljøvariablene dine",
|
||||||
"settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via en basis-URL.",
|
"settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via basis-URL.",
|
||||||
|
|
||||||
"app.server.unreachable": "Kunne ikke nå {{server}}",
|
"app.server.unreachable": "Kunne ikke nå {{server}}",
|
||||||
"app.server.retrying": "Prøver på nytt automatisk...",
|
"app.server.retrying": "Prøver på nytt automatisk...",
|
||||||
"app.server.otherServers": "Andre servere",
|
"app.server.otherServers": "Andre servere",
|
||||||
"dialog.server.add.usernamePlaceholder": "brukernavn",
|
"dialog.server.add.usernamePlaceholder": "brukernavn",
|
||||||
"dialog.server.add.passwordPlaceholder": "passord",
|
"dialog.server.add.passwordPlaceholder": "passord",
|
||||||
"server.row.noUsername": "ikke noe brukernavn",
|
"server.row.noUsername": "inget brukernavn",
|
||||||
"session.review.noVcs.createGit.title": "Opprett et Git-depot",
|
"session.review.noVcs.createGit.title": "Opprett et Git-depot",
|
||||||
"session.review.noVcs.createGit.description": "Spor, gjennomgå og angre endringer i dette prosjektet",
|
"session.review.noVcs.createGit.description": "Spor, gjennomgå og angre endringer i dette prosjektet",
|
||||||
"session.review.noVcs.createGit.actionLoading": "Oppretter Git-depot...",
|
"session.review.noVcs.createGit.actionLoading": "Oppretter Git-depot...",
|
||||||
@@ -1010,9 +883,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} av {{total}} spørsmål",
|
"session.question.progress": "{{current}} av {{total}} spørsmål",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Filutforsker",
|
"session.header.open.fileExplorer": "Filutforsker",
|
||||||
"session.header.reveal.finder": "Vis i Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Vis i Filutforsker",
|
|
||||||
"session.header.reveal.containingFolder": "Åpne mappen som inneholder dette elementet",
|
|
||||||
"session.header.open.fileManager": "Filbehandler",
|
"session.header.open.fileManager": "Filbehandler",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1031,33 +901,25 @@ export const dict = {
|
|||||||
"debugBar.na": "i/t",
|
"debugBar.na": "i/t",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Siste fullførte ruteovergang som berører en sesjonsside, målt fra ruterstart til første gjengivelse etter at den har roet seg.",
|
"Siste fullførte ruteovergang som berører en sesjonsside, målt fra ruterstart til første opptegning etter at den har roet seg.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Rullende bilder per sekund over de siste 5 sekundene.",
|
"debugBar.fps.tip": "Rullende bilder per sekund over de siste 5 sekundene.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Lengste bildetid over de siste 5 sekundene.",
|
"debugBar.frame.tip": "Verste bildetid over de siste 5 sekundene.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Bilder som tar over 32 ms i de siste 5 sekundene.",
|
"debugBar.jank.tip": "Bilder over 32ms i de siste 5 sekundene.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip": "Blokkert tid og antall lange oppgaver i de siste 5 sekundene. Lengste oppgave: {{max}}.",
|
"debugBar.long.tip": "Blokkert tid og antall lange oppgaver i de siste 5 sekundene. Maks oppgave: {{max}}.",
|
||||||
"debugBar.delay.label": "DELAY",
|
"debugBar.delay.label": "DELAY",
|
||||||
"debugBar.delay.tip": "Lengste observerte inndataforsinkelse i de siste 5 sekundene.",
|
"debugBar.delay.tip": "Verste observerte inndataforsinkelse i de siste 5 sekundene.",
|
||||||
"debugBar.inp.label": "INP",
|
"debugBar.inp.label": "INP",
|
||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Omtrentlig interaksjonsvarighet over de siste 5 sekundene. Dette er INP-lignende, ikke den offisielle Web Vitals INP.",
|
"Omtrentlig interaksjonsvarighet over de siste 5 sekundene. Dette er INP-lignende, ikke den offisielle Web Vitals INP.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Kumulativ layoutforskyvning for gjeldende app-levetid.",
|
"debugBar.cls.tip": "Kumulativ layoutforskyvning for gjeldende app-levetid.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Brukt JS-heap kontra heap-grense. Kun Chromium.",
|
"debugBar.mem.tipUnavailable": "Brukt JS-heap vs heap-grense. Kun Chromium.",
|
||||||
"debugBar.mem.tip": "Brukt JS-heap kontra heap-grense. {{used}} av {{limit}}.",
|
"debugBar.mem.tip": "Brukt JS-heap vs heap-grense. {{used}} av {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Tving fokusstiler på alle interaktive elementer",
|
|
||||||
"debugBar.focus.on": "PÅ",
|
|
||||||
"debugBar.focus.off": "AV",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Tving layoutretningen for hele appen uten å endre valgt språk",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -1168,22 +1030,6 @@ export const dict = {
|
|||||||
"wsl.onboarding.versionMismatch": "Den installerte versjonen samsvarer ikke med versjonen av skrivebordsappen.",
|
"wsl.onboarding.versionMismatch": "Den installerte versjonen samsvarer ikke med versjonen av skrivebordsappen.",
|
||||||
"wsl.onboarding.adding": "Legger til...",
|
"wsl.onboarding.adding": "Legger til...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Vi introduserer faner. Organiser arbeidet og de aktive sesjonene dine med faner",
|
|
||||||
"help.tabs.toast.dismiss": "Avvis informasjon om faner",
|
|
||||||
"help.tabs.title": "Vi introduserer faner",
|
|
||||||
"help.tabs.description": "Organiser arbeidet og de aktive sesjonene dine med faner",
|
|
||||||
"help.tabs.date": "14. juli",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop er nå bygget rundt faner.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Start en ny sesjon i en fane, eller åpne en eksisterende sesjon fra et av prosjektene dine. Åpne en ny fane når du skal begynne på noe nytt, og lukk den når du er ferdig.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Når du har noen få faner åpne, blir det enklere å organisere de aktive sesjonene. Gi fanene navn som er lette å huske, hvis du planlegger å beholde dem.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Du finner alle sesjonene og prosjektene dine på den nye Hjem-skjermen. Når du velger en sesjon, åpnes den i en fane.",
|
|
||||||
"help.tabs.persistence": "Fanene er fortsatt åpne når du åpner appen på nytt.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Det nye oppsettet støtter ikke Git Worktrees ennå, men støtte kommer snart. Hvis du foretrekker å fortsette med det forrige oppsettet, kan du bytte mellom oppsettene i Innstillinger. Vær oppmerksom på at det nye oppsettet blir permanent om noen uker.",
|
|
||||||
|
|
||||||
"language.uk": "Українська",
|
"language.uk": "Українська",
|
||||||
|
|
||||||
"error.page.description.localServerStartup": "Det oppstod en feil under oppstart av den lokale serveren.",
|
"error.page.description.localServerStartup": "Det oppstod en feil under oppstart av den lokale serveren.",
|
||||||
@@ -1212,7 +1058,7 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "Denne fanen peker til en sesjon som ikke lenger finnes på denne serveren.",
|
"session.error.notFound.description": "Denne fanen peker til en sesjon som ikke lenger finnes på denne serveren.",
|
||||||
"session.error.notFound.closeTab": "Lukk fane",
|
"session.error.notFound.closeTab": "Lukk fane",
|
||||||
"session.error.serverConnection": "Kan ikke koble til denne serveren",
|
"session.error.serverConnection": "Kan ikke koble til denne serveren",
|
||||||
"session.review.noUncommittedChanges": "Ingen endringer som ikke er sjekket inn ennå",
|
"session.review.noUncommittedChanges": "Ingen ucommittede endringer ennå",
|
||||||
"session.review.noBranchChanges": "Ingen grenendringer ennå",
|
"session.review.noBranchChanges": "Ingen grenendringer ennå",
|
||||||
"session.question.minimize": "Minimer spørsmål",
|
"session.question.minimize": "Minimer spørsmål",
|
||||||
"session.question.restore": "Gjenopprett spørsmål",
|
"session.question.restore": "Gjenopprett spørsmål",
|
||||||
@@ -1250,9 +1096,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Navigasjon nederst",
|
"settings.general.row.mobileTitlebarBottom.title": "Navigasjon nederst",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Plasser tittellinjen og sesjonsfanene nederst på mobilskjermen",
|
"Plasser tittellinjen og sesjonsfanene nederst på mobilskjermen",
|
||||||
"settings.general.row.showCustomAgents.title": "Vis agent",
|
"settings.general.row.showCustomAgents.title": "Egendefinerte agenter",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Vis agentvelgeren i skrivefeltet",
|
||||||
"Bytt mellom agenter i skrivefeltet. Når velgeren er skjult, brukes Build-agenten som standard.",
|
|
||||||
"settings.general.row.newInterface.title": "Nytt oppsett",
|
"settings.general.row.newInterface.title": "Nytt oppsett",
|
||||||
"settings.general.row.newInterface.badge": "Ny",
|
"settings.general.row.newInterface.badge": "Ny",
|
||||||
"settings.general.row.newInterface.description":
|
"settings.general.row.newInterface.description":
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
|||||||
import { describe, expect, test } from "bun:test"
|
import { describe, expect, test } from "bun:test"
|
||||||
import { desktopNativePluralCategories } from "./desktop-native"
|
|
||||||
|
|
||||||
const appLocales = [
|
const appLocales = [
|
||||||
"ar",
|
"ar",
|
||||||
@@ -19,61 +18,8 @@ const appLocales = [
|
|||||||
"tr",
|
"tr",
|
||||||
"zh",
|
"zh",
|
||||||
"zht",
|
"zht",
|
||||||
"hi",
|
|
||||||
"nl",
|
|
||||||
"id",
|
|
||||||
"vi",
|
|
||||||
"it",
|
|
||||||
"ur",
|
|
||||||
"pa",
|
|
||||||
"az",
|
|
||||||
"fi",
|
|
||||||
"sv",
|
|
||||||
"am",
|
|
||||||
"bg",
|
|
||||||
"bn",
|
|
||||||
"ca",
|
|
||||||
"cs",
|
|
||||||
"dv",
|
|
||||||
"dz",
|
|
||||||
"el",
|
|
||||||
"et",
|
|
||||||
"fa",
|
|
||||||
"fo",
|
|
||||||
"hr",
|
|
||||||
"hu",
|
|
||||||
"hy",
|
|
||||||
"is",
|
|
||||||
"ka",
|
|
||||||
"km",
|
|
||||||
"lo",
|
|
||||||
"lt",
|
|
||||||
"lv",
|
|
||||||
"mk",
|
|
||||||
"mn",
|
|
||||||
"ms",
|
|
||||||
"my",
|
|
||||||
"ne",
|
|
||||||
"ro",
|
|
||||||
"si",
|
|
||||||
"sk",
|
|
||||||
"sl",
|
|
||||||
"sq",
|
|
||||||
"sr",
|
|
||||||
"tg",
|
|
||||||
"tk",
|
|
||||||
"uz",
|
|
||||||
] as const
|
] as const
|
||||||
const desktopLocales = appLocales
|
const desktopLocales = appLocales.filter((locale) => locale !== "th" && locale !== "tr")
|
||||||
const pluralCategories = new Map(
|
|
||||||
appLocales.map(
|
|
||||||
(locale) =>
|
|
||||||
[
|
|
||||||
locale,
|
|
||||||
desktopNativePluralCategories(locale).filter((category) => category !== "one" && category !== "other"),
|
|
||||||
] as const,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
const domains = [
|
const domains = [
|
||||||
{
|
{
|
||||||
@@ -96,24 +42,19 @@ const domains = [
|
|||||||
},
|
},
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
describe("i18n parity", () => {
|
describe.skipIf(!!process.env.CI)("i18n parity", () => {
|
||||||
test("non-English locales have every English key and required plural variants", async () => {
|
test("non-English locales have every English key", async () => {
|
||||||
for (const domain of domains) {
|
for (const domain of domains) {
|
||||||
const source = await dictionary(domain.source)
|
const source = await dictionary(domain.source)
|
||||||
for (const locale of domain.locales) {
|
for (const locale of domain.locales) {
|
||||||
const target = await dictionary(domain.target(locale))
|
const target = await dictionary(domain.target(locale))
|
||||||
const missing = Object.keys(source).filter((key) => !Object.hasOwn(target, key))
|
const missing = Object.keys(source).filter((key) => !Object.hasOwn(target, key))
|
||||||
const extra = Object.keys(target)
|
const extra = Object.keys(target).filter((key) => !Object.hasOwn(source, key))
|
||||||
.filter((key) => !Object.hasOwn(source, key))
|
|
||||||
.sort()
|
|
||||||
const expected = pluralFamilies(source)
|
|
||||||
.flatMap((key) => (pluralCategories.get(locale) ?? []).map((category) => `${key}.${category}`))
|
|
||||||
.sort()
|
|
||||||
expect({ domain: domain.name, locale, missing, extra }).toEqual({
|
expect({ domain: domain.name, locale, missing, extra }).toEqual({
|
||||||
domain: domain.name,
|
domain: domain.name,
|
||||||
locale,
|
locale,
|
||||||
missing: [],
|
missing: [],
|
||||||
extra: expected,
|
extra: [],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,17 +68,7 @@ describe("i18n parity", () => {
|
|||||||
const mismatched = Object.keys(source).filter(
|
const mismatched = Object.keys(source).filter(
|
||||||
(key) => Object.hasOwn(target, key) && placeholders(source[key]).join() !== placeholders(target[key]).join(),
|
(key) => Object.hasOwn(target, key) && placeholders(source[key]).join() !== placeholders(target[key]).join(),
|
||||||
)
|
)
|
||||||
const pluralMismatched = pluralFamilies(source).flatMap((key) =>
|
expect({ domain: domain.name, locale, mismatched }).toEqual({ domain: domain.name, locale, mismatched: [] })
|
||||||
(pluralCategories.get(locale) ?? [])
|
|
||||||
.map((category) => `${key}.${category}`)
|
|
||||||
.filter((variant) => placeholders(source[`${key}.other`]).join() !== placeholders(target[variant]).join()),
|
|
||||||
)
|
|
||||||
expect({ domain: domain.name, locale, mismatched, pluralMismatched }).toEqual({
|
|
||||||
domain: domain.name,
|
|
||||||
locale,
|
|
||||||
mismatched: [],
|
|
||||||
pluralMismatched: [],
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -169,38 +100,6 @@ describe("i18n parity", () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("i18n plural parity", () => {
|
|
||||||
test("locale-specific categories exist and preserve count placeholders", async () => {
|
|
||||||
for (const domain of domains.slice(0, 2)) {
|
|
||||||
const source = await dictionary(domain.source)
|
|
||||||
const families = pluralFamilies(source)
|
|
||||||
for (const locale of domain.locales) {
|
|
||||||
const target = await dictionary(domain.target(locale))
|
|
||||||
const missing = families.flatMap((key) =>
|
|
||||||
(pluralCategories.get(locale) ?? [])
|
|
||||||
.map((category) => `${key}.${category}`)
|
|
||||||
.filter((variant) => !Object.hasOwn(target, variant)),
|
|
||||||
)
|
|
||||||
const mismatched = families.flatMap((key) =>
|
|
||||||
(pluralCategories.get(locale) ?? [])
|
|
||||||
.map((category) => `${key}.${category}`)
|
|
||||||
.filter(
|
|
||||||
(variant) =>
|
|
||||||
Object.hasOwn(target, variant) &&
|
|
||||||
placeholders(source[`${key}.other`]).join() !== placeholders(target[variant]).join(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
expect({ domain: domain.name, locale, missing, mismatched }).toEqual({
|
|
||||||
domain: domain.name,
|
|
||||||
locale,
|
|
||||||
missing: [],
|
|
||||||
mismatched: [],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
async function dictionary(file: string) {
|
async function dictionary(file: string) {
|
||||||
const module: unknown = await import(file)
|
const module: unknown = await import(file)
|
||||||
if (typeof module !== "object" || module === null || !("dict" in module) || !isDictionary(module.dict)) {
|
if (typeof module !== "object" || module === null || !("dict" in module) || !isDictionary(module.dict)) {
|
||||||
@@ -217,14 +116,3 @@ function isDictionary(value: unknown): value is Record<string, string> {
|
|||||||
function placeholders(value: string) {
|
function placeholders(value: string) {
|
||||||
return Array.from(value.matchAll(/{{\s*([^}]+?)\s*}}/g), (match) => match[1]).sort()
|
return Array.from(value.matchAll(/{{\s*([^}]+?)\s*}}/g), (match) => match[1]).sort()
|
||||||
}
|
}
|
||||||
|
|
||||||
function pluralFamilies(dictionary: Record<string, string>) {
|
|
||||||
return Object.keys(dictionary)
|
|
||||||
.filter(
|
|
||||||
(key) =>
|
|
||||||
key.endsWith(".one") &&
|
|
||||||
dictionary[key].includes("{{count}}") &&
|
|
||||||
dictionary[`${key.slice(0, -4)}.other`]?.includes("{{count}}"),
|
|
||||||
)
|
|
||||||
.map((key) => key.slice(0, -4))
|
|
||||||
}
|
|
||||||
|
|||||||
+60
-219
@@ -1,103 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Plik",
|
|
||||||
"desktop.menu.edit": "Edycja",
|
|
||||||
"desktop.menu.view": "Widok",
|
|
||||||
"desktop.menu.go": "Przejdź",
|
|
||||||
"desktop.menu.window": "Okno",
|
|
||||||
"desktop.menu.help": "Pomoc",
|
|
||||||
"desktop.menu.checkForUpdates": "Sprawdź aktualizacje...",
|
|
||||||
"desktop.menu.settings": "Ustawienia",
|
|
||||||
"desktop.menu.reloadWebview": "Wczytaj ponownie widok internetowy",
|
|
||||||
"desktop.menu.restart": "Uruchom ponownie",
|
|
||||||
"desktop.menu.exportLogs": "Eksportuj dzienniki...",
|
|
||||||
"desktop.menu.newSession": "Nowa sesja",
|
|
||||||
"desktop.menu.openProject": "Otwórz projekt...",
|
|
||||||
"desktop.menu.newWindow": "Nowe okno",
|
|
||||||
"desktop.menu.closeWindow": "Zamknij okno",
|
|
||||||
"desktop.menu.undo": "Cofnij",
|
|
||||||
"desktop.menu.redo": "Ponów",
|
|
||||||
"desktop.menu.cut": "Wytnij",
|
|
||||||
"desktop.menu.copy": "Kopiuj",
|
|
||||||
"desktop.menu.paste": "Wklej",
|
|
||||||
"desktop.menu.delete": "Usuń",
|
|
||||||
"desktop.menu.selectAll": "Zaznacz wszystko",
|
|
||||||
"desktop.menu.toggleSidebar": "Przełącz pasek boczny",
|
|
||||||
"desktop.menu.toggleTerminal": "Przełącz terminal",
|
|
||||||
"desktop.menu.toggleFileTree": "Przełącz drzewo plików",
|
|
||||||
"desktop.menu.reload": "Wczytaj ponownie",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Przełącz narzędzia deweloperskie",
|
|
||||||
"desktop.menu.actualSize": "Rozmiar rzeczywisty",
|
|
||||||
"desktop.menu.zoomIn": "Powiększ",
|
|
||||||
"desktop.menu.zoomOut": "Pomniejsz",
|
|
||||||
"desktop.menu.toggleFullScreen": "Przełącz tryb pełnoekranowy",
|
|
||||||
"desktop.menu.back": "Wstecz",
|
|
||||||
"desktop.menu.forward": "Dalej",
|
|
||||||
"desktop.menu.previousSession": "Poprzednia sesja",
|
|
||||||
"desktop.menu.nextSession": "Następna sesja",
|
|
||||||
"desktop.menu.previousProject": "Poprzedni projekt",
|
|
||||||
"desktop.menu.nextProject": "Następny projekt",
|
|
||||||
"desktop.menu.minimize": "Minimalizuj",
|
|
||||||
"desktop.menu.maximize": "Maksymalizuj",
|
|
||||||
"desktop.menu.documentation": "Dokumentacja OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Forum pomocy technicznej",
|
|
||||||
"desktop.menu.shareFeedback": "Prześlij opinię",
|
|
||||||
"desktop.menu.reportBug": "Zgłoś błąd",
|
|
||||||
"desktop.menu.ariaLabel": "Menu OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Nie udało się sprawdzić dostępności aktualizacji.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Błąd aktualizacji",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "Masz najnowszą wersję.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Brak aktualizacji",
|
|
||||||
"desktop.updater.dialog.ready.message": "Pobrano aktualizację {{version}}. Uruchomić ponownie teraz?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Aktualizacja jest gotowa",
|
|
||||||
"desktop.updater.dialog.restart": "Uruchom ponownie",
|
|
||||||
"desktop.updater.dialog.later": "Później",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Uruchom ponownie",
|
|
||||||
"desktop.recovery.action.exportLogs": "Eksportuj dzienniki",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Czekaj dalej",
|
|
||||||
"desktop.recovery.action.quit": "Zakończ",
|
|
||||||
"desktop.recovery.loadFailed": "Nie udało się wczytać OpenCode",
|
|
||||||
"desktop.recovery.terminated": "Okno OpenCode zostało nieoczekiwanie zamknięte",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode nie odpowiada",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Możesz ponownie uruchomić aplikację, otworzyć dzienniki lub nadal czekać.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Okno: {{window}}\nURL: {{url}}\nBłąd: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Okno: {{window}}\nPrzyczyna: {{reason}}\nKod: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<nieznane>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Wybierz folder",
|
|
||||||
"desktop.dialog.chooseFile": "Wybierz plik",
|
|
||||||
"desktop.dialog.saveFile": "Zapisz plik",
|
|
||||||
"desktop.dialog.files": "Pliki",
|
|
||||||
"desktop.server.local": "Serwer lokalny",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL jest dostępny tylko w systemie Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL jest niedostępny",
|
|
||||||
"desktop.wsl.error.listInstalled": "Nie udało się wyświetlić listy zainstalowanych dystrybucji WSL",
|
|
||||||
"desktop.wsl.error.listOnline": "Nie udało się wyświetlić listy dystrybucji WSL dostępnych online",
|
|
||||||
"desktop.wsl.error.executeDistro": "Nie można wykonywać poleceń w dystrybucji",
|
|
||||||
"desktop.wsl.error.installWsl": "Nie udało się zainstalować WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "Nie udało się zainstalować dystrybucji: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Nie udało się zainstalować OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "Dystrybucja {{distro}} została już dodana",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "Program opencode nie jest zainstalowany w tej dystrybucji",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "Program opencode jest zainstalowany, ale nie można go uruchomić",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode nie jest zainstalowany w dystrybucji {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Aktualizacja OpenCode została ukończona, ale dystrybucja {{distro}} nadal zgłasza wersję {{installed}}; oczekiwano {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "brak wersji",
|
|
||||||
"desktop.wsl.error.serverExited": "Serwer WSL zakończył działanie po uruchomieniu (code={{code}} signal={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"Serwer WSL zakończył działanie przed osiągnięciem gotowości (code={{code}} signal={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Przekroczono limit czasu {{timeout}}ms podczas sprawdzania kondycji procesu sidecar dla dystrybucji {{distro}}",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Polecenie {{command}} {{args}} przekroczyło limit czasu {{timeout}}ms",
|
|
||||||
"desktop.wsl.error.failedPort": "Nie udało się uzyskać portu",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "Nie wybrano pliku w oknie wyboru",
|
|
||||||
"desktop.picker.error.sizeLimit": "Wybrane załączniki przekraczają limit {{limit}} MB",
|
|
||||||
|
|
||||||
"command.category.suggested": "Sugerowane",
|
"command.category.suggested": "Sugerowane",
|
||||||
"command.category.view": "Widok",
|
"command.category.view": "Widok",
|
||||||
"command.category.project": "Projekt",
|
"command.category.project": "Projekt",
|
||||||
@@ -115,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Uprawnienia",
|
"command.category.permissions": "Uprawnienia",
|
||||||
"command.category.workspace": "Przestrzeń robocza",
|
"command.category.workspace": "Przestrzeń robocza",
|
||||||
"command.category.settings": "Ustawienia",
|
"command.category.settings": "Ustawienia",
|
||||||
"command.logs.export": "Eksportuj dzienniki",
|
|
||||||
"theme.scheme.system": "Systemowy",
|
"theme.scheme.system": "Systemowy",
|
||||||
"theme.scheme.light": "Jasny",
|
"theme.scheme.light": "Jasny",
|
||||||
"theme.scheme.dark": "Ciemny",
|
"theme.scheme.dark": "Ciemny",
|
||||||
@@ -145,7 +45,7 @@ export const dict = {
|
|||||||
"command.tab.reopenClosed": "Otwórz ponownie zamkniętą kartę",
|
"command.tab.reopenClosed": "Otwórz ponownie zamkniętą kartę",
|
||||||
"command.context.addSelection": "Dodaj zaznaczenie do kontekstu",
|
"command.context.addSelection": "Dodaj zaznaczenie do kontekstu",
|
||||||
"command.context.addSelection.description": "Dodaj zaznaczone linie z bieżącego pliku",
|
"command.context.addSelection.description": "Dodaj zaznaczone linie z bieżącego pliku",
|
||||||
"command.input.focus": "Przejdź do pola wprowadzania",
|
"command.input.focus": "Fokus na pole wejściowe",
|
||||||
"command.terminal.toggle": "Przełącz terminal",
|
"command.terminal.toggle": "Przełącz terminal",
|
||||||
"command.fileTree.toggle": "Przełącz drzewo plików",
|
"command.fileTree.toggle": "Przełącz drzewo plików",
|
||||||
"command.review.toggle": "Przełącz przegląd",
|
"command.review.toggle": "Przełącz przegląd",
|
||||||
@@ -182,12 +82,9 @@ export const dict = {
|
|||||||
"command.session.fork": "Rozwidlij od wiadomości",
|
"command.session.fork": "Rozwidlij od wiadomości",
|
||||||
"command.session.fork.description": "Utwórz nową sesję od poprzedniej wiadomości",
|
"command.session.fork.description": "Utwórz nową sesję od poprzedniej wiadomości",
|
||||||
"command.session.share": "Udostępnij sesję",
|
"command.session.share": "Udostępnij sesję",
|
||||||
"command.session.share.description": "Udostępnij tę sesję i skopiuj adres URL do schowka",
|
"command.session.share.description": "Udostępnij tę sesję i skopiuj URL do schowka",
|
||||||
"command.session.unshare": "Przestań udostępniać sesję",
|
"command.session.unshare": "Przestań udostępniać sesję",
|
||||||
"command.session.unshare.description": "Zatrzymaj udostępnianie tej sesji",
|
"command.session.unshare.description": "Zatrzymaj udostępnianie tej sesji",
|
||||||
"command.session.export": "Eksportuj sesję",
|
|
||||||
"command.session.export.description": "Eksportuj pełny zapis sesji w formacie JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Szukaj plików, poleceń i sesji",
|
"palette.search.placeholder": "Szukaj plików, poleceń i sesji",
|
||||||
"palette.search.placeholder.home": "Szukaj poleceń i sesji",
|
"palette.search.placeholder.home": "Szukaj poleceń i sesji",
|
||||||
"palette.empty": "Brak wyników",
|
"palette.empty": "Brak wyników",
|
||||||
@@ -197,11 +94,10 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Nie znaleziono dostawców",
|
"dialog.provider.empty": "Nie znaleziono dostawców",
|
||||||
"dialog.provider.group.popular": "Popularne",
|
"dialog.provider.group.popular": "Popularne",
|
||||||
"dialog.provider.group.other": "Inne",
|
"dialog.provider.group.other": "Inne",
|
||||||
"dialog.provider.custom.label": "Niestandardowy dostawca zgodny z OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "Zalecane",
|
"dialog.provider.tag.recommended": "Zalecane",
|
||||||
"dialog.provider.opencode.note": "Starannie dobrane modele, w tym Claude, GPT, Gemini i inne",
|
"dialog.provider.opencode.note": "Wyselekcjonowane modele, w tym Claude, GPT, Gemini i inne",
|
||||||
"dialog.provider.opencode.tagline": "Niezawodne, zoptymalizowane modele",
|
"dialog.provider.opencode.tagline": "Niezawodne, zoptymalizowane modele",
|
||||||
"dialog.provider.opencodeGo.tagline": "Niedroga subskrypcja dla każdego",
|
"dialog.provider.opencodeGo.tagline": "Tania subskrypcja dla każdego",
|
||||||
"dialog.provider.anthropic.note": "Bezpośredni dostęp do modeli Claude, w tym Pro i Max",
|
"dialog.provider.anthropic.note": "Bezpośredni dostęp do modeli Claude, w tym Pro i Max",
|
||||||
"dialog.provider.copilot.note": "Modele AI do pomocy w kodowaniu przez GitHub Copilot",
|
"dialog.provider.copilot.note": "Modele AI do pomocy w kodowaniu przez GitHub Copilot",
|
||||||
"dialog.provider.openai.note": "Modele GPT do szybkich i wszechstronnych zadań AI",
|
"dialog.provider.openai.note": "Modele GPT do szybkich i wszechstronnych zadań AI",
|
||||||
@@ -210,20 +106,17 @@ export const dict = {
|
|||||||
"dialog.provider.vercel.note": "Ujednolicony dostęp do modeli AI z inteligentnym routingiem",
|
"dialog.provider.vercel.note": "Ujednolicony dostęp do modeli AI z inteligentnym routingiem",
|
||||||
"dialog.model.select.title": "Wybierz model",
|
"dialog.model.select.title": "Wybierz model",
|
||||||
"dialog.model.search.placeholder": "Szukaj modeli",
|
"dialog.model.search.placeholder": "Szukaj modeli",
|
||||||
"dialog.model.empty": "Nie znaleziono modeli",
|
"dialog.model.empty": "Brak wyników modelu",
|
||||||
"dialog.model.manage": "Zarządzaj modelami",
|
"dialog.model.manage": "Zarządzaj modelami",
|
||||||
"dialog.model.manage.description": "Dostosuj, które modele pojawiają się w wyborze modelu.",
|
"dialog.model.manage.description": "Dostosuj, które modele pojawiają się w wyborze modelu.",
|
||||||
"dialog.model.manage.provider.toggle": "Przełącz wszystkie modele {{provider}}",
|
"dialog.model.manage.provider.toggle": "Przełącz wszystkie modele {{provider}}",
|
||||||
"dialog.model.unpaid.freeModels.title": "Darmowe modele dostarczane przez OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Darmowe modele dostarczane przez OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Dodaj więcej modeli od popularnych dostawców",
|
"dialog.model.unpaid.addMore.title": "Dodaj więcej modeli od popularnych dostawców",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Zobacz ponad 70 innych dostawców",
|
|
||||||
"dialog.provider.viewAll": "Zobacz więcej dostawców",
|
"dialog.provider.viewAll": "Zobacz więcej dostawców",
|
||||||
"provider.connect.title": "Połącz {{provider}}",
|
"provider.connect.title": "Połącz {{provider}}",
|
||||||
"provider.connect.title.anthropicProMax": "Zaloguj się za pomocą konta Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Zaloguj się z Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Wybierz metodę logowania dla {{provider}}.",
|
"provider.connect.selectMethod": "Wybierz metodę logowania dla {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "Klucz API",
|
"provider.connect.method.apiKey": "Klucz API",
|
||||||
"provider.connect.method.browser": "Przeglądarka",
|
|
||||||
"provider.connect.method.headless": "Bez przeglądarki",
|
|
||||||
"provider.connect.status.inProgress": "Autoryzacja w toku...",
|
"provider.connect.status.inProgress": "Autoryzacja w toku...",
|
||||||
"provider.connect.status.waiting": "Oczekiwanie na autoryzację...",
|
"provider.connect.status.waiting": "Oczekiwanie na autoryzację...",
|
||||||
"provider.connect.status.failed": "Autoryzacja nie powiodła się: {{error}}",
|
"provider.connect.status.failed": "Autoryzacja nie powiodła się: {{error}}",
|
||||||
@@ -233,9 +126,9 @@ export const dict = {
|
|||||||
"provider.connect.apiKey.placeholder": "Klucz API",
|
"provider.connect.apiKey.placeholder": "Klucz API",
|
||||||
"provider.connect.apiKey.required": "Klucz API jest wymagany",
|
"provider.connect.apiKey.required": "Klucz API jest wymagany",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
"OpenCode Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów programistycznych.",
|
"OpenCode Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów kodujących.",
|
||||||
"provider.connect.opencodeZen.line2":
|
"provider.connect.opencodeZen.line2":
|
||||||
"Za pomocą jednego klucza API uzyskasz dostęp do modeli takich jak Claude, GPT, Gemini i GLM, a także wielu innych.",
|
"Z jednym kluczem API uzyskasz dostęp do modeli takich jak Claude, GPT, Gemini, GLM i więcej.",
|
||||||
"provider.connect.opencodeZen.visit.prefix": "Odwiedź ",
|
"provider.connect.opencodeZen.visit.prefix": "Odwiedź ",
|
||||||
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
|
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
|
||||||
"provider.connect.opencodeZen.visit.suffix": ", aby odebrać swój klucz API.",
|
"provider.connect.opencodeZen.visit.suffix": ", aby odebrać swój klucz API.",
|
||||||
@@ -255,7 +148,6 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.title": "Połączono {{provider}}",
|
"provider.connect.toast.connected.title": "Połączono {{provider}}",
|
||||||
"provider.connect.toast.connected.description": "Modele {{provider}} są teraz dostępne do użycia.",
|
"provider.connect.toast.connected.description": "Modele {{provider}} są teraz dostępne do użycia.",
|
||||||
"provider.custom.title": "Dostawca niestandardowy",
|
"provider.custom.title": "Dostawca niestandardowy",
|
||||||
"provider.custom.unavailable": "Niestandardowi dostawcy są niedostępni na tym serwerze",
|
|
||||||
"provider.custom.description.prefix": "Skonfiguruj dostawcę zgodnego z OpenAI. Zobacz ",
|
"provider.custom.description.prefix": "Skonfiguruj dostawcę zgodnego z OpenAI. Zobacz ",
|
||||||
"provider.custom.description.link": "dokumentację konfiguracji dostawcy",
|
"provider.custom.description.link": "dokumentację konfiguracji dostawcy",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
@@ -264,7 +156,7 @@ export const dict = {
|
|||||||
"provider.custom.field.providerID.description": "Małe litery, cyfry, łączniki lub podkreślenia",
|
"provider.custom.field.providerID.description": "Małe litery, cyfry, łączniki lub podkreślenia",
|
||||||
"provider.custom.field.name.label": "Nazwa wyświetlana",
|
"provider.custom.field.name.label": "Nazwa wyświetlana",
|
||||||
"provider.custom.field.name.placeholder": "Mój Dostawca AI",
|
"provider.custom.field.name.placeholder": "Mój Dostawca AI",
|
||||||
"provider.custom.field.baseURL.label": "Bazowy adres URL",
|
"provider.custom.field.baseURL.label": "Bazowy URL",
|
||||||
"provider.custom.field.baseURL.placeholder": "https://api.mojdostawca.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.mojdostawca.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "Klucz API",
|
"provider.custom.field.apiKey.label": "Klucz API",
|
||||||
"provider.custom.field.apiKey.placeholder": "Klucz API",
|
"provider.custom.field.apiKey.placeholder": "Klucz API",
|
||||||
@@ -288,7 +180,7 @@ export const dict = {
|
|||||||
"provider.custom.error.providerID.format": "Używaj małych liter, cyfr, łączników lub podkreśleń",
|
"provider.custom.error.providerID.format": "Używaj małych liter, cyfr, łączników lub podkreśleń",
|
||||||
"provider.custom.error.providerID.exists": "To ID dostawcy już istnieje",
|
"provider.custom.error.providerID.exists": "To ID dostawcy już istnieje",
|
||||||
"provider.custom.error.name.required": "Nazwa wyświetlana jest wymagana",
|
"provider.custom.error.name.required": "Nazwa wyświetlana jest wymagana",
|
||||||
"provider.custom.error.baseURL.required": "Bazowy adres URL jest wymagany",
|
"provider.custom.error.baseURL.required": "Bazowy URL jest wymagany",
|
||||||
"provider.custom.error.baseURL.format": "Musi zaczynać się od http:// lub https://",
|
"provider.custom.error.baseURL.format": "Musi zaczynać się od http:// lub https://",
|
||||||
"provider.custom.error.required": "Wymagane",
|
"provider.custom.error.required": "Wymagane",
|
||||||
"provider.custom.error.duplicate": "Duplikat",
|
"provider.custom.error.duplicate": "Duplikat",
|
||||||
@@ -324,7 +216,7 @@ export const dict = {
|
|||||||
"common.clear": "Wyczyść",
|
"common.clear": "Wyczyść",
|
||||||
"common.connect": "Połącz",
|
"common.connect": "Połącz",
|
||||||
"common.disconnect": "Rozłącz",
|
"common.disconnect": "Rozłącz",
|
||||||
"common.continue": "Kontynuuj",
|
"common.continue": "Prześlij",
|
||||||
"common.submit": "Prześlij",
|
"common.submit": "Prześlij",
|
||||||
"common.save": "Zapisz",
|
"common.save": "Zapisz",
|
||||||
"common.saving": "Zapisywanie...",
|
"common.saving": "Zapisywanie...",
|
||||||
@@ -337,46 +229,46 @@ export const dict = {
|
|||||||
"prompt.placeholder.summarizeComment": "Podsumuj komentarz…",
|
"prompt.placeholder.summarizeComment": "Podsumuj komentarz…",
|
||||||
"prompt.mode.shell": "Terminal",
|
"prompt.mode.shell": "Terminal",
|
||||||
"prompt.mode.normal": "Prompt",
|
"prompt.mode.normal": "Prompt",
|
||||||
"prompt.mode.shell.exit": "Naciśnij Esc, aby wyjść",
|
"prompt.mode.shell.exit": "esc aby wyjść",
|
||||||
"session.child.promptDisabled": "Nie można wysyłać promptów w sesjach podagentów.",
|
"session.child.promptDisabled": "Nie można wysyłać promptów w sesjach podagentów.",
|
||||||
"session.child.backToParent": "Wróć do głównej sesji.",
|
"session.child.backToParent": "Wróć do głównej sesji.",
|
||||||
"prompt.example.1": "Napraw TODO w bazie kodu",
|
"prompt.example.1": "Napraw TODO w bazie kodu",
|
||||||
"prompt.example.2": "Jaki jest stos technologiczny tego projektu?",
|
"prompt.example.2": "Jaki jest stos technologiczny tego projektu?",
|
||||||
"prompt.example.3": "Napraw zepsute testy",
|
"prompt.example.3": "Napraw zepsute testy",
|
||||||
"prompt.example.4": "Wyjaśnij, jak działa uwierzytelnianie",
|
"prompt.example.4": "Wyjaśnij jak działa uwierzytelnianie",
|
||||||
"prompt.example.5": "Znajdź i napraw luki w zabezpieczeniach",
|
"prompt.example.5": "Znajdź i napraw luki w zabezpieczeniach",
|
||||||
"prompt.example.6": "Dodaj testy jednostkowe dla serwisu użytkownika",
|
"prompt.example.6": "Dodaj testy jednostkowe dla serwisu użytkownika",
|
||||||
"prompt.example.7": "Zrefaktoryzuj tę funkcję, aby była bardziej czytelna",
|
"prompt.example.7": "Zrefaktoryzuj tę funkcję, aby była bardziej czytelna",
|
||||||
"prompt.example.8": "Co oznacza ten błąd?",
|
"prompt.example.8": "Co oznacza ten błąd?",
|
||||||
"prompt.example.9": "Pomóż mi zdiagnozować ten problem",
|
"prompt.example.9": "Pomóż mi zdebugować ten problem",
|
||||||
"prompt.example.10": "Wygeneruj dokumentację API",
|
"prompt.example.10": "Wygeneruj dokumentację API",
|
||||||
"prompt.example.11": "Zoptymalizuj zapytania do bazy danych",
|
"prompt.example.11": "Zoptymalizuj zapytania do bazy danych",
|
||||||
"prompt.example.12": "Dodaj walidację danych wejściowych",
|
"prompt.example.12": "Dodaj walidację danych wejściowych",
|
||||||
"prompt.example.13": "Utwórz nowy komponent dla...",
|
"prompt.example.13": "Utwórz nowy komponent dla...",
|
||||||
"prompt.example.14": "Jak wdrożyć ten projekt?",
|
"prompt.example.14": "Jak wdrożyć ten projekt?",
|
||||||
"prompt.example.15": "Sprawdź mój kod pod kątem najlepszych praktyk",
|
"prompt.example.15": "Sprawdź mój kod pod kątem najlepszych praktyk",
|
||||||
"prompt.example.16": "Dodaj obsługę błędów do tej funkcji",
|
"prompt.example.16": "Dodaj obsługę błędów do tej funkcję",
|
||||||
"prompt.example.17": "Wyjaśnij ten wzorzec regex",
|
"prompt.example.17": "Wyjaśnij ten wzorzec regex",
|
||||||
"prompt.example.18": "Przekonwertuj to na TypeScript",
|
"prompt.example.18": "Przekonwertuj to na TypeScript",
|
||||||
"prompt.example.19": "Dodaj logowanie w całej bazie kodu",
|
"prompt.example.19": "Dodaj logowanie w całej bazie kodu",
|
||||||
"prompt.example.20": "Które zależności są przestarzałe?",
|
"prompt.example.20": "Które zależności są przestarzałe?",
|
||||||
"prompt.example.21": "Pomóż mi napisać skrypt migracyjny",
|
"prompt.example.21": "Pomóż mi napisać skrypt migracyjny",
|
||||||
"prompt.example.22": "Zaimplementuj buforowanie dla tego punktu końcowego",
|
"prompt.example.22": "Zaimplementuj cachowanie dla tego punktu końcowego",
|
||||||
"prompt.example.23": "Dodaj stronicowanie do tej listy",
|
"prompt.example.23": "Dodaj stronicowanie do tej listy",
|
||||||
"prompt.example.24": "Utwórz polecenie CLI dla...",
|
"prompt.example.24": "Utwórz polecenie CLI dla...",
|
||||||
"prompt.example.25": "Jak działają tutaj zmienne środowiskowe?",
|
"prompt.example.25": "Jak działają tutaj zmienne środowiskowe?",
|
||||||
"prompt.popover.emptyResults": "Brak pasujących wyników",
|
"prompt.popover.emptyResults": "Brak pasujących wyników",
|
||||||
"prompt.popover.emptyCommands": "Brak pasujących poleceń",
|
"prompt.popover.emptyCommands": "Brak pasujących poleceń",
|
||||||
"prompt.dropzone.label": "Upuść tutaj obrazy, pliki PDF lub pliki tekstowe",
|
"prompt.dropzone.label": "Upuść tutaj obrazy, pliki PDF lub pliki tekstowe",
|
||||||
"prompt.dropzone.file.label": "Upuść, aby oznaczyć plik za pomocą @",
|
"prompt.dropzone.file.label": "Upuść, aby @wspomnieć plik",
|
||||||
"prompt.slash.badge.custom": "własne",
|
"prompt.slash.badge.custom": "własne",
|
||||||
"prompt.slash.badge.skill": "umiejętność",
|
"prompt.slash.badge.skill": "skill",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
"prompt.context.active": "aktywny",
|
"prompt.context.active": "aktywny",
|
||||||
"prompt.context.includeActiveFile": "Dołącz aktywny plik",
|
"prompt.context.includeActiveFile": "Dołącz aktywny plik",
|
||||||
"prompt.context.removeActiveFile": "Usuń aktywny plik z kontekstu",
|
"prompt.context.removeActiveFile": "Usuń aktywny plik z kontekstu",
|
||||||
"prompt.context.removeFile": "Usuń plik z kontekstu",
|
"prompt.context.removeFile": "Usuń plik z kontekstu",
|
||||||
"prompt.action.attachFile": "Dodaj pliki",
|
"prompt.action.attachFile": "Załącz plik",
|
||||||
"prompt.menu.addImagesAndFiles": "Dodaj pliki i inne elementy",
|
"prompt.menu.addImagesAndFiles": "Dodaj pliki i inne elementy",
|
||||||
"prompt.menu.imagesAndFiles": "Obrazy i pliki",
|
"prompt.menu.imagesAndFiles": "Obrazy i pliki",
|
||||||
"prompt.menu.commands": "Polecenia",
|
"prompt.menu.commands": "Polecenia",
|
||||||
@@ -397,12 +289,12 @@ export const dict = {
|
|||||||
"prompt.toast.promptSendFailed.title": "Nie udało się wysłać zapytania",
|
"prompt.toast.promptSendFailed.title": "Nie udało się wysłać zapytania",
|
||||||
"prompt.toast.promptSendFailed.description": "Nie udało się pobrać sesji",
|
"prompt.toast.promptSendFailed.description": "Nie udało się pobrać sesji",
|
||||||
"dialog.mcp.title": "MCP",
|
"dialog.mcp.title": "MCP",
|
||||||
"dialog.mcp.description": "Włączone: {{enabled}} z {{total}}",
|
"dialog.mcp.description": "{{enabled}} z {{total}} włączone",
|
||||||
"dialog.mcp.empty": "Brak skonfigurowanych MCP",
|
"dialog.mcp.empty": "Brak skonfigurowanych MCP",
|
||||||
"dialog.lsp.empty": "Serwery LSP są wykrywane automatycznie na podstawie typów plików",
|
"dialog.lsp.empty": "LSP wykryte automatycznie na podstawie typów plików",
|
||||||
"dialog.plugins.empty": "Wtyczki są skonfigurowane w pliku opencode.json",
|
"dialog.plugins.empty": "Wtyczki skonfigurowane w opencode.json",
|
||||||
"mcp.status.connected": "połączono",
|
"mcp.status.connected": "połączono",
|
||||||
"mcp.status.failed": "błąd",
|
"mcp.status.failed": "niepowodzenie",
|
||||||
"mcp.status.needs_auth": "wymaga autoryzacji",
|
"mcp.status.needs_auth": "wymaga autoryzacji",
|
||||||
"mcp.auth.clickToAuthenticate": "Kliknij, aby się uwierzytelnić",
|
"mcp.auth.clickToAuthenticate": "Kliknij, aby się uwierzytelnić",
|
||||||
"mcp.status.disabled": "wyłączone",
|
"mcp.status.disabled": "wyłączone",
|
||||||
@@ -412,14 +304,14 @@ export const dict = {
|
|||||||
"dialog.directory.action.selectFile": "Wybierz plik",
|
"dialog.directory.action.selectFile": "Wybierz plik",
|
||||||
"dialog.directory.action.selectFolder": "Wybierz folder",
|
"dialog.directory.action.selectFolder": "Wybierz folder",
|
||||||
"dialog.directory.root": "Katalog główny",
|
"dialog.directory.root": "Katalog główny",
|
||||||
"dialog.directory.parent": "Folder nadrzędny",
|
"dialog.directory.parent": "Nadrzędny",
|
||||||
"dialog.directory.readError": "Nie można odczytać tego folderu",
|
"dialog.directory.readError": "Nie można odczytać tego folderu",
|
||||||
"dialog.server.title": "Serwery",
|
"dialog.server.title": "Serwery",
|
||||||
"dialog.server.description": "Przełącz serwer OpenCode, z którym łączy się ta aplikacja.",
|
"dialog.server.description": "Przełącz serwer OpenCode, z którym łączy się ta aplikacja.",
|
||||||
"dialog.server.search.placeholder": "Szukaj serwerów",
|
"dialog.server.search.placeholder": "Szukaj serwerów",
|
||||||
"dialog.server.empty": "Brak serwerów",
|
"dialog.server.empty": "Brak serwerów",
|
||||||
"dialog.server.add.title": "Dodaj serwer",
|
"dialog.server.add.title": "Dodaj serwer",
|
||||||
"dialog.server.add.url": "Adres URL serwera",
|
"dialog.server.add.url": "URL serwera",
|
||||||
"dialog.server.add.placeholder": "http://localhost:4096",
|
"dialog.server.add.placeholder": "http://localhost:4096",
|
||||||
"dialog.server.add.error": "Nie można połączyć się z serwerem",
|
"dialog.server.add.error": "Nie można połączyć się z serwerem",
|
||||||
"dialog.server.add.checking": "Sprawdzanie...",
|
"dialog.server.add.checking": "Sprawdzanie...",
|
||||||
@@ -431,7 +323,7 @@ export const dict = {
|
|||||||
"dialog.server.edit.title": "Edytuj serwer",
|
"dialog.server.edit.title": "Edytuj serwer",
|
||||||
"dialog.server.default.title": "Domyślny serwer",
|
"dialog.server.default.title": "Domyślny serwer",
|
||||||
"dialog.server.default.description":
|
"dialog.server.default.description":
|
||||||
"Łącz się z tym serwerem przy uruchamianiu aplikacji zamiast uruchamiać serwer lokalny. Wymaga ponownego uruchomienia.",
|
"Połącz z tym serwerem przy uruchomieniu aplikacji zamiast uruchamiać lokalny serwer. Wymaga restartu.",
|
||||||
"dialog.server.default.none": "Nie wybrano serwera",
|
"dialog.server.default.none": "Nie wybrano serwera",
|
||||||
"dialog.server.default.set": "Ustaw bieżący serwer jako domyślny",
|
"dialog.server.default.set": "Ustaw bieżący serwer jako domyślny",
|
||||||
"dialog.server.default.clear": "Wyczyść",
|
"dialog.server.default.clear": "Wyczyść",
|
||||||
@@ -440,7 +332,7 @@ export const dict = {
|
|||||||
"dialog.server.menu.default": "Ustaw jako domyślny",
|
"dialog.server.menu.default": "Ustaw jako domyślny",
|
||||||
"dialog.server.menu.defaultRemove": "Usuń domyślny",
|
"dialog.server.menu.defaultRemove": "Usuń domyślny",
|
||||||
"dialog.server.menu.delete": "Usuń",
|
"dialog.server.menu.delete": "Usuń",
|
||||||
"dialog.server.current": "Bieżący serwer",
|
"dialog.server.current": "Obecny serwer",
|
||||||
"dialog.server.status.default": "Domyślny",
|
"dialog.server.status.default": "Domyślny",
|
||||||
"wsl.server.add": "Dodaj serwer WSL",
|
"wsl.server.add": "Dodaj serwer WSL",
|
||||||
"wsl.server.addShort": "Dodaj WSL",
|
"wsl.server.addShort": "Dodaj WSL",
|
||||||
@@ -481,7 +373,7 @@ export const dict = {
|
|||||||
"wsl.onboarding.distroStatus.ready": "Gotowa",
|
"wsl.onboarding.distroStatus.ready": "Gotowa",
|
||||||
"wsl.onboarding.distroStatus.checking": "Sprawdzanie...",
|
"wsl.onboarding.distroStatus.checking": "Sprawdzanie...",
|
||||||
"wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nie jest zainstalowany",
|
"wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nie jest zainstalowany",
|
||||||
"wsl.onboarding.distroStatus.missingTools": "Brak narzędzi bash i curl",
|
"wsl.onboarding.distroStatus.missingTools": "Brak bash i curl",
|
||||||
"wsl.onboarding.distroStatus.unsupported": "Nieobsługiwana · Użyj WSL 2",
|
"wsl.onboarding.distroStatus.unsupported": "Nieobsługiwana · Użyj WSL 2",
|
||||||
"wsl.onboarding.needAnotherDistro": "Potrzebujesz innej dystrybucji?",
|
"wsl.onboarding.needAnotherDistro": "Potrzebujesz innej dystrybucji?",
|
||||||
"wsl.onboarding.needAnotherDistroHint": "Zainstaluj dystrybucję systemu Linux z katalogu WSL",
|
"wsl.onboarding.needAnotherDistroHint": "Zainstaluj dystrybucję systemu Linux z katalogu WSL",
|
||||||
@@ -502,7 +394,7 @@ export const dict = {
|
|||||||
"wsl.onboarding.installDistro": "Zainstaluj dystrybucję",
|
"wsl.onboarding.installDistro": "Zainstaluj dystrybucję",
|
||||||
"wsl.onboarding.searchDistros": "Szukaj dystrybucji",
|
"wsl.onboarding.searchDistros": "Szukaj dystrybucji",
|
||||||
"wsl.onboarding.wsl2Required": "Wymagany jest WSL 2.",
|
"wsl.onboarding.wsl2Required": "Wymagany jest WSL 2.",
|
||||||
"wsl.onboarding.toolsRequired": "Ta dystrybucja wymaga narzędzi bash i curl.",
|
"wsl.onboarding.toolsRequired": "Ta dystrybucja wymaga bash i curl.",
|
||||||
"wsl.onboarding.openTerminal": "Otwórz terminal",
|
"wsl.onboarding.openTerminal": "Otwórz terminal",
|
||||||
"wsl.onboarding.path": "Ścieżka: {{path}}",
|
"wsl.onboarding.path": "Ścieżka: {{path}}",
|
||||||
"wsl.onboarding.notFound": "nie znaleziono",
|
"wsl.onboarding.notFound": "nie znaleziono",
|
||||||
@@ -511,35 +403,18 @@ export const dict = {
|
|||||||
"wsl.onboarding.desktopVersion": "aplikacja komputerowa {{version}}",
|
"wsl.onboarding.desktopVersion": "aplikacja komputerowa {{version}}",
|
||||||
"wsl.onboarding.versionMismatch": "Zainstalowana wersja nie jest zgodna z wersją aplikacji komputerowej.",
|
"wsl.onboarding.versionMismatch": "Zainstalowana wersja nie jest zgodna z wersją aplikacji komputerowej.",
|
||||||
"wsl.onboarding.adding": "Dodawanie...",
|
"wsl.onboarding.adding": "Dodawanie...",
|
||||||
"help.tabs.toast.ariaLabel": "Przedstawiamy karty. Organizuj pracę i aktywne sesje za pomocą kart",
|
|
||||||
"help.tabs.toast.dismiss": "Odrzuć informacje o kartach",
|
|
||||||
"help.tabs.title": "Przedstawiamy karty",
|
|
||||||
"help.tabs.description": "Organizuj pracę i aktywne sesje za pomocą kart",
|
|
||||||
"help.tabs.date": "14 lipca",
|
|
||||||
"help.tabs.introduction": "OpenCode Desktop korzysta teraz z układu opartego na kartach.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Rozpocznij nową sesję na karcie lub otwórz istniejącą sesję z dowolnego projektu. Otwórz nową kartę, gdy zaczynasz coś nowego, i zamknij ją po zakończeniu.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Kilka otwartych kart ułatwia organizowanie aktywnych sesji. Jeśli chcesz zachować karty na dłużej, nadaj im łatwe do zapamiętania nazwy.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Wszystkie sesje i projekty znajdziesz na nowym ekranie głównym. Wybranie sesji powoduje otwarcie jej na karcie.",
|
|
||||||
"help.tabs.persistence": "Po ponownym otwarciu aplikacji karty pozostają otwarte.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Nowy układ nie obsługuje jeszcze drzew roboczych Git, ale ta funkcja pojawi się wkrótce. Jeśli wolisz nadal korzystać z poprzedniego układu, możesz przełączać układy w Ustawieniach. Pamiętaj jednak, że za kilka tygodni nowy układ stanie się jedynym dostępnym.",
|
|
||||||
"dialog.project.edit.title": "Edytuj projekt",
|
"dialog.project.edit.title": "Edytuj projekt",
|
||||||
"dialog.project.edit.name": "Nazwa",
|
"dialog.project.edit.name": "Nazwa",
|
||||||
"dialog.project.edit.icon": "Ikona",
|
"dialog.project.edit.icon": "Ikona",
|
||||||
"dialog.project.edit.icon.alt": "Ikona projektu",
|
"dialog.project.edit.icon.alt": "Ikona projektu",
|
||||||
"dialog.project.edit.icon.hint": "Kliknij, aby wybrać obraz, lub przeciągnij go tutaj",
|
"dialog.project.edit.icon.hint": "Kliknij lub przeciągnij obraz",
|
||||||
"dialog.project.edit.icon.recommended": "Zalecane: 128 × 128 px",
|
"dialog.project.edit.icon.recommended": "Zalecane: 128x128px",
|
||||||
"dialog.project.edit.color": "Kolor",
|
"dialog.project.edit.color": "Kolor",
|
||||||
"dialog.project.edit.color.select": "Wybierz kolor {{color}}",
|
"dialog.project.edit.color.select": "Wybierz kolor {{color}}",
|
||||||
"dialog.project.edit.worktree.startup": "Skrypt uruchamiania przestrzeni roboczej",
|
"dialog.project.edit.worktree.startup": "Skrypt uruchamiania przestrzeni roboczej",
|
||||||
"dialog.project.edit.worktree.startup.description":
|
"dialog.project.edit.worktree.startup.description":
|
||||||
"Uruchamiany po utworzeniu nowej przestrzeni roboczej (worktree).",
|
"Uruchamiany po utworzeniu nowej przestrzeni roboczej (worktree).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "np. bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "np. bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Nie pokazuj ponownie",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Podział kontekstu",
|
"context.breakdown.title": "Podział kontekstu",
|
||||||
"context.breakdown.note": 'Przybliżony podział tokenów wejściowych. "Inne" obejmuje definicje narzędzi i narzut.',
|
"context.breakdown.note": 'Przybliżony podział tokenów wejściowych. "Inne" obejmuje definicje narzędzi i narzut.',
|
||||||
"context.breakdown.system": "System",
|
"context.breakdown.system": "System",
|
||||||
@@ -549,8 +424,6 @@ export const dict = {
|
|||||||
"context.breakdown.other": "Inne",
|
"context.breakdown.other": "Inne",
|
||||||
"context.systemPrompt.title": "Prompt systemowy",
|
"context.systemPrompt.title": "Prompt systemowy",
|
||||||
"context.rawMessages.title": "Surowe wiadomości",
|
"context.rawMessages.title": "Surowe wiadomości",
|
||||||
"context.export.session": "Eksportuj sesję",
|
|
||||||
|
|
||||||
"context.stats.session": "Sesja",
|
"context.stats.session": "Sesja",
|
||||||
"context.stats.messages": "Wiadomości",
|
"context.stats.messages": "Wiadomości",
|
||||||
"context.stats.provider": "Dostawca",
|
"context.stats.provider": "Dostawca",
|
||||||
@@ -595,9 +468,9 @@ export const dict = {
|
|||||||
"toast.theme.title": "Przełączono motyw",
|
"toast.theme.title": "Przełączono motyw",
|
||||||
"toast.scheme.title": "Schemat kolorów",
|
"toast.scheme.title": "Schemat kolorów",
|
||||||
"toast.workspace.enabled.title": "Przestrzenie robocze włączone",
|
"toast.workspace.enabled.title": "Przestrzenie robocze włączone",
|
||||||
"toast.workspace.enabled.description": "Kilka drzew roboczych jest teraz wyświetlanych na pasku bocznym",
|
"toast.workspace.enabled.description": "Kilka worktree jest teraz wyświetlanych na pasku bocznym",
|
||||||
"toast.workspace.disabled.title": "Przestrzenie robocze wyłączone",
|
"toast.workspace.disabled.title": "Przestrzenie robocze wyłączone",
|
||||||
"toast.workspace.disabled.description": "Tylko główne drzewo robocze jest wyświetlane na pasku bocznym",
|
"toast.workspace.disabled.description": "Tylko główny worktree jest wyświetlany na pasku bocznym",
|
||||||
"toast.permissions.autoaccept.on.title": "Automatyczne akceptowanie uprawnień",
|
"toast.permissions.autoaccept.on.title": "Automatyczne akceptowanie uprawnień",
|
||||||
"toast.permissions.autoaccept.on.description": "Żądania uprawnień będą automatycznie zatwierdzane",
|
"toast.permissions.autoaccept.on.description": "Żądania uprawnień będą automatycznie zatwierdzane",
|
||||||
"toast.permissions.autoaccept.off.title": "Zatrzymano automatyczne akceptowanie uprawnień",
|
"toast.permissions.autoaccept.off.title": "Zatrzymano automatyczne akceptowanie uprawnień",
|
||||||
@@ -608,30 +481,25 @@ export const dict = {
|
|||||||
"toast.file.listFailed.title": "Nie udało się wyświetlić listy plików",
|
"toast.file.listFailed.title": "Nie udało się wyświetlić listy plików",
|
||||||
"toast.context.noLineSelection.title": "Brak zaznaczenia linii",
|
"toast.context.noLineSelection.title": "Brak zaznaczenia linii",
|
||||||
"toast.context.noLineSelection.description": "Najpierw wybierz zakres linii w zakładce pliku.",
|
"toast.context.noLineSelection.description": "Najpierw wybierz zakres linii w zakładce pliku.",
|
||||||
"toast.session.share.copyFailed.title": "Nie udało się skopiować adresu URL do schowka",
|
"toast.session.share.copyFailed.title": "Nie udało się skopiować URL do schowka",
|
||||||
"toast.session.share.success.title": "Sesja udostępniona",
|
"toast.session.share.success.title": "Sesja udostępniona",
|
||||||
"toast.session.share.success.description": "Adres URL udostępnionej sesji skopiowano do schowka!",
|
"toast.session.share.success.description": "Link udostępniania skopiowany do schowka!",
|
||||||
"toast.session.share.failed.title": "Nie udało się udostępnić sesji",
|
"toast.session.share.failed.title": "Nie udało się udostępnić sesji",
|
||||||
"toast.session.share.failed.description": "Wystąpił błąd podczas udostępniania sesji",
|
"toast.session.share.failed.description": "Wystąpił błąd podczas udostępniania sesji",
|
||||||
"toast.session.unshare.success.title": "Zatrzymano udostępnianie sesji",
|
"toast.session.unshare.success.title": "Zatrzymano udostępnianie sesji",
|
||||||
"toast.session.unshare.success.description": "Udostępnianie sesji zostało pomyślnie zatrzymane!",
|
"toast.session.unshare.success.description": "Udostępnianie sesji zostało pomyślnie zatrzymane!",
|
||||||
"toast.session.unshare.failed.title": "Nie udało się zatrzymać udostępniania sesji",
|
"toast.session.unshare.failed.title": "Nie udało się zatrzymać udostępniania sesji",
|
||||||
"toast.session.unshare.failed.description": "Wystąpił błąd podczas zatrzymywania udostępniania sesji",
|
"toast.session.unshare.failed.description": "Wystąpił błąd podczas zatrzymywania udostępniania sesji",
|
||||||
"toast.session.export.success.title": "Sesja wyeksportowana",
|
|
||||||
"toast.session.export.success.description": "Sesję zapisano jako {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Nie udało się wyeksportować sesji",
|
|
||||||
"toast.session.export.failed.description": "Wystąpił błąd podczas eksportowania sesji",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Nie udało się załadować sesji dla {{project}}",
|
"toast.session.listFailed.title": "Nie udało się załadować sesji dla {{project}}",
|
||||||
"toast.update.title": "Dostępna aktualizacja",
|
"toast.update.title": "Dostępna aktualizacja",
|
||||||
"toast.update.description": "Nowa wersja OpenCode ({{version}}) jest teraz dostępna do instalacji.",
|
"toast.update.description": "Nowa wersja OpenCode ({{version}}) jest teraz dostępna do instalacji.",
|
||||||
"toast.update.action.installRestart": "Zainstaluj i uruchom ponownie",
|
"toast.update.action.installRestart": "Zainstaluj i zrestartuj",
|
||||||
"toast.update.action.notYet": "Jeszcze nie",
|
"toast.update.action.notYet": "Jeszcze nie",
|
||||||
"error.page.title": "Coś poszło nie tak",
|
"error.page.title": "Coś poszło nie tak",
|
||||||
"error.page.description": "Wystąpił błąd podczas ładowania aplikacji.",
|
"error.page.description": "Wystąpił błąd podczas ładowania aplikacji.",
|
||||||
"error.page.description.localServerStartup": "Wystąpił błąd podczas uruchamiania serwera lokalnego.",
|
"error.page.description.localServerStartup": "Wystąpił błąd podczas uruchamiania serwera lokalnego.",
|
||||||
"error.page.details.label": "Szczegóły błędu",
|
"error.page.details.label": "Szczegóły błędu",
|
||||||
"error.page.action.restart": "Uruchom ponownie",
|
"error.page.action.restart": "Restartuj",
|
||||||
"error.page.action.report": "Zgłoś błąd",
|
"error.page.action.report": "Zgłoś błąd",
|
||||||
"error.page.action.reported": "Błąd zgłoszony",
|
"error.page.action.reported": "Błąd zgłoszony",
|
||||||
"error.page.action.exportLogs": "Eksportuj dzienniki",
|
"error.page.action.exportLogs": "Eksportuj dzienniki",
|
||||||
@@ -644,7 +512,7 @@ export const dict = {
|
|||||||
"error.dev.rootNotFound":
|
"error.dev.rootNotFound":
|
||||||
"Nie znaleziono elementu głównego. Czy zapomniałeś dodać go do swojego index.html? A może atrybut id został błędnie wpisany?",
|
"Nie znaleziono elementu głównego. Czy zapomniałeś dodać go do swojego index.html? A może atrybut id został błędnie wpisany?",
|
||||||
"error.serverSync.connectFailed": "Nie można połączyć się z serwerem. Czy serwer działa pod adresem `{{url}}`?",
|
"error.serverSync.connectFailed": "Nie można połączyć się z serwerem. Czy serwer działa pod adresem `{{url}}`?",
|
||||||
"directory.error.invalidUrl": "Nieprawidłowy katalog w adresie URL.",
|
"directory.error.invalidUrl": "Nieprawidłowy katalog w URL.",
|
||||||
"error.chain.unknown": "Nieznany błąd",
|
"error.chain.unknown": "Nieznany błąd",
|
||||||
"error.chain.causedBy": "Spowodowany przez:",
|
"error.chain.causedBy": "Spowodowany przez:",
|
||||||
"error.chain.apiError": "Błąd API",
|
"error.chain.apiError": "Błąd API",
|
||||||
@@ -653,7 +521,7 @@ export const dict = {
|
|||||||
"error.chain.responseBody": "Treść odpowiedzi:\n{{body}}",
|
"error.chain.responseBody": "Treść odpowiedzi:\n{{body}}",
|
||||||
"error.chain.didYouMean": "Czy miałeś na myśli: {{suggestions}}",
|
"error.chain.didYouMean": "Czy miałeś na myśli: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Model nie znaleziony: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Model nie znaleziony: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Sprawdź nazwy dostawców i modeli w konfiguracji (opencode.json)",
|
"error.chain.checkConfig": "Sprawdź swoją konfigurację (opencode.json) nazwy dostawców/modeli",
|
||||||
"error.chain.mcpFailed":
|
"error.chain.mcpFailed":
|
||||||
"Serwer MCP „{{name}}” nie uruchomił się. Uwaga: OpenCode nie obsługuje jeszcze uwierzytelniania MCP.",
|
"Serwer MCP „{{name}}” nie uruchomił się. Uwaga: OpenCode nie obsługuje jeszcze uwierzytelniania MCP.",
|
||||||
"error.chain.providerAuthFailed": "Uwierzytelnianie dostawcy nie powiodło się ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Uwierzytelnianie dostawcy nie powiodło się ({{provider}}): {{message}}",
|
||||||
@@ -708,7 +576,7 @@ export const dict = {
|
|||||||
"session.review.change.other": "Zmiany",
|
"session.review.change.other": "Zmiany",
|
||||||
"session.review.loadingChanges": "Ładowanie zmian...",
|
"session.review.loadingChanges": "Ładowanie zmian...",
|
||||||
"session.review.empty": "Brak zmian w tej sesji",
|
"session.review.empty": "Brak zmian w tej sesji",
|
||||||
"session.review.noVcs": "Nie wykryto systemu kontroli wersji Git, dlatego zmiany nie są wyświetlane",
|
"session.review.noVcs": "Nie wykryto systemu kontroli wersji Git, zmiany nie są wyświetlane",
|
||||||
"session.review.noSnapshot": "Śledzenie migawek jest wyłączone w konfiguracji, więc zmiany w sesji są niedostępne",
|
"session.review.noSnapshot": "Śledzenie migawek jest wyłączone w konfiguracji, więc zmiany w sesji są niedostępne",
|
||||||
"session.review.noChanges": "Brak zmian",
|
"session.review.noChanges": "Brak zmian",
|
||||||
"session.review.noUncommittedChanges": "Brak jeszcze niezatwierdzonych zmian",
|
"session.review.noUncommittedChanges": "Brak jeszcze niezatwierdzonych zmian",
|
||||||
@@ -729,20 +597,14 @@ export const dict = {
|
|||||||
"session.question.minimize": "Zminimalizuj pytanie",
|
"session.question.minimize": "Zminimalizuj pytanie",
|
||||||
"session.question.restore": "Przywróć pytanie",
|
"session.question.restore": "Przywróć pytanie",
|
||||||
"session.question.pending.one": "{{count}} oczekujące pytanie",
|
"session.question.pending.one": "{{count}} oczekujące pytanie",
|
||||||
"session.question.pending.few": "{{count}} oczekujące pytania",
|
|
||||||
"session.question.pending.many": "{{count}} oczekujących pytań",
|
|
||||||
"session.question.pending.other": "Pytania oczekujące: {{count}}",
|
"session.question.pending.other": "Pytania oczekujące: {{count}}",
|
||||||
"session.followupDock.summary.one": "{{count}} wiadomość w kolejce",
|
"session.followupDock.summary.one": "{{count}} wiadomość w kolejce",
|
||||||
"session.followupDock.summary.few": "{{count}} wiadomości w kolejce",
|
|
||||||
"session.followupDock.summary.many": "{{count}} wiadomości w kolejce",
|
|
||||||
"session.followupDock.summary.other": "{{count}} wiadomości w kolejce",
|
"session.followupDock.summary.other": "{{count}} wiadomości w kolejce",
|
||||||
"session.followupDock.sendNow": "Wyślij teraz",
|
"session.followupDock.sendNow": "Wyślij teraz",
|
||||||
"session.followupDock.edit": "Edytuj",
|
"session.followupDock.edit": "Edytuj",
|
||||||
"session.followupDock.collapse": "Zwiń wiadomości w kolejce",
|
"session.followupDock.collapse": "Zwiń wiadomości w kolejce",
|
||||||
"session.followupDock.expand": "Rozwiń wiadomości w kolejce",
|
"session.followupDock.expand": "Rozwiń wiadomości w kolejce",
|
||||||
"session.revertDock.summary.one": "{{count}} cofnięta wiadomość",
|
"session.revertDock.summary.one": "{{count}} cofnięta wiadomość",
|
||||||
"session.revertDock.summary.few": "{{count}} cofnięte wiadomości",
|
|
||||||
"session.revertDock.summary.many": "{{count}} cofniętych wiadomości",
|
|
||||||
"session.revertDock.summary.other": "{{count}} cofnięte wiadomości",
|
"session.revertDock.summary.other": "{{count}} cofnięte wiadomości",
|
||||||
"session.revertDock.collapse": "Zwiń cofnięte wiadomości",
|
"session.revertDock.collapse": "Zwiń cofnięte wiadomości",
|
||||||
"session.revertDock.expand": "Rozwiń cofnięte wiadomości",
|
"session.revertDock.expand": "Rozwiń cofnięte wiadomości",
|
||||||
@@ -784,7 +646,7 @@ export const dict = {
|
|||||||
"session.share.action.publishing": "Publikowanie...",
|
"session.share.action.publishing": "Publikowanie...",
|
||||||
"session.share.action.unpublish": "Cofnij publikację",
|
"session.share.action.unpublish": "Cofnij publikację",
|
||||||
"session.share.action.unpublishing": "Cofanie publikacji...",
|
"session.share.action.unpublishing": "Cofanie publikacji...",
|
||||||
"session.share.action.view": "Wyświetl",
|
"session.share.action.view": "Widok",
|
||||||
"session.share.copy.copied": "Skopiowano",
|
"session.share.copy.copied": "Skopiowano",
|
||||||
"session.share.copy.copyLink": "Kopiuj link",
|
"session.share.copy.copyLink": "Kopiuj link",
|
||||||
"lsp.tooltip.none": "Brak serwerów LSP",
|
"lsp.tooltip.none": "Brak serwerów LSP",
|
||||||
@@ -796,20 +658,13 @@ export const dict = {
|
|||||||
"terminal.close": "Zamknij terminal",
|
"terminal.close": "Zamknij terminal",
|
||||||
"terminal.connectionLost.title": "Utracono połączenie",
|
"terminal.connectionLost.title": "Utracono połączenie",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"Połączenie z terminalem zostało przerwane. Może się to zdarzyć podczas ponownego uruchamiania serwera.",
|
"Połączenie z terminalem zostało przerwane. Może się to zdarzyć przy restarcie serwera.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"Bilet połączenia PTY został odrzucony podczas kontroli źródła lub CSRF. Sprawdź konfigurację CORS serwera.",
|
|
||||||
"terminal.connectTicket.statusError": "Bilet połączenia PTY zakończył się niepowodzeniem ze statusem {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Aktualizuj",
|
|
||||||
"titlebar.updateVersion": "Aktualizuj {{version}}",
|
|
||||||
"common.closeTab": "Zamknij kartę",
|
"common.closeTab": "Zamknij kartę",
|
||||||
"common.dismiss": "Odrzuć",
|
"common.dismiss": "Odrzuć",
|
||||||
"common.requestFailed": "Żądanie nie powiodło się",
|
"common.requestFailed": "Żądanie nie powiodło się",
|
||||||
"common.moreOptions": "Więcej opcji",
|
"common.moreOptions": "Więcej opcji",
|
||||||
"common.learnMore": "Dowiedz się więcej",
|
"common.learnMore": "Dowiedz się więcej",
|
||||||
"common.rename": "Zmień nazwę",
|
"common.rename": "Zmień nazwę",
|
||||||
"common.export": "Eksportuj",
|
|
||||||
"common.reset": "Resetuj",
|
"common.reset": "Resetuj",
|
||||||
"common.archive": "Archiwizuj",
|
"common.archive": "Archiwizuj",
|
||||||
"common.delete": "Usuń",
|
"common.delete": "Usuń",
|
||||||
@@ -832,7 +687,7 @@ export const dict = {
|
|||||||
"sidebar.empty.title": "Brak otwartych projektów",
|
"sidebar.empty.title": "Brak otwartych projektów",
|
||||||
"sidebar.empty.description": "Otwórz projekt, aby rozpocząć",
|
"sidebar.empty.description": "Otwórz projekt, aby rozpocząć",
|
||||||
"app.name.desktop": "OpenCode Desktop",
|
"app.name.desktop": "OpenCode Desktop",
|
||||||
"settings.section.desktop": "Aplikacja komputerowa",
|
"settings.section.desktop": "Pulpit",
|
||||||
"settings.section.server": "Serwer",
|
"settings.section.server": "Serwer",
|
||||||
"settings.tab.general": "Ogólne",
|
"settings.tab.general": "Ogólne",
|
||||||
"settings.tab.shortcuts": "Skróty",
|
"settings.tab.shortcuts": "Skróty",
|
||||||
@@ -884,9 +739,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Dolna nawigacja",
|
"settings.general.row.mobileTitlebarBottom.title": "Dolna nawigacja",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"Umieść pasek tytułu i karty sesji u dołu ekranu na urządzeniach mobilnych",
|
"Umieść pasek tytułu i karty sesji u dołu ekranu na urządzeniach mobilnych",
|
||||||
"settings.general.row.showCustomAgents.title": "Wybór agenta",
|
"settings.general.row.showCustomAgents.title": "Agenci niestandardowi",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Pokaż wybór agenta w edytorze wiadomości",
|
||||||
"Umożliwiaj przełączanie agentów w edytorze wiadomości. Po ukryciu domyślnie używany jest agent Build.",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "Pokaż podsumowania wnioskowania",
|
"settings.general.row.reasoningSummaries.title": "Pokaż podsumowania wnioskowania",
|
||||||
"settings.general.row.reasoningSummaries.description": "Wyświetlaj podsumowania wnioskowania modelu na osi czasu",
|
"settings.general.row.reasoningSummaries.description": "Wyświetlaj podsumowania wnioskowania modelu na osi czasu",
|
||||||
"settings.general.row.shellToolPartsExpanded.title": "Rozwijaj elementy narzędzia shell",
|
"settings.general.row.shellToolPartsExpanded.title": "Rozwijaj elementy narzędzia shell",
|
||||||
@@ -904,14 +758,13 @@ export const dict = {
|
|||||||
"settings.general.row.newInterfaceNotice.dismiss": "Odrzuć",
|
"settings.general.row.newInterfaceNotice.dismiss": "Odrzuć",
|
||||||
"settings.general.row.pinchZoom.title": "Powiększanie gestem szczypania",
|
"settings.general.row.pinchZoom.title": "Powiększanie gestem szczypania",
|
||||||
"settings.general.row.pinchZoom.description":
|
"settings.general.row.pinchZoom.description":
|
||||||
"Zezwalaj na powiększanie gestem szczypania na gładziku lub przez przewijanie z wciśniętym klawiszem Ctrl",
|
"Zezwalaj na powiększanie gestem szczypania na gładziku i przewijaniem z klawiszem Ctrl",
|
||||||
"settings.general.row.wayland.title": "Użyj natywnego protokołu Wayland",
|
"settings.general.row.wayland.title": "Użyj natywnego Wayland",
|
||||||
"settings.general.row.wayland.description":
|
"settings.general.row.wayland.description": "Wyłącz fallback X11 na Wayland. Wymaga restartu.",
|
||||||
"Wyłącz awaryjne korzystanie z X11 w środowisku Wayland. Wymaga ponownego uruchomienia.",
|
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"W systemie Linux z monitorami o różnej częstotliwości odświeżania natywny protokół Wayland może być stabilniejszy.",
|
"Na Linuxie z monitorami o różnym odświeżaniu, natywny Wayland może być bardziej stabilny.",
|
||||||
"settings.general.row.releaseNotes.title": "Informacje o wydaniu",
|
"settings.general.row.releaseNotes.title": "Informacje o wydaniu",
|
||||||
"settings.general.row.releaseNotes.description": "Pokazuj wyskakujące okna „Co nowego” po aktualizacjach",
|
"settings.general.row.releaseNotes.description": 'Pokazuj wyskakujące okna "Co nowego" po aktualizacjach',
|
||||||
"settings.updates.row.startup.title": "Sprawdzaj aktualizacje przy uruchomieniu",
|
"settings.updates.row.startup.title": "Sprawdzaj aktualizacje przy uruchomieniu",
|
||||||
"settings.updates.row.startup.description": "Automatycznie sprawdzaj aktualizacje podczas uruchamiania OpenCode",
|
"settings.updates.row.startup.description": "Automatycznie sprawdzaj aktualizacje podczas uruchamiania OpenCode",
|
||||||
"settings.updates.row.check.title": "Sprawdź aktualizacje",
|
"settings.updates.row.check.title": "Sprawdź aktualizacje",
|
||||||
@@ -1025,8 +878,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.title": "Odczyt",
|
"settings.permissions.tool.read.title": "Odczyt",
|
||||||
"settings.permissions.tool.read.description": "Odczyt pliku (pasuje do ścieżki pliku)",
|
"settings.permissions.tool.read.description": "Odczyt pliku (pasuje do ścieżki pliku)",
|
||||||
"settings.permissions.tool.edit.title": "Edycja",
|
"settings.permissions.tool.edit.title": "Edycja",
|
||||||
"settings.permissions.tool.edit.description":
|
"settings.permissions.tool.edit.description": "Modyfikacja plików, w tym edycje, zapisy, łatki i multi-edycje",
|
||||||
"Modyfikowanie plików, w tym edytowanie, zapisywanie, stosowanie łatek i edytowanie wielu plików",
|
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Dopasowywanie plików za pomocą wzorców glob",
|
"settings.permissions.tool.glob.description": "Dopasowywanie plików za pomocą wzorców glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
@@ -1036,7 +888,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "Uruchamianie poleceń powłoki",
|
"settings.permissions.tool.bash.description": "Uruchamianie poleceń powłoki",
|
||||||
"settings.permissions.tool.task.title": "Zadanie",
|
"settings.permissions.tool.task.title": "Zadanie",
|
||||||
"settings.permissions.tool.task.description": "Uruchamianie podagentów",
|
"settings.permissions.tool.task.description": "Uruchamianie pod-agentów",
|
||||||
"settings.permissions.tool.skill.title": "Umiejętność",
|
"settings.permissions.tool.skill.title": "Umiejętność",
|
||||||
"settings.permissions.tool.skill.description": "Ładowanie umiejętności według nazwy",
|
"settings.permissions.tool.skill.description": "Ładowanie umiejętności według nazwy",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
@@ -1067,7 +919,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.description": "Przestrzeń robocza odpowiada teraz domyślnej gałęzi.",
|
"workspace.reset.success.description": "Przestrzeń robocza odpowiada teraz domyślnej gałęzi.",
|
||||||
"workspace.error.stillPreparing": "Przestrzeń robocza jest wciąż przygotowywana",
|
"workspace.error.stillPreparing": "Przestrzeń robocza jest wciąż przygotowywana",
|
||||||
"workspace.status.checking": "Sprawdzanie niezscalonych zmian...",
|
"workspace.status.checking": "Sprawdzanie niezscalonych zmian...",
|
||||||
"workspace.status.error": "Nie można zweryfikować statusu Git.",
|
"workspace.status.error": "Nie można zweryfikować statusu git.",
|
||||||
"workspace.status.clean": "Nie wykryto niezscalonych zmian.",
|
"workspace.status.clean": "Nie wykryto niezscalonych zmian.",
|
||||||
"workspace.status.dirty": "Wykryto niezscalone zmiany w tej przestrzeni roboczej.",
|
"workspace.status.dirty": "Wykryto niezscalone zmiany w tej przestrzeni roboczej.",
|
||||||
"workspace.delete.title": "Usuń przestrzeń roboczą",
|
"workspace.delete.title": "Usuń przestrzeń roboczą",
|
||||||
@@ -1093,7 +945,7 @@ export const dict = {
|
|||||||
"common.time.hoursAgo.short": "{{count}} godz. temu",
|
"common.time.hoursAgo.short": "{{count}} godz. temu",
|
||||||
"common.time.daysAgo.short": "{{count}} dni temu",
|
"common.time.daysAgo.short": "{{count}} dni temu",
|
||||||
"settings.providers.connected.environmentDescription": "Połączono ze zmiennymi środowiskowymi",
|
"settings.providers.connected.environmentDescription": "Połączono ze zmiennymi środowiskowymi",
|
||||||
"settings.providers.custom.description": "Dodaj dostawcę zgodnego z OpenAI za pomocą bazowego adresu URL.",
|
"settings.providers.custom.description": "Dodaj dostawcę zgodnego z OpenAI poprzez podstawowy URL.",
|
||||||
|
|
||||||
"app.server.unreachable": "Nie można połączyć z {{server}}",
|
"app.server.unreachable": "Nie można połączyć z {{server}}",
|
||||||
"app.server.retrying": "Ponawianie automatycznie...",
|
"app.server.retrying": "Ponawianie automatycznie...",
|
||||||
@@ -1109,9 +961,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} z {{total}} pytań",
|
"session.question.progress": "{{current}} z {{total}} pytań",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Eksplorator plików",
|
"session.header.open.fileExplorer": "Eksplorator plików",
|
||||||
"session.header.reveal.finder": "Pokaż w Finderze",
|
|
||||||
"session.header.reveal.fileExplorer": "Pokaż w Eksploratorze plików",
|
|
||||||
"session.header.reveal.containingFolder": "Otwórz folder zawierający",
|
|
||||||
"session.header.open.fileManager": "Menedżer plików",
|
"session.header.open.fileManager": "Menedżer plików",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1126,17 +975,17 @@ export const dict = {
|
|||||||
"session.header.open.app.androidStudio": "Android Studio",
|
"session.header.open.app.androidStudio": "Android Studio",
|
||||||
"session.header.open.app.powershell": "PowerShell",
|
"session.header.open.app.powershell": "PowerShell",
|
||||||
"session.header.open.app.sublimeText": "Sublime Text",
|
"session.header.open.app.sublimeText": "Sublime Text",
|
||||||
"debugBar.ariaLabel": "Diagnostyka wydajności w środowisku deweloperskim",
|
"debugBar.ariaLabel": "Diagnostyka wydajności deweloperskiej",
|
||||||
"debugBar.na": "n.d.",
|
"debugBar.na": "n.d.",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Ostatnie zakończone przejście między trasami obejmujące stronę sesji, mierzone od uruchomienia routera do pierwszego odrysowania po ustabilizowaniu widoku.",
|
"Ostatnie zakończone przejście trasy dotykające strony sesji, mierzone od startu routera do pierwszego odrysowania po ustaleniu.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Średnia liczba klatek na sekundę w ciągu ostatnich 5 sekund.",
|
"debugBar.fps.tip": "Średnia liczba klatek na sekundę w ciągu ostatnich 5 sekund.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
"debugBar.frame.tip": "Najgorszy czas klatki w ciągu ostatnich 5 sekund.",
|
"debugBar.frame.tip": "Najgorszy czas klatki w ciągu ostatnich 5 sekund.",
|
||||||
"debugBar.jank.label": "JANK",
|
"debugBar.jank.label": "JANK",
|
||||||
"debugBar.jank.tip": "Klatki powyżej 32 ms w ciągu ostatnich 5 sekund.",
|
"debugBar.jank.tip": "Klatki powyżej 32ms w ciągu ostatnich 5 sekund.",
|
||||||
"debugBar.long.label": "LONG",
|
"debugBar.long.label": "LONG",
|
||||||
"debugBar.long.tip":
|
"debugBar.long.tip":
|
||||||
"Zablokowany czas i liczba długich zadań w ciągu ostatnich 5 sekund. Maksymalne zadanie: {{max}}.",
|
"Zablokowany czas i liczba długich zadań w ciągu ostatnich 5 sekund. Maksymalne zadanie: {{max}}.",
|
||||||
@@ -1146,18 +995,10 @@ export const dict = {
|
|||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Przybliżony czas trwania interakcji w ciągu ostatnich 5 sekund. Jest to podobne do INP, a nie oficjalne Web Vitals INP.",
|
"Przybliżony czas trwania interakcji w ciągu ostatnich 5 sekund. Jest to podobne do INP, a nie oficjalne Web Vitals INP.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Skumulowane przesunięcie układu od bieżącego uruchomienia aplikacji.",
|
"debugBar.cls.tip": "Skumulowane przesunięcie układu dla bieżącego czasu życia aplikacji.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Wykorzystana pamięć sterty JS względem jej limitu. Tylko Chromium.",
|
"debugBar.mem.tipUnavailable": "Użyta sterta JS vs limit sterty. Tylko Chromium.",
|
||||||
"debugBar.mem.tip": "Wykorzystana pamięć sterty JS względem jej limitu: {{used}} z {{limit}}.",
|
"debugBar.mem.tip": "Użyta sterta JS vs limit sterty. {{used}} z {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Wymuś style fokusu dla wszystkich elementów interaktywnych",
|
|
||||||
"debugBar.focus.on": "WŁ.",
|
|
||||||
"debugBar.focus.off": "WYŁ.",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Wymuś kierunek układu całej aplikacji bez zmiany wybranego języka",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+81
-239
@@ -1,103 +1,4 @@
|
|||||||
export const dict = {
|
export const dict = {
|
||||||
"desktop.menu.app": "OpenCode",
|
|
||||||
"desktop.menu.file": "Файл",
|
|
||||||
"desktop.menu.edit": "Правка",
|
|
||||||
"desktop.menu.view": "Вид",
|
|
||||||
"desktop.menu.go": "Переход",
|
|
||||||
"desktop.menu.window": "Окно",
|
|
||||||
"desktop.menu.help": "Справка",
|
|
||||||
"desktop.menu.checkForUpdates": "Проверить наличие обновлений...",
|
|
||||||
"desktop.menu.settings": "Настройки",
|
|
||||||
"desktop.menu.reloadWebview": "Перезагрузить веб-представление",
|
|
||||||
"desktop.menu.restart": "Перезапустить",
|
|
||||||
"desktop.menu.exportLogs": "Экспортировать журналы...",
|
|
||||||
"desktop.menu.newSession": "Новая сессия",
|
|
||||||
"desktop.menu.openProject": "Открыть проект...",
|
|
||||||
"desktop.menu.newWindow": "Новое окно",
|
|
||||||
"desktop.menu.closeWindow": "Закрыть окно",
|
|
||||||
"desktop.menu.undo": "Отменить",
|
|
||||||
"desktop.menu.redo": "Повторить",
|
|
||||||
"desktop.menu.cut": "Вырезать",
|
|
||||||
"desktop.menu.copy": "Копировать",
|
|
||||||
"desktop.menu.paste": "Вставить",
|
|
||||||
"desktop.menu.delete": "Удалить",
|
|
||||||
"desktop.menu.selectAll": "Выбрать всё",
|
|
||||||
"desktop.menu.toggleSidebar": "Переключить боковую панель",
|
|
||||||
"desktop.menu.toggleTerminal": "Переключить терминал",
|
|
||||||
"desktop.menu.toggleFileTree": "Переключить дерево файлов",
|
|
||||||
"desktop.menu.reload": "Перезагрузить",
|
|
||||||
"desktop.menu.toggleDeveloperTools": "Переключить инструменты разработчика",
|
|
||||||
"desktop.menu.actualSize": "Фактический размер",
|
|
||||||
"desktop.menu.zoomIn": "Увеличить",
|
|
||||||
"desktop.menu.zoomOut": "Уменьшить",
|
|
||||||
"desktop.menu.toggleFullScreen": "Переключить полноэкранный режим",
|
|
||||||
"desktop.menu.back": "Назад",
|
|
||||||
"desktop.menu.forward": "Вперёд",
|
|
||||||
"desktop.menu.previousSession": "Предыдущая сессия",
|
|
||||||
"desktop.menu.nextSession": "Следующая сессия",
|
|
||||||
"desktop.menu.previousProject": "Предыдущий проект",
|
|
||||||
"desktop.menu.nextProject": "Следующий проект",
|
|
||||||
"desktop.menu.minimize": "Свернуть",
|
|
||||||
"desktop.menu.maximize": "Развернуть",
|
|
||||||
"desktop.menu.documentation": "Документация OpenCode",
|
|
||||||
"desktop.menu.supportForum": "Форум поддержки",
|
|
||||||
"desktop.menu.shareFeedback": "Отправить отзыв",
|
|
||||||
"desktop.menu.reportBug": "Сообщить об ошибке",
|
|
||||||
"desktop.menu.ariaLabel": "Меню OpenCode",
|
|
||||||
|
|
||||||
"desktop.updater.dialog.checkFailed.message": "Не удалось проверить наличие обновлений.",
|
|
||||||
"desktop.updater.dialog.checkFailed.title": "Ошибка обновления",
|
|
||||||
"desktop.updater.dialog.upToDate.message": "У вас установлена последняя версия.",
|
|
||||||
"desktop.updater.dialog.upToDate.title": "Обновлений нет",
|
|
||||||
"desktop.updater.dialog.ready.message": "Обновление {{version}} загружено. Перезапустить сейчас?",
|
|
||||||
"desktop.updater.dialog.ready.title": "Обновление готово",
|
|
||||||
"desktop.updater.dialog.restart": "Перезапустить",
|
|
||||||
"desktop.updater.dialog.later": "Позже",
|
|
||||||
|
|
||||||
"desktop.recovery.action.relaunch": "Запустить снова",
|
|
||||||
"desktop.recovery.action.exportLogs": "Экспортировать журналы",
|
|
||||||
"desktop.recovery.action.keepWaiting": "Продолжить ожидание",
|
|
||||||
"desktop.recovery.action.quit": "Выйти",
|
|
||||||
"desktop.recovery.loadFailed": "Не удалось загрузить OpenCode",
|
|
||||||
"desktop.recovery.terminated": "Окно OpenCode неожиданно завершило работу",
|
|
||||||
"desktop.recovery.unresponsive": "OpenCode не отвечает",
|
|
||||||
"desktop.recovery.unresponsive.detail": "Можно снова запустить приложение, открыть журналы или продолжить ожидание.",
|
|
||||||
"desktop.recovery.loadFailed.detail": "Окно: {{window}}\nURL: {{url}}\nОшибка: {{code}} {{description}}",
|
|
||||||
"desktop.recovery.terminated.detail": "Окно: {{window}}\nПричина: {{reason}}\nКод: {{code}}",
|
|
||||||
"desktop.recovery.unknown": "<неизвестно>",
|
|
||||||
|
|
||||||
"desktop.dialog.chooseFolder": "Выберите папку",
|
|
||||||
"desktop.dialog.chooseFile": "Выберите файл",
|
|
||||||
"desktop.dialog.saveFile": "Сохранить файл",
|
|
||||||
"desktop.dialog.files": "Файлы",
|
|
||||||
"desktop.server.local": "Локальный сервер",
|
|
||||||
|
|
||||||
"desktop.wsl.error.windowsOnly": "WSL доступна только в Windows",
|
|
||||||
"desktop.wsl.error.unavailable": "WSL недоступна",
|
|
||||||
"desktop.wsl.error.listInstalled": "Не удалось получить список установленных дистрибутивов WSL",
|
|
||||||
"desktop.wsl.error.listOnline": "Не удалось получить список доступных дистрибутивов WSL",
|
|
||||||
"desktop.wsl.error.executeDistro": "Не удаётся выполнять команды в дистрибутиве",
|
|
||||||
"desktop.wsl.error.installWsl": "Не удалось установить WSL",
|
|
||||||
"desktop.wsl.error.installDistro": "Не удалось установить дистрибутив: {{distro}}",
|
|
||||||
"desktop.wsl.error.installOpencode": "Не удалось установить OpenCode",
|
|
||||||
"desktop.wsl.error.alreadyAdded": "Дистрибутив {{distro}} уже добавлен",
|
|
||||||
"desktop.wsl.error.opencodeMissing": "opencode не установлен в этом дистрибутиве",
|
|
||||||
"desktop.wsl.error.opencodeCannotRun": "opencode установлен, но его не удалось запустить",
|
|
||||||
"desktop.wsl.error.opencodeNotInstalled": "OpenCode не установлен в {{distro}}",
|
|
||||||
"desktop.wsl.error.updateVersion":
|
|
||||||
"Обновление OpenCode завершено, но {{distro}} по-прежнему сообщает версию {{installed}}; ожидалась {{expected}}",
|
|
||||||
"desktop.wsl.error.noVersion": "нет версии",
|
|
||||||
"desktop.wsl.error.serverExited": "Сервер WSL завершил работу после запуска (код={{code}}, сигнал={{signal}})",
|
|
||||||
"desktop.wsl.error.serverExitedBeforeHealthy":
|
|
||||||
"Сервер WSL завершил работу до перехода в рабочее состояние (код={{code}}, сигнал={{signal}}){{output}}",
|
|
||||||
"desktop.wsl.error.healthTimeout":
|
|
||||||
"Истекло время ожидания проверки работоспособности Sidecar для {{distro}} ({{timeout}} мс)",
|
|
||||||
"desktop.wsl.error.commandTimeout": "Истекло время ожидания выполнения {{command}} {{args}} ({{timeout}} мс)",
|
|
||||||
"desktop.wsl.error.failedPort": "Не удалось получить порт",
|
|
||||||
|
|
||||||
"desktop.picker.error.notSelected": "В средстве выбора не выбран файл",
|
|
||||||
"desktop.picker.error.sizeLimit": "Размер выбранных вложений превышает лимит {{limit}} МБ",
|
|
||||||
|
|
||||||
"command.category.suggested": "Предложено",
|
"command.category.suggested": "Предложено",
|
||||||
"command.category.view": "Просмотр",
|
"command.category.view": "Просмотр",
|
||||||
"command.category.project": "Проект",
|
"command.category.project": "Проект",
|
||||||
@@ -115,7 +16,6 @@ export const dict = {
|
|||||||
"command.category.permissions": "Разрешения",
|
"command.category.permissions": "Разрешения",
|
||||||
"command.category.workspace": "Рабочее пространство",
|
"command.category.workspace": "Рабочее пространство",
|
||||||
"command.category.settings": "Настройки",
|
"command.category.settings": "Настройки",
|
||||||
"command.logs.export": "Экспортировать журналы",
|
|
||||||
|
|
||||||
"theme.scheme.system": "Системная",
|
"theme.scheme.system": "Системная",
|
||||||
"theme.scheme.light": "Светлая",
|
"theme.scheme.light": "Светлая",
|
||||||
@@ -137,12 +37,12 @@ export const dict = {
|
|||||||
|
|
||||||
"command.palette": "Палитра команд",
|
"command.palette": "Палитра команд",
|
||||||
|
|
||||||
"command.theme.cycle": "Переключить тему",
|
"command.theme.cycle": "Цикл тем",
|
||||||
"command.theme.set": "Использовать тему: {{theme}}",
|
"command.theme.set": "Использовать тему: {{theme}}",
|
||||||
"command.theme.scheme.cycle": "Переключить цветовую схему",
|
"command.theme.scheme.cycle": "Цикл цветовой схемы",
|
||||||
"command.theme.scheme.set": "Использовать цветовую схему: {{scheme}}",
|
"command.theme.scheme.set": "Использовать цветовую схему: {{scheme}}",
|
||||||
|
|
||||||
"command.language.cycle": "Переключить язык",
|
"command.language.cycle": "Цикл языков",
|
||||||
"command.language.set": "Использовать язык: {{language}}",
|
"command.language.set": "Использовать язык: {{language}}",
|
||||||
|
|
||||||
"command.session.new": "Новая сессия",
|
"command.session.new": "Новая сессия",
|
||||||
@@ -151,7 +51,7 @@ export const dict = {
|
|||||||
"command.tab.reopenClosed": "Повторно открыть закрытую вкладку",
|
"command.tab.reopenClosed": "Повторно открыть закрытую вкладку",
|
||||||
"command.context.addSelection": "Добавить выделение в контекст",
|
"command.context.addSelection": "Добавить выделение в контекст",
|
||||||
"command.context.addSelection.description": "Добавить выбранные строки из текущего файла",
|
"command.context.addSelection.description": "Добавить выбранные строки из текущего файла",
|
||||||
"command.input.focus": "Перейти к полю ввода",
|
"command.input.focus": "Фокус на поле ввода",
|
||||||
"command.terminal.toggle": "Переключить терминал",
|
"command.terminal.toggle": "Переключить терминал",
|
||||||
"command.fileTree.toggle": "Переключить дерево файлов",
|
"command.fileTree.toggle": "Переключить дерево файлов",
|
||||||
"command.review.toggle": "Переключить обзор",
|
"command.review.toggle": "Переключить обзор",
|
||||||
@@ -167,11 +67,11 @@ export const dict = {
|
|||||||
"command.model.choose.description": "Выбрать другую модель",
|
"command.model.choose.description": "Выбрать другую модель",
|
||||||
"command.mcp.toggle": "Переключить MCP",
|
"command.mcp.toggle": "Переключить MCP",
|
||||||
"command.mcp.toggle.description": "Переключить MCP",
|
"command.mcp.toggle.description": "Переключить MCP",
|
||||||
"command.agent.cycle": "Следующий агент",
|
"command.agent.cycle": "Цикл агентов",
|
||||||
"command.agent.cycle.description": "Переключиться к следующему агенту",
|
"command.agent.cycle.description": "Переключиться к следующему агенту",
|
||||||
"command.agent.cycle.reverse": "Предыдущий агент",
|
"command.agent.cycle.reverse": "Цикл агентов назад",
|
||||||
"command.agent.cycle.reverse.description": "Переключиться к предыдущему агенту",
|
"command.agent.cycle.reverse.description": "Переключиться к предыдущему агенту",
|
||||||
"command.model.variant.cycle": "Переключить уровень усилий",
|
"command.model.variant.cycle": "Цикл режимов мышления",
|
||||||
"command.model.variant.cycle.description": "Переключиться к следующему уровню усилий",
|
"command.model.variant.cycle.description": "Переключиться к следующему уровню усилий",
|
||||||
"command.prompt.mode.shell": "Оболочка",
|
"command.prompt.mode.shell": "Оболочка",
|
||||||
"command.prompt.mode.normal": "Промпт",
|
"command.prompt.mode.normal": "Промпт",
|
||||||
@@ -192,9 +92,6 @@ export const dict = {
|
|||||||
"command.session.unshare": "Отменить публикацию",
|
"command.session.unshare": "Отменить публикацию",
|
||||||
"command.session.unshare.description": "Прекратить публикацию сессии",
|
"command.session.unshare.description": "Прекратить публикацию сессии",
|
||||||
|
|
||||||
"command.session.export": "Экспортировать сессию",
|
|
||||||
"command.session.export.description": "Экспортировать полную историю сессии в формате JSON",
|
|
||||||
|
|
||||||
"palette.search.placeholder": "Поиск файлов, команд и сессий",
|
"palette.search.placeholder": "Поиск файлов, команд и сессий",
|
||||||
"palette.search.placeholder.home": "Поиск команд и сессий",
|
"palette.search.placeholder.home": "Поиск команд и сессий",
|
||||||
"palette.empty": "Ничего не найдено",
|
"palette.empty": "Ничего не найдено",
|
||||||
@@ -205,10 +102,9 @@ export const dict = {
|
|||||||
"dialog.provider.empty": "Провайдеры не найдены",
|
"dialog.provider.empty": "Провайдеры не найдены",
|
||||||
"dialog.provider.group.popular": "Популярные",
|
"dialog.provider.group.popular": "Популярные",
|
||||||
"dialog.provider.group.other": "Другие",
|
"dialog.provider.group.other": "Другие",
|
||||||
"dialog.provider.custom.label": "Пользовательский провайдер, совместимый с OpenAI",
|
|
||||||
"dialog.provider.tag.recommended": "Рекомендуемые",
|
"dialog.provider.tag.recommended": "Рекомендуемые",
|
||||||
"dialog.provider.opencode.note": "Отобранные модели, включая Claude, GPT, Gemini и другие",
|
"dialog.provider.opencode.note": "Отобранные модели, включая Claude, GPT, Gemini и другие",
|
||||||
"dialog.provider.opencode.tagline": "Надёжные оптимизированные модели",
|
"dialog.provider.opencode.tagline": "Надежные оптимизированные модели",
|
||||||
"dialog.provider.opencodeGo.tagline": "Доступная подписка для всех",
|
"dialog.provider.opencodeGo.tagline": "Доступная подписка для всех",
|
||||||
"dialog.provider.anthropic.note": "Прямой доступ к моделям Claude, включая Pro и Max",
|
"dialog.provider.anthropic.note": "Прямой доступ к моделям Claude, включая Pro и Max",
|
||||||
"dialog.provider.copilot.note": "ИИ-модели для помощи в кодировании через GitHub Copilot",
|
"dialog.provider.copilot.note": "ИИ-модели для помощи в кодировании через GitHub Copilot",
|
||||||
@@ -221,36 +117,33 @@ export const dict = {
|
|||||||
"dialog.model.search.placeholder": "Поиск моделей",
|
"dialog.model.search.placeholder": "Поиск моделей",
|
||||||
"dialog.model.empty": "Модели не найдены",
|
"dialog.model.empty": "Модели не найдены",
|
||||||
"dialog.model.manage": "Управление моделями",
|
"dialog.model.manage": "Управление моделями",
|
||||||
"dialog.model.manage.description": "Настройте, какие модели отображаются при выборе модели",
|
"dialog.model.manage.description": "Настройте какие модели появляются в выборе модели",
|
||||||
"dialog.model.manage.provider.toggle": "Переключить все модели {{provider}}",
|
"dialog.model.manage.provider.toggle": "Переключить все модели {{provider}}",
|
||||||
|
|
||||||
"dialog.model.unpaid.freeModels.title": "Бесплатные модели от OpenCode",
|
"dialog.model.unpaid.freeModels.title": "Бесплатные модели от OpenCode",
|
||||||
"dialog.model.unpaid.addMore.title": "Добавьте больше моделей от популярных провайдеров",
|
"dialog.model.unpaid.addMore.title": "Добавьте больше моделей от популярных провайдеров",
|
||||||
"dialog.model.unpaid.viewMoreProviders": "Посмотреть ещё более 70 провайдеров",
|
|
||||||
|
|
||||||
"dialog.provider.viewAll": "Показать больше провайдеров",
|
"dialog.provider.viewAll": "Показать больше провайдеров",
|
||||||
|
|
||||||
"provider.connect.title": "Подключить {{provider}}",
|
"provider.connect.title": "Подключить {{provider}}",
|
||||||
"provider.connect.title.anthropicProMax": "Войти с помощью Claude Pro/Max",
|
"provider.connect.title.anthropicProMax": "Войти с помощью Claude Pro/Max",
|
||||||
"provider.connect.selectMethod": "Выберите способ входа для {{provider}}.",
|
"provider.connect.selectMethod": "Выберите способ входа для {{provider}}.",
|
||||||
"provider.connect.method.apiKey": "Ключ API",
|
"provider.connect.method.apiKey": "API ключ",
|
||||||
"provider.connect.method.browser": "Браузер",
|
|
||||||
"provider.connect.method.headless": "Без браузера",
|
|
||||||
"provider.connect.status.inProgress": "Авторизация...",
|
"provider.connect.status.inProgress": "Авторизация...",
|
||||||
"provider.connect.status.waiting": "Ожидание авторизации...",
|
"provider.connect.status.waiting": "Ожидание авторизации...",
|
||||||
"provider.connect.status.failed": "Ошибка авторизации: {{error}}",
|
"provider.connect.status.failed": "Ошибка авторизации: {{error}}",
|
||||||
"provider.connect.apiKey.description":
|
"provider.connect.apiKey.description":
|
||||||
"Введите ключ API {{provider}}, чтобы подключить аккаунт и использовать модели {{provider}} в OpenCode.",
|
"Введите ваш API ключ {{provider}} для подключения аккаунта и использования моделей {{provider}} в OpenCode.",
|
||||||
"provider.connect.apiKey.label": "Ключ API {{provider}}",
|
"provider.connect.apiKey.label": "{{provider}} API ключ",
|
||||||
"provider.connect.apiKey.placeholder": "Ключ API",
|
"provider.connect.apiKey.placeholder": "API ключ",
|
||||||
"provider.connect.apiKey.required": "Требуется ключ API",
|
"provider.connect.apiKey.required": "API ключ обязателен",
|
||||||
"provider.connect.opencodeZen.line1":
|
"provider.connect.opencodeZen.line1":
|
||||||
"OpenCode Zen даёт вам доступ к отобранным надёжным оптимизированным моделям для агентов программирования.",
|
"OpenCode Zen даёт вам доступ к отобранным надёжным оптимизированным моделям для агентов программирования.",
|
||||||
"provider.connect.opencodeZen.line2":
|
"provider.connect.opencodeZen.line2":
|
||||||
"С одним ключом API вы получите доступ к таким моделям, как Claude, GPT, Gemini, GLM и другие.",
|
"С одним API ключом вы получите доступ к таким моделям как Claude, GPT, Gemini, GLM и другим.",
|
||||||
"provider.connect.opencodeZen.visit.prefix": "Посетите ",
|
"provider.connect.opencodeZen.visit.prefix": "Посетите ",
|
||||||
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
|
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
|
||||||
"provider.connect.opencodeZen.visit.suffix": ", чтобы получить ключ API.",
|
"provider.connect.opencodeZen.visit.suffix": " чтобы получить ваш API ключ.",
|
||||||
"provider.connect.oauth.code.visit.prefix": "Посетите ",
|
"provider.connect.oauth.code.visit.prefix": "Посетите ",
|
||||||
"provider.connect.oauth.code.visit.link": "эту ссылку",
|
"provider.connect.oauth.code.visit.link": "эту ссылку",
|
||||||
"provider.connect.oauth.code.visit.suffix":
|
"provider.connect.oauth.code.visit.suffix":
|
||||||
@@ -268,19 +161,18 @@ export const dict = {
|
|||||||
"provider.connect.toast.connected.description": "Модели {{provider}} теперь доступны.",
|
"provider.connect.toast.connected.description": "Модели {{provider}} теперь доступны.",
|
||||||
|
|
||||||
"provider.custom.title": "Пользовательский провайдер",
|
"provider.custom.title": "Пользовательский провайдер",
|
||||||
"provider.custom.unavailable": "Пользовательские провайдеры недоступны на этом сервере",
|
"provider.custom.description.prefix": "Настройте OpenAI-совместимого провайдера. См. ",
|
||||||
"provider.custom.description.prefix": "Настройте провайдера, совместимого с OpenAI. См. ",
|
|
||||||
"provider.custom.description.link": "документацию по настройке провайдера",
|
"provider.custom.description.link": "документацию по настройке провайдера",
|
||||||
"provider.custom.description.suffix": ".",
|
"provider.custom.description.suffix": ".",
|
||||||
"provider.custom.field.providerID.label": "ID провайдера",
|
"provider.custom.field.providerID.label": "ID провайдера",
|
||||||
"provider.custom.field.providerID.placeholder": "myprovider",
|
"provider.custom.field.providerID.placeholder": "myprovider",
|
||||||
"provider.custom.field.providerID.description": "Строчные буквы, цифры, дефисы или подчёркивания",
|
"provider.custom.field.providerID.description": "Строчные буквы, цифры, дефисы или подчёркивания",
|
||||||
"provider.custom.field.name.label": "Отображаемое имя",
|
"provider.custom.field.name.label": "Отображаемое имя",
|
||||||
"provider.custom.field.name.placeholder": "Мой ИИ-провайдер",
|
"provider.custom.field.name.placeholder": "Мой AI провайдер",
|
||||||
"provider.custom.field.baseURL.label": "Базовый URL",
|
"provider.custom.field.baseURL.label": "Базовый URL",
|
||||||
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
|
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
|
||||||
"provider.custom.field.apiKey.label": "Ключ API",
|
"provider.custom.field.apiKey.label": "API ключ",
|
||||||
"provider.custom.field.apiKey.placeholder": "Ключ API",
|
"provider.custom.field.apiKey.placeholder": "API ключ",
|
||||||
"provider.custom.field.apiKey.description":
|
"provider.custom.field.apiKey.description":
|
||||||
"Необязательно. Оставьте пустым, если управляете авторизацией через заголовки.",
|
"Необязательно. Оставьте пустым, если управляете авторизацией через заголовки.",
|
||||||
"provider.custom.models.label": "Модели",
|
"provider.custom.models.label": "Модели",
|
||||||
@@ -319,15 +211,15 @@ export const dict = {
|
|||||||
"model.input.image": "изображение",
|
"model.input.image": "изображение",
|
||||||
"model.input.audio": "аудио",
|
"model.input.audio": "аудио",
|
||||||
"model.input.video": "видео",
|
"model.input.video": "видео",
|
||||||
"model.input.pdf": "PDF",
|
"model.input.pdf": "pdf",
|
||||||
"model.tooltip.allows": "Поддерживает: {{inputs}}",
|
"model.tooltip.allows": "Разрешено: {{inputs}}",
|
||||||
"model.tooltip.context.label": "Контекст",
|
"model.tooltip.context.label": "Контекст",
|
||||||
"model.tooltip.inputs": "Входные данные",
|
"model.tooltip.inputs": "Входные данные",
|
||||||
"model.tooltip.model": "Модель",
|
"model.tooltip.model": "Модель",
|
||||||
"model.tooltip.provider": "Провайдер",
|
"model.tooltip.provider": "Провайдер",
|
||||||
"model.tooltip.reasoning": "Рассуждение",
|
"model.tooltip.reasoning": "Рассуждение",
|
||||||
"model.tooltip.reasoning.allowed": "Поддерживает рассуждения",
|
"model.tooltip.reasoning.allowed": "Разрешает рассуждение",
|
||||||
"model.tooltip.reasoning.none": "Без рассуждений",
|
"model.tooltip.reasoning.none": "Без рассуждения",
|
||||||
"model.tooltip.context": "Лимит контекста {{limit}}",
|
"model.tooltip.context": "Лимит контекста {{limit}}",
|
||||||
|
|
||||||
"common.search.placeholder": "Поиск",
|
"common.search.placeholder": "Поиск",
|
||||||
@@ -339,7 +231,7 @@ export const dict = {
|
|||||||
"common.clear": "Очистить",
|
"common.clear": "Очистить",
|
||||||
"common.connect": "Подключить",
|
"common.connect": "Подключить",
|
||||||
"common.disconnect": "Отключить",
|
"common.disconnect": "Отключить",
|
||||||
"common.continue": "Продолжить",
|
"common.continue": "Отправить",
|
||||||
"common.submit": "Отправить",
|
"common.submit": "Отправить",
|
||||||
"common.save": "Сохранить",
|
"common.save": "Сохранить",
|
||||||
"common.saving": "Сохранение...",
|
"common.saving": "Сохранение...",
|
||||||
@@ -349,8 +241,8 @@ export const dict = {
|
|||||||
"prompt.placeholder.shell": "Введите команду оболочки... {{example}}",
|
"prompt.placeholder.shell": "Введите команду оболочки... {{example}}",
|
||||||
"prompt.placeholder.normal": 'Спросите что угодно... "{{example}}"',
|
"prompt.placeholder.normal": 'Спросите что угодно... "{{example}}"',
|
||||||
"prompt.placeholder.simple": "Спросите что угодно...",
|
"prompt.placeholder.simple": "Спросите что угодно...",
|
||||||
"prompt.placeholder.summarizeComments": "Обобщить комментарии…",
|
"prompt.placeholder.summarizeComments": "Суммировать комментарии…",
|
||||||
"prompt.placeholder.summarizeComment": "Обобщить комментарий…",
|
"prompt.placeholder.summarizeComment": "Суммировать комментарий…",
|
||||||
"prompt.mode.shell": "Оболочка",
|
"prompt.mode.shell": "Оболочка",
|
||||||
"prompt.mode.normal": "Промпт",
|
"prompt.mode.normal": "Промпт",
|
||||||
"prompt.mode.shell.exit": "esc для выхода",
|
"prompt.mode.shell.exit": "esc для выхода",
|
||||||
@@ -360,33 +252,33 @@ export const dict = {
|
|||||||
"prompt.example.1": "Исправить TODO в коде",
|
"prompt.example.1": "Исправить TODO в коде",
|
||||||
"prompt.example.2": "Какой технологический стек этого проекта?",
|
"prompt.example.2": "Какой технологический стек этого проекта?",
|
||||||
"prompt.example.3": "Исправить сломанные тесты",
|
"prompt.example.3": "Исправить сломанные тесты",
|
||||||
"prompt.example.4": "Объясни, как работает аутентификация",
|
"prompt.example.4": "Объясни как работает аутентификация",
|
||||||
"prompt.example.5": "Найти и исправить уязвимости безопасности",
|
"prompt.example.5": "Найти и исправить уязвимости безопасности",
|
||||||
"prompt.example.6": "Добавить модульные тесты для службы пользователей",
|
"prompt.example.6": "Добавить юнит-тесты для сервиса пользователя",
|
||||||
"prompt.example.7": "Рефакторить эту функцию для лучшей читаемости",
|
"prompt.example.7": "Рефакторить эту функцию для лучшей читаемости",
|
||||||
"prompt.example.8": "Что означает эта ошибка?",
|
"prompt.example.8": "Что означает эта ошибка?",
|
||||||
"prompt.example.9": "Помоги мне отладить эту проблему",
|
"prompt.example.9": "Помоги мне отладить эту проблему",
|
||||||
"prompt.example.10": "Сгенерировать документацию API",
|
"prompt.example.10": "Сгенерировать документацию API",
|
||||||
"prompt.example.11": "Оптимизировать запросы к базе данных",
|
"prompt.example.11": "Оптимизировать запросы к базе данных",
|
||||||
"prompt.example.12": "Добавить проверку входных данных",
|
"prompt.example.12": "Добавить валидацию ввода",
|
||||||
"prompt.example.13": "Создать новый компонент для...",
|
"prompt.example.13": "Создать новый компонент для...",
|
||||||
"prompt.example.14": "Как развернуть этот проект?",
|
"prompt.example.14": "Как развернуть этот проект?",
|
||||||
"prompt.example.15": "Проверь, соответствует ли мой код рекомендациям",
|
"prompt.example.15": "Проверь мой код на лучшие практики",
|
||||||
"prompt.example.16": "Добавить обработку ошибок в эту функцию",
|
"prompt.example.16": "Добавить обработку ошибок в эту функцию",
|
||||||
"prompt.example.17": "Объясни это регулярное выражение",
|
"prompt.example.17": "Объясни этот паттерн regex",
|
||||||
"prompt.example.18": "Преобразовать это в TypeScript",
|
"prompt.example.18": "Конвертировать это в TypeScript",
|
||||||
"prompt.example.19": "Добавить логирование по всему проекту",
|
"prompt.example.19": "Добавить логирование по всему проекту",
|
||||||
"prompt.example.20": "Какие зависимости устарели?",
|
"prompt.example.20": "Какие зависимости устарели?",
|
||||||
"prompt.example.21": "Помоги написать скрипт миграции",
|
"prompt.example.21": "Помоги написать скрипт миграции",
|
||||||
"prompt.example.22": "Реализовать кеширование для этой конечной точки",
|
"prompt.example.22": "Реализовать кэширование для этой конечной точки",
|
||||||
"prompt.example.23": "Добавить пагинацию в этот список",
|
"prompt.example.23": "Добавить пагинацию в этот список",
|
||||||
"prompt.example.24": "Создать CLI-команду для...",
|
"prompt.example.24": "Создать CLI команду для...",
|
||||||
"prompt.example.25": "Как здесь работают переменные окружения?",
|
"prompt.example.25": "Как работают переменные окружения здесь?",
|
||||||
|
|
||||||
"prompt.popover.emptyResults": "Нет совпадений",
|
"prompt.popover.emptyResults": "Нет совпадений",
|
||||||
"prompt.popover.emptyCommands": "Нет совпадающих команд",
|
"prompt.popover.emptyCommands": "Нет совпадающих команд",
|
||||||
"prompt.dropzone.label": "Перетащите сюда изображения, PDF или текстовые файлы",
|
"prompt.dropzone.label": "Перетащите сюда изображения, PDF или текстовые файлы",
|
||||||
"prompt.dropzone.file.label": "Отпустите, чтобы упомянуть файл через @",
|
"prompt.dropzone.file.label": "Отпустите для @упоминания файла",
|
||||||
"prompt.slash.badge.custom": "своё",
|
"prompt.slash.badge.custom": "своё",
|
||||||
"prompt.slash.badge.skill": "навык",
|
"prompt.slash.badge.skill": "навык",
|
||||||
"prompt.slash.badge.mcp": "mcp",
|
"prompt.slash.badge.mcp": "mcp",
|
||||||
@@ -440,7 +332,7 @@ export const dict = {
|
|||||||
"dialog.directory.readError": "Не удалось прочитать эту папку",
|
"dialog.directory.readError": "Не удалось прочитать эту папку",
|
||||||
|
|
||||||
"dialog.server.title": "Серверы",
|
"dialog.server.title": "Серверы",
|
||||||
"dialog.server.description": "Выберите сервер OpenCode, к которому подключается приложение.",
|
"dialog.server.description": "Переключите сервер OpenCode к которому подключается приложение.",
|
||||||
"dialog.server.search.placeholder": "Поиск серверов",
|
"dialog.server.search.placeholder": "Поиск серверов",
|
||||||
"dialog.server.empty": "Серверов пока нет",
|
"dialog.server.empty": "Серверов пока нет",
|
||||||
"dialog.server.add.title": "Добавить сервер",
|
"dialog.server.add.title": "Добавить сервер",
|
||||||
@@ -464,7 +356,7 @@ export const dict = {
|
|||||||
|
|
||||||
"dialog.server.menu.edit": "Редактировать",
|
"dialog.server.menu.edit": "Редактировать",
|
||||||
"dialog.server.menu.default": "Сделать по умолчанию",
|
"dialog.server.menu.default": "Сделать по умолчанию",
|
||||||
"dialog.server.menu.defaultRemove": "Отменить выбор по умолчанию",
|
"dialog.server.menu.defaultRemove": "Удалить по умолчанию",
|
||||||
"dialog.server.menu.delete": "Удалить",
|
"dialog.server.menu.delete": "Удалить",
|
||||||
"dialog.server.current": "Текущий сервер",
|
"dialog.server.current": "Текущий сервер",
|
||||||
"dialog.server.status.default": "По умолч.",
|
"dialog.server.status.default": "По умолч.",
|
||||||
@@ -513,7 +405,7 @@ export const dict = {
|
|||||||
"wsl.onboarding.needAnotherDistroHint": "Установите дистрибутив Linux из каталога WSL",
|
"wsl.onboarding.needAnotherDistroHint": "Установите дистрибутив Linux из каталога WSL",
|
||||||
"wsl.onboarding.wslNotInstalled.title": "WSL не установлена",
|
"wsl.onboarding.wslNotInstalled.title": "WSL не установлена",
|
||||||
"wsl.onboarding.wslNotInstalled.description":
|
"wsl.onboarding.wslNotInstalled.description":
|
||||||
"Для добавления сервера WSL в OpenCode требуется WSL (Подсистема Windows для Linux)",
|
"Для добавления сервера WSL в OpenCode требуется WSL (Windows Subsystem for Linux)",
|
||||||
"wsl.onboarding.wslUnavailable.title": "WSL недоступна",
|
"wsl.onboarding.wslUnavailable.title": "WSL недоступна",
|
||||||
"wsl.onboarding.wslUnavailable.description": "OpenCode не смог проверить WSL на этом компьютере.",
|
"wsl.onboarding.wslUnavailable.description": "OpenCode не смог проверить WSL на этом компьютере.",
|
||||||
"wsl.onboarding.installWsl": "Установить WSL",
|
"wsl.onboarding.installWsl": "Установить WSL",
|
||||||
@@ -538,28 +430,12 @@ export const dict = {
|
|||||||
"wsl.onboarding.versionMismatch": "Установленная версия не соответствует версии приложения.",
|
"wsl.onboarding.versionMismatch": "Установленная версия не соответствует версии приложения.",
|
||||||
"wsl.onboarding.adding": "Добавление...",
|
"wsl.onboarding.adding": "Добавление...",
|
||||||
|
|
||||||
"help.tabs.toast.ariaLabel": "Представляем вкладки. Организуйте работу и активные сессии с помощью вкладок",
|
|
||||||
"help.tabs.toast.dismiss": "Закрыть сведения о вкладках",
|
|
||||||
"help.tabs.title": "Представляем вкладки",
|
|
||||||
"help.tabs.description": "Организуйте работу и активные сессии с помощью вкладок",
|
|
||||||
"help.tabs.date": "14 июля",
|
|
||||||
"help.tabs.introduction": "Теперь работа в OpenCode Desktop организована с помощью вкладок.",
|
|
||||||
"help.tabs.sessions":
|
|
||||||
"Начните новую сессию во вкладке или откройте существующую сессию из любого проекта. Открывайте новую вкладку, когда начинаете новую задачу, и закрывайте её по завершении.",
|
|
||||||
"help.tabs.organize":
|
|
||||||
"Несколько открытых вкладок упрощают организацию активных сессий. Если вы планируете оставить вкладки открытыми, присвойте им запоминающиеся названия.",
|
|
||||||
"help.tabs.home":
|
|
||||||
"Все сессии и проекты находятся на новом экране «Главная». При выборе сессии она открывается во вкладке.",
|
|
||||||
"help.tabs.persistence": "После повторного открытия приложения вкладки останутся открытыми.",
|
|
||||||
"help.tabs.worktrees":
|
|
||||||
"Новый дизайн пока не поддерживает Git Worktrees, но эта возможность скоро появится. Если вы предпочитаете прежний макет, переключиться между макетами можно в разделе «Настройки». Учтите, что через несколько недель новый макет станет постоянным.",
|
|
||||||
|
|
||||||
"dialog.project.edit.title": "Редактировать проект",
|
"dialog.project.edit.title": "Редактировать проект",
|
||||||
"dialog.project.edit.name": "Название",
|
"dialog.project.edit.name": "Название",
|
||||||
"dialog.project.edit.icon": "Значок",
|
"dialog.project.edit.icon": "Иконка",
|
||||||
"dialog.project.edit.icon.alt": "Значок проекта",
|
"dialog.project.edit.icon.alt": "Иконка проекта",
|
||||||
"dialog.project.edit.icon.hint": "Нажмите или перетащите изображение",
|
"dialog.project.edit.icon.hint": "Нажмите или перетащите изображение",
|
||||||
"dialog.project.edit.icon.recommended": "Рекомендуется: 128 x 128 пикселей",
|
"dialog.project.edit.icon.recommended": "Рекомендуется: 128x128px",
|
||||||
"dialog.project.edit.color": "Цвет",
|
"dialog.project.edit.color": "Цвет",
|
||||||
"dialog.project.edit.color.select": "Выбрать цвет {{color}}",
|
"dialog.project.edit.color.select": "Выбрать цвет {{color}}",
|
||||||
|
|
||||||
@@ -567,8 +443,6 @@ export const dict = {
|
|||||||
"dialog.project.edit.worktree.startup.description":
|
"dialog.project.edit.worktree.startup.description":
|
||||||
"Запускается после создания нового рабочего пространства (worktree).",
|
"Запускается после создания нового рабочего пространства (worktree).",
|
||||||
"dialog.project.edit.worktree.startup.placeholder": "например, bun install",
|
"dialog.project.edit.worktree.startup.placeholder": "например, bun install",
|
||||||
"dialog.usageExceeded.dontShowAgain": "Больше не показывать",
|
|
||||||
|
|
||||||
"context.breakdown.title": "Разбивка контекста",
|
"context.breakdown.title": "Разбивка контекста",
|
||||||
"context.breakdown.note":
|
"context.breakdown.note":
|
||||||
'Приблизительная разбивка входных токенов. "Другое" включает определения инструментов и накладные расходы.',
|
'Приблизительная разбивка входных токенов. "Другое" включает определения инструментов и накладные расходы.',
|
||||||
@@ -581,8 +455,6 @@ export const dict = {
|
|||||||
"context.systemPrompt.title": "Системный промпт",
|
"context.systemPrompt.title": "Системный промпт",
|
||||||
"context.rawMessages.title": "Исходные сообщения",
|
"context.rawMessages.title": "Исходные сообщения",
|
||||||
|
|
||||||
"context.export.session": "Экспортировать сессию",
|
|
||||||
|
|
||||||
"context.stats.session": "Сессия",
|
"context.stats.session": "Сессия",
|
||||||
"context.stats.messages": "Сообщения",
|
"context.stats.messages": "Сообщения",
|
||||||
"context.stats.provider": "Провайдер",
|
"context.stats.provider": "Провайдер",
|
||||||
@@ -593,7 +465,7 @@ export const dict = {
|
|||||||
"context.stats.inputTokens": "Входные токены",
|
"context.stats.inputTokens": "Входные токены",
|
||||||
"context.stats.outputTokens": "Выходные токены",
|
"context.stats.outputTokens": "Выходные токены",
|
||||||
"context.stats.reasoningTokens": "Токены рассуждения",
|
"context.stats.reasoningTokens": "Токены рассуждения",
|
||||||
"context.stats.cacheTokens": "Токены кеша (чтение/запись)",
|
"context.stats.cacheTokens": "Токены кэша (чтение/запись)",
|
||||||
"context.stats.userMessages": "Сообщения пользователя",
|
"context.stats.userMessages": "Сообщения пользователя",
|
||||||
"context.stats.assistantMessages": "Сообщения ассистента",
|
"context.stats.assistantMessages": "Сообщения ассистента",
|
||||||
"context.stats.totalCost": "Общая стоимость",
|
"context.stats.totalCost": "Общая стоимость",
|
||||||
@@ -660,11 +532,6 @@ export const dict = {
|
|||||||
"toast.session.unshare.failed.title": "Не удалось отменить публикацию",
|
"toast.session.unshare.failed.title": "Не удалось отменить публикацию",
|
||||||
"toast.session.unshare.failed.description": "Произошла ошибка при отмене публикации",
|
"toast.session.unshare.failed.description": "Произошла ошибка при отмене публикации",
|
||||||
|
|
||||||
"toast.session.export.success.title": "Сессия экспортирована",
|
|
||||||
"toast.session.export.success.description": "Сессия сохранена в файл {{filename}}",
|
|
||||||
"toast.session.export.failed.title": "Не удалось экспортировать сессию",
|
|
||||||
"toast.session.export.failed.description": "Произошла ошибка при экспорте сессии",
|
|
||||||
|
|
||||||
"toast.session.listFailed.title": "Не удалось загрузить сессии для {{project}}",
|
"toast.session.listFailed.title": "Не удалось загрузить сессии для {{project}}",
|
||||||
|
|
||||||
"toast.update.title": "Доступно обновление",
|
"toast.update.title": "Доступно обновление",
|
||||||
@@ -697,27 +564,27 @@ export const dict = {
|
|||||||
"error.chain.causedBy": "Причина:",
|
"error.chain.causedBy": "Причина:",
|
||||||
"error.chain.apiError": "Ошибка API",
|
"error.chain.apiError": "Ошибка API",
|
||||||
"error.chain.status": "Статус: {{status}}",
|
"error.chain.status": "Статус: {{status}}",
|
||||||
"error.chain.retryable": "Можно повторить: {{retryable}}",
|
"error.chain.retryable": "Повторная попытка: {{retryable}}",
|
||||||
"error.chain.responseBody": "Тело ответа:\n{{body}}",
|
"error.chain.responseBody": "Тело ответа:\n{{body}}",
|
||||||
"error.chain.didYouMean": "Возможно, вы имели в виду: {{suggestions}}",
|
"error.chain.didYouMean": "Возможно, вы имели в виду: {{suggestions}}",
|
||||||
"error.chain.modelNotFound": "Модель не найдена: {{provider}}/{{model}}",
|
"error.chain.modelNotFound": "Модель не найдена: {{provider}}/{{model}}",
|
||||||
"error.chain.checkConfig": "Проверьте названия провайдера и модели в конфигурации (opencode.json)",
|
"error.chain.checkConfig": "Проверьте названия провайдера/модели в конфиге (opencode.json)",
|
||||||
"error.chain.mcpFailed":
|
"error.chain.mcpFailed":
|
||||||
'MCP-сервер "{{name}}" завершился с ошибкой. Обратите внимание: OpenCode пока не поддерживает MCP-авторизацию.',
|
'MCP сервер "{{name}}" завершился с ошибкой. Обратите внимание, что OpenCode пока не поддерживает MCP авторизацию.',
|
||||||
"error.chain.providerAuthFailed": "Ошибка аутентификации провайдера ({{provider}}): {{message}}",
|
"error.chain.providerAuthFailed": "Ошибка аутентификации провайдера ({{provider}}): {{message}}",
|
||||||
"error.chain.providerInitFailed":
|
"error.chain.providerInitFailed":
|
||||||
'Не удалось инициализировать провайдера "{{provider}}". Проверьте учётные данные и конфигурацию.',
|
'Не удалось инициализировать провайдера "{{provider}}". Проверьте учётные данные и конфигурацию.',
|
||||||
"error.chain.configJsonInvalid": "Конфигурационный файл по адресу {{path}} содержит некорректный JSON(C)",
|
"error.chain.configJsonInvalid": "Конфигурационный файл по адресу {{path}} не является валидным JSON(C)",
|
||||||
"error.chain.configJsonInvalidWithMessage":
|
"error.chain.configJsonInvalidWithMessage":
|
||||||
"Конфигурационный файл по адресу {{path}} содержит некорректный JSON(C): {{message}}",
|
"Конфигурационный файл по адресу {{path}} не является валидным JSON(C): {{message}}",
|
||||||
"error.chain.configDirectoryTypo":
|
"error.chain.configDirectoryTypo":
|
||||||
'Папка "{{dir}}" в {{path}} недопустима. Переименуйте папку в "{{suggestion}}" или удалите её. Это распространённая опечатка.',
|
'Папка "{{dir}}" в {{path}} невалидна. Переименуйте папку в "{{suggestion}}" или удалите её. Это распространённая опечатка.',
|
||||||
"error.chain.configFrontmatterError": "Не удалось разобрать frontmatter в {{path}}:\n{{message}}",
|
"error.chain.configFrontmatterError": "Не удалось разобрать frontmatter в {{path}}:\n{{message}}",
|
||||||
"error.chain.configInvalid": "Недопустимый конфигурационный файл по адресу {{path}}",
|
"error.chain.configInvalid": "Конфигурационный файл по адресу {{path}} невалиден",
|
||||||
"error.chain.configInvalidWithMessage": "Недопустимый конфигурационный файл по адресу {{path}}: {{message}}",
|
"error.chain.configInvalidWithMessage": "Конфигурационный файл по адресу {{path}} невалиден: {{message}}",
|
||||||
|
|
||||||
"notification.permission.title": "Требуется разрешение",
|
"notification.permission.title": "Требуется разрешение",
|
||||||
"notification.permission.description": "Для {{sessionTitle}} в {{projectName}} требуется разрешение",
|
"notification.permission.description": "{{sessionTitle}} в {{projectName}} требуется разрешение",
|
||||||
"notification.question.title": "Вопрос",
|
"notification.question.title": "Вопрос",
|
||||||
"notification.question.description": "У {{sessionTitle}} в {{projectName}} есть вопрос",
|
"notification.question.description": "У {{sessionTitle}} в {{projectName}} есть вопрос",
|
||||||
"notification.action.goToSession": "Перейти к сессии",
|
"notification.action.goToSession": "Перейти к сессии",
|
||||||
@@ -756,7 +623,7 @@ export const dict = {
|
|||||||
"session.error.notFound.description": "Эта вкладка указывает на сессию, которой больше нет на этом сервере.",
|
"session.error.notFound.description": "Эта вкладка указывает на сессию, которой больше нет на этом сервере.",
|
||||||
"session.error.notFound.closeTab": "Закрыть вкладку",
|
"session.error.notFound.closeTab": "Закрыть вкладку",
|
||||||
"session.error.serverConnection": "Не удаётся подключиться к этому серверу",
|
"session.error.serverConnection": "Не удаётся подключиться к этому серверу",
|
||||||
"session.review.filesChanged": "Изменено файлов: {{count}}",
|
"session.review.filesChanged": "{{count}} файлов изменено",
|
||||||
"session.review.change.one": "Изменение",
|
"session.review.change.one": "Изменение",
|
||||||
"session.review.change.other": "Изменения",
|
"session.review.change.other": "Изменения",
|
||||||
"session.review.loadingChanges": "Загрузка изменений...",
|
"session.review.loadingChanges": "Загрузка изменений...",
|
||||||
@@ -783,21 +650,15 @@ export const dict = {
|
|||||||
"session.question.minimize": "Свернуть вопрос",
|
"session.question.minimize": "Свернуть вопрос",
|
||||||
"session.question.restore": "Восстановить вопрос",
|
"session.question.restore": "Восстановить вопрос",
|
||||||
"session.question.pending.one": "{{count}} вопрос без ответа",
|
"session.question.pending.one": "{{count}} вопрос без ответа",
|
||||||
"session.question.pending.few": "{{count}} вопроса без ответа",
|
|
||||||
"session.question.pending.many": "{{count}} вопросов без ответа",
|
|
||||||
"session.question.pending.other": "Вопросы без ответа: {{count}}",
|
"session.question.pending.other": "Вопросы без ответа: {{count}}",
|
||||||
"session.followupDock.summary.one": "{{count}} сообщение в очереди",
|
"session.followupDock.summary.one": "{{count}} сообщение в очереди",
|
||||||
"session.followupDock.summary.few": "{{count}} сообщения в очереди",
|
"session.followupDock.summary.other": "{{count}} сообщений в очереди",
|
||||||
"session.followupDock.summary.many": "{{count}} сообщений в очереди",
|
|
||||||
"session.followupDock.summary.other": "Сообщений в очереди: {{count}}",
|
|
||||||
"session.followupDock.sendNow": "Отправить сейчас",
|
"session.followupDock.sendNow": "Отправить сейчас",
|
||||||
"session.followupDock.edit": "Редактировать",
|
"session.followupDock.edit": "Редактировать",
|
||||||
"session.followupDock.collapse": "Свернуть сообщения в очереди",
|
"session.followupDock.collapse": "Свернуть сообщения в очереди",
|
||||||
"session.followupDock.expand": "Развернуть сообщения в очереди",
|
"session.followupDock.expand": "Развернуть сообщения в очереди",
|
||||||
"session.revertDock.summary.one": "{{count}} сообщение возвращено",
|
"session.revertDock.summary.one": "{{count}} сообщение возвращено",
|
||||||
"session.revertDock.summary.few": "{{count}} сообщения возвращены",
|
"session.revertDock.summary.other": "{{count}} сообщений возвращено",
|
||||||
"session.revertDock.summary.many": "{{count}} сообщений возвращено",
|
|
||||||
"session.revertDock.summary.other": "Возвращено сообщений: {{count}}",
|
|
||||||
"session.revertDock.collapse": "Свернуть возвращённые сообщения",
|
"session.revertDock.collapse": "Свернуть возвращённые сообщения",
|
||||||
"session.revertDock.expand": "Развернуть возвращённые сообщения",
|
"session.revertDock.expand": "Развернуть возвращённые сообщения",
|
||||||
"session.revertDock.restore": "Восстановить сообщение",
|
"session.revertDock.restore": "Восстановить сообщение",
|
||||||
@@ -846,7 +707,7 @@ export const dict = {
|
|||||||
"session.share.copy.copied": "Скопировано",
|
"session.share.copy.copied": "Скопировано",
|
||||||
"session.share.copy.copyLink": "Копировать ссылку",
|
"session.share.copy.copyLink": "Копировать ссылку",
|
||||||
|
|
||||||
"lsp.tooltip.none": "Нет LSP-серверов",
|
"lsp.tooltip.none": "Нет LSP серверов",
|
||||||
"lsp.label.connected": "{{count}} LSP",
|
"lsp.label.connected": "{{count}} LSP",
|
||||||
|
|
||||||
"prompt.loading": "Загрузка запроса...",
|
"prompt.loading": "Загрузка запроса...",
|
||||||
@@ -857,12 +718,6 @@ export const dict = {
|
|||||||
"terminal.connectionLost.title": "Соединение потеряно",
|
"terminal.connectionLost.title": "Соединение потеряно",
|
||||||
"terminal.connectionLost.description":
|
"terminal.connectionLost.description":
|
||||||
"Соединение с терминалом прервано. Это может произойти при перезапуске сервера.",
|
"Соединение с терминалом прервано. Это может произойти при перезапуске сервера.",
|
||||||
"terminal.connectTicket.csrfError":
|
|
||||||
"Билет подключения PTY отклонён при проверке источника или CSRF. Проверьте конфигурацию CORS сервера.",
|
|
||||||
"terminal.connectTicket.statusError": "Не удалось получить билет подключения PTY, статус: {{status}}",
|
|
||||||
|
|
||||||
"titlebar.update": "Обновить",
|
|
||||||
"titlebar.updateVersion": "Обновить {{version}}",
|
|
||||||
|
|
||||||
"common.closeTab": "Закрыть вкладку",
|
"common.closeTab": "Закрыть вкладку",
|
||||||
"common.dismiss": "Закрыть",
|
"common.dismiss": "Закрыть",
|
||||||
@@ -870,7 +725,6 @@ export const dict = {
|
|||||||
"common.moreOptions": "Дополнительные опции",
|
"common.moreOptions": "Дополнительные опции",
|
||||||
"common.learnMore": "Подробнее",
|
"common.learnMore": "Подробнее",
|
||||||
"common.rename": "Переименовать",
|
"common.rename": "Переименовать",
|
||||||
"common.export": "Экспортировать",
|
|
||||||
"common.reset": "Сбросить",
|
"common.reset": "Сбросить",
|
||||||
"common.archive": "Архивировать",
|
"common.archive": "Архивировать",
|
||||||
"common.delete": "Удалить",
|
"common.delete": "Удалить",
|
||||||
@@ -910,7 +764,7 @@ export const dict = {
|
|||||||
"settings.general.section.updates": "Обновления",
|
"settings.general.section.updates": "Обновления",
|
||||||
"settings.general.section.sounds": "Звуковые эффекты",
|
"settings.general.section.sounds": "Звуковые эффекты",
|
||||||
"settings.general.section.feed": "Лента",
|
"settings.general.section.feed": "Лента",
|
||||||
"settings.general.section.display": "Экран",
|
"settings.general.section.display": "Дисплей",
|
||||||
|
|
||||||
"settings.general.row.language.title": "Язык",
|
"settings.general.row.language.title": "Язык",
|
||||||
"settings.general.row.language.description": "Изменить язык отображения OpenCode",
|
"settings.general.row.language.description": "Изменить язык отображения OpenCode",
|
||||||
@@ -920,7 +774,7 @@ export const dict = {
|
|||||||
"settings.general.row.shell.autoDefault": "Авто (по умолчанию)",
|
"settings.general.row.shell.autoDefault": "Авто (по умолчанию)",
|
||||||
"settings.general.row.shell.terminalOnly": "только терминал",
|
"settings.general.row.shell.terminalOnly": "только терминал",
|
||||||
"settings.general.row.appearance.title": "Внешний вид",
|
"settings.general.row.appearance.title": "Внешний вид",
|
||||||
"settings.general.row.appearance.description": "Настройте внешний вид OpenCode на вашем устройстве",
|
"settings.general.row.appearance.description": "Настройте как OpenCode выглядит на вашем устройстве",
|
||||||
"settings.general.row.colorScheme.title": "Цветовая схема",
|
"settings.general.row.colorScheme.title": "Цветовая схема",
|
||||||
"settings.general.row.colorScheme.description": "Выберите, следует ли OpenCode системной, светлой или тёмной теме",
|
"settings.general.row.colorScheme.description": "Выберите, следует ли OpenCode системной, светлой или тёмной теме",
|
||||||
"settings.general.row.theme.title": "Тема",
|
"settings.general.row.theme.title": "Тема",
|
||||||
@@ -930,7 +784,7 @@ export const dict = {
|
|||||||
"settings.general.row.terminalFont.title": "Шрифт терминала",
|
"settings.general.row.terminalFont.title": "Шрифт терминала",
|
||||||
"settings.general.row.terminalFont.description": "Настройте шрифт, используемый в терминале",
|
"settings.general.row.terminalFont.description": "Настройте шрифт, используемый в терминале",
|
||||||
"settings.general.row.uiFont.title": "Шрифт интерфейса",
|
"settings.general.row.uiFont.title": "Шрифт интерфейса",
|
||||||
"settings.general.row.uiFont.description": "Настройте шрифт, используемый во всём интерфейсе",
|
"settings.general.row.uiFont.description": "Настройте шрифт, используемый во всем интерфейсе",
|
||||||
"settings.general.row.followup.title": "Поведение уточняющих вопросов",
|
"settings.general.row.followup.title": "Поведение уточняющих вопросов",
|
||||||
"settings.general.row.followup.description":
|
"settings.general.row.followup.description":
|
||||||
"Выберите, отправлять ли уточняющие вопросы сразу или помещать их в очередь",
|
"Выберите, отправлять ли уточняющие вопросы сразу или помещать их в очередь",
|
||||||
@@ -950,9 +804,8 @@ export const dict = {
|
|||||||
"settings.general.row.mobileTitlebarBottom.title": "Нижняя навигация",
|
"settings.general.row.mobileTitlebarBottom.title": "Нижняя навигация",
|
||||||
"settings.general.row.mobileTitlebarBottom.description":
|
"settings.general.row.mobileTitlebarBottom.description":
|
||||||
"На мобильных устройствах размещать строку заголовка и вкладки сессии внизу экрана",
|
"На мобильных устройствах размещать строку заголовка и вкладки сессии внизу экрана",
|
||||||
"settings.general.row.showCustomAgents.title": "Выбор агента",
|
"settings.general.row.showCustomAgents.title": "Пользовательские агенты",
|
||||||
"settings.general.row.showCustomAgents.description":
|
"settings.general.row.showCustomAgents.description": "Показывать выбор агента в редакторе запросов",
|
||||||
"Показывать переключатель агентов в редакторе запросов. Если он скрыт, по умолчанию используется агент Build.",
|
|
||||||
"settings.general.row.reasoningSummaries.title": "Показывать сводки рассуждений",
|
"settings.general.row.reasoningSummaries.title": "Показывать сводки рассуждений",
|
||||||
"settings.general.row.reasoningSummaries.description": "Отображать сводки рассуждений модели в ленте",
|
"settings.general.row.reasoningSummaries.description": "Отображать сводки рассуждений модели в ленте",
|
||||||
|
|
||||||
@@ -969,11 +822,11 @@ export const dict = {
|
|||||||
"settings.general.row.newInterfaceNotice.title": "Теперь вы используете новую компоновку",
|
"settings.general.row.newInterfaceNotice.title": "Теперь вы используете новую компоновку",
|
||||||
"settings.general.row.newInterfaceNotice.description": "Прежняя компоновка больше недоступна",
|
"settings.general.row.newInterfaceNotice.description": "Прежняя компоновка больше недоступна",
|
||||||
"settings.general.row.newInterfaceNotice.dismiss": "Закрыть",
|
"settings.general.row.newInterfaceNotice.dismiss": "Закрыть",
|
||||||
"settings.general.row.pinchZoom.title": "Масштабирование сведением пальцев",
|
"settings.general.row.pinchZoom.title": "Масштабирование щипком",
|
||||||
"settings.general.row.pinchZoom.description":
|
"settings.general.row.pinchZoom.description":
|
||||||
"Разрешить масштабирование сведением пальцев на трекпаде и прокруткой с нажатой клавишей Ctrl",
|
"Разрешить масштабирование жестом щипка на трекпаде и прокруткой с Ctrl",
|
||||||
"settings.general.row.wayland.title": "Использовать нативный Wayland",
|
"settings.general.row.wayland.title": "Использовать нативный Wayland",
|
||||||
"settings.general.row.wayland.description": "Отключить резервный режим X11 в Wayland. Требуется перезапуск.",
|
"settings.general.row.wayland.description": "Отключить X11 fallback на Wayland. Требуется перезапуск.",
|
||||||
"settings.general.row.wayland.tooltip":
|
"settings.general.row.wayland.tooltip":
|
||||||
"На Linux с мониторами разной частоты обновления нативный Wayland может быть стабильнее.",
|
"На Linux с мониторами разной частоты обновления нативный Wayland может быть стабильнее.",
|
||||||
|
|
||||||
@@ -1039,22 +892,22 @@ export const dict = {
|
|||||||
|
|
||||||
"settings.general.notifications.agent.title": "Агент",
|
"settings.general.notifications.agent.title": "Агент",
|
||||||
"settings.general.notifications.agent.description":
|
"settings.general.notifications.agent.description":
|
||||||
"Показывать системное уведомление, когда агент завершил работу или требует внимания",
|
"Показывать системное уведомление когда агент завершён или требует внимания",
|
||||||
"settings.general.notifications.permissions.title": "Разрешения",
|
"settings.general.notifications.permissions.title": "Разрешения",
|
||||||
"settings.general.notifications.permissions.description":
|
"settings.general.notifications.permissions.description":
|
||||||
"Показывать системное уведомление, когда требуется разрешение",
|
"Показывать системное уведомление когда требуется разрешение",
|
||||||
"settings.general.notifications.errors.title": "Ошибки",
|
"settings.general.notifications.errors.title": "Ошибки",
|
||||||
"settings.general.notifications.errors.description": "Показывать системное уведомление, когда происходит ошибка",
|
"settings.general.notifications.errors.description": "Показывать системное уведомление когда происходит ошибка",
|
||||||
|
|
||||||
"settings.general.sounds.agent.title": "Агент",
|
"settings.general.sounds.agent.title": "Агент",
|
||||||
"settings.general.sounds.agent.description": "Воспроизводить звук, когда агент завершил работу или требует внимания",
|
"settings.general.sounds.agent.description": "Воспроизводить звук когда агент завершён или требует внимания",
|
||||||
"settings.general.sounds.permissions.title": "Разрешения",
|
"settings.general.sounds.permissions.title": "Разрешения",
|
||||||
"settings.general.sounds.permissions.description": "Воспроизводить звук, когда требуется разрешение",
|
"settings.general.sounds.permissions.description": "Воспроизводить звук когда требуется разрешение",
|
||||||
"settings.general.sounds.errors.title": "Ошибки",
|
"settings.general.sounds.errors.title": "Ошибки",
|
||||||
"settings.general.sounds.errors.description": "Воспроизводить звук, когда происходит ошибка",
|
"settings.general.sounds.errors.description": "Воспроизводить звук когда происходит ошибка",
|
||||||
|
|
||||||
"settings.shortcuts.title": "Горячие клавиши",
|
"settings.shortcuts.title": "Горячие клавиши",
|
||||||
"settings.shortcuts.reset.button": "Восстановить настройки по умолчанию",
|
"settings.shortcuts.reset.button": "Сбросить к умолчаниям",
|
||||||
"settings.shortcuts.reset.toast.title": "Горячие клавиши сброшены",
|
"settings.shortcuts.reset.toast.title": "Горячие клавиши сброшены",
|
||||||
"settings.shortcuts.reset.toast.description": "Горячие клавиши были сброшены к значениям по умолчанию.",
|
"settings.shortcuts.reset.toast.description": "Горячие клавиши были сброшены к значениям по умолчанию.",
|
||||||
"settings.shortcuts.conflict.title": "Сочетание уже используется",
|
"settings.shortcuts.conflict.title": "Сочетание уже используется",
|
||||||
@@ -1090,7 +943,7 @@ export const dict = {
|
|||||||
"settings.mcp.description": "Настройки MCP будут доступны здесь.",
|
"settings.mcp.description": "Настройки MCP будут доступны здесь.",
|
||||||
|
|
||||||
"settings.permissions.title": "Разрешения",
|
"settings.permissions.title": "Разрешения",
|
||||||
"settings.permissions.description": "Укажите, какие инструменты сервер может использовать по умолчанию.",
|
"settings.permissions.description": "Контролируйте какие инструменты сервер может использовать по умолчанию.",
|
||||||
"settings.permissions.section.tools": "Инструменты",
|
"settings.permissions.section.tools": "Инструменты",
|
||||||
"settings.permissions.toast.updateFailed.title": "Не удалось обновить разрешения",
|
"settings.permissions.toast.updateFailed.title": "Не удалось обновить разрешения",
|
||||||
|
|
||||||
@@ -1102,7 +955,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.read.description": "Чтение файла (по совпадению пути)",
|
"settings.permissions.tool.read.description": "Чтение файла (по совпадению пути)",
|
||||||
"settings.permissions.tool.edit.title": "Редактирование",
|
"settings.permissions.tool.edit.title": "Редактирование",
|
||||||
"settings.permissions.tool.edit.description":
|
"settings.permissions.tool.edit.description":
|
||||||
"Изменение файлов, включая редактирование, запись, патчи и множественное редактирование",
|
"Изменение файлов, включая редактирование, запись, патчи и мульти-редактирование",
|
||||||
"settings.permissions.tool.glob.title": "Glob",
|
"settings.permissions.tool.glob.title": "Glob",
|
||||||
"settings.permissions.tool.glob.description": "Сопоставление файлов по паттернам glob",
|
"settings.permissions.tool.glob.description": "Сопоставление файлов по паттернам glob",
|
||||||
"settings.permissions.tool.grep.title": "Grep",
|
"settings.permissions.tool.grep.title": "Grep",
|
||||||
@@ -1112,7 +965,7 @@ export const dict = {
|
|||||||
"settings.permissions.tool.bash.title": "Bash",
|
"settings.permissions.tool.bash.title": "Bash",
|
||||||
"settings.permissions.tool.bash.description": "Запуск команд оболочки",
|
"settings.permissions.tool.bash.description": "Запуск команд оболочки",
|
||||||
"settings.permissions.tool.task.title": "Task",
|
"settings.permissions.tool.task.title": "Task",
|
||||||
"settings.permissions.tool.task.description": "Запуск субагентов",
|
"settings.permissions.tool.task.description": "Запуск подагентов",
|
||||||
"settings.permissions.tool.skill.title": "Skill",
|
"settings.permissions.tool.skill.title": "Skill",
|
||||||
"settings.permissions.tool.skill.description": "Загрузка навыка по имени",
|
"settings.permissions.tool.skill.description": "Загрузка навыка по имени",
|
||||||
"settings.permissions.tool.lsp.title": "LSP",
|
"settings.permissions.tool.lsp.title": "LSP",
|
||||||
@@ -1146,7 +999,7 @@ export const dict = {
|
|||||||
"workspace.reset.success.description": "Рабочее пространство теперь соответствует ветке по умолчанию.",
|
"workspace.reset.success.description": "Рабочее пространство теперь соответствует ветке по умолчанию.",
|
||||||
"workspace.error.stillPreparing": "Рабочее пространство всё ещё подготавливается",
|
"workspace.error.stillPreparing": "Рабочее пространство всё ещё подготавливается",
|
||||||
"workspace.status.checking": "Проверка незафиксированных изменений...",
|
"workspace.status.checking": "Проверка незафиксированных изменений...",
|
||||||
"workspace.status.error": "Не удалось проверить состояние Git.",
|
"workspace.status.error": "Не удалось проверить статус git.",
|
||||||
"workspace.status.clean": "Незафиксированных изменений не обнаружено.",
|
"workspace.status.clean": "Незафиксированных изменений не обнаружено.",
|
||||||
"workspace.status.dirty": "В этом рабочем пространстве обнаружены незафиксированные изменения.",
|
"workspace.status.dirty": "В этом рабочем пространстве обнаружены незафиксированные изменения.",
|
||||||
"workspace.delete.title": "Удалить рабочее пространство",
|
"workspace.delete.title": "Удалить рабочее пространство",
|
||||||
@@ -1157,13 +1010,13 @@ export const dict = {
|
|||||||
"workspace.reset.button": "Сбросить рабочее пространство",
|
"workspace.reset.button": "Сбросить рабочее пространство",
|
||||||
"workspace.reset.archived.none": "Активные сессии не будут архивированы.",
|
"workspace.reset.archived.none": "Активные сессии не будут архивированы.",
|
||||||
"workspace.reset.archived.one": "1 сессия будет архивирована.",
|
"workspace.reset.archived.one": "1 сессия будет архивирована.",
|
||||||
"workspace.reset.archived.many": "Будут архивированы сессии: {{count}}.",
|
"workspace.reset.archived.many": "{{count}} сессий будет архивировано.",
|
||||||
"workspace.reset.note": "Это сбросит рабочее пространство до соответствия ветке по умолчанию.",
|
"workspace.reset.note": "Это сбросит рабочее пространство до соответствия ветке по умолчанию.",
|
||||||
"common.open": "Открыть",
|
"common.open": "Открыть",
|
||||||
"dialog.releaseNotes.action.getStarted": "Начать",
|
"dialog.releaseNotes.action.getStarted": "Начать",
|
||||||
"dialog.releaseNotes.action.next": "Далее",
|
"dialog.releaseNotes.action.next": "Далее",
|
||||||
"dialog.releaseNotes.action.hideFuture": "Больше не показывать",
|
"dialog.releaseNotes.action.hideFuture": "Больше не показывать",
|
||||||
"dialog.releaseNotes.media.alt": "Предварительный просмотр выпуска",
|
"dialog.releaseNotes.media.alt": "Превью релиза",
|
||||||
"toast.project.reloadFailed.title": "Не удалось перезагрузить {{project}}",
|
"toast.project.reloadFailed.title": "Не удалось перезагрузить {{project}}",
|
||||||
"error.server.invalidConfiguration": "Недопустимая конфигурация",
|
"error.server.invalidConfiguration": "Недопустимая конфигурация",
|
||||||
"common.moreCountSuffix": " (ещё {{count}})",
|
"common.moreCountSuffix": " (ещё {{count}})",
|
||||||
@@ -1188,9 +1041,6 @@ export const dict = {
|
|||||||
"session.question.progress": "{{current}} из {{total}} вопросов",
|
"session.question.progress": "{{current}} из {{total}} вопросов",
|
||||||
"session.header.open.finder": "Finder",
|
"session.header.open.finder": "Finder",
|
||||||
"session.header.open.fileExplorer": "Проводник",
|
"session.header.open.fileExplorer": "Проводник",
|
||||||
"session.header.reveal.finder": "Показать в Finder",
|
|
||||||
"session.header.reveal.fileExplorer": "Показать в Проводнике",
|
|
||||||
"session.header.reveal.containingFolder": "Открыть папку расположения",
|
|
||||||
"session.header.open.fileManager": "Файловый менеджер",
|
"session.header.open.fileManager": "Файловый менеджер",
|
||||||
"session.header.open.app.vscode": "VS Code",
|
"session.header.open.app.vscode": "VS Code",
|
||||||
"session.header.open.app.cursor": "Cursor",
|
"session.header.open.app.cursor": "Cursor",
|
||||||
@@ -1209,7 +1059,7 @@ export const dict = {
|
|||||||
"debugBar.na": "н/д",
|
"debugBar.na": "н/д",
|
||||||
"debugBar.nav.label": "NAV",
|
"debugBar.nav.label": "NAV",
|
||||||
"debugBar.nav.tip":
|
"debugBar.nav.tip":
|
||||||
"Последний завершённый переход по маршруту, затрагивающий страницу сессии: от запуска маршрутизатора до первой отрисовки после стабилизации.",
|
"Последний завершенный переход маршрута, затрагивающий страницу сеанса, измеренный от запуска маршрутизатора до первой отрисовки после стабилизации.",
|
||||||
"debugBar.fps.label": "FPS",
|
"debugBar.fps.label": "FPS",
|
||||||
"debugBar.fps.tip": "Скользящая частота кадров в секунду за последние 5 секунд.",
|
"debugBar.fps.tip": "Скользящая частота кадров в секунду за последние 5 секунд.",
|
||||||
"debugBar.frame.label": "FRAME",
|
"debugBar.frame.label": "FRAME",
|
||||||
@@ -1224,18 +1074,10 @@ export const dict = {
|
|||||||
"debugBar.inp.tip":
|
"debugBar.inp.tip":
|
||||||
"Приблизительная продолжительность взаимодействия за последние 5 секунд. Это похоже на INP, а не официальный Web Vitals INP.",
|
"Приблизительная продолжительность взаимодействия за последние 5 секунд. Это похоже на INP, а не официальный Web Vitals INP.",
|
||||||
"debugBar.cls.label": "CLS",
|
"debugBar.cls.label": "CLS",
|
||||||
"debugBar.cls.tip": "Совокупное смещение макета за время работы приложения.",
|
"debugBar.cls.tip": "Кумулятивный сдвиг макета за текущее время жизни приложения.",
|
||||||
"debugBar.mem.label": "MEM",
|
"debugBar.mem.label": "MEM",
|
||||||
"debugBar.mem.tipUnavailable": "Используемая куча JS по сравнению с лимитом кучи. Только Chromium.",
|
"debugBar.mem.tipUnavailable": "Используемая куча JS по сравнению с лимитом кучи. Только Chromium.",
|
||||||
"debugBar.mem.tip": "Используемая куча JS по сравнению с лимитом кучи. {{used}} из {{limit}}.",
|
"debugBar.mem.tip": "Используемая куча JS по сравнению с лимитом кучи. {{used}} из {{limit}}.",
|
||||||
"debugBar.focus.label": "FOCUS",
|
|
||||||
"debugBar.focus.tip": "Принудительно применить стили фокуса ко всем интерактивным элементам",
|
|
||||||
"debugBar.focus.on": "ВКЛ.",
|
|
||||||
"debugBar.focus.off": "ВЫКЛ.",
|
|
||||||
"debugBar.direction.label": "DIR",
|
|
||||||
"debugBar.direction.tip": "Принудительно задать направление макета всего приложения, не меняя выбранный язык",
|
|
||||||
"debugBar.direction.ltr": "LTR",
|
|
||||||
"debugBar.direction.rtl": "RTL",
|
|
||||||
"common.key.ctrl": "Ctrl",
|
"common.key.ctrl": "Ctrl",
|
||||||
"common.key.alt": "Alt",
|
"common.key.alt": "Alt",
|
||||||
"common.key.shift": "Shift",
|
"common.key.shift": "Shift",
|
||||||
@@ -1254,7 +1096,7 @@ export const dict = {
|
|||||||
"error.page.circular": "[Циклично]",
|
"error.page.circular": "[Циклично]",
|
||||||
"error.serverSDK.noServerAvailable": "Нет доступного сервера",
|
"error.serverSDK.noServerAvailable": "Нет доступного сервера",
|
||||||
"error.serverSDK.serverNotAvailable": "Сервер недоступен",
|
"error.serverSDK.serverNotAvailable": "Сервер недоступен",
|
||||||
"error.childStore.persistedCacheCreateFailed": "Не удалось создать постоянный кеш",
|
"error.childStore.persistedCacheCreateFailed": "Не удалось создать постоянный кэш",
|
||||||
"error.childStore.persistedProjectMetadataCreateFailed": "Не удалось создать постоянные метаданные проекта",
|
"error.childStore.persistedProjectMetadataCreateFailed": "Не удалось создать постоянные метаданные проекта",
|
||||||
"error.childStore.persistedProjectIconCreateFailed": "Не удалось создать постоянный значок проекта",
|
"error.childStore.persistedProjectIconCreateFailed": "Не удалось создать постоянный значок проекта",
|
||||||
"error.childStore.storeCreateFailed": "Не удалось создать хранилище",
|
"error.childStore.storeCreateFailed": "Не удалось создать хранилище",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user