Compare commits

...

48 Commits

Author SHA1 Message Date
Luke Parker 393a8379ce feat(app): add minimal RTL support 2026-08-04 04:53:55 +00:00
Luke Parker 638788f8d0 fix(app): move markdown parsing to worker (#40356) 2026-08-04 04:13:34 +00:00
opencode-agent[bot] b005a15a4a chore: generate 2026-08-04 03:58:49 +00:00
opencode-agent[bot] 0efa33cf33 feat(desktop): expand and audit locale translations (#40362)
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
2026-08-04 03:57:33 +00:00
opencode-agent[bot] 7e94ddafe8 fix(github): include pull request identity in context (#40363)
Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
2026-08-03 22:18:52 -05:00
opencode 7fe993879f sync release versions for v1.18.12 2026-08-04 00:55:26 +00:00
Frank def14d96ef Revert "fix slow queries" 2026-08-03 20:14:17 -04:00
opencode-agent[bot] b0b1149233 test(opencode): cover Azure completion reasoning (#40340)
Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
2026-08-04 09:50:17 +10:00
Aarav Sareen 7becbbf711 feat(app): refine diff viewer (#40285)
Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>
2026-08-03 22:49:49 +00:00
Frederik 87481f2bb6 fix: gpt-5.5+ in combination with azure fails with reasoningEffort (#40265) 2026-08-03 17:42:30 -05:00
opencode-agent[bot] 9535a8f929 fix(ui): update OpenRouter logo (#40313)
Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
2026-08-04 07:08:09 +10:00
YB e917c12c80 docs: remove obsolete vouch system section (#40266) 2026-08-03 14:17:27 -05:00
opencode-agent[bot] 89130db6b0 chore: update nix node_modules hashes 2026-08-03 10:07:49 +00:00
Frank 9465a6c97d Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-03 05:54:55 -04:00
Frank 53fd02970d fix slow queries 2026-08-03 05:54:41 -04:00
Luke Parker 6ff0adef22 perf(app): fix composer lag via buffered blob draft storage (#40207) 2026-08-03 19:49:08 +10:00
opencode-agent[bot] 3307f99f1f fix(ci): reuse imported macOS keychain (#40221)
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
2026-08-03 19:48:32 +10:00
Frank 8de7a3c739 fix slow queries 2026-08-03 05:41:46 -04:00
opencode-agent[bot] 28d0637406 chore: generate 2026-08-03 08:48:38 +00:00
Frank ef7f712867 fix slow queries 2026-08-03 04:47:10 -04:00
Joshua 3016830e25 fix(app): search every known project in the open project dialog (#40202) 2026-08-03 14:54:00 +08:00
Jack e9e7472456 docs(go): add Qwen3.8 Max (#40228) 2026-08-03 14:48:57 +08:00
Brendan Allan 9f9fbf815c fix(app): clear stale timeline errors (#39465) 2026-08-03 14:18:52 +08:00
opencode-agent[bot] c88facb2cc chore: generate 2026-08-03 06:09:39 +00:00
twinkle d4b85f8d83 fix(app): skip legacy config reads for v2 (#40211) 2026-08-03 14:08:22 +08:00
Frank 1882c33827 fix gemini reasoning tokens not counted 2026-08-02 02:31:20 -04:00
opencode-agent[bot] 01624c8c87 chore: generate 2026-08-02 03:36:50 +00:00
Jack 0891ecd8e0 docs(go): update DeepSeek privacy policy (#40120) 2026-08-02 11:35:35 +08:00
Frank 32f278b48f Merge branch 'dev' of github.com:anomalyco/opencode into dev 2026-08-01 10:25:21 -04:00
Frank bb6bec9070 zen: update doc 2026-08-01 10:25:18 -04:00
opencode 0eac0964af sync release versions for v1.18.11 2026-08-01 11:44:43 +00:00
OpeOginni f67e80c275 fix(app): prevent stale prompt control reads (#39842) 2026-08-01 09:46:46 +00:00
opencode-agent[bot] 19231fce4b chore: generate 2026-07-31 17:18:52 +00:00
Frank d0a7ca6d1b go: document data policy per model 2026-07-31 13:16:18 -04:00
Frank d80e86be9d go: document data policy per model 2026-07-31 13:15:27 -04:00
opencode-agent[bot] e4bd9757a3 chore: generate 2026-07-31 12:18:55 +00:00
Jack 4087cf1a97 fix(go): restore limits graph axis (#39870) 2026-07-31 20:17:28 +08:00
opencode-agent[bot] 14f0bf64a1 chore: generate 2026-07-31 08:31:55 +00:00
Frank 2df47ee394 deepseek v4 flash 2026-07-31 04:28:41 -04:00
opencode-agent[bot] ad82616445 chore: update nix node_modules hashes 2026-07-31 08:24:41 +00:00
opencode-agent[bot] d4ad650f73 chore: generate 2026-07-31 08:03:42 +00:00
Luke Parker 2039c90c06 fix(desktop): open external links in system browser (#39820) 2026-07-31 18:02:11 +10:00
Jack da59457ca4 feat(go): add GPT 5.6 Luna content (#39812) 2026-07-31 01:23:25 -04:00
OpeOginni db4dbaa289 fix(app): prevent stale session tab reads (#39767) 2026-07-31 05:14:09 +00:00
opencode-agent[bot] d3f30df180 fix(app): open legacy picker at home (#39804)
Co-authored-by: Brendan Allan <git@brendonovich.dev>
2026-07-31 04:38:34 +00:00
OpeOginni 7ea343cabd fix(app): prevent file tree tab clipping (#39770) 2026-07-31 12:24:19 +08:00
Luke Parker e024e2ef92 fix(app): align debug gutter text (#39782) 2026-07-31 01:46:36 +00:00
Deven Navani ceb4890ca3 docs: add Modal provider setup (#39710) 2026-07-30 13:29:32 -05:00
288 changed files with 20855 additions and 3146 deletions
+1 -2
View File
@@ -339,8 +339,7 @@ jobs:
env:
OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
GH_TOKEN: ${{ steps.committer.outputs.token }}
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
CSC_KEYCHAIN: build.keychain
APPLE_API_KEY: ${{ runner.temp }}/apple-api-key.p8
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
-27
View File
@@ -252,33 +252,6 @@ These are not strictly enforced, they are just general guidelines:
For net-new functionality, start with a design conversation. Open an issue describing the problem, your proposed approach (optional), and why it belongs in OpenCode. The core team will help decide whether it should move forward; please wait for that approval instead of opening a feature PR directly.
## Trust & Vouch System
This project uses [vouch](https://github.com/mitchellh/vouch) to manage contributor trust. The vouch list is maintained in [`.github/VOUCHED.td`](.github/VOUCHED.td).
### How it works
- **Vouched users** are explicitly trusted contributors.
- **Denounced users** are explicitly blocked. Issues and pull requests from denounced users are automatically closed. If you have been denounced, you can request to be unvouched by reaching out to a maintainer on [Discord](https://opencode.ai/discord)
- **Everyone else** can participate normally — you don't need to be vouched to open issues or PRs.
### For maintainers
Collaborators with write access can manage the vouch list by commenting on any issue:
- `vouch` — vouch for the issue author
- `vouch @username` — vouch for a specific user
- `denounce` — denounce the issue author
- `denounce @username` — denounce a specific user
- `denounce @username <reason>` — denounce with a reason
- `unvouch` / `unvouch @username` — remove someone from the list
Changes are committed automatically to `.github/VOUCHED.td`.
### Denouncement policy
Denouncement is reserved for users who repeatedly submit low-quality AI-generated contributions, spam, or otherwise act in bad faith. It is not used for disagreements or honest mistakes.
## Issue Requirements
All issues **must** use one of our issue templates:
+31 -41
View File
@@ -29,7 +29,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@corvu/drawer": "catalog:",
"@dnd-kit/abstract": "0.5.0",
@@ -96,7 +96,7 @@
},
"packages/cli": {
"name": "@opencode-ai/cli",
"version": "1.18.10",
"version": "1.18.12",
"bin": {
"lildax": "./bin/lildax.cjs",
},
@@ -144,7 +144,7 @@
},
"packages/codemode": {
"name": "@opencode-ai/codemode",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"acorn": "8.15.0",
"effect": "catalog:",
@@ -158,7 +158,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -194,7 +194,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -221,7 +221,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@ai-sdk/anthropic": "3.0.82",
"@ai-sdk/openai": "3.0.48",
@@ -243,7 +243,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -267,7 +267,7 @@
},
"packages/console/support": {
"name": "@opencode-ai/console-support",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@opencode-ai/console-core": "workspace:*",
@@ -287,7 +287,7 @@
},
"packages/core": {
"name": "@opencode-ai/core",
"version": "1.18.10",
"version": "1.18.12",
"bin": {
"opencode": "./bin/opencode",
},
@@ -381,16 +381,16 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@zip.js/zip.js": "2.7.62",
"drizzle-orm": "catalog:",
"effect": "catalog:",
"electron-context-menu": "4.1.2",
"electron-log": "^5",
"electron-store": "11.0.2",
"electron-updater": "6.8.9",
"electron-window-state": "^5.0.3",
"marked": "^15",
},
"devDependencies": {
"@actions/artifact": "4.0.0",
@@ -435,7 +435,7 @@
},
"packages/effect-drizzle-sqlite": {
"name": "@opencode-ai/effect-drizzle-sqlite",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"drizzle-orm": "catalog:",
"effect": "catalog:",
@@ -449,7 +449,7 @@
},
"packages/effect-sqlite-node": {
"name": "@opencode-ai/effect-sqlite-node",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"effect": "catalog:",
},
@@ -461,7 +461,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@hono/standard-validator": "catalog:",
"@opencode-ai/core": "workspace:*",
@@ -493,7 +493,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
@@ -509,7 +509,7 @@
},
"packages/http-recorder": {
"name": "@opencode-ai/http-recorder",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@effect/platform-node": "4.0.0-beta.83",
"@effect/platform-node-shared": "4.0.0-beta.83",
@@ -540,7 +540,7 @@
},
"packages/llm": {
"name": "@opencode-ai/llm",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@opencode-ai/schema": "workspace:*",
"@smithy/eventstream-codec": "4.2.14",
@@ -559,7 +559,7 @@
},
"packages/opencode": {
"name": "opencode",
"version": "1.18.10",
"version": "1.18.12",
"bin": {
"opencode": "./bin/opencode",
},
@@ -690,7 +690,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@ai-sdk/provider": "3.0.8",
"@opencode-ai/sdk": "workspace:*",
@@ -766,7 +766,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"cross-spawn": "catalog:",
},
@@ -781,7 +781,7 @@
},
"packages/server": {
"name": "@opencode-ai/server",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/protocol": "workspace:*",
@@ -796,7 +796,7 @@
},
"packages/session-ui": {
"name": "@opencode-ai/session-ui",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/client": "file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz",
@@ -811,15 +811,11 @@
"@solid-primitives/media": "2.3.3",
"@solid-primitives/resize-observer": "2.1.3",
"@solidjs/meta": "catalog:",
"@solidjs/router": "catalog:",
"diff": "catalog:",
"dompurify": "3.3.1",
"fuzzysort": "catalog:",
"katex": "0.16.27",
"luxon": "catalog:",
"marked": "catalog:",
"marked-katex-extension": "5.1.6",
"marked-shiki": "catalog:",
"morphdom": "2.7.8",
"motion": "12.34.5",
"remeda": "catalog:",
@@ -832,7 +828,6 @@
"devDependencies": {
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
"@types/katex": "0.16.7",
"@types/luxon": "catalog:",
"@typescript/native-preview": "catalog:",
"typescript": "catalog:",
@@ -841,7 +836,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -854,7 +849,7 @@
},
"packages/stats/app": {
"name": "@opencode-ai/stats-app",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@ibm/plex": "6.4.1",
"@kobalte/core": "catalog:",
@@ -888,7 +883,7 @@
},
"packages/stats/core": {
"name": "@opencode-ai/stats-core",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@aws-sdk/client-athena": "3.933.0",
"@planetscale/database": "1.19.0",
@@ -907,7 +902,7 @@
},
"packages/stats/server": {
"name": "@opencode-ai/stats-server",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@aws-sdk/client-firehose": "3.933.0",
"@effect/platform-node": "catalog:",
@@ -949,7 +944,7 @@
},
"packages/tui": {
"name": "@opencode-ai/tui",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@opencode-ai/core": "workspace:*",
"@opencode-ai/plugin": "workspace:*",
@@ -976,7 +971,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@kobalte/core": "catalog:",
"@pierre/diffs": "catalog:",
@@ -992,7 +987,6 @@
"katex": "0.16.27",
"luxon": "catalog:",
"marked": "catalog:",
"marked-katex-extension": "5.1.6",
"marked-shiki": "catalog:",
"morphdom": "2.7.8",
"motion": "12.34.5",
@@ -1028,7 +1022,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
"version": "1.18.10",
"version": "1.18.12",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
@@ -1138,7 +1132,7 @@
"hono": "4.10.7",
"hono-openapi": "1.1.2",
"luxon": "3.6.1",
"marked": "17.0.6",
"marked": "18.0.7",
"marked-shiki": "1.2.1",
"opentui-spinner": "0.0.7",
"remeda": "2.26.0",
@@ -4319,9 +4313,7 @@
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
"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": ["marked@18.0.7", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-iDVQ5ldaiKXn6b2JroX5kgRfmwgqolW7NpaEzTl1k/2Zh1njIEN9yniyLV/mOvWwtsE8OGgkjsCYvijuPk1dtA=="],
"marked-shiki": ["marked-shiki@1.2.1", "", { "peerDependencies": { "marked": ">=7.0.0", "shiki": ">=1.0.0" } }, "sha512-yHxYQhPY5oYaIRnROn98foKhuClark7M373/VpLxiy5TrDu9Jd/LsMwo8w+U91Up4oDb9IXFrP0N1MFRz8W/DQ=="],
@@ -6045,8 +6037,6 @@
"@opencode-ai/desktop/@actions/artifact": ["@actions/artifact@4.0.0", "", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="],
"@opencode-ai/desktop/marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
"@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
"@opencode-ai/llm/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="],
+4 -4
View File
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-AD5kt1o035hdvYPyrvjiz2mcsXFJ7UJVEmbE9AJFDFs=",
"aarch64-linux": "sha256-f1gVXUpIRWC/I8dxIigdGGvPsju04MXVjZhtq5EYL64=",
"aarch64-darwin": "sha256-c+JRpjs2gsgQ2czyM6bTbYEdMbX/erOSQdX6TdrI59k=",
"x86_64-darwin": "sha256-iB7l4PtQQ9Mx/XAdtyayiLe6pZKhuXB9lpmrbTr+uWc="
"x86_64-linux": "sha256-a7NyYa9vRUEqDfZNDPXXmFO58RDEgioyuGSl5CPBvxo=",
"aarch64-linux": "sha256-l4OJtSEllHvRhktjcaJYwkXBSaJvsIoyoLusbZfYMcM=",
"aarch64-darwin": "sha256-IIl0BQGs1/HLFh0auiQjiwfSQ2nfHcK2G2BAphYW59c=",
"x86_64-darwin": "sha256-vVeuPyd4ZIRYrHouphTuEb4rkRZLKKTAHe840jNh9rU="
}
}
+1 -1
View File
@@ -70,7 +70,7 @@
"hono-openapi": "1.1.2",
"fuzzysort": "3.1.0",
"luxon": "3.6.1",
"marked": "17.0.6",
"marked": "18.0.7",
"marked-shiki": "1.2.1",
"remend": "1.3.0",
"@playwright/test": "1.59.1",
@@ -0,0 +1,60 @@
import { expect, test } from "@playwright/test"
import type { Page } from "@playwright/test"
import { fixture, pageMessages } from "../smoke/session-timeline.fixture"
import { mockOpenCodeServer } from "../utils/mock-server"
import { expectAppVisible } from "../utils/waits"
const NAMES = ["alpha-service", "bravo-web", "charlie-api", "delta-tools", "echo-infra", "foxtrot-docs"]
const worktrees = NAMES.map((name) => `/opencode-demo/${name}`)
// The sixth project sits outside the five-item recent cap, so it is only reachable if the
// dialog hands every recent project to the list filter instead of a pre-truncated slice.
const OUTSIDE_CAP = "foxtrot-docs"
// Dialog rows carry data-directory-path; the sidebar project list does not, so this
// scopes assertions to the picker instead of matching the sidebar entry of the same name.
const rows = (page: Page) => page.locator("[data-directory-path]")
const row = (page: Page, name: string) => page.locator(`[data-directory-path*="${name}"]`)
async function openProjectDialog(page: Page) {
await mockOpenCodeServer(page, {
sessions: fixture.sessions,
provider: fixture.provider,
directory: fixture.directory,
project: fixture.project,
pageMessages,
fileList: () => [],
findFiles: () => [],
})
await page.addInitScript((dirs) => {
localStorage.setItem(
"opencode.global.dat:server",
JSON.stringify({
projects: { local: dirs.map((worktree: string) => ({ worktree, expanded: false })) },
lastProject: {},
}),
)
}, worktrees)
await page.goto("/")
const add = page.getByRole("button", { name: "Add project" }).first()
await expectAppVisible(add)
await add.click()
await expect(rows(page)).toHaveCount(5)
return page.getByRole("textbox").last()
}
test("searches every recent project, not just the five most recent", async ({ page }) => {
const search = await openProjectDialog(page)
await expect(row(page, OUTSIDE_CAP)).toHaveCount(0)
await search.fill("foxtrot")
await expect(row(page, OUTSIDE_CAP)).toHaveCount(1)
})
test("still caps the idle recent list at five projects", async ({ page }) => {
await openProjectDialog(page)
await expect(row(page, NAMES[4])).toHaveCount(1)
await expect(row(page, OUTSIDE_CAP)).toHaveCount(0)
})
@@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test"
import { assistantMessage, setupTimeline, toolPart, userMessage } from "../performance/timeline-stability/fixture"
for (const profile of [
{ locale: "de", label: "Erkundet" },
{ locale: "de", label: "Erkundung abgeschlossen" },
{ locale: "ar", label: "تم الاستكشاف" },
] as const) {
test(`projects translated context status in ${profile.locale}`, async ({ page }) => {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.18.10",
"version": "1.18.12",
"description": "",
"type": "module",
"exports": {
+1 -4
View File
@@ -3,7 +3,6 @@ import * as Sentry from "@sentry/solid"
import { I18nProvider } from "@opencode-ai/ui/context"
import { DialogProvider } from "@opencode-ai/ui/context/dialog"
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 { Font } from "@opencode-ai/ui/font"
import { Splash } from "@opencode-ai/ui/logo"
@@ -405,9 +404,7 @@ export function AppBaseProviders(props: ParentProps<{ locale?: Locale }>) {
<QueryProvider>
<WslServersProvider>
<DialogProvider>
<MarkedProvider>
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
</MarkedProvider>
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
</DialogProvider>
</WslServersProvider>
</QueryProvider>
+36 -18
View File
@@ -66,7 +66,7 @@ function Cell(props: {
<div
classList={{
"flex min-w-0 items-center": true,
"min-h-[20px] w-fit flex-row justify-start gap-1.5 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,
"min-h-[42px] w-full flex-col rounded-[8px] px-0.5 py-1": !props.inline,
"col-span-2": !!props.wide && !props.inline,
@@ -74,21 +74,29 @@ function Cell(props: {
>
<div
classList={{
"text-[10px] leading-none font-black uppercase tracking-[0.04em] opacity-70": true,
"flex min-w-0": true,
"-translate-y-px items-baseline gap-1.5": !!props.inline,
"flex-col items-center": !props.inline,
}}
>
{props.label}
</div>
<div
classList={{
"uppercase leading-none font-bold tabular-nums": true,
"text-[11px]": !!props.inline,
"text-[13px] sm:text-[14px]": !props.inline,
"text-text-on-critical-base": !!props.bad,
"opacity-70": !!props.dim,
}}
>
{props.value}
<div
classList={{
"text-[10px] leading-none font-black uppercase tracking-[0.04em] opacity-70": true,
}}
>
{props.label}
</div>
<div
classList={{
"uppercase leading-none font-bold tabular-nums": true,
"text-[11px]": !!props.inline,
"text-[13px] sm:text-[14px]": !props.inline,
"text-text-on-critical-base": !!props.bad,
"opacity-70": !!props.dim,
}}
>
{props.value}
</div>
</div>
</div>
)
@@ -116,15 +124,25 @@ function FocusCell(props: { active: boolean; inline?: boolean; onClick: () => vo
aria-pressed={props.active}
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,
"min-h-[20px] w-fit flex-row justify-start gap-1.5 rounded px-1.5 py-0.5 text-left": !!props.inline,
"min-h-[20px] w-fit justify-start rounded px-1.5 py-0.5 text-left": !!props.inline,
"min-h-[42px] w-full flex-col justify-center rounded-[8px] px-0.5 py-1 text-center": !props.inline,
"bg-surface-raised-base text-text-strong": props.active,
}}
onClick={props.onClick}
>
<span class="text-[10px] leading-none font-black tracking-[0.04em] opacity-70">FOCUS</span>
<span classList={{ "leading-none font-bold": true, "text-[11px]": !!props.inline, "text-[13px]": !props.inline }}>
{props.active ? "ON" : "OFF"}
<span
classList={{
flex: true,
"-translate-y-px items-baseline gap-1.5": !!props.inline,
"flex-col items-center": !props.inline,
}}
>
<span class="text-[10px] leading-none font-black tracking-[0.04em] opacity-70">FOCUS</span>
<span
classList={{ "leading-none font-bold": true, "text-[11px]": !!props.inline, "text-[13px]": !props.inline }}
>
{props.active ? "ON" : "OFF"}
</span>
</span>
</button>
)
@@ -29,7 +29,7 @@ import {
} from "solid-js"
import { createStore, produce } from "solid-js/store"
import { useParams } from "@solidjs/router"
import { Link } from "@/components/link"
import { ExternalLink } from "@/components/external-link"
import { useServerSDK } from "@/context/server-sdk"
import { useServerSync } from "@/context/server-sync"
import { useLanguage } from "@/context/language"
@@ -836,12 +836,12 @@ function ProviderConnection(props: {
<div>{language.t("provider.connect.opencodeZen.line2")}</div>
<div>
{language.t("provider.connect.opencodeZen.visit.prefix")}
<Link
<ExternalLink
href="https://opencode.ai/zen"
class="text-v2-text-text-base focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-v2-border-border-focus"
>
{language.t("provider.connect.opencodeZen.visit.link")}
</Link>
</ExternalLink>
{language.t("provider.connect.opencodeZen.visit.suffix")}
</div>
</div>
@@ -886,9 +886,9 @@ function ProviderConnection(props: {
<div class="text-14-regular text-text-base">{language.t("provider.connect.opencodeZen.line2")}</div>
<div class="text-14-regular text-text-base">
{language.t("provider.connect.opencodeZen.visit.prefix")}
<Link href="https://opencode.ai/zen" tabIndex={-1}>
<ExternalLink href="https://opencode.ai/zen" tabIndex={-1}>
{language.t("provider.connect.opencodeZen.visit.link")}
</Link>
</ExternalLink>
{language.t("provider.connect.opencodeZen.visit.suffix")}
</div>
</div>
@@ -967,9 +967,9 @@ function ProviderConnection(props: {
<div class="flex flex-col gap-5 px-3 text-[13px] font-[440] leading-5 tracking-[-0.04px] text-v2-text-text-muted">
<div>
{language.t("provider.connect.oauth.code.visit.prefix")}
<Link href={store.authorization!.url} class="text-v2-text-text-base">
<ExternalLink href={store.authorization!.url} class="text-v2-text-text-base">
{language.t("provider.connect.oauth.code.visit.link")}
</Link>
</ExternalLink>
{language.t("provider.connect.oauth.code.visit.suffix", { provider: provider().name })}
</div>
<form onSubmit={handleSubmit} class="flex flex-col items-start gap-5 self-stretch">
@@ -1006,7 +1006,9 @@ function ProviderConnection(props: {
<div class="flex flex-col gap-6">
<div class="text-14-regular text-text-base">
{language.t("provider.connect.oauth.code.visit.prefix")}
<Link href={store.authorization!.url}>{language.t("provider.connect.oauth.code.visit.link")}</Link>
<ExternalLink href={store.authorization!.url}>
{language.t("provider.connect.oauth.code.visit.link")}
</ExternalLink>
{language.t("provider.connect.oauth.code.visit.suffix", { provider: provider().name })}
</div>
<form onSubmit={handleSubmit} class="flex flex-col items-start gap-4">
@@ -1077,7 +1079,9 @@ function ProviderConnection(props: {
<div class="flex flex-col gap-6">
<div class="text-14-regular text-text-base">
{language.t("provider.connect.oauth.auto.visit.prefix")}
<Link href={store.authorization!.url}>{language.t("provider.connect.oauth.auto.visit.link")}</Link>
<ExternalLink href={store.authorization!.url}>
{language.t("provider.connect.oauth.auto.visit.link")}
</ExternalLink>
{language.t("provider.connect.oauth.auto.visit.suffix", { provider: provider().name })}
</div>
<TextField
@@ -8,7 +8,7 @@ import { TextField } from "@opencode-ai/ui/text-field"
import { showToast } from "@/utils/toast"
import { batch, For } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { Link } from "@/components/link"
import { ExternalLink } from "@/components/external-link"
import { useServerSDK } from "@/context/server-sdk"
import { useServerSync } from "@/context/server-sync"
import { useLanguage } from "@/context/language"
@@ -185,9 +185,9 @@ export function CustomProviderForm(props: { autofocus?: boolean } = {}) {
<form onSubmit={save} class="px-2.5 pb-6 flex flex-col gap-6">
<p class="text-14-regular text-text-base">
{language.t("provider.custom.description.prefix")}
<Link href="https://opencode.ai/docs/providers/#custom-provider" tabIndex={-1}>
<ExternalLink href="https://opencode.ai/docs/providers/#custom-provider" tabIndex={-1}>
{language.t("provider.custom.description.link")}
</Link>
</ExternalLink>
{language.t("provider.custom.description.suffix")}
</p>
@@ -18,6 +18,8 @@ interface DialogSelectDirectoryProps {
server: ServerConnection.Any
}
const RECENT_PROJECT_LIMIT = 5
type Row = {
absolute: string
search: string
@@ -57,9 +59,9 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
const [filter, setFilter] = createSignal("")
let list: ListRef | undefined
const missingBase = createMemo(() => !(sync.data.path.home || sync.data.path.directory))
const missingHome = createMemo(() => !sync.data.path.home)
const [fallbackPath] = createResource(
() => (missingBase() ? true : undefined),
() => (missingHome() ? true : undefined),
async (): Promise<Path | undefined> => {
if ((await sdk.protocol) !== "v1") return
return sdk.client.path
@@ -102,7 +104,6 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
return projects
.map((project, index) => ({ project, at: byProject.get(project.worktree) ?? 0, index }))
.sort((a, b) => b.at - a.at || a.index - b.index)
.slice(0, 5)
.map(({ project }) => {
const row = toRow(project.worktree, home(), "recent")
const name = project.name || getFilename(project.worktree)
@@ -116,7 +117,10 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
const items = async (value: string) => {
const results = await directories(value)
const directoryRows = results.map((absolute) => toRow(absolute, home(), "folders"))
return uniqueRows([...recentProjects(), ...directoryRows])
// Cap the idle list only. Once a query narrows the results, every project stays searchable.
const recent = recentProjects()
const visible = value ? recent : recent.slice(0, RECENT_PROJECT_LIMIT)
return uniqueRows([...visible, ...directoryRows])
}
function resolve(absolute: string) {
@@ -17,7 +17,7 @@ export function DialogUsageExceeded(props: DialogGoUpsellProps) {
const platform = usePlatform()
const runAction = () => {
if (props.link) platform.openLink(props.link)
if (props.link) platform.openExternal(props.link)
props.onClose?.()
dialog.close()
}
@@ -0,0 +1,21 @@
import { ComponentProps, splitProps } from "solid-js"
export interface ExternalLinkProps extends Omit<ComponentProps<"a">, "href"> {
href: string
}
export function ExternalLink(props: ExternalLinkProps) {
const [local, rest] = splitProps(props, ["href", "children", "class", "target", "rel"])
return (
<a
href={local.href}
class={`text-text-strong underline ${local.class ?? ""}`}
target={local.target ?? "_blank"}
rel={local.rel ?? "noopener noreferrer"}
{...rest}
>
{local.children}
</a>
)
}
@@ -215,6 +215,7 @@ export default function FileTreeV2(props: {
<div
ref={setRoot}
data-component="file-tree-v2"
dir="ltr"
data-total-rows={live() ? rows().length : model()!.total}
class="group/file-tree-v2"
style={{ position: "relative", height: `${virtualizer.getTotalSize()}px` }}
-26
View File
@@ -1,26 +0,0 @@
import { ComponentProps, splitProps } from "solid-js"
import { usePlatform } from "@/context/platform"
export interface LinkProps extends Omit<ComponentProps<"a">, "href"> {
href: string
}
export function Link(props: LinkProps) {
const platform = usePlatform()
const [local, rest] = splitProps(props, ["href", "children", "class"])
return (
<a
href={local.href}
class={`text-text-strong underline ${local.class ?? ""}`}
onClick={(event) => {
if (!local.href) return
event.preventDefault()
platform.openLink(local.href)
}}
{...rest}
>
{local.children}
</a>
)
}
@@ -344,7 +344,7 @@ export function usePromptInputV2Controller(props: PromptInputV2ControllerProps):
if (item?.commentID) comments.remove(item.path, item.commentID)
},
openAttachment: (attachment) =>
dialog.show(() => <ImagePreview src={attachment.dataUrl} alt={attachment.filename} />),
dialog.show(() => <ImagePreview src={attachment.blob.url} alt={attachment.filename} />),
openContext(key) {
const item = controller.contextItem(key)
if (item) openComment(item, props, sync, layout, files, comments)
@@ -377,6 +377,7 @@ export function usePromptInputV2Controller(props: PromptInputV2ControllerProps):
}),
readClipboardImage: platform.readClipboardImage,
getPathForFile: platform.getPathForFile,
store: platform.draftStore?.putBlob,
},
view: {
placeholder: designPlaceholder,
+1 -1
View File
@@ -1489,7 +1489,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
<PromptImageAttachments
attachments={imageAttachments()}
onOpen={(attachment) =>
dialog.show(() => <ImagePreview src={attachment.dataUrl} alt={attachment.filename} />)
dialog.show(() => <ImagePreview src={attachment.blob.url} alt={attachment.filename} />)
}
onRemove={removeAttachment}
removeLabel={language.t("prompt.attachment.remove")}
@@ -3,28 +3,13 @@ import { makeEventListener } from "@solid-primitives/event-listener"
import { showToast } from "@/utils/toast"
import { type ContentPart, type ImageAttachmentPart, type usePrompt } from "@/context/prompt"
import { useLanguage } from "@/context/language"
import { usePlatform } from "@/context/platform"
import { uuid } from "@/utils/uuid"
import { getCursorPosition } from "./editor-dom"
import { createBlobReference, type DraftStore } from "@/utils/draft-store"
import { attachmentMime } from "./files"
import { normalizePaste, pasteMode } from "./paste"
function dataUrl(file: File, mime: string) {
return new Promise<string>((resolve) => {
const reader = new FileReader()
reader.addEventListener("error", () => resolve(""))
reader.addEventListener("load", () => {
const value = typeof reader.result === "string" ? reader.result : ""
const idx = value.indexOf(",")
if (idx === -1) {
resolve(value)
return
}
resolve(`data:${mime};base64,${value.slice(idx + 1)}`)
})
reader.readAsDataURL(file)
})
}
type PromptTarget = Pick<ReturnType<ReturnType<typeof usePrompt>["capture"]>, "current" | "cursor" | "set">
type AttachmentTarget = { prompt: PromptTarget; cursor: number | undefined }
@@ -36,6 +21,7 @@ type PromptAttachmentsCoreInput = {
warn?: () => void
readClipboardImage?: () => Promise<File | null>
getPathForFile?: (file: File) => string
draftStore?: DraftStore
}
export type PromptAttachmentsInput = {
@@ -65,16 +51,13 @@ export function createPromptAttachmentsCore(input: PromptAttachmentsCoreInput) {
return false
}
const url = await dataUrl(file, mime)
if (!url) return false
const attachment: ImageAttachmentPart = {
type: "image",
id: uuid(),
filename: file.name,
sourcePath: input.getPathForFile?.(file) || undefined,
mime,
dataUrl: url,
blob: input.draftStore ? await input.draftStore.putBlob(file) : await createBlobReference(file),
}
target.prompt.set([...target.prompt.current(), attachment], target.cursor)
return true
@@ -166,8 +149,10 @@ export function createPromptAttachmentsCore(input: PromptAttachmentsCoreInput) {
export function createPromptAttachments(input: PromptAttachmentsInput) {
const language = useLanguage()
const platform = usePlatform()
const attachments = createPromptAttachmentsCore({
...input,
draftStore: platform.draftStore,
capture: input.prompt.capture,
warn: () => {
showToast({
@@ -22,7 +22,7 @@ type ContextFile = {
type BuildRequestPartsInput = {
prompt: Prompt
context: ContextFile[]
images: ImageAttachmentPart[]
images: (Omit<ImageAttachmentPart, "blob"> & { dataUrl: string })[]
text: string
messageID: string
sessionID: string
@@ -1,7 +1,13 @@
import { createStore, type SetStoreFunction, type Store } from "solid-js/store"
import type { Prompt } from "@/context/prompt"
import { Persist, persisted } from "@/utils/persist"
import { prependHistoryEntry, type PromptHistoryComment, type PromptHistoryStoredEntry } from "./history"
import {
clonePromptHistoryComments,
clonePromptParts,
prependHistoryEntry,
type PromptHistoryComment,
type PromptHistoryStoredEntry,
} from "./history"
export type PromptInputHistory = {
entries: (mode: "normal" | "shell") => PromptHistoryStoredEntry[]
@@ -35,13 +41,23 @@ export function createPromptInputHistory(): PromptInputHistory {
}
export function createPersistedPromptInputHistory() {
const [normal, setNormal] = persisted(
Persist.global("prompt-history", ["prompt-history.v1"]),
const [normal, setNormal, normalInit] = persisted(
Persist.prompt(Persist.global("prompt-history", ["prompt-history.v1"])),
createStore<PromptHistoryState>({ entries: [] }),
)
const [shell, setShell] = persisted(
Persist.global("prompt-history-shell", ["prompt-history-shell.v1"]),
const [shell, setShell, shellInit] = persisted(
Persist.prompt(Persist.global("prompt-history-shell", ["prompt-history-shell.v1"])),
createStore<PromptHistoryState>({ entries: [] }),
)
return createPromptInputHistoryStore(normal, setNormal, shell, setShell)
const history = createPromptInputHistoryStore(normal, setNormal, shell, setShell)
return {
...history,
add(prompt: Prompt, mode: "normal" | "shell", comments: PromptHistoryComment[]) {
const ready = mode === "shell" ? shellInit : normalInit
if (!(ready instanceof Promise)) return history.add(prompt, mode, comments)
const saved = clonePromptParts(prompt)
const metadata = clonePromptHistoryComments(comments)
void ready.then(() => history.add(saved, mode, metadata))
},
}
}
@@ -112,7 +112,7 @@ describe("prompt-input history", () => {
end: 12,
selection: { startLine: 1, startChar: 1, endLine: 2, endChar: 1 },
},
{ type: "image", id: "1", filename: "img.png", mime: "image/png", dataUrl: "data:image/png;base64,abc" },
{ type: "image", id: "1", filename: "img.png", mime: "image/png", blob: { id: "blob", url: "blob:test" } },
]
const copy = clonePromptParts(original)
expect(copy).not.toBe(original)
@@ -100,7 +100,7 @@ export const PromptImageAttachments: Component<PromptImageAttachmentsProps> = (p
}
>
<img
src={attachment.dataUrl}
src={attachment.blob.url}
alt={attachment.filename}
class={props.newLayoutDesigns ? imageClassV2 : imageClass}
onClick={() => props.onOpen(attachment)}
@@ -22,6 +22,7 @@ import { ScopedKey } from "@/utils/server-scope"
import { createPromptSubmissionState } from "./submission-state"
import { normalizeSessionInfo } from "@/utils/session"
import { Event } from "@opencode-ai/schema/event"
import { blobDataUrl } from "@/utils/draft-store"
type PendingPrompt = {
abort: AbortController
@@ -95,10 +96,12 @@ export async function sendFollowupDraft(input: FollowupSendInput) {
providerID: input.draft.model.providerID,
variant: input.draft.variant,
},
files: images.map((attachment) => ({
uri: attachment.dataUrl,
name: attachment.filename,
})),
files: await Promise.all(
images.map(async (attachment) => ({
uri: await blobDataUrl(attachment.blob, attachment.mime),
name: attachment.filename,
})),
),
})
return true
} catch (err) {
@@ -108,10 +111,16 @@ export async function sendFollowupDraft(input: FollowupSendInput) {
}
const messageID = input.messageID ?? Identifier.ascending("message")
const encodedImages = await Promise.all(
images.map(async (attachment) => ({
...attachment,
dataUrl: await blobDataUrl(attachment.blob, attachment.mime),
})),
)
const { requestParts, optimisticParts } = buildRequestParts({
prompt: input.draft.prompt,
context: input.draft.context,
images,
images: encodedImages,
text,
sessionID: input.draft.sessionID,
messageID,
@@ -516,10 +525,12 @@ export function createPromptSubmit(input: PromptSubmitInput) {
arguments: args.join(" "),
agent,
model: { id: model.modelID, providerID: model.providerID, variant },
files: images.map((attachment) => ({
uri: attachment.dataUrl,
name: attachment.filename,
})),
files: await Promise.all(
images.map(async (attachment) => ({
uri: await blobDataUrl(attachment.blob, attachment.mime),
name: attachment.filename,
})),
),
})
.catch((err) => {
serverSync().session.set("session_status", session.id, { type: "idle" })
@@ -289,9 +289,9 @@ export function SessionHeader() {
return (
<>
<Show when={search() && centerMount()}>
<Show when={search() && centerMount()} keyed>
{(mount) => (
<Portal mount={mount()}>
<Portal mount={mount}>
<Button
type="button"
variant="ghost"
@@ -308,10 +308,10 @@ export function SessionHeader() {
</span>
</div>
<Show when={hotkey()}>
<Show when={hotkey()} keyed>
{(keybind) => (
<Keybind class="shrink-0 !border-0 !bg-transparent !shadow-none px-0 text-text-weaker">
{keybind()}
{keybind}
</Keybind>
)}
</Show>
@@ -319,9 +319,9 @@ export function SessionHeader() {
</Portal>
)}
</Show>
<Show when={rightMount()}>
<Show when={rightMount()} keyed>
{(mount) => (
<Portal mount={mount()}>
<Portal mount={mount}>
<Show
when={isV2}
fallback={
@@ -29,7 +29,7 @@ import {
} from "@/context/settings"
import { decode64 } from "@/utils/base64"
import { playSoundById, SOUND_OPTIONS } from "@/utils/sound"
import { Link } from "./link"
import { ExternalLink } from "./external-link"
import { SettingsList } from "./settings-list"
let demoSoundState = {
@@ -482,7 +482,7 @@ export const SettingsGeneral: Component = () => {
description={
<>
{language.t("settings.general.row.theme.description")}{" "}
<Link href="https://opencode.ai/docs/themes/">{language.t("common.learnMore")}</Link>
<ExternalLink href="https://opencode.ai/docs/themes/">{language.t("common.learnMore")}</ExternalLink>
</>
}
>
@@ -9,7 +9,7 @@ import { useLanguage } from "@/context/language"
import { usePlatform } from "@/context/platform"
import { useUpdaterAction } from "../updater-action"
import { useSettings } from "@/context/settings"
import { Link } from "../link"
import { ExternalLink } from "../external-link"
import { SettingsListV2 } from "./parts/list"
import { SettingsRowV2 } from "./parts/row"
import { LayoutRetirementNotice, LayoutTransitionToggle } from "./interface-transition"
@@ -150,9 +150,9 @@ const AppearanceSection: Component<{ controller: AppearanceSettingsController }>
description={
<>
{language.t("settings.general.row.theme.description")}{" "}
<Link class="settings-v2-link" href="https://opencode.ai/docs/themes/">
<ExternalLink class="settings-v2-link" href="https://opencode.ai/docs/themes/">
{language.t("common.learnMore")}
</Link>
</ExternalLink>
</>
}
>
+6 -1
View File
@@ -382,7 +382,11 @@ export const Terminal = (props: TerminalProps) => {
event.preventDefault()
event.stopImmediatePropagation()
platform.openLink(text)
if (URL.canParse(text) && new URL(text).protocol === "file:" && platform.openLocalFile) {
platform.openLocalFile(text)
return
}
platform.openExternal(text)
}
onMount(() => {
@@ -738,6 +742,7 @@ export const Terminal = (props: TerminalProps) => {
<div
ref={container}
data-component="terminal"
dir="ltr"
data-prevent-autofocus
tabIndex={-1}
style={{ "background-color": terminalColors().background }}
@@ -224,6 +224,7 @@ export function TabNavItem(props: {
<span data-slot="project-avatar-slot" class="flex size-4 shrink-0 items-center justify-center">
<Show
when={props.session()}
keyed
fallback={
<span class="block size-4 rounded-[3px] border border-v2-border-border-muted" aria-hidden="true" />
}
@@ -231,8 +232,8 @@ export function TabNavItem(props: {
{(session) => (
<SessionTabAvatar
project={project()}
directory={session().directory}
sessionId={session().id}
directory={session.directory}
sessionId={session.id}
server={props.server}
/>
)}
@@ -43,7 +43,7 @@ export function WindowsAppMenu(props: {
runAction(entry.action)
return
}
if (entry.href) props.platform.openLink(entry.href)
if (entry.href) props.platform.openExternal(entry.href)
}
return (
@@ -8,6 +8,7 @@ import {
bootstrapDirectory,
loadAgentsQuery,
loadCommands,
loadGlobalConfigQuery,
loadPathQuery,
loadProjectsQuery,
loadProvidersQuery,
@@ -76,6 +77,7 @@ function directoryState() {
describe("bootstrapDirectory", () => {
test("uses legacy MCP endpoints while refreshing a v1 directory", async () => {
const legacyConfigReads: string[] = []
const mcpReads: string[] = []
const [store, setStore] = directoryState()
@@ -91,7 +93,12 @@ describe("bootstrapDirectory", () => {
},
sdk: {
app: { agents: async () => ({ data: [{ name: "build", mode: "primary" }] }) },
config: { get: async () => ({ data: {} }) },
config: {
get: async () => {
legacyConfigReads.push("directory")
return { data: {} }
},
},
session: { status: async () => ({ data: {} }) },
vcs: { get: async () => ({ data: undefined }) },
command: {
@@ -134,8 +141,88 @@ describe("bootstrapDirectory", () => {
await new Promise((resolve) => setTimeout(resolve, 80))
expect(store.status).toBe("complete")
expect(legacyConfigReads).toEqual(["directory"])
expect(mcpReads.sort()).toEqual(["command", "resource", "status"])
})
test("skips legacy config while refreshing a v2 directory", async () => {
const [store, setStore] = directoryState()
await bootstrapDirectory({
directory: "/project",
scope: ServerScope.local,
mcp: false,
global: {
config: {} satisfies Config,
path: { state: "", config: "", worktree: "/project", directory: "/project", home: "/home" },
project: [{ id: "project", worktree: "/project" } as Project],
provider,
},
sdk: {
config: {
get: async () => {
throw new Error("legacy directory config should not be called")
},
},
} as unknown as OpencodeClient,
api,
store,
setStore,
vcsCache: { setStore() {} } as unknown as VcsCache,
loadSessions() {},
translate: (key) => key,
queryClient: new QueryClient(),
protocol: Promise.resolve("v2"),
})
expect(store.status).toBe("partial")
await new Promise((resolve) => setTimeout(resolve, 80))
expect(store.status).toBe("complete")
})
})
describe("config queries", () => {
test("skips legacy global config for v2 servers", async () => {
const sdk = {
global: {
config: {
get: async () => {
throw new Error("legacy global config should not be called")
},
},
},
} as unknown as OpencodeClient
const result = await new QueryClient().fetchQuery(
loadGlobalConfigQuery(ServerScope.local, sdk, Promise.resolve("v2")),
)
expect(result).toEqual({})
})
test("loads legacy global config for v1 servers", async () => {
const calls: string[] = []
const config = { shell: "zsh" } satisfies Config
const sdk = {
global: {
config: {
get: async () => {
calls.push("global")
return { data: config }
},
},
},
} as unknown as OpencodeClient
const result = await new QueryClient().fetchQuery(
loadGlobalConfigQuery(ServerScope.local, sdk, Promise.resolve("v1")),
)
expect(result).toEqual(config)
expect(calls).toEqual(["global"])
})
})
describe("query keys", () => {
@@ -105,10 +105,13 @@ function showErrors(input: {
})
}
export const loadGlobalConfigQuery = (scope: ServerScope, sdk: OpencodeClient) =>
export const loadGlobalConfigQuery = (scope: ServerScope, sdk: OpencodeClient, protocol?: Promise<ServerProtocol>) =>
queryOptions({
queryKey: [scope, "config"],
queryFn: () => retry(() => sdk.global.config.get().then((x) => x.data!)),
queryFn: async () => {
if ((await protocol) !== "v1") return {}
return retry(() => sdk.global.config.get().then((x) => x.data!))
},
})
type ProjectApi = {
@@ -149,7 +152,7 @@ export async function bootstrapGlobal(input: {
queryClient: QueryClient
}) {
const slow = [
() => input.queryClient.fetchQuery(loadGlobalConfigQuery(input.scope, input.serverSDK)),
() => input.queryClient.fetchQuery(loadGlobalConfigQuery(input.scope, input.serverSDK, input.protocol)),
() =>
input.queryClient.fetchQuery(
loadProvidersQuery(input.scope, null, input.serverAPI, input.serverSDK, input.protocol),
@@ -376,7 +379,10 @@ export async function bootstrapDirectory(input: {
.ensureQueryData(loadAgentsQuery(input.scope, input.directory, input.api.agent, input.sdk, input.protocol))
.then((data) => input.setStore("agent", data)),
() =>
retry(() => input.sdk.config.get().then((x) => input.setStore("config", reconcile(x.data!, { merge: false })))),
retry(async () => {
if ((await input.protocol) !== "v1") return
return input.sdk.config.get().then((x) => input.setStore("config", reconcile(x.data!, { merge: false })))
}),
() =>
retry(() =>
(async () => {
+87 -5
View File
@@ -25,6 +25,18 @@ export type Locale =
| "th"
| "bs"
| "tr"
| "hi"
| "nl"
| "id"
| "vi"
| "it"
| "ur"
| "pa"
| "az"
| "fi"
| "sv"
const RTL_LOCALES: ReadonlySet<Locale> = new Set(["ar", "ur", "pa"])
type RawDictionary = typeof en & typeof uiEn
type Dictionary = i18n.Flatten<RawDictionary>
@@ -53,6 +65,16 @@ const LOCALES: readonly Locale[] = [
"br",
"th",
"tr",
"hi",
"nl",
"id",
"vi",
"it",
"ur",
"pa",
"az",
"fi",
"sv",
]
const INTL: Record<Locale, string> = {
@@ -74,9 +96,19 @@ const INTL: Record<Locale, string> = {
th: "th",
bs: "bs",
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",
}
const LABEL_KEY: Record<Locale, keyof Dictionary> = {
const LABEL_KEY: Partial<Record<Locale, keyof Dictionary>> = {
en: "language.en",
zh: "language.zh",
zht: "language.zht",
@@ -97,6 +129,19 @@ const LABEL_KEY: Record<Locale, keyof Dictionary> = {
tr: "language.tr",
}
const LABEL: Partial<Record<Locale, string>> = {
hi: "हिन्दी",
nl: "Nederlands",
id: "Bahasa Indonesia",
vi: "Tiếng Việt",
it: "Italiano",
ur: "اردو",
pa: "پنجابی",
az: "Azərbaycanca",
fi: "Suomi",
sv: "Svenska",
}
const base = i18n.flatten({ ...en, ...uiEn })
const dicts = new Map<Locale, Dictionary>([["en", base]])
@@ -121,6 +166,16 @@ const loaders: Record<Exclude<Locale, "en">, () => Promise<Dictionary>> = {
th: () => merge(import("@/i18n/th"), import("@opencode-ai/ui/i18n/th")),
bs: () => merge(import("@/i18n/bs"), import("@opencode-ai/ui/i18n/bs")),
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")),
}
function loadDict(locale: Locale) {
@@ -140,7 +195,12 @@ export function loadLocaleDict(locale: Locale) {
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: "zht",
match: (language) =>
language.startsWith("zh") &&
(language.includes("hant") || language.includes("-tw") || language.includes("-hk") || language.includes("-mo")),
},
{ locale: "zh", match: (language) => language.startsWith("zh") },
{ locale: "ko", match: (language) => language.startsWith("ko") },
{ locale: "de", match: (language) => language.startsWith("de") },
@@ -160,6 +220,22 @@ const localeMatchers: Array<{ locale: Locale; match: (language: string) => boole
{ locale: "th", match: (language) => language.startsWith("th") },
{ locale: "bs", match: (language) => language.startsWith("bs") },
{ locale: "tr", match: (language) => language.startsWith("tr") },
{ locale: "hi", match: (language) => language.startsWith("hi") },
{ locale: "nl", match: (language) => language.startsWith("nl") },
{ locale: "id", match: (language) => language.startsWith("id") },
{ locale: "vi", match: (language) => language.startsWith("vi") },
{ locale: "it", match: (language) => language.startsWith("it") },
{ locale: "ur", match: (language) => language.startsWith("ur") },
{
locale: "pa",
match: (language) => language.startsWith("pa") && (language.includes("arab") || language.includes("-pk")),
},
{
locale: "az",
match: (language) => language.startsWith("az") && !language.includes("arab") && !language.includes("cyrl"),
},
{ locale: "fi", match: (language) => language.startsWith("fi") },
{ locale: "sv", match: (language) => language.startsWith("sv") },
]
function detectLocale(): Locale {
@@ -220,12 +296,18 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
params?: Record<string, string | number | boolean>,
) => string
const label = (value: Locale) => t(LABEL_KEY[value])
const label = (value: Locale) => {
const key = LABEL_KEY[value]
if (key) return t(key)
return LABEL[value] ?? value
}
createEffect(() => {
if (typeof document !== "object") return
document.documentElement.lang = locale()
document.cookie = cookie(locale())
const value = locale()
document.documentElement.lang = value
document.documentElement.dir = RTL_LOCALES.has(value) ? "rtl" : "ltr"
document.cookie = cookie(value)
})
return {
+8 -3
View File
@@ -1,6 +1,6 @@
import { createStore, reconcile } from "solid-js/store"
import { type Accessor, batch, createEffect, createMemo, createRoot, getOwner, onCleanup } from "solid-js"
import { useParams, useSearchParams } from "@solidjs/router"
import { useNavigate, useParams, useSearchParams } from "@solidjs/router"
import { createSimpleContext } from "@opencode-ai/ui/context"
import type { ServerSDK } from "./server-sdk"
import type { ServerSync } from "./server-sync"
@@ -118,6 +118,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const global = useGlobal()
const server = useServer()
const tabs = useTabs()
const navigate = useNavigate()
const platform = usePlatform()
const settings = useSettings()
const language = useLanguage()
@@ -153,6 +154,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
platform,
settings,
language,
navigate,
}),
}),
owner ?? undefined,
@@ -217,6 +219,7 @@ function createServerNotificationState(input: {
platform: ReturnType<typeof usePlatform>
settings: ReturnType<typeof useSettings>
language: ReturnType<typeof useLanguage>
navigate: (href: string) => void
}) {
const serverSDK = () => input.sdk
const serverSync = () => input.sync
@@ -353,7 +356,9 @@ function createServerNotificationState(input: {
const href = `/${base64Encode(directory)}/session/${sessionID}`
if (settings.notifications.agent()) {
void platform.notify(language.t("notification.session.responseReady.title"), session.title ?? sessionID, href)
void platform.notify(language.t("notification.session.responseReady.title"), session.title ?? sessionID, () =>
input.navigate(href),
)
}
})
}
@@ -386,7 +391,7 @@ function createServerNotificationState(input: {
(typeof error === "string" ? error : language.t("notification.session.error.fallbackDescription"))
const href = sessionID ? `/${base64Encode(directory)}/session/${sessionID}` : `/${base64Encode(directory)}`
if (settings.notifications.errors()) {
void platform.notify(language.t("notification.session.error.title"), description, href)
void platform.notify(language.t("notification.session.error.title"), description, () => input.navigate(href))
}
})
}
+11 -13
View File
@@ -5,6 +5,7 @@ import type { DesktopMenuAction } from "../desktop-menu"
import { ServerConnection } from "./server"
import type { WslServersPlatform } from "../wsl/types"
import type { UpdaterPlatform } from "../updater"
import type { DraftStore } from "@/utils/draft-store"
type PickerPaths = string | string[] | null
type OpenDirectoryPickerOptions = { title?: string; multiple?: boolean }
@@ -31,26 +32,23 @@ type PlatformBase = {
/** App version */
version?: string
/** Open a URL in the default browser */
openLink(url: string): void
/** Open a web or mail URL in the default system application */
openExternal(url: string): void
/** Open a local path in a local app (desktop only) */
openPath?(path: string, app?: string): Promise<void>
/** Open a local file URL in its default app (desktop only) */
openLocalFile?(url: string): void
/** Reveal a local path in the system file manager; false when the path does not exist (desktop only) */
revealPath?(path: string): Promise<boolean>
/** Restart the app */
restart(): Promise<void>
/** Navigate back in history */
back(): void
/** Navigate forward in history */
forward(): void
/** Send a system notification (optional deep link) */
notify(title: string, description?: string, href?: string): Promise<void>
/** Send a system notification */
notify(title: string, description?: string, onClick?: () => void): Promise<void>
/** Open a native attachment picker and read selected files sequentially (desktop only) */
openAttachmentPickerDialog?(
@@ -67,6 +65,9 @@ type PlatformBase = {
/** Storage mechanism, defaults to localStorage */
storage?: (name?: string) => SyncStorage | AsyncStorage
/** Prompt drafts, history, and their blobs. */
draftStore?: DraftStore
/** Stable platform window identity for window-scoped persistence */
windowID?: string
@@ -91,9 +92,6 @@ type PlatformBase = {
/** Set the preferred display backend (desktop only) */
setDisplayBackend?(backend: DisplayBackend): Promise<void>
/** Parse markdown to HTML using native parser (desktop only, returns unprocessed code blocks) */
parseMarkdown?(markdown: string): Promise<string>
/** Webview zoom level (desktop only) */
webviewZoom?: Accessor<number>
+5 -4
View File
@@ -5,6 +5,7 @@ import { createStore, type SetStoreFunction } from "solid-js/store"
import type { FileSelection } from "@/context/file"
import { Persist, persisted } from "@/utils/persist"
import type { ServerScope } from "@/utils/server-scope"
import type { BlobReference } from "@/utils/draft-store"
interface PartBase {
content: string
@@ -37,7 +38,7 @@ export interface ImageAttachmentPart {
filename: string
sourcePath?: string
mime: string
dataUrl: string
blob: BlobReference
}
export type ContentPart = TextPart | FileAttachmentPart | AgentPart | ImageAttachmentPart
@@ -168,9 +169,9 @@ function createPromptActions(setStore: SetStoreFunction<PromptStore>) {
}
function promptTarget(serverScope: ServerScope, scope: PromptScope) {
if ("draftID" in scope) return Persist.draft(scope.draftID, "prompt")
if ("draftID" in scope) return Persist.prompt(Persist.draft(scope.draftID, "prompt"))
const legacy = `${scope.dir}/prompt${scope.id ? "/" + scope.id : ""}.v2`
return Persist.serverScoped(serverScope, scope.dir, scope.id, "prompt", [legacy])
return Persist.prompt(Persist.serverScoped(serverScope, scope.dir, scope.id, "prompt", [legacy]))
}
function promptStore(initial?: InitialPrompt): PromptStore {
@@ -245,7 +246,7 @@ export function createPromptSession(serverScope: ServerScope, scope: PromptScope
}
export function createDraftPromptSession(draftID: string, initial?: InitialPrompt) {
return createPersistedPrompt(Persist.draft(draftID, "prompt"), initial)
return createPersistedPrompt(Persist.prompt(Persist.draft(draftID, "prompt")), initial)
}
export type PromptSession = ReturnType<typeof createPromptSession>
+1 -1
View File
@@ -184,7 +184,7 @@ function makeQueryOptionsApi(
protocol: Promise<"v1" | "v2">,
) {
return {
globalConfig: () => loadGlobalConfigQuery(scope, serverSDK()),
globalConfig: () => loadGlobalConfigQuery(scope, serverSDK(), protocol),
projects: () => loadProjectsQuery(scope, serverAPI.project),
providers: (directory: PathKey | null) =>
loadProvidersQuery(scope, directory, serverAPI, directory ? sdkFor(directory) : serverSDK(), protocol),
+4 -1
View File
@@ -101,7 +101,10 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
}
const removeDraftPersisted = (draftID: string) => {
for (const key of draftPersistedKeys()) removePersisted(Persist.draft(draftID, key), platform)
for (const key of draftPersistedKeys()) {
const target = Persist.draft(draftID, key)
removePersisted(key === "prompt" ? Persist.prompt(target) : target, platform)
}
}
const removeInfo = (key: string) => {
+11 -16
View File
@@ -4,9 +4,9 @@ import * as Sentry from "@sentry/solid"
import { render } from "solid-js/web"
import { AppBaseProviders, AppInterface } from "@/app"
import { type Platform, PlatformProvider } from "@/context/platform"
import { createBrowserDraftStore } from "@/utils/draft-store"
import { dict as en } from "@/i18n/en"
import { dict as zh } from "@/i18n/zh"
import { handleNotificationClick } from "@/utils/notification-click"
import { authFromToken } from "@/utils/server"
import pkg from "../package.json"
import { ServerConnection } from "./context/server"
@@ -54,7 +54,7 @@ const setStorage = (key: string, value: string | null) => {
const readDefaultServerUrl = () => getStorage(DEFAULT_SERVER_URL_KEY)
const writeDefaultServerUrl = (url: string | null) => setStorage(DEFAULT_SERVER_URL_KEY, url)
const notify: Platform["notify"] = async (title, description, href) => {
const notify: Platform["notify"] = async (title, description, onClick) => {
if (!("Notification" in window)) return
const permission =
@@ -73,21 +73,17 @@ const notify: Platform["notify"] = async (title, description, href) => {
})
notification.onclick = () => {
handleNotificationClick(href)
window.focus()
onClick?.()
notification.close()
}
}
const openLink: Platform["openLink"] = (url) => {
window.open(url, "_blank")
}
const back: Platform["back"] = () => {
window.history.back()
}
const forward: Platform["forward"] = () => {
window.history.forward()
const openExternal: Platform["openExternal"] = (value) => {
if (!URL.canParse(value)) return
const url = new URL(value)
if (url.protocol !== "http:" && url.protocol !== "https:" && url.protocol !== "mailto:") return
window.open(url.href, "_blank", "noopener,noreferrer")
}
const restart: Platform["restart"] = async () => {
@@ -121,10 +117,9 @@ const clearAuthToken = () => {
const platform: Platform = {
platform: "web",
draftStore: createBrowserDraftStore(),
version: pkg.version,
openLink,
back,
forward,
openExternal,
restart,
notify,
getDefaultServer: async () => {
+88 -82
View File
@@ -59,16 +59,16 @@ export const dict = {
"command.message.next.description": "انتقل إلى رسالة المستخدم التالية",
"command.model.choose": "اختيار نموذج",
"command.model.choose.description": "حدد نموذجًا مختلفًا",
"command.mcp.toggle": "تبديل MCPs",
"command.mcp.toggle.description": "تبديل MCPs",
"command.mcp.toggle": "تبديل خوادم MCP",
"command.mcp.toggle.description": "تبديل خوادم MCP",
"command.agent.cycle": "تغيير الوكيل",
"command.agent.cycle.description": "التبديل إلى الوكيل التالي",
"command.agent.cycle.reverse": "تغيير الوكيل للخلف",
"command.agent.cycle.reverse.description": "التبديل إلى الوكيل السابق",
"command.model.variant.cycle": "تغيير جهد التفكير",
"command.model.variant.cycle": "تغيير جهد الاستدلال",
"command.model.variant.cycle.description": "التبديل إلى مستوى الجهد التالي",
"command.prompt.mode.shell": "Shell",
"command.prompt.mode.normal": "Prompt",
"command.prompt.mode.normal": "موجّه",
"command.permissions.autoaccept.enable": "قبول الأذونات تلقائيًا",
"command.permissions.autoaccept.disable": "إيقاف قبول الأذونات تلقائيًا",
"command.workspace.toggle": "تبديل مساحات العمل",
@@ -94,13 +94,14 @@ export const dict = {
"dialog.provider.empty": "لم يتم العثور على موفرين",
"dialog.provider.group.popular": "شائع",
"dialog.provider.group.other": "آخر",
"dialog.provider.custom.label": "موفر مخصص متوافق مع OpenAI",
"dialog.provider.tag.recommended": "موصى به",
"dialog.provider.opencode.note": "نماذج مختارة تتضمن Claude و GPT و Gemini والمزيد",
"dialog.provider.opencode.tagline": "نماذج موثوقة ومحسنة",
"dialog.provider.opencodeGo.tagline": "اشتراك منخفض التكلفة للجميع",
"dialog.provider.anthropic.note": "اتصل باستخدام Claude Pro/Max أو مفتاح API",
"dialog.provider.copilot.note": "اتصل باستخدام Copilot أو مفتاح API",
"dialog.provider.openai.note": "اتصل باستخدام ChatGPT Pro/Plus أو مفتاح API",
"dialog.provider.anthropic.note": "وصول مباشر إلى نماذج Claude، بما فيها Pro و Max",
"dialog.provider.copilot.note": "نماذج ذكاء اصطناعي للمساعدة في البرمجة عبر GitHub Copilot",
"dialog.provider.openai.note": "نماذج GPT لمهام الذكاء الاصطناعي العامة السريعة والمتقدمة",
"dialog.provider.google.note": "نماذج Gemini لاستجابات سريعة ومنظمة",
"dialog.provider.openrouter.note": "الوصول إلى جميع النماذج المدعومة من موفر واحد",
"dialog.provider.vercel.note": "وصول موحد إلى نماذج الذكاء الاصطناعي مع توجيه ذكي",
@@ -112,8 +113,9 @@ export const dict = {
"dialog.model.manage.provider.toggle": "تبديل جميع نماذج {{provider}}",
"dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode",
"dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين",
"dialog.model.unpaid.viewMoreProviders": "عرض أكثر من 70 موفرًا إضافيًا",
"dialog.provider.viewAll": "عرض المزيد من الموفرين",
"provider.connect.title": "اتصال {{provider}}",
"provider.connect.title": "الاتصال بـ {{provider}}",
"provider.connect.title.anthropicProMax": "تسجيل الدخول باستخدام Claude Pro/Max",
"provider.connect.selectMethod": "حدد طريقة تسجيل الدخول لـ {{provider}}.",
"provider.connect.method.apiKey": "مفتاح API",
@@ -121,8 +123,8 @@ export const dict = {
"provider.connect.status.waiting": "في انتظار التفويض...",
"provider.connect.status.failed": "فشل التفويض: {{error}}",
"provider.connect.apiKey.description":
"أدخل مفتاح واجهة برمجة تطبيقات {{provider}} الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
"provider.connect.apiKey.label": "مفتاح واجهة برمجة تطبيقات {{provider}}",
"أدخل مفتاح API الخاص بـ {{provider}} لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
"provider.connect.apiKey.label": "مفتاح API لـ {{provider}}",
"provider.connect.apiKey.placeholder": "مفتاح API",
"provider.connect.apiKey.required": "مفتاح API مطلوب",
"provider.connect.opencodeZen.line1":
@@ -196,26 +198,26 @@ export const dict = {
"model.input.image": "صورة",
"model.input.audio": "صوت",
"model.input.video": "فيديو",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "يسمح: {{inputs}}",
"model.tooltip.context.label": "السياق",
"model.tooltip.inputs": "المدخلات",
"model.tooltip.model": "النموذج",
"model.tooltip.provider": "الموفر",
"model.tooltip.reasoning": "الاستنتاج",
"model.tooltip.reasoning.allowed": سمح بالاستنتاج",
"model.tooltip.reasoning.none": "بدون استنتاج",
"model.tooltip.reasoning": "الاستدلال",
"model.tooltip.reasoning.allowed": دعم الاستدلال",
"model.tooltip.reasoning.none": "بدون استدلال",
"model.tooltip.context": "حد السياق {{limit}}",
"common.search.placeholder": "بحث",
"common.goBack": "رجوع",
"common.goForward": "انتقل للأمام",
"common.goForward": "التقدم",
"common.loading": "جارٍ التحميل",
"common.loading.ellipsis": "...",
"common.cancel": "إلغاء",
"common.clear": "مسح",
"common.connect": "اتصال",
"common.disconnect": "قطع الاتصال",
"common.continue": "إرسال",
"common.continue": "متابعة",
"common.submit": "إرسال",
"common.save": "حفظ",
"common.saving": "جارٍ الحفظ...",
@@ -227,7 +229,7 @@ export const dict = {
"prompt.placeholder.summarizeComments": "لخّص التعليقات…",
"prompt.placeholder.summarizeComment": "لخّص التعليق…",
"prompt.mode.shell": "Shell",
"prompt.mode.normal": "Prompt",
"prompt.mode.normal": "موجّه",
"prompt.mode.shell.exit": "esc للخروج",
"session.child.promptDisabled": "لا يمكن إرسال موجّهات إلى جلسات الوكلاء الفرعيين.",
"session.child.backToParent": "العودة إلى الجلسة الرئيسية.",
@@ -249,17 +251,17 @@ export const dict = {
"prompt.example.16": "إضافة معالجة الأخطاء لهذه الدالة",
"prompt.example.17": "اشرح نمط regex هذا",
"prompt.example.18": "تحويل هذا إلى TypeScript",
"prompt.example.19": "إضافة تسجيل الدخول (logging) في جميع أنحاء قاعدة التعليمات البرمجية",
"prompt.example.19": "إضافة التسجيل في جميع أنحاء قاعدة التعليمات البرمجية",
"prompt.example.20": "ما هي التبعيات القديمة؟",
"prompt.example.21": "ساعدني في كتابة برنامج نصي للهجرة",
"prompt.example.22": "تنفيذ التخزين المؤقت لهذه النقطة النهائية",
"prompt.example.21": "ساعدني في كتابة برنامج نصي للترحيل",
"prompt.example.22": "تنفيذ التخزين المؤقت لنقطة النهاية هذه",
"prompt.example.23": "إضافة ترقيم الصفحات إلى هذه القائمة",
"prompt.example.24": "إنشاء أمر CLI لـ...",
"prompt.example.25": "كيف تعمل متغيرات البيئة هنا؟",
"prompt.popover.emptyResults": "لا توجد نتائج مطابقة",
"prompt.popover.emptyCommands": "لا توجد أوامر مطابقة",
"prompt.dropzone.label": "أفلت الصور أو ملفات PDF أو الملفات النصية هنا",
"prompt.dropzone.file.label": "أفلت لإشارة @ للملف",
"prompt.dropzone.file.label": "أفلت الملف للإشارة إليه باستخدام @",
"prompt.slash.badge.custom": "مخصص",
"prompt.slash.badge.skill": "مهارة",
"prompt.slash.badge.mcp": "mcp",
@@ -267,7 +269,7 @@ export const dict = {
"prompt.context.includeActiveFile": "تضمين الملف النشط",
"prompt.context.removeActiveFile": "إزالة الملف النشط من السياق",
"prompt.context.removeFile": "إزالة الملف من السياق",
"prompt.action.attachFile": رفاق ملف",
"prompt.action.attachFile": ضافة ملفات",
"prompt.menu.addImagesAndFiles": "إضافة ملفات والمزيد",
"prompt.menu.imagesAndFiles": "الصور والملفات",
"prompt.menu.commands": "الأوامر",
@@ -275,7 +277,7 @@ export const dict = {
"prompt.menu.shellCommand": "أمر shell",
"prompt.attachment.remove": "إزالة المرفق",
"prompt.action.send": "إرسال",
"prompt.action.stop": "توقف",
"prompt.action.stop": "إيقاف",
"prompt.toast.pasteUnsupported.title": "مرفق غير مدعوم",
"prompt.toast.attachmentDuplicate.title": "تم تحميل هذا الملف بالفعل",
"prompt.toast.pasteUnsupported.description": "يمكن إرفاق الصور أو ملفات PDF أو الملفات النصية فقط هنا.",
@@ -287,10 +289,10 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "فشل إرسال الأمر",
"prompt.toast.promptSendFailed.title": "فشل إرسال الموجه",
"prompt.toast.promptSendFailed.description": "تعذر استرداد الجلسة",
"dialog.mcp.title": "MCPs",
"dialog.mcp.description": "{{enabled}} من {{total}} مفعل",
"dialog.mcp.empty": "لم يتم تكوين MCPs",
"dialog.lsp.empty": م الكشف تلقائيًا عن LSPs من أنواع الملفات",
"dialog.mcp.title": "خوادم MCP",
"dialog.mcp.description": "تم تفعيل {{enabled}} من أصل {{total}}",
"dialog.mcp.empty": "لم يتم تكوين أي خوادم MCP",
"dialog.lsp.empty": ُكتشف خوادم LSP تلقائيًا من أنواع الملفات",
"dialog.plugins.empty": "الإضافات المكونة في opencode.json",
"mcp.status.connected": "متصل",
"mcp.status.failed": "فشل",
@@ -409,35 +411,35 @@ export const dict = {
"dialog.project.edit.icon.recommended": "موصى به: 128x128px",
"dialog.project.edit.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.placeholder": "مثال: bun install",
"context.breakdown.title": "تفصيل السياق",
"context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال. يشمل "أخرى" تعريفات الأدوات والنفقات العامة.',
"context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال المميزة. يشمل "أخرى" تعريفات الأدوات والأعباء الإضافية.',
"context.breakdown.system": "النظام",
"context.breakdown.user": "المستخدم",
"context.breakdown.assistant": "المساعد",
"context.breakdown.tool": "استدعاءات الأداة",
"context.breakdown.tool": "استدعاءات الأدوات",
"context.breakdown.other": "أخرى",
"context.systemPrompt.title": "موجه النظام",
"context.systemPrompt.title": "موجّه النظام",
"context.rawMessages.title": "الرسائل الخام",
"context.stats.session": "جلسة",
"context.stats.messages": "رسائل",
"context.stats.provider": "موفر",
"context.stats.model": "نموذج",
"context.stats.limit": "حد السياق",
"context.stats.totalTokens": "إجمالي الرموز",
"context.stats.totalTokens": "إجمالي الرموز المميزة",
"context.stats.usage": "استخدام",
"context.stats.inputTokens": "رموز الإدخال",
"context.stats.outputTokens": "رموز الإخراج",
"context.stats.reasoningTokens": "رموز الاستنتاج",
"context.stats.cacheTokens": "رموز التخزين المؤقت (قراءة/كتابة)",
"context.stats.inputTokens": "رموز الإدخال المميزة",
"context.stats.outputTokens": "رموز الإخراج المميزة",
"context.stats.reasoningTokens": "رموز الاستدلال المميزة",
"context.stats.cacheTokens": "رموز التخزين المؤقت المميزة (قراءة/كتابة)",
"context.stats.userMessages": "رسائل المستخدم",
"context.stats.assistantMessages": "رسائل المساعد",
"context.stats.totalCost": "التكلفة الإجمالية",
"context.stats.sessionCreated": "تم إنشاء الجلسة",
"context.stats.lastActivity": "آخر نشاط",
"context.usage.tokens": "رموز",
"context.usage.tokens": "الرموز المميزة",
"context.usage.usage": "استخدام",
"context.usage.cost": "تكلفة",
"context.usage.clickToView": "انقر لعرض السياق",
@@ -465,9 +467,9 @@ export const dict = {
"toast.theme.title": "تم تبديل السمة",
"toast.scheme.title": "مخطط الألوان",
"toast.workspace.enabled.title": "تم تمكين مساحات العمل",
"toast.workspace.enabled.description": "الآن يتم عرض عدة worktrees في الشريط الجانبي",
"toast.workspace.enabled.description": "تُعرض الآن عدة أشجار عمل في الشريط الجانبي",
"toast.workspace.disabled.title": "تم تعطيل مساحات العمل",
"toast.workspace.disabled.description": "يتم عرض worktree الرئيسي فقط في الشريط الجانبي",
"toast.workspace.disabled.description": "تُعرض شجرة العمل الرئيسية فقط في الشريط الجانبي",
"toast.permissions.autoaccept.on.title": "يتم قبول الأذونات تلقائيًا",
"toast.permissions.autoaccept.on.description": "ستتم الموافقة على طلبات الأذونات تلقائيًا",
"toast.permissions.autoaccept.off.title": "تم إيقاف قبول الأذونات تلقائيًا",
@@ -489,7 +491,7 @@ export const dict = {
"toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة",
"toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}",
"toast.update.title": "تحديث متاح",
"toast.update.description": "نسخة جديدة من OpenCode ({{version}}) متاحة الآن للتثبيت.",
"toast.update.description": "يتوفر الآن إصدار جديد من OpenCode ({{version}}) للتثبيت.",
"toast.update.action.installRestart": "تثبيت وإعادة تشغيل",
"toast.update.action.notYet": "ليس الآن",
"error.page.title": "حدث خطأ ما",
@@ -509,7 +511,7 @@ export const dict = {
"error.dev.rootNotFound":
"لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
"error.serverSync.connectFailed": "تعذر الاتصال بالخادم. هل هناك خادم يعمل في `{{url}}`؟",
"directory.error.invalidUrl": ليل غير صالح في عنوان URL.",
"directory.error.invalidUrl": "مجلد غير صالح في عنوان URL.",
"error.chain.unknown": "خطأ غير معروف",
"error.chain.causedBy": "بسبب:",
"error.chain.apiError": "خطأ API",
@@ -537,7 +539,7 @@ export const dict = {
"notification.session.responseReady.title": "الاستجابة جاهزة",
"notification.session.error.title": "خطأ في الجلسة",
"notification.session.error.fallbackDescription": "حدث خطأ",
"home.recentProjects": "المشاريع الحديثة",
"home.recentProjects": "المشاريع الأخيرة",
"home.empty.title": "لا توجد مشاريع حديثة",
"home.empty.description": "ابدأ بفتح مشروع محلي",
"home.title": "الرئيسية",
@@ -555,7 +557,7 @@ export const dict = {
"home.sessions.group.today": "اليوم",
"home.sessions.group.yesterday": "أمس",
"home.sessions.group.older": "الأقدم",
"home.providerTip": "اتصل بأكثر من 75 مزودًا لاستخدام نماذج أخرى، بما فيها Claude وGPT وGemini وغيرها",
"home.providerTip": "اتصل بأكثر من 75 موفرًا لاستخدام نماذج أخرى، بما فيها Claude وGPT وGemini وغيرها",
"session.tab.session": "جلسة",
"session.tab.review": "مراجعة",
"session.tab.context": "سياق",
@@ -565,7 +567,7 @@ export const dict = {
"session.error.notFound.description": "يشير هذا التبويب إلى جلسة لم تعد موجودة على هذا الخادم.",
"session.error.notFound.closeTab": "إغلاق علامة التبويب",
"session.error.serverConnection": "تعذر الاتصال بهذا الخادم",
"session.review.filesChanged": "تم تغيير {{count}} ملفات",
"session.review.filesChanged": "الملفات المتغيرة: {{count}}",
"session.review.change.one": "تغيير",
"session.review.change.other": "تغييرات",
"session.review.loadingChanges": "جارٍ تحميل التغييرات...",
@@ -573,7 +575,7 @@ export const dict = {
"session.review.noChanges": "لا توجد تغييرات",
"session.review.noUncommittedChanges": "لا توجد تغييرات غير مُودَعة بعد",
"session.review.noBranchChanges": "لا توجد تغييرات في الفرع بعد",
"session.review.noVcs": "لم يتم اكتشاف نظام التحكم في الإصدار Git، لن يتم عرض التغييرات",
"session.review.noVcs": "لم يُكتشف نظام Git للتحكم في الإصدارات، لذا لن تُعرض التغييرات",
"session.review.noSnapshot": "تم تعطيل تتبع اللقطات في التكوين، لذا فإن تغييرات الجلسة غير متوفرة",
"session.files.selectToOpen": "اختر ملفًا لفتحه",
"session.files.all": "كل الملفات",
@@ -592,8 +594,8 @@ export const dict = {
"session.question.restore": "استعادة السؤال",
"session.question.pending.one": "{{count}} سؤال معلق",
"session.question.pending.other": "الأسئلة المعلقة: {{count}}",
"session.followupDock.summary.one": "{{count}} رسالة في الانتظار",
"session.followupDock.summary.other": "{{count}} رسائل في الانتظار",
"session.followupDock.summary.one": "{{count}} رسالة في قائمة الانتظار",
"session.followupDock.summary.other": "{{count}} رسائل في قائمة الانتظار",
"session.followupDock.sendNow": "إرسال الآن",
"session.followupDock.edit": "تحرير",
"session.followupDock.collapse": "طي الرسائل المنتظرة",
@@ -651,10 +653,10 @@ export const dict = {
"terminal.connectionLost.title": "فقد الاتصال",
"terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
"common.closeTab": "إغلاق علامة التبويب",
"common.dismiss": "رفض",
"common.dismiss": "إهمال",
"common.requestFailed": "فشل الطلب",
"common.moreOptions": "مزيد من الخيارات",
"common.learnMore": "اعرف المزيد",
"common.learnMore": "اطّلع على المزيد",
"common.rename": "إعادة تسمية",
"common.reset": "إعادة تعيين",
"common.archive": "أرشفة",
@@ -672,7 +674,7 @@ export const dict = {
"sidebar.gettingStarted.title": "البدء",
"sidebar.gettingStarted.line1": "يتضمن OpenCode نماذج مجانية حتى تتمكن من البدء فورًا.",
"sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.",
"sidebar.project.recentSessions": "الجلسات الحديثة",
"sidebar.project.recentSessions": "الجلسات الأخيرة",
"sidebar.project.viewAllSessions": "عرض جميع الجلسات",
"sidebar.project.clearNotifications": "مسح الإشعارات",
"sidebar.empty.title": "لا توجد مشاريع مفتوحة",
@@ -691,7 +693,7 @@ export const dict = {
"settings.general.section.updates": "التحديثات",
"settings.general.section.sounds": "المؤثرات الصوتية",
"settings.general.section.feed": "الخلاصة",
"settings.general.section.display": "شاشة العرض",
"settings.general.section.display": "العرض",
"settings.general.row.language.title": "اللغة",
"settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode",
"settings.general.row.shell.title": "Shell المحطة الطرفية",
@@ -728,10 +730,11 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "التنقل السفلي",
"settings.general.row.mobileTitlebarBottom.description":
"وضع شريط العنوان وعلامات تبويب الجلسات أسفل الشاشة على الأجهزة المحمولة",
"settings.general.row.showCustomAgents.title": "الوكلاء المخصصون",
"settings.general.row.showCustomAgents.description": "إظهار محدد الوكلاء في محرر الرسائل",
"settings.general.row.reasoningSummaries.title": "إظهار ملخصات الاستنتاج",
"settings.general.row.reasoningSummaries.description": "عرض ملخصات استنتاج النموذج في الشريط الزمني",
"settings.general.row.showCustomAgents.title": "إظهار الوكيل",
"settings.general.row.showCustomAgents.description":
"التبديل بين الوكلاء في محرر الرسائل. عند إخفائه، يُستخدم وكيل Build افتراضيًا.",
"settings.general.row.reasoningSummaries.title": "إظهار ملخصات الاستدلال",
"settings.general.row.reasoningSummaries.description": "عرض ملخصات استدلال النموذج في الشريط الزمني",
"settings.general.row.shellToolPartsExpanded.title": "توسيع أجزاء أداة shell",
"settings.general.row.shellToolPartsExpanded.description":
"إظهار أجزاء أداة shell موسعة بشكل افتراضي في الشريط الزمني",
@@ -744,11 +747,12 @@ export const dict = {
"استخدم علامات التبويب الجديدة وتخطيط الصفحة الرئيسية. يمكنك التبديل بين التخطيطات لفترة محدودة.",
"settings.general.row.newInterfaceNotice.title": "أنت تستخدم الآن التخطيط الجديد",
"settings.general.row.newInterfaceNotice.description": "التخطيط السابق لم يعد متاحًا",
"settings.general.row.newInterfaceNotice.dismiss": "رفض",
"settings.general.row.pinchZoom.title": "التكبير بإيماءة القرص",
"settings.general.row.pinchZoom.description": "السماح بإيماءة القرص على لوحة اللمس وإيماءة Ctrl-scroll للتكبير",
"settings.general.row.newInterfaceNotice.dismiss": "إهمال",
"settings.general.row.pinchZoom.title": "التكبير بالمقاربة والمباعدة",
"settings.general.row.pinchZoom.description":
"السماح بإيماءات مقاربة الأصابع ومباعدتها على لوحة التعقب والتمرير مع الضغط على Ctrl للتكبير",
"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":
"على Linux مع شاشات بمعدلات تحديث مختلطة، يمكن أن يكون Wayland الأصلي أكثر استقرارًا.",
"settings.general.row.releaseNotes.title": "ملاحظات الإصدار",
@@ -761,7 +765,7 @@ export const dict = {
"settings.updates.action.checking": "جارٍ التحقق...",
"settings.updates.action.downloading": "جارٍ التنزيل...",
"settings.updates.action.installing": "جارٍ التثبيت...",
"settings.updates.toast.latest.title": "أنت على آخر إصدار",
"settings.updates.toast.latest.title": "لديك أحدث إصدار",
"settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من OpenCode.",
"sound.option.none": "بلا",
"sound.option.alert01": "تنبيه 01",
@@ -823,17 +827,17 @@ export const dict = {
"settings.general.sounds.errors.description": "تشغيل صوت عند حدوث خطأ",
"settings.shortcuts.title": "اختصارات لوحة المفاتيح",
"settings.shortcuts.reset.button": "إعادة التعيين إلى الافتراضيات",
"settings.shortcuts.reset.toast.title": "تم إعادة تعيين الاختصارات",
"settings.shortcuts.reset.toast.description": "تم إعادة تعيين اختصارات لوحة المفاتيح إلى الافتراضيات.",
"settings.shortcuts.reset.toast.title": "أُعيد تعيين الاختصارات",
"settings.shortcuts.reset.toast.description": "أُعيد تعيين اختصارات لوحة المفاتيح إلى الإعدادات الافتراضية.",
"settings.shortcuts.conflict.title": "الاختصار قيد الاستخدام بالفعل",
"settings.shortcuts.conflict.description": "{{keybind}} معين بالفعل لـ {{titles}}.",
"settings.shortcuts.unassigned": "غير معين",
"settings.shortcuts.conflict.description": "الاختصار {{keybind}} مخصص بالفعل لـ {{titles}}.",
"settings.shortcuts.unassigned": "غير مخصص",
"settings.shortcuts.pressKeys": "اضغط على المفاتيح",
"settings.shortcuts.search.placeholder": "البحث في الاختصارات",
"settings.shortcuts.search.empty": "لم يتم العثور على اختصارات",
"settings.shortcuts.group.general": "عام",
"settings.shortcuts.group.session": "جلسة",
"settings.shortcuts.group.navigation": "تصفح",
"settings.shortcuts.group.navigation": "التنقل",
"settings.shortcuts.group.modelAndAgent": "النموذج والوكيل",
"settings.shortcuts.group.terminal": "المحطة الطرفية",
"settings.shortcuts.group.prompt": "موجه",
@@ -858,19 +862,18 @@ export const dict = {
"settings.permissions.description": "تحكم في الأدوات التي يمكن للخادم استخدامها بشكل افتراضي.",
"settings.permissions.section.tools": "الأدوات",
"settings.permissions.toast.updateFailed.title": "فشل تحديث الأذونات",
"settings.permissions.action.allow": "سماح",
"settings.permissions.action.ask": "سؤال",
"settings.permissions.action.deny": "رفض",
"settings.permissions.action.allow": "السماح",
"settings.permissions.action.ask": "طلب الإذن",
"settings.permissions.action.deny": "الرفض",
"settings.permissions.tool.read.title": "قراءة",
"settings.permissions.tool.read.description": "قراءة ملف (يطابق مسار الملف)",
"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.description": "مطابقة الملفات باستخدام أنماط glob",
"settings.permissions.tool.grep.title": "Grep",
"settings.permissions.tool.grep.description": "البحث في محتويات الملف باستخدام التعبيرات العادية",
"settings.permissions.tool.list.title": "قائمة",
"settings.permissions.tool.list.title": "سرد",
"settings.permissions.tool.list.description": "سرد الملفات داخل دليل",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "تشغيل أوامر shell",
@@ -888,7 +891,7 @@ export const dict = {
"settings.permissions.tool.websearch.description": "البحث في الويب",
"settings.permissions.tool.external_directory.title": "دليل خارجي",
"settings.permissions.tool.external_directory.description": "الوصول إلى الملفات خارج دليل المشروع",
"settings.permissions.tool.doom_loop.title": "حلقة الموت",
"settings.permissions.tool.doom_loop.title": "حلقة مفرغة",
"settings.permissions.tool.doom_loop.description": "اكتشاف استدعاءات الأدوات المتكررة بمدخلات متطابقة",
"session.delete.failed.title": "فشل حذف الجلسة",
"session.delete.title": "حذف الجلسة",
@@ -896,7 +899,7 @@ export const dict = {
"session.delete.button": "حذف الجلسة",
"workspace.new": "مساحة عمل جديدة",
"workspace.type.local": "محلي",
"workspace.type.sandbox": "صندوق رمل",
"workspace.type.sandbox": "بيئة معزولة",
"workspace.create.failed.title": "فشل إنشاء مساحة العمل",
"workspace.delete.failed.title": "فشل حذف مساحة العمل",
"workspace.resetting.title": "إعادة تعيين مساحة العمل",
@@ -906,7 +909,7 @@ export const dict = {
"workspace.reset.success.description": "مساحة العمل تطابق الآن الفرع الافتراضي.",
"workspace.error.stillPreparing": "مساحة العمل لا تزال قيد الإعداد",
"workspace.status.checking": "التحقق من التغييرات غير المدمجة...",
"workspace.status.error": "تعذر التحقق من حالة git.",
"workspace.status.error": "تعذر التحقق من حالة Git.",
"workspace.status.clean": "لم يتم اكتشاف تغييرات غير مدمجة.",
"workspace.status.dirty": "تم اكتشاف تغييرات غير مدمجة في مساحة العمل هذه.",
"workspace.delete.title": "حذف مساحة العمل",
@@ -922,7 +925,7 @@ export const dict = {
"common.open": "فتح",
"dialog.releaseNotes.action.getStarted": "البدء",
"dialog.releaseNotes.action.next": "التالي",
"dialog.releaseNotes.action.hideFuture": "عدم إظهار هذا في المستقبل",
"dialog.releaseNotes.action.hideFuture": "عدم إظهارها مستقبلاً",
"dialog.releaseNotes.media.alt": "معاينة الإصدار",
"toast.project.reloadFailed.title": "فشل في إعادة تحميل {{project}}",
"error.server.invalidConfiguration": "تكوين غير صالح",
@@ -932,22 +935,25 @@ export const dict = {
"common.time.hoursAgo.short": "قبل {{count}} س",
"common.time.daysAgo.short": "قبل {{count}} ي",
"settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك",
"settings.providers.custom.description": "أضف مزود متوافق مع OpenAI بواسطة عنوان URL الأساسي.",
"settings.providers.custom.description": "أضف موفرًا متوافقًا مع OpenAI باستخدام عنوان URL الأساسي.",
"app.server.unreachable": "تعذر الوصول إلى {{server}}",
"app.server.retrying": "جاري إعادة المحاولة تلقائيًا...",
"app.server.retrying": "جارٍ إعادة المحاولة تلقائيًا...",
"app.server.otherServers": "خوادم أخرى",
"dialog.server.add.usernamePlaceholder": "اسم المستخدم",
"dialog.server.add.passwordPlaceholder": "كلمة المرور",
"server.row.noUsername": "لا يوجد اسم مستخدم",
"session.review.noVcs.createGit.title": "إنشاء مستودع Git",
"session.review.noVcs.createGit.description": "تتبع ومراجعة والتراجع عن التغييرات في هذا المشروع",
"session.review.noVcs.createGit.actionLoading": "جاري إنشاء مستودع Git...",
"session.review.noVcs.createGit.actionLoading": "جارٍ إنشاء مستودع Git...",
"session.review.noVcs.createGit.action": "إنشاء مستودع Git",
"session.todo.progress": "تم إكمال {{done}} من {{total}} مهام",
"session.question.progress": "{{current}} من {{total}} أسئلة",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "مستكشف الملفات",
"session.header.reveal.finder": "إظهار في Finder",
"session.header.reveal.fileExplorer": "إظهار في مستكشف الملفات",
"session.header.reveal.containingFolder": "فتح المجلد الحاوي",
"session.header.open.fileManager": "مدير الملفات",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -965,9 +971,9 @@ export const dict = {
"debugBar.ariaLabel": "تشخيص أداء التطوير",
"debugBar.na": "غير متاح",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip": "آخر انتقال مكتمل للمسار يمس صفحة جلسة، مُقاسًا من بدء التوجيه حتى أول رسم بعد استقراره.",
"debugBar.nav.tip": "آخر انتقال مكتمل للمسار يتضمن صفحة جلسة، مُقاسًا من بدء التوجيه حتى أول رسم بعد استقراره.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "الإطارات المتجددة في الثانية خلال آخر 5 ثوانٍ.",
"debugBar.fps.tip": "متوسط متحرك لمعدل الإطارات في الثانية خلال آخر 5 ثوانٍ.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "أسوأ وقت للإطار خلال آخر 5 ثوانٍ.",
"debugBar.jank.label": "JANK",
@@ -979,7 +985,7 @@ export const dict = {
"debugBar.inp.label": "INP",
"debugBar.inp.tip": "مدة التفاعل التقريبية خلال آخر 5 ثوانٍ. هذا يشبه INP، وليس Web Vitals INP الرسمي.",
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "التحول التخطيطي التراكمي لعمر التطبيق الحالي.",
"debugBar.cls.tip": "التحول التخطيطي التراكمي منذ تشغيل التطبيق الحالي.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "كومة JS المستخدمة مقابل حد الكومة. Chromium فقط.",
"debugBar.mem.tip": "كومة JS المستخدمة مقابل حد الكومة. {{used}} من {{limit}}.",
@@ -998,7 +1004,7 @@ export const dict = {
"common.key.pageDown": "Page Down",
"common.key.insert": "Insert",
"common.unknown": "غير معروف",
"error.page.circular": "[دائري]",
"error.page.circular": "[مرجع دائري]",
"error.serverSDK.noServerAvailable": "لا يوجد خادم متاح",
"error.serverSDK.serverNotAvailable": "الخادم غير متاح",
"error.childStore.persistedCacheCreateFailed": "فشل إنشاء ذاكرة التخزين المؤقت الدائمة",
File diff suppressed because it is too large Load Diff
+50 -44
View File
@@ -94,13 +94,14 @@ export const dict = {
"dialog.provider.empty": "Nenhum provedor encontrado",
"dialog.provider.group.popular": "Popular",
"dialog.provider.group.other": "Outro",
"dialog.provider.custom.label": "Provedor personalizado compatível com OpenAI",
"dialog.provider.tag.recommended": "Recomendado",
"dialog.provider.opencode.note": "Modelos selecionados incluindo Claude, GPT, Gemini e mais",
"dialog.provider.opencode.tagline": "Modelos otimizados e confiáveis",
"dialog.provider.opencodeGo.tagline": "Assinatura de baixo custo para todos",
"dialog.provider.anthropic.note": "Conectar com Claude Pro/Max ou chave de API",
"dialog.provider.copilot.note": "Conectar com Copilot ou chave de API",
"dialog.provider.openai.note": "Conectar com ChatGPT Pro/Plus ou chave de API",
"dialog.provider.anthropic.note": "Acesso direto aos modelos Claude, incluindo Pro e Max",
"dialog.provider.copilot.note": "Modelos de IA para auxílio à programação pelo GitHub Copilot",
"dialog.provider.openai.note": "Modelos GPT rápidos e avançados para tarefas gerais de IA",
"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.vercel.note": "Acesso unificado a modelos de IA com roteamento inteligente",
@@ -112,6 +113,7 @@ export const dict = {
"dialog.model.manage.provider.toggle": "Alternar todos os modelos {{provider}}",
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo OpenCode",
"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",
"provider.connect.title": "Conectar {{provider}}",
"provider.connect.title.anthropicProMax": "Entrar com Claude Pro/Max",
@@ -151,12 +153,12 @@ export const dict = {
"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.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.description": "Letras minúsculas, números, hifens ou sublinhados",
"provider.custom.field.name.label": "Nome de exibição",
"provider.custom.field.name.placeholder": "Meu Provedor de IA",
"provider.custom.field.baseURL.label": "URL Base",
"provider.custom.field.name.placeholder": "Meu provedor de IA",
"provider.custom.field.baseURL.label": "URL base",
"provider.custom.field.baseURL.placeholder": "https://api.meuprovedor.com/v1",
"provider.custom.field.apiKey.label": "Chave de API",
"provider.custom.field.apiKey.placeholder": "Chave de API",
@@ -165,7 +167,7 @@ export const dict = {
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "id-do-modelo",
"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.add": "Adicionar modelo",
"provider.custom.headers.label": "Cabeçalhos (opcional)",
@@ -175,11 +177,11 @@ export const dict = {
"provider.custom.headers.value.placeholder": "valor",
"provider.custom.headers.remove": "Remover cabeçalho",
"provider.custom.headers.add": "Adicionar cabeçalho",
"provider.custom.error.providerID.required": "ID do Provedor é obrigatório",
"provider.custom.error.providerID.required": "O ID do provedor é obrigatório",
"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.name.required": "Nome de exibição é obrigatório",
"provider.custom.error.baseURL.required": "URL Base é obrigatória",
"provider.custom.error.name.required": "O nome de exibição é obrigatório",
"provider.custom.error.baseURL.required": "A URL base é obrigatória",
"provider.custom.error.baseURL.format": "Deve começar com http:// ou https://",
"provider.custom.error.required": "Obrigatório",
"provider.custom.error.duplicate": "Duplicado",
@@ -215,7 +217,7 @@ export const dict = {
"common.clear": "Limpar",
"common.connect": "Conectar",
"common.disconnect": "Desconectar",
"common.continue": "Enviar",
"common.continue": "Continuar",
"common.submit": "Enviar",
"common.save": "Salvar",
"common.saving": "Salvando...",
@@ -267,7 +269,7 @@ export const dict = {
"prompt.context.includeActiveFile": "Incluir arquivo ativo",
"prompt.context.removeActiveFile": "Remover arquivo ativo do contexto",
"prompt.context.removeFile": "Remover arquivo do contexto",
"prompt.action.attachFile": "Anexar arquivo",
"prompt.action.attachFile": "Adicionar arquivos",
"prompt.menu.addImagesAndFiles": "Adicionar arquivos e mais",
"prompt.menu.imagesAndFiles": "Imagens e arquivos",
"prompt.menu.commands": "Comandos",
@@ -288,7 +290,7 @@ export const dict = {
"prompt.toast.promptSendFailed.title": "Falha ao enviar prompt",
"prompt.toast.promptSendFailed.description": "Não foi possível recuperar a sessão",
"dialog.mcp.title": "MCPs",
"dialog.mcp.description": "{{enabled}} of {{total}} habilitados",
"dialog.mcp.description": "{{enabled}} de {{total}} ativados",
"dialog.mcp.empty": "Nenhum MCP configurado",
"dialog.lsp.empty": "LSPs detectados automaticamente pelos tipos de arquivo",
"dialog.plugins.empty": "Plugins configurados em opencode.json",
@@ -310,11 +312,11 @@ export const dict = {
"dialog.server.search.placeholder": "Buscar servidores",
"dialog.server.empty": "Nenhum servidor ainda",
"dialog.server.add.title": "Adicionar um servidor",
"dialog.server.add.url": "URL do servidor",
"dialog.server.add.url": "Endereço do servidor",
"dialog.server.add.placeholder": "http://localhost:4096",
"dialog.server.add.error": "Não foi possível conectar ao servidor",
"dialog.server.add.checking": "Verificando...",
"dialog.server.add.button": "Adicionar",
"dialog.server.add.button": "Adicionar servidor",
"dialog.server.add.name": "Nome do servidor (opcional)",
"dialog.server.add.namePlaceholder": "Localhost",
"dialog.server.add.username": "Nome de usuário (opcional)",
@@ -322,7 +324,7 @@ export const dict = {
"dialog.server.edit.title": "Editar servidor",
"dialog.server.default.title": "Servidor padrão",
"dialog.server.default.description":
"Conectar a este servidor na inicialização do aplicativo ao invés de iniciar um servidor local. Requer reinicialização.",
"Conectar a este servidor na inicialização do aplicativo em vez de iniciar um servidor local. Requer reinicialização.",
"dialog.server.default.none": "Nenhum servidor selecionado",
"dialog.server.default.set": "Definir servidor atual como padrão",
"dialog.server.default.clear": "Limpar",
@@ -412,33 +414,33 @@ export const dict = {
"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.description": "Executa após criar um novo espaço de trabalho (worktree).",
"dialog.project.edit.worktree.startup.placeholder": "ex: bun install",
"context.breakdown.title": "Detalhamento do Contexto",
"dialog.project.edit.worktree.startup.placeholder": "Ex.: bun install",
"context.breakdown.title": "Detalhamento do contexto",
"context.breakdown.note":
'Detalhamento aproximado dos tokens de entrada. "Outros" inclui definições de ferramentas e overhead.',
'Detalhamento aproximado dos tokens de entrada. "Outros" inclui definições de ferramentas e sobrecarga.',
"context.breakdown.system": "Sistema",
"context.breakdown.user": "Usuário",
"context.breakdown.assistant": "Assistente",
"context.breakdown.tool": "Chamadas de Ferramentas",
"context.breakdown.tool": "Chamadas de ferramentas",
"context.breakdown.other": "Outros",
"context.systemPrompt.title": "Prompt do Sistema",
"context.systemPrompt.title": "Prompt do sistema",
"context.rawMessages.title": "Mensagens brutas",
"context.stats.session": "Sessão",
"context.stats.messages": "Mensagens",
"context.stats.provider": "Provedor",
"context.stats.model": "Modelo",
"context.stats.limit": "Limite de Contexto",
"context.stats.totalTokens": "Total de Tokens",
"context.stats.limit": "Limite de contexto",
"context.stats.totalTokens": "Total de tokens",
"context.stats.usage": "Uso",
"context.stats.inputTokens": "Tokens de Entrada",
"context.stats.outputTokens": "Tokens de Saída",
"context.stats.reasoningTokens": "Tokens de Raciocínio",
"context.stats.cacheTokens": "Tokens de Cache (leitura/escrita)",
"context.stats.userMessages": "Mensagens de Usuário",
"context.stats.assistantMessages": "Mensagens do Assistente",
"context.stats.totalCost": "Custo Total",
"context.stats.sessionCreated": "Sessão Criada",
"context.stats.lastActivity": "Última Atividade",
"context.stats.inputTokens": "Tokens de entrada",
"context.stats.outputTokens": "Tokens de saída",
"context.stats.reasoningTokens": "Tokens de raciocínio",
"context.stats.cacheTokens": "Tokens de cache (leitura/escrita)",
"context.stats.userMessages": "Mensagens do usuário",
"context.stats.assistantMessages": "Mensagens do assistente",
"context.stats.totalCost": "Custo total",
"context.stats.sessionCreated": "Sessão criada",
"context.stats.lastActivity": "Última atividade",
"context.usage.tokens": "Tokens",
"context.usage.usage": "Uso",
"context.usage.cost": "Custo",
@@ -497,7 +499,7 @@ export const dict = {
"error.page.title": "Algo deu errado",
"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.details.label": "Detalhes do Erro",
"error.page.details.label": "Detalhes do erro",
"error.page.action.restart": "Reiniciar",
"error.page.action.report": "Reportar erro",
"error.page.action.reported": "Erro reportado",
@@ -570,7 +572,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.closeTab": "Fechar aba",
"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.other": "Alterações",
"session.review.loadingChanges": "Carregando alterações...",
@@ -656,7 +658,7 @@ export const dict = {
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Fechar terminal",
"terminal.connectionLost.title": "Conexão Perdida",
"terminal.connectionLost.title": "Conexão perdida",
"terminal.connectionLost.description":
"A conexão do terminal foi interrompida. Isso pode acontecer quando o servidor reinicia.",
"common.closeTab": "Fechar aba",
@@ -706,7 +708,7 @@ export const dict = {
"settings.general.row.shell.title": "Shell do terminal",
"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.",
"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.appearance.title": "Aparência",
"settings.general.row.appearance.description": "Personalize como o OpenCode aparece no seu dispositivo",
@@ -739,8 +741,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Navegação inferior",
"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",
"settings.general.row.showCustomAgents.title": "Agentes personalizados",
"settings.general.row.showCustomAgents.description": "Mostrar o seletor de agentes na área de composição",
"settings.general.row.showCustomAgents.title": "Mostrar agente",
"settings.general.row.showCustomAgents.description":
"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.description": "Exibir resumos de raciocínio do modelo na linha do tempo",
"settings.general.row.shellToolPartsExpanded.title": "Expandir partes da ferramenta shell",
@@ -823,14 +826,15 @@ export const dict = {
"sound.option.yup06": "Sim 06",
"settings.general.notifications.agent.title": "Agente",
"settings.general.notifications.agent.description":
"Mostrar notificação do sistema quando o agente estiver completo ou precisar de atenção",
"Mostrar notificação do sistema quando o agente concluir o trabalho ou precisar de atenção",
"settings.general.notifications.permissions.title": "Permissões",
"settings.general.notifications.permissions.description":
"Mostrar notificação do sistema quando uma permissão for necessária",
"settings.general.notifications.errors.title": "Erros",
"settings.general.notifications.errors.description": "Mostrar notificação do sistema quando ocorrer um erro",
"settings.general.sounds.agent.title": "Agente",
"settings.general.sounds.agent.description": "Reproduzir som quando o agente estiver completo ou precisar de atenção",
"settings.general.sounds.agent.description":
"Reproduzir som quando o agente concluir o trabalho ou precisar de atenção",
"settings.general.sounds.permissions.title": "Permissões",
"settings.general.sounds.permissions.description": "Reproduzir som quando uma permissão for necessária",
"settings.general.sounds.errors.title": "Erros",
@@ -878,8 +882,7 @@ export const dict = {
"settings.permissions.tool.read.title": "Ler",
"settings.permissions.tool.read.description": "Ler um arquivo (corresponde ao caminho do arquivo)",
"settings.permissions.tool.edit.title": "Editar",
"settings.permissions.tool.edit.description":
"Modificar arquivos, incluindo edições, escritas, patches e multi-edições",
"settings.permissions.tool.edit.description": "Modificar arquivos, incluindo edições, escritas e patches",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Corresponder arquivos usando padrões glob",
"settings.permissions.tool.grep.title": "Grep",
@@ -889,7 +892,7 @@ export const dict = {
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "Executar comandos shell",
"settings.permissions.tool.task.title": "Tarefa",
"settings.permissions.tool.task.description": "Lançar sub-agentes",
"settings.permissions.tool.task.description": "Iniciar subagentes",
"settings.permissions.tool.skill.title": "Habilidade",
"settings.permissions.tool.skill.description": "Carregar uma habilidade por nome",
"settings.permissions.tool.lsp.title": "LSP",
@@ -946,7 +949,7 @@ export const dict = {
"common.time.hoursAgo.short": "{{count}}h 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.custom.description": "Adicionar um provedor compatível com a OpenAI através do URL base.",
"settings.providers.custom.description": "Adicionar um provedor compatível com OpenAI por meio da URL base.",
"app.server.unreachable": "Não foi possível conectar a {{server}}",
"app.server.retrying": "Tentando novamente automaticamente...",
@@ -962,6 +965,9 @@ export const dict = {
"session.question.progress": "{{current}} de {{total}} perguntas",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
+48 -42
View File
@@ -102,6 +102,7 @@ export const dict = {
"dialog.provider.empty": "Nema pronađenih provajdera",
"dialog.provider.group.popular": "Popularno",
"dialog.provider.group.other": "Ostalo",
"dialog.provider.custom.label": "Prilagođeni provajder kompatibilan s OpenAI-jem",
"dialog.provider.tag.recommended": "Preporučeno",
"dialog.provider.opencode.note": "Kurirani modeli uključujući Claude, GPT, Gemini i druge",
"dialog.provider.opencode.tagline": "Pouzdani optimizovani modeli",
@@ -122,6 +123,7 @@ export const dict = {
"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.viewMoreProviders": "Pogledaj još više od 70 provajdera",
"dialog.provider.viewAll": "Prikaži više provajdera",
@@ -232,7 +234,7 @@ export const dict = {
"common.clear": "Očisti",
"common.connect": "Poveži",
"common.disconnect": "Prekini vezu",
"common.continue": "Pošalji",
"common.continue": "Nastavi",
"common.submit": "Pošalji",
"common.save": "Sačuvaj",
"common.saving": "Čuvanje...",
@@ -263,7 +265,7 @@ export const dict = {
"prompt.example.11": "Optimizuj upite prema bazi podataka",
"prompt.example.12": "Dodaj validaciju ulaza",
"prompt.example.13": "Napravi novu komponentu za...",
"prompt.example.14": "Kako da deployam ovaj projekat?",
"prompt.example.14": "Kako da postavim ovaj projekat?",
"prompt.example.15": "Pregledaj moj kod prema najboljim praksama",
"prompt.example.16": "Dodaj obradu grešaka u ovu funkciju",
"prompt.example.17": "Objasni ovaj regex obrazac",
@@ -271,14 +273,14 @@ export const dict = {
"prompt.example.19": "Dodaj logovanje kroz cijelu bazu koda",
"prompt.example.20": "Koje su zavisnosti zastarjele?",
"prompt.example.21": "Pomozi mi da napišem migracijsku skriptu",
"prompt.example.22": "Implementiraj keširanje za ovaj endpoint",
"prompt.example.22": "Implementiraj keširanje za ovu krajnju tačku",
"prompt.example.23": "Dodaj paginaciju u ovu listu",
"prompt.example.24": "Napravi CLI komandu za...",
"prompt.example.25": "Kako ovdje rade varijable okruženja?",
"prompt.popover.emptyResults": "Nema rezultata",
"prompt.popover.emptyCommands": "Nema komandi",
"prompt.dropzone.label": "Ovdje prevucite slike, PDF-ove ili tekstualne datoteke",
"prompt.dropzone.label": "Ovdje prevuci slike, PDF-ove ili tekstualne datoteke",
"prompt.dropzone.file.label": "Spusti za @spominjanje datoteke",
"prompt.slash.badge.custom": "prilagođeno",
"prompt.slash.badge.skill": "skill",
@@ -287,7 +289,7 @@ export const dict = {
"prompt.context.includeActiveFile": "Uključi aktivnu datoteku",
"prompt.context.removeActiveFile": "Ukloni aktivnu datoteku iz konteksta",
"prompt.context.removeFile": "Ukloni datoteku iz konteksta",
"prompt.action.attachFile": "Priloži datoteku",
"prompt.action.attachFile": "Dodaj datoteke",
"prompt.menu.addImagesAndFiles": "Dodaj datoteke i više",
"prompt.menu.imagesAndFiles": "Slike i datoteke",
"prompt.menu.commands": "Komande",
@@ -311,7 +313,7 @@ export const dict = {
"dialog.mcp.title": "MCP-ovi",
"dialog.mcp.description": "{{enabled}} od {{total}} omogućeno",
"dialog.mcp.empty": "Nema konfigurisnih MCP-ova",
"dialog.mcp.empty": "Nema konfigurisanih MCP-ova",
"dialog.lsp.empty": "LSP-ovi se automatski otkrivaju prema tipu datoteke",
"dialog.plugins.empty": "Plugini su konfigurisani u opencode.json",
@@ -319,18 +321,18 @@ export const dict = {
"mcp.status.connected": "povezano",
"mcp.status.failed": "neuspjelo",
"mcp.status.needs_auth": "potrebna autentifikacija",
"mcp.auth.clickToAuthenticate": "Kliknite za autentifikaciju",
"mcp.auth.clickToAuthenticate": "Klikni za autentifikaciju",
"mcp.status.disabled": "onemogućeno",
"dialog.fork.empty": "Nema poruka za fork",
"dialog.directory.search.placeholder": "Pretraži foldere",
"dialog.directory.empty": "Nema pronađenih foldera",
"dialog.directory.search.placeholder": "Pretraži fascikle",
"dialog.directory.empty": "Nema pronađenih fascikli",
"dialog.directory.action.selectFile": "Odaberi datoteku",
"dialog.directory.action.selectFolder": "Odaberi folder",
"dialog.directory.action.selectFolder": "Odaberi fasciklu",
"dialog.directory.root": "Korijen",
"dialog.directory.parent": "Nadređeni folder",
"dialog.directory.readError": "Nije moguće pročitati ovaj folder",
"dialog.directory.parent": "Nadređena fascikla",
"dialog.directory.readError": "Nije moguće pročitati ovu fasciklu",
"dialog.server.title": "Serveri",
"dialog.server.description": "Promijeni na koji se OpenCode server ova aplikacija povezuje.",
@@ -349,7 +351,7 @@ export const dict = {
"dialog.server.edit.title": "Uredi server",
"dialog.server.default.title": "Podrazumijevani server",
"dialog.server.default.description":
"Poveži se na ovaj server pri pokretanju aplikacije umjesto pokretanja lokalnog servera. Potreban je restart.",
"Poveži se na ovaj server pri pokretanju aplikacije umjesto pokretanja lokalnog servera. Potrebno je ponovo pokrenuti aplikaciju.",
"dialog.server.default.none": "Nije odabran server",
"dialog.server.default.set": "Postavi trenutni server kao podrazumijevani",
"dialog.server.default.clear": "Očisti",
@@ -445,7 +447,7 @@ export const dict = {
"context.breakdown.title": "Razlaganje konteksta",
"context.breakdown.note":
'Približna raspodjela ulaznih tokena. "Ostalo" uključuje definicije alata i dodatni overhead.',
'Približna raspodjela ulaznih tokena. "Ostalo" uključuje definicije alata i dodatno opterećenje.',
"context.breakdown.system": "Sistem",
"context.breakdown.user": "Korisnik",
"context.breakdown.assistant": "Asistent",
@@ -465,7 +467,7 @@ export const dict = {
"context.stats.inputTokens": "Ulazni tokeni",
"context.stats.outputTokens": "Izlazni tokeni",
"context.stats.reasoningTokens": "Tokeni za rasuđivanje",
"context.stats.cacheTokens": "Cache tokeni (čitanje/pisanje)",
"context.stats.cacheTokens": "Keširani tokeni (čitanje/pisanje)",
"context.stats.userMessages": "Korisničke poruke",
"context.stats.assistantMessages": "Poruke asistenta",
"context.stats.totalCost": "Ukupni trošak",
@@ -537,14 +539,14 @@ export const dict = {
"toast.update.title": "Dostupno ažuriranje",
"toast.update.description": "Nova verzija OpenCode-a ({{version}}) je dostupna za instalaciju.",
"toast.update.action.installRestart": "Instaliraj i restartuj",
"toast.update.action.installRestart": "Instaliraj i ponovo pokreni",
"toast.update.action.notYet": "Ne još",
"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.localServerStartup": "Došlo je do greške pri pokretanju lokalnog servera.",
"error.page.details.label": "Detalji greške",
"error.page.action.restart": "Restartuj",
"error.page.action.restart": "Ponovo pokreni",
"error.page.action.report": "Prijavi grešku",
"error.page.action.reported": "Greška prijavljena",
"error.page.action.exportLogs": "Izvezi logove",
@@ -569,7 +571,7 @@ export const dict = {
"error.chain.responseBody": "Tijelo odgovora:\n{{body}}",
"error.chain.didYouMean": "Da li si mislio: {{suggestions}}",
"error.chain.modelNotFound": "Model nije pronađen: {{provider}}/{{model}}",
"error.chain.checkConfig": "Provjeri konfiguraciju (opencode.json) provider/model names",
"error.chain.checkConfig": "Provjeri nazive provajdera/modela u konfiguraciji (opencode.json)",
"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.providerInitFailed":
@@ -611,7 +613,7 @@ export const dict = {
"home.sessions.group.yesterday": "Jučer",
"home.sessions.group.older": "Starije",
"home.providerTip":
"Povežite se s više od 75 pružalaca usluga kako biste koristili druge modele, uključujući Claude, GPT, Gemini i druge",
"Poveži se s više od 75 provajdera da koristiš druge modele, uključujući Claude, GPT, Gemini i druge",
"session.tab.session": "Sesija",
"session.tab.review": "Pregled",
@@ -627,11 +629,11 @@ export const dict = {
"session.review.change.other": "Izmjene",
"session.review.loadingChanges": "Učitavanje izmjena...",
"session.review.empty": "Još nema izmjena u ovoj sesiji",
"session.review.noVcs": "Nije detektovan Git sistem kontrole verzija, promjene se ne prikazuju",
"session.review.noVcs": "Nije otkriven Git sistem za kontrolu verzija, pa se promjene ne prikazuju",
"session.review.noSnapshot":
"Praćenje snimaka (snapshot) je onemogućeno u konfiguraciji, pa promjene sesije nisu dostupne",
"session.review.noChanges": "Nema izmjena",
"session.review.noUncommittedChanges": "Još nema nepotvrđenih promjena",
"session.review.noUncommittedChanges": "Još nema promjena koje nisu commitovane",
"session.review.noBranchChanges": "Još nema promjena na grani",
"session.files.selectToOpen": "Odaberi datoteku za otvaranje",
@@ -717,7 +719,7 @@ export const dict = {
"terminal.close": "Zatvori terminal",
"terminal.connectionLost.title": "Veza prekinuta",
"terminal.connectionLost.description":
"Veza s terminalom je prekinuta. Ovo se može desiti kada se server restartuje.",
"Veza s terminalom je prekinuta. Ovo se može desiti kada se server ponovo pokrene.",
"common.closeTab": "Zatvori karticu",
"common.dismiss": "Odbaci",
@@ -725,7 +727,7 @@ export const dict = {
"common.moreOptions": "Više opcija",
"common.learnMore": "Saznaj više",
"common.rename": "Preimenuj",
"common.reset": "Resetuj",
"common.reset": "Vrati na početno stanje",
"common.archive": "Arhiviraj",
"common.delete": "Izbriši",
"common.close": "Zatvori",
@@ -782,7 +784,7 @@ export const dict = {
"settings.general.row.font.title": "Font za kod",
"settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda",
"settings.general.row.terminalFont.title": "Font terminala",
"settings.general.row.terminalFont.description": "Prilagodite font koji se koristi u terminalu",
"settings.general.row.terminalFont.description": "Prilagodi font koji se koristi u terminalu",
"settings.general.row.uiFont.title": "UI font",
"settings.general.row.uiFont.description": "Prilagodi font koji se koristi u cijelom interfejsu",
"settings.general.row.followup.title": "Ponašanje nadovezivanja",
@@ -817,15 +819,16 @@ export const dict = {
"settings.general.row.newInterface.title": "Novi raspored",
"settings.general.row.newInterface.badge": "Novo",
"settings.general.row.newInterface.description":
"Koristite nove kartice i raspored početne stranice. Ograničeno vrijeme možete se prebacivati između rasporeda.",
"settings.general.row.newInterfaceNotice.title": "Sada koristite novi raspored",
"Koristi nove kartice i raspored početne stranice. Ograničeno vrijeme možeš se prebacivati između rasporeda.",
"settings.general.row.newInterfaceNotice.title": "Sada koristiš novi raspored",
"settings.general.row.newInterfaceNotice.description": "Prethodni raspored više nije dostupan",
"settings.general.row.newInterfaceNotice.dismiss": "Odbaci",
"settings.general.row.pinchZoom.title": "Zumiranje štipanjem",
"settings.general.row.pinchZoom.description":
"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.description": "Onemogući X11 fallback na Waylandu. Zahtijeva restart.",
"settings.general.row.wayland.description":
"Onemogući rezervni X11 način rada na Waylandu. Zahtijeva ponovno pokretanje.",
"settings.general.row.wayland.tooltip":
"Na Linuxu sa monitorima miješanih stopa osvježavanja, nativni Wayland može biti stabilniji.",
@@ -941,7 +944,7 @@ export const dict = {
"settings.mcp.description": "MCP postavke će se ovdje moći podešavati.",
"settings.permissions.title": "Dozvole",
"settings.permissions.description": "Kontroliši koje alate server smije koristiti po defaultu.",
"settings.permissions.description": "Kontroliši koje alate server smije koristiti zadano.",
"settings.permissions.section.tools": "Alati",
"settings.permissions.toast.updateFailed.title": "Neuspjelo ažuriranje dozvola",
@@ -953,7 +956,7 @@ export const dict = {
"settings.permissions.tool.read.description": "Čitanje datoteke (podudara se s putanjom datoteke)",
"settings.permissions.tool.edit.title": "Uređivanje",
"settings.permissions.tool.edit.description":
"Mijenjanje datoteka, uključujući izmjene, pisanja, patch-eve i multi-izmjene",
"Mijenjanje datoteka, uključujući uređivanje, pisanje, zakrpe i višestruke izmjene",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Podudaranje datoteka pomoću glob šablona",
"settings.permissions.tool.grep.title": "Grep",
@@ -989,26 +992,26 @@ export const dict = {
"workspace.type.sandbox": "sandbox",
"workspace.create.failed.title": "Neuspješno kreiranje radnog prostora",
"workspace.delete.failed.title": "Neuspješno brisanje radnog prostora",
"workspace.resetting.title": "Resetovanje radnog prostora",
"workspace.resetting.title": "Vraćanje radnog prostora na početno stanje",
"workspace.resetting.description": "Ovo može potrajati minut.",
"workspace.reset.failed.title": "Neuspješno resetovanje radnog prostora",
"workspace.reset.success.title": "Radni prostor resetovan",
"workspace.reset.failed.title": "Neuspješno vraćanje radnog prostora na početno stanje",
"workspace.reset.success.title": "Radni prostor vraćen na početno stanje",
"workspace.reset.success.description": "Radni prostor sada odgovara podrazumijevanoj grani.",
"workspace.error.stillPreparing": "Radni prostor se još priprema",
"workspace.status.checking": "Provjera neobjedinjenih promjena...",
"workspace.status.checking": "Provjera promjena koje nisu commitovane...",
"workspace.status.error": "Nije moguće provjeriti git status.",
"workspace.status.clean": "Nisu pronađene neobjedinjene promjene.",
"workspace.status.dirty": "Pronađene su neobjedinjene promjene u ovom radnom prostoru.",
"workspace.status.clean": "Nisu pronađene promjene koje nisu commitovane.",
"workspace.status.dirty": "Pronađene su promjene koje nisu commitovane u ovom radnom prostoru.",
"workspace.delete.title": "Izbriši radni prostor",
"workspace.delete.confirm": 'Izbriši radni prostor "{{name}}"?',
"workspace.delete.button": "Izbriši radni prostor",
"workspace.reset.title": "Resetuj radni prostor",
"workspace.reset.confirm": 'Resetuj radni prostor "{{name}}"?',
"workspace.reset.button": "Resetuj radni prostor",
"workspace.reset.title": "Vrati radni prostor na početno stanje",
"workspace.reset.confirm": 'Vrati radni prostor "{{name}}" na početno stanje?',
"workspace.reset.button": "Vrati radni prostor na početno stanje",
"workspace.reset.archived.none": "Nijedna aktivna sesija neće biti arhivirana.",
"workspace.reset.archived.one": "1 sesija će biti arhivirana.",
"workspace.reset.archived.many": "Biće arhivirano {{count}} sesija.",
"workspace.reset.note": "Ovo će resetovati radni prostor da odgovara podrazumijevanoj grani.",
"workspace.reset.note": "Ovo će vratiti radni prostor na stanje podrazumijevane grane.",
"common.open": "Otvori",
"dialog.releaseNotes.action.getStarted": "Započni",
"dialog.releaseNotes.action.next": "Sljedeće",
@@ -1021,8 +1024,8 @@ export const dict = {
"common.time.minutesAgo.short": "prije {{count}} min",
"common.time.hoursAgo.short": "prije {{count}} h",
"common.time.daysAgo.short": "prije {{count}} d",
"settings.providers.connected.environmentDescription": "Povezano sa vašim varijablama okruženja",
"settings.providers.custom.description": "Dodajte provajdera kompatibilnog s OpenAI putem osnovnog URL-a.",
"settings.providers.connected.environmentDescription": "Povezano s tvojim varijablama okruženja",
"settings.providers.custom.description": "Dodaj provajdera kompatibilnog s OpenAI putem baznog URL-a.",
"app.server.unreachable": "Nije moguće pristupiti {{server}}",
"app.server.retrying": "Automatski ponovni pokušaj...",
@@ -1031,13 +1034,16 @@ export const dict = {
"dialog.server.add.passwordPlaceholder": "lozinka",
"server.row.noUsername": "nema korisničkog imena",
"session.review.noVcs.createGit.title": "Kreiraj Git repozitorij",
"session.review.noVcs.createGit.description": "Pratite, pregledajte i poništite promjene u ovom projektu",
"session.review.noVcs.createGit.description": "Prati, pregledaj i poništi promjene u ovom projektu",
"session.review.noVcs.createGit.actionLoading": "Kreiranje Git repozitorija...",
"session.review.noVcs.createGit.action": "Kreiraj Git repozitorij",
"session.todo.progress": "{{done}} od {{total}} zadataka završeno",
"session.question.progress": "{{current}} od {{total}} pitanja",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
+45 -38
View File
@@ -102,6 +102,7 @@ export const dict = {
"dialog.provider.empty": "Ingen udbydere fundet",
"dialog.provider.group.popular": "Populære",
"dialog.provider.group.other": "Andre",
"dialog.provider.custom.label": "Brugerdefineret OpenAI-kompatibel udbyder",
"dialog.provider.tag.recommended": "Anbefalet",
"dialog.provider.opencode.note": "Udvalgte modeller inklusive Claude, GPT, Gemini og flere",
"dialog.provider.opencode.tagline": "Pålidelige optimerede modeller",
@@ -122,6 +123,7 @@ export const dict = {
"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.viewMoreProviders": "Se mere end 70 yderligere udbydere",
"dialog.provider.viewAll": "Vis flere udbydere",
@@ -133,8 +135,8 @@ export const dict = {
"provider.connect.status.waiting": "Venter på godkendelse...",
"provider.connect.status.failed": "Godkendelse mislykkedes: {{error}}",
"provider.connect.apiKey.description":
"Indtast din {{provider}} API-nøgle for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
"provider.connect.apiKey.label": "{{provider}} API-nøgle",
"Indtast din API-nøgle til {{provider}} for at forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
"provider.connect.apiKey.label": "API-nøgle til {{provider}}",
"provider.connect.apiKey.placeholder": "API-nøgle",
"provider.connect.apiKey.required": "API-nøgle er påkrævet",
"provider.connect.opencodeZen.line1":
@@ -147,7 +149,7 @@ export const dict = {
"provider.connect.oauth.code.visit.prefix": "Besøg ",
"provider.connect.oauth.code.visit.link": "dette link",
"provider.connect.oauth.code.visit.suffix":
" for at hente din godkendelseskode for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
" for at hente din godkendelseskode, forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
"provider.connect.oauth.code.label": "{{method}} godkendelseskode",
"provider.connect.oauth.code.placeholder": "Godkendelseskode",
"provider.connect.oauth.code.required": "Godkendelseskode er påkrævet",
@@ -155,10 +157,10 @@ export const dict = {
"provider.connect.oauth.auto.visit.prefix": "Besøg ",
"provider.connect.oauth.auto.visit.link": "dette link",
"provider.connect.oauth.auto.visit.suffix":
" og indtast koden nedenfor for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
" og indtast koden nedenfor for at forbinde din konto og bruge modeller fra {{provider}} i OpenCode.",
"provider.connect.oauth.auto.confirmationCode": "Bekræftelseskode",
"provider.connect.toast.connected.title": "{{provider}} forbundet",
"provider.connect.toast.connected.description": "{{provider}} modeller er nu tilgængelige.",
"provider.connect.toast.connected.description": "Modeller fra {{provider}} er nu tilgængelige.",
"provider.custom.title": "Brugerdefineret udbyder",
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel udbyder. Se ",
@@ -217,9 +219,9 @@ export const dict = {
"model.tooltip.inputs": "Input",
"model.tooltip.model": "Model",
"model.tooltip.provider": "Udbyder",
"model.tooltip.reasoning": "Tænkning",
"model.tooltip.reasoning.allowed": "Tillader tænkning",
"model.tooltip.reasoning.none": "Ingen tænkning",
"model.tooltip.reasoning": "Ræsonnering",
"model.tooltip.reasoning.allowed": "Tillader ræsonnering",
"model.tooltip.reasoning.none": "Ingen ræsonnering",
"model.tooltip.context": "Kontekstgrænse {{limit}}",
"common.search.placeholder": "Søg",
"common.goBack": "Gå tilbage",
@@ -230,7 +232,7 @@ export const dict = {
"common.clear": "Ryd",
"common.connect": "Forbind",
"common.disconnect": "Frakobl",
"common.continue": "Indsend",
"common.continue": "Fortsæt",
"common.submit": "Indsend",
"common.save": "Gem",
"common.saving": "Gemmer...",
@@ -253,7 +255,7 @@ export const dict = {
"prompt.example.3": "Ret ødelagte tests",
"prompt.example.4": "Forklar hvordan godkendelse fungerer",
"prompt.example.5": "Find og ret sikkerhedshuller",
"prompt.example.6": "Tilføj enhedstests for brugerservice",
"prompt.example.6": "Tilføj enhedstests for brugertjenesten",
"prompt.example.7": "Refaktorer denne funktion så den er mere læsbar",
"prompt.example.8": "Hvad betyder denne fejl?",
"prompt.example.9": "Hjælp mig med at debugge dette problem",
@@ -335,7 +337,7 @@ export const dict = {
"dialog.server.search.placeholder": "Søg servere",
"dialog.server.empty": "Ingen servere endnu",
"dialog.server.add.title": "Tilføj en server",
"dialog.server.add.url": "Server URL",
"dialog.server.add.url": "Serveradresse",
"dialog.server.add.placeholder": "http://localhost:4096",
"dialog.server.add.error": "Kunne ikke forbinde til server",
"dialog.server.add.checking": "Tjekker...",
@@ -347,7 +349,7 @@ export const dict = {
"dialog.server.edit.title": "Rediger server",
"dialog.server.default.title": "Standardserver",
"dialog.server.default.description":
"Forbind til denne server ved start af app i stedet for at starte en lokal server. Kræver genstart.",
"Opret forbindelse til denne server, når appen starter, i stedet for at starte en lokal server. Kræver genstart.",
"dialog.server.default.none": "Ingen server valgt",
"dialog.server.default.set": "Sæt nuværende server som standard",
"dialog.server.default.clear": "Ryd",
@@ -462,8 +464,8 @@ export const dict = {
"context.stats.usage": "Forbrug",
"context.stats.inputTokens": "Input-tokens",
"context.stats.outputTokens": "Output-tokens",
"context.stats.reasoningTokens": "Tænke Tokens",
"context.stats.cacheTokens": "Cache Tokens (læs/skriv)",
"context.stats.reasoningTokens": "Ræsonneringstokens",
"context.stats.cacheTokens": "Cachetokens (læsning/skrivning)",
"context.stats.userMessages": "Brugerbeskeder",
"context.stats.assistantMessages": "Assistentbeskeder",
"context.stats.totalCost": "Samlede omkostninger",
@@ -566,7 +568,7 @@ export const dict = {
"error.chain.responseBody": "Svarindhold:\n{{body}}",
"error.chain.didYouMean": "Mente du: {{suggestions}}",
"error.chain.modelNotFound": "Model ikke fundet: {{provider}}/{{model}}",
"error.chain.checkConfig": "Tjek dine konfigurations (opencode.json) udbyder/modelnavne",
"error.chain.checkConfig": "Kontrollér udbyder- og modelnavnene i din konfiguration (opencode.json)",
"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.providerInitFailed":
@@ -619,12 +621,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.closeTab": "Luk fane",
"session.error.serverConnection": "Kan ikke oprette forbindelse til denne server",
"session.review.filesChanged": "{{count}} Filer ændret",
"session.review.filesChanged": "{{count}} ændrede filer",
"session.review.change.one": "Ændring",
"session.review.change.other": "Ændringer",
"session.review.loadingChanges": "Indlæser ændringer...",
"session.review.empty": "Ingen ændringer i denne session endnu",
"session.review.noVcs": "Intet Git versionsstyringssystem fundet, ændringer vises ikke",
"session.review.noVcs": "Intet Git-versionsstyringssystem fundet, ændringer vises ikke",
"session.review.noSnapshot":
"Snapshot-sporing er deaktiveret i konfigurationen, så sessionsændringer er ikke tilgængelige",
"session.review.noChanges": "Ingen ændringer",
@@ -750,7 +752,7 @@ export const dict = {
"settings.tab.general": "Generelt",
"settings.tab.shortcuts": "Genveje",
"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.general.section.appearance": "Udseende",
@@ -771,15 +773,16 @@ export const dict = {
"settings.general.row.appearance.title": "Udseende",
"settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed",
"settings.general.row.colorScheme.title": "Farveskema",
"settings.general.row.colorScheme.description": "Vælg om OpenCode følger systemets, lyst eller mørkt tema",
"settings.general.row.colorScheme.description":
"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.description": "Tilpas hvordan OpenCode er temabestemt.",
"settings.general.row.theme.description": "Tilpas OpenCodes tema.",
"settings.general.row.font.title": "Kode-skrifttype",
"settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke",
"settings.general.row.terminalFont.title": "Terminalskrifttype",
"settings.general.row.terminalFont.description": "Tilpas den skrifttype, der bruges i terminalen",
"settings.general.row.uiFont.title": "UI-skrifttype",
"settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugerfladen",
"settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugergrænsefladen",
"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.option.queue": "Kø",
@@ -797,10 +800,11 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Navigation nederst",
"settings.general.row.mobileTitlebarBottom.description":
"Placer titellinjen og sessionsfanerne nederst på skærmen på mobilenheder",
"settings.general.row.showCustomAgents.title": "Brugerdefinerede agenter",
"settings.general.row.showCustomAgents.description": "Vis agentvælgeren i promptfeltet",
"settings.general.row.reasoningSummaries.title": "Vis tænkeoversigter",
"settings.general.row.reasoningSummaries.description": "Vis model tænkeoversigter i tidslinjen",
"settings.general.row.showCustomAgents.title": "Vis agent",
"settings.general.row.showCustomAgents.description":
"Skift mellem agenter i promptfeltet. Når vælgeren er skjult, bruges Build-agenten som standard.",
"settings.general.row.reasoningSummaries.title": "Vis ræsonneringsoversigter",
"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.description": "Vis shell-værktøjsdele udvidet som standard i tidslinjen",
@@ -816,13 +820,13 @@ export const dict = {
"settings.general.row.newInterfaceNotice.dismiss": "Afvis",
"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.wayland.title": "Brug native Wayland",
"settings.general.row.wayland.title": "Brug indbygget Wayland",
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.",
"settings.general.row.wayland.tooltip":
"På Linux med skærme med blandet opdateringshastighed kan native Wayland være mere stabilt.",
"På Linux med skærme med forskellige opdateringshastigheder kan indbygget Wayland være mere stabilt.",
"settings.general.row.releaseNotes.title": "Udgivelsesnoter",
"settings.general.row.releaseNotes.description": 'Vis "Hvad er nyt"-popups efter opdateringer',
"settings.general.row.releaseNotes.description": 'Vis pop op-vinduer med "Hvad er nyt" efter opdateringer',
"settings.updates.row.startup.title": "Tjek for opdateringer ved opstart",
"settings.updates.row.startup.description": "Tjek automatisk for opdateringer, når OpenCode starter",
@@ -945,9 +949,9 @@ export const dict = {
"settings.permissions.tool.read.description": "Læsning af en fil (matcher filstien)",
"settings.permissions.tool.edit.title": "Rediger",
"settings.permissions.tool.edit.description":
"Ændre filer, herunder redigeringer, skrivninger, patches og multi-redigeringer",
"Rediger filer, herunder med redigeringer, skrivning, patches og multiredigeringer",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Match filer ved hjælp af glob-mønstre",
"settings.permissions.tool.glob.description": "Find filer ved hjælp af globmønstre",
"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.list.title": "Liste",
@@ -960,8 +964,8 @@ export const dict = {
"settings.permissions.tool.skill.description": "Indlæs en færdighed efter navn",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "Kør sprogserverforespørgsler",
"settings.permissions.tool.todowrite.title": "Skriv To-do",
"settings.permissions.tool.todowrite.description": "Opdater to-do listen",
"settings.permissions.tool.todowrite.title": "Skriv to-do",
"settings.permissions.tool.todowrite.description": "Opdater to-do-listen",
"settings.permissions.tool.webfetch.title": "Webhentning",
"settings.permissions.tool.webfetch.description": "Hent indhold fra en URL",
"settings.permissions.tool.websearch.title": "Websøgning",
@@ -988,7 +992,7 @@ export const dict = {
"workspace.reset.success.description": "Arbejdsområdet matcher nu hovedgrenen.",
"workspace.error.stillPreparing": "Arbejdsområdet er stadig ved at blive klargjort",
"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.dirty": "Uflettede ændringer fundet i dette arbejdsområde.",
"workspace.delete.title": "Slet arbejdsområde",
@@ -1030,6 +1034,9 @@ export const dict = {
"session.question.progress": "{{current}} af {{total}} spørgsmål",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -1050,11 +1057,11 @@ export const dict = {
"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.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Rullende billeder pr. sekund over de sidste 5 sekunder.",
"debugBar.fps.tip": "Rullende antal billedrammer pr. sekund over de sidste 5 sekunder.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Værste billedtid over de sidste 5 sekunder.",
"debugBar.frame.tip": "Længste billedrammetid over de sidste 5 sekunder.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Billeder over 32ms i de sidste 5 sekunder.",
"debugBar.jank.tip": "Billedrammer over 32 ms i de sidste 5 sekunder.",
"debugBar.long.label": "LONG",
"debugBar.long.tip": "Blokeret tid og antal lange opgaver i de sidste 5 sekunder. Maks opgave: {{max}}.",
"debugBar.delay.label": "DELAY",
@@ -1065,8 +1072,8 @@ export const dict = {
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Kumulativt layoutskift for den nuværende app-levetid.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Brugt JS-heap vs heap-grænse. Kun Chromium.",
"debugBar.mem.tip": "Brugt JS-heap vs heap-grænse. {{used}} af {{limit}}.",
"debugBar.mem.tipUnavailable": "Brugt JS-heap sammenholdt med heapgrænsen. Kun Chromium.",
"debugBar.mem.tip": "Brugt JS-heap sammenholdt med heapgrænsen. {{used}} af {{limit}}.",
"common.key.ctrl": "Ctrl",
"common.key.alt": "Alt",
"common.key.shift": "Shift",
+101 -94
View File
@@ -98,13 +98,14 @@ export const dict = {
"dialog.provider.empty": "Keine Anbieter gefunden",
"dialog.provider.group.popular": "Beliebt",
"dialog.provider.group.other": "Andere",
"dialog.provider.custom.label": "Benutzerdefinierter OpenAI-kompatibler Anbieter",
"dialog.provider.tag.recommended": "Empfohlen",
"dialog.provider.opencode.note": "Kuratierte Modelle inklusive Claude, GPT, Gemini und mehr",
"dialog.provider.opencode.tagline": "Zuverlässige, optimierte Modelle",
"dialog.provider.opencodeGo.tagline": "Kostengünstiges Abo für alle",
"dialog.provider.anthropic.note": "Mit Claude Pro/Max oder API-Schlüssel verbinden",
"dialog.provider.copilot.note": "Mit Copilot oder API-Schlüssel verbinden",
"dialog.provider.openai.note": "Mit ChatGPT Pro/Plus oder API-Schlüssel verbinden",
"dialog.provider.anthropic.note": "Direkter Zugriff auf Claude-Modelle, einschließlich Pro und Max",
"dialog.provider.copilot.note": "KI-Modelle zur Programmierunterstützung über GitHub Copilot",
"dialog.provider.openai.note": "GPT-Modelle für schnelle, leistungsfähige allgemeine KI-Aufgaben",
"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.vercel.note": "Einheitlicher Zugriff auf KI-Modelle mit intelligentem Routing",
@@ -116,17 +117,18 @@ export const dict = {
"dialog.model.manage.provider.toggle": "Alle {{provider}}-Modelle umschalten",
"dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von OpenCode",
"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",
"provider.connect.title": "{{provider}} verbinden",
"provider.connect.title.anthropicProMax": "Mit Claude Pro/Max anmelden",
"provider.connect.selectMethod": "Anmeldemethode für {{provider}} auswählen.",
"provider.connect.method.apiKey": "API-Schlüssel",
"provider.connect.status.inProgress": "Autorisierung läuft...",
"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.apiKey.description":
"Geben Sie Ihren {{provider}} API-Schlüssel ein, um Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.",
"provider.connect.apiKey.label": "{{provider}} API-Schlüssel",
"Geben Sie Ihren API-Schlüssel für {{provider}} 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.placeholder": "API-Schlüssel",
"provider.connect.apiKey.required": "API-Schlüssel ist erforderlich",
"provider.connect.opencodeZen.line1":
@@ -139,21 +141,21 @@ export const dict = {
"provider.connect.oauth.code.visit.prefix": "Besuchen Sie ",
"provider.connect.oauth.code.visit.link": "diesen Link",
"provider.connect.oauth.code.visit.suffix":
", um Ihren Autorisierungscode zu erhalten, Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.",
"provider.connect.oauth.code.label": "{{method}} Autorisierungscode",
", 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.placeholder": "Autorisierungscode",
"provider.connect.oauth.code.required": "Autorisierungscode ist erforderlich",
"provider.connect.oauth.code.invalid": "Ungültiger Autorisierungscode",
"provider.connect.oauth.auto.visit.prefix": "Besuchen Sie ",
"provider.connect.oauth.auto.visit.link": "diesen Link",
"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.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.description.prefix": "Konfigurieren Sie einen OpenAI-kompatiblen Anbieter. Siehe die ",
"provider.custom.description.link": "Anbieter-Konfigurationsdokumente",
"provider.custom.description.link": "Dokumentation zur Anbieterkonfiguration",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "Anbieter-ID",
"provider.custom.field.providerID.placeholder": "myprovider",
@@ -208,32 +210,32 @@ export const dict = {
"model.tooltip.model": "Modell",
"model.tooltip.provider": "Anbieter",
"model.tooltip.reasoning": "Reasoning",
"model.tooltip.reasoning.allowed": "Erlaubt Reasoning",
"model.tooltip.reasoning.allowed": "Reasoning möglich",
"model.tooltip.reasoning.none": "Kein Reasoning",
"model.tooltip.context": "Kontextlimit {{limit}}",
"common.search.placeholder": "Suchen",
"common.goBack": "Zurück",
"common.goForward": "Vorwärts navigieren",
"common.loading": "Laden",
"common.loading.ellipsis": "...",
"common.loading": "Wird geladen",
"common.loading.ellipsis": "",
"common.cancel": "Abbrechen",
"common.clear": "Leeren",
"common.connect": "Verbinden",
"common.disconnect": "Trennen",
"common.continue": "Absenden",
"common.continue": "Weiter",
"common.submit": "Absenden",
"common.save": "Speichern",
"common.saving": "Speichert...",
"common.saving": "Wird gespeichert",
"common.default": "Standard",
"common.attachment": "Anhang",
"prompt.placeholder.shell": "Shell-Befehl eingeben... {{example}}",
"prompt.placeholder.normal": 'Fragen Sie alles... "{{example}}"',
"prompt.placeholder.simple": "Fragen Sie alles...",
"prompt.placeholder.shell": "Shell-Befehl eingeben {{example}}",
"prompt.placeholder.normal": 'Beliebige Frage stellen… "{{example}}"',
"prompt.placeholder.simple": "Beliebige Frage stellen…",
"prompt.placeholder.summarizeComments": "Kommentare zusammenfassen…",
"prompt.placeholder.summarizeComment": "Kommentar zusammenfassen…",
"prompt.mode.shell": "Shell",
"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.backToParent": "Zurück zur Hauptsitzung.",
"prompt.example.1": "Ein TODO in der Codebasis beheben",
@@ -248,8 +250,8 @@ export const dict = {
"prompt.example.10": "API-Dokumentation generieren",
"prompt.example.11": "Datenbankabfragen optimieren",
"prompt.example.12": "Eingabevalidierung hinzufügen",
"prompt.example.13": "Neue Komponente erstellen für...",
"prompt.example.14": "Wie deploye ich dieses Projekt?",
"prompt.example.13": "Neue Komponente erstellen für",
"prompt.example.14": "Wie stelle ich dieses Projekt bereit?",
"prompt.example.15": "Meinen Code auf Best Practices überprüfen",
"prompt.example.16": "Fehlerbehandlung zu dieser Funktion hinzufügen",
"prompt.example.17": "Erkläre dieses Regex-Muster",
@@ -259,12 +261,12 @@ export const dict = {
"prompt.example.21": "Hilf mir, ein Migrationsskript zu schreiben",
"prompt.example.22": "Caching für diesen Endpunkt implementieren",
"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.popover.emptyResults": "Keine passenden Ergebnisse",
"prompt.popover.emptyCommands": "Keine passenden Befehle",
"prompt.dropzone.label": "Bilder, PDFs oder Textdateien hier ablegen",
"prompt.dropzone.file.label": "Ablegen zum @Erwähnen der Datei",
"prompt.dropzone.file.label": "Ablegen, um die Datei mit @ zu erwähnen",
"prompt.slash.badge.custom": "benutzerdefiniert",
"prompt.slash.badge.skill": "Skill",
"prompt.slash.badge.mcp": "MCP",
@@ -280,14 +282,14 @@ export const dict = {
"prompt.menu.shellCommand": "Shell-Befehl",
"prompt.attachment.remove": "Anhang entfernen",
"prompt.action.send": "Senden",
"prompt.action.stop": "Stopp",
"prompt.action.stop": "Stoppen",
"prompt.toast.pasteUnsupported.title": "Nicht unterstützter Anhang",
"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.modelAgentRequired.title": "Wählen Sie einen Agenten und ein Modell",
"prompt.toast.modelAgentRequired.description":
"Wählen Sie einen Agenten und ein Modell, bevor Sie eine Eingabe senden.",
"prompt.toast.worktreeCreateFailed.title": "Worktree konnte nicht erstellt werden",
"prompt.toast.worktreeCreateFailed.title": "Der Worktree 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.commandSendFailed.title": "Befehl konnte nicht gesendet werden",
@@ -300,7 +302,7 @@ export const dict = {
"dialog.plugins.empty": "In opencode.json konfigurierte Plugins",
"mcp.status.connected": "verbunden",
"mcp.status.failed": "fehlgeschlagen",
"mcp.status.needs_auth": "benötigt Authentifizierung",
"mcp.status.needs_auth": "Authentifizierung erforderlich",
"mcp.auth.clickToAuthenticate": "Zum Authentifizieren klicken",
"mcp.status.disabled": "deaktiviert",
"dialog.fork.empty": "Keine Nachrichten zum Abzweigen vorhanden",
@@ -316,10 +318,10 @@ export const dict = {
"dialog.server.search.placeholder": "Server durchsuchen",
"dialog.server.empty": "Noch keine Server",
"dialog.server.add.title": "Server hinzufügen",
"dialog.server.add.url": "Server-URL",
"dialog.server.add.url": "Serveradresse",
"dialog.server.add.placeholder": "http://localhost:4096",
"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.name": "Servername (optional)",
"dialog.server.add.namePlaceholder": "Localhost",
@@ -328,7 +330,7 @@ export const dict = {
"dialog.server.edit.title": "Server bearbeiten",
"dialog.server.default.title": "Standardserver",
"dialog.server.default.description":
"Beim App-Start mit diesem Server verbinden, anstatt einen lokalen Server zu starten. Erfordert Neustart.",
"Beim App-Start mit diesem Server verbinden, anstatt einen lokalen Server zu starten. Ein Neustart ist erforderlich.",
"dialog.server.default.none": "Kein Server ausgewählt",
"dialog.server.default.set": "Aktuellen Server als Standard setzen",
"dialog.server.default.clear": "Löschen",
@@ -344,26 +346,26 @@ export const dict = {
"wsl.server.label": "WSL",
"wsl.server.menu.label": "WSL-Server",
"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.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.ready": "WSL ist bereit.",
"wsl.onboarding.required": "WSL ist erforderlich, um fortzufahren.",
"wsl.onboarding.checkingDistros": "Distributionen werden geprüft...",
"wsl.onboarding.installingDistro": "{{distro}} wird installiert...",
"wsl.onboarding.checkingDistro": "{{distro}} wird geprüft...",
"wsl.onboarding.listingDistros": "Distributionen werden aufgelistet...",
"wsl.onboarding.checkingDistros": "Distributionen werden geprüft",
"wsl.onboarding.installingDistro": "{{distro}} wird installiert",
"wsl.onboarding.checkingDistro": "{{distro}} wird geprüft",
"wsl.onboarding.listingDistros": "Distributionen werden aufgelistet",
"wsl.onboarding.distroReady": "{{distro}} ist bereit.",
"wsl.onboarding.distroNotInstalled": "{{distro}} ist noch nicht installiert.",
"wsl.onboarding.openDistroOnce": "Öffnen Sie {{distro}} einmal, um die Einrichtung abzuschließen.",
"wsl.onboarding.finishingDistro": "Einrichtung von {{distro}} wird abgeschlossen.",
"wsl.onboarding.pickDistro": "Wählen Sie eine Distribution aus oder installieren Sie unten eine.",
"wsl.onboarding.checkingOpencode": "OpenCode wird geprüft...",
"wsl.onboarding.checkingOpencodeIn": "OpenCode in {{distro}} wird geprüft...",
"wsl.onboarding.updatingOpencode": "OpenCode wird aktualisiert...",
"wsl.onboarding.updatingOpencodeIn": "OpenCode in {{distro}} wird aktualisiert...",
"wsl.onboarding.checkingOpencode": "OpenCode wird geprüft",
"wsl.onboarding.checkingOpencodeIn": "OpenCode in {{distro}} wird geprüft",
"wsl.onboarding.updatingOpencode": "OpenCode wird aktualisiert",
"wsl.onboarding.updatingOpencodeIn": "OpenCode in {{distro}} wird aktualisiert",
"wsl.onboarding.updateOpencodeIn": "Aktualisieren Sie OpenCode in {{distro}}.",
"wsl.onboarding.updateOpencode": "OpenCode aktualisieren",
"wsl.onboarding.opencodeReadyIn": "OpenCode ist in {{distro}} bereit.",
@@ -372,11 +374,11 @@ export const dict = {
"wsl.onboarding.installOpencode": "OpenCode installieren",
"wsl.onboarding.chooseDistroFirst": "Wählen Sie zuerst eine Distribution aus.",
"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.checkAgain": "Erneut prüfen",
"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.missingTools": "Fehlend: bash, curl",
"wsl.onboarding.distroStatus.unsupported": "Nicht unterstützt · WSL 2 verwenden",
@@ -395,7 +397,7 @@ export const dict = {
"wsl.onboarding.allDistrosAdded": "Alle installierten Distributionen wurden bereits hinzugefügt.",
"wsl.onboarding.noDistros": "Noch keine Distributionen erkannt.",
"wsl.onboarding.install": "Installieren",
"wsl.onboarding.installing": "Wird installiert...",
"wsl.onboarding.installing": "Wird installiert",
"wsl.onboarding.installDistro": "Distribution installieren",
"wsl.onboarding.searchDistros": "Distributionen durchsuchen",
"wsl.onboarding.wsl2Required": "WSL 2 ist erforderlich.",
@@ -407,13 +409,13 @@ export const dict = {
"wsl.onboarding.unknown": "unbekannt",
"wsl.onboarding.desktopVersion": "Desktop {{version}}",
"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.name": "Name",
"dialog.project.edit.icon": "Icon",
"dialog.project.edit.icon.alt": "Projekt-Icon",
"dialog.project.edit.icon": "Symbol",
"dialog.project.edit.icon.alt": "Projektsymbol",
"dialog.project.edit.icon.hint": "Klicken oder Bild ziehen",
"dialog.project.edit.icon.recommended": "Empfohlen: 128x128px",
"dialog.project.edit.icon.recommended": "Empfohlen: 128 × 128 px",
"dialog.project.edit.color": "Farbe",
"dialog.project.edit.color.select": "{{color}}-Farbe auswählen",
"dialog.project.edit.worktree.startup": "Startup-Skript für Arbeitsbereich",
@@ -489,7 +491,7 @@ export const dict = {
"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.success.title": "Sitzung geteilt",
"toast.session.share.success.description": "Teilen-URL in die Zwischenablage kopiert!",
"toast.session.share.success.description": "URL zum Teilen in die Zwischenablage kopiert!",
"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.unshare.success.title": "Teilen der Sitzung aufgehoben",
@@ -509,14 +511,14 @@ export const dict = {
"error.page.action.report": "Fehler melden",
"error.page.action.reported": "Fehler gemeldet",
"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.updateTo": "Auf {{version}} aktualisieren",
"error.page.report.prefix": "Bitte melden Sie diesen Fehler dem OpenCode-Team",
"error.page.report.discord": "auf Discord",
"error.page.version": "Version: {{version}}",
"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}}`?",
"directory.error.invalidUrl": "Ungültiges Verzeichnis in der URL.",
"error.chain.unknown": "Unbekannter Fehler",
@@ -524,10 +526,10 @@ export const dict = {
"error.chain.apiError": "API-Fehler",
"error.chain.status": "Status: {{status}}",
"error.chain.retryable": "Wiederholbar: {{retryable}}",
"error.chain.responseBody": "Antwort-Body:\n{{body}}",
"error.chain.responseBody": "Antwortinhalt:\n{{body}}",
"error.chain.didYouMean": "Meinten Sie: {{suggestions}}",
"error.chain.modelNotFound": "Modell nicht gefunden: {{provider}}/{{model}}",
"error.chain.checkConfig": "Überprüfen Sie Ihre Konfiguration (opencode.json) auf Anbieter-/Modellnamen",
"error.chain.checkConfig": "Überprüfen Sie die Anbieter- und Modellnamen in Ihrer Konfiguration (opencode.json)",
"error.chain.mcpFailed":
'MCP-Server "{{name}}" fehlgeschlagen. Hinweis: OpenCode unterstützt noch keine MCP-Authentifizierung.',
"error.chain.providerAuthFailed": "Anbieter-Authentifizierung fehlgeschlagen ({{provider}}): {{message}}",
@@ -568,7 +570,7 @@ export const dict = {
"home.sessions.group.yesterday": "Gestern",
"home.sessions.group.older": "Älter",
"home.providerTip":
"Verbinde dich mit über 75 Anbietern, um weitere Modelle wie Claude, GPT, Gemini und andere zu nutzen",
"OpenCode mit über 75 Anbietern verbinden, um weitere Modelle wie Claude, GPT, Gemini und andere zu nutzen",
"session.tab.session": "Sitzung",
"session.tab.review": "Überprüfung",
"session.tab.context": "Kontext",
@@ -579,12 +581,12 @@ export const dict = {
"Dieser Tab verweist auf eine Sitzung, die auf diesem Server nicht mehr existiert.",
"session.error.notFound.closeTab": "Tab schließen",
"session.error.serverConnection": "Verbindung zu diesem Server nicht möglich",
"session.review.filesChanged": "{{count}} Dateien geändert",
"session.review.filesChanged": "Geänderte Dateien: {{count}}",
"session.review.change.one": "Änderung",
"session.review.change.other": "Änderungen",
"session.review.loadingChanges": "Lade Änderungen...",
"session.review.loadingChanges": "Änderungen werden geladen…",
"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":
"Snapshot-Tracking ist in der Konfiguration deaktiviert, daher sind Sitzungsänderungen nicht verfügbar",
"session.review.noChanges": "Keine Änderungen",
@@ -595,10 +597,10 @@ export const dict = {
"session.files.empty": "Keine Dateien",
"session.files.binaryContent": "Binärdatei (Inhalt kann nicht angezeigt werden)",
"session.messages.renderEarlier": "Frühere Nachrichten rendern",
"session.messages.loadingEarlier": "Lade frühere Nachrichten...",
"session.messages.loadingEarlier": "Frühere Nachrichten werden geladen…",
"session.messages.loadEarlier": "Frühere Nachrichten laden",
"session.messages.loading": "Lade Nachrichten...",
"session.messages.jumpToLatest": "Zum neuesten springen",
"session.messages.loading": "Nachrichten werden geladen…",
"session.messages.jumpToLatest": "Zur neuesten Nachricht springen",
"session.context.addToContext": "{{selection}} zum Kontext hinzufügen",
"session.todo.title": "Aufgaben",
"session.todo.collapse": "Einklappen",
@@ -618,7 +620,7 @@ export const dict = {
"session.revertDock.collapse": "Zurückgesetzte Nachrichten einklappen",
"session.revertDock.expand": "Zurückgesetzte Nachrichten ausklappen",
"session.revertDock.restore": "Nachricht wiederherstellen",
"session.new.title": "Baue, was du willst",
"session.new.title": "Alles entwickeln",
"session.new.project.new": "Neues Projekt",
"session.new.project.search": "Projekte durchsuchen",
"session.new.project.add": "Projekt hinzufügen",
@@ -652,16 +654,16 @@ export const dict = {
"Sitzung öffentlich im Web teilen. Sie wird für jeden mit dem Link zugänglich sein.",
"session.share.action.share": "Teilen",
"session.share.action.publish": "Veröffentlichen",
"session.share.action.publishing": "Veröffentliche...",
"session.share.action.publishing": "Wird veröffentlicht…",
"session.share.action.unpublish": "Veröffentlichung aufheben",
"session.share.action.unpublishing": "Hebe Veröffentlichung auf...",
"session.share.action.unpublishing": "Veröffentlichung wird aufgehoben…",
"session.share.action.view": "Ansehen",
"session.share.copy.copied": "Kopiert",
"session.share.copy.copyLink": "Link kopieren",
"lsp.tooltip.none": "Keine LSP-Server",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Lade Prompt...",
"terminal.loading": "Lade Terminal...",
"prompt.loading": "Prompt wird geladen…",
"terminal.loading": "Terminal wird geladen…",
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Terminal schließen",
@@ -728,12 +730,12 @@ export const dict = {
"settings.general.row.font.title": "Code-Schriftart",
"settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen",
"settings.general.row.terminalFont.title": "Terminalschriftart",
"settings.general.row.terminalFont.description": "Passe die im Terminal verwendete Schriftart an",
"settings.general.row.terminalFont.description": "Die im Terminal verwendete Schriftart anpassen",
"settings.general.row.uiFont.title": "UI-Schriftart",
"settings.general.row.uiFont.description": "Die im gesamten Interface verwendete Schriftart anpassen",
"settings.general.row.followup.title": "Verhalten bei Folgefragen",
"settings.general.row.uiFont.description": "Die in der gesamten Benutzeroberfläche verwendete Schriftart anpassen",
"settings.general.row.followup.title": "Verhalten bei Folgeeingaben",
"settings.general.row.followup.description":
"Wählen Sie, ob Folgefragen sofort steuern oder in einer Warteschlange warten",
"Wählen Sie, ob Folgeeingaben die laufende Sitzung sofort steuern oder in einer Warteschlange warten",
"settings.general.row.followup.option.queue": "Warteschlange",
"settings.general.row.followup.option.steer": "Steuern",
"settings.general.row.showFileTree.title": "Dateibaum",
@@ -751,8 +753,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Navigation unten",
"settings.general.row.mobileTitlebarBottom.description":
"Titelleiste und Sitzungs-Tabs auf Mobilgeräten am unteren Bildschirmrand platzieren",
"settings.general.row.showCustomAgents.title": "Benutzerdefinierte Agenten",
"settings.general.row.showCustomAgents.description": "Agentenauswahl im Eingabebereich anzeigen",
"settings.general.row.showCustomAgents.title": "Agent anzeigen",
"settings.general.row.showCustomAgents.description":
"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.description":
"Zusammenfassungen des Modell-Reasonings in der Timeline anzeigen",
@@ -772,7 +775,7 @@ export const dict = {
"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.wayland.title": "Natives Wayland verwenden",
"settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Erfordert Neustart.",
"settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Ein Neustart ist erforderlich.",
"settings.general.row.wayland.tooltip":
"Unter Linux mit Monitoren unterschiedlicher Bildwiederholraten kann natives Wayland stabiler sein.",
"settings.general.row.releaseNotes.title": "Versionshinweise",
@@ -782,11 +785,11 @@ export const dict = {
"settings.updates.row.check.title": "Nach Updates suchen",
"settings.updates.row.check.description": "Manuell nach Updates suchen und installieren, wenn verfügbar",
"settings.updates.action.checkNow": "Jetzt prüfen",
"settings.updates.action.checking": "Wird geprüft...",
"settings.updates.action.downloading": "Wird heruntergeladen...",
"settings.updates.action.installing": "Wird installiert...",
"settings.updates.toast.latest.title": "Du bist auf dem neuesten Stand",
"settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von OpenCode.",
"settings.updates.action.checking": "Wird geprüft",
"settings.updates.action.downloading": "Wird heruntergeladen",
"settings.updates.action.installing": "Wird installiert",
"settings.updates.toast.latest.title": "OpenCode ist auf dem neuesten Stand",
"settings.updates.toast.latest.description": "Die aktuelle Version von OpenCode wird verwendet.",
"sound.option.none": "Keine",
"sound.option.alert01": "Alarm 01",
"sound.option.alert02": "Alarm 02",
@@ -902,8 +905,8 @@ export const dict = {
"settings.permissions.tool.bash.description": "Shell-Befehle ausführen",
"settings.permissions.tool.task.title": "Aufgabe",
"settings.permissions.tool.task.description": "Unteragenten starten",
"settings.permissions.tool.skill.title": "Fähigkeit",
"settings.permissions.tool.skill.description": "Eine Fähigkeit nach Namen laden",
"settings.permissions.tool.skill.title": "Skill",
"settings.permissions.tool.skill.description": "Einen Skill anhand des Namens laden",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "Language-Server-Abfragen ausführen",
"settings.permissions.tool.todowrite.title": "Todo schreiben",
@@ -931,7 +934,7 @@ export const dict = {
"workspace.reset.success.title": "Arbeitsbereich zurückgesetzt",
"workspace.reset.success.description": "Der Arbeitsbereich entspricht jetzt dem Standard-Branch.",
"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.clean": "Keine nicht zusammengeführten Änderungen erkannt.",
"workspace.status.dirty": "Nicht zusammengeführte Änderungen in diesem Arbeitsbereich erkannt.",
@@ -961,7 +964,7 @@ export const dict = {
"settings.providers.custom.description": "Fügen Sie einen OpenAI-kompatiblen Anbieter per Basis-URL hinzu.",
"app.server.unreachable": "Konnte {{server}} nicht erreichen",
"app.server.retrying": "Automatische erneute Verbindung...",
"app.server.retrying": "Verbindung wird automatisch erneut hergestellt…",
"app.server.otherServers": "Andere Server",
"dialog.server.add.usernamePlaceholder": "Benutzername",
"dialog.server.add.passwordPlaceholder": "Passwort",
@@ -969,12 +972,15 @@ export const dict = {
"session.review.noVcs.createGit.title": "Git-Repository erstellen",
"session.review.noVcs.createGit.description":
"Ä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.todo.progress": "{{done}} von {{total}} Aufgaben erledigt",
"session.question.progress": "{{current}} von {{total}} Fragen",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -989,29 +995,30 @@ export const dict = {
"session.header.open.app.androidStudio": "Android Studio",
"session.header.open.app.powershell": "PowerShell",
"session.header.open.app.sublimeText": "Sublime Text",
"debugBar.ariaLabel": "Entwicklungs-Leistungsdiagnose",
"debugBar.ariaLabel": "Leistungsdiagnose für die Entwicklung",
"debugBar.na": "n.v.",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip":
"Letzter abgeschlossener Routenübergang, der eine Sitzungsseite berührt, gemessen vom Start des Routers bis zum ersten Rendern nach dem Einschwingen.",
"Letzter abgeschlossener Routenübergang zu einer Sitzungsseite, gemessen vom Start des Routers bis zum ersten Rendering nach Abschluss des Übergangs.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Gleitende Bilder pro Sekunde in den letzten 5 Sekunden.",
"debugBar.fps.tip": "Gleitender Mittelwert der Frames pro Sekunde in den letzten 5 Sekunden.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Schlechteste Frame-Zeit in den letzten 5 Sekunden.",
"debugBar.frame.tip": "Längste Framedauer in den letzten 5 Sekunden.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Frames über 32ms in den letzten 5 Sekunden.",
"debugBar.jank.tip": "Frames über 32 ms in den letzten 5 Sekunden.",
"debugBar.long.label": "LONG",
"debugBar.long.tip": "Blockierte Zeit und Anzahl langer Aufgaben in den letzten 5 Sekunden. Max Aufgabe: {{max}}.",
"debugBar.long.tip":
"Blockierte Zeit und Anzahl langer Aufgaben in den letzten 5 Sekunden. Längste Aufgabe: {{max}}.",
"debugBar.delay.label": "DELAY",
"debugBar.delay.tip": "Schlechteste beobachtete Eingabeverzögerung in den letzten 5 Sekunden.",
"debugBar.inp.label": "INP",
"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.tip": "Kumulative Layoutverschiebung für die aktuelle App-Lebensdauer.",
"debugBar.cls.tip": "Kumulative Layoutverschiebung während der aktuellen App-Laufzeit.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Verwendeter JS-Heap vs Heap-Limit. Nur Chromium.",
"debugBar.mem.tip": "Verwendeter JS-Heap vs Heap-Limit. {{used}} von {{limit}}.",
"debugBar.mem.tipUnavailable": "Belegter JS-Heap im Verhältnis zum Heap-Limit. Nur Chromium.",
"debugBar.mem.tip": "Belegter JS-Heap im Verhältnis zum Heap-Limit. {{used}} von {{limit}}.",
"common.key.ctrl": "Strg",
"common.key.alt": "Alt",
"common.key.shift": "Umschalt",
@@ -1032,7 +1039,7 @@ export const dict = {
"error.serverSDK.serverNotAvailable": "Server nicht verfügbar",
"error.childStore.persistedCacheCreateFailed": "Dauerhafter Cache konnte nicht erstellt werden",
"error.childStore.persistedProjectMetadataCreateFailed": "Dauerhafte Projektmetadaten konnten nicht erstellt werden",
"error.childStore.persistedProjectIconCreateFailed": "Dauerhaftes Projekticon konnte nicht erstellt werden",
"error.childStore.persistedProjectIconCreateFailed": "Dauerhaftes Projektsymbol konnte nicht erstellt werden",
"error.childStore.storeCreateFailed": "Speicher konnte nicht erstellt werden",
"terminal.connectionLost.abnormalClose": "WebSocket abnormal geschlossen: {{code}}",
"terminal.connectionLost.abnormalClose": "WebSocket unerwartet geschlossen: {{code}}",
} satisfies Partial<Record<Keys, string>>
+107 -101
View File
@@ -21,7 +21,7 @@ export const dict = {
"theme.scheme.light": "Claro",
"theme.scheme.dark": "Oscuro",
"command.sidebar.toggle": "Alternar barra lateral",
"command.sidebar.toggle": "Mostrar u ocultar barra lateral",
"command.project.open": "Abrir proyecto",
"command.project.previous": "Proyecto anterior",
"command.project.next": "Siguiente proyecto",
@@ -37,12 +37,12 @@ export const dict = {
"command.palette": "Paleta de comandos",
"command.theme.cycle": "Alternar tema",
"command.theme.cycle": "Cambiar tema",
"command.theme.set": "Usar tema: {{theme}}",
"command.theme.scheme.cycle": "Alternar esquema de color",
"command.theme.scheme.cycle": "Cambiar esquema de color",
"command.theme.scheme.set": "Usar esquema de color: {{scheme}}",
"command.language.cycle": "Alternar idioma",
"command.language.cycle": "Cambiar idioma",
"command.language.set": "Usar idioma: {{language}}",
"command.session.new": "Nueva sesión",
@@ -52,12 +52,12 @@ export const dict = {
"command.context.addSelection": "Añadir selección al contexto",
"command.context.addSelection.description": "Añadir las líneas seleccionadas del archivo actual",
"command.input.focus": "Enfocar entrada",
"command.terminal.toggle": "Alternar terminal",
"command.fileTree.toggle": "Alternar árbol de archivos",
"command.review.toggle": "Alternar revisión",
"command.terminal.toggle": "Mostrar u ocultar terminal",
"command.fileTree.toggle": "Mostrar u ocultar árbol de archivos",
"command.review.toggle": "Mostrar u ocultar revisión",
"command.terminal.new": "Nueva terminal",
"command.terminal.new.description": "Crear una nueva pestaña de terminal",
"command.steps.toggle": "Alternar pasos",
"command.steps.toggle": "Mostrar u ocultar pasos",
"command.steps.toggle.description": "Mostrar u ocultar pasos para el mensaje actual",
"command.message.previous": "Mensaje anterior",
"command.message.previous.description": "Ir al mensaje de usuario anterior",
@@ -65,19 +65,19 @@ export const dict = {
"command.message.next.description": "Ir al siguiente mensaje de usuario",
"command.model.choose": "Elegir modelo",
"command.model.choose.description": "Seleccionar un modelo diferente",
"command.mcp.toggle": "Alternar MCPs",
"command.mcp.toggle.description": "Alternar MCPs",
"command.agent.cycle": "Alternar agente",
"command.mcp.toggle": "Activar o desactivar servidores MCP",
"command.mcp.toggle.description": "Activar o desactivar servidores MCP",
"command.agent.cycle": "Cambiar de agente",
"command.agent.cycle.description": "Cambiar al siguiente agente",
"command.agent.cycle.reverse": "Alternar agente hacia atrás",
"command.agent.cycle.reverse": "Cambiar al agente anterior",
"command.agent.cycle.reverse.description": "Cambiar al agente anterior",
"command.model.variant.cycle": "Alternar esfuerzo de pensamiento",
"command.model.variant.cycle": "Cambiar esfuerzo de razonamiento",
"command.model.variant.cycle.description": "Cambiar al siguiente nivel de esfuerzo",
"command.prompt.mode.shell": "Shell",
"command.prompt.mode.normal": "Prompt",
"command.permissions.autoaccept.enable": "Aceptar permisos automáticamente",
"command.permissions.autoaccept.disable": "Dejar de aceptar permisos automáticamente",
"command.workspace.toggle": "Alternar espacios de trabajo",
"command.workspace.toggle": "Activar o desactivar espacios de trabajo",
"command.workspace.toggle.description": "Habilitar o deshabilitar múltiples espacios de trabajo en la barra lateral",
"command.session.undo": "Deshacer",
"command.session.undo.description": "Deshacer el último mensaje",
@@ -100,17 +100,18 @@ export const dict = {
"dialog.provider.search.placeholder": "Buscar proveedores",
"dialog.provider.empty": "No se encontraron proveedores",
"dialog.provider.group.popular": "Popular",
"dialog.provider.group.other": "Otro",
"dialog.provider.group.popular": "Populares",
"dialog.provider.group.other": "Otros",
"dialog.provider.custom.label": "Proveedor personalizado compatible con OpenAI",
"dialog.provider.tag.recommended": "Recomendado",
"dialog.provider.opencode.note": "Modelos seleccionados incluyendo Claude, GPT, Gemini y s",
"dialog.provider.opencode.note": "Selección de modelos como Claude, GPT, Gemini y otros",
"dialog.provider.opencode.tagline": "Modelos optimizados y fiables",
"dialog.provider.opencodeGo.tagline": "Suscripción económica para todos",
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluyendo Pro y Max",
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluidos Pro y Max",
"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.google.note": "Modelos Gemini para respuestas rápidas y estructuradas",
"dialog.provider.openrouter.note": "Accede a todos los modelos soportados desde un solo proveedor",
"dialog.provider.openrouter.note": "Accede a todos los modelos compatibles desde un solo proveedor",
"dialog.provider.vercel.note": "Acceso unificado a modelos de IA con enrutamiento inteligente",
"dialog.model.select.title": "Seleccionar modelo",
@@ -118,10 +119,11 @@ export const dict = {
"dialog.model.empty": "Sin resultados de modelos",
"dialog.model.manage": "Gestionar modelos",
"dialog.model.manage.description": "Personalizar qué modelos aparecen en el selector de modelos.",
"dialog.model.manage.provider.toggle": "Alternar todos los modelos de {{provider}}",
"dialog.model.manage.provider.toggle": "Mostrar u ocultar todos los modelos de {{provider}}",
"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.viewMoreProviders": "Ver más de 70 proveedores",
"dialog.provider.viewAll": "Ver más proveedores",
@@ -173,7 +175,8 @@ export const dict = {
"provider.custom.field.baseURL.placeholder": "https://api.miproveedor.com/v1",
"provider.custom.field.apiKey.label": "Clave API",
"provider.custom.field.apiKey.placeholder": "Clave API",
"provider.custom.field.apiKey.description": "Opcional. Dejar vacío si gestionas la autenticación mediante cabeceras.",
"provider.custom.field.apiKey.description":
"Opcional. Déjalo vacío si gestionas la autenticación mediante encabezados.",
"provider.custom.models.label": "Modelos",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "id-modelo",
@@ -181,13 +184,13 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nombre para mostrar",
"provider.custom.models.remove": "Eliminar modelo",
"provider.custom.models.add": "Añadir modelo",
"provider.custom.headers.label": "Cabeceras (opcional)",
"provider.custom.headers.key.label": "Cabecera",
"provider.custom.headers.key.placeholder": "Nombre-Cabecera",
"provider.custom.headers.label": "Encabezados (opcional)",
"provider.custom.headers.key.label": "Encabezado",
"provider.custom.headers.key.placeholder": "Nombre-Encabezado",
"provider.custom.headers.value.label": "Valor",
"provider.custom.headers.value.placeholder": "valor",
"provider.custom.headers.remove": "Eliminar cabecera",
"provider.custom.headers.add": "Añadir cabecera",
"provider.custom.headers.remove": "Eliminar encabezado",
"provider.custom.headers.add": "Añadir encabezado",
"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.exists": "Ese ID de proveedor ya existe",
@@ -201,7 +204,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
"model.tag.free": "Gratis",
"model.tag.latest": "Último",
"model.tag.latest": "Más reciente",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -211,7 +214,7 @@ export const dict = {
"model.input.image": "imagen",
"model.input.audio": "audio",
"model.input.video": "video",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "Permite: {{inputs}}",
"model.tooltip.context.label": "Contexto",
"model.tooltip.inputs": "Entradas",
@@ -231,7 +234,7 @@ export const dict = {
"common.clear": "Limpiar",
"common.connect": "Conectar",
"common.disconnect": "Desconectar",
"common.continue": "Enviar",
"common.continue": "Continuar",
"common.submit": "Enviar",
"common.save": "Guardar",
"common.saving": "Guardando...",
@@ -250,7 +253,7 @@ export const dict = {
"session.child.backToParent": "Volver a la sesión principal.",
"prompt.example.1": "Arreglar un TODO en el código",
"prompt.example.2": "¿Cuál es el stack tecnológico de este proyecto?",
"prompt.example.2": "¿Qué tecnologías usa este proyecto?",
"prompt.example.3": "Arreglar pruebas rotas",
"prompt.example.4": "Explicar cómo funciona la autenticación",
"prompt.example.5": "Encontrar y arreglar vulnerabilidades de seguridad",
@@ -263,22 +266,22 @@ export const dict = {
"prompt.example.12": "Añadir validación de entrada",
"prompt.example.13": "Crear un nuevo componente para...",
"prompt.example.14": "¿Cómo despliego este proyecto?",
"prompt.example.15": "Revisar mi código para mejores prácticas",
"prompt.example.16": "Añadir manejo de errores a esta función",
"prompt.example.17": "Explicar este patrón de regex",
"prompt.example.15": "Revisar si mi código sigue las prácticas recomendadas",
"prompt.example.16": "Añadir gestión de errores a esta función",
"prompt.example.17": "Explicar este patrón de expresión regular",
"prompt.example.18": "Convertir esto a TypeScript",
"prompt.example.19": "Añadir logging en todo el código",
"prompt.example.19": "Añadir registros en todo el código",
"prompt.example.20": "¿Qué dependencias están desactualizadas?",
"prompt.example.21": "Ayúdame a escribir un script de migración",
"prompt.example.22": "Implementar caché para este endpoint",
"prompt.example.22": "Implementar caché para este punto de conexión",
"prompt.example.23": "Añadir paginación a esta lista",
"prompt.example.24": "Crear un comando CLI para...",
"prompt.example.25": "¿Cómo funcionan las variables de entorno aquí?",
"prompt.popover.emptyResults": "Sin resultados coincidentes",
"prompt.popover.emptyCommands": "Sin comandos coincidentes",
"prompt.dropzone.label": "Suelta imágenes, PDFs o archivos de texto aquí",
"prompt.dropzone.file.label": "Suelta para @mencionar archivo",
"prompt.dropzone.label": "Suelta aquí imágenes, archivos PDF o archivos de texto",
"prompt.dropzone.file.label": "Suelta para @mencionar el archivo",
"prompt.slash.badge.custom": "personalizado",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.mcp": "mcp",
@@ -286,7 +289,7 @@ export const dict = {
"prompt.context.includeActiveFile": "Incluir archivo activo",
"prompt.context.removeActiveFile": "Eliminar archivo activo del contexto",
"prompt.context.removeFile": "Eliminar archivo del contexto",
"prompt.action.attachFile": "Adjuntar archivo",
"prompt.action.attachFile": "Añadir archivos",
"prompt.menu.addImagesAndFiles": "Añadir archivos y más",
"prompt.menu.imagesAndFiles": "Imágenes y archivos",
"prompt.menu.commands": "Comandos",
@@ -298,7 +301,8 @@ export const dict = {
"prompt.toast.pasteUnsupported.title": "Adjunto no compatible",
"prompt.toast.attachmentDuplicate.title": "Este archivo ya se ha subido",
"prompt.toast.pasteUnsupported.description": "Solo se pueden adjuntar imágenes, PDFs o archivos de texto aquí.",
"prompt.toast.pasteUnsupported.description":
"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.description": "Elige un agente y modelo antes de enviar un prompt.",
"prompt.toast.worktreeCreateFailed.title": "Fallo al crear el árbol de trabajo",
@@ -308,16 +312,16 @@ export const dict = {
"prompt.toast.promptSendFailed.title": "Fallo al enviar prompt",
"prompt.toast.promptSendFailed.description": "No se pudo recuperar la sesión",
"dialog.mcp.title": "MCPs",
"dialog.mcp.title": "Servidores MCP",
"dialog.mcp.description": "{{enabled}} de {{total}} habilitados",
"dialog.mcp.empty": "No hay MCPs configurados",
"dialog.mcp.empty": "No hay servidores MCP configurados",
"dialog.lsp.empty": "LSPs detectados automáticamente por tipo de archivo",
"dialog.lsp.empty": "Servidores LSP detectados automáticamente por tipo de archivo",
"dialog.plugins.empty": "Plugins configurados en opencode.json",
"mcp.status.connected": "conectado",
"mcp.status.failed": "fallido",
"mcp.status.needs_auth": "necesita auth",
"mcp.status.needs_auth": "requiere autenticación",
"mcp.auth.clickToAuthenticate": "Haz clic para autenticar",
"mcp.status.disabled": "deshabilitado",
@@ -328,13 +332,13 @@ export const dict = {
"dialog.directory.action.selectFile": "Seleccionar archivo",
"dialog.directory.action.selectFolder": "Seleccionar carpeta",
"dialog.directory.root": "Raíz",
"dialog.directory.parent": "Superior",
"dialog.directory.parent": "Carpeta superior",
"dialog.directory.readError": "No se puede leer esta carpeta",
"dialog.server.title": "Servidores",
"dialog.server.description": "Cambiar a qué servidor de OpenCode se conecta esta app.",
"dialog.server.description": "Cambiar el servidor de OpenCode al que se conecta esta aplicación.",
"dialog.server.search.placeholder": "Buscar servidores",
"dialog.server.empty": "No hay servidores aún",
"dialog.server.empty": "Aún no hay servidores",
"dialog.server.add.title": "Añadir un servidor",
"dialog.server.add.url": "URL del servidor",
"dialog.server.add.placeholder": "http://localhost:4096",
@@ -348,7 +352,7 @@ export const dict = {
"dialog.server.edit.title": "Editar servidor",
"dialog.server.default.title": "Servidor predeterminado",
"dialog.server.default.description":
"Conectar a este servidor al iniciar la app en lugar de iniciar un servidor local. Requiere reinicio.",
"Conectar a este servidor al iniciar la aplicación en lugar de iniciar un servidor local. Requiere reiniciar.",
"dialog.server.default.none": "Ningún servidor seleccionado",
"dialog.server.default.set": "Establecer servidor actual como predeterminado",
"dialog.server.default.clear": "Limpiar",
@@ -356,7 +360,7 @@ export const dict = {
"dialog.server.menu.edit": "Editar",
"dialog.server.menu.default": "Establecer como predeterminado",
"dialog.server.menu.defaultRemove": "Quitar predeterminado",
"dialog.server.menu.defaultRemove": "Quitar como predeterminado",
"dialog.server.menu.delete": "Eliminar",
"dialog.server.current": "Servidor actual",
"dialog.server.status.default": "Predeterminado",
@@ -443,7 +447,7 @@ export const dict = {
"Se ejecuta después de crear un nuevo espacio de trabajo (árbol de trabajo).",
"dialog.project.edit.worktree.startup.placeholder": "p. ej. bun install",
"context.breakdown.title": "Desglose de Contexto",
"context.breakdown.title": "Desglose del contexto",
"context.breakdown.note":
'Desglose aproximado de tokens de entrada. "Otro" incluye definiciones de herramientas y sobrecarga.',
"context.breakdown.system": "Sistema",
@@ -452,25 +456,25 @@ export const dict = {
"context.breakdown.tool": "Llamadas a herramientas",
"context.breakdown.other": "Otro",
"context.systemPrompt.title": "Prompt del Sistema",
"context.systemPrompt.title": "Prompt del sistema",
"context.rawMessages.title": "Mensajes en bruto",
"context.stats.session": "Sesión",
"context.stats.messages": "Mensajes",
"context.stats.provider": "Proveedor",
"context.stats.model": "Modelo",
"context.stats.limit": "Límite de Contexto",
"context.stats.totalTokens": "Tokens Totales",
"context.stats.limit": "Límite de contexto",
"context.stats.totalTokens": "Tokens totales",
"context.stats.usage": "Uso",
"context.stats.inputTokens": "Tokens de Entrada",
"context.stats.outputTokens": "Tokens de Salida",
"context.stats.reasoningTokens": "Tokens de Razonamiento",
"context.stats.cacheTokens": "Tokens de Caché (lectura/escritura)",
"context.stats.userMessages": "Mensajes de Usuario",
"context.stats.assistantMessages": "Mensajes de Asistente",
"context.stats.totalCost": "Costo Total",
"context.stats.sessionCreated": "Sesión Creada",
"context.stats.lastActivity": "Última Actividad",
"context.stats.inputTokens": "Tokens de entrada",
"context.stats.outputTokens": "Tokens de salida",
"context.stats.reasoningTokens": "Tokens de razonamiento",
"context.stats.cacheTokens": "Tokens de caché (lectura/escritura)",
"context.stats.userMessages": "Mensajes de usuario",
"context.stats.assistantMessages": "Mensajes de asistente",
"context.stats.totalCost": "Costo total",
"context.stats.sessionCreated": "Sesión creada",
"context.stats.lastActivity": "Última actividad",
"context.usage.tokens": "Tokens",
"context.usage.usage": "Uso",
@@ -524,12 +528,12 @@ export const dict = {
"toast.session.share.copyFailed.title": "Fallo al copiar URL al portapapeles",
"toast.session.share.success.title": "Sesión compartida",
"toast.session.share.success.description": "¡URL compartida copiada al portapapeles!",
"toast.session.share.success.description": "Enlace para compartir copiado al portapapeles.",
"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.unshare.success.title": "Sesión dejó de compartirse",
"toast.session.unshare.success.description": "¡La sesión dejó de compartirse exitosamente!",
"toast.session.unshare.success.title": "La sesión dejó de compartirse",
"toast.session.unshare.success.description": "La sesión dejó de compartirse correctamente.",
"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",
@@ -545,13 +549,13 @@ export const dict = {
"error.page.description.localServerStartup": "Ocurrió un error al iniciar el servidor local.",
"error.page.details.label": "Detalles del error",
"error.page.action.restart": "Reiniciar",
"error.page.action.report": "Informar error",
"error.page.action.reported": "Error informado",
"error.page.action.report": "Informar del error",
"error.page.action.reported": "Error notificado",
"error.page.action.exportLogs": "Exportar registros",
"error.page.action.checking": "Comprobando...",
"error.page.action.checkUpdates": "Buscar actualizaciones",
"error.page.action.updateTo": "Actualizar a {{version}}",
"error.page.report.prefix": "Por favor reporta este error al equipo de OpenCode",
"error.page.report.prefix": "Informa de este error al equipo de OpenCode",
"error.page.report.discord": "en Discord",
"error.page.version": "Versión: {{version}}",
@@ -567,10 +571,10 @@ export const dict = {
"error.chain.status": "Estado: {{status}}",
"error.chain.retryable": "Reintentable: {{retryable}}",
"error.chain.responseBody": "Cuerpo de la respuesta:\n{{body}}",
"error.chain.didYouMean": "¿Quisiste decir: {{suggestions}}",
"error.chain.didYouMean": "¿Quizá quisiste decir {{suggestions}}?",
"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.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota, OpenCode no soporta autenticación MCP todavía.',
"error.chain.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota: OpenCode aún no admite la autenticación MCP.',
"error.chain.providerAuthFailed": "Autenticación de proveedor fallida ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
'Fallo al inicializar proveedor "{{provider}}". Comprueba credenciales y configuración.',
@@ -623,12 +627,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.closeTab": "Cerrar pestaña",
"session.error.serverConnection": "No se puede conectar a este servidor",
"session.review.filesChanged": "{{count}} Archivos Cambiados",
"session.review.filesChanged": "Archivos modificados: {{count}}",
"session.review.change.one": "Cambio",
"session.review.change.other": "Cambios",
"session.review.loadingChanges": "Cargando cambios...",
"session.review.empty": "No hay cambios en esta sesión aún",
"session.review.noVcs": "No se detectó Sistema de Control de Versiones Git, los cambios no se muestran",
"session.review.empty": "Aún no hay cambios en esta sesión",
"session.review.noVcs": "No se detectó ningún sistema de control de versiones Git; no se muestran los cambios",
"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",
"session.review.noChanges": "Sin cambios",
@@ -638,13 +642,13 @@ export const dict = {
"session.files.selectToOpen": "Selecciona un archivo para abrir",
"session.files.all": "Todos los archivos",
"session.files.empty": "Sin archivos",
"session.files.binaryContent": "Archivo binario (el contenido no puede ser mostrado)",
"session.files.binaryContent": "Archivo binario (no se puede mostrar el contenido)",
"session.messages.renderEarlier": "Renderizar mensajes anteriores",
"session.messages.renderEarlier": "Mostrar mensajes anteriores",
"session.messages.loadingEarlier": "Cargando mensajes anteriores...",
"session.messages.loadEarlier": "Cargar mensajes anteriores",
"session.messages.loading": "Cargando mensajes...",
"session.messages.jumpToLatest": "Ir al último",
"session.messages.jumpToLatest": "Ir al mensaje más reciente",
"session.context.addToContext": "Añadir {{selection}} al contexto",
"session.todo.title": "Tareas",
@@ -694,9 +698,9 @@ export const dict = {
"status.popover.tab.mcp": "MCP",
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Plugins",
"status.popover.action.manageServers": "Administrar servidores",
"status.popover.action.manageServers": "Gestionar servidores",
"session.share.popover.title": "Publicar en web",
"session.share.popover.title": "Publicar en la web",
"session.share.popover.description.shared":
"Esta sesión es pública en la web. Es accesible para cualquiera con el enlace.",
"session.share.popover.description.unshared":
@@ -726,7 +730,7 @@ export const dict = {
"common.dismiss": "Descartar",
"common.requestFailed": "Solicitud fallida",
"common.moreOptions": "Más opciones",
"common.learnMore": "Saber más",
"common.learnMore": "Más información",
"common.rename": "Renombrar",
"common.reset": "Restablecer",
"common.archive": "Archivar",
@@ -736,15 +740,15 @@ export const dict = {
"common.loadMore": "Cargar más",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Alternar menú",
"sidebar.menu.toggle": "Mostrar u ocultar menú",
"sidebar.nav.projectsAndSessions": "Proyectos y sesiones",
"sidebar.settings": "Ajustes",
"sidebar.help": "Ayuda",
"sidebar.workspaces.enable": "Habilitar espacios de trabajo",
"sidebar.workspaces.disable": "Deshabilitar espacios de trabajo",
"sidebar.gettingStarted.title": "Empezando",
"sidebar.gettingStarted.title": "Primeros pasos",
"sidebar.gettingStarted.line1": "OpenCode incluye modelos gratuitos para que puedas empezar inmediatamente.",
"sidebar.gettingStarted.line2": "Conecta cualquier proveedor para usar modelos, inc. Claude, GPT, Gemini etc.",
"sidebar.gettingStarted.line2": "Conecta cualquier proveedor para usar modelos como Claude, GPT o Gemini.",
"sidebar.project.recentSessions": "Sesiones recientes",
"sidebar.project.viewAllSessions": "Ver todas las sesiones",
"sidebar.project.clearNotifications": "Borrar notificaciones",
@@ -772,9 +776,8 @@ export const dict = {
"settings.general.row.language.title": "Idioma",
"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.description":
"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.description": "Shell que usan el terminal y las herramientas del agente",
"settings.general.row.shell.autoDefault": "Automático (predeterminado)",
"settings.general.row.shell.terminalOnly": "solo en el terminal",
"settings.general.row.appearance.title": "Apariencia",
"settings.general.row.appearance.description": "Personaliza cómo se ve OpenCode en tu dispositivo",
@@ -808,8 +811,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Navegación inferior",
"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",
"settings.general.row.showCustomAgents.title": "Agentes personalizados",
"settings.general.row.showCustomAgents.description": "Mostrar el selector de agentes en el editor",
"settings.general.row.showCustomAgents.title": "Mostrar agente",
"settings.general.row.showCustomAgents.description":
"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.description":
"Mostrar resúmenes del razonamiento del modelo en la línea de tiempo",
@@ -828,9 +832,9 @@ export const dict = {
"settings.general.row.newInterfaceNotice.dismiss": "Descartar",
"settings.general.row.pinchZoom.title": "Pellizcar para ampliar",
"settings.general.row.pinchZoom.description":
"Permitir ampliar con el gesto de pellizco del panel táctil y con Ctrl-scroll",
"Permitir ampliar con el gesto de pellizco del panel táctil y con Ctrl + desplazamiento",
"settings.general.row.wayland.title": "Usar Wayland nativo",
"settings.general.row.wayland.description": "Deshabilitar fallback a X11 en Wayland. Requiere reinicio.",
"settings.general.row.wayland.description": "Deshabilitar el uso alternativo de X11 en Wayland. Requiere reiniciar.",
"settings.general.row.wayland.tooltip":
"En Linux con monitores de frecuencia de actualización mixta, Wayland nativo puede ser más estable.",
@@ -960,8 +964,7 @@ export const dict = {
"settings.permissions.tool.read.title": "Leer",
"settings.permissions.tool.read.description": "Leer un archivo (coincide con la ruta del archivo)",
"settings.permissions.tool.edit.title": "Editar",
"settings.permissions.tool.edit.description":
"Modificar archivos, incluyendo ediciones, escrituras, parches y multi-ediciones",
"settings.permissions.tool.edit.description": "Modificar archivos mediante ediciones, escrituras y parches",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Coincidir archivos usando patrones glob",
"settings.permissions.tool.grep.title": "Grep",
@@ -971,20 +974,20 @@ export const dict = {
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "Ejecutar comandos de shell",
"settings.permissions.tool.task.title": "Tarea",
"settings.permissions.tool.task.description": "Lanzar sub-agentes",
"settings.permissions.tool.task.description": "Iniciar subagentes",
"settings.permissions.tool.skill.title": "Habilidad",
"settings.permissions.tool.skill.description": "Cargar una habilidad por nombre",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "Ejecutar consultas de servidor de lenguaje",
"settings.permissions.tool.todowrite.title": "Escribir Todo",
"settings.permissions.tool.todowrite.title": "Escribir tareas",
"settings.permissions.tool.todowrite.description": "Actualizar la lista de tareas",
"settings.permissions.tool.webfetch.title": "Web Fetch",
"settings.permissions.tool.webfetch.title": "Obtener contenido web",
"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.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.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",
"session.delete.failed.title": "Fallo al eliminar sesión",
@@ -998,13 +1001,13 @@ export const dict = {
"workspace.create.failed.title": "Fallo al crear espacio de trabajo",
"workspace.delete.failed.title": "Fallo al eliminar espacio de trabajo",
"workspace.resetting.title": "Restableciendo espacio de trabajo",
"workspace.resetting.description": "Esto puede tomar un minuto.",
"workspace.resetting.description": "Esto puede tardar un minuto.",
"workspace.reset.failed.title": "Fallo al restablecer espacio de trabajo",
"workspace.reset.success.title": "Espacio de trabajo restablecido",
"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.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.dirty": "Cambios no fusionados detectados en este espacio de trabajo.",
"workspace.delete.title": "Eliminar espacio de trabajo",
@@ -1046,6 +1049,9 @@ export const dict = {
"session.question.progress": "{{current}} de {{total}} preguntas",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -1064,13 +1070,13 @@ export const dict = {
"debugBar.na": "n/d",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip":
"Ú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.",
"Ú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.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Cuadros por segundo en los últimos 5 segundos.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Peor tiempo de cuadro en los últimos 5 segundos.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Cuadros superiores a 32ms en los últimos 5 segundos.",
"debugBar.jank.tip": "Cuadros superiores a 32 ms en los últimos 5 segundos.",
"debugBar.long.label": "LONG",
"debugBar.long.tip": "Tiempo bloqueado y recuento de tareas largas en los últimos 5 segundos. Tarea máx: {{max}}.",
"debugBar.delay.label": "DELAY",
@@ -1079,7 +1085,7 @@ export const dict = {
"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.",
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Cambio de diseño acumulativo para la vida útil actual de la aplicación.",
"debugBar.cls.tip": "Cambio de diseño acumulativo durante la ejecución actual de la aplicación.",
"debugBar.mem.label": "MEM",
"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}}.",
File diff suppressed because it is too large Load Diff
+99 -88
View File
@@ -29,8 +29,8 @@ export const dict = {
"command.settings.open": "Ouvrir les paramètres",
"command.session.previous": "Session précédente",
"command.session.next": "Session suivante",
"command.session.previous.unseen": "Session non lue précédente",
"command.session.next.unseen": "Session non lue suivante",
"command.session.previous.unseen": "Session précédente non lue",
"command.session.next.unseen": "Session suivante non lue",
"command.session.archive": "Archiver la session",
"command.palette": "Palette de commandes",
"command.theme.cycle": "Changer de thème",
@@ -45,7 +45,7 @@ export const dict = {
"command.tab.reopenClosed": "Rouvrir l'onglet fermé",
"command.context.addSelection": "Ajouter la sélection au contexte",
"command.context.addSelection.description": "Ajouter les lignes sélectionnées du fichier actuel",
"command.input.focus": "Focus sur l'entrée",
"command.input.focus": "Activer la zone de saisie",
"command.terminal.toggle": "Basculer le terminal",
"command.fileTree.toggle": "Basculer l'arborescence des fichiers",
"command.review.toggle": "Basculer la revue",
@@ -59,8 +59,8 @@ export const dict = {
"command.message.next.description": "Aller au message utilisateur suivant",
"command.model.choose": "Choisir le modèle",
"command.model.choose.description": "Sélectionner un modèle différent",
"command.mcp.toggle": "Basculer MCP",
"command.mcp.toggle.description": "Basculer les MCPs",
"command.mcp.toggle": "Activer ou désactiver les MCP",
"command.mcp.toggle.description": "Activer ou désactiver les MCP",
"command.agent.cycle": "Changer d'agent",
"command.agent.cycle.description": "Passer à l'agent suivant",
"command.agent.cycle.reverse": "Changer d'agent (inverse)",
@@ -68,7 +68,7 @@ export const dict = {
"command.model.variant.cycle": "Changer l'effort de réflexion",
"command.model.variant.cycle.description": "Passer au niveau d'effort suivant",
"command.prompt.mode.shell": "Shell",
"command.prompt.mode.normal": "Prompt",
"command.prompt.mode.normal": "Invite",
"command.permissions.autoaccept.enable": "Accepter automatiquement les permissions",
"command.permissions.autoaccept.disable": "Arrêter d'accepter automatiquement les permissions",
"command.workspace.toggle": "Basculer les espaces de travail",
@@ -92,8 +92,9 @@ export const dict = {
"palette.group.files": "Fichiers",
"dialog.provider.search.placeholder": "Rechercher des fournisseurs",
"dialog.provider.empty": "Aucun fournisseur trouvé",
"dialog.provider.group.popular": "Populaire",
"dialog.provider.group.other": "Autre",
"dialog.provider.group.popular": "Populaires",
"dialog.provider.group.other": "Autres",
"dialog.provider.custom.label": "Fournisseur personnalisé compatible avec OpenAI",
"dialog.provider.tag.recommended": "Recommandé",
"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",
@@ -109,9 +110,10 @@ export const dict = {
"dialog.model.empty": "Aucun résultat de modèle",
"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.provider.toggle": "Basculer tous les modèles {{provider}}",
"dialog.model.manage.provider.toggle": "Activer ou désactiver tous les modèles {{provider}}",
"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.viewMoreProviders": "Voir plus de 70 autres fournisseurs",
"dialog.provider.viewAll": "Voir plus de fournisseurs",
"provider.connect.title": "Connecter {{provider}}",
"provider.connect.title.anthropicProMax": "Connexion avec Claude Pro/Max",
@@ -148,19 +150,21 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} connecté",
"provider.connect.toast.connected.description": "Les modèles {{provider}} sont maintenant disponibles.",
"provider.custom.title": "Fournisseur personnalisé",
"provider.custom.description.prefix": "Configurer un fournisseur compatible OpenAI. Voir la ",
"provider.custom.description.link": "doc de config fournisseur",
"provider.custom.description.prefix": "Configurez un fournisseur compatible avec OpenAI. Consultez la ",
"provider.custom.description.link": "documentation sur la configuration des fournisseurs",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "ID du fournisseur",
"provider.custom.field.providerID.placeholder": "monfournisseur",
"provider.custom.field.providerID.description": "Lettres minuscules, chiffres, traits d'union ou tirets bas",
"provider.custom.field.providerID.description":
"Lettres minuscules, chiffres, traits d'union ou traits de soulignement",
"provider.custom.field.name.label": "Nom d'affichage",
"provider.custom.field.name.placeholder": "Mon fournisseur IA",
"provider.custom.field.baseURL.label": "URL de base",
"provider.custom.field.baseURL.placeholder": "https://api.monfournisseur.com/v1",
"provider.custom.field.apiKey.label": "Clé API",
"provider.custom.field.apiKey.placeholder": "Clé API",
"provider.custom.field.apiKey.description": "Optionnel. Laisser vide si vous gérez l'auth via les en-têtes.",
"provider.custom.field.apiKey.description":
"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.id.label": "ID",
"provider.custom.models.id.placeholder": "id-modele",
@@ -176,7 +180,8 @@ export const dict = {
"provider.custom.headers.remove": "Supprimer l'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.format": "Utilisez des lettres minuscules, chiffres, traits d'union ou tirets bas",
"provider.custom.error.providerID.format":
"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.name.required": "Le nom d'affichage est requis",
"provider.custom.error.baseURL.required": "L'URL de base est requise",
@@ -186,7 +191,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} déconnecté",
"provider.disconnect.toast.disconnected.description": "Les modèles {{provider}} ne sont plus disponibles.",
"model.tag.free": "Gratuit",
"model.tag.latest": "Dernier",
"model.tag.latest": "Le plus récent",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -197,29 +202,29 @@ export const dict = {
"model.input.audio": "audio",
"model.input.video": "vidéo",
"model.input.pdf": "pdf",
"model.tooltip.allows": "Autorise : {{inputs}}",
"model.tooltip.allows": "Formats pris en charge : {{inputs}}",
"model.tooltip.context.label": "Contexte",
"model.tooltip.inputs": "Entrées",
"model.tooltip.model": "Modèle",
"model.tooltip.provider": "Fournisseur",
"model.tooltip.reasoning": "Raisonnement",
"model.tooltip.reasoning.allowed": "Autorise le raisonnement",
"model.tooltip.reasoning.allowed": "Raisonnement pris en charge",
"model.tooltip.reasoning.none": "Sans raisonnement",
"model.tooltip.context": "Limite de contexte {{limit}}",
"common.search.placeholder": "Rechercher",
"common.goBack": "Retour",
"common.goForward": "Avancer",
"common.goForward": "Suivant",
"common.loading": "Chargement",
"common.loading.ellipsis": "...",
"common.cancel": "Annuler",
"common.clear": "Effacer",
"common.connect": "Connecter",
"common.disconnect": "Déconnecter",
"common.continue": "Soumettre",
"common.continue": "Continuer",
"common.submit": "Soumettre",
"common.save": "Enregistrer",
"common.saving": "Enregistrement...",
"common.default": "Défaut",
"common.default": "Par défaut",
"common.attachment": "pièce jointe",
"prompt.placeholder.shell": "Entrez une commande shell... {{example}}",
"prompt.placeholder.normal": 'Demandez n\'importe quoi... "{{example}}"',
@@ -227,8 +232,8 @@ export const dict = {
"prompt.placeholder.summarizeComments": "Résumer les commentaires…",
"prompt.placeholder.summarizeComment": "Résumer le commentaire…",
"prompt.mode.shell": "Shell",
"prompt.mode.normal": "Prompt",
"prompt.mode.shell.exit": "esc pour quitter",
"prompt.mode.normal": "Invite",
"prompt.mode.shell.exit": "Échap pour quitter",
"session.child.promptDisabled": "Les sessions de sous-agents ne peuvent pas recevoir de messages.",
"session.child.backToParent": "Revenir à la session principale.",
"prompt.example.1": "Corriger un TODO dans la base de code",
@@ -237,7 +242,7 @@ export const dict = {
"prompt.example.4": "Expliquer comment fonctionne l'authentification",
"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.7": "Refactoriser cette fonction pour être plus lisible",
"prompt.example.7": "Refactoriser cette fonction pour la rendre plus lisible",
"prompt.example.8": "Que signifie cette erreur ?",
"prompt.example.9": "Aidez-moi à déboguer ce problème",
"prompt.example.10": "Générer la documentation de l'API",
@@ -245,11 +250,11 @@ export const dict = {
"prompt.example.12": "Ajouter une validation d'entrée",
"prompt.example.13": "Créer un nouveau composant pour...",
"prompt.example.14": "Comment déployer ce projet ?",
"prompt.example.15": "Vérifier mon code pour les meilleures pratiques",
"prompt.example.15": "Vérifier que mon code respecte les bonnes pratiques",
"prompt.example.16": "Ajouter la gestion des erreurs à cette fonction",
"prompt.example.17": "Expliquer ce modèle regex",
"prompt.example.17": "Expliquer cette expression régulière",
"prompt.example.18": "Convertir ceci en TypeScript",
"prompt.example.19": "Ajouter des logs dans toute la base de code",
"prompt.example.19": "Ajouter une journalisation dans toute la base de code",
"prompt.example.20": "Quelles dépendances sont obsolètes ?",
"prompt.example.21": "Aidez-moi à écrire un script de migration",
"prompt.example.22": "Implémenter la mise en cache pour ce point de terminaison",
@@ -261,7 +266,7 @@ export const dict = {
"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.slash.badge.custom": "personnalisé",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.skill": "compétence",
"prompt.slash.badge.mcp": "mcp",
"prompt.context.active": "actif",
"prompt.context.includeActiveFile": "Inclure le fichier actif",
@@ -281,21 +286,21 @@ export const dict = {
"prompt.toast.pasteUnsupported.description":
"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.description": "Choisissez un agent et un modèle avant d'envoyer un message.",
"prompt.toast.modelAgentRequired.description": "Choisissez un agent et un modèle avant d'envoyer une invite.",
"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.shellSendFailed.title": "Échec de l'envoi de la commande shell",
"prompt.toast.commandSendFailed.title": "Échec de l'envoi de la commande",
"prompt.toast.promptSendFailed.title": "Échec de l'envoi du message",
"prompt.toast.promptSendFailed.title": "Échec de l'envoi de l'invite",
"prompt.toast.promptSendFailed.description": "Impossible de récupérer la session",
"dialog.mcp.title": "MCPs",
"dialog.mcp.description": "{{enabled}} sur {{total}} activés",
"dialog.mcp.title": "MCP",
"dialog.mcp.description": "MCP actifs : {{enabled}} sur {{total}}",
"dialog.mcp.empty": "Aucun MCP configuré",
"dialog.lsp.empty": "LSPs détectés automatiquement par type de fichier",
"dialog.plugins.empty": "Plugins configurés dans opencode.json",
"dialog.lsp.empty": "Serveurs LSP détectés automatiquement selon le type de fichier",
"dialog.plugins.empty": "Extensions configurées dans opencode.json",
"mcp.status.connected": "connecté",
"mcp.status.failed": "échoué",
"mcp.status.needs_auth": "nécessite auth",
"mcp.status.failed": "en échec",
"mcp.status.needs_auth": "authentification requise",
"mcp.auth.clickToAuthenticate": "Cliquez pour vous authentifier",
"mcp.status.disabled": "désactivé",
"dialog.fork.empty": "Aucun message à partir duquel bifurquer",
@@ -330,7 +335,7 @@ export const dict = {
"dialog.server.action.remove": "Supprimer le serveur",
"dialog.server.menu.edit": "Modifier",
"dialog.server.menu.default": "Définir par défaut",
"dialog.server.menu.defaultRemove": "Supprimer par défaut",
"dialog.server.menu.defaultRemove": "Ne plus utiliser par défaut",
"dialog.server.menu.delete": "Supprimer",
"dialog.server.current": "Serveur actuel",
"dialog.server.status.default": "Défaut",
@@ -400,8 +405,8 @@ export const dict = {
"wsl.onboarding.notFound": "introuvable",
"wsl.onboarding.version": "Version : {{version}}",
"wsl.onboarding.unknown": "inconnue",
"wsl.onboarding.desktopVersion": "desktop {{version}}",
"wsl.onboarding.versionMismatch": "La version installée ne correspond pas à celle de l'application desktop.",
"wsl.onboarding.desktopVersion": "application de bureau {{version}}",
"wsl.onboarding.versionMismatch": "La version installée ne correspond pas à celle de l'application de bureau.",
"wsl.onboarding.adding": "Ajout...",
"dialog.project.edit.title": "Modifier le projet",
"dialog.project.edit.name": "Nom",
@@ -417,13 +422,13 @@ export const dict = {
"dialog.project.edit.worktree.startup.placeholder": "p. ex. bun install",
"context.breakdown.title": "Répartition du contexte",
"context.breakdown.note":
"Répartition approximative des jetons d'entrée. \"Autre\" inclut les définitions d'outils et les frais généraux.",
"Répartition approximative des jetons d'entrée. \"Autre\" inclut les définitions d'outils et les données annexes.",
"context.breakdown.system": "Système",
"context.breakdown.user": "Utilisateur",
"context.breakdown.assistant": "Assistant",
"context.breakdown.tool": "Appels d'outils",
"context.breakdown.other": "Autre",
"context.systemPrompt.title": "Prompt système",
"context.systemPrompt.title": "Invite système",
"context.rawMessages.title": "Messages bruts",
"context.stats.session": "Session",
"context.stats.messages": "Messages",
@@ -437,7 +442,7 @@ export const dict = {
"context.stats.reasoningTokens": "Jetons de raisonnement",
"context.stats.cacheTokens": "Jetons de cache (lecture/écriture)",
"context.stats.userMessages": "Messages utilisateur",
"context.stats.assistantMessages": "Messages assistant",
"context.stats.assistantMessages": "Messages de l'assistant",
"context.stats.totalCost": "Coût total",
"context.stats.sessionCreated": "Session créée",
"context.stats.lastActivity": "Dernière activité",
@@ -465,16 +470,16 @@ export const dict = {
"language.th": "ไทย",
"language.tr": "Türkçe",
"toast.language.title": "Langue",
"toast.language.description": "Passé à {{language}}",
"toast.language.description": "Langue définie sur {{language}}",
"toast.theme.title": "Thème changé",
"toast.scheme.title": "Schéma de couleurs",
"toast.workspace.enabled.title": "Espaces de travail activés",
"toast.workspace.enabled.description": "Plusieurs worktrees sont désormais affichés dans la barre latérale",
"toast.workspace.enabled.description": "Plusieurs arbres de travail sont désormais affichés dans la barre latérale",
"toast.workspace.disabled.title": "Espaces de travail désactivés",
"toast.workspace.disabled.description": "Seul le worktree principal est affiché dans la barre latérale",
"toast.workspace.disabled.description": "Seul l'arbre de travail principal est affiché dans la barre latérale",
"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.off.title": "Acceptation automatique des permissions arrêtée",
"toast.permissions.autoaccept.off.title": "Acceptation automatique des permissions désactivée",
"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.description": "Connectez un fournisseur pour résumer cette session",
@@ -487,17 +492,18 @@ export const dict = {
"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.description": "Une erreur s'est produite lors du partage de la session",
"toast.session.unshare.success.title": "Session non partagée",
"toast.session.unshare.success.description": "Session non partagée avec succès !",
"toast.session.unshare.failed.title": "Échec de l'annulation du partage",
"toast.session.unshare.failed.description": "Une erreur s'est produite lors de l'annulation du partage de la session",
"toast.session.unshare.success.title": "Partage de la session désactivé",
"toast.session.unshare.success.description": "Le partage de la session a bien été désactivé.",
"toast.session.unshare.failed.title": "Échec de la désactivation du partage",
"toast.session.unshare.failed.description":
"Une erreur s'est produite lors de la désactivation du partage de la session",
"toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}",
"toast.update.title": "Mise à jour disponible",
"toast.update.description":
"Une nouvelle version d'OpenCode ({{version}}) est maintenant disponible pour installation.",
"toast.update.action.installRestart": "Installer et redémarrer",
"toast.update.action.notYet": "Pas encore",
"error.page.title": "Quelque chose s'est mal passé",
"toast.update.action.notYet": "Plus tard",
"error.page.title": "Un problème est survenu",
"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.details.label": "Détails de l'erreur",
@@ -520,13 +526,13 @@ export const dict = {
"error.chain.causedBy": "Causé par :",
"error.chain.apiError": "Erreur API",
"error.chain.status": "Statut : {{status}}",
"error.chain.retryable": "Réessayable : {{retryable}}",
"error.chain.retryable": "Nouvelle tentative possible : {{retryable}}",
"error.chain.responseBody": "Corps de la réponse :\n{{body}}",
"error.chain.didYouMean": "Vouliez-vous dire : {{suggestions}}",
"error.chain.modelNotFound": "Modèle introuvable : {{provider}}/{{model}}",
"error.chain.checkConfig": "Vérifiez votre configuration (opencode.json) pour les noms de fournisseur/modèle",
"error.chain.checkConfig": "Vérifiez les noms de fournisseur et de modèle dans votre configuration (opencode.json)",
"error.chain.mcpFailed":
"Le serveur MCP \"{{name}}\" a échoué. Notez qu'OpenCode ne supporte pas encore l'authentification MCP.",
"Le serveur MCP \"{{name}}\" a échoué. Notez qu'OpenCode ne prend pas encore en charge l'authentification MCP.",
"error.chain.providerAuthFailed": "Échec de l'authentification du fournisseur ({{provider}}) : {{message}}",
"error.chain.providerInitFailed":
'Échec de l\'initialisation du fournisseur "{{provider}}". Vérifiez les identifiants et la configuration.',
@@ -535,7 +541,7 @@ export const dict = {
"Le fichier de configuration à {{path}} n'est pas un JSON(C) valide : {{message}}",
"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.',
"error.chain.configFrontmatterError": "Échec de l'analyse du frontmatter dans {{path}} :\n{{message}}",
"error.chain.configFrontmatterError": "Échec de l'analyse de l'en-tête dans {{path}} :\n{{message}}",
"error.chain.configInvalid": "Le fichier de configuration à {{path}} est invalide",
"error.chain.configInvalidWithMessage": "Le fichier de configuration à {{path}} est invalide : {{message}}",
"notification.permission.title": "Permission requise",
@@ -583,7 +589,7 @@ export const dict = {
"session.review.noChanges": "Aucune modification",
"session.review.noUncommittedChanges": "Aucune modification non validée pour l'instant",
"session.review.noBranchChanges": "Aucune modification de branche pour l'instant",
"session.review.noVcs": "Aucun système de contrôle de version Git détecté, modifications non affichées",
"session.review.noVcs": "Aucun système de gestion de versions Git détecté ; modifications non affichées",
"session.review.noSnapshot":
"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",
@@ -594,7 +600,7 @@ export const dict = {
"session.messages.loadingEarlier": "Chargement des messages précédents...",
"session.messages.loadEarlier": "Charger les messages précédents",
"session.messages.loading": "Chargement des messages...",
"session.messages.jumpToLatest": "Aller au dernier",
"session.messages.jumpToLatest": "Aller au message le plus récent",
"session.context.addToContext": "Ajouter {{selection}} au contexte",
"session.todo.title": "Tâches",
"session.todo.collapse": "Réduire",
@@ -635,17 +641,17 @@ export const dict = {
"session.header.open.menu": "Options d'ouverture",
"session.header.open.copyPath": "Copier le chemin",
"status.popover.trigger": "Statut",
"status.popover.ariaLabel": "Configurations des serveurs",
"status.popover.ariaLabel": "Configuration des serveurs",
"status.popover.tab.servers": "Serveurs",
"status.popover.tab.mcp": "MCP",
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Plugins",
"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":
"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":
"Partager la session publiquement sur le web. Elle sera accessible à toute personne disposant du lien.",
"Rendre la session publique sur le Web. Elle sera accessible à toute personne disposant du lien.",
"session.share.action.share": "Partager",
"session.share.action.publish": "Publier",
"session.share.action.publishing": "Publication...",
@@ -656,7 +662,7 @@ export const dict = {
"session.share.copy.copyLink": "Copier le lien",
"lsp.tooltip.none": "Aucun serveur LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Chargement du prompt...",
"prompt.loading": "Chargement de l'invite...",
"terminal.loading": "Chargement du terminal...",
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
@@ -694,7 +700,7 @@ export const dict = {
"sidebar.empty.title": "Aucun projet ouvert",
"sidebar.empty.description": "Ouvrez un projet pour commencer",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Bureau",
"settings.section.desktop": "Application de bureau",
"settings.section.server": "Serveur",
"settings.tab.general": "Général",
"settings.tab.shortcuts": "Raccourcis",
@@ -710,10 +716,10 @@ export const dict = {
"settings.general.section.display": "Affichage",
"settings.general.row.language.title": "Langue",
"settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode",
"settings.general.row.shell.title": "Shell du terminal",
"settings.general.row.shell.title": "Interpréteur de commandes du terminal",
"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.",
"settings.general.row.shell.autoDefault": "Auto (par défaut)",
"settings.general.row.shell.autoDefault": "Automatique (par défaut)",
"settings.general.row.shell.terminalOnly": "terminal uniquement",
"settings.general.row.appearance.title": "Apparence",
"settings.general.row.appearance.description": "Personnaliser l'apparence d'OpenCode sur votre appareil",
@@ -727,22 +733,22 @@ export const dict = {
"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.description": "Personnaliser la police utilisée dans toute l'interface",
"settings.general.row.followup.title": "Comportement de suivi",
"settings.general.row.followup.title": "Comportement des messages de suivi",
"settings.general.row.followup.description":
"Choisissez si les messages de suivi dirigent immédiatement ou attendent dans une file d'attente",
"Choisissez si les messages de suivi orientent immédiatement l'agent ou sont placés dans une file d'attente",
"settings.general.row.followup.option.queue": "File d'attente",
"settings.general.row.followup.option.steer": "Diriger",
"settings.general.row.followup.option.steer": "Orienter",
"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.showNavigation.title": "Commandes de navigation",
"settings.general.row.showNavigation.description":
"Afficher les boutons précédent et suivant dans la barre de titre de l'application desktop",
"Afficher les boutons précédent et suivant dans la barre de titre de l'application de bureau",
"settings.general.row.showSearch.title": "Palette de commandes",
"settings.general.row.showSearch.description":
"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.description":
"Afficher le bouton du terminal dans la barre de titre de l'application desktop",
"Afficher le bouton du terminal dans la barre de titre de l'application de bureau",
"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.mobileTitlebarBottom.title": "Navigation en bas",
@@ -774,11 +780,13 @@ export const dict = {
"settings.general.row.wayland.tooltip":
"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.description": 'Afficher des pop-ups "Quoi de neuf" après les mises à jour',
"settings.general.row.releaseNotes.description":
"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.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.description": "Vérifier manuellement les mises à jour et installer si disponible",
"settings.updates.row.check.description":
"Rechercher manuellement les mises à jour et installer toute mise à jour disponible",
"settings.updates.action.checkNow": "Vérifier maintenant",
"settings.updates.action.checking": "Vérification...",
"settings.updates.action.downloading": "Téléchargement...",
@@ -846,12 +854,12 @@ export const dict = {
"settings.general.sounds.errors.title": "Erreurs",
"settings.general.sounds.errors.description": "Jouer un son lorsqu'une erreur se produit",
"settings.shortcuts.title": "Raccourcis clavier",
"settings.shortcuts.reset.button": "Rétablir les défauts",
"settings.shortcuts.reset.button": "Rétablir les valeurs par défaut",
"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.conflict.title": "Raccourci déjà utilisé",
"settings.shortcuts.conflict.description": "{{keybind}} est déjà assigné à {{titles}}.",
"settings.shortcuts.unassigned": "Non assigné",
"settings.shortcuts.conflict.description": "{{keybind}} est déjà attribué à {{titles}}.",
"settings.shortcuts.unassigned": "Non attribué",
"settings.shortcuts.pressKeys": "Appuyez sur les touches",
"settings.shortcuts.search.placeholder": "Rechercher des raccourcis",
"settings.shortcuts.search.empty": "Aucun raccourci trouvé",
@@ -860,7 +868,7 @@ export const dict = {
"settings.shortcuts.group.navigation": "Navigation",
"settings.shortcuts.group.modelAndAgent": "Modèle et agent",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Prompt",
"settings.shortcuts.group.prompt": "Invite",
"settings.providers.title": "Fournisseurs",
"settings.providers.description": "Les paramètres des fournisseurs seront configurables ici.",
"settings.providers.section.connected": "Fournisseurs connectés",
@@ -889,9 +897,9 @@ export const dict = {
"settings.permissions.tool.read.description": "Lecture d'un fichier (correspond au chemin du fichier)",
"settings.permissions.tool.edit.title": "Modifier",
"settings.permissions.tool.edit.description":
"Modifier des fichiers, y compris les modifications, écritures, patchs et multi-modifications",
"Modifier des fichiers, notamment au moyen des outils edit, write et patch",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Correspondre aux fichiers utilisant des modèles glob",
"settings.permissions.tool.glob.description": "Rechercher des fichiers à l'aide de motifs glob",
"settings.permissions.tool.grep.title": "Grep",
"settings.permissions.tool.grep.description":
"Rechercher dans le contenu des fichiers à l'aide d'expressions régulières",
@@ -905,12 +913,12 @@ export const dict = {
"settings.permissions.tool.skill.description": "Charger une compétence par son nom",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "Exécuter des requêtes de serveur de langage",
"settings.permissions.tool.todowrite.title": "Écrire Todo",
"settings.permissions.tool.todowrite.title": "Écrire les 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.description": "Récupérer le contenu d'une URL",
"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.description": "Accéder aux fichiers en dehors du répertoire du projet",
"settings.permissions.tool.doom_loop.title": "Boucle infernale",
@@ -931,7 +939,7 @@ export const dict = {
"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.status.checking": "Vérification des modifications non fusionnées...",
"workspace.status.error": "Impossible de vérifier le statut git.",
"workspace.status.error": "Impossible de vérifier l'état de Git.",
"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.delete.title": "Supprimer l'espace de travail",
@@ -953,9 +961,9 @@ export const dict = {
"error.server.invalidConfiguration": "Configuration invalide",
"common.moreCountSuffix": " (+{{count}} de plus)",
"common.time.justNow": "À l'instant",
"common.time.minutesAgo.short": "il y a {{count}}m",
"common.time.hoursAgo.short": "il y a {{count}}h",
"common.time.daysAgo.short": "il y a {{count}}j",
"common.time.minutesAgo.short": "il y a {{count}} min",
"common.time.hoursAgo.short": "il y a {{count}} h",
"common.time.daysAgo.short": "il y a {{count}} j",
"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.",
@@ -973,6 +981,9 @@ export const dict = {
"session.question.progress": "{{current}} questions sur {{total}}",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "Explorateur de fichiers",
"session.header.reveal.finder": "Afficher dans le Finder",
"session.header.reveal.fileExplorer": "Afficher dans lExplorateur de fichiers",
"session.header.reveal.containingFolder": "Ouvrir le dossier contenant",
"session.header.open.fileManager": "Gestionnaire de fichiers",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -993,11 +1004,11 @@ export const dict = {
"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.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Images par seconde glissantes sur les 5 dernières secondes.",
"debugBar.fps.tip": "Fréquence d'images calculée sur les 5 dernières secondes.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Pire temps d'image sur les 5 dernières secondes.",
"debugBar.frame.tip": "Durée d'image maximale sur les 5 dernières secondes.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Images de plus de 32ms au cours des 5 dernières secondes.",
"debugBar.jank.tip": "Images de plus de 32 ms au cours des 5 dernières secondes.",
"debugBar.long.label": "LONG",
"debugBar.long.tip":
"Temps bloqué et nombre de tâches longues au cours des 5 dernières secondes. Tâche max : {{max}}.",
@@ -1005,7 +1016,7 @@ export const dict = {
"debugBar.delay.tip": "Pire délai d'entrée observé au cours des 5 dernières secondes.",
"debugBar.inp.label": "INP",
"debugBar.inp.tip":
"Durée approximative d'interaction au cours des 5 dernières secondes. Ceci est similaire à INP, pas le INP officiel des Web Vitals.",
"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.",
"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.mem.label": "MEM",
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
+24 -17
View File
@@ -94,13 +94,14 @@ export const dict = {
"dialog.provider.empty": "プロバイダーが見つかりません",
"dialog.provider.group.popular": "人気",
"dialog.provider.group.other": "その他",
"dialog.provider.custom.label": "OpenAI互換のカスタムプロバイダー",
"dialog.provider.tag.recommended": "推奨",
"dialog.provider.opencode.note": "Claude, GPT, Geminiなどを含む厳選されたモデル",
"dialog.provider.opencode.tagline": "信頼性の高い最適化モデル",
"dialog.provider.opencodeGo.tagline": "すべての人に低価格のサブスクリプション",
"dialog.provider.anthropic.note": "Claude Pro/MaxまたはAPIキーで接続",
"dialog.provider.copilot.note": "CopilotまたはAPIキーで接続",
"dialog.provider.openai.note": "ChatGPT Pro/PlusまたはAPIキーで接続",
"dialog.provider.anthropic.note": "ProやMaxを含むClaudeモデルに直接アクセス",
"dialog.provider.copilot.note": "GitHub Copilotを通じてコーディングを支援するAIモデル",
"dialog.provider.openai.note": "高速で高性能な汎用AIタスク向けのGPTモデル",
"dialog.provider.google.note": "高速で構造化された応答のためのGeminiモデル",
"dialog.provider.openrouter.note": "1つのプロバイダーからすべてのサポートされているモデルにアクセス",
"dialog.provider.vercel.note": "スマートルーターによるAIモデルへの統合アクセス",
@@ -112,6 +113,7 @@ export const dict = {
"dialog.model.manage.provider.toggle": "すべての{{provider}}モデルを切り替え",
"dialog.model.unpaid.freeModels.title": "OpenCodeが提供する無料モデル",
"dialog.model.unpaid.addMore.title": "人気のプロバイダーからモデルを追加",
"dialog.model.unpaid.viewMoreProviders": "その他70以上のプロバイダーを見る",
"dialog.provider.viewAll": "さらにプロバイダーを表示",
"provider.connect.title": "{{provider}}を接続",
"provider.connect.title.anthropicProMax": "Claude Pro/Maxでログイン",
@@ -195,7 +197,7 @@ export const dict = {
"model.input.image": "画像",
"model.input.audio": "音声",
"model.input.video": "動画",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "対応: {{inputs}}",
"model.tooltip.context.label": "コンテキスト",
"model.tooltip.inputs": "入力",
@@ -214,7 +216,7 @@ export const dict = {
"common.clear": "クリア",
"common.connect": "接続",
"common.disconnect": "切断",
"common.continue": "送信",
"common.continue": "続行",
"common.submit": "送信",
"common.save": "保存",
"common.saving": "保存中...",
@@ -258,7 +260,7 @@ export const dict = {
"prompt.popover.emptyResults": "一致する結果がありません",
"prompt.popover.emptyCommands": "一致するコマンドがありません",
"prompt.dropzone.label": "画像、PDF、またはテキストファイルをここにドロップしてください",
"prompt.dropzone.file.label": "ドロップして@メンションファイルを追加",
"prompt.dropzone.file.label": "ドロップしてファイルを@メンション",
"prompt.slash.badge.custom": "カスタム",
"prompt.slash.badge.skill": "スキル",
"prompt.slash.badge.mcp": "mcp",
@@ -567,7 +569,7 @@ export const dict = {
"session.error.notFound.description": "このタブが参照するセッションは、このサーバーには存在しません。",
"session.error.notFound.closeTab": "タブを閉じる",
"session.error.serverConnection": "このサーバーに接続できません",
"session.review.filesChanged": "{{count}} ファイル変更",
"session.review.filesChanged": "変更されたファイル: {{count}}",
"session.review.change.one": "変更",
"session.review.change.other": "変更",
"session.review.loadingChanges": "変更を読み込み中...",
@@ -657,10 +659,10 @@ export const dict = {
"ターミナルの接続が中断されました。これはサーバーが再起動したときに発生することがあります。",
"common.closeTab": "タブを閉じる",
"common.dismiss": "閉じる",
"common.requestFailed": "リクエスト失敗",
"common.requestFailed": "リクエスト失敗しました",
"common.moreOptions": "その他のオプション",
"common.learnMore": "詳細",
"common.rename": "名前変更",
"common.rename": "名前変更",
"common.reset": "リセット",
"common.archive": "アーカイブ",
"common.delete": "削除",
@@ -734,8 +736,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "下部ナビゲーション",
"settings.general.row.mobileTitlebarBottom.description":
"モバイルではタイトルバーとセッションタブを画面下部に配置します",
"settings.general.row.showCustomAgents.title": "カスタムエージェント",
"settings.general.row.showCustomAgents.description": "コンポーザーにエージェント選択を表示します",
"settings.general.row.showCustomAgents.title": "エージェントを表示",
"settings.general.row.showCustomAgents.description":
"コンポーザーでエージェントを切り替えます。非表示の場合は、デフォルトでBuildエージェントが使用されます。",
"settings.general.row.reasoningSummaries.title": "推論の要約を表示",
"settings.general.row.reasoningSummaries.description": "タイムラインにモデルの推論の要約を表示します",
"settings.general.row.shellToolPartsExpanded.title": "shell ツールパーツを展開",
@@ -846,7 +849,7 @@ export const dict = {
"settings.shortcuts.group.terminal": "ターミナル",
"settings.shortcuts.group.prompt": "プロンプト",
"settings.providers.title": "プロバイダー",
"settings.providers.description": "プロバイダー設定はここで構成できます。",
"settings.providers.description": "プロバイダー設定は今後ここで構成できるようになります。",
"settings.providers.section.connected": "接続済みプロバイダー",
"settings.providers.connected.empty": "接続済みプロバイダーはありません",
"settings.providers.section.popular": "人気のプロバイダー",
@@ -855,13 +858,13 @@ export const dict = {
"settings.providers.tag.custom": "カスタム",
"settings.providers.tag.other": "その他",
"settings.models.title": "モデル",
"settings.models.description": "モデル設定はここで構成できます。",
"settings.models.description": "モデル設定は今後ここで構成できるようになります。",
"settings.agents.title": "エージェント",
"settings.agents.description": "エージェント設定はここで構成できます。",
"settings.agents.description": "エージェント設定は今後ここで構成できるようになります。",
"settings.commands.title": "コマンド",
"settings.commands.description": "コマンド設定はここで構成できます。",
"settings.commands.description": "コマンド設定は今後ここで構成できるようになります。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP設定はここで構成できます。",
"settings.mcp.description": "MCP設定は今後ここで構成できるようになります。",
"settings.permissions.title": "権限",
"settings.permissions.description": "サーバーがデフォルトで使用できるツールを制御します。",
"settings.permissions.section.tools": "ツール",
@@ -955,6 +958,9 @@ export const dict = {
"session.question.progress": "{{total}} 問中 {{current}} 問",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "エクスプローラー",
"session.header.reveal.finder": "Finderで表示",
"session.header.reveal.fileExplorer": "エクスプローラーで表示",
"session.header.reveal.containingFolder": "親フォルダーを開く",
"session.header.open.fileManager": "ファイルマネージャー",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -972,7 +978,8 @@ export const dict = {
"debugBar.ariaLabel": "開発パフォーマンス診断",
"debugBar.na": "n/a",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip": "セッションページに触れる最後に完了したルート遷移。ルーター開始から安定後の最初の描画まで測定。",
"debugBar.nav.tip":
"セッションページに関係する最後に完了したルート遷移。ルーターの開始から処理完了後の最初の描画までを測定。",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "過去5秒間のローリングフレーム/秒。",
"debugBar.frame.label": "FRAME",
+29 -23
View File
@@ -19,7 +19,7 @@ export const dict = {
"theme.scheme.system": "시스템",
"theme.scheme.light": "라이트",
"theme.scheme.dark": "다크",
"command.sidebar.toggle": "사이드바 토글",
"command.sidebar.toggle": "사이드바 표시/숨기기",
"command.project.open": "프로젝트 열기",
"command.provider.connect": "공급자 연결",
"command.server.switch": "서버 전환",
@@ -42,12 +42,12 @@ export const dict = {
"command.context.addSelection": "선택 영역을 컨텍스트에 추가",
"command.context.addSelection.description": "현재 파일에서 선택한 줄을 추가",
"command.input.focus": "입력창 포커스",
"command.terminal.toggle": "터미널 토글",
"command.fileTree.toggle": "파일 트리 토글",
"command.review.toggle": "검토 토글",
"command.terminal.toggle": "터미널 표시/숨기기",
"command.fileTree.toggle": "파일 트리 표시/숨기기",
"command.review.toggle": "검토 표시/숨기기",
"command.terminal.new": "새 터미널",
"command.terminal.new.description": "새 터미널 탭 생성",
"command.steps.toggle": "단계 토글",
"command.steps.toggle": "단계 표시/숨기기",
"command.steps.toggle.description": "현재 메시지의 단계 표시/숨기기",
"command.message.previous": "이전 메시지",
"command.message.previous.description": "이전 사용자 메시지로 이동",
@@ -55,8 +55,8 @@ export const dict = {
"command.message.next.description": "다음 사용자 메시지로 이동",
"command.model.choose": "모델 선택",
"command.model.choose.description": "다른 모델 선택",
"command.mcp.toggle": "MCP 토글",
"command.mcp.toggle.description": "MCP 토글",
"command.mcp.toggle": "MCP 전환",
"command.mcp.toggle.description": "MCP 전환",
"command.agent.cycle": "에이전트 순환",
"command.agent.cycle.description": "다음 에이전트로 전환",
"command.agent.cycle.reverse": "에이전트 역순환",
@@ -90,13 +90,14 @@ export const dict = {
"dialog.provider.empty": "공급자 없음",
"dialog.provider.group.popular": "인기",
"dialog.provider.group.other": "기타",
"dialog.provider.custom.label": "OpenAI 호환 사용자 지정 공급자",
"dialog.provider.tag.recommended": "추천",
"dialog.provider.opencode.note": "Claude, GPT, Gemini 등을 포함한 엄선된 모델",
"dialog.provider.opencode.tagline": "신뢰할 수 있는 최적화 모델",
"dialog.provider.opencodeGo.tagline": "모두를 위한 저렴한 구독",
"dialog.provider.anthropic.note": "Claude Pro/Max 또는 API 키로 연결",
"dialog.provider.copilot.note": "Copilot 또는 API 키로 연결",
"dialog.provider.openai.note": "ChatGPT Pro/Plus 또는 API 키로 연결",
"dialog.provider.anthropic.note": "Pro 및 Max를 포함한 Claude 모델에 직접 액세스",
"dialog.provider.copilot.note": "GitHub Copilot을 통한 코딩 지원용 AI 모델",
"dialog.provider.openai.note": "빠르고 강력한 범용 AI 작업을 위한 GPT 모델",
"dialog.provider.google.note": "빠르고 구조화된 응답을 위한 Gemini 모델",
"dialog.provider.openrouter.note": "모든 지원 모델을 단일 공급자에서 액세스",
"dialog.provider.vercel.note": "스마트 라우팅을 통한 AI 모델 통합 액세스",
@@ -108,6 +109,7 @@ export const dict = {
"dialog.model.manage.provider.toggle": "모든 {{provider}} 모델 토글",
"dialog.model.unpaid.freeModels.title": "OpenCode에서 제공하는 무료 모델",
"dialog.model.unpaid.addMore.title": "인기 공급자의 모델 추가",
"dialog.model.unpaid.viewMoreProviders": "70개 이상의 공급자 더 보기",
"dialog.provider.viewAll": "더 많은 공급자 보기",
"provider.connect.title": "{{provider}} 연결",
"provider.connect.title.anthropicProMax": "Claude Pro/Max로 로그인",
@@ -191,7 +193,7 @@ export const dict = {
"model.input.image": "이미지",
"model.input.audio": "오디오",
"model.input.video": "비디오",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "지원: {{inputs}}",
"model.tooltip.reasoning.allowed": "추론 허용",
"model.tooltip.reasoning.none": "추론 없음",
@@ -204,7 +206,7 @@ export const dict = {
"common.cancel": "취소",
"common.connect": "연결",
"common.disconnect": "연결 해제",
"common.continue": "제출",
"common.continue": "계속",
"common.submit": "제출",
"common.save": "저장",
"common.saving": "저장 중...",
@@ -254,7 +256,7 @@ export const dict = {
"prompt.context.includeActiveFile": "활성 파일 포함",
"prompt.context.removeActiveFile": "컨텍스트에서 활성 파일 제거",
"prompt.context.removeFile": "컨텍스트에서 파일 제거",
"prompt.action.attachFile": "파일 첨부",
"prompt.action.attachFile": "파일 추가",
"prompt.menu.addImagesAndFiles": "파일 및 기타 항목 추가",
"prompt.menu.imagesAndFiles": "이미지 및 파일",
"prompt.menu.commands": "명령어",
@@ -589,15 +591,15 @@ export const dict = {
"settings.general.row.followup.title": "후속 조치 동작",
"settings.general.row.followup.description": "후속 프롬프트를 즉시 실행할지 대기열에 넣을지 선택하세요",
"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.description": "타임라인에 모델 추론 요약 표시",
"settings.general.row.shellToolPartsExpanded.title": "shell 도구 파트 펼치기",
"settings.general.row.shellToolPartsExpanded.title": "shell 도구 항목 펼치기",
"settings.general.row.shellToolPartsExpanded.description":
"타임라인에서 기본적으로 shell 도구 파트를 펼친 상태로 표시합니다",
"settings.general.row.editToolPartsExpanded.title": "edit 도구 파트 펼치기",
"타임라인에서 기본적으로 shell 도구 항목을 펼친 상태로 표시합니다",
"settings.general.row.editToolPartsExpanded.title": "edit 도구 항목 펼치기",
"settings.general.row.editToolPartsExpanded.description":
"타임라인에서 기본적으로 edit, write, patch 도구 파트를 펼친 상태로 표시합니다",
"타임라인에서 기본적으로 edit, write, patch 도구 항목을 펼친 상태로 표시합니다",
"settings.general.row.wayland.title": "네이티브 Wayland 사용",
"settings.general.row.wayland.description": "Wayland에서 X11 폴백을 비활성화합니다. 다시 시작해야 합니다.",
"settings.general.row.wayland.tooltip":
@@ -724,8 +726,8 @@ export const dict = {
"settings.permissions.tool.bash.description": "셸 명령어 실행",
"settings.permissions.tool.task.title": "작업",
"settings.permissions.tool.task.description": "하위 에이전트 실행",
"settings.permissions.tool.skill.title": "기술",
"settings.permissions.tool.skill.description": "이름으로 기술 로드",
"settings.permissions.tool.skill.title": "스킬",
"settings.permissions.tool.skill.description": "이름으로 스킬 불러오기",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "언어 서버 쿼리 실행",
"settings.permissions.tool.todowrite.title": "할 일 쓰기",
@@ -796,6 +798,9 @@ export const dict = {
"session.question.progress": "{{total}}개의 질문 중 {{current}}개",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "파일 탐색기",
"session.header.reveal.finder": "Finder에서 보기",
"session.header.reveal.fileExplorer": "파일 탐색기에서 보기",
"session.header.reveal.containingFolder": "이 항목이 있는 폴더 열기",
"session.header.open.fileManager": "파일 관리자",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -957,7 +962,7 @@ export const dict = {
"home.sessions.group.today": "오늘",
"home.sessions.group.yesterday": "어제",
"home.sessions.group.older": "이전",
"home.providerTip": "75개 이상의 제공업체에 연결하여 Claude, GPT, Gemini 등의 다른 모델을 사용하세요",
"home.providerTip": "75개 이상의 공급자에 연결하여 Claude, GPT, Gemini 등의 다른 모델을 사용하세요",
"session.tab.unknown": "알 수 없는 세션",
"session.error.notFound": "이 세션을 찾을 수 없습니다",
@@ -1000,8 +1005,9 @@ export const dict = {
"settings.general.row.showStatus.description": "제목 표시줄에 서버 상태 버튼 표시",
"settings.general.row.mobileTitlebarBottom.title": "하단 탐색",
"settings.general.row.mobileTitlebarBottom.description": "모바일에서 제목 표시줄과 세션 탭을 화면 하단에 배치",
"settings.general.row.showCustomAgents.title": "사용자 지정 에이전트",
"settings.general.row.showCustomAgents.description": "입력창에 에이전트 선택기 표시",
"settings.general.row.showCustomAgents.title": "에이전트 표시",
"settings.general.row.showCustomAgents.description":
"입력창에서 에이전트를 전환합니다. 숨기면 기본적으로 Build 에이전트를 사용합니다.",
"settings.general.row.newInterface.title": "새 레이아웃",
"settings.general.row.newInterface.badge": "신규",
"settings.general.row.newInterface.description":
File diff suppressed because it is too large Load Diff
+64 -55
View File
@@ -31,8 +31,8 @@ export const dict = {
"command.settings.open": "Åpne innstillinger",
"command.session.previous": "Forrige sesjon",
"command.session.next": "Neste sesjon",
"command.session.previous.unseen": "Forrige uleste økt",
"command.session.next.unseen": "Neste uleste økt",
"command.session.previous.unseen": "Forrige uleste sesjon",
"command.session.next.unseen": "Neste uleste sesjon",
"command.session.archive": "Arkiver sesjon",
"command.palette": "Kommandopalett",
@@ -101,6 +101,7 @@ export const dict = {
"dialog.provider.empty": "Ingen leverandører funnet",
"dialog.provider.group.popular": "Populære",
"dialog.provider.group.other": "Andre",
"dialog.provider.custom.label": "Egendefinert OpenAI-kompatibel leverandør",
"dialog.provider.tag.recommended": "Anbefalt",
"dialog.provider.opencode.note": "Utvalgte modeller inkludert Claude, GPT, Gemini og mer",
"dialog.provider.opencode.tagline": "Pålitelige, optimaliserte modeller",
@@ -121,6 +122,7 @@ export const dict = {
"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.viewMoreProviders": "Se over 70 flere leverandører",
"dialog.provider.viewAll": "Vis flere leverandører",
@@ -132,8 +134,8 @@ export const dict = {
"provider.connect.status.waiting": "Venter på autorisering...",
"provider.connect.status.failed": "Autorisering mislyktes: {{error}}",
"provider.connect.apiKey.description":
"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",
"Skriv inn API-nøkkelen din for {{provider}} for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
"provider.connect.apiKey.label": "{{provider}}-API-nøkkel",
"provider.connect.apiKey.placeholder": "API-nøkkel",
"provider.connect.apiKey.required": "API-nøkkel er påkrevd",
"provider.connect.opencodeZen.line1":
@@ -147,7 +149,7 @@ export const dict = {
"provider.connect.oauth.code.visit.link": "denne lenken",
"provider.connect.oauth.code.visit.suffix":
" 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.required": "Autorisasjonskode er påkrevd",
"provider.connect.oauth.code.invalid": "Ugyldig autorisasjonskode",
@@ -168,11 +170,12 @@ export const dict = {
"provider.custom.field.providerID.description": "Små bokstaver, tall, bindestreker eller understreker",
"provider.custom.field.name.label": "Visningsnavn",
"provider.custom.field.name.placeholder": "Min AI-leverandør",
"provider.custom.field.baseURL.label": "Base-URL",
"provider.custom.field.baseURL.label": "Basis-URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API-nøkkel",
"provider.custom.field.apiKey.placeholder": "API-nøkkel",
"provider.custom.field.apiKey.description": "Valgfritt. La stå tomt hvis du administrerer autentisering via headers.",
"provider.custom.field.apiKey.description":
"Valgfritt. La stå tomt hvis du administrerer autentisering via HTTP-hoder.",
"provider.custom.models.label": "Modeller",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "modell-id",
@@ -180,18 +183,18 @@ export const dict = {
"provider.custom.models.name.placeholder": "Visningsnavn",
"provider.custom.models.remove": "Fjern modell",
"provider.custom.models.add": "Legg til modell",
"provider.custom.headers.label": "Headers (valgfritt)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Navn",
"provider.custom.headers.label": "HTTP-hoder (valgfritt)",
"provider.custom.headers.key.label": "HTTP-hode",
"provider.custom.headers.key.placeholder": "Navn på HTTP-hode",
"provider.custom.headers.value.label": "Verdi",
"provider.custom.headers.value.placeholder": "verdi",
"provider.custom.headers.remove": "Fjern header",
"provider.custom.headers.add": "Legg til header",
"provider.custom.headers.remove": "Fjern HTTP-hode",
"provider.custom.headers.add": "Legg til HTTP-hode",
"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.exists": "Den leverandør-IDen finnes allerede",
"provider.custom.error.providerID.exists": "Denne leverandør-ID-en finnes allerede",
"provider.custom.error.name.required": "Visningsnavn er påkrevd",
"provider.custom.error.baseURL.required": "Base-URL er påkrevd",
"provider.custom.error.baseURL.required": "Basis-URL er påkrevd",
"provider.custom.error.baseURL.format": "Må starte med http:// eller https://",
"provider.custom.error.required": "Påkrevd",
"provider.custom.error.duplicate": "Duplikat",
@@ -224,7 +227,7 @@ export const dict = {
"common.cancel": "Avbryt",
"common.connect": "Koble til",
"common.disconnect": "Koble fra",
"common.continue": "Send inn",
"common.continue": "Fortsett",
"common.submit": "Send inn",
"common.save": "Lagre",
"common.saving": "Lagrer...",
@@ -245,13 +248,13 @@ export const dict = {
"prompt.example.3": "Fiks ødelagte tester",
"prompt.example.4": "Forklar hvordan autentisering fungerer",
"prompt.example.5": "Finn og fiks sikkerhetssårbarheter",
"prompt.example.6": "Legg til enhetstester for brukerservicen",
"prompt.example.6": "Legg til enhetstester for brukertjenesten",
"prompt.example.7": "Refaktorer denne funksjonen for bedre lesbarhet",
"prompt.example.8": "Hva betyr denne feilen?",
"prompt.example.9": "Hjelp meg med å feilsøke dette problemet",
"prompt.example.10": "Generer API-dokumentasjon",
"prompt.example.11": "Optimaliser databasespørringer",
"prompt.example.12": "Legg til inputvalidering",
"prompt.example.12": "Legg til inndatavalidering",
"prompt.example.13": "Lag en ny komponent for...",
"prompt.example.14": "Hvordan deployer jeg dette prosjektet?",
"prompt.example.15": "Gjennomgå koden min for beste praksis",
@@ -261,7 +264,7 @@ export const dict = {
"prompt.example.19": "Legg til logging i hele kodebasen",
"prompt.example.20": "Hvilke avhengigheter er utdaterte?",
"prompt.example.21": "Hjelp meg med å skrive et migreringsskript",
"prompt.example.22": "Implementer caching for dette endepunktet",
"prompt.example.22": "Implementer hurtigbufring for dette endepunktet",
"prompt.example.23": "Legg til paginering i denne listen",
"prompt.example.24": "Lag en CLI-kommando for...",
"prompt.example.25": "Hvordan fungerer miljøvariabler her?",
@@ -271,7 +274,7 @@ export const dict = {
"prompt.dropzone.label": "Slipp bilder, PDF-er eller tekstfiler her",
"prompt.dropzone.file.label": "Slipp for å @nevne fil",
"prompt.slash.badge.custom": "egendefinert",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.skill": "ferdighet",
"prompt.slash.badge.mcp": "mcp",
"prompt.context.active": "aktiv",
"prompt.context.includeActiveFile": "Inkluder aktiv fil",
@@ -297,14 +300,14 @@ export const dict = {
"prompt.toast.shellSendFailed.title": "Kunne ikke sende shell-kommando",
"prompt.toast.commandSendFailed.title": "Kunne ikke sende kommando",
"prompt.toast.promptSendFailed.title": "Kunne ikke sende forespørsel",
"prompt.toast.promptSendFailed.description": "Kunne ikke hente økt",
"prompt.toast.promptSendFailed.description": "Kunne ikke hente sesjon",
"dialog.mcp.title": "MCP-er",
"dialog.mcp.description": "{{enabled}} av {{total}} aktivert",
"dialog.mcp.empty": "Ingen MCP-er konfigurert",
"dialog.lsp.empty": "LSP-er automatisk oppdaget fra filtyper",
"dialog.plugins.empty": "Plugins konfigurert i opencode.json",
"dialog.plugins.empty": "Programtillegg konfigurert i opencode.json",
"mcp.status.connected": "tilkoblet",
"mcp.status.failed": "mislyktes",
@@ -365,7 +368,8 @@ export const dict = {
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
"context.breakdown.title": "Kontekstfordeling",
"context.breakdown.note": 'Omtrentlig fordeling av input-tokens. "Annet" inkluderer verktøydefinisjoner og overhead.',
"context.breakdown.note":
'Omtrentlig fordeling av inndatatokener. "Annet" inkluderer verktøydefinisjoner og overhead.',
"context.breakdown.system": "System",
"context.breakdown.user": "Bruker",
"context.breakdown.assistant": "Assistent",
@@ -380,19 +384,19 @@ export const dict = {
"context.stats.provider": "Leverandør",
"context.stats.model": "Modell",
"context.stats.limit": "Kontekstgrense",
"context.stats.totalTokens": "Totalt antall tokens",
"context.stats.totalTokens": "Totalt antall tokener",
"context.stats.usage": "Forbruk",
"context.stats.inputTokens": "Input-tokens",
"context.stats.outputTokens": "Output-tokens",
"context.stats.reasoningTokens": "Resonnerings-tokens",
"context.stats.cacheTokens": "Cache-tokens (les/skriv)",
"context.stats.inputTokens": "Inndatatokener",
"context.stats.outputTokens": "Utdatatokener",
"context.stats.reasoningTokens": "Resonneringstokener",
"context.stats.cacheTokens": "Hurtigbuffertokener (les/skriv)",
"context.stats.userMessages": "Brukermeldinger",
"context.stats.assistantMessages": "Assistentmeldinger",
"context.stats.totalCost": "Total kostnad",
"context.stats.sessionCreated": "Sesjon opprettet",
"context.stats.lastActivity": "Siste aktivitet",
"context.usage.tokens": "Tokens",
"context.usage.tokens": "Tokener",
"context.usage.usage": "Forbruk",
"context.usage.cost": "Kostnad",
"context.usage.clickToView": "Klikk for å se kontekst",
@@ -423,9 +427,9 @@ export const dict = {
"toast.scheme.title": "Fargevalg",
"toast.workspace.enabled.title": "Arbeidsområder aktivert",
"toast.workspace.enabled.description": "Flere worktrees vises nå i sidefeltet",
"toast.workspace.enabled.description": "Flere arbeidsområder vises nå i sidefeltet",
"toast.workspace.disabled.title": "Arbeidsområder deaktivert",
"toast.workspace.disabled.description": "Kun hoved-worktree vises i sidefeltet",
"toast.workspace.disabled.description": "Kun hovedarbeidsområdet vises i sidefeltet",
"toast.permissions.autoaccept.on.title": "Aksepterer tillatelser automatisk",
"toast.permissions.autoaccept.on.description": "Forespørsler om tillatelse vil bli godkjent automatisk",
@@ -473,7 +477,7 @@ export const dict = {
"error.page.version": "Versjon: {{version}}",
"error.dev.rootNotFound":
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributten er feilstavet?",
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributtet er feilstavet?",
"error.serverSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?",
"directory.error.invalidUrl": "Ugyldig mappe i URL-en.",
@@ -573,7 +577,7 @@ export const dict = {
"status.popover.tab.servers": "Servere",
"status.popover.tab.mcp": "MCP",
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Plugins",
"status.popover.tab.plugins": "Programtillegg",
"status.popover.action.manageServers": "Administrer servere",
"session.share.popover.title": "Publiser på nett",
@@ -613,7 +617,7 @@ export const dict = {
"common.delete": "Slett",
"common.close": "Lukk",
"common.edit": "Rediger",
"common.loadMore": "Last flere",
"common.loadMore": "Last inn flere",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Veksle meny",
@@ -651,16 +655,17 @@ export const dict = {
"settings.general.row.appearance.title": "Utseende",
"settings.general.row.appearance.description": "Tilpass hvordan OpenCode ser ut på enheten din",
"settings.general.row.colorScheme.title": "Fargevalg",
"settings.general.row.colorScheme.description": "Velg om OpenCode skal følge systemets, lyst eller mørkt tema",
"settings.general.row.colorScheme.description":
"Velg om OpenCode skal følge systeminnstillingen eller bruke lyst eller mørkt tema",
"settings.general.row.theme.title": "Tema",
"settings.general.row.theme.description": "Tilpass hvordan OpenCode er tematisert.",
"settings.general.row.theme.description": "Tilpass temaet i OpenCode.",
"settings.general.row.font.title": "Kodefont",
"settings.general.row.font.description": "Tilpass skrifttypen som brukes i kodeblokker",
"settings.general.row.terminalFont.title": "Terminalskrift",
"settings.general.row.terminalFont.description": "Tilpass skrifttypen som brukes i terminalen",
"settings.general.row.uiFont.title": "UI-skrift",
"settings.general.row.uiFont.description": "Tilpass skrifttypen som brukes i hele grensesnittet",
"settings.general.row.followup.title": "Oppfølgingsadferd",
"settings.general.row.followup.title": "Oppfølgingsatferd",
"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.steer": "Styr",
@@ -671,10 +676,10 @@ export const dict = {
"settings.general.row.editToolPartsExpanded.title": "Utvid edit-verktøydeler",
"settings.general.row.editToolPartsExpanded.description":
"Vis edit-, write- og patch-verktøydeler utvidet som standard i tidslinjen",
"settings.general.row.wayland.title": "Bruk innebygd Wayland",
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Krever omstart.",
"settings.general.row.wayland.title": "Bruk Wayland direkte",
"settings.general.row.wayland.description": "Deaktiver X11-reserveløsningen på Wayland. Krever omstart.",
"settings.general.row.wayland.tooltip":
"På Linux med skjermer med blandet oppdateringsfrekvens kan innebygd Wayland være mer stabilt.",
"På Linux med skjermer med blandet oppdateringsfrekvens kan direkte Wayland-støtte være mer stabilt.",
"settings.general.row.releaseNotes.title": "Utgivelsesnotater",
"settings.general.row.releaseNotes.description": 'Vis "Hva er nytt"-vinduer etter oppdateringer',
@@ -685,7 +690,7 @@ export const dict = {
"settings.updates.row.check.description": "Se etter oppdateringer manuelt og installer hvis tilgjengelig",
"settings.updates.action.checkNow": "Sjekk nå",
"settings.updates.action.checking": "Sjekker...",
"settings.updates.toast.latest.title": "Du er oppdatert",
"settings.updates.toast.latest.title": "OpenCode er oppdatert",
"settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av OpenCode.",
"sound.option.none": "Ingen",
"sound.option.alert01": "Varsel 01",
@@ -754,7 +759,7 @@ export const dict = {
"settings.shortcuts.reset.toast.title": "Snarveier tilbakestilt",
"settings.shortcuts.reset.toast.description": "Tastatursnarveier er tilbakestilt til standard.",
"settings.shortcuts.conflict.title": "Snarvei allerede i bruk",
"settings.shortcuts.conflict.description": "{{keybind}} er allerede tilordnet til {{titles}}.",
"settings.shortcuts.conflict.description": "{{keybind}} er allerede tilordnet {{titles}}.",
"settings.shortcuts.unassigned": "Ikke tilordnet",
"settings.shortcuts.pressKeys": "Trykk taster",
"settings.shortcuts.search.placeholder": "Søk etter snarveier",
@@ -804,7 +809,7 @@ export const dict = {
"settings.permissions.tool.grep.title": "Grep",
"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.description": "List filer i en mappe",
"settings.permissions.tool.list.description": "List opp filer i en mappe",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "Kjør shell-kommandoer",
"settings.permissions.tool.task.title": "Oppgave",
@@ -822,7 +827,7 @@ export const dict = {
"settings.permissions.tool.external_directory.title": "Ekstern mappe",
"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.description": "Oppdager gjentatte verktøykall med identisk input",
"settings.permissions.tool.doom_loop.description": "Oppdager gjentatte verktøykall med identiske inndata",
"session.delete.failed.title": "Kunne ikke slette sesjon",
"session.delete.title": "Slett sesjon",
@@ -867,14 +872,14 @@ export const dict = {
"common.time.hoursAgo.short": "{{count}} t siden",
"common.time.daysAgo.short": "{{count}} d siden",
"settings.providers.connected.environmentDescription": "Koblet til fra miljøvariablene dine",
"settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via basis-URL.",
"settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via en basis-URL.",
"app.server.unreachable": "Kunne ikke nå {{server}}",
"app.server.retrying": "Prøver på nytt automatisk...",
"app.server.otherServers": "Andre servere",
"dialog.server.add.usernamePlaceholder": "brukernavn",
"dialog.server.add.passwordPlaceholder": "passord",
"server.row.noUsername": "inget brukernavn",
"server.row.noUsername": "ikke noe brukernavn",
"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.actionLoading": "Oppretter Git-depot...",
@@ -883,6 +888,9 @@ export const dict = {
"session.question.progress": "{{current}} av {{total}} spørsmål",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -901,25 +909,25 @@ export const dict = {
"debugBar.na": "i/t",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip":
"Siste fullførte ruteovergang som berører en sesjonsside, målt fra ruterstart til første opptegning etter at den har roet seg.",
"Siste fullførte ruteovergang som berører en sesjonsside, målt fra ruterstart til første gjengivelse etter at den har roet seg.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Rullende bilder per sekund over de siste 5 sekundene.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Verste bildetid over de siste 5 sekundene.",
"debugBar.frame.tip": "Lengste bildetid over de siste 5 sekundene.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Bilder over 32ms i de siste 5 sekundene.",
"debugBar.jank.tip": "Bilder som tar over 32 ms i de siste 5 sekundene.",
"debugBar.long.label": "LONG",
"debugBar.long.tip": "Blokkert tid og antall lange oppgaver i de siste 5 sekundene. Maks oppgave: {{max}}.",
"debugBar.long.tip": "Blokkert tid og antall lange oppgaver i de siste 5 sekundene. Lengste oppgave: {{max}}.",
"debugBar.delay.label": "DELAY",
"debugBar.delay.tip": "Verste observerte inndataforsinkelse i de siste 5 sekundene.",
"debugBar.delay.tip": "Lengste observerte inndataforsinkelse i de siste 5 sekundene.",
"debugBar.inp.label": "INP",
"debugBar.inp.tip":
"Omtrentlig interaksjonsvarighet over de siste 5 sekundene. Dette er INP-lignende, ikke den offisielle Web Vitals INP.",
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Kumulativ layoutforskyvning for gjeldende app-levetid.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Brukt JS-heap vs heap-grense. Kun Chromium.",
"debugBar.mem.tip": "Brukt JS-heap vs heap-grense. {{used}} av {{limit}}.",
"debugBar.mem.tipUnavailable": "Brukt JS-heap kontra heap-grense. Kun Chromium.",
"debugBar.mem.tip": "Brukt JS-heap kontra heap-grense. {{used}} av {{limit}}.",
"common.key.ctrl": "Ctrl",
"common.key.alt": "Alt",
"common.key.shift": "Shift",
@@ -1058,7 +1066,7 @@ export const dict = {
"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.serverConnection": "Kan ikke koble til denne serveren",
"session.review.noUncommittedChanges": "Ingen ucommittede endringer ennå",
"session.review.noUncommittedChanges": "Ingen endringer som ikke er sjekket inn ennå",
"session.review.noBranchChanges": "Ingen grenendringer ennå",
"session.question.minimize": "Minimer spørsmål",
"session.question.restore": "Gjenopprett spørsmål",
@@ -1096,8 +1104,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Navigasjon nederst",
"settings.general.row.mobileTitlebarBottom.description":
"Plasser tittellinjen og sesjonsfanene nederst på mobilskjermen",
"settings.general.row.showCustomAgents.title": "Egendefinerte agenter",
"settings.general.row.showCustomAgents.description": "Vis agentvelgeren i skrivefeltet",
"settings.general.row.showCustomAgents.title": "Vis agent",
"settings.general.row.showCustomAgents.description":
"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.badge": "Ny",
"settings.general.row.newInterface.description":
File diff suppressed because it is too large Load Diff
+11 -1
View File
@@ -18,8 +18,18 @@ const appLocales = [
"tr",
"zh",
"zht",
"hi",
"nl",
"id",
"vi",
"it",
"ur",
"pa",
"az",
"fi",
"sv",
] as const
const desktopLocales = appLocales.filter((locale) => locale !== "th" && locale !== "tr")
const desktopLocales = appLocales
const domains = [
{
+68 -60
View File
@@ -45,7 +45,7 @@ export const dict = {
"command.tab.reopenClosed": "Otwórz ponownie zamkniętą kartę",
"command.context.addSelection": "Dodaj zaznaczenie do kontekstu",
"command.context.addSelection.description": "Dodaj zaznaczone linie z bieżącego pliku",
"command.input.focus": "Fokus na pole wejściowe",
"command.input.focus": "Przejdź do pola wprowadzania",
"command.terminal.toggle": "Przełącz terminal",
"command.fileTree.toggle": "Przełącz drzewo plików",
"command.review.toggle": "Przełącz przegląd",
@@ -82,7 +82,7 @@ export const dict = {
"command.session.fork": "Rozwidlij od wiadomości",
"command.session.fork.description": "Utwórz nową sesję od poprzedniej wiadomości",
"command.session.share": "Udostępnij sesję",
"command.session.share.description": "Udostępnij tę sesję i skopiuj URL do schowka",
"command.session.share.description": "Udostępnij tę sesję i skopiuj adres URL do schowka",
"command.session.unshare": "Przestań udostępniać sesję",
"command.session.unshare.description": "Zatrzymaj udostępnianie tej sesji",
"palette.search.placeholder": "Szukaj plików, poleceń i sesji",
@@ -94,10 +94,11 @@ export const dict = {
"dialog.provider.empty": "Nie znaleziono dostawców",
"dialog.provider.group.popular": "Popularne",
"dialog.provider.group.other": "Inne",
"dialog.provider.custom.label": "Niestandardowy dostawca zgodny z OpenAI",
"dialog.provider.tag.recommended": "Zalecane",
"dialog.provider.opencode.note": "Wyselekcjonowane modele, w tym Claude, GPT, Gemini i inne",
"dialog.provider.opencode.note": "Starannie dobrane modele, w tym Claude, GPT, Gemini i inne",
"dialog.provider.opencode.tagline": "Niezawodne, zoptymalizowane modele",
"dialog.provider.opencodeGo.tagline": "Tania subskrypcja dla każdego",
"dialog.provider.opencodeGo.tagline": "Niedroga subskrypcja dla każdego",
"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.openai.note": "Modele GPT do szybkich i wszechstronnych zadań AI",
@@ -106,15 +107,16 @@ export const dict = {
"dialog.provider.vercel.note": "Ujednolicony dostęp do modeli AI z inteligentnym routingiem",
"dialog.model.select.title": "Wybierz model",
"dialog.model.search.placeholder": "Szukaj modeli",
"dialog.model.empty": "Brak wyników modelu",
"dialog.model.empty": "Nie znaleziono modeli",
"dialog.model.manage": "Zarządzaj modelami",
"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.unpaid.freeModels.title": "Darmowe modele dostarczane przez OpenCode",
"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",
"provider.connect.title": "Połącz {{provider}}",
"provider.connect.title.anthropicProMax": "Zaloguj się z Claude Pro/Max",
"provider.connect.title.anthropicProMax": "Zaloguj się za pomocą konta Claude Pro/Max",
"provider.connect.selectMethod": "Wybierz metodę logowania dla {{provider}}.",
"provider.connect.method.apiKey": "Klucz API",
"provider.connect.status.inProgress": "Autoryzacja w toku...",
@@ -126,9 +128,9 @@ export const dict = {
"provider.connect.apiKey.placeholder": "Klucz API",
"provider.connect.apiKey.required": "Klucz API jest wymagany",
"provider.connect.opencodeZen.line1":
"OpenCode Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów kodujących.",
"OpenCode Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów programistycznych.",
"provider.connect.opencodeZen.line2":
"Z jednym kluczem API uzyskasz dostęp do modeli takich jak Claude, GPT, Gemini, GLM i więcej.",
"Za pomocą jednego klucza API uzyskasz dostęp do modeli takich jak Claude, GPT, Gemini i GLM, a także wielu innych.",
"provider.connect.opencodeZen.visit.prefix": "Odwiedź ",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": ", aby odebrać swój klucz API.",
@@ -156,7 +158,7 @@ export const dict = {
"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.placeholder": "Mój Dostawca AI",
"provider.custom.field.baseURL.label": "Bazowy URL",
"provider.custom.field.baseURL.label": "Bazowy adres URL",
"provider.custom.field.baseURL.placeholder": "https://api.mojdostawca.com/v1",
"provider.custom.field.apiKey.label": "Klucz API",
"provider.custom.field.apiKey.placeholder": "Klucz API",
@@ -180,7 +182,7 @@ export const dict = {
"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.name.required": "Nazwa wyświetlana jest wymagana",
"provider.custom.error.baseURL.required": "Bazowy URL jest wymagany",
"provider.custom.error.baseURL.required": "Bazowy adres URL jest wymagany",
"provider.custom.error.baseURL.format": "Musi zaczynać się od http:// lub https://",
"provider.custom.error.required": "Wymagane",
"provider.custom.error.duplicate": "Duplikat",
@@ -216,7 +218,7 @@ export const dict = {
"common.clear": "Wyczyść",
"common.connect": "Połącz",
"common.disconnect": "Rozłącz",
"common.continue": "Prześlij",
"common.continue": "Kontynuuj",
"common.submit": "Prześlij",
"common.save": "Zapisz",
"common.saving": "Zapisywanie...",
@@ -229,46 +231,46 @@ export const dict = {
"prompt.placeholder.summarizeComment": "Podsumuj komentarz…",
"prompt.mode.shell": "Terminal",
"prompt.mode.normal": "Prompt",
"prompt.mode.shell.exit": "esc aby wyjść",
"prompt.mode.shell.exit": "Naciśnij Esc, aby wyjść",
"session.child.promptDisabled": "Nie można wysyłać promptów w sesjach podagentów.",
"session.child.backToParent": "Wróć do głównej sesji.",
"prompt.example.1": "Napraw TODO w bazie kodu",
"prompt.example.2": "Jaki jest stos technologiczny tego projektu?",
"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.6": "Dodaj testy jednostkowe dla serwisu użytkownika",
"prompt.example.7": "Zrefaktoryzuj tę funkcję, aby była bardziej czytelna",
"prompt.example.8": "Co oznacza ten błąd?",
"prompt.example.9": "Pomóż mi zdebugować ten problem",
"prompt.example.9": "Pomóż mi zdiagnozować ten problem",
"prompt.example.10": "Wygeneruj dokumentację API",
"prompt.example.11": "Zoptymalizuj zapytania do bazy danych",
"prompt.example.12": "Dodaj walidację danych wejściowych",
"prompt.example.13": "Utwórz nowy komponent dla...",
"prompt.example.14": "Jak wdrożyć ten projekt?",
"prompt.example.15": "Sprawdź mój kod pod kątem najlepszych praktyk",
"prompt.example.16": "Dodaj obsługę błędów do tej funkcję",
"prompt.example.16": "Dodaj obsługę błędów do tej funkcji",
"prompt.example.17": "Wyjaśnij ten wzorzec regex",
"prompt.example.18": "Przekonwertuj to na TypeScript",
"prompt.example.19": "Dodaj logowanie w całej bazie kodu",
"prompt.example.20": "Które zależności są przestarzałe?",
"prompt.example.21": "Pomóż mi napisać skrypt migracyjny",
"prompt.example.22": "Zaimplementuj cachowanie dla tego punktu końcowego",
"prompt.example.22": "Zaimplementuj buforowanie dla tego punktu końcowego",
"prompt.example.23": "Dodaj stronicowanie do tej listy",
"prompt.example.24": "Utwórz polecenie CLI dla...",
"prompt.example.25": "Jak działają tutaj zmienne środowiskowe?",
"prompt.popover.emptyResults": "Brak pasujących wyników",
"prompt.popover.emptyCommands": "Brak pasujących poleceń",
"prompt.dropzone.label": "Upuść tutaj obrazy, pliki PDF lub pliki tekstowe",
"prompt.dropzone.file.label": "Upuść, aby @wspomnieć plik",
"prompt.dropzone.file.label": "Upuść, aby oznaczyć plik za pomocą @",
"prompt.slash.badge.custom": "własne",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.skill": "umiejętność",
"prompt.slash.badge.mcp": "mcp",
"prompt.context.active": "aktywny",
"prompt.context.includeActiveFile": "Dołącz aktywny plik",
"prompt.context.removeActiveFile": "Usuń aktywny plik z kontekstu",
"prompt.context.removeFile": "Usuń plik z kontekstu",
"prompt.action.attachFile": "Załącz plik",
"prompt.action.attachFile": "Dodaj pliki",
"prompt.menu.addImagesAndFiles": "Dodaj pliki i inne elementy",
"prompt.menu.imagesAndFiles": "Obrazy i pliki",
"prompt.menu.commands": "Polecenia",
@@ -289,12 +291,12 @@ export const dict = {
"prompt.toast.promptSendFailed.title": "Nie udało się wysłać zapytania",
"prompt.toast.promptSendFailed.description": "Nie udało się pobrać sesji",
"dialog.mcp.title": "MCP",
"dialog.mcp.description": "{{enabled}} z {{total}} włączone",
"dialog.mcp.description": "Włączone: {{enabled}} z {{total}}",
"dialog.mcp.empty": "Brak skonfigurowanych MCP",
"dialog.lsp.empty": "LSP wykryte automatycznie na podstawie typów plików",
"dialog.plugins.empty": "Wtyczki skonfigurowane w opencode.json",
"dialog.lsp.empty": "Serwery LSP wykrywane automatycznie na podstawie typów plików",
"dialog.plugins.empty": "Wtyczki skonfigurowane w pliku opencode.json",
"mcp.status.connected": "połączono",
"mcp.status.failed": "niepowodzenie",
"mcp.status.failed": "błąd",
"mcp.status.needs_auth": "wymaga autoryzacji",
"mcp.auth.clickToAuthenticate": "Kliknij, aby się uwierzytelnić",
"mcp.status.disabled": "wyłączone",
@@ -304,14 +306,14 @@ export const dict = {
"dialog.directory.action.selectFile": "Wybierz plik",
"dialog.directory.action.selectFolder": "Wybierz folder",
"dialog.directory.root": "Katalog główny",
"dialog.directory.parent": "Nadrzędny",
"dialog.directory.parent": "Folder nadrzędny",
"dialog.directory.readError": "Nie można odczytać tego folderu",
"dialog.server.title": "Serwery",
"dialog.server.description": "Przełącz serwer OpenCode, z którym łączy się ta aplikacja.",
"dialog.server.search.placeholder": "Szukaj serwerów",
"dialog.server.empty": "Brak serwerów",
"dialog.server.add.title": "Dodaj serwer",
"dialog.server.add.url": "URL serwera",
"dialog.server.add.url": "Adres URL serwera",
"dialog.server.add.placeholder": "http://localhost:4096",
"dialog.server.add.error": "Nie można połączyć się z serwerem",
"dialog.server.add.checking": "Sprawdzanie...",
@@ -323,7 +325,7 @@ export const dict = {
"dialog.server.edit.title": "Edytuj serwer",
"dialog.server.default.title": "Domyślny serwer",
"dialog.server.default.description":
"Połącz z tym serwerem przy uruchomieniu aplikacji zamiast uruchamiać lokalny serwer. Wymaga restartu.",
"Łącz się z tym serwerem przy uruchamianiu aplikacji zamiast uruchamiać serwer lokalny. Wymaga ponownego uruchomienia.",
"dialog.server.default.none": "Nie wybrano serwera",
"dialog.server.default.set": "Ustaw bieżący serwer jako domyślny",
"dialog.server.default.clear": "Wyczyść",
@@ -332,7 +334,7 @@ export const dict = {
"dialog.server.menu.default": "Ustaw jako domyślny",
"dialog.server.menu.defaultRemove": "Usuń domyślny",
"dialog.server.menu.delete": "Usuń",
"dialog.server.current": "Obecny serwer",
"dialog.server.current": "Bieżący serwer",
"dialog.server.status.default": "Domyślny",
"wsl.server.add": "Dodaj serwer WSL",
"wsl.server.addShort": "Dodaj WSL",
@@ -373,7 +375,7 @@ export const dict = {
"wsl.onboarding.distroStatus.ready": "Gotowa",
"wsl.onboarding.distroStatus.checking": "Sprawdzanie...",
"wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nie jest zainstalowany",
"wsl.onboarding.distroStatus.missingTools": "Brak bash i curl",
"wsl.onboarding.distroStatus.missingTools": "Brak narzędzi bash i curl",
"wsl.onboarding.distroStatus.unsupported": "Nieobsługiwana · Użyj WSL 2",
"wsl.onboarding.needAnotherDistro": "Potrzebujesz innej dystrybucji?",
"wsl.onboarding.needAnotherDistroHint": "Zainstaluj dystrybucję systemu Linux z katalogu WSL",
@@ -394,7 +396,7 @@ export const dict = {
"wsl.onboarding.installDistro": "Zainstaluj dystrybucję",
"wsl.onboarding.searchDistros": "Szukaj dystrybucji",
"wsl.onboarding.wsl2Required": "Wymagany jest WSL 2.",
"wsl.onboarding.toolsRequired": "Ta dystrybucja wymaga bash i curl.",
"wsl.onboarding.toolsRequired": "Ta dystrybucja wymaga narzędzi bash i curl.",
"wsl.onboarding.openTerminal": "Otwórz terminal",
"wsl.onboarding.path": "Ścieżka: {{path}}",
"wsl.onboarding.notFound": "nie znaleziono",
@@ -407,8 +409,8 @@ export const dict = {
"dialog.project.edit.name": "Nazwa",
"dialog.project.edit.icon": "Ikona",
"dialog.project.edit.icon.alt": "Ikona projektu",
"dialog.project.edit.icon.hint": "Kliknij lub przeciągnij obraz",
"dialog.project.edit.icon.recommended": "Zalecane: 128x128px",
"dialog.project.edit.icon.hint": "Kliknij, aby wybrać obraz, lub przeciągnij go tutaj",
"dialog.project.edit.icon.recommended": "Zalecane: 128 × 128 px",
"dialog.project.edit.color": "Kolor",
"dialog.project.edit.color.select": "Wybierz kolor {{color}}",
"dialog.project.edit.worktree.startup": "Skrypt uruchamiania przestrzeni roboczej",
@@ -468,9 +470,9 @@ export const dict = {
"toast.theme.title": "Przełączono motyw",
"toast.scheme.title": "Schemat kolorów",
"toast.workspace.enabled.title": "Przestrzenie robocze włączone",
"toast.workspace.enabled.description": "Kilka worktree jest teraz wyświetlanych na pasku bocznym",
"toast.workspace.enabled.description": "Kilka drzew roboczych jest teraz wyświetlanych na pasku bocznym",
"toast.workspace.disabled.title": "Przestrzenie robocze wyłączone",
"toast.workspace.disabled.description": "Tylko główny worktree jest wyświetlany na pasku bocznym",
"toast.workspace.disabled.description": "Tylko główne drzewo robocze jest wyświetlane na pasku bocznym",
"toast.permissions.autoaccept.on.title": "Automatyczne akceptowanie uprawnień",
"toast.permissions.autoaccept.on.description": "Żądania uprawnień będą automatycznie zatwierdzane",
"toast.permissions.autoaccept.off.title": "Zatrzymano automatyczne akceptowanie uprawnień",
@@ -481,9 +483,9 @@ export const dict = {
"toast.file.listFailed.title": "Nie udało się wyświetlić listy plików",
"toast.context.noLineSelection.title": "Brak zaznaczenia linii",
"toast.context.noLineSelection.description": "Najpierw wybierz zakres linii w zakładce pliku.",
"toast.session.share.copyFailed.title": "Nie udało się skopiować URL do schowka",
"toast.session.share.copyFailed.title": "Nie udało się skopiować adresu URL do schowka",
"toast.session.share.success.title": "Sesja udostępniona",
"toast.session.share.success.description": "Link udostępniania skopiowany do schowka!",
"toast.session.share.success.description": "Adres URL udostępnionej sesji skopiowano do schowka!",
"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.unshare.success.title": "Zatrzymano udostępnianie sesji",
@@ -493,13 +495,13 @@ export const dict = {
"toast.session.listFailed.title": "Nie udało się załadować sesji dla {{project}}",
"toast.update.title": "Dostępna aktualizacja",
"toast.update.description": "Nowa wersja OpenCode ({{version}}) jest teraz dostępna do instalacji.",
"toast.update.action.installRestart": "Zainstaluj i zrestartuj",
"toast.update.action.installRestart": "Zainstaluj i uruchom ponownie",
"toast.update.action.notYet": "Jeszcze nie",
"error.page.title": "Coś poszło nie tak",
"error.page.description": "Wystąpił błąd podczas ładowania aplikacji.",
"error.page.description.localServerStartup": "Wystąpił błąd podczas uruchamiania serwera lokalnego.",
"error.page.details.label": "Szczegóły błędu",
"error.page.action.restart": "Restartuj",
"error.page.action.restart": "Uruchom ponownie",
"error.page.action.report": "Zgłoś błąd",
"error.page.action.reported": "Błąd zgłoszony",
"error.page.action.exportLogs": "Eksportuj dzienniki",
@@ -512,7 +514,7 @@ export const dict = {
"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?",
"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 URL.",
"directory.error.invalidUrl": "Nieprawidłowy katalog w adresie URL.",
"error.chain.unknown": "Nieznany błąd",
"error.chain.causedBy": "Spowodowany przez:",
"error.chain.apiError": "Błąd API",
@@ -521,7 +523,7 @@ export const dict = {
"error.chain.responseBody": "Treść odpowiedzi:\n{{body}}",
"error.chain.didYouMean": "Czy miałeś na myśli: {{suggestions}}",
"error.chain.modelNotFound": "Model nie znaleziony: {{provider}}/{{model}}",
"error.chain.checkConfig": "Sprawdź swoją konfigurację (opencode.json) nazwy dostawców/modeli",
"error.chain.checkConfig": "Sprawdź nazwy dostawców i modeli w konfiguracji (opencode.json)",
"error.chain.mcpFailed":
"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}}",
@@ -576,7 +578,7 @@ export const dict = {
"session.review.change.other": "Zmiany",
"session.review.loadingChanges": "Ładowanie zmian...",
"session.review.empty": "Brak zmian w tej sesji",
"session.review.noVcs": "Nie wykryto systemu kontroli wersji Git, zmiany nie są wyświetlane",
"session.review.noVcs": "Nie wykryto systemu kontroli wersji Git, dlatego 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.noChanges": "Brak zmian",
"session.review.noUncommittedChanges": "Brak jeszcze niezatwierdzonych zmian",
@@ -646,7 +648,7 @@ export const dict = {
"session.share.action.publishing": "Publikowanie...",
"session.share.action.unpublish": "Cofnij publikację",
"session.share.action.unpublishing": "Cofanie publikacji...",
"session.share.action.view": "Widok",
"session.share.action.view": "Wyświetl",
"session.share.copy.copied": "Skopiowano",
"session.share.copy.copyLink": "Kopiuj link",
"lsp.tooltip.none": "Brak serwerów LSP",
@@ -658,7 +660,7 @@ export const dict = {
"terminal.close": "Zamknij terminal",
"terminal.connectionLost.title": "Utracono połączenie",
"terminal.connectionLost.description":
"Połączenie z terminalem zostało przerwane. Może się to zdarzyć przy restarcie serwera.",
"Połączenie z terminalem zostało przerwane. Może się to zdarzyć podczas ponownego uruchamiania serwera.",
"common.closeTab": "Zamknij kartę",
"common.dismiss": "Odrzuć",
"common.requestFailed": "Żądanie nie powiodło się",
@@ -687,7 +689,7 @@ export const dict = {
"sidebar.empty.title": "Brak otwartych projektów",
"sidebar.empty.description": "Otwórz projekt, aby rozpocząć",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Pulpit",
"settings.section.desktop": "Aplikacja komputerowa",
"settings.section.server": "Serwer",
"settings.tab.general": "Ogólne",
"settings.tab.shortcuts": "Skróty",
@@ -739,8 +741,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Dolna nawigacja",
"settings.general.row.mobileTitlebarBottom.description":
"Umieść pasek tytułu i karty sesji u dołu ekranu na urządzeniach mobilnych",
"settings.general.row.showCustomAgents.title": "Agenci niestandardowi",
"settings.general.row.showCustomAgents.description": "Pokaż wybór agenta w edytorze wiadomości",
"settings.general.row.showCustomAgents.title": "Wybór agenta",
"settings.general.row.showCustomAgents.description":
"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.description": "Wyświetlaj podsumowania wnioskowania modelu na osi czasu",
"settings.general.row.shellToolPartsExpanded.title": "Rozwijaj elementy narzędzia shell",
@@ -758,13 +761,14 @@ export const dict = {
"settings.general.row.newInterfaceNotice.dismiss": "Odrzuć",
"settings.general.row.pinchZoom.title": "Powiększanie gestem szczypania",
"settings.general.row.pinchZoom.description":
"Zezwalaj na powiększanie gestem szczypania na gładziku i przewijaniem z klawiszem Ctrl",
"settings.general.row.wayland.title": "Użyj natywnego Wayland",
"settings.general.row.wayland.description": "Wyłącz fallback X11 na Wayland. Wymaga restartu.",
"Zezwalaj na powiększanie gestem szczypania na gładziku lub przez przewijanie z wciśniętym klawiszem Ctrl",
"settings.general.row.wayland.title": "Użyj natywnego protokołu Wayland",
"settings.general.row.wayland.description":
"Wyłącz awaryjne korzystanie z X11 w środowisku Wayland. Wymaga ponownego uruchomienia.",
"settings.general.row.wayland.tooltip":
"Na Linuxie z monitorami o różnym odświeżaniu, natywny Wayland może być bardziej stabilny.",
"W systemie Linux z monitorami o różnej częstotliwości odświeżania natywny protokół Wayland może być stabilniejszy.",
"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.description": "Automatycznie sprawdzaj aktualizacje podczas uruchamiania OpenCode",
"settings.updates.row.check.title": "Sprawdź aktualizacje",
@@ -878,7 +882,8 @@ export const dict = {
"settings.permissions.tool.read.title": "Odczyt",
"settings.permissions.tool.read.description": "Odczyt pliku (pasuje do ścieżki pliku)",
"settings.permissions.tool.edit.title": "Edycja",
"settings.permissions.tool.edit.description": "Modyfikacja plików, w tym edycje, zapisy, łatki i multi-edycje",
"settings.permissions.tool.edit.description":
"Modyfikowanie plików, w tym edytowanie, zapisywanie, stosowanie łatek i edytowanie wielu plików",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Dopasowywanie plików za pomocą wzorców glob",
"settings.permissions.tool.grep.title": "Grep",
@@ -888,7 +893,7 @@ export const dict = {
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "Uruchamianie poleceń powłoki",
"settings.permissions.tool.task.title": "Zadanie",
"settings.permissions.tool.task.description": "Uruchamianie pod-agentów",
"settings.permissions.tool.task.description": "Uruchamianie podagentów",
"settings.permissions.tool.skill.title": "Umiejętność",
"settings.permissions.tool.skill.description": "Ładowanie umiejętności według nazwy",
"settings.permissions.tool.lsp.title": "LSP",
@@ -919,7 +924,7 @@ export const dict = {
"workspace.reset.success.description": "Przestrzeń robocza odpowiada teraz domyślnej gałęzi.",
"workspace.error.stillPreparing": "Przestrzeń robocza jest wciąż przygotowywana",
"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.dirty": "Wykryto niezscalone zmiany w tej przestrzeni roboczej.",
"workspace.delete.title": "Usuń przestrzeń roboczą",
@@ -945,7 +950,7 @@ export const dict = {
"common.time.hoursAgo.short": "{{count}} godz. temu",
"common.time.daysAgo.short": "{{count}} dni temu",
"settings.providers.connected.environmentDescription": "Połączono ze zmiennymi środowiskowymi",
"settings.providers.custom.description": "Dodaj dostawcę zgodnego z OpenAI poprzez podstawowy URL.",
"settings.providers.custom.description": "Dodaj dostawcę zgodnego z OpenAI za pomocą bazowego adresu URL.",
"app.server.unreachable": "Nie można połączyć z {{server}}",
"app.server.retrying": "Ponawianie automatycznie...",
@@ -961,6 +966,9 @@ export const dict = {
"session.question.progress": "{{current}} z {{total}} pytań",
"session.header.open.finder": "Finder",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -975,17 +983,17 @@ export const dict = {
"session.header.open.app.androidStudio": "Android Studio",
"session.header.open.app.powershell": "PowerShell",
"session.header.open.app.sublimeText": "Sublime Text",
"debugBar.ariaLabel": "Diagnostyka wydajności deweloperskiej",
"debugBar.ariaLabel": "Diagnostyka wydajności w środowisku deweloperskim",
"debugBar.na": "n.d.",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip":
"Ostatnie zakończone przejście trasy dotykające strony sesji, mierzone od startu routera do pierwszego odrysowania po ustaleniu.",
"Ostatnie zakończone przejście między trasami obejmujące stronę sesji, mierzone od uruchomienia routera do pierwszego odrysowania po ustabilizowaniu widoku.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Średnia liczba klatek na sekundę w ciągu ostatnich 5 sekund.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Najgorszy czas klatki w ciągu ostatnich 5 sekund.",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "Klatki powyżej 32ms w ciągu ostatnich 5 sekund.",
"debugBar.jank.tip": "Klatki powyżej 32 ms w ciągu ostatnich 5 sekund.",
"debugBar.long.label": "LONG",
"debugBar.long.tip":
"Zablokowany czas i liczba długich zadań w ciągu ostatnich 5 sekund. Maksymalne zadanie: {{max}}.",
@@ -995,10 +1003,10 @@ export const dict = {
"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.",
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Skumulowane przesunięcie układu dla bieżącego czasu życia aplikacji.",
"debugBar.cls.tip": "Skumulowane przesunięcie układu od bieżącego uruchomienia aplikacji.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Użyta sterta JS vs limit sterty. Tylko Chromium.",
"debugBar.mem.tip": "Użyta sterta JS vs limit sterty. {{used}} z {{limit}}.",
"debugBar.mem.tipUnavailable": "Wykorzystana pamięć sterty JS względem jej limitu. Tylko Chromium.",
"debugBar.mem.tip": "Wykorzystana pamięć sterty JS względem jej limitu: {{used}} z {{limit}}.",
"common.key.ctrl": "Ctrl",
"common.key.alt": "Alt",
"common.key.shift": "Shift",
+87 -81
View File
@@ -37,12 +37,12 @@ export const dict = {
"command.palette": "Палитра команд",
"command.theme.cycle": "Цикл тем",
"command.theme.cycle": "Переключить тему",
"command.theme.set": "Использовать тему: {{theme}}",
"command.theme.scheme.cycle": "Цикл цветовой схемы",
"command.theme.scheme.cycle": "Переключить цветовую схему",
"command.theme.scheme.set": "Использовать цветовую схему: {{scheme}}",
"command.language.cycle": "Цикл языков",
"command.language.cycle": "Переключить язык",
"command.language.set": "Использовать язык: {{language}}",
"command.session.new": "Новая сессия",
@@ -51,7 +51,7 @@ export const dict = {
"command.tab.reopenClosed": "Повторно открыть закрытую вкладку",
"command.context.addSelection": "Добавить выделение в контекст",
"command.context.addSelection.description": "Добавить выбранные строки из текущего файла",
"command.input.focus": "Фокус на поле ввода",
"command.input.focus": "Перейти к полю ввода",
"command.terminal.toggle": "Переключить терминал",
"command.fileTree.toggle": "Переключить дерево файлов",
"command.review.toggle": "Переключить обзор",
@@ -67,11 +67,11 @@ export const dict = {
"command.model.choose.description": "Выбрать другую модель",
"command.mcp.toggle": "Переключить MCP",
"command.mcp.toggle.description": "Переключить MCP",
"command.agent.cycle": "Цикл агентов",
"command.agent.cycle": "Следующий агент",
"command.agent.cycle.description": "Переключиться к следующему агенту",
"command.agent.cycle.reverse": "Цикл агентов назад",
"command.agent.cycle.reverse": "Предыдущий агент",
"command.agent.cycle.reverse.description": "Переключиться к предыдущему агенту",
"command.model.variant.cycle": "Цикл режимов мышления",
"command.model.variant.cycle": "Переключить уровень усилий",
"command.model.variant.cycle.description": "Переключиться к следующему уровню усилий",
"command.prompt.mode.shell": "Оболочка",
"command.prompt.mode.normal": "Промпт",
@@ -102,9 +102,10 @@ export const dict = {
"dialog.provider.empty": "Провайдеры не найдены",
"dialog.provider.group.popular": "Популярные",
"dialog.provider.group.other": "Другие",
"dialog.provider.custom.label": "Пользовательский провайдер, совместимый с OpenAI",
"dialog.provider.tag.recommended": "Рекомендуемые",
"dialog.provider.opencode.note": "Отобранные модели, включая Claude, GPT, Gemini и другие",
"dialog.provider.opencode.tagline": "Надежные оптимизированные модели",
"dialog.provider.opencode.tagline": "Надёжные оптимизированные модели",
"dialog.provider.opencodeGo.tagline": "Доступная подписка для всех",
"dialog.provider.anthropic.note": "Прямой доступ к моделям Claude, включая Pro и Max",
"dialog.provider.copilot.note": "ИИ-модели для помощи в кодировании через GitHub Copilot",
@@ -117,33 +118,34 @@ export const dict = {
"dialog.model.search.placeholder": "Поиск моделей",
"dialog.model.empty": "Модели не найдены",
"dialog.model.manage": "Управление моделями",
"dialog.model.manage.description": "Настройте какие модели появляются в выборе модели",
"dialog.model.manage.description": "Настройте, какие модели отображаются при выборе модели",
"dialog.model.manage.provider.toggle": "Переключить все модели {{provider}}",
"dialog.model.unpaid.freeModels.title": "Бесплатные модели от OpenCode",
"dialog.model.unpaid.addMore.title": "Добавьте больше моделей от популярных провайдеров",
"dialog.model.unpaid.viewMoreProviders": "Посмотреть ещё более 70 провайдеров",
"dialog.provider.viewAll": "Показать больше провайдеров",
"provider.connect.title": "Подключить {{provider}}",
"provider.connect.title.anthropicProMax": "Войти с помощью Claude Pro/Max",
"provider.connect.selectMethod": "Выберите способ входа для {{provider}}.",
"provider.connect.method.apiKey": "API ключ",
"provider.connect.method.apiKey": "Ключ API",
"provider.connect.status.inProgress": "Авторизация...",
"provider.connect.status.waiting": "Ожидание авторизации...",
"provider.connect.status.failed": "Ошибка авторизации: {{error}}",
"provider.connect.apiKey.description":
"Введите ваш API ключ {{provider}} для подключения аккаунта и использования моделей {{provider}} в OpenCode.",
"provider.connect.apiKey.label": "{{provider}} API ключ",
"provider.connect.apiKey.placeholder": "API ключ",
"provider.connect.apiKey.required": "API ключ обязателен",
"Введите ключ API {{provider}}, чтобы подключить аккаунт и использовать модели {{provider}} в OpenCode.",
"provider.connect.apiKey.label": "Ключ API {{provider}}",
"provider.connect.apiKey.placeholder": "Ключ API",
"provider.connect.apiKey.required": "Требуется ключ API",
"provider.connect.opencodeZen.line1":
"OpenCode Zen даёт вам доступ к отобранным надёжным оптимизированным моделям для агентов программирования.",
"provider.connect.opencodeZen.line2":
"С одним API ключом вы получите доступ к таким моделям как Claude, GPT, Gemini, GLM и другим.",
"С одним ключом API вы получите доступ к таким моделям, как Claude, GPT, Gemini, GLM и другие.",
"provider.connect.opencodeZen.visit.prefix": "Посетите ",
"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.link": "эту ссылку",
"provider.connect.oauth.code.visit.suffix":
@@ -161,18 +163,18 @@ export const dict = {
"provider.connect.toast.connected.description": "Модели {{provider}} теперь доступны.",
"provider.custom.title": "Пользовательский провайдер",
"provider.custom.description.prefix": "Настройте OpenAI-совместимого провайдера. См. ",
"provider.custom.description.prefix": "Настройте провайдера, совместимого с OpenAI. См. ",
"provider.custom.description.link": "документацию по настройке провайдера",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "ID провайдера",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "Строчные буквы, цифры, дефисы или подчёркивания",
"provider.custom.field.name.label": "Отображаемое имя",
"provider.custom.field.name.placeholder": "Мой AI провайдер",
"provider.custom.field.name.placeholder": "Мой ИИ-провайдер",
"provider.custom.field.baseURL.label": "Базовый URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API ключ",
"provider.custom.field.apiKey.placeholder": "API ключ",
"provider.custom.field.apiKey.label": "Ключ API",
"provider.custom.field.apiKey.placeholder": "Ключ API",
"provider.custom.field.apiKey.description":
"Необязательно. Оставьте пустым, если управляете авторизацией через заголовки.",
"provider.custom.models.label": "Модели",
@@ -211,15 +213,15 @@ export const dict = {
"model.input.image": "изображение",
"model.input.audio": "аудио",
"model.input.video": "видео",
"model.input.pdf": "pdf",
"model.tooltip.allows": "Разрешено: {{inputs}}",
"model.input.pdf": "PDF",
"model.tooltip.allows": "Поддерживает: {{inputs}}",
"model.tooltip.context.label": "Контекст",
"model.tooltip.inputs": "Входные данные",
"model.tooltip.model": "Модель",
"model.tooltip.provider": "Провайдер",
"model.tooltip.reasoning": "Рассуждение",
"model.tooltip.reasoning.allowed": "Разрешает рассуждение",
"model.tooltip.reasoning.none": "Без рассуждения",
"model.tooltip.reasoning.allowed": "Поддерживает рассуждения",
"model.tooltip.reasoning.none": "Без рассуждений",
"model.tooltip.context": "Лимит контекста {{limit}}",
"common.search.placeholder": "Поиск",
@@ -231,7 +233,7 @@ export const dict = {
"common.clear": "Очистить",
"common.connect": "Подключить",
"common.disconnect": "Отключить",
"common.continue": "Отправить",
"common.continue": "Продолжить",
"common.submit": "Отправить",
"common.save": "Сохранить",
"common.saving": "Сохранение...",
@@ -241,8 +243,8 @@ export const dict = {
"prompt.placeholder.shell": "Введите команду оболочки... {{example}}",
"prompt.placeholder.normal": 'Спросите что угодно... "{{example}}"',
"prompt.placeholder.simple": "Спросите что угодно...",
"prompt.placeholder.summarizeComments": "Суммировать комментарии…",
"prompt.placeholder.summarizeComment": "Суммировать комментарий…",
"prompt.placeholder.summarizeComments": "Обобщить комментарии…",
"prompt.placeholder.summarizeComment": "Обобщить комментарий…",
"prompt.mode.shell": "Оболочка",
"prompt.mode.normal": "Промпт",
"prompt.mode.shell.exit": "esc для выхода",
@@ -252,33 +254,33 @@ export const dict = {
"prompt.example.1": "Исправить TODO в коде",
"prompt.example.2": "Какой технологический стек этого проекта?",
"prompt.example.3": "Исправить сломанные тесты",
"prompt.example.4": "Объясни как работает аутентификация",
"prompt.example.4": "Объясни, как работает аутентификация",
"prompt.example.5": "Найти и исправить уязвимости безопасности",
"prompt.example.6": "Добавить юнит-тесты для сервиса пользователя",
"prompt.example.6": "Добавить модульные тесты для службы пользователей",
"prompt.example.7": "Рефакторить эту функцию для лучшей читаемости",
"prompt.example.8": "Что означает эта ошибка?",
"prompt.example.9": "Помоги мне отладить эту проблему",
"prompt.example.10": "Сгенерировать документацию API",
"prompt.example.11": "Оптимизировать запросы к базе данных",
"prompt.example.12": "Добавить валидацию ввода",
"prompt.example.12": "Добавить проверку входных данных",
"prompt.example.13": "Создать новый компонент для...",
"prompt.example.14": "Как развернуть этот проект?",
"prompt.example.15": "Проверь мой код на лучшие практики",
"prompt.example.15": "Проверь, соответствует ли мой код рекомендациям",
"prompt.example.16": "Добавить обработку ошибок в эту функцию",
"prompt.example.17": "Объясни этот паттерн regex",
"prompt.example.18": "Конвертировать это в TypeScript",
"prompt.example.17": "Объясни это регулярное выражение",
"prompt.example.18": "Преобразовать это в TypeScript",
"prompt.example.19": "Добавить логирование по всему проекту",
"prompt.example.20": "Какие зависимости устарели?",
"prompt.example.21": "Помоги написать скрипт миграции",
"prompt.example.22": "Реализовать кэширование для этой конечной точки",
"prompt.example.22": "Реализовать кеширование для этой конечной точки",
"prompt.example.23": "Добавить пагинацию в этот список",
"prompt.example.24": "Создать CLI команду для...",
"prompt.example.25": "Как работают переменные окружения здесь?",
"prompt.example.24": "Создать CLI-команду для...",
"prompt.example.25": "Как здесь работают переменные окружения?",
"prompt.popover.emptyResults": "Нет совпадений",
"prompt.popover.emptyCommands": "Нет совпадающих команд",
"prompt.dropzone.label": "Перетащите сюда изображения, PDF или текстовые файлы",
"prompt.dropzone.file.label": "Отпустите для @упоминания файла",
"prompt.dropzone.file.label": "Отпустите, чтобы упомянуть файл через @",
"prompt.slash.badge.custom": "своё",
"prompt.slash.badge.skill": "навык",
"prompt.slash.badge.mcp": "mcp",
@@ -332,7 +334,7 @@ export const dict = {
"dialog.directory.readError": "Не удалось прочитать эту папку",
"dialog.server.title": "Серверы",
"dialog.server.description": "Переключите сервер OpenCode к которому подключается приложение.",
"dialog.server.description": "Выберите сервер OpenCode, к которому подключается приложение.",
"dialog.server.search.placeholder": "Поиск серверов",
"dialog.server.empty": "Серверов пока нет",
"dialog.server.add.title": "Добавить сервер",
@@ -356,7 +358,7 @@ export const dict = {
"dialog.server.menu.edit": "Редактировать",
"dialog.server.menu.default": "Сделать по умолчанию",
"dialog.server.menu.defaultRemove": "Удалить по умолчанию",
"dialog.server.menu.defaultRemove": "Отменить выбор по умолчанию",
"dialog.server.menu.delete": "Удалить",
"dialog.server.current": "Текущий сервер",
"dialog.server.status.default": "По умолч.",
@@ -405,7 +407,7 @@ export const dict = {
"wsl.onboarding.needAnotherDistroHint": "Установите дистрибутив Linux из каталога WSL",
"wsl.onboarding.wslNotInstalled.title": "WSL не установлена",
"wsl.onboarding.wslNotInstalled.description":
"Для добавления сервера WSL в OpenCode требуется WSL (Windows Subsystem for Linux)",
"Для добавления сервера WSL в OpenCode требуется WSL (Подсистема Windows для Linux)",
"wsl.onboarding.wslUnavailable.title": "WSL недоступна",
"wsl.onboarding.wslUnavailable.description": "OpenCode не смог проверить WSL на этом компьютере.",
"wsl.onboarding.installWsl": "Установить WSL",
@@ -432,10 +434,10 @@ export const dict = {
"dialog.project.edit.title": "Редактировать проект",
"dialog.project.edit.name": "Название",
"dialog.project.edit.icon": "Иконка",
"dialog.project.edit.icon.alt": "Иконка проекта",
"dialog.project.edit.icon": "Значок",
"dialog.project.edit.icon.alt": "Значок проекта",
"dialog.project.edit.icon.hint": "Нажмите или перетащите изображение",
"dialog.project.edit.icon.recommended": "Рекомендуется: 128x128px",
"dialog.project.edit.icon.recommended": "Рекомендуется: 128 x 128 пикселей",
"dialog.project.edit.color": "Цвет",
"dialog.project.edit.color.select": "Выбрать цвет {{color}}",
@@ -465,7 +467,7 @@ export const dict = {
"context.stats.inputTokens": "Входные токены",
"context.stats.outputTokens": "Выходные токены",
"context.stats.reasoningTokens": "Токены рассуждения",
"context.stats.cacheTokens": "Токены кэша (чтение/запись)",
"context.stats.cacheTokens": "Токены кеша (чтение/запись)",
"context.stats.userMessages": "Сообщения пользователя",
"context.stats.assistantMessages": "Сообщения ассистента",
"context.stats.totalCost": "Общая стоимость",
@@ -564,27 +566,27 @@ export const dict = {
"error.chain.causedBy": "Причина:",
"error.chain.apiError": "Ошибка API",
"error.chain.status": "Статус: {{status}}",
"error.chain.retryable": "Повторная попытка: {{retryable}}",
"error.chain.retryable": "Можно повторить: {{retryable}}",
"error.chain.responseBody": "Тело ответа:\n{{body}}",
"error.chain.didYouMean": "Возможно, вы имели в виду: {{suggestions}}",
"error.chain.modelNotFound": "Модель не найдена: {{provider}}/{{model}}",
"error.chain.checkConfig": "Проверьте названия провайдера/модели в конфиге (opencode.json)",
"error.chain.checkConfig": "Проверьте названия провайдера и модели в конфигурации (opencode.json)",
"error.chain.mcpFailed":
'MCP сервер "{{name}}" завершился с ошибкой. Обратите внимание, что OpenCode пока не поддерживает MCP авторизацию.',
'MCP-сервер "{{name}}" завершился с ошибкой. Обратите внимание: OpenCode пока не поддерживает MCP-авторизацию.',
"error.chain.providerAuthFailed": "Ошибка аутентификации провайдера ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
'Не удалось инициализировать провайдера "{{provider}}". Проверьте учётные данные и конфигурацию.',
"error.chain.configJsonInvalid": "Конфигурационный файл по адресу {{path}} не является валидным JSON(C)",
"error.chain.configJsonInvalid": "Конфигурационный файл по адресу {{path}} содержит некорректный JSON(C)",
"error.chain.configJsonInvalidWithMessage":
"Конфигурационный файл по адресу {{path}} не является валидным JSON(C): {{message}}",
"Конфигурационный файл по адресу {{path}} содержит некорректный JSON(C): {{message}}",
"error.chain.configDirectoryTypo":
'Папка "{{dir}}" в {{path}} невалидна. Переименуйте папку в "{{suggestion}}" или удалите её. Это распространённая опечатка.',
'Папка "{{dir}}" в {{path}} недопустима. Переименуйте папку в "{{suggestion}}" или удалите её. Это распространённая опечатка.',
"error.chain.configFrontmatterError": "Не удалось разобрать frontmatter в {{path}}:\n{{message}}",
"error.chain.configInvalid": "Конфигурационный файл по адресу {{path}} невалиден",
"error.chain.configInvalidWithMessage": "Конфигурационный файл по адресу {{path}} невалиден: {{message}}",
"error.chain.configInvalid": "Недопустимый конфигурационный файл по адресу {{path}}",
"error.chain.configInvalidWithMessage": "Недопустимый конфигурационный файл по адресу {{path}}: {{message}}",
"notification.permission.title": "Требуется разрешение",
"notification.permission.description": "{{sessionTitle}} в {{projectName}} требуется разрешение",
"notification.permission.description": "Для {{sessionTitle}} в {{projectName}} требуется разрешение",
"notification.question.title": "Вопрос",
"notification.question.description": "У {{sessionTitle}} в {{projectName}} есть вопрос",
"notification.action.goToSession": "Перейти к сессии",
@@ -623,7 +625,7 @@ export const dict = {
"session.error.notFound.description": "Эта вкладка указывает на сессию, которой больше нет на этом сервере.",
"session.error.notFound.closeTab": "Закрыть вкладку",
"session.error.serverConnection": "Не удаётся подключиться к этому серверу",
"session.review.filesChanged": "{{count}} файлов изменено",
"session.review.filesChanged": "Изменено файлов: {{count}}",
"session.review.change.one": "Изменение",
"session.review.change.other": "Изменения",
"session.review.loadingChanges": "Загрузка изменений...",
@@ -652,13 +654,13 @@ export const dict = {
"session.question.pending.one": "{{count}} вопрос без ответа",
"session.question.pending.other": "Вопросы без ответа: {{count}}",
"session.followupDock.summary.one": "{{count}} сообщение в очереди",
"session.followupDock.summary.other": "{{count}} сообщений в очереди",
"session.followupDock.summary.other": "Сообщений в очереди: {{count}}",
"session.followupDock.sendNow": "Отправить сейчас",
"session.followupDock.edit": "Редактировать",
"session.followupDock.collapse": "Свернуть сообщения в очереди",
"session.followupDock.expand": "Развернуть сообщения в очереди",
"session.revertDock.summary.one": "{{count}} сообщение возвращено",
"session.revertDock.summary.other": "{{count}} сообщений возвращено",
"session.revertDock.summary.other": "Возвращено сообщений: {{count}}",
"session.revertDock.collapse": "Свернуть возвращённые сообщения",
"session.revertDock.expand": "Развернуть возвращённые сообщения",
"session.revertDock.restore": "Восстановить сообщение",
@@ -707,7 +709,7 @@ export const dict = {
"session.share.copy.copied": "Скопировано",
"session.share.copy.copyLink": "Копировать ссылку",
"lsp.tooltip.none": "Нет LSP серверов",
"lsp.tooltip.none": "Нет LSP-серверов",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Загрузка запроса...",
@@ -764,7 +766,7 @@ export const dict = {
"settings.general.section.updates": "Обновления",
"settings.general.section.sounds": "Звуковые эффекты",
"settings.general.section.feed": "Лента",
"settings.general.section.display": "Дисплей",
"settings.general.section.display": "Экран",
"settings.general.row.language.title": "Язык",
"settings.general.row.language.description": "Изменить язык отображения OpenCode",
@@ -774,7 +776,7 @@ export const dict = {
"settings.general.row.shell.autoDefault": "Авто (по умолчанию)",
"settings.general.row.shell.terminalOnly": "только терминал",
"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.description": "Выберите, следует ли OpenCode системной, светлой или тёмной теме",
"settings.general.row.theme.title": "Тема",
@@ -784,7 +786,7 @@ export const dict = {
"settings.general.row.terminalFont.title": "Шрифт терминала",
"settings.general.row.terminalFont.description": "Настройте шрифт, используемый в терминале",
"settings.general.row.uiFont.title": "Шрифт интерфейса",
"settings.general.row.uiFont.description": "Настройте шрифт, используемый во всем интерфейсе",
"settings.general.row.uiFont.description": "Настройте шрифт, используемый во всём интерфейсе",
"settings.general.row.followup.title": "Поведение уточняющих вопросов",
"settings.general.row.followup.description":
"Выберите, отправлять ли уточняющие вопросы сразу или помещать их в очередь",
@@ -804,8 +806,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Нижняя навигация",
"settings.general.row.mobileTitlebarBottom.description":
"На мобильных устройствах размещать строку заголовка и вкладки сессии внизу экрана",
"settings.general.row.showCustomAgents.title": "Пользовательские агенты",
"settings.general.row.showCustomAgents.description": "Показывать выбор агента в редакторе запросов",
"settings.general.row.showCustomAgents.title": "Выбор агента",
"settings.general.row.showCustomAgents.description":
"Показывать переключатель агентов в редакторе запросов. Если он скрыт, по умолчанию используется агент Build.",
"settings.general.row.reasoningSummaries.title": "Показывать сводки рассуждений",
"settings.general.row.reasoningSummaries.description": "Отображать сводки рассуждений модели в ленте",
@@ -822,11 +825,11 @@ export const dict = {
"settings.general.row.newInterfaceNotice.title": "Теперь вы используете новую компоновку",
"settings.general.row.newInterfaceNotice.description": "Прежняя компоновка больше недоступна",
"settings.general.row.newInterfaceNotice.dismiss": "Закрыть",
"settings.general.row.pinchZoom.title": "Масштабирование щипком",
"settings.general.row.pinchZoom.title": "Масштабирование сведением пальцев",
"settings.general.row.pinchZoom.description":
"Разрешить масштабирование жестом щипка на трекпаде и прокруткой с Ctrl",
"Разрешить масштабирование сведением пальцев на трекпаде и прокруткой с нажатой клавишей Ctrl",
"settings.general.row.wayland.title": "Использовать нативный Wayland",
"settings.general.row.wayland.description": "Отключить X11 fallback на Wayland. Требуется перезапуск.",
"settings.general.row.wayland.description": "Отключить резервный режим X11 в Wayland. Требуется перезапуск.",
"settings.general.row.wayland.tooltip":
"На Linux с мониторами разной частоты обновления нативный Wayland может быть стабильнее.",
@@ -892,22 +895,22 @@ export const dict = {
"settings.general.notifications.agent.title": "Агент",
"settings.general.notifications.agent.description":
"Показывать системное уведомление когда агент завершён или требует внимания",
"Показывать системное уведомление, когда агент завершил работу или требует внимания",
"settings.general.notifications.permissions.title": "Разрешения",
"settings.general.notifications.permissions.description":
"Показывать системное уведомление когда требуется разрешение",
"Показывать системное уведомление, когда требуется разрешение",
"settings.general.notifications.errors.title": "Ошибки",
"settings.general.notifications.errors.description": "Показывать системное уведомление когда происходит ошибка",
"settings.general.notifications.errors.description": "Показывать системное уведомление, когда происходит ошибка",
"settings.general.sounds.agent.title": "Агент",
"settings.general.sounds.agent.description": "Воспроизводить звук когда агент завершён или требует внимания",
"settings.general.sounds.agent.description": "Воспроизводить звук, когда агент завершил работу или требует внимания",
"settings.general.sounds.permissions.title": "Разрешения",
"settings.general.sounds.permissions.description": "Воспроизводить звук когда требуется разрешение",
"settings.general.sounds.permissions.description": "Воспроизводить звук, когда требуется разрешение",
"settings.general.sounds.errors.title": "Ошибки",
"settings.general.sounds.errors.description": "Воспроизводить звук когда происходит ошибка",
"settings.general.sounds.errors.description": "Воспроизводить звук, когда происходит ошибка",
"settings.shortcuts.title": "Горячие клавиши",
"settings.shortcuts.reset.button": "Сбросить к умолчаниям",
"settings.shortcuts.reset.button": "Восстановить настройки по умолчанию",
"settings.shortcuts.reset.toast.title": "Горячие клавиши сброшены",
"settings.shortcuts.reset.toast.description": "Горячие клавиши были сброшены к значениям по умолчанию.",
"settings.shortcuts.conflict.title": "Сочетание уже используется",
@@ -943,7 +946,7 @@ export const dict = {
"settings.mcp.description": "Настройки MCP будут доступны здесь.",
"settings.permissions.title": "Разрешения",
"settings.permissions.description": "Контролируйте какие инструменты сервер может использовать по умолчанию.",
"settings.permissions.description": "Укажите, какие инструменты сервер может использовать по умолчанию.",
"settings.permissions.section.tools": "Инструменты",
"settings.permissions.toast.updateFailed.title": "Не удалось обновить разрешения",
@@ -955,7 +958,7 @@ export const dict = {
"settings.permissions.tool.read.description": "Чтение файла (по совпадению пути)",
"settings.permissions.tool.edit.title": "Редактирование",
"settings.permissions.tool.edit.description":
"Изменение файлов, включая редактирование, запись, патчи и мульти-редактирование",
"Изменение файлов, включая редактирование, запись, патчи и множественное редактирование",
"settings.permissions.tool.glob.title": "Glob",
"settings.permissions.tool.glob.description": "Сопоставление файлов по паттернам glob",
"settings.permissions.tool.grep.title": "Grep",
@@ -965,7 +968,7 @@ export const dict = {
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "Запуск команд оболочки",
"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.description": "Загрузка навыка по имени",
"settings.permissions.tool.lsp.title": "LSP",
@@ -999,7 +1002,7 @@ export const dict = {
"workspace.reset.success.description": "Рабочее пространство теперь соответствует ветке по умолчанию.",
"workspace.error.stillPreparing": "Рабочее пространство всё ещё подготавливается",
"workspace.status.checking": "Проверка незафиксированных изменений...",
"workspace.status.error": "Не удалось проверить статус git.",
"workspace.status.error": "Не удалось проверить состояние Git.",
"workspace.status.clean": "Незафиксированных изменений не обнаружено.",
"workspace.status.dirty": "В этом рабочем пространстве обнаружены незафиксированные изменения.",
"workspace.delete.title": "Удалить рабочее пространство",
@@ -1010,13 +1013,13 @@ export const dict = {
"workspace.reset.button": "Сбросить рабочее пространство",
"workspace.reset.archived.none": "Активные сессии не будут архивированы.",
"workspace.reset.archived.one": "1 сессия будет архивирована.",
"workspace.reset.archived.many": "{{count}} сессий будет архивировано.",
"workspace.reset.archived.many": "Будут архивированы сессии: {{count}}.",
"workspace.reset.note": "Это сбросит рабочее пространство до соответствия ветке по умолчанию.",
"common.open": "Открыть",
"dialog.releaseNotes.action.getStarted": "Начать",
"dialog.releaseNotes.action.next": "Далее",
"dialog.releaseNotes.action.hideFuture": "Больше не показывать",
"dialog.releaseNotes.media.alt": "Превью релиза",
"dialog.releaseNotes.media.alt": "Предварительный просмотр выпуска",
"toast.project.reloadFailed.title": "Не удалось перезагрузить {{project}}",
"error.server.invalidConfiguration": "Недопустимая конфигурация",
"common.moreCountSuffix": " (ещё {{count}})",
@@ -1041,6 +1044,9 @@ export const dict = {
"session.question.progress": "{{current}} из {{total}} вопросов",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "Проводник",
"session.header.reveal.finder": "Показать в Finder",
"session.header.reveal.fileExplorer": "Показать в Проводнике",
"session.header.reveal.containingFolder": "Открыть папку расположения",
"session.header.open.fileManager": "Файловый менеджер",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -1059,7 +1065,7 @@ export const dict = {
"debugBar.na": "н/д",
"debugBar.nav.label": "NAV",
"debugBar.nav.tip":
"Последний завершенный переход маршрута, затрагивающий страницу сеанса, измеренный от запуска маршрутизатора до первой отрисовки после стабилизации.",
"Последний завершённый переход по маршруту, затрагивающий страницу сессии: от запуска маршрутизатора до первой отрисовки после стабилизации.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Скользящая частота кадров в секунду за последние 5 секунд.",
"debugBar.frame.label": "FRAME",
@@ -1074,7 +1080,7 @@ export const dict = {
"debugBar.inp.tip":
"Приблизительная продолжительность взаимодействия за последние 5 секунд. Это похоже на INP, а не официальный Web Vitals INP.",
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Кумулятивный сдвиг макета за текущее время жизни приложения.",
"debugBar.cls.tip": "Совокупное смещение макета за время работы приложения.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Используемая куча JS по сравнению с лимитом кучи. Только Chromium.",
"debugBar.mem.tip": "Используемая куча JS по сравнению с лимитом кучи. {{used}} из {{limit}}.",
@@ -1096,7 +1102,7 @@ export const dict = {
"error.page.circular": "[Циклично]",
"error.serverSDK.noServerAvailable": "Нет доступного сервера",
"error.serverSDK.serverNotAvailable": "Сервер недоступен",
"error.childStore.persistedCacheCreateFailed": "Не удалось создать постоянный кэш",
"error.childStore.persistedCacheCreateFailed": "Не удалось создать постоянный кеш",
"error.childStore.persistedProjectMetadataCreateFailed": "Не удалось создать постоянные метаданные проекта",
"error.childStore.persistedProjectIconCreateFailed": "Не удалось создать постоянный значок проекта",
"error.childStore.storeCreateFailed": "Не удалось создать хранилище",
File diff suppressed because it is too large Load Diff
+71 -65
View File
@@ -53,7 +53,7 @@ export const dict = {
"command.context.addSelection.description": "เพิ่มบรรทัดที่เลือกจากไฟล์ปัจจุบัน",
"command.input.focus": "โฟกัสช่องป้อนข้อมูล",
"command.terminal.toggle": "สลับเทอร์มินัล",
"command.fileTree.toggle": "สลับต้นไม้ไฟล์",
"command.fileTree.toggle": "สลับแผนผังไฟล์",
"command.review.toggle": "สลับการตรวจสอบ",
"command.terminal.new": "เทอร์มินัลใหม่",
"command.terminal.new.description": "สร้างแท็บเทอร์มินัลใหม่",
@@ -79,8 +79,8 @@ export const dict = {
"command.permissions.autoaccept.disable": "หยุดยอมรับสิทธิ์โดยอัตโนมัติ",
"command.workspace.toggle": "สลับพื้นที่ทำงาน",
"command.workspace.toggle.description": "เปิดหรือปิดใช้งานพื้นที่ทำงานหลายรายการในแถบด้านข้าง",
"command.session.undo": "ยกเลิก",
"command.session.undo.description": "ยกเลิกข้อความล่าสุด",
"command.session.undo": "เลิกทำ",
"command.session.undo.description": "เลิกทำข้อความล่าสุด",
"command.session.redo": "ทำซ้ำ",
"command.session.redo.description": "ทำซ้ำข้อความที่ถูกยกเลิกล่าสุด",
"command.session.compact": "บีบอัดเซสชัน",
@@ -102,6 +102,7 @@ export const dict = {
"dialog.provider.empty": "ไม่พบผู้ให้บริการ",
"dialog.provider.group.popular": "ยอดนิยม",
"dialog.provider.group.other": "อื่น ๆ",
"dialog.provider.custom.label": "ผู้ให้บริการแบบกำหนดเองที่เข้ากันได้กับ OpenAI",
"dialog.provider.tag.recommended": "แนะนำ",
"dialog.provider.opencode.note": "โมเดลที่คัดสรร รวมถึง Claude, GPT, Gemini และอื่น ๆ",
"dialog.provider.opencode.tagline": "โมเดลที่เชื่อถือได้และปรับให้เหมาะสม",
@@ -122,6 +123,7 @@ export const dict = {
"dialog.model.unpaid.freeModels.title": "โมเดลฟรีที่จัดหาให้โดย OpenCode",
"dialog.model.unpaid.addMore.title": "เพิ่มโมเดลเพิ่มเติมจากผู้ให้บริการยอดนิยม",
"dialog.model.unpaid.viewMoreProviders": "ดูผู้ให้บริการเพิ่มเติมกว่า 70 ราย",
"dialog.provider.viewAll": "แสดงผู้ให้บริการเพิ่มเติม",
@@ -143,11 +145,11 @@ export const dict = {
"ด้วยคีย์ API เดียวคุณจะได้รับการเข้าถึงโมเดล เช่น Claude, GPT, Gemini, GLM และอื่น ๆ",
"provider.connect.opencodeZen.visit.prefix": "เยี่ยมชม ",
"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.link": "ลิงก์นี้",
"provider.connect.oauth.code.visit.suffix":
" เพื่อรวบรวมรหัสการอนุญาตของคุณเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode",
" เพื่อรับรหัสการอนุญาตสำหรับเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode",
"provider.connect.oauth.code.label": "รหัสการอนุญาต {{method}}",
"provider.connect.oauth.code.placeholder": "รหัสการอนุญาต",
"provider.connect.oauth.code.required": "ต้องใช้รหัสการอนุญาต",
@@ -157,13 +159,13 @@ export const dict = {
"provider.connect.oauth.auto.visit.suffix":
" และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode",
"provider.connect.oauth.auto.confirmationCode": "รหัสยืนยัน",
"provider.connect.toast.connected.title": "{{provider}} ที่เชื่อมต่อแล้ว",
"provider.connect.toast.connected.title": "เชื่อมต่อ {{provider}} แล้ว",
"provider.connect.toast.connected.description": "โมเดล {{provider}} พร้อมใช้งานแล้ว",
"provider.custom.title": "ผู้ให้บริการที่กำหนดเอง",
"provider.custom.description.prefix": "กำหนดค่าผู้ให้บริการที่เข้ากันได้กับ OpenAI ดู ",
"provider.custom.description.link": "เอกสารการกำหนดค่าผู้ให้บริการ",
"provider.custom.description.suffix": ".",
"provider.custom.description.suffix": "",
"provider.custom.field.providerID.label": "รหัสผู้ให้บริการ",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "ตัวอักษรพิมพ์เล็ก ตัวเลข ยัติภังค์ หรือขีดล่าง",
@@ -197,7 +199,7 @@ export const dict = {
"provider.custom.error.required": "จำเป็น",
"provider.custom.error.duplicate": "ซ้ำ",
"provider.disconnect.toast.disconnected.title": "{{provider}} ที่ยกเลิกการเชื่อมต่อแล้ว",
"provider.disconnect.toast.disconnected.title": "ยกเลิกการเชื่อมต่อ {{provider}} แล้ว",
"provider.disconnect.toast.disconnected.description": "โมเดล {{provider}} ไม่พร้อมใช้งานอีกต่อไป",
"model.tag.free": "ฟรี",
@@ -212,7 +214,7 @@ export const dict = {
"model.input.audio": "เสียง",
"model.input.video": "วิดีโอ",
"model.input.pdf": "PDF",
"model.tooltip.allows": "อนุญาต: {{inputs}}",
"model.tooltip.allows": "รองรับ: {{inputs}}",
"model.tooltip.context.label": "บริบท",
"model.tooltip.inputs": "ข้อมูลนำเข้า",
"model.tooltip.model": "โมเดล",
@@ -224,14 +226,14 @@ export const dict = {
"common.search.placeholder": "ค้นหา",
"common.goBack": "ย้อนกลับ",
"common.goForward": "นำทางไปข้างหน้า",
"common.goForward": "ไปข้างหน้า",
"common.loading": "กำลังโหลด",
"common.loading.ellipsis": "...",
"common.cancel": "ยกเลิก",
"common.clear": "ล้าง",
"common.connect": "เชื่อมต่อ",
"common.disconnect": "ยกเลิกการเชื่อมต่อ",
"common.continue": "ส่ง",
"common.continue": "ดำเนินการต่อ",
"common.submit": "ส่ง",
"common.save": "บันทึก",
"common.saving": "กำลังบันทึก...",
@@ -246,8 +248,8 @@ export const dict = {
"prompt.mode.shell": "เชลล์",
"prompt.mode.normal": "พรอมต์",
"prompt.mode.shell.exit": "กด esc เพื่อออก",
"session.child.promptDisabled": "ไม่สามารถส่งพรอมต์ในเซสชันเอเจนต์ย่อยได้.",
"session.child.backToParent": "กลับไปยังเซสชันหลัก.",
"session.child.promptDisabled": "ไม่สามารถส่งพรอมต์ในเซสชันเอเจนต์ย่อยได้",
"session.child.backToParent": "กลับไปยังเซสชันหลัก",
"prompt.example.1": "แก้ไข TODO ในโค้ดเบส",
"prompt.example.2": "เทคโนโลยีของโปรเจกต์นี้คืออะไร?",
@@ -262,7 +264,7 @@ export const dict = {
"prompt.example.11": "ปรับปรุงการสืบค้นฐานข้อมูล",
"prompt.example.12": "เพิ่มการตรวจสอบข้อมูลนำเข้า",
"prompt.example.13": "สร้างคอมโพเนนต์ใหม่สำหรับ...",
"prompt.example.14": "ฉันจะทำให้โปรเจกต์นี้ทำงานได้อย่างไร?",
"prompt.example.14": "ฉันจะนำโปรเจกต์นี้ไปใช้งานได้อย่างไร?",
"prompt.example.15": "ตรวจสอบโค้ดของฉันเพื่อแนวทางปฏิบัติที่ดีที่สุด",
"prompt.example.16": "เพิ่มการจัดการข้อผิดพลาดในฟังก์ชันนี้",
"prompt.example.17": "อธิบายรูปแบบ regex นี้",
@@ -270,15 +272,15 @@ export const dict = {
"prompt.example.19": "เพิ่มการบันทึกทั่วทั้งโค้ดเบส",
"prompt.example.20": "มีการพึ่งพาอะไรที่ล้าสมัยอยู่?",
"prompt.example.21": "ช่วยฉันเขียนสคริปต์การย้ายข้อมูล",
"prompt.example.22": "ใช้งานแคชสำหรับจุดสิ้นสุดนี้",
"prompt.example.22": "ใช้แคชสำหรับเอนด์พอยต์นี้",
"prompt.example.23": "เพิ่มการแบ่งหน้าในรายการนี้",
"prompt.example.24": "สร้างคำสั่ง CLI สำหรับ...",
"prompt.example.25": "ตัวแปรสภาพแวดล้อมทำงานอย่างไรที่นี่?",
"prompt.popover.emptyResults": "ไม่พบผลลัพธ์ที่ตรงกัน",
"prompt.popover.emptyCommands": "ไม่พบคำสั่งที่ตรงกัน",
"prompt.dropzone.label": "ลากรูปภาพ, PDF หรือไฟล์ข้อความมาวางที่นี่",
"prompt.dropzone.file.label": "วางเพื่อ @กล่าวถึงไฟล์",
"prompt.dropzone.label": "ลากรูปภาพ PDF หรือไฟล์ข้อความมาวางที่นี่",
"prompt.dropzone.file.label": "วางเพื่ออ้างถึงไฟล์ด้วย @",
"prompt.slash.badge.custom": "กำหนดเอง",
"prompt.slash.badge.skill": "ทักษะ",
"prompt.slash.badge.mcp": "MCP",
@@ -298,14 +300,14 @@ export const dict = {
"prompt.toast.pasteUnsupported.title": "ไฟล์แนบที่ไม่รองรับ",
"prompt.toast.attachmentDuplicate.title": "ไฟล์นี้ถูกอัปโหลดแล้ว",
"prompt.toast.pasteUnsupported.description": "แนบได้เฉพาะรูปภาพ, PDF หรือไฟล์ข้อความเท่านั้น",
"prompt.toast.pasteUnsupported.description": "แนบได้เฉพาะรูปภาพ PDF หรือไฟล์ข้อความเท่านั้น",
"prompt.toast.modelAgentRequired.title": "เลือกเอเจนต์และโมเดล",
"prompt.toast.modelAgentRequired.description": "เลือกเอเจนต์และโมเดลก่อนส่งพรอม์",
"prompt.toast.modelAgentRequired.description": "เลือกเอเจนต์และโมเดลก่อนส่งพรอม์",
"prompt.toast.worktreeCreateFailed.title": "ไม่สามารถสร้าง worktree",
"prompt.toast.sessionCreateFailed.title": "ไม่สามารถสร้างเซสชัน",
"prompt.toast.shellSendFailed.title": "ไม่สามารถส่งคำสั่งเชลล์",
"prompt.toast.commandSendFailed.title": "ไม่สามารถส่งคำสั่ง",
"prompt.toast.promptSendFailed.title": "ไม่สามารถส่งพรอม์",
"prompt.toast.promptSendFailed.title": "ไม่สามารถส่งพรอม์",
"prompt.toast.promptSendFailed.description": "ไม่สามารถดึงเซสชันได้",
"dialog.mcp.title": "MCPs",
@@ -317,7 +319,7 @@ export const dict = {
"mcp.status.connected": "เชื่อมต่อแล้ว",
"mcp.status.failed": "ล้มเหลว",
"mcp.status.needs_auth": "ต้องการการตรวจสอบสิทธิ์",
"mcp.status.needs_auth": "ต้องยืนยันตัวตน",
"mcp.auth.clickToAuthenticate": "คลิกเพื่อยืนยันตัวตน",
"mcp.status.disabled": "ปิดใช้งาน",
@@ -327,7 +329,7 @@ export const dict = {
"dialog.directory.empty": "ไม่พบโฟลเดอร์",
"dialog.directory.action.selectFile": "เลือกไฟล์",
"dialog.directory.action.selectFolder": "เลือกโฟลเดอร์",
"dialog.directory.root": "ราก",
"dialog.directory.root": "โฟลเดอร์ราก",
"dialog.directory.parent": "โฟลเดอร์หลัก",
"dialog.directory.readError": "ไม่สามารถอ่านโฟลเดอร์นี้ได้",
@@ -369,30 +371,30 @@ export const dict = {
"wsl.onboarding.step.distro": "เลือกดิสโทร",
"wsl.onboarding.step.opencode": "OpenCode",
"wsl.onboarding.checkingRuntime": "กำลังตรวจสอบ WSL...",
"wsl.onboarding.restartRequired": "ต้องรีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์.",
"wsl.onboarding.ready": "WSL พร้อมใช้งานแล้ว.",
"wsl.onboarding.required": "ต้องมี WSL เพื่อดำเนินการต่อ.",
"wsl.onboarding.restartRequired": "ต้องรีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์",
"wsl.onboarding.ready": "WSL พร้อมใช้งานแล้ว",
"wsl.onboarding.required": "ต้องมี WSL เพื่อดำเนินการต่อ",
"wsl.onboarding.checkingDistros": "กำลังตรวจสอบดิสโทร...",
"wsl.onboarding.installingDistro": "กำลังติดตั้ง {{distro}}...",
"wsl.onboarding.checkingDistro": "กำลังตรวจสอบ {{distro}}...",
"wsl.onboarding.listingDistros": "กำลังแสดงรายการดิสโทร...",
"wsl.onboarding.distroReady": "{{distro}} พร้อมใช้งานแล้ว.",
"wsl.onboarding.distroNotInstalled": "ยังไม่ได้ติดตั้ง {{distro}}.",
"wsl.onboarding.openDistroOnce": "เปิด {{distro}} หนึ่งครั้งเพื่อให้การตั้งค่าเสร็จสมบูรณ์.",
"wsl.onboarding.finishingDistro": "กำลังตั้งค่า {{distro}} ให้เสร็จสมบูรณ์.",
"wsl.onboarding.pickDistro": "เลือกดิสโทรหรือติดตั้งจากรายการด้านล่าง.",
"wsl.onboarding.distroReady": "{{distro}} พร้อมใช้งานแล้ว",
"wsl.onboarding.distroNotInstalled": "ยังไม่ได้ติดตั้ง {{distro}}",
"wsl.onboarding.openDistroOnce": "เปิด {{distro}} หนึ่งครั้งเพื่อให้การตั้งค่าเสร็จสมบูรณ์",
"wsl.onboarding.finishingDistro": "กำลังตั้งค่า {{distro}} ให้เสร็จสมบูรณ์",
"wsl.onboarding.pickDistro": "เลือกดิสโทรหรือติดตั้งจากรายการด้านล่าง",
"wsl.onboarding.checkingOpencode": "กำลังตรวจสอบ OpenCode...",
"wsl.onboarding.checkingOpencodeIn": "กำลังตรวจสอบ OpenCode ใน {{distro}}...",
"wsl.onboarding.updatingOpencode": "กำลังอัปเดต OpenCode...",
"wsl.onboarding.updatingOpencodeIn": "กำลังอัปเดต OpenCode ใน {{distro}}...",
"wsl.onboarding.updateOpencodeIn": "อัปเดต OpenCode ใน {{distro}}.",
"wsl.onboarding.updateOpencodeIn": "อัปเดต OpenCode ใน {{distro}}",
"wsl.onboarding.updateOpencode": "อัปเดต OpenCode",
"wsl.onboarding.opencodeReadyIn": "OpenCode พร้อมใช้งานใน {{distro}} แล้ว.",
"wsl.onboarding.opencodeReady": "OpenCode พร้อมใช้งานแล้ว.",
"wsl.onboarding.installOpencodeIn": "ติดตั้ง OpenCode ใน {{distro}}.",
"wsl.onboarding.opencodeReadyIn": "OpenCode พร้อมใช้งานใน {{distro}} แล้ว",
"wsl.onboarding.opencodeReady": "OpenCode พร้อมใช้งานแล้ว",
"wsl.onboarding.installOpencodeIn": "ติดตั้ง OpenCode ใน {{distro}}",
"wsl.onboarding.installOpencode": "ติดตั้ง OpenCode",
"wsl.onboarding.chooseDistroFirst": "เลือกดิสโทรก่อน.",
"wsl.onboarding.loadFailed": "ไม่สามารถโหลดสถานะ WSL ได้.",
"wsl.onboarding.chooseDistroFirst": "เลือกดิสโทรก่อน",
"wsl.onboarding.loadFailed": "ไม่สามารถโหลดสถานะ WSL ได้",
"wsl.onboarding.loading": "กำลังโหลด...",
"wsl.onboarding.installedDistros": "ดิสโทรที่ติดตั้งแล้ว",
"wsl.onboarding.checkAgain": "ตรวจสอบอีกครั้ง",
@@ -407,27 +409,27 @@ export const dict = {
"wsl.onboarding.wslNotInstalled.description":
"ต้องมี WSL (Windows Subsystem for Linux) ก่อนที่ OpenCode จะเพิ่มเซิร์ฟเวอร์ WSL ได้",
"wsl.onboarding.wslUnavailable.title": "WSL ไม่พร้อมใช้งาน",
"wsl.onboarding.wslUnavailable.description": "OpenCode ไม่สามารถตรวจสอบ WSL บนเครื่องนี้ได้.",
"wsl.onboarding.wslUnavailable.description": "OpenCode ไม่สามารถตรวจสอบ WSL บนเครื่องนี้ได้",
"wsl.onboarding.installWsl": "ติดตั้ง WSL",
"wsl.onboarding.windowsRestartRequired":
"รีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์ แล้วเปิด OpenCode อีกครั้ง.",
"รีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์ แล้วเปิด OpenCode อีกครั้ง",
"wsl.onboarding.next": "ถัดไป",
"wsl.onboarding.refresh": "รีเฟรช",
"wsl.onboarding.allDistrosAdded": "เพิ่มดิสโทรที่ติดตั้งไว้ทั้งหมดแล้ว.",
"wsl.onboarding.noDistros": "ยังไม่พบดิสโทร.",
"wsl.onboarding.allDistrosAdded": "เพิ่มดิสโทรที่ติดตั้งไว้ทั้งหมดแล้ว",
"wsl.onboarding.noDistros": "ยังไม่พบดิสโทร",
"wsl.onboarding.install": "ติดตั้ง",
"wsl.onboarding.installing": "กำลังติดตั้ง...",
"wsl.onboarding.installDistro": "ติดตั้งดิสโทร",
"wsl.onboarding.searchDistros": "ค้นหาดิสโทร",
"wsl.onboarding.wsl2Required": "ต้องใช้ WSL 2.",
"wsl.onboarding.toolsRequired": "ดิสโทรนี้ต้องมี bash และ curl.",
"wsl.onboarding.wsl2Required": "ต้องใช้ WSL 2",
"wsl.onboarding.toolsRequired": "ดิสโทรนี้ต้องมี bash และ curl",
"wsl.onboarding.openTerminal": "เปิดเทอร์มินัล",
"wsl.onboarding.path": "เส้นทาง: {{path}}",
"wsl.onboarding.notFound": "ไม่พบ",
"wsl.onboarding.version": "เวอร์ชัน: {{version}}",
"wsl.onboarding.unknown": "ไม่ทราบ",
"wsl.onboarding.desktopVersion": "เดสก์ท็อป {{version}}",
"wsl.onboarding.versionMismatch": "เวอร์ชันที่ติดตั้งไม่ตรงกับเวอร์ชันของแอปเดสก์ท็อป.",
"wsl.onboarding.versionMismatch": "เวอร์ชันที่ติดตั้งไม่ตรงกับเวอร์ชันของแอปเดสก์ท็อป",
"wsl.onboarding.adding": "กำลังเพิ่ม...",
"dialog.project.edit.title": "แก้ไขโปรเจกต์",
@@ -450,7 +452,7 @@ export const dict = {
"context.breakdown.tool": "การเรียกเครื่องมือ",
"context.breakdown.other": "อื่น ๆ",
"context.systemPrompt.title": "พรอม์ระบบ",
"context.systemPrompt.title": "พรอม์ระบบ",
"context.rawMessages.title": "ข้อความดิบ",
"context.stats.session": "เซสชัน",
@@ -540,7 +542,7 @@ export const dict = {
"error.page.title": "เกิดข้อผิดพลาด",
"error.page.description": "เกิดข้อผิดพลาดระหว่างการโหลดแอปพลิเคชัน",
"error.page.description.localServerStartup": "เกิดข้อผิดพลาดขณะเริ่มเซิร์ฟเวอร์ในเครื่อง.",
"error.page.description.localServerStartup": "เกิดข้อผิดพลาดขณะเริ่มเซิร์ฟเวอร์ในเครื่อง",
"error.page.details.label": "รายละเอียดข้อผิดพลาด",
"error.page.action.restart": "รีสตาร์ท",
"error.page.action.report": "รายงานข้อผิดพลาด",
@@ -584,7 +586,7 @@ export const dict = {
"notification.question.description": "{{sessionTitle}} ใน {{projectName}} มีคำถาม",
"notification.action.goToSession": "ไปที่เซสชัน",
"notification.session.responseReady.title": "การตอบสนองพร้อม",
"notification.session.responseReady.title": "คำตอบพร้อมแล้ว",
"notification.session.error.title": "ข้อผิดพลาดเซสชัน",
"notification.session.error.fallbackDescription": "เกิดข้อผิดพลาด",
@@ -606,7 +608,7 @@ export const dict = {
"home.sessions.group.today": "วันนี้",
"home.sessions.group.yesterday": "เมื่อวาน",
"home.sessions.group.older": "ก่อนหน้านี้",
"home.providerTip": "เชื่อมต่อกับผู้ให้บริการกว่า 75 รายเพื่อใช้โมเดลอื่นๆ รวมถึง Claude, GPT, Gemini และอีกมากมาย",
"home.providerTip": "เชื่อมต่อกับผู้ให้บริการกว่า 75 รายเพื่อใช้โมเดลอื่น ๆ รวมถึง Claude, GPT, Gemini และอีกมากมาย",
"session.tab.session": "เซสชัน",
"session.tab.review": "ตรวจสอบ",
@@ -614,7 +616,7 @@ export const dict = {
"session.tab.unknown": "เซสชันที่ไม่รู้จัก",
"session.panel.reviewAndFiles": "ตรวจสอบและไฟล์",
"session.error.notFound": "ไม่พบเซสชันนี้",
"session.error.notFound.description": "แท็บนี้อ้างถึงเซสชันที่ไม่มีอยู่บนเซิร์ฟเวอร์นี้แล้ว.",
"session.error.notFound.description": "แท็บนี้อ้างถึงเซสชันที่ไม่มีอยู่บนเซิร์ฟเวอร์นี้แล้ว",
"session.error.notFound.closeTab": "ปิดแท็บ",
"session.error.serverConnection": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์นี้",
"session.review.filesChanged": "{{count}} ไฟล์ที่เปลี่ยนแปลง",
@@ -704,7 +706,7 @@ export const dict = {
"lsp.tooltip.none": "ไม่มีเซิร์ฟเวอร์ LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "กำลังโหลดพรอม์...",
"prompt.loading": "กำลังโหลดพรอม์...",
"terminal.loading": "กำลังโหลดเทอร์มินัล...",
"terminal.title": "เทอร์มินัล",
"terminal.title.numbered": "เทอร์มินัล {{number}}",
@@ -767,23 +769,23 @@ export const dict = {
"settings.general.row.shell.autoDefault": "อัตโนมัติ (ค่าเริ่มต้น)",
"settings.general.row.shell.terminalOnly": "เทอร์มินัลเท่านั้น",
"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.description": "เลือกว่าจะให้ OpenCode ใช้ธีมตามระบบ สว่าง หรือมืด",
"settings.general.row.theme.title": "ธีม",
"settings.general.row.theme.description": "ปรับแต่งวิธีการที่ OpenCode มีธีม",
"settings.general.row.font.title": "ฟอนต์โค้ด",
"settings.general.row.font.description": "ปรับแต่งฟอนต์ที่ใช้ในบล็อกโค้ด",
"settings.general.row.terminalFont.title": "ฟอนต์เทอร์มินัล",
"settings.general.row.terminalFont.description": "ปรับแต่งฟอนต์ที่ใช้ในเทอร์มินัล",
"settings.general.row.uiFont.title": "ฟอนต์ UI",
"settings.general.row.uiFont.description": "ปรับแต่งฟอนต์ที่ใช้ทั่วทั้งอินเทอร์เฟซ",
"settings.general.row.theme.description": "ปรับแต่งธีมของ OpenCode",
"settings.general.row.font.title": "แบบอักษรโค้ด",
"settings.general.row.font.description": "ปรับแต่งแบบอักษรที่ใช้ในบล็อกโค้ด",
"settings.general.row.terminalFont.title": "แบบอักษรเทอร์มินัล",
"settings.general.row.terminalFont.description": "ปรับแต่งแบบอักษรที่ใช้ในเทอร์มินัล",
"settings.general.row.uiFont.title": "แบบอักษร UI",
"settings.general.row.uiFont.description": "ปรับแต่งแบบอักษรที่ใช้ทั่วทั้งอินเทอร์เฟซ",
"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.steer": "นำทาง",
"settings.general.row.showFileTree.title": "ต้นไม้ไฟล์",
"settings.general.row.showFileTree.description": "แสดงแผงต้นไม้ไฟล์ในเซสชัน",
"settings.general.row.showFileTree.title": "แผนผังไฟล์",
"settings.general.row.showFileTree.description": "แสดงแผงแผนผังไฟล์ในเซสชัน",
"settings.general.row.showNavigation.title": "ตัวควบคุมการนำทาง",
"settings.general.row.showNavigation.description": "แสดงปุ่มย้อนกลับและไปข้างหน้าในแถบชื่อเรื่องเดสก์ท็อป",
"settings.general.row.showSearch.title": "ชุดคำสั่ง",
@@ -795,8 +797,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "การนำทางด้านล่าง",
"settings.general.row.mobileTitlebarBottom.description":
"วางแถบชื่อเรื่องและแท็บเซสชันไว้ด้านล่างของหน้าจอบนอุปกรณ์เคลื่อนที่",
"settings.general.row.showCustomAgents.title": "เอเจนต์ที่กำหนดเอง",
"settings.general.row.showCustomAgents.description": "แสดงตัวเลือกเอเจนต์ในช่องเขียนข้อความ",
"settings.general.row.showCustomAgents.title": "แสดงเอเจนต์",
"settings.general.row.showCustomAgents.description":
"สลับระหว่างเอเจนต์ในช่องเขียนข้อความ เมื่อซ่อน ระบบจะใช้เอเจนต์ Build เป็นค่าเริ่มต้น",
"settings.general.row.reasoningSummaries.title": "แสดงสรุปการใช้เหตุผล",
"settings.general.row.reasoningSummaries.description": "แสดงสรุปการใช้เหตุผลของโมเดลในไทม์ไลน์",
"settings.general.row.shellToolPartsExpanded.title": "ขยายส่วนเครื่องมือ shell",
@@ -908,7 +911,7 @@ export const dict = {
"settings.shortcuts.group.navigation": "การนำทาง",
"settings.shortcuts.group.modelAndAgent": "โมเดลและเอเจนต์",
"settings.shortcuts.group.terminal": "เทอร์มินัล",
"settings.shortcuts.group.prompt": "พรอม์",
"settings.shortcuts.group.prompt": "พรอม์",
"settings.providers.title": "ผู้ให้บริการ",
"settings.providers.description": "การตั้งค่าผู้ให้บริการจะสามารถกำหนดค่าได้ที่นี่",
@@ -945,7 +948,7 @@ export const dict = {
"settings.permissions.tool.glob.description": "จับคู่ไฟล์โดยใช้รูปแบบ glob",
"settings.permissions.tool.grep.title": "Grep",
"settings.permissions.tool.grep.description": "ค้นหาเนื้อหาไฟล์โดยใช้นิพจน์ทั่วไป",
"settings.permissions.tool.list.title": "รายการ",
"settings.permissions.tool.list.title": "แสดงรายการ",
"settings.permissions.tool.list.description": "แสดงรายการไฟล์ภายในไดเรกทอรี",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "เรียกใช้คำสั่งเชลล์",
@@ -1018,13 +1021,16 @@ export const dict = {
"dialog.server.add.passwordPlaceholder": "รหัสผ่าน",
"server.row.noUsername": "ไม่มีชื่อผู้ใช้",
"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.action": "สร้าง Git รีโพซิทอรี",
"session.todo.progress": "เสร็จสิ้น {{done}} จาก {{total}} รายการ",
"session.question.progress": "{{current}} จาก {{total}} คำถาม",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "File Explorer",
"session.header.reveal.finder": "แสดงใน Finder",
"session.header.reveal.fileExplorer": "แสดงใน File Explorer",
"session.header.reveal.containingFolder": "เปิดโฟลเดอร์ที่มีรายการนี้",
"session.header.open.fileManager": "File Manager",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
+67 -61
View File
@@ -78,9 +78,9 @@ export const dict = {
"command.model.variant.cycle": "Düşünme eforu değiştir",
"command.model.variant.cycle.description": "Sonraki efor seviyesine geç",
"command.prompt.mode.shell": "Kabuk",
"command.prompt.mode.normal": "Komut",
"command.permissions.autoaccept.enable": "Düzenlemeleri otomatik kabul et",
"command.permissions.autoaccept.disable": "Otomatik kabulü durdur",
"command.prompt.mode.normal": "İstem",
"command.permissions.autoaccept.enable": "İzinleri otomatik kabul et",
"command.permissions.autoaccept.disable": "İzinleri otomatik kabul etmeyi durdur",
"command.workspace.toggle": "Çalışma alanlarını aç/kapat",
"command.workspace.toggle.description": "Kenar çubuğunda birden fazla çalışma alanını göster veya gizle",
"command.session.undo": "Geri al",
@@ -106,9 +106,10 @@ export const dict = {
"dialog.provider.empty": "Sağlayıcı bulunamadı",
"dialog.provider.group.popular": "Popüler",
"dialog.provider.group.other": "Diğer",
"dialog.provider.custom.label": "Özel OpenAI uyumlu sağlayıcı",
"dialog.provider.tag.recommended": "Önerilen",
"dialog.provider.opencode.note": "Claude, GPT, Gemini ve daha fazlasını içeren seçilmiş modeller",
"dialog.provider.opencode.tagline": "Güvenilir optimize edilmiş modeller",
"dialog.provider.opencode.tagline": "Güvenilir, optimize edilmiş modeller",
"dialog.provider.opencodeGo.tagline": "Herkes için düşük maliyetli abonelik",
"dialog.provider.anthropic.note": "Pro ve Max dahil Claude modellerine doğrudan erişim",
"dialog.provider.copilot.note": "GitHub Copilot üzerinden kodlama yardımı için yapay zekâ modelleri",
@@ -126,6 +127,7 @@ export const dict = {
"dialog.model.unpaid.freeModels.title": "OpenCode tarafından sunulan ücretsiz modeller",
"dialog.model.unpaid.addMore.title": "Popüler sağlayıcılardan daha fazla model ekleyin",
"dialog.model.unpaid.viewMoreProviders": "70'ten fazla sağlayıcı daha görüntüle",
"dialog.provider.viewAll": "Daha fazla sağlayıcı göster",
@@ -166,9 +168,9 @@ export const dict = {
"provider.custom.title": "Özel sağlayıcı",
"provider.custom.description.prefix": "OpenAI uyumlu bir sağlayıcı yapılandırın. ",
"provider.custom.description.link": "Sağlayıcı yapılandırma dökümanları",
"provider.custom.description.link": "sağlayıcı yapılandırma dokümanları",
"provider.custom.description.suffix": " sayfasına bakın.",
"provider.custom.field.providerID.label": "Sağlayıcı kimlik",
"provider.custom.field.providerID.label": "Sağlayıcı kimliği",
"provider.custom.field.providerID.placeholder": "saglayicim",
"provider.custom.field.providerID.description": "Küçük harfler, rakamlar, tire veya alt çizgi",
"provider.custom.field.name.label": "Görünen ad",
@@ -178,7 +180,7 @@ export const dict = {
"provider.custom.field.apiKey.label": "API anahtarı",
"provider.custom.field.apiKey.placeholder": "API anahtarı",
"provider.custom.field.apiKey.description":
"İsteğe bağlı. Kimlik doğrulamayı başlıklar ile yönetiyorsanız boş bırakın.",
"İsteğe bağlı. Kimlik doğrulamayı başlıklarla yönetiyorsanız boş bırakın.",
"provider.custom.models.label": "Modeller",
"provider.custom.models.id.label": "Kimlik",
"provider.custom.models.id.placeholder": "model-kimlik",
@@ -193,9 +195,9 @@ export const dict = {
"provider.custom.headers.value.placeholder": "değer",
"provider.custom.headers.remove": "Başlığı kaldır",
"provider.custom.headers.add": "Başlık ekle",
"provider.custom.error.providerID.required": "Sağlayıcı kimlik gerekli",
"provider.custom.error.providerID.required": "Sağlayıcı kimliği gerekli",
"provider.custom.error.providerID.format": "Küçük harf, rakam, tire veya alt çizgi kullanın",
"provider.custom.error.providerID.exists": "Bu sağlayıcı kimlik zaten mevcut",
"provider.custom.error.providerID.exists": "Bu sağlayıcı kimliği zaten mevcut",
"provider.custom.error.name.required": "Görünen ad gerekli",
"provider.custom.error.baseURL.required": "Temel URL gerekli",
"provider.custom.error.baseURL.format": "http:// veya https:// ile başlamalı",
@@ -203,7 +205,7 @@ export const dict = {
"provider.custom.error.duplicate": "Tekrar",
"provider.disconnect.toast.disconnected.title": "{{provider}} bağlantısı kesildi",
"provider.disconnect.toast.disconnected.description": "{{provider}} modelleri artık kullanılabilir değil.",
"provider.disconnect.toast.disconnected.description": "{{provider}} modelleri artık kullanılamıyor.",
"model.tag.free": "Ücretsiz",
"model.tag.latest": "En yeni",
@@ -223,9 +225,9 @@ export const dict = {
"model.tooltip.model": "Model",
"model.tooltip.provider": "Sağlayıcı",
"model.tooltip.reasoning": "Akıl yürütme",
"model.tooltip.reasoning.allowed": "Akıl yürütme destekler",
"model.tooltip.reasoning.allowed": "Akıl yürütmeyi destekler",
"model.tooltip.reasoning.none": "Akıl yürütme yok",
"model.tooltip.context": "Bağlam limiti {{limit}}",
"model.tooltip.context": "Bağlam sınırı {{limit}}",
"common.search.placeholder": "Ara",
"common.goBack": "Geri git",
@@ -235,8 +237,8 @@ export const dict = {
"common.cancel": "İptal",
"common.clear": "Temizle",
"common.connect": "Bağlan",
"common.disconnect": "Bağlantı Kes",
"common.continue": "Gönder",
"common.disconnect": "Bağlantıyı kes",
"common.continue": "Devam et",
"common.submit": "Gönder",
"common.save": "Kaydet",
"common.saving": "Kaydediliyor...",
@@ -249,7 +251,7 @@ export const dict = {
"prompt.placeholder.summarizeComments": "Yorumları özetle…",
"prompt.placeholder.summarizeComment": "Yorumu özetle…",
"prompt.mode.shell": "Kabuk",
"prompt.mode.normal": "Komut",
"prompt.mode.normal": "İstem",
"prompt.mode.shell.exit": "çıkmak için esc",
"session.child.promptDisabled": "Alt ajan oturumlarına istem gönderilemez.",
"session.child.backToParent": "Ana oturuma dön.",
@@ -266,30 +268,30 @@ export const dict = {
"prompt.example.10": "API dokümantasyonu oluştur",
"prompt.example.11": "Veritabanı sorgularını optimize et",
"prompt.example.12": "Girdi doğrulama ekle",
"prompt.example.13": "İçin yeni bir bileşen oluştur...",
"prompt.example.13": "... için yeni bir bileşen oluştur",
"prompt.example.14": "Bu projeyi nasıl dağıtabilirim?",
"prompt.example.15": "Kodumu en iyi uygulamalar için incele",
"prompt.example.16": "Bu fonksiyona hata yönetimi ekle",
"prompt.example.17": "Bu regex kalıbını açıkla",
"prompt.example.18": "Bunu TypeScript'e dönüştür",
"prompt.example.19": "Kod tabanı boyunca loglama ekle",
"prompt.example.19": "Kod tabanının tamamına günlük kaydı ekle",
"prompt.example.20": "Hangi bağımlılıklar güncellenmemiş?",
"prompt.example.21": "Bir göç betiği yazmama yardım et",
"prompt.example.21": "Bir geçiş betiği yazmama yardım et",
"prompt.example.22": "Bu uç nokta için önbellekleme uygula",
"prompt.example.23": "Bu listeye sayfalama ekle",
"prompt.example.24": "İçin bir CLI komutu oluştur...",
"prompt.example.24": "... için bir CLI komutu oluştur",
"prompt.example.25": "Ortam değişkenleri burada nasıl çalışıyor?",
"prompt.popover.emptyResults": "Eşleşen sonuç yok",
"prompt.popover.emptyCommands": "Eşleşen komut yok",
"prompt.dropzone.label": "Resimleri, PDF'leri veya metin dosyalarını buraya bırakın",
"prompt.dropzone.file.label": "@bahsetmek için dosyayı bırakın",
"prompt.dropzone.file.label": "Dosyayı @ ile belirtmek için buraya bırakın",
"prompt.slash.badge.custom": "özel",
"prompt.slash.badge.skill": "beceri",
"prompt.slash.badge.mcp": "mcp",
"prompt.context.active": "aktif",
"prompt.context.includeActiveFile": "Aktif dosyayı dahil et",
"prompt.context.removeActiveFile": "Aktif dosyayı bağlamdan çıkar",
"prompt.context.active": "etkin",
"prompt.context.includeActiveFile": "Etkin dosyayı dahil et",
"prompt.context.removeActiveFile": "Etkin dosyayı bağlamdan çıkar",
"prompt.context.removeFile": "Dosyayı bağlamdan çıkar",
"prompt.action.attachFile": "Dosya ekle",
"prompt.menu.addImagesAndFiles": "Dosya ve daha fazlasını ekle",
@@ -305,16 +307,16 @@ export const dict = {
"prompt.toast.attachmentDuplicate.title": "Bu dosya zaten yüklendi",
"prompt.toast.pasteUnsupported.description": "Buraya yalnızca resimler, PDF'ler veya metin dosyaları eklenebilir.",
"prompt.toast.modelAgentRequired.title": "Bir ajan ve model seçin",
"prompt.toast.modelAgentRequired.description": "Komut göndermeden önce bir ajan ve model seçin.",
"prompt.toast.modelAgentRequired.description": "İstem göndermeden önce bir ajan ve model seçin.",
"prompt.toast.worktreeCreateFailed.title": "Çalışma ağacı oluşturulamadı",
"prompt.toast.sessionCreateFailed.title": "Oturum oluşturulamadı",
"prompt.toast.shellSendFailed.title": "Kabuk komutu gönderilemedi",
"prompt.toast.commandSendFailed.title": "Komut gönderilemedi",
"prompt.toast.promptSendFailed.title": "Komut gönderilemedi",
"prompt.toast.promptSendFailed.title": "İstem gönderilemedi",
"prompt.toast.promptSendFailed.description": "Oturum alınamadı",
"dialog.mcp.title": "MCP'ler",
"dialog.mcp.description": "{{total}} içerisinden {{enabled}} etkin",
"dialog.mcp.description": "Toplam {{total}} öğeden {{enabled}} tanesi etkin",
"dialog.mcp.empty": "Yapılandırılmış MCP yok",
"dialog.lsp.empty": "LSP'ler dosya türlerinden otomatik algılanır",
@@ -349,7 +351,7 @@ export const dict = {
"dialog.server.add.name": "Sunucu adı (isteğe bağlı)",
"dialog.server.add.namePlaceholder": "Localhost",
"dialog.server.add.username": "Kullanıcı adı (isteğe bağlı)",
"dialog.server.add.password": "Şifre (isteğe bağlı)",
"dialog.server.add.password": "Parola (isteğe bağlı)",
"dialog.server.edit.title": "Sunucuyu düzenle",
"dialog.server.default.title": "Varsayılan sunucu",
"dialog.server.default.description":
@@ -455,14 +457,14 @@ export const dict = {
"context.breakdown.tool": "Araç Çağrıları",
"context.breakdown.other": "Diğer",
"context.systemPrompt.title": "Sistem Komutu",
"context.systemPrompt.title": "Sistem İstemi",
"context.rawMessages.title": "Ham mesajlar",
"context.stats.session": "Oturum",
"context.stats.messages": "Mesajlar",
"context.stats.provider": "Sağlayıcı",
"context.stats.model": "Model",
"context.stats.limit": "Bağlam Limiti",
"context.stats.limit": "Bağlam Sınırı",
"context.stats.totalTokens": "Toplam Token",
"context.stats.usage": "Kullanım",
"context.stats.inputTokens": "Girdi Tokenleri",
@@ -472,7 +474,7 @@ export const dict = {
"context.stats.userMessages": "Kullanıcı Mesajları",
"context.stats.assistantMessages": "Asistan Mesajları",
"context.stats.totalCost": "Toplam Maliyet",
"context.stats.sessionCreated": "Oturum Oluşturulma",
"context.stats.sessionCreated": "Oturum Oluşturma",
"context.stats.lastActivity": "Son Etkinlik",
"context.usage.tokens": "Tokenler",
@@ -511,10 +513,10 @@ export const dict = {
"toast.workspace.disabled.title": "Çalışma alanları devre dışı bırakıldı",
"toast.workspace.disabled.description": "Kenar çubuğunda yalnızca ana çalışma ağacı gösterilecek",
"toast.permissions.autoaccept.on.title": "Düzenlemeler otomatik kabul ediliyor",
"toast.permissions.autoaccept.on.description": "Düzenleme ve yazma izinleri otomatik olarak onaylanacak",
"toast.permissions.autoaccept.off.title": "Otomatik kabul durduruldu",
"toast.permissions.autoaccept.off.description": "Düzenleme ve yazma izinleri onay gerektirecek",
"toast.permissions.autoaccept.on.title": "İzinler otomatik kabul ediliyor",
"toast.permissions.autoaccept.on.description": "İzin istekleri otomatik olarak onaylanacak",
"toast.permissions.autoaccept.off.title": "İzinleri otomatik kabul etme durduruldu",
"toast.permissions.autoaccept.off.description": "İzin istekleri onay gerektirecek",
"toast.model.none.title": "Model seçilmedi",
"toast.model.none.description": "Bu oturumu özetlemek için bir sağlayıcı bağlayın",
@@ -554,8 +556,8 @@ export const dict = {
"error.page.action.checking": "Kontrol ediliyor...",
"error.page.action.checkUpdates": "Güncellemeleri kontrol et",
"error.page.action.updateTo": "{{version}} sürümüne güncelle",
"error.page.report.prefix": "Lütfen bu hatayı OpenCode ekibine bildirin",
"error.page.report.discord": "Discord üzerinden",
"error.page.report.prefix": "Lütfen bu hatayı OpenCode ekibine",
"error.page.report.discord": "Discord üzerinden bildirin",
"error.page.version": "Sürüm: {{version}}",
"error.dev.rootNotFound":
@@ -572,9 +574,9 @@ export const dict = {
"error.chain.responseBody": "Yanıt gövdesi:\n{{body}}",
"error.chain.didYouMean": "Bunu mu demek istediniz: {{suggestions}}",
"error.chain.modelNotFound": "Model bulunamadı: {{provider}}/{{model}}",
"error.chain.checkConfig": "Yapılandırma dosyanızı (opencode.json) sağlayıcı/model adlarını kontrol edin",
"error.chain.checkConfig": "Yapılandırma dosyanızdaki (opencode.json) sağlayıcı/model adlarını kontrol edin",
"error.chain.mcpFailed":
'MCP sunucusu "{{name}}" başarısız oldu. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.',
'MCP sunucusu "{{name}}" çalıştırılamadı. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.',
"error.chain.providerAuthFailed": "Sağlayıcı kimlik doğrulaması başarısız ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
'"{{provider}}" sağlayıcısı başlatılamadı. Kimlik bilgilerini ve yapılandırmayı kontrol edin.',
@@ -624,9 +626,9 @@ export const dict = {
"session.panel.reviewAndFiles": "İnceleme ve dosyalar",
"session.error.notFound": "Bu oturum bulunamıyor",
"session.error.notFound.description": "Bu sekme, artık bu sunucuda bulunmayan bir oturuma yönlendiriyor.",
"session.error.notFound.closeTab": "Sekmeyi Kapat",
"session.error.notFound.closeTab": "Sekmeyi kapat",
"session.error.serverConnection": "Bu sunucuya bağlanılamıyor",
"session.review.filesChanged": "{{count}} Dosya Değişti",
"session.review.filesChanged": "{{count}} dosya değişti",
"session.review.change.one": "Değişiklik",
"session.review.change.other": "Değişiklik",
"session.review.loadingChanges": "Değişiklikler yükleniyor...",
@@ -635,7 +637,7 @@ export const dict = {
"session.review.noSnapshot":
"Yapılandırmada anlık görüntü takibi devre dışı bırakıldı, bu nedenle oturum değişiklikleri kullanılamıyor",
"session.review.noChanges": "Değişiklik yok",
"session.review.noUncommittedChanges": "Henüz commit edilmemiş değişiklik yok",
"session.review.noUncommittedChanges": "Henüz işlenmemiş değişiklik yok",
"session.review.noBranchChanges": "Henüz dal değişikliği yok",
"session.files.selectToOpen": "Açmak için bir dosya seçin",
@@ -669,7 +671,7 @@ export const dict = {
"session.revertDock.expand": "Geri alınan mesajları genişlet",
"session.revertDock.restore": "Mesajı geri yükle",
"session.new.title": "İstediğini yap",
"session.new.title": "Her şeyi geliştirin",
"session.new.project.new": "Yeni proje",
"session.new.project.search": "Proje ara",
"session.new.project.add": "Proje ekle",
@@ -690,6 +692,9 @@ export const dict = {
"session.header.open.ariaLabel": "{{app}} ile aç",
"session.header.open.menu": "Açma seçenekleri",
"session.header.open.copyPath": "Yolu kopyala",
"session.header.reveal.finder": "Finder'da göster",
"session.header.reveal.fileExplorer": "Dosya Gezgini'nde göster",
"session.header.reveal.containingFolder": "İçeren klasörü aç",
"status.popover.trigger": "Durum",
"status.popover.ariaLabel": "Sunucu yapılandırmaları",
@@ -710,17 +715,17 @@ export const dict = {
"session.share.action.unpublishing": "Yayından kaldırılıyor...",
"session.share.action.view": "Görüntüle",
"session.share.copy.copied": "Kopyalandı",
"session.share.copy.copyLink": "Bağlantı kopyala",
"session.share.copy.copyLink": "Bağlantıyı kopyala",
"lsp.tooltip.none": "LSP sunucusu yok",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Komut yükleniyor...",
"prompt.loading": "İstem yükleniyor...",
"terminal.loading": "Terminal yükleniyor...",
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Terminali kapat",
"terminal.connectionLost.title": "Bağlantı Kesildi",
"terminal.connectionLost.title": "Bağlantı kesildi",
"terminal.connectionLost.description":
"Terminal bağlantısı kesildi. Bu durum sunucu yeniden başladığında oluşabilir.",
@@ -785,15 +790,15 @@ export const dict = {
"OpenCode'un sistem, açık veya koyu temayı takip etip etmeyeceğini seçin",
"settings.general.row.theme.title": "Tema",
"settings.general.row.theme.description": "OpenCode'un temasını özelleştirin.",
"settings.general.row.font.title": "Kod Yazı Tipi",
"settings.general.row.font.title": "Kod yazı tipi",
"settings.general.row.font.description": "Kod bloklarında kullanılan yazı tipini özelleştirin",
"settings.general.row.terminalFont.title": "Terminal yazı tipi",
"settings.general.row.terminalFont.description": "Terminalde kullanılan yazı tipini özelleştirin",
"settings.general.row.uiFont.title": "Arayüz Yazı Tipi",
"settings.general.row.uiFont.title": "Arayüz yazı tipi",
"settings.general.row.uiFont.description": "Arayüz genelinde kullanılan yazı tipini özelleştirin",
"settings.general.row.followup.title": "Takip davranışı",
"settings.general.row.followup.description":
"Takip komutlarının hemen yönlendirilmesini mi yoksa sırada beklemesini mi istediğinizi seçin",
"Takip istemlerinin hemen yönlendirilmesini mi yoksa sırada beklemesini mi istediğinizi seçin",
"settings.general.row.followup.option.queue": "Sıra",
"settings.general.row.followup.option.steer": "Yönlendir",
"settings.general.row.showFileTree.title": "Dosya ağacı",
@@ -809,8 +814,9 @@ export const dict = {
"settings.general.row.mobileTitlebarBottom.title": "Alt gezinme",
"settings.general.row.mobileTitlebarBottom.description":
"Mobil cihazlarda başlık çubuğunu ve oturum sekmelerini ekranın altına yerleştir",
"settings.general.row.showCustomAgents.title": "Özel ajanlar",
"settings.general.row.showCustomAgents.description": "Yazma alanında ajan seçiciyi göster",
"settings.general.row.showCustomAgents.title": "Ajanı göster",
"settings.general.row.showCustomAgents.description":
"Düzenleyicide ajanlar arasında geçiş yapın. Gizlendiğinde varsayılan olarak Build ajanı kullanılır.",
"settings.general.row.reasoningSummaries.title": "Akıl yürütme özetlerini göster",
"settings.general.row.reasoningSummaries.description": "Zaman çizelgesinde model akıl yürütme özetlerini görüntüle",
"settings.general.row.shellToolPartsExpanded.title": "Kabuk araç bileşenlerini genişlet",
@@ -834,7 +840,7 @@ export const dict = {
"settings.general.row.wayland.description":
"Wayland'da X11 geri dönüşünü devre dışı bırak. Yeniden başlatma gerektirir.",
"settings.general.row.wayland.tooltip":
"Karışık yenileme hızlı monitörlere sahip Linux'ta yerel Wayland daha kararlı olabilir.",
"Farklı yenileme hızlarına sahip monitörlerin kullanıldığı Linux sistemlerinde yerel Wayland daha kararlı olabilir.",
"settings.general.row.releaseNotes.title": "Sürüm notları",
"settings.general.row.releaseNotes.description": "Güncellemelerden sonra Yenilikler bildirimlerini göster",
@@ -928,7 +934,7 @@ export const dict = {
"settings.shortcuts.group.navigation": "Gezinme",
"settings.shortcuts.group.modelAndAgent": "Model ve ajan",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Komut",
"settings.shortcuts.group.prompt": "İstem",
"settings.providers.title": "Sağlayıcılar",
"settings.providers.description": "Sağlayıcı ayarları burada yapılandırılabilecek.",
@@ -953,7 +959,7 @@ export const dict = {
"settings.permissions.section.tools": "Araçlar",
"settings.permissions.toast.updateFailed.title": "İzinler güncellenemedi",
"settings.permissions.action.allow": "İzin Ver",
"settings.permissions.action.allow": "İzin ver",
"settings.permissions.action.ask": "Sor",
"settings.permissions.action.deny": "Reddet",
@@ -993,7 +999,7 @@ export const dict = {
"workspace.new": "Yeni çalışma alanı",
"workspace.type.local": "yerel",
"workspace.type.sandbox": "sandbox",
"workspace.type.sandbox": "korumalı alan",
"workspace.create.failed.title": "Çalışma alanı oluşturulamadı",
"workspace.delete.failed.title": "Çalışma alanı silinemedi",
"workspace.resetting.title": "Çalışma alanı sıfırlanıyor",
@@ -1025,9 +1031,9 @@ export const dict = {
"error.server.invalidConfiguration": "Geçersiz yapılandırma",
"common.moreCountSuffix": " (+{{count}} daha)",
"common.time.justNow": "Şimdi",
"common.time.minutesAgo.short": "{{count}}dk önce",
"common.time.hoursAgo.short": "{{count}}sa önce",
"common.time.daysAgo.short": "{{count}}g önce",
"common.time.minutesAgo.short": "{{count}} dk önce",
"common.time.hoursAgo.short": "{{count}} sa önce",
"common.time.daysAgo.short": "{{count}} gün önce",
"settings.providers.connected.environmentDescription": "Ortam değişkenlerinizden bağlandı",
"settings.providers.custom.description": "Temel URL üzerinden OpenAI uyumlu bir sağlayıcı ekleyin.",
@@ -1065,7 +1071,7 @@ export const dict = {
"debugBar.nav.tip":
"Yönlendirici başlangıcından yerleşme sonrası ilk boyamaya kadar ölçülen, bir oturum sayfasına dokunan son tamamlanmış rota geçişi.",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "Son 5 saniyedeki kayan saniye başına kare sayısı.",
"debugBar.fps.tip": "Son 5 saniyedeki hareketli saniye başına kare ortalaması.",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "Son 5 saniyedeki en kötü kare süresi.",
"debugBar.jank.label": "JANK",
@@ -1079,14 +1085,14 @@ export const dict = {
"debugBar.cls.label": "CLS",
"debugBar.cls.tip": "Mevcut uygulama ömrü için kümülatif düzen kayması.",
"debugBar.mem.label": "MEM",
"debugBar.mem.tipUnavailable": "Kullanılan JS yığını vs yığın sınırı. Yalnızca Chromium.",
"debugBar.mem.tip": "Kullanılan JS yığını vs yığın sınırı. {{limit}} içinde {{used}}.",
"debugBar.mem.tipUnavailable": "Kullanılan JS yığınının yığın sınırına oranı. Yalnızca Chromium.",
"debugBar.mem.tip": "Kullanılan JS yığınının yığın sınırına oranı: {{used}} / {{limit}}.",
"common.key.ctrl": "Ctrl",
"common.key.alt": "Alt",
"common.key.shift": "Shift",
"common.key.meta": "Meta",
"common.key.space": "Boşluk",
"common.key.backspace": "Geri",
"common.key.backspace": "Geri Al",
"common.key.enter": "Enter",
"common.key.tab": "Tab",
"common.key.delete": "Delete",
+42 -34
View File
@@ -102,26 +102,28 @@ export const dict = {
"dialog.provider.empty": "Провайдерів не знайдено",
"dialog.provider.group.popular": "Популярні",
"dialog.provider.group.other": "Інші",
"dialog.provider.custom.label": "Користувацький провайдер, сумісний з OpenAI",
"dialog.provider.tag.recommended": "Рекомендовані",
"dialog.provider.opencode.note": "Відібрані моделі, включаючи Claude, GPT, Gemini та інші",
"dialog.provider.opencode.tagline": "Надійні оптимізовані моделі",
"dialog.provider.opencodeGo.tagline": "Недорога підписка для всіх",
"dialog.provider.anthropic.note": "Прямий доступ до моделей Claude, включаючи Pro та Max",
"dialog.provider.copilot.note": "Моделі AI для допомоги в кодуванні через GitHub Copilot",
"dialog.provider.openai.note": "Моделі GPT для швидких і універсальних завдань AI",
"dialog.provider.copilot.note": "Моделі ШІ для допомоги в кодуванні через GitHub Copilot",
"dialog.provider.openai.note": "Моделі GPT для швидких і універсальних завдань ШІ",
"dialog.provider.google.note": "Моделі Gemini для швидких структурованих відповідей",
"dialog.provider.openrouter.note": "Доступ до всіх підтримуваних моделей від одного провайдера",
"dialog.provider.vercel.note": "Уніфікований доступ до моделей AI з інтелектуальною маршрутизацією",
"dialog.provider.vercel.note": "Уніфікований доступ до моделей ШІ з інтелектуальною маршрутизацією",
"dialog.model.select.title": "Вибрати модель",
"dialog.model.search.placeholder": "Пошук моделей",
"dialog.model.empty": "Немає результатів моделей",
"dialog.model.empty": "Моделей не знайдено",
"dialog.model.manage": "Керувати моделями",
"dialog.model.manage.description": "Налаштуйте, які моделі відображатимуться у виборі моделей.",
"dialog.model.manage.provider.toggle": "Перемкнути всі моделі {{provider}}",
"dialog.model.unpaid.freeModels.title": "Безкоштовні моделі від OpenCode",
"dialog.model.unpaid.addMore.title": "Додати більше моделей від популярних провайдерів",
"dialog.model.unpaid.viewMoreProviders": "Переглянути ще понад 70 провайдерів",
"dialog.provider.viewAll": "Показати більше провайдерів",
@@ -168,7 +170,7 @@ export const dict = {
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "Малі літери, цифри, дефіси або підкреслення",
"provider.custom.field.name.label": "Відображувана назва",
"provider.custom.field.name.placeholder": "Мій AI Провайдер",
"provider.custom.field.name.placeholder": "Мій провайдер ШІ",
"provider.custom.field.baseURL.label": "Базовий URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "Ключ API",
@@ -189,7 +191,7 @@ export const dict = {
"provider.custom.headers.value.placeholder": "значення",
"provider.custom.headers.remove": "Видалити заголовок",
"provider.custom.headers.add": "Додати заголовок",
"provider.custom.error.providerID.required": "ID провайдера обов'язкове",
"provider.custom.error.providerID.required": "ID провайдера обов'язковий",
"provider.custom.error.providerID.format": "Використовуйте малі літери, цифри, дефіси або підкреслення",
"provider.custom.error.providerID.exists": "ID провайдера вже існує",
"provider.custom.error.name.required": "Відображувана назва обов'язкова",
@@ -314,7 +316,7 @@ export const dict = {
"dialog.mcp.description": "{{enabled}} з {{total}} увімкнено",
"dialog.mcp.empty": "MCP не налаштовано",
"dialog.lsp.empty": "LSP автоматично виявлені за типами файлів",
"dialog.lsp.empty": "Сервери LSP автоматично виявляються за типами файлів",
"dialog.plugins.empty": "Плагіни налаштовані в opencode.json",
"mcp.status.connected": "підключено",
@@ -333,8 +335,8 @@ export const dict = {
"dialog.directory.parent": "Батьківська папка",
"dialog.directory.readError": "Не вдалося прочитати цю папку",
"app.server.unreachable": "Не вдалося досягти {{server}}",
"app.server.retrying": "Автоматичне повторення...",
"app.server.unreachable": "Не вдалося зв'язатися із {{server}}",
"app.server.retrying": "Автоматична повторна спроба...",
"app.server.otherServers": "Інші сервери",
"dialog.server.title": "Сервери",
@@ -364,7 +366,7 @@ export const dict = {
"dialog.server.menu.edit": "Редагувати",
"dialog.server.menu.default": "Встановити за замовчуванням",
"dialog.server.menu.defaultRemove": "Видалити за замовчуванням",
"dialog.server.menu.defaultRemove": "Скасувати використання за замовчуванням",
"dialog.server.menu.delete": "Видалити",
"dialog.server.current": "Поточний сервер",
"dialog.server.status.default": "За замовчуванням",
@@ -466,7 +468,7 @@ export const dict = {
"context.breakdown.other": "Інше",
"context.systemPrompt.title": "Системний запит",
"context.rawMessages.title": "Сировинні повідомлення",
"context.rawMessages.title": "Необроблені повідомлення",
"context.stats.session": "Сесія",
"context.stats.messages": "Повідомлення",
@@ -560,14 +562,14 @@ export const dict = {
"error.page.details.label": "Деталі помилки",
"error.page.action.restart": "Перезапустити",
"error.page.action.report": "Повідомити про помилку",
"error.page.action.reported": "Помилку повідомлено",
"error.page.action.reported": ро помилку повідомлено",
"error.page.action.exportLogs": "Експортувати журнали",
"error.page.action.checking": "Перевірка...",
"error.page.action.checkUpdates": "Перевірити оновлення",
"error.page.action.updateTo": "Оновити до {{version}}",
"error.page.circular": "[Циклічне]",
"error.page.report.prefix": "Будь ласка, повідомте про цю помилку команді OpenCode",
"error.page.report.discord": "на Discord",
"error.page.report.discord": "у Discord",
"error.page.version": "Версія: {{version}}",
"error.dev.rootNotFound":
@@ -587,7 +589,7 @@ export const dict = {
"error.chain.causedBy": "Причина:",
"error.chain.apiError": "Помилка API",
"error.chain.status": "Статус: {{status}}",
"error.chain.retryable": "Повторювано: {{retryable}}",
"error.chain.retryable": "Можна повторити: {{retryable}}",
"error.chain.responseBody": "Тіло відповіді:\n{{body}}",
"error.chain.didYouMean": "Можливо, ви мали на увазі: {{suggestions}}",
"error.chain.modelNotFound": "Модель не знайдено: {{provider}}/{{model}}",
@@ -663,7 +665,7 @@ export const dict = {
"session.files.selectToOpen": "Виберіть файл для відкриття",
"session.files.all": "Усі файли",
"session.files.empty": "Немає файлів",
"session.files.binaryContent": "Бінарний файл (вміст не може бути відображено)",
"session.files.binaryContent": "Двійковий файл (вміст неможливо відобразити)",
"session.messages.renderEarlier": "Відобразити раніші повідомлення",
"session.messages.loadingEarlier": "Завантаження раніших повідомлень...",
@@ -715,7 +717,10 @@ export const dict = {
"session.header.open.menu": "Параметри відкриття",
"session.header.open.copyPath": "Копіювати шлях",
"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.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -770,7 +775,7 @@ export const dict = {
"common.dismiss": "Відхилити",
"common.moreCountSuffix": " (ще {{count}})",
"common.requestFailed": "Запит не виконано",
"common.moreOptions": "Більше опцій",
"common.moreOptions": "Більше параметрів",
"common.learnMore": "Дізнатися більше",
"common.rename": "Перейменувати",
"common.reset": "Скинути",
@@ -843,10 +848,10 @@ export const dict = {
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Робочий стіл",
"settings.section.desktop": "Десктопний застосунок",
"settings.section.server": "Сервер",
"settings.tab.general": "Загальні",
"settings.tab.shortcuts": "Скорочення",
"settings.tab.shortcuts": "Клавіатурні скорочення",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "Інтеграція WSL",
"settings.desktop.wsl.description": "Запускати сервер OpenCode всередині WSL на Windows.",
@@ -864,7 +869,7 @@ export const dict = {
"settings.general.row.shell.title": "Командна оболонка термінала",
"settings.general.row.shell.description":
"Виберіть оболонку для термінала. Сумісні оболонки також використовуються для викликів інструментів агента.",
"settings.general.row.shell.autoDefault": "Авто (за замовчуванням)",
"settings.general.row.shell.autoDefault": "Автоматично (за замовчуванням)",
"settings.general.row.shell.terminalOnly": "тільки термінал",
"settings.general.row.appearance.title": "Зовнішній вигляд",
"settings.general.row.appearance.description": "Налаштуйте вигляд OpenCode на вашому пристрої",
@@ -885,18 +890,21 @@ export const dict = {
"settings.general.row.showFileTree.title": "Дерево файлів",
"settings.general.row.showFileTree.description": "Показувати панель дерева файлів у сесіях",
"settings.general.row.showNavigation.title": "Елементи навігації",
"settings.general.row.showNavigation.description": "Показувати кнопки назад і вперед у заголовку робочого столу",
"settings.general.row.showNavigation.description":
"Показувати кнопки назад і вперед на панелі заголовка десктопного застосунку",
"settings.general.row.showSearch.title": "Палітра команд",
"settings.general.row.showSearch.description": "Показувати кнопку пошуку та палітри команд у заголовку",
"settings.general.row.showSearch.description": "Показувати кнопку пошуку та палітри команд на панелі заголовка",
"settings.general.row.showTerminal.title": "Термінал",
"settings.general.row.showTerminal.description": "Показувати кнопку термінала в заголовку робочого столу",
"settings.general.row.showTerminal.description":
"Показувати кнопку термінала на панелі заголовка десктопного застосунку",
"settings.general.row.showStatus.title": "Статус сервера",
"settings.general.row.showStatus.description": "Показувати кнопку статусу сервера в заголовку",
"settings.general.row.showStatus.description": "Показувати кнопку стану сервера на панелі заголовка",
"settings.general.row.mobileTitlebarBottom.title": "Нижня навігація",
"settings.general.row.mobileTitlebarBottom.description":
"Розмістити заголовок і вкладки сесії внизу екрана на мобільних пристроях",
"settings.general.row.showCustomAgents.title": "Користувацькі агенти",
"settings.general.row.showCustomAgents.description": "Показувати вибір агента в редакторі запиту",
"Розмістити панель заголовка та вкладки сесії внизу екрана на мобільних пристроях",
"settings.general.row.showCustomAgents.title": "Показувати агента",
"settings.general.row.showCustomAgents.description":
"Перемикатися між агентами в редакторі запиту. Якщо приховано, типовим є агент Build.",
"settings.general.row.reasoningSummaries.title": "Показувати підсумки мислення",
"settings.general.row.reasoningSummaries.description": "Відображати підсумки мислення моделі на часовій шкалі",
"settings.general.row.shellToolPartsExpanded.title": "Розгортати частини інструменту оболонки",
@@ -996,16 +1004,16 @@ export const dict = {
"settings.general.sounds.errors.title": "Помилки",
"settings.general.sounds.errors.description": "Відтворювати звук, коли виникає помилка",
"settings.shortcuts.title": "Скорочення клавіш",
"settings.shortcuts.reset.button": "Скинути до стандартних",
"settings.shortcuts.reset.toast.title": "Скорочення скинуто",
"settings.shortcuts.reset.toast.description": "Скорочення клавіш були скинуті до стандартних.",
"settings.shortcuts.conflict.title": "Скорочення вже використовується",
"settings.shortcuts.title": "Клавіатурні скорочення",
"settings.shortcuts.reset.button": "Відновити стандартні",
"settings.shortcuts.reset.toast.title": "Клавіатурні скорочення відновлено",
"settings.shortcuts.reset.toast.description": "Стандартні клавіатурні скорочення відновлено.",
"settings.shortcuts.conflict.title": "Клавіатурне скорочення вже використовується",
"settings.shortcuts.conflict.description": "{{keybind}} вже призначено для {{titles}}.",
"settings.shortcuts.unassigned": "Не призначено",
"settings.shortcuts.pressKeys": "Натисніть клавіші",
"settings.shortcuts.search.placeholder": "Пошук скорочень",
"settings.shortcuts.search.empty": "Скорочень не знайдено",
"settings.shortcuts.search.placeholder": "Пошук клавіатурних скорочень",
"settings.shortcuts.search.empty": "Клавіатурних скорочень не знайдено",
"settings.shortcuts.group.general": "Загальні",
"settings.shortcuts.group.session": "Сесія",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+99 -94
View File
@@ -86,8 +86,8 @@ export const dict = {
"command.model.choose": "选择模型",
"command.model.choose.description": "选择不同的模型",
"command.mcp.toggle": "切换 MCPs",
"command.mcp.toggle.description": "切换 MCPs",
"command.mcp.toggle": "启用或禁用 MCP 服务器",
"command.mcp.toggle.description": "启用或禁用 MCP 服务器",
"command.agent.cycle": "切换智能体",
"command.agent.cycle.description": "切换到下一个智能体",
@@ -110,9 +110,9 @@ export const dict = {
"command.session.undo.description": "撤销上一条消息",
"command.session.redo": "重做",
"command.session.redo.description": "重做上一条撤销的消息",
"command.session.compact": "精简会话",
"command.session.compact": "压缩会话",
"command.session.compact.description": "总结会话以减少上下文大小",
"command.session.fork": "从消息分叉",
"command.session.fork": "从消息创建新会话",
"command.session.fork.description": "从之前的消息创建新会话",
"command.session.share": "分享会话",
"command.session.share.description": "分享此会话并将链接复制到剪贴板",
@@ -129,16 +129,17 @@ export const dict = {
"dialog.provider.empty": "未找到提供商",
"dialog.provider.group.popular": "热门",
"dialog.provider.group.other": "其他",
"dialog.provider.custom.label": "自定义 OpenAI 兼容提供商",
"dialog.provider.tag.recommended": "推荐",
"dialog.provider.opencode.note": "使用 OpenCode Zen 或 API 密钥连接",
"dialog.provider.opencode.note": "精选模型,包括 Claude、GPT、Gemini 等",
"dialog.provider.opencode.tagline": "可靠的优化模型",
"dialog.provider.opencodeGo.tagline": "适合所有人的低成本订阅",
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 密钥连接",
"dialog.provider.copilot.note": "使用 Copilot API 密钥连接",
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 密钥连接",
"dialog.provider.google.note": "使用 Google 账号或 API 密钥连接",
"dialog.provider.openrouter.note": "使用 OpenRouter 账号或 API 密钥连接",
"dialog.provider.vercel.note": "使用 Vercel 账号或 API 密钥连接",
"dialog.provider.anthropic.note": "直接使用 Claude 模型,包括 Pro 和 Max",
"dialog.provider.copilot.note": "通过 GitHub Copilot 使用辅助编程 AI 模型",
"dialog.provider.openai.note": "适合快速处理各类 AI 任务的 GPT 模型",
"dialog.provider.google.note": "可快速生成结构化回复的 Gemini 模型",
"dialog.provider.openrouter.note": "通过一个提供商使用所有受支持的模型",
"dialog.provider.vercel.note": "通过智能路由统一使用 AI 模型",
"dialog.model.select.title": "选择模型",
"dialog.model.search.placeholder": "搜索模型",
@@ -148,6 +149,7 @@ export const dict = {
"dialog.model.manage.provider.toggle": "切换所有 {{provider}} 模型",
"dialog.model.unpaid.freeModels.title": "OpenCode 提供的免费模型",
"dialog.model.unpaid.addMore.title": "从热门提供商添加更多模型",
"dialog.model.unpaid.viewMoreProviders": "查看另外 70 多个提供商",
"dialog.provider.viewAll": "查看更多提供商",
@@ -159,7 +161,7 @@ export const dict = {
"provider.connect.status.waiting": "等待授权...",
"provider.connect.status.failed": "授权失败:{{error}}",
"provider.connect.apiKey.description":
"输入你的 {{provider}} API 密钥以连接户,并在 OpenCode 中使用 {{provider}} 模型。",
"输入你的 {{provider}} API 密钥以连接户,并在 OpenCode 中使用 {{provider}} 模型。",
"provider.connect.apiKey.label": "{{provider}} API 密钥",
"provider.connect.apiKey.placeholder": "API 密钥",
"provider.connect.apiKey.required": "API 密钥为必填项",
@@ -170,14 +172,14 @@ export const dict = {
"provider.connect.opencodeZen.visit.suffix": " 获取你的 API 密钥。",
"provider.connect.oauth.code.visit.prefix": "访问 ",
"provider.connect.oauth.code.visit.link": "此链接",
"provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的户并在 OpenCode 中使用 {{provider}} 模型。",
"provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的户并在 OpenCode 中使用 {{provider}} 模型。",
"provider.connect.oauth.code.label": "{{method}} 授权码",
"provider.connect.oauth.code.placeholder": "授权码",
"provider.connect.oauth.code.required": "授权码为必填项",
"provider.connect.oauth.code.invalid": "授权码无效",
"provider.connect.oauth.auto.visit.prefix": "访问 ",
"provider.connect.oauth.auto.visit.link": "此链接",
"provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的户并在 OpenCode 中使用 {{provider}} 模型。",
"provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的户并在 OpenCode 中使用 {{provider}} 模型。",
"provider.connect.oauth.auto.confirmationCode": "确认码",
"provider.connect.toast.connected.title": "{{provider}} 已连接",
"provider.connect.toast.connected.description": "现在可以使用 {{provider}} 模型了。",
@@ -233,7 +235,7 @@ export const dict = {
"model.input.image": "图像",
"model.input.audio": "音频",
"model.input.video": "视频",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "支持:{{inputs}}",
"model.tooltip.context.label": "上下文",
"model.tooltip.inputs": "输入",
@@ -253,7 +255,7 @@ export const dict = {
"common.clear": "清除",
"common.connect": "连接",
"common.disconnect": "断开连接",
"common.continue": "提交",
"common.continue": "继续",
"common.submit": "提交",
"common.save": "保存",
"common.saving": "保存中...",
@@ -320,18 +322,18 @@ export const dict = {
"prompt.toast.pasteUnsupported.description": "此处仅能附加图片、PDF 或文本文件。",
"prompt.toast.modelAgentRequired.title": "请选择智能体和模型",
"prompt.toast.modelAgentRequired.description": "发送提示前请先选择智能体和模型。",
"prompt.toast.worktreeCreateFailed.title": "创建工作失败",
"prompt.toast.worktreeCreateFailed.title": "创建工作失败",
"prompt.toast.sessionCreateFailed.title": "创建会话失败",
"prompt.toast.shellSendFailed.title": "发送 shell 命令失败",
"prompt.toast.commandSendFailed.title": "发送命令失败",
"prompt.toast.promptSendFailed.title": "发送提示失败",
"prompt.toast.promptSendFailed.description": "无法获取会话",
"dialog.mcp.title": "MCPs",
"dialog.mcp.title": "MCP 服务器",
"dialog.mcp.description": "已启用 {{enabled}} / {{total}}",
"dialog.mcp.empty": "未配置 MCPs",
"dialog.mcp.empty": "未配置 MCP 服务器",
"dialog.lsp.empty": "已文件类型自动检测 LSPs",
"dialog.lsp.empty": "已根据文件类型自动检测 LSP",
"dialog.plugins.empty": "在 opencode.json 中配置的插件",
@@ -341,7 +343,7 @@ export const dict = {
"mcp.auth.clickToAuthenticate": "点击进行授权",
"mcp.status.disabled": "已禁用",
"dialog.fork.empty": "没有可用于分叉的消息",
"dialog.fork.empty": "没有可用于创建新会话的消息",
"dialog.directory.search.placeholder": "搜索文件夹",
"dialog.directory.empty": "未找到文件夹",
@@ -453,13 +455,13 @@ export const dict = {
"dialog.project.edit.icon.hint": "点击或拖拽图片",
"dialog.project.edit.icon.recommended": "建议:128x128px",
"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.description": "创建新工作区 (worktree) 后运行。",
"dialog.project.edit.worktree.startup.description": "创建新工作区 (worktree) 后运行。",
"dialog.project.edit.worktree.startup.placeholder": "例如 bun install",
"context.breakdown.title": "上下文分",
"context.breakdown.note": "输入 token 的大致分。“其他”包含工具定义和开销。",
"context.breakdown.title": "上下文分",
"context.breakdown.note": "输入令牌的大致分。“其他”包含工具定义和开销。",
"context.breakdown.system": "系统",
"context.breakdown.user": "用户",
"context.breakdown.assistant": "助手",
@@ -472,18 +474,18 @@ export const dict = {
"context.stats.provider": "提供商",
"context.stats.model": "模型",
"context.stats.limit": "上下文限制",
"context.stats.totalTokens": "总 token",
"context.stats.totalTokens": "令牌总数",
"context.stats.usage": "使用率",
"context.stats.inputTokens": "输入 token",
"context.stats.outputTokens": "输出 token",
"context.stats.reasoningTokens": "推理 token",
"context.stats.cacheTokens": "缓存 token(读/写)",
"context.stats.inputTokens": "输入令牌",
"context.stats.outputTokens": "输出令牌",
"context.stats.reasoningTokens": "推理令牌",
"context.stats.cacheTokens": "缓存令牌(读/写)",
"context.stats.userMessages": "用户消息",
"context.stats.assistantMessages": "助手消息",
"context.stats.totalCost": "总成本",
"context.stats.sessionCreated": "创建时间",
"context.stats.lastActivity": "最后活动",
"context.usage.tokens": "Token",
"context.usage.tokens": "令牌数",
"context.usage.usage": "使用率",
"context.usage.cost": "成本",
"context.usage.clickToView": "点击查看上下文",
@@ -511,7 +513,7 @@ export const dict = {
"toast.language.title": "语言",
"toast.language.description": "已切换到{{language}}",
"toast.theme.title": "主题已切换",
"toast.scheme.title": "色方案",
"toast.scheme.title": "色方案",
"toast.workspace.enabled.title": "工作区已启用",
"toast.workspace.enabled.description": "侧边栏现在显示多个工作树",
"toast.workspace.disabled.title": "工作区已禁用",
@@ -569,7 +571,7 @@ export const dict = {
"error.chain.didYouMean": "你是不是想输入:{{suggestions}}",
"error.chain.modelNotFound": "未找到模型:{{provider}}/{{model}}",
"error.chain.checkConfig": "请检查你的配置 (opencode.json) 中的 provider/model 名称",
"error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意: OpenCode 暂不支持 MCP 认证。',
"error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意OpenCode 暂不支持 MCP 认证。',
"error.chain.providerAuthFailed": "提供商认证失败({{provider}}):{{message}}",
"error.chain.providerInitFailed": '无法初始化提供商 "{{provider}}"。请检查凭据和配置。',
"error.chain.configJsonInvalid": "配置文件 {{path}} 不是有效的 JSON(C)",
@@ -607,7 +609,7 @@ export const dict = {
"home.sessions.group.today": "今天",
"home.sessions.group.yesterday": "昨天",
"home.sessions.group.older": "更早",
"home.providerTip": "连接 75 个以上的提供商,使用 Claude、GPT、Gemini 等其他模型",
"home.providerTip": "连接 75 个以上的提供商,使用包括 Claude、GPT、Gemini 在内的更多模型",
"session.tab.session": "会话",
"session.tab.review": "审查",
@@ -618,12 +620,12 @@ export const dict = {
"session.error.notFound.description": "此标签页指向的会话已不存在于此服务器上。",
"session.error.notFound.closeTab": "关闭标签页",
"session.error.serverConnection": "无法连接到此服务器",
"session.review.filesChanged": "{{count}} 个文件变更",
"session.review.filesChanged": "{{count}} 个文件已更改",
"session.review.change.one": "更改",
"session.review.change.other": "更改",
"session.review.loadingChanges": "正在加载更改...",
"session.review.empty": "此会话暂无更改",
"session.review.noVcs": "未检测到 Git 版本控制系统,无法显示更改",
"session.review.noVcs": "未检测到 Git,无法显示更改",
"session.review.noSnapshot": "配置中已禁用快照跟踪,因此会话更改不可用",
"session.review.noChanges": "无更改",
"session.review.noUncommittedChanges": "尚无未提交的更改",
@@ -641,8 +643,8 @@ export const dict = {
"session.todo.title": "待办事项",
"session.todo.collapse": "折叠",
"session.todo.expand": "展开",
"session.question.minimize": "最小化问题",
"session.question.restore": "恢复问题",
"session.question.minimize": "收起问题",
"session.question.restore": "展开问题",
"session.question.pending.one": "{{count}} 个待处理问题",
"session.question.pending.other": "{{count}} 个待处理问题",
"session.followupDock.summary.one": "{{count}} 条排队消息",
@@ -656,7 +658,7 @@ export const dict = {
"session.revertDock.collapse": "折叠已回滚消息",
"session.revertDock.expand": "展开已回滚消息",
"session.revertDock.restore": "恢复消息",
"session.new.title": "构建任何东西",
"session.new.title": "构建任何内容",
"session.new.project.new": "新建项目",
"session.new.project.search": "搜索项目",
"session.new.project.add": "添加项目",
@@ -775,8 +777,8 @@ export const dict = {
"settings.general.row.terminalFont.description": "自定义终端使用的字体",
"settings.general.row.uiFont.title": "界面字体",
"settings.general.row.uiFont.description": "自定义整个界面使用的字体",
"settings.general.row.followup.title": "跟进消息行为",
"settings.general.row.followup.description": "选择跟进提示是立即引导还是在队列中等待",
"settings.general.row.followup.title": "后续消息行为",
"settings.general.row.followup.description": "选择后续提示是立即引导当前会话还是排队等待",
"settings.general.row.followup.option.queue": "排队",
"settings.general.row.followup.option.steer": "引导",
"settings.general.row.showFileTree.title": "文件树",
@@ -791,14 +793,14 @@ export const dict = {
"settings.general.row.showStatus.description": "在标题栏中显示服务器状态按钮",
"settings.general.row.mobileTitlebarBottom.title": "底部导航",
"settings.general.row.mobileTitlebarBottom.description": "在移动设备上将标题栏和会话标签页置于屏幕底部",
"settings.general.row.showCustomAgents.title": "自定义智能体",
"settings.general.row.showCustomAgents.description": "在输入框中显示智能体选择器",
"settings.general.row.showCustomAgents.title": "显示智能体",
"settings.general.row.showCustomAgents.description": "在输入框中切换智能体。隐藏时默认使用 Build 智能体。",
"settings.general.row.reasoningSummaries.title": "显示推理摘要",
"settings.general.row.reasoningSummaries.description": "在时间线中显示模型推理摘要",
"settings.general.row.shellToolPartsExpanded.title": "展开 shell 工具部分",
"settings.general.row.shellToolPartsExpanded.description": "默认在时间线中展开 shell 工具部分",
"settings.general.row.editToolPartsExpanded.title": "展开编辑工具部分",
"settings.general.row.editToolPartsExpanded.description": "默认在时间线中展开 edit、write 和 patch 工具部分",
"settings.general.row.shellToolPartsExpanded.title": "展开 Shell 工具调用",
"settings.general.row.shellToolPartsExpanded.description": "默认在时间线中展开 Shell 工具调用详情",
"settings.general.row.editToolPartsExpanded.title": "展开编辑工具调用",
"settings.general.row.editToolPartsExpanded.description": "默认在时间线中展开 edit、write 和 patch 工具调用详情",
"settings.general.row.newInterface.title": "新布局",
"settings.general.row.newInterface.badge": "新",
"settings.general.row.newInterface.description": "使用新的标签页和主页布局。在有限时间内可在不同布局之间切换。",
@@ -806,7 +808,7 @@ export const dict = {
"settings.general.row.newInterfaceNotice.description": "之前的布局不再可用",
"settings.general.row.newInterfaceNotice.dismiss": "忽略",
"settings.general.row.pinchZoom.title": "双指缩放",
"settings.general.row.pinchZoom.description": "允许使用触控板双指捏合和 Ctrl-scroll 手势缩放",
"settings.general.row.pinchZoom.description": "允许使用触控板双指捏合和 Ctrl+滚轮手势缩放",
"settings.general.row.wayland.title": "使用原生 Wayland",
"settings.general.row.wayland.description": "在 Wayland 上禁用 X11 回退。需要重启。",
"settings.general.row.wayland.tooltip": "在混合刷新率显示器的 Linux 系统上,原生 Wayland 可能更稳定。",
@@ -835,41 +837,41 @@ export const dict = {
"sound.option.alert08": "警报 08",
"sound.option.alert09": "警报 09",
"sound.option.alert10": "警报 10",
"sound.option.bipbop01": "哔啵 01",
"sound.option.bipbop02": "哔啵 02",
"sound.option.bipbop03": "哔啵 03",
"sound.option.bipbop04": "哔啵 04",
"sound.option.bipbop05": "哔啵 05",
"sound.option.bipbop06": "哔啵 06",
"sound.option.bipbop07": "哔啵 07",
"sound.option.bipbop08": "哔啵 08",
"sound.option.bipbop09": "哔啵 09",
"sound.option.bipbop10": "哔啵 10",
"sound.option.staplebops01": "斯泰普博普斯 01",
"sound.option.staplebops02": "斯泰普博普斯 02",
"sound.option.staplebops03": "斯泰普博普斯 03",
"sound.option.staplebops04": "斯泰普博普斯 04",
"sound.option.staplebops05": "斯泰普博普斯 05",
"sound.option.staplebops06": "斯泰普博普斯 06",
"sound.option.staplebops07": "斯泰普博普斯 07",
"sound.option.nope01": " 01",
"sound.option.nope02": " 02",
"sound.option.nope03": " 03",
"sound.option.nope04": " 04",
"sound.option.nope05": " 05",
"sound.option.nope06": " 06",
"sound.option.nope07": " 07",
"sound.option.nope08": " 08",
"sound.option.nope09": " 09",
"sound.option.nope10": " 10",
"sound.option.nope11": " 11",
"sound.option.nope12": " 12",
"sound.option.yup01": " 01",
"sound.option.yup02": " 02",
"sound.option.yup03": " 03",
"sound.option.yup04": " 04",
"sound.option.yup05": " 05",
"sound.option.yup06": " 06",
"sound.option.bipbop01": "Bip-bop 01",
"sound.option.bipbop02": "Bip-bop 02",
"sound.option.bipbop03": "Bip-bop 03",
"sound.option.bipbop04": "Bip-bop 04",
"sound.option.bipbop05": "Bip-bop 05",
"sound.option.bipbop06": "Bip-bop 06",
"sound.option.bipbop07": "Bip-bop 07",
"sound.option.bipbop08": "Bip-bop 08",
"sound.option.bipbop09": "Bip-bop 09",
"sound.option.bipbop10": "Bip-bop 10",
"sound.option.staplebops01": "Staplebops 01",
"sound.option.staplebops02": "Staplebops 02",
"sound.option.staplebops03": "Staplebops 03",
"sound.option.staplebops04": "Staplebops 04",
"sound.option.staplebops05": "Staplebops 05",
"sound.option.staplebops06": "Staplebops 06",
"sound.option.staplebops07": "Staplebops 07",
"sound.option.nope01": "Nope 01",
"sound.option.nope02": "Nope 02",
"sound.option.nope03": "Nope 03",
"sound.option.nope04": "Nope 04",
"sound.option.nope05": "Nope 05",
"sound.option.nope06": "Nope 06",
"sound.option.nope07": "Nope 07",
"sound.option.nope08": "Nope 08",
"sound.option.nope09": "Nope 09",
"sound.option.nope10": "Nope 10",
"sound.option.nope11": "Nope 11",
"sound.option.nope12": "Nope 12",
"sound.option.yup01": "Yup 01",
"sound.option.yup02": "Yup 02",
"sound.option.yup03": "Yup 03",
"sound.option.yup04": "Yup 04",
"sound.option.yup05": "Yup 05",
"sound.option.yup06": "Yup 06",
"settings.general.notifications.agent.title": "智能体",
"settings.general.notifications.agent.description": "当智能体完成或需要注意时显示系统通知",
@@ -902,7 +904,7 @@ export const dict = {
"settings.shortcuts.group.prompt": "提示",
"settings.providers.title": "提供商",
"settings.providers.description": "提供商设置将在此处可配置。",
"settings.providers.description": "可在此处配置提供商设置。",
"settings.providers.section.connected": "已连接的提供商",
"settings.providers.connected.empty": "没有已连接的提供商",
"settings.providers.section.popular": "热门提供商",
@@ -912,16 +914,16 @@ export const dict = {
"settings.providers.tag.other": "其他",
"settings.models.title": "模型",
"settings.models.description": "模型设置将在此处可配置。",
"settings.models.description": "可在此处配置模型设置。",
"settings.agents.title": "智能体",
"settings.agents.description": "智能体设置将在此处可配置。",
"settings.agents.description": "可在此处配置智能体设置。",
"settings.commands.title": "命令",
"settings.commands.description": "命令设置将在此处可配置。",
"settings.commands.description": "可在此处配置命令设置。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 设置将在此处可配置。",
"settings.mcp.description": "可在此处配置 MCP 设置。",
"settings.permissions.title": "权限",
"settings.permissions.description": "控制服务器默认可以使用哪些工具。",
@@ -933,12 +935,12 @@ export const dict = {
"settings.permissions.tool.read.title": "读取",
"settings.permissions.tool.read.description": "读取文件(匹配文件路径)",
"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.description": "使用 glob 模式匹配文件",
"settings.permissions.tool.grep.title": "Grep",
"settings.permissions.tool.grep.description": "使用正则表达式搜索文件内容",
"settings.permissions.tool.list.title": "列",
"settings.permissions.tool.list.title": "列出文件",
"settings.permissions.tool.list.description": "列出目录中的文件",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "运行 shell 命令",
@@ -950,7 +952,7 @@ export const dict = {
"settings.permissions.tool.lsp.description": "运行语言服务器查询",
"settings.permissions.tool.todowrite.title": "更新待办",
"settings.permissions.tool.todowrite.description": "更新待办列表",
"settings.permissions.tool.webfetch.title": "网页获取",
"settings.permissions.tool.webfetch.title": "获取网页",
"settings.permissions.tool.webfetch.description": "从 URL 获取内容",
"settings.permissions.tool.websearch.title": "网页搜索",
"settings.permissions.tool.websearch.description": "搜索网页",
@@ -973,10 +975,10 @@ export const dict = {
"workspace.resetting.description": "这可能需要一点时间。",
"workspace.reset.failed.title": "重置工作区失败",
"workspace.reset.success.title": "工作区已重置",
"workspace.reset.success.description": "工作区已与默认分支保持一致。",
"workspace.reset.success.description": "工作区已与默认分支一致。",
"workspace.error.stillPreparing": "工作区仍在准备中",
"workspace.status.checking": "正在检查未合并的更改...",
"workspace.status.error": "无法验证 git 状态。",
"workspace.status.error": "无法验证 Git 状态。",
"workspace.status.clean": "未检测到未合并的更改。",
"workspace.status.dirty": "检测到未合并的更改。",
"workspace.delete.title": "删除工作区",
@@ -993,7 +995,7 @@ export const dict = {
"dialog.releaseNotes.action.getStarted": "开始",
"dialog.releaseNotes.action.next": "下一步",
"dialog.releaseNotes.action.hideFuture": "不再显示",
"dialog.releaseNotes.media.alt": "发布预览",
"dialog.releaseNotes.media.alt": "版本说明预览",
"toast.project.reloadFailed.title": "无法重新加载 {{project}}",
"error.server.invalidConfiguration": "配置无效",
"common.moreCountSuffix": " (还有 {{count}} 个)",
@@ -1018,6 +1020,9 @@ export const dict = {
"session.question.progress": "{{current}}/{{total}} 个问题",
"session.header.open.finder": "访达",
"session.header.open.fileExplorer": "文件资源管理器",
"session.header.reveal.finder": "在访达中显示",
"session.header.reveal.fileExplorer": "在文件资源管理器中显示",
"session.header.reveal.containingFolder": "打开所在文件夹",
"session.header.open.fileManager": "文件管理器",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
+127 -122
View File
@@ -30,23 +30,23 @@ export const dict = {
"command.project.previous": "上一個專案",
"command.project.next": "下一個專案",
"command.project.index": "切換至專案 {{index}}",
"command.provider.connect": "連提供者",
"command.provider.connect": "連提供者",
"command.server.switch": "切換伺服器",
"command.settings.open": "開啟設定",
"command.session.previous": "上一個工作階段",
"command.session.next": "下一個工作階段",
"command.session.previous.unseen": "上一個未讀會話",
"command.session.next.unseen": "下一個未讀會話",
"command.session.previous.unseen": "上一個未讀工作階段",
"command.session.next.unseen": "下一個未讀工作階段",
"command.session.archive": "封存工作階段",
"command.palette": "命令面板",
"command.theme.cycle": "循環主題",
"command.theme.cycle": "依序切換主題",
"command.theme.set": "使用主題: {{theme}}",
"command.theme.scheme.cycle": "循環配色方案",
"command.theme.scheme.cycle": "依序切換配色方案",
"command.theme.scheme.set": "使用配色方案: {{scheme}}",
"command.language.cycle": "循環語言",
"command.language.cycle": "依序切換語言",
"command.language.set": "使用語言: {{language}}",
"command.session.new": "新增工作階段",
@@ -58,9 +58,9 @@ export const dict = {
"command.input.focus": "聚焦輸入框",
"command.terminal.toggle": "切換終端機",
"command.fileTree.toggle": "切換檔案樹",
"command.review.toggle": "切換審查",
"command.review.toggle": "切換檢閱",
"command.terminal.new": "新增終端機",
"command.terminal.new.description": "建立新的終端機標籤頁",
"command.terminal.new.description": "建立新的終端機頁",
"command.steps.toggle": "切換步驟",
"command.steps.toggle.description": "顯示或隱藏目前訊息的步驟",
"command.message.previous": "上一則訊息",
@@ -71,11 +71,11 @@ export const dict = {
"command.model.choose.description": "選擇不同的模型",
"command.mcp.toggle": "切換 MCP",
"command.mcp.toggle.description": "切換 MCP",
"command.agent.cycle": "循環代理程式",
"command.agent.cycle": "切換下一個代理程式",
"command.agent.cycle.description": "切換到下一個代理程式",
"command.agent.cycle.reverse": "反向循環代理程式",
"command.agent.cycle.reverse": "切換上一個代理程式",
"command.agent.cycle.reverse.description": "切換到上一個代理程式",
"command.model.variant.cycle": "循環思考強度",
"command.model.variant.cycle": "切換思考強度",
"command.model.variant.cycle.description": "切換到下一個強度等級",
"command.prompt.mode.shell": "Shell",
"command.prompt.mode.normal": "Prompt",
@@ -88,7 +88,7 @@ export const dict = {
"command.session.redo": "重做",
"command.session.redo.description": "重做上一則復原的訊息",
"command.session.compact": "精簡工作階段",
"command.session.compact.description": "總結工作階段以減少上下文大小",
"command.session.compact.description": "摘要工作階段以減少上下文大小",
"command.session.fork": "從訊息分支",
"command.session.fork.description": "從先前的訊息建立新工作階段",
"command.session.share": "分享工作階段",
@@ -106,13 +106,14 @@ export const dict = {
"dialog.provider.empty": "找不到提供者",
"dialog.provider.group.popular": "熱門",
"dialog.provider.group.other": "其他",
"dialog.provider.custom.label": "自訂 OpenAI 相容提供者",
"dialog.provider.tag.recommended": "推薦",
"dialog.provider.opencode.note": "精選模型,包含 Claude、GPT、Gemini 等等",
"dialog.provider.opencode.tagline": "可靠的優化模型",
"dialog.provider.opencode.tagline": "經過最佳化的可靠模型",
"dialog.provider.opencodeGo.tagline": "適合所有人的低成本訂閱",
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 金鑰連線",
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 金鑰連線",
"dialog.provider.copilot.note": "使用 Copilot API 金鑰連線",
"dialog.provider.anthropic.note": "直接存取 Claude 模型,包括 Pro 和 Max",
"dialog.provider.openai.note": "適合快速且功能強大的通用 AI 工作之 GPT 模型",
"dialog.provider.copilot.note": "透過 GitHub Copilot 使用程式設計輔助 AI 模型",
"dialog.provider.google.note": "Gemini 模型,提供快速且結構化的回應",
"dialog.provider.openrouter.note": "從單一提供者存取所有支援的模型",
"dialog.provider.vercel.note": "透過智慧路由統一存取 AI 模型",
@@ -126,6 +127,7 @@ export const dict = {
"dialog.model.unpaid.freeModels.title": "OpenCode 提供的免費模型",
"dialog.model.unpaid.addMore.title": "從熱門提供者新增更多模型",
"dialog.model.unpaid.viewMoreProviders": "查看另外 70 多個提供者",
"dialog.provider.viewAll": "查看更多提供者",
@@ -161,16 +163,16 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} 已連線",
"provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。",
"provider.custom.title": "自訂提供",
"provider.custom.description.prefix": "設定與 OpenAI 相容的提供。請參閱",
"provider.custom.description.link": "提供設定文件",
"provider.custom.title": "自訂提供",
"provider.custom.description.prefix": "設定與 OpenAI 相容的提供。請參閱",
"provider.custom.description.link": "提供設定文件",
"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.description": "使用小寫字母、數字、連字號或底線",
"provider.custom.field.name.label": "顯示名稱",
"provider.custom.field.name.placeholder": "我的 AI 提供",
"provider.custom.field.baseURL.label": "基 URL",
"provider.custom.field.name.placeholder": "我的 AI 提供",
"provider.custom.field.baseURL.label": "基 URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API 金鑰",
"provider.custom.field.apiKey.placeholder": "API 金鑰",
@@ -189,11 +191,11 @@ export const dict = {
"provider.custom.headers.value.placeholder": "value",
"provider.custom.headers.remove": "移除標頭",
"provider.custom.headers.add": "新增標頭",
"provider.custom.error.providerID.required": "提供 ID 為必填",
"provider.custom.error.providerID.required": "提供 ID 為必填",
"provider.custom.error.providerID.format": "請使用小寫字母、數字、連字號或底線",
"provider.custom.error.providerID.exists": "該提供 ID 已存在",
"provider.custom.error.providerID.exists": "該提供 ID 已存在",
"provider.custom.error.name.required": "顯示名稱為必填",
"provider.custom.error.baseURL.required": "基 URL 為必填",
"provider.custom.error.baseURL.required": "基 URL 為必填",
"provider.custom.error.baseURL.format": "必須以 http:// 或 https:// 開頭",
"provider.custom.error.required": "必填",
"provider.custom.error.duplicate": "重複",
@@ -212,12 +214,12 @@ export const dict = {
"model.input.image": "圖片",
"model.input.audio": "音訊",
"model.input.video": "影片",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "支援: {{inputs}}",
"model.tooltip.context.label": "上下文",
"model.tooltip.inputs": "輸入",
"model.tooltip.model": "模型",
"model.tooltip.provider": "供應商",
"model.tooltip.provider": "提供者",
"model.tooltip.reasoning": "推理",
"model.tooltip.reasoning.allowed": "支援推理",
"model.tooltip.reasoning.none": "不支援推理",
@@ -231,7 +233,7 @@ export const dict = {
"common.clear": "清除",
"common.connect": "連線",
"common.disconnect": "中斷連線",
"common.continue": "提交",
"common.continue": "繼續",
"common.submit": "提交",
"common.save": "儲存",
"common.saving": "儲存中...",
@@ -239,10 +241,10 @@ export const dict = {
"common.attachment": "附件",
"prompt.placeholder.shell": "輸入 shell 命令... {{example}}",
"prompt.placeholder.normal": '隨便問點什麼... "{{example}}"',
"prompt.placeholder.simple": "隨便問點什麼...",
"prompt.placeholder.summarizeComments": "摘要評論…",
"prompt.placeholder.summarizeComment": "摘要這則評論…",
"prompt.placeholder.normal": "想問什麼都可以…「{{example}}」",
"prompt.placeholder.simple": "想問什麼都可以…",
"prompt.placeholder.summarizeComments": "摘要留言…",
"prompt.placeholder.summarizeComment": "摘要這則留言…",
"prompt.mode.shell": "Shell",
"prompt.mode.normal": "Prompt",
"prompt.mode.shell.exit": "按 esc 退出",
@@ -250,30 +252,30 @@ export const dict = {
"session.child.backToParent": "返回主要工作階段。",
"prompt.example.1": "修復程式碼庫中的一個 TODO",
"prompt.example.2": "這個專案的技術堆疊是什麼?",
"prompt.example.2": "這個專案的技術堆疊是什麼",
"prompt.example.3": "修復失敗的測試",
"prompt.example.4": "解釋驗證是如何運作的",
"prompt.example.5": "尋找並修復安全漏洞",
"prompt.example.6": "為使用者服務新增單元測試",
"prompt.example.7": "重構這個函式,讓它更易讀",
"prompt.example.8": "這個錯誤是什麼意思?",
"prompt.example.8": "這個錯誤是什麼意思",
"prompt.example.9": "幫我偵錯這個問題",
"prompt.example.10": "產生 API 文件",
"prompt.example.11": "最佳化資料庫查詢",
"prompt.example.12": "新增輸入驗證",
"prompt.example.13": "建立一個新的元件用於...",
"prompt.example.14": "我該如何部署這個專案?",
"prompt.example.15": "審查我的程式碼並給出最佳實務建議",
"prompt.example.14": "我該如何部署這個專案",
"prompt.example.15": "檢閱我的程式碼並提供最佳實務建議",
"prompt.example.16": "為這個函式新增錯誤處理",
"prompt.example.17": "解釋這個正規表示式",
"prompt.example.18": "把它轉換成 TypeScript",
"prompt.example.19": "在整個程式碼庫中新增日誌",
"prompt.example.20": "哪些相依性已經過期?",
"prompt.example.19": "在整個程式碼庫中加入記錄功能",
"prompt.example.20": "哪些相依性已經過期",
"prompt.example.21": "幫我寫一個遷移腳本",
"prompt.example.22": "為這個端點實作快取",
"prompt.example.23": "給這個清單新增分頁",
"prompt.example.23": "為這份清單加入分頁功能",
"prompt.example.24": "建立一個 CLI 命令用於...",
"prompt.example.25": "這裡的環境變數是怎麼運作的?",
"prompt.example.25": "這裡的環境變數是怎麼運作的",
"prompt.popover.emptyResults": "沒有符合的結果",
"prompt.popover.emptyCommands": "沒有符合的命令",
@@ -312,13 +314,13 @@ export const dict = {
"dialog.mcp.description": "已啟用 {{enabled}} / {{total}}",
"dialog.mcp.empty": "未設定 MCP",
"dialog.lsp.empty": "已從檔案類型自動偵測 LSPs",
"dialog.lsp.empty": "會根據檔案類型自動偵測 LSP",
"dialog.plugins.empty": "在 opencode.json 中設定的外掛程式",
"mcp.status.connected": "已連線",
"mcp.status.failed": "失敗",
"mcp.status.needs_auth": "需要授權",
"mcp.auth.clickToAuthenticate": "點擊以進行授權",
"mcp.auth.clickToAuthenticate": "按一下以進行授權",
"mcp.status.disabled": "已停用",
"dialog.fork.empty": "沒有可用於分支的訊息",
@@ -334,7 +336,7 @@ export const dict = {
"dialog.server.title": "伺服器",
"dialog.server.description": "切換此應用程式連線的 OpenCode 伺服器。",
"dialog.server.search.placeholder": "搜尋伺服器",
"dialog.server.empty": "無伺服器",
"dialog.server.empty": "無伺服器",
"dialog.server.add.title": "新增伺服器",
"dialog.server.add.url": "伺服器 URL",
"dialog.server.add.placeholder": "http://localhost:4096",
@@ -347,7 +349,7 @@ export const dict = {
"dialog.server.add.password": "密碼(選填)",
"dialog.server.edit.title": "編輯伺服器",
"dialog.server.default.title": "預設伺服器",
"dialog.server.default.description": "應用程式啟動時連線此伺服器,而不是啟動本伺服器。需要重新啟動。",
"dialog.server.default.description": "應用程式啟動時連線此伺服器,而不是啟動本伺服器。需要重新啟動。",
"dialog.server.default.none": "未選擇伺服器",
"dialog.server.default.set": "將目前伺服器設為預設",
"dialog.server.default.clear": "清除",
@@ -431,7 +433,7 @@ export const dict = {
"dialog.project.edit.name": "名稱",
"dialog.project.edit.icon": "圖示",
"dialog.project.edit.icon.alt": "專案圖示",
"dialog.project.edit.icon.hint": "點擊或拖曳圖片",
"dialog.project.edit.icon.hint": "按一下或拖曳圖片",
"dialog.project.edit.icon.recommended": "建議:128x128px",
"dialog.project.edit.color": "顏色",
"dialog.project.edit.color.select": "選擇{{color}}顏色",
@@ -439,11 +441,11 @@ export const dict = {
"dialog.project.edit.worktree.startup": "工作區啟動腳本",
"dialog.project.edit.worktree.startup.description": "在建立新的工作區 (worktree) 後執行。",
"dialog.project.edit.worktree.startup.placeholder": "例如 bun install",
"context.breakdown.title": "上下文分",
"context.breakdown.note": "輸入 token 的大致拆分。「其他」包含工具定義和額外開銷。",
"context.breakdown.title": "上下文分",
"context.breakdown.note": "輸入 token 的概略細分。「其他」包含工具定義和額外負擔。",
"context.breakdown.system": "系統",
"context.breakdown.user": "使用者",
"context.breakdown.assistant": "助",
"context.breakdown.assistant": "助",
"context.breakdown.tool": "工具呼叫",
"context.breakdown.other": "其他",
@@ -462,7 +464,7 @@ export const dict = {
"context.stats.reasoningTokens": "推理 token",
"context.stats.cacheTokens": "快取 token(讀/寫)",
"context.stats.userMessages": "使用者訊息",
"context.stats.assistantMessages": "助訊息",
"context.stats.assistantMessages": "助訊息",
"context.stats.totalCost": "總成本",
"context.stats.sessionCreated": "建立時間",
"context.stats.lastActivity": "最後活動",
@@ -470,7 +472,7 @@ export const dict = {
"context.usage.tokens": "Token",
"context.usage.usage": "使用量",
"context.usage.cost": "成本",
"context.usage.clickToView": "點擊查看上下文",
"context.usage.clickToView": "按一下以檢視上下文",
"context.usage.view": "檢視上下文用量",
"language.en": "English",
@@ -496,7 +498,7 @@ export const dict = {
"toast.language.description": "已切換到 {{language}}",
"toast.theme.title": "主題已切換",
"toast.scheme.title": "色方案",
"toast.scheme.title": "色方案",
"toast.workspace.enabled.title": "工作區已啟用",
"toast.workspace.enabled.description": "側邊欄現在顯示多個工作樹",
@@ -504,12 +506,12 @@ export const dict = {
"toast.workspace.disabled.description": "側邊欄只顯示主工作樹",
"toast.permissions.autoaccept.on.title": "正在自動接受權限",
"toast.permissions.autoaccept.on.description": "權限求將自動准",
"toast.permissions.autoaccept.on.description": "權限求將自動准",
"toast.permissions.autoaccept.off.title": "已停止自動接受權限",
"toast.permissions.autoaccept.off.description": "權限求將需要准",
"toast.permissions.autoaccept.off.description": "權限求將需要准",
"toast.model.none.title": "未選擇模型",
"toast.model.none.description": "請先連線提供者以總結此工作階段",
"toast.model.none.description": "請先連線提供者以摘要此工作階段",
"toast.file.loadFailed.title": "載入檔案失敗",
@@ -541,7 +543,7 @@ export const dict = {
"error.page.action.restart": "重新啟動",
"error.page.action.report": "回報錯誤",
"error.page.action.reported": "已回報錯誤",
"error.page.action.exportLogs": "匯出日誌",
"error.page.action.exportLogs": "匯出記錄檔",
"error.page.action.checking": "檢查中...",
"error.page.action.checkUpdates": "檢查更新",
"error.page.action.updateTo": "更新到 {{version}}",
@@ -549,9 +551,9 @@ export const dict = {
"error.page.report.discord": "在 Discord 上",
"error.page.version": "版本: {{version}}",
"error.dev.rootNotFound": "找不到根元素。你是不是忘了把它新增到 index.html? 或者 id 屬性拼錯了?",
"error.dev.rootNotFound": "找不到根元素。你是不是忘了把它新增到 index.html或者 id 屬性拼錯了",
"error.serverSync.connectFailed": "無法連線到伺服器。是否有伺服器正在 `{{url}}` 執行?",
"error.serverSync.connectFailed": "無法連線到伺服器。是否有伺服器正在 `{{url}}` 執行",
"directory.error.invalidUrl": "URL 中的目錄無效。",
"error.chain.unknown": "未知錯誤",
@@ -563,8 +565,8 @@ export const dict = {
"error.chain.didYouMean": "你是不是想輸入: {{suggestions}}",
"error.chain.modelNotFound": "找不到模型: {{provider}}/{{model}}",
"error.chain.checkConfig": "請檢查你的設定 (opencode.json) 中的 provider/model 名稱",
"error.chain.mcpFailed": 'MCP 伺服器 "{{name}}" 啟動失敗。注意: OpenCode 不支援 MCP 證。',
"error.chain.providerAuthFailed": "提供者證失敗 ({{provider}}): {{message}}",
"error.chain.mcpFailed": "MCP 伺服器{{name}}啟動失敗。注意OpenCode 不支援 MCP 證。",
"error.chain.providerAuthFailed": "提供者證失敗{{provider}}):{{message}}",
"error.chain.providerInitFailed": '無法初始化提供者 "{{provider}}"。請檢查憑證和設定。',
"error.chain.configJsonInvalid": "設定檔 {{path}} 不是有效的 JSON(C)",
"error.chain.configJsonInvalidWithMessage": "設定檔 {{path}} 不是有效的 JSON(C): {{message}}",
@@ -586,7 +588,7 @@ export const dict = {
"home.recentProjects": "最近專案",
"home.empty.title": "沒有最近專案",
"home.empty.description": "透過開啟本專案開始使用",
"home.empty.description": "開啟本專案開始使用",
"home.title": "首頁",
"home.projects": "專案",
"home.project.add": "新增專案",
@@ -602,13 +604,13 @@ export const dict = {
"home.sessions.group.today": "今天",
"home.sessions.group.yesterday": "昨天",
"home.sessions.group.older": "更早",
"home.providerTip": "連 75 個以上的供應商,使用 Claude、GPT、Gemini 等其他模型",
"home.providerTip": "連 75 個以上的提供者,使用 Claude、GPT、Gemini 等其他模型",
"session.tab.session": "工作階段",
"session.tab.review": "審查",
"session.tab.review": "檢閱",
"session.tab.context": "上下文",
"session.tab.unknown": "未知的工作階段",
"session.panel.reviewAndFiles": "審查與檔案",
"session.panel.reviewAndFiles": "檢閱與檔案",
"session.error.notFound": "找不到此工作階段",
"session.error.notFound.description": "此分頁指向的工作階段已不存在於此伺服器。",
"session.error.notFound.closeTab": "關閉分頁",
@@ -617,7 +619,7 @@ export const dict = {
"session.review.change.one": "變更",
"session.review.change.other": "變更",
"session.review.loadingChanges": "正在載入變更...",
"session.review.empty": "此工作階段無變更",
"session.review.empty": "此工作階段無變更",
"session.review.noChanges": "沒有變更",
"session.review.noUncommittedChanges": "尚無未提交的變更",
"session.review.noBranchChanges": "尚無分支變更",
@@ -635,7 +637,7 @@ export const dict = {
"session.messages.jumpToLatest": "跳到最新",
"session.context.addToContext": "將 {{selection}} 新增到上下文",
"session.todo.title": "待辦事項",
"session.todo.collapse": "折疊",
"session.todo.collapse": "收合",
"session.todo.expand": "展開",
"session.question.minimize": "最小化問題",
"session.question.restore": "還原問題",
@@ -647,13 +649,13 @@ export const dict = {
"session.followupDock.edit": "編輯",
"session.followupDock.collapse": "收合佇列訊息",
"session.followupDock.expand": "展開佇列訊息",
"session.revertDock.summary.one": "{{count}} 則已回復訊息",
"session.revertDock.summary.other": "{{count}} 則已回復訊息",
"session.revertDock.collapse": "收合已回復訊息",
"session.revertDock.expand": "展開已回復訊息",
"session.revertDock.summary.one": "{{count}} 則已還原的訊息",
"session.revertDock.summary.other": "{{count}} 則已還原的訊息",
"session.revertDock.collapse": "收合已還原的訊息",
"session.revertDock.expand": "展開已還原的訊息",
"session.revertDock.restore": "還原訊息",
"session.new.title": "建構任何東西",
"session.new.title": "實現任何想法",
"session.new.project.new": "新專案",
"session.new.project.search": "搜尋專案",
"session.new.project.add": "新增專案",
@@ -706,7 +708,7 @@ export const dict = {
"terminal.connectionLost.title": "連線中斷",
"terminal.connectionLost.description": "終端機連線已中斷。這可能會在伺服器重新啟動時發生。",
"common.closeTab": "關閉標籤頁",
"common.closeTab": "關閉頁",
"common.dismiss": "忽略",
"common.requestFailed": "要求失敗",
"common.moreOptions": "更多選項",
@@ -832,41 +834,41 @@ export const dict = {
"sound.option.alert08": "警報 08",
"sound.option.alert09": "警報 09",
"sound.option.alert10": "警報 10",
"sound.option.bipbop01": "嗶啵 01",
"sound.option.bipbop02": "嗶啵 02",
"sound.option.bipbop03": "嗶啵 03",
"sound.option.bipbop04": "嗶啵 04",
"sound.option.bipbop05": "嗶啵 05",
"sound.option.bipbop06": "嗶啵 06",
"sound.option.bipbop07": "嗶啵 07",
"sound.option.bipbop08": "嗶啵 08",
"sound.option.bipbop09": "嗶啵 09",
"sound.option.bipbop10": "嗶啵 10",
"sound.option.staplebops01": "斯泰普博普斯 01",
"sound.option.staplebops02": "斯泰普博普斯 02",
"sound.option.staplebops03": "斯泰普博普斯 03",
"sound.option.staplebops04": "斯泰普博普斯 04",
"sound.option.staplebops05": "斯泰普博普斯 05",
"sound.option.staplebops06": "斯泰普博普斯 06",
"sound.option.staplebops07": "斯泰普博普斯 07",
"sound.option.nope01": " 01",
"sound.option.nope02": " 02",
"sound.option.nope03": " 03",
"sound.option.nope04": " 04",
"sound.option.nope05": " 05",
"sound.option.nope06": " 06",
"sound.option.nope07": " 07",
"sound.option.nope08": " 08",
"sound.option.nope09": " 09",
"sound.option.nope10": " 10",
"sound.option.nope11": " 11",
"sound.option.nope12": " 12",
"sound.option.yup01": " 01",
"sound.option.yup02": " 02",
"sound.option.yup03": " 03",
"sound.option.yup04": " 04",
"sound.option.yup05": " 05",
"sound.option.yup06": " 06",
"sound.option.bipbop01": "Bip-bop 01",
"sound.option.bipbop02": "Bip-bop 02",
"sound.option.bipbop03": "Bip-bop 03",
"sound.option.bipbop04": "Bip-bop 04",
"sound.option.bipbop05": "Bip-bop 05",
"sound.option.bipbop06": "Bip-bop 06",
"sound.option.bipbop07": "Bip-bop 07",
"sound.option.bipbop08": "Bip-bop 08",
"sound.option.bipbop09": "Bip-bop 09",
"sound.option.bipbop10": "Bip-bop 10",
"sound.option.staplebops01": "Staplebops 01",
"sound.option.staplebops02": "Staplebops 02",
"sound.option.staplebops03": "Staplebops 03",
"sound.option.staplebops04": "Staplebops 04",
"sound.option.staplebops05": "Staplebops 05",
"sound.option.staplebops06": "Staplebops 06",
"sound.option.staplebops07": "Staplebops 07",
"sound.option.nope01": "Nope 01",
"sound.option.nope02": "Nope 02",
"sound.option.nope03": "Nope 03",
"sound.option.nope04": "Nope 04",
"sound.option.nope05": "Nope 05",
"sound.option.nope06": "Nope 06",
"sound.option.nope07": "Nope 07",
"sound.option.nope08": "Nope 08",
"sound.option.nope09": "Nope 09",
"sound.option.nope10": "Nope 10",
"sound.option.nope11": "Nope 11",
"sound.option.nope12": "Nope 12",
"sound.option.yup01": "Yup 01",
"sound.option.yup02": "Yup 02",
"sound.option.yup03": "Yup 03",
"sound.option.yup04": "Yup 04",
"sound.option.yup05": "Yup 05",
"sound.option.yup06": "Yup 06",
"settings.general.notifications.agent.title": "代理程式",
"settings.general.notifications.agent.description": "當代理程式完成或需要注意時顯示系統通知",
"settings.general.notifications.permissions.title": "權限",
@@ -901,11 +903,11 @@ export const dict = {
"settings.providers.title": "提供者",
"settings.providers.description": "提供者設定將在此處可設定。",
"settings.providers.section.connected": "已連線的提供",
"settings.providers.connected.empty": "沒有已連線的提供",
"settings.providers.section.popular": "熱門提供",
"settings.providers.section.connected": "已連線的提供",
"settings.providers.connected.empty": "沒有已連線的提供",
"settings.providers.section.popular": "熱門提供",
"settings.providers.tag.environment": "環境",
"settings.providers.tag.config": "配置",
"settings.providers.tag.config": "設定",
"settings.providers.tag.custom": "自訂",
"settings.providers.tag.other": "其他",
"settings.models.title": "模型",
@@ -957,11 +959,11 @@ export const dict = {
"session.delete.failed.title": "刪除工作階段失敗",
"session.delete.title": "刪除工作階段",
"session.delete.confirm": '刪除工作階段 "{{name}}"?',
"session.delete.confirm": "要刪除工作階段{{name}}」嗎?",
"session.delete.button": "刪除工作階段",
"workspace.new": "新增工作區",
"workspace.type.local": "本",
"workspace.type.local": "本",
"workspace.type.sandbox": "沙盒",
"workspace.create.failed.title": "建立工作區失敗",
"workspace.delete.failed.title": "刪除工作區失敗",
@@ -969,27 +971,27 @@ export const dict = {
"workspace.resetting.description": "這可能需要一點時間。",
"workspace.reset.failed.title": "重設工作區失敗",
"workspace.reset.success.title": "工作區已重設",
"workspace.reset.success.description": "工作區與預設分支保持一致。",
"workspace.reset.success.description": "工作區現在與預設分支一致。",
"workspace.error.stillPreparing": "工作區仍在準備中",
"workspace.status.checking": "正在檢查未合併的變更...",
"workspace.status.error": "無法驗證 git 狀態。",
"workspace.status.error": "無法驗證 Git 狀態。",
"workspace.status.clean": "未偵測到未合併的變更。",
"workspace.status.dirty": "偵測到未合併的變更。",
"workspace.delete.title": "刪除工作區",
"workspace.delete.confirm": '刪除工作區 "{{name}}"?',
"workspace.delete.confirm": "要刪除工作區{{name}}」嗎?",
"workspace.delete.button": "刪除工作區",
"workspace.reset.title": "重設工作區",
"workspace.reset.confirm": '重設工作區 "{{name}}"?',
"workspace.reset.confirm": "要重設工作區{{name}}」嗎?",
"workspace.reset.button": "重設工作區",
"workspace.reset.archived.none": "不會封存任何作用中工作階段。",
"workspace.reset.archived.one": "將封存 1 個工作階段。",
"workspace.reset.archived.many": "將封存 {{count}} 個工作階段。",
"workspace.reset.note": "這將把工作區重設為與預設分支一致。",
"common.open": "開",
"common.open": "開",
"dialog.releaseNotes.action.getStarted": "開始",
"dialog.releaseNotes.action.next": "下一步",
"dialog.releaseNotes.action.hideFuture": "不再顯示",
"dialog.releaseNotes.media.alt": "發佈預覽",
"dialog.releaseNotes.media.alt": "版本預覽",
"toast.project.reloadFailed.title": "無法重新載入 {{project}}",
"error.server.invalidConfiguration": "無效的設定",
"common.moreCountSuffix": " (還有 {{count}} 個)",
@@ -998,7 +1000,7 @@ export const dict = {
"common.time.hoursAgo.short": "{{count}}小時前",
"common.time.daysAgo.short": "{{count}}天前",
"settings.providers.connected.environmentDescription": "已從環境變數連線",
"settings.providers.custom.description": "透過基 URL 新增與 OpenAI 相容的提供者。",
"settings.providers.custom.description": "透過基 URL 新增與 OpenAI 相容的提供者。",
"app.server.unreachable": "無法連線至 {{server}}",
"app.server.retrying": "正在自動重試...",
@@ -1014,6 +1016,9 @@ export const dict = {
"session.question.progress": "{{current}}/{{total}} 個問題",
"session.header.open.finder": "Finder",
"session.header.open.fileExplorer": "檔案總管",
"session.header.reveal.finder": "在 Finder 中顯示",
"session.header.reveal.fileExplorer": "在檔案總管中顯示",
"session.header.reveal.containingFolder": "開啟所在的檔案夾",
"session.header.open.fileManager": "檔案管理員",
"session.header.open.app.vscode": "VS Code",
"session.header.open.app.cursor": "Cursor",
@@ -1033,11 +1038,11 @@ export const dict = {
"debugBar.nav.label": "NAV",
"debugBar.nav.tip": "最後一次完成的涉及工作階段頁面的路由轉換,從路由器啟動到穩定後的第一次繪製。",
"debugBar.fps.label": "FPS",
"debugBar.fps.tip": "過去 5 秒內的滾動幀率。",
"debugBar.fps.tip": "過去 5 秒內的移動影格率。",
"debugBar.frame.label": "FRAME",
"debugBar.frame.tip": "過去 5 秒內最差的時間。",
"debugBar.frame.tip": "過去 5 秒內最差的影格時間。",
"debugBar.jank.label": "JANK",
"debugBar.jank.tip": "過去 5 秒內超過 32ms 的。",
"debugBar.jank.tip": "過去 5 秒內超過 32ms 的影格。",
"debugBar.long.label": "LONG",
"debugBar.long.tip": "過去 5 秒內的阻塞時間和長任務計數。最大任務:{{max}}。",
"debugBar.delay.label": "DELAY",
+1 -1
View File
@@ -27,4 +27,4 @@ export {
type WslServersState,
} from "./wsl/types"
export { ServerConnection } from "./context/server"
export { handleNotificationClick } from "./utils/notification-click"
export { createDraftStore, type DraftStore } from "./utils/draft-store"
@@ -63,6 +63,7 @@ export function DirectoryDataProvider(
<DataProvider
data={sync().data}
directory={directory}
sessionID={params.id}
onNavigateToSession={(sessionID: string) => navigate(href(sessionID))}
onSessionHref={href}
>
+1 -1
View File
@@ -354,7 +354,7 @@ export const ErrorPage: Component<ErrorPageProps> = (props) => {
<button
type="button"
class="flex items-center text-text-interactive-base gap-1"
onClick={() => platform.openLink("https://opencode.ai/desktop-feedback")}
onClick={() => platform.openExternal("https://opencode.ai/desktop-feedback")}
>
<div>{language.t("error.page.report.discord")}</div>
<Icon name="discord" class="text-text-interactive-base" />
@@ -120,7 +120,7 @@ export function createHomeProjectsController(home: HomeController) {
},
utility: {
settings: openSettings,
help: () => platform.openLink("https://opencode.ai/desktop-feedback"),
help: () => platform.openExternal("https://opencode.ai/desktop-feedback"),
},
}
}
@@ -1,7 +1,6 @@
import type { Session } from "@opencode-ai/sdk/v2/client"
import { preloadMarkdown } from "@opencode-ai/session-ui/markdown-cache"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { useMarked } from "@opencode-ai/ui/context/marked"
import { useQuery } from "@tanstack/solid-query"
import { DateTime } from "luxon"
import { type Accessor, createEffect, createMemo, createRoot, type JSX, startTransition } from "solid-js"
@@ -44,7 +43,6 @@ export function createHomeSessionsController(home: HomeController) {
const command = useCommand()
const dialog = useDialog()
const language = useLanguage()
const marked = useMarked()
const projectDirectories = createMemo(() => {
const project = home.project.selected()
if (!project) return home.project.list().flatMap(directories)
@@ -119,7 +117,7 @@ export function createHomeSessionsController(home: HomeController) {
(ctx.sync.session.data.message[record.session.id] ?? []).flatMap((message) =>
(ctx.sync.session.data.part[message.id] ?? []).flatMap((part) => {
if (part.type !== "text" || !part.text) return []
return preloadMarkdown(part.text, part.id, marked)
return preloadMarkdown(part.text, part.id)
}),
),
),
-4
View File
@@ -1,17 +1,13 @@
import { createEffect, Suspense, type ParentProps } from "solid-js"
import { createStore } from "solid-js/store"
import { useNavigate } from "@solidjs/router"
import { DebugBar } from "@/components/debug-bar"
import { TabsInfoPopup } from "@/components/help-button"
import { Titlebar, type TitlebarUpdate } from "@/components/titlebar"
import { usePlatform } from "@/context/platform"
import { setNavigate } from "@/utils/notification-click"
import { setV2Toast, ToastRegion } from "@/utils/toast"
export default function NewLayout(props: ParentProps) {
const platform = usePlatform()
const navigate = useNavigate()
setNavigate(navigate)
const [state, setState] = createStore({ debugTools: true })
createEffect(() => setV2Toast(true))
+18 -19
View File
@@ -44,7 +44,6 @@ import { Binary } from "@opencode-ai/core/util/binary"
import { retry } from "@opencode-ai/core/util/retry"
import { playSoundById } from "@/utils/sound"
import { createAim } from "@/utils/aim"
import { setNavigate } from "@/utils/notification-click"
import { Worktree as WorktreeState } from "@/utils/worktree"
import { setSessionHandoff } from "@/pages/session/handoff"
import { SessionRouteKey, SessionStateKey } from "@/utils/server-scope"
@@ -117,7 +116,6 @@ export default function LegacyLayout(props: ParentProps) {
const notification = useNotification()
const permission = usePermission()
const navigate = useNavigate()
setNavigate(navigate)
const providers = useProviders(() => undefined)
const dialog = useDialog()
const command = useCommand()
@@ -448,13 +446,13 @@ export default function LegacyLayout(props: ParentProps) {
void playSoundById(settings.sounds.permissions())
}
if (settings.notifications.permissions()) {
void platform.notify(title, description, href)
void platform.notify(title, description, () => navigate(href))
}
}
if (e.details.type === "question.asked") {
if (settings.notifications.agent()) {
void platform.notify(title, description, href)
void platform.notify(title, description, () => navigate(href))
}
}
@@ -2251,7 +2249,7 @@ export default function LegacyLayout(props: ParentProps) {
settingsKeybind={() => command.keybind("settings.open")}
onOpenSettings={openSettings}
helpLabel={() => language.t("sidebar.help")}
onOpenHelp={() => platform.openLink("https://opencode.ai/desktop-feedback")}
onOpenHelp={() => platform.openExternal("https://opencode.ai/desktop-feedback")}
renderPanel={() =>
mobile ? <SidebarPanel project={currentProject} mobile /> : <SidebarPanel project={currentProject} merged />
}
@@ -2280,7 +2278,7 @@ export default function LegacyLayout(props: ParentProps) {
data-component="sidebar-nav-desktop"
classList={{
"hidden xl:block": true,
"absolute inset-y-0 left-0": true,
"absolute inset-y-0 start-0": true,
"z-10": true,
}}
style={{ width: `${side()}px` }}
@@ -2303,7 +2301,7 @@ export default function LegacyLayout(props: ParentProps) {
<Show when={layout.sidebar.opened()}>
<div
class="hidden xl:block absolute inset-y-0 z-30 w-0 overflow-visible"
style={{ left: `${side()}px` }}
style={{ "inset-inline-start": `${side()}px` }}
onPointerDown={() => setState("sizing", true)}
>
<ResizeHandle
@@ -2322,8 +2320,8 @@ export default function LegacyLayout(props: ParentProps) {
</Show>
<div
class="hidden xl:block pointer-events-none absolute top-0 right-0 z-0 border-t border-border-weaker-base"
style={{ left: "calc(4rem + 12px)" }}
class="hidden xl:block pointer-events-none absolute top-0 end-0 z-0 border-t border-border-weaker-base"
style={{ "inset-inline-start": "calc(4rem + 12px)" }}
/>
<div class="xl:hidden">
@@ -2341,9 +2339,9 @@ export default function LegacyLayout(props: ParentProps) {
aria-label={language.t("sidebar.nav.projectsAndSessions")}
data-component="sidebar-nav-mobile"
classList={{
"@container fixed top-10 bottom-0 left-0 z-50 w-full max-w-[400px] overflow-hidden border-r border-border-weaker-base bg-background-base transition-transform duration-200 ease-out": true,
"@container fixed top-10 bottom-0 start-0 z-50 w-full max-w-[400px] overflow-hidden border-e border-border-weaker-base bg-background-base transition-transform duration-200 ease-out": true,
"translate-x-0": layout.mobileSidebar.opened(),
"-translate-x-full": !layout.mobileSidebar.opened(),
"ltr:-translate-x-full rtl:translate-x-full": !layout.mobileSidebar.opened(),
}}
onClick={(e) => e.stopPropagation()}
>
@@ -2354,9 +2352,9 @@ export default function LegacyLayout(props: ParentProps) {
<div
classList={{
"absolute inset-0": true,
"xl:inset-y-0 xl:right-0 xl:left-[var(--main-left)]": true,
"xl:inset-y-0 xl:end-0 xl:start-[var(--main-left)]": true,
"z-20": true,
"transition-[left] duration-200 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-[left] motion-reduce:transition-none":
"transition-[inset-inline-start] duration-200 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-[inset-inline-start] motion-reduce:transition-none":
!state.sizing,
}}
style={{
@@ -2365,7 +2363,7 @@ export default function LegacyLayout(props: ParentProps) {
>
<main
classList={{
"size-full overflow-x-hidden flex flex-col items-start contain-strict border-t border-border-weak-base bg-background-base xl:border-l xl:rounded-tl-[12px]": true,
"size-full overflow-x-hidden flex flex-col items-start contain-strict border-t border-border-weak-base bg-background-base xl:border-s xl:rounded-ss-[12px]": true,
}}
>
<Show when={!autoselecting.loading} fallback={<div class="size-full" />}>
@@ -2376,9 +2374,10 @@ export default function LegacyLayout(props: ParentProps) {
<div
classList={{
"hidden xl:flex absolute inset-y-0 left-16 z-30": true,
"hidden xl:flex absolute inset-y-0 start-16 z-30": true,
"opacity-100 translate-x-0 pointer-events-auto": state.peeked && !layout.sidebar.opened(),
"opacity-0 -translate-x-2 pointer-events-none": !state.peeked || layout.sidebar.opened(),
"opacity-0 ltr:-translate-x-2 rtl:translate-x-2 pointer-events-none":
!state.peeked || layout.sidebar.opened(),
"transition-[opacity,transform] motion-reduce:transition-none": true,
"duration-180 ease-out": state.peeked && !layout.sidebar.opened(),
"duration-120 ease-in": !state.peeked || layout.sidebar.opened(),
@@ -2400,14 +2399,14 @@ export default function LegacyLayout(props: ParentProps) {
<div
classList={{
"hidden xl:block pointer-events-none absolute inset-y-0 right-0 z-25 overflow-hidden": true,
"hidden xl:block pointer-events-none absolute inset-y-0 end-0 z-25 overflow-hidden": true,
"opacity-100 translate-x-0": state.peeked && !layout.sidebar.opened(),
"opacity-0 -translate-x-2": !state.peeked || layout.sidebar.opened(),
"opacity-0 ltr:-translate-x-2 rtl:translate-x-2": !state.peeked || layout.sidebar.opened(),
"transition-[opacity,transform] motion-reduce:transition-none": true,
"duration-180 ease-out": state.peeked && !layout.sidebar.opened(),
"duration-120 ease-in": !state.peeked || layout.sidebar.opened(),
}}
style={{ left: `calc(4rem + ${panel()}px)` }}
style={{ "inset-inline-start": `calc(4rem + ${panel()}px)` }}
>
<div class="h-full w-px" style={{ "box-shadow": "var(--shadow-sidebar-overlay)" }} />
</div>
@@ -78,9 +78,9 @@ export function NewSessionStatus(props: { mount: Accessor<HTMLElement | null>; v
const language = useLanguage()
return (
<Show when={props.mount()}>
<Show when={props.mount()} keyed>
{(mount) => (
<Portal mount={mount()}>
<Portal mount={mount}>
<Show when={props.visible()}>
<Tooltip placement="bottom" value={language.t("status.popover.trigger")}>
<StatusPopoverV2 />
+1 -1
View File
@@ -2282,7 +2282,7 @@ export default function Page() {
<div onPointerDown={() => size.start()}>
<ResizeHandle
classList={{
"-right-1": settings.general.newLayoutDesigns(),
"-end-1": settings.general.newLayoutDesigns(),
}}
direction="horizontal"
size={sessionPanelResizedWidth()}
@@ -59,6 +59,7 @@ import { SessionFileBrowserTab, type SessionFileBrowserState } from "@/pages/ses
type ReviewDiff = FileDiffInfo | SnapshotFileDiff | VcsFileDiff
type RenderDiff = FileDiffInfo | (SnapshotFileDiff & { file: string }) | VcsFileDiff
const FILE_TREE_WIDTH_MIN = 240
function renderDiff(value: ReviewDiff): value is RenderDiff {
return typeof value.file === "string"
@@ -104,13 +105,14 @@ export function SessionSidePanel(props: {
}),
)
const open = createMemo(() => reviewOpen() || fileOpen())
const fileTreeWidth = createMemo(() => Math.max(FILE_TREE_WIDTH_MIN, layout.fileTree.width()))
const reviewTab = createMemo(() => isDesktop())
const panelWidth = createMemo(() => {
if (!open()) return "0px"
if (reviewOpen()) return "auto"
return `${layout.fileTree.width()}px`
return `${fileTreeWidth()}px`
})
const treeWidth = createMemo(() => (fileOpen() ? `${layout.fileTree.width()}px` : "0px"))
const treeWidth = createMemo(() => (fileOpen() ? `${fileTreeWidth()}px` : "0px"))
const diffs = createMemo(() => props.diffs().filter(renderDiff))
const diffFiles = createMemo(() => diffs().map((d) => d.file))
@@ -845,8 +847,8 @@ export function SessionSidePanel(props: {
<ResizeHandle
direction="horizontal"
edge="start"
size={layout.fileTree.width()}
min={200}
size={fileTreeWidth()}
min={FILE_TREE_WIDTH_MIN}
max={480}
onResize={(width) => {
props.size.touch()
@@ -646,7 +646,7 @@ export function MessageTimeline(props: {
const viewShare = () => {
const url = shareUrl()
if (!url) return
platform.openLink(url)
platform.openExternal(url)
}
const errorMessage = (err: unknown) => {
@@ -1106,7 +1106,7 @@ export function MessageTimeline(props: {
return (
<TimelineRowFrame row={commentStripRow}>
<div class="w-full px-4 md:px-5 pb-2">
<div class="ml-auto max-w-[82%] overflow-x-auto no-scrollbar">
<div class="ms-auto max-w-[82%] overflow-x-auto no-scrollbar">
<div class="flex w-max min-w-full justify-end gap-2">
<Index each={comments()}>
{(comment) => (
@@ -167,4 +167,41 @@ describe("current session timeline rows", () => {
"thinking:msg_2",
])
})
test("removes a failed assistant error when the turn continues streaming", () => {
const source = [
{ id: "msg_user", type: "user", text: "recover", time: { created: 1 } },
{
id: "msg_failed",
type: "assistant",
agent: "build",
model: { id: "model", providerID: "provider" },
content: [],
error: { type: "ProviderError", message: "temporary failure" },
time: { created: 2, completed: 3 },
},
{
id: "msg_recovery",
type: "assistant",
agent: "build",
model: { id: "model", providerID: "provider" },
content: [{ type: "text", text: "streaming again" }],
time: { created: 4 },
},
] satisfies SessionMessageInfo[]
const normalized = normalizeSessionMessages("ses_1", source)
const messages = new Map(normalized.messages.map((message) => [message.id, message]))
const result = Timeline.constructSessionMessageRows(
source,
(messageID) => messages.get(messageID),
(messageID) => normalized.parts.get(messageID) ?? [],
true,
"busy",
true,
normalized.messages.filter((message) => message.role === "user"),
)
expect(result.rows.map((row) => row._tag)).toEqual(["UserMessage", "AssistantPart"])
})
})
@@ -116,7 +116,8 @@ export namespace Timeline {
const compaction = userParts.some((p) => p.type === "compaction")
const interruptedMessageIndex = assistantMessages.findIndex((m) => m.error?.name === "MessageAbortedError")
const interrupted = interruptedMessageIndex !== -1
const error = assistantMessages.find((m) => m.error && m.error.name !== "MessageAbortedError")?.error
const latestError = assistantMessages.at(-1)?.error
const error = latestError?.name === "MessageAbortedError" ? undefined : latestError
const assistantPartRefs = assistantMessages.flatMap((message, messageIndex) =>
getMessageParts(message.id)
+171
View File
@@ -0,0 +1,171 @@
import type { AsyncStorage } from "@solid-primitives/storage"
export type BlobReference = { id: string; url: string }
type Driver = {
get(key: string): Promise<string | null>
set(key: string, value: string): Promise<void>
remove(key: string): Promise<void>
putBlob(blob: Blob): Promise<string>
getBlob(id: string): Promise<Blob | null>
}
export type DraftStore = AsyncStorage & { putBlob(blob: Blob): Promise<BlobReference> }
const urls = new Map<string, string>()
function blobUrl(id: string, blob: Blob) {
const existing = urls.get(id)
if (existing) return existing
const url = URL.createObjectURL(blob)
urls.set(id, url)
return url
}
async function blobID(blob: Blob) {
const id = Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256", await blob.arrayBuffer())))
.map((byte) => byte.toString(16).padStart(2, "0"))
.join("")
return id
}
export async function createBlobReference(blob: Blob): Promise<BlobReference> {
const id = await blobID(blob)
return { id, url: blobUrl(id, blob) }
}
export function createDraftStore(driver: Driver): DraftStore {
const versions = new Map<string, number>()
const putBlob = async (blob: Blob) => {
const id = await driver.putBlob(blob)
return { id, url: blobUrl(id, blob) }
}
const encode = async (value: unknown): Promise<unknown> => {
if (Array.isArray(value)) return Promise.all(value.map(encode))
if (!value || typeof value !== "object") return value
const item = value as Record<string, unknown>
if (item.type === "image" && typeof item.dataUrl === "string") {
const blob = await fetch(item.dataUrl).then((response) => response.blob())
const { dataUrl: _, ...rest } = item
return { ...rest, blob: { id: await driver.putBlob(blob) } }
}
if ("blob" in item && item.blob && typeof item.blob === "object") {
const blob = item.blob as Record<string, unknown>
if (typeof blob.id === "string" && blob.id.startsWith("data:")) {
const data = await fetch(blob.id).then((response) => response.blob())
return { ...item, blob: { id: await driver.putBlob(data) } }
}
return { ...item, blob: { id: blob.id } }
}
return Object.fromEntries(
await Promise.all(Object.entries(item).map(async ([key, entry]) => [key, await encode(entry)])),
)
}
const decode = async (value: unknown): Promise<unknown> => {
if (Array.isArray(value)) return Promise.all(value.map(decode))
if (!value || typeof value !== "object") return value
const item = value as Record<string, unknown>
if (item.blob && typeof item.blob === "object") {
const ref = item.blob as Record<string, unknown>
if (typeof ref.id === "string") {
const blob = await driver.getBlob(ref.id)
if (blob) return { ...item, blob: { id: ref.id, url: blobUrl(ref.id, blob) } }
}
}
return Object.fromEntries(
await Promise.all(Object.entries(item).map(async ([key, entry]) => [key, await decode(entry)])),
)
}
return {
getItem: async (key) => {
const value = await driver.get(key)
return value === null ? null : JSON.stringify(await decode(JSON.parse(value)))
},
setItem: async (key, value) => {
const version = (versions.get(key) ?? 0) + 1
versions.set(key, version)
const encoded = JSON.stringify(await encode(JSON.parse(value)))
if (versions.get(key) === version) await driver.set(key, encoded)
},
removeItem: async (key) => {
versions.set(key, (versions.get(key) ?? 0) + 1)
await driver.remove(key)
},
putBlob,
}
}
export function createBrowserDraftStore(): DraftStore {
const request = indexedDB.open("opencode-drafts", 1)
request.addEventListener("upgradeneeded", () => {
request.result.createObjectStore("documents")
request.result.createObjectStore("blobs")
})
const db = new Promise<IDBDatabase>((resolve, reject) => {
request.addEventListener("success", () => {
const database = request.result
const transaction = database.transaction(["documents", "blobs"], "readwrite")
const documents = transaction.objectStore("documents").getAll()
documents.addEventListener("success", () => {
const used = new Set<string>()
JSON.parse(`[${documents.result.join(",")}]`, (_key, item) => {
if (item?.blob && typeof item.blob.id === "string") used.add(item.blob.id)
return item
})
const blobs = transaction.objectStore("blobs").openKeyCursor()
blobs.addEventListener("success", () => {
const cursor = blobs.result
if (!cursor) return
if (!used.has(String(cursor.key))) cursor.delete()
cursor.continue()
})
})
transaction.addEventListener("complete", () => resolve(database))
transaction.addEventListener("abort", () => resolve(database))
})
request.addEventListener("error", () => reject(request.error))
})
const get = async (store: string, key: string) => {
const result = (await db).transaction(store).objectStore(store).get(key)
return new Promise<unknown>((resolve, reject) => {
result.addEventListener("success", () => resolve(result.result))
result.addEventListener("error", () => reject(result.error))
})
}
const write = async (store: string, key: string, value?: unknown) => {
const transaction = (await db).transaction(store, "readwrite")
if (value === undefined) transaction.objectStore(store).delete(key)
else transaction.objectStore(store).put(value, key)
return new Promise<void>((resolve, reject) => {
transaction.addEventListener("complete", () => resolve())
transaction.addEventListener("error", () => reject(transaction.error))
})
}
return createDraftStore({
get: async (key) => ((await get("documents", key)) as string | undefined) ?? null,
set: (key, value) => write("documents", key, value),
remove: (key) => write("documents", key),
putBlob: async (blob) => {
const id = await blobID(blob)
await write("blobs", id, blob)
return id
},
getBlob: async (id) => ((await get("blobs", id)) as Blob | undefined) ?? null,
})
}
export async function blobDataUrl(blob: BlobReference, mime: string) {
const data = await fetch(blob.url).then((response) => response.blob())
return new Promise<string>((resolve, reject) => {
const reader = new FileReader()
reader.addEventListener("error", () => reject(reader.error))
reader.addEventListener("load", () => {
const value = typeof reader.result === "string" ? reader.result : ""
resolve(`data:${mime};base64,${value.slice(value.indexOf(",") + 1)}`)
})
reader.readAsDataURL(data)
})
}
export function createLegacyBlobReference(dataUrl: string): BlobReference {
return { id: dataUrl, url: dataUrl }
}
@@ -1,27 +0,0 @@
import { afterEach, describe, expect, test } from "bun:test"
import { handleNotificationClick, setNavigate } from "./notification-click"
describe("notification click", () => {
afterEach(() => {
setNavigate(undefined as any)
})
test("navigates via registered navigate function", () => {
const calls: string[] = []
setNavigate((href) => calls.push(href))
handleNotificationClick("/abc/session/123")
expect(calls).toEqual(["/abc/session/123"])
})
test("does not navigate when href is missing", () => {
const calls: string[] = []
setNavigate((href) => calls.push(href))
handleNotificationClick(undefined)
expect(calls).toEqual([])
})
test("falls back to location.assign without registered navigate", () => {
handleNotificationClick("/abc/session/123")
// falls back to window.location.assign — no error thrown
})
})
@@ -1,13 +0,0 @@
let nav: ((href: string) => void) | undefined
export const setNavigate = (fn: (href: string) => void) => {
nav = fn
}
export const handleNotificationClick = (href?: string) => {
window.focus()
if (!href) return
if (nav) return nav(href)
console.warn("notification-click: navigate function not set, falling back to window.location.assign")
window.location.assign(href)
}
+47 -5
View File
@@ -15,6 +15,7 @@ type PersistedWithReady<T> = [
]
type PersistTarget = {
draft?: boolean
storage?: string
scope?: "window"
legacyStorageNames?: string[]
@@ -295,6 +296,14 @@ async function removeAsync(storage: AsyncStorage, key: string) {
} catch {}
}
function toAsyncStorage(storage: SyncStorage | AsyncStorage): AsyncStorage {
return {
getItem: async (key) => storage.getItem(key),
setItem: async (key, value) => storage.setItem(key, value),
removeItem: async (key) => storage.removeItem(key),
}
}
async function migrateLegacyAsync(input: {
current: AsyncStorage
legacyStore?: AsyncStorage
@@ -513,6 +522,9 @@ export const Persist = {
if (session) return Persist.serverSession(scope, dir, session, key, legacy)
return Persist.serverWorkspace(scope, dir, key, legacy)
},
prompt(target: PersistTarget): PersistTarget {
return { ...target, draft: true }
},
}
function resolveTarget(target: PersistTarget, platform: Platform): PersistTarget {
@@ -526,9 +538,12 @@ function resolveTarget(target: PersistTarget, platform: Platform): PersistTarget
}
export function removePersisted(
target: { storage?: string; legacyStorageNames?: string[]; key: string },
target: { draft?: boolean; storage?: string; legacyStorageNames?: string[]; key: string },
platform?: Platform,
) {
if (target.draft && platform?.draftStore) {
void platform.draftStore.removeItem(`${target.storage ?? "default"}:${target.key}`)
}
const isDesktop = platform?.platform === "desktop" && !!platform.storage
if (isDesktop) {
@@ -561,8 +576,17 @@ export function persisted<T>(
const legacy = config.legacy ?? []
const isDesktop = platform.platform === "desktop" && !!platform.storage
const draft = config.draft ? platform.draftStore : undefined
const currentStorage = (() => {
if (draft) {
const prefix = `${config.storage ?? "default"}:`
return {
getItem: (key: string) => draft.getItem(prefix + key),
setItem: (key: string, value: string) => draft.setItem(prefix + key, value),
removeItem: (key: string) => draft.removeItem(prefix + key),
} satisfies AsyncStorage
}
if (isDesktop) return platform.storage?.(config.storage)
if (!config.storage) return localStorageDirect()
return localStorageWithPrefix(config.storage)
@@ -577,7 +601,7 @@ export function persisted<T>(
const legacyStorageNames = config.legacyStorageNames ?? []
const storage = (() => {
if (!isDesktop) {
if (!isDesktop && !draft) {
const current = currentStorage as SyncStorage
const legacyStore = legacyStorage as SyncStorage
const legacyStores = legacyStorageNames.map(localStorageWithPrefix)
@@ -609,15 +633,26 @@ export function persisted<T>(
const current = currentStorage as AsyncStorage
const legacyStore = legacyStorage as AsyncStorage | undefined
const legacyStores = legacyStorageNames
.map((name) => platform.storage?.(name) as AsyncStorage | undefined)
const oldCurrent = draft
? isDesktop
? platform.storage?.(config.storage)
: config.storage
? localStorageWithPrefix(config.storage)
: localStorageDirect()
: undefined
const legacyStores = [
oldCurrent,
...legacyStorageNames.map((name) => (isDesktop ? platform.storage?.(name) : localStorageWithPrefix(name))),
]
.filter((x) => !!x)
.map(toAsyncStorage)
let draftLatest: string | undefined
const api: AsyncStorage = {
getItem: async (key) => {
const value = await readCurrentAsync({ storage: current, key, defaults, migrate: config.migrate })
if (value !== undefined) return value
return migrateLegacyAsync({
const migrated = await migrateLegacyAsync({
current,
legacyStore,
stores: legacyStores,
@@ -626,8 +661,15 @@ export function persisted<T>(
defaults,
migrate: config.migrate,
})
if (draftLatest === undefined) {
if (draft && migrated !== null) return (await current.getItem(key)) ?? migrated
return migrated
}
await current.setItem(key, draftLatest)
return draftLatest
},
setItem: async (key, value) => {
if (draft) draftLatest = value
await current.setItem(key, value)
},
removeItem: async (key) => {
+12 -2
View File
@@ -37,8 +37,18 @@ describe("extractPromptFromParts", () => {
expect(result).toHaveLength(3)
expect(result[0]).toMatchObject({ type: "text", content: "check these" })
expect(result.slice(1)).toMatchObject([
{ type: "image", filename: "a.png", mime: "image/png", dataUrl: "data:image/png;base64,AAA" },
{ type: "image", filename: "b.pdf", mime: "application/pdf", dataUrl: "data:application/pdf;base64,BBB" },
{
type: "image",
filename: "a.png",
mime: "image/png",
blob: expect.objectContaining({ id: expect.any(String) }),
},
{
type: "image",
filename: "b.pdf",
mime: "application/pdf",
blob: expect.objectContaining({ id: expect.any(String) }),
},
])
})
})
+2 -1
View File
@@ -1,5 +1,6 @@
import type { AgentPart as MessageAgentPart, FilePart, Part, TextPart } from "@opencode-ai/sdk/v2"
import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt"
import { createLegacyBlobReference } from "@/utils/draft-store"
type Inline =
| {
@@ -107,7 +108,7 @@ export function extractPromptFromParts(parts: Part[], opts?: { directory?: strin
id: filePart.id,
filename: filePart.filename ?? attachmentName,
mime: filePart.mime,
dataUrl: filePart.url,
blob: createLegacyBlobReference(filePart.url),
})
}
}
@@ -2,6 +2,7 @@ import { beforeAll, describe, expect, mock, test } from "bun:test"
import type { AsyncStorage } from "@solid-primitives/storage"
import { createEffect, createRoot } from "solid-js"
import { ServerScope } from "@/utils/server-scope"
import { createDraftStore } from "@/utils/draft-store"
let Prompt: typeof import("@/context/prompt")
let read: ((value: string | null) => void) | undefined
@@ -30,7 +31,7 @@ beforeAll(async () => {
}),
}))
mock.module("@/context/platform", () => ({
usePlatform: () => ({ platform: "desktop", storage: () => storage }),
usePlatform: () => ({ platform: "desktop", storage: () => storage, draftStore: storage }),
}))
Prompt = await import("@/context/prompt")
@@ -69,3 +70,50 @@ describe("prompt persistence", () => {
})
})
})
test("moves legacy image data URLs into blobs and hydrates object URLs", async () => {
const documents = new Map<string, string>()
const blobs = new Map<string, Blob>()
const store = createDraftStore({
get: async (key) => documents.get(key) ?? null,
set: async (key, value) => void documents.set(key, value),
remove: async (key) => void documents.delete(key),
putBlob: async (blob) => {
const id = String(blob.size)
blobs.set(id, blob)
return id
},
getBlob: async (id) => blobs.get(id) ?? null,
})
await store.setItem("prompt", JSON.stringify({ prompt: [{ type: "image", dataUrl: "data:image/png;base64,YQ==" }] }))
expect(documents.get("prompt")).not.toContain("dataUrl")
const value = JSON.parse((await store.getItem("prompt"))!)
expect(value.prompt[0].blob.id).toBe("1")
expect(value.prompt[0].blob.url).toStartWith("blob:")
})
test("does not let delayed blob migration overwrite a newer draft", async () => {
const documents = new Map<string, string>()
const migration = Promise.withResolvers<void>()
const store = createDraftStore({
get: async () => null,
set: async (key, value) => void documents.set(key, value),
remove: async () => undefined,
putBlob: async () => {
await migration.promise
return "blob"
},
getBlob: async () => null,
})
const older = store.setItem(
"prompt",
JSON.stringify({ prompt: [{ type: "image", dataUrl: "data:image/png;base64,YQ==" }] }),
)
await Bun.sleep(0)
await store.setItem("prompt", JSON.stringify({ prompt: [{ type: "text", content: "latest" }] }))
migration.resolve()
await older
expect(documents.get("prompt")).toContain("latest")
})
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/cli",
"version": "1.18.10",
"version": "1.18.12",
"type": "module",
"license": "MIT",
"bin": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/codemode",
"version": "1.18.10",
"version": "1.18.12",
"description": "Effect-native confined code execution over schema-described tools",
"private": true,
"type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.18.10",
"version": "1.18.12",
"type": "module",
"license": "MIT",
"scripts": {
+21 -10
View File
@@ -252,9 +252,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
"go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
"go.banner.text": "يحصل Kimi K3 على حدود استخدام مضاعفة لفترة محدودة",
"go.banner.text": "يحصل GPT 5.6 Luna على حدود استخدام مضاعفة لفترة محدودة",
"go.meta.description":
"يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود طلب سخية لمدة 5 ساعات لـ Grok 4.5 وGLM-5.2 وGLM-5.1 وKimi K3 وKimi K2.7 Code وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash وHy3.",
"يبدأ Go بسعر $5 للشهر الأول، ثم $10/شهر، مع حدود استخدام سخية ووصول موثوق إلى نماذج البرمجة الرائدة.",
"go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
"go.hero.body":
"يجلب Go البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر، حتى تتمكن من البناء باستخدام وكلاء أقوياء دون القلق بشأن التكلفة أو التوفر.",
@@ -301,8 +301,7 @@ export const dict = {
"go.problem.item1": "أسعار اشتراك منخفضة التكلفة",
"go.problem.item2": "حدود سخية ووصول موثوق",
"go.problem.item3": "مصمم لأكبر عدد ممكن من المبرمجين",
"go.problem.item4":
"يتضمن Grok 4.5 وGLM-5.2 وGLM-5.1 وKimi K3 وKimi K2.7 Code وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash وHy3",
"go.problem.item4": "مجموعة منسقة من النماذج المختبرة للبرمجة الوكيلة",
"go.how.title": "كيف يعمل Go",
"go.how.body": "يبدأ Go من $5 للشهر الأول، ثم $10/شهر. يمكنك استخدامه مع OpenCode أو أي وكيل.",
"go.how.step1.title": "أنشئ حسابًا",
@@ -326,7 +325,7 @@ export const dict = {
"go.faq.a2": "يتضمن Go النماذج المدرجة أدناه، مع حدود سخية وإتاحة موثوقة.",
"go.faq.q3": "هل Go هو نفسه Zen؟",
"go.faq.a3":
"لا. Zen هو الدفع حسب الاستخدام، بينما يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود سخية ووصول موثوق إلى نماذج المصدر المفتوح Grok 4.5 وGLM-5.2 وGLM-5.1 وKimi K3 وKimi K2.7 Code وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash وHy3.",
"لا. يعتمد Zen على الدفع حسب الاستخدام، بينما يبدأ Go بسعر $5 للشهر الأول، ثم $10/شهر، مع حدود سخية ووصول موثوق إلى مجموعة منسقة من النماذج.",
"go.faq.q4": "كم تكلفة Go؟",
"go.faq.a4.p1.beforePricing": "تكلفة Go",
"go.faq.a4.p1.pricingLink": "$5 للشهر الأول",
@@ -335,8 +334,20 @@ export const dict = {
"go.faq.a4.p2.accountLink": "حسابك",
"go.faq.a4.p3": "ألغِ في أي وقت.",
"go.faq.q5": "ماذا عن البيانات والخصوصية؟",
"go.faq.a5.body":
"تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. يتبع مزودونا سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج.",
"go.faq.a5.model": "النموذج",
"go.faq.a5.training": "تدريب النموذج",
"go.faq.a5.retention": "الاحتفاظ بالبيانات",
"go.faq.a5.retention30": "30 يومًا",
"go.faq.a5.retention0": "0 أيام",
"go.faq.a5.used": "مستخدَمة",
"go.faq.a5.notUsed": "غير مستخدَمة",
"go.faq.a5.noAgreement": "لا توجد اتفاقية",
"go.faq.a5.grokRetention":
"تعطّل ZDR ميزات API مهمة تعتمد على البيانات المخزنة، بما في ذلك Responses API ذات الحالة، وFiles and Collections، وBatch API.",
"go.faq.a5.gptRetention":
"تُنشأ سجلات مراقبة إساءة الاستخدام لكل استخدام لميزات API، ويُحتفظ بها لمدة تصل إلى 30 يومًا.",
"go.faq.a5.learnMore": "اعرف المزيد",
"go.faq.a5.deepseekRetention": "تُجدَّد اتفاقية ZDR شهريًا. الاتفاقية الحالية سارية حتى 31 أغسطس 2026.",
"go.faq.a5.beforeExceptions":
"تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"go.faq.a5.exceptionsLink": "الاستثناءات التالية",
@@ -349,7 +360,7 @@ export const dict = {
"go.faq.q9": "ما الفرق بين النماذج المجانية وGo؟",
"go.faq.a9":
"تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة 200 طلب/يوم. يتضمن Go نماذج Grok 4.5 وGLM-5.2 وGLM-5.1 وKimi K3 وKimi K2.7 Code وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash وHy3 مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، أسبوعيًا، وشهريًا)، تعادل تقريبًا 12 دولارًا كل 5 ساعات، و30 دولارًا في الأسبوع، و60 دولارًا في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
"تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة قدرها 200 طلب/يوم. يقدّم Go مجموعة منسقة من النماذج مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، وأسبوعية، وشهرية)، تعادل تقريبًا $12 لكل 5 ساعات، و$30 في الأسبوع، و$60 في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
"zen.api.error.rateLimitExceeded": "تم تجاوز حد الطلبات. يرجى المحاولة مرة أخرى لاحقًا.",
"zen.api.error.modelNotSupported": "النموذج {{model}} غير مدعوم",
@@ -374,7 +385,7 @@ export const dict = {
"لقد وصلت إلى حد الإنفاق الشهري البالغ ${{amount}}. إدارة حدودك هنا: {{membersUrl}}",
"zen.api.error.modelDisabled": "النموذج معطل",
"zen.api.error.regionNotAllowed":
"هذا النموذج مستضاف في الصين. إذا كنت ترغب في استخدام هذا النموذج، فعّله في إعداداتك: {{consoleGoUrl}}",
"لا يتوفر أحدث إصدار من هذا النموذج إلا مستضافًا في الصين، ويتطلب تفعيلًا صريحًا: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"انتهى العرض المجاني لـ {{model}}. يمكنك مواصلة استخدام النموذج بالاشتراك في OpenCode Go - {{link}}",
@@ -664,7 +675,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 للشهر الأول",
"workspace.lite.promo.modelsTitle": "ما يتضمنه",
"workspace.lite.promo.footer":
"تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. قد تتغير الأسعار وحدود الاستخدام بناءً على تعلمنا من الاستخدام المبكر والملاحظات.",
"صُممت الخطة بشكل أساسي للمستخدمين الدوليين، وتوفر وصولًا عالميًا مستقرًا. قد تتغير الأسعار وحدود الاستخدام بينما نتعلم من الاستخدام المبكر والملاحظات.",
"workspace.lite.promo.subscribe": "الاشتراك في Go",
"workspace.lite.promo.subscribing": "جارٍ إعادة التوجيه...",
"workspace.lite.promo.otherMethods": "طرق دفع أخرى",
+22 -10
View File
@@ -256,9 +256,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguintes exceções",
"go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
"go.banner.text": "Kimi K3 tem limites de uso 2x maiores por tempo limitado",
"go.banner.text": "GPT 5.6 Luna tem limites de uso 2x maiores por tempo limitado",
"go.meta.description":
"O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de solicitação de 5 horas para Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3.",
"O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de uso e acesso confiável aos principais modelos de codificação.",
"go.hero.title": "Modelos de codificação de baixo custo para todos",
"go.hero.body":
"O Go traz a codificação com agentes para programadores em todo o mundo. Oferecendo limites generosos e acesso confiável aos modelos de código aberto mais capazes, para que você possa construir com agentes poderosos sem se preocupar com custos ou disponibilidade.",
@@ -306,8 +306,7 @@ export const dict = {
"go.problem.item1": "Preço de assinatura de baixo custo",
"go.problem.item2": "Limites generosos e acesso confiável",
"go.problem.item3": "Feito para o maior número possível de programadores",
"go.problem.item4":
"Inclui Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3",
"go.problem.item4": "Uma seleção de modelos testados para codificação com agentes",
"go.how.title": "Como o Go funciona",
"go.how.body":
"O Go começa em $5 no primeiro mês, depois $10/mês. Você pode usá-lo com o OpenCode ou qualquer agente.",
@@ -333,7 +332,7 @@ export const dict = {
"go.faq.a2": "O Go inclui os modelos listados abaixo, com limites generosos e acesso confiável.",
"go.faq.q3": "O Go é o mesmo que o Zen?",
"go.faq.a3":
"Não. Zen é pay-as-you-go, enquanto o Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos e acesso confiável aos modelos open source Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3.",
"Não. Zen é pay-as-you-go, enquanto o Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos e acesso confiável a uma seleção de modelos.",
"go.faq.q4": "Quanto custa o Go?",
"go.faq.a4.p1.beforePricing": "O Go custa",
"go.faq.a4.p1.pricingLink": "$5 no primeiro mês",
@@ -342,8 +341,21 @@ export const dict = {
"go.faq.a4.p2.accountLink": "conta",
"go.faq.a4.p3": "Cancele a qualquer momento.",
"go.faq.q5": "E sobre dados e privacidade?",
"go.faq.a5.body":
"O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Nossos provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos.",
"go.faq.a5.model": "Modelo",
"go.faq.a5.training": "Treinamento de modelos",
"go.faq.a5.retention": "Retenção de dados",
"go.faq.a5.retention30": "30 dias",
"go.faq.a5.retention0": "0 dias",
"go.faq.a5.used": "Usado",
"go.faq.a5.notUsed": "Não usado",
"go.faq.a5.noAgreement": "Sem acordo",
"go.faq.a5.grokRetention":
"O ZDR desativa recursos importantes da API que dependem de dados armazenados, incluindo a Responses API com estado, Files and Collections e a Batch API.",
"go.faq.a5.gptRetention":
"Logs de monitoramento de abuso são gerados para todo uso de recursos da API e retidos por até 30 dias.",
"go.faq.a5.learnMore": "Saiba mais",
"go.faq.a5.deepseekRetention":
"O acordo de ZDR é renovado mensalmente. O acordo atual é válido até 31 de agosto de 2026.",
"go.faq.a5.beforeExceptions":
"Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"go.faq.a5.exceptionsLink": "seguintes exceções",
@@ -357,7 +369,7 @@ export const dict = {
"go.faq.q9": "Qual a diferença entre os modelos gratuitos e o Go?",
"go.faq.a9":
"Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go inclui Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3 com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).",
"Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go oferece uma seleção de modelos com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).",
"zen.api.error.rateLimitExceeded": "Limite de taxa excedido. Por favor, tente novamente mais tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} não suportado",
@@ -382,7 +394,7 @@ export const dict = {
"Você atingiu seu limite de gastos mensais de ${{amount}}. Gerencie seus limites aqui: {{membersUrl}}",
"zen.api.error.modelDisabled": "O modelo está desabilitado",
"zen.api.error.regionNotAllowed":
"Este modelo está hospedado na China. Se você quiser usar este modelo, ative-o nas suas configurações: {{consoleGoUrl}}",
"A versão mais recente deste modelo está disponível apenas com hospedagem na China e requer adesão explícita: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"A promoção gratuita do {{model}} terminou. Você pode continuar usando o modelo assinando o OpenCode Go - {{link}}",
@@ -674,7 +686,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 no primeiro mês",
"workspace.lite.promo.modelsTitle": "O que está incluído",
"workspace.lite.promo.footer":
"O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Preços e limites de uso podem mudar conforme aprendemos com o uso inicial e feedback.",
"O plano foi desenvolvido principalmente para usuários internacionais e oferece acesso global estável. Os preços e limites de uso podem mudar à medida que aprendemos com o uso inicial e o feedback recebido.",
"workspace.lite.promo.subscribe": "Assinar Go",
"workspace.lite.promo.subscribing": "Redirecionando...",
"workspace.lite.promo.otherMethods": "Outros métodos de pagamento",
+23 -10
View File
@@ -254,9 +254,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "følgende undtagelser",
"go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
"go.banner.text": "Kimi K3 får fordoblet brugsgrænse i en begrænset periode",
"go.banner.text": "GPT 5.6 Luna får fordoblet brugsgrænse i en begrænset periode",
"go.meta.description":
"Go starter ved $5 for den første måned, derefter $10/måned, med generøse 5-timers anmodningsgrænser for Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash og Hy3.",
"Go starter ved $5 for den første måned, derefter $10/måned, med generøse brugsgrænser og pålidelig adgang til førende kodningsmodeller.",
"go.hero.title": "Kodningsmodeller til lav pris for alle",
"go.hero.body":
"Go bringer agentisk kodning til programmører over hele verden. Med generøse grænser og pålidelig adgang til de mest kapable open source-modeller, så du kan bygge med kraftfulde agenter uden at bekymre dig om omkostninger eller tilgængelighed.",
@@ -303,8 +303,7 @@ export const dict = {
"go.problem.item1": "Lavpris abonnementspriser",
"go.problem.item2": "Generøse grænser og pålidelig adgang",
"go.problem.item3": "Bygget til så mange programmører som muligt",
"go.problem.item4":
"Inkluderer Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash og Hy3",
"go.problem.item4": "Et kurateret modeludvalg testet til agentisk kodning",
"go.how.title": "Hvordan Go virker",
"go.how.body":
"Go starter ved $5 for den første måned, derefter $10/måned. Du kan bruge det med OpenCode eller enhver agent.",
@@ -330,7 +329,7 @@ export const dict = {
"go.faq.a2": "Go inkluderer modellerne nedenfor med generøse grænser og pålidelig adgang.",
"go.faq.q3": "Er Go det samme som Zen?",
"go.faq.a3":
"Nej. Zen er pay-as-you-go, mens Go starter ved $5 for den første måned, derefter $10/måned, med generøse grænser og pålidelig adgang til open source-modellerne Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash og Hy3.",
"Nej. Zen er pay-as-you-go, mens Go starter ved $5 for den første måned, derefter $10/måned, med generøse grænser og pålidelig adgang til et kurateret modeludvalg.",
"go.faq.q4": "Hvad koster Go?",
"go.faq.a4.p1.beforePricing": "Go koster",
"go.faq.a4.p1.pricingLink": "$5 første måned",
@@ -339,8 +338,22 @@ export const dict = {
"go.faq.a4.p2.accountLink": "konto",
"go.faq.a4.p3": "Annuller til enhver tid.",
"go.faq.q5": "Hvad med data og privatliv?",
"go.faq.a5.body":
"Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Vores udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning.",
"go.faq.a5.model": "Model",
"go.faq.a5.training": "Modeltræning",
"go.faq.a5.retention": "Dataopbevaring",
"go.faq.a5.retention30": "30 dage",
"go.faq.a5.retention0": "0 dage",
"go.faq.a5.used": "Brugt",
"go.faq.a5.notUsed": "Ikke brugt",
"go.faq.a5.noAgreement": "Ingen aftale",
"go.faq.a5.grokRetention":
"ZDR deaktiverer vigtige API-funktioner, der afhænger af lagrede data, herunder den tilstandsbevarende Responses API, Files and Collections og Batch API.",
"go.faq.a5.gptRetention":
"Logfiler til overvågning af misbrug genereres ved al brug af API-funktioner og opbevares i op til 30 dage.",
"go.faq.a5.learnMore": "Læs mere",
"go.faq.a5.deepseekRetention":
"ZDR-aftalen fornyes månedligt. Den nuværende aftale er gyldig til og med 31. august 2026.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
"go.faq.a5.exceptionsLink": "følgende undtagelser",
@@ -353,7 +366,7 @@ export const dict = {
"go.faq.q9": "Hvad er forskellen på gratis modeller og Go?",
"go.faq.a9":
"Gratis modeller inkluderer Big Pickle plus salgsfremmende modeller tilgængelige på det tidspunkt, med en kvote på 200 forespørgsler/dag. Go inkluderer Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash og Hy3 med højere anmodningskvoter håndhævet over rullende vinduer (5-timers, ugentlig og månedlig), nogenlunde svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (faktiske anmodningstal varierer efter model og brug).",
"Gratis modeller inkluderer Big Pickle plus kampagnemodeller, der er tilgængelige på det pågældende tidspunkt, med en kvote på 200 forespørgsler/dag. Go tilbyder et kurateret modeludvalg med højere forespørgselskvoter håndhævet over rullende perioder (5 timer, ugentligt og månedligt), omtrent svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (det faktiske antal forespørgsler varierer efter model og brug).",
"zen.api.error.rateLimitExceeded": "Hastighedsgrænse overskredet. Prøv venligst igen senere.",
"zen.api.error.modelNotSupported": "Model {{model}} understøttes ikke",
@@ -378,7 +391,7 @@ export const dict = {
"Du har nået din månedlige forbrugsgrænse på ${{amount}}. Administrer dine grænser her: {{membersUrl}}",
"zen.api.error.modelDisabled": "Modellen er deaktiveret",
"zen.api.error.regionNotAllowed":
"Denne model hostes i Kina. Hvis du vil bruge denne model, skal du aktivere den i dine indstillinger: {{consoleGoUrl}}",
"Den nyeste version af denne model er kun tilgængelig som hostet i Kina og kræver, at du aktivt tilvælger den: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"Den gratis kampagne for {{model}} er afsluttet. Du kan fortsætte med at bruge modellen ved at abonnere på OpenCode Go - {{link}}",
@@ -670,7 +683,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 for den første måned",
"workspace.lite.promo.modelsTitle": "Hvad er inkluderet",
"workspace.lite.promo.footer":
"Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Priser og forbrugsgrænser kan ændre sig, efterhånden som vi lærer af tidlig brug og feedback.",
"Planen er primært udviklet til internationale brugere og giver stabil adgang i hele verden. Priser og forbrugsgrænser kan ændre sig, efterhånden som vi lærer af de første brugserfaringer og tilbagemeldinger.",
"workspace.lite.promo.subscribe": "Abonner på Go",
"workspace.lite.promo.subscribing": "Omdirigerer...",
"workspace.lite.promo.otherMethods": "Andre betalingsmetoder",
+22 -10
View File
@@ -256,9 +256,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
"go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
"go.banner.text": "Kimi K3 erhält für begrenzte Zeit 2x Nutzungslimits",
"go.banner.text": "GPT 5.6 Luna erhält für begrenzte Zeit 2x Nutzungslimits",
"go.meta.description":
"Go beginnt bei $5 für den ersten Monat, danach $10/Monat, mit großzügigen 5-Stunden-Anfragelimits für Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash und Hy3.",
"Go beginnt bei $5 für deinen ersten Monat, danach $10/Monat, mit großzügigen Nutzungslimits und zuverlässigem Zugang zu führenden Coding-Modellen.",
"go.hero.title": "Kostengünstige Coding-Modelle für alle",
"go.hero.body":
"Go bringt Agentic Coding zu Programmierern auf der ganzen Welt. Mit großzügigen Limits und zuverlässigem Zugang zu den leistungsfähigsten Open-Source-Modellen, damit du mit leistungsstarken Agenten entwickeln kannst, ohne dir Gedanken über Kosten oder Verfügbarkeit zu machen.",
@@ -305,8 +305,7 @@ export const dict = {
"go.problem.item1": "Kostengünstiges Abonnement",
"go.problem.item2": "Großzügige Limits und zuverlässiger Zugang",
"go.problem.item3": "Für so viele Programmierer wie möglich gebaut",
"go.problem.item4":
"Beinhaltet Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash und Hy3",
"go.problem.item4": "Eine kuratierte, für Agentic Coding getestete Modellauswahl",
"go.how.title": "Wie Go funktioniert",
"go.how.body":
"Go beginnt bei $5 für den ersten Monat, danach $10/Monat. Du kannst es mit OpenCode oder jedem Agenten nutzen.",
@@ -332,7 +331,7 @@ export const dict = {
"go.faq.a2": "Go umfasst die unten aufgeführten Modelle mit großzügigen Limits und zuverlässigem Zugriff.",
"go.faq.q3": "Ist Go dasselbe wie Zen?",
"go.faq.a3":
"Nein. Zen ist Pay-as-you-go, während Go bei $5 für den ersten Monat beginnt, danach $10/Monat, mit großzügigen Limits und zuverlässigem Zugang zu den Open-Source-Modellen Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash und Hy3.",
"Nein. Zen ist Pay-as-you-go, während Go bei $5 für deinen ersten Monat beginnt, danach $10/Monat, mit großzügigen Limits und zuverlässigem Zugang zu einer kuratierten Modellauswahl.",
"go.faq.q4": "Wie viel kostet Go?",
"go.faq.a4.p1.beforePricing": "Go kostet",
"go.faq.a4.p1.pricingLink": "$5 im ersten Monat",
@@ -341,8 +340,21 @@ export const dict = {
"go.faq.a4.p2.accountLink": "Konto verwalten",
"go.faq.a4.p3": "Jederzeit kündbar.",
"go.faq.q5": "Was ist mit Daten und Privatsphäre?",
"go.faq.a5.body":
"Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang. Unsere Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen.",
"go.faq.a5.model": "Modell",
"go.faq.a5.training": "Modelltraining",
"go.faq.a5.retention": "Datenaufbewahrung",
"go.faq.a5.retention30": "30 Tage",
"go.faq.a5.retention0": "0 Tage",
"go.faq.a5.used": "Verwendet",
"go.faq.a5.notUsed": "Nicht verwendet",
"go.faq.a5.noAgreement": "Keine Vereinbarung",
"go.faq.a5.grokRetention":
"ZDR deaktiviert wichtige API-Funktionen, die von gespeicherten Daten abhängen, einschließlich der zustandsbehafteten Responses API, Files and Collections und der Batch API.",
"go.faq.a5.gptRetention":
"Für die Nutzung aller API-Funktionen werden Protokolle zur Missbrauchsüberwachung erstellt und bis zu 30 Tage lang aufbewahrt.",
"go.faq.a5.learnMore": "Mehr erfahren",
"go.faq.a5.deepseekRetention":
"Die ZDR-Vereinbarung wird monatlich erneuert. Die aktuelle Vereinbarung gilt bis einschließlich 31. August 2026.",
"go.faq.a5.beforeExceptions":
"Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
"go.faq.a5.exceptionsLink": "folgenden Ausnahmen",
@@ -356,7 +368,7 @@ export const dict = {
"go.faq.q9": "Was ist der Unterschied zwischen kostenlosen Modellen und Go?",
"go.faq.a9":
"Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go beinhaltet Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash und Hy3 mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
"Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go bietet eine kuratierte Modellauswahl mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
"zen.api.error.rateLimitExceeded": "Ratenlimit überschritten. Bitte versuche es später erneut.",
"zen.api.error.modelNotSupported": "Modell {{model}} wird nicht unterstützt",
@@ -381,7 +393,7 @@ export const dict = {
"Du hast dein monatliches Ausgabenlimit von ${{amount}} erreicht. Verwalte deine Limits hier: {{membersUrl}}",
"zen.api.error.modelDisabled": "Modell ist deaktiviert",
"zen.api.error.regionNotAllowed":
"Dieses Modell wird in China gehostet. Wenn du dieses Modell verwenden möchtest, aktiviere es in deinen Einstellungen: {{consoleGoUrl}}",
"Die neueste Version dieses Modells ist nur verfügbar, wenn sie in China gehostet wird, und muss ausdrücklich aktiviert werden: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"Die kostenlose Aktion für {{model}} ist beendet. Du kannst das Modell weiterhin nutzen, indem du OpenCode Go abonnierst - {{link}}",
@@ -673,7 +685,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 im ersten Monat",
"workspace.lite.promo.modelsTitle": "Was enthalten ist",
"workspace.lite.promo.footer":
"Der Plan wurde hauptsächlich für internationale Nutzer entwickelt, wobei die Modelle in den USA, der EU und Singapur gehostet werden, um einen stabilen weltweiten Zugriff zu gewährleisten. Preise und Nutzungslimits können sich ändern, während wir aus der frühen Nutzung und dem Feedback lernen.",
"Der Plan richtet sich in erster Linie an internationale Nutzer und bietet stabilen weltweiten Zugriff. Preise und Nutzungslimits können sich ändern, wenn wir Erkenntnisse aus der ersten Nutzung und dem Feedback gewinnen.",
"workspace.lite.promo.subscribe": "Go abonnieren",
"workspace.lite.promo.subscribing": "Leite weiter...",
"workspace.lite.promo.otherMethods": "Andere Zahlungsmethoden",
+23 -10
View File
@@ -253,9 +253,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "following exceptions",
"go.title": "OpenCode Go | Low cost coding models for everyone",
"go.banner.text": "Kimi K3 gets 2× usage limits for a limited time",
"go.banner.text": "GPT 5.6 Luna gets 2× usage limits for a limited time",
"go.meta.description":
"Go starts at $5 for your first month, then $10/month, with generous 5-hour request limits for Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash, and Hy3.",
"Go starts at $5 for your first month, then $10/month, with generous usage limits and reliable access to leading coding models.",
"go.hero.title": "Low cost coding models for everyone",
"go.hero.body":
"Go brings agentic coding to programmers around the world. Offering generous limits and reliable access to the most capable open-source models, so you can build with powerful agents without worrying about cost or availability.",
@@ -270,6 +270,7 @@ export const dict = {
"go.graph.freePill": "Big Pickle and free models",
"go.graph.go": "Go",
"go.graph.label": "Requests per 5 hour",
"go.graph.tick": "{{n}}x",
"go.graph.usageLimits": "Usage limits",
"go.graph.aria": "Requests per 5h: {{free}} vs {{go}}",
@@ -301,8 +302,7 @@ export const dict = {
"go.problem.item1": "Low cost subscription pricing",
"go.problem.item2": "Generous limits and reliable access",
"go.problem.item3": "Built for as many programmers as possible",
"go.problem.item4":
"Includes Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash, and Hy3",
"go.problem.item4": "A curated model lineup tested for agentic coding",
"go.how.title": "How Go works",
"go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with OpenCode or any agent.",
"go.how.step1.title": "Create an account",
@@ -327,7 +327,7 @@ export const dict = {
"go.faq.a2": "Go includes the models listed below, with generous limits and reliable access.",
"go.faq.q3": "Is Go the same as Zen?",
"go.faq.a3":
"No. Zen is pay-as-you-go, while Go starts at $5 for your first month, then $10/month, with generous limits and reliable access to open-source models Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash, and Hy3.",
"No. Zen is pay-as-you-go, while Go starts at $5 for your first month, then $10/month, with generous limits and reliable access to a curated model lineup.",
"go.faq.q4": "How much does Go cost?",
"go.faq.a4.p1.beforePricing": "Go costs",
"go.faq.a4.p1.pricingLink": "$5 first month",
@@ -336,8 +336,21 @@ export const dict = {
"go.faq.a4.p2.accountLink": "account",
"go.faq.a4.p3": "Cancel any time.",
"go.faq.q5": "What about data and privacy?",
"go.faq.a5.body":
"The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Our providers follow a zero-retention policy and do not use your data for model training.",
"go.faq.a5.model": "Model",
"go.faq.a5.training": "Model training",
"go.faq.a5.retention": "Data retention",
"go.faq.a5.retention30": "30 days",
"go.faq.a5.retention0": "0 days",
"go.faq.a5.used": "Used",
"go.faq.a5.notUsed": "Not used",
"go.faq.a5.noAgreement": "No agreement",
"go.faq.a5.grokRetention":
"ZDR disables important API features that depend on stored data, including the stateful Responses API, Files and Collections, and the Batch API.",
"go.faq.a5.gptRetention":
"Abuse monitoring logs are generated for all API feature usage and retained for up to 30 days.",
"go.faq.a5.deepseekRetention":
"ZDR agreement is renewed monthly. The current agreement is valid through August 31, 2026.",
"go.faq.a5.learnMore": "Learn more",
"go.faq.a5.beforeExceptions":
"Go models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
@@ -351,7 +364,7 @@ export const dict = {
"go.faq.q9": "What is the difference between free models and Go?",
"go.faq.a9":
"Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go includes Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash, and Hy3 with higher request quotas enforced across rolling windows (5-hour, weekly, and monthly), roughly equivalent to $12 per 5 hours, $30 per week, and $60 per month (actual request counts vary by model and usage).",
"Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go offers a curated model lineup with higher request quotas enforced across rolling windows (5-hour, weekly, and monthly), roughly equivalent to $12 per 5 hours, $30 per week, and $60 per month (actual request counts vary by model and usage).",
"zen.api.error.rateLimitExceeded": "Rate limit exceeded. Please try again later.",
"zen.api.error.modelNotSupported": "Model {{model}} is not supported",
@@ -376,7 +389,7 @@ export const dict = {
"You have reached your monthly spending limit of ${{amount}}. Manage your limits here: {{membersUrl}}",
"zen.api.error.modelDisabled": "Model is disabled",
"zen.api.error.regionNotAllowed":
"This model is hosted in China. If you would like to use this model, enable it in your settings: {{consoleGoUrl}}",
"The latest version of this model is only available hosted in China and requires explicit opt in: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"Free promotion has ended for {{model}}. You can continue using the model by subscribing to OpenCode Go - {{link}}",
@@ -668,7 +681,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 for your first month",
"workspace.lite.promo.modelsTitle": "What's Included",
"workspace.lite.promo.footer":
"The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Pricing and usage limits may change as we learn from early usage and feedback.",
"The plan is designed primarily for international users and provides stable global access. Pricing and usage limits may change as we learn from early usage and feedback.",
"workspace.lite.promo.subscribe": "Subscribe to Go",
"workspace.lite.promo.subscribing": "Redirecting...",
"workspace.lite.promo.otherMethods": "Other payment methods",
+22 -10
View File
@@ -257,9 +257,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "siguientes excepciones",
"go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
"go.banner.text": "Kimi K3 tiene límites de uso 2x mayores por tiempo limitado",
"go.banner.text": "GPT 5.6 Luna tiene límites de uso 2x mayores por tiempo limitado",
"go.meta.description":
"Go comienza en $5 el primer mes, luego 10 $/mes, con generosos límites de solicitudes de 5 horas para Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash y Hy3.",
"Go comienza en $5 el primer mes, luego 10 $/mes, con límites de uso generosos y acceso fiable a modelos de programación líderes.",
"go.hero.title": "Modelos de programación de bajo coste para todos",
"go.hero.body":
"Go lleva la programación agéntica a programadores de todo el mundo. Ofrece límites generosos y acceso fiable a los modelos de código abierto más capaces, para que puedas crear con agentes potentes sin preocuparte por el coste o la disponibilidad.",
@@ -307,8 +307,7 @@ export const dict = {
"go.problem.item1": "Precios de suscripción de bajo coste",
"go.problem.item2": "Límites generosos y acceso fiable",
"go.problem.item3": "Creado para tantos programadores como sea posible",
"go.problem.item4":
"Incluye Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash y Hy3",
"go.problem.item4": "Una selección de modelos probados para programación agéntica",
"go.how.title": "Cómo funciona Go",
"go.how.body": "Go comienza en $5 el primer mes, luego 10 $/mes. Puedes usarlo con OpenCode o cualquier agente.",
"go.how.step1.title": "Crear una cuenta",
@@ -333,7 +332,7 @@ export const dict = {
"go.faq.a2": "Go incluye los modelos que se indican abajo, con límites generosos y acceso confiable.",
"go.faq.q3": "¿Es Go lo mismo que Zen?",
"go.faq.a3":
"No. Zen es pago por uso, mientras que Go comienza en $5 el primer mes, luego 10 $/mes, con límites generosos y acceso fiable a los modelos de código abierto Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash y Hy3.",
"No. Zen es de pago por uso, mientras que Go comienza en $5 el primer mes, luego 10 $/mes, con límites generosos y acceso fiable a una selección de modelos.",
"go.faq.q4": "¿Cuánto cuesta Go?",
"go.faq.a4.p1.beforePricing": "Go cuesta",
"go.faq.a4.p1.pricingLink": "$5 el primer mes",
@@ -342,8 +341,21 @@ export const dict = {
"go.faq.a4.p2.accountLink": "cuenta",
"go.faq.a4.p3": "Cancela en cualquier momento.",
"go.faq.q5": "¿Qué pasa con los datos y la privacidad?",
"go.faq.a5.body":
"El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable. Nuestros proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos.",
"go.faq.a5.model": "Modelo",
"go.faq.a5.training": "Entrenamiento del modelo",
"go.faq.a5.retention": "Retención de datos",
"go.faq.a5.retention30": "30 días",
"go.faq.a5.retention0": "0 días",
"go.faq.a5.used": "Utilizado",
"go.faq.a5.notUsed": "No utilizado",
"go.faq.a5.noAgreement": "Sin acuerdo",
"go.faq.a5.grokRetention":
"ZDR deshabilita funciones importantes de la API que dependen de datos almacenados, incluidas la Responses API con estado, Files and Collections y la Batch API.",
"go.faq.a5.gptRetention":
"Se generan registros de supervisión de abusos para todo el uso de funciones de la API y se conservan durante un máximo de 30 días.",
"go.faq.a5.learnMore": "Más información",
"go.faq.a5.deepseekRetention":
"El acuerdo de ZDR se renueva mensualmente. El acuerdo actual es válido hasta el 31 de agosto de 2026.",
"go.faq.a5.beforeExceptions":
"Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
"go.faq.a5.exceptionsLink": "siguientes excepciones",
@@ -357,7 +369,7 @@ export const dict = {
"go.faq.q9": "¿Cuál es la diferencia entre los modelos gratuitos y Go?",
"go.faq.a9":
"Los modelos gratuitos incluyen Big Pickle s modelos promocionales disponibles en el momento, con una cuota de 200 solicitudes/día. Go incluye Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash y Hy3 con cuotas de solicitud más altas aplicadas a través de ventanas móviles (5 horas, semanal y mensual), aproximadamente equivalente a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (los recuentos reales de solicitudes varían según el modelo y el uso).",
"Los modelos gratuitos incluyen Big Pickle y los modelos promocionales disponibles en ese momento, con una cuota de 200 solicitudes/día. Go ofrece una selección de modelos con cuotas de solicitudes más altas aplicadas en ventanas móviles (de 5 horas, semanales y mensuales), aproximadamente equivalentes a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (la cantidad real de solicitudes varía según el modelo y el uso).",
"zen.api.error.rateLimitExceeded": "Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} no soportado",
@@ -382,7 +394,7 @@ export const dict = {
"Has alcanzado tu límite de gasto mensual de ${{amount}}. Gestiona tus límites aquí: {{membersUrl}}",
"zen.api.error.modelDisabled": "El modelo está deshabilitado",
"zen.api.error.regionNotAllowed":
"Este modelo está alojado en China. Si quieres usar este modelo, actívalo en tu configuración: {{consoleGoUrl}}",
"La versión más reciente de este modelo solo está disponible alojada en China y requiere una aceptación explícita: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"La promoción gratuita de {{model}} ha finalizado. Puedes seguir usando el modelo suscribiéndote a OpenCode Go - {{link}}",
@@ -674,7 +686,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 el primer mes",
"workspace.lite.promo.modelsTitle": "Qué incluye",
"workspace.lite.promo.footer":
"El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., la UE y Singapur para un acceso global estable. Los precios y los límites de uso pueden cambiar a medida que aprendemos del uso inicial y los comentarios.",
"El plan está diseñado principalmente para usuarios internacionales y ofrece un acceso global estable. Los precios y los límites de uso pueden cambiar a medida que aprendemos del uso inicial y de los comentarios recibidos.",
"workspace.lite.promo.subscribe": "Suscribirse a Go",
"workspace.lite.promo.subscribing": "Redirigiendo...",
"workspace.lite.promo.otherMethods": "Otros métodos de pago",
+23 -10
View File
@@ -258,9 +258,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "exceptions suivantes",
"go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
"go.banner.text": "Kimi K3 bénéficie de limites dutilisation 2x supérieures pour une durée limitée",
"go.banner.text": "GPT 5.6 Luna bénéficie de limites dutilisation 2x supérieures pour une durée limitée",
"go.meta.description":
"Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites de requêtes généreuses sur 5 heures pour Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash et Hy3.",
"Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites d'utilisation généreuses et un accès fiable aux principaux modèles de codage.",
"go.hero.title": "Modèles de code à faible coût pour tous",
"go.hero.body":
"Go apporte le codage agentique aux programmeurs du monde entier. Offrant des limites généreuses et un accès fiable aux modèles open source les plus capables, pour que vous puissiez construire avec des agents puissants sans vous soucier du coût ou de la disponibilité.",
@@ -307,8 +307,7 @@ export const dict = {
"go.problem.item1": "Prix d'abonnement bas",
"go.problem.item2": "Limites généreuses et accès fiable",
"go.problem.item3": "Conçu pour autant de programmeurs que possible",
"go.problem.item4":
"Inclut Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash et Hy3",
"go.problem.item4": "Une sélection de modèles testés pour le codage agentique",
"go.how.title": "Comment fonctionne Go",
"go.how.body":
"Go commence à $5 pour le premier mois, puis 10 $/mois. Vous pouvez l'utiliser avec OpenCode ou n'importe quel agent.",
@@ -334,7 +333,7 @@ export const dict = {
"go.faq.a2": "Go inclut les modèles ci-dessous, avec des limites généreuses et un accès fiable.",
"go.faq.q3": "Est-ce que Go est la même chose que Zen ?",
"go.faq.a3":
"Non. Zen est un paiement à l'utilisation, tandis que Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites généreuses et un accès fiable aux modèles open source Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash et Hy3.",
"Non. Zen est un paiement à l'utilisation, tandis que Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites généreuses et un accès fiable à une sélection de modèles.",
"go.faq.q4": "Combien coûte Go ?",
"go.faq.a4.p1.beforePricing": "Go coûte",
"go.faq.a4.p1.pricingLink": "$5 le premier mois",
@@ -343,8 +342,22 @@ export const dict = {
"go.faq.a4.p2.accountLink": "compte",
"go.faq.a4.p3": "Annulez à tout moment.",
"go.faq.q5": "Et pour les données et la confidentialité ?",
"go.faq.a5.body":
"Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles.",
"go.faq.a5.model": "Modèle",
"go.faq.a5.training": "Entraînement des modèles",
"go.faq.a5.retention": "Conservation des données",
"go.faq.a5.retention30": "30 jours",
"go.faq.a5.retention0": "0 jour",
"go.faq.a5.used": "Utilisé",
"go.faq.a5.notUsed": "Non utilisé",
"go.faq.a5.noAgreement": "Aucun accord",
"go.faq.a5.grokRetention":
"Le ZDR désactive d'importantes fonctionnalités API qui dépendent des données stockées, notamment Responses API avec état, Files and Collections et Batch API.",
"go.faq.a5.gptRetention":
"Des journaux de surveillance des abus sont générés pour toute utilisation des fonctionnalités API et conservés pendant un maximum de 30 jours.",
"go.faq.a5.learnMore": "En savoir plus",
"go.faq.a5.deepseekRetention":
"Laccord ZDR est renouvelé chaque mois. Laccord actuel est valable jusquau 31 août 2026.",
"go.faq.a5.beforeExceptions":
"Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"go.faq.a5.exceptionsLink": "exceptions suivantes",
@@ -357,7 +370,7 @@ export const dict = {
"Oui, vous pouvez utiliser Go avec n'importe quel agent. Suivez les instructions de configuration dans votre agent de code préféré.",
"go.faq.q9": "Quelle est la différence entre les modèles gratuits et Go ?",
"go.faq.a9":
"Les modèles gratuits incluent Big Pickle ainsi que des modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go inclut Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash et Hy3 avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalent à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
"Les modèles gratuits incluent Big Pickle ainsi que les modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go propose une sélection de modèles avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalents à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
"zen.api.error.rateLimitExceeded": "Limite de débit dépassée. Veuillez réessayer plus tard.",
"zen.api.error.modelNotSupported": "Modèle {{model}} non pris en charge",
@@ -382,7 +395,7 @@ export const dict = {
"Vous avez atteint votre limite de dépense mensuelle de {{amount}} $. Gérez vos limites ici : {{membersUrl}}",
"zen.api.error.modelDisabled": "Le modèle est désactivé",
"zen.api.error.regionNotAllowed":
"Ce modèle est hébergé en Chine. Si vous souhaitez utiliser ce modèle, activez-le dans vos paramètres : {{consoleGoUrl}}",
"La dernière version de ce modèle est uniquement disponible avec un hébergement en Chine et nécessite votre consentement explicite : {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"La promotion gratuite de {{model}} est terminée. Vous pouvez continuer à utiliser le modèle en vous abonnant à OpenCode Go - {{link}}",
@@ -680,7 +693,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 le premier mois",
"workspace.lite.promo.modelsTitle": "Ce qui est inclus",
"workspace.lite.promo.footer":
"Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Les tarifs et les limites d'utilisation peuvent changer à mesure que nous apprenons des premières utilisations et des commentaires.",
"Ce forfait est principalement conçu pour les utilisateurs internationaux et offre un accès mondial stable. Les tarifs et les limites d'utilisation peuvent évoluer à mesure que nous tirons les enseignements des premières utilisations et des retours reçus.",
"workspace.lite.promo.subscribe": "S'abonner à Go",
"workspace.lite.promo.subscribing": "Redirection...",
"workspace.lite.promo.otherMethods": "Autres méthodes de paiement",
+22 -10
View File
@@ -254,9 +254,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "seguenti eccezioni",
"go.title": "OpenCode Go | Modelli di coding a basso costo per tutti",
"go.banner.text": "Kimi K3 offre limiti di utilizzo 2x superiori per un periodo limitato",
"go.banner.text": "GPT 5.6 Luna offre limiti di utilizzo 2x superiori per un periodo limitato",
"go.meta.description":
"Go inizia a $5 per il primo mese, poi $10/mese, con generosi limiti di richiesta di 5 ore per Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3.",
"Go inizia a $5 per il primo mese, poi $10/mese, con limiti di utilizzo generosi e un accesso affidabile ai principali modelli di coding.",
"go.hero.title": "Modelli di coding a basso costo per tutti",
"go.hero.body":
"Go porta il coding agentico ai programmatori di tutto il mondo. Offrendo limiti generosi e un accesso affidabile ai modelli open source più capaci, in modo da poter costruire con agenti potenti senza preoccuparsi dei costi o della disponibilità.",
@@ -303,8 +303,7 @@ export const dict = {
"go.problem.item1": "Prezzo di abbonamento a basso costo",
"go.problem.item2": "Limiti generosi e accesso affidabile",
"go.problem.item3": "Costruito per il maggior numero possibile di programmatori",
"go.problem.item4":
"Include Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3",
"go.problem.item4": "Una selezione curata di modelli testati per il coding agentico",
"go.how.title": "Come funziona Go",
"go.how.body": "Go inizia a $5 per il primo mese, poi $10/mese. Puoi usarlo con OpenCode o qualsiasi agente.",
"go.how.step1.title": "Crea un account",
@@ -329,7 +328,7 @@ export const dict = {
"go.faq.a2": "Go include i modelli elencati di seguito, con limiti generosi e accesso affidabile.",
"go.faq.q3": "Go è lo stesso di Zen?",
"go.faq.a3":
"No. Zen è a consumo, mentre Go inizia a $5 per il primo mese, poi $10/mese, con limiti generosi e accesso affidabile ai modelli open source Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3.",
"No. Zen è a consumo, mentre Go inizia a $5 per il primo mese, poi $10/mese, con limiti generosi e un accesso affidabile a una selezione curata di modelli.",
"go.faq.q4": "Quanto costa Go?",
"go.faq.a4.p1.beforePricing": "Go costa",
"go.faq.a4.p1.pricingLink": "$5 il primo mese",
@@ -338,8 +337,21 @@ export const dict = {
"go.faq.a4.p2.accountLink": "account",
"go.faq.a4.p3": "Annulla in qualsiasi momento.",
"go.faq.q5": "E per quanto riguarda dati e privacy?",
"go.faq.a5.body":
"Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati negli Stati Uniti, UE e Singapore per un accesso globale stabile. I nostri provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli.",
"go.faq.a5.model": "Modello",
"go.faq.a5.training": "Addestramento del modello",
"go.faq.a5.retention": "Conservazione dei dati",
"go.faq.a5.retention30": "30 giorni",
"go.faq.a5.retention0": "0 giorni",
"go.faq.a5.used": "Utilizzato",
"go.faq.a5.notUsed": "Non utilizzato",
"go.faq.a5.noAgreement": "Nessun accordo",
"go.faq.a5.grokRetention":
"ZDR disabilita importanti funzionalità API che dipendono dai dati archiviati, tra cui la Responses API con stato, Files and Collections e Batch API.",
"go.faq.a5.gptRetention":
"I log di monitoraggio degli abusi vengono generati per l'utilizzo di tutte le funzionalità API e conservati per un massimo di 30 giorni.",
"go.faq.a5.learnMore": "Scopri di più",
"go.faq.a5.deepseekRetention":
"L'accordo ZDR viene rinnovato mensilmente. L'accordo attuale è valido fino al 31 agosto 2026.",
"go.faq.a5.beforeExceptions":
"I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
"go.faq.a5.exceptionsLink": "seguenti eccezioni",
@@ -353,7 +365,7 @@ export const dict = {
"go.faq.q9": "Qual è la differenza tra i modelli gratuiti e Go?",
"go.faq.a9":
"I modelli gratuiti includono Big Pickle più modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go include Grok 4.5, GLM-5.2, GLM-5.1, Kimi K3, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash e Hy3 con quote di richiesta più elevate applicate su finestre mobili (5 ore, settimanale e mensile), approssimativamente equivalenti a $12 ogni 5 ore, $30 a settimana e $60 al mese (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).",
"I modelli gratuiti includono Big Pickle più i modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go offre una selezione curata di modelli con quote di richiesta più elevate applicate su finestre mobili (5 ore, settimanale e mensile), approssimativamente equivalenti a $12 ogni 5 ore, $30 a settimana e $60 al mese (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).",
"zen.api.error.rateLimitExceeded": "Limite di richieste superato. Riprova più tardi.",
"zen.api.error.modelNotSupported": "Modello {{model}} non supportato",
@@ -378,7 +390,7 @@ export const dict = {
"Hai raggiunto il tuo limite di spesa mensile di ${{amount}}. Gestisci i tuoi limiti qui: {{membersUrl}}",
"zen.api.error.modelDisabled": "Il modello è disabilitato",
"zen.api.error.regionNotAllowed":
"Questo modello è ospitato in Cina. Se vuoi usare questo modello, abilitalo nelle tue impostazioni: {{consoleGoUrl}}",
"La versione più recente di questo modello è disponibile solo con hosting in Cina e richiede un consenso esplicito: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"La promozione gratuita di {{model}} è terminata. Puoi continuare a usare il modello abbonandoti a OpenCode Go - {{link}}",
@@ -672,7 +684,7 @@ export const dict = {
"workspace.lite.promo.price": "$5 il primo mese",
"workspace.lite.promo.modelsTitle": "Cosa è incluso",
"workspace.lite.promo.footer":
"Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati in US, EU e Singapore per un accesso globale stabile. I prezzi e i limiti di utilizzo potrebbero cambiare man mano che impariamo dall'utilizzo iniziale e dal feedback.",
"Il piano è pensato principalmente per gli utenti internazionali e offre un accesso globale stabile. I prezzi e i limiti di utilizzo potrebbero cambiare in base a quanto apprenderemo dall'utilizzo iniziale e dai feedback.",
"workspace.lite.promo.subscribe": "Abbonati a Go",
"workspace.lite.promo.subscribing": "Reindirizzamento...",
"workspace.lite.promo.otherMethods": "Altri metodi di pagamento",
+20 -10
View File
@@ -253,9 +253,9 @@ export const dict = {
"zen.privacy.exceptionsLink": "以下の例外",
"go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル",
"go.banner.text": "Kimi K3の利用上限が期間限定で2倍に",
"go.banner.text": "GPT 5.6 Lunaの利用上限が期間限定で2倍に",
"go.meta.description":
"Goは最初の月$5、その後$10/月で、Grok 4.5、GLM-5.2、GLM-5.1、Kimi K3、Kimi K2.7 Code、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flash、Hy3に対して5時間のゆとりあるリクエスト上限があります。",
"Goは最初の月$5、その後$10/月で、主要なコーディングモデルへのゆとりある利用上限と安定したアクセスを提供します。",
"go.hero.title": "すべての人のための低価格なコーディングモデル",
"go.hero.body":
"Goは、世界中のプログラマーにエージェント型コーディングをもたらします。最も高性能なオープンソースモデルへの十分な制限と安定したアクセスを提供し、コストや可用性を気にすることなく強力なエージェントで構築できます。",
@@ -303,8 +303,7 @@ export const dict = {
"go.problem.item1": "低価格なサブスクリプション料金",
"go.problem.item2": "十分な制限と安定したアクセス",
"go.problem.item3": "できるだけ多くのプログラマーのために構築",
"go.problem.item4":
"Grok 4.5、GLM-5.2、GLM-5.1、Kimi K3、Kimi K2.7 Code、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flash、Hy3を含む",
"go.problem.item4": "エージェント型コーディング向けにテストされた厳選モデルラインナップ",
"go.how.title": "Goの仕組み",
"go.how.body": "Goは最初の月$5、その後$10/月で始まります。OpenCodeまたは任意のエージェントで使えます。",
"go.how.step1.title": "アカウントを作成",
@@ -329,7 +328,7 @@ export const dict = {
"go.faq.a2": "Go には、十分な利用上限と安定したアクセスを備えた、以下のモデルが含まれます。",
"go.faq.q3": "GoはZenと同じですか?",
"go.faq.a3":
"いいえ。Zenは従量課金制ですが、Goは最初の月$5、その後$10/月で始まり、Grok 4.5、GLM-5.2、GLM-5.1、Kimi K3、Kimi K2.7 Code、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flash、Hy3のオープンソースモデルに対して、ゆとりある上限と信頼できるアクセスを提供します。",
"いいえ。Zenは従量課金制ですが、Goは最初の月$5、その後$10/月で、厳選されたモデルラインナップへのゆとりある上限と安定したアクセスを提供します。",
"go.faq.q4": "Goの料金は?",
"go.faq.a4.p1.beforePricing": "Goは",
"go.faq.a4.p1.pricingLink": "最初の月$5",
@@ -338,8 +337,19 @@ export const dict = {
"go.faq.a4.p2.accountLink": "アカウント",
"go.faq.a4.p3": "いつでもキャンセル可能です。",
"go.faq.q5": "データとプライバシーは?",
"go.faq.a5.body":
"このプランは主に海外ユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。プロバイダーはゼロ保持ポリシーに従い、お客様のデータをモデルのトレーニングに使用しません。",
"go.faq.a5.model": "モデル",
"go.faq.a5.training": "モデルのトレーニング",
"go.faq.a5.retention": "データ保持",
"go.faq.a5.retention30": "30日",
"go.faq.a5.retention0": "0日",
"go.faq.a5.used": "使用あり",
"go.faq.a5.notUsed": "使用なし",
"go.faq.a5.noAgreement": "契約なし",
"go.faq.a5.grokRetention":
"ZDRでは、保存データに依存する重要なAPI機能(ステートフルなResponses API、Files and Collections、Batch APIなど)が無効になります。",
"go.faq.a5.gptRetention": "不正使用監視ログはすべてのAPI機能の使用時に生成され、最大30日間保持されます。",
"go.faq.a5.learnMore": "詳しく見る",
"go.faq.a5.deepseekRetention": "ZDR契約は毎月更新されます。現在の契約は2026年8月31日まで有効です。",
"go.faq.a5.beforeExceptions":
"Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
"go.faq.a5.exceptionsLink": "以下の例外",
@@ -353,7 +363,7 @@ export const dict = {
"go.faq.q9": "無料モデルとGoの違いは何ですか?",
"go.faq.a9":
"無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。GoにはGrok 4.5、GLM-5.2、GLM-5.1、Kimi K3、Kimi K2.7 Code、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flash、Hy3が含まれ、ローリングウィンドウ(5時間、週間、月間)全体でより高いリクエスト制限が適用されます。これは概算で5時間あたり$12、週間$30、月間$60相当です(実際のリクエスト数はモデルと使用状況により異なります)。",
"無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。Goでは厳選されたモデルラインナップを利用でき、ローリングウィンドウ(5時間、週間、月間)全体でより高いリクエスト制限が適用されます。これは概算で5時間あたり$12、週間$30、月間$60相当です(実際のリクエスト数はモデルと使用状況により異なります)。",
"zen.api.error.rateLimitExceeded": "レート制限を超えました。後でもう一度お試しください。",
"zen.api.error.modelNotSupported": "モデル {{model}} はサポートされていません",
@@ -379,7 +389,7 @@ export const dict = {
"月額の利用上限 ${{amount}} に達しました。こちらから上限を管理してください: {{membersUrl}}",
"zen.api.error.modelDisabled": "モデルが無効です",
"zen.api.error.regionNotAllowed":
"このモデルは中国でホストされています。このモデルを使用したい場合は、設定で有効にしてください: {{consoleGoUrl}}",
"このモデルの最新バージョンは中国でのみホスト提供されており、利用するには明示的なオプトインが必要です: {{consoleGoUrl}}",
"zen.api.error.trialEnded":
"{{model}} の無料プロモーションは終了しました。OpenCode Go を購読するとモデルを引き続き使用できます - {{link}}",
@@ -672,7 +682,7 @@ export const dict = {
"workspace.lite.promo.price": "初月$5",
"workspace.lite.promo.modelsTitle": "含まれるもの",
"workspace.lite.promo.footer":
"このプランは主にグローバルユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。料金と利用限は、初期の利用状況やフィードバックに基づいて変更される可能性があります。",
"このプランは主に海外のユーザー向けに設計されており、世界中から安定してご利用いただけます。料金と利用限は、初期の利用状況やフィードバックを踏まえて変更される場合があります。",
"workspace.lite.promo.subscribe": "Goを購読する",
"workspace.lite.promo.subscribing": "リダイレクト中...",
"workspace.lite.promo.otherMethods": "その他の支払い方法",

Some files were not shown because too many files have changed in this diff Show More