Compare commits

...

105 Commits
review ... dev

Author SHA1 Message Date
github-actions[bot]
5bdf1c4b96 Update VOUCHED list
https://github.com/anomalyco/opencode/issues/13076#issuecomment-3888412535
2026-02-12 03:05:00 +00:00
Kit Langton
135f8ffb2a feat(tui): add toggle to hide session header (#13244) 2026-02-12 02:21:42 +00:00
dpuyosa
bf5a01edd9 feat(opencode): Venice Add automatic variant generation for Venice models (#12106) 2026-02-11 20:21:29 -06:00
Adam
81ca2df6ad fix(app): guard randomUUID in insecure browser contexts (#13237)
Co-authored-by: Selim <31136147+selimerunkut@users.noreply.github.com>
2026-02-12 01:05:15 +00:00
Adam
aea68c386a fix(docs): locale translations for nav elements and headings 2026-02-11 18:51:50 -06:00
Adam
8eea53a41e docs(ar): second-pass localization cleanup 2026-02-11 18:51:50 -06:00
Aiden Cline
3befd0c6c5 tweak: use promise all for mcp listTools calls (#13229) 2026-02-12 00:19:53 +00:00
opencode-agent[bot]
8577eb8ec9 chore: update nix node_modules hashes 2026-02-11 23:39:24 +00:00
Luke Parker
c856f875a1 chore: upgrade bun to 1.3.9 (#13223) 2026-02-12 09:27:58 +10:00
opencode-agent[bot]
264dd213f9 chore: update nix node_modules hashes 2026-02-11 23:22:01 +00:00
Sebastian
125727d09c upgrade opentui to 0.1.79 (#13036) 2026-02-12 00:13:11 +01:00
Aiden Cline
8c7b35ad05 tweak: compaction check (#13214) 2026-02-11 21:43:04 +00:00
github-actions[bot]
e2a33f75e1 Update VOUCHED list
https://github.com/anomalyco/opencode/issues/13204#issuecomment-3887062726
2026-02-11 20:40:39 +00:00
Aiden Cline
006d673ed2 tweak: make read tool offset 1 indexed instead of 0 to avoid confusion that could be caused by line #s being 1 based (#13198) 2026-02-11 14:02:30 -06:00
Aiden Cline
6b4d617df0 feat: adjust read tool so that it can handle dirs too (#13090) 2026-02-11 13:23:00 -06:00
Dax Raad
e3471526f4 add square logo variants to brand page 2026-02-11 13:47:54 -05:00
Adam
6b30e0b752 chore: update docs sync workflow 2026-02-11 11:47:32 -06:00
Adam
fbabce1125 fix(app): translations 2026-02-11 11:03:35 -06:00
opencode-agent[bot]
8f56ed5b85 chore: generate 2026-02-11 17:00:20 +00:00
Filip
81b5a6a08b fix(app):workspace reset (#13170)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2026-02-11 10:59:09 -06:00
opencode-agent[bot]
94cb6390aa chore: generate 2026-02-11 15:37:06 +00:00
opencode
42bea5d297 release: v1.1.59 2026-02-11 15:37:00 +00:00
Adam
f252e3234c fix(app): translations 2026-02-11 09:19:16 -06:00
Filip
eef3ae3e1f Fix/reverception (#13166)
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
2026-02-11 09:18:44 -06:00
Adam
fc88dde63f test(app): more e2e tests (#13162) 2026-02-11 15:12:28 +00:00
Adam
4619e9d183 fix(app): sidebar remount 2026-02-11 15:12:28 +00:00
opencode
4dc363f306 release: v1.1.58 2026-02-11 15:12:01 +00:00
Adam
2e8082dd21 Revert "feat(desktop): add WSL backend mode (#12914)"
This reverts commit 213a87234d.
2026-02-11 08:51:41 -06:00
Adam
a52fe28246 fix(app): notifications on child sessions 2026-02-11 08:47:27 -06:00
Adam
8c5ba8aeb0 fix(app): terminal PTY buffer carryover 2026-02-11 08:47:26 -06:00
Adam
50330820c0 fix(console): translations 2026-02-11 08:47:26 -06:00
Adam
7222fc0ba0 fix(app): terminal resize 2026-02-11 08:47:26 -06:00
Kit Langton
17bdb5d56a fix(tui): dismiss dialogs with ctrl+c (#12884) 2026-02-11 09:03:59 -05:00
Kit Langton
7a463cd193 fix(tui): keep /share available to copy existing link (#12532) 2026-02-11 08:58:24 -05:00
Kit Langton
352a54c698 feat(prompt): mode-specific input placeholders (#12388) 2026-02-11 08:57:59 -05:00
Kit Langton
93957da2c9 fix(tui): prevent home wordmark corruption in height-constrained terminals (#13069) 2026-02-11 08:52:14 -05:00
opencode
edcfd562af release: v1.1.57 2026-02-11 13:45:34 +00:00
Adam
ef5ec5dc28 fix(app): terminal copy/paste 2026-02-11 07:19:33 -06:00
Adam
c426cb0f14 fix(app): copy path button styles 2026-02-11 07:19:33 -06:00
Shintaro Jokagi
dd1862cc2b fix(web): prevent language select label truncation (#13100) 2026-02-11 06:43:48 -06:00
Brendan Allan
a25b2af05a desktop: use tracing for logging (#13135) 2026-02-11 11:36:27 +00:00
Jack
8bfd6fdba2 fix: encode non-ASCII directory paths in v1 SDK HTTP headers (#13131) 2026-02-11 05:33:25 -06:00
Filip
cf7a1b8d80 feat(desktop): enhance Windows app resolution and UI loading states (#13084) 2026-02-11 04:40:52 -06:00
opencode-agent[bot]
5ba4c0e024 chore: generate 2026-02-11 10:38:52 +00:00
Jun
567e094e6c docs(ko): improve translations for intro, cli, and commands (#13094) 2026-02-11 04:37:52 -06:00
webwww123
b523998329 fix(docs): avoid footer language selector truncation (#13124) 2026-02-11 04:33:50 -06:00
Adam
7e1247c420 fix(desktop): server spawn resilience (#13028)
Co-authored-by: Brendan Allan <git@brendonovich.dev>
2026-02-11 09:44:26 +00:00
Brendan Allan
783888131e fix(desktop): read wayland preference from store (#13081) 2026-02-11 08:10:24 +00:00
Brendan Allan
213a87234d feat(desktop): add WSL backend mode (#12914) 2026-02-11 07:49:48 +00:00
Aiden Cline
d98bd4bd52 fix: add additional context overflow cases, remove overcorrecting ones (#13077) 2026-02-10 23:30:29 -06:00
Frank
22125d1347 wip: zen 2026-02-11 00:05:04 -05:00
Ariane Emory
8c120f2fab docs: remove 'Migrating to 1.0' documentation section (#13076) 2026-02-10 22:52:02 -06:00
opencode-agent[bot]
c6ec2f47ef chore: generate 2026-02-11 01:56:08 +00:00
Aiden Cline
0fd6f365be fix(core): ensure compaction is more reliable, add reserve token buffer to ensure that input window has enough room to compact (#12924)
Co-authored-by: James Lal <james@littlebearlabs.io>
2026-02-10 19:55:22 -06:00
Aiden Cline
60bdb6e9ba tweak: /review prompt to look for behavior changes more explicitly (#13049) 2026-02-10 19:44:42 -06:00
Dax
6e9cd576ea fix(tui): default session sidebar to auto (#13046) 2026-02-11 01:26:01 +00:00
OpeOginni
53ec15a56a fix(tui): improve amazon-bedrock check to include container credentials (#13037) 2026-02-10 18:51:49 -06:00
github-actions[bot]
a90b62267f Update VOUCHED list
https://github.com/anomalyco/opencode/issues/12841#issuecomment-3881500535
2026-02-11 00:37:36 +00:00
Frank
24556331c8 wip: zen 2026-02-10 17:56:10 -05:00
Frank
39145b99e8 wip: zen 2026-02-10 17:44:00 -05:00
Frank
0afa6e03a8 wip: zen 2026-02-10 17:36:32 -05:00
Frank
7a3c775dc1 wip: zen 2026-02-10 17:24:03 -05:00
Frank
3ea58bb790 wip: zen 2026-02-10 17:15:01 -05:00
Adam
50c705cd2d fix(docs): locale translations 2026-02-10 22:12:32 +00:00
Frank
3894c217cc wip: zen 2026-02-10 22:12:32 +00:00
Adam
66c2bb8f37 chore: update website stats 2026-02-10 22:12:32 +00:00
opencode
1bbbd51d48 release: v1.1.56 2026-02-10 22:12:25 +00:00
Adam
50f3e74d05 fix(app): task tool rendering 2026-02-10 15:28:46 -06:00
Adam
21475a1dfd fix(docs): invalid markdown 2026-02-10 15:18:57 -06:00
Filip
dce4c05fa9 fix(desktop): open apps with executables on Windows (#13022) 2026-02-10 15:10:58 -06:00
Frank
8c56571ef9 zen: log error 2026-02-10 15:55:33 -05:00
Adam
92a77b72fb fix(app): don't close sidebar on session change (#13013) 2026-02-10 14:45:52 -06:00
opencode-agent[bot]
4f6b929784 chore: generate 2026-02-10 20:22:31 +00:00
Adam
55119559b3 fix(app): don't scroll code search input 2026-02-10 20:22:31 +00:00
Adam
fd5531316f fix(docs): locale translations 2026-02-10 20:22:30 +00:00
opencode
fbc41475b4 release: v1.1.55 2026-02-10 20:21:34 +00:00
Dax Raad
a0673256db core: increase test timeout to 30s to prevent failures during package installation 2026-02-10 14:25:25 -05:00
Adam
fc37337a3e fix(app): memory leak with platform fetch for events 2026-02-10 13:18:33 -06:00
Adam
80220cebe4 fix(app): disable terminal transparency 2026-02-10 13:11:31 -06:00
Dax
8bdf6fa359 fix: show helpful message when free usage limit is exceeded (#13005) 2026-02-10 19:04:10 +00:00
opencode
1d11a0adfd release: v1.1.54 2026-02-10 19:04:02 +00:00
Adam
1e2f664410 fix(app): back to platform fetch for now 2026-02-10 12:40:26 -06:00
Adam
a3aad9c9bf fix(app): include basic auth 2026-02-10 12:37:28 -06:00
Frank
eb2587844b zen: retry on 429 2026-02-10 13:35:16 -05:00
Adam
d863a9cf4e fix(app): global event default fetch 2026-02-10 12:29:01 -06:00
Frank
7d5be1556a wip: zen 2026-02-10 13:07:08 -05:00
Adam
659f15aa9b fix(app): no changes in review pane 2026-02-10 11:53:33 -06:00
Adam
d1f5b9e911 fix(app): memory leak with event fetch 2026-02-10 11:30:58 -06:00
Adam
284b00ff23 fix(app): don't dispose instance after reset workspace 2026-02-10 10:57:50 -06:00
Adam
2c5760742b chore: translator agent 2026-02-10 10:36:28 -06:00
Adam
70c794e913 fix(app): regressions 2026-02-10 10:15:37 -06:00
Adam
3929f0b5bd fix(app): terminal replay (#12991) 2026-02-10 10:15:19 -06:00
Adam
6f5dfe125a fix(app): use agent configured variant (#12993) 2026-02-10 10:15:09 -06:00
Dax
27fa9dc843 refactor: clean up dialog-model.tsx per code review (#12983) 2026-02-10 15:13:37 +00:00
Adam
1e03a55acd fix(app): persist defensiveness (#12973) 2026-02-10 07:47:05 -06:00
Filip
65c9669283 test(e2e): redo & undo test (#12974) 2026-02-10 07:46:48 -06:00
opencode-agent[bot]
18b6257119 chore: generate 2026-02-10 13:39:21 +00:00
Adam
c607c01fb9 chore: fix e2e tests 2026-02-10 07:38:13 -06:00
Adam
4c4e30cd71 fix(docs): locale translations 2026-02-10 07:11:19 -06:00
Adam
19ad7ad809 chore: fix test 2026-02-10 07:06:20 -06:00
Peter Dave Hello
87795384de chore: fix typos and GitHub capitalization (#12852) 2026-02-10 06:53:38 -06:00
Paul
0732ab3393 fix: use absolute paths for sidebar session navigation (#12898) 2026-02-10 06:48:55 -06:00
Ole-Martin Bratteng
2bccfd7462 chore: fix some norwegian i18n issues (#12935) 2026-02-10 06:46:32 -06:00
Adam
83853cc5e6 fix(app): new session in workspace choosing wrong workspace 2026-02-10 06:02:17 -06:00
Adam
4a73d51acd fix(app): workspace reset issues 2026-02-10 05:52:34 -06:00
779 changed files with 31834 additions and 25984 deletions

3
.github/VOUCHED.td vendored
View File

@@ -8,6 +8,8 @@
# - Denounce with minus prefix: -username or -platform:username.
# - Optional details after a space following the handle.
adamdotdevin
ariane-emory
-florianleibert
fwang
iamdavidhill
jayair
@@ -15,4 +17,5 @@ kitlangton
kommander
r44vc0rp
rekram1-node
-spider-yamet clawdbot/llm psychosis, spam pinging the team
thdxr

View File

@@ -1,6 +1,6 @@
### What does this PR do?
Please provide a description of the issue (if there is one), the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the pr.
Please provide a description of the issue (if there is one), the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the PR.
**If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!**

View File

@@ -64,10 +64,13 @@ jobs:
Requirements:
1. Update all relevant locale docs under packages/web/src/content/docs/<locale>/ so they reflect these English page changes.
2. Preserve frontmatter keys, internal links, code blocks, and existing locale-specific metadata unless the English change requires an update.
3. Keep locale docs structure aligned with their corresponding English pages.
4. Do not modify English source docs in packages/web/src/content/docs/*.mdx.
5. If no locale updates are needed, make no changes.
2. You MUST use the Task tool for translation work and launch subagents with subagent_type `translator` (defined in .opencode/agent/translator.md).
3. Do not translate directly in the primary agent. Use translator subagent output as the source for locale text updates.
4. Run translator subagent Task calls in parallel whenever file/locale translation work is independent.
5. Preserve frontmatter keys, internal links, code blocks, and existing locale-specific metadata unless the English change requires an update.
6. Keep locale docs structure aligned with their corresponding English pages.
7. Do not modify English source docs in packages/web/src/content/docs/*.mdx.
8. If no locale updates are needed, make no changes.
- name: Commit and push locale docs updates
if: steps.changes.outputs.has_changes == 'true'

View File

@@ -0,0 +1,883 @@
---
description: Translate content for a specified locale while preserving technical terms
mode: subagent
model: opencode/gemini-3-pro
---
You are a professional translator and localization specialist.
Translate the user's content into the requested target locale (language + region, e.g. fr-FR, de-DE).
Requirements:
- Preserve meaning, intent, tone, and formatting (including Markdown/MDX structure).
- Preserve all technical terms and artifacts exactly: product/company names, API names, identifiers, code, commands/flags, file paths, URLs, versions, error messages, config keys/values, and anything inside inline code or code blocks.
- Also preserve every term listed in the Do-Not-Translate glossary below.
- Do not modify fenced code blocks.
- Output ONLY the translation (no commentary).
If the target locale is missing, ask the user to provide it.
---
# Do-Not-Translate Terms (OpenCode Docs)
Generated from: `packages/web/src/content/docs/*.mdx` (default English docs)
Generated on: 2026-02-10
Use this as a translation QA checklist / glossary. Preserve listed terms exactly (spelling, casing, punctuation).
General rules (verbatim, even if not listed below):
- Anything inside inline code (single backticks) or fenced code blocks (triple backticks)
- MDX/JS code in docs: `import ... from "..."`, component tags, identifiers
- CLI commands, flags, config keys/values, file paths, URLs/domains, and env vars
## Proper nouns and product names
Additional (not reliably captured via link text):
```text
Astro
Bun
Chocolatey
Cursor
Docker
Git
GitHub Actions
GitLab CI
GNOME Terminal
Homebrew
Mise
Neovim
Node.js
npm
Obsidian
opencode
opencode-ai
Paru
pnpm
ripgrep
Scoop
SST
Starlight
Visual Studio Code
VS Code
VSCodium
Windsurf
Windows Terminal
Yarn
Zellij
Zed
anomalyco
```
Extracted from link labels in the English docs (review and prune as desired):
```text
@openspoon/subtask2
302.AI console
ACP progress report
Agent Client Protocol
Agent Skills
Agentic
AGENTS.md
AI SDK
Alacritty
Anthropic
Anthropic's Data Policies
Atom One
Avante.nvim
Ayu
Azure AI Foundry
Azure portal
Baseten
built-in GITHUB_TOKEN
Bun.$
Catppuccin
Cerebras console
ChatGPT Plus or Pro
Cloudflare dashboard
CodeCompanion.nvim
CodeNomad
Configuring Adapters: Environment Variables
Context7 MCP server
Cortecs console
Deep Infra dashboard
DeepSeek console
Duo Agent Platform
Everforest
Fireworks AI console
Firmware dashboard
Ghostty
GitLab CLI agents docs
GitLab docs
GitLab User Settings > Access Tokens
Granular Rules (Object Syntax)
Grep by Vercel
Groq console
Gruvbox
Helicone
Helicone documentation
Helicone Header Directory
Helicone's Model Directory
Hugging Face Inference Providers
Hugging Face settings
install WSL
IO.NET console
JetBrains IDE
Kanagawa
Kitty
MiniMax API Console
Models.dev
Moonshot AI console
Nebius Token Factory console
Nord
OAuth
Ollama integration docs
OpenAI's Data Policies
OpenChamber
OpenCode
OpenCode config
OpenCode Config
OpenCode TUI with the opencode theme
OpenCode Web - Active Session
OpenCode Web - New Session
OpenCode Web - See Servers
OpenCode Zen
OpenCode-Obsidian
OpenRouter dashboard
OpenWork
OVHcloud panel
Pro+ subscription
SAP BTP Cockpit
Scaleway Console IAM settings
Scaleway Generative APIs
SDK documentation
Sentry MCP server
shell API
Together AI console
Tokyonight
Unified Billing
Venice AI console
Vercel dashboard
WezTerm
Windows Subsystem for Linux (WSL)
WSL
WSL (Windows Subsystem for Linux)
WSL extension
xAI console
Z.AI API console
Zed
ZenMux dashboard
Zod
```
## Acronyms and initialisms
```text
ACP
AGENTS
AI
AI21
ANSI
API
AST
AWS
BTP
CD
CDN
CI
CLI
CMD
CORS
DEBUG
EKS
ERROR
FAQ
GLM
GNOME
GPT
HTML
HTTP
HTTPS
IAM
ID
IDE
INFO
IO
IP
IRSA
JS
JSON
JSONC
K2
LLM
LM
LSP
M2
MCP
MR
NET
NPM
NTLM
OIDC
OS
PAT
PATH
PHP
PR
PTY
README
RFC
RPC
SAP
SDK
SKILL
SSE
SSO
TS
TTY
TUI
UI
URL
US
UX
VCS
VPC
VPN
VS
WARN
WSL
X11
YAML
```
## Code identifiers used in prose (CamelCase, mixedCase)
```text
apiKey
AppleScript
AssistantMessage
baseURL
BurntSushi
ChatGPT
ClangFormat
CodeCompanion
CodeNomad
DeepSeek
DefaultV2
FileContent
FileDiff
FileNode
fineGrained
FormatterStatus
GitHub
GitLab
iTerm2
JavaScript
JetBrains
macOS
mDNS
MiniMax
NeuralNomadsAI
NickvanDyke
NoeFabris
OpenAI
OpenAPI
OpenChamber
OpenCode
OpenRouter
OpenTUI
OpenWork
ownUserPermissions
PowerShell
ProviderAuthAuthorization
ProviderAuthMethod
ProviderInitError
SessionStatus
TabItem
tokenType
ToolIDs
ToolList
TypeScript
typesUrl
UserMessage
VcsInfo
WebView2
WezTerm
xAI
ZenMux
```
## OpenCode CLI commands (as shown in docs)
```text
opencode
opencode [project]
opencode /path/to/project
opencode acp
opencode agent [command]
opencode agent create
opencode agent list
opencode attach [url]
opencode attach http://10.20.30.40:4096
opencode attach http://localhost:4096
opencode auth [command]
opencode auth list
opencode auth login
opencode auth logout
opencode auth ls
opencode export [sessionID]
opencode github [command]
opencode github install
opencode github run
opencode import <file>
opencode import https://opncd.ai/s/abc123
opencode import session.json
opencode mcp [command]
opencode mcp add
opencode mcp auth [name]
opencode mcp auth list
opencode mcp auth ls
opencode mcp auth my-oauth-server
opencode mcp auth sentry
opencode mcp debug <name>
opencode mcp debug my-oauth-server
opencode mcp list
opencode mcp logout [name]
opencode mcp logout my-oauth-server
opencode mcp ls
opencode models --refresh
opencode models [provider]
opencode models anthropic
opencode run [message..]
opencode run Explain the use of context in Go
opencode serve
opencode serve --cors http://localhost:5173 --cors https://app.example.com
opencode serve --hostname 0.0.0.0 --port 4096
opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
opencode session [command]
opencode session list
opencode stats
opencode uninstall
opencode upgrade
opencode upgrade [target]
opencode upgrade v0.1.48
opencode web
opencode web --cors https://example.com
opencode web --hostname 0.0.0.0
opencode web --mdns
opencode web --mdns --mdns-domain myproject.local
opencode web --port 4096
opencode web --port 4096 --hostname 0.0.0.0
opencode.server.close()
```
## Slash commands and routes
```text
/agent
/auth/:id
/clear
/command
/config
/config/providers
/connect
/continue
/doc
/editor
/event
/experimental/tool?provider=<p>&model=<m>
/experimental/tool/ids
/export
/file?path=<path>
/file/content?path=<p>
/file/status
/find?pattern=<pat>
/find/file
/find/file?query=<q>
/find/symbol?query=<q>
/formatter
/global/event
/global/health
/help
/init
/instance/dispose
/log
/lsp
/mcp
/mnt/
/mnt/c/
/mnt/d/
/models
/oc
/opencode
/path
/project
/project/current
/provider
/provider/{id}/oauth/authorize
/provider/{id}/oauth/callback
/provider/auth
/q
/quit
/redo
/resume
/session
/session/:id
/session/:id/abort
/session/:id/children
/session/:id/command
/session/:id/diff
/session/:id/fork
/session/:id/init
/session/:id/message
/session/:id/message/:messageID
/session/:id/permissions/:permissionID
/session/:id/prompt_async
/session/:id/revert
/session/:id/share
/session/:id/shell
/session/:id/summarize
/session/:id/todo
/session/:id/unrevert
/session/status
/share
/summarize
/theme
/tui
/tui/append-prompt
/tui/clear-prompt
/tui/control/next
/tui/control/response
/tui/execute-command
/tui/open-help
/tui/open-models
/tui/open-sessions
/tui/open-themes
/tui/show-toast
/tui/submit-prompt
/undo
/Users/username
/Users/username/projects/*
/vcs
```
## CLI flags and short options
```text
--agent
--attach
--command
--continue
--cors
--cwd
--days
--dir
--dry-run
--event
--file
--force
--fork
--format
--help
--hostname
--hostname 0.0.0.0
--keep-config
--keep-data
--log-level
--max-count
--mdns
--mdns-domain
--method
--model
--models
--port
--print-logs
--project
--prompt
--refresh
--session
--share
--title
--token
--tools
--verbose
--version
--wait
-c
-d
-f
-h
-m
-n
-s
-v
```
## Environment variables
```text
AI_API_URL
AI_FLOW_CONTEXT
AI_FLOW_EVENT
AI_FLOW_INPUT
AICORE_DEPLOYMENT_ID
AICORE_RESOURCE_GROUP
AICORE_SERVICE_KEY
ANTHROPIC_API_KEY
AWS_ACCESS_KEY_ID
AWS_BEARER_TOKEN_BEDROCK
AWS_PROFILE
AWS_REGION
AWS_ROLE_ARN
AWS_SECRET_ACCESS_KEY
AWS_WEB_IDENTITY_TOKEN_FILE
AZURE_COGNITIVE_SERVICES_RESOURCE_NAME
AZURE_RESOURCE_NAME
CI_PROJECT_DIR
CI_SERVER_FQDN
CI_WORKLOAD_REF
CLOUDFLARE_ACCOUNT_ID
CLOUDFLARE_API_TOKEN
CLOUDFLARE_GATEWAY_ID
CONTEXT7_API_KEY
GITHUB_TOKEN
GITLAB_AI_GATEWAY_URL
GITLAB_HOST
GITLAB_INSTANCE_URL
GITLAB_OAUTH_CLIENT_ID
GITLAB_TOKEN
GITLAB_TOKEN_OPENCODE
GOOGLE_APPLICATION_CREDENTIALS
GOOGLE_CLOUD_PROJECT
HTTP_PROXY
HTTPS_PROXY
K2_
MY_API_KEY
MY_ENV_VAR
MY_MCP_CLIENT_ID
MY_MCP_CLIENT_SECRET
NO_PROXY
NODE_ENV
NODE_EXTRA_CA_CERTS
NPM_AUTH_TOKEN
OC_ALLOW_WAYLAND
OPENCODE_API_KEY
OPENCODE_AUTH_JSON
OPENCODE_AUTO_SHARE
OPENCODE_CLIENT
OPENCODE_CONFIG
OPENCODE_CONFIG_CONTENT
OPENCODE_CONFIG_DIR
OPENCODE_DISABLE_AUTOCOMPACT
OPENCODE_DISABLE_AUTOUPDATE
OPENCODE_DISABLE_CLAUDE_CODE
OPENCODE_DISABLE_CLAUDE_CODE_PROMPT
OPENCODE_DISABLE_CLAUDE_CODE_SKILLS
OPENCODE_DISABLE_DEFAULT_PLUGINS
OPENCODE_DISABLE_FILETIME_CHECK
OPENCODE_DISABLE_LSP_DOWNLOAD
OPENCODE_DISABLE_MODELS_FETCH
OPENCODE_DISABLE_PRUNE
OPENCODE_DISABLE_TERMINAL_TITLE
OPENCODE_ENABLE_EXA
OPENCODE_ENABLE_EXPERIMENTAL_MODELS
OPENCODE_EXPERIMENTAL
OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS
OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT
OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER
OPENCODE_EXPERIMENTAL_EXA
OPENCODE_EXPERIMENTAL_FILEWATCHER
OPENCODE_EXPERIMENTAL_ICON_DISCOVERY
OPENCODE_EXPERIMENTAL_LSP_TOOL
OPENCODE_EXPERIMENTAL_LSP_TY
OPENCODE_EXPERIMENTAL_MARKDOWN
OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX
OPENCODE_EXPERIMENTAL_OXFMT
OPENCODE_EXPERIMENTAL_PLAN_MODE
OPENCODE_FAKE_VCS
OPENCODE_GIT_BASH_PATH
OPENCODE_MODEL
OPENCODE_MODELS_URL
OPENCODE_PERMISSION
OPENCODE_PORT
OPENCODE_SERVER_PASSWORD
OPENCODE_SERVER_USERNAME
PROJECT_ROOT
RESOURCE_NAME
RUST_LOG
VARIABLE_NAME
VERTEX_LOCATION
XDG_CONFIG_HOME
```
## Package/module identifiers
```text
../../../config.mjs
@astrojs/starlight/components
@opencode-ai/plugin
@opencode-ai/sdk
path
shescape
zod
@
@ai-sdk/anthropic
@ai-sdk/cerebras
@ai-sdk/google
@ai-sdk/openai
@ai-sdk/openai-compatible
@File#L37-42
@modelcontextprotocol/server-everything
@opencode
```
## GitHub owner/repo slugs referenced in docs
```text
24601/opencode-zellij-namer
angristan/opencode-wakatime
anomalyco/opencode
apps/opencode-agent
athal7/opencode-devcontainers
awesome-opencode/awesome-opencode
backnotprop/plannotator
ben-vargas/ai-sdk-provider-opencode-sdk
btriapitsyn/openchamber
BurntSushi/ripgrep
Cluster444/agentic
code-yeongyu/oh-my-opencode
darrenhinde/opencode-agents
different-ai/opencode-scheduler
different-ai/openwork
features/copilot
folke/tokyonight.nvim
franlol/opencode-md-table-formatter
ggml-org/llama.cpp
ghoulr/opencode-websearch-cited.git
H2Shami/opencode-helicone-session
hosenur/portal
jamesmurdza/daytona
jenslys/opencode-gemini-auth
JRedeker/opencode-morph-fast-apply
JRedeker/opencode-shell-strategy
kdcokenny/ocx
kdcokenny/opencode-background-agents
kdcokenny/opencode-notify
kdcokenny/opencode-workspace
kdcokenny/opencode-worktree
login/device
mohak34/opencode-notifier
morhetz/gruvbox
mtymek/opencode-obsidian
NeuralNomadsAI/CodeNomad
nick-vi/opencode-type-inject
NickvanDyke/opencode.nvim
NoeFabris/opencode-antigravity-auth
nordtheme/nord
numman-ali/opencode-openai-codex-auth
olimorris/codecompanion.nvim
panta82/opencode-notificator
rebelot/kanagawa.nvim
remorses/kimaki
sainnhe/everforest
shekohex/opencode-google-antigravity-auth
shekohex/opencode-pty.git
spoons-and-mirrors/subtask2
sudo-tee/opencode.nvim
supermemoryai/opencode-supermemory
Tarquinen/opencode-dynamic-context-pruning
Th3Whit3Wolf/one-nvim
upstash/context7
vtemian/micode
vtemian/octto
yetone/avante.nvim
zenobi-us/opencode-plugin-template
zenobi-us/opencode-skillful
```
## Paths, filenames, globs, and URLs
```text
./.opencode/themes/*.json
./<project-slug>/storage/
./config/#custom-directory
./global/storage/
.agents/skills/*/SKILL.md
.agents/skills/<name>/SKILL.md
.clang-format
.claude
.claude/skills
.claude/skills/*/SKILL.md
.claude/skills/<name>/SKILL.md
.env
.github/workflows/opencode.yml
.gitignore
.gitlab-ci.yml
.ignore
.NET SDK
.npmrc
.ocamlformat
.opencode
.opencode/
.opencode/agents/
.opencode/commands/
.opencode/commands/test.md
.opencode/modes/
.opencode/plans/*.md
.opencode/plugins/
.opencode/skills/<name>/SKILL.md
.opencode/skills/git-release/SKILL.md
.opencode/tools/
.well-known/opencode
{ type: "raw" \| "patch", content: string }
{file:path/to/file}
**/*.js
%USERPROFILE%/intelephense/license.txt
%USERPROFILE%\.cache\opencode
%USERPROFILE%\.config\opencode\opencode.jsonc
%USERPROFILE%\.config\opencode\plugins
%USERPROFILE%\.local\share\opencode
%USERPROFILE%\.local\share\opencode\log
<project-root>/.opencode/themes/*.json
<providerId>/<modelId>
<your-project>/.opencode/plugins/
~
~/...
~/.agents/skills/*/SKILL.md
~/.agents/skills/<name>/SKILL.md
~/.aws/credentials
~/.bashrc
~/.cache/opencode
~/.cache/opencode/node_modules/
~/.claude/CLAUDE.md
~/.claude/skills/
~/.claude/skills/*/SKILL.md
~/.claude/skills/<name>/SKILL.md
~/.config/opencode
~/.config/opencode/AGENTS.md
~/.config/opencode/agents/
~/.config/opencode/commands/
~/.config/opencode/modes/
~/.config/opencode/opencode.json
~/.config/opencode/opencode.jsonc
~/.config/opencode/plugins/
~/.config/opencode/skills/*/SKILL.md
~/.config/opencode/skills/<name>/SKILL.md
~/.config/opencode/themes/*.json
~/.config/opencode/tools/
~/.config/zed/settings.json
~/.local/share
~/.local/share/opencode/
~/.local/share/opencode/auth.json
~/.local/share/opencode/log/
~/.local/share/opencode/mcp-auth.json
~/.local/share/opencode/opencode.jsonc
~/.npmrc
~/.zshrc
~/code/
~/Library/Application Support
~/projects/*
~/projects/personal/
${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts
$HOME/intelephense/license.txt
$HOME/projects/*
$XDG_CONFIG_HOME/opencode/themes/*.json
agent/
agents/
build/
commands/
dist/
http://<wsl-ip>:4096
http://127.0.0.1:8080/callback
http://localhost:<port>
http://localhost:4096
http://localhost:4096/doc
https://app.example.com
https://AZURE_COGNITIVE_SERVICES_RESOURCE_NAME.cognitiveservices.azure.com/
https://opencode.ai/zen/v1/chat/completions
https://opencode.ai/zen/v1/messages
https://opencode.ai/zen/v1/models/gemini-3-flash
https://opencode.ai/zen/v1/models/gemini-3-pro
https://opencode.ai/zen/v1/responses
https://RESOURCE_NAME.openai.azure.com/
laravel/pint
log/
model: "anthropic/claude-sonnet-4-5"
modes/
node_modules/
openai/gpt-4.1
opencode.ai/config.json
opencode/<model-id>
opencode/gpt-5.1-codex
opencode/gpt-5.2-codex
opencode/kimi-k2
openrouter/google/gemini-2.5-flash
opncd.ai/s/<share-id>
packages/*/AGENTS.md
plugins/
project/
provider_id/model_id
provider/model
provider/model-id
rm -rf ~/.cache/opencode
skills/
skills/*/SKILL.md
src/**/*.ts
themes/
tools/
```
## Keybind strings
```text
alt+b
Alt+Ctrl+K
alt+d
alt+f
Cmd+Esc
Cmd+Option+K
Cmd+Shift+Esc
Cmd+Shift+G
Cmd+Shift+P
ctrl+a
ctrl+b
ctrl+d
ctrl+e
Ctrl+Esc
ctrl+f
ctrl+g
ctrl+k
Ctrl+Shift+Esc
Ctrl+Shift+P
ctrl+t
ctrl+u
ctrl+w
ctrl+x
DELETE
Shift+Enter
WIN+R
```
## Model ID strings referenced
```text
{env:OPENCODE_MODEL}
anthropic/claude-3-5-sonnet-20241022
anthropic/claude-haiku-4-20250514
anthropic/claude-haiku-4-5
anthropic/claude-sonnet-4-20250514
anthropic/claude-sonnet-4-5
gitlab/duo-chat-haiku-4-5
lmstudio/google/gemma-3n-e4b
openai/gpt-4.1
openai/gpt-5
opencode/gpt-5.1-codex
opencode/gpt-5.2-codex
opencode/kimi-k2
openrouter/google/gemini-2.5-flash
```

View File

@@ -32,6 +32,9 @@ description: Use this when you are working on file operations like reading, writ
- Decode tool stderr with `Bun.readableStreamToText`.
- For large writes, use `Bun.write(Bun.file(path), text)`.
NOTE: Bun.file(...).exists() will return `false` if the value is a directory.
Use Filesystem.exists(...) instead if path can be file or directory
## Quick checklist
- Use Bun APIs first.

View File

@@ -1,4 +1,4 @@
Use this tool to assign and/or label a Github issue.
Use this tool to assign and/or label a GitHub issue.
You can assign the following users:
- thdxr

View File

@@ -23,7 +23,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -73,7 +73,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -107,7 +107,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -134,7 +134,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2",
@@ -158,7 +158,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -182,7 +182,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -215,7 +215,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
@@ -244,7 +244,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:",
@@ -260,7 +260,7 @@
},
"packages/opencode": {
"name": "opencode",
"version": "1.1.53",
"version": "1.1.59",
"bin": {
"opencode": "./bin/opencode",
},
@@ -301,8 +301,8 @@
"@opencode-ai/sdk": "workspace:*",
"@opencode-ai/util": "workspace:*",
"@openrouter/ai-sdk-provider": "1.5.4",
"@opentui/core": "0.1.77",
"@opentui/solid": "0.1.77",
"@opentui/core": "0.1.79",
"@opentui/solid": "0.1.79",
"@parcel/watcher": "2.5.1",
"@pierre/diffs": "catalog:",
"@solid-primitives/event-bus": "1.1.2",
@@ -366,7 +366,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"zod": "catalog:",
@@ -386,7 +386,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
"version": "1.1.53",
"version": "1.1.59",
"devDependencies": {
"@hey-api/openapi-ts": "0.90.10",
"@tsconfig/node22": "catalog:",
@@ -397,7 +397,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -410,7 +410,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -452,7 +452,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"zod": "catalog:",
},
@@ -463,7 +463,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
"version": "1.1.53",
"version": "1.1.59",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
@@ -522,7 +522,7 @@
"@tailwindcss/vite": "4.1.11",
"@tsconfig/bun": "1.0.9",
"@tsconfig/node22": "22.0.2",
"@types/bun": "1.3.8",
"@types/bun": "1.3.9",
"@types/luxon": "3.7.1",
"@types/node": "22.13.9",
"@types/semver": "7.7.1",
@@ -1279,21 +1279,21 @@
"@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
"@opentui/core": ["@opentui/core@0.1.77", "", { "dependencies": { "bun-ffi-structs": "0.1.2", "diff": "8.0.2", "jimp": "1.6.0", "marked": "17.0.1", "yoga-layout": "3.2.1" }, "optionalDependencies": { "@dimforge/rapier2d-simd-compat": "^0.17.3", "@opentui/core-darwin-arm64": "0.1.77", "@opentui/core-darwin-x64": "0.1.77", "@opentui/core-linux-arm64": "0.1.77", "@opentui/core-linux-x64": "0.1.77", "@opentui/core-win32-arm64": "0.1.77", "@opentui/core-win32-x64": "0.1.77", "bun-webgpu": "0.1.4", "planck": "^1.4.2", "three": "0.177.0" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-lE3kabm6jdqK3AuBq+O0zZrXdxt6ulmibTc57sf+AsPny6cmwYHnWI4wD6hcreFiYoQVNVvdiJchVgPtowMlEg=="],
"@opentui/core": ["@opentui/core@0.1.79", "", { "dependencies": { "bun-ffi-structs": "0.1.2", "diff": "8.0.2", "jimp": "1.6.0", "marked": "17.0.1", "yoga-layout": "3.2.1" }, "optionalDependencies": { "@dimforge/rapier2d-simd-compat": "^0.17.3", "@opentui/core-darwin-arm64": "0.1.79", "@opentui/core-darwin-x64": "0.1.79", "@opentui/core-linux-arm64": "0.1.79", "@opentui/core-linux-x64": "0.1.79", "@opentui/core-win32-arm64": "0.1.79", "@opentui/core-win32-x64": "0.1.79", "bun-webgpu": "0.1.4", "planck": "^1.4.2", "three": "0.177.0" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-job/t09w8A/aHb/WuaVbimu5fIffyN+PCuVO5cYhXEg/NkOkC/WdFi80B8bwncR/DBPyLAh6oJ3EG86grOVo5g=="],
"@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.1.77", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SNqmygCMEsPCW7xWjzCZ5caBf36xaprwVdAnFijGDOuIzLA4iaDa6um8cj3TJh7awenN3NTRsuRc7OuH42UH+g=="],
"@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.1.79", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kgsGniV+DM5G1P3GideyJhvfnthNKcVCAm2mPTIr9InQ3L0gS/Feh7zgwOS/jxDvdlQbOWGKMk2Z3JApeC1MLw=="],
"@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.1.77", "", { "os": "darwin", "cpu": "x64" }, "sha512-/8fsa03swEHTQt/9NrGm98kemlU+VuTURI/OFZiH53vPDRrOYIYoa4Jyga/H7ZMcG+iFhkq97zIe+0Kw95LGmA=="],
"@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.1.79", "", { "os": "darwin", "cpu": "x64" }, "sha512-OpyAmFqAAKQ2CeFmf/oLWcNksmP6Ryx/3R5dbKXThOudMCeQvfvInJTRbc2jTn9VFpf+Qj4BgHkJg1h90tf/EA=="],
"@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.1.77", "", { "os": "linux", "cpu": "arm64" }, "sha512-QfUXZJPc69OvqoMu+AlLgjqXrwu4IeqcBuUWYMuH8nPTeLsVUc3CBbXdV2lv9UDxWzxzrxdS4ALPaxvmEv9lsQ=="],
"@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.1.79", "", { "os": "linux", "cpu": "arm64" }, "sha512-DCa5YaknS4bWhFt8TMEGH+qmTinyzuY8hoZbO4crtWXAxofPP7Pas76Cwxlvis/PyLffA+pPxAl1l5sUZpsvqw=="],
"@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.1.77", "", { "os": "linux", "cpu": "x64" }, "sha512-Kmfx0yUKnPj67AoXYIgL7qQo0QVsUG5Iw8aRtv6XFzXqa5SzBPhaKkKZ9yHPjOmTalZquUs+9zcCRNKpYYuL7A=="],
"@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.1.79", "", { "os": "linux", "cpu": "x64" }, "sha512-V6xjvFfHh3NGvsuuDae1KHPRZXHMEE8XL0A/GM6v4I4OCC23kDmkK60Vn6OptQwAzwwbz0X0IX+Ut/GQU9qGgA=="],
"@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.1.77", "", { "os": "win32", "cpu": "arm64" }, "sha512-HGTscPXc7gdd23Nh1DbzUNjog1I+5IZp95XPtLftGTpjrWs60VcetXcyJqK2rQcXNxewJK5yDyaa5QyMjfEhCQ=="],
"@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.1.79", "", { "os": "win32", "cpu": "arm64" }, "sha512-sPRKnVzOdT5szI59tte7pxwwkYA+07EQN+6miFAvkFuiLmRUngONUD8HVjL7nCnxcPFqxaU4Rvl1y40ST86g8g=="],
"@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.1.77", "", { "os": "win32", "cpu": "x64" }, "sha512-c7GijsbvVgnlzd2murIbwuwrGbcv76KdUw6WlVv7a0vex50z6xJCpv1keGzpe0QfxrZ/6fFEFX7JnwGLno0wjA=="],
"@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.1.79", "", { "os": "win32", "cpu": "x64" }, "sha512-vmQcFTvKf9fqajnDtgU6/uAsiTGwx8//khqHVBmiTEXUsiT792Ki9l8sgNughbuldqG5iZOiF6IaAWU1H67UpA=="],
"@opentui/solid": ["@opentui/solid@0.1.77", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.1.77", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.9", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.9" } }, "sha512-JY+hUbXVV+XCk6bC8dvcwawWCEmC3Gid6GDs23AJWBgHZ3TU2kRKrgwTdltm45DOq2cZXrYCt690/yE8bP+Gxg=="],
"@opentui/solid": ["@opentui/solid@0.1.79", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.1.79", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.9", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.9" } }, "sha512-c5+0jexKxb8GwRDDkQ/U6isZZqClAzHccXmYiLYmSnqdoQQp2lIGHLartL+K8lfIQrsKClzP2ZHumN6nexRfRg=="],
"@oslojs/asn1": ["@oslojs/asn1@1.0.0", "", { "dependencies": { "@oslojs/binary": "1.0.0" } }, "sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA=="],
@@ -1853,7 +1853,7 @@
"@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="],
"@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
"@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
@@ -2181,7 +2181,7 @@
"bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="],
"bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
"bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
"bun-webgpu": ["bun-webgpu@0.1.4", "", { "dependencies": { "@webgpu/types": "^0.1.60" }, "optionalDependencies": { "bun-webgpu-darwin-arm64": "^0.1.4", "bun-webgpu-darwin-x64": "^0.1.4", "bun-webgpu-linux-x64": "^0.1.4", "bun-webgpu-win32-x64": "^0.1.4" } }, "sha512-Kw+HoXl1PMWJTh9wvh63SSRofTA8vYBFCw0XEP1V1fFdQEDhI8Sgf73sdndE/oDpN/7CMx0Yv/q8FCvO39ROMQ=="],

View File

@@ -275,7 +275,7 @@ async function assertOpencodeConnected() {
body: {
service: "github-workflow",
level: "info",
message: "Prepare to react to Github Workflow event",
message: "Prepare to react to GitHub Workflow event",
},
})
connected = true

View File

@@ -166,14 +166,10 @@ const bucketNew = new sst.cloudflare.Bucket("ZenDataNew")
const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID")
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
let logProcessor
if ($app.stage === "production" || $app.stage === "frank") {
const HONEYCOMB_API_KEY = new sst.Secret("HONEYCOMB_API_KEY")
logProcessor = new sst.cloudflare.Worker("LogProcessor", {
handler: "packages/console/function/src/log-processor.ts",
link: [HONEYCOMB_API_KEY],
})
}
const logProcessor = new sst.cloudflare.Worker("LogProcessor", {
handler: "packages/console/function/src/log-processor.ts",
link: [new sst.Secret("HONEYCOMB_API_KEY")],
})
new sst.cloudflare.x.SolidStart("Console", {
domain,
@@ -211,7 +207,7 @@ new sst.cloudflare.x.SolidStart("Console", {
transform: {
worker: {
placement: { mode: "smart" },
tailConsumers: logProcessor ? [{ service: logProcessor.nodes.worker.scriptName }] : [],
tailConsumers: [{ service: logProcessor.nodes.worker.scriptName }],
},
},
},

View File

@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-cvRBvHRuunNjF07c4GVHl5rRgoTn1qfI/HdJWtOV63M=",
"aarch64-linux": "sha256-DJUI4pMZ7wQTnyOiuDHALmZz7FZtrTbzRzCuNOShmWE=",
"aarch64-darwin": "sha256-JnkqDwuC7lNsjafV+jOGfvs8K1xC8rk5CTOW+spjiCA=",
"x86_64-darwin": "sha256-GBeTqq2vDn/mXplYNglrAT2xajjFVzB4ATHnMS0j7z4="
"x86_64-linux": "sha256-pp2gb4nxiIT3VltB6Xli2wZPH32JfnMsI+BbihyU1+E=",
"aarch64-linux": "sha256-hJwxhBICZz/pbIxQsF/sIpZTlFIgLpcAyF44O8wxMdU=",
"aarch64-darwin": "sha256-DPONXP52XOg/ApdSnLp32a+K5XCOnDGhbTUto2Rme0g=",
"x86_64-darwin": "sha256-KX1h5LRJSgthpbOPqWlbM/sPf8cvQrdRJvxtrz/FzBQ="
}
}

View File

@@ -4,7 +4,7 @@
"description": "AI-powered development tool",
"private": true,
"type": "module",
"packageManager": "bun@1.3.8",
"packageManager": "bun@1.3.9",
"scripts": {
"dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
"dev:desktop": "bun --cwd packages/desktop tauri dev",
@@ -23,7 +23,7 @@
"packages/slack"
],
"catalog": {
"@types/bun": "1.3.8",
"@types/bun": "1.3.9",
"@octokit/rest": "22.0.0",
"@hono/zod-validator": "0.4.2",
"ulid": "3.0.1",

View File

@@ -1,2 +1,3 @@
[test]
root = "./src"
preload = ["./happydom.ts"]

View File

@@ -1,6 +1,7 @@
import { test, expect } from "../fixtures"
import { openSidebar, withSession } from "../actions"
import { defocus, openSidebar, withSession } from "../actions"
import { promptSelector } from "../selectors"
import { modKey } from "../utils"
test("titlebar back/forward navigates between sessions", async ({ page, slug, sdk, gotoSession }) => {
await page.setViewportSize({ width: 1400, height: 800 })
@@ -40,3 +41,84 @@ test("titlebar back/forward navigates between sessions", async ({ page, slug, sd
})
})
})
test("titlebar forward is cleared after branching history from sidebar", async ({ page, slug, sdk, gotoSession }) => {
await page.setViewportSize({ width: 1400, height: 800 })
const stamp = Date.now()
await withSession(sdk, `e2e titlebar history a ${stamp}`, async (a) => {
await withSession(sdk, `e2e titlebar history b ${stamp}`, async (b) => {
await withSession(sdk, `e2e titlebar history c ${stamp}`, async (c) => {
await gotoSession(a.id)
await openSidebar(page)
const second = page.locator(`[data-session-id="${b.id}"] a`).first()
await expect(second).toBeVisible()
await second.scrollIntoViewIfNeeded()
await second.click()
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${b.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
const back = page.getByRole("button", { name: "Back" })
const forward = page.getByRole("button", { name: "Forward" })
await expect(back).toBeVisible()
await expect(back).toBeEnabled()
await back.click()
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${a.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
await openSidebar(page)
const third = page.locator(`[data-session-id="${c.id}"] a`).first()
await expect(third).toBeVisible()
await third.scrollIntoViewIfNeeded()
await third.click()
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${c.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
await expect(forward).toBeVisible()
await expect(forward).toBeDisabled()
})
})
})
})
test("keyboard shortcuts navigate titlebar history", async ({ page, slug, sdk, gotoSession }) => {
await page.setViewportSize({ width: 1400, height: 800 })
const stamp = Date.now()
await withSession(sdk, `e2e titlebar shortcuts 1 ${stamp}`, async (one) => {
await withSession(sdk, `e2e titlebar shortcuts 2 ${stamp}`, async (two) => {
await gotoSession(one.id)
await openSidebar(page)
const link = page.locator(`[data-session-id="${two.id}"] a`).first()
await expect(link).toBeVisible()
await link.scrollIntoViewIfNeeded()
await link.click()
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
await defocus(page)
await page.keyboard.press(`${modKey}+[`)
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${one.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
await defocus(page)
await page.keyboard.press(`${modKey}+]`)
await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`))
await expect(page.locator(promptSelector)).toBeVisible()
})
})
})

View File

@@ -1,37 +1,49 @@
import { test, expect } from "../fixtures"
test.skip("file tree can expand folders and open a file", async ({ page, gotoSession }) => {
test("file tree can expand folders and open a file", async ({ page, gotoSession }) => {
await gotoSession()
const toggle = page.getByRole("button", { name: "Toggle file tree" })
const treeTabs = page.locator('[data-component="tabs"][data-variant="pill"][data-scope="filetree"]')
const panel = page.locator("#file-tree-panel")
const treeTabs = panel.locator('[data-component="tabs"][data-variant="pill"][data-scope="filetree"]')
await expect(toggle).toBeVisible()
if ((await toggle.getAttribute("aria-expanded")) !== "true") await toggle.click()
await expect(toggle).toHaveAttribute("aria-expanded", "true")
await expect(panel).toBeVisible()
await expect(treeTabs).toBeVisible()
await treeTabs.locator('[data-slot="tabs-trigger"]').nth(1).click()
const allTab = treeTabs.getByRole("tab", { name: /^all files$/i })
await expect(allTab).toBeVisible()
await allTab.click()
await expect(allTab).toHaveAttribute("aria-selected", "true")
const node = (name: string) => treeTabs.getByRole("button", { name, exact: true })
const tree = treeTabs.locator('[data-slot="tabs-content"]:not([hidden])')
await expect(tree).toBeVisible()
await expect(node("packages")).toBeVisible()
await node("packages").click()
const expand = async (name: string) => {
const folder = tree.getByRole("button", { name, exact: true }).first()
await expect(folder).toBeVisible()
await expect(folder).toHaveAttribute("aria-expanded", /true|false/)
if ((await folder.getAttribute("aria-expanded")) === "false") await folder.click()
await expect(folder).toHaveAttribute("aria-expanded", "true")
}
await expect(node("app")).toBeVisible()
await node("app").click()
await expand("packages")
await expand("app")
await expand("src")
await expand("components")
await expect(node("src")).toBeVisible()
await node("src").click()
await expect(node("components")).toBeVisible()
await node("components").click()
await expect(node("file-tree.tsx")).toBeVisible()
await node("file-tree.tsx").click()
const file = tree.getByRole("button", { name: "file-tree.tsx", exact: true }).first()
await expect(file).toBeVisible()
await file.click()
const tab = page.getByRole("tab", { name: "file-tree.tsx" })
await expect(tab).toBeVisible()
await tab.click()
await expect(tab).toHaveAttribute("aria-selected", "true")
const code = page.locator('[data-component="code"]').first()
await expect(code.getByText("export default function FileTree")).toBeVisible()
await expect(code).toBeVisible()
await expect(code).toContainText("export default function FileTree")
})

View File

@@ -1,6 +1,6 @@
import { test, expect } from "../fixtures"
import { createTestProject, cleanupTestProject, openSidebar, clickMenuItem } from "../actions"
import { projectCloseHoverSelector, projectCloseMenuSelector, projectSwitchSelector } from "../selectors"
import { createTestProject, cleanupTestProject, openSidebar, clickMenuItem, openProjectMenu } from "../actions"
import { projectCloseHoverSelector, projectSwitchSelector } from "../selectors"
import { dirSlug } from "../utils"
test("can close a project via hover card close button", async ({ page, withProject }) => {
@@ -31,16 +31,15 @@ test("can close a project via hover card close button", async ({ page, withProje
}
})
test("can close a project via project header more options menu", async ({ page, withProject }) => {
test("closing active project navigates to another open project", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })
const other = await createTestProject()
const otherName = other.split("/").pop() ?? other
const otherSlug = dirSlug(other)
try {
await withProject(
async () => {
async ({ slug }) => {
await openSidebar(page)
const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
@@ -49,21 +48,20 @@ test("can close a project via project header more options menu", async ({ page,
await expect(page).toHaveURL(new RegExp(`/${otherSlug}/session`))
const header = page
.locator(".group\\/project")
.filter({ has: page.locator(`[data-action="project-menu"][data-project="${otherSlug}"]`) })
.first()
await expect(header).toContainText(otherName)
const trigger = header.locator(`[data-action="project-menu"][data-project="${otherSlug}"]`).first()
await expect(trigger).toHaveCount(1)
await trigger.focus()
await page.keyboard.press("Enter")
const menu = page.locator('[data-component="dropdown-menu-content"]').first()
await expect(menu).toBeVisible({ timeout: 10_000 })
const menu = await openProjectMenu(page, otherSlug)
await clickMenuItem(menu, /^Close$/i, { force: true })
await expect
.poll(() => {
const pathname = new URL(page.url()).pathname
if (new RegExp(`^/${slug}/session(?:/[^/]+)?/?$`).test(pathname)) return "project"
if (pathname === "/") return "home"
return ""
})
.toMatch(/^(project|home)$/)
await expect(page).not.toHaveURL(new RegExp(`/${otherSlug}/session(?:[/?#]|$)`))
await expect(otherButton).toHaveCount(0)
},
{ extra: [other] },

View File

@@ -0,0 +1,140 @@
import { base64Decode } from "@opencode-ai/util/encode"
import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
import { cleanupTestProject, openSidebar, sessionIDFromUrl, setWorkspacesEnabled } from "../actions"
import { promptSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
import { createSdk } from "../utils"
function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
}
async function waitWorkspaceReady(page: Page, slug: string) {
await openSidebar(page)
await expect
.poll(
async () => {
const item = page.locator(workspaceItemSelector(slug)).first()
try {
await item.hover({ timeout: 500 })
return true
} catch {
return false
}
},
{ timeout: 60_000 },
)
.toBe(true)
}
async function createWorkspace(page: Page, root: string, seen: string[]) {
await openSidebar(page)
await page.getByRole("button", { name: "New workspace" }).first().click()
await expect
.poll(
() => {
const slug = slugFromUrl(page.url())
if (!slug) return ""
if (slug === root) return ""
if (seen.includes(slug)) return ""
return slug
},
{ timeout: 45_000 },
)
.not.toBe("")
const slug = slugFromUrl(page.url())
const directory = base64Decode(slug)
if (!directory) throw new Error(`Failed to decode workspace slug: ${slug}`)
return { slug, directory }
}
async function openWorkspaceNewSession(page: Page, slug: string) {
await waitWorkspaceReady(page, slug)
const item = page.locator(workspaceItemSelector(slug)).first()
await item.hover()
const button = page.locator(workspaceNewSessionSelector(slug)).first()
await expect(button).toBeVisible()
await button.click({ force: true })
await expect.poll(() => slugFromUrl(page.url())).toBe(slug)
await expect(page).toHaveURL(new RegExp(`/${slug}/session(?:[/?#]|$)`))
}
async function createSessionFromWorkspace(page: Page, slug: string, text: string) {
await openWorkspaceNewSession(page, slug)
const prompt = page.locator(promptSelector)
await expect(prompt).toBeVisible()
await prompt.click()
await page.keyboard.type(text)
await page.keyboard.press("Enter")
await expect.poll(() => slugFromUrl(page.url())).toBe(slug)
await expect(page).toHaveURL(new RegExp(`/${slug}/session/[^/?#]+`), { timeout: 30_000 })
const sessionID = sessionIDFromUrl(page.url())
if (!sessionID) throw new Error(`Failed to parse session id from url: ${page.url()}`)
return sessionID
}
async function sessionDirectory(directory: string, sessionID: string) {
const info = await createSdk(directory)
.session.get({ sessionID })
.then((x) => x.data)
.catch(() => undefined)
if (!info) return ""
return info.directory
}
test("new sessions from sidebar workspace actions stay in selected workspace", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })
await withProject(async ({ directory, slug: root }) => {
const workspaces = [] as { slug: string; directory: string }[]
const sessions = [] as string[]
try {
await openSidebar(page)
await setWorkspacesEnabled(page, root, true)
const first = await createWorkspace(page, root, [])
workspaces.push(first)
await waitWorkspaceReady(page, first.slug)
const second = await createWorkspace(page, root, [first.slug])
workspaces.push(second)
await waitWorkspaceReady(page, second.slug)
const firstSession = await createSessionFromWorkspace(page, first.slug, `workspace one ${Date.now()}`)
sessions.push(firstSession)
const secondSession = await createSessionFromWorkspace(page, second.slug, `workspace two ${Date.now()}`)
sessions.push(secondSession)
const thirdSession = await createSessionFromWorkspace(page, first.slug, `workspace one again ${Date.now()}`)
sessions.push(thirdSession)
await expect.poll(() => sessionDirectory(first.directory, firstSession)).toBe(first.directory)
await expect.poll(() => sessionDirectory(second.directory, secondSession)).toBe(second.directory)
await expect.poll(() => sessionDirectory(first.directory, thirdSession)).toBe(first.directory)
} finally {
const dirs = [directory, ...workspaces.map((workspace) => workspace.directory)]
await Promise.all(
sessions.map((sessionID) =>
Promise.all(
dirs.map((dir) =>
createSdk(dir)
.session.delete({ sessionID })
.catch(() => undefined),
),
),
),
)
await Promise.all(workspaces.map((workspace) => cleanupTestProject(workspace.directory)))
}
})
})

View File

@@ -1,5 +1,6 @@
import { base64Decode } from "@opencode-ai/util/encode"
import fs from "node:fs/promises"
import os from "node:os"
import path from "node:path"
import type { Page } from "@playwright/test"
@@ -10,11 +11,18 @@ import {
cleanupTestProject,
clickMenuItem,
confirmDialog,
openProjectMenu,
openSidebar,
openWorkspaceMenu,
setWorkspacesEnabled,
} from "../actions"
import { inlineInputSelector, workspaceItemSelector } from "../selectors"
import {
inlineInputSelector,
projectSwitchSelector,
projectWorkspacesToggleSelector,
workspaceItemSelector,
} from "../selectors"
import { dirSlug } from "../utils"
function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
@@ -126,6 +134,40 @@ test("can create a workspace", async ({ page, withProject }) => {
})
})
test("non-git projects keep workspace mode disabled", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })
const nonGit = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-e2e-project-nongit-"))
const nonGitSlug = dirSlug(nonGit)
await fs.writeFile(path.join(nonGit, "README.md"), "# e2e nongit\n")
try {
await withProject(
async () => {
await openSidebar(page)
const nonGitButton = page.locator(projectSwitchSelector(nonGitSlug)).first()
await expect(nonGitButton).toBeVisible()
await nonGitButton.click()
await expect(page).toHaveURL(new RegExp(`/${nonGitSlug}/session`))
const menu = await openProjectMenu(page, nonGitSlug)
const toggle = menu.locator(projectWorkspacesToggleSelector(nonGitSlug)).first()
await expect(toggle).toBeVisible()
await expect(toggle).toBeDisabled()
await expect(menu.getByRole("menuitem", { name: "New workspace" })).toHaveCount(0)
await expect(page.getByRole("button", { name: "New workspace" })).toHaveCount(0)
},
{ extra: [nonGit] },
)
} finally {
await cleanupTestProject(nonGit)
}
})
test("can rename a workspace", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })

View File

@@ -48,6 +48,9 @@ export const workspaceItemSelector = (slug: string) =>
export const workspaceMenuTriggerSelector = (slug: string) =>
`${sidebarNavSelector} [data-action="workspace-menu"][data-workspace="${slug}"]`
export const workspaceNewSessionSelector = (slug: string) =>
`${sidebarNavSelector} [data-action="workspace-new-session"][data-workspace="${slug}"]`
export const listItemSelector = '[data-slot="list-item"]'
export const listItemKeyStartsWithSelector = (prefix: string) => `${listItemSelector}[data-key^="${prefix}"]`

View File

@@ -0,0 +1,235 @@
import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
import { withSession } from "../actions"
import { createSdk, modKey } from "../utils"
import { promptSelector } from "../selectors"
async function seedConversation(input: {
page: Page
sdk: ReturnType<typeof createSdk>
sessionID: string
token: string
}) {
const prompt = input.page.locator(promptSelector)
await expect(prompt).toBeVisible()
await prompt.click()
await input.page.keyboard.type(`Reply with exactly: ${input.token}`)
await input.page.keyboard.press("Enter")
let userMessageID: string | undefined
await expect
.poll(
async () => {
const messages = await input.sdk.session
.messages({ sessionID: input.sessionID, limit: 50 })
.then((r) => r.data ?? [])
const users = messages.filter(
(m) =>
m.info.role === "user" &&
m.parts.filter((p) => p.type === "text").some((p) => p.text.includes(input.token)),
)
if (users.length === 0) return false
const user = users[users.length - 1]
if (!user) return false
userMessageID = user.info.id
const assistantText = messages
.filter((m) => m.info.role === "assistant")
.flatMap((m) => m.parts)
.filter((p) => p.type === "text")
.map((p) => p.text)
.join("\n")
return assistantText.includes(input.token)
},
{ timeout: 90_000 },
)
.toBe(true)
if (!userMessageID) throw new Error("Expected a user message id")
return { prompt, userMessageID }
}
test("slash undo sets revert and restores prior prompt", async ({ page, withProject }) => {
test.setTimeout(120_000)
const token = `undo_${Date.now()}`
await withProject(async (project) => {
const sdk = createSdk(project.directory)
await withSession(sdk, `e2e undo ${Date.now()}`, async (session) => {
await project.gotoSession(session.id)
const seeded = await seedConversation({ page, sdk, sessionID: session.id, token })
await seeded.prompt.click()
await page.keyboard.type("/undo")
const undo = page.locator('[data-slash-id="session.undo"]').first()
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(seeded.userMessageID)
await expect(seeded.prompt).toContainText(token)
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`)).toHaveCount(0)
})
})
})
test("slash redo clears revert and restores latest state", async ({ page, withProject }) => {
test.setTimeout(120_000)
const token = `redo_${Date.now()}`
await withProject(async (project) => {
const sdk = createSdk(project.directory)
await withSession(sdk, `e2e redo ${Date.now()}`, async (session) => {
await project.gotoSession(session.id)
const seeded = await seedConversation({ page, sdk, sessionID: session.id, token })
await seeded.prompt.click()
await page.keyboard.type("/undo")
const undo = page.locator('[data-slash-id="session.undo"]').first()
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(seeded.userMessageID)
await seeded.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/redo")
const redo = page.locator('[data-slash-id="session.redo"]').first()
await expect(redo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBeUndefined()
await expect(seeded.prompt).not.toContainText(token)
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`).first()).toBeVisible()
})
})
})
test("slash undo/redo traverses multi-step revert stack", async ({ page, withProject }) => {
test.setTimeout(120_000)
const firstToken = `undo_redo_first_${Date.now()}`
const secondToken = `undo_redo_second_${Date.now()}`
await withProject(async (project) => {
const sdk = createSdk(project.directory)
await withSession(sdk, `e2e undo redo stack ${Date.now()}`, async (session) => {
await project.gotoSession(session.id)
const first = await seedConversation({
page,
sdk,
sessionID: session.id,
token: firstToken,
})
const second = await seedConversation({
page,
sdk,
sessionID: session.id,
token: secondToken,
})
expect(first.userMessageID).not.toBe(second.userMessageID)
const firstMessage = page.locator(`[data-message-id="${first.userMessageID}"]`)
const secondMessage = page.locator(`[data-message-id="${second.userMessageID}"]`)
await expect(firstMessage.first()).toBeVisible()
await expect(secondMessage.first()).toBeVisible()
await second.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/undo")
const undo = page.locator('[data-slash-id="session.undo"]').first()
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(second.userMessageID)
await expect(firstMessage.first()).toBeVisible()
await expect(secondMessage).toHaveCount(0)
await second.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/undo")
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(first.userMessageID)
await expect(firstMessage).toHaveCount(0)
await expect(secondMessage).toHaveCount(0)
await second.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/redo")
const redo = page.locator('[data-slash-id="session.redo"]').first()
await expect(redo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(second.userMessageID)
await expect(firstMessage.first()).toBeVisible()
await expect(secondMessage).toHaveCount(0)
await second.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/redo")
await expect(redo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBeUndefined()
await expect(firstMessage.first()).toBeVisible()
await expect(secondMessage.first()).toBeVisible()
})
})
})

View File

@@ -9,7 +9,7 @@ test("changing sidebar toggle keybind works", async ({ page, gotoSession }) => {
const dialog = await openSettings(page)
await dialog.getByRole("tab", { name: "Shortcuts" }).click()
const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle"))
const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle")).first()
await expect(keybindButton).toBeVisible()
const initialKeybind = await keybindButton.textContent()
@@ -51,6 +51,40 @@ test("changing sidebar toggle keybind works", async ({ page, gotoSession }) => {
expect(finalClosed).toBe(initiallyClosed)
})
test("sidebar toggle keybind guards against shortcut conflicts", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
await dialog.getByRole("tab", { name: "Shortcuts" }).click()
const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle"))
await expect(keybindButton).toBeVisible()
const initialKeybind = await keybindButton.textContent()
expect(initialKeybind).toContain("B")
await keybindButton.click()
await expect(keybindButton).toHaveText(/press/i)
await page.keyboard.press(`${modKey}+Shift+KeyP`)
await page.waitForTimeout(100)
const toast = page.locator('[data-component="toast"]').last()
await expect(toast).toBeVisible()
await expect(toast).toContainText(/already/i)
await keybindButton.click()
await expect(keybindButton).toContainText("B")
const stored = await page.evaluate(() => {
const raw = localStorage.getItem("settings.v3")
return raw ? JSON.parse(raw) : null
})
expect(stored?.keybinds?.["sidebar.toggle"]).toBeUndefined()
await closeDialog(page, dialog)
})
test("resetting all keybinds to defaults works", async ({ page, gotoSession }) => {
await page.addInitScript(() => {
localStorage.setItem("settings.v3", JSON.stringify({ keybinds: { "sidebar.toggle": "mod+shift+x" } }))
@@ -277,6 +311,44 @@ test("changing terminal toggle keybind works", async ({ page, gotoSession }) =>
await expect(terminal).not.toBeVisible()
})
test("terminal toggle keybind persists after reload", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
await dialog.getByRole("tab", { name: "Shortcuts" }).click()
const keybindButton = dialog.locator(keybindButtonSelector("terminal.toggle"))
await expect(keybindButton).toBeVisible()
await keybindButton.click()
await expect(keybindButton).toHaveText(/press/i)
await page.keyboard.press(`${modKey}+Shift+KeyY`)
await page.waitForTimeout(100)
await expect(keybindButton).toContainText("Y")
await closeDialog(page, dialog)
await page.reload()
await expect
.poll(async () => {
return await page.evaluate(() => {
const raw = localStorage.getItem("settings.v3")
if (!raw) return
const parsed = JSON.parse(raw)
return parsed?.keybinds?.["terminal.toggle"]
})
})
.toBe("mod+shift+y")
const reloaded = await openSettings(page)
await reloaded.getByRole("tab", { name: "Shortcuts" }).click()
const reloadedKeybind = reloaded.locator(keybindButtonSelector("terminal.toggle")).first()
await expect(reloadedKeybind).toContainText("Y")
await closeDialog(page, reloaded)
})
test("changing command palette keybind works", async ({ page, gotoSession }) => {
await gotoSession()

View File

@@ -9,6 +9,8 @@ import {
settingsNotificationsPermissionsSelector,
settingsReleaseNotesSelector,
settingsSoundsAgentSelector,
settingsSoundsErrorsSelector,
settingsSoundsPermissionsSelector,
settingsThemeSelector,
settingsUpdatesStartupSelector,
} from "../selectors"
@@ -139,6 +141,105 @@ test("changing font persists in localStorage and updates CSS variable", async ({
expect(newFontFamily).not.toBe(initialFontFamily)
})
test("color scheme and font rehydrate after reload", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
const colorSchemeSelect = dialog.locator(settingsColorSchemeSelector)
await expect(colorSchemeSelect).toBeVisible()
await colorSchemeSelect.locator('[data-slot="select-select-trigger"]').click()
await page.locator('[data-slot="select-select-item"]').filter({ hasText: "Dark" }).click()
await expect(page.locator("html")).toHaveAttribute("data-color-scheme", "dark")
const fontSelect = dialog.locator(settingsFontSelector)
await expect(fontSelect).toBeVisible()
const initialFontFamily = await page.evaluate(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--font-family-mono").trim()
})
const initialSettings = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
const currentFont =
(await fontSelect.locator('[data-slot="select-select-trigger-value"]').textContent())?.trim() ?? ""
await fontSelect.locator('[data-slot="select-select-trigger"]').click()
const fontItems = page.locator('[data-slot="select-select-item"]')
expect(await fontItems.count()).toBeGreaterThan(1)
if (currentFont) {
await fontItems.filter({ hasNotText: currentFont }).first().click()
}
if (!currentFont) {
await fontItems.nth(1).click()
}
await expect
.poll(async () => {
return await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
})
.toMatchObject({
appearance: {
font: expect.any(String),
},
})
const updatedSettings = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
const updatedFontFamily = await page.evaluate(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--font-family-mono").trim()
})
expect(updatedFontFamily).not.toBe(initialFontFamily)
expect(updatedSettings?.appearance?.font).not.toBe(initialSettings?.appearance?.font)
await closeDialog(page, dialog)
await page.reload()
await expect(page.locator("html")).toHaveAttribute("data-color-scheme", "dark")
await expect
.poll(async () => {
return await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
})
.toMatchObject({
appearance: {
font: updatedSettings?.appearance?.font,
},
})
const rehydratedSettings = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
await expect
.poll(async () => {
return await page.evaluate(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--font-family-mono").trim()
})
})
.not.toBe(initialFontFamily)
const rehydratedFontFamily = await page.evaluate(() => {
return getComputedStyle(document.documentElement).getPropertyValue("--font-family-mono").trim()
})
expect(rehydratedFontFamily).not.toBe(initialFontFamily)
expect(rehydratedSettings?.appearance?.font).toBe(updatedSettings?.appearance?.font)
})
test("toggling notification agent switch updates localStorage", async ({ page, gotoSession }) => {
await gotoSession()
@@ -234,6 +335,67 @@ test("changing sound agent selection persists in localStorage", async ({ page, g
expect(stored?.sounds?.agent).not.toBe("staplebops-01")
})
test("changing permissions and errors sounds updates localStorage", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
const permissionsSelect = dialog.locator(settingsSoundsPermissionsSelector)
const errorsSelect = dialog.locator(settingsSoundsErrorsSelector)
await expect(permissionsSelect).toBeVisible()
await expect(errorsSelect).toBeVisible()
const initial = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
const permissionsCurrent =
(await permissionsSelect.locator('[data-slot="select-select-trigger-value"]').textContent())?.trim() ?? ""
await permissionsSelect.locator('[data-slot="select-select-trigger"]').click()
const permissionItems = page.locator('[data-slot="select-select-item"]')
expect(await permissionItems.count()).toBeGreaterThan(1)
if (permissionsCurrent) {
await permissionItems.filter({ hasNotText: permissionsCurrent }).first().click()
}
if (!permissionsCurrent) {
await permissionItems.nth(1).click()
}
const errorsCurrent =
(await errorsSelect.locator('[data-slot="select-select-trigger-value"]').textContent())?.trim() ?? ""
await errorsSelect.locator('[data-slot="select-select-trigger"]').click()
const errorItems = page.locator('[data-slot="select-select-item"]')
expect(await errorItems.count()).toBeGreaterThan(1)
if (errorsCurrent) {
await errorItems.filter({ hasNotText: errorsCurrent }).first().click()
}
if (!errorsCurrent) {
await errorItems.nth(1).click()
}
await expect
.poll(async () => {
return await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
})
.toMatchObject({
sounds: {
permissions: expect.any(String),
errors: expect.any(String),
},
})
const stored = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
return raw ? JSON.parse(raw) : null
}, settingsKey)
expect(stored?.sounds?.permissions).not.toBe(initial?.sounds?.permissions)
expect(stored?.sounds?.errors).not.toBe(initial?.sounds?.errors)
})
test("toggling updates startup switch updates localStorage", async ({ page, gotoSession }) => {
await gotoSession()

View File

@@ -0,0 +1,36 @@
import { test, expect } from "../fixtures"
import { closeSidebar, hoverSessionItem } from "../actions"
import { projectSwitchSelector, sessionItemSelector } from "../selectors"
test("collapsed sidebar popover stays open when archiving a session", async ({ page, slug, sdk, gotoSession }) => {
const stamp = Date.now()
const one = await sdk.session.create({ title: `e2e sidebar popover archive 1 ${stamp}` }).then((r) => r.data)
const two = await sdk.session.create({ title: `e2e sidebar popover archive 2 ${stamp}` }).then((r) => r.data)
if (!one?.id) throw new Error("Session create did not return an id")
if (!two?.id) throw new Error("Session create did not return an id")
try {
await gotoSession(one.id)
await closeSidebar(page)
const project = page.locator(projectSwitchSelector(slug)).first()
await expect(project).toBeVisible()
await project.hover()
await expect(page.locator(sessionItemSelector(one.id)).first()).toBeVisible()
await expect(page.locator(sessionItemSelector(two.id)).first()).toBeVisible()
const item = await hoverSessionItem(page, one.id)
await item
.getByRole("button", { name: /archive/i })
.first()
.click()
await expect(page.locator(sessionItemSelector(two.id)).first()).toBeVisible()
} finally {
await sdk.session.delete({ sessionID: one.id }).catch(() => undefined)
await sdk.session.delete({ sessionID: two.id }).catch(() => undefined)
}
})

View File

@@ -1,5 +1,5 @@
import { test, expect } from "../fixtures"
import { openSidebar, toggleSidebar } from "../actions"
import { openSidebar, toggleSidebar, withSession } from "../actions"
test("sidebar can be collapsed and expanded", async ({ page, gotoSession }) => {
await gotoSession()
@@ -12,3 +12,26 @@ test("sidebar can be collapsed and expanded", async ({ page, gotoSession }) => {
await toggleSidebar(page)
await expect(page.locator("main")).not.toHaveClass(/xl:border-l/)
})
test("sidebar collapsed state persists across navigation and reload", async ({ page, sdk, gotoSession }) => {
await withSession(sdk, "sidebar persist session 1", async (session1) => {
await withSession(sdk, "sidebar persist session 2", async (session2) => {
await gotoSession(session1.id)
await openSidebar(page)
await toggleSidebar(page)
await expect(page.locator("main")).toHaveClass(/xl:border-l/)
await gotoSession(session2.id)
await expect(page.locator("main")).toHaveClass(/xl:border-l/)
await page.reload()
await expect(page.locator("main")).toHaveClass(/xl:border-l/)
const opened = await page.evaluate(
() => JSON.parse(localStorage.getItem("opencode.global.dat:layout") ?? "{}").sidebar?.opened,
)
await expect(opened).toBe(false)
})
})
})

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.1.53",
"version": "1.1.59",
"description": "",
"type": "module",
"exports": {

View File

@@ -89,7 +89,6 @@ let runner: ReturnType<typeof Bun.spawn> | undefined
let server: { stop: () => Promise<void> | void } | undefined
let inst: { Instance: { disposeAll: () => Promise<void> | void } } | undefined
let cleaned = false
let internalError = false
const cleanup = async () => {
if (cleaned) return
@@ -115,9 +114,8 @@ const shutdown = (code: number, reason: string) => {
}
const reportInternalError = (reason: string, error: unknown) => {
internalError = true
console.error(`e2e-local internal error: ${reason}`)
console.error(error)
console.warn(`e2e-local ignored server error: ${reason}`)
console.warn(error)
}
process.once("SIGINT", () => shutdown(130, "SIGINT"))
@@ -177,6 +175,4 @@ try {
await cleanup()
}
if (code === 0 && internalError) code = 1
process.exit(code)

View File

@@ -43,7 +43,7 @@ function UiI18nBridge(props: ParentProps) {
declare global {
interface Window {
__OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string; deepLinks?: string[] }
__OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string; deepLinks?: string[]; wsl?: boolean }
}
}

View File

@@ -6,6 +6,7 @@ let dirsToExpand: typeof import("./file-tree").dirsToExpand
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@/context/file", () => ({

View File

@@ -1,4 +1,5 @@
import { useFile } from "@/context/file"
import { encodeFilePath } from "@/context/file/path"
import { Collapsible } from "@opencode-ai/ui/collapsible"
import { FileIcon } from "@opencode-ai/ui/file-icon"
import { Icon } from "@opencode-ai/ui/icon"
@@ -20,11 +21,7 @@ import { Dynamic } from "solid-js/web"
import type { FileNode } from "@opencode-ai/sdk/v2"
function pathToFileUrl(filepath: string): string {
const encodedPath = filepath
.split("/")
.map((segment) => encodeURIComponent(segment))
.join("/")
return `file://${encodedPath}`
return `file://${encodeFilePath(filepath)}`
}
type Kind = "add" | "del" | "mix"
@@ -223,12 +220,14 @@ export default function FileTree(props: {
seen.add(item)
}
return out.toSorted((a, b) => {
out.sort((a, b) => {
if (a.type !== b.type) {
return a.type === "directory" ? -1 : 1
}
return a.name.localeCompare(b.name)
})
return out
})
const Node = (

View File

@@ -787,7 +787,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
},
setMode: (mode) => setStore("mode", mode),
setPopover: (popover) => setStore("popover", popover),
newSessionWorktree: props.newSessionWorktree,
newSessionWorktree: () => props.newSessionWorktree,
onNewSessionWorktreeReset: props.onNewSessionWorktreeReset,
onSubmit: props.onSubmit,
})

View File

@@ -2,6 +2,7 @@ import { onCleanup, onMount } from "solid-js"
import { showToast } from "@opencode-ai/ui/toast"
import { usePrompt, type ContentPart, type ImageAttachmentPart } from "@/context/prompt"
import { useLanguage } from "@/context/language"
import { uuid } from "@/utils/uuid"
import { getCursorPosition } from "./editor-dom"
export const ACCEPTED_IMAGE_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"]
@@ -31,7 +32,7 @@ export function createPromptAttachments(input: PromptAttachmentsInput) {
const dataUrl = reader.result as string
const attachment: ImageAttachmentPart = {
type: "image",
id: crypto.randomUUID?.() ?? Math.random().toString(16).slice(2),
id: uuid(),
filename: file.name,
mime: file.type,
dataUrl,

View File

@@ -112,7 +112,7 @@ describe("buildRequestParts", () => {
// Special chars should be encoded
expect(filePart.url).toContain("file%23name.txt")
// Should have Windows drive letter properly encoded
expect(filePart.url).toMatch(/file:\/\/\/[A-Z]%3A/)
expect(filePart.url).toMatch(/file:\/\/\/[A-Z]:/)
}
})
@@ -210,7 +210,7 @@ describe("buildRequestParts", () => {
if (filePart?.type === "file") {
// Should handle absolute path that differs from sessionDirectory
expect(() => new URL(filePart.url)).not.toThrow()
expect(filePart.url).toContain("/D%3A/other/project/file.ts")
expect(filePart.url).toContain("/D:/other/project/file.ts")
}
})

View File

@@ -1,6 +1,7 @@
import { getFilename } from "@opencode-ai/util/path"
import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@opencode-ai/sdk/v2/client"
import type { FileSelection } from "@/context/file"
import { encodeFilePath } from "@/context/file/path"
import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt"
import { Identifier } from "@/utils/id"
@@ -27,23 +28,11 @@ type BuildRequestPartsInput = {
sessionDirectory: string
}
const absolute = (directory: string, path: string) =>
path.startsWith("/") ? path : (directory + "/" + path).replace("//", "/")
const encodeFilePath = (filepath: string): string => {
// Normalize Windows paths: convert backslashes to forward slashes
let normalized = filepath.replace(/\\/g, "/")
// Handle Windows absolute paths (D:/path -> /D:/path for proper file:// URLs)
if (/^[A-Za-z]:/.test(normalized)) {
normalized = "/" + normalized
}
// Encode each path segment (preserving forward slashes as path separators)
return normalized
.split("/")
.map((segment) => encodeURIComponent(segment))
.join("/")
const absolute = (directory: string, path: string) => {
if (path.startsWith("/")) return path
if (/^[A-Za-z]:[\\/]/.test(path) || /^[A-Za-z]:$/.test(path)) return path
if (path.startsWith("\\\\") || path.startsWith("//")) return path
return `${directory.replace(/[\\/]+$/, "")}/${path}`
}
const fileQuery = (selection: FileSelection | undefined) =>

View File

@@ -0,0 +1,175 @@
import { beforeAll, beforeEach, describe, expect, mock, test } from "bun:test"
import type { Prompt } from "@/context/prompt"
let createPromptSubmit: typeof import("./submit").createPromptSubmit
const createdClients: string[] = []
const createdSessions: string[] = []
const sentShell: string[] = []
const syncedDirectories: string[] = []
let selected = "/repo/worktree-a"
const promptValue: Prompt = [{ type: "text", content: "ls", start: 0, end: 2 }]
const clientFor = (directory: string) => ({
session: {
create: async () => {
createdSessions.push(directory)
return { data: { id: `session-${createdSessions.length}` } }
},
shell: async () => {
sentShell.push(directory)
return { data: undefined }
},
prompt: async () => ({ data: undefined }),
command: async () => ({ data: undefined }),
abort: async () => ({ data: undefined }),
},
worktree: {
create: async () => ({ data: { directory: `${directory}/new` } }),
},
})
beforeAll(async () => {
const rootClient = clientFor("/repo/main")
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@opencode-ai/sdk/v2/client", () => ({
createOpencodeClient: (input: { directory: string }) => {
createdClients.push(input.directory)
return clientFor(input.directory)
},
}))
mock.module("@opencode-ai/ui/toast", () => ({
showToast: () => 0,
}))
mock.module("@opencode-ai/util/encode", () => ({
base64Encode: (value: string) => value,
}))
mock.module("@/context/local", () => ({
useLocal: () => ({
model: {
current: () => ({ id: "model", provider: { id: "provider" } }),
variant: { current: () => undefined },
},
agent: {
current: () => ({ name: "agent" }),
},
}),
}))
mock.module("@/context/prompt", () => ({
usePrompt: () => ({
current: () => promptValue,
reset: () => undefined,
set: () => undefined,
context: {
add: () => undefined,
remove: () => undefined,
items: () => [],
},
}),
}))
mock.module("@/context/layout", () => ({
useLayout: () => ({
handoff: {
setTabs: () => undefined,
},
}),
}))
mock.module("@/context/sdk", () => ({
useSDK: () => ({
directory: "/repo/main",
client: rootClient,
url: "http://localhost:4096",
}),
}))
mock.module("@/context/sync", () => ({
useSync: () => ({
data: { command: [] },
session: {
optimistic: {
add: () => undefined,
remove: () => undefined,
},
},
set: () => undefined,
}),
}))
mock.module("@/context/global-sync", () => ({
useGlobalSync: () => ({
child: (directory: string) => {
syncedDirectories.push(directory)
return [{}, () => undefined]
},
}),
}))
mock.module("@/context/platform", () => ({
usePlatform: () => ({
fetch: fetch,
}),
}))
mock.module("@/context/language", () => ({
useLanguage: () => ({
t: (key: string) => key,
}),
}))
const mod = await import("./submit")
createPromptSubmit = mod.createPromptSubmit
})
beforeEach(() => {
createdClients.length = 0
createdSessions.length = 0
sentShell.length = 0
syncedDirectories.length = 0
selected = "/repo/worktree-a"
})
describe("prompt submit worktree selection", () => {
test("reads the latest worktree accessor value per submit", async () => {
const submit = createPromptSubmit({
info: () => undefined,
imageAttachments: () => [],
commentCount: () => 0,
mode: () => "shell",
working: () => false,
editor: () => undefined,
queueScroll: () => undefined,
promptLength: (value) => value.reduce((sum, part) => sum + ("content" in part ? part.content.length : 0), 0),
addToHistory: () => undefined,
resetHistoryNavigation: () => undefined,
setMode: () => undefined,
setPopover: () => undefined,
newSessionWorktree: () => selected,
onNewSessionWorktreeReset: () => undefined,
onSubmit: () => undefined,
})
const event = { preventDefault: () => undefined } as unknown as Event
await submit.handleSubmit(event)
selected = "/repo/worktree-b"
await submit.handleSubmit(event)
expect(createdClients).toEqual(["/repo/worktree-a", "/repo/worktree-b"])
expect(createdSessions).toEqual(["/repo/worktree-a", "/repo/worktree-b"])
expect(sentShell).toEqual(["/repo/worktree-a", "/repo/worktree-b"])
expect(syncedDirectories).toEqual(["/repo/worktree-a", "/repo/worktree-b"])
})
})

View File

@@ -37,7 +37,7 @@ type PromptSubmitInput = {
resetHistoryNavigation: () => void
setMode: (mode: "normal" | "shell") => void
setPopover: (popover: "at" | "slash" | null) => void
newSessionWorktree?: string
newSessionWorktree?: Accessor<string | undefined>
onNewSessionWorktreeReset?: () => void
onSubmit?: () => void
}
@@ -137,7 +137,7 @@ export function createPromptSubmit(input: PromptSubmitInput) {
const projectDirectory = sdk.directory
const isNewSession = !params.id
const worktreeSelection = input.newSessionWorktree || "main"
const worktreeSelection = input.newSessionWorktree?.() || "main"
let sessionDirectory = projectDirectory
let client = sdk.client

View File

@@ -166,6 +166,7 @@ export function SessionHeader() {
})
const [prefs, setPrefs] = persisted(Persist.global("open.app"), createStore({ app: "finder" as OpenApp }))
const [menu, setMenu] = createStore({ open: false })
const canOpen = createMemo(() => platform.platform === "desktop" && !!platform.openPath && server.isLocal())
const current = createMemo(() => options().find((o) => o.id === prefs.app) ?? options()[0])
@@ -328,17 +329,19 @@ export function SessionHeader() {
<Show
when={canOpen()}
fallback={
<Button
variant="ghost"
class="rounded-sm h-[24px] py-1.5 pr-3 pl-2 gap-2 border-none shadow-none"
onClick={copyPath}
aria-label={language.t("session.header.open.copyPath")}
>
<Icon name="copy" size="small" class="text-icon-base" />
<span class="text-12-regular text-text-strong">
{language.t("session.header.open.copyPath")}
</span>
</Button>
<div class="flex h-[24px] box-border items-center rounded-md border border-border-base bg-surface-panel overflow-hidden">
<Button
variant="ghost"
class="rounded-none h-full py-0 pr-3 pl-2 gap-2 border-none shadow-none"
onClick={copyPath}
aria-label={language.t("session.header.open.copyPath")}
>
<Icon name="copy" size="small" class="text-icon-base" />
<span class="text-12-regular text-text-strong">
{language.t("session.header.open.copyPath")}
</span>
</Button>
</div>
}
>
<div class="flex items-center">
@@ -355,7 +358,12 @@ export function SessionHeader() {
<span class="text-12-regular text-text-strong">Open</span>
</Button>
<div class="self-stretch w-px bg-border-base/70" />
<DropdownMenu gutter={6} placement="bottom-end">
<DropdownMenu
gutter={6}
placement="bottom-end"
open={menu.open}
onOpenChange={(open) => setMenu("open", open)}
>
<DropdownMenu.Trigger
as={IconButton}
icon="chevron-down"
@@ -375,7 +383,13 @@ export function SessionHeader() {
}}
>
{options().map((o) => (
<DropdownMenu.RadioItem value={o.id} onSelect={() => openDir(o.id)}>
<DropdownMenu.RadioItem
value={o.id}
onSelect={() => {
setMenu("open", false)
openDir(o.id)
}}
>
<div class="flex size-5 shrink-0 items-center justify-center">
<AppIcon id={o.icon} class={size(o.icon)} />
</div>
@@ -388,7 +402,12 @@ export function SessionHeader() {
</DropdownMenu.RadioGroup>
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.Item onSelect={copyPath}>
<DropdownMenu.Item
onSelect={() => {
setMenu("open", false)
copyPath()
}}
>
<div class="flex size-5 shrink-0 items-center justify-center">
<Icon name="copy" size="small" class="text-icon-weak" />
</div>

View File

@@ -367,6 +367,34 @@ export const SettingsGeneral: Component = () => {
</div>
</div>
<Show when={platform.platform === "desktop" && platform.os === "windows" && platform.getWslEnabled}>
{(_) => {
const [enabledResource, actions] = createResource(() => platform.getWslEnabled?.())
const enabled = () => (enabledResource.state === "pending" ? undefined : enabledResource.latest)
return (
<div class="flex flex-col gap-1">
<h3 class="text-14-medium text-text-strong pb-2">{language.t("settings.desktop.section.wsl")}</h3>
<div class="bg-surface-raised-base px-4 rounded-lg">
<SettingsRow
title={language.t("settings.desktop.wsl.title")}
description={language.t("settings.desktop.wsl.description")}
>
<div data-action="settings-wsl">
<Switch
checked={enabled() ?? false}
disabled={enabledResource.state === "pending"}
onChange={(checked) => platform.setWslEnabled?.(checked)?.finally(() => actions.refetch())}
/>
</div>
</SettingsRow>
</div>
</div>
)
}}
</Show>
{/* Updates Section */}
<div class="flex flex-col gap-1">
<h3 class="text-14-medium text-text-strong pb-2">{language.t("settings.general.section.updates")}</h3>

View File

@@ -74,7 +74,9 @@ export const Terminal = (props: TerminalProps) => {
let handleTextareaBlur: () => void
let disposed = false
const cleanups: VoidFunction[] = []
let tail = local.pty.tail ?? ""
const start =
typeof local.pty.cursor === "number" && Number.isSafeInteger(local.pty.cursor) ? local.pty.cursor : undefined
let cursor = start ?? 0
const cleanup = () => {
if (!cleanups.length) return
@@ -89,7 +91,7 @@ export const Terminal = (props: TerminalProps) => {
}
const getTerminalColors = (): TerminalColors => {
const mode = theme.mode()
const mode = theme.mode() === "dark" ? "dark" : "light"
const fallback = DEFAULT_TERMINAL_COLORS[mode]
const currentTheme = theme.themes()[theme.themeId()]
if (!currentTheme) return fallback
@@ -128,11 +130,12 @@ export const Terminal = (props: TerminalProps) => {
const t = term
if (!t) return
t.focus()
t.textarea?.focus()
setTimeout(() => t.textarea?.focus(), 0)
}
const handlePointerDown = () => {
const activeElement = document.activeElement
if (activeElement instanceof HTMLElement && activeElement !== container) {
if (activeElement instanceof HTMLElement && activeElement !== container && !container.contains(activeElement)) {
activeElement.blur()
}
focusTerminal()
@@ -164,13 +167,16 @@ export const Terminal = (props: TerminalProps) => {
const once = { value: false }
const url = new URL(sdk.url + `/pty/${local.pty.id}/connect?directory=${encodeURIComponent(sdk.directory)}`)
const url = new URL(sdk.url + `/pty/${local.pty.id}/connect`)
url.searchParams.set("directory", sdk.directory)
url.searchParams.set("cursor", String(start !== undefined ? start : local.pty.buffer ? -1 : 0))
url.protocol = url.protocol === "https:" ? "wss:" : "ws:"
if (window.__OPENCODE__?.serverPassword) {
url.username = "opencode"
url.password = window.__OPENCODE__?.serverPassword
}
const socket = new WebSocket(url)
socket.binaryType = "arraybuffer"
cleanups.push(() => {
if (socket.readyState !== WebSocket.CLOSED && socket.readyState !== WebSocket.CLOSING) socket.close()
})
@@ -180,12 +186,26 @@ export const Terminal = (props: TerminalProps) => {
}
ws = socket
const restore = typeof local.pty.buffer === "string" ? local.pty.buffer : ""
const restoreSize =
restore &&
typeof local.pty.cols === "number" &&
Number.isSafeInteger(local.pty.cols) &&
local.pty.cols > 0 &&
typeof local.pty.rows === "number" &&
Number.isSafeInteger(local.pty.rows) &&
local.pty.rows > 0
? { cols: local.pty.cols, rows: local.pty.rows }
: undefined
const t = new mod.Terminal({
cursorBlink: true,
cursorStyle: "bar",
cols: restoreSize?.cols,
rows: restoreSize?.rows,
fontSize: 14,
fontFamily: monoFontFamily(settings.appearance.font()),
allowTransparency: true,
allowTransparency: false,
convertEol: true,
theme: terminalColors(),
scrollback: 10_000,
@@ -199,44 +219,32 @@ export const Terminal = (props: TerminalProps) => {
ghostty = g
term = t
const copy = () => {
const handleCopy = (event: ClipboardEvent) => {
const selection = t.getSelection()
if (!selection) return false
if (!selection) return
const body = document.body
if (body) {
const textarea = document.createElement("textarea")
textarea.value = selection
textarea.setAttribute("readonly", "")
textarea.style.position = "fixed"
textarea.style.opacity = "0"
body.appendChild(textarea)
textarea.select()
const copied = document.execCommand("copy")
body.removeChild(textarea)
if (copied) return true
}
const clipboard = event.clipboardData
if (!clipboard) return
const clipboard = navigator.clipboard
if (clipboard?.writeText) {
clipboard.writeText(selection).catch(() => {})
return true
}
event.preventDefault()
clipboard.setData("text/plain", selection)
}
return false
const handlePaste = (event: ClipboardEvent) => {
const clipboard = event.clipboardData
const text = clipboard?.getData("text/plain") ?? clipboard?.getData("text") ?? ""
if (!text) return
event.preventDefault()
event.stopPropagation()
t.paste(text)
}
t.attachCustomKeyEventHandler((event) => {
const key = event.key.toLowerCase()
if (event.ctrlKey && event.shiftKey && !event.metaKey && key === "c") {
copy()
return true
}
if (event.metaKey && !event.ctrlKey && !event.altKey && key === "c") {
if (!t.hasSelection()) return true
copy()
document.execCommand("copy")
return true
}
@@ -247,6 +255,12 @@ export const Terminal = (props: TerminalProps) => {
return matchKeybind(keybinds, event)
})
container.addEventListener("copy", handleCopy, true)
cleanups.push(() => container.removeEventListener("copy", handleCopy, true))
container.addEventListener("paste", handlePaste, true)
cleanups.push(() => container.removeEventListener("paste", handlePaste, true))
const fit = new mod.FitAddon()
const serializer = new SerializeAddon()
cleanups.push(() => disposeIfDisposable(fit))
@@ -277,37 +291,27 @@ export const Terminal = (props: TerminalProps) => {
focusTerminal()
fit.fit()
const startResize = () => {
fit.observeResize()
handleResize = () => fit.fit()
window.addEventListener("resize", handleResize)
cleanups.push(() => window.removeEventListener("resize", handleResize))
}
if (local.pty.buffer) {
t.write(local.pty.buffer, () => {
if (local.pty.scrollY) t.scrollToLine(local.pty.scrollY)
if (restore && restoreSize) {
t.write(restore, () => {
fit.fit()
if (typeof local.pty.scrollY === "number") t.scrollToLine(local.pty.scrollY)
startResize()
})
}
fit.observeResize()
handleResize = () => fit.fit()
window.addEventListener("resize", handleResize)
cleanups.push(() => window.removeEventListener("resize", handleResize))
const limit = 16_384
const min = 32
const windowMs = 750
const seed = tail.length > limit ? tail.slice(-limit) : tail
let sync = seed.length >= min
let syncUntil = 0
const stopSync = () => {
sync = false
syncUntil = 0
}
const overlap = (data: string) => {
if (!seed) return 0
const max = Math.min(seed.length, data.length)
if (max < min) return 0
for (let i = max; i >= min; i--) {
if (seed.slice(-i) === data.slice(0, i)) return i
} else {
fit.fit()
if (restore) {
t.write(restore, () => {
if (typeof local.pty.scrollY === "number") t.scrollToLine(local.pty.scrollY)
})
}
return 0
startResize()
}
const onResize = t.onResize(async (size) => {
@@ -325,7 +329,6 @@ export const Terminal = (props: TerminalProps) => {
})
cleanups.push(() => disposeIfDisposable(onResize))
const onData = t.onData((data) => {
if (data) stopSync()
if (socket.readyState === WebSocket.OPEN) {
socket.send(data)
}
@@ -343,7 +346,6 @@ export const Terminal = (props: TerminalProps) => {
const handleOpen = () => {
local.onConnect?.()
if (sync) syncUntil = Date.now() + windowMs
sdk.client.pty
.update({
ptyID: local.pty.id,
@@ -357,31 +359,31 @@ export const Terminal = (props: TerminalProps) => {
socket.addEventListener("open", handleOpen)
cleanups.push(() => socket.removeEventListener("open", handleOpen))
const decoder = new TextDecoder()
const handleMessage = (event: MessageEvent) => {
if (disposed) return
if (event.data instanceof ArrayBuffer) {
// WebSocket control frame: 0x00 + UTF-8 JSON (currently { cursor }).
const bytes = new Uint8Array(event.data)
if (bytes[0] !== 0) return
const json = decoder.decode(bytes.subarray(1))
try {
const meta = JSON.parse(json) as { cursor?: unknown }
const next = meta?.cursor
if (typeof next === "number" && Number.isSafeInteger(next) && next >= 0) {
cursor = next
}
} catch {
// ignore
}
return
}
const data = typeof event.data === "string" ? event.data : ""
if (!data) return
const next = (() => {
if (!sync) return data
if (syncUntil && Date.now() > syncUntil) {
stopSync()
return data
}
const n = overlap(data)
if (!n) {
stopSync()
return data
}
const trimmed = data.slice(n)
if (trimmed) stopSync()
return trimmed
})()
if (!next) return
t.write(next)
tail = next.length >= limit ? next.slice(-limit) : (tail + next).slice(-limit)
t.write(data)
cursor += data.length
}
socket.addEventListener("message", handleMessage)
cleanups.push(() => socket.removeEventListener("message", handleMessage))
@@ -435,7 +437,7 @@ export const Terminal = (props: TerminalProps) => {
props.onCleanup({
...local.pty,
buffer,
tail,
cursor,
rows: t.rows,
cols: t.cols,
scrollY: t.getViewportY(),

View File

@@ -6,6 +6,7 @@ let createCommentSessionForTest: typeof import("./comments").createCommentSessio
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@opencode-ai/ui/context", () => ({

View File

@@ -4,6 +4,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
import { useParams } from "@solidjs/router"
import { Persist, persisted } from "@/utils/persist"
import { createScopedCache } from "@/utils/scoped-cache"
import { uuid } from "@/utils/uuid"
import type { SelectedLineRange } from "@/context/file"
export type LineComment = {
@@ -53,7 +54,7 @@ function createCommentSessionState(store: Store<CommentStore>, setStore: SetStor
const add = (input: Omit<LineComment, "id" | "time">) => {
const next: LineComment = {
id: crypto.randomUUID?.() ?? Math.random().toString(16).slice(2),
id: uuid(),
time: Date.now(),
...input,
}

View File

@@ -108,7 +108,7 @@ describe("encodeFilePath", () => {
const url = new URL(fileUrl)
expect(url.protocol).toBe("file:")
expect(url.pathname).toContain("README.bs.md")
expect(result).toBe("/D%3A/dev/projects/opencode/README.bs.md")
expect(result).toBe("/D:/dev/projects/opencode/README.bs.md")
})
test("should handle mixed separator path (Windows + Unix)", () => {
@@ -118,7 +118,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/D%3A/dev/projects/opencode/README.bs.md")
expect(result).toBe("/D:/dev/projects/opencode/README.bs.md")
})
test("should handle Windows path with spaces", () => {
@@ -146,7 +146,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/C%3A/")
expect(result).toBe("/C:/")
})
test("should handle Windows relative path with backslashes", () => {
@@ -177,7 +177,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/c%3A/users/test/file.txt")
expect(result).toBe("/c:/users/test/file.txt")
})
})
@@ -193,7 +193,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(windowsPath)
// Should convert to forward slashes and add leading /
expect(result).not.toContain("\\")
expect(result).toMatch(/^\/[A-Za-z]%3A\//)
expect(result).toMatch(/^\/[A-Za-z]:\//)
})
test("should handle relative paths the same on all platforms", () => {
@@ -237,7 +237,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(alreadyNormalized)
// Should not add another leading slash
expect(result).toBe("/D%3A/path/file.txt")
expect(result).toBe("/D:/path/file.txt")
expect(result).not.toContain("//D")
})
@@ -246,7 +246,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(justDrive)
const fileUrl = `file://${result}`
expect(result).toBe("/D%3A")
expect(result).toBe("/D:")
expect(() => new URL(fileUrl)).not.toThrow()
})
@@ -256,7 +256,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/C%3A/Users/test/")
expect(result).toBe("/C:/Users/test/")
})
test("should handle very long paths", () => {

View File

@@ -90,9 +90,14 @@ export function encodeFilePath(filepath: string): string {
}
// Encode each path segment (preserving forward slashes as path separators)
// Keep the colon in Windows drive letters (`/C:/...`) so downstream file URL parsers
// can reliably detect drives.
return normalized
.split("/")
.map((segment) => encodeURIComponent(segment))
.map((segment, index) => {
if (index === 1 && /^[A-Za-z]:$/.test(segment)) return segment
return encodeURIComponent(segment)
})
.join("/")
}

View File

@@ -12,10 +12,19 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
const platform = usePlatform()
const abort = new AbortController()
const auth = (() => {
if (typeof window === "undefined") return
const password = window.__OPENCODE__?.serverPassword
if (!password) return
return {
Authorization: `Basic ${btoa(`opencode:${password}`)}`,
}
})()
const eventSdk = createOpencodeClient({
baseUrl: server.url,
signal: abort.signal,
fetch: platform.fetch,
headers: auth,
})
const emitter = createGlobalEmitter<{
[key: string]: Event

View File

@@ -4,6 +4,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
import { useGlobalSync } from "./global-sync"
import { useGlobalSDK } from "./global-sdk"
import { useServer } from "./server"
import { usePlatform } from "./platform"
import { Project } from "@opencode-ai/sdk/v2"
import { Persist, persisted, removePersisted } from "@/utils/persist"
import { same } from "@/utils/same"
@@ -90,6 +91,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const globalSdk = useGlobalSDK()
const globalSync = useGlobalSync()
const server = useServer()
const platform = usePlatform()
const isRecord = (value: unknown): value is Record<string, unknown> =>
typeof value === "object" && value !== null && !Array.isArray(value)
@@ -200,10 +202,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
for (const entry of SESSION_STATE_KEYS) {
const target = session ? Persist.session(dir, session, entry.key) : Persist.workspace(dir, entry.key)
void removePersisted(target)
void removePersisted(target, platform)
const legacyKey = `${dir}/${entry.legacy}${session ? "/" + session : ""}.${entry.version}`
void removePersisted({ key: legacyKey })
void removePersisted({ key: legacyKey }, platform)
}
}
}

View File

@@ -6,6 +6,7 @@ import { useSync } from "./sync"
import { base64Encode } from "@opencode-ai/util/encode"
import { useProviders } from "@/hooks/use-providers"
import { useModels } from "@/context/models"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
export type ModelKey = { providerID: string; modelID: string }
@@ -184,11 +185,27 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
models.setVisibility(model, visible)
},
variant: {
current() {
configured() {
const a = agent.current()
const m = current()
if (!a || !m) return undefined
return getConfiguredAgentVariant({
agent: { model: a.model, variant: a.variant },
model: { providerID: m.provider.id, modelID: m.id, variants: m.variants },
})
},
selected() {
const m = current()
if (!m) return undefined
return models.variant.get({ providerID: m.provider.id, modelID: m.id })
},
current() {
return resolveModelVariant({
variants: this.list(),
selected: this.selected(),
configured: this.configured(),
})
},
list() {
const m = current()
if (!m) return []
@@ -203,17 +220,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
cycle() {
const variants = this.list()
if (variants.length === 0) return
const currentVariant = this.current()
if (!currentVariant) {
this.set(variants[0])
return
}
const index = variants.indexOf(currentVariant)
if (index === -1 || index === variants.length - 1) {
this.set(undefined)
return
}
this.set(variants[index + 1])
this.set(
cycleModelVariant({
variants,
selected: this.selected(),
configured: this.configured(),
}),
)
},
},
}

View File

@@ -0,0 +1,66 @@
import { describe, expect, test } from "bun:test"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
describe("model variant", () => {
test("resolves configured agent variant when model matches", () => {
const value = getConfiguredAgentVariant({
agent: {
model: { providerID: "openai", modelID: "gpt-5.2" },
variant: "xhigh",
},
model: {
providerID: "openai",
modelID: "gpt-5.2",
variants: { low: {}, high: {}, xhigh: {} },
},
})
expect(value).toBe("xhigh")
})
test("ignores configured variant when model does not match", () => {
const value = getConfiguredAgentVariant({
agent: {
model: { providerID: "openai", modelID: "gpt-5.2" },
variant: "xhigh",
},
model: {
providerID: "anthropic",
modelID: "claude-sonnet-4",
variants: { low: {}, high: {}, xhigh: {} },
},
})
expect(value).toBeUndefined()
})
test("prefers selected variant over configured variant", () => {
const value = resolveModelVariant({
variants: ["low", "high", "xhigh"],
selected: "high",
configured: "xhigh",
})
expect(value).toBe("high")
})
test("cycles from configured variant to next", () => {
const value = cycleModelVariant({
variants: ["low", "high", "xhigh"],
selected: undefined,
configured: "high",
})
expect(value).toBe("xhigh")
})
test("wraps from configured last variant to first", () => {
const value = cycleModelVariant({
variants: ["low", "high", "xhigh"],
selected: undefined,
configured: "xhigh",
})
expect(value).toBe("low")
})
})

View File

@@ -0,0 +1,50 @@
type AgentModel = {
providerID: string
modelID: string
}
type Agent = {
model?: AgentModel
variant?: string
}
type Model = AgentModel & {
variants?: Record<string, unknown>
}
type VariantInput = {
variants: string[]
selected: string | undefined
configured: string | undefined
}
export function getConfiguredAgentVariant(input: { agent: Agent | undefined; model: Model | undefined }) {
if (!input.agent?.variant) return undefined
if (!input.agent.model) return undefined
if (!input.model?.variants) return undefined
if (input.agent.model.providerID !== input.model.providerID) return undefined
if (input.agent.model.modelID !== input.model.modelID) return undefined
if (!(input.agent.variant in input.model.variants)) return undefined
return input.agent.variant
}
export function resolveModelVariant(input: VariantInput) {
if (input.selected && input.variants.includes(input.selected)) return input.selected
if (input.configured && input.variants.includes(input.configured)) return input.configured
return undefined
}
export function cycleModelVariant(input: VariantInput) {
if (input.variants.length === 0) return undefined
if (input.selected && input.variants.includes(input.selected)) {
const index = input.variants.indexOf(input.selected)
if (index === input.variants.length - 1) return undefined
return input.variants[index + 1]
}
if (input.configured && input.variants.includes(input.configured)) {
const index = input.variants.indexOf(input.configured)
if (index === input.variants.length - 1) return input.variants[0]
return input.variants[index + 1]
}
return input.variants[0]
}

View File

@@ -69,7 +69,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
}),
)
const meta = { pruned: false }
const meta = { pruned: false, disposed: false }
createEffect(() => {
if (!ready()) return
@@ -84,6 +84,17 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const index = createMemo(() => buildNotificationIndex(store.list))
const lookup = (directory: string, sessionID?: string) => {
if (!sessionID) return Promise.resolve(undefined)
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = Binary.search(syncStore.session, sessionID, (s) => s.id)
if (match.found) return Promise.resolve(syncStore.session[match.index])
return globalSDK.client.session
.get({ directory, sessionID })
.then((x) => x.data)
.catch(() => undefined)
}
const unsub = globalSDK.event.listen((e) => {
const event = e.details
if (event.type !== "session.idle" && event.type !== "session.error") return
@@ -102,61 +113,65 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
switch (event.type) {
case "session.idle": {
const sessionID = event.properties.sessionID
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = Binary.search(syncStore.session, sessionID, (s) => s.id)
const session = match.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
void lookup(directory, sessionID).then((session) => {
if (meta.disposed) return
if (!session) return
if (session.parentID) return
playSound(soundSrc(settings.sounds.agent()))
playSound(soundSrc(settings.sounds.agent()))
append({
directory,
time,
viewed: viewed(sessionID),
type: "turn-complete",
session: sessionID,
append({
directory,
time,
viewed: viewed(sessionID),
type: "turn-complete",
session: sessionID,
})
const href = `/${base64Encode(directory)}/session/${sessionID}`
if (settings.notifications.agent()) {
void platform.notify(
language.t("notification.session.responseReady.title"),
session.title ?? sessionID,
href,
)
}
})
const href = `/${base64Encode(directory)}/session/${sessionID}`
if (settings.notifications.agent()) {
void platform.notify(
language.t("notification.session.responseReady.title"),
session?.title ?? sessionID,
href,
)
}
break
}
case "session.error": {
const sessionID = event.properties.sessionID
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = sessionID ? Binary.search(syncStore.session, sessionID, (s) => s.id) : undefined
const session = sessionID && match?.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
void lookup(directory, sessionID).then((session) => {
if (meta.disposed) return
if (session?.parentID) return
playSound(soundSrc(settings.sounds.errors()))
playSound(soundSrc(settings.sounds.errors()))
const error = "error" in event.properties ? event.properties.error : undefined
append({
directory,
time,
viewed: viewed(sessionID),
type: "error",
session: sessionID ?? "global",
error,
const error = "error" in event.properties ? event.properties.error : undefined
append({
directory,
time,
viewed: viewed(sessionID),
type: "error",
session: sessionID ?? "global",
error,
})
const description =
session?.title ??
(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)
}
})
const description =
session?.title ??
(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)
}
break
}
}
})
onCleanup(unsub)
onCleanup(() => {
meta.disposed = true
unsub()
})
return {
ready,

View File

@@ -57,6 +57,12 @@ export type Platform = {
/** Set the default server URL to use on app startup (platform-specific) */
setDefaultServerUrl?(url: string | null): Promise<void> | void
/** Get the configured WSL integration (desktop only) */
getWslEnabled?(): Promise<boolean>
/** Set the configured WSL integration (desktop only) */
setWslEnabled?(config: boolean): Promise<void> | void
/** Get the preferred display backend (desktop only) */
getDisplayBackend?(): Promise<DisplayBackend | null> | DisplayBackend | null

View File

@@ -5,6 +5,7 @@ let getLegacyTerminalStorageKeys: (dir: string, legacySessionID?: string) => str
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@opencode-ai/ui/context", () => ({

View File

@@ -3,7 +3,8 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
import { batch, createEffect, createMemo, createRoot, onCleanup } from "solid-js"
import { useParams } from "@solidjs/router"
import { useSDK } from "./sdk"
import { Persist, persisted } from "@/utils/persist"
import type { Platform } from "./platform"
import { Persist, persisted, removePersisted } from "@/utils/persist"
export type LocalPTY = {
id: string
@@ -13,7 +14,7 @@ export type LocalPTY = {
cols?: number
buffer?: string
scrollY?: number
tail?: string
cursor?: number
}
const WORKSPACE_KEY = "__workspace__"
@@ -35,6 +36,28 @@ type TerminalCacheEntry = {
dispose: VoidFunction
}
const caches = new Set<Map<string, TerminalCacheEntry>>()
export function clearWorkspaceTerminals(dir: string, sessionIDs?: string[], platform?: Platform) {
const key = getWorkspaceTerminalCacheKey(dir)
for (const cache of caches) {
const entry = cache.get(key)
entry?.value.clear()
}
removePersisted(Persist.workspace(dir, "terminal"), platform)
const legacy = new Set(getLegacyTerminalStorageKeys(dir))
for (const id of sessionIDs ?? []) {
for (const key of getLegacyTerminalStorageKeys(dir, id)) {
legacy.add(key)
}
}
for (const key of legacy) {
removePersisted({ key }, platform)
}
}
function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: string, legacySessionID?: string) {
const legacy = getLegacyTerminalStorageKeys(dir, legacySessionID)
@@ -56,7 +79,7 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
}),
)
const unsub = sdk.event.on("pty.exited", (event) => {
const unsub = sdk.event.on("pty.exited", (event: { properties: { id: string } }) => {
const id = event.properties.id
if (!store.all.some((x) => x.id === id)) return
batch(() => {
@@ -96,6 +119,12 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
ready,
all: createMemo(() => Object.values(store.all)),
active: createMemo(() => store.active),
clear() {
batch(() => {
setStore("active", undefined)
setStore("all", [])
})
},
new() {
const existingTitleNumbers = new Set(
store.all.flatMap((pty) => {
@@ -114,7 +143,7 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
sdk.client.pty
.create({ title: `Terminal ${nextNumber}` })
.then((pty) => {
.then((pty: { data?: { id?: string; title?: string } }) => {
const id = pty.data?.id
if (!id) return
const newTerminal = {
@@ -128,8 +157,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
})
setStore("active", id)
})
.catch((e) => {
console.error("Failed to create terminal", e)
.catch((error: unknown) => {
console.error("Failed to create terminal", error)
})
},
update(pty: Partial<LocalPTY> & { id: string }) {
@@ -143,8 +172,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
title: pty.title,
size: pty.cols && pty.rows ? { rows: pty.rows, cols: pty.cols } : undefined,
})
.catch((e) => {
console.error("Failed to update terminal", e)
.catch((error: unknown) => {
console.error("Failed to update terminal", error)
})
},
async clone(id: string) {
@@ -155,8 +184,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
.create({
title: pty.title,
})
.catch((e) => {
console.error("Failed to clone terminal", e)
.catch((error: unknown) => {
console.error("Failed to clone terminal", error)
return undefined
})
if (!clone?.data) return
@@ -168,6 +197,12 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
id: clone.data.id,
title: clone.data.title ?? pty.title,
titleNumber: pty.titleNumber,
// New PTY process, so start clean.
buffer: undefined,
cursor: undefined,
scrollY: undefined,
rows: undefined,
cols: undefined,
})
if (active) {
setStore("active", clone.data.id)
@@ -200,8 +235,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
setStore("all", filtered)
})
await sdk.client.pty.remove({ ptyID: id }).catch((e) => {
console.error("Failed to close terminal", e)
await sdk.client.pty.remove({ ptyID: id }).catch((error: unknown) => {
console.error("Failed to close terminal", error)
})
},
move(id: string, to: number) {
@@ -225,6 +260,9 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
const params = useParams()
const cache = new Map<string, TerminalCacheEntry>()
caches.add(cache)
onCleanup(() => caches.delete(cache))
const disposeAll = () => {
for (const entry of cache.values()) {
entry.dispose()

View File

@@ -16,11 +16,9 @@ export const dict = {
"command.category.permissions": "أذونات",
"command.category.workspace": "مساحة عمل",
"command.category.settings": "إعدادات",
"theme.scheme.system": "نظام",
"theme.scheme.light": "فاتح",
"theme.scheme.dark": "داكن",
"command.sidebar.toggle": "تبديل الشريط الجانبي",
"command.project.open": "فتح مشروع",
"command.provider.connect": "اتصال بموفر",
@@ -31,17 +29,13 @@ export const dict = {
"command.session.previous.unseen": "الجلسة غير المقروءة السابقة",
"command.session.next.unseen": "الجلسة غير المقروءة التالية",
"command.session.archive": "أرشفة الجلسة",
"command.palette": "لوحة الأوامر",
"command.theme.cycle": "تغيير السمة",
"command.theme.set": "استخدام السمة: {{theme}}",
"command.theme.scheme.cycle": "تغيير مخطط الألوان",
"command.theme.scheme.set": "استخدام مخطط الألوان: {{scheme}}",
"command.language.cycle": "تغيير اللغة",
"command.language.set": "استخدام اللغة: {{language}}",
"command.session.new": "جلسة جديدة",
"command.file.open": "فتح ملف",
"command.tab.close": "إغلاق علامة التبويب",
@@ -72,6 +66,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "قبول التعديلات تلقائيًا",
"command.permissions.autoaccept.disable": "إيقاف قبول التعديلات تلقائيًا",
"command.workspace.toggle": "تبديل مساحات العمل",
"command.workspace.toggle.description": "تمكين أو تعطيل مساحات العمل المتعددة في الشريط الجانبي",
"command.session.undo": "تراجع",
"command.session.undo.description": "تراجع عن الرسالة الأخيرة",
"command.session.redo": "إعادة",
@@ -84,32 +79,30 @@ export const dict = {
"command.session.share.description": "مشاركة هذه الجلسة ونسخ الرابط إلى الحافظة",
"command.session.unshare": "إلغاء مشاركة الجلسة",
"command.session.unshare.description": "إيقاف مشاركة هذه الجلسة",
"palette.search.placeholder": "البحث في الملفات والأوامر والجلسات",
"palette.empty": "لا توجد نتائج",
"palette.group.commands": "الأوامر",
"palette.group.files": "الملفات",
"dialog.provider.search.placeholder": "البحث عن موفرين",
"dialog.provider.empty": "لم يتم العثور على موفرين",
"dialog.provider.group.popular": "شائع",
"dialog.provider.group.other": "آخر",
"dialog.provider.tag.recommended": "موصى به",
"dialog.provider.opencode.note": "نماذج مختارة تتضمن Claude و GPT و Gemini والمزيد",
"dialog.provider.anthropic.note": "اتصل باستخدام Claude Pro/Max أو مفتاح API",
"dialog.provider.openai.note": "اتصل باستخدام ChatGPT Pro/Plus أو مفتاح API",
"dialog.provider.copilot.note": "اتصل باستخدام Copilot أو مفتاح API",
"dialog.provider.openai.note": "اتصل باستخدام ChatGPT Pro/Plus أو مفتاح API",
"dialog.provider.google.note": "نماذج Gemini لاستجابات سريعة ومنظمة",
"dialog.provider.openrouter.note": "الوصول إلى جميع النماذج المدعومة من موفر واحد",
"dialog.provider.vercel.note": "وصول موحد إلى نماذج الذكاء الاصطناعي مع توجيه ذكي",
"dialog.model.select.title": "تحديد نموذج",
"dialog.model.search.placeholder": "البحث عن نماذج",
"dialog.model.empty": "لا توجد نتائج للنماذج",
"dialog.model.manage": "إدارة النماذج",
"dialog.model.manage.description": "تخصيص النماذج التي تظهر في محدد النماذج.",
"dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode",
"dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين",
"dialog.provider.viewAll": "عرض المزيد من الموفرين",
"provider.connect.title": "اتصال {{provider}}",
"provider.connect.title.anthropicProMax": "تسجيل الدخول باستخدام Claude Pro/Max",
"provider.connect.selectMethod": "حدد طريقة تسجيل الدخول لـ {{provider}}.",
@@ -144,7 +137,42 @@ export const dict = {
"provider.connect.oauth.auto.confirmationCode": "رمز التأكيد",
"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.field.providerID.label": "معرف الموفر",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "أحرف صغيرة، أرقام، شرطات، أو شرطات سفلية",
"provider.custom.field.name.label": "اسم العرض",
"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.description": "اختياري. اتركه فارغًا إذا كنت تدير المصادقة عبر الترويسات.",
"provider.custom.models.label": "النماذج",
"provider.custom.models.id.label": "المعرف",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "الاسم",
"provider.custom.models.name.placeholder": "اسم العرض",
"provider.custom.models.remove": "إزالة النموذج",
"provider.custom.models.add": "إضافة نموذج",
"provider.custom.headers.label": "الترويسات (اختياري)",
"provider.custom.headers.key.label": "ترويسة",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "القيمة",
"provider.custom.headers.value.placeholder": "قيمة",
"provider.custom.headers.remove": "إزالة الترويسة",
"provider.custom.headers.add": "إضافة ترويسة",
"provider.custom.error.providerID.required": "معرف الموفر مطلوب",
"provider.custom.error.providerID.format": "استخدم أحرفًا صغيرة، أرقامًا، شرطات، أو شرطات سفلية",
"provider.custom.error.providerID.exists": "معرف الموفر هذا موجود بالفعل",
"provider.custom.error.name.required": "اسم العرض مطلوب",
"provider.custom.error.baseURL.required": "عنوان URL الأساسي مطلوب",
"provider.custom.error.baseURL.format": "يجب أن يبدأ بـ http:// أو https://",
"provider.custom.error.required": "مطلوب",
"provider.custom.error.duplicate": "مكرر",
"provider.disconnect.toast.disconnected.title": "تم فصل {{provider}}",
"provider.disconnect.toast.disconnected.description": "لم تعد نماذج {{provider}} متاحة.",
"model.tag.free": "مجاني",
@@ -163,9 +191,9 @@ export const dict = {
"model.tooltip.reasoning.allowed": "يسمح بالاستنتاج",
"model.tooltip.reasoning.none": "بدون استنتاج",
"model.tooltip.context": "حد السياق {{limit}}",
"common.search.placeholder": "بحث",
"common.goBack": "رجوع",
"common.goForward": "انتقل للأمام",
"common.loading": "جارٍ التحميل",
"common.loading.ellipsis": "...",
"common.cancel": "إلغاء",
@@ -176,14 +204,12 @@ export const dict = {
"common.saving": "جارٍ الحفظ...",
"common.default": "افتراضي",
"common.attachment": "مرفق",
"prompt.placeholder.shell": "أدخل أمر shell...",
"prompt.placeholder.normal": 'اسأل أي شيء... "{{example}}"',
"prompt.placeholder.summarizeComments": "لخّص التعليقات…",
"prompt.placeholder.summarizeComment": "لخّص التعليق…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell.exit": "esc للخروج",
"prompt.example.1": "إصلاح TODO في قاعدة التعليمات البرمجية",
"prompt.example.2": "ما هو المكدس التقني لهذا المشروع؟",
"prompt.example.3": "إصلاح الاختبارات المعطلة",
@@ -209,7 +235,6 @@ export const dict = {
"prompt.example.23": "إضافة ترقيم الصفحات إلى هذه القائمة",
"prompt.example.24": "إنشاء أمر CLI لـ...",
"prompt.example.25": "كيف تعمل متغيرات البيئة هنا؟",
"prompt.popover.emptyResults": "لا توجد نتائج مطابقة",
"prompt.popover.emptyCommands": "لا توجد أوامر مطابقة",
"prompt.dropzone.label": "أفلت الصور أو ملفات PDF هنا",
@@ -225,7 +250,6 @@ export const dict = {
"prompt.attachment.remove": "إزالة المرفق",
"prompt.action.send": "إرسال",
"prompt.action.stop": "توقف",
"prompt.toast.pasteUnsupported.title": "لصق غير مدعوم",
"prompt.toast.pasteUnsupported.description": "يمكن لصق الصور أو ملفات PDF فقط هنا.",
"prompt.toast.modelAgentRequired.title": "حدد وكيلاً ونموذجاً",
@@ -236,24 +260,18 @@ 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.plugins.empty": "الإضافات المكونة في opencode.json",
"mcp.status.connected": "متصل",
"mcp.status.failed": "فشل",
"mcp.status.needs_auth": "يحتاج إلى مصادقة",
"mcp.status.disabled": "معطل",
"dialog.fork.empty": "لا توجد رسائل للتفرع منها",
"dialog.directory.search.placeholder": "البحث في المجلدات",
"dialog.directory.empty": "لم يتم العثور على مجلدات",
"dialog.server.title": "الخوادم",
"dialog.server.description": "تبديل خادم OpenCode الذي يتصل به هذا التطبيق.",
"dialog.server.search.placeholder": "البحث في الخوادم",
@@ -271,14 +289,12 @@ export const dict = {
"dialog.server.default.set": "تعيين الخادم الحالي كافتراضي",
"dialog.server.default.clear": "مسح",
"dialog.server.action.remove": "إزالة الخادم",
"dialog.server.menu.edit": "تعديل",
"dialog.server.menu.default": "تعيين كافتراضي",
"dialog.server.menu.defaultRemove": "إزالة الافتراضي",
"dialog.server.menu.delete": "حذف",
"dialog.server.current": "الخادم الحالي",
"dialog.server.status.default": "افتراضي",
"dialog.project.edit.title": "تحرير المشروع",
"dialog.project.edit.name": "الاسم",
"dialog.project.edit.icon": "أيقونة",
@@ -287,7 +303,6 @@ 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.description": "يتم تشغيله بعد إنشاء مساحة عمل جديدة (شجرة عمل).",
"dialog.project.edit.worktree.startup.placeholder": "مثال: bun install",
@@ -298,10 +313,8 @@ export const dict = {
"context.breakdown.assistant": "المساعد",
"context.breakdown.tool": "استدعاءات الأداة",
"context.breakdown.other": "أخرى",
"context.systemPrompt.title": "موجه النظام",
"context.rawMessages.title": "الرسائل الخام",
"context.stats.session": "جلسة",
"context.stats.messages": "رسائل",
"context.stats.provider": "موفر",
@@ -318,34 +331,42 @@ export const dict = {
"context.stats.totalCost": "التكلفة الإجمالية",
"context.stats.sessionCreated": "تم إنشاء الجلسة",
"context.stats.lastActivity": "آخر نشاط",
"context.usage.tokens": "رموز",
"context.usage.usage": "استخدام",
"context.usage.cost": "تكلفة",
"context.usage.clickToView": "انقر لعرض السياق",
"context.usage.view": "عرض استخدام السياق",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "لغة",
"toast.language.description": "تم التبديل إلى {{language}}",
"toast.theme.title": "تم تبديل السمة",
"toast.scheme.title": "مخطط الألوان",
"toast.permissions.autoaccept.on.title": "قبول التعديلات تلقائيًا",
"toast.permissions.autoaccept.on.description": "سيتم الموافقة تلقائيًا على أذونات التحرير والكتابة",
"toast.permissions.autoaccept.off.title": "توقف قبول التعديلات تلقائيًا",
"toast.permissions.autoaccept.off.description": "ستتطلب أذونات التحرير والكتابة موافقة",
"toast.workspace.enabled.title": "تم تمكين مساحات العمل",
"toast.workspace.enabled.description": "الآن يتم عرض عدة worktrees في الشريط الجانبي",
"toast.workspace.disabled.title": "تم تعطيل مساحات العمل",
"toast.workspace.disabled.description": "يتم عرض worktree الرئيسي فقط في الشريط الجانبي",
"toast.permissions.autoaccept.on.title": "قبول التعديلات تلقائيًا",
"toast.permissions.autoaccept.on.description": "سيتم الموافقة تلقائيًا على أذونات التحرير والكتابة",
"toast.permissions.autoaccept.off.title": "توقف قبول التعديلات تلقائيًا",
"toast.permissions.autoaccept.off.description": "ستتطلب أذونات التحرير والكتابة موافقة",
"toast.model.none.title": "لم يتم تحديد نموذج",
"toast.model.none.description": "قم بتوصيل موفر لتلخيص هذه الجلسة",
"toast.file.loadFailed.title": "فشل تحميل الملف",
"toast.file.listFailed.title": "فشل سرد الملفات",
"toast.context.noLineSelection.title": "لا يوجد تحديد للأسطر",
"toast.context.noLineSelection.description": "حدد نطاق أسطر في تبويب ملف أولاً.",
@@ -354,19 +375,15 @@ export const dict = {
"toast.session.share.success.description": "تم نسخ عنوان URL للمشاركة إلى الحافظة!",
"toast.session.share.failed.title": "فشل مشاركة الجلسة",
"toast.session.share.failed.description": "حدث خطأ أثناء مشاركة الجلسة",
"toast.session.unshare.success.title": "تم إلغاء مشاركة الجلسة",
"toast.session.unshare.success.description": "تم إلغاء مشاركة الجلسة بنجاح!",
"toast.session.unshare.failed.title": "فشل إلغاء مشاركة الجلسة",
"toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة",
"toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}",
"toast.update.title": "تحديث متاح",
"toast.update.description": "نسخة جديدة من OpenCode ({{version}}) متاحة الآن للتثبيت.",
"toast.update.action.installRestart": "تثبيت وإعادة تشغيل",
"toast.update.action.notYet": "ليس الآن",
"error.page.title": "حدث خطأ ما",
"error.page.description": "حدث خطأ أثناء تحميل التطبيق.",
"error.page.details.label": "تفاصيل الخطأ",
@@ -377,12 +394,10 @@ export const dict = {
"error.page.report.prefix": "يرجى الإبلاغ عن هذا الخطأ لفريق OpenCode",
"error.page.report.discord": "على Discord",
"error.page.version": "الإصدار: {{version}}",
"error.dev.rootNotFound":
"لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
"error.globalSync.connectFailed": "تعذر الاتصال بالخادم. هل هناك خادم يعمل في `{{url}}`؟",
"directory.error.invalidUrl": "دليل غير صالح في عنوان URL.",
"error.chain.unknown": "خطأ غير معروف",
"error.chain.causedBy": "بسبب:",
"error.chain.apiError": "خطأ API",
@@ -402,21 +417,17 @@ export const dict = {
"error.chain.configFrontmatterError": "فشل تحليل frontmatter في {{path}}:\n{{message}}",
"error.chain.configInvalid": "ملف التكوين في {{path}} غير صالح",
"error.chain.configInvalidWithMessage": "ملف التكوين في {{path}} غير صالح: {{message}}",
"notification.permission.title": "مطلوب إذن",
"notification.permission.description": "{{sessionTitle}} في {{projectName}} يحتاج إلى إذن",
"notification.question.title": "سؤال",
"notification.question.description": "{{sessionTitle}} في {{projectName}} لديه سؤال",
"notification.action.goToSession": "انتقل إلى الجلسة",
"notification.session.responseReady.title": "الاستجابة جاهزة",
"notification.session.error.title": "خطأ في الجلسة",
"notification.session.error.fallbackDescription": "حدث خطأ",
"home.recentProjects": "المشاريع الحديثة",
"home.empty.title": "لا توجد مشاريع حديثة",
"home.empty.description": "ابدأ بفتح مشروع محلي",
"session.tab.session": "جلسة",
"session.tab.review": "مراجعة",
"session.tab.context": "سياق",
@@ -435,17 +446,18 @@ export const dict = {
"session.messages.loadEarlier": "تحميل الرسائل السابقة",
"session.messages.loading": "جارٍ تحميل الرسائل...",
"session.messages.jumpToLatest": "الانتقال إلى الأحدث",
"session.context.addToContext": "إضافة {{selection}} إلى السياق",
"session.new.worktree.main": "الفرع الرئيسي",
"session.new.worktree.mainWithBranch": "الفرع الرئيسي ({{branch}})",
"session.new.worktree.create": "إنشاء شجرة عمل جديدة",
"session.new.lastModified": "آخر تعديل",
"session.header.search.placeholder": "بحث {{project}}",
"session.header.searchFiles": "بحث عن الملفات",
"session.header.openIn": "فتح في",
"session.header.open.action": "فتح {{app}}",
"session.header.open.ariaLabel": "فتح في {{app}}",
"session.header.open.menu": "خيارات الفتح",
"session.header.open.copyPath": "نسخ المسار",
"status.popover.trigger": "الحالة",
"status.popover.ariaLabel": "إعدادات الخوادم",
"status.popover.tab.servers": "الخوادم",
@@ -453,7 +465,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "الإضافات",
"status.popover.action.manageServers": "إدارة الخوادم",
"session.share.popover.title": "نشر على الويب",
"session.share.popover.description.shared": "هذه الجلسة عامة على الويب. يمكن لأي شخص لديه الرابط الوصول إليها.",
"session.share.popover.description.unshared": "شارك الجلسة علنًا على الويب. ستكون متاحة لأي شخص لديه الرابط.",
@@ -465,10 +476,8 @@ export const dict = {
"session.share.action.view": "عرض",
"session.share.copy.copied": "تم النسخ",
"session.share.copy.copyLink": "نسخ الرابط",
"lsp.tooltip.none": "لا توجد خوادم LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "جارٍ تحميل الموجه...",
"terminal.loading": "جارٍ تحميل المحطة الطرفية...",
"terminal.title": "محطة طرفية",
@@ -476,7 +485,6 @@ export const dict = {
"terminal.close": "إغلاق المحطة الطرفية",
"terminal.connectionLost.title": "فقد الاتصال",
"terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
"common.closeTab": "إغلاق علامة التبويب",
"common.dismiss": "رفض",
"common.requestFailed": "فشل الطلب",
@@ -490,7 +498,6 @@ export const dict = {
"common.edit": "تحرير",
"common.loadMore": "تحميل المزيد",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "تبديل القائمة",
"sidebar.nav.projectsAndSessions": "المشاريع والجلسات",
"sidebar.settings": "الإعدادات",
@@ -502,18 +509,19 @@ export const dict = {
"sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.",
"sidebar.project.recentSessions": "الجلسات الحديثة",
"sidebar.project.viewAllSessions": "عرض جميع الجلسات",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "سطح المكتب",
"settings.section.server": "الخادم",
"settings.tab.general": "عام",
"settings.tab.shortcuts": "اختصارات",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "تكامل WSL",
"settings.desktop.wsl.description": "تشغيل خادم OpenCode داخل WSL على Windows.",
"settings.general.section.appearance": "المظهر",
"settings.general.section.notifications": "إشعارات النظام",
"settings.general.section.updates": "التحديثات",
"settings.general.section.sounds": "المؤثرات الصوتية",
"settings.general.section.display": "شاشة العرض",
"settings.general.row.language.title": "اللغة",
"settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode",
"settings.general.row.appearance.title": "المظهر",
@@ -522,10 +530,12 @@ export const dict = {
"settings.general.row.theme.description": "تخصيص سمة OpenCode.",
"settings.general.row.font.title": "الخط",
"settings.general.row.font.description": "تخصيص الخط الأحادي المستخدم في كتل التعليمات البرمجية",
"settings.general.row.wayland.title": "استخدام Wayland الأصلي",
"settings.general.row.wayland.description": "تعطيل التراجع إلى X11 على Wayland. يتطلب إعادة التشغيل.",
"settings.general.row.wayland.tooltip":
"على Linux مع شاشات بمعدلات تحديث مختلطة، يمكن أن يكون Wayland الأصلي أكثر استقرارًا.",
"settings.general.row.releaseNotes.title": "ملاحظات الإصدار",
"settings.general.row.releaseNotes.description": 'عرض نوافذ "ما الجديد" المنبثقة بعد التحديثات',
"settings.updates.row.startup.title": "التحقق من التحديثات عند بدء التشغيل",
"settings.updates.row.startup.description": "التحقق تلقائيًا من التحديثات عند تشغيل OpenCode",
"settings.updates.row.check.title": "التحقق من التحديثات",
@@ -591,21 +601,18 @@ export const dict = {
"sound.option.yup04": "نعم 04",
"sound.option.yup05": "نعم 05",
"sound.option.yup06": "نعم 06",
"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.sounds.agent.title": "وكيل",
"settings.general.sounds.agent.description": "تشغيل صوت عندما يكتمل الوكيل أو يحتاج إلى اهتمام",
"settings.general.sounds.permissions.title": "أذونات",
"settings.general.sounds.permissions.description": "تشغيل صوت عند الحاجة إلى إذن",
"settings.general.sounds.errors.title": "أخطاء",
"settings.general.sounds.errors.description": "تشغيل صوت عند حدوث خطأ",
"settings.shortcuts.title": "اختصارات لوحة المفاتيح",
"settings.shortcuts.reset.button": "إعادة التعيين إلى الافتراضيات",
"settings.shortcuts.reset.toast.title": "تم إعادة تعيين الاختصارات",
@@ -616,14 +623,12 @@ export const dict = {
"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.modelAndAgent": "النموذج والوكيل",
"settings.shortcuts.group.terminal": "المحطة الطرفية",
"settings.shortcuts.group.prompt": "موجه",
"settings.providers.title": "الموفرون",
"settings.providers.description": "ستكون إعدادات الموفر قابلة للتكوين هنا.",
"settings.providers.section.connected": "الموفرون المتصلون",
@@ -641,16 +646,13 @@ export const dict = {
"settings.commands.description": "ستكون إعدادات الأمر قابلة للتكوين هنا.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "ستكون إعدادات MCP قابلة للتكوين هنا.",
"settings.permissions.title": "الأذونات",
"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.tool.read.title": "قراءة",
"settings.permissions.tool.read.description": "قراءة ملف (يطابق مسار الملف)",
"settings.permissions.tool.edit.title": "تحرير",
@@ -664,9 +666,9 @@ export const dict = {
"settings.permissions.tool.list.description": "سرد الملفات داخل دليل",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "تشغيل أوامر shell",
"settings.permissions.tool.task.title": "Task",
"settings.permissions.tool.task.title": "مهمة",
"settings.permissions.tool.task.description": "تشغيل الوكلاء الفرعيين",
"settings.permissions.tool.skill.title": "Skill",
"settings.permissions.tool.skill.title": "مهارة",
"settings.permissions.tool.skill.description": "تحميل مهارة بالاسم",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "تشغيل استعلامات خادم اللغة",
@@ -684,12 +686,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "الوصول إلى الملفات خارج دليل المشروع",
"settings.permissions.tool.doom_loop.title": "حلقة الموت",
"settings.permissions.tool.doom_loop.description": "اكتشاف استدعاءات الأدوات المتكررة بمدخلات متطابقة",
"session.delete.failed.title": "فشل حذف الجلسة",
"session.delete.title": "حذف الجلسة",
"session.delete.confirm": 'حذف الجلسة "{{name}}"؟',
"session.delete.button": "حذف الجلسة",
"workspace.new": "مساحة عمل جديدة",
"workspace.type.local": "محلي",
"workspace.type.sandbox": "صندوق رمل",

View File

@@ -16,11 +16,9 @@ export const dict = {
"command.category.permissions": "Permissões",
"command.category.workspace": "Espaço de trabalho",
"command.category.settings": "Configurações",
"theme.scheme.system": "Sistema",
"theme.scheme.light": "Claro",
"theme.scheme.dark": "Escuro",
"command.sidebar.toggle": "Alternar barra lateral",
"command.project.open": "Abrir projeto",
"command.provider.connect": "Conectar provedor",
@@ -31,17 +29,13 @@ export const dict = {
"command.session.previous.unseen": "Sessão não lida anterior",
"command.session.next.unseen": "Próxima sessão não lida",
"command.session.archive": "Arquivar sessão",
"command.palette": "Paleta de comandos",
"command.theme.cycle": "Alternar tema",
"command.theme.set": "Usar tema: {{theme}}",
"command.theme.scheme.cycle": "Alternar esquema de cores",
"command.theme.scheme.set": "Usar esquema de cores: {{scheme}}",
"command.language.cycle": "Alternar idioma",
"command.language.set": "Usar idioma: {{language}}",
"command.session.new": "Nova sessão",
"command.file.open": "Abrir arquivo",
"command.tab.close": "Fechar aba",
@@ -72,6 +66,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Aceitar edições automaticamente",
"command.permissions.autoaccept.disable": "Parar de aceitar edições automaticamente",
"command.workspace.toggle": "Alternar espaços de trabalho",
"command.workspace.toggle.description": "Habilitar ou desabilitar múltiplos espaços de trabalho na barra lateral",
"command.session.undo": "Desfazer",
"command.session.undo.description": "Desfazer a última mensagem",
"command.session.redo": "Refazer",
@@ -84,32 +79,30 @@ export const dict = {
"command.session.share.description": "Compartilhar esta sessão e copiar a URL para a área de transferência",
"command.session.unshare": "Parar de compartilhar sessão",
"command.session.unshare.description": "Parar de compartilhar esta sessão",
"palette.search.placeholder": "Buscar arquivos, comandos e sessões",
"palette.empty": "Nenhum resultado encontrado",
"palette.group.commands": "Comandos",
"palette.group.files": "Arquivos",
"dialog.provider.search.placeholder": "Buscar provedores",
"dialog.provider.empty": "Nenhum provedor encontrado",
"dialog.provider.group.popular": "Popular",
"dialog.provider.group.other": "Outro",
"dialog.provider.tag.recommended": "Recomendado",
"dialog.provider.opencode.note": "Modelos selecionados incluindo Claude, GPT, Gemini e mais",
"dialog.provider.anthropic.note": "Conectar com Claude Pro/Max ou chave de API",
"dialog.provider.openai.note": "Conectar com ChatGPT Pro/Plus 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.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",
"dialog.model.select.title": "Selecionar modelo",
"dialog.model.search.placeholder": "Buscar modelos",
"dialog.model.empty": "Nenhum resultado de modelo",
"dialog.model.manage": "Gerenciar modelos",
"dialog.model.manage.description": "Personalizar quais modelos aparecem no seletor de modelos.",
"dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo OpenCode",
"dialog.model.unpaid.addMore.title": "Adicionar mais modelos de provedores populares",
"dialog.provider.viewAll": "Ver mais provedores",
"provider.connect.title": "Conectar {{provider}}",
"provider.connect.title.anthropicProMax": "Entrar com Claude Pro/Max",
"provider.connect.selectMethod": "Selecionar método de login para {{provider}}.",
@@ -144,7 +137,42 @@ export const dict = {
"provider.connect.oauth.auto.confirmationCode": "Código de confirmação",
"provider.connect.toast.connected.title": "{{provider}} conectado",
"provider.connect.toast.connected.description": "Modelos do {{provider}} agora estão disponíveis para uso.",
"provider.custom.title": "Provedor personalizado",
"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.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.baseURL.placeholder": "https://api.meuprovedor.com/v1",
"provider.custom.field.apiKey.label": "Chave de API",
"provider.custom.field.apiKey.placeholder": "Chave de API",
"provider.custom.field.apiKey.description": "Opcional. Deixe em branco se gerenciar autenticação via cabeçalhos.",
"provider.custom.models.label": "Modelos",
"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.remove": "Remover modelo",
"provider.custom.models.add": "Adicionar modelo",
"provider.custom.headers.label": "Cabeçalhos (opcional)",
"provider.custom.headers.key.label": "Cabeçalho",
"provider.custom.headers.key.placeholder": "Nome-Do-Cabeçalho",
"provider.custom.headers.value.label": "Valor",
"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.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.baseURL.format": "Deve começar com http:// ou https://",
"provider.custom.error.required": "Obrigatório",
"provider.custom.error.duplicate": "Duplicado",
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Os modelos de {{provider}} não estão mais disponíveis.",
"model.tag.free": "Grátis",
@@ -163,9 +191,9 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Permite raciocínio",
"model.tooltip.reasoning.none": "Sem raciocínio",
"model.tooltip.context": "Limite de contexto {{limit}}",
"common.search.placeholder": "Buscar",
"common.goBack": "Voltar",
"common.goForward": "Avançar",
"common.loading": "Carregando",
"common.loading.ellipsis": "...",
"common.cancel": "Cancelar",
@@ -176,14 +204,12 @@ export const dict = {
"common.saving": "Salvando...",
"common.default": "Padrão",
"common.attachment": "anexo",
"prompt.placeholder.shell": "Digite comando do shell...",
"prompt.placeholder.normal": 'Pergunte qualquer coisa... "{{example}}"',
"prompt.placeholder.summarizeComments": "Resumir comentários…",
"prompt.placeholder.summarizeComment": "Resumir comentário…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell.exit": "esc para sair",
"prompt.example.1": "Corrigir um TODO no código",
"prompt.example.2": "Qual é a stack tecnológica deste projeto?",
"prompt.example.3": "Corrigir testes quebrados",
@@ -209,7 +235,6 @@ export const dict = {
"prompt.example.23": "Adicionar paginação a esta lista",
"prompt.example.24": "Criar um comando CLI para...",
"prompt.example.25": "Como funcionam as variáveis de ambiente aqui?",
"prompt.popover.emptyResults": "Nenhum resultado correspondente",
"prompt.popover.emptyCommands": "Nenhum comando correspondente",
"prompt.dropzone.label": "Solte imagens ou PDFs aqui",
@@ -225,7 +250,6 @@ export const dict = {
"prompt.attachment.remove": "Remover anexo",
"prompt.action.send": "Enviar",
"prompt.action.stop": "Parar",
"prompt.toast.pasteUnsupported.title": "Colagem não suportada",
"prompt.toast.pasteUnsupported.description": "Somente imagens ou PDFs podem ser colados aqui.",
"prompt.toast.modelAgentRequired.title": "Selecione um agente e modelo",
@@ -236,23 +260,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "Falha ao enviar comando",
"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}} de {{total}} habilitados",
"dialog.mcp.description": "{{enabled}} of {{total}} habilitados",
"dialog.mcp.empty": "Nenhum MCP configurado",
"dialog.lsp.empty": "LSPs detectados automaticamente pelos tipos de arquivo",
"dialog.plugins.empty": "Plugins configurados em opencode.json",
"mcp.status.connected": "conectado",
"mcp.status.failed": "falhou",
"mcp.status.needs_auth": "precisa de autenticação",
"mcp.status.disabled": "desabilitado",
"dialog.fork.empty": "Nenhuma mensagem para bifurcar",
"dialog.directory.search.placeholder": "Buscar pastas",
"dialog.directory.empty": "Nenhuma pasta encontrada",
"dialog.server.title": "Servidores",
"dialog.server.description": "Trocar para qual servidor OpenCode este aplicativo se conecta.",
"dialog.server.search.placeholder": "Buscar servidores",
@@ -270,7 +289,6 @@ export const dict = {
"dialog.server.default.set": "Definir servidor atual como padrão",
"dialog.server.default.clear": "Limpar",
"dialog.server.action.remove": "Remover servidor",
"dialog.server.menu.edit": "Editar",
"dialog.server.menu.default": "Definir como padrão",
"dialog.server.menu.defaultRemove": "Remover padrão",
@@ -288,7 +306,6 @@ export const dict = {
"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",
"context.breakdown.note":
'Detalhamento aproximado dos tokens de entrada. "Outros" inclui definições de ferramentas e overhead.',
@@ -297,10 +314,8 @@ export const dict = {
"context.breakdown.assistant": "Assistente",
"context.breakdown.tool": "Chamadas de Ferramentas",
"context.breakdown.other": "Outros",
"context.systemPrompt.title": "Prompt do Sistema",
"context.rawMessages.title": "Mensagens brutas",
"context.stats.session": "Sessão",
"context.stats.messages": "Mensagens",
"context.stats.provider": "Provedor",
@@ -317,34 +332,42 @@ export const dict = {
"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",
"context.usage.clickToView": "Clique para ver o contexto",
"context.usage.view": "Ver uso do contexto",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Idioma",
"toast.language.description": "Alterado para {{language}}",
"toast.theme.title": "Tema alterado",
"toast.scheme.title": "Esquema de cores",
"toast.permissions.autoaccept.on.title": "Aceitando edições automaticamente",
"toast.permissions.autoaccept.on.description": "Permissões de edição e escrita serão aprovadas automaticamente",
"toast.permissions.autoaccept.off.title": "Parou de aceitar edições automaticamente",
"toast.permissions.autoaccept.off.description": "Permissões de edição e escrita exigirão aprovação",
"toast.workspace.enabled.title": "Espaços de trabalho ativados",
"toast.workspace.enabled.description": "Várias worktrees agora são exibidas na barra lateral",
"toast.workspace.disabled.title": "Espaços de trabalho desativados",
"toast.workspace.disabled.description": "Apenas a worktree principal é exibida na barra lateral",
"toast.permissions.autoaccept.on.title": "Aceitando edições automaticamente",
"toast.permissions.autoaccept.on.description": "Permissões de edição e escrita serão aprovadas automaticamente",
"toast.permissions.autoaccept.off.title": "Parou de aceitar edições automaticamente",
"toast.permissions.autoaccept.off.description": "Permissões de edição e escrita exigirão aprovação",
"toast.model.none.title": "Nenhum modelo selecionado",
"toast.model.none.description": "Conecte um provedor para resumir esta sessão",
"toast.file.loadFailed.title": "Falha ao carregar arquivo",
"toast.file.listFailed.title": "Falha ao listar arquivos",
"toast.context.noLineSelection.title": "Nenhuma seleção de linhas",
"toast.context.noLineSelection.description": "Selecione primeiro um intervalo de linhas em uma aba de arquivo.",
@@ -353,19 +376,15 @@ export const dict = {
"toast.session.share.success.description": "URL compartilhada copiada para a área de transferência!",
"toast.session.share.failed.title": "Falha ao compartilhar sessão",
"toast.session.share.failed.description": "Ocorreu um erro ao compartilhar a sessão",
"toast.session.unshare.success.title": "Sessão não compartilhada",
"toast.session.unshare.success.description": "Sessão deixou de ser compartilhada com sucesso!",
"toast.session.unshare.failed.title": "Falha ao parar de compartilhar sessão",
"toast.session.unshare.failed.description": "Ocorreu um erro ao parar de compartilhar a sessão",
"toast.session.listFailed.title": "Falha ao carregar sessões para {{project}}",
"toast.update.title": "Atualização disponível",
"toast.update.description": "Uma nova versão do OpenCode ({{version}}) está disponível para instalação.",
"toast.update.action.installRestart": "Instalar e reiniciar",
"toast.update.action.notYet": "Agora não",
"error.page.title": "Algo deu errado",
"error.page.description": "Ocorreu um erro ao carregar a aplicação.",
"error.page.details.label": "Detalhes do Erro",
@@ -376,12 +395,10 @@ export const dict = {
"error.page.report.prefix": "Por favor, reporte este erro para a equipe do OpenCode",
"error.page.report.discord": "no Discord",
"error.page.version": "Versão: {{version}}",
"error.dev.rootNotFound":
"Elemento raiz não encontrado. Você esqueceu de adicioná-lo ao seu index.html? Ou talvez o atributo id foi escrito incorretamente?",
"error.globalSync.connectFailed": "Não foi possível conectar ao servidor. Há um servidor executando em `{{url}}`?",
"directory.error.invalidUrl": "Diretório inválido na URL.",
"error.chain.unknown": "Erro desconhecido",
"error.chain.causedBy": "Causado por:",
"error.chain.apiError": "Erro de API",
@@ -403,21 +420,17 @@ export const dict = {
"error.chain.configFrontmatterError": "Falha ao analisar frontmatter em {{path}}:\n{{message}}",
"error.chain.configInvalid": "Arquivo de configuração em {{path}} é inválido",
"error.chain.configInvalidWithMessage": "Arquivo de configuração em {{path}} é inválido: {{message}}",
"notification.permission.title": "Permissão necessária",
"notification.permission.description": "{{sessionTitle}} em {{projectName}} precisa de permissão",
"notification.question.title": "Pergunta",
"notification.question.description": "{{sessionTitle}} em {{projectName}} tem uma pergunta",
"notification.action.goToSession": "Ir para sessão",
"notification.session.responseReady.title": "Resposta pronta",
"notification.session.error.title": "Erro na sessão",
"notification.session.error.fallbackDescription": "Ocorreu um erro",
"home.recentProjects": "Projetos recentes",
"home.empty.title": "Nenhum projeto recente",
"home.empty.description": "Comece abrindo um projeto local",
"session.tab.session": "Sessão",
"session.tab.review": "Revisão",
"session.tab.context": "Contexto",
@@ -436,17 +449,18 @@ export const dict = {
"session.messages.loadEarlier": "Carregar mensagens anteriores",
"session.messages.loading": "Carregando mensagens...",
"session.messages.jumpToLatest": "Ir para a mais recente",
"session.context.addToContext": "Adicionar {{selection}} ao contexto",
"session.new.worktree.main": "Branch principal",
"session.new.worktree.mainWithBranch": "Branch principal ({{branch}})",
"session.new.worktree.create": "Criar novo worktree",
"session.new.lastModified": "Última modificação",
"session.header.search.placeholder": "Buscar {{project}}",
"session.header.searchFiles": "Buscar arquivos",
"session.header.openIn": "Abrir em",
"session.header.open.action": "Abrir {{app}}",
"session.header.open.ariaLabel": "Abrir em {{app}}",
"session.header.open.menu": "Opções de abertura",
"session.header.open.copyPath": "Copiar caminho",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Configurações de servidores",
"status.popover.tab.servers": "Servidores",
@@ -454,7 +468,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Plugins",
"status.popover.action.manageServers": "Gerenciar servidores",
"session.share.popover.title": "Publicar na web",
"session.share.popover.description.shared":
"Esta sessão é pública na web. Está acessível para qualquer pessoa com o link.",
@@ -468,10 +481,8 @@ export const dict = {
"session.share.action.view": "Ver",
"session.share.copy.copied": "Copiado",
"session.share.copy.copyLink": "Copiar link",
"lsp.tooltip.none": "Nenhum servidor LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Carregando prompt...",
"terminal.loading": "Carregando terminal...",
"terminal.title": "Terminal",
@@ -480,7 +491,6 @@ export const dict = {
"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",
"common.dismiss": "Descartar",
"common.requestFailed": "Requisição falhou",
@@ -494,7 +504,6 @@ export const dict = {
"common.edit": "Editar",
"common.loadMore": "Carregar mais",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Alternar menu",
"sidebar.nav.projectsAndSessions": "Projetos e sessões",
"sidebar.settings": "Configurações",
@@ -506,18 +515,19 @@ export const dict = {
"sidebar.gettingStarted.line2": "Conecte qualquer provedor para usar modelos, incluindo Claude, GPT, Gemini etc.",
"sidebar.project.recentSessions": "Sessões recentes",
"sidebar.project.viewAllSessions": "Ver todas as sessões",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Desktop",
"settings.section.server": "Servidor",
"settings.tab.general": "Geral",
"settings.tab.shortcuts": "Atalhos",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integration",
"settings.desktop.wsl.description": "Executar o servidor OpenCode dentro do WSL no Windows.",
"settings.general.section.appearance": "Aparência",
"settings.general.section.notifications": "Notificações do sistema",
"settings.general.section.updates": "Atualizações",
"settings.general.section.sounds": "Efeitos sonoros",
"settings.general.section.display": "Tela",
"settings.general.row.language.title": "Idioma",
"settings.general.row.language.description": "Alterar o idioma de exibição do OpenCode",
"settings.general.row.appearance.title": "Aparência",
@@ -526,10 +536,12 @@ export const dict = {
"settings.general.row.theme.description": "Personalize como o OpenCode é tematizado.",
"settings.general.row.font.title": "Fonte",
"settings.general.row.font.description": "Personalize a fonte monoespaçada usada em blocos de código",
"settings.general.row.wayland.title": "Usar Wayland nativo",
"settings.general.row.wayland.description": "Desabilitar fallback X11 no Wayland. Requer reinicialização.",
"settings.general.row.wayland.tooltip":
"No Linux com monitores de taxas de atualização mistas, Wayland nativo pode ser mais estável.",
"settings.general.row.releaseNotes.title": "Notas da versão",
"settings.general.row.releaseNotes.description": 'Mostrar pop-ups de "Novidades" após atualizações',
"settings.updates.row.startup.title": "Verificar atualizações ao iniciar",
"settings.updates.row.startup.description": "Verificar atualizações automaticamente quando o OpenCode iniciar",
"settings.updates.row.check.title": "Verificar atualizações",
@@ -595,7 +607,6 @@ export const dict = {
"sound.option.yup04": "Sim 04",
"sound.option.yup05": "Sim 05",
"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",
@@ -604,14 +615,12 @@ export const dict = {
"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.permissions.title": "Permissões",
"settings.general.sounds.permissions.description": "Reproduzir som quando uma permissão for necessária",
"settings.general.sounds.errors.title": "Erros",
"settings.general.sounds.errors.description": "Reproduzir som quando ocorrer um erro",
"settings.shortcuts.title": "Atalhos de teclado",
"settings.shortcuts.reset.button": "Redefinir para padrões",
"settings.shortcuts.reset.toast.title": "Atalhos redefinidos",
@@ -622,14 +631,12 @@ export const dict = {
"settings.shortcuts.pressKeys": "Pressione teclas",
"settings.shortcuts.search.placeholder": "Buscar atalhos",
"settings.shortcuts.search.empty": "Nenhum atalho encontrado",
"settings.shortcuts.group.general": "Geral",
"settings.shortcuts.group.session": "Sessão",
"settings.shortcuts.group.navigation": "Navegação",
"settings.shortcuts.group.modelAndAgent": "Modelo e agente",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Prompt",
"settings.providers.title": "Provedores",
"settings.providers.description": "Configurações de provedores estarão disponíveis aqui.",
"settings.providers.section.connected": "Provedores conectados",
@@ -647,16 +654,13 @@ export const dict = {
"settings.commands.description": "Configurações de comandos estarão disponíveis aqui.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Configurações de MCP estarão disponíveis aqui.",
"settings.permissions.title": "Permissões",
"settings.permissions.description": "Controle quais ferramentas o servidor pode usar por padrão.",
"settings.permissions.section.tools": "Ferramentas",
"settings.permissions.toast.updateFailed.title": "Falha ao atualizar permissões",
"settings.permissions.action.allow": "Permitir",
"settings.permissions.action.ask": "Perguntar",
"settings.permissions.action.deny": "Negar",
"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",
@@ -690,12 +694,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "Acessar arquivos fora do diretório do projeto",
"settings.permissions.tool.doom_loop.title": "Loop Infinito",
"settings.permissions.tool.doom_loop.description": "Detectar chamadas de ferramentas repetidas com entrada idêntica",
"session.delete.failed.title": "Falha ao excluir sessão",
"session.delete.title": "Excluir sessão",
"session.delete.confirm": 'Excluir sessão "{{name}}"?',
"session.delete.button": "Excluir sessão",
"workspace.new": "Novo espaço de trabalho",
"workspace.type.local": "local",
"workspace.type.sandbox": "sandbox",

View File

@@ -150,6 +150,44 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} povezan",
"provider.connect.toast.connected.description": "{{provider}} modeli su sada dostupni za korištenje.",
"provider.custom.title": "Prilagođeni provajder",
"provider.custom.description.prefix": "Konfiguriši OpenAI-kompatibilnog provajdera. Pogledaj ",
"provider.custom.description.link": "dokumentaciju za konfiguraciju provajdera",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "ID provajdera",
"provider.custom.field.providerID.placeholder": "mojprovajder",
"provider.custom.field.providerID.description": "Mala slova, brojevi, crtice ili donje crte",
"provider.custom.field.name.label": "Prikazano ime",
"provider.custom.field.name.placeholder": "Moj AI Provajder",
"provider.custom.field.baseURL.label": "Bazni URL",
"provider.custom.field.baseURL.placeholder": "https://api.mojprovajder.com/v1",
"provider.custom.field.apiKey.label": "API ključ",
"provider.custom.field.apiKey.placeholder": "API ključ",
"provider.custom.field.apiKey.description":
"Opcionalno. Ostavi prazno ako upravljaš autentifikacijom putem zaglavlja.",
"provider.custom.models.label": "Modeli",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Ime",
"provider.custom.models.name.placeholder": "Prikazano ime",
"provider.custom.models.remove": "Ukloni model",
"provider.custom.models.add": "Dodaj model",
"provider.custom.headers.label": "Zaglavlja (opcionalno)",
"provider.custom.headers.key.label": "Zaglavlje",
"provider.custom.headers.key.placeholder": "Ime-Zaglavlja",
"provider.custom.headers.value.label": "Vrijednost",
"provider.custom.headers.value.placeholder": "vrijednost",
"provider.custom.headers.remove": "Ukloni zaglavlje",
"provider.custom.headers.add": "Dodaj zaglavlje",
"provider.custom.error.providerID.required": "ID provajdera je obavezan",
"provider.custom.error.providerID.format": "Koristi mala slova, brojeve, crtice ili donje crte",
"provider.custom.error.providerID.exists": "Taj ID provajdera već postoji",
"provider.custom.error.name.required": "Prikazano ime je obavezno",
"provider.custom.error.baseURL.required": "Bazni URL je obavezan",
"provider.custom.error.baseURL.format": "Mora početi sa http:// ili https://",
"provider.custom.error.required": "Obavezno",
"provider.custom.error.duplicate": "Duplikat",
"provider.disconnect.toast.disconnected.title": "{{provider}} odspojen",
"provider.disconnect.toast.disconnected.description": "{{provider}} modeli više nisu dostupni.",
@@ -408,6 +446,7 @@ export const dict = {
"Korijenski element nije pronađen. Da li si zaboravio da ga dodaš u index.html? Ili je možda id atribut pogrešno napisan?",
"error.globalSync.connectFailed": "Nije moguće povezati se na server. Da li server radi na `{{url}}`?",
"directory.error.invalidUrl": "Nevažeći direktorij u URL-u.",
"error.chain.unknown": "Nepoznata greška",
"error.chain.causedBy": "Uzrok:",
@@ -417,7 +456,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) - nazive provajdera/modela",
"error.chain.checkConfig": "Provjeri konfiguraciju (opencode.json) provider/model names",
"error.chain.mcpFailed": 'MCP server "{{name}}" nije uspio. Napomena: OpenCode još ne podržava MCP autentifikaciju.',
"error.chain.providerAuthFailed": "Autentifikacija provajdera nije uspjela ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
@@ -474,6 +513,11 @@ export const dict = {
"session.header.search.placeholder": "Pretraži {{project}}",
"session.header.searchFiles": "Pretraži datoteke",
"session.header.openIn": "Otvori u",
"session.header.open.action": "Otvori {{app}}",
"session.header.open.ariaLabel": "Otvori u {{app}}",
"session.header.open.menu": "Opcije otvaranja",
"session.header.open.copyPath": "Kopiraj putanju",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Konfiguracije servera",
@@ -539,11 +583,15 @@ export const dict = {
"settings.section.server": "Server",
"settings.tab.general": "Opšte",
"settings.tab.shortcuts": "Prečice",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integracija",
"settings.desktop.wsl.description": "Pokreni OpenCode server unutar WSL-a na Windowsu.",
"settings.general.section.appearance": "Izgled",
"settings.general.section.notifications": "Sistemske obavijesti",
"settings.general.section.updates": "Ažuriranja",
"settings.general.section.sounds": "Zvučni efekti",
"settings.general.section.display": "Prikaz",
"settings.general.row.language.title": "Jezik",
"settings.general.row.language.description": "Promijeni jezik prikaza u OpenCode-u",
@@ -554,6 +602,11 @@ export const dict = {
"settings.general.row.font.title": "Font",
"settings.general.row.font.description": "Prilagodi monospace font koji se koristi u blokovima koda",
"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.tooltip":
"Na Linuxu sa monitorima miješanih stopa osvježavanja, nativni Wayland može biti stabilniji.",
"settings.general.row.releaseNotes.title": "Bilješke o izdanju",
"settings.general.row.releaseNotes.description": 'Prikaži iskačuće prozore "Šta je novo" nakon ažuriranja',

View File

@@ -72,6 +72,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Accepter ændringer automatisk",
"command.permissions.autoaccept.disable": "Stop automatisk accept af ændringer",
"command.workspace.toggle": "Skift arbejdsområder",
"command.workspace.toggle.description": "Aktiver eller deaktiver flere arbejdsområder i sidebjælken",
"command.session.undo": "Fortryd",
"command.session.undo.description": "Fortryd den sidste besked",
"command.session.redo": "Omgør",
@@ -95,9 +96,13 @@ export const dict = {
"dialog.provider.group.popular": "Populære",
"dialog.provider.group.other": "Andre",
"dialog.provider.tag.recommended": "Anbefalet",
"dialog.provider.anthropic.note": "Forbind med Claude Pro/Max eller API-nøgle",
"dialog.provider.openai.note": "Forbind med ChatGPT Pro/Plus eller API-nøgle",
"dialog.provider.copilot.note": "Forbind med Copilot eller API-nøgle",
"dialog.provider.opencode.note": "Udvalgte modeller inklusive Claude, GPT, Gemini og flere",
"dialog.provider.anthropic.note": "Direkte adgang til Claude-modeller, inklusive Pro og Max",
"dialog.provider.copilot.note": "Claude-modeller til kodningsassistance",
"dialog.provider.openai.note": "GPT-modeller til hurtige, kompetente generelle AI-opgaver",
"dialog.provider.google.note": "Gemini-modeller til hurtige, strukturerede svar",
"dialog.provider.openrouter.note": "Få adgang til alle understøttede modeller fra én udbyder",
"dialog.provider.vercel.note": "Samlet adgang til AI-modeller med smart routing",
"dialog.model.select.title": "Vælg model",
"dialog.model.search.placeholder": "Søg modeller",
@@ -145,6 +150,43 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} forbundet",
"provider.connect.toast.connected.description": "{{provider}} modeller er nu tilgængelige.",
"provider.custom.title": "Brugerdefineret udbyder",
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel udbyder. Se ",
"provider.custom.description.link": "dokumentation for udbyderkonfiguration",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "Udbyder-ID",
"provider.custom.field.providerID.placeholder": "minudbyder",
"provider.custom.field.providerID.description": "Små bogstaver, tal, bindestreger eller understregninger",
"provider.custom.field.name.label": "Visningsnavn",
"provider.custom.field.name.placeholder": "Min AI-udbyder",
"provider.custom.field.baseURL.label": "Basis-URL",
"provider.custom.field.baseURL.placeholder": "https://api.minudbyder.dk/v1",
"provider.custom.field.apiKey.label": "API-nøgle",
"provider.custom.field.apiKey.placeholder": "API-nøgle",
"provider.custom.field.apiKey.description": "Valgfri. Lad være tom, hvis du administrerer godkendelse via headers.",
"provider.custom.models.label": "Modeller",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Navn",
"provider.custom.models.name.placeholder": "Visningsnavn",
"provider.custom.models.remove": "Fjern model",
"provider.custom.models.add": "Tilføj model",
"provider.custom.headers.label": "Headers (valgfri)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Navn",
"provider.custom.headers.value.label": "Værdi",
"provider.custom.headers.value.placeholder": "værdi",
"provider.custom.headers.remove": "Fjern header",
"provider.custom.headers.add": "Tilføj header",
"provider.custom.error.providerID.required": "Udbyder-ID er påkrævet",
"provider.custom.error.providerID.format": "Brug små bogstaver, tal, bindestreger eller understregninger",
"provider.custom.error.providerID.exists": "Dette udbyder-ID findes allerede",
"provider.custom.error.name.required": "Visningsnavn er påkrævet",
"provider.custom.error.baseURL.required": "Basis-URL er påkrævet",
"provider.custom.error.baseURL.format": "Skal starte med http:// eller https://",
"provider.custom.error.required": "Påkrævet",
"provider.custom.error.duplicate": "Duplikeret",
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke længere tilgængelige.",
"model.tag.free": "Gratis",
@@ -166,6 +208,7 @@ export const dict = {
"model.tooltip.context": "Kontekstgrænse {{limit}}",
"common.search.placeholder": "Søg",
"common.goBack": "Gå tilbage",
"common.goForward": "Naviger fremad",
"common.loading": "Indlæser",
"common.loading.ellipsis": "...",
"common.cancel": "Annuller",
@@ -308,10 +351,10 @@ export const dict = {
"context.stats.provider": "Udbyder",
"context.stats.model": "Model",
"context.stats.limit": "Kontekstgrænse",
"context.stats.totalTokens": "Total Tokens",
"context.stats.totalTokens": "Samlede tokens",
"context.stats.usage": "Forbrug",
"context.stats.inputTokens": "Input Tokens",
"context.stats.outputTokens": "Output Tokens",
"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.userMessages": "Brugerbeskeder",
@@ -326,6 +369,23 @@ export const dict = {
"context.usage.clickToView": "Klik for at se kontekst",
"context.usage.view": "Se kontekstforbrug",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Sprog",
"toast.language.description": "Skiftede til {{language}}",
@@ -383,6 +443,7 @@ export const dict = {
"Rodelement ikke fundet. Har du glemt at tilføje det til din index.html? Eller måske er id-attributten stavet forkert?",
"error.globalSync.connectFailed": "Kunne ikke forbinde til server. Kører der en server på `{{url}}`?",
"directory.error.invalidUrl": "Ugyldig mappe i URL.",
"error.chain.unknown": "Ukendt fejl",
"error.chain.causedBy": "Forårsaget af:",
@@ -447,6 +508,11 @@ export const dict = {
"session.header.search.placeholder": "Søg {{project}}",
"session.header.searchFiles": "Søg efter filer",
"session.header.openIn": "Åbn i",
"session.header.open.action": "Åbn {{app}}",
"session.header.open.ariaLabel": "Åbn i {{app}}",
"session.header.open.menu": "Åbningsmuligheder",
"session.header.open.copyPath": "Kopier sti",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Serverkonfigurationer",
@@ -512,11 +578,15 @@ export const dict = {
"settings.section.server": "Server",
"settings.tab.general": "Generelt",
"settings.tab.shortcuts": "Genveje",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integration",
"settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.",
"settings.general.section.appearance": "Udseende",
"settings.general.section.notifications": "Systemmeddelelser",
"settings.general.section.updates": "Opdateringer",
"settings.general.section.sounds": "Lydeffekter",
"settings.general.section.display": "Skærm",
"settings.general.row.language.title": "Sprog",
"settings.general.row.language.description": "Ændr visningssproget for OpenCode",
@@ -527,6 +597,11 @@ export const dict = {
"settings.general.row.font.title": "Skrifttype",
"settings.general.row.font.description": "Tilpas mono-skrifttypen brugt i kodeblokke",
"settings.general.row.wayland.title": "Brug native Wayland",
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.",
"settings.general.row.wayland.tooltip":
"På Linux med skærme med blandet opdateringshastighed kan native Wayland være mere stabilt.",
"settings.general.row.releaseNotes.title": "Udgivelsesnoter",
"settings.general.row.releaseNotes.description": 'Vis "Hvad er nyt"-popups efter opdateringer',

View File

@@ -19,12 +19,10 @@ export const dict = {
"command.category.agent": "Agent",
"command.category.permissions": "Berechtigungen",
"command.category.workspace": "Arbeitsbereich",
"command.category.settings": "Einstellungen",
"theme.scheme.system": "System",
"theme.scheme.light": "Hell",
"theme.scheme.dark": "Dunkel",
"command.sidebar.toggle": "Seitenleiste umschalten",
"command.project.open": "Projekt öffnen",
"command.provider.connect": "Anbieter verbinden",
@@ -35,17 +33,13 @@ export const dict = {
"command.session.previous.unseen": "Vorherige ungelesene Sitzung",
"command.session.next.unseen": "Nächste ungelesene Sitzung",
"command.session.archive": "Sitzung archivieren",
"command.palette": "Befehlspalette",
"command.theme.cycle": "Thema wechseln",
"command.theme.set": "Thema verwenden: {{theme}}",
"command.theme.scheme.cycle": "Farbschema wechseln",
"command.theme.scheme.set": "Farbschema verwenden: {{scheme}}",
"command.language.cycle": "Sprache wechseln",
"command.language.set": "Sprache verwenden: {{language}}",
"command.session.new": "Neue Sitzung",
"command.file.open": "Datei öffnen",
"command.tab.close": "Tab schließen",
@@ -76,6 +70,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Änderungen automatisch akzeptieren",
"command.permissions.autoaccept.disable": "Automatische Annahme von Änderungen stoppen",
"command.workspace.toggle": "Arbeitsbereiche umschalten",
"command.workspace.toggle.description": "Mehrere Arbeitsbereiche in der Seitenleiste aktivieren oder deaktivieren",
"command.session.undo": "Rückgängig",
"command.session.undo.description": "Letzte Nachricht rückgängig machen",
"command.session.redo": "Wiederherstellen",
@@ -88,32 +83,30 @@ export const dict = {
"command.session.share.description": "Diese Sitzung teilen und URL in die Zwischenablage kopieren",
"command.session.unshare": "Teilen der Sitzung aufheben",
"command.session.unshare.description": "Teilen dieser Sitzung beenden",
"palette.search.placeholder": "Dateien, Befehle und Sitzungen durchsuchen",
"palette.empty": "Keine Ergebnisse gefunden",
"palette.group.commands": "Befehle",
"palette.group.files": "Dateien",
"dialog.provider.search.placeholder": "Anbieter durchsuchen",
"dialog.provider.empty": "Keine Anbieter gefunden",
"dialog.provider.group.popular": "Beliebt",
"dialog.provider.group.other": "Andere",
"dialog.provider.tag.recommended": "Empfohlen",
"dialog.provider.opencode.note": "Kuratierte Modelle inklusive Claude, GPT, Gemini und mehr",
"dialog.provider.anthropic.note": "Mit Claude Pro/Max oder API-Schlüssel verbinden",
"dialog.provider.openai.note": "Mit ChatGPT Pro/Plus 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.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",
"dialog.model.select.title": "Modell auswählen",
"dialog.model.search.placeholder": "Modelle durchsuchen",
"dialog.model.empty": "Keine Modellergebnisse",
"dialog.model.manage": "Modelle verwalten",
"dialog.model.manage.description": "Anpassen, welche Modelle in der Modellauswahl erscheinen.",
"dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von OpenCode",
"dialog.model.unpaid.addMore.title": "Weitere Modelle von beliebten Anbietern hinzufügen",
"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.",
@@ -148,7 +141,6 @@ export const dict = {
"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.custom.title": "Benutzerdefinierter Anbieter",
"provider.custom.description.prefix": "Konfigurieren Sie einen OpenAI-kompatiblen Anbieter. Siehe die ",
"provider.custom.description.link": "Anbieter-Konfigurationsdokumente",
@@ -186,12 +178,10 @@ export const dict = {
"provider.custom.error.baseURL.format": "Muss mit http:// oder https:// beginnen",
"provider.custom.error.required": "Erforderlich",
"provider.custom.error.duplicate": "Duplikat",
"provider.disconnect.toast.disconnected.title": "{{provider}} getrennt",
"provider.disconnect.toast.disconnected.description": "Die {{provider}}-Modelle sind nicht mehr verfügbar.",
"model.tag.free": "Kostenlos",
"model.tag.latest": "Neueste",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -201,13 +191,14 @@ export const dict = {
"model.input.image": "Bild",
"model.input.audio": "Audio",
"model.input.video": "Video",
"model.input.pdf": "pdf",
"model.input.pdf": "PDF",
"model.tooltip.allows": "Erlaubt: {{inputs}}",
"model.tooltip.reasoning.allowed": "Erlaubt Reasoning",
"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.cancel": "Abbrechen",
@@ -218,14 +209,12 @@ export const dict = {
"common.saving": "Speichert...",
"common.default": "Standard",
"common.attachment": "Anhang",
"prompt.placeholder.shell": "Shell-Befehl eingeben...",
"prompt.placeholder.normal": 'Fragen Sie alles... "{{example}}"',
"prompt.placeholder.summarizeComments": "Kommentare zusammenfassen…",
"prompt.placeholder.summarizeComment": "Kommentar zusammenfassen…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell.exit": "esc zum Verlassen",
"prompt.example.1": "Ein TODO in der Codebasis beheben",
"prompt.example.2": "Was ist der Tech-Stack dieses Projekts?",
"prompt.example.3": "Fehlerhafte Tests beheben",
@@ -251,14 +240,13 @@ export const dict = {
"prompt.example.23": "Paginierung zu dieser Liste hinzufügen",
"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 oder PDFs hier ablegen",
"prompt.dropzone.file.label": "Ablegen zum @Erwähnen der Datei",
"prompt.slash.badge.custom": "benutzerdefiniert",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.mcp": "mcp",
"prompt.slash.badge.skill": "Skill",
"prompt.slash.badge.mcp": "MCP",
"prompt.context.active": "aktiv",
"prompt.context.includeActiveFile": "Aktive Datei einbeziehen",
"prompt.context.removeActiveFile": "Aktive Datei aus dem Kontext entfernen",
@@ -267,7 +255,6 @@ export const dict = {
"prompt.attachment.remove": "Anhang entfernen",
"prompt.action.send": "Senden",
"prompt.action.stop": "Stopp",
"prompt.toast.pasteUnsupported.title": "Nicht unterstütztes Einfügen",
"prompt.toast.pasteUnsupported.description": "Hier können nur Bilder oder PDFs eingefügt werden.",
"prompt.toast.modelAgentRequired.title": "Wählen Sie einen Agenten und ein Modell",
@@ -279,24 +266,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "Befehl konnte nicht gesendet werden",
"prompt.toast.promptSendFailed.title": "Eingabe konnte nicht gesendet werden",
"prompt.toast.promptSendFailed.description": "Sitzung konnte nicht abgerufen werden",
"dialog.mcp.title": "MCPs",
"dialog.mcp.description": "{{enabled}} von {{total}} aktiviert",
"dialog.mcp.empty": "Keine MCPs konfiguriert",
"dialog.lsp.empty": "LSPs automatisch nach Dateityp erkannt",
"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.disabled": "deaktiviert",
"dialog.fork.empty": "Keine Nachrichten zum Abzweigen vorhanden",
"dialog.directory.search.placeholder": "Ordner durchsuchen",
"dialog.directory.empty": "Keine Ordner gefunden",
"dialog.server.title": "Server",
"dialog.server.description": "Wechseln Sie den OpenCode-Server, mit dem sich diese App verbindet.",
"dialog.server.search.placeholder": "Server durchsuchen",
@@ -314,14 +295,12 @@ export const dict = {
"dialog.server.default.set": "Aktuellen Server als Standard setzen",
"dialog.server.default.clear": "Löschen",
"dialog.server.action.remove": "Server entfernen",
"dialog.server.menu.edit": "Bearbeiten",
"dialog.server.menu.default": "Als Standard festlegen",
"dialog.server.menu.defaultRemove": "Standard entfernen",
"dialog.server.menu.delete": "Löschen",
"dialog.server.current": "Aktueller Server",
"dialog.server.status.default": "Standard",
"dialog.project.edit.title": "Projekt bearbeiten",
"dialog.project.edit.name": "Name",
"dialog.project.edit.icon": "Icon",
@@ -330,7 +309,6 @@ export const dict = {
"dialog.project.edit.icon.recommended": "Empfohlen: 128x128px",
"dialog.project.edit.color": "Farbe",
"dialog.project.edit.color.select": "{{color}}-Farbe auswählen",
"dialog.project.edit.worktree.startup": "Startup-Skript für Arbeitsbereich",
"dialog.project.edit.worktree.startup.description":
"Wird nach dem Erstellen eines neuen Arbeitsbereichs (Worktree) ausgeführt.",
@@ -343,10 +321,8 @@ export const dict = {
"context.breakdown.assistant": "Assistent",
"context.breakdown.tool": "Werkzeugaufrufe",
"context.breakdown.other": "Andere",
"context.systemPrompt.title": "System-Prompt",
"context.rawMessages.title": "Rohdaten der Nachrichten",
"context.stats.session": "Sitzung",
"context.stats.messages": "Nachrichten",
"context.stats.provider": "Anbieter",
@@ -363,29 +339,42 @@ export const dict = {
"context.stats.totalCost": "Gesamtkosten",
"context.stats.sessionCreated": "Sitzung erstellt",
"context.stats.lastActivity": "Letzte Aktivität",
"context.usage.tokens": "Token",
"context.usage.usage": "Nutzung",
"context.usage.cost": "Kosten",
"context.usage.clickToView": "Klicken, um Kontext anzuzeigen",
"context.usage.view": "Kontextnutzung anzeigen",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Sprache",
"toast.language.description": "Zu {{language}} gewechselt",
"toast.theme.title": "Thema gewechselt",
"toast.scheme.title": "Farbschema",
"toast.workspace.enabled.title": "Arbeitsbereiche aktiviert",
"toast.workspace.enabled.description": "Mehrere Worktrees werden jetzt in der Seitenleiste angezeigt",
"toast.workspace.disabled.title": "Arbeitsbereiche deaktiviert",
"toast.workspace.disabled.description": "Nur der Haupt-Worktree wird in der Seitenleiste angezeigt",
"toast.permissions.autoaccept.on.title": "Änderungen werden automatisch akzeptiert",
"toast.permissions.autoaccept.on.description": "Bearbeitungs- und Schreibrechte werden automatisch genehmigt",
"toast.permissions.autoaccept.off.title": "Automatische Annahme von Änderungen gestoppt",
"toast.permissions.autoaccept.off.description": "Bearbeitungs- und Schreibrechte erfordern Genehmigung",
"toast.model.none.title": "Kein Modell ausgewählt",
"toast.model.none.description": "Verbinden Sie einen Anbieter, um diese Sitzung zusammenzufassen",
"toast.file.loadFailed.title": "Datei konnte nicht geladen werden",
"toast.file.listFailed.title": "Dateien konnten nicht aufgelistet werden",
"toast.context.noLineSelection.title": "Keine Zeilenauswahl",
"toast.context.noLineSelection.description": "Wählen Sie zuerst einen Zeilenbereich in einem Datei-Tab aus.",
@@ -394,19 +383,15 @@ export const dict = {
"toast.session.share.success.description": "Teilen-URL in die Zwischenablage kopiert!",
"toast.session.share.failed.title": "Sitzung konnte nicht geteilt werden",
"toast.session.share.failed.description": "Beim Teilen der Sitzung ist ein Fehler aufgetreten",
"toast.session.unshare.success.title": "Teilen der Sitzung aufgehoben",
"toast.session.unshare.success.description": "Teilen der Sitzung erfolgreich aufgehoben!",
"toast.session.unshare.failed.title": "Aufheben des Teilens fehlgeschlagen",
"toast.session.unshare.failed.description": "Beim Aufheben des Teilens ist ein Fehler aufgetreten",
"toast.session.listFailed.title": "Sitzungen für {{project}} konnten nicht geladen werden",
"toast.update.title": "Update verfügbar",
"toast.update.description": "Eine neue Version von OpenCode ({{version}}) ist zur Installation verfügbar.",
"toast.update.action.installRestart": "Installieren und neu starten",
"toast.update.action.notYet": "Noch nicht",
"error.page.title": "Etwas ist schiefgelaufen",
"error.page.description": "Beim Laden der Anwendung ist ein Fehler aufgetreten.",
"error.page.details.label": "Fehlerdetails",
@@ -417,13 +402,10 @@ export const dict = {
"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?",
"error.globalSync.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",
"error.chain.causedBy": "Verursacht durch:",
"error.chain.apiError": "API-Fehler",
@@ -446,21 +428,17 @@ export const dict = {
"error.chain.configFrontmatterError": "Frontmatter in {{path}} konnte nicht geparst werden:\n{{message}}",
"error.chain.configInvalid": "Konfigurationsdatei unter {{path}} ist ungültig",
"error.chain.configInvalidWithMessage": "Konfigurationsdatei unter {{path}} ist ungültig: {{message}}",
"notification.permission.title": "Berechtigung erforderlich",
"notification.permission.description": "{{sessionTitle}} in {{projectName}} benötigt Berechtigung",
"notification.question.title": "Frage",
"notification.question.description": "{{sessionTitle}} in {{projectName}} hat eine Frage",
"notification.action.goToSession": "Zur Sitzung gehen",
"notification.session.responseReady.title": "Antwort bereit",
"notification.session.error.title": "Sitzungsfehler",
"notification.session.error.fallbackDescription": "Ein Fehler ist aufgetreten",
"home.recentProjects": "Letzte Projekte",
"home.empty.title": "Keine letzten Projekte",
"home.empty.description": "Starten Sie, indem Sie ein lokales Projekt öffnen",
"session.tab.session": "Sitzung",
"session.tab.review": "Überprüfung",
"session.tab.context": "Kontext",
@@ -478,18 +456,19 @@ export const dict = {
"session.messages.loadingEarlier": "Lade frühere Nachrichten...",
"session.messages.loadEarlier": "Frühere Nachrichten laden",
"session.messages.loading": "Lade Nachrichten...",
"session.messages.jumpToLatest": "Zum neuesten springen",
"session.context.addToContext": "{{selection}} zum Kontext hinzufügen",
"session.new.worktree.main": "Haupt-Branch",
"session.new.worktree.mainWithBranch": "Haupt-Branch ({{branch}})",
"session.new.worktree.create": "Neuen Worktree erstellen",
"session.new.lastModified": "Zuletzt geändert",
"session.header.search.placeholder": "{{project}} durchsuchen",
"session.header.searchFiles": "Dateien suchen",
"session.header.openIn": "Öffnen in",
"session.header.open.action": "{{app}} öffnen",
"session.header.open.ariaLabel": "In {{app}} öffnen",
"session.header.open.menu": "Öffnen-Optionen",
"session.header.open.copyPath": "Pfad kopieren",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Serverkonfigurationen",
"status.popover.tab.servers": "Server",
@@ -497,7 +476,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Plugins",
"status.popover.action.manageServers": "Server verwalten",
"session.share.popover.title": "Im Web veröffentlichen",
"session.share.popover.description.shared":
"Diese Sitzung ist öffentlich im Web. Sie ist für jeden mit dem Link zugänglich.",
@@ -511,16 +489,13 @@ export const dict = {
"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...",
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Terminal schließen",
"terminal.connectionLost.title": "Verbindung verloren",
"terminal.connectionLost.description":
"Die Terminalverbindung wurde unterbrochen. Das kann passieren, wenn der Server neu startet.",
@@ -536,7 +511,6 @@ export const dict = {
"common.close": "Schließen",
"common.edit": "Bearbeiten",
"common.loadMore": "Mehr laden",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Menü umschalten",
"sidebar.nav.projectsAndSessions": "Projekte und Sitzungen",
@@ -550,18 +524,19 @@ export const dict = {
"Verbinden Sie einen beliebigen Anbieter, um Modelle wie Claude, GPT, Gemini usw. zu nutzen.",
"sidebar.project.recentSessions": "Letzte Sitzungen",
"sidebar.project.viewAllSessions": "Alle Sitzungen anzeigen",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Desktop",
"settings.section.server": "Server",
"settings.tab.general": "Allgemein",
"settings.tab.shortcuts": "Tastenkombinationen",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL-Integration",
"settings.desktop.wsl.description": "OpenCode-Server innerhalb von WSL unter Windows ausführen.",
"settings.general.section.appearance": "Erscheinungsbild",
"settings.general.section.notifications": "Systembenachrichtigungen",
"settings.general.section.updates": "Updates",
"settings.general.section.sounds": "Soundeffekte",
"settings.general.section.display": "Anzeige",
"settings.general.row.language.title": "Sprache",
"settings.general.row.language.description": "Die Anzeigesprache für OpenCode ändern",
"settings.general.row.appearance.title": "Erscheinungsbild",
@@ -570,10 +545,12 @@ export const dict = {
"settings.general.row.theme.description": "Das Thema von OpenCode anpassen.",
"settings.general.row.font.title": "Schriftart",
"settings.general.row.font.description": "Die in Codeblöcken verwendete Monospace-Schriftart anpassen",
"settings.general.row.wayland.title": "Natives Wayland verwenden",
"settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Erfordert Neustart.",
"settings.general.row.wayland.tooltip":
"Unter Linux mit Monitoren unterschiedlicher Bildwiederholraten kann natives Wayland stabiler sein.",
"settings.general.row.releaseNotes.title": "Versionshinweise",
"settings.general.row.releaseNotes.description": '"Neuigkeiten"-Pop-ups nach Updates anzeigen',
"settings.updates.row.startup.title": "Beim Start nach Updates suchen",
"settings.updates.row.startup.description": "Beim Start von OpenCode automatisch nach Updates suchen",
"settings.updates.row.check.title": "Nach Updates suchen",
@@ -582,7 +559,6 @@ export const dict = {
"settings.updates.action.checking": "Wird geprüft...",
"settings.updates.toast.latest.title": "Du bist auf dem neuesten Stand",
"settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von OpenCode.",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -648,14 +624,12 @@ export const dict = {
"Systembenachrichtigung anzeigen, wenn eine Berechtigung erforderlich ist",
"settings.general.notifications.errors.title": "Fehler",
"settings.general.notifications.errors.description": "Systembenachrichtigung anzeigen, wenn ein Fehler auftritt",
"settings.general.sounds.agent.title": "Agent",
"settings.general.sounds.agent.description": "Ton abspielen, wenn der Agent fertig ist oder Aufmerksamkeit benötigt",
"settings.general.sounds.permissions.title": "Berechtigungen",
"settings.general.sounds.permissions.description": "Ton abspielen, wenn eine Berechtigung erforderlich ist",
"settings.general.sounds.errors.title": "Fehler",
"settings.general.sounds.errors.description": "Ton abspielen, wenn ein Fehler auftritt",
"settings.shortcuts.title": "Tastenkombinationen",
"settings.shortcuts.reset.button": "Auf Standard zurücksetzen",
"settings.shortcuts.reset.toast.title": "Tastenkombinationen zurückgesetzt",
@@ -666,14 +640,12 @@ export const dict = {
"settings.shortcuts.pressKeys": "Tasten drücken",
"settings.shortcuts.search.placeholder": "Tastenkürzel suchen",
"settings.shortcuts.search.empty": "Keine Tastenkürzel gefunden",
"settings.shortcuts.group.general": "Allgemein",
"settings.shortcuts.group.session": "Sitzung",
"settings.shortcuts.group.navigation": "Navigation",
"settings.shortcuts.group.modelAndAgent": "Modell und Agent",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Prompt",
"settings.providers.title": "Anbieter",
"settings.providers.description": "Anbietereinstellungen können hier konfiguriert werden.",
"settings.providers.section.connected": "Verbundene Anbieter",
@@ -691,16 +663,13 @@ export const dict = {
"settings.commands.description": "Befehlseinstellungen können hier konfiguriert werden.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP-Einstellungen können hier konfiguriert werden.",
"settings.permissions.title": "Berechtigungen",
"settings.permissions.description": "Steuern Sie, welche Tools der Server standardmäßig verwenden darf.",
"settings.permissions.section.tools": "Tools",
"settings.permissions.toast.updateFailed.title": "Berechtigungen konnten nicht aktualisiert werden",
"settings.permissions.action.allow": "Erlauben",
"settings.permissions.action.ask": "Fragen",
"settings.permissions.action.deny": "Verweigern",
"settings.permissions.tool.read.title": "Lesen",
"settings.permissions.tool.read.description": "Lesen einer Datei (stimmt mit dem Dateipfad überein)",
"settings.permissions.tool.edit.title": "Bearbeiten",
@@ -734,12 +703,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "Zugriff auf Dateien außerhalb des Projektverzeichnisses",
"settings.permissions.tool.doom_loop.title": "Doom Loop",
"settings.permissions.tool.doom_loop.description": "Wiederholte Tool-Aufrufe mit identischer Eingabe erkennen",
"session.delete.failed.title": "Sitzung konnte nicht gelöscht werden",
"session.delete.title": "Sitzung löschen",
"session.delete.confirm": 'Sitzung "{{name}}" löschen?',
"session.delete.button": "Sitzung löschen",
"workspace.new": "Neuer Arbeitsbereich",
"workspace.type.local": "lokal",
"workspace.type.sandbox": "Sandbox",

View File

@@ -583,6 +583,9 @@ export const dict = {
"settings.section.server": "Server",
"settings.tab.general": "General",
"settings.tab.shortcuts": "Shortcuts",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integration",
"settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.",
"settings.general.section.appearance": "Appearance",
"settings.general.section.notifications": "System notifications",

View File

@@ -15,8 +15,8 @@ export const dict = {
"command.category.agent": "Agente",
"command.category.permissions": "Permisos",
"command.category.workspace": "Espacio de trabajo",
"command.category.settings": "Ajustes",
"theme.scheme.system": "Sistema",
"theme.scheme.light": "Claro",
"theme.scheme.dark": "Oscuro",
@@ -72,6 +72,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Aceptar ediciones automáticamente",
"command.permissions.autoaccept.disable": "Dejar de aceptar ediciones automáticamente",
"command.workspace.toggle": "Alternar 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",
"command.session.redo": "Rehacer",
@@ -95,9 +96,13 @@ export const dict = {
"dialog.provider.group.popular": "Popular",
"dialog.provider.group.other": "Otro",
"dialog.provider.tag.recommended": "Recomendado",
"dialog.provider.anthropic.note": "Conectar con Claude Pro/Max o clave API",
"dialog.provider.openai.note": "Conectar con ChatGPT Pro/Plus o clave API",
"dialog.provider.copilot.note": "Conectar con Copilot o clave API",
"dialog.provider.opencode.note": "Modelos seleccionados incluyendo Claude, GPT, Gemini y más",
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluyendo Pro y Max",
"dialog.provider.copilot.note": "Modelos Claude para asistencia de codificación",
"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.vercel.note": "Acceso unificado a modelos de IA con enrutamiento inteligente",
"dialog.model.select.title": "Seleccionar modelo",
"dialog.model.search.placeholder": "Buscar modelos",
@@ -145,11 +150,48 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} conectado",
"provider.connect.toast.connected.description": "Los modelos de {{provider}} ahora están disponibles para usar.",
"provider.custom.title": "Proveedor personalizado",
"provider.custom.description.prefix": "Configurar un proveedor compatible con OpenAI. Ver la ",
"provider.custom.description.link": "documentación de configuración del proveedor",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "ID del proveedor",
"provider.custom.field.providerID.placeholder": "miproveedor",
"provider.custom.field.providerID.description": "Letras minúsculas, números, guiones o guiones bajos",
"provider.custom.field.name.label": "Nombre para mostrar",
"provider.custom.field.name.placeholder": "Mi Proveedor de IA",
"provider.custom.field.baseURL.label": "URL base",
"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.models.label": "Modelos",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "id-modelo",
"provider.custom.models.name.label": "Nombre",
"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.value.label": "Valor",
"provider.custom.headers.value.placeholder": "valor",
"provider.custom.headers.remove": "Eliminar cabecera",
"provider.custom.headers.add": "Añadir cabecera",
"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",
"provider.custom.error.name.required": "El nombre para mostrar es obligatorio",
"provider.custom.error.baseURL.required": "La URL base es obligatoria",
"provider.custom.error.baseURL.format": "Debe comenzar con http:// o https://",
"provider.custom.error.required": "Obligatorio",
"provider.custom.error.duplicate": "Duplicado",
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
"model.tag.free": "Gratis",
"model.tag.latest": "Último",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -164,8 +206,10 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Permite razonamiento",
"model.tooltip.reasoning.none": "Sin razonamiento",
"model.tooltip.context": "Límite de contexto {{limit}}",
"common.search.placeholder": "Buscar",
"common.goBack": "Volver",
"common.goForward": "Avanzar",
"common.loading": "Cargando",
"common.loading.ellipsis": "...",
"common.cancel": "Cancelar",
@@ -287,11 +331,11 @@ export const dict = {
"dialog.project.edit.icon.recommended": "Recomendado: 128x128px",
"dialog.project.edit.color": "Color",
"dialog.project.edit.color.select": "Seleccionar color {{color}}",
"dialog.project.edit.worktree.startup": "Script de inicio del espacio de trabajo",
"dialog.project.edit.worktree.startup.description":
"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.note":
'Desglose aproximado de tokens de entrada. "Otro" incluye definiciones de herramientas y sobrecarga.',
@@ -327,30 +371,48 @@ export const dict = {
"context.usage.clickToView": "Haz clic para ver contexto",
"context.usage.view": "Ver uso del contexto",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Idioma",
"toast.language.description": "Cambiado a {{language}}",
"toast.theme.title": "Tema cambiado",
"toast.scheme.title": "Esquema de color",
"toast.permissions.autoaccept.on.title": "Aceptando ediciones automáticamente",
"toast.permissions.autoaccept.on.description": "Los permisos de edición y escritura serán aprobados automáticamente",
"toast.permissions.autoaccept.off.title": "Se dejó de aceptar ediciones automáticamente",
"toast.permissions.autoaccept.off.description": "Los permisos de edición y escritura requerirán aprobación",
"toast.workspace.enabled.title": "Espacios de trabajo habilitados",
"toast.workspace.enabled.description": "Ahora se muestran varios worktrees en la barra lateral",
"toast.workspace.disabled.title": "Espacios de trabajo deshabilitados",
"toast.workspace.disabled.description": "Solo se muestra el worktree principal en la barra lateral",
"toast.permissions.autoaccept.on.title": "Aceptando ediciones automáticamente",
"toast.permissions.autoaccept.on.description": "Los permisos de edición y escritura serán aprobados automáticamente",
"toast.permissions.autoaccept.off.title": "Se dejó de aceptar ediciones automáticamente",
"toast.permissions.autoaccept.off.description": "Los permisos de edición y escritura requerirán aprobación",
"toast.model.none.title": "Ningún modelo seleccionado",
"toast.model.none.description": "Conecta un proveedor para resumir esta sesión",
"toast.file.loadFailed.title": "Fallo al cargar archivo",
"toast.file.listFailed.title": "Fallo al listar archivos",
"toast.context.noLineSelection.title": "Sin selección de líneas",
"toast.context.noLineSelection.description": "Primero selecciona un rango de líneas en una pestaña de archivo.",
"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!",
@@ -384,6 +446,7 @@ export const dict = {
"Elemento raíz no encontrado. ¿Olvidaste añadirlo a tu index.html? ¿O tal vez el atributo id está mal escrito?",
"error.globalSync.connectFailed": "No se pudo conectar al servidor. ¿Hay un servidor ejecutándose en `{{url}}`?",
"directory.error.invalidUrl": "URL de directorio inválida.",
"error.chain.unknown": "Error desconocido",
"error.chain.causedBy": "Causado por:",
@@ -431,15 +494,17 @@ export const dict = {
"session.review.loadingChanges": "Cargando cambios...",
"session.review.empty": "No hay cambios en esta sesión aún",
"session.review.noChanges": "Sin cambios",
"session.files.selectToOpen": "Selecciona un archivo para abrir",
"session.files.all": "Todos los archivos",
"session.files.binaryContent": "Archivo binario (el contenido no puede ser mostrado)",
"session.messages.renderEarlier": "Renderizar 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.context.addToContext": "Añadir {{selection}} al contexto",
"session.new.worktree.main": "Rama principal",
@@ -449,6 +514,11 @@ export const dict = {
"session.header.search.placeholder": "Buscar {{project}}",
"session.header.searchFiles": "Buscar archivos",
"session.header.openIn": "Abrir en",
"session.header.open.action": "Abrir {{app}}",
"session.header.open.ariaLabel": "Abrir en {{app}}",
"session.header.open.menu": "Opciones de apertura",
"session.header.open.copyPath": "Copiar ruta",
"status.popover.trigger": "Estado",
"status.popover.ariaLabel": "Configuraciones del servidor",
@@ -480,10 +550,10 @@ export const dict = {
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Cerrar terminal",
"terminal.connectionLost.title": "Conexión perdida",
"terminal.connectionLost.description":
"La conexión del terminal se interrumpió. Esto puede ocurrir cuando el servidor se reinicia.",
"common.closeTab": "Cerrar pestaña",
"common.dismiss": "Descartar",
"common.requestFailed": "Solicitud fallida",
@@ -496,8 +566,8 @@ export const dict = {
"common.close": "Cerrar",
"common.edit": "Editar",
"common.loadMore": "Cargar más",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Alternar menú",
"sidebar.nav.projectsAndSessions": "Proyectos y sesiones",
"sidebar.settings": "Ajustes",
@@ -511,15 +581,20 @@ export const dict = {
"sidebar.project.viewAllSessions": "Ver todas las sesiones",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Escritorio",
"settings.section.server": "Servidor",
"settings.tab.general": "General",
"settings.tab.shortcuts": "Atajos",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "Integración con WSL",
"settings.desktop.wsl.description": "Ejecutar el servidor OpenCode dentro de WSL en Windows.",
"settings.general.section.appearance": "Apariencia",
"settings.general.section.notifications": "Notificaciones del sistema",
"settings.general.section.updates": "Actualizaciones",
"settings.general.section.sounds": "Efectos de sonido",
"settings.general.section.display": "Pantalla",
"settings.general.row.language.title": "Idioma",
"settings.general.row.language.description": "Cambiar el idioma de visualización para OpenCode",
@@ -528,7 +603,12 @@ export const dict = {
"settings.general.row.theme.title": "Tema",
"settings.general.row.theme.description": "Personaliza el tema de OpenCode.",
"settings.general.row.font.title": "Fuente",
"settings.general.row.font.description": "Personaliza la fuente mono usada en bloques de código",
"settings.general.row.font.description": "Personaliza la fuente monoespaciada usada en bloques de código",
"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.tooltip":
"En Linux con monitores de frecuencia de actualización mixta, Wayland nativo puede ser más estable.",
"settings.general.row.releaseNotes.title": "Notas de la versión",
"settings.general.row.releaseNotes.description":
@@ -542,7 +622,6 @@ export const dict = {
"settings.updates.action.checking": "Buscando...",
"settings.updates.toast.latest.title": "Estás al día",
"settings.updates.toast.latest.description": "Estás usando la última versión de OpenCode.",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -600,6 +679,7 @@ export const dict = {
"sound.option.yup04": "Sí 04",
"sound.option.yup05": "Sí 05",
"sound.option.yup06": "Sí 06",
"settings.general.notifications.agent.title": "Agente",
"settings.general.notifications.agent.description":
"Mostrar notificación del sistema cuando el agente termine o necesite atención",

View File

@@ -15,12 +15,10 @@ export const dict = {
"command.category.agent": "Agent",
"command.category.permissions": "Permissions",
"command.category.workspace": "Espace de travail",
"command.category.settings": "Paramètres",
"theme.scheme.system": "Système",
"theme.scheme.light": "Clair",
"theme.scheme.dark": "Sombre",
"command.sidebar.toggle": "Basculer la barre latérale",
"command.project.open": "Ouvrir un projet",
"command.provider.connect": "Connecter un fournisseur",
@@ -31,23 +29,19 @@ export const dict = {
"command.session.previous.unseen": "Session non lue précédente",
"command.session.next.unseen": "Session non lue suivante",
"command.session.archive": "Archiver la session",
"command.palette": "Palette de commandes",
"command.theme.cycle": "Changer de thème",
"command.theme.set": "Utiliser le thème : {{theme}}",
"command.theme.scheme.cycle": "Changer de schéma de couleurs",
"command.theme.scheme.set": "Utiliser le schéma de couleurs : {{scheme}}",
"command.language.cycle": "Changer de langue",
"command.language.set": "Utiliser la langue : {{language}}",
"command.session.new": "Nouvelle session",
"command.file.open": "Ouvrir un fichier",
"command.tab.close": "Fermer l'onglet",
"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 input",
"command.input.focus": "Focus sur l'entrée",
"command.terminal.toggle": "Basculer le terminal",
"command.fileTree.toggle": "Basculer l'arborescence des fichiers",
"command.review.toggle": "Basculer la revue",
@@ -72,6 +66,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Accepter automatiquement les modifications",
"command.permissions.autoaccept.disable": "Arrêter l'acceptation automatique des modifications",
"command.workspace.toggle": "Basculer les espaces de travail",
"command.workspace.toggle.description": "Activer ou désactiver plusieurs espaces de travail dans la barre latérale",
"command.session.undo": "Annuler",
"command.session.undo.description": "Annuler le dernier message",
"command.session.redo": "Rétablir",
@@ -84,32 +79,30 @@ export const dict = {
"command.session.share.description": "Partager cette session et copier l'URL dans le presse-papiers",
"command.session.unshare": "Ne plus partager la session",
"command.session.unshare.description": "Arrêter de partager cette session",
"palette.search.placeholder": "Rechercher des fichiers, des commandes et des sessions",
"palette.empty": "Aucun résultat trouvé",
"palette.group.commands": "Commandes",
"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.tag.recommended": "Recommandé",
"dialog.provider.opencode.note": "Modèles sélectionnés incluant Claude, GPT, Gemini et plus",
"dialog.provider.anthropic.note": "Connectez-vous avec Claude Pro/Max ou une clé API",
"dialog.provider.openai.note": "Connectez-vous avec ChatGPT Pro/Plus ou une clé API",
"dialog.provider.copilot.note": "Connectez-vous avec Copilot ou une clé API",
"dialog.provider.openai.note": "Connectez-vous avec ChatGPT Pro/Plus ou une clé API",
"dialog.provider.google.note": "Modèles Gemini pour des réponses rapides et structurées",
"dialog.provider.openrouter.note": "Accédez à tous les modèles pris en charge depuis un seul fournisseur",
"dialog.provider.vercel.note": "Accès unifié aux modèles d'IA avec routage intelligent",
"dialog.model.select.title": "Sélectionner un modèle",
"dialog.model.search.placeholder": "Rechercher des modèles",
"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.unpaid.freeModels.title": "Modèles gratuits fournis par OpenCode",
"dialog.model.unpaid.addMore.title": "Ajouter plus de modèles de fournisseurs populaires",
"dialog.provider.viewAll": "Voir plus de fournisseurs",
"provider.connect.title": "Connecter {{provider}}",
"provider.connect.title.anthropicProMax": "Connexion avec Claude Pro/Max",
"provider.connect.selectMethod": "Sélectionnez la méthode de connexion pour {{provider}}.",
@@ -144,12 +137,46 @@ export const dict = {
"provider.connect.oauth.auto.confirmationCode": "Code de confirmation",
"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.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.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.models.label": "Modèles",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "id-modele",
"provider.custom.models.name.label": "Nom",
"provider.custom.models.name.placeholder": "Nom d'affichage",
"provider.custom.models.remove": "Supprimer le modèle",
"provider.custom.models.add": "Ajouter un modèle",
"provider.custom.headers.label": "En-têtes (optionnel)",
"provider.custom.headers.key.label": "En-tête",
"provider.custom.headers.key.placeholder": "Nom-En-Tête",
"provider.custom.headers.value.label": "Valeur",
"provider.custom.headers.value.placeholder": "valeur",
"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.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",
"provider.custom.error.baseURL.format": "Doit commencer par http:// ou https://",
"provider.custom.error.required": "Requis",
"provider.custom.error.duplicate": "Doublon",
"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.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -166,6 +193,7 @@ export const dict = {
"model.tooltip.context": "Limite de contexte {{limit}}",
"common.search.placeholder": "Rechercher",
"common.goBack": "Retour",
"common.goForward": "Avancer",
"common.loading": "Chargement",
"common.loading.ellipsis": "...",
"common.cancel": "Annuler",
@@ -176,14 +204,12 @@ export const dict = {
"common.saving": "Enregistrement...",
"common.default": "Défaut",
"common.attachment": "pièce jointe",
"prompt.placeholder.shell": "Entrez une commande shell...",
"prompt.placeholder.normal": 'Demandez n\'importe quoi... "{{example}}"',
"prompt.placeholder.summarizeComments": "Résumer les commentaires…",
"prompt.placeholder.summarizeComment": "Résumer le commentaire…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell.exit": "esc pour quitter",
"prompt.example.1": "Corriger un TODO dans la base de code",
"prompt.example.2": "Quelle est la pile technique de ce projet ?",
"prompt.example.3": "Réparer les tests échoués",
@@ -209,7 +235,6 @@ export const dict = {
"prompt.example.23": "Ajouter la pagination à cette liste",
"prompt.example.24": "Créer une commande CLI pour...",
"prompt.example.25": "Comment fonctionnent les variables d'environnement ici ?",
"prompt.popover.emptyResults": "Aucun résultat correspondant",
"prompt.popover.emptyCommands": "Aucune commande correspondante",
"prompt.dropzone.label": "Déposez des images ou des PDF ici",
@@ -225,7 +250,6 @@ export const dict = {
"prompt.attachment.remove": "Supprimer la pièce jointe",
"prompt.action.send": "Envoyer",
"prompt.action.stop": "Arrêter",
"prompt.toast.pasteUnsupported.title": "Collage non supporté",
"prompt.toast.pasteUnsupported.description": "Seules les images ou les PDF peuvent être collés ici.",
"prompt.toast.modelAgentRequired.title": "Sélectionnez un agent et un modèle",
@@ -236,24 +260,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "Échec de l'envoi de la commande",
"prompt.toast.promptSendFailed.title": "Échec de l'envoi du message",
"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.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",
"mcp.status.connected": "connecté",
"mcp.status.failed": "échoué",
"mcp.status.needs_auth": "nécessite auth",
"mcp.status.disabled": "désactivé",
"dialog.fork.empty": "Aucun message à partir duquel bifurquer",
"dialog.directory.search.placeholder": "Rechercher des dossiers",
"dialog.directory.empty": "Aucun dossier trouvé",
"dialog.server.title": "Serveurs",
"dialog.server.description": "Changez le serveur OpenCode auquel cette application se connecte.",
"dialog.server.search.placeholder": "Rechercher des serveurs",
@@ -271,14 +289,12 @@ export const dict = {
"dialog.server.default.set": "Définir le serveur actuel comme défaut",
"dialog.server.default.clear": "Effacer",
"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.delete": "Supprimer",
"dialog.server.current": "Serveur actuel",
"dialog.server.status.default": "Défaut",
"dialog.project.edit.title": "Modifier le projet",
"dialog.project.edit.name": "Nom",
"dialog.project.edit.icon": "Icône",
@@ -287,7 +303,6 @@ export const dict = {
"dialog.project.edit.icon.recommended": "Recommandé : 128x128px",
"dialog.project.edit.color": "Couleur",
"dialog.project.edit.color.select": "Sélectionner la couleur {{color}}",
"dialog.project.edit.worktree.startup": "Script de démarrage de l'espace de travail",
"dialog.project.edit.worktree.startup.description":
"S'exécute après la création d'un nouvel espace de travail (arbre de travail).",
@@ -300,10 +315,8 @@ export const dict = {
"context.breakdown.assistant": "Assistant",
"context.breakdown.tool": "Appels d'outils",
"context.breakdown.other": "Autre",
"context.systemPrompt.title": "Prompt système",
"context.rawMessages.title": "Messages bruts",
"context.stats.session": "Session",
"context.stats.messages": "Messages",
"context.stats.provider": "Fournisseur",
@@ -320,36 +333,44 @@ export const dict = {
"context.stats.totalCost": "Coût total",
"context.stats.sessionCreated": "Session créée",
"context.stats.lastActivity": "Dernière activité",
"context.usage.tokens": "Jetons",
"context.usage.usage": "Utilisation",
"context.usage.cost": "Coût",
"context.usage.clickToView": "Cliquez pour voir le contexte",
"context.usage.view": "Voir l'utilisation du contexte",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Langue",
"toast.language.description": "Passé à {{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.disabled.title": "Espaces de travail désactivés",
"toast.workspace.disabled.description": "Seul le worktree principal est affiché dans la barre latérale",
"toast.permissions.autoaccept.on.title": "Acceptation auto des modifications",
"toast.permissions.autoaccept.on.description":
"Les permissions de modification et d'écriture seront automatiquement approuvées",
"toast.permissions.autoaccept.off.title": "Arrêt acceptation auto des modifications",
"toast.permissions.autoaccept.off.description":
"Les permissions de modification et d'écriture nécessiteront une approbation",
"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.disabled.title": "Espaces de travail désactivés",
"toast.workspace.disabled.description": "Seul le worktree principal est affiché dans la barre latérale",
"toast.model.none.title": "Aucun modèle sélectionné",
"toast.model.none.description": "Connectez un fournisseur pour résumer cette session",
"toast.file.loadFailed.title": "Échec du chargement du fichier",
"toast.file.listFailed.title": "Échec de la liste des fichiers",
"toast.context.noLineSelection.title": "Aucune sélection de lignes",
"toast.context.noLineSelection.description": "Sélectionnez d'abord une plage de lignes dans un onglet de fichier.",
@@ -358,20 +379,16 @@ 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.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é",
"error.page.description": "Une erreur s'est produite lors du chargement de l'application.",
"error.page.details.label": "Détails de l'erreur",
@@ -382,13 +399,11 @@ export const dict = {
"error.page.report.prefix": "Veuillez signaler cette erreur à l'équipe OpenCode",
"error.page.report.discord": "sur Discord",
"error.page.version": "Version : {{version}}",
"error.dev.rootNotFound":
"Élément racine introuvable. Avez-vous oublié de l'ajouter à votre index.html ? Ou peut-être que l'attribut id est mal orthographié ?",
"error.globalSync.connectFailed":
"Impossible de se connecter au serveur. Y a-t-il un serveur en cours d'exécution à `{{url}}` ?",
"directory.error.invalidUrl": "Répertoire invalide dans l'URL.",
"error.chain.unknown": "Erreur inconnue",
"error.chain.causedBy": "Causé par :",
"error.chain.apiError": "Erreur API",
@@ -411,21 +426,17 @@ export const dict = {
"error.chain.configFrontmatterError": "Échec de l'analyse du frontmatter dans {{path}} :\n{{message}}",
"error.chain.configInvalid": "Le fichier de configuration à {{path}} est invalide",
"error.chain.configInvalidWithMessage": "Le fichier de configuration à {{path}} est invalide : {{message}}",
"notification.permission.title": "Permission requise",
"notification.permission.description": "{{sessionTitle}} dans {{projectName}} a besoin d'une permission",
"notification.question.title": "Question",
"notification.question.description": "{{sessionTitle}} dans {{projectName}} a une question",
"notification.action.goToSession": "Aller à la session",
"notification.session.responseReady.title": "Réponse prête",
"notification.session.error.title": "Erreur de session",
"notification.session.error.fallbackDescription": "Une erreur s'est produite",
"home.recentProjects": "Projets récents",
"home.empty.title": "Aucun projet récent",
"home.empty.description": "Commencez par ouvrir un projet local",
"session.tab.session": "Session",
"session.tab.review": "Revue",
"session.tab.context": "Contexte",
@@ -443,18 +454,19 @@ 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.context.addToContext": "Ajouter {{selection}} au contexte",
"session.new.worktree.main": "Branche principale",
"session.new.worktree.mainWithBranch": "Branche principale ({{branch}})",
"session.new.worktree.create": "Créer un nouvel arbre de travail",
"session.new.lastModified": "Dernière modification",
"session.header.search.placeholder": "Rechercher {{project}}",
"session.header.searchFiles": "Rechercher des fichiers",
"session.header.openIn": "Ouvrir dans",
"session.header.open.action": "Ouvrir {{app}}",
"session.header.open.ariaLabel": "Ouvrir dans {{app}}",
"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.tab.servers": "Serveurs",
@@ -462,7 +474,6 @@ export const dict = {
"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.description.shared":
"Cette session est publique sur le web. Elle est accessible à toute personne disposant du lien.",
@@ -476,16 +487,13 @@ export const dict = {
"session.share.action.view": "Voir",
"session.share.copy.copied": "Copié",
"session.share.copy.copyLink": "Copier le lien",
"lsp.tooltip.none": "Aucun serveur LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Chargement du prompt...",
"terminal.loading": "Chargement du terminal...",
"terminal.title": "Terminal",
"terminal.title.numbered": "Terminal {{number}}",
"terminal.close": "Fermer le terminal",
"terminal.connectionLost.title": "Connexion perdue",
"terminal.connectionLost.description":
"La connexion au terminal a été interrompue. Cela peut arriver lorsque le serveur redémarre.",
@@ -501,7 +509,6 @@ export const dict = {
"common.close": "Fermer",
"common.edit": "Modifier",
"common.loadMore": "Charger plus",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Basculer le menu",
"sidebar.nav.projectsAndSessions": "Projets et sessions",
@@ -516,18 +523,19 @@ export const dict = {
"Connectez n'importe quel fournisseur pour utiliser des modèles, y compris Claude, GPT, Gemini etc.",
"sidebar.project.recentSessions": "Sessions récentes",
"sidebar.project.viewAllSessions": "Voir toutes les sessions",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Bureau",
"settings.section.server": "Serveur",
"settings.tab.general": "Général",
"settings.tab.shortcuts": "Raccourcis",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "Intégration WSL",
"settings.desktop.wsl.description": "Exécuter le serveur OpenCode dans WSL sur Windows.",
"settings.general.section.appearance": "Apparence",
"settings.general.section.notifications": "Notifications système",
"settings.general.section.updates": "Mises à jour",
"settings.general.section.sounds": "Effets sonores",
"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.appearance.title": "Apparence",
@@ -536,10 +544,12 @@ export const dict = {
"settings.general.row.theme.description": "Personnaliser le thème d'OpenCode.",
"settings.general.row.font.title": "Police",
"settings.general.row.font.description": "Personnaliser la police mono utilisée dans les blocs de code",
"settings.general.row.wayland.title": "Utiliser Wayland natif",
"settings.general.row.wayland.description": "Désactiver le repli X11 sur Wayland. Nécessite un redémarrage.",
"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.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",
@@ -548,7 +558,6 @@ export const dict = {
"settings.updates.action.checking": "Vérification...",
"settings.updates.toast.latest.title": "Vous êtes à jour",
"settings.updates.toast.latest.description": "Vous utilisez la dernière version d'OpenCode.",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -614,14 +623,12 @@ export const dict = {
"Afficher une notification système lorsqu'une permission est requise",
"settings.general.notifications.errors.title": "Erreurs",
"settings.general.notifications.errors.description": "Afficher une notification système lorsqu'une erreur se produit",
"settings.general.sounds.agent.title": "Agent",
"settings.general.sounds.agent.description": "Jouer un son lorsque l'agent a terminé ou nécessite une attention",
"settings.general.sounds.permissions.title": "Permissions",
"settings.general.sounds.permissions.description": "Jouer un son lorsqu'une permission est requise",
"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.toast.title": "Raccourcis réinitialisés",
@@ -632,14 +639,12 @@ export const dict = {
"settings.shortcuts.pressKeys": "Appuyez sur les touches",
"settings.shortcuts.search.placeholder": "Rechercher des raccourcis",
"settings.shortcuts.search.empty": "Aucun raccourci trouvé",
"settings.shortcuts.group.general": "Général",
"settings.shortcuts.group.session": "Session",
"settings.shortcuts.group.navigation": "Navigation",
"settings.shortcuts.group.modelAndAgent": "Modèle et agent",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Prompt",
"settings.providers.title": "Fournisseurs",
"settings.providers.description": "Les paramètres des fournisseurs seront configurables ici.",
"settings.providers.section.connected": "Fournisseurs connectés",
@@ -657,16 +662,13 @@ export const dict = {
"settings.commands.description": "Les paramètres des commandes seront configurables ici.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Les paramètres MCP seront configurables ici.",
"settings.permissions.title": "Permissions",
"settings.permissions.description": "Contrôlez les outils que le serveur peut utiliser par défaut.",
"settings.permissions.section.tools": "Outils",
"settings.permissions.toast.updateFailed.title": "Échec de la mise à jour des permissions",
"settings.permissions.action.allow": "Autoriser",
"settings.permissions.action.ask": "Demander",
"settings.permissions.action.deny": "Refuser",
"settings.permissions.tool.read.title": "Lire",
"settings.permissions.tool.read.description": "Lecture d'un fichier (correspond au chemin du fichier)",
"settings.permissions.tool.edit.title": "Modifier",
@@ -701,12 +703,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "Accéder aux fichiers en dehors du répertoire du projet",
"settings.permissions.tool.doom_loop.title": "Boucle infernale",
"settings.permissions.tool.doom_loop.description": "Détecter les appels d'outils répétés avec une entrée identique",
"session.delete.failed.title": "Échec de la suppression de la session",
"session.delete.title": "Supprimer la session",
"session.delete.confirm": 'Supprimer la session "{{name}}" ?',
"session.delete.button": "Supprimer la session",
"workspace.new": "Nouvel espace de travail",
"workspace.type.local": "local",
"workspace.type.sandbox": "bac à sable",

View File

@@ -15,12 +15,10 @@ export const dict = {
"command.category.agent": "エージェント",
"command.category.permissions": "権限",
"command.category.workspace": "ワークスペース",
"command.category.settings": "設定",
"theme.scheme.system": "システム",
"theme.scheme.light": "ライト",
"theme.scheme.dark": "ダーク",
"command.sidebar.toggle": "サイドバーの切り替え",
"command.project.open": "プロジェクトを開く",
"command.provider.connect": "プロバイダーに接続",
@@ -31,17 +29,13 @@ export const dict = {
"command.session.previous.unseen": "前の未読セッション",
"command.session.next.unseen": "次の未読セッション",
"command.session.archive": "セッションをアーカイブ",
"command.palette": "コマンドパレット",
"command.theme.cycle": "テーマの切り替え",
"command.theme.set": "テーマを使用: {{theme}}",
"command.theme.scheme.cycle": "配色の切り替え",
"command.theme.scheme.set": "配色を使用: {{scheme}}",
"command.language.cycle": "言語の切り替え",
"command.language.set": "言語を使用: {{language}}",
"command.session.new": "新しいセッション",
"command.file.open": "ファイルを開く",
"command.tab.close": "タブを閉じる",
@@ -72,6 +66,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "編集を自動承認",
"command.permissions.autoaccept.disable": "編集の自動承認を停止",
"command.workspace.toggle": "ワークスペースを切り替え",
"command.workspace.toggle.description": "サイドバーでの複数のワークスペースの有効化・無効化",
"command.session.undo": "元に戻す",
"command.session.undo.description": "最後のメッセージを元に戻す",
"command.session.redo": "やり直す",
@@ -84,32 +79,30 @@ export const dict = {
"command.session.share.description": "このセッションを共有しURLをクリップボードにコピー",
"command.session.unshare": "セッションの共有を停止",
"command.session.unshare.description": "このセッションの共有を停止",
"palette.search.placeholder": "ファイル、コマンド、セッションを検索",
"palette.empty": "結果が見つかりません",
"palette.group.commands": "コマンド",
"palette.group.files": "ファイル",
"dialog.provider.search.placeholder": "プロバイダーを検索",
"dialog.provider.empty": "プロバイダーが見つかりません",
"dialog.provider.group.popular": "人気",
"dialog.provider.group.other": "その他",
"dialog.provider.tag.recommended": "推奨",
"dialog.provider.opencode.note": "Claude, GPT, Geminiなどを含む厳選されたモデル",
"dialog.provider.anthropic.note": "Claude Pro/MaxまたはAPIキーで接続",
"dialog.provider.openai.note": "ChatGPT Pro/PlusまたはAPIキーで接続",
"dialog.provider.copilot.note": "CopilotまたはAPIキーで接続",
"dialog.provider.openai.note": "ChatGPT Pro/PlusまたはAPIキーで接続",
"dialog.provider.google.note": "高速で構造化された応答のためのGeminiモデル",
"dialog.provider.openrouter.note": "1つのプロバイダーからすべてのサポートされているモデルにアクセス",
"dialog.provider.vercel.note": "スマートルーターによるAIモデルへの統合アクセス",
"dialog.model.select.title": "モデルを選択",
"dialog.model.search.placeholder": "モデルを検索",
"dialog.model.empty": "モデルが見つかりません",
"dialog.model.manage": "モデルを管理",
"dialog.model.manage.description": "モデルセレクターに表示するモデルをカスタマイズします。",
"dialog.model.unpaid.freeModels.title": "OpenCodeが提供する無料モデル",
"dialog.model.unpaid.addMore.title": "人気のプロバイダーからモデルを追加",
"dialog.provider.viewAll": "さらにプロバイダーを表示",
"provider.connect.title": "{{provider}}を接続",
"provider.connect.title.anthropicProMax": "Claude Pro/Maxでログイン",
"provider.connect.selectMethod": "{{provider}}のログイン方法を選択してください。",
@@ -143,12 +136,46 @@ export const dict = {
"provider.connect.oauth.auto.confirmationCode": "確認コード",
"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.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": "My AI Provider",
"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.description": "オプション。ヘッダーで認証を管理する場合は空のままにしてください。",
"provider.custom.models.label": "モデル",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "名前",
"provider.custom.models.name.placeholder": "表示名",
"provider.custom.models.remove": "モデルを削除",
"provider.custom.models.add": "モデルを追加",
"provider.custom.headers.label": "ヘッダー (オプション)",
"provider.custom.headers.key.label": "ヘッダー",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "値",
"provider.custom.headers.value.placeholder": "value",
"provider.custom.headers.remove": "ヘッダーを削除",
"provider.custom.headers.add": "ヘッダーを追加",
"provider.custom.error.providerID.required": "プロバイダーIDが必要です",
"provider.custom.error.providerID.format": "小文字、数字、ハイフン、アンダースコアを使用してください",
"provider.custom.error.providerID.exists": "そのプロバイダーIDは既に存在します",
"provider.custom.error.name.required": "表示名が必要です",
"provider.custom.error.baseURL.required": "ベースURLが必要です",
"provider.custom.error.baseURL.format": "http:// または https:// で始まる必要があります",
"provider.custom.error.required": "必須",
"provider.custom.error.duplicate": "重複",
"provider.disconnect.toast.disconnected.title": "{{provider}}が切断されました",
"provider.disconnect.toast.disconnected.description": "{{provider}}のモデルは利用できなくなりました。",
"model.tag.free": "無料",
"model.tag.latest": "最新",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -165,6 +192,7 @@ export const dict = {
"model.tooltip.context": "コンテキスト上限 {{limit}}",
"common.search.placeholder": "検索",
"common.goBack": "戻る",
"common.goForward": "進む",
"common.loading": "読み込み中",
"common.loading.ellipsis": "...",
"common.cancel": "キャンセル",
@@ -175,14 +203,12 @@ export const dict = {
"common.saving": "保存中...",
"common.default": "デフォルト",
"common.attachment": "添付ファイル",
"prompt.placeholder.shell": "シェルコマンドを入力...",
"prompt.placeholder.normal": '何でも聞いてください... "{{example}}"',
"prompt.placeholder.summarizeComments": "コメントを要約…",
"prompt.placeholder.summarizeComment": "コメントを要約…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell": "シェル",
"prompt.mode.shell.exit": "escで終了",
"prompt.example.1": "コードベースのTODOを修正",
"prompt.example.2": "このプロジェクトの技術スタックは何ですか?",
"prompt.example.3": "壊れたテストを修正",
@@ -208,7 +234,6 @@ export const dict = {
"prompt.example.23": "このリストにページネーションを追加",
"prompt.example.24": "〜のCLIコマンドを作成",
"prompt.example.25": "ここでは環境変数はどう機能しますか?",
"prompt.popover.emptyResults": "一致する結果がありません",
"prompt.popover.emptyCommands": "一致するコマンドがありません",
"prompt.dropzone.label": "画像またはPDFをここにドロップ",
@@ -224,7 +249,6 @@ export const dict = {
"prompt.attachment.remove": "添付ファイルを削除",
"prompt.action.send": "送信",
"prompt.action.stop": "停止",
"prompt.toast.pasteUnsupported.title": "サポートされていない貼り付け",
"prompt.toast.pasteUnsupported.description": "ここでは画像またはPDFのみ貼り付け可能です。",
"prompt.toast.modelAgentRequired.title": "エージェントとモデルを選択",
@@ -235,24 +259,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "コマンドの送信に失敗しました",
"prompt.toast.promptSendFailed.title": "プロンプトの送信に失敗しました",
"prompt.toast.promptSendFailed.description": "セッションを取得できませんでした",
"dialog.mcp.title": "MCP",
"dialog.mcp.description": "{{total}}個中{{enabled}}個が有効",
"dialog.mcp.empty": "MCPが設定されていません",
"dialog.lsp.empty": "ファイルタイプから自動検出されたLSP",
"dialog.plugins.empty": "opencode.jsonで設定されたプラグイン",
"mcp.status.connected": "接続済み",
"mcp.status.failed": "失敗",
"mcp.status.needs_auth": "認証が必要",
"mcp.status.disabled": "無効",
"dialog.fork.empty": "フォーク元のメッセージがありません",
"dialog.directory.search.placeholder": "フォルダを検索",
"dialog.directory.empty": "フォルダが見つかりません",
"dialog.server.title": "サーバー",
"dialog.server.description": "このアプリが接続するOpenCodeサーバーを切り替えます。",
"dialog.server.search.placeholder": "サーバーを検索",
@@ -270,14 +288,12 @@ export const dict = {
"dialog.server.default.set": "現在のサーバーをデフォルトに設定",
"dialog.server.default.clear": "クリア",
"dialog.server.action.remove": "サーバーを削除",
"dialog.server.menu.edit": "編集",
"dialog.server.menu.default": "デフォルトに設定",
"dialog.server.menu.defaultRemove": "デフォルト設定を解除",
"dialog.server.menu.delete": "削除",
"dialog.server.current": "現在のサーバー",
"dialog.server.status.default": "デフォルト",
"dialog.project.edit.title": "プロジェクトを編集",
"dialog.project.edit.name": "名前",
"dialog.project.edit.icon": "アイコン",
@@ -286,7 +302,6 @@ 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.description":
"新しいワークスペース (ワークツリー) を作成した後に実行されます。",
@@ -298,10 +313,8 @@ export const dict = {
"context.breakdown.assistant": "アシスタント",
"context.breakdown.tool": "ツール呼び出し",
"context.breakdown.other": "その他",
"context.systemPrompt.title": "システムプロンプト",
"context.rawMessages.title": "生のメッセージ",
"context.stats.session": "セッション",
"context.stats.messages": "メッセージ",
"context.stats.provider": "プロバイダー",
@@ -318,29 +331,42 @@ export const dict = {
"context.stats.totalCost": "総コスト",
"context.stats.sessionCreated": "セッション作成日時",
"context.stats.lastActivity": "最終アクティビティ",
"context.usage.tokens": "トークン",
"context.usage.usage": "使用量",
"context.usage.cost": "コスト",
"context.usage.clickToView": "クリックしてコンテキストを表示",
"context.usage.view": "コンテキスト使用量を表示",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "言語",
"toast.language.description": "{{language}}に切り替えました",
"toast.theme.title": "テーマが切り替わりました",
"toast.scheme.title": "配色",
"toast.workspace.enabled.title": "ワークスペースが有効になりました",
"toast.workspace.enabled.description": "サイドバーに複数のワークツリーが表示されます",
"toast.workspace.disabled.title": "ワークスペースが無効になりました",
"toast.workspace.disabled.description": "サイドバーにはメインのワークツリーのみが表示されます",
"toast.permissions.autoaccept.on.title": "編集を自動承認中",
"toast.permissions.autoaccept.on.description": "編集と書き込みの権限は自動的に承認されます",
"toast.permissions.autoaccept.off.title": "編集の自動承認を停止しました",
"toast.permissions.autoaccept.off.description": "編集と書き込みの権限には承認が必要です",
"toast.model.none.title": "モデルが選択されていません",
"toast.model.none.description": "このセッションを要約するにはプロバイダーを接続してください",
"toast.file.loadFailed.title": "ファイルの読み込みに失敗しました",
"toast.file.listFailed.title": "ファイル一覧の取得に失敗しました",
"toast.context.noLineSelection.title": "行が選択されていません",
"toast.context.noLineSelection.description": "まずファイルタブで行範囲を選択してください。",
@@ -349,19 +375,15 @@ export const dict = {
"toast.session.share.success.description": "共有URLをクリップボードにコピーしました",
"toast.session.share.failed.title": "セッションの共有に失敗しました",
"toast.session.share.failed.description": "セッションの共有中にエラーが発生しました",
"toast.session.unshare.success.title": "セッションの共有を解除しました",
"toast.session.unshare.success.description": "セッションの共有解除に成功しました!",
"toast.session.unshare.failed.title": "セッションの共有解除に失敗しました",
"toast.session.unshare.failed.description": "セッションの共有解除中にエラーが発生しました",
"toast.session.listFailed.title": "{{project}}のセッション読み込みに失敗しました",
"toast.update.title": "アップデートが利用可能です",
"toast.update.description": "OpenCodeの新しいバージョン ({{version}}) がインストール可能です。",
"toast.update.action.installRestart": "インストールして再起動",
"toast.update.action.notYet": "今はしない",
"error.page.title": "問題が発生しました",
"error.page.description": "アプリケーションの読み込み中にエラーが発生しました。",
"error.page.details.label": "エラー詳細",
@@ -372,12 +394,10 @@ export const dict = {
"error.page.report.prefix": "このエラーをOpenCodeチームに報告してください: ",
"error.page.report.discord": "Discord",
"error.page.version": "バージョン: {{version}}",
"error.dev.rootNotFound":
"ルート要素が見つかりません。index.htmlに追加するのを忘れていませんかまたはid属性のスペルが間違っていませんか",
"error.globalSync.connectFailed": "サーバーに接続できませんでした。`{{url}}`でサーバーが実行されていますか?",
"directory.error.invalidUrl": "URL内のディレクトリが無効です。",
"error.chain.unknown": "不明なエラー",
"error.chain.causedBy": "原因:",
"error.chain.apiError": "APIエラー",
@@ -398,21 +418,17 @@ export const dict = {
"error.chain.configFrontmatterError": "{{path}} のフロントマターの解析に失敗しました:\n{{message}}",
"error.chain.configInvalid": "{{path}} の設定ファイルが無効です",
"error.chain.configInvalidWithMessage": "{{path}} の設定ファイルが無効です: {{message}}",
"notification.permission.title": "権限が必要です",
"notification.permission.description": "{{projectName}} の {{sessionTitle}} が権限を必要としています",
"notification.question.title": "質問",
"notification.question.description": "{{projectName}} の {{sessionTitle}} から質問があります",
"notification.action.goToSession": "セッションへ移動",
"notification.session.responseReady.title": "応答の準備ができました",
"notification.session.error.title": "セッションエラー",
"notification.session.error.fallbackDescription": "エラーが発生しました",
"home.recentProjects": "最近のプロジェクト",
"home.empty.title": "最近のプロジェクトはありません",
"home.empty.description": "ローカルプロジェクトを開いて始めましょう",
"session.tab.session": "セッション",
"session.tab.review": "レビュー",
"session.tab.context": "コンテキスト",
@@ -430,18 +446,19 @@ export const dict = {
"session.messages.loadingEarlier": "以前のメッセージを読み込み中...",
"session.messages.loadEarlier": "以前のメッセージを読み込む",
"session.messages.loading": "メッセージを読み込み中...",
"session.messages.jumpToLatest": "最新へジャンプ",
"session.context.addToContext": "{{selection}}をコンテキストに追加",
"session.new.worktree.main": "メインブランチ",
"session.new.worktree.mainWithBranch": "メインブランチ ({{branch}})",
"session.new.worktree.create": "新しいワークツリーを作成",
"session.new.lastModified": "最終更新",
"session.header.search.placeholder": "{{project}}を検索",
"session.header.searchFiles": "ファイルを検索",
"session.header.openIn": "で開く",
"session.header.open.action": "{{app}}を開く",
"session.header.open.ariaLabel": "{{app}}で開く",
"session.header.open.menu": "開くオプション",
"session.header.open.copyPath": "パスをコピー",
"status.popover.trigger": "ステータス",
"status.popover.ariaLabel": "サーバー設定",
"status.popover.tab.servers": "サーバー",
@@ -449,7 +466,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "プラグイン",
"status.popover.action.manageServers": "サーバーを管理",
"session.share.popover.title": "ウェブで公開",
"session.share.popover.description.shared":
"このセッションはウェブで公開されています。リンクを知っている人なら誰でもアクセスできます。",
@@ -463,16 +479,13 @@ export const dict = {
"session.share.action.view": "表示",
"session.share.copy.copied": "コピーしました",
"session.share.copy.copyLink": "リンクをコピー",
"lsp.tooltip.none": "LSPサーバーなし",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "プロンプトを読み込み中...",
"terminal.loading": "ターミナルを読み込み中...",
"terminal.title": "ターミナル",
"terminal.title.numbered": "ターミナル {{number}}",
"terminal.close": "ターミナルを閉じる",
"terminal.connectionLost.title": "接続が失われました",
"terminal.connectionLost.description":
"ターミナルの接続が中断されました。これはサーバーが再起動したときに発生することがあります。",
@@ -488,7 +501,6 @@ export const dict = {
"common.close": "閉じる",
"common.edit": "編集",
"common.loadMore": "さらに読み込む",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "メニューを切り替え",
"sidebar.nav.projectsAndSessions": "プロジェクトとセッション",
@@ -501,18 +513,19 @@ export const dict = {
"sidebar.gettingStarted.line2": "プロバイダーを接続して、Claude、GPT、Geminiなどのモデルを使用できます。",
"sidebar.project.recentSessions": "最近のセッション",
"sidebar.project.viewAllSessions": "すべてのセッションを表示",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "デスクトップ",
"settings.section.server": "サーバー",
"settings.tab.general": "一般",
"settings.tab.shortcuts": "ショートカット",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL統合",
"settings.desktop.wsl.description": "Windows上のWSL内でOpenCodeサーバーを実行します。",
"settings.general.section.appearance": "外観",
"settings.general.section.notifications": "システム通知",
"settings.general.section.updates": "アップデート",
"settings.general.section.sounds": "効果音",
"settings.general.section.display": "ディスプレイ",
"settings.general.row.language.title": "言語",
"settings.general.row.language.description": "OpenCodeの表示言語を変更します",
"settings.general.row.appearance.title": "外観",
@@ -521,10 +534,12 @@ export const dict = {
"settings.general.row.theme.description": "OpenCodeのテーマをカスタマイズします。",
"settings.general.row.font.title": "フォント",
"settings.general.row.font.description": "コードブロックで使用する等幅フォントをカスタマイズします",
"settings.general.row.wayland.title": "ネイティブWaylandを使用",
"settings.general.row.wayland.description": "WaylandでのX11フォールバックを無効にします。再起動が必要です。",
"settings.general.row.wayland.tooltip":
"リフレッシュレートが混在するモニターを使用しているLinuxでは、ネイティブWaylandの方が安定する場合があります。",
"settings.general.row.releaseNotes.title": "リリースノート",
"settings.general.row.releaseNotes.description": "アップデート後に「新機能」ポップアップを表示",
"settings.updates.row.startup.title": "起動時にアップデートを確認",
"settings.updates.row.startup.description": "OpenCode の起動時に自動でアップデートを確認します",
"settings.updates.row.check.title": "アップデートを確認",
@@ -533,7 +548,6 @@ export const dict = {
"settings.updates.action.checking": "確認中...",
"settings.updates.toast.latest.title": "最新です",
"settings.updates.toast.latest.description": "OpenCode は最新バージョンです。",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -598,14 +612,12 @@ export const dict = {
"settings.general.notifications.permissions.description": "権限が必要な場合にシステム通知を表示します",
"settings.general.notifications.errors.title": "エラー",
"settings.general.notifications.errors.description": "エラーが発生した場合にシステム通知を表示します",
"settings.general.sounds.agent.title": "エージェント",
"settings.general.sounds.agent.description": "エージェントが完了したか、注意が必要な場合に音を再生します",
"settings.general.sounds.permissions.title": "権限",
"settings.general.sounds.permissions.description": "権限が必要な場合に音を再生します",
"settings.general.sounds.errors.title": "エラー",
"settings.general.sounds.errors.description": "エラーが発生した場合に音を再生します",
"settings.shortcuts.title": "キーボードショートカット",
"settings.shortcuts.reset.button": "デフォルトにリセット",
"settings.shortcuts.reset.toast.title": "ショートカットをリセットしました",
@@ -616,14 +628,12 @@ export const dict = {
"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.modelAndAgent": "モデルとエージェント",
"settings.shortcuts.group.terminal": "ターミナル",
"settings.shortcuts.group.prompt": "プロンプト",
"settings.providers.title": "プロバイダー",
"settings.providers.description": "プロバイダー設定はここで構成できます。",
"settings.providers.section.connected": "接続済みプロバイダー",
@@ -641,16 +651,13 @@ export const dict = {
"settings.commands.description": "コマンド設定はここで構成できます。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP設定はここで構成できます。",
"settings.permissions.title": "権限",
"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.tool.read.title": "読み込み",
"settings.permissions.tool.read.description": "ファイルの読み込み (ファイルパスに一致)",
"settings.permissions.tool.edit.title": "編集",
@@ -673,22 +680,20 @@ export const dict = {
"settings.permissions.tool.todoread.description": "Todoリストの読み込み",
"settings.permissions.tool.todowrite.title": "Todo書き込み",
"settings.permissions.tool.todowrite.description": "Todoリストの更新",
"settings.permissions.tool.webfetch.title": "Web Fetch",
"settings.permissions.tool.webfetch.title": "Web取得",
"settings.permissions.tool.webfetch.description": "URLからコンテンツを取得",
"settings.permissions.tool.websearch.title": "Web Search",
"settings.permissions.tool.websearch.title": "Web検索",
"settings.permissions.tool.websearch.description": "ウェブを検索",
"settings.permissions.tool.codesearch.title": "Code Search",
"settings.permissions.tool.codesearch.title": "コード検索",
"settings.permissions.tool.codesearch.description": "ウェブ上のコードを検索",
"settings.permissions.tool.external_directory.title": "外部ディレクトリ",
"settings.permissions.tool.external_directory.description": "プロジェクトディレクトリ外のファイルへのアクセス",
"settings.permissions.tool.doom_loop.title": "Doom Loop",
"settings.permissions.tool.doom_loop.title": "無限ループ",
"settings.permissions.tool.doom_loop.description": "同一入力による繰り返しのツール呼び出しを検出",
"session.delete.failed.title": "セッションの削除に失敗しました",
"session.delete.title": "セッションの削除",
"session.delete.confirm": 'セッション "{{name}}" を削除しますか?',
"session.delete.button": "セッションを削除",
"workspace.new": "新しいワークスペース",
"workspace.type.local": "ローカル",
"workspace.type.sandbox": "サンドボックス",

View File

@@ -19,12 +19,10 @@ export const dict = {
"command.category.agent": "에이전트",
"command.category.permissions": "권한",
"command.category.workspace": "작업 공간",
"command.category.settings": "설정",
"theme.scheme.system": "시스템",
"theme.scheme.light": "라이트",
"theme.scheme.dark": "다크",
"command.sidebar.toggle": "사이드바 토글",
"command.project.open": "프로젝트 열기",
"command.provider.connect": "공급자 연결",
@@ -35,17 +33,13 @@ export const dict = {
"command.session.previous.unseen": "이전 읽지 않은 세션",
"command.session.next.unseen": "다음 읽지 않은 세션",
"command.session.archive": "세션 보관",
"command.palette": "명령 팔레트",
"command.theme.cycle": "테마 순환",
"command.theme.set": "테마 사용: {{theme}}",
"command.theme.scheme.cycle": "색상 테마 순환",
"command.theme.scheme.set": "색상 테마 사용: {{scheme}}",
"command.language.cycle": "언어 순환",
"command.language.set": "언어 사용: {{language}}",
"command.session.new": "새 세션",
"command.file.open": "파일 열기",
"command.tab.close": "탭 닫기",
@@ -76,6 +70,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "편집 자동 수락",
"command.permissions.autoaccept.disable": "편집 자동 수락 중지",
"command.workspace.toggle": "작업 공간 전환",
"command.workspace.toggle.description": "사이드바에서 다중 작업 공간 활성화 또는 비활성화",
"command.session.undo": "실행 취소",
"command.session.undo.description": "마지막 메시지 실행 취소",
"command.session.redo": "다시 실행",
@@ -88,32 +83,30 @@ export const dict = {
"command.session.share.description": "이 세션을 공유하고 URL을 클립보드에 복사",
"command.session.unshare": "세션 공유 중지",
"command.session.unshare.description": "이 세션 공유 중지",
"palette.search.placeholder": "파일, 명령어 및 세션 검색",
"palette.empty": "결과 없음",
"palette.group.commands": "명령어",
"palette.group.files": "파일",
"dialog.provider.search.placeholder": "공급자 검색",
"dialog.provider.empty": "공급자 없음",
"dialog.provider.group.popular": "인기",
"dialog.provider.group.other": "기타",
"dialog.provider.tag.recommended": "추천",
"dialog.provider.opencode.note": "Claude, GPT, Gemini 등을 포함한 엄선된 모델",
"dialog.provider.anthropic.note": "Claude Pro/Max 또는 API 키로 연결",
"dialog.provider.openai.note": "ChatGPT Pro/Plus 또는 API 키로 연결",
"dialog.provider.copilot.note": "Copilot 또는 API 키로 연결",
"dialog.provider.openai.note": "ChatGPT Pro/Plus 또는 API 키로 연결",
"dialog.provider.google.note": "빠르고 구조화된 응답을 위한 Gemini 모델",
"dialog.provider.openrouter.note": "모든 지원 모델을 단일 공급자에서 액세스",
"dialog.provider.vercel.note": "스마트 라우팅을 통한 AI 모델 통합 액세스",
"dialog.model.select.title": "모델 선택",
"dialog.model.search.placeholder": "모델 검색",
"dialog.model.empty": "모델 결과 없음",
"dialog.model.manage": "모델 관리",
"dialog.model.manage.description": "모델 선택기에 표시할 모델 사용자 지정",
"dialog.model.unpaid.freeModels.title": "OpenCode에서 제공하는 무료 모델",
"dialog.model.unpaid.addMore.title": "인기 공급자의 모델 추가",
"dialog.provider.viewAll": "더 많은 공급자 보기",
"provider.connect.title": "{{provider}} 연결",
"provider.connect.title.anthropicProMax": "Claude Pro/Max로 로그인",
"provider.connect.selectMethod": "{{provider}} 로그인 방법 선택",
@@ -129,10 +122,10 @@ export const dict = {
"provider.connect.opencodeZen.line1":
"OpenCode Zen은 코딩 에이전트를 위해 최적화된 신뢰할 수 있는 엄선된 모델에 대한 액세스를 제공합니다.",
"provider.connect.opencodeZen.line2": "단일 API 키로 Claude, GPT, Gemini, GLM 등 다양한 모델에 액세스할 수 있습니다.",
"provider.connect.opencodeZen.visit.prefix": "",
"provider.connect.opencodeZen.visit.prefix": "다음 ",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " 방문하여 API 키를 받으세요.",
"provider.connect.oauth.code.visit.prefix": "",
"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}} 모델을 사용하세요.",
@@ -140,19 +133,53 @@ export const dict = {
"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.prefix": "다음 ",
"provider.connect.oauth.auto.visit.link": "이 링크",
"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}} 모델을 사용할 수 있습니다.",
"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.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.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API 키",
"provider.custom.field.apiKey.placeholder": "API 키",
"provider.custom.field.apiKey.description": "선택 사항입니다. 헤더를 통해 인증을 관리하는 경우 비워 두세요.",
"provider.custom.models.label": "모델",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "이름",
"provider.custom.models.name.placeholder": "표시 이름",
"provider.custom.models.remove": "모델 제거",
"provider.custom.models.add": "모델 추가",
"provider.custom.headers.label": "헤더 (선택 사항)",
"provider.custom.headers.key.label": "헤더",
"provider.custom.headers.key.placeholder": "헤더 이름",
"provider.custom.headers.value.label": "값",
"provider.custom.headers.value.placeholder": "값",
"provider.custom.headers.remove": "헤더 제거",
"provider.custom.headers.add": "헤더 추가",
"provider.custom.error.providerID.required": "공급자 ID가 필요합니다",
"provider.custom.error.providerID.format": "소문자, 숫자, 하이픈 또는 밑줄을 사용하세요",
"provider.custom.error.providerID.exists": "해당 공급자 ID가 이미 존재합니다",
"provider.custom.error.name.required": "표시 이름이 필요합니다",
"provider.custom.error.baseURL.required": "기본 URL이 필요합니다",
"provider.custom.error.baseURL.format": "http:// 또는 https://로 시작해야 합니다",
"provider.custom.error.required": "필수",
"provider.custom.error.duplicate": "중복",
"provider.disconnect.toast.disconnected.title": "{{provider}} 연결 해제됨",
"provider.disconnect.toast.disconnected.description": "{{provider}} 모델을 더 이상 사용할 수 없습니다.",
"model.tag.free": "무료",
"model.tag.latest": "최신",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -169,6 +196,7 @@ export const dict = {
"model.tooltip.context": "컨텍스트 제한 {{limit}}",
"common.search.placeholder": "검색",
"common.goBack": "뒤로 가기",
"common.goForward": "앞으로 가기",
"common.loading": "로딩 중",
"common.loading.ellipsis": "...",
"common.cancel": "취소",
@@ -179,14 +207,12 @@ export const dict = {
"common.saving": "저장 중...",
"common.default": "기본값",
"common.attachment": "첨부 파일",
"prompt.placeholder.shell": "셸 명령어 입력...",
"prompt.placeholder.normal": '무엇이든 물어보세요... "{{example}}"',
"prompt.placeholder.summarizeComments": "댓글 요약…",
"prompt.placeholder.summarizeComment": "댓글 요약…",
"prompt.mode.shell": "셸",
"prompt.mode.shell.exit": "종료하려면 esc",
"prompt.example.1": "코드베이스의 TODO 수정",
"prompt.example.2": "이 프로젝트의 기술 스택이 무엇인가요?",
"prompt.example.3": "고장 난 테스트 수정",
@@ -212,7 +238,6 @@ export const dict = {
"prompt.example.23": "이 목록에 페이지네이션 추가",
"prompt.example.24": "...를 위한 CLI 명령어 생성",
"prompt.example.25": "여기서 환경 변수는 어떻게 작동하나요?",
"prompt.popover.emptyResults": "일치하는 결과 없음",
"prompt.popover.emptyCommands": "일치하는 명령어 없음",
"prompt.dropzone.label": "이미지나 PDF를 여기에 드롭하세요",
@@ -228,7 +253,6 @@ export const dict = {
"prompt.attachment.remove": "첨부 파일 제거",
"prompt.action.send": "전송",
"prompt.action.stop": "중지",
"prompt.toast.pasteUnsupported.title": "지원되지 않는 붙여넣기",
"prompt.toast.pasteUnsupported.description": "이미지나 PDF만 붙여넣을 수 있습니다.",
"prompt.toast.modelAgentRequired.title": "에이전트 및 모델 선택",
@@ -239,24 +263,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "명령 전송 실패",
"prompt.toast.promptSendFailed.title": "프롬프트 전송 실패",
"prompt.toast.promptSendFailed.description": "세션을 가져올 수 없습니다",
"dialog.mcp.title": "MCP",
"dialog.mcp.description": "{{total}}개 중 {{enabled}}개 활성화됨",
"dialog.mcp.empty": "구성된 MCP 없음",
"dialog.lsp.empty": "파일 유형에서 자동 감지된 LSP",
"dialog.plugins.empty": "opencode.json에 구성된 플러그인",
"mcp.status.connected": "연결됨",
"mcp.status.failed": "실패",
"mcp.status.needs_auth": "인증 필요",
"mcp.status.disabled": "비활성화됨",
"dialog.fork.empty": "분기할 메시지 없음",
"dialog.directory.search.placeholder": "폴더 검색",
"dialog.directory.empty": "폴더 없음",
"dialog.server.title": "서버",
"dialog.server.description": "이 앱이 연결할 OpenCode 서버를 전환합니다.",
"dialog.server.search.placeholder": "서버 검색",
@@ -274,14 +292,12 @@ export const dict = {
"dialog.server.default.set": "현재 서버를 기본값으로 설정",
"dialog.server.default.clear": "지우기",
"dialog.server.action.remove": "서버 제거",
"dialog.server.menu.edit": "편집",
"dialog.server.menu.default": "기본값으로 설정",
"dialog.server.menu.defaultRemove": "기본값 제거",
"dialog.server.menu.delete": "삭제",
"dialog.server.current": "현재 서버",
"dialog.server.status.default": "기본값",
"dialog.project.edit.title": "프로젝트 편집",
"dialog.project.edit.name": "이름",
"dialog.project.edit.icon": "아이콘",
@@ -290,7 +306,6 @@ 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.description": "새 작업 공간(작업 트리)을 만든 뒤 실행됩니다.",
"dialog.project.edit.worktree.startup.placeholder": "예: bun install",
@@ -301,10 +316,8 @@ export const dict = {
"context.breakdown.assistant": "어시스턴트",
"context.breakdown.tool": "도구 호출",
"context.breakdown.other": "기타",
"context.systemPrompt.title": "시스템 프롬프트",
"context.rawMessages.title": "원시 메시지",
"context.stats.session": "세션",
"context.stats.messages": "메시지",
"context.stats.provider": "공급자",
@@ -321,34 +334,42 @@ export const dict = {
"context.stats.totalCost": "총 비용",
"context.stats.sessionCreated": "세션 생성됨",
"context.stats.lastActivity": "최근 활동",
"context.usage.tokens": "토큰",
"context.usage.usage": "사용량",
"context.usage.cost": "비용",
"context.usage.clickToView": "컨텍스트를 보려면 클릭",
"context.usage.view": "컨텍스트 사용량 보기",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "언어",
"toast.language.description": "{{language}}(으)로 전환됨",
"toast.theme.title": "테마 전환됨",
"toast.scheme.title": "색상 테마",
"toast.permissions.autoaccept.on.title": "편집 자동 수락 중",
"toast.permissions.autoaccept.on.description": "편집 및 쓰기 권한이 자동으로 승인됩니다",
"toast.permissions.autoaccept.off.title": "편집 자동 수락 중지됨",
"toast.permissions.autoaccept.off.description": "편집 및 쓰기 권한 승인이 필요합니다",
"toast.workspace.enabled.title": "작업 공간 활성화됨",
"toast.workspace.enabled.description": "이제 사이드바에 여러 작업 트리가 표시됩니다",
"toast.workspace.disabled.title": "작업 공간 비활성화됨",
"toast.workspace.disabled.description": "사이드바에 메인 작업 트리만 표시됩니다",
"toast.permissions.autoaccept.on.title": "편집 자동 수락 중",
"toast.permissions.autoaccept.on.description": "편집 및 쓰기 권한이 자동으로 승인됩니다",
"toast.permissions.autoaccept.off.title": "편집 자동 수락 중지됨",
"toast.permissions.autoaccept.off.description": "편집 및 쓰기 권한 승인이 필요합니다",
"toast.model.none.title": "선택된 모델 없음",
"toast.model.none.description": "이 세션을 요약하려면 공급자를 연결하세요",
"toast.file.loadFailed.title": "파일 로드 실패",
"toast.file.listFailed.title": "파일 목록을 불러오지 못했습니다",
"toast.context.noLineSelection.title": "줄 선택 없음",
"toast.context.noLineSelection.description": "먼저 파일 탭에서 줄 범위를 선택하세요.",
@@ -357,19 +378,15 @@ export const dict = {
"toast.session.share.success.description": "공유 URL이 클립보드에 복사되었습니다!",
"toast.session.share.failed.title": "세션 공유 실패",
"toast.session.share.failed.description": "세션을 공유하는 동안 오류가 발생했습니다",
"toast.session.unshare.success.title": "세션 공유 해제됨",
"toast.session.unshare.success.description": "세션 공유가 성공적으로 해제되었습니다!",
"toast.session.unshare.failed.title": "세션 공유 해제 실패",
"toast.session.unshare.failed.description": "세션 공유를 해제하는 동안 오류가 발생했습니다",
"toast.session.listFailed.title": "{{project}}에 대한 세션을 로드하지 못했습니다",
"toast.update.title": "업데이트 가능",
"toast.update.description": "OpenCode의 새 버전({{version}})을 설치할 수 있습니다.",
"toast.update.action.installRestart": "설치 및 다시 시작",
"toast.update.action.notYet": "나중에",
"error.page.title": "문제가 발생했습니다",
"error.page.description": "애플리케이션을 로드하는 동안 오류가 발생했습니다.",
"error.page.details.label": "오류 세부 정보",
@@ -380,12 +397,10 @@ export const dict = {
"error.page.report.prefix": "이 오류를 OpenCode 팀에 제보해 주세요: ",
"error.page.report.discord": "Discord",
"error.page.version": "버전: {{version}}",
"error.dev.rootNotFound":
"루트 요소를 찾을 수 없습니다. index.html에 추가하는 것을 잊으셨나요? 또는 id 속성의 철자가 틀렸을 수 있습니다.",
"error.globalSync.connectFailed": "서버에 연결할 수 없습니다. `{{url}}`에서 서버가 실행 중인가요?",
"directory.error.invalidUrl": "URL에 유효하지 않은 디렉터리가 있습니다.",
"error.chain.unknown": "알 수 없는 오류",
"error.chain.causedBy": "원인:",
"error.chain.apiError": "API 오류",
@@ -405,21 +420,17 @@ export const dict = {
"error.chain.configFrontmatterError": "{{path}}의 frontmatter 파싱 실패:\n{{message}}",
"error.chain.configInvalid": "{{path}}의 구성 파일이 유효하지 않습니다",
"error.chain.configInvalidWithMessage": "{{path}}의 구성 파일이 유효하지 않습니다: {{message}}",
"notification.permission.title": "권한 필요",
"notification.permission.description": "{{projectName}}의 {{sessionTitle}}에서 권한이 필요합니다",
"notification.question.title": "질문",
"notification.question.description": "{{projectName}}의 {{sessionTitle}}에서 질문이 있습니다",
"notification.action.goToSession": "세션으로 이동",
"notification.session.responseReady.title": "응답 준비됨",
"notification.session.error.title": "세션 오류",
"notification.session.error.fallbackDescription": "오류가 발생했습니다",
"home.recentProjects": "최근 프로젝트",
"home.empty.title": "최근 프로젝트 없음",
"home.empty.description": "로컬 프로젝트를 열어 시작하세요",
"session.tab.session": "세션",
"session.tab.review": "검토",
"session.tab.context": "컨텍스트",
@@ -437,18 +448,19 @@ export const dict = {
"session.messages.loadingEarlier": "이전 메시지 로드 중...",
"session.messages.loadEarlier": "이전 메시지 로드",
"session.messages.loading": "메시지 로드 중...",
"session.messages.jumpToLatest": "최신으로 이동",
"session.context.addToContext": "컨텍스트에 {{selection}} 추가",
"session.new.worktree.main": "메인 브랜치",
"session.new.worktree.mainWithBranch": "메인 브랜치 ({{branch}})",
"session.new.worktree.create": "새 작업 트리 생성",
"session.new.lastModified": "최근 수정",
"session.header.search.placeholder": "{{project}} 검색",
"session.header.searchFiles": "파일 검색",
"session.header.openIn": "다음에서 열기",
"session.header.open.action": "{{app}} 열기",
"session.header.open.ariaLabel": "{{app}}에서 열기",
"session.header.open.menu": "열기 옵션",
"session.header.open.copyPath": "경로 복사",
"status.popover.trigger": "상태",
"status.popover.ariaLabel": "서버 구성",
"status.popover.tab.servers": "서버",
@@ -456,7 +468,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "플러그인",
"status.popover.action.manageServers": "서버 관리",
"session.share.popover.title": "웹에 게시",
"session.share.popover.description.shared": "이 세션은 웹에 공개되었습니다. 링크가 있는 누구나 액세스할 수 있습니다.",
"session.share.popover.description.unshared":
@@ -469,16 +480,13 @@ export const dict = {
"session.share.action.view": "보기",
"session.share.copy.copied": "복사됨",
"session.share.copy.copyLink": "링크 복사",
"lsp.tooltip.none": "LSP 서버 없음",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "프롬프트 로드 중...",
"terminal.loading": "터미널 로드 중...",
"terminal.title": "터미널",
"terminal.title.numbered": "터미널 {{number}}",
"terminal.close": "터미널 닫기",
"terminal.connectionLost.title": "연결 끊김",
"terminal.connectionLost.description":
"터미널 연결이 중단되었습니다. 서버가 재시작하면 이런 일이 발생할 수 있습니다.",
@@ -494,7 +502,6 @@ export const dict = {
"common.close": "닫기",
"common.edit": "편집",
"common.loadMore": "더 불러오기",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "메뉴 토글",
"sidebar.nav.projectsAndSessions": "프로젝트 및 세션",
@@ -507,18 +514,19 @@ export const dict = {
"sidebar.gettingStarted.line2": "Claude, GPT, Gemini 등을 포함한 모델을 사용하려면 공급자를 연결하세요.",
"sidebar.project.recentSessions": "최근 세션",
"sidebar.project.viewAllSessions": "모든 세션 보기",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "데스크톱",
"settings.section.server": "서버",
"settings.tab.general": "일반",
"settings.tab.shortcuts": "단축키",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL 통합",
"settings.desktop.wsl.description": "Windows의 WSL 내부에서 OpenCode 서버를 실행합니다.",
"settings.general.section.appearance": "모양",
"settings.general.section.notifications": "시스템 알림",
"settings.general.section.updates": "업데이트",
"settings.general.section.sounds": "효과음",
"settings.general.section.display": "디스플레이",
"settings.general.row.language.title": "언어",
"settings.general.row.language.description": "OpenCode 표시 언어 변경",
"settings.general.row.appearance.title": "모양",
@@ -527,10 +535,12 @@ export const dict = {
"settings.general.row.theme.description": "OpenCode 테마 사용자 지정",
"settings.general.row.font.title": "글꼴",
"settings.general.row.font.description": "코드 블록에 사용되는 고정폭 글꼴 사용자 지정",
"settings.general.row.wayland.title": "네이티브 Wayland 사용",
"settings.general.row.wayland.description": "Wayland에서 X11 폴백을 비활성화합니다. 다시 시작해야 합니다.",
"settings.general.row.wayland.tooltip":
"혼합 주사율 모니터가 있는 Linux에서는 네이티브 Wayland가 더 안정적일 수 있습니다.",
"settings.general.row.releaseNotes.title": "릴리스 노트",
"settings.general.row.releaseNotes.description": "업데이트 후 '새 소식' 팝업 표시",
"settings.updates.row.startup.title": "시작 시 업데이트 확인",
"settings.updates.row.startup.description": "OpenCode를 실행할 때 업데이트를 자동으로 확인합니다",
"settings.updates.row.check.title": "업데이트 확인",
@@ -539,7 +549,6 @@ export const dict = {
"settings.updates.action.checking": "확인 중...",
"settings.updates.toast.latest.title": "최신 상태입니다",
"settings.updates.toast.latest.description": "현재 최신 버전의 OpenCode를 사용 중입니다.",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -603,14 +612,12 @@ export const dict = {
"settings.general.notifications.permissions.description": "권한이 필요할 때 시스템 알림 표시",
"settings.general.notifications.errors.title": "오류",
"settings.general.notifications.errors.description": "오류가 발생했을 때 시스템 알림 표시",
"settings.general.sounds.agent.title": "에이전트",
"settings.general.sounds.agent.description": "에이전트가 완료되거나 주의가 필요할 때 소리 재생",
"settings.general.sounds.permissions.title": "권한",
"settings.general.sounds.permissions.description": "권한이 필요할 때 소리 재생",
"settings.general.sounds.errors.title": "오류",
"settings.general.sounds.errors.description": "오류가 발생했을 때 소리 재생",
"settings.shortcuts.title": "키보드 단축키",
"settings.shortcuts.reset.button": "기본값으로 초기화",
"settings.shortcuts.reset.toast.title": "단축키 초기화됨",
@@ -621,14 +628,12 @@ export const dict = {
"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.modelAndAgent": "모델 및 에이전트",
"settings.shortcuts.group.terminal": "터미널",
"settings.shortcuts.group.prompt": "프롬프트",
"settings.providers.title": "공급자",
"settings.providers.description": "공급자 설정은 여기서 구성할 수 있습니다.",
"settings.providers.section.connected": "연결된 공급자",
@@ -646,16 +651,13 @@ export const dict = {
"settings.commands.description": "명령어 설정은 여기서 구성할 수 있습니다.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 설정은 여기서 구성할 수 있습니다.",
"settings.permissions.title": "권한",
"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.tool.read.title": "읽기",
"settings.permissions.tool.read.description": "파일 읽기 (파일 경로와 일치)",
"settings.permissions.tool.edit.title": "편집",
@@ -688,12 +690,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "프로젝트 디렉터리 외부의 파일에 액세스",
"settings.permissions.tool.doom_loop.title": "무한 반복",
"settings.permissions.tool.doom_loop.description": "동일한 입력으로 반복되는 도구 호출 감지",
"session.delete.failed.title": "세션 삭제 실패",
"session.delete.title": "세션 삭제",
"session.delete.confirm": '"{{name}}" 세션을 삭제하시겠습니까?',
"session.delete.button": "세션 삭제",
"workspace.new": "새 작업 공간",
"workspace.type.local": "로컬",
"workspace.type.sandbox": "샌드박스",

View File

@@ -75,6 +75,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Godta endringer automatisk",
"command.permissions.autoaccept.disable": "Slutt å godta endringer automatisk",
"command.workspace.toggle": "Veksle arbeidsområder",
"command.workspace.toggle.description": "Enable or disable multiple workspaces in the sidebar",
"command.session.undo": "Angre",
"command.session.undo.description": "Angre siste melding",
"command.session.redo": "Gjør om",
@@ -98,9 +99,13 @@ export const dict = {
"dialog.provider.group.popular": "Populære",
"dialog.provider.group.other": "Andre",
"dialog.provider.tag.recommended": "Anbefalt",
"dialog.provider.anthropic.note": "Koble til med Claude Pro/Max eller API-nøkkel",
"dialog.provider.openai.note": "Koble til med ChatGPT Pro/Plus eller API-nøkkel",
"dialog.provider.copilot.note": "Koble til med Copilot eller API-nøkkel",
"dialog.provider.opencode.note": "Utvalgte modeller inkludert Claude, GPT, Gemini og mer",
"dialog.provider.anthropic.note": "Direkte tilgang til Claude-modeller, inkludert Pro og Max",
"dialog.provider.copilot.note": "Claude-modeller for kodeassistanse",
"dialog.provider.openai.note": "GPT-modeller for raske, dyktige generelle AI-oppgaver",
"dialog.provider.google.note": "Gemini-modeller for raske, strukturerte svar",
"dialog.provider.openrouter.note": "Tilgang til alle støttede modeller fra én leverandør",
"dialog.provider.vercel.note": "Enhetlig tilgang til AI-modeller med smart ruting",
"dialog.model.select.title": "Velg modell",
"dialog.model.search.placeholder": "Søk etter modeller",
@@ -148,8 +153,46 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} tilkoblet",
"provider.connect.toast.connected.description": "{{provider}}-modeller er nå tilgjengelige.",
"provider.custom.title": "Egendefinert leverandør",
"provider.custom.description.prefix": "Konfigurer en OpenAI-kompatibel leverandør. Se ",
"provider.custom.description.link": "dokumentasjon for leverandørkonfigurasjon",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "Leverandør-ID",
"provider.custom.field.providerID.placeholder": "minleverandør",
"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.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.models.label": "Modeller",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "modell-id",
"provider.custom.models.name.label": "Navn",
"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.value.label": "Verdi",
"provider.custom.headers.value.placeholder": "verdi",
"provider.custom.headers.remove": "Fjern header",
"provider.custom.headers.add": "Legg til header",
"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.name.required": "Visningsnavn er påkrevd",
"provider.custom.error.baseURL.required": "Base-URL er påkrevd",
"provider.custom.error.baseURL.format": "Må starte med http:// eller https://",
"provider.custom.error.required": "Påkrevd",
"provider.custom.error.duplicate": "Duplikat",
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke lenger tilgjengelige.",
"model.tag.free": "Gratis",
"model.tag.latest": "Nyeste",
"model.provider.anthropic": "Anthropic",
@@ -169,6 +212,7 @@ export const dict = {
"common.search.placeholder": "Søk",
"common.goBack": "Gå tilbake",
"common.goForward": "Navigate forward",
"common.loading": "Laster",
"common.loading.ellipsis": "...",
"common.cancel": "Avbryt",
@@ -290,10 +334,10 @@ export const dict = {
"dialog.project.edit.icon.recommended": "Anbefalt: 128x128px",
"dialog.project.edit.color": "Farge",
"dialog.project.edit.color.select": "Velg fargen {{color}}",
"dialog.project.edit.worktree.startup": "Oppstartsskript for arbeidsområde",
"dialog.project.edit.worktree.startup.description": "Kjører etter at et nytt arbeidsområde (worktree) er opprettet.",
"dialog.project.edit.worktree.startup.placeholder": "f.eks. bun install",
"context.breakdown.title": "Kontekstfordeling",
"context.breakdown.note": 'Omtrentlig fordeling av input-tokens. "Annet" inkluderer verktøydefinisjoner og overhead.',
"context.breakdown.system": "System",
@@ -328,30 +372,48 @@ export const dict = {
"context.usage.clickToView": "Klikk for å se kontekst",
"context.usage.view": "Se kontekstforbruk",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Språk",
"toast.language.description": "Byttet til {{language}}",
"toast.theme.title": "Tema byttet",
"toast.scheme.title": "Fargevalg",
"toast.permissions.autoaccept.on.title": "Godtar endringer automatisk",
"toast.permissions.autoaccept.on.description": "Redigerings- og skrivetillatelser vil bli godkjent automatisk",
"toast.permissions.autoaccept.off.title": "Sluttet å godta endringer automatisk",
"toast.permissions.autoaccept.off.description": "Redigerings- og skrivetillatelser vil kreve godkjenning",
"toast.workspace.enabled.title": "Arbeidsområder aktivert",
"toast.workspace.enabled.description": "Flere worktrees vises nå i sidefeltet",
"toast.workspace.disabled.title": "Arbeidsområder deaktivert",
"toast.workspace.disabled.description": "Kun hoved-worktree vises i sidefeltet",
"toast.permissions.autoaccept.on.title": "Godtar endringer automatisk",
"toast.permissions.autoaccept.on.description": "Redigerings- og skrivetillatelser vil bli godkjent automatisk",
"toast.permissions.autoaccept.off.title": "Sluttet å godta endringer automatisk",
"toast.permissions.autoaccept.off.description": "Redigerings- og skrivetillatelser vil kreve godkjenning",
"toast.model.none.title": "Ingen modell valgt",
"toast.model.none.description": "Koble til en leverandør for å oppsummere denne sesjonen",
"toast.file.loadFailed.title": "Kunne ikke laste fil",
"toast.file.listFailed.title": "Kunne ikke liste filer",
"toast.context.noLineSelection.title": "Ingen linjevalg",
"toast.context.noLineSelection.description": "Velg først et linjeområde i en filfane.",
"toast.session.share.copyFailed.title": "Kunne ikke kopiere URL til utklippstavlen",
"toast.session.share.success.title": "Sesjon delt",
"toast.session.share.success.description": "Delings-URL kopiert til utklippstavlen!",
@@ -385,6 +447,7 @@ export const dict = {
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributten er feilstavet?",
"error.globalSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?",
"directory.error.invalidUrl": "Invalid directory in URL.",
"error.chain.unknown": "Ukjent feil",
"error.chain.causedBy": "Forårsaket av:",
@@ -431,9 +494,11 @@ export const dict = {
"session.review.loadingChanges": "Laster endringer...",
"session.review.empty": "Ingen endringer i denne sesjonen ennå",
"session.review.noChanges": "Ingen endringer",
"session.files.selectToOpen": "Velg en fil å åpne",
"session.files.all": "Alle filer",
"session.files.binaryContent": "Binær fil (innhold kan ikke vises)",
"session.messages.renderEarlier": "Vis tidligere meldinger",
"session.messages.loadingEarlier": "Laster inn tidligere meldinger...",
"session.messages.loadEarlier": "Last inn tidligere meldinger",
@@ -449,6 +514,11 @@ export const dict = {
"session.header.search.placeholder": "Søk i {{project}}",
"session.header.searchFiles": "Søk etter filer",
"session.header.openIn": "Åpne i",
"session.header.open.action": "Åpne {{app}}",
"session.header.open.ariaLabel": "Åpne i {{app}}",
"session.header.open.menu": "Åpne alternativer",
"session.header.open.copyPath": "Kopier bane",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Serverkonfigurasjoner",
@@ -511,15 +581,20 @@ export const dict = {
"sidebar.project.viewAllSessions": "Vis alle sesjoner",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Skrivebord",
"settings.section.server": "Server",
"settings.tab.general": "Generelt",
"settings.tab.shortcuts": "Snarveier",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL-integrasjon",
"settings.desktop.wsl.description": "Kjør OpenCode-serveren i WSL på Windows.",
"settings.general.section.appearance": "Utseende",
"settings.general.section.notifications": "Systemvarsler",
"settings.general.section.updates": "Oppdateringer",
"settings.general.section.sounds": "Lydeffekter",
"settings.general.section.display": "Skjerm",
"settings.general.row.language.title": "Språk",
"settings.general.row.language.description": "Endre visningsspråket for OpenCode",
@@ -530,6 +605,11 @@ export const dict = {
"settings.general.row.font.title": "Skrift",
"settings.general.row.font.description": "Tilpass mono-skriften som brukes i kodeblokker",
"settings.general.row.wayland.title": "Bruk innebygd Wayland",
"settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Krever omstart.",
"settings.general.row.wayland.tooltip":
"På Linux med skjermer med blandet oppdateringsfrekvens kan innebygd Wayland være mer stabilt.",
"settings.general.row.releaseNotes.title": "Utgivelsesnotater",
"settings.general.row.releaseNotes.description": 'Vis "Hva er nytt"-vinduer etter oppdateringer',
@@ -541,7 +621,6 @@ export const dict = {
"settings.updates.action.checking": "Sjekker...",
"settings.updates.toast.latest.title": "Du er oppdatert",
"settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av OpenCode.",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",
@@ -599,6 +678,7 @@ export const dict = {
"sound.option.yup04": "Ja 04",
"sound.option.yup05": "Ja 05",
"sound.option.yup06": "Ja 06",
"settings.general.notifications.agent.title": "Agent",
"settings.general.notifications.agent.description":
"Vis systemvarsel når agenten er ferdig eller trenger oppmerksomhet",
@@ -697,6 +777,7 @@ export const dict = {
"session.delete.title": "Slett sesjon",
"session.delete.confirm": 'Slette sesjonen "{{name}}"?',
"session.delete.button": "Slett sesjon",
"workspace.new": "Nytt arbeidsområde",
"workspace.type.local": "lokal",
"workspace.type.sandbox": "sandkasse",

View File

@@ -16,11 +16,9 @@ export const dict = {
"command.category.permissions": "Uprawnienia",
"command.category.workspace": "Przestrzeń robocza",
"command.category.settings": "Ustawienia",
"theme.scheme.system": "Systemowy",
"theme.scheme.light": "Jasny",
"theme.scheme.dark": "Ciemny",
"command.sidebar.toggle": "Przełącz pasek boczny",
"command.project.open": "Otwórz projekt",
"command.provider.connect": "Połącz dostawcę",
@@ -31,17 +29,13 @@ export const dict = {
"command.session.previous.unseen": "Poprzednia nieprzeczytana sesja",
"command.session.next.unseen": "Następna nieprzeczytana sesja",
"command.session.archive": "Zarchiwizuj sesję",
"command.palette": "Paleta poleceń",
"command.theme.cycle": "Przełącz motyw",
"command.theme.set": "Użyj motywu: {{theme}}",
"command.theme.scheme.cycle": "Przełącz schemat kolorów",
"command.theme.scheme.set": "Użyj schematu kolorów: {{scheme}}",
"command.language.cycle": "Przełącz język",
"command.language.set": "Użyj języka: {{language}}",
"command.session.new": "Nowa sesja",
"command.file.open": "Otwórz plik",
"command.tab.close": "Zamknij kartę",
@@ -72,6 +66,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Automatyczne akceptowanie edycji",
"command.permissions.autoaccept.disable": "Zatrzymaj automatyczne akceptowanie edycji",
"command.workspace.toggle": "Przełącz przestrzenie robocze",
"command.workspace.toggle.description": "Włącz lub wyłącz wiele przestrzeni roboczych na pasku bocznym",
"command.session.undo": "Cofnij",
"command.session.undo.description": "Cofnij ostatnią wiadomość",
"command.session.redo": "Ponów",
@@ -84,32 +79,30 @@ export const dict = {
"command.session.share.description": "Udostępnij tę sesję i skopiuj 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",
"palette.empty": "Brak wyników",
"palette.group.commands": "Polecenia",
"palette.group.files": "Pliki",
"dialog.provider.search.placeholder": "Szukaj dostawców",
"dialog.provider.empty": "Nie znaleziono dostawców",
"dialog.provider.group.popular": "Popularne",
"dialog.provider.group.other": "Inne",
"dialog.provider.tag.recommended": "Zalecane",
"dialog.provider.anthropic.note": "Połącz z Claude Pro/Max lub kluczem API",
"dialog.provider.openai.note": "Połącz z ChatGPT Pro/Plus lub kluczem API",
"dialog.provider.copilot.note": "Połącz z Copilot lub kluczem API",
"dialog.provider.opencode.note": "Wyselekcjonowane modele, w tym Claude, GPT, Gemini i inne",
"dialog.provider.anthropic.note": "Bezpośredni dostęp do modeli Claude, w tym Pro i Max",
"dialog.provider.copilot.note": "Modele Claude do pomocy w kodowaniu",
"dialog.provider.openai.note": "Modele GPT do szybkich i wszechstronnych zadań AI",
"dialog.provider.google.note": "Modele Gemini do szybkich i ustrukturyzowanych odpowiedzi",
"dialog.provider.openrouter.note": "Dostęp do wszystkich obsługiwanych modeli od jednego dostawcy",
"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.manage": "Zarządzaj modelami",
"dialog.model.manage.description": "Dostosuj, które modele pojawiają się w wyborze modelu.",
"dialog.model.unpaid.freeModels.title": "Darmowe modele dostarczane przez OpenCode",
"dialog.model.unpaid.addMore.title": "Dodaj więcej modeli od popularnych 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.selectMethod": "Wybierz metodę logowania dla {{provider}}.",
@@ -144,7 +137,43 @@ export const dict = {
"provider.connect.oauth.auto.confirmationCode": "Kod potwierdzający",
"provider.connect.toast.connected.title": "Połączono {{provider}}",
"provider.connect.toast.connected.description": "Modele {{provider}} są teraz dostępne do użycia.",
"provider.custom.title": "Dostawca niestandardowy",
"provider.custom.description.prefix": "Skonfiguruj dostawcę zgodnego z OpenAI. Zobacz ",
"provider.custom.description.link": "dokumentację konfiguracji dostawcy",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "ID dostawcy",
"provider.custom.field.providerID.placeholder": "mojdostawca",
"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.placeholder": "https://api.mojdostawca.com/v1",
"provider.custom.field.apiKey.label": "Klucz API",
"provider.custom.field.apiKey.placeholder": "Klucz API",
"provider.custom.field.apiKey.description":
"Opcjonalne. Pozostaw puste, jeśli zarządzasz autoryzacją przez nagłówki.",
"provider.custom.models.label": "Modele",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Nazwa",
"provider.custom.models.name.placeholder": "Nazwa wyświetlana",
"provider.custom.models.remove": "Usuń model",
"provider.custom.models.add": "Dodaj model",
"provider.custom.headers.label": "Nagłówki (opcjonalne)",
"provider.custom.headers.key.label": "Nagłówek",
"provider.custom.headers.key.placeholder": "Nazwa-Naglowka",
"provider.custom.headers.value.label": "Wartość",
"provider.custom.headers.value.placeholder": "wartość",
"provider.custom.headers.remove": "Usuń nagłówek",
"provider.custom.headers.add": "Dodaj nagłówek",
"provider.custom.error.providerID.required": "ID dostawcy jest wymagane",
"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.format": "Musi zaczynać się od http:// lub https://",
"provider.custom.error.required": "Wymagane",
"provider.custom.error.duplicate": "Duplikat",
"provider.disconnect.toast.disconnected.title": "Rozłączono {{provider}}",
"provider.disconnect.toast.disconnected.description": "Modele {{provider}} nie są już dostępne.",
"model.tag.free": "Darmowy",
@@ -163,9 +192,9 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Obsługuje wnioskowanie",
"model.tooltip.reasoning.none": "Brak wnioskowania",
"model.tooltip.context": "Limit kontekstu {{limit}}",
"common.search.placeholder": "Szukaj",
"common.goBack": "Wstecz",
"common.goForward": "Dalej",
"common.loading": "Ładowanie",
"common.loading.ellipsis": "...",
"common.cancel": "Anuluj",
@@ -176,14 +205,12 @@ export const dict = {
"common.saving": "Zapisywanie...",
"common.default": "Domyślny",
"common.attachment": "załącznik",
"prompt.placeholder.shell": "Wpisz polecenie terminala...",
"prompt.placeholder.normal": 'Zapytaj o cokolwiek... "{{example}}"',
"prompt.placeholder.summarizeComments": "Podsumuj komentarze…",
"prompt.placeholder.summarizeComment": "Podsumuj komentarz…",
"prompt.mode.shell": "Terminal",
"prompt.mode.shell.exit": "esc aby wyjść",
"prompt.example.1": "Napraw TODO w bazie kodu",
"prompt.example.2": "Jaki jest stos technologiczny tego projektu?",
"prompt.example.3": "Napraw zepsute testy",
@@ -209,7 +236,6 @@ export const dict = {
"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ść obrazy lub pliki PDF tutaj",
@@ -225,7 +251,6 @@ export const dict = {
"prompt.attachment.remove": "Usuń załącznik",
"prompt.action.send": "Wyślij",
"prompt.action.stop": "Zatrzymaj",
"prompt.toast.pasteUnsupported.title": "Nieobsługiwane wklejanie",
"prompt.toast.pasteUnsupported.description": "Tylko obrazy lub pliki PDF mogą być tutaj wklejane.",
"prompt.toast.modelAgentRequired.title": "Wybierz agenta i model",
@@ -236,24 +261,18 @@ export const dict = {
"prompt.toast.commandSendFailed.title": "Nie udało się wysłać polecenia",
"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.empty": "Brak skonfigurowanych MCP",
"dialog.lsp.empty": "LSP wykryte automatycznie na podstawie typów plików",
"dialog.plugins.empty": "Wtyczki skonfigurowane w opencode.json",
"mcp.status.connected": "połączono",
"mcp.status.failed": "niepowodzenie",
"mcp.status.needs_auth": "wymaga autoryzacji",
"mcp.status.disabled": "wyłączone",
"dialog.fork.empty": "Brak wiadomości do rozwidlenia",
"dialog.directory.search.placeholder": "Szukaj folderów",
"dialog.directory.empty": "Nie znaleziono folderów",
"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",
@@ -271,14 +290,12 @@ export const dict = {
"dialog.server.default.set": "Ustaw bieżący serwer jako domyślny",
"dialog.server.default.clear": "Wyczyść",
"dialog.server.action.remove": "Usuń serwer",
"dialog.server.menu.edit": "Edytuj",
"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.status.default": "Domyślny",
"dialog.project.edit.title": "Edytuj projekt",
"dialog.project.edit.name": "Nazwa",
"dialog.project.edit.icon": "Ikona",
@@ -287,10 +304,8 @@ export const dict = {
"dialog.project.edit.icon.recommended": "Zalecane: 128x128px",
"dialog.project.edit.color": "Kolor",
"dialog.project.edit.color.select": "Wybierz kolor {{color}}",
"dialog.project.edit.worktree.startup": "Skrypt uruchamiania przestrzeni roboczej",
"dialog.project.edit.worktree.startup.description":
"Uruchamiany po utworzeniu nowej przestrzeni roboczej (drzewa roboczego).",
"dialog.project.edit.worktree.startup.description": "Runs after creating a new workspace (worktree).",
"dialog.project.edit.worktree.startup.placeholder": "np. bun install",
"context.breakdown.title": "Podział kontekstu",
"context.breakdown.note": 'Przybliżony podział tokenów wejściowych. "Inne" obejmuje definicje narzędzi i narzut.',
@@ -299,10 +314,8 @@ export const dict = {
"context.breakdown.assistant": "Asystent",
"context.breakdown.tool": "Wywołania narzędzi",
"context.breakdown.other": "Inne",
"context.systemPrompt.title": "Prompt systemowy",
"context.rawMessages.title": "Surowe wiadomości",
"context.stats.session": "Sesja",
"context.stats.messages": "Wiadomości",
"context.stats.provider": "Dostawca",
@@ -319,34 +332,42 @@ export const dict = {
"context.stats.totalCost": "Całkowity koszt",
"context.stats.sessionCreated": "Utworzono sesję",
"context.stats.lastActivity": "Ostatnia aktywność",
"context.usage.tokens": "Tokeny",
"context.usage.usage": "Użycie",
"context.usage.cost": "Koszt",
"context.usage.clickToView": "Kliknij, aby zobaczyć kontekst",
"context.usage.view": "Pokaż użycie kontekstu",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Język",
"toast.language.description": "Przełączono na {{language}}",
"toast.theme.title": "Przełączono motyw",
"toast.scheme.title": "Schemat kolorów",
"toast.permissions.autoaccept.on.title": "Automatyczne akceptowanie edycji",
"toast.permissions.autoaccept.on.description": "Uprawnienia do edycji i zapisu będą automatycznie zatwierdzane",
"toast.permissions.autoaccept.off.title": "Zatrzymano automatyczne akceptowanie edycji",
"toast.permissions.autoaccept.off.description": "Uprawnienia do edycji i zapisu będą wymagały zatwierdzenia",
"toast.workspace.enabled.title": "Przestrzenie robocze włączone",
"toast.workspace.enabled.description": "Kilka worktree 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.permissions.autoaccept.on.title": "Automatyczne akceptowanie edycji",
"toast.permissions.autoaccept.on.description": "Uprawnienia do edycji i zapisu będą automatycznie zatwierdzane",
"toast.permissions.autoaccept.off.title": "Zatrzymano automatyczne akceptowanie edycji",
"toast.permissions.autoaccept.off.description": "Uprawnienia do edycji i zapisu będą wymagały zatwierdzenia",
"toast.model.none.title": "Nie wybrano modelu",
"toast.model.none.description": "Połącz dostawcę, aby podsumować tę sesję",
"toast.file.loadFailed.title": "Nie udało się załadować pliku",
"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.",
@@ -355,19 +376,15 @@ export const dict = {
"toast.session.share.success.description": "Link udostępniania skopiowany do schowka!",
"toast.session.share.failed.title": "Nie udało się udostępnić sesji",
"toast.session.share.failed.description": "Wystąpił błąd podczas udostępniania sesji",
"toast.session.unshare.success.title": "Zatrzymano udostępnianie sesji",
"toast.session.unshare.success.description": "Udostępnianie sesji zostało pomyślnie zatrzymane!",
"toast.session.unshare.failed.title": "Nie udało się zatrzymać udostępniania sesji",
"toast.session.unshare.failed.description": "Wystąpił błąd podczas zatrzymywania udostępniania sesji",
"toast.session.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.notYet": "Jeszcze nie",
"error.page.title": "Coś poszło nie tak",
"error.page.description": "Wystąpił błąd podczas ładowania aplikacji.",
"error.page.details.label": "Szczegóły błędu",
@@ -378,12 +395,10 @@ export const dict = {
"error.page.report.prefix": "Proszę zgłosić ten błąd do zespołu OpenCode",
"error.page.report.discord": "na Discordzie",
"error.page.version": "Wersja: {{version}}",
"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.globalSync.connectFailed": "Nie można połączyć się z serwerem. Czy serwer działa pod adresem `{{url}}`?",
"directory.error.invalidUrl": "Nieprawidłowy katalog w URL.",
"error.chain.unknown": "Nieznany błąd",
"error.chain.causedBy": "Spowodowany przez:",
"error.chain.apiError": "Błąd API",
@@ -393,8 +408,7 @@ export const dict = {
"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.mcpFailed":
'Serwer MCP "{{name}}" nie powiódł się. Uwaga, OpenCode nie obsługuje jeszcze uwierzytelniania MCP.',
"error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, OpenCode does not support MCP authentication yet.',
"error.chain.providerAuthFailed": "Uwierzytelnianie dostawcy nie powiodło się ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
'Nie udało się zainicjować dostawcy "{{provider}}". Sprawdź poświadczenia i konfigurację.',
@@ -405,21 +419,17 @@ export const dict = {
"error.chain.configFrontmatterError": "Nie udało się przetworzyć frontmatter w {{path}}:\n{{message}}",
"error.chain.configInvalid": "Plik konfiguracyjny w {{path}} jest nieprawidłowy",
"error.chain.configInvalidWithMessage": "Plik konfiguracyjny w {{path}} jest nieprawidłowy: {{message}}",
"notification.permission.title": "Wymagane uprawnienie",
"notification.permission.description": "{{sessionTitle}} w {{projectName}} potrzebuje uprawnienia",
"notification.question.title": "Pytanie",
"notification.question.description": "{{sessionTitle}} w {{projectName}} ma pytanie",
"notification.action.goToSession": "Przejdź do sesji",
"notification.session.responseReady.title": "Odpowiedź gotowa",
"notification.session.error.title": "Błąd sesji",
"notification.session.error.fallbackDescription": "Wystąpił błąd",
"home.recentProjects": "Ostatnie projekty",
"home.empty.title": "Brak ostatnich projektów",
"home.empty.description": "Zacznij od otwarcia lokalnego projektu",
"session.tab.session": "Sesja",
"session.tab.review": "Przegląd",
"session.tab.context": "Kontekst",
@@ -438,17 +448,18 @@ export const dict = {
"session.messages.loadEarlier": "Załaduj wcześniejsze wiadomości",
"session.messages.loading": "Ładowanie wiadomości...",
"session.messages.jumpToLatest": "Przejdź do najnowszych",
"session.context.addToContext": "Dodaj {{selection}} do kontekstu",
"session.new.worktree.main": "Główna gałąź",
"session.new.worktree.mainWithBranch": "Główna gałąź ({{branch}})",
"session.new.worktree.create": "Utwórz nowe drzewo robocze",
"session.new.lastModified": "Ostatnio zmodyfikowano",
"session.header.search.placeholder": "Szukaj {{project}}",
"session.header.searchFiles": "Szukaj plików",
"session.header.openIn": "Otwórz w",
"session.header.open.action": "Otwórz {{app}}",
"session.header.open.ariaLabel": "Otwórz w {{app}}",
"session.header.open.menu": "Opcje otwierania",
"session.header.open.copyPath": "Kopiuj ścieżkę",
"status.popover.trigger": "Status",
"status.popover.ariaLabel": "Konfiguracje serwerów",
"status.popover.tab.servers": "Serwery",
@@ -456,7 +467,6 @@ export const dict = {
"status.popover.tab.lsp": "LSP",
"status.popover.tab.plugins": "Wtyczki",
"status.popover.action.manageServers": "Zarządzaj serwerami",
"session.share.popover.title": "Opublikuj w sieci",
"session.share.popover.description.shared":
"Ta sesja jest publiczna w sieci. Jest dostępna dla każdego, kto posiada link.",
@@ -470,10 +480,8 @@ export const dict = {
"session.share.action.view": "Widok",
"session.share.copy.copied": "Skopiowano",
"session.share.copy.copyLink": "Kopiuj link",
"lsp.tooltip.none": "Brak serwerów LSP",
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "Ładowanie promptu...",
"terminal.loading": "Ładowanie terminala...",
"terminal.title": "Terminal",
@@ -482,7 +490,6 @@ export const dict = {
"terminal.connectionLost.title": "Utracono połączenie",
"terminal.connectionLost.description":
"Połączenie z terminalem zostało przerwane. Może się to zdarzyć przy restarcie serwera.",
"common.closeTab": "Zamknij kartę",
"common.dismiss": "Odrzuć",
"common.requestFailed": "Żądanie nie powiodło się",
@@ -496,7 +503,6 @@ export const dict = {
"common.edit": "Edytuj",
"common.loadMore": "Załaduj więcej",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Przełącz menu",
"sidebar.nav.projectsAndSessions": "Projekty i sesje",
"sidebar.settings": "Ustawienia",
@@ -508,18 +514,19 @@ export const dict = {
"sidebar.gettingStarted.line2": "Połącz dowolnego dostawcę, aby używać modeli, w tym Claude, GPT, Gemini itp.",
"sidebar.project.recentSessions": "Ostatnie sesje",
"sidebar.project.viewAllSessions": "Zobacz wszystkie sesje",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "Pulpit",
"settings.section.server": "Serwer",
"settings.tab.general": "Ogólne",
"settings.tab.shortcuts": "Skróty",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integration",
"settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.",
"settings.general.section.appearance": "Wygląd",
"settings.general.section.notifications": "Powiadomienia systemowe",
"settings.general.section.updates": "Aktualizacje",
"settings.general.section.sounds": "Efekty dźwiękowe",
"settings.general.section.display": "Ekran",
"settings.general.row.language.title": "Język",
"settings.general.row.language.description": "Zmień język wyświetlania dla OpenCode",
"settings.general.row.appearance.title": "Wygląd",
@@ -528,10 +535,12 @@ export const dict = {
"settings.general.row.theme.description": "Dostosuj motyw OpenCode.",
"settings.general.row.font.title": "Czcionka",
"settings.general.row.font.description": "Dostosuj czcionkę mono używaną w blokach kodu",
"settings.general.row.wayland.title": "Użyj natywnego Wayland",
"settings.general.row.wayland.description": "Wyłącz fallback X11 na Wayland. Wymaga restartu.",
"settings.general.row.wayland.tooltip":
"Na Linuxie z monitorami o różnym odświeżaniu, natywny Wayland może być bardziej stabilny.",
"settings.general.row.releaseNotes.title": "Informacje o wydaniu",
"settings.general.row.releaseNotes.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",
@@ -597,7 +606,6 @@ export const dict = {
"sound.option.yup04": "Yup 04",
"sound.option.yup05": "Yup 05",
"sound.option.yup06": "Yup 06",
"settings.general.notifications.agent.title": "Agent",
"settings.general.notifications.agent.description":
"Pokaż powiadomienie systemowe, gdy agent zakończy pracę lub wymaga uwagi",
@@ -606,14 +614,12 @@ export const dict = {
"Pokaż powiadomienie systemowe, gdy wymagane jest uprawnienie",
"settings.general.notifications.errors.title": "Błędy",
"settings.general.notifications.errors.description": "Pokaż powiadomienie systemowe, gdy wystąpi błąd",
"settings.general.sounds.agent.title": "Agent",
"settings.general.sounds.agent.description": "Odtwórz dźwięk, gdy agent zakończy pracę lub wymaga uwagi",
"settings.general.sounds.permissions.title": "Uprawnienia",
"settings.general.sounds.permissions.description": "Odtwórz dźwięk, gdy wymagane jest uprawnienie",
"settings.general.sounds.errors.title": "Błędy",
"settings.general.sounds.errors.description": "Odtwórz dźwięk, gdy wystąpi błąd",
"settings.shortcuts.title": "Skróty klawiszowe",
"settings.shortcuts.reset.button": "Przywróć domyślne",
"settings.shortcuts.reset.toast.title": "Zresetowano skróty",
@@ -624,14 +630,12 @@ export const dict = {
"settings.shortcuts.pressKeys": "Naciśnij klawisze",
"settings.shortcuts.search.placeholder": "Szukaj skrótów",
"settings.shortcuts.search.empty": "Nie znaleziono skrótów",
"settings.shortcuts.group.general": "Ogólne",
"settings.shortcuts.group.session": "Sesja",
"settings.shortcuts.group.navigation": "Nawigacja",
"settings.shortcuts.group.modelAndAgent": "Model i agent",
"settings.shortcuts.group.terminal": "Terminal",
"settings.shortcuts.group.prompt": "Prompt",
"settings.providers.title": "Dostawcy",
"settings.providers.description": "Ustawienia dostawców będą tutaj konfigurowalne.",
"settings.providers.section.connected": "Połączeni dostawcy",
@@ -649,16 +653,13 @@ export const dict = {
"settings.commands.description": "Ustawienia poleceń będą tutaj konfigurowalne.",
"settings.mcp.title": "MCP",
"settings.mcp.description": "Ustawienia MCP będą tutaj konfigurowalne.",
"settings.permissions.title": "Uprawnienia",
"settings.permissions.description": "Kontroluj, jakich narzędzi serwer może używać domyślnie.",
"settings.permissions.section.tools": "Narzędzia",
"settings.permissions.toast.updateFailed.title": "Nie udało się zaktualizować uprawnień",
"settings.permissions.action.allow": "Zezwól",
"settings.permissions.action.ask": "Pytaj",
"settings.permissions.action.deny": "Odmów",
"settings.permissions.tool.read.title": "Odczyt",
"settings.permissions.tool.read.description": "Odczyt pliku (pasuje do ścieżki pliku)",
"settings.permissions.tool.edit.title": "Edycja",
@@ -691,12 +692,10 @@ export const dict = {
"settings.permissions.tool.external_directory.description": "Dostęp do plików poza katalogiem projektu",
"settings.permissions.tool.doom_loop.title": "Zapętlenie",
"settings.permissions.tool.doom_loop.description": "Wykrywanie powtarzających się wywołań narzędzi (doom loop)",
"session.delete.failed.title": "Nie udało się usunąć sesji",
"session.delete.title": "Usuń sesję",
"session.delete.confirm": 'Usunąć sesję "{{name}}"?',
"session.delete.button": "Usuń sesję",
"workspace.new": "Nowa przestrzeń robocza",
"workspace.type.local": "lokalna",
"workspace.type.sandbox": "piaskownica",

View File

@@ -72,6 +72,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "Авто-принятие изменений",
"command.permissions.autoaccept.disable": "Прекратить авто-принятие изменений",
"command.workspace.toggle": "Переключить рабочие пространства",
"command.workspace.toggle.description": "Включить или отключить несколько рабочих пространств в боковой панели",
"command.session.undo": "Отменить",
"command.session.undo.description": "Отменить последнее сообщение",
"command.session.redo": "Повторить",
@@ -95,9 +96,13 @@ export const dict = {
"dialog.provider.group.popular": "Популярные",
"dialog.provider.group.other": "Другие",
"dialog.provider.tag.recommended": "Рекомендуемые",
"dialog.provider.anthropic.note": "Подключитесь с помощью Claude Pro/Max или API ключа",
"dialog.provider.openai.note": одключитесь с помощью ChatGPT Pro/Plus или API ключа",
"dialog.provider.copilot.note": "Подключитесь с помощью Copilot или API ключа",
"dialog.provider.opencode.note": "Отобранные модели, включая Claude, GPT, Gemini и другие",
"dialog.provider.anthropic.note": рямой доступ к моделям Claude, включая Pro и Max",
"dialog.provider.copilot.note": "Модели Claude для помощи в кодировании",
"dialog.provider.openai.note": "Модели GPT для быстрых и мощных задач общего ИИ",
"dialog.provider.google.note": "Модели Gemini для быстрых и структурированных ответов",
"dialog.provider.openrouter.note": "Доступ ко всем поддерживаемым моделям через одного провайдера",
"dialog.provider.vercel.note": "Единый доступ к ИИ-моделям с умной маршрутизацией",
"dialog.model.select.title": "Выбрать модель",
"dialog.model.search.placeholder": "Поиск моделей",
@@ -145,6 +150,44 @@ 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.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.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.description":
"Необязательно. Оставьте пустым, если управляете авторизацией через заголовки.",
"provider.custom.models.label": "Модели",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Имя",
"provider.custom.models.name.placeholder": "Отображаемое имя",
"provider.custom.models.remove": "Удалить модель",
"provider.custom.models.add": "Добавить модель",
"provider.custom.headers.label": "Заголовки (необязательно)",
"provider.custom.headers.key.label": "Заголовок",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "Значение",
"provider.custom.headers.value.placeholder": "значение",
"provider.custom.headers.remove": "Удалить заголовок",
"provider.custom.headers.add": "Добавить заголовок",
"provider.custom.error.providerID.required": "Требуется ID провайдера",
"provider.custom.error.providerID.format": "Используйте строчные буквы, цифры, дефисы или подчёркивания",
"provider.custom.error.providerID.exists": "Такой ID провайдера уже существует",
"provider.custom.error.name.required": "Требуется отображаемое имя",
"provider.custom.error.baseURL.required": "Требуется базовый URL",
"provider.custom.error.baseURL.format": "Должен начинаться с http:// или https://",
"provider.custom.error.required": "Обязательно",
"provider.custom.error.duplicate": "Дубликат",
"provider.disconnect.toast.disconnected.title": "{{provider}} отключён",
"provider.disconnect.toast.disconnected.description": "Модели {{provider}} больше недоступны.",
"model.tag.free": "Бесплатно",
@@ -166,6 +209,7 @@ export const dict = {
"common.search.placeholder": "Поиск",
"common.goBack": "Назад",
"common.goForward": "Вперёд",
"common.loading": "Загрузка",
"common.loading.ellipsis": "...",
"common.cancel": "Отмена",
@@ -327,6 +371,23 @@ export const dict = {
"context.usage.clickToView": "Нажмите для просмотра контекста",
"context.usage.view": "Показать использование контекста",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "Язык",
"toast.language.description": "Переключено на {{language}}",
@@ -384,6 +445,7 @@ export const dict = {
"Корневой элемент не найден. Вы забыли добавить его в index.html? Или, может быть, атрибут id был написан неправильно?",
"error.globalSync.connectFailed": "Не удалось подключиться к серверу. Запущен ли сервер по адресу `{{url}}`?",
"directory.error.invalidUrl": "Недопустимая директория в URL.",
"error.chain.unknown": "Неизвестная ошибка",
"error.chain.causedBy": "Причина:",
@@ -450,6 +512,11 @@ export const dict = {
"session.header.search.placeholder": "Поиск {{project}}",
"session.header.searchFiles": "Поиск файлов",
"session.header.openIn": "Открыть в",
"session.header.open.action": "Открыть {{app}}",
"session.header.open.ariaLabel": "Открыть в {{app}}",
"session.header.open.menu": "Варианты открытия",
"session.header.open.copyPath": "Копировать путь",
"status.popover.trigger": "Статус",
"status.popover.ariaLabel": "Настройки серверов",
@@ -517,11 +584,15 @@ export const dict = {
"settings.section.server": "Сервер",
"settings.tab.general": "Основные",
"settings.tab.shortcuts": "Горячие клавиши",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "Интеграция с WSL",
"settings.desktop.wsl.description": "Запускать сервер OpenCode внутри WSL на Windows.",
"settings.general.section.appearance": "Внешний вид",
"settings.general.section.notifications": "Системные уведомления",
"settings.general.section.updates": "Обновления",
"settings.general.section.sounds": "Звуковые эффекты",
"settings.general.section.display": "Дисплей",
"settings.general.row.language.title": "Язык",
"settings.general.row.language.description": "Изменить язык отображения OpenCode",
@@ -532,6 +603,11 @@ export const dict = {
"settings.general.row.font.title": "Шрифт",
"settings.general.row.font.description": "Настройте моноширинный шрифт для блоков кода",
"settings.general.row.wayland.title": "Использовать нативный Wayland",
"settings.general.row.wayland.description": "Отключить X11 fallback на Wayland. Требуется перезапуск.",
"settings.general.row.wayland.tooltip":
"На Linux с мониторами разной частоты обновления нативный Wayland может быть стабильнее.",
"settings.general.row.releaseNotes.title": "Примечания к выпуску",
"settings.general.row.releaseNotes.description": 'Показывать всплывающие окна "Что нового" после обновлений',

View File

@@ -72,6 +72,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "ยอมรับการแก้ไขโดยอัตโนมัติ",
"command.permissions.autoaccept.disable": "หยุดยอมรับการแก้ไขโดยอัตโนมัติ",
"command.workspace.toggle": "สลับพื้นที่ทำงาน",
"command.workspace.toggle.description": "เปิดหรือปิดใช้งานพื้นที่ทำงานหลายรายการในแถบด้านข้าง",
"command.session.undo": "ยกเลิก",
"command.session.undo.description": "ยกเลิกข้อความล่าสุด",
"command.session.redo": "ทำซ้ำ",
@@ -149,6 +150,43 @@ 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.description.suffix": ".",
"provider.custom.field.providerID.label": "รหัสผู้ให้บริการ",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "ตัวอักษรพิมพ์เล็ก ตัวเลข ยัติภังค์ หรือขีดล่าง",
"provider.custom.field.name.label": "ชื่อที่แสดง",
"provider.custom.field.name.placeholder": "My AI Provider",
"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.description": "ไม่บังคับ เว้นว่างไว้หากคุณจัดการการยืนยันตัวตนผ่านส่วนหัว",
"provider.custom.models.label": "โมเดล",
"provider.custom.models.id.label": "รหัส",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "ชื่อ",
"provider.custom.models.name.placeholder": "ชื่อที่แสดง",
"provider.custom.models.remove": "ลบโมเดล",
"provider.custom.models.add": "เพิ่มโมเดล",
"provider.custom.headers.label": "ส่วนหัว (ไม่บังคับ)",
"provider.custom.headers.key.label": "ส่วนหัว",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "ค่า",
"provider.custom.headers.value.placeholder": "ค่า",
"provider.custom.headers.remove": "ลบส่วนหัว",
"provider.custom.headers.add": "เพิ่มส่วนหัว",
"provider.custom.error.providerID.required": "ต้องระบุรหัสผู้ให้บริการ",
"provider.custom.error.providerID.format": "ใช้ตัวอักษรพิมพ์เล็ก ตัวเลข ยัติภังค์ หรือขีดล่าง",
"provider.custom.error.providerID.exists": "รหัสผู้ให้บริการนั้นมีอยู่แล้ว",
"provider.custom.error.name.required": "ต้องระบุชื่อที่แสดง",
"provider.custom.error.baseURL.required": "ต้องระบุ URL พื้นฐาน",
"provider.custom.error.baseURL.format": "ต้องขึ้นต้นด้วย http:// หรือ https://",
"provider.custom.error.required": "จำเป็น",
"provider.custom.error.duplicate": "ซ้ำ",
"provider.disconnect.toast.disconnected.title": "{{provider}} ที่ยกเลิกการเชื่อมต่อแล้ว",
"provider.disconnect.toast.disconnected.description": "โมเดล {{provider}} ไม่พร้อมใช้งานอีกต่อไป",
@@ -163,7 +201,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": "ไม่มีการใช้เหตุผล",
@@ -171,6 +209,7 @@ export const dict = {
"common.search.placeholder": "ค้นหา",
"common.goBack": "ย้อนกลับ",
"common.goForward": "นำทางไปข้างหน้า",
"common.loading": "กำลังโหลด",
"common.loading.ellipsis": "...",
"common.cancel": "ยกเลิก",
@@ -220,8 +259,8 @@ export const dict = {
"prompt.dropzone.label": "วางรูปภาพหรือ PDF ที่นี่",
"prompt.dropzone.file.label": "วางเพื่อ @กล่าวถึงไฟล์",
"prompt.slash.badge.custom": "กำหนดเอง",
"prompt.slash.badge.skill": "skill",
"prompt.slash.badge.mcp": "mcp",
"prompt.slash.badge.skill": "ทักษะ",
"prompt.slash.badge.mcp": "MCP",
"prompt.context.active": "ใช้งานอยู่",
"prompt.context.includeActiveFile": "รวมไฟล์ที่ใช้งานอยู่",
"prompt.context.removeActiveFile": "เอาไฟล์ที่ใช้งานอยู่ออกจากบริบท",
@@ -330,22 +369,39 @@ export const dict = {
"context.usage.clickToView": "คลิกเพื่อดูบริบท",
"context.usage.view": "ดูการใช้บริบท",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "ภาษา",
"toast.language.description": "สลับไปที่ {{language}}",
"toast.theme.title": "สลับธีมแล้ว",
"toast.scheme.title": "โทนสี",
"toast.permissions.autoaccept.on.title": "กำลังยอมรับการแก้ไขโดยอัตโนมัติ",
"toast.permissions.autoaccept.on.description": "สิทธิ์การแก้ไขและจะได้รับเขียนการอนุมัติโดยอัตโนมัติ",
"toast.permissions.autoaccept.off.title": "หยุดยอมรับการแก้ไขโดยอัตโนมัติ",
"toast.permissions.autoaccept.off.description": "สิทธิ์การแก้ไขและเขียนจะต้องได้รับการอนุมัติ",
"toast.workspace.enabled.title": "เปิดใช้งานพื้นที่ทำงานแล้ว",
"toast.workspace.enabled.description": "ตอนนี้จะแสดง worktree หลายรายการในแถบด้านข้าง",
"toast.workspace.disabled.title": "ปิดใช้งานพื้นที่ทำงานแล้ว",
"toast.workspace.disabled.description": "จะแสดงเฉพาะ worktree หลักในแถบด้านข้าง",
"toast.permissions.autoaccept.on.title": "กำลังยอมรับการแก้ไขโดยอัตโนมัติ",
"toast.permissions.autoaccept.on.description": "สิทธิ์การแก้ไขและจะได้รับเขียนการอนุมัติโดยอัตโนมัติ",
"toast.permissions.autoaccept.off.title": "หยุดยอมรับการแก้ไขโดยอัตโนมัติ",
"toast.permissions.autoaccept.off.description": "สิทธิ์การแก้ไขและเขียนจะต้องได้รับการอนุมัติ",
"toast.model.none.title": "ไม่ได้เลือกโมเดล",
"toast.model.none.description": "เชื่อมต่อผู้ให้บริการเพื่อสรุปเซสชันนี้",
@@ -387,6 +443,7 @@ export const dict = {
"error.dev.rootNotFound": "ไม่พบองค์ประกอบรูท คุณลืมเพิ่มใน index.html หรือบางทีแอตทริบิวต์ id อาจสะกดผิด?",
"error.globalSync.connectFailed": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ มีเซิร์ฟเวอร์ทำงานอยู่ที่ `{{url}}` หรือไม่?",
"directory.error.invalidUrl": "ไดเรกทอรีใน URL ไม่ถูกต้อง",
"error.chain.unknown": "ข้อผิดพลาดที่ไม่รู้จัก",
"error.chain.causedBy": "สาเหตุ:",
@@ -452,6 +509,11 @@ export const dict = {
"session.header.search.placeholder": "ค้นหา {{project}}",
"session.header.searchFiles": "ค้นหาไฟล์",
"session.header.openIn": "เปิดใน",
"session.header.open.action": "เปิด {{app}}",
"session.header.open.ariaLabel": "เปิดใน {{app}}",
"session.header.open.menu": "ตัวเลือกการเปิด",
"session.header.open.copyPath": "คัดลอกเส้นทาง",
"status.popover.trigger": "สถานะ",
"status.popover.ariaLabel": "การกำหนดค่าเซิร์ฟเวอร์",
@@ -516,11 +578,15 @@ export const dict = {
"settings.section.server": "เซิร์ฟเวอร์",
"settings.tab.general": "ทั่วไป",
"settings.tab.shortcuts": "ทางลัด",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "การรวม WSL",
"settings.desktop.wsl.description": "เรียกใช้เซิร์ฟเวอร์ OpenCode ภายใน WSL บน Windows",
"settings.general.section.appearance": "รูปลักษณ์",
"settings.general.section.notifications": "การแจ้งเตือนระบบ",
"settings.general.section.updates": "การอัปเดต",
"settings.general.section.sounds": "เสียงเอฟเฟกต์",
"settings.general.section.display": "การแสดงผล",
"settings.general.row.language.title": "ภาษา",
"settings.general.row.language.description": "เปลี่ยนภาษาที่แสดงสำหรับ OpenCode",
@@ -531,8 +597,22 @@ export const dict = {
"settings.general.row.font.title": "ฟอนต์",
"settings.general.row.font.description": "ปรับแต่งฟอนต์โมโนที่ใช้ในบล็อกโค้ด",
"settings.general.row.wayland.title": "ใช้ Wayland แบบเนทีฟ",
"settings.general.row.wayland.description": "ปิดใช้งาน X11 fallback บน Wayland ต้องรีสตาร์ท",
"settings.general.row.wayland.tooltip": "บน Linux ที่มีจอภาพรีเฟรชเรตแบบผสม Wayland แบบเนทีฟอาจเสถียรกว่า",
"settings.general.row.releaseNotes.title": "บันทึกการอัปเดต",
"settings.general.row.releaseNotes.description": "แสดงป๊อปอัพ What's New หลังจากอัปเดต",
"settings.updates.row.startup.title": "ตรวจสอบการอัปเดตเมื่อเริ่มต้น",
"settings.updates.row.startup.description": "ตรวจสอบการอัปเดตโดยอัตโนมัติเมื่อ OpenCode เปิดใช้งาน",
"settings.updates.row.check.title": "ตรวจสอบการอัปเดต",
"settings.updates.row.check.description": "ตรวจสอบการอัปเดตด้วยตนเองและติดตั้งหากมี",
"settings.updates.action.checkNow": "ตรวจสอบทันที",
"settings.updates.action.checking": "กำลังตรวจสอบ...",
"settings.updates.toast.latest.title": "คุณเป็นเวอร์ชันล่าสุดแล้ว",
"settings.updates.toast.latest.description": "คุณกำลังใช้งาน OpenCode เวอร์ชันล่าสุด",
"font.option.ibmPlexMono": "IBM Plex Mono",
"font.option.cascadiaCode": "Cascadia Code",
"font.option.firaCode": "Fira Code",

View File

@@ -19,17 +19,22 @@ export const dict = {
"command.category.agent": "智能体",
"command.category.permissions": "权限",
"command.category.workspace": "工作区",
"command.category.settings": "设置",
"theme.scheme.system": "系统",
"theme.scheme.light": "浅色",
"theme.scheme.dark": "深色",
"command.sidebar.toggle": "切换侧边栏",
"command.project.open": "打开项目",
"command.provider.connect": "连接提供商",
"command.server.switch": "切换服务器",
"command.settings.open": "打开设置",
"command.session.previous": "上一个会话",
"command.session.next": "下一个会话",
"command.session.previous.unseen": "上一个未读会话",
@@ -47,35 +52,53 @@ export const dict = {
"command.language.set": "使用语言:{{language}}",
"command.session.new": "新建会话",
"command.file.open": "打开文件",
"command.tab.close": "关闭标签页",
"command.context.addSelection": "将所选内容添加到上下文",
"command.context.addSelection.description": "添加当前文件中选中的行",
"command.input.focus": "聚焦输入框",
"command.terminal.toggle": "切换终端",
"command.fileTree.toggle": "切换文件树",
"command.review.toggle": "切换审查",
"command.terminal.new": "新建终端",
"command.terminal.new.description": "创建新的终端标签页",
"command.steps.toggle": "切换步骤",
"command.steps.toggle.description": "显示或隐藏当前消息的步骤",
"command.message.previous": "上一条消息",
"command.message.previous.description": "跳转到上一条用户消息",
"command.message.next": "下一条消息",
"command.message.next.description": "跳转到下一条用户消息",
"command.model.choose": "选择模型",
"command.model.choose.description": "选择不同的模型",
"command.mcp.toggle": "切换 MCPs",
"command.mcp.toggle.description": "切换 MCPs",
"command.agent.cycle": "切换智能体",
"command.agent.cycle.description": "切换到下一个智能体",
"command.agent.cycle.reverse": "反向切换智能体",
"command.agent.cycle.reverse.description": "切换到上一个智能体",
"command.model.variant.cycle": "切换思考强度",
"command.model.variant.cycle.description": "切换到下一个强度等级",
"command.permissions.autoaccept.enable": "自动接受编辑",
"command.permissions.autoaccept.disable": "停止自动接受编辑",
"command.workspace.toggle": "切换工作区",
"command.workspace.toggle.description": "在侧边栏启用或禁用多个工作区",
"command.session.undo": "撤销",
"command.session.undo.description": "撤销上一条消息",
"command.session.redo": "重做",
@@ -99,10 +122,10 @@ export const dict = {
"dialog.provider.group.popular": "热门",
"dialog.provider.group.other": "其他",
"dialog.provider.tag.recommended": "推荐",
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 密钥连接",
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 密钥连接",
"dialog.provider.copilot.note": "使用 Copilot 或 API 密钥连接",
"dialog.provider.opencode.note": "使用 OpenCode Zen 或 API 密钥连接",
"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 密钥连接",
@@ -112,7 +135,6 @@ export const dict = {
"dialog.model.empty": "未找到模型",
"dialog.model.manage": "管理模型",
"dialog.model.manage.description": "自定义模型选择器中显示的模型。",
"dialog.model.unpaid.freeModels.title": "OpenCode 提供的免费模型",
"dialog.model.unpaid.addMore.title": "从热门提供商添加更多模型",
@@ -188,9 +210,9 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 已断开连接",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免费",
"model.tag.latest": "最新",
"model.provider.anthropic": "Anthropic",
"model.provider.openai": "OpenAI",
"model.provider.google": "Google",
@@ -205,8 +227,10 @@ export const dict = {
"model.tooltip.reasoning.allowed": "支持推理",
"model.tooltip.reasoning.none": "不支持推理",
"model.tooltip.context": "上下文上限 {{limit}}",
"common.search.placeholder": "搜索",
"common.goBack": "返回",
"common.goForward": "前进",
"common.loading": "加载中",
"common.loading.ellipsis": "...",
"common.cancel": "取消",
@@ -224,7 +248,6 @@ export const dict = {
"prompt.placeholder.summarizeComment": "总结该评论…",
"prompt.mode.shell": "Shell",
"prompt.mode.shell.exit": "按 esc 退出",
"prompt.example.1": "修复代码库中的一个 TODO",
"prompt.example.2": "这个项目的技术栈是什么?",
"prompt.example.3": "修复失败的测试",
@@ -250,7 +273,6 @@ export const dict = {
"prompt.example.23": "给这个列表添加分页",
"prompt.example.24": "创建一个 CLI 命令用于...",
"prompt.example.25": "这里的环境变量是怎么工作的?",
"prompt.popover.emptyResults": "没有匹配的结果",
"prompt.popover.emptyCommands": "没有匹配的命令",
"prompt.dropzone.label": "将图片或 PDF 拖到这里",
@@ -266,7 +288,6 @@ export const dict = {
"prompt.attachment.remove": "移除附件",
"prompt.action.send": "发送",
"prompt.action.stop": "停止",
"prompt.toast.pasteUnsupported.title": "不支持的粘贴",
"prompt.toast.pasteUnsupported.description": "这里只能粘贴图片或 PDF 文件。",
"prompt.toast.modelAgentRequired.title": "请选择智能体和模型",
@@ -283,6 +304,7 @@ export const dict = {
"dialog.mcp.empty": "未配置 MCPs",
"dialog.lsp.empty": "已从文件类型自动检测到 LSPs",
"dialog.plugins.empty": "在 opencode.json 中配置的插件",
"mcp.status.connected": "已连接",
@@ -311,7 +333,6 @@ export const dict = {
"dialog.server.default.set": "将当前服务器设为默认",
"dialog.server.default.clear": "清除",
"dialog.server.action.remove": "移除服务器",
"dialog.server.menu.edit": "编辑",
"dialog.server.menu.default": "设为默认",
"dialog.server.menu.defaultRemove": "取消默认",
@@ -327,10 +348,10 @@ 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.description": "在创建新的工作区 (worktree) 后运行。",
"dialog.project.edit.worktree.startup.placeholder": "例如 bun install",
"context.breakdown.title": "上下文拆分",
"context.breakdown.note": "输入 token 的大致拆分。“其他”包含工具定义和开销。",
"context.breakdown.system": "系统",
@@ -338,10 +359,8 @@ export const dict = {
"context.breakdown.assistant": "助手",
"context.breakdown.tool": "工具调用",
"context.breakdown.other": "其他",
"context.systemPrompt.title": "系统提示词",
"context.rawMessages.title": "原始消息",
"context.stats.session": "会话",
"context.stats.messages": "消息数",
"context.stats.provider": "提供商",
@@ -358,34 +377,44 @@ export const dict = {
"context.stats.totalCost": "总成本",
"context.stats.sessionCreated": "创建时间",
"context.stats.lastActivity": "最后活动",
"context.usage.tokens": "Token",
"context.usage.usage": "使用率",
"context.usage.cost": "成本",
"context.usage.clickToView": "点击查看上下文",
"context.usage.view": "查看上下文用量",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "语言",
"toast.language.description": "已切换到{{language}}",
"toast.theme.title": "主题已切换",
"toast.scheme.title": "颜色方案",
"toast.workspace.enabled.title": "工作区已启用",
"toast.workspace.enabled.description": "侧边栏现在显示多个工作树",
"toast.workspace.disabled.title": "工作区已禁用",
"toast.workspace.disabled.description": "侧边栏只显示主工作树",
"toast.permissions.autoaccept.on.title": "自动接受编辑",
"toast.permissions.autoaccept.on.description": "编辑和写入权限将自动获批",
"toast.permissions.autoaccept.off.title": "已停止自动接受编辑",
"toast.permissions.autoaccept.off.description": "编辑和写入权限将需要手动批准",
"toast.model.none.title": "未选择模型",
"toast.model.none.description": "请先连接提供商以总结此会话",
"toast.file.loadFailed.title": "加载文件失败",
"toast.file.listFailed.title": "列出文件失败",
"toast.context.noLineSelection.title": "未选择行",
"toast.context.noLineSelection.description": "请先在文件标签中选择行范围。",
@@ -394,14 +423,11 @@ export const dict = {
"toast.session.share.success.description": "分享链接已复制到剪贴板",
"toast.session.share.failed.title": "分享会话失败",
"toast.session.share.failed.description": "分享会话时发生错误",
"toast.session.unshare.success.title": "已取消分享会话",
"toast.session.unshare.success.description": "会话已成功取消分享",
"toast.session.unshare.failed.title": "取消分享失败",
"toast.session.unshare.failed.description": "取消分享会话时发生错误",
"toast.session.listFailed.title": "无法加载 {{project}} 的会话",
"toast.update.title": "有可用更新",
"toast.update.description": "OpenCode 有新版本 ({{version}}) 可安装。",
"toast.update.action.installRestart": "安装并重启",
@@ -417,10 +443,9 @@ export const dict = {
"error.page.report.prefix": "请将此错误报告给 OpenCode 团队",
"error.page.report.discord": "在 Discord 上",
"error.page.version": "版本:{{version}}",
"error.dev.rootNotFound": "未找到根元素。你是不是忘了把它添加到 index.html或者 id 属性拼写错了?",
"error.globalSync.connectFailed": "无法连接到服务器。是否有服务器正在 `{{url}}` 运行?",
"directory.error.invalidUrl": "URL 中的目录无效。",
"error.chain.unknown": "未知错误",
@@ -448,7 +473,6 @@ export const dict = {
"notification.question.title": "问题",
"notification.question.description": "{{sessionTitle}}{{projectName}})有一个问题",
"notification.action.goToSession": "前往会话",
"notification.session.responseReady.title": "回复已就绪",
"notification.session.error.title": "会话错误",
"notification.session.error.fallbackDescription": "发生错误",
@@ -474,17 +498,19 @@ export const dict = {
"session.messages.loadingEarlier": "正在加载更早的消息...",
"session.messages.loadEarlier": "加载更早的消息",
"session.messages.loading": "正在加载消息...",
"session.messages.jumpToLatest": "跳转到最新",
"session.context.addToContext": "将 {{selection}} 添加到上下文",
"session.new.worktree.main": "主分支",
"session.new.worktree.mainWithBranch": "主分支({{branch}}",
"session.new.worktree.create": "创建新的 worktree",
"session.new.lastModified": "最后修改",
"session.header.search.placeholder": "搜索 {{project}}",
"session.header.searchFiles": "搜索文件",
"session.header.openIn": "打开方式",
"session.header.open.action": "打开 {{app}}",
"session.header.open.ariaLabel": "在 {{app}} 中打开",
"session.header.open.menu": "打开选项",
"session.header.open.copyPath": "复制路径",
"status.popover.trigger": "状态",
"status.popover.ariaLabel": "服务器配置",
@@ -510,13 +536,14 @@ export const dict = {
"lsp.label.connected": "{{count}} LSP",
"prompt.loading": "正在加载提示...",
"terminal.loading": "正在加载终端...",
"terminal.title": "终端",
"terminal.title.numbered": "终端 {{number}}",
"terminal.close": "关闭终端",
"terminal.connectionLost.title": "连接已丢失",
"terminal.connectionLost.description": "终端连接已中断。这可能发生在服务器重启时。",
"common.closeTab": "关闭标签页",
"common.dismiss": "忽略",
"common.requestFailed": "请求失败",
@@ -529,8 +556,8 @@ export const dict = {
"common.close": "关闭",
"common.edit": "编辑",
"common.loadMore": "加载更多",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "切换菜单",
"sidebar.nav.projectsAndSessions": "项目和会话",
"sidebar.settings": "设置",
@@ -544,16 +571,22 @@ export const dict = {
"sidebar.project.viewAllSessions": "查看全部会话",
"app.name.desktop": "OpenCode Desktop",
"settings.section.desktop": "桌面",
"settings.section.server": "服务器",
"settings.tab.general": "通用",
"settings.tab.shortcuts": "快捷键",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL 集成",
"settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行 OpenCode 服务器。",
"settings.general.section.appearance": "外观",
"settings.general.section.notifications": "系统通知",
"settings.general.section.updates": "更新",
"settings.general.section.sounds": "音效",
"settings.general.section.display": "显示",
"settings.general.row.language.title": "语言",
"settings.general.row.language.description": "更改 OpenCode 的显示语言",
"settings.general.row.appearance.title": "外观",
@@ -562,6 +595,9 @@ export const dict = {
"settings.general.row.theme.description": "自定义 OpenCode 的主题。",
"settings.general.row.font.title": "字体",
"settings.general.row.font.description": "自定义代码块使用的等宽字体",
"settings.general.row.wayland.title": "使用原生 Wayland",
"settings.general.row.wayland.description": "在 Wayland 上禁用 X11 回退。需要重启。",
"settings.general.row.wayland.tooltip": "在混合刷新率显示器的 Linux 系统上,原生 Wayland 可能更稳定。",
"settings.general.row.releaseNotes.title": "发行说明",
"settings.general.row.releaseNotes.description": "更新后显示“新功能”弹窗",
@@ -586,6 +622,7 @@ export const dict = {
"font.option.robotoMono": "Roboto Mono",
"font.option.sourceCodePro": "Source Code Pro",
"font.option.ubuntuMono": "Ubuntu Mono",
"sound.option.alert01": "警报 01",
"sound.option.alert02": "警报 02",
"sound.option.alert03": "警报 03",
@@ -631,13 +668,13 @@ export const dict = {
"sound.option.yup04": "是 04",
"sound.option.yup05": "是 05",
"sound.option.yup06": "是 06",
"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.sounds.agent.title": "智能体",
"settings.general.sounds.agent.description": "当智能体完成或需要注意时播放声音",
"settings.general.sounds.permissions.title": "权限",
@@ -655,7 +692,6 @@ export const dict = {
"settings.shortcuts.pressKeys": "按下按键",
"settings.shortcuts.search.placeholder": "搜索快捷键",
"settings.shortcuts.search.empty": "未找到快捷键",
"settings.shortcuts.group.general": "通用",
"settings.shortcuts.group.session": "会话",
"settings.shortcuts.group.navigation": "导航",
@@ -672,12 +708,16 @@ export const dict = {
"settings.providers.tag.config": "配置",
"settings.providers.tag.custom": "自定义",
"settings.providers.tag.other": "其他",
"settings.models.title": "模型",
"settings.models.description": "模型设置将在此处可配置。",
"settings.agents.title": "智能体",
"settings.agents.description": "智能体设置将在此处可配置。",
"settings.commands.title": "命令",
"settings.commands.description": "命令设置将在此处可配置。",
"settings.mcp.title": "MCP",
"settings.mcp.description": "MCP 设置将在此处可配置。",
@@ -685,11 +725,9 @@ 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.tool.read.title": "读取",
"settings.permissions.tool.read.description": "读取文件(匹配文件路径)",
"settings.permissions.tool.edit.title": "编辑",
@@ -702,9 +740,9 @@ export const dict = {
"settings.permissions.tool.list.description": "列出目录中的文件",
"settings.permissions.tool.bash.title": "Bash",
"settings.permissions.tool.bash.description": "运行 shell 命令",
"settings.permissions.tool.task.title": "Task",
"settings.permissions.tool.task.title": "任务",
"settings.permissions.tool.task.description": "启动子智能体",
"settings.permissions.tool.skill.title": "Skill",
"settings.permissions.tool.skill.title": "技能",
"settings.permissions.tool.skill.description": "按名称加载技能",
"settings.permissions.tool.lsp.title": "LSP",
"settings.permissions.tool.lsp.description": "运行语言服务器查询",
@@ -712,15 +750,15 @@ export const dict = {
"settings.permissions.tool.todoread.description": "读取待办列表",
"settings.permissions.tool.todowrite.title": "更新待办",
"settings.permissions.tool.todowrite.description": "更新待办列表",
"settings.permissions.tool.webfetch.title": "Web Fetch",
"settings.permissions.tool.webfetch.title": "网页获取",
"settings.permissions.tool.webfetch.description": "从 URL 获取内容",
"settings.permissions.tool.websearch.title": "Web Search",
"settings.permissions.tool.websearch.title": "网页搜索",
"settings.permissions.tool.websearch.description": "搜索网页",
"settings.permissions.tool.codesearch.title": "Code Search",
"settings.permissions.tool.codesearch.title": "代码搜索",
"settings.permissions.tool.codesearch.description": "在网上搜索代码",
"settings.permissions.tool.external_directory.title": "外部目录",
"settings.permissions.tool.external_directory.description": "访问项目目录之外的文件",
"settings.permissions.tool.doom_loop.title": "Doom Loop",
"settings.permissions.tool.doom_loop.title": "死循环",
"settings.permissions.tool.doom_loop.description": "检测具有相同输入的重复工具调用",
"session.delete.failed.title": "删除会话失败",

View File

@@ -76,6 +76,7 @@ export const dict = {
"command.permissions.autoaccept.enable": "自動接受編輯",
"command.permissions.autoaccept.disable": "停止自動接受編輯",
"command.workspace.toggle": "切換工作區",
"command.workspace.toggle.description": "在側邊欄啟用或停用多個工作區",
"command.session.undo": "復原",
"command.session.undo.description": "復原上一則訊息",
"command.session.redo": "重做",
@@ -99,9 +100,13 @@ export const dict = {
"dialog.provider.group.popular": "熱門",
"dialog.provider.group.other": "其他",
"dialog.provider.tag.recommended": "推薦",
"dialog.provider.opencode.note": "精選模型,包含 Claude、GPT、Gemini 等等",
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 金鑰連線",
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 金鑰連線",
"dialog.provider.copilot.note": "使用 Copilot 或 API 金鑰連線",
"dialog.provider.google.note": "Gemini 模型,提供快速且結構化的回應",
"dialog.provider.openrouter.note": "從單一提供者存取所有支援的模型",
"dialog.provider.vercel.note": "透過智慧路由統一存取 AI 模型",
"dialog.model.select.title": "選擇模型",
"dialog.model.search.placeholder": "搜尋模型",
@@ -204,6 +209,7 @@ export const dict = {
"model.tooltip.context": "上下文上限 {{limit}}",
"common.search.placeholder": "搜尋",
"common.goBack": "返回",
"common.goForward": "前進",
"common.loading": "載入中",
"common.loading.ellipsis": "...",
"common.cancel": "取消",
@@ -362,6 +368,23 @@ export const dict = {
"context.usage.clickToView": "點擊查看上下文",
"context.usage.view": "檢視上下文用量",
"language.en": "English",
"language.zh": "简体中文",
"language.zht": "繁體中文",
"language.ko": "한국어",
"language.de": "Deutsch",
"language.es": "Español",
"language.fr": "Français",
"language.da": "Dansk",
"language.ja": "日本語",
"language.pl": "Polski",
"language.ru": "Русский",
"language.ar": "العربية",
"language.no": "Norsk",
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
"toast.language.title": "語言",
"toast.language.description": "已切換到 {{language}}",
@@ -482,6 +505,11 @@ export const dict = {
"session.header.search.placeholder": "搜尋 {{project}}",
"session.header.searchFiles": "搜尋檔案",
"session.header.openIn": "開啟於",
"session.header.open.action": "開啟 {{app}}",
"session.header.open.ariaLabel": "在 {{app}} 中開啟",
"session.header.open.menu": "開啟選項",
"session.header.open.copyPath": "複製路徑",
"status.popover.trigger": "狀態",
"status.popover.ariaLabel": "伺服器設定",
@@ -545,11 +573,15 @@ export const dict = {
"settings.section.server": "伺服器",
"settings.tab.general": "一般",
"settings.tab.shortcuts": "快速鍵",
"settings.desktop.section.wsl": "WSL",
"settings.desktop.wsl.title": "WSL integration",
"settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.",
"settings.general.section.appearance": "外觀",
"settings.general.section.notifications": "系統通知",
"settings.general.section.updates": "更新",
"settings.general.section.sounds": "音效",
"settings.general.section.display": "顯示",
"settings.general.row.language.title": "語言",
"settings.general.row.language.description": "變更 OpenCode 的顯示語言",
@@ -560,6 +592,10 @@ export const dict = {
"settings.general.row.font.title": "字型",
"settings.general.row.font.description": "自訂程式碼區塊使用的等寬字型",
"settings.general.row.wayland.title": "使用原生 Wayland",
"settings.general.row.wayland.description": "在 Wayland 上停用 X11 後備模式。需要重新啟動。",
"settings.general.row.wayland.tooltip": "在混合更新率螢幕的 Linux 系統上,原生 Wayland 可能更穩定。",
"settings.general.row.releaseNotes.title": "發行說明",
"settings.general.row.releaseNotes.description": "更新後顯示「新功能」彈出視窗",

View File

@@ -54,6 +54,13 @@ export default function Layout(props: ParentProps) {
navigate(`/${params.dir}/session/${sessionID}`)
}
const sessionHref = (sessionID: string) => {
if (params.dir) return `/${params.dir}/session/${sessionID}`
return `/session/${sessionID}`
}
const syncSession = (sessionID: string) => sync.session.sync(sessionID)
return (
<DataProvider
data={sync.data}
@@ -62,6 +69,8 @@ export default function Layout(props: ParentProps) {
onQuestionReply={replyToQuestion}
onQuestionReject={rejectQuestion}
onNavigateToSession={navigateToSession}
onSessionHref={sessionHref}
onSyncSession={syncSession}
>
<LocalProvider>{props.children}</LocalProvider>
</DataProvider>

View File

@@ -25,7 +25,8 @@ export default function Home() {
const homedir = createMemo(() => sync.data.path.home)
const recent = createMemo(() => {
return sync.data.project
.toSorted((a, b) => (b.time.updated ?? b.time.created) - (a.time.updated ?? a.time.created))
.slice()
.sort((a, b) => (b.time.updated ?? b.time.created) - (a.time.updated ?? a.time.created))
.slice(0, 5)
})

View File

@@ -34,6 +34,7 @@ import type { DragEvent } from "@thisbeyond/solid-dnd"
import { useProviders } from "@/hooks/use-providers"
import { showToast, Toast, toaster } from "@opencode-ai/ui/toast"
import { useGlobalSDK } from "@/context/global-sdk"
import { clearWorkspaceTerminals } from "@/context/terminal"
import { useNotification } from "@/context/notification"
import { usePermission } from "@/context/permission"
import { Binary } from "@opencode-ai/util/binary"
@@ -181,20 +182,6 @@ export default function Layout(props: ParentProps) {
aim.reset()
})
createEffect(
on(
() => ({ dir: params.dir, id: params.id }),
() => {
if (layout.sidebar.opened()) return
if (!state.hoverProject) return
aim.reset()
setState("hoverSession", undefined)
setState("hoverProject", undefined)
},
{ defer: true },
),
)
const autoselecting = createMemo(() => {
if (params.dir) return false
if (!state.autoselect) return false
@@ -1216,6 +1203,16 @@ export default function Layout(props: ParentProps) {
if (!result) return
globalSync.set(
"project",
produce((draft) => {
const project = draft.find((item) => item.worktree === root)
if (!project) return
project.sandboxes = (project.sandboxes ?? []).filter((sandbox) => sandbox !== directory)
}),
)
setStore("workspaceOrder", root, (order) => (order ?? []).filter((workspace) => workspace !== directory))
layout.projects.close(directory)
layout.projects.open(root)
@@ -1235,11 +1232,18 @@ export default function Layout(props: ParentProps) {
})
const dismiss = () => toaster.dismiss(progress)
const sessions = await globalSDK.client.session
const sessions: Session[] = await globalSDK.client.session
.list({ directory })
.then((x) => x.data ?? [])
.catch(() => [])
clearWorkspaceTerminals(
directory,
sessions.map((s) => s.id),
platform,
)
await globalSDK.client.instance.dispose({ directory }).catch(() => undefined)
const result = await globalSDK.client.worktree
.reset({ directory: root, worktreeResetInput: { directory } })
.then((x) => x.data)
@@ -1272,8 +1276,6 @@ export default function Layout(props: ParentProps) {
),
)
await globalSDK.client.instance.dispose({ directory }).catch(() => undefined)
setBusy(directory, false)
dismiss()
@@ -1926,10 +1928,10 @@ export default function Layout(props: ParentProps) {
renderPanel={() => <SidebarPanel project={currentProject()} />}
/>
</div>
<Show when={!layout.sidebar.opened() ? hoverProjectData() : undefined} keyed>
{(project) => (
<Show when={!layout.sidebar.opened() ? hoverProjectData()?.worktree : undefined} keyed>
{(worktree) => (
<div class="absolute inset-y-0 left-16 z-50 flex" onMouseEnter={aim.reset}>
<SidebarPanel project={project} />
<SidebarPanel project={hoverProjectData()} />
</div>
)}
</Show>
@@ -1938,7 +1940,7 @@ export default function Layout(props: ParentProps) {
direction="horizontal"
size={layout.sidebar.width()}
min={244}
max={window.innerWidth * 0.3 + 64}
max={typeof window === "undefined" ? 1000 : window.innerWidth * 0.3 + 64}
collapseThreshold={244}
onResize={layout.sidebar.resize}
onCollapse={layout.sidebar.close}

View File

@@ -26,7 +26,7 @@ export const isRootVisibleSession = (session: Session, directory: string) =>
workspaceKey(session.directory) === workspaceKey(directory) && !session.parentID && !session.time?.archived
export const sortedRootSessions = (store: { session: Session[]; path: { directory: string } }, now: number) =>
store.session.filter((session) => isRootVisibleSession(session, store.path.directory)).toSorted(sortSessions(now))
store.session.filter((session) => isRootVisibleSession(session, store.path.directory)).sort(sortSessions(now))
export const childMapByParent = (sessions: Session[]) => {
const map = new Map<string, string[]>()

View File

@@ -144,7 +144,7 @@ export const SessionItem = (props: SessionItemProps): JSX.Element => {
const item = (
<A
href={`${props.slug}/session/${props.session.id}`}
href={`/${props.slug}/session/${props.session.id}`}
class={`flex items-center justify-between gap-3 min-w-0 text-left w-full focus:outline-none transition-[padding] ${props.mobile ? "pr-7" : ""} group-hover/session:pr-7 group-focus-within/session:pr-7 group-active/session:pr-7 ${props.dense ? "py-0.5" : "py-1"}`}
onPointerEnter={scheduleHoverPrefetch}
onPointerLeave={cancelHoverPrefetch}
@@ -285,7 +285,7 @@ export const NewSessionItem = (props: {
const tooltip = () => props.mobile || !props.sidebarExpanded()
const item = (
<A
href={`${props.slug}/session`}
href={`/${props.slug}/session`}
end
class={`flex items-center justify-between gap-3 min-w-0 text-left w-full focus:outline-none ${props.dense ? "py-0.5" : "py-1"}`}
onClick={() => {

View File

@@ -118,7 +118,7 @@ export const SortableWorkspace = (props: {
const touch = createMediaQuery("(hover: none)")
const showNew = createMemo(() => !loading() && (touch() || sessions().length === 0 || (active() && !params.id)))
const loadMore = async () => {
setWorkspaceStore("limit", (limit) => limit + 5)
setWorkspaceStore("limit", (limit) => (limit ?? 0) + 5)
await globalSync.project.loadSessions(props.directory)
}
@@ -368,7 +368,7 @@ export const LocalWorkspace = (props: {
const loading = createMemo(() => !booted() && sessions().length === 0)
const hasMore = createMemo(() => workspace().store.sessionTotal > sessions().length)
const loadMore = async () => {
workspace().setStore("limit", (limit) => limit + 5)
workspace().setStore("limit", (limit) => (limit ?? 0) + 5)
await globalSync.project.loadSessions(props.project.worktree)
}

View File

@@ -1026,10 +1026,31 @@ export default function Page() {
</Show>
</Match>
<Match when={true}>
<div class={input.emptyClass}>
<Mark class="w-14 opacity-10" />
<div class="text-14-regular text-text-weak max-w-56">{language.t("session.review.empty")}</div>
</div>
<SessionReviewTab
title={changesTitle()}
empty={
store.changes === "turn" ? (
emptyTurn()
) : (
<div class={input.emptyClass}>
<Mark class="w-14 opacity-10" />
<div class="text-14-regular text-text-weak max-w-56">{language.t("session.review.empty")}</div>
</div>
)
}
diffs={reviewDiffs}
view={view}
diffStyle={input.diffStyle}
onDiffStyleChange={input.onDiffStyleChange}
onScrollRef={(el) => setTree("reviewScroll", el)}
focusedFile={tree.activeDiff}
onLineComment={(comment) => addCommentToContext({ ...comment, origin: "review" })}
comments={comments.all()}
focusedComment={comments.focus()}
onFocusedCommentChange={comments.setFocus}
onViewFile={openReviewFile}
classes={input.classes}
/>
</Match>
</Switch>
)
@@ -1041,7 +1062,7 @@ export default function Page() {
diffStyle: layout.review.diffStyle(),
onDiffStyleChange: layout.review.setDiffStyle,
loadingClass: "px-6 py-4 text-text-weak",
emptyClass: "h-full px-6 pb-30 flex flex-col items-center justify-center text-center gap-6",
emptyClass: "h-full pb-30 flex flex-col items-center justify-center text-center gap-6",
})}
</div>
</div>
@@ -1569,7 +1590,7 @@ export default function Page() {
container: "px-4",
},
loadingClass: "px-4 py-4 text-text-weak",
emptyClass: "h-full px-4 pb-30 flex flex-col items-center justify-center text-center gap-6",
emptyClass: "h-full pb-30 flex flex-col items-center justify-center text-center gap-6",
})}
scroll={ui.scroll}
onResumeScroll={resumeScroll}
@@ -1683,7 +1704,7 @@ export default function Page() {
direction="horizontal"
size={layout.session.width()}
min={450}
max={window.innerWidth * 0.45}
max={typeof window === "undefined" ? 1000 : window.innerWidth * 0.45}
onResize={layout.session.resize}
/>
</Show>

View File

@@ -228,6 +228,7 @@ export const createScrollSpy = (input: Input) => {
node.delete(key)
visible.delete(key)
dirty = true
schedule()
}
const markDirty = () => {

View File

@@ -41,7 +41,7 @@ export function TerminalPanel(props: {
direction="vertical"
size={props.height}
min={100}
max={window.innerHeight * 0.6}
max={typeof window === "undefined" ? 1000 : window.innerHeight * 0.6}
collapseThreshold={50}
onResize={props.resize}
onCollapse={props.close}

View File

@@ -365,48 +365,81 @@ export const useSessionCommands = (input: {
return [
{
id: "session.share",
title: input.info()?.share?.url ? "Copy share link" : input.language.t("command.session.share"),
title: input.info()?.share?.url
? input.language.t("session.share.copy.copyLink")
: input.language.t("command.session.share"),
description: input.info()?.share?.url
? "Copy share URL to clipboard"
? input.language.t("toast.session.share.success.description")
: input.language.t("command.session.share.description"),
category: input.language.t("command.category.session"),
slash: "share",
disabled: !input.params.id,
onSelect: async () => {
if (!input.params.id) return
const copy = (url: string, existing: boolean) =>
navigator.clipboard
.writeText(url)
.then(() =>
showToast({
title: existing
? input.language.t("session.share.copy.copied")
: input.language.t("toast.session.share.success.title"),
description: input.language.t("toast.session.share.success.description"),
variant: "success",
}),
)
.catch(() =>
showToast({
title: input.language.t("toast.session.share.copyFailed.title"),
variant: "error",
}),
)
const url = input.info()?.share?.url
if (url) {
await copy(url, true)
const write = (value: string) => {
const body = typeof document === "undefined" ? undefined : document.body
if (body) {
const textarea = document.createElement("textarea")
textarea.value = value
textarea.setAttribute("readonly", "")
textarea.style.position = "fixed"
textarea.style.opacity = "0"
textarea.style.pointerEvents = "none"
body.appendChild(textarea)
textarea.select()
const copied = document.execCommand("copy")
body.removeChild(textarea)
if (copied) return Promise.resolve(true)
}
const clipboard = typeof navigator === "undefined" ? undefined : navigator.clipboard
if (!clipboard?.writeText) return Promise.resolve(false)
return clipboard.writeText(value).then(
() => true,
() => false,
)
}
const copy = async (url: string, existing: boolean) => {
const ok = await write(url)
if (!ok) {
showToast({
title: input.language.t("toast.session.share.copyFailed.title"),
variant: "error",
})
return
}
showToast({
title: existing
? input.language.t("session.share.copy.copied")
: input.language.t("toast.session.share.success.title"),
description: input.language.t("toast.session.share.success.description"),
variant: "success",
})
}
const existing = input.info()?.share?.url
if (existing) {
await copy(existing, true)
return
}
await input.sdk.client.session
const url = await input.sdk.client.session
.share({ sessionID: input.params.id })
.then((res) => copy(res.data!.share!.url, false))
.catch(() =>
showToast({
title: input.language.t("toast.session.share.failed.title"),
description: input.language.t("toast.session.share.failed.description"),
variant: "error",
}),
)
.then((res) => res.data?.share?.url)
.catch(() => undefined)
if (!url) {
showToast({
title: input.language.t("toast.session.share.failed.title"),
description: input.language.t("toast.session.share.failed.description"),
variant: "error",
})
return
}
await copy(url, false)
},
},
{

View File

@@ -1,3 +1,5 @@
import { uuid } from "@/utils/uuid"
type Nav = {
id: string
dir?: string
@@ -16,8 +18,6 @@ const key = (dir: string | undefined, to: string) => `${dir ?? ""}:${to}`
const now = () => performance.now()
const uid = () => crypto.randomUUID?.() ?? Math.random().toString(16).slice(2)
const navs = new Map<string, Nav>()
const pending = new Map<string, string>()
const active = new Map<string, string>()
@@ -94,7 +94,7 @@ function ensure(id: string, data: Omit<Nav, "marks" | "logged" | "timer">) {
export function navStart(input: { dir?: string; from?: string; to: string; trigger?: string }) {
if (!dev) return
const id = uid()
const id = uuid()
const start = now()
const nav = ensure(id, { ...input, id, start })
nav.marks["navigate:start"] = start
@@ -109,7 +109,7 @@ export function navParams(input: { dir?: string; from?: string; to: string }) {
const k = key(input.dir, input.to)
const pendingId = pending.get(k)
if (pendingId) pending.delete(k)
const id = pendingId ?? uid()
const id = pendingId ?? uuid()
const start = now()
const nav = ensure(id, { ...input, id, start, trigger: pendingId ? "key" : "route" })

View File

@@ -99,4 +99,9 @@ describe("persist localStorage resilience", () => {
expect(storage.getItem("direct-value")).toBe('{"value":5}')
})
test("normalizer rejects malformed JSON payloads", () => {
const result = persistTesting.normalize({ value: "ok" }, '{"value":"\\x"}')
expect(result).toBeUndefined()
})
})

View File

@@ -1,4 +1,4 @@
import { usePlatform } from "@/context/platform"
import { Platform, usePlatform } from "@/context/platform"
import { makePersisted, type AsyncStorage, type SyncStorage } from "@solid-primitives/storage"
import { checksum } from "@opencode-ai/util/encode"
import { createResource, type Accessor } from "solid-js"
@@ -195,6 +195,14 @@ function parse(value: string) {
}
}
function normalize(defaults: unknown, raw: string, migrate?: (value: unknown) => unknown) {
const parsed = parse(raw)
if (parsed === undefined) return
const migrated = migrate ? migrate(parsed) : parsed
const merged = merge(defaults, migrated)
return JSON.stringify(merged)
}
function workspaceStorage(dir: string) {
const head = dir.slice(0, 12) || "workspace"
const sum = checksum(dir) ?? "0"
@@ -291,6 +299,7 @@ function localStorageDirect(): SyncStorage {
export const PersistTesting = {
localStorageDirect,
localStorageWithPrefix,
normalize,
}
export const Persist = {
@@ -309,9 +318,8 @@ export const Persist = {
},
}
export function removePersisted(target: { storage?: string; key: string }) {
const platform = usePlatform()
const isDesktop = platform.platform === "desktop" && !!platform.storage
export function removePersisted(target: { storage?: string; key: string }, platform?: Platform) {
const isDesktop = platform?.platform === "desktop" && !!platform.storage
if (isDesktop) {
return platform.storage?.(target.storage)?.removeItem(target.key)
@@ -358,12 +366,11 @@ export function persisted<T>(
getItem: (key) => {
const raw = current.getItem(key)
if (raw !== null) {
const parsed = parse(raw)
if (parsed === undefined) return raw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
const next = normalize(defaults, raw, config.migrate)
if (next === undefined) {
current.removeItem(key)
return null
}
if (raw !== next) current.setItem(key, next)
return next
}
@@ -372,16 +379,13 @@ export function persisted<T>(
const legacyRaw = legacyStore.getItem(legacyKey)
if (legacyRaw === null) continue
current.setItem(key, legacyRaw)
const next = normalize(defaults, legacyRaw, config.migrate)
if (next === undefined) {
legacyStore.removeItem(legacyKey)
continue
}
current.setItem(key, next)
legacyStore.removeItem(legacyKey)
const parsed = parse(legacyRaw)
if (parsed === undefined) return legacyRaw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
if (legacyRaw !== next) current.setItem(key, next)
return next
}
@@ -405,12 +409,11 @@ export function persisted<T>(
getItem: async (key) => {
const raw = await current.getItem(key)
if (raw !== null) {
const parsed = parse(raw)
if (parsed === undefined) return raw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
const next = normalize(defaults, raw, config.migrate)
if (next === undefined) {
await current.removeItem(key).catch(() => undefined)
return null
}
if (raw !== next) await current.setItem(key, next)
return next
}
@@ -421,16 +424,13 @@ export function persisted<T>(
const legacyRaw = await legacyStore.getItem(legacyKey)
if (legacyRaw === null) continue
await current.setItem(key, legacyRaw)
const next = normalize(defaults, legacyRaw, config.migrate)
if (next === undefined) {
await legacyStore.removeItem(legacyKey).catch(() => undefined)
continue
}
await current.setItem(key, next)
await legacyStore.removeItem(legacyKey)
const parsed = parse(legacyRaw)
if (parsed === undefined) return legacyRaw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
if (legacyRaw !== next) await current.setItem(key, next)
return next
}

View File

@@ -0,0 +1,78 @@
import { afterEach, describe, expect, test } from "bun:test"
import { uuid } from "./uuid"
const cryptoDescriptor = Object.getOwnPropertyDescriptor(globalThis, "crypto")
const secureDescriptor = Object.getOwnPropertyDescriptor(globalThis, "isSecureContext")
const randomDescriptor = Object.getOwnPropertyDescriptor(Math, "random")
const setCrypto = (value: Partial<Crypto>) => {
Object.defineProperty(globalThis, "crypto", {
configurable: true,
value: value as Crypto,
})
}
const setSecure = (value: boolean) => {
Object.defineProperty(globalThis, "isSecureContext", {
configurable: true,
value,
})
}
const setRandom = (value: () => number) => {
Object.defineProperty(Math, "random", {
configurable: true,
value,
})
}
afterEach(() => {
if (cryptoDescriptor) {
Object.defineProperty(globalThis, "crypto", cryptoDescriptor)
}
if (secureDescriptor) {
Object.defineProperty(globalThis, "isSecureContext", secureDescriptor)
}
if (!secureDescriptor) {
delete (globalThis as { isSecureContext?: boolean }).isSecureContext
}
if (randomDescriptor) {
Object.defineProperty(Math, "random", randomDescriptor)
}
})
describe("uuid", () => {
test("uses randomUUID in secure contexts", () => {
setCrypto({ randomUUID: () => "00000000-0000-0000-0000-000000000000" })
setSecure(true)
expect(uuid()).toBe("00000000-0000-0000-0000-000000000000")
})
test("falls back in insecure contexts", () => {
setCrypto({ randomUUID: () => "00000000-0000-0000-0000-000000000000" })
setSecure(false)
setRandom(() => 0.5)
expect(uuid()).toBe("8")
})
test("falls back when randomUUID throws", () => {
setCrypto({
randomUUID: () => {
throw new DOMException("Failed", "OperationError")
},
})
setSecure(true)
setRandom(() => 0.5)
expect(uuid()).toBe("8")
})
test("falls back when randomUUID is unavailable", () => {
setCrypto({})
setSecure(true)
setRandom(() => 0.5)
expect(uuid()).toBe("8")
})
})

View File

@@ -0,0 +1,12 @@
const fallback = () => Math.random().toString(16).slice(2)
export function uuid() {
const c = globalThis.crypto
if (!c || typeof c.randomUUID !== "function") return fallback()
if (typeof globalThis.isSecureContext === "boolean" && !globalThis.isSecureContext) return fallback()
try {
return c.randomUUID()
} catch {
return fallback()
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.1.53",
"version": "1.1.59",
"type": "module",
"license": "MIT",
"scripts": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

View File

@@ -0,0 +1,18 @@
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(30, 0)">
<g clip-path="url(#clip0_1401_86283)">
<mask id="mask0_1401_86283" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86283)">
<path d="M180 240H60V120H180V240Z" fill="#4B4646"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#F1ECEC"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86283">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

View File

@@ -0,0 +1,18 @@
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(30, 0)">
<g clip-path="url(#clip0_1401_86274)">
<mask id="mask0_1401_86274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86274)">
<path d="M180 240H60V120H180V240Z" fill="#CFCECD"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#211E1E"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86274">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -9,8 +9,8 @@ export const config = {
github: {
repoUrl: "https://github.com/anomalyco/opencode",
starsFormatted: {
compact: "95K",
full: "95,000",
compact: "100K",
full: "100,000",
},
},
@@ -22,8 +22,8 @@ export const config = {
// Static stats (used on landing page)
stats: {
contributors: "650",
commits: "8,500",
contributors: "700",
commits: "9,000",
monthlyUsers: "2.5M",
},
} as const

View File

@@ -4,407 +4,346 @@ import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "\u0627\u0644\u0648\u062b\u0627\u0626\u0642",
"nav.changelog": "\u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a",
"nav.docs": "الوثائق",
"nav.changelog": "سجل التغييرات",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "\u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a",
"nav.enterprise": "المؤسسات",
"nav.zen": "Zen",
"nav.login": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644",
"nav.free": "\u0645\u062c\u0627\u0646\u0627",
"nav.home": "\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629",
"nav.openMenu": "\u0641\u062a\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629",
"nav.getStartedFree": "\u0627\u0628\u062f\u0623 \u0645\u062c\u0627\u0646\u0627",
"nav.login": "تسجيل الدخول",
"nav.free": "مجانا",
"nav.home": "الرئيسية",
"nav.openMenu": "فتح القائمة",
"nav.getStartedFree": "ابدأ مجانا",
"nav.context.copyLogo": "\u0646\u0633\u062e \u0627\u0644\u0634\u0639\u0627\u0631 \u0643\u0640 SVG",
"nav.context.copyWordmark":
"\u0646\u0633\u062e \u0627\u0633\u0645 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0643\u0640 SVG",
"nav.context.brandAssets": "\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0639\u0644\u0627\u0645\u0629",
"nav.context.copyLogo": "نسخ الشعار كـ SVG",
"nav.context.copyWordmark": "نسخ اسم العلامة كـ SVG",
"nav.context.brandAssets": "أصول العلامة التجارية",
"footer.github": "GitHub",
"footer.docs": "\u0627\u0644\u0648\u062b\u0627\u0626\u0642",
"footer.changelog": "\u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a",
"footer.docs": "الوثائق",
"footer.changelog": "سجل التغييرات",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "\u0627\u0644\u0639\u0644\u0627\u0645\u0629",
"legal.privacy": "\u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629",
"legal.terms": "\u0627\u0644\u0634\u0631\u0648\u0637",
"legal.brand": "العلامة التجارية",
"legal.privacy": "الخصوصية",
"legal.terms": "الشروط",
"email.title":
"\u0643\u0646 \u0627\u0644\u0623\u0648\u0644 \u0644\u0645\u0639\u0631\u0641\u0629 \u0639\u0646\u062f \u0625\u0637\u0644\u0627\u0642 \u0645\u0646\u062a\u062c\u0627\u062a \u062c\u062f\u064a\u062f\u0629",
"email.subtitle":
"\u0627\u0646\u0636\u0645 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0648\u0635\u0648\u0644 \u0645\u0628\u0643\u0631.",
"email.placeholder":
"\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a",
"email.subscribe": "\u0627\u0634\u062a\u0631\u0627\u0643",
"email.success":
"\u062a\u0628\u0642\u0649 \u062e\u0637\u0648\u0629 \u0648\u0627\u062d\u062f\u0629: \u062a\u062d\u0642\u0642 \u0645\u0646 \u0628\u0631\u064a\u062f\u0643 \u0648\u0623\u0643\u062f \u0639\u0646\u0648\u0627\u0646\u0643",
"email.title": "كن الأول في المعرفة عند إطلاق منتجات جديدة",
"email.subtitle": "انضم إلى قائمة الانتظار للحصول على وصول مبكر.",
"email.placeholder": "عنوان البريد الإلكتروني",
"email.subscribe": "اشتراك",
"email.success": "تبقّت خطوة واحدة: تحقق من بريدك وأكّد عنوانك",
"notFound.title": "\u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f | opencode",
"notFound.heading":
"404 - \u0627\u0644\u0635\u0641\u062d\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f\u0629",
"notFound.home": "\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629",
"notFound.docs": "\u0627\u0644\u0648\u062b\u0627\u0626\u0642",
"notFound.title": "غير موجود | opencode",
"notFound.heading": "404 - الصفحة غير موجودة",
"notFound.home": "الرئيسية",
"notFound.docs": "الوثائق",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"user.logout": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c",
"user.logout": "تسجيل الخروج",
"workspace.select": "\u0627\u062e\u062a\u0631 \u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0639\u0645\u0644",
"workspace.createNew":
"+ \u0625\u0646\u0634\u0627\u0621 \u0645\u0633\u0627\u062d\u0629 \u0639\u0645\u0644 \u062c\u062f\u064a\u062f\u0629",
"workspace.modal.title":
"\u0625\u0646\u0634\u0627\u0621 \u0645\u0633\u0627\u062d\u0629 \u0639\u0645\u0644 \u062c\u062f\u064a\u062f\u0629",
"workspace.modal.placeholder":
"\u0623\u062f\u062e\u0644 \u0627\u0633\u0645 \u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0639\u0645\u0644",
"workspace.select": "اختر مساحة العمل",
"workspace.createNew": "+ إنشاء مساحة عمل جديدة",
"workspace.modal.title": "إنشاء مساحة عمل جديدة",
"workspace.modal.placeholder": "أدخل اسم مساحة العمل",
"common.cancel": "\u0625\u0644\u063a\u0627\u0621",
"common.creating": "\u062c\u0627\u0631\u064a \u0627\u0644\u0625\u0646\u0634\u0627\u0621...",
"common.create": "\u0625\u0646\u0634\u0627\u0621",
"common.cancel": "إلغاء",
"common.creating": "جارٍ الإنشاء...",
"common.create": "إنشاء",
"common.videoUnsupported":
"\u0645\u062a\u0635\u0641\u062d\u0643 \u0644\u0627 \u064a\u062f\u0639\u0645 \u0648\u0633\u0645 \u0627\u0644\u0641\u064a\u062f\u064a\u0648.",
"common.figure": "\u0634\u0643\u0644 {{n}}.",
"common.faq": "\u0627\u0644\u0623\u0633\u0626\u0644\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629",
"common.learnMore": "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064a\u062f",
"common.videoUnsupported": "متصفحك لا يدعم وسم الفيديو.",
"common.figure": "شكل {{n}}.",
"common.faq": "الأسئلة الشائعة",
"common.learnMore": "اعرف المزيد",
"home.title":
"OpenCode | \u0648\u0643\u064a\u0644 \u0628\u0631\u0645\u062c\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631",
"error.invalidPlan": "خطة غير صالحة",
"error.workspaceRequired": "معرف مساحة العمل مطلوب",
"error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
"error.limitRequired": "الحد مطلوب.",
"error.monthlyLimitInvalid": "قم بتعيين حد شهري صالح.",
"error.workspaceNameRequired": "اسم مساحة العمل مطلوب.",
"error.nameTooLong": "يجب أن يكون الاسم 255 حرفًا أو أقل.",
"error.emailRequired": "البريد الإلكتروني مطلوب",
"error.roleRequired": "الدور مطلوب",
"error.idRequired": "المعرف مطلوب",
"error.nameRequired": "الاسم مطلوب",
"error.providerRequired": "المزود مطلوب",
"error.apiKeyRequired": "مفتاح API مطلوب",
"error.modelRequired": "النموذج مطلوب",
"error.reloadAmountMin": "يجب أن يكون مبلغ الشحن ${{amount}} على الأقل",
"error.reloadTriggerMin": "يجب أن يكون حد الرصيد ${{amount}} على الأقل",
"home.banner.badge": "\u062c\u062f\u064a\u062f",
"home.banner.text":
"\u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0645\u062a\u0627\u062d \u0628\u0646\u0633\u062e\u0629 \u062a\u062c\u0631\u064a\u0628\u064a\u0629",
"home.banner.platforms": "\u0639\u0644\u0649 macOS\u060c Windows\u060c \u0648Linux",
"home.banner.downloadNow": "\u062d\u0645\u0651\u0644 \u0627\u0644\u0622\u0646",
"home.banner.downloadBetaNow":
"\u062d\u0645\u0651\u0644 \u0627\u0644\u0622\u0646 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a\u0629 \u0644\u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628",
"home.title": "OpenCode | وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"home.hero.title":
"\u0648\u0643\u064a\u0644 \u0628\u0631\u0645\u062c\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631",
"home.hero.subtitle.a":
"\u0646\u0645\u0627\u0630\u062c \u0645\u062c\u0627\u0646\u064a\u0629 \u0645\u0636\u0645\u0651\u0646\u0629 \u0623\u0648 \u0627\u0631\u0628\u0637 \u0623\u064a \u0646\u0645\u0648\u0630\u062c \u0645\u0646 \u0623\u064a \u0645\u0632\u0648\u0651\u062f\u060c",
"home.hero.subtitle.b":
"\u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 Claude\u060c GPT\u060c Gemini \u0648\u063a\u064a\u0631\u0647\u0627.",
"temp.title": "opencode | وكيل برمجة بالذكاء الاصطناعي مبني للطرفية",
"temp.hero.title": "وكيل البرمجة بالذكاء الاصطناعي المبني للطرفية",
"temp.zen": "opencode zen",
"temp.getStarted": "ابدأ",
"temp.feature.native.title": "واجهة طرفية أصلية",
"temp.feature.native.body": "واجهة مستخدم طرفية سريعة الاستجابة، أصلية، وقابلة للتخصيص",
"temp.feature.zen.beforeLink": "قائمة",
"temp.feature.zen.link": "منسقة من النماذج",
"temp.feature.zen.afterLink": "مقدمة من opencode",
"temp.feature.models.beforeLink": "يدعم أكثر من 75 مزود LLM من خلال",
"temp.feature.models.afterLink": "، بما في ذلك النماذج المحلية",
"temp.screenshot.caption": "واجهة OpenCode الطرفية مع سمة tokyonight",
"temp.screenshot.alt": "واجهة OpenCode الطرفية بسمة tokyonight",
"home.install.ariaLabel": "\u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u062b\u0628\u064a\u062a",
"home.banner.badge": "جديد",
"home.banner.text": "تطبيق سطح المكتب متاح بنسخة تجريبية",
"home.banner.platforms": "على macOS، Windows، وLinux",
"home.banner.downloadNow": "حمّل الآن",
"home.banner.downloadBetaNow": "حمّل النسخة التجريبية لتطبيق سطح المكتب الآن",
"home.what.title": "\u0645\u0627 \u0647\u0648 OpenCode\u061f",
"home.what.body":
"OpenCode \u0648\u0643\u064a\u0644 \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631 \u064a\u0633\u0627\u0639\u062f\u0643 \u0639\u0644\u0649 \u0643\u062a\u0627\u0628\u0629 \u0627\u0644\u0643\u0648\u062f \u0641\u064a \u0627\u0644\u0637\u0631\u0641\u064a\u0629\u060c IDE\u060c \u0623\u0648 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628.",
"home.what.lsp.title": "\u062f\u0639\u0645 LSP",
"home.what.lsp.body":
"\u064a\u062d\u0645\u0651\u0644 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0645\u0648\u0627\u0641\u0642\u0627\u062a LSP \u0627\u0644\u0645\u0646\u0627\u0633\u0628\u0629 \u0644\u0644\u0640 LLM",
"home.what.multiSession.title": "\u062c\u0644\u0633\u0627\u062a \u0645\u062a\u0639\u062f\u062f\u0629",
"home.what.multiSession.body":
"\u0627\u0628\u062f\u0623 \u0639\u062f\u0629 \u0648\u0643\u0644\u0627\u0621 \u0628\u0627\u0644\u062a\u0648\u0627\u0632\u064a \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
"home.what.shareLinks.title": "\u0631\u0648\u0627\u0628\u0637 \u0645\u0634\u0627\u0631\u0643\u0629",
"home.what.shareLinks.body":
"\u0634\u0627\u0631\u0643 \u0631\u0627\u0628\u0637\u064b\u0627 \u0644\u0623\u064a \u062c\u0644\u0633\u0629 \u0644\u0644\u0631\u062c\u0648\u0639 \u0625\u0644\u064a\u0647\u0627 \u0623\u0648 \u0644\u0644\u062a\u0635\u062d\u064a\u062d",
"home.hero.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"home.hero.subtitle.a": "نماذج مجانية مضمّنة أو اربط أي نموذج من أي مزوّد،",
"home.hero.subtitle.b": "بما في ذلك Claude، GPT، Gemini وغيرها.",
"home.install.ariaLabel": "خيارات التثبيت",
"home.what.title": "ما هو OpenCode؟",
"home.what.body": "OpenCode وكيل مفتوح المصدر يساعدك على كتابة الكود في الطرفية، IDE، أو سطح المكتب.",
"home.what.lsp.title": "دعم LSP",
"home.what.lsp.body": "يحمّل تلقائيًا موافقات LSP المناسبة للـ LLM",
"home.what.multiSession.title": "جلسات متعددة",
"home.what.multiSession.body": "ابدأ عدة وكلاء بالتوازي على نفس المشروع",
"home.what.shareLinks.title": "روابط المشاركة",
"home.what.shareLinks.body": "شارك رابطًا لأي جلسة للرجوع إليها أو لتصحيح الأخطاء",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body":
"\u0633\u062c\u0651\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u0640 GitHub \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u062d\u0633\u0627\u0628\u0643 \u0641\u064a Copilot",
"home.what.copilot.body": "سجّل الدخول بـ GitHub لاستخدام حسابك في Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body":
"\u0633\u062c\u0651\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u0640 OpenAI \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u062d\u0633\u0627\u0628\u0643 \u0641\u064a ChatGPT Plus \u0623\u0648 Pro",
"home.what.anyModel.title": "\u0623\u064a \u0646\u0645\u0648\u0630\u062c",
"home.what.anyModel.body":
"75+ \u0645\u0632\u0648\u0651\u062f LLM \u0639\u0628\u0631 Models.dev\u060c \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0645\u062d\u0644\u064a\u0629",
"home.what.anyEditor.title": "\u0623\u064a \u0645\u062d\u0631\u0631",
"home.what.anyEditor.body":
"\u0645\u062a\u0627\u062d \u0643\u0648\u0627\u062c\u0647\u0629 \u0637\u0631\u0641\u064a\u0629\u060c \u0648\u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0645\u0643\u062a\u0628\u060c \u0648\u0627\u0645\u062a\u062f\u0627\u062f IDE",
"home.what.readDocs": "\u0627\u0642\u0631\u0623 \u0627\u0644\u0648\u062b\u0627\u0626\u0642",
"home.what.chatgptPlus.body": "سجّل الدخول بـ OpenAI لاستخدام حسابك في ChatGPT Plus أو Pro",
"home.what.anyModel.title": "أي نموذج",
"home.what.anyModel.body": "75+ مزوّد LLM عبر Models.dev، بما في ذلك النماذج المحلية",
"home.what.anyEditor.title": "أي محرر",
"home.what.anyEditor.body": "متاح كواجهة طرفية، وتطبيق سطح مكتب، وامتداد IDE",
"home.what.readDocs": "اقرأ الوثائق",
"home.growth.title":
"\u0648\u0643\u064a\u0644 \u0628\u0631\u0645\u062c\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631",
"home.growth.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"home.growth.body":
"\u0645\u0639 \u0623\u0643\u062b\u0631 \u0645\u0646 <strong>{{stars}}</strong> \u0646\u062c\u0645\u0629 \u0639\u0644\u0649 GitHub\u060c \u0648<strong>{{contributors}}</strong> \u0645\u0633\u0627\u0647\u0645\u064b\u0627\u060c \u0648\u0623\u0643\u062b\u0631 \u0645\u0646 <strong>{{commits}}</strong> \u062a\u0639\u0647\u062f\u064b\u0627\u060c \u064a\u0633\u062a\u062e\u062f\u0645 OpenCode \u0648\u064a\u062b\u0642 \u0628\u0647 \u0623\u0643\u062b\u0631 \u0645\u0646 <strong>{{monthlyUsers}}</strong> \u0645\u0637\u0648\u0651\u0631 \u0643\u0644 \u0634\u0647\u0631.",
"home.growth.githubStars": "\u0646\u062c\u0648\u0645 GitHub",
"home.growth.contributors": "\u0627\u0644\u0645\u0633\u0627\u0647\u0645\u0648\u0646",
"home.growth.monthlyDevs": "\u0645\u0637\u0648\u0631\u0648\u0646 \u0634\u0647\u0631\u064a\u064b\u0627",
"مع أكثر من <strong>{{stars}}</strong> نجمة على GitHub، و<strong>{{contributors}}</strong> مساهمًا، وأكثر من <strong>{{commits}}</strong> Commit، يستخدم OpenCode ويثق به أكثر من <strong>{{monthlyUsers}}</strong> مطوّر كل شهر.",
"home.growth.githubStars": "نجوم GitHub",
"home.growth.contributors": "المساهمون",
"home.growth.monthlyDevs": "مطورون شهريًا",
"home.privacy.title":
"\u0645\u0635\u0645\u0645 \u0644\u0644\u062e\u0635\u0648\u0635\u064a\u0629 \u0623\u0648\u0644\u0627\u064b",
"home.privacy.body":
"\u0644\u0627 \u064a\u062e\u0632\u0651\u0646 OpenCode \u0623\u064a \u0643\u0648\u062f \u0623\u0648 \u0628\u064a\u0627\u0646\u0627\u062a \u0633\u064a\u0627\u0642\u060c \u0644\u064a\u062a\u0645\u0643\u0646 \u0645\u0646 \u0627\u0644\u0639\u0645\u0644 \u0641\u064a \u0628\u064a\u0626\u0627\u062a \u062d\u0633\u0627\u0633\u0629 \u0644\u0644\u062e\u0635\u0648\u0635\u064a\u0629.",
"home.privacy.learnMore": "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064a\u062f \u0639\u0646",
"home.privacy.link": "\u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629",
"home.privacy.title": "مصمم للخصوصية أولاً",
"home.privacy.body": "لا يخزّن OpenCode أي كود أو بيانات سياق، ليتمكن من العمل في بيئات حساسة للخصوصية.",
"home.privacy.learnMore": "اعرف المزيد عن",
"home.privacy.link": "الخصوصية",
"home.faq.q1": "\u0645\u0627 \u0647\u0648 OpenCode\u061f",
"home.faq.q1": "ما هو OpenCode؟",
"home.faq.a1":
"OpenCode \u0648\u0643\u064a\u0644 \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631 \u064a\u0633\u0627\u0639\u062f\u0643 \u0639\u0644\u0649 \u0643\u062a\u0627\u0628\u0629 \u0648\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0643\u0648\u062f \u0645\u0639 \u0623\u064a \u0646\u0645\u0648\u0630\u062c \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u0645\u062a\u0627\u062d \u0643\u0648\u0627\u062c\u0647\u0629 \u0637\u0631\u0641\u064a\u0629\u060c \u0648\u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0645\u0643\u062a\u0628\u060c \u0623\u0648 \u0627\u0645\u062a\u062f\u0627\u062f IDE.",
"home.faq.q2": "\u0643\u064a\u0641 \u0623\u0633\u062a\u062e\u062f\u0645 OpenCode\u061f",
"home.faq.a2.before":
"\u0623\u0633\u0647\u0644 \u0637\u0631\u064a\u0642\u0629 \u0644\u0644\u0628\u062f\u0621 \u0647\u064a \u0642\u0631\u0627\u0621\u0629",
"home.faq.a2.link": "\u0627\u0644\u0645\u0642\u062f\u0645\u0629",
"home.faq.q3":
"\u0647\u0644 \u0623\u062d\u062a\u0627\u062c \u0644\u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0625\u0636\u0627\u0641\u064a\u0629 \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 OpenCode\u061f",
"OpenCode وكيل مفتوح المصدر يساعدك على كتابة وتشغيل الكود مع أي نموذج ذكاء اصطناعي. متاح كواجهة طرفية، وتطبيق سطح مكتب، أو امتداد IDE.",
"home.faq.q2": "كيف أستخدم OpenCode؟",
"home.faq.a2.before": "أسهل طريقة للبدء هي قراءة",
"home.faq.a2.link": "المقدمة",
"home.faq.q3": "هل أحتاج لاشتراكات ذكاء اصطناعي إضافية لاستخدام OpenCode؟",
"home.faq.a3.p1":
"\u0644\u064a\u0633 \u0628\u0627\u0644\u0636\u0631\u0648\u0631\u0629\u060c \u0641\u0640 OpenCode \u064a\u0623\u062a\u064a \u0645\u0639 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u0646 \u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0645\u062c\u0627\u0646\u064a\u0629 \u0627\u0644\u062a\u064a \u062a\u0633\u062a\u0637\u064a\u0639 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627 \u062f\u0648\u0646 \u0625\u0646\u0634\u0627\u0621 \u062d\u0633\u0627\u0628.",
"home.faq.a3.p2.beforeZen":
"\u0648\u0628\u062e\u0644\u0627\u0641 \u0630\u0644\u0643\u060c \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629 \u0628\u0625\u0646\u0634\u0627\u0621 \u062d\u0633\u0627\u0628",
"ليس بالضرورة، فـ OpenCode يأتي مع مجموعة من النماذج المجانية التي تستطيع استخدامها دون إنشاء حساب.",
"home.faq.a3.p2.beforeZen": "وبخلاف ذلك، يمكنك استخدام أي من نماذج البرمجة الشائعة بإنشاء حساب",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"\u0645\u0639 \u0623\u0646\u0646\u0627 \u0646\u0634\u062c\u0651\u0639 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0639\u0644\u0649 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Zen\u060c \u0641\u0625\u0646 OpenCode \u064a\u0639\u0645\u0644 \u0623\u064a\u0636\u064b\u0627 \u0645\u0639 \u0627\u0644\u0645\u0632\u0648\u0651\u062f\u064a\u0646 \u0627\u0644\u0634\u0627\u0626\u0639\u064a\u0646 \u0645\u062b\u0644 OpenAI\u060c Anthropic\u060c xAI\u060c \u0625\u0644\u062e.",
"home.faq.a3.p4.beforeLocal":
"\u0648\u064a\u0645\u0643\u0646\u0643 \u0623\u064a\u0636\u064b\u0627 \u0631\u0628\u0637",
"home.faq.a3.p4.localLink": "\u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0645\u062d\u0644\u064a\u0629",
"home.faq.q4":
"\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a\u064a \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0645\u0639 OpenCode\u061f",
"مع أننا نشجّع المستخدمين على استخدام Zen، فإن OpenCode يعمل أيضًا مع كل المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
"home.faq.a3.p4.beforeLocal": "ويمكنك أيضًا ربط",
"home.faq.a3.p4.localLink": "النماذج المحلية",
"home.faq.q4": "هل يمكنني استخدام اشتراكاتي الحالية مع OpenCode؟",
"home.faq.a4.p1":
"\u0646\u0639\u0645\u060c \u064a\u062f\u0639\u0645 OpenCode \u062e\u0637\u0637 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643 \u0645\u0646 \u0643\u0644 \u0627\u0644\u0645\u0632\u0648\u0651\u062f\u064a\u0646 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u064a\u0646. \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0634\u062a\u0631\u0627\u0643\u0627\u062a Claude Pro/Max\u060c ChatGPT Plus/Pro\u060c \u0623\u0648 GitHub Copilot.",
"home.faq.q5":
"\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u0627\u0633\u062a\u062e\u062f\u0627\u0645 OpenCode \u0641\u064a \u0627\u0644\u0637\u0631\u0641\u064a\u0629 \u0641\u0642\u0637\u061f",
"home.faq.a5.beforeDesktop":
"\u0644\u0627 \u0628\u0639\u062f \u0627\u0644\u0622\u0646! OpenCode \u0645\u062a\u0627\u062d \u0627\u0644\u0622\u0646 \u0643\u062a\u0637\u0628\u064a\u0642 \u0644\u0640",
"home.faq.a5.desktop": "\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628",
"home.faq.a5.and": "\u0648",
"home.faq.a5.web": "\u0627\u0644\u0648\u064a\u0628",
"home.faq.q6": "\u0643\u0645 \u062a\u0643\u0644\u0641\u0629 OpenCode\u061f",
"نعم، يدعم OpenCode خطط الاشتراك من كل المزودين الرئيسيين. يمكنك استخدام اشتراكات Claude Pro/Max، ChatGPT Plus/Pro، أو GitHub Copilot.",
"home.faq.q5": "هل يمكنني استخدام OpenCode في الطرفية فقط؟",
"home.faq.a5.beforeDesktop": "ليس بعد الآن! OpenCode متاح الآن كتطبيق لـ",
"home.faq.a5.desktop": "سطح المكتب",
"home.faq.a5.and": ",
"home.faq.a5.web": "الويب",
"home.faq.q6": "كم تكلفة OpenCode؟",
"home.faq.a6":
"OpenCode \u0645\u062c\u0627\u0646\u064a 100% \u0644\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645. \u0643\u0645\u0627 \u064a\u0623\u062a\u064a \u0645\u0639 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u0646 \u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0645\u062c\u0627\u0646\u064a\u0629. \u0642\u062f \u062a\u0648\u062c\u062f \u062a\u0643\u0627\u0644\u064a\u0641 \u0625\u0636\u0627\u0641\u064a\u0629 \u0625\u0630\u0627 \u0631\u0628\u0637\u062a \u0645\u0632\u0648\u0651\u062f\u064b\u0627 \u0622\u062e\u0631.",
"home.faq.q7":
"\u0645\u0627\u0630\u0627 \u0639\u0646 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629\u061f",
"home.faq.a7.p1":
"\u0644\u0627 \u064a\u062a\u0645 \u062a\u062e\u0632\u064a\u0646 \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0625\u0644\u0627 \u0639\u0646\u062f\u0645\u0627 \u062a\u0633\u062a\u062e\u062f\u0645 \u0646\u0645\u0627\u0630\u062c\u0646\u0627 \u0627\u0644\u0645\u062c\u0627\u0646\u064a\u0629 \u0623\u0648 \u062a\u0646\u0634\u0626 \u0631\u0648\u0627\u0628\u0637 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u0629.",
"home.faq.a7.p2.beforeModels": "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064a\u062f \u0639\u0646",
"home.faq.a7.p2.modelsLink": "\u0646\u0645\u0627\u0630\u062c\u0646\u0627",
"home.faq.a7.p2.and": "\u0648",
"home.faq.a7.p2.shareLink": "\u0635\u0641\u062d\u0627\u062a \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629",
"home.faq.q8": "\u0647\u0644 OpenCode \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631\u061f",
"home.faq.a8.p1":
"\u0646\u0639\u0645\u060c OpenCode \u0645\u0641\u062a\u0648\u062d \u0627\u0644\u0645\u0635\u062f\u0631 \u0628\u0627\u0644\u0643\u0627\u0645\u0644. \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0645\u0635\u062f\u0631\u064a \u0645\u062a\u0627\u062d \u0639\u0644\u0646\u064b\u0627 \u0639\u0644\u0649",
"home.faq.a8.p2": "\u0628\u0645\u0648\u062c\u0628",
"home.faq.a8.mitLicense": "\u0631\u062e\u0635\u0629 MIT",
"OpenCode مجاني 100% للاستخدام. كما يأتي مع مجموعة من النماذج المجانية. قد توجد تكاليف إضافية إذا ربطت مزوّدًا آخر.",
"home.faq.q7": "ماذا عن البيانات والخصوصية؟",
"home.faq.a7.p1": "لا يتم تخزين بياناتك ومعلوماتك إلا عندما تستخدم نماذجنا المجانية أو تنشئ روابط قابلة للمشاركة.",
"home.faq.a7.p2.beforeModels": "اعرف المزيد عن",
"home.faq.a7.p2.modelsLink": "نماذجنا",
"home.faq.a7.p2.and": ",
"home.faq.a7.p2.shareLink": "صفحات المشاركة",
"home.faq.q8": "هل OpenCode مفتوح المصدر؟",
"home.faq.a8.p1": "نعم، OpenCode مفتوح المصدر بالكامل. الكود المصدري متاح علنًا على",
"home.faq.a8.p2": "بموجب",
"home.faq.a8.mitLicense": "رخصة MIT",
"home.faq.a8.p3":
", \u0645\u0645\u0627 \u064a\u0639\u0646\u064a \u0623\u0646 \u0623\u064a \u0634\u062e\u0635 \u064a\u0633\u062a\u0637\u064a\u0639 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647 \u0623\u0648 \u062a\u0639\u062f\u064a\u0644\u0647 \u0623\u0648 \u0627\u0644\u0645\u0633\u0627\u0647\u0645\u0629 \u0641\u064a \u062a\u0637\u0648\u064a\u0631\u0647. \u064a\u0645\u0643\u0646 \u0644\u0623\u064a \u0634\u062e\u0635 \u0645\u0646 \u0627\u0644\u0645\u062c\u062a\u0645\u0639 \u0641\u062a\u062d \u0642\u0636\u0627\u064a\u0627\u060c \u0648\u062a\u0642\u062f\u064a\u0645 \u0637\u0644\u0628\u0627\u062a \u0627\u0644\u0633\u062d\u0628\u060c \u0648\u062a\u0648\u0633\u064a\u0639 \u0627\u0644\u0648\u0638\u0627\u0626\u0641.",
"، مما يعني أن أي شخص يستطيع استخدامه أو تعديله أو المساهمة في تطويره. يمكن لأي شخص من المجتمع فتح قضايا، وتقديم طلبات سحب، وتوسيع الوظائف.",
"home.zenCta.title":
"\u0646\u0645\u0627\u0630\u062c \u0645\u0648\u062b\u0648\u0642\u0629 \u0648\u0645\u062d\u0633\u0646\u0629 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629",
"home.zenCta.title": "وصول لنماذج محسنة وموثوقة لوكلاء البرمجة",
"home.zenCta.body":
"\u064a\u0645\u0646\u062d\u0643 Zen \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u062e\u062a\u0627\u0631\u0629 \u0628\u0639\u0646\u0627\u064a\u0629 \u0645\u0646 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0644\u062a\u064a \u0627\u062e\u062a\u0628\u0631\u0647\u0627 OpenCode \u0648\u0642\u0627\u0633 \u0623\u062f\u0627\u0621\u0647\u0627 \u062e\u0635\u064a\u0635\u064b\u0627 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629. \u0644\u0627 \u062d\u0627\u062c\u0629 \u0644\u0644\u0642\u0644\u0642 \u0628\u0634\u0623\u0646 \u0627\u062e\u062a\u0644\u0627\u0641 \u0627\u0644\u0623\u062f\u0627\u0621 \u0648\u0627\u0644\u062c\u0648\u062f\u0629 \u0628\u064a\u0646 \u0627\u0644\u0645\u0632\u0648\u0651\u062f\u064a\u0646\u061b \u0627\u0633\u062a\u062e\u062f\u0645 \u0646\u0645\u0627\u0630\u062c \u0645\u062d\u0642\u0642\u0629 \u062a\u0639\u0645\u0644.",
"home.zenCta.link": "\u062a\u0639\u0631\u0641 \u0639\u0644\u0649 Zen",
"يمنحك Zen الوصول إلى مجموعة مختارة بعناية من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة بين المزودين، استخدم نماذج محققة تعمل بكفاءة.",
"home.zenCta.link": "تعرف على Zen",
"download.title": "OpenCode | \u062a\u0646\u0632\u064a\u0644",
"zen.title":
"OpenCode Zen | \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u062e\u062a\u0627\u0631\u0629 \u0645\u0646 \u0646\u0645\u0627\u0630\u062c \u0645\u0648\u062b\u0648\u0642\u0629 \u0648\u0645\u062d\u0633\u0646\u0629 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629",
"zen.hero.title":
"\u0646\u0645\u0627\u0630\u062c \u0645\u0648\u062b\u0648\u0642\u0629 \u0648\u0645\u062d\u0633\u0646\u0629 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629",
"zen.title": "OpenCode Zen | مجموعة منسقة من النماذج المحسنة والموثوقة لوكلاء البرمجة",
"zen.hero.title": "نماذج محسنة وموثوقة لوكلاء البرمجة",
"zen.hero.body":
"\u064a\u0645\u0646\u062d\u0643 Zen \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u062e\u062a\u0627\u0631\u0629 \u0628\u0639\u0646\u0627\u064a\u0629 \u0645\u0646 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0644\u062a\u064a \u0627\u062e\u062a\u0628\u0631\u0647\u0627 OpenCode \u0648\u0642\u0627\u0633 \u0623\u062f\u0627\u0621\u0647\u0627 \u062e\u0635\u064a\u0635\u064b\u0627 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629. \u0644\u0627 \u062d\u0627\u062c\u0629 \u0644\u0644\u0642\u0644\u0642 \u0628\u0634\u0623\u0646 \u0627\u062e\u062a\u0644\u0627\u0641 \u0627\u0644\u0623\u062f\u0627\u0621 \u0648\u0627\u0644\u062c\u0648\u062f\u0629 \u0628\u064a\u0646 \u0627\u0644\u0645\u0632\u0648\u0651\u062f\u064a\u0646\u061b \u0627\u0633\u062a\u062e\u062f\u0645 \u0646\u0645\u0627\u0630\u062c \u0645\u062d\u0642\u0642\u0629 \u062a\u0639\u0645\u0644.",
"يمنحك Zen الوصول إلى مجموعة منسقة من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة، استخدم نماذج محققة تعمل بكفاءة.",
"zen.faq.q1": "\u0645\u0627 \u0647\u0648 OpenCode Zen\u061f",
"zen.faq.q1": "ما هو OpenCode Zen؟",
"zen.faq.a1":
"Zen \u0647\u0648 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u062e\u062a\u0627\u0631\u0629 \u0645\u0646 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0644\u062a\u064a \u062a\u0645 \u0627\u062e\u062a\u0628\u0627\u0631\u0647\u0627 \u0648\u0642\u064a\u0627\u0633 \u0627\u062f\u0627\u0626\u0647\u0627 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629\u060c \u0648\u0642\u062f \u0627\u0646\u0634\u0623\u0647\u0627 \u0627\u0644\u0641\u0631\u064a\u0642 \u0648\u0631\u0627\u0621 OpenCode.",
"zen.faq.q2": "\u0645\u0627 \u0627\u0644\u0630\u064a \u064a\u062c\u0639\u0644 Zen \u0627\u062f\u0642\u061f",
"Zen هو مجموعة منسقة من نماذج الذكاء الاصطناعي التي تم اختبارها وقياس أدائها لوكلاء البرمجة، أنشأها الفريق المطور لـ OpenCode.",
"zen.faq.q2": "ما الذي يجعل Zen أكثر دقة؟",
"zen.faq.a2":
"Zen \u064a\u0648\u0641\u0631 \u0641\u0642\u0637 \u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u062a\u064a \u062a\u0645 \u0627\u062e\u062a\u0628\u0627\u0631\u0647\u0627 \u0648\u0642\u064a\u0627\u0633 \u0627\u062f\u0627\u0626\u0647\u0627 \u062e\u0635\u064a\u0635\u0627 \u0644\u0648\u0643\u0644\u0627\u0621 \u0627\u0644\u0628\u0631\u0645\u062c\u0629. \u0644\u0646 \u062a\u0633\u062a\u062e\u062f\u0645 \u0633\u0643\u064a\u0646 \u0632\u0628\u062f\u0629 \u0644\u0642\u0637\u0639 \u0634\u0631\u064a\u062d\u0629 \u0644\u062d\u0645\u060c \u0644\u0627 \u062a\u0633\u062a\u062e\u062f\u0645 \u0646\u0645\u0627\u0630\u062c \u0633\u064a\u0626\u0629 \u0644\u0644\u0628\u0631\u0645\u062c\u0629.",
"zen.faq.q3": "\u0647\u0644 Zen \u0627\u0631\u062e\u0635\u061f",
"يوفر Zen فقط النماذج التي تم اختبارها وقياس أدائها خصيصًا لوكلاء البرمجة. لن تستخدم سكين زبدة لقطع شريحة لحم، فلا تستخدم نماذج ضعيفة للبرمجة.",
"zen.faq.q3": "هل Zen أرخص؟",
"zen.faq.a3":
"Zen \u0644\u064a\u0633 \u0644\u0644\u0631\u0628\u062d. Zen \u064a\u0646\u0642\u0644 \u062a\u0643\u0627\u0644\u064a\u0641 \u0645\u0632\u0648\u062f\u064a \u0627\u0644\u0646\u0645\u0627\u0630\u062c \u0627\u0644\u064a\u0643 \u0645\u0628\u0627\u0634\u0631\u0629. \u0643\u0644\u0645\u0627 \u0632\u0627\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Zen\u060c \u062a\u0645\u0643\u0646 OpenCode \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0648\u0636 \u0639\u0644\u0649 \u0627\u0633\u0639\u0627\u0631 \u0627\u0641\u0636\u0644 \u0648\u062a\u0645\u0631\u064a\u0631\u0647\u0627 \u0627\u0644\u064a\u0643.",
"zen.faq.q4": "\u0643\u0645 \u062a\u0643\u0644\u0641 Zen\u061f",
"Zen ليس للربح. يمرر Zen التكاليف من مزودي النماذج إليك مباشرة. كلما زاد استخدام Zen، تمكن OpenCode من التفاوض على أسعار أفضل وتمريرها إليك.",
"zen.faq.q4": "كم تكلفة Zen؟",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "\u064a\u062d\u0627\u0633\u0628 \u0644\u0643\u0644 \u0637\u0644\u0628",
"zen.faq.a4.p1.afterPricing":
"\u0628\u062f\u0648\u0646 \u0627\u064a \u0632\u064a\u0627\u062f\u0627\u062a\u060c \u0644\u0630\u0627 \u062a\u062f\u0641\u0639 \u0628\u0627\u0644\u0636\u0628\u0637 \u0645\u0627 \u064a\u0641\u0631\u0636\u0647 \u0645\u0632\u0648\u062f \u0627\u0644\u0646\u0645\u0648\u0630\u062c.",
"zen.faq.a4.p2.beforeAccount":
"\u062a\u0639\u062a\u0645\u062f \u062a\u0643\u0644\u0641\u062a\u0643 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a\u0629 \u0639\u0644\u0649 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645\u060c \u0648\u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u064a\u064a\u0646 \u062d\u062f\u0648\u062f \u0627\u0646\u0641\u0627\u0642 \u0634\u0647\u0631\u064a\u0629 \u0641\u064a",
"zen.faq.a4.p2.accountLink": "\u062d\u0633\u0627\u0628\u0643",
"zen.faq.a4.p1.pricingLink": "يحاسب لكل طلب",
"zen.faq.a4.p1.afterPricing": "بدون أي هوامش ربح، لذا تدفع بالضبط ما يفرضه مزود النموذج.",
"zen.faq.a4.p2.beforeAccount": "تعتمد تكلفتك الإجمالية على الاستخدام، ويمكنك تعيين حدود إنفاق شهرية في",
"zen.faq.a4.p2.accountLink": "حسابك",
"zen.faq.a4.p3":
"\u0644\u062a\u063a\u0637\u064a\u0629 \u0627\u0644\u062a\u0643\u0627\u0644\u064a\u0641\u060c \u062a\u0636\u064a\u0641 OpenCode \u0641\u0642\u0637 \u0631\u0633\u0648\u0645\u0627 \u0635\u063a\u064a\u0631\u0629 \u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u062f\u0641\u0639 \u0642\u062f\u0631\u0647\u0627 $1.23 \u0644\u0643\u0644 \u0627\u0639\u0627\u062f\u0629 \u0634\u062d\u0646 \u0631\u0635\u064a\u062f \u0628\u0642\u064a\u0645\u0629 $20.",
"zen.faq.q5":
"\u0645\u0627\u0630\u0627 \u0639\u0646 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629\u061f",
"لتغطية التكاليف، يضيف OpenCode فقط رسومًا صغيرة لمعالجة الدفع قدرها 1.23 دولار لكل إعادة شحن رصيد بقيمة 20 دولارًا.",
"zen.faq.q5": "ماذا عن البيانات والخصوصية؟",
"zen.faq.a5.beforeExceptions":
"\u064a\u062a\u0645 \u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u062c\u0645\u064a\u0639 \u0646\u0645\u0627\u0630\u062c Zen \u0641\u064a \u0627\u0644\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629. \u064a\u0644\u062a\u0632\u0645 \u0627\u0644\u0645\u0632\u0648\u062f\u0648\u0646 \u0628\u0633\u064a\u0627\u0633\u0629 \u0639\u062f\u0645 \u0627\u0644\u0627\u062d\u062a\u0641\u0627\u0638 \u0628\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0644\u0627 \u064a\u0633\u062a\u062e\u062f\u0645\u0648\u0646 \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0644\u062a\u062f\u0631\u064a\u0628 \u0627\u0644\u0646\u0645\u0627\u0630\u062c\u060c \u0645\u0639",
"zen.faq.a5.exceptionsLink":
"\u0627\u0644\u0627\u0633\u062a\u062b\u0646\u0627\u0621\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629",
"zen.faq.q6":
"\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u062a\u0639\u064a\u064a\u0646 \u062d\u062f\u0648\u062f \u0627\u0646\u0641\u0627\u0642\u061f",
"zen.faq.a6":
"\u0646\u0639\u0645\u060c \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u064a\u064a\u0646 \u062d\u062f\u0648\u062f \u0627\u0646\u0641\u0627\u0642 \u0634\u0647\u0631\u064a\u0629 \u0641\u064a \u062d\u0633\u0627\u0628\u0643.",
"zen.faq.q7": "\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u0627\u0644\u0627\u0644\u063a\u0627\u0621\u061f",
"zen.faq.a7":
"\u0646\u0639\u0645\u060c \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u0637\u064a\u0644 \u0627\u0644\u0641\u0648\u062a\u0631\u0629 \u0641\u064a \u0627\u064a \u0648\u0642\u062a \u0648\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0631\u0635\u064a\u062f\u0643 \u0627\u0644\u0645\u062a\u0628\u0642\u064a.",
"zen.faq.q8":
"\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Zen \u0645\u0639 \u0648\u0643\u0644\u0627\u0621 \u0628\u0631\u0645\u062c\u0629 \u0627\u062e\u0631\u064a\u0646\u061f",
"تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"zen.faq.a5.exceptionsLink": "الاستثناءات التالية",
"zen.faq.q6": "هل يمكنني تعيين حدود للإنفاق؟",
"zen.faq.a6": "نعم، يمكنك تعيين حدود إنفاق شهرية في حسابك.",
"zen.faq.q7": "هل يمكنني الإلغاء؟",
"zen.faq.a7": "نعم، يمكنك تعطيل الفوترة في أي وقت واستخدام رصيدك المتبقي.",
"zen.faq.q8": "هل يمكنني استخدام Zen مع وكلاء برمجة آخرين؟",
"zen.faq.a8":
"\u0628\u064a\u0646\u0645\u0627 \u064a\u0639\u0645\u0644 Zen \u0628\u0634\u0643\u0644 \u0631\u0627\u0626\u0639 \u0645\u0639 OpenCode\u060c \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Zen \u0645\u0639 \u0627\u064a \u0648\u0643\u064a\u0644. \u0627\u062a\u0628\u0639 \u062a\u0639\u0644\u064a\u0645\u0627\u062a \u0627\u0644\u0627\u0639\u062f\u0627\u062f \u0641\u064a \u0648\u0643\u064a\u0644 \u0627\u0644\u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u0645\u0641\u0636\u0644 \u0644\u062f\u064a\u0643.",
"بينما يعمل Zen بشكل رائع مع OpenCode، يمكنك استخدام Zen مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
"zen.cta.start": "ابدأ مع Zen",
"zen.pricing.title": "أضف 20 دولارًا ادفع حسب رصيدك",
"zen.pricing.title": "أضف رصيد 20 دولار (دفع حسب الاستخدام)",
"zen.pricing.fee": "(+1.23 دولار رسوم معالجة البطاقة)",
"zen.pricing.body": "استخدم مع أي وكيل. ضبط حدود الإنفاق الشهري. قم بالإلغاء في أي وقت.",
"zen.problem.title": "ما هي المشكلة التي يحلها Zen؟",
"zen.pricing.body": "استخدمه مع أي وكيل. عيّن حدود الإنفاق الشهري. ألغِ في أي وقت.",
"zen.problem.title": "ما المشكلة التي يحلها Zen؟",
"zen.problem.body":
"هناك العديد من النماذج المتاحة، ولكن القليل منها فقط يعمل بشكل جيد مع وكلاء البرمجة. يقوم معظم مقدمي الخدمة بتكوينها بشكل مختلف وبنتائج مختلفة.",
"zen.problem.subtitle": "نحن نعمل على إصلاح هذه المشكلة للجميع، وليس فقط لمستخدمي OpenCode.",
"zen.problem.item1": "اختبار نماذج مختارة واستشارة فرقهم",
"zen.problem.item2": "العمل مع مقدمي الخدمة لضمان تسليمهم بشكل صحيح",
"zen.problem.item3": "نوصي بقياس جميع مجموعات موفري النماذج",
"هناك العديد من النماذج المتاحة، ولكن القليل منها فقط يعمل بشكل جيد مع وكلاء البرمجة. يقوم معظم مقدمي الخدمة بتكوينها بشكل مختلف مما يعطي نتائج متفاوتة.",
"zen.problem.subtitle": "نحن نعمل على إصلاح هذا للجميع، وليس فقط لمستخدمي OpenCode.",
"zen.problem.item1": "اختبار نماذج مختارة واستشارة فرقها",
"zen.problem.item2": "العمل مع مقدمي الخدمة لضمان تسليمها بشكل صحيح",
"zen.problem.item3": "قياس أداء جميع مجموعات النماذج والمزودين التي نوصي بها",
"zen.how.title": "كيف يعمل Zen",
"zen.how.body": "بينما نقترح عليك استخدام Zen مع OpenCode، يمكنك استخدام Zen مع أي وكيل.",
"zen.how.step1.title": "قم بالتسجيل وأضف رصيدًا بقيمة 20 دولارًا",
"zen.how.step1.title": "سجّل وأضف رصيدًا بقيمة 20 دولارًا",
"zen.how.step1.beforeLink": "اتبع",
"zen.how.step1.link": "تعليمات الإعداد",
"zen.how.step2.title": "استخدم Zen بسعر شفاف",
"zen.how.step2.link": "الدفع لكل طلب",
"zen.how.step2.afterLink": "مع صفر هوامش الربح",
"zen.how.step3.title": "التعبئة التلقائية",
"zen.how.step2.title": "استخدم Zen بتسعير شفاف",
"zen.how.step2.link": "ادفع لكل طلب",
"zen.how.step2.afterLink": "بدون أي هوامش ربح",
"zen.how.step3.title": "شحن تلقائي",
"zen.how.step3.body": "عندما يصل رصيدك إلى 5 دولارات، سنضيف تلقائيًا 20 دولارًا",
"zen.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
"zen.privacy.beforeExceptions":
"جميع موديلات Zen مستضافة في الولايات المتحدة. يتبع مقدمو الخدمة سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك للتدريب النموذجي",
"تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
"download.meta.description":
"\u0642\u0645 \u0628\u062a\u0646\u0632\u064a\u0644 OpenCode \u0644\u0640 macOS\u060c Windows\u060c \u0648Linux",
"download.hero.title": "\u062a\u0646\u0632\u064a\u0644 OpenCode",
"download.hero.subtitle":
"\u0645\u062a\u0627\u062d \u0628\u0646\u0633\u062e\u0629 \u062a\u062c\u0631\u064a\u0628\u064a\u0629 \u0644\u0640 macOS\u060c Windows\u060c \u0648Linux",
"download.hero.button": "\u062a\u0646\u0632\u064a\u0644 \u0644\u0640 {{os}}",
"download.section.terminal": "OpenCode \u0644\u0644\u0637\u0631\u0641\u064a\u0629",
"download.section.desktop": "OpenCode \u0644\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 (Beta)",
"download.section.extensions": "\u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a OpenCode",
"download.section.integrations": "\u062a\u0643\u0627\u0645\u0644\u0627\u062a OpenCode",
"download.action.download": "\u062a\u0646\u0632\u064a\u0644",
"download.action.install": "\u062a\u062b\u0628\u064a\u062a",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"\u0644\u064a\u0633 \u0628\u0627\u0644\u0636\u0631\u0648\u0631\u0629\u060c \u0644\u0643\u0646 \u0639\u0644\u0649 \u0627\u0644\u0627\u0631\u062c\u062d. \u0633\u062a\u062d\u062a\u0627\u062c \u0627\u0644\u0649 \u0627\u0634\u062a\u0631\u0627\u0643 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0630\u0627 \u0643\u0646\u062a \u062a\u0631\u064a\u062f \u0631\u0628\u0637 OpenCode \u0628\u0645\u0632\u0648\u062f \u0645\u062f\u0641\u0648\u0639\u060c \u0644\u0643\u0646 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0639\u0645\u0644 \u0645\u0639",
"download.faq.a3.localLink": "\u0646\u0645\u0627\u0630\u062c \u0645\u062d\u0644\u064a\u0629",
"download.faq.a3.afterLocal.beforeZen":
"\u0645\u062c\u0627\u0646\u0627. \u0628\u064a\u0646\u0645\u0627 \u0646\u0634\u062c\u0639 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0639\u0644\u0649 \u0627\u0633\u062a\u062e\u062f\u0627\u0645",
"download.faq.a3.afterZen":
"\u060c \u0641\u0627\u0646 OpenCode \u064a\u0639\u0645\u0644 \u0645\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0632\u0648\u062f\u064a\u0646 \u0627\u0644\u0634\u0627\u0626\u0639\u064a\u0646 \u0645\u062b\u0644 OpenAI \u0648Anthropic \u0648xAI \u0648\u063a\u064a\u0631\u0647\u0627.",
"download.faq.a5.p1":
"OpenCode \u0645\u062c\u0627\u0646\u064a 100% \u0644\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645.",
"download.faq.a5.p2.beforeZen":
"\u0627\u064a \u062a\u0643\u0627\u0644\u064a\u0641 \u0627\u0636\u0627\u0641\u064a\u0629 \u0633\u062a\u0627\u062a\u064a \u0645\u0646 \u0627\u0634\u062a\u0631\u0627\u0643\u0643 \u0644\u062f\u0649 \u0645\u0632\u0648\u062f \u0627\u0644\u0646\u0645\u0627\u0630\u062c. \u0631\u063a\u0645 \u0627\u0646 OpenCode \u064a\u0639\u0645\u0644 \u0645\u0639 \u0627\u064a \u0645\u0632\u0648\u062f \u0646\u0645\u0627\u0630\u062c\u060c \u0646\u0648\u0635\u064a \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"\u064a\u062a\u0645 \u062d\u0641\u0638 \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0648\u0645\u0639\u0644\u0648\u0645\u0627\u062a\u0643 \u0641\u0642\u0637 \u0639\u0646\u062f \u0627\u0646\u0634\u0627\u0621 \u0631\u0648\u0627\u0628\u0637 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0641\u064a OpenCode.",
"download.faq.a6.p2.beforeShare": "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064a\u062f \u0639\u0646",
"download.faq.a6.shareLink": "\u0635\u0641\u062d\u0627\u062a \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629",
"black.meta.title": "OpenCode Black | الوصول إلى أفضل نماذج البرمجة في العالم",
"black.meta.description": "احصل على وصول إلى Claude، GPT، Gemini والمزيد مع خطط اشتراك OpenCode Black.",
"black.hero.title": "الوصول إلى أفضل نماذج البرمجة في العالم",
"black.hero.subtitle": "بما في ذلك Claude، GPT، Gemini والمزيد",
"black.title": "OpenCode Black | الأسعار",
"black.plan.icon20": "خطة Black 20",
"black.plan.icon100": "خطة Black 100",
"black.plan.icon200": "خطة Black 200",
"black.plan.multiplier100": "استخدام أكثر بـ 5 أضعاف من Black 20",
"black.plan.multiplier200": "استخدام أكثر بـ 20 ضعفًا من Black 20",
"black.price.perMonth": "شهريًا",
"black.price.perPersonBilledMonthly": "للشخص الواحد، يُفوتر شهريًا",
"black.terms.1": "لن يبدأ اشتراكك على الفور",
"black.terms.2": "ستتم إضافتك إلى قائمة الانتظار وتفعيلك قريبًا",
"black.terms.3": "لن يتم خصم المبلغ من بطاقتك إلا عند تفعيل اشتراكك",
"black.terms.4": "تطبق حدود الاستخدام، وقد يصل الاستخدام المؤتمت بكثافة إلى الحدود بشكل أسرع",
"black.terms.5": "الاشتراكات للأفراد، تواصل مع قسم المؤسسات للفرق",
"black.terms.6": "قد يتم تعديل الحدود وقد يتم إيقاف الخطط في المستقبل",
"black.terms.7": "ألغِ اشتراكك في أي وقت",
"black.action.continue": "متابعة",
"black.finePrint.beforeTerms": "الأسعار المعروضة لا تشمل الضرائب المطبقة",
"black.finePrint.terms": "شروط الخدمة",
"black.workspace.title": "OpenCode Black | اختر مساحة العمل",
"black.workspace.selectPlan": "اختر مساحة عمل لهذه الخطة",
"black.workspace.name": "مساحة العمل {{n}}",
"black.subscribe.title": "اشترك في OpenCode Black",
"black.subscribe.paymentMethod": "طريقة الدفع",
"black.subscribe.loadingPaymentForm": "جارٍ تحميل نموذج الدفع...",
"black.subscribe.selectWorkspaceToContinue": "اختر مساحة عمل للمتابعة",
"black.subscribe.failurePrefix": "أوه لا!",
"black.subscribe.error.generic": "حدث خطأ",
"black.subscribe.error.invalidPlan": "خطة غير صالحة",
"black.subscribe.error.workspaceRequired": "معرف مساحة العمل مطلوب",
"black.subscribe.error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
"black.subscribe.processing": "جارٍ المعالجة...",
"black.subscribe.submit": "اشترك بمبلغ ${{plan}}",
"black.subscribe.form.chargeNotice": "لن يتم خصم المبلغ إلا عند تفعيل اشتراكك",
"black.subscribe.success.title": "أنت في قائمة انتظار OpenCode Black",
"black.subscribe.success.subscriptionPlan": "خطة الاشتراك",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "المبلغ",
"black.subscribe.success.amountValue": "${{plan}} شهريًا",
"black.subscribe.success.paymentMethod": "طريقة الدفع",
"black.subscribe.success.dateJoined": "تاريخ الانضمام",
"black.subscribe.success.chargeNotice": "سيتم خصم المبلغ من بطاقتك عند تفعيل اشتراكك",
"enterprise.title":
"OpenCode | \u062d\u0644\u0648\u0644 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u0644\u0645\u0624\u0633\u0633\u062a\u0643",
"enterprise.meta.description":
"\u062a\u0648\u0627\u0635\u0644 \u0645\u0639 OpenCode \u0644\u062d\u0644\u0648\u0644 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a",
"enterprise.hero.title": "\u0643\u0648\u062f\u0643 \u0645\u0644\u0643\u0643",
"enterprise.hero.body1":
"\u064a\u0639\u0645\u0644 OpenCode \u0628\u0623\u0645\u0627\u0646 \u062f\u0627\u062e\u0644 \u0645\u0624\u0633\u0633\u062a\u0643 \u062f\u0648\u0646 \u062a\u062e\u0632\u064a\u0646 \u0623\u064a \u0628\u064a\u0627\u0646\u0627\u062a \u0623\u0648 \u0633\u064a\u0627\u0642\u060c \u0648\u062f\u0648\u0646 \u0642\u064a\u0648\u062f \u062a\u0631\u062e\u064a\u0635 \u0623\u0648 \u0627\u062f\u0639\u0627\u0621\u0627\u062a \u0645\u0644\u0643\u064a\u0629. \u0627\u0628\u062f\u0623 \u062a\u062c\u0631\u0628\u0629 \u0645\u0639 \u0641\u0631\u064a\u0642\u0643\u060c \u062b\u0645 \u0627\u0646\u0634\u0631\u0647 \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0645\u0624\u0633\u0633\u0629 \u0639\u0628\u0631 \u062f\u0645\u062c\u0647 \u0645\u0639 SSO \u0648\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0644\u062f\u0627\u062e\u0644\u064a\u0629 \u0644\u062f\u064a\u0643.",
"enterprise.hero.body2":
"\u0623\u062e\u0628\u0631\u0646\u0627 \u0643\u064a\u0641 \u064a\u0645\u0643\u0646\u0646\u0627 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629.",
"enterprise.form.name.label": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0643\u0627\u0645\u0644",
"enterprise.form.name.placeholder": "\u062c\u064a\u0641 \u0628\u064a\u0632\u0648\u0633",
"enterprise.form.role.label": "\u0627\u0644\u0645\u0646\u0635\u0628",
"enterprise.form.role.placeholder":
"\u0631\u0626\u064a\u0633 \u0645\u062c\u0644\u0633 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u062a\u0646\u0641\u064a\u0630\u064a",
"enterprise.form.email.label":
"\u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a \u0644\u0644\u0634\u0631\u0643\u0629",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label":
"\u0645\u0627 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062a\u064a \u062a\u062d\u0627\u0648\u0644 \u062d\u0644\u0647\u0627\u061f",
"enterprise.form.message.placeholder":
"\u0646\u062d\u062a\u0627\u062c \u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a...",
"enterprise.form.send": "\u0625\u0631\u0633\u0627\u0644",
"enterprise.form.sending": "\u062c\u0627\u0631\u064d \u0627\u0644\u0625\u0631\u0633\u0627\u0644...",
"enterprise.form.success":
"\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629\u060c \u0633\u0646\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0643 \u0642\u0631\u064a\u0628\u064b\u0627.",
"enterprise.faq.title": "\u0627\u0644\u0623\u0633\u0626\u0644\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629",
"enterprise.faq.q1": "\u0645\u0627 \u0647\u0648 OpenCode Enterprise\u061f",
"enterprise.faq.a1":
"OpenCode Enterprise \u0645\u062e\u0635\u0635 \u0644\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u0627\u0644\u062a\u064a \u062a\u0631\u064a\u062f \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0643\u0648\u062f \u0648\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0627 \u062a\u063a\u0627\u062f\u0631 \u0628\u0646\u064a\u062a\u0647\u0627 \u0627\u0644\u062a\u062d\u062a\u064a\u0629 \u0623\u0628\u062f\u064b\u0627. \u064a\u062a\u062d\u0642\u0642 \u0630\u0644\u0643 \u0639\u0628\u0631 \u0625\u0639\u062f\u0627\u062f \u0645\u0631\u0643\u0632\u064a \u064a\u0646\u062f\u0645\u062c \u0645\u0639 SSO \u0648\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0627\u0644\u062f\u0627\u062e\u0644\u064a\u0629 \u0644\u062f\u064a\u0643.",
"enterprise.faq.q2":
"\u0643\u064a\u0641 \u0623\u0628\u062f\u0623 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 OpenCode Enterprise\u061f",
"enterprise.faq.a2":
"\u0627\u0628\u062f\u0623 \u0628\u0628\u0633\u0627\u0637\u0629 \u0628\u062a\u062c\u0631\u0628\u0629 \u062f\u0627\u062e\u0644\u064a\u0629 \u0645\u0639 \u0641\u0631\u064a\u0642\u0643. \u0627\u0641\u062a\u0631\u0627\u0636\u064a\u064b\u0627\u060c \u0644\u0627 \u064a\u0642\u0648\u0645 OpenCode \u0628\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0643\u0648\u062f \u0623\u0648 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u0642\u060c \u0645\u0645\u0627 \u064a\u062c\u0639\u0644 \u0627\u0644\u0628\u062f\u0621 \u0633\u0647\u0644\u064b\u0627. \u0628\u0639\u062f \u0630\u0644\u0643\u060c \u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0646\u0627 \u0644\u0645\u0646\u0627\u0642\u0634\u0629 \u0627\u0644\u0623\u0633\u0639\u0627\u0631 \u0648\u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u0646\u0641\u064a\u0630.",
"enterprise.faq.q3":
"\u0643\u064a\u0641 \u062a\u0639\u0645\u0644 \u062a\u0633\u0639\u064a\u0631\u0629 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a\u061f",
"enterprise.faq.a3":
"\u0646\u0642\u062f\u0645 \u062a\u0633\u0639\u064a\u0631\u064b\u0627 \u0644\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u062d\u0633\u0628 \u0639\u062f\u062f \u0627\u0644\u0645\u0642\u0627\u0639\u062f. \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0644\u062f\u064a\u0643 \u0628\u0648\u0627\u0628\u0629 LLM \u062e\u0627\u0635\u0629 \u0628\u0643\u060c \u0641\u0644\u0646 \u0646\u0641\u0631\u0636 \u0631\u0633\u0648\u0645\u064b\u0627 \u0639\u0644\u0649 \u0627\u0644\u062a\u0648\u0643\u0646\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629. \u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644\u060c \u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0646\u0627 \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0639\u0631\u0636 \u0633\u0639\u0631 \u0645\u062e\u0635\u0635 \u0628\u0646\u0627\u0621\u064b \u0639\u0644\u0649 \u0627\u062d\u062a\u064a\u0627\u062c\u0627\u062a \u0645\u0624\u0633\u0633\u062a\u0643.",
"enterprise.faq.q4":
"\u0647\u0644 \u0628\u064a\u0627\u0646\u0627\u062a\u064a \u0622\u0645\u0646\u0629 \u0645\u0639 OpenCode Enterprise\u061f",
"enterprise.faq.a4":
"\u0646\u0639\u0645. \u0644\u0627 \u064a\u0642\u0648\u0645 OpenCode \u0628\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0643\u0648\u062f \u0623\u0648 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u0642. \u062a\u062a\u0645 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0645\u062d\u0644\u064a\u064b\u0627 \u0623\u0648 \u0639\u0628\u0631 \u0627\u0633\u062a\u062f\u0639\u0627\u0621\u0627\u062a API \u0645\u0628\u0627\u0634\u0631\u0629 \u0625\u0644\u0649 \u0645\u0632\u0648\u062f \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0644\u062f\u064a\u0643. \u0648\u0645\u0639 \u0627\u0644\u0625\u0639\u062f\u0627\u062f \u0627\u0644\u0645\u0631\u0643\u0632\u064a \u0648\u062a\u0643\u0627\u0645\u0644 SSO\u060c \u062a\u0638\u0644 \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0622\u0645\u0646\u0629 \u062f\u0627\u062e\u0644 \u0627\u0644\u0628\u0646\u064a\u0629 \u0627\u0644\u062a\u062d\u062a\u064a\u0629 \u0644\u0645\u0624\u0633\u0633\u062a\u0643.",
"brand.title":
"OpenCode | \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629",
"brand.meta.description":
"\u0625\u0631\u0634\u0627\u062f\u0627\u062a \u0639\u0644\u0627\u0645\u0629 OpenCode \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629",
"brand.heading":
"\u0625\u0631\u0634\u0627\u062f\u0627\u062a \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629",
"brand.subtitle":
"\u0645\u0648\u0627\u0631\u062f \u0648\u0645\u0644\u0641\u0627\u062a \u0644\u0645\u0633\u0627\u0639\u062f\u062a\u0643 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u0644 \u0645\u0639 \u0639\u0644\u0627\u0645\u0629 OpenCode \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629.",
"brand.downloadAll":
"\u062a\u0646\u0632\u064a\u0644 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a",
"changelog.title": "OpenCode | \u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a",
"changelog.meta.description":
"\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0648\u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a \u0644\u0640 OpenCode",
"changelog.hero.title": "\u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a",
"changelog.hero.subtitle":
"\u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0648\u062a\u062d\u0633\u064a\u0646\u0627\u062a \u062c\u062f\u064a\u062f\u0629 \u0644\u0640 OpenCode",
"changelog.empty":
"\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0625\u062f\u062e\u0627\u0644\u0627\u062a \u0641\u064a \u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a.",
"changelog.viewJson": "\u0639\u0631\u0636 JSON",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "مفاتيح API",
"workspace.nav.members": "أعضاء",
"workspace.nav.billing": "الفواتير",
"workspace.nav.settings": "إعدادات",
"workspace.home.banner.beforeLink": "نماذج محسنة موثوقة لوكلاء الترميز.",
"workspace.home.billing.loading": "تحميل...",
"workspace.nav.members": "الأعضاء",
"workspace.nav.billing": "الفوترة",
"workspace.nav.settings": "الإعدادات",
"workspace.home.banner.beforeLink": "نماذج محسنة وموثوقة لوكلاء البرمجة.",
"workspace.home.billing.loading": "جارٍ التحميل...",
"workspace.home.billing.enable": "تمكين الفوترة",
"workspace.home.billing.currentBalance": "الرصيد الحالي",
"workspace.newUser.feature.tested.title": "نماذج تم اختبارها والتحقق منها",
"workspace.newUser.feature.tested.body": "لقد قمنا بقياس واختبار النماذج خصيصًا لوكلاء الترميز لضمان أفضل أداء.",
"workspace.newUser.feature.tested.title": "نماذج مُختبرة ومحققة",
"workspace.newUser.feature.tested.body": "لقد قمنا بقياس واختبار النماذج خصيصًا لوكلاء البرمجة لضمان أفضل أداء.",
"workspace.newUser.feature.quality.title": "أعلى جودة",
"workspace.newUser.feature.quality.body":
"الوصول إلى النماذج التي تم تكوينها لتحقيق الأداء الأمثل - لا يوجد تخفيضات أو توجيه إلى موفري الخدمة الأرخص.",
"workspace.newUser.feature.lockin.title": "بدون احتجاز بمزوّد واحد",
"الوصول إلى النماذج التي تم تكوينها لتحقيق الأداء الأمثل - لا تقليل للجودة أو توجيه إلى موفري خدمة أرخص.",
"workspace.newUser.feature.lockin.title": "لا قيود على المزود",
"workspace.newUser.feature.lockin.body":
"استخدم Zen مع أي وكيل ترميز، واستمر في استخدام موفري الخدمات الآخرين مع opencode وقتما تشاء.",
"workspace.newUser.copyApiKey": "انسخ مفتاح API",
"استخدم Zen مع أي وكيل برمجة، واستمر في استخدام موفرين آخرين مع opencode وقتما تشاء.",
"workspace.newUser.copyApiKey": "نسخ مفتاح API",
"workspace.newUser.copyKey": "نسخ المفتاح",
"workspace.newUser.copied": "منسوخ!",
"workspace.newUser.copied": "تم النسخ!",
"workspace.newUser.step.enableBilling": "تمكين الفوترة",
"workspace.newUser.step.login.before": "شغّل",
"workspace.newUser.step.login.after": حدد opencode",
"workspace.newUser.step.login.after": اختر opencode",
"workspace.newUser.step.pasteKey": "الصق مفتاح API الخاص بك",
"workspace.newUser.step.models.before": "ابدأ opencode ثم قم بالتشغيل",
"workspace.newUser.step.models.before": "ابدأ opencode ثم نفّذ",
"workspace.newUser.step.models.after": "لاختيار نموذج",
"workspace.models.title": "نماذج",
"workspace.models.title": "النماذج",
"workspace.models.subtitle.beforeLink": "إدارة النماذج التي يمكن لأعضاء مساحة العمل الوصول إليها.",
"workspace.models.table.model": "نموذج",
"workspace.models.table.model": "النموذج",
"workspace.models.table.enabled": "ممكّن",
"workspace.providers.title": "أحضر مفتاحك الخاص",
"workspace.providers.subtitle": "قم بتكوين مفاتيح API الخاصة بك من موفري الذكاء الاصطناعي.",
"workspace.providers.placeholder": "أدخل {{provider}} API مفتاح ({{prefix}}...)",
"workspace.providers.placeholder": "أدخل مفتاح API لـ {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "تكوين",
"workspace.providers.edit": "يحرر",
"workspace.providers.delete": "يمسح",
"workspace.providers.saving": "توفير...",
"workspace.providers.save": "يحفظ",
"workspace.providers.table.provider": "مزود",
"workspace.providers.edit": "تعديل",
"workspace.providers.delete": ذف",
"workspace.providers.saving": "جارٍ الحفظ...",
"workspace.providers.save": "حفظ",
"workspace.providers.table.provider": "المزود",
"workspace.providers.table.apiKey": "مفتاح API",
"workspace.usage.title": "تاريخ الاستخدام",
"workspace.usage.subtitle": "استخدام وتكاليف API الأخيرة.",
"workspace.usage.empty": "قم بإجراء أول مكالمة API للبدء.",
"workspace.usage.table.date": "تاريخ",
"workspace.usage.table.model": "نموذج",
"workspace.usage.table.input": "مدخل",
"workspace.usage.table.output": "الإخراج",
"workspace.usage.empty": "قم بإجراء أول استدعاء API للبدء.",
"workspace.usage.table.date": "التاريخ",
"workspace.usage.table.model": "النموذج",
"workspace.usage.table.input": "الدخل",
"workspace.usage.table.output": "الخرج",
"workspace.usage.table.cost": "التكلفة",
"workspace.usage.breakdown.input": "مدخل",
"workspace.usage.breakdown.cacheRead": "قراءة ذاكرة التخزين المؤقت",
"workspace.usage.breakdown.cacheWrite": "كتابة ذاكرة التخزين المؤقت",
"workspace.usage.breakdown.output": "الإخراج",
"workspace.usage.breakdown.input": "الدخل",
"workspace.usage.breakdown.cacheRead": "قراءة الكاش",
"workspace.usage.breakdown.cacheWrite": "كتابة الكاش",
"workspace.usage.breakdown.output": "الخرج",
"workspace.usage.breakdown.reasoning": "المنطق",
"workspace.usage.subscription": "الاشتراك (${{amount}})",
"workspace.cost.title": "التكلفة",
"workspace.cost.subtitle": "تكاليف الاستخدام مقسمة حسب النموذج.",
"workspace.cost.allModels": "جميع النماذج",
@@ -412,100 +351,108 @@ export const dict = {
"workspace.cost.deletedSuffix": "(محذوف)",
"workspace.cost.empty": "لا توجد بيانات استخدام متاحة للفترة المحددة.",
"workspace.cost.subscriptionShort": "اشتراك",
"workspace.keys.title": "مفاتيح API",
"workspace.keys.subtitle": "إدارة مفاتيح API الخاصة بك للوصول إلى خدمات opencode.",
"workspace.keys.create": "قم بإنشاء مفتاح API",
"workspace.keys.create": "إنشاء مفتاح API",
"workspace.keys.placeholder": "أدخل اسم المفتاح",
"workspace.keys.empty": "أنشئ مفتاح API لبوابة opencode",
"workspace.keys.table.name": "اسم",
"workspace.keys.table.key": "مفتاح",
"workspace.keys.table.name": "الاسم",
"workspace.keys.table.key": "المفتاح",
"workspace.keys.table.createdBy": "تم الإنشاء بواسطة",
"workspace.keys.table.lastUsed": "آخر استخدام",
"workspace.keys.copyApiKey": "انسخ مفتاح API",
"workspace.keys.delete": "يمسح",
"workspace.members.title": "أعضاء",
"workspace.keys.copyApiKey": "نسخ مفتاح API",
"workspace.keys.delete": ذف",
"workspace.members.title": "الأعضاء",
"workspace.members.subtitle": "إدارة أعضاء مساحة العمل وأذوناتهم.",
"workspace.members.invite": "دعوة العضو",
"workspace.members.inviting": "دعوة...",
"workspace.members.beta.beforeLink": "مساحات العمل مجانية للفرق أثناء النسخة التجريبية.",
"workspace.members.invite": "دعوة عضو",
"workspace.members.inviting": "جارٍ الدعوة...",
"workspace.members.beta.beforeLink": "مساحات العمل مجانية للفرق أثناء الفترة التجريبية.",
"workspace.members.form.invitee": "المدعو",
"workspace.members.form.emailPlaceholder": "أدخل البريد الإلكتروني",
"workspace.members.form.role": "دور",
"workspace.members.form.role": "الدور",
"workspace.members.form.monthlyLimit": "حد الإنفاق الشهري",
"workspace.members.noLimit": "لا يوجد حد",
"workspace.members.noLimitLowercase": "لا يوجد حد",
"workspace.members.invited": "مدعو",
"workspace.members.edit": "يحرر",
"workspace.members.delete": "يمسح",
"workspace.members.saving": "توفير...",
"workspace.members.save": "يحفظ",
"workspace.members.table.email": "بريد إلكتروني",
"workspace.members.table.role": "دور",
"workspace.members.table.monthLimit": "حد الشهر",
"workspace.members.invited": "تمت دعوته",
"workspace.members.edit": "تعديل",
"workspace.members.delete": ذف",
"workspace.members.saving": "جارٍ الحفظ...",
"workspace.members.save": "حفظ",
"workspace.members.table.email": "البريد الإلكتروني",
"workspace.members.table.role": "الدور",
"workspace.members.table.monthLimit": "الحد الشهري",
"workspace.members.role.admin": "مسؤول",
"workspace.members.role.adminDescription": "يمكن إدارة النماذج، والأعضاء، والفواتير",
"workspace.members.role.adminDescription": "يمكنه إدارة النماذج، والأعضاء، والفوترة",
"workspace.members.role.member": "عضو",
"workspace.members.role.memberDescription": "يمكنهم فقط إنشاء مفاتيح API لأنفسهم",
"workspace.settings.title": "إعدادات",
"workspace.settings.subtitle": "قم بتحديث اسم مساحة العمل الخاصة بك وتفضيلاتك.",
"workspace.members.role.memberDescription": "يمكنه فقط إنشاء مفاتيح API لنفسه",
"workspace.settings.title": "الإعدادات",
"workspace.settings.subtitle": "حدّث اسم مساحة العمل وتفضيلاتك.",
"workspace.settings.workspaceName": "اسم مساحة العمل",
"workspace.settings.defaultName": "الافتراضي",
"workspace.settings.defaultName": "افتراضي",
"workspace.settings.updating": "جارٍ التحديث...",
"workspace.settings.save": "يحفظ",
"workspace.settings.edit": "يحرر",
"workspace.billing.title": "الفواتير",
"workspace.settings.save": "حفظ",
"workspace.settings.edit": "تعديل",
"workspace.billing.title": "الفوترة",
"workspace.billing.subtitle.beforeLink": "إدارة طرق الدفع.",
"workspace.billing.contactUs": "اتصل بنا",
"workspace.billing.subtitle.afterLink": "إذا كان لديك أي أسئلة.",
"workspace.billing.currentBalance": "الرصيد الحالي",
"workspace.billing.add": "أضف $",
"workspace.billing.enterAmount": "أدخل المبلغ",
"workspace.billing.loading": "تحميل...",
"workspace.billing.loading": "جارٍ التحميل...",
"workspace.billing.addAction": "إضافة",
"workspace.billing.addBalance": "إضافة الرصيد",
"workspace.billing.addBalance": "إضافة رصيد",
"workspace.billing.linkedToStripe": "مرتبط بـ Stripe",
"workspace.billing.manage": "إدارة",
"workspace.billing.enable": "تمكين الفوترة",
"workspace.monthlyLimit.title": "الحد الشهري",
"workspace.monthlyLimit.subtitle": "قم بتعيين حد الاستخدام الشهري لحسابك.",
"workspace.monthlyLimit.subtitle": "عيّن حد الاستخدام الشهري لحسابك.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "جارٍ التعيين...",
"workspace.monthlyLimit.set": "تعيين",
"workspace.monthlyLimit.edit": حرير الحد",
"workspace.monthlyLimit.noLimit": "لم يتم تعيين حد الاستخدام.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "الاستخدام الحالي ل",
"workspace.monthlyLimit.edit": عديل الحد",
"workspace.monthlyLimit.noLimit": "لم يتم تعيين حد للاستخدام.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "الاستخدام الحالي لـ",
"workspace.monthlyLimit.currentUsage.beforeAmount": "هو $",
"workspace.reload.title": "إعادة الشحن التلقائي",
"workspace.reload.disabled.before": "إعادة الشحن التلقائي",
"workspace.reload.disabled.state": "معطّل",
"workspace.reload.disabled.after": "فعّلها لإعادة شحن الرصيد تلقائيًا عندما يكون منخفضًا.",
"workspace.reload.disabled.after": "فعّلها لإعادة شحن الرصيد تلقائيًا عندما ينخفض.",
"workspace.reload.enabled.before": "إعادة الشحن التلقائي",
"workspace.reload.enabled.state": "ممكّن",
"workspace.reload.enabled.middle": "سنعيد شحن رصيدك بمبلغ",
"workspace.reload.processingFee": "رسوم المعالجة",
"workspace.reload.processingFee": "رسوم معالجة",
"workspace.reload.enabled.after": "عندما يصل الرصيد إلى",
"workspace.reload.edit": "يحرر",
"workspace.reload.edit": "تعديل",
"workspace.reload.enable": "تفعيل",
"workspace.reload.enableAutoReload": "تفعيل إعادة الشحن التلقائي",
"workspace.reload.reloadAmount": "مبلغ إعادة الشحن $",
"workspace.reload.reloadAmount": "مبلغ الشحن $",
"workspace.reload.whenBalanceReaches": "عندما يصل الرصيد إلى $",
"workspace.reload.saving": "توفير...",
"workspace.reload.save": "يحفظ",
"workspace.reload.saving": "جارٍ الحفظ...",
"workspace.reload.save": "حفظ",
"workspace.reload.failedAt": "فشلت إعادة الشحن في",
"workspace.reload.reason": "سبب:",
"workspace.reload.updatePaymentMethod": "يرجى تحديث طريقة الدفع الخاصة بك والمحاولة مرة أخرى.",
"workspace.reload.reason": "السبب:",
"workspace.reload.updatePaymentMethod": "يرجى تحديث طريقة الدفع والمحاولة مرة أخرى.",
"workspace.reload.retrying": "جارٍ إعادة المحاولة...",
"workspace.reload.retry": "أعد المحاولة",
"workspace.payments.title": "تاريخ المدفوعات",
"workspace.payments.title": "سجل المدفوعات",
"workspace.payments.subtitle": "معاملات الدفع الأخيرة.",
"workspace.payments.table.date": "تاريخ",
"workspace.payments.table.date": "التاريخ",
"workspace.payments.table.paymentId": "معرف الدفع",
"workspace.payments.table.amount": "المبلغ",
"workspace.payments.table.receipt": "إيصال",
"workspace.payments.type.credit": "ائتمان",
"workspace.payments.type.subscription": "الاشتراك",
"workspace.payments.table.receipt": "الإيصال",
"workspace.payments.type.credit": "رصيد",
"workspace.payments.type.subscription": "اشتراك",
"workspace.payments.view": "عرض",
"workspace.black.loading": "تحميل...",
"workspace.black.loading": "جارٍ التحميل...",
"workspace.black.time.day": "يوم",
"workspace.black.time.days": "أيام",
"workspace.black.time.hour": "ساعة",
@@ -514,20 +461,130 @@ export const dict = {
"workspace.black.time.minutes": "دقائق",
"workspace.black.time.fewSeconds": "بضع ثوان",
"workspace.black.subscription.title": "الاشتراك",
"workspace.black.subscription.message": "أنت مشترك في OpenCode Black مقابل {{plan}} دولار شهريًا.",
"workspace.black.subscription.message": "أنت مشترك في OpenCode Black مقابل ${{plan}} شهريًا.",
"workspace.black.subscription.manage": "إدارة الاشتراك",
"workspace.black.subscription.rollingUsage": "استخدام لمدة 5 ساعات",
"workspace.black.subscription.weeklyUsage": "الاستخدام الأسبوعي",
"workspace.black.subscription.resetsIn": "إعادة تعيين في",
"workspace.black.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
"workspace.black.waitlist.title": "قائمة الانتظار",
"workspace.black.waitlist.joined": "أنت على قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا.",
"workspace.black.waitlist.joined": "أنت في قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا.",
"workspace.black.waitlist.ready": "نحن مستعدون لتسجيلك في خطة OpenCode Black بقيمة ${{plan}} شهريًا.",
"workspace.black.waitlist.leave": "ترك قائمة الانتظار",
"workspace.black.waitlist.leaving": "مغادرة...",
"workspace.black.waitlist.leaving": "جارٍ المغادرة...",
"workspace.black.waitlist.left": "غادر",
"workspace.black.waitlist.enroll": "تسجل",
"workspace.black.waitlist.enroll": "تسجيل",
"workspace.black.waitlist.enrolling": "جارٍ التسجيل...",
"workspace.black.waitlist.enrolled": "مسجل",
"workspace.black.waitlist.enrollNote": 'عند النقر فوق "تسجيل"، يبدأ اشتراكك على الفور وسيتم خصم الرسوم من بطاقتك.',
"download.title": "OpenCode | تنزيل",
"download.meta.description": "نزّل OpenCode لـ macOS، Windows، وLinux",
"download.hero.title": "تنزيل OpenCode",
"download.hero.subtitle": "متاح في نسخة تجريبية لـ macOS، Windows، وLinux",
"download.hero.button": "تنزيل لـ {{os}}",
"download.section.terminal": "OpenCode للطرفية",
"download.section.desktop": "OpenCode لسطح المكتب (Beta)",
"download.section.extensions": "امتدادات OpenCode",
"download.section.integrations": "تكاملات OpenCode",
"download.action.download": "تنزيل",
"download.action.install": "تثبيت",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"ليس بالضرورة، ولكن على الأرجح. ستحتاج إلى اشتراك ذكاء اصطناعي إذا كنت تريد ربط OpenCode بمزوّد مدفوع، رغم أنه يمكنك العمل مع",
"download.faq.a3.localLink": "النماذج المحلية",
"download.faq.a3.afterLocal.beforeZen": "مجانًا. بينما نشجع المستخدمين على استخدام",
"download.faq.a3.afterZen": "، فإن OpenCode يعمل مع جميع المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
"download.faq.a5.p1": "OpenCode مجاني 100% للاستخدام.",
"download.faq.a5.p2.beforeZen":
"أي تكاليف إضافية ستأتي من اشتراكك لدى مزود النماذج. بينما يعمل OpenCode مع أي مزود نماذج، نوصي باستخدام",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "يتم حفظ بياناتك ومعلوماتك فقط عند إنشاء روابط قابلة للمشاركة في OpenCode.",
"download.faq.a6.p2.beforeShare": "اعرف المزيد عن",
"download.faq.a6.shareLink": "صفحات المشاركة",
"enterprise.title": "OpenCode | حلول المؤسسات لمنظمتك",
"enterprise.meta.description": "تواصل مع OpenCode لحلول المؤسسات",
"enterprise.hero.title": "كودك ملكك",
"enterprise.hero.body1":
"يعمل OpenCode بأمان داخل مؤسستك دون تخزين أي بيانات أو سياق، ودون قيود ترخيص أو مطالبات ملكية. ابدأ تجربة مع فريقك، ثم انشره عبر مؤسستك من خلال دمجه مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
"enterprise.hero.body2": "أخبرنا كيف يمكننا المساعدة.",
"enterprise.form.name.label": "الاسم الكامل",
"enterprise.form.name.placeholder": "جيف بيزوس",
"enterprise.form.role.label": "المنصب",
"enterprise.form.role.placeholder": "رئيس مجلس الإدارة التنفيذي",
"enterprise.form.email.label": "البريد الإلكتروني للشركة",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "ما المشكلة التي تحاول حلها؟",
"enterprise.form.message.placeholder": "نحتاج مساعدة في...",
"enterprise.form.send": "إرسال",
"enterprise.form.sending": "جارٍ الإرسال...",
"enterprise.form.success": "تم إرسال الرسالة، سنتواصل معك قريبًا.",
"enterprise.faq.title": "الأسئلة الشائعة",
"enterprise.faq.q1": "ما هو OpenCode Enterprise؟",
"enterprise.faq.a1":
"OpenCode Enterprise مخصص للمؤسسات التي تريد التأكد من أن الكود والبيانات لا تغادر بنيتها التحتية أبدًا. يتحقق ذلك عبر استخدام تكوين مركزي يندمج مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
"enterprise.faq.q2": "كيف أبدأ مع OpenCode Enterprise؟",
"enterprise.faq.a2":
"ابدأ ببساطة بتجربة داخلية مع فريقك. افتراضيًا، لا يقوم OpenCode بتخزين الكود أو بيانات السياق، مما يجعل البدء سهلاً. ثم اتصل بنا لمناقشة الأسعار وخيارات التنفيذ.",
"enterprise.faq.q3": "كيف تعمل تسعيرة المؤسسات؟",
"enterprise.faq.a3":
"نقدم تسعيرًا للمؤسسات حسب المقعد. إذا كان لديك بوابة LLM خاصة بك، فلن نفرض رسومًا على التوكنات المستخدمة. لمزيد من التفاصيل، اتصل بنا للحصول على عرض سعر مخصص بناءً على احتياجات مؤسستك.",
"enterprise.faq.q4": "هل بياناتي آمنة مع OpenCode Enterprise؟",
"enterprise.faq.a4":
"نعم. لا يقوم OpenCode بتخزين الكود أو بيانات السياق. تتم جميع المعالجة محليًا أو عبر استدعاءات API مباشرة إلى مزود الذكاء الاصطناعي لديك. مع التكوين المركزي وتكامل SSO، تظل بياناتك آمنة داخل البنية التحتية لمؤسستك.",
"brand.title": "OpenCode | العلامة التجارية",
"brand.meta.description": "إرشادات العلامة التجارية لـ OpenCode",
"brand.heading": "إرشادات العلامة التجارية",
"brand.subtitle": "موارد وأصول لمساعدتك في العمل مع العلامة التجارية لـ OpenCode.",
"brand.downloadAll": "تنزيل جميع الأصول",
"changelog.title": "OpenCode | سجل التغييرات",
"changelog.meta.description": "ملاحظات الإصدار وسجل التغييرات لـ OpenCode",
"changelog.hero.title": "سجل التغييرات",
"changelog.hero.subtitle": "تحديثات وتحسينات جديدة لـ OpenCode",
"changelog.empty": "لم يتم العثور على مدخلات في سجل التغييرات.",
"changelog.viewJson": "عرض JSON",
"bench.list.title": "المعيار",
"bench.list.heading": "المعايير",
"bench.list.table.agent": "الوكيل",
"bench.list.table.model": "النموذج",
"bench.list.table.score": "الدرجة",
"bench.detail.title": "المعيار - {{task}}",
"bench.detail.notFound": "المهمة غير موجودة",
"bench.detail.na": "غير متاح",
"bench.detail.labels.agent": "الوكيل",
"bench.detail.labels.model": "النموذج",
"bench.detail.labels.task": "المهمة",
"bench.detail.labels.repo": "المستودع",
"bench.detail.labels.from": "من",
"bench.detail.labels.to": "إلى",
"bench.detail.labels.prompt": "الموجه",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "متوسط المدة",
"bench.detail.labels.averageScore": "متوسط الدرجة",
"bench.detail.labels.averageCost": "متوسط التكلفة",
"bench.detail.labels.summary": "الملخص",
"bench.detail.labels.runs": "تشغيلات",
"bench.detail.labels.score": "الدرجة",
"bench.detail.labels.base": "الأساس",
"bench.detail.labels.penalty": "الجزاء",
"bench.detail.labels.weight": "الوزن",
"bench.detail.table.run": "تشغيل",
"bench.detail.table.score": "الدرجة (الأساس - الجزاء)",
"bench.detail.table.cost": "التكلفة",
"bench.detail.table.duration": "المدة",
"bench.detail.run.title": "تشغيل {{n}}",
"bench.detail.rawJson": "JSON خام",
} satisfies Dict

View File

@@ -4,25 +4,25 @@ import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Documentacao",
"nav.changelog": "Registro de mudancas",
"nav.docs": "Documentação",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Empresas",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Entrar",
"nav.free": "Gratis",
"nav.home": "Inicio",
"nav.free": "Grátis",
"nav.home": "Início",
"nav.openMenu": "Abrir menu",
"nav.getStartedFree": "Comecar gratis",
"nav.getStartedFree": "Começar grátis",
"nav.context.copyLogo": "Copiar logo como SVG",
"nav.context.copyWordmark": "Copiar wordmark como SVG",
"nav.context.brandAssets": "Assets da marca",
"nav.context.copyWordmark": "Copiar marca como SVG",
"nav.context.brandAssets": "Recursos da marca",
"footer.github": "GitHub",
"footer.docs": "Documentacao",
"footer.changelog": "Registro de mudancas",
"footer.docs": "Documentação",
"footer.changelog": "Changelog",
"footer.discord": "Discord",
"footer.x": "X",
@@ -30,16 +30,16 @@ export const dict = {
"legal.privacy": "Privacidade",
"legal.terms": "Termos",
"email.title": "Seja o primeiro a saber quando lancarmos novos produtos",
"email.title": "Seja o primeiro a saber quando lançarmos novos produtos",
"email.subtitle": "Entre na lista de espera para acesso antecipado.",
"email.placeholder": "Endereco de e-mail",
"email.placeholder": "Endereço de e-mail",
"email.subscribe": "Inscrever-se",
"email.success": "Quase pronto: verifique sua caixa de entrada e confirme seu e-mail",
"email.success": "Quase lá, verifique sua caixa de entrada e confirme seu e-mail",
"notFound.title": "Nao encontrado | opencode",
"notFound.heading": "404 - Pagina nao encontrada",
"notFound.home": "Inicio",
"notFound.docs": "Documentacao",
"notFound.title": "Não encontrado | opencode",
"notFound.heading": "404 - Página não encontrada",
"notFound.home": "Início",
"notFound.docs": "Documentação",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
@@ -54,170 +54,445 @@ export const dict = {
"common.creating": "Criando...",
"common.create": "Criar",
"common.videoUnsupported": "Seu navegador nao suporta a tag de video.",
"common.videoUnsupported": "Seu navegador não suporta a tag de vídeo.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Saiba mais",
"home.title": "OpenCode | O agente de codificacao com IA de codigo aberto",
"error.invalidPlan": "Plano inválido",
"error.workspaceRequired": "ID do workspace é obrigatório",
"error.alreadySubscribed": "Este workspace já possui uma assinatura",
"error.limitRequired": "Limite é obrigatório.",
"error.monthlyLimitInvalid": "Defina um limite mensal válido.",
"error.workspaceNameRequired": "Nome do workspace é obrigatório.",
"error.nameTooLong": "O nome deve ter 255 caracteres ou menos.",
"error.emailRequired": "E-mail é obrigatório",
"error.roleRequired": "Função é obrigatória",
"error.idRequired": "ID é obrigatório",
"error.nameRequired": "Nome é obrigatório",
"error.providerRequired": "Provedor é obrigatório",
"error.apiKeyRequired": "Chave de API é obrigatória",
"error.modelRequired": "Modelo é obrigatório",
"error.reloadAmountMin": "O valor de recarga deve ser de pelo menos ${{amount}}",
"error.reloadTriggerMin": "O gatilho de saldo deve ser de pelo menos ${{amount}}",
"home.title": "OpenCode | O agente de codificação de código aberto com IA",
"temp.title": "opencode | Agente de codificação com IA feito para o terminal",
"temp.hero.title": "O agente de codificação com IA feito para o terminal",
"temp.zen": "opencode zen",
"temp.getStarted": "Começar",
"temp.feature.native.title": "TUI Nativa",
"temp.feature.native.body": "Uma interface de terminal responsiva, nativa e personalizável",
"temp.feature.zen.beforeLink": "Uma",
"temp.feature.zen.link": "lista selecionada de modelos",
"temp.feature.zen.afterLink": "fornecida pela opencode",
"temp.feature.models.beforeLink": "Suporta mais de 75 provedores de LLM através do",
"temp.feature.models.afterLink": ", incluindo modelos locais",
"temp.screenshot.caption": "OpenCode TUI com o tema tokyonight",
"temp.screenshot.alt": "OpenCode TUI com tema tokyonight",
"home.banner.badge": "Novo",
"home.banner.text": "App desktop disponivel em beta",
"home.banner.text": "App desktop disponível em beta",
"home.banner.platforms": "no macOS, Windows e Linux",
"home.banner.downloadNow": "Baixar agora",
"home.banner.downloadBetaNow": "Baixe agora o beta do desktop",
"home.hero.title": "O agente de codificacao com IA de codigo aberto",
"home.hero.subtitle.a": "Modelos gratis incluidos ou conecte qualquer modelo de qualquer provedor,",
"home.hero.title": "O agente de codificação de código aberto com IA",
"home.hero.subtitle.a": "Modelos grátis incluídos ou conecte qualquer modelo de qualquer provedor,",
"home.hero.subtitle.b": "incluindo Claude, GPT, Gemini e mais.",
"home.install.ariaLabel": "Opcoes de instalacao",
"home.install.ariaLabel": "Opções de instalação",
"home.what.title": "O que e OpenCode?",
"home.what.title": "O que é OpenCode?",
"home.what.body":
"OpenCode e um agente de codigo aberto que ajuda voce a escrever codigo no terminal, IDE ou desktop.",
"OpenCode é um agente de código aberto que ajuda você a escrever código no seu terminal, IDE ou desktop.",
"home.what.lsp.title": "LSP habilitado",
"home.what.lsp.body": "Carrega automaticamente os LSPs certos para o LLM",
"home.what.multiSession.title": "Multi-sessao",
"home.what.multiSession.body": "Inicie varios agentes em paralelo no mesmo projeto",
"home.what.shareLinks.title": "Links para compartilhar",
"home.what.shareLinks.body": "Compartilhe um link para qualquer sessao para referencia ou depuracao",
"home.what.multiSession.title": "Multissessão",
"home.what.multiSession.body": "Inicie vários agentes em paralelo no mesmo projeto",
"home.what.shareLinks.title": "Links compartilháveis",
"home.what.shareLinks.body": "Compartilhe um link para qualquer sessão para referência ou depuração",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Faca login com o GitHub para usar sua conta do Copilot",
"home.what.copilot.body": "Entre com o GitHub para usar sua conta do Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Faca login com a OpenAI para usar sua conta do ChatGPT Plus ou Pro",
"home.what.chatgptPlus.body": "Entre com a OpenAI para usar sua conta do ChatGPT Plus ou Pro",
"home.what.anyModel.title": "Qualquer modelo",
"home.what.anyModel.body": "75+ provedores de LLM via Models.dev, incluindo modelos locais",
"home.what.anyModel.body": "Mais de 75 provedores de LLM via Models.dev, incluindo modelos locais",
"home.what.anyEditor.title": "Qualquer editor",
"home.what.anyEditor.body": "Disponivel como interface de terminal, app desktop e extensao de IDE",
"home.what.readDocs": "Ler docs",
"home.what.anyEditor.body": "Disponível como interface de terminal, app desktop e extensão de IDE",
"home.what.readDocs": "Ler documentação",
"home.growth.title": "O agente de codificacao com IA de codigo aberto",
"home.growth.title": "O agente de codificação de código aberto com IA",
"home.growth.body":
"Com mais de <strong>{{stars}}</strong> estrelas no GitHub, <strong>{{contributors}}</strong> colaboradores e mais de <strong>{{commits}}</strong> commits, OpenCode e usado e confiado por mais de <strong>{{monthlyUsers}}</strong> desenvolvedores todos os meses.",
"Com mais de <strong>{{stars}}</strong> estrelas no GitHub, <strong>{{contributors}}</strong> colaboradores e mais de <strong>{{commits}}</strong> commits, OpenCode é usado e confiado por mais de <strong>{{monthlyUsers}}</strong> desenvolvedores todos os meses.",
"home.growth.githubStars": "Estrelas no GitHub",
"home.growth.contributors": "Colaboradores",
"home.growth.monthlyDevs": "Devs mensais",
"home.privacy.title": "Feito com privacidade em primeiro lugar",
"home.privacy.body":
"OpenCode nao armazena nenhum codigo seu nem dados de contexto, para poder operar em ambientes sensiveis a privacidade.",
"OpenCode não armazena nenhum código seu nem dados de contexto, para que possa operar em ambientes sensíveis à privacidade.",
"home.privacy.learnMore": "Saiba mais sobre",
"home.privacy.link": "privacidade",
"home.faq.q1": "O que e OpenCode?",
"home.faq.q1": "O que é OpenCode?",
"home.faq.a1":
"OpenCode e um agente de codigo aberto que ajuda voce a escrever e executar codigo com qualquer modelo de IA. Ele esta disponivel como interface de terminal, app desktop ou extensao de IDE.",
"OpenCode é um agente de código aberto que ajuda você a escrever e executar código com qualquer modelo de IA. Está disponível como interface de terminal, app desktop ou extensão de IDE.",
"home.faq.q2": "Como eu uso o OpenCode?",
"home.faq.a2.before": "A forma mais facil de comecar e ler a",
"home.faq.a2.link": "introducao",
"home.faq.a2.before": "A maneira mais fácil de começar é ler a",
"home.faq.a2.link": "introdução",
"home.faq.q3": "Preciso de assinaturas extras de IA para usar o OpenCode?",
"home.faq.a3.p1":
"Nao necessariamente, OpenCode vem com um conjunto de modelos gratis que voce pode usar sem criar conta.",
"home.faq.a3.p2.beforeZen": "Fora isso, voce pode usar modelos populares para codigo criando uma conta",
"Não necessariamente, OpenCode vem com um conjunto de modelos grátis que você pode usar sem criar conta.",
"home.faq.a3.p2.beforeZen":
"Além disso, você pode usar qualquer um dos modelos de codificação populares criando uma conta",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Embora incentivemos os usuarios a usar o Zen, OpenCode tambem funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "Voce pode ate conectar seus",
"Embora incentivemos os usuários a usar o Zen, OpenCode também funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "Você pode até conectar seus",
"home.faq.a3.p4.localLink": "modelos locais",
"home.faq.q4": "Posso usar minhas assinaturas de IA existentes com o OpenCode?",
"home.faq.a4.p1":
"Sim, OpenCode oferece suporte a planos de assinatura dos principais provedores. Voce pode usar suas assinaturas Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
"Sim, OpenCode suporta planos de assinatura de todos os principais provedores. Você pode usar suas assinaturas Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
"home.faq.q5": "Posso usar o OpenCode apenas no terminal?",
"home.faq.a5.beforeDesktop": "Nao mais! OpenCode agora esta disponivel como um app para o",
"home.faq.a5.beforeDesktop": "Não mais! OpenCode agora está disponível como um app para o seu",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "e",
"home.faq.a5.web": "web",
"home.faq.q6": "Quanto custa o OpenCode?",
"home.faq.a6":
"OpenCode e 100% gratis para usar. Tambem vem com um conjunto de modelos gratuitos. Pode haver custos adicionais se voce conectar outro provedor.",
"OpenCode é 100% gratuito para usar. Ele também vem com um conjunto de modelos gratuitos. Pode haver custos adicionais se você conectar qualquer outro provedor.",
"home.faq.q7": "E sobre dados e privacidade?",
"home.faq.a7.p1":
"Seus dados e informacoes so sao armazenados quando voce usa nossos modelos gratis ou cria links compartilhaveis.",
"Seus dados e informações só são armazenados quando você usa nossos modelos gratuitos ou cria links compartilháveis.",
"home.faq.a7.p2.beforeModels": "Saiba mais sobre",
"home.faq.a7.p2.modelsLink": "nossos modelos",
"home.faq.a7.p2.and": "e",
"home.faq.a7.p2.shareLink": "paginas de compartilhamento",
"home.faq.q8": "OpenCode e codigo aberto?",
"home.faq.a8.p1": "Sim, OpenCode e totalmente open source. O codigo-fonte e publico no",
"home.faq.a7.p2.shareLink": "páginas de compartilhamento",
"home.faq.q8": "OpenCode é código aberto?",
"home.faq.a8.p1": "Sim, OpenCode é totalmente open source. O código-fonte é público no",
"home.faq.a8.p2": "sob a",
"home.faq.a8.mitLicense": "Licenca MIT",
"home.faq.a8.mitLicense": "Licença MIT",
"home.faq.a8.p3":
", o que significa que qualquer pessoa pode usar, modificar ou contribuir com o desenvolvimento. Qualquer pessoa da comunidade pode abrir issues, enviar pull requests e estender funcionalidades.",
", o que significa que qualquer pessoa pode usar, modificar ou contribuir para o seu desenvolvimento. Qualquer pessoa da comunidade pode abrir issues, enviar pull requests e estender a funcionalidade.",
"home.zenCta.title": "Acesse modelos confiaveis e otimizados para agentes de codigo",
"home.zenCta.title": "Acesse modelos confiáveis e otimizados para agentes de codificação",
"home.zenCta.body":
"O Zen te da acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e benchmarkou especificamente para agentes de codigo. Nao precisa se preocupar com desempenho e qualidade inconsistentes entre provedores: use modelos validados que funcionam.",
"O Zen acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes entre provedores, use modelos validados que funcionam.",
"home.zenCta.link": "Saiba mais sobre o Zen",
"download.title": "OpenCode | Download",
"zen.title": "OpenCode Zen | Um conjunto selecionado de modelos confiaveis e otimizados para agentes de codigo",
"zen.hero.title": "Acesse modelos confiaveis e otimizados para agentes de codigo",
"zen.title": "OpenCode Zen | Um conjunto selecionado de modelos confiáveis e otimizados para agentes de codificação",
"zen.hero.title": "Modelos confiáveis e otimizados para agentes de codificação",
"zen.hero.body":
"O Zen te da acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e benchmarkou especificamente para agentes de codigo. Nao precisa se preocupar com desempenho e qualidade inconsistentes entre provedores: use modelos validados que funcionam.",
"O Zen acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes, use modelos validados que funcionam.",
"zen.faq.q1": "O que e OpenCode Zen?",
"zen.faq.q1": "O que é OpenCode Zen?",
"zen.faq.a1":
"Zen e um conjunto selecionado de modelos de IA testados e benchmarkados para agentes de codigo, criado pelo time por tras do OpenCode.",
"Zen é um conjunto selecionado de modelos de IA testados e avaliados para agentes de codificação, criado pela equipe por trás do OpenCode.",
"zen.faq.q2": "O que torna o Zen mais preciso?",
"zen.faq.a2":
"O Zen so oferece modelos que foram testados e benchmarkados especificamente para agentes de codigo. Voce nao usaria uma faca de manteiga para cortar um bife; nao use modelos ruins para programar.",
"zen.faq.q3": "Zen e mais barato?",
"O Zen fornece apenas modelos que foram especificamente testados e avaliados para agentes de codificação. Você não usaria uma faca de manteiga para cortar um bife, não use modelos ruins para programar.",
"zen.faq.q3": "O Zen é mais barato?",
"zen.faq.a3":
"Zen nao tem fins lucrativos. Zen repassa os custos dos provedores de modelos diretamente para voce. Quanto maior o uso do Zen, mais a OpenCode pode negociar melhores taxas e repassar para voce.",
"O Zen não tem fins lucrativos. O Zen repassa os custos dos provedores de modelos para você. Quanto maior o uso do Zen, mais a OpenCode pode negociar melhores taxas e repassá-las para você.",
"zen.faq.q4": "Quanto custa o Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "cobra por requisicao",
"zen.faq.a4.p1.afterPricing": "sem margem, entao voce paga exatamente o que o provedor do modelo cobra.",
"zen.faq.a4.p2.beforeAccount": "Seu custo total depende do uso, e voce pode definir limites mensais de gasto na sua",
"zen.faq.a4.p1.pricingLink": "cobra por requisição",
"zen.faq.a4.p1.afterPricing": "sem margens de lucro, então você paga exatamente o que o provedor do modelo cobra.",
"zen.faq.a4.p2.beforeAccount": "Seu custo total depende do uso, e você pode definir limites de gastos mensais em sua",
"zen.faq.a4.p2.accountLink": "conta",
"zen.faq.a4.p3":
"Para cobrir custos, a OpenCode adiciona apenas uma pequena taxa de processamento de pagamento de $1.23 por recarga de saldo de $20.",
"Para cobrir custos, a OpenCode adiciona apenas uma pequena taxa de processamento de pagamento de $1,23 por recarga de $20.",
"zen.faq.q5": "E sobre dados e privacidade?",
"zen.faq.a5.beforeExceptions":
"Todos os modelos do Zen sao hospedados nos EUA. Os provedores seguem uma politica de zero retencao e nao usam seus dados para treinamento de modelos, com as",
"zen.faq.a5.exceptionsLink": "seguintes excecoes",
"zen.faq.q6": "Posso definir limites de gasto?",
"zen.faq.a6": "Sim, voce pode definir limites mensais de gasto na sua conta.",
"Todos os modelos Zen 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",
"zen.faq.a5.exceptionsLink": "seguintes exceções",
"zen.faq.q6": "Posso definir limites de gastos?",
"zen.faq.a6": "Sim, você pode definir limites de gastos mensais em sua conta.",
"zen.faq.q7": "Posso cancelar?",
"zen.faq.a7": "Sim, voce pode desativar a cobranca a qualquer momento e usar o saldo restante.",
"zen.faq.q8": "Posso usar Zen com outros agentes de codigo?",
"zen.faq.a7": "Sim, você pode desativar o faturamento a qualquer momento e usar seu saldo restante.",
"zen.faq.q8": "Posso usar o Zen com outros agentes de codificação?",
"zen.faq.a8":
"Embora o Zen funcione muito bem com o OpenCode, voce pode usar o Zen com qualquer agente. Siga as instrucoes de configuracao no seu agente de codigo preferido.",
"zen.cta.start": "Comece com Zen",
"zen.pricing.title": "Adicione $ 20 de saldo pré-pago",
"zen.pricing.fee": "(+$ 1,23 taxa de processamento do cartão)",
"Embora o Zen funcione muito bem com o OpenCode, você pode usar o Zen com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
"zen.cta.start": "Comece com o Zen",
"zen.pricing.title": "Adicionar $20 de saldo pré-pago",
"zen.pricing.fee": "(+$1,23 taxa de processamento do cartão)",
"zen.pricing.body": "Use com qualquer agente. Defina limites de gastos mensais. Cancele a qualquer momento.",
"zen.problem.title": "Que problema Zen está resolvendo?",
"zen.problem.title": "Que problema o Zen resolve?",
"zen.problem.body":
"Existem muitos modelos disponíveis, mas apenas alguns funcionam bem com agentes de codificação. A maioria dos provedores os configura de maneira diferente, com resultados variados.",
"zen.problem.subtitle": "Estamos corrigindo isso para todos, não apenas para os usuários OpenCode.",
"zen.problem.subtitle": "Estamos corrigindo isso para todos, não apenas para os usuários do OpenCode.",
"zen.problem.item1": "Testando modelos selecionados e consultando suas equipes",
"zen.problem.item2": "Trabalhar com fornecedores para garantir que eles sejam entregues corretamente",
"zen.problem.item3": "Comparando todas as combinações de fornecedor de modelo que recomendamos",
"zen.how.title": "Como Zen funciona",
"zen.how.body": "Embora sugerimos que você use Zen com OpenCode, você pode usar Zen com qualquer agente.",
"zen.how.step1.title": "Cadastre-se e adicione saldo de $ 20",
"zen.how.step1.beforeLink": "siga o",
"zen.problem.item2": "Trabalhando com provedores para garantir que sejam entregues corretamente",
"zen.problem.item3": "Avaliando todas as combinações de modelo-provedor que recomendamos",
"zen.how.title": "Como o Zen funciona",
"zen.how.body": "Embora sugerimos que você use o Zen com o OpenCode, você pode usá-lo com qualquer agente.",
"zen.how.step1.title": "Cadastre-se e adicione $20 de saldo",
"zen.how.step1.beforeLink": "siga as",
"zen.how.step1.link": "instruções de configuração",
"zen.how.step2.title": "Use Zen com preços transparentes",
"zen.how.step2.link": "pague por solicitação",
"zen.how.step2.afterLink": "com marcação zero",
"zen.how.step2.title": "Use o Zen com preços transparentes",
"zen.how.step2.link": "pague por requisição",
"zen.how.step2.afterLink": "sem margens de lucro",
"zen.how.step3.title": "Recarga automática",
"zen.how.step3.body": "quando seu saldo atingir US$ 5, adicionaremos automaticamente US$ 20",
"zen.how.step3.body": "quando seu saldo atingir $5, adicionaremos automaticamente $20",
"zen.privacy.title": "Sua privacidade é importante para nós",
"zen.privacy.beforeExceptions":
"Todos os modelos Zen estão hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelo, com a",
"Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelo, com as",
"zen.privacy.exceptionsLink": "seguintes exceções",
"black.meta.title": "OpenCode Black | Acesse os melhores modelos de codificação do mundo",
"black.meta.description": "Tenha acesso ao Claude, GPT, Gemini e mais com os planos de assinatura OpenCode Black.",
"black.hero.title": "Acesse os melhores modelos de codificação do mundo",
"black.hero.subtitle": "Incluindo Claude, GPT, Gemini e mais",
"black.title": "OpenCode Black | Preços",
"black.plan.icon20": "Plano Black 20",
"black.plan.icon100": "Plano Black 100",
"black.plan.icon200": "Plano Black 200",
"black.plan.multiplier100": "5x mais uso que o Black 20",
"black.plan.multiplier200": "20x mais uso que o Black 20",
"black.price.perMonth": "por mês",
"black.price.perPersonBilledMonthly": "por pessoa faturado mensalmente",
"black.terms.1": "Sua assinatura não começará imediatamente",
"black.terms.2": "Você será adicionado à lista de espera e ativado em breve",
"black.terms.3": "Seu cartão só será cobrado quando sua assinatura for ativada",
"black.terms.4": "Limites de uso se aplicam; uso fortemente automatizado pode atingir os limites mais cedo",
"black.terms.5": "Assinaturas são para indivíduos, contate Enterprise para equipes",
"black.terms.6": "Limites podem ser ajustados e planos podem ser descontinuados no futuro",
"black.terms.7": "Cancele sua assinatura a qualquer momento",
"black.action.continue": "Continuar",
"black.finePrint.beforeTerms": "Os preços mostrados não incluem impostos aplicáveis",
"black.finePrint.terms": "Termos de Serviço",
"black.workspace.title": "OpenCode Black | Selecionar Workspace",
"black.workspace.selectPlan": "Selecione um workspace para este plano",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Assinar OpenCode Black",
"black.subscribe.paymentMethod": "Forma de pagamento",
"black.subscribe.loadingPaymentForm": "Carregando formulário de pagamento...",
"black.subscribe.selectWorkspaceToContinue": "Selecione um workspace para continuar",
"black.subscribe.failurePrefix": "Ops!",
"black.subscribe.error.generic": "Ocorreu um erro",
"black.subscribe.error.invalidPlan": "Plano inválido",
"black.subscribe.error.workspaceRequired": "ID do workspace é obrigatório",
"black.subscribe.error.alreadySubscribed": "Este workspace já possui uma assinatura",
"black.subscribe.processing": "Processando...",
"black.subscribe.submit": "Assinar ${{plan}}",
"black.subscribe.form.chargeNotice": "Você só será cobrado quando sua assinatura for ativada",
"black.subscribe.success.title": "Você está na lista de espera do OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Plano de assinatura",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Valor",
"black.subscribe.success.amountValue": "${{plan}} por mês",
"black.subscribe.success.paymentMethod": "Forma de pagamento",
"black.subscribe.success.dateJoined": "Data de entrada",
"black.subscribe.success.chargeNotice": "Seu cartão será cobrado quando sua assinatura for ativada",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "Chaves de API",
"workspace.nav.members": "Membros",
"workspace.nav.billing": "Faturamento",
"workspace.nav.settings": "Configurações",
"workspace.home.banner.beforeLink": "Modelos otimizados e confiáveis para agentes de codificação.",
"workspace.home.billing.loading": "Carregando...",
"workspace.home.billing.enable": "Ativar faturamento",
"workspace.home.billing.currentBalance": "Saldo atual",
"workspace.newUser.feature.tested.title": "Modelos Testados e Verificados",
"workspace.newUser.feature.tested.body":
"Avaliamos e testamos modelos especificamente para agentes de codificação para garantir o melhor desempenho.",
"workspace.newUser.feature.quality.title": "Qualidade Máxima",
"workspace.newUser.feature.quality.body":
"Acesse modelos configurados para desempenho ideal - sem downgrades ou roteamento para provedores mais baratos.",
"workspace.newUser.feature.lockin.title": "Sem Fidelidade",
"workspace.newUser.feature.lockin.body":
"Use o Zen com qualquer agente de codificação e continue usando outros provedores com opencode sempre que quiser.",
"workspace.newUser.copyApiKey": "Copiar chave de API",
"workspace.newUser.copyKey": "Copiar Chave",
"workspace.newUser.copied": "Copiado!",
"workspace.newUser.step.enableBilling": "Ativar faturamento",
"workspace.newUser.step.login.before": "Execute",
"workspace.newUser.step.login.after": "e selecione opencode",
"workspace.newUser.step.pasteKey": "Cole sua chave de API",
"workspace.newUser.step.models.before": "Inicie o opencode e execute",
"workspace.newUser.step.models.after": "para selecionar um modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink": "Gerencie quais modelos os membros do workspace podem acessar.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Habilitado",
"workspace.providers.title": "Traga Sua Própria Chave",
"workspace.providers.subtitle": "Configure suas próprias chaves de API de provedores de IA.",
"workspace.providers.placeholder": "Insira a chave de API {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Excluir",
"workspace.providers.saving": "Salvando...",
"workspace.providers.save": "Salvar",
"workspace.providers.table.provider": "Provedor",
"workspace.providers.table.apiKey": "Chave de API",
"workspace.usage.title": "Histórico de Uso",
"workspace.usage.subtitle": "Uso recente da API e custos.",
"workspace.usage.empty": "Faça sua primeira chamada de API para começar.",
"workspace.usage.table.date": "Data",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Entrada",
"workspace.usage.table.output": "Saída",
"workspace.usage.table.cost": "Custo",
"workspace.usage.breakdown.input": "Entrada",
"workspace.usage.breakdown.cacheRead": "Leitura de Cache",
"workspace.usage.breakdown.cacheWrite": "Escrita em Cache",
"workspace.usage.breakdown.output": "Saída",
"workspace.usage.breakdown.reasoning": "Raciocínio",
"workspace.usage.subscription": "assinatura (${{amount}})",
"workspace.cost.title": "Custo",
"workspace.cost.subtitle": "Custos de uso discriminados por modelo.",
"workspace.cost.allModels": "Todos os Modelos",
"workspace.cost.allKeys": "Todas as Chaves",
"workspace.cost.deletedSuffix": "(excluído)",
"workspace.cost.empty": "Nenhum dado de uso disponível para o período selecionado.",
"workspace.cost.subscriptionShort": "ass",
"workspace.keys.title": "Chaves de API",
"workspace.keys.subtitle": "Gerencie suas chaves de API para acessar os serviços opencode.",
"workspace.keys.create": "Criar Chave de API",
"workspace.keys.placeholder": "Digite o nome da chave",
"workspace.keys.empty": "Crie uma chave de API do opencode Gateway",
"workspace.keys.table.name": "Nome",
"workspace.keys.table.key": "Chave",
"workspace.keys.table.createdBy": "Criado Por",
"workspace.keys.table.lastUsed": "Último Uso",
"workspace.keys.copyApiKey": "Copiar chave de API",
"workspace.keys.delete": "Excluir",
"workspace.members.title": "Membros",
"workspace.members.subtitle": "Gerencie os membros do workspace e suas permissões.",
"workspace.members.invite": "Convidar Membro",
"workspace.members.inviting": "Convidando...",
"workspace.members.beta.beforeLink": "Workspaces são gratuitos para equipes durante o beta.",
"workspace.members.form.invitee": "Convidado",
"workspace.members.form.emailPlaceholder": "Digite o e-mail",
"workspace.members.form.role": "Função",
"workspace.members.form.monthlyLimit": "Limite de gastos mensais",
"workspace.members.noLimit": "Sem limite",
"workspace.members.noLimitLowercase": "sem limite",
"workspace.members.invited": "convidado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Excluir",
"workspace.members.saving": "Salvando...",
"workspace.members.save": "Salvar",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Função",
"workspace.members.table.monthLimit": "Limite mensal",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Pode gerenciar modelos, membros e faturamento",
"workspace.members.role.member": "Membro",
"workspace.members.role.memberDescription": "Só pode gerar chaves de API para si mesmo",
"workspace.settings.title": "Configurações",
"workspace.settings.subtitle": "Atualize o nome e as preferências do seu workspace.",
"workspace.settings.workspaceName": "Nome do workspace",
"workspace.settings.defaultName": "Padrão",
"workspace.settings.updating": "Atualizando...",
"workspace.settings.save": "Salvar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Faturamento",
"workspace.billing.subtitle.beforeLink": "Gerenciar formas de pagamento.",
"workspace.billing.contactUs": "Contate-nos",
"workspace.billing.subtitle.afterLink": "se você tiver alguma dúvida.",
"workspace.billing.currentBalance": "Saldo Atual",
"workspace.billing.add": "Adicionar $",
"workspace.billing.enterAmount": "Digite o valor",
"workspace.billing.loading": "Carregando...",
"workspace.billing.addAction": "Adicionar",
"workspace.billing.addBalance": "Adicionar Saldo",
"workspace.billing.linkedToStripe": "Vinculado ao Stripe",
"workspace.billing.manage": "Gerenciar",
"workspace.billing.enable": "Ativar Faturamento",
"workspace.monthlyLimit.title": "Limite Mensal",
"workspace.monthlyLimit.subtitle": "Defina um limite de uso mensal para sua conta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Definindo...",
"workspace.monthlyLimit.set": "Definir",
"workspace.monthlyLimit.edit": "Editar Limite",
"workspace.monthlyLimit.noLimit": "Nenhum limite de uso definido.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso atual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "é $",
"workspace.reload.title": "Recarga Automática",
"workspace.reload.disabled.before": "A recarga automática está",
"workspace.reload.disabled.state": "desativada",
"workspace.reload.disabled.after": "Ative para recarregar automaticamente quando o saldo estiver baixo.",
"workspace.reload.enabled.before": "A recarga automática está",
"workspace.reload.enabled.state": "ativada",
"workspace.reload.enabled.middle": "Recarregaremos",
"workspace.reload.processingFee": "taxa de processamento",
"workspace.reload.enabled.after": "quando o saldo atingir",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Ativar",
"workspace.reload.enableAutoReload": "Ativar Recarga Automática",
"workspace.reload.reloadAmount": "Recarregar $",
"workspace.reload.whenBalanceReaches": "Quando o saldo atingir $",
"workspace.reload.saving": "Salvando...",
"workspace.reload.save": "Salvar",
"workspace.reload.failedAt": "Recarga falhou em",
"workspace.reload.reason": "Motivo:",
"workspace.reload.updatePaymentMethod": "Por favor, atualize sua forma de pagamento e tente novamente.",
"workspace.reload.retrying": "Tentando novamente...",
"workspace.reload.retry": "Tentar novamente",
"workspace.payments.title": "Histórico de Pagamentos",
"workspace.payments.subtitle": "Transações de pagamento recentes.",
"workspace.payments.table.date": "Data",
"workspace.payments.table.paymentId": "ID do Pagamento",
"workspace.payments.table.amount": "Valor",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "assinatura",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Carregando...",
"workspace.black.time.day": "dia",
"workspace.black.time.days": "dias",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "alguns segundos",
"workspace.black.subscription.title": "Assinatura",
"workspace.black.subscription.message": "Você assina o OpenCode Black por ${{plan}} por mês.",
"workspace.black.subscription.manage": "Gerenciar Assinatura",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Reinicia em",
"workspace.black.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
"workspace.black.waitlist.title": "Lista de Espera",
"workspace.black.waitlist.joined": "Você está na lista de espera para o plano OpenCode Black de ${{plan}} por mês.",
"workspace.black.waitlist.ready": "Estamos prontos para inscrever você no plano OpenCode Black de ${{plan}} por mês.",
"workspace.black.waitlist.leave": "Sair da Lista de Espera",
"workspace.black.waitlist.leaving": "Saindo...",
"workspace.black.waitlist.left": "Saiu",
"workspace.black.waitlist.enroll": "Inscrever-se",
"workspace.black.waitlist.enrolling": "Inscrevendo-se...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Ao clicar em Inscrever-se, sua assinatura começará imediatamente e seu cartão será cobrado.",
"download.title": "OpenCode | Baixar",
"download.meta.description": "Baixe o OpenCode para macOS, Windows e Linux",
"download.hero.title": "Baixar OpenCode",
"download.hero.subtitle": "Disponivel em beta para macOS, Windows e Linux",
"download.hero.subtitle": "Disponível em Beta para macOS, Windows e Linux",
"download.hero.button": "Baixar para {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Extensoes do OpenCode",
"download.section.integrations": "Integracoes do OpenCode",
"download.section.extensions": "Extensões OpenCode",
"download.section.integrations": "Integrações OpenCode",
"download.action.download": "Baixar",
"download.action.install": "Instalar",
@@ -228,243 +503,96 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Nao necessariamente, mas provavelmente. Voce vai precisar de uma assinatura de IA se quiser conectar o OpenCode a um provedor pago, embora possa trabalhar com",
"Não necessariamente, mas provavelmente. Você precisará de uma assinatura de IA se quiser conectar o OpenCode a um provedor pago, embora você possa trabalhar com",
"download.faq.a3.localLink": "modelos locais",
"download.faq.a3.afterLocal.beforeZen": "de graca. Embora encorajemos os usuarios a usar",
"download.faq.a3.afterLocal.beforeZen": "de graça. Embora incentivemos os usuários a usar o",
"download.faq.a3.afterZen":
", o OpenCode funciona com todos os provedores populares como OpenAI, Anthropic, xAI etc.",
", o OpenCode funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
"download.faq.a5.p1": "OpenCode e 100% gratuito para usar.",
"download.faq.a5.p1": "O OpenCode é 100% gratuito para usar.",
"download.faq.a5.p2.beforeZen":
"Qualquer custo adicional vira da sua assinatura de um provedor de modelos. Embora o OpenCode funcione com qualquer provedor de modelos, recomendamos usar",
"Quaisquer custos adicionais virão da sua assinatura de um provedor de modelo. Embora o OpenCode funcione com qualquer provedor de modelo, recomendamos o uso do",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"Seus dados e informacoes so sao armazenados quando voce cria links compartilhaveis no OpenCode.",
"Seus dados e informações só são armazenados quando você cria links compartilháveis no OpenCode.",
"download.faq.a6.p2.beforeShare": "Saiba mais sobre",
"download.faq.a6.shareLink": "paginas de compartilhamento",
"download.faq.a6.shareLink": "páginas de compartilhamento",
"enterprise.title": "OpenCode | Solucoes empresariais para sua organizacao",
"enterprise.meta.description": "Entre em contato com a OpenCode para solucoes empresariais",
"enterprise.hero.title": "Seu codigo e seu",
"enterprise.title": "OpenCode | Soluções empresariais para sua organização",
"enterprise.meta.description": "Contate a OpenCode para soluções empresariais",
"enterprise.hero.title": "Seu código é seu",
"enterprise.hero.body1":
"A OpenCode opera de forma segura dentro da sua organizacao sem armazenar dados ou contexto e sem restricoes de licenca ou reivindicacoes de propriedade. Inicie um teste com sua equipe e, em seguida, implante em toda a organizacao integrando com seu SSO e gateway interno de IA.",
"enterprise.hero.body2": "Diga-nos como podemos ajudar.",
"O OpenCode opera com segurança dentro da sua organização, sem dados ou contexto armazenados e sem restrições de licenciamento ou reivindicações de propriedade. Inicie um teste com sua equipe e, em seguida, implante em toda a organização integrando-o ao seu SSO e gateway de IA interno.",
"enterprise.hero.body2": "Deixe-nos saber como podemos ajudar.",
"enterprise.form.name.label": "Nome completo",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Cargo",
"enterprise.form.role.placeholder": "Presidente do conselho",
"enterprise.form.role.placeholder": "Presidente Executivo",
"enterprise.form.email.label": "E-mail corporativo",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Qual problema voce esta tentando resolver?",
"enterprise.form.message.label": "Qual problema você está tentando resolver?",
"enterprise.form.message.placeholder": "Precisamos de ajuda com...",
"enterprise.form.send": "Enviar",
"enterprise.form.sending": "Enviando...",
"enterprise.form.success": "Mensagem enviada, entraremos em contato em breve.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "O que e OpenCode Enterprise?",
"enterprise.faq.q1": "O que é OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise e para organizacoes que querem garantir que seu codigo e dados nunca saiam da sua infraestrutura. Isso pode ser feito com uma configuracao centralizada que se integra ao seu SSO e gateway interno de IA.",
"enterprise.faq.q2": "Como comeco com OpenCode Enterprise?",
"OpenCode Enterprise é para organizações que desejam garantir que seu código e dados nunca saiam de sua infraestrutura. Isso pode ser feito usando uma configuração centralizada que se integra ao seu SSO e gateway de IA interno.",
"enterprise.faq.q2": "Como faço para começar com o OpenCode Enterprise?",
"enterprise.faq.a2":
"Basta comecar com um teste interno com sua equipe. A OpenCode por padrao nao armazena seu codigo nem dados de contexto, tornando facil comecar. Depois, entre em contato conosco para discutir precos e opcoes de implementacao.",
"enterprise.faq.q3": "Como funciona a precificacao empresarial?",
"Basta começar com um teste interno com sua equipe. O OpenCode por padrão não armazena seu código ou dados de contexto, facilitando o início. Em seguida, entre em contato conosco para discutir opções de preços e implementação.",
"enterprise.faq.q3": "Como funciona o preço empresarial?",
"enterprise.faq.a3":
"Oferecemos precos empresariais por assento. Se voce tiver seu proprio gateway de LLM, nao cobramos pelos tokens utilizados. Para mais detalhes, entre em contato para um orcamento personalizado com base nas necessidades da sua organizacao.",
"enterprise.faq.q4": "Meus dados estao seguros com OpenCode Enterprise?",
"Oferecemos preços empresariais por assento. Se você tiver seu próprio gateway de LLM, não cobramos pelos tokens usados. Para mais detalhes, entre em contato conosco para um orçamento personalizado com base nas necessidades da sua organização.",
"enterprise.faq.q4": "Meus dados estão seguros com o OpenCode Enterprise?",
"enterprise.faq.a4":
"Sim. A OpenCode nao armazena seu codigo nem dados de contexto. Todo o processamento acontece localmente ou por chamadas diretas de API ao seu provedor de IA. Com configuracao centralizada e integracao SSO, seus dados permanecem seguros dentro da infraestrutura da sua organizacao.",
"Sim. O OpenCode não armazena seu código ou dados de contexto. Todo o processamento acontece localmente ou por meio de chamadas de API diretas para seu provedor de IA. Com configuração centralizada e integração de SSO, seus dados permanecem seguros dentro da infraestrutura de sua organização.",
"brand.title": "OpenCode | Marca",
"brand.meta.description": "Diretrizes de marca da OpenCode",
"brand.heading": "Diretrizes de marca",
"brand.subtitle": "Recursos e arquivos para ajudar você a trabalhar com a marca OpenCode.",
"brand.downloadAll": "Baixar todos os assets",
"changelog.title": "OpenCode | Registro de mudancas",
"changelog.meta.description": "Notas de versao e registro de mudancas do OpenCode",
"changelog.hero.title": "Registro de mudancas",
"changelog.hero.subtitle": "Novas atualizacoes e melhorias no OpenCode",
"brand.meta.description": "Diretrizes da marca OpenCode",
"brand.heading": "Diretrizes da marca",
"brand.subtitle": "Recursos e ativos para ajudá-lo a trabalhar com a marca OpenCode.",
"brand.downloadAll": "Baixar todos os recursos",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Notas de versão e changelog do OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Novas atualizações e melhorias no OpenCode",
"changelog.empty": "Nenhuma entrada de changelog encontrada.",
"changelog.viewJson": "Ver JSON",
"workspace.nav.zen": "zen",
"workspace.nav.apiKeys": "API Chaves",
"workspace.nav.members": "Membros",
"workspace.nav.billing": "Cobrança",
"workspace.nav.settings": "Configurações",
"workspace.home.banner.beforeLink": "Modelos otimizados confiáveis para agentes de codificação.",
"workspace.home.billing.loading": "Carregando...",
"workspace.home.billing.enable": "Ativar faturamento",
"workspace.home.billing.currentBalance": "Saldo atual",
"workspace.newUser.feature.tested.title": "Modelos testados e verificados",
"workspace.newUser.feature.tested.body":
"Comparamos e testamos modelos especificamente para agentes de codificação para garantir o melhor desempenho.",
"workspace.newUser.feature.quality.title": "Mais alta qualidade",
"workspace.newUser.feature.quality.body":
"Modelos de acesso configurados para desempenho ideal sem downgrades ou roteamento para provedores mais baratos.",
"workspace.newUser.feature.lockin.title": "Sem bloqueio",
"workspace.newUser.feature.lockin.body":
"Use Zen com qualquer agente de codificação e continue usando outros provedores com opencode sempre que quiser.",
"workspace.newUser.copyApiKey": "Copiar chave API",
"workspace.newUser.copyKey": "Copiar chave",
"workspace.newUser.copied": "Copiado!",
"workspace.newUser.step.enableBilling": "Ativar faturamento",
"workspace.newUser.step.login.before": "Correr",
"workspace.newUser.step.login.after": "e selecione opencode",
"workspace.newUser.step.pasteKey": "Cole sua chave API",
"workspace.newUser.step.models.before": "Inicie opencode e execute",
"workspace.newUser.step.models.after": "para selecionar um modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink": "Gerencie quais modelos os membros do espaço de trabalho podem acessar.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Habilitado",
"workspace.providers.title": "Traga sua própria chave",
"workspace.providers.subtitle": "Configure suas próprias chaves API de provedores de IA.",
"workspace.providers.placeholder": "Insira a chave {{provider}} API ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Excluir",
"workspace.providers.saving": "Salvando...",
"workspace.providers.save": "Salvar",
"workspace.providers.table.provider": "Provedor",
"workspace.providers.table.apiKey": "Chave API",
"workspace.usage.title": "Histórico de uso",
"workspace.usage.subtitle": "Uso e custos recentes de API.",
"workspace.usage.empty": "Faça sua primeira chamada API para começar.",
"workspace.usage.table.date": "Data",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Entrada",
"workspace.usage.table.output": "Saída",
"workspace.usage.table.cost": "Custo",
"workspace.usage.breakdown.input": "Entrada",
"workspace.usage.breakdown.cacheRead": "Leitura de cache",
"workspace.usage.breakdown.cacheWrite": "Gravação em cache",
"workspace.usage.breakdown.output": "Saída",
"workspace.usage.breakdown.reasoning": "Raciocínio",
"workspace.usage.subscription": "assinatura (${{amount}})",
"workspace.cost.title": "Custo",
"workspace.cost.subtitle": "Custos de utilização discriminados por modelo.",
"workspace.cost.allModels": "Todos os modelos",
"workspace.cost.allKeys": "Todas as chaves",
"workspace.cost.deletedSuffix": "(excluído)",
"workspace.cost.empty": "Não há dados de uso disponíveis para o período selecionado.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API Chaves",
"workspace.keys.subtitle": "Gerencie suas chaves API para acessar serviços opencode.",
"workspace.keys.create": "Criar chave API",
"workspace.keys.placeholder": "Digite o nome da chave",
"workspace.keys.empty": "Crie uma chave opencode Gateway API",
"workspace.keys.table.name": "Nome",
"workspace.keys.table.key": "Chave",
"workspace.keys.table.createdBy": "Criado por",
"workspace.keys.table.lastUsed": "Último uso",
"workspace.keys.copyApiKey": "Copiar chave API",
"workspace.keys.delete": "Excluir",
"workspace.members.title": "Membros",
"workspace.members.subtitle": "Gerencie membros do espaço de trabalho e suas permissões.",
"workspace.members.invite": "Convidar membro",
"workspace.members.inviting": "Convidativo...",
"workspace.members.beta.beforeLink": "Os espaços de trabalho são gratuitos para equipes durante a versão beta.",
"workspace.members.form.invitee": "Convidado",
"workspace.members.form.emailPlaceholder": "Digite o e-mail",
"workspace.members.form.role": "Papel",
"workspace.members.form.monthlyLimit": "Limite de gastos mensais",
"workspace.members.noLimit": "Sem limite",
"workspace.members.noLimitLowercase": "sem limite",
"workspace.members.invited": "convidado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Excluir",
"workspace.members.saving": "Salvando...",
"workspace.members.save": "Salvar",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Papel",
"workspace.members.table.monthLimit": "Limite de mês",
"workspace.members.role.admin": "Administrador",
"workspace.members.role.adminDescription": "Pode gerenciar modelos, membros e cobrança",
"workspace.members.role.member": "Membro",
"workspace.members.role.memberDescription": "Só podem gerar chaves API para si próprios",
"workspace.settings.title": "Configurações",
"workspace.settings.subtitle": "Atualize o nome e as preferências do seu espaço de trabalho.",
"workspace.settings.workspaceName": "Nome do espaço de trabalho",
"workspace.settings.defaultName": "Padrão",
"workspace.settings.updating": "Atualizando...",
"workspace.settings.save": "Salvar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Cobrança",
"workspace.billing.subtitle.beforeLink": "Gerenciar métodos de pagamentos.",
"workspace.billing.contactUs": "Contate-nos",
"workspace.billing.subtitle.afterLink": "se você tiver alguma dúvida.",
"workspace.billing.currentBalance": "Saldo Atual",
"workspace.billing.add": "Adicionar $",
"workspace.billing.enterAmount": "Insira o valor",
"workspace.billing.loading": "Carregando...",
"workspace.billing.addAction": "Adicionar",
"workspace.billing.addBalance": "Adicionar saldo",
"workspace.billing.linkedToStripe": "Vinculado ao Stripe",
"workspace.billing.manage": "Gerenciar",
"workspace.billing.enable": "Ativar faturamento",
"workspace.monthlyLimit.title": "Limite Mensal",
"workspace.monthlyLimit.subtitle": "Defina um limite de uso mensal para sua conta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Contexto...",
"workspace.monthlyLimit.set": "Definir",
"workspace.monthlyLimit.edit": "Editar Limite",
"workspace.monthlyLimit.noLimit": "Nenhum limite de uso definido.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso atual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "é $",
"workspace.reload.title": "Recarga automática",
"workspace.reload.disabled.before": "A recarga automática é",
"workspace.reload.disabled.state": "desabilitado",
"workspace.reload.disabled.after": "Ative para recarregar automaticamente quando o saldo estiver baixo.",
"workspace.reload.enabled.before": "A recarga automática é",
"workspace.reload.enabled.state": "habilitado",
"workspace.reload.enabled.middle": "Vamos recarregar",
"workspace.reload.processingFee": "taxa de processamento",
"workspace.reload.enabled.after": "quando o equilíbrio atinge",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Habilitar",
"workspace.reload.enableAutoReload": "Ativar recarga automática",
"workspace.reload.reloadAmount": "Recarregar $",
"workspace.reload.whenBalanceReaches": "Quando o saldo atinge $",
"workspace.reload.saving": "Salvando...",
"workspace.reload.save": "Salvar",
"workspace.reload.failedAt": "Falha ao recarregar em",
"workspace.reload.reason": "Razão:",
"workspace.reload.updatePaymentMethod": "Atualize sua forma de pagamento e tente novamente.",
"workspace.reload.retrying": "Tentando novamente...",
"workspace.reload.retry": "Tentar novamente",
"workspace.payments.title": "Histórico de pagamentos",
"workspace.payments.subtitle": "Transações de pagamento recentes.",
"workspace.payments.table.date": "Data",
"workspace.payments.table.paymentId": "ID de pagamento",
"workspace.payments.table.amount": "Quantia",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "subscrição",
"workspace.payments.view": "Visualizar",
"workspace.black.loading": "Carregando...",
"workspace.black.time.day": "dia",
"workspace.black.time.days": "dias",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "alguns segundos",
"workspace.black.subscription.title": "Subscrição",
"workspace.black.subscription.message": "Você está inscrito no OpenCode Black por ${{plan}} por mês.",
"workspace.black.subscription.manage": "Gerenciar assinatura",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso semanal",
"workspace.black.subscription.resetsIn": "Reinicia em",
"workspace.black.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
"workspace.black.waitlist.title": "Lista de espera",
"workspace.black.waitlist.joined": "Você está na lista de espera do plano Black de ${{plan}} por mês OpenCode.",
"workspace.black.waitlist.ready": "Estamos prontos para inscrevê-lo no plano Black de ${{plan}} por mês OpenCode.",
"workspace.black.waitlist.leave": "Sair da lista de espera",
"workspace.black.waitlist.leaving": "Saindo...",
"workspace.black.waitlist.left": "Esquerda",
"workspace.black.waitlist.enroll": "Matricular",
"workspace.black.waitlist.enrolling": "Inscrevendo-se...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Ao clicar em Inscrever-se, sua assinatura será iniciada imediatamente e seu cartão será cobrado.",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agente",
"bench.list.table.model": "Modelo",
"bench.list.table.score": "Pontuação",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tarefa não encontrada",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agente",
"bench.detail.labels.model": "Modelo",
"bench.detail.labels.task": "Tarefa",
"bench.detail.labels.repo": "Repositório",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "Para",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Duração Média",
"bench.detail.labels.averageScore": "Pontuação Média",
"bench.detail.labels.averageCost": "Custo Médio",
"bench.detail.labels.summary": "Resumo",
"bench.detail.labels.runs": "Execuções",
"bench.detail.labels.score": "Pontuação",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalidade",
"bench.detail.labels.weight": "peso",
"bench.detail.table.run": "Execução",
"bench.detail.table.score": "Pontuação (Base - Penalidade)",
"bench.detail.table.cost": "Custo",
"bench.detail.table.duration": "Duração",
"bench.detail.run.title": "Execução {{n}}",
"bench.detail.rawJson": "JSON Bruto",
} satisfies Dict

View File

@@ -13,7 +13,7 @@ export const dict = {
"nav.login": "Log ind",
"nav.free": "Gratis",
"nav.home": "Hjem",
"nav.openMenu": "Aben menu",
"nav.openMenu": "Åbn menu",
"nav.getStartedFree": "Kom i gang gratis",
"nav.context.copyLogo": "Kopier logo som SVG",
@@ -30,7 +30,7 @@ export const dict = {
"legal.privacy": "Privatliv",
"legal.terms": "Vilkår",
"email.title": "Fa besked først, nar vi lancerer nye produkter",
"email.title": "Få besked først, når vi lancerer nye produkter",
"email.subtitle": "Tilmeld dig ventelisten for tidlig adgang.",
"email.placeholder": "E-mailadresse",
"email.subscribe": "Tilmeld",
@@ -54,16 +54,47 @@ export const dict = {
"common.creating": "Opretter...",
"common.create": "Opret",
"common.videoUnsupported": "Din browser understotter ikke video-tagget.",
"common.videoUnsupported": "Din browser understøtter ikke video-tagget.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Laes mere",
"common.learnMore": "Læs mere",
"error.invalidPlan": "Ugyldig plan",
"error.workspaceRequired": "Workspace-ID er påkrævet",
"error.alreadySubscribed": "Dette workspace har allerede et abonnement",
"error.limitRequired": "Grænse er påkrævet.",
"error.monthlyLimitInvalid": "Angiv en gyldig månedlig grænse.",
"error.workspaceNameRequired": "Workspace-navn er påkrævet.",
"error.nameTooLong": "Navnet må højst være på 255 tegn.",
"error.emailRequired": "E-mail er påkrævet",
"error.roleRequired": "Rolle er påkrævet",
"error.idRequired": "ID er påkrævet",
"error.nameRequired": "Navn er påkrævet",
"error.providerRequired": "Udbyder er påkrævet",
"error.apiKeyRequired": "API-nøgle er påkrævet",
"error.modelRequired": "Model er påkrævet",
"error.reloadAmountMin": "Genopfyldningsbeløb skal være mindst ${{amount}}",
"error.reloadTriggerMin": "Saldogrænse skal være mindst ${{amount}}",
"home.title": "OpenCode | Den open source AI-kodningsagent",
"temp.title": "opencode | AI-kodningsagent bygget til terminalen",
"temp.hero.title": "AI-kodningsagenten bygget til terminalen",
"temp.zen": "opencode zen",
"temp.getStarted": "Kom i gang",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "En responsiv, native, tema-bar terminal-UI",
"temp.feature.zen.beforeLink": "En",
"temp.feature.zen.link": "kurateret liste over modeller",
"temp.feature.zen.afterLink": "leveret af opencode",
"temp.feature.models.beforeLink": "Understøtter 75+ LLM-udbydere gennem",
"temp.feature.models.afterLink": ", inklusive lokale modeller",
"temp.screenshot.caption": "opencode TUI med tokyonight-temaet",
"temp.screenshot.alt": "opencode TUI med tokyonight-temaet",
"home.banner.badge": "Ny",
"home.banner.text": "Desktop-app tilgaengelig i beta",
"home.banner.platforms": "pa macOS, Windows og Linux",
"home.banner.text": "Desktop-app tilgængelig i beta",
"home.banner.platforms": "på macOS, Windows og Linux",
"home.banner.downloadNow": "Download nu",
"home.banner.downloadBetaNow": "Download desktop-betaen nu",
@@ -75,11 +106,11 @@ export const dict = {
"home.what.title": "Hvad er OpenCode?",
"home.what.body":
"OpenCode er en open source agent, der hjelper dig med at skrive kode i din terminal, IDE eller desktop.",
"OpenCode er en open source agent, der hjælper dig med at skrive kode i din terminal, IDE eller desktop.",
"home.what.lsp.title": "LSP aktiveret",
"home.what.lsp.body": "Indlaeser automatisk de rigtige LSP'er til LLM'en",
"home.what.lsp.body": "Indlæser automatisk de rigtige LSP'er til LLM'en",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Start flere agenter parallelt pa det samme projekt",
"home.what.multiSession.body": "Start flere agenter parallelt på det samme projekt",
"home.what.shareLinks.title": "Del links",
"home.what.shareLinks.body": "Del et link til enhver session til reference eller debugging",
"home.what.copilot.title": "GitHub Copilot",
@@ -89,108 +120,107 @@ export const dict = {
"home.what.anyModel.title": "Enhver model",
"home.what.anyModel.body": "75+ LLM-udbydere via Models.dev, inklusive lokale modeller",
"home.what.anyEditor.title": "Enhver editor",
"home.what.anyEditor.body": "Tilgengelig som terminal-interface, desktop-app og IDE-udvidelse",
"home.what.readDocs": "Laes docs",
"home.what.anyEditor.body": "Tilgængelig som terminal-interface, desktop-app og IDE-udvidelse",
"home.what.readDocs": "Læs docs",
"home.growth.title": "Den open source AI-kodningsagent",
"home.growth.body":
"Med over <strong>{{stars}}</strong> GitHub-stjerner, <strong>{{contributors}}</strong> bidragsydere og over <strong>{{commits}}</strong> commits bruges OpenCode af over <strong>{{monthlyUsers}}</strong> udviklere hver maaned.",
"Med over <strong>{{stars}}</strong> GitHub-stjerner, <strong>{{contributors}}</strong> bidragsydere og over <strong>{{commits}}</strong> commits bruges OpenCode af over <strong>{{monthlyUsers}}</strong> udviklere hver måned.",
"home.growth.githubStars": "GitHub-stjerner",
"home.growth.contributors": "Bidragsydere",
"home.growth.monthlyDevs": "Maanedlige devs",
"home.growth.monthlyDevs": "Månedlige udviklere",
"home.privacy.title": "Bygget med privatliv forst",
"home.privacy.title": "Bygget med privatliv først",
"home.privacy.body":
"OpenCode gemmer ikke din kode eller kontekstdata, sa den kan bruges i privatlivsfomlsomme miljoer.",
"home.privacy.learnMore": "Laes mere om",
"OpenCode gemmer ikke din kode eller kontekstdata, så den kan bruges i privatlivsfølsomme miljøer.",
"home.privacy.learnMore": "Læs mere om",
"home.privacy.link": "privatliv",
"home.faq.q1": "Hvad er OpenCode?",
"home.faq.a1":
"OpenCode er en open source agent, der hjelper dig med at skrive og kore kode med enhver AI-model. Den er tilgengelig som terminal-interface, desktop-app eller IDE-udvidelse.",
"OpenCode er en open source agent, der hjælper dig med at skrive og køre kode med enhver AI-model. Den er tilgængelig som terminal-interface, desktop-app eller IDE-udvidelse.",
"home.faq.q2": "Hvordan bruger jeg OpenCode?",
"home.faq.a2.before": "Den nemmeste made at komme i gang pa er at laese",
"home.faq.a2.before": "Den nemmeste måde at komme i gang på er at læse",
"home.faq.a2.link": "introen",
"home.faq.q3": "Skal jeg have ekstra AI-abonnementer for at bruge OpenCode?",
"home.faq.a3.p1":
"Ikke nodvendigvis. OpenCode kommer med gratis modeller, som du kan bruge uden at oprette en konto.",
"Ikke nødvendigvis. OpenCode kommer med gratis modeller, som du kan bruge uden at oprette en konto.",
"home.faq.a3.p2.beforeZen": "Derudover kan du bruge populære kodningsmodeller ved at oprette en",
"home.faq.a3.p2.afterZen": " konto.",
"home.faq.a3.p3":
"Vi opfordrer til at bruge Zen, men OpenCode virker ogsa med populære udbydere som OpenAI, Anthropic, xAI osv.",
"Vi opfordrer til at bruge Zen, men OpenCode virker også med populære udbydere som OpenAI, Anthropic, xAI osv.",
"home.faq.a3.p4.beforeLocal": "Du kan endda forbinde dine",
"home.faq.a3.p4.localLink": "lokale modeller",
"home.faq.q4": "Kan jeg bruge mine eksisterende AI-abonnementer med OpenCode?",
"home.faq.a4.p1":
"Ja. OpenCode understotter abonnementer fra alle store udbydere. Du kan bruge Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot.",
"Ja. OpenCode understøtter abonnementer fra alle store udbydere. Du kan bruge Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot.",
"home.faq.q5": "Kan jeg kun bruge OpenCode i terminalen?",
"home.faq.a5.beforeDesktop": "Ikke længere! OpenCode er nu tilgengelig som en app til",
"home.faq.a5.beforeDesktop": "Ikke længere! OpenCode er nu tilgængelig som en app til",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "og",
"home.faq.a5.web": "web",
"home.faq.q6": "Hvad koster OpenCode?",
"home.faq.a6":
"OpenCode er 100% gratis at bruge. Det kommer ogsa med et saet gratis modeller. Der kan vare ekstra omkostninger, hvis du forbinder en anden udbyder.",
"OpenCode er 100% gratis at bruge. Det kommer også med et sæt gratis modeller. Der kan være ekstra omkostninger, hvis du forbinder en anden udbyder.",
"home.faq.q7": "Hvad med data og privatliv?",
"home.faq.a7.p1": "Dine data gemmes kun, nar du bruger vores gratis modeller eller opretter delbare links.",
"home.faq.a7.p2.beforeModels": "Laes mere om",
"home.faq.a7.p1": "Dine data gemmes kun, når du bruger vores gratis modeller eller opretter delbare links.",
"home.faq.a7.p2.beforeModels": "Læs mere om",
"home.faq.a7.p2.modelsLink": "vores modeller",
"home.faq.a7.p2.and": "og",
"home.faq.a7.p2.shareLink": "delingssider",
"home.faq.q8": "Er OpenCode open source?",
"home.faq.a8.p1": "Ja, OpenCode er fuldt open source. Kildekoden er offentlig pa",
"home.faq.a8.p1": "Ja, OpenCode er fuldt open source. Kildekoden er offentlig på",
"home.faq.a8.p2": "under",
"home.faq.a8.mitLicense": "MIT-licensen",
"home.faq.a8.p3":
", hvilket betyder at alle kan bruge, ændre eller bidrage til udviklingen. Alle i communityet kan oprette issues, indsende pull requests og udvide funktionalitet.",
"home.zenCta.title": "Fa adgang til palidelige, optimerede modeller til kodningsagenter",
"home.zenCta.title": "Få adgang til pålidelige, optimerede modeller til kodningsagenter",
"home.zenCta.body":
"Zen giver dig adgang til et handplukket sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet pa tværs af udbydere: brug validerede modeller, der virker.",
"home.zenCta.link": "Laes om Zen",
"Zen giver dig adgang til et håndplukket sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet på tværs af udbydere: brug validerede modeller, der virker.",
"home.zenCta.link": "Læs om Zen",
"download.title": "OpenCode | Download",
"zen.title": "OpenCode Zen | Et kurateret saet af palidelige, optimerede modeller til kodningsagenter",
"zen.hero.title": "Fa adgang til palidelige, optimerede modeller til kodningsagenter",
"zen.title": "OpenCode Zen | Et kurateret sæt af pålidelige, optimerede modeller til kodningsagenter",
"zen.hero.title": "Pålidelige optimerede modeller til kodningsagenter",
"zen.hero.body":
"Zen giver dig adgang til et handplukket sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet pa tværs af udbydere: brug validerede modeller, der virker.",
"Zen giver dig adgang til et kurateret sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet: brug validerede modeller, der virker.",
"zen.faq.q1": "Hvad er OpenCode Zen?",
"zen.faq.a1":
"Zen er et kurateret saet AI-modeller testet og benchmarked til kodningsagenter, skabt af teamet bag OpenCode.",
"zen.faq.q2": "Hvad gor Zen mere praecis?",
"Zen er et kurateret sæt AI-modeller testet og benchmarked til kodningsagenter, skabt af teamet bag OpenCode.",
"zen.faq.q2": "Hvad gør Zen mere præcis?",
"zen.faq.a2":
"Zen tilbyder kun modeller, der er testet og benchmarked specifikt til kodningsagenter. Du ville ikke bruge en smorkniv til at skare steak; brug ikke darlige modeller til kodning.",
"Zen tilbyder kun modeller, der er testet og benchmarked specifikt til kodningsagenter. Du ville ikke bruge en smørkniv til at skære steak; brug ikke dårlige modeller til kodning.",
"zen.faq.q3": "Er Zen billigere?",
"zen.faq.a3":
"Zen er ikke for profit. Zen viderefakturerer omkostningerne fra modeludbyderne til dig. Jo mere Zen bruges, desto mere kan OpenCode forhandle bedre priser og give dem videre til dig.",
"Zen er ikke for profit. Zen videregiver omkostningerne fra modeludbyderne til dig. Jo mere Zen bruges, desto mere kan OpenCode forhandle bedre priser og give dem videre til dig.",
"zen.faq.q4": "Hvad koster Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "opkraever per request",
"zen.faq.a4.p1.afterPricing": "uden markups, sa du betaler praecis det, som modeludbyderen opkraever.",
"zen.faq.a4.p2.beforeAccount": "Din samlede pris afhanger af brug, og du kan saette manedlige udgiftsgraenser i din",
"zen.faq.a4.p1.pricingLink": "opkræver per request",
"zen.faq.a4.p1.afterPricing": "uden markups, så du betaler præcis det, som modeludbyderen opkræver.",
"zen.faq.a4.p2.beforeAccount": "Din samlede pris afhænger af brug, og du kan sætte månedlige udgiftsgrænser i din",
"zen.faq.a4.p2.accountLink": "konto",
"zen.faq.a4.p3":
"For at daekke omkostninger tilfojer OpenCode kun et lille betalingsgebyr pa $1.23 per $20 saldo-opfyldning.",
"For at dække omkostninger tilføjer OpenCode kun et lille betalingsgebyr på $1.23 per $20 saldo-opfyldning.",
"zen.faq.q5": "Hvad med data og privatliv?",
"zen.faq.a5.beforeExceptions":
"Alle Zen-modeller hostes i USA. Udbydere folger en zero-retention-policy og bruger ikke dine data til modeltraening, med de",
"zen.faq.a5.exceptionsLink": "foelgende undtagelser",
"zen.faq.q6": "Kan jeg saette udgiftsgraenser?",
"zen.faq.a6": "Ja, du kan saette manedlige udgiftsgraenser i din konto.",
"Alle Zen-modeller hostes i USA. Udbydere følger en zero-retention-policy og bruger ikke dine data til modeltræning, med de",
"zen.faq.a5.exceptionsLink": "følgende undtagelser",
"zen.faq.q6": "Kan jeg sætte udgiftsgrænser?",
"zen.faq.a6": "Ja, du kan sætte månedlige udgiftsgrænser i din konto.",
"zen.faq.q7": "Kan jeg afmelde?",
"zen.faq.a7": "Ja, du kan deaktivere betaling nar som helst og bruge din resterende saldo.",
"zen.faq.a7": "Ja, du kan deaktivere betaling når som helst og bruge din resterende saldo.",
"zen.faq.q8": "Kan jeg bruge Zen med andre kodningsagenter?",
"zen.faq.a8":
"Selvom Zen fungerer godt med OpenCode, kan du bruge Zen med enhver agent. Folg opsaetningsinstruktionerne i din foretrukne kodningsagent.",
"Selvom Zen fungerer godt med OpenCode, kan du bruge Zen med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
"zen.cta.start": "Kom godt i gang med Zen",
"zen.pricing.title": "Tilføj $20 Pay as you go-saldo",
"zen.pricing.fee": "(+$1,23 kortbehandlingsgebyr)",
"zen.pricing.body": "Brug med ethvert middel. Indstil månedlige forbrugsgrænser. Annuller til enhver tid.",
"zen.pricing.fee": "(+$1.23 kortbehandlingsgebyr)",
"zen.pricing.body": "Brug med enhver agent. Indstil månedlige forbrugsgrænser. Annuller til enhver tid.",
"zen.problem.title": "Hvilket problem løser Zen?",
"zen.problem.body":
"Der er så mange modeller tilgængelige, men kun få fungerer godt med kodningsmidler. De fleste udbydere konfigurerer dem anderledes med forskellige resultater.",
"Der er så mange modeller tilgængelige, men kun få fungerer godt med kodningsagenter. De fleste udbydere konfigurerer dem anderledes med forskellige resultater.",
"zen.problem.subtitle": "Vi løser dette for alle, ikke kun OpenCode-brugere.",
"zen.problem.item1": "Test af udvalgte modeller og høring af deres teams",
"zen.problem.item2": "Samarbejde med udbydere for at sikre, at de bliver leveret korrekt",
@@ -201,17 +231,261 @@ export const dict = {
"zen.how.step1.beforeLink": "følg",
"zen.how.step1.link": "opsætningsinstruktioner",
"zen.how.step2.title": "Brug Zen med gennemsigtige priser",
"zen.how.step2.link": "betale pr anmodning",
"zen.how.step2.afterLink": "med nul markeringer",
"zen.how.step2.link": "betal per request",
"zen.how.step2.afterLink": "med nul markups",
"zen.how.step3.title": "Auto-top op",
"zen.how.step3.body": "når din saldo når $5, tilføjer vi automatisk $20",
"zen.privacy.title": "Dit privatliv er vigtigt for os",
"zen.privacy.beforeExceptions":
"Alle Zen-modeller er hostet i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning med",
"zen.privacy.exceptionsLink": "følgende undtagelser",
"black.meta.title": "OpenCode Black | Få adgang til verdens bedste kodningsmodeller",
"black.meta.description": "Få adgang til Claude, GPT, Gemini og mere med OpenCode Black-abonnementer.",
"black.hero.title": "Få adgang til verdens bedste kodningsmodeller",
"black.hero.subtitle": "Inklusive Claude, GPT, Gemini og mere",
"black.title": "OpenCode Black | Priser",
"black.plan.icon20": "Black 20-plan",
"black.plan.icon100": "Black 100-plan",
"black.plan.icon200": "Black 200-plan",
"black.plan.multiplier100": "5x mere brug end Black 20",
"black.plan.multiplier200": "20x mere brug end Black 20",
"black.price.perMonth": "pr. måned",
"black.price.perPersonBilledMonthly": "pr. person faktureret månedligt",
"black.terms.1": "Dit abonnement starter ikke med det samme",
"black.terms.2": "Du bliver sat på ventelisten og aktiveret snart",
"black.terms.3": "Dit kort debiteres først, når dit abonnement er aktiveret",
"black.terms.4": "Forbrugsgrænser gælder, tung automatiseret brug kan nå grænserne hurtigere",
"black.terms.5": "Abonnementer er for enkeltpersoner, kontakt Enterprise for teams",
"black.terms.6": "Grænser kan justeres, og planer kan blive udfaset i fremtiden",
"black.terms.7": "Opsig dit abonnement når som helst",
"black.action.continue": "Fortsæt",
"black.finePrint.beforeTerms": "Viste priser inkluderer ikke gældende skat",
"black.finePrint.terms": "Servicevilkår",
"black.workspace.title": "OpenCode Black | Vælg workspace",
"black.workspace.selectPlan": "Vælg et workspace til denne plan",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Abonner på OpenCode Black",
"black.subscribe.paymentMethod": "Betalingsmetode",
"black.subscribe.loadingPaymentForm": "Indlæser betalingsformular...",
"black.subscribe.selectWorkspaceToContinue": "Vælg et workspace for at fortsætte",
"black.subscribe.failurePrefix": "Åh nej!",
"black.subscribe.error.generic": "Der opstod en fejl",
"black.subscribe.error.invalidPlan": "Ugyldig plan",
"black.subscribe.error.workspaceRequired": "Workspace-ID er påkrævet",
"black.subscribe.error.alreadySubscribed": "Dette workspace har allerede et abonnement",
"black.subscribe.processing": "Behandler...",
"black.subscribe.submit": "Abonner ${{plan}}",
"black.subscribe.form.chargeNotice": "Du bliver først debiteret, når dit abonnement er aktiveret",
"black.subscribe.success.title": "Du er på OpenCode Black-ventelisten",
"black.subscribe.success.subscriptionPlan": "Abonnementsplan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Beløb",
"black.subscribe.success.amountValue": "${{plan}} pr. måned",
"black.subscribe.success.paymentMethod": "Betalingsmetode",
"black.subscribe.success.dateJoined": "Dato tilmeldt",
"black.subscribe.success.chargeNotice": "Dit kort vil blive debiteret, når dit abonnement er aktiveret",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API-nøgler",
"workspace.nav.members": "Medlemmer",
"workspace.nav.billing": "Fakturering",
"workspace.nav.settings": "Indstillinger",
"workspace.home.banner.beforeLink": "Pålidelige optimerede modeller til kodningsagenter.",
"workspace.home.billing.loading": "Indlæser...",
"workspace.home.billing.enable": "Aktiver fakturering",
"workspace.home.billing.currentBalance": "Nuværende saldo",
"workspace.newUser.feature.tested.title": "Testede og verificerede modeller",
"workspace.newUser.feature.tested.body":
"Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne.",
"workspace.newUser.feature.quality.title": "Højeste kvalitet",
"workspace.newUser.feature.quality.body":
"Få adgang til modeller konfigureret til optimal ydeevne - ingen nedgraderinger eller routing til billigere udbydere.",
"workspace.newUser.feature.lockin.title": "Ingen indlåsning",
"workspace.newUser.feature.lockin.body":
"Brug Zen med en hvilken som helst kodningsagent, og fortsæt med at bruge andre udbydere med opencode, når du vil.",
"workspace.newUser.copyApiKey": "Kopiér API-nøgle",
"workspace.newUser.copyKey": "Kopier nøgle",
"workspace.newUser.copied": "Kopieret!",
"workspace.newUser.step.enableBilling": "Aktiver fakturering",
"workspace.newUser.step.login.before": "Kør",
"workspace.newUser.step.login.after": "og vælg opencode",
"workspace.newUser.step.pasteKey": "Indsæt din API-nøgle",
"workspace.newUser.step.models.before": "Start opencode og kør",
"workspace.newUser.step.models.after": "for at vælge en model",
"workspace.models.title": "Modeller",
"workspace.models.subtitle.beforeLink": "Administrer, hvilke modeller workspace-medlemmer kan få adgang til.",
"workspace.models.table.model": "Model",
"workspace.models.table.enabled": "Aktiveret",
"workspace.providers.title": "Medbring din egen nøgle",
"workspace.providers.subtitle": "Konfigurer dine egne API-nøgler fra AI-udbydere.",
"workspace.providers.placeholder": "Indtast {{provider}} API-nøgle ({{prefix}}...)",
"workspace.providers.configure": "Konfigurer",
"workspace.providers.edit": "Rediger",
"workspace.providers.delete": "Slet",
"workspace.providers.saving": "Gemmer...",
"workspace.providers.save": "Gem",
"workspace.providers.table.provider": "Udbyder",
"workspace.providers.table.apiKey": "API-nøgle",
"workspace.usage.title": "Brugshistorik",
"workspace.usage.subtitle": "Seneste API-brug og omkostninger.",
"workspace.usage.empty": "Foretag dit første API-opkald for at komme i gang.",
"workspace.usage.table.date": "Dato",
"workspace.usage.table.model": "Model",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Omkostning",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache læst",
"workspace.usage.breakdown.cacheWrite": "Cache skriv",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Ræsonnement",
"workspace.usage.subscription": "abonnement (${{amount}})",
"workspace.cost.title": "Omkostninger",
"workspace.cost.subtitle": "Brugsomkostninger opdelt efter model.",
"workspace.cost.allModels": "Alle modeller",
"workspace.cost.allKeys": "Alle nøgler",
"workspace.cost.deletedSuffix": "(slettet)",
"workspace.cost.empty": "Ingen brugsdata tilgængelige for den valgte periode.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API-nøgler",
"workspace.keys.subtitle": "Administrer dine API-nøgler for at få adgang til opencode-tjenester.",
"workspace.keys.create": "Opret API-nøgle",
"workspace.keys.placeholder": "Indtast nøglenavn",
"workspace.keys.empty": "Opret en opencode Gateway API-nøgle",
"workspace.keys.table.name": "Navn",
"workspace.keys.table.key": "Nøgle",
"workspace.keys.table.createdBy": "Oprettet af",
"workspace.keys.table.lastUsed": "Sidst brugt",
"workspace.keys.copyApiKey": "Kopiér API-nøgle",
"workspace.keys.delete": "Slet",
"workspace.members.title": "Medlemmer",
"workspace.members.subtitle": "Administrer workspace-medlemmer og deres tilladelser.",
"workspace.members.invite": "Inviter medlem",
"workspace.members.inviting": "Inviterer...",
"workspace.members.beta.beforeLink": "Workspaces er gratis for teams under betaversionen.",
"workspace.members.form.invitee": "Inviteret",
"workspace.members.form.emailPlaceholder": "Indtast e-mail",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Månedlig forbrugsgrænse",
"workspace.members.noLimit": "Ingen grænse",
"workspace.members.noLimitLowercase": "ingen grænse",
"workspace.members.invited": "inviteret",
"workspace.members.edit": "Rediger",
"workspace.members.delete": "Slet",
"workspace.members.saving": "Gemmer...",
"workspace.members.save": "Gem",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Månedsgrænse",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
"workspace.members.role.member": "Medlem",
"workspace.members.role.memberDescription": "Kan kun generere API-nøgler til sig selv",
"workspace.settings.title": "Indstillinger",
"workspace.settings.subtitle": "Opdater dit workspace-navn og præferencer.",
"workspace.settings.workspaceName": "Workspace-navn",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Opdaterer...",
"workspace.settings.save": "Gem",
"workspace.settings.edit": "Rediger",
"workspace.billing.title": "Fakturering",
"workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
"workspace.billing.contactUs": "Kontakt os",
"workspace.billing.subtitle.afterLink": "hvis du har spørgsmål.",
"workspace.billing.currentBalance": "Nuværende saldo",
"workspace.billing.add": "Tilføj $",
"workspace.billing.enterAmount": "Indtast beløb",
"workspace.billing.loading": "Indlæser...",
"workspace.billing.addAction": "Tilføj",
"workspace.billing.addBalance": "Tilføj saldo",
"workspace.billing.linkedToStripe": "Forbundet til Stripe",
"workspace.billing.manage": "Administrer",
"workspace.billing.enable": "Aktiver fakturering",
"workspace.monthlyLimit.title": "Månedlig grænse",
"workspace.monthlyLimit.subtitle": "Indstil en månedlig forbrugsgrænse for din konto.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Indstiller...",
"workspace.monthlyLimit.set": "Sæt",
"workspace.monthlyLimit.edit": "Rediger grænse",
"workspace.monthlyLimit.noLimit": "Ingen forbrugsgrænse angivet.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Nuværende brug for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
"workspace.reload.title": "Automatisk genopfyldning",
"workspace.reload.disabled.before": "Automatisk genopfyldning er",
"workspace.reload.disabled.state": "deaktiveret",
"workspace.reload.disabled.after": "Aktiver for automatisk at genopfylde, når saldoen er lav.",
"workspace.reload.enabled.before": "Automatisk genopfyldning er",
"workspace.reload.enabled.state": "aktiveret",
"workspace.reload.enabled.middle": "Vi genopfylder",
"workspace.reload.processingFee": "ekspeditionsgebyr",
"workspace.reload.enabled.after": "når saldoen når",
"workspace.reload.edit": "Rediger",
"workspace.reload.enable": "Aktiver",
"workspace.reload.enableAutoReload": "Aktiver automatisk genopfyldning",
"workspace.reload.reloadAmount": "Genopfyld $",
"workspace.reload.whenBalanceReaches": "Når saldoen når $",
"workspace.reload.saving": "Gemmer...",
"workspace.reload.save": "Gem",
"workspace.reload.failedAt": "Genopfyldning mislykkedes kl",
"workspace.reload.reason": "Årsag:",
"workspace.reload.updatePaymentMethod": "Opdater din betalingsmetode, og prøv igen.",
"workspace.reload.retrying": "Prøver igen...",
"workspace.reload.retry": "Prøv igen",
"workspace.payments.title": "Betalingshistorik",
"workspace.payments.subtitle": "Seneste betalingstransaktioner.",
"workspace.payments.table.date": "Dato",
"workspace.payments.table.paymentId": "Betalings-ID",
"workspace.payments.table.amount": "Beløb",
"workspace.payments.table.receipt": "Kvittering",
"workspace.payments.type.credit": "kredit",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Indlæser...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dage",
"workspace.black.time.hour": "time",
"workspace.black.time.hours": "timer",
"workspace.black.time.minute": "minut",
"workspace.black.time.minutes": "minutter",
"workspace.black.time.fewSeconds": "et par sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} om måneden.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.rollingUsage": "5-timers brug",
"workspace.black.subscription.weeklyUsage": "Ugentlig brug",
"workspace.black.subscription.resetsIn": "Nulstiller i",
"workspace.black.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
"workspace.black.waitlist.title": "Venteliste",
"workspace.black.waitlist.joined": "Du er på ventelisten for ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.ready": "Vi er klar til at tilmelde dig ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.leave": "Forlad venteliste",
"workspace.black.waitlist.leaving": "Forlader...",
"workspace.black.waitlist.left": "Forladt",
"workspace.black.waitlist.enroll": "Tilmeld",
"workspace.black.waitlist.enrolling": "Tilmelder...",
"workspace.black.waitlist.enrolled": "Tilmeldt",
"workspace.black.waitlist.enrollNote":
"Når du klikker på Tilmeld, starter dit abonnement med det samme, og dit kort vil blive debiteret.",
"download.title": "OpenCode | Download",
"download.meta.description": "Download OpenCode til macOS, Windows og Linux",
"download.hero.title": "Download OpenCode",
"download.hero.subtitle": "Tilgengelig i beta til macOS, Windows og Linux",
"download.hero.subtitle": "Tilgængelig i beta til macOS, Windows og Linux",
"download.hero.button": "Download til {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
@@ -227,7 +501,7 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Ikke nodvendigvis, men sandsynligvis. Du skal bruge et AI-abonnement hvis du vil forbinde OpenCode til en betalt udbyder, men du kan arbejde med",
"Ikke nødvendigvis, men sandsynligvis. Du skal bruge et AI-abonnement hvis du vil forbinde OpenCode til en betalt udbyder, men du kan arbejde med",
"download.faq.a3.localLink": "lokale modeller",
"download.faq.a3.afterLocal.beforeZen": "gratis. Selvom vi opfordrer brugere til at bruge",
"download.faq.a3.afterZen": ", fungerer OpenCode med alle populære udbydere som OpenAI, Anthropic, xAI osv.",
@@ -238,7 +512,7 @@ export const dict = {
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Dine data og oplysninger gemmes kun når du opretter delbare links i OpenCode.",
"download.faq.a6.p2.beforeShare": "Laes mere om",
"download.faq.a6.p2.beforeShare": "Læs mere om",
"download.faq.a6.shareLink": "delingssider",
"enterprise.title": "OpenCode | Enterprise-løsninger til din organisation",
@@ -275,193 +549,46 @@ export const dict = {
"brand.title": "OpenCode | Brand",
"brand.meta.description": "OpenCode brandretningslinjer",
"brand.heading": "Brandretningslinjer",
"brand.subtitle": "Ressourcer og assets, der hjelper dig med at arbejde med OpenCode-brandet.",
"brand.subtitle": "Ressourcer og assets, der hjælper dig med at arbejde med OpenCode-brandet.",
"brand.downloadAll": "Download alle assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "OpenCode versionsnoter og changelog",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nye opdateringer og forbedringer til OpenCode",
"changelog.empty": "Ingen changelog-indlaeg fundet.",
"changelog.empty": "Ingen changelog-indlæg fundet.",
"changelog.viewJson": "Se JSON",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API nøgler",
"workspace.nav.members": "Medlemmer",
"workspace.nav.billing": "Fakturering",
"workspace.nav.settings": "Indstillinger",
"workspace.home.banner.beforeLink": "Pålidelige optimerede modeller til kodningsagenter.",
"workspace.home.billing.loading": "Indlæser...",
"workspace.home.billing.enable": "Aktiver fakturering",
"workspace.home.billing.currentBalance": "Nuværende saldo",
"workspace.newUser.feature.tested.title": "Testede og verificerede modeller",
"workspace.newUser.feature.tested.body":
"Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne.",
"workspace.newUser.feature.quality.title": "Højeste kvalitet",
"workspace.newUser.feature.quality.body":
"Få adgang til modeller konfigureret til optimal ydeevne - ingen nedgraderinger eller routing til billigere udbydere.",
"workspace.newUser.feature.lockin.title": "Ingen indlåsning",
"workspace.newUser.feature.lockin.body":
"Brug Zen med en hvilken som helst kodningsagent, og fortsæt med at bruge andre udbydere med opencode, når du vil.",
"workspace.newUser.copyApiKey": "Kopiér API-nøgle",
"workspace.newUser.copyKey": "Kopier nøgle",
"workspace.newUser.copied": "Kopieret!",
"workspace.newUser.step.enableBilling": "Aktiver fakturering",
"workspace.newUser.step.login.before": "Kør",
"workspace.newUser.step.login.after": "og vælg opencode",
"workspace.newUser.step.pasteKey": "Indsæt din API nøgle",
"workspace.newUser.step.models.before": "Start opencode og kør",
"workspace.newUser.step.models.after": "for at vælge en model",
"workspace.models.title": "Modeller",
"workspace.models.subtitle.beforeLink": "Administrer, hvilke modeller arbejdsområdemedlemmer kan få adgang til.",
"workspace.models.table.model": "Model",
"workspace.models.table.enabled": "Aktiveret",
"workspace.providers.title": "Medbring din egen nøgle",
"workspace.providers.subtitle": "Konfigurer dine egne API nøgler fra AI-udbydere.",
"workspace.providers.placeholder": "Indtast {{provider}} API-nøgle ({{prefix}}...)",
"workspace.providers.configure": "Konfigurer",
"workspace.providers.edit": "Rediger",
"workspace.providers.delete": "Slet",
"workspace.providers.saving": "Gemmer...",
"workspace.providers.save": "Gem",
"workspace.providers.table.provider": "Udbyder",
"workspace.providers.table.apiKey": "API Nøgle",
"workspace.usage.title": "Brugshistorik",
"workspace.usage.subtitle": "Seneste API brug og omkostninger.",
"workspace.usage.empty": "Foretag dit første API-opkald for at komme i gang.",
"workspace.usage.table.date": "Dato",
"workspace.usage.table.model": "Model",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Omkostning",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache læst",
"workspace.usage.breakdown.cacheWrite": "Cache skriv",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Ræsonnement",
"workspace.usage.subscription": "abonnement (${{amount}})",
"workspace.cost.title": "Omkostninger",
"workspace.cost.subtitle": "Brugsomkostninger opdelt efter model.",
"workspace.cost.allModels": "Alle modeller",
"workspace.cost.allKeys": "Alle nøgler",
"workspace.cost.deletedSuffix": "(slettet)",
"workspace.cost.empty": "Ingen brugsdata tilgængelige for den valgte periode.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API nøgler",
"workspace.keys.subtitle": "Administrer dine API nøgler for at få adgang til opencode tjenester.",
"workspace.keys.create": "Opret API nøgle",
"workspace.keys.placeholder": "Indtast nøglenavn",
"workspace.keys.empty": "Opret en opencode Gateway API nøgle",
"workspace.keys.table.name": "Navn",
"workspace.keys.table.key": "Nøgle",
"workspace.keys.table.createdBy": "Skabt af",
"workspace.keys.table.lastUsed": "Sidst brugt",
"workspace.keys.copyApiKey": "Kopiér API-nøgle",
"workspace.keys.delete": "Slet",
"workspace.members.title": "Medlemmer",
"workspace.members.subtitle": "Administrer arbejdsområdemedlemmer og deres tilladelser.",
"workspace.members.invite": "Inviter medlem",
"workspace.members.inviting": "Inviterer...",
"workspace.members.beta.beforeLink": "Arbejdsområder er gratis for teams under betaversionen.",
"workspace.members.form.invitee": "Inviteret",
"workspace.members.form.emailPlaceholder": "Indtast e-mail",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Månedlig forbrugsgrænse",
"workspace.members.noLimit": "Ingen grænse",
"workspace.members.noLimitLowercase": "ingen grænse",
"workspace.members.invited": "inviteret",
"workspace.members.edit": "Rediger",
"workspace.members.delete": "Slet",
"workspace.members.saving": "Gemmer...",
"workspace.members.save": "Gem",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Månedsgrænse",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
"workspace.members.role.member": "Medlem",
"workspace.members.role.memberDescription": "Kan kun generere API nøgler til sig selv",
"workspace.settings.title": "Indstillinger",
"workspace.settings.subtitle": "Opdater dit arbejdsområdes navn og præferencer.",
"workspace.settings.workspaceName": "Arbejdsområdets navn",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Opdaterer...",
"workspace.settings.save": "Gem",
"workspace.settings.edit": "Rediger",
"workspace.billing.title": "Fakturering",
"workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
"workspace.billing.contactUs": "Kontakt os",
"workspace.billing.subtitle.afterLink": "hvis du har spørgsmål.",
"workspace.billing.currentBalance": "Nuværende saldo",
"workspace.billing.add": "Tilføj $",
"workspace.billing.enterAmount": "Indtast beløb",
"workspace.billing.loading": "Indlæser...",
"workspace.billing.addAction": "Tilføj",
"workspace.billing.addBalance": "Tilføj balance",
"workspace.billing.linkedToStripe": "Forbundet til Stripe",
"workspace.billing.manage": "Administrer",
"workspace.billing.enable": "Aktiver fakturering",
"workspace.monthlyLimit.title": "Månedlig grænse",
"workspace.monthlyLimit.subtitle": "Indstil en månedlig forbrugsgrænse for din konto.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Indstiller...",
"workspace.monthlyLimit.set": "Sæt",
"workspace.monthlyLimit.edit": "Rediger grænse",
"workspace.monthlyLimit.noLimit": "Ingen forbrugsgrænse angivet.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Nuværende brug for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
"workspace.reload.title": "Automatisk genopfyldning",
"workspace.reload.disabled.before": "Automatisk genopfyldning er",
"workspace.reload.disabled.state": "deaktiveret",
"workspace.reload.disabled.after": "Aktiver for automatisk at genopfylde, når saldoen er lav.",
"workspace.reload.enabled.before": "Automatisk genopfyldning er",
"workspace.reload.enabled.state": "aktiveret",
"workspace.reload.enabled.middle": "Vi genopfylder",
"workspace.reload.processingFee": "ekspeditionsgebyr",
"workspace.reload.enabled.after": "når balancen er nået",
"workspace.reload.edit": "Rediger",
"workspace.reload.enable": "Aktiver",
"workspace.reload.enableAutoReload": "Aktiver automatisk genopfyldning",
"workspace.reload.reloadAmount": "Genopfyld $",
"workspace.reload.whenBalanceReaches": "Når saldoen når $",
"workspace.reload.saving": "Gemmer...",
"workspace.reload.save": "Gem",
"workspace.reload.failedAt": "Genopfyldning mislykkedes kl",
"workspace.reload.reason": "Årsag:",
"workspace.reload.updatePaymentMethod": "Opdater din betalingsmetode, og prøv igen.",
"workspace.reload.retrying": "Prøver igen...",
"workspace.reload.retry": "Prøv igen",
"workspace.payments.title": "Betalingshistorik",
"workspace.payments.subtitle": "Seneste betalingstransaktioner.",
"workspace.payments.table.date": "Dato",
"workspace.payments.table.paymentId": "Betalings-id",
"workspace.payments.table.amount": "Beløb",
"workspace.payments.table.receipt": "Kvittering",
"workspace.payments.type.credit": "kredit",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Indlæser...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dage",
"workspace.black.time.hour": "time",
"workspace.black.time.hours": "timer",
"workspace.black.time.minute": "minut",
"workspace.black.time.minutes": "minutter",
"workspace.black.time.fewSeconds": "et par sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} om måneden.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.rollingUsage": "5-timers brug",
"workspace.black.subscription.weeklyUsage": "Ugentlig brug",
"workspace.black.subscription.resetsIn": "Nulstiller i",
"workspace.black.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
"workspace.black.waitlist.title": "Venteliste",
"workspace.black.waitlist.joined": "Du er på ventelisten for ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.ready": "Vi er klar til at tilmelde dig ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.leave": "Forlad venteliste",
"workspace.black.waitlist.leaving": "Forlader...",
"workspace.black.waitlist.left": "Forladt",
"workspace.black.waitlist.enroll": "Tilmeld",
"workspace.black.waitlist.enrolling": "Tilmelder...",
"workspace.black.waitlist.enrolled": "Tilmeldt",
"workspace.black.waitlist.enrollNote":
"Når du klikker på Tilmeld, starter dit abonnement med det samme, og dit kort vil blive debiteret.",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Model",
"bench.list.table.score": "Score",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Opgave ikke fundet",
"bench.detail.na": "Ikke tilgængelig",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Model",
"bench.detail.labels.task": "Opgave",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Fra",
"bench.detail.labels.to": "Til",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Gennemsnitlig varighed",
"bench.detail.labels.averageScore": "Gennemsnitlig score",
"bench.detail.labels.averageCost": "Gennemsnitlig omkostning",
"bench.detail.labels.summary": "Resumé",
"bench.detail.labels.runs": "Kørsler",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Basis",
"bench.detail.labels.penalty": "Straf",
"bench.detail.labels.weight": "vægt",
"bench.detail.table.run": "Kørsel",
"bench.detail.table.score": "Score (Basis - Straf)",
"bench.detail.table.cost": "Omkostning",
"bench.detail.table.duration": "Varighed",
"bench.detail.run.title": "Kørsel {{n}}",
"bench.detail.rawJson": "Rå JSON",
} satisfies Dict

View File

@@ -13,12 +13,12 @@ export const dict = {
"nav.login": "Anmelden",
"nav.free": "Kostenlos",
"nav.home": "Startseite",
"nav.openMenu": "Menu offnen",
"nav.openMenu": "Menü öffnen",
"nav.getStartedFree": "Kostenlos starten",
"nav.context.copyLogo": "Logo als SVG kopieren",
"nav.context.copyWordmark": "Wordmarke als SVG kopieren",
"nav.context.brandAssets": "Brand-Assets",
"nav.context.copyWordmark": "Wortmarke als SVG kopieren",
"nav.context.brandAssets": "Marken-Assets",
"footer.github": "GitHub",
"footer.docs": "Dokumentation",
@@ -26,17 +26,17 @@ export const dict = {
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Brand",
"legal.brand": "Marke",
"legal.privacy": "Datenschutz",
"legal.terms": "Bedingungen",
"legal.terms": "AGB",
"email.title": "Erfahre als Erste*r, wenn wir neue Produkte veroffentlichen",
"email.subtitle": "Trage dich fur fruhzeitigen Zugriff in die Warteliste ein.",
"email.title": "Erfahre als Erste:r, wenn wir neue Produkte veröffentlichen",
"email.subtitle": "Trage dich in die Warteliste für frühen Zugang ein.",
"email.placeholder": "E-Mail-Adresse",
"email.subscribe": "Abonnieren",
"email.success": "Fast fertig - prufe deinen Posteingang und bestatige deine E-Mail-Adresse",
"email.subscribe": "Anmelden",
"email.success": "Fast geschafft, überprüfe deinen Posteingang und bestätige deine E-Mail-Adresse",
"notFound.title": "Nicht gefunden | opencode",
"notFound.title": "Nicht gefunden | OpenCode",
"notFound.heading": "404 - Seite nicht gefunden",
"notFound.home": "Startseite",
"notFound.docs": "Dokumentation",
@@ -45,182 +45,454 @@ export const dict = {
"user.logout": "Abmelden",
"workspace.select": "Workspace auswahlen",
"workspace.select": "Workspace auswählen",
"workspace.createNew": "+ Neuen Workspace erstellen",
"workspace.modal.title": "Neuen Workspace erstellen",
"workspace.modal.placeholder": "Workspace-Namen eingeben",
"common.cancel": "Abbrechen",
"common.creating": "Wird erstellt...",
"common.creating": "Erstelle...",
"common.create": "Erstellen",
"common.videoUnsupported": "Dein Browser unterstuetzt das Video-Tag nicht.",
"common.videoUnsupported": "Dein Browser unterstützt das Video-Tag nicht.",
"common.figure": "Abb. {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Mehr erfahren",
"error.invalidPlan": "Ungültiger Plan",
"error.workspaceRequired": "Workspace-ID ist erforderlich",
"error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
"error.limitRequired": "Limit ist erforderlich.",
"error.monthlyLimitInvalid": "Bitte gib ein gültiges monatliches Limit ein.",
"error.workspaceNameRequired": "Workspace-Name ist erforderlich.",
"error.nameTooLong": "Der Name darf höchstens 255 Zeichen lang sein.",
"error.emailRequired": "E-Mail ist erforderlich",
"error.roleRequired": "Rolle ist erforderlich",
"error.idRequired": "ID ist erforderlich",
"error.nameRequired": "Name ist erforderlich",
"error.providerRequired": "Anbieter ist erforderlich",
"error.apiKeyRequired": "API-Key ist erforderlich",
"error.modelRequired": "Modell ist erforderlich",
"error.reloadAmountMin": "Aufladebetrag muss mindestens ${{amount}} betragen",
"error.reloadTriggerMin": "Guthaben-Auslöser muss mindestens ${{amount}} betragen",
"home.title": "OpenCode | Der Open-Source AI-Coding-Agent",
"temp.title": "OpenCode | Für das Terminal gebauter AI-Coding-Agent",
"temp.hero.title": "Der für das Terminal gebaute AI-Coding-Agent",
"temp.zen": "OpenCode Zen",
"temp.getStarted": "Loslegen",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "Eine reaktionsschnelle, native, thematisierbare Terminal-UI",
"temp.feature.zen.beforeLink": "Eine",
"temp.feature.zen.link": "kuratierte Liste von Modellen",
"temp.feature.zen.afterLink": "bereitgestellt von OpenCode",
"temp.feature.models.beforeLink": "Unterstützt 75+ LLM-Anbieter durch",
"temp.feature.models.afterLink": ", einschließlich lokaler Modelle",
"temp.screenshot.caption": "OpenCode TUI mit dem Tokyonight-Theme",
"temp.screenshot.alt": "OpenCode TUI mit Tokyonight-Theme",
"home.banner.badge": "Neu",
"home.banner.text": "Desktop-App als Beta verfugbar",
"home.banner.platforms": "fur macOS, Windows und Linux",
"home.banner.text": "Desktop-App in der Beta verfügbar",
"home.banner.platforms": "auf macOS, Windows und Linux",
"home.banner.downloadNow": "Jetzt herunterladen",
"home.banner.downloadBetaNow": "Desktop-Beta jetzt herunterladen",
"home.hero.title": "Der Open-Source AI-Coding-Agent",
"home.hero.subtitle.a": "Kostenlose Modelle inklusive oder verbinde jedes Modell von jedem Anbieter,",
"home.hero.subtitle.b": "einschliesslich Claude, GPT, Gemini und mehr.",
"home.hero.subtitle.a": "Kostenlose Modelle inklusive oder verbinde jedes Modell eines beliebigen Anbieters,",
"home.hero.subtitle.b": "einschließlich Claude, GPT, Gemini und mehr.",
"home.install.ariaLabel": "Installationsoptionen",
"home.what.title": "Was ist OpenCode?",
"home.what.body":
"OpenCode ist ein Open-Source Agent, der dir hilft, Code im Terminal, in der IDE oder auf dem Desktop zu schreiben.",
"home.what.lsp.title": "LSP aktiviert",
"home.what.lsp.body": "Laedt automatisch die passenden LSPs fur das LLM",
"home.what.multiSession.title": "Mehrere Sessions",
"home.what.multiSession.body": "Starte mehrere Agents parallel im selben Projekt",
"OpenCode ist ein Open-Source-Agent, der dir hilft, Code in deinem Terminal, deiner IDE oder auf dem Desktop zu schreiben.",
"home.what.lsp.title": "LSP-fähig",
"home.what.lsp.body": "Lädt automatisch die richtigen LSPs für das LLM",
"home.what.multiSession.title": "Multi-Session",
"home.what.multiSession.body": "Starte mehrere Agenten parallel im selben Projekt",
"home.what.shareLinks.title": "Links teilen",
"home.what.shareLinks.body": "Teile einen Link zu jeder Session zum Nachschlagen oder Debuggen",
"home.what.shareLinks.body": "Teile einen Link zu jeder Sitzung als Referenz oder zum Debuggen",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Mit GitHub anmelden, um deinen Copilot-Account zu nutzen",
"home.what.copilot.body": "Melde dich mit GitHub an, um deinen Copilot-Account zu nutzen",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Mit OpenAI anmelden, um dein ChatGPT Plus- oder Pro-Konto zu nutzen",
"home.what.chatgptPlus.body": "Melde dich mit OpenAI an, um deinen ChatGPT Plus- oder Pro-Account zu nutzen",
"home.what.anyModel.title": "Jedes Modell",
"home.what.anyModel.body": "75+ LLM-Anbieter uber Models.dev, inklusive lokaler Modelle",
"home.what.anyModel.body": "75+ LLM-Anbieter durch Models.dev, einschließlich lokaler Modelle",
"home.what.anyEditor.title": "Jeder Editor",
"home.what.anyEditor.body": "Verfugbar als Terminal-UI, Desktop-App und IDE-Extension",
"home.what.readDocs": "Docs lesen",
"home.what.anyEditor.body": "Verfügbar als Terminal-Interface, Desktop-App und IDE-Extension",
"home.what.readDocs": "Doku lesen",
"home.growth.title": "Der Open-Source AI-Coding-Agent",
"home.growth.body":
"Mit uber <strong>{{stars}}</strong> GitHub-Stars, <strong>{{contributors}}</strong> Contributors und uber <strong>{{commits}}</strong> Commits wird OpenCode von uber <strong>{{monthlyUsers}}</strong> Entwickler*innen pro Monat genutzt und geschatzt.",
"home.growth.githubStars": "GitHub-Stars",
"Mit über <strong>{{stars}}</strong> GitHub-Stars, <strong>{{contributors}}</strong> Contributors und über <strong>{{commits}}</strong> Commits wird OpenCode von über <strong>{{monthlyUsers}}</strong> Entwickler:innen jeden Monat genutzt und geschätzt.",
"home.growth.githubStars": "GitHub Stars",
"home.growth.contributors": "Contributors",
"home.growth.monthlyDevs": "Monatliche Devs",
"home.privacy.title": "Privacy-first gebaut",
"home.privacy.title": "Built for privacy first",
"home.privacy.body":
"OpenCode speichert weder deinen Code noch Kontextdaten, damit es auch in datenschutzsensiblen Umgebungen eingesetzt werden kann.",
"home.privacy.learnMore": "Mehr erfahren uber",
"OpenCode speichert keinen deiner Codes oder Kontextdaten, sodass es in datenschutzsensiblen Umgebungen arbeiten kann.",
"home.privacy.learnMore": "Erfahre mehr über",
"home.privacy.link": "Datenschutz",
"home.faq.q1": "Was ist OpenCode?",
"home.faq.a1":
"OpenCode ist ein Open-Source Agent, der dir hilft, Code mit jedem AI-Modell zu schreiben und auszufuhren. Es ist als Terminal-Interface, Desktop-App oder IDE-Extension verfugbar.",
"OpenCode ist ein Open-Source-Agent, der dir hilft, Code mit jedem KI-Modell zu schreiben und auszuführen. Er ist als Terminal-Interface, Desktop-App oder IDE-Erweiterung verfügbar.",
"home.faq.q2": "Wie nutze ich OpenCode?",
"home.faq.a2.before": "Der einfachste Einstieg ist, die",
"home.faq.a2.link": "Einfuhrung",
"home.faq.q3": "Brauche ich zusatzliche AI-Abos, um OpenCode zu nutzen?",
"home.faq.a3.p1": "Nicht unbedingt: OpenCode bringt kostenlose Modelle mit, die du ohne Account nutzen kannst.",
"home.faq.a3.p2.beforeZen": "Daruber hinaus kannst du beliebte Coding-Modelle nutzen, indem du einen",
"home.faq.a2.before": "Der einfachste Weg zu starten ist, die",
"home.faq.a2.link": "Einführung zu lesen",
"home.faq.q3": "Brauche ich zusätzliche AI-Abos, um OpenCode zu nutzen?",
"home.faq.a3.p1":
"Nicht unbedingt, OpenCode kommt mit einer Reihe kostenloser Modelle, die du ohne Account nutzen kannst.",
"home.faq.a3.p2.beforeZen": "Abgesehen davon kannst du jedes beliebige Coding-Modell nutzen, indem du einen",
"home.faq.a3.p2.afterZen": " Account erstellst.",
"home.faq.a3.p3":
"Wir empfehlen Zen, aber OpenCode funktioniert auch mit allen gängigen Anbietern wie OpenAI, Anthropic, xAI usw.",
"Während wir dazu raten, Zen zu nutzen, funktioniert OpenCode auch mit allen beliebten Anbietern wie OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "Du kannst sogar deine",
"home.faq.a3.p4.localLink": "lokalen Modelle",
"home.faq.a3.p4.localLink": "lokalen Modelle verbinden",
"home.faq.q4": "Kann ich meine bestehenden AI-Abos mit OpenCode nutzen?",
"home.faq.a4.p1":
"Ja, OpenCode unterstutzt Abos von allen grossen Anbietern. Du kannst Claude Pro/Max, ChatGPT Plus/Pro oder GitHub Copilot verwenden.",
"Ja, OpenCode unterstützt Abos von allen großen Anbietern. Du kannst deine Claude Pro/Max, ChatGPT Plus/Pro oder GitHub Copilot Abos nutzen.",
"home.faq.q5": "Kann ich OpenCode nur im Terminal nutzen?",
"home.faq.a5.beforeDesktop": "Nicht mehr! OpenCode gibt es jetzt auch als App fur",
"home.faq.a5.beforeDesktop": "Nicht mehr! OpenCode ist jetzt als App für",
"home.faq.a5.desktop": "Desktop",
"home.faq.a5.and": "und",
"home.faq.a5.web": "Web",
"home.faq.a5.web": "Web verfügbar",
"home.faq.q6": "Wie viel kostet OpenCode?",
"home.faq.a6":
"OpenCode ist zu 100% kostenlos. Es bringt ausserdem kostenlose Modelle mit. Zusatzliche Kosten konnen entstehen, wenn du einen anderen Anbieter verbindest.",
"home.faq.q7": "Wie sieht es mit Daten und Datenschutz aus?",
"OpenCode ist zu 100% kostenlos. Es enthält auch eine Reihe kostenloser Modelle. Zusätzliche Kosten können entstehen, wenn du andere Anbieter verbindest.",
"home.faq.q7": "Was ist mit Daten und Privatsphäre?",
"home.faq.a7.p1":
"Deine Daten werden nur gespeichert, wenn du unsere kostenlosen Modelle nutzt oder teilbare Links erstellst.",
"home.faq.a7.p2.beforeModels": "Mehr erfahren uber",
"Deine Daten und Informationen werden nur gespeichert, wenn du unsere kostenlosen Modelle nutzt oder teilbare Links erstellst.",
"home.faq.a7.p2.beforeModels": "Erfahre mehr über",
"home.faq.a7.p2.modelsLink": "unsere Modelle",
"home.faq.a7.p2.and": "und",
"home.faq.a7.p2.shareLink": "Share-Seiten",
"home.faq.a7.p2.shareLink": "Share-Pages",
"home.faq.q8": "Ist OpenCode Open Source?",
"home.faq.a8.p1": "Ja, OpenCode ist vollstandig Open Source. Der Quellcode ist offentlich auf",
"home.faq.a8.p1": "Ja, OpenCode ist vollständig Open Source. Der Quellcode ist öffentlich auf",
"home.faq.a8.p2": "unter der",
"home.faq.a8.mitLicense": "MIT-Lizenz",
"home.faq.a8.mitLicense": "MIT Lizenz",
"home.faq.a8.p3":
", d.h. jede*r kann ihn nutzen, andern oder zur Entwicklung beitragen. Aus der Community kann jede*r Issues erstellen, Pull Requests einreichen und Funktionen erweitern.",
", was bedeutet, dass jeder ihn nutzen, modifizieren oder zu seiner Entwicklung beitragen kann. Jeder aus der Community kann Issues melden, Pull Requests einreichen und die Funktionalität erweitern.",
"home.zenCta.title": "Zuverlassige, optimierte Modelle fur Coding-Agents",
"home.zenCta.title": "Zugriff auf zuverlässige, optimierte Modelle für Coding-Agents",
"home.zenCta.body":
"Zen gibt dir Zugriff auf eine handverlesene Auswahl an AI-Modellen, die OpenCode speziell fur Coding-Agents getestet und benchmarked hat. Keine Sorge uber schwankende Leistung und Qualitat zwischen Anbietern: nutze validierte Modelle, die funktionieren.",
"home.zenCta.link": "Mehr uber Zen",
"Zen gibt dir Zugriff auf ein handverlesenes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität bei verschiedenen Anbietern nutze validierte Modelle, die funktionieren.",
"home.zenCta.link": "Erfahre mehr über Zen",
"download.title": "OpenCode | Download",
"zen.title": "OpenCode Zen | Eine kuratierte Auswahl an zuverlassigen, optimierten Modellen fur Coding-Agents",
"zen.hero.title": "Zuverlassige, optimierte Modelle fur Coding-Agents",
"zen.title": "OpenCode Zen | Ein kuratiertes Set zuverlässiger, optimierter Modelle für Coding-Agents",
"zen.hero.title": "Zuverlässige, optimierte Modelle für Coding-Agents",
"zen.hero.body":
"Zen gibt dir Zugriff auf eine handverlesene Auswahl an AI-Modellen, die OpenCode speziell fur Coding-Agents getestet und benchmarked hat. Keine Sorge uber schwankende Leistung und Qualitat zwischen Anbietern: nutze validierte Modelle, die funktionieren.",
"Zen gibt dir Zugriff auf ein kuratiertes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität nutze validierte Modelle, die funktionieren.",
"zen.faq.q1": "Was ist OpenCode Zen?",
"zen.faq.a1":
"Zen ist eine kuratierte Auswahl an AI-Modellen, die vom Team hinter OpenCode fur Coding-Agents getestet und benchmarked wurden.",
"Zen ist ein kuratiertes Set an AI-Modellen, getestet und bewertet für Coding-Agents, erstellt vom Team hinter OpenCode.",
"zen.faq.q2": "Was macht Zen genauer?",
"zen.faq.a2":
"Zen bietet nur Modelle an, die speziell fur Coding-Agents getestet und benchmarked wurden. Du wurdest kein Buttermesser benutzen, um Steak zu schneiden - nutze keine schlechten Modelle zum Coden.",
"zen.faq.q3": "Ist Zen gunstiger?",
"Zen bietet nur Modelle, die speziell für Coding-Agents getestet und bewertet wurden. Du würdest kein Buttermesser nehmen, um ein Steak zu schneiden nutze keine schlechten Modelle zum Coden.",
"zen.faq.q3": "Ist Zen günstiger?",
"zen.faq.a3":
"Zen ist nicht gewinnorientiert. Zen gibt die Kosten der Modellanbieter direkt an dich weiter. Je hoher die Nutzung von Zen, desto mehr kann OpenCode bessere Preise verhandeln und an dich weitergeben.",
"zen.faq.q4": "Was kostet Zen?",
"Zen ist nicht gewinnorientiert. Zen gibt die Kosten der Modellanbieter an dich weiter. Je höher die Nutzung von Zen, desto besser kann OpenCode Preise verhandeln und diese an dich weitergeben.",
"zen.faq.q4": "Wie viel kostet Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "berechnet pro Request",
"zen.faq.a4.p1.afterPricing": "ohne Aufschlage, du zahlst also genau das, was der Modellanbieter berechnet.",
"zen.faq.a4.p1.pricingLink": "berechnet pro Anfrage",
"zen.faq.a4.p1.afterPricing": "ohne Aufschläge, also zahlst du genau das, was der Modellanbieter berechnet.",
"zen.faq.a4.p2.beforeAccount":
"Deine Gesamtkosten hangen von der Nutzung ab, und du kannst monatliche Ausgabenlimits in deinem",
"zen.faq.a4.p2.accountLink": "Account",
"Deine Gesamtkosten hängen von der Nutzung ab, und du kannst monatliche Ausgabenlimits in deinem",
"zen.faq.a4.p2.accountLink": "Account festlegen",
"zen.faq.a4.p3":
"Um Kosten zu decken, erhebt OpenCode nur eine kleine Zahlungsabwicklungsgebuhr von $1.23 pro $20 Guthaben-Aufladung.",
"zen.faq.q5": "Wie sieht es mit Daten und Datenschutz aus?",
"Um die Kosten zu decken, fügt OpenCode nur eine kleine Bearbeitungsgebühr von $1.23 pro $20 Guthabenaufladung hinzu.",
"zen.faq.q5": "Was ist mit Daten und Privatsphäre?",
"zen.faq.a5.beforeExceptions":
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und verwenden deine Daten nicht fur Modelltraining, mit den",
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht zum Trainieren von Modellen, mit den",
"zen.faq.a5.exceptionsLink": "folgenden Ausnahmen",
"zen.faq.q6": "Kann ich Ausgabenlimits festlegen?",
"zen.faq.a6": "Ja, du kannst monatliche Ausgabenlimits in deinem Account festlegen.",
"zen.faq.q7": "Kann ich kundigen?",
"zen.faq.q6": "Kann ich Ausgabenlimits setzen?",
"zen.faq.a6": "Ja, du kannst monatliche Ausgabenlimits in deinem Account setzen.",
"zen.faq.q7": "Kann ich kündigen?",
"zen.faq.a7": "Ja, du kannst die Abrechnung jederzeit deaktivieren und dein verbleibendes Guthaben nutzen.",
"zen.faq.q8": "Kann ich Zen mit anderen Coding-Agents nutzen?",
"zen.faq.a8":
"Zen funktioniert grossartig mit OpenCode, aber du kannst Zen mit jedem Agent verwenden. Folge den Setup-Anweisungen in deinem bevorzugten Coding-Agent.",
"zen.cta.start": "Beginnen Sie mit Zen",
"zen.pricing.title": "Fügen Sie 20 $ Pay-as-you-go-Guthaben hinzu",
"zen.pricing.fee": "(+1,23 $ Kartenbearbeitungsgebühr)",
"zen.pricing.body":
"Zur Verwendung mit jedem beliebigen Agenten. Legen Sie monatliche Ausgabenlimits fest. Jederzeit kündbar.",
"Während Zen großartig mit OpenCode funktioniert, kannst du Zen mit jedem Agent nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agent.",
"zen.cta.start": "Starte mit Zen",
"zen.pricing.title": "Füge $20 Pay-as-you-go Guthaben hinzu",
"zen.pricing.fee": "(+$1.23 Bearbeitungsgebühr)",
"zen.pricing.body": "Nutze es mit jedem Agent. Setze monatliche Ausgabenlimits. Jederzeit kündbar.",
"zen.problem.title": "Welches Problem löst Zen?",
"zen.problem.body":
"Es gibt so viele Modelle, aber nur wenige funktionieren gut mit Codierungsagenten. Die meisten Anbieter konfigurieren sie unterschiedlich und führen zu unterschiedlichen Ergebnissen.",
"zen.problem.subtitle": "Wir beheben dieses Problem für alle, nicht nur für OpenCode-Benutzer.",
"zen.problem.item1": "Testen ausgewählter Modelle und Beratung ihrer Teams",
"zen.problem.item2":
"Arbeiten Sie mit Anbietern zusammen, um sicherzustellen, dass sie ordnungsgemäß geliefert werden",
"zen.problem.item3": "Benchmarking aller von uns empfohlenen Modell-Anbieter-Kombinationen",
"zen.how.title": "So funktioniert Zen",
"zen.how.body":
"Während wir Ihnen empfehlen, Zen mit OpenCode zu verwenden, können Sie Zen mit jedem Agenten verwenden.",
"zen.how.step1.title": "Melden Sie sich an und fügen Sie ein Guthaben von 20 $ hinzu",
"zen.how.step1.beforeLink": "Folgen Sie dem",
"zen.how.step1.link": "Installationsanweisungen",
"zen.how.step2.title": "Nutzen Sie Zen mit transparenter Preisgestaltung",
"zen.how.step2.link": "Bezahlung pro Anfrage",
"Es gibt so viele Modelle, aber nur wenige funktionieren gut mit Coding-Agents. Die meisten Anbieter konfigurieren sie unterschiedlich, was zu variierenden Ergebnissen führt.",
"zen.problem.subtitle": "Wir beheben das für alle, nicht nur für OpenCode-Nutzer.",
"zen.problem.item1": "Testen ausgewählter Modelle und Beratung mit deren Teams",
"zen.problem.item2": "Zusammenarbeit mit Anbietern, um korrekte Bereitstellung zu sichern",
"zen.problem.item3": "Benchmarking aller Modell-Anbieter-Kombinationen, die wir empfehlen",
"zen.how.title": "Wie Zen funktioniert",
"zen.how.body": "Während wir dir raten, Zen mit OpenCode zu nutzen, kannst du Zen mit jedem Agent nutzen.",
"zen.how.step1.title": "Melde dich an und füge $20 Guthaben hinzu",
"zen.how.step1.beforeLink": "folge den",
"zen.how.step1.link": "Einrichtungsanweisungen",
"zen.how.step2.title": "Nutze Zen mit transparenter Preisgestaltung",
"zen.how.step2.link": "zahle pro Anfrage",
"zen.how.step2.afterLink": "ohne Aufschläge",
"zen.how.step3.title": "Automatisches Aufladen",
"zen.how.step3.body": "Wenn Ihr Guthaben 5 $ erreicht, fügen wir automatisch 20 $ hinzu",
"zen.privacy.title": "Ihre Privatsphäre ist uns wichtig",
"zen.how.step3.title": "Auto-Top-up",
"zen.how.step3.body": "wenn dein Guthaben $5 erreicht, fügen wir automatisch $20 hinzu",
"zen.privacy.title": "Deine Privatsphäre ist uns wichtig",
"zen.privacy.beforeExceptions":
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Null-Aufbewahrungsrichtlinie und verwenden Ihre Daten nicht für Modellschulungen",
"zen.privacy.exceptionsLink": "folgende Ausnahmen",
"download.meta.description": "Lade OpenCode fur macOS, Windows und Linux herunter",
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht für Modelltraining, mit den",
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
"black.meta.title": "OpenCode Black | Zugriff auf die weltweit besten Coding-Modelle",
"black.meta.description": "Erhalte Zugriff auf Claude, GPT, Gemini und mehr mit OpenCode Black Abos.",
"black.hero.title": "Zugriff auf die weltweit besten Coding-Modelle",
"black.hero.subtitle": "Einschließlich Claude, GPT, Gemini und mehr",
"black.title": "OpenCode Black | Preise",
"black.plan.icon20": "Black 20 Plan",
"black.plan.icon100": "Black 100 Plan",
"black.plan.icon200": "Black 200 Plan",
"black.plan.multiplier100": "5x mehr Nutzung als Black 20",
"black.plan.multiplier200": "20x mehr Nutzung als Black 20",
"black.price.perMonth": "pro Monat",
"black.price.perPersonBilledMonthly": "pro Person, monatlich abgerechnet",
"black.terms.1": "Dein Abonnement startet nicht sofort",
"black.terms.2": "Du wirst auf die Warteliste gesetzt und bald freigeschaltet",
"black.terms.3": "Deine Karte wird erst belastet, wenn dein Abonnement aktiviert ist",
"black.terms.4": "Nutzungslimits gelten, stark automatisierte Nutzung kann Limits schneller erreichen",
"black.terms.5": "Abonnements sind für Einzelpersonen, kontaktiere Enterprise für Teams",
"black.terms.6": "Limits können angepasst werden und Pläne können in Zukunft eingestellt werden",
"black.terms.7": "Kündige dein Abonnement jederzeit",
"black.action.continue": "Weiter",
"black.finePrint.beforeTerms": "Angezeigte Preise enthalten keine anfallenden Steuern",
"black.finePrint.terms": "Nutzungsbedingungen",
"black.workspace.title": "OpenCode Black | Workspace wählen",
"black.workspace.selectPlan": "Wähle einen Workspace für diesen Plan",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "OpenCode Black abonnieren",
"black.subscribe.paymentMethod": "Zahlungsmethode",
"black.subscribe.loadingPaymentForm": "Lade Zahlungsformular...",
"black.subscribe.selectWorkspaceToContinue": "Wähle einen Workspace um fortzufahren",
"black.subscribe.failurePrefix": "Oh nein!",
"black.subscribe.error.generic": "Ein Fehler ist aufgetreten",
"black.subscribe.error.invalidPlan": "Ungültiger Plan",
"black.subscribe.error.workspaceRequired": "Workspace-ID ist erforderlich",
"black.subscribe.error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
"black.subscribe.processing": "Verarbeitung...",
"black.subscribe.submit": "Abonnieren ${{plan}}",
"black.subscribe.form.chargeNotice": "Du wirst erst belastet, wenn dein Abonnement aktiviert ist",
"black.subscribe.success.title": "Du bist auf der OpenCode Black Warteliste",
"black.subscribe.success.subscriptionPlan": "Abo-Plan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Betrag",
"black.subscribe.success.amountValue": "${{plan}} pro Monat",
"black.subscribe.success.paymentMethod": "Zahlungsmethode",
"black.subscribe.success.dateJoined": "Beitrittsdatum",
"black.subscribe.success.chargeNotice": "Deine Karte wird belastet, sobald dein Abonnement aktiviert ist",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API Keys",
"workspace.nav.members": "Mitglieder",
"workspace.nav.billing": "Abrechnung",
"workspace.nav.settings": "Einstellungen",
"workspace.home.banner.beforeLink": "Zuverlässige, optimierte Modelle für Coding-Agents.",
"workspace.home.billing.loading": "Laden...",
"workspace.home.billing.enable": "Abrechnung aktivieren",
"workspace.home.billing.currentBalance": "Aktuelles Guthaben",
"workspace.newUser.feature.tested.title": "Getestete & Verifizierte Modelle",
"workspace.newUser.feature.tested.body":
"Wir haben Modelle speziell für Coding-Agents getestet und bewertet, um beste Leistung zu garantieren.",
"workspace.newUser.feature.quality.title": "Höchste Qualität",
"workspace.newUser.feature.quality.body":
"Zugriff auf Modelle, die für optimale Leistung konfiguriert sind keine Downgrades oder Routing zu billigeren Anbietern.",
"workspace.newUser.feature.lockin.title": "Kein Lock-in",
"workspace.newUser.feature.lockin.body":
"Nutze Zen mit jedem Coding-Agent und nutze weiterhin andere Anbieter mit OpenCode, wann immer du willst.",
"workspace.newUser.copyApiKey": "API Key kopieren",
"workspace.newUser.copyKey": "Key kopieren",
"workspace.newUser.copied": "Kopiert!",
"workspace.newUser.step.enableBilling": "Abrechnung aktivieren",
"workspace.newUser.step.login.before": "Führe",
"workspace.newUser.step.login.after": "aus und wähle OpenCode",
"workspace.newUser.step.pasteKey": "Füge deinen API Key ein",
"workspace.newUser.step.models.before": "Starte OpenCode und führe",
"workspace.newUser.step.models.after": "aus, um ein Modell zu wählen",
"workspace.models.title": "Modelle",
"workspace.models.subtitle.beforeLink": "Verwalte, auf welche Modelle Workspace-Mitglieder zugreifen können.",
"workspace.models.table.model": "Modell",
"workspace.models.table.enabled": "Aktiviert",
"workspace.providers.title": "Bring Your Own Key",
"workspace.providers.subtitle": "Konfiguriere deine eigenen API Keys von AI-Anbietern.",
"workspace.providers.placeholder": "Gib {{provider}} API Key ein ({{prefix}}...)",
"workspace.providers.configure": "Konfigurieren",
"workspace.providers.edit": "Bearbeiten",
"workspace.providers.delete": "Löschen",
"workspace.providers.saving": "Speichere...",
"workspace.providers.save": "Speichern",
"workspace.providers.table.provider": "Anbieter",
"workspace.providers.table.apiKey": "API Key",
"workspace.usage.title": "Nutzungsverlauf",
"workspace.usage.subtitle": "Kürzliche API-Nutzung und Kosten.",
"workspace.usage.empty": "Mache deinen ersten API-Aufruf, um loszulegen.",
"workspace.usage.table.date": "Datum",
"workspace.usage.table.model": "Modell",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Kosten",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache Read",
"workspace.usage.breakdown.cacheWrite": "Cache Write",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Reasoning",
"workspace.usage.subscription": "Abonnement (${{amount}})",
"workspace.cost.title": "Kosten",
"workspace.cost.subtitle": "Nutzungskosten aufgeschlüsselt nach Modell.",
"workspace.cost.allModels": "Alle Modelle",
"workspace.cost.allKeys": "Alle Keys",
"workspace.cost.deletedSuffix": "(gelöscht)",
"workspace.cost.empty": "Keine Nutzungsdaten für den gewählten Zeitraum verfügbar.",
"workspace.cost.subscriptionShort": "Abo",
"workspace.keys.title": "API Keys",
"workspace.keys.subtitle": "Verwalte deine API Keys für den Zugriff auf OpenCode-Dienste.",
"workspace.keys.create": "API Key erstellen",
"workspace.keys.placeholder": "Key-Namen eingeben",
"workspace.keys.empty": "Erstelle einen OpenCode Gateway API Key",
"workspace.keys.table.name": "Name",
"workspace.keys.table.key": "Key",
"workspace.keys.table.createdBy": "Erstellt von",
"workspace.keys.table.lastUsed": "Zuletzt genutzt",
"workspace.keys.copyApiKey": "API Key kopieren",
"workspace.keys.delete": "Löschen",
"workspace.members.title": "Mitglieder",
"workspace.members.subtitle": "Verwalte Workspace-Mitglieder und deren Berechtigungen.",
"workspace.members.invite": "Mitglied einladen",
"workspace.members.inviting": "Lade ein...",
"workspace.members.beta.beforeLink": "Workspaces sind für Teams während der Beta kostenlos.",
"workspace.members.form.invitee": "Eingeladene Person",
"workspace.members.form.emailPlaceholder": "E-Mail eingeben",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Monatliches Ausgabenlimit",
"workspace.members.noLimit": "Kein Limit",
"workspace.members.noLimitLowercase": "kein Limit",
"workspace.members.invited": "eingeladen",
"workspace.members.edit": "Bearbeiten",
"workspace.members.delete": "Löschen",
"workspace.members.saving": "Speichere...",
"workspace.members.save": "Speichern",
"workspace.members.table.email": "E-Mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Monatslimit",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kann Modelle, Mitglieder und Abrechnung verwalten",
"workspace.members.role.member": "Mitglied",
"workspace.members.role.memberDescription": "Kann nur API Keys für sich selbst generieren",
"workspace.settings.title": "Einstellungen",
"workspace.settings.subtitle": "Aktualisiere deinen Workspace-Namen und Präferenzen.",
"workspace.settings.workspaceName": "Workspace-Name",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Aktualisiere...",
"workspace.settings.save": "Speichern",
"workspace.settings.edit": "Bearbeiten",
"workspace.billing.title": "Abrechnung",
"workspace.billing.subtitle.beforeLink": "Zahlungsmethoden verwalten.",
"workspace.billing.contactUs": "Kontaktiere uns",
"workspace.billing.subtitle.afterLink": "wenn du Fragen hast.",
"workspace.billing.currentBalance": "Aktuelles Guthaben",
"workspace.billing.add": "$ hinzufügen",
"workspace.billing.enterAmount": "Betrag eingeben",
"workspace.billing.loading": "Lade...",
"workspace.billing.addAction": "Hinzufügen",
"workspace.billing.addBalance": "Guthaben aufladen",
"workspace.billing.linkedToStripe": "Mit Stripe verbunden",
"workspace.billing.manage": "Verwalten",
"workspace.billing.enable": "Abrechnung aktivieren",
"workspace.monthlyLimit.title": "Monatliches Limit",
"workspace.monthlyLimit.subtitle": "Setze ein monatliches Nutzungslimit für deinen Account.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Setze...",
"workspace.monthlyLimit.set": "Setzen",
"workspace.monthlyLimit.edit": "Limit bearbeiten",
"workspace.monthlyLimit.noLimit": "Kein Nutzungslimit gesetzt.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Aktuelle Nutzung für",
"workspace.monthlyLimit.currentUsage.beforeAmount": "ist $",
"workspace.reload.title": "Auto-Reload",
"workspace.reload.disabled.before": "Auto-Reload ist",
"workspace.reload.disabled.state": "deaktiviert",
"workspace.reload.disabled.after": "Aktivieren, um automatisch aufzuladen, wenn das Guthaben niedrig ist.",
"workspace.reload.enabled.before": "Auto-Reload ist",
"workspace.reload.enabled.state": "aktiviert",
"workspace.reload.enabled.middle": "Wir laden auf",
"workspace.reload.processingFee": "Bearbeitungsgebühr",
"workspace.reload.enabled.after": "wenn das Guthaben erreicht:",
"workspace.reload.edit": "Bearbeiten",
"workspace.reload.enable": "Aktivieren",
"workspace.reload.enableAutoReload": "Auto-Reload aktivieren",
"workspace.reload.reloadAmount": "Aufladebetrag $",
"workspace.reload.whenBalanceReaches": "Wenn Guthaben $ erreicht",
"workspace.reload.saving": "Speichere...",
"workspace.reload.save": "Speichern",
"workspace.reload.failedAt": "Aufladung fehlgeschlagen am",
"workspace.reload.reason": "Grund:",
"workspace.reload.updatePaymentMethod": "Bitte aktualisiere deine Zahlungsmethode und versuche es erneut.",
"workspace.reload.retrying": "Versuche erneut...",
"workspace.reload.retry": "Erneut versuchen",
"workspace.payments.title": "Zahlungshistorie",
"workspace.payments.subtitle": "Kürzliche Zahlungstransaktionen.",
"workspace.payments.table.date": "Datum",
"workspace.payments.table.paymentId": "Zahlungs-ID",
"workspace.payments.table.amount": "Betrag",
"workspace.payments.table.receipt": "Beleg",
"workspace.payments.type.credit": "Guthaben",
"workspace.payments.type.subscription": "Abonnement",
"workspace.payments.view": "Ansehen",
"workspace.black.loading": "Lade...",
"workspace.black.time.day": "Tag",
"workspace.black.time.days": "Tage",
"workspace.black.time.hour": "Stunde",
"workspace.black.time.hours": "Stunden",
"workspace.black.time.minute": "Minute",
"workspace.black.time.minutes": "Minuten",
"workspace.black.time.fewSeconds": "einige Sekunden",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du hast OpenCode Black für ${{plan}} pro Monat abonniert.",
"workspace.black.subscription.manage": "Abo verwalten",
"workspace.black.subscription.rollingUsage": "5-Stunden-Nutzung",
"workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung",
"workspace.black.subscription.resetsIn": "Setzt zurück in",
"workspace.black.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Limits erreicht sind",
"workspace.black.waitlist.title": "Warteliste",
"workspace.black.waitlist.joined": "Du bist auf der Warteliste für den ${{plan}} pro Monat OpenCode Black Plan.",
"workspace.black.waitlist.ready": "Wir sind bereit, dich in den ${{plan}} pro Monat OpenCode Black Plan aufzunehmen.",
"workspace.black.waitlist.leave": "Warteliste verlassen",
"workspace.black.waitlist.leaving": "Verlasse...",
"workspace.black.waitlist.left": "Verlassen",
"workspace.black.waitlist.enroll": "Einschreiben",
"workspace.black.waitlist.enrolling": "Schreibe ein...",
"workspace.black.waitlist.enrolled": "Eingeschrieben",
"workspace.black.waitlist.enrollNote":
"Wenn du auf Einschreiben klickst, startet dein Abo sofort und deine Karte wird belastet.",
"download.title": "OpenCode | Download",
"download.meta.description": "Lade OpenCode für macOS, Windows und Linux herunter",
"download.hero.title": "OpenCode herunterladen",
"download.hero.subtitle": "Als Beta verfugbar fur macOS, Windows und Linux",
"download.hero.button": "Download fur {{os}}",
"download.hero.subtitle": "In Beta verfügbar für macOS, Windows und Linux",
"download.hero.button": "Download für {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrations",
"download.section.integrations": "OpenCode Integrationen",
"download.action.download": "Download",
"download.action.install": "Installieren",
@@ -231,247 +503,96 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Nicht unbedingt, aber wahrscheinlich. Du brauchst ein AI-Abo, wenn du OpenCode mit einem kostenpflichtigen Anbieter verbinden willst, obwohl du mit",
"Nicht unbedingt, aber wahrscheinlich. Du brauchst ein AI-Abo, wenn du OpenCode mit einem bezahlten Anbieter verbinden willst, obwohl du mit",
"download.faq.a3.localLink": "lokalen Modellen",
"download.faq.a3.afterLocal.beforeZen": "kostenlos arbeiten kannst. Obwohl wir Nutzer ermutigen,",
"download.faq.a3.afterLocal.beforeZen": "kostenlos arbeiten kannst. Während wir Nutzern raten,",
"download.faq.a3.afterZen":
" zu verwenden, funktioniert OpenCode mit allen popularen Anbietern wie OpenAI, Anthropic, xAI usw.",
" zu nutzen, funktioniert OpenCode mit allen populären Anbietern wie OpenAI, Anthropic, xAI etc.",
"download.faq.a5.p1": "OpenCode ist zu 100% kostenlos.",
"download.faq.a5.p1": "OpenCode ist 100% kostenlos.",
"download.faq.a5.p2.beforeZen":
"Zusatzliche Kosten entstehen durch dein Abo bei einem Modellanbieter. OpenCode funktioniert mit jedem Modellanbieter, aber wir empfehlen",
"Zusätzliche Kosten entstehen durch dein Abo bei einem Modellanbieter. Während OpenCode mit jedem Modellanbieter funktioniert, empfehlen wir",
"download.faq.a5.p2.afterZen": " zu nutzen.",
"download.faq.a6.p1": "Deine Daten werden nur gespeichert, wenn du in OpenCode teilbare Links erstellst.",
"download.faq.a6.p2.beforeShare": "Mehr erfahren uber",
"download.faq.a6.shareLink": "Share-Seiten",
"download.faq.a6.p1":
"Deine Daten und Informationen werden nur gespeichert, wenn du teilbare Links in OpenCode erstellst.",
"download.faq.a6.p2.beforeShare": "Erfahre mehr über",
"download.faq.a6.shareLink": "Share-Pages",
"enterprise.title": "OpenCode | Enterprise-Losungen fur Ihre Organisation",
"enterprise.meta.description": "Kontaktieren Sie OpenCode fur Enterprise-Losungen",
"enterprise.hero.title": "Ihr Code gehort Ihnen",
"enterprise.title": "OpenCode | Enterprise-Lösungen für Ihre Organisation",
"enterprise.meta.description": "Kontaktieren Sie OpenCode für Enterprise-Lösungen",
"enterprise.hero.title": "Ihr Code gehört Ihnen",
"enterprise.hero.body1":
"OpenCode arbeitet sicher innerhalb Ihrer Organisation, ohne dass Daten oder Kontext gespeichert werden, und ohne Lizenzbeschrankungen oder Eigentumsanspruche. Starten Sie einen Testlauf mit Ihrem Team und rollen Sie es anschliessend in der gesamten Organisation aus, indem Sie es in Ihr SSO und Ihr internes AI-Gateway integrieren.",
"enterprise.hero.body2": "Sagen Sie uns, wie wir helfen konnen.",
"enterprise.form.name.label": "Vollstandiger Name",
"OpenCode arbeitet sicher innerhalb Ihrer Organisation, ohne dass Daten oder Kontext gespeichert werden und ohne Lizenzbeschränkungen oder Eigentumsansprüche. Starten Sie einen Testlauf mit Ihrem Team, dann rollen Sie es in Ihrer Organisation aus, indem Sie es in Ihr SSO und internes AI-Gateway integrieren.",
"enterprise.hero.body2": "Lassen Sie uns wissen, wie wir helfen können.",
"enterprise.form.name.label": "Vollständiger Name",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Rolle",
"enterprise.form.role.placeholder": "Executive Chairman",
"enterprise.form.email.label": "Firmen-E-Mail",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Welches Problem mochten Sie losen?",
"enterprise.form.message.label": "Welches Problem versuchen Sie zu lösen?",
"enterprise.form.message.placeholder": "Wir brauchen Hilfe bei...",
"enterprise.form.send": "Senden",
"enterprise.form.sending": "Wird gesendet...",
"enterprise.form.sending": "Sende...",
"enterprise.form.success": "Nachricht gesendet, wir melden uns bald.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Was ist OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise richtet sich an Organisationen, die sicherstellen wollen, dass Code und Daten ihre Infrastruktur niemals verlassen. Das wird durch eine zentralisierte Konfiguration erreicht, die sich in Ihr SSO und Ihr internes AI-Gateway integrieren lasst.",
"OpenCode Enterprise ist für Organisationen, die sicherstellen wollen, dass Code und Daten niemals ihre Infrastruktur verlassen. Dies geschieht durch eine zentrale Konfiguration, die in Ihr SSO und internes AI-Gateway integriert wird.",
"enterprise.faq.q2": "Wie starte ich mit OpenCode Enterprise?",
"enterprise.faq.a2":
"Starten Sie einfach mit einem internen Testlauf mit Ihrem Team. OpenCode speichert standardmassig weder Code noch Kontextdaten, sodass der Einstieg leicht ist. Kontaktieren Sie uns anschliessend, um Preise und Implementierungsoptionen zu besprechen.",
"enterprise.faq.q3": "Wie funktioniert die Enterprise-Preisgestaltung?",
"Starten Sie einfach mit einem internen Testlauf mit Ihrem Team. OpenCode speichert standardmäßig weder Code noch Kontextdaten, was den Einstieg erleichtert. Kontaktieren Sie uns dann, um Preise und Implementierungsoptionen zu besprechen.",
"enterprise.faq.q3": "Wie funktioniert das Enterprise-Pricing?",
"enterprise.faq.a3":
"Wir bieten Enterprise-Preise pro Sitz an. Wenn Sie ein eigenes LLM-Gateway haben, berechnen wir keine Kosten fur verwendete Token. Fur weitere Details kontaktieren Sie uns bitte fur ein individuelles Angebot basierend auf den Anforderungen Ihrer Organisation.",
"Wir bieten eine Preisgestaltung pro Arbeitsplatz (Seat) an. Wenn Sie Ihr eigenes LLM-Gateway haben, berechnen wir keine Gebühren für genutzte Token. Für weitere Details kontaktieren Sie uns r ein individuelles Angebot basierend auf den Anforderungen Ihrer Organisation.",
"enterprise.faq.q4": "Sind meine Daten mit OpenCode Enterprise sicher?",
"enterprise.faq.a4":
"Ja. OpenCode speichert weder Code noch Kontextdaten. Die Verarbeitung erfolgt lokal oder uber direkte API-Aufrufe an Ihren AI-Anbieter. Mit zentraler Konfiguration und SSO-Integration bleiben Ihre Daten sicher innerhalb Ihrer Infrastruktur.",
"Ja. OpenCode speichert weder Ihren Code noch Kontextdaten. Alle Verarbeitungen finden lokal oder über direkte API-Aufrufe an Ihren AI-Anbieter statt. Mit zentraler Konfiguration und SSO-Integration bleiben Ihre Daten sicher innerhalb der Infrastruktur Ihrer Organisation.",
"brand.title": "OpenCode | Marke",
"brand.meta.description": "OpenCode Markenrichtlinien",
"brand.heading": "Markenrichtlinien",
"brand.subtitle": "Ressourcen und Assets, die dir helfen, mit der OpenCode-Marke zu arbeiten.",
"brand.downloadAll": "Alle Assets herunterladen",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "OpenCode Release Notes und Changelog",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Neue Updates und Verbesserungen fur OpenCode",
"changelog.empty": "Keine Changelog-Eintrage gefunden.",
"changelog.hero.subtitle": "Neue Updates und Verbesserungen für OpenCode",
"changelog.empty": "Keine Changelog-Einträge gefunden.",
"changelog.viewJson": "JSON ansehen",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API-Schlüssel",
"workspace.nav.members": "Mitglieder",
"workspace.nav.billing": "Abrechnung",
"workspace.nav.settings": "Einstellungen",
"workspace.home.banner.beforeLink": "Zuverlässige optimierte Modelle für Codierungsagenten.",
"workspace.home.billing.loading": "Laden...",
"workspace.home.billing.enable": "Abrechnung aktivieren",
"workspace.home.billing.currentBalance": "Aktueller Kontostand",
"workspace.newUser.feature.tested.title": "Getestete und verifizierte Modelle",
"workspace.newUser.feature.tested.body":
"Wir haben Modelle speziell für Codierungsagenten einem Benchmarking unterzogen und getestet, um die beste Leistung sicherzustellen.",
"workspace.newUser.feature.quality.title": "Höchste Qualität",
"workspace.newUser.feature.quality.body":
"Für optimale Performance konfigurierte Zugangsmodelle keine Downgrades oder Weiterleitung zu günstigeren Anbietern.",
"workspace.newUser.feature.lockin.title": "Kein Lock-in",
"workspace.newUser.feature.lockin.body":
"Verwenden Sie Zen mit einem beliebigen Codierungsagenten und nutzen Sie weiterhin andere Anbieter mit opencode, wann immer Sie möchten.",
"workspace.newUser.copyApiKey": "API-Schlüssel kopieren",
"workspace.newUser.copyKey": "Schlüssel kopieren",
"workspace.newUser.copied": "Kopiert!",
"workspace.newUser.step.enableBilling": "Abrechnung aktivieren",
"workspace.newUser.step.login.before": "Führe",
"workspace.newUser.step.login.after": "und wählen Sie opencode",
"workspace.newUser.step.pasteKey": "Fügen Sie Ihren API-Schlüssel ein",
"workspace.newUser.step.models.before": "Starte opencode und führe",
"workspace.newUser.step.models.after": "um ein Modell auszuwählen",
"workspace.models.title": "Modelle",
"workspace.models.subtitle.beforeLink":
"Verwalten Sie, auf welche Modelle Arbeitsbereichsmitglieder zugreifen können.",
"workspace.models.table.model": "Modell",
"workspace.models.table.enabled": "Aktiviert",
"workspace.providers.title": "Bringen Sie Ihren eigenen Schlüssel mit",
"workspace.providers.subtitle": "Konfigurieren Sie Ihre eigenen API-Schlüssel von KI-Anbietern.",
"workspace.providers.placeholder": "Geben Sie den Schlüssel {{provider}} API ein ({{prefix}}...)",
"workspace.providers.configure": "Konfigurieren",
"workspace.providers.edit": "Bearbeiten",
"workspace.providers.delete": "Löschen",
"workspace.providers.saving": "Wird gespeichert...",
"workspace.providers.save": "Speichern",
"workspace.providers.table.provider": "Anbieter",
"workspace.providers.table.apiKey": "API-Schlüssel",
"workspace.usage.title": "Nutzungsverlauf",
"workspace.usage.subtitle": "Aktuelle API-Nutzung und Kosten.",
"workspace.usage.empty": "Machen Sie Ihren ersten API-Aufruf, um loszulegen.",
"workspace.usage.table.date": "Datum",
"workspace.usage.table.model": "Modell",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Kosten",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache-Lesen",
"workspace.usage.breakdown.cacheWrite": "Cache-Schreiben",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Reasoning",
"workspace.usage.subscription": "Abonnement (${{amount}})",
"workspace.cost.title": "Kosten",
"workspace.cost.subtitle": "Nutzungskosten aufgeschlüsselt nach Modell.",
"workspace.cost.allModels": "Alle Modelle",
"workspace.cost.allKeys": "Alle Schlüssel",
"workspace.cost.deletedSuffix": "(gelöscht)",
"workspace.cost.empty": "Für den ausgewählten Zeitraum sind keine Nutzungsdaten verfügbar.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API-Schlüssel",
"workspace.keys.subtitle": "Verwalten Sie Ihre API-Schlüssel für den Zugriff auf opencode-Dienste.",
"workspace.keys.create": "Erstellen Sie einen API-Schlüssel",
"workspace.keys.placeholder": "Geben Sie den Schlüsselnamen ein",
"workspace.keys.empty": "Erstellen Sie einen opencode Gateway-API-Schlüssel",
"workspace.keys.table.name": "Name",
"workspace.keys.table.key": "Schlüssel",
"workspace.keys.table.createdBy": "Erstellt von",
"workspace.keys.table.lastUsed": "Zuletzt verwendet",
"workspace.keys.copyApiKey": "API-Schlüssel kopieren",
"workspace.keys.delete": "Löschen",
"workspace.members.title": "Mitglieder",
"workspace.members.subtitle": "Verwalten Sie Arbeitsbereichsmitglieder und ihre Berechtigungen.",
"workspace.members.invite": "Mitglied einladen",
"workspace.members.inviting": "Wird eingeladen...",
"workspace.members.beta.beforeLink": "Während der Betaversion sind Arbeitsbereiche für Teams kostenlos.",
"workspace.members.form.invitee": "Eingeladen",
"workspace.members.form.emailPlaceholder": "Geben Sie Ihre E-Mail-Adresse ein",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Monatliches Ausgabenlimit",
"workspace.members.noLimit": "Keine Begrenzung",
"workspace.members.noLimitLowercase": "keine Begrenzung",
"workspace.members.invited": "eingeladen",
"workspace.members.edit": "Bearbeiten",
"workspace.members.delete": "Löschen",
"workspace.members.saving": "Wird gespeichert...",
"workspace.members.save": "Speichern",
"workspace.members.table.email": "E-Mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Monatslimit",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kann Modelle, Mitglieder und Abrechnungen verwalten",
"workspace.members.role.member": "Mitglied",
"workspace.members.role.memberDescription": "Kann nur API-Schlüssel für sich selbst generieren",
"workspace.settings.title": "Einstellungen",
"workspace.settings.subtitle": "Aktualisieren Sie den Namen und die Einstellungen Ihres Arbeitsbereichs.",
"workspace.settings.workspaceName": "Name des Arbeitsbereichs",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Aktualisierung...",
"workspace.settings.save": "Speichern",
"workspace.settings.edit": "Bearbeiten",
"workspace.billing.title": "Abrechnung",
"workspace.billing.subtitle.beforeLink": "Zahlungsmethoden verwalten.",
"workspace.billing.contactUs": "Kontaktieren Sie uns",
"workspace.billing.subtitle.afterLink": "wenn Sie Fragen haben.",
"workspace.billing.currentBalance": "Aktueller Kontostand",
"workspace.billing.add": "$ hinzufügen",
"workspace.billing.enterAmount": "Betrag eingeben",
"workspace.billing.loading": "Laden...",
"workspace.billing.addAction": "Hinzufügen",
"workspace.billing.addBalance": "Guthaben hinzufügen",
"workspace.billing.linkedToStripe": "Mit Stripe verknüpft",
"workspace.billing.manage": "Verwalten",
"workspace.billing.enable": "Abrechnung aktivieren",
"workspace.monthlyLimit.title": "Monatliches Limit",
"workspace.monthlyLimit.subtitle": "Legen Sie ein monatliches Nutzungslimit für Ihr Konto fest.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Wird gesetzt...",
"workspace.monthlyLimit.set": "Festlegen",
"workspace.monthlyLimit.edit": "Limit bearbeiten",
"workspace.monthlyLimit.noLimit": "Kein Nutzungslimit festgelegt.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Aktuelle Nutzung für",
"workspace.monthlyLimit.currentUsage.beforeAmount": "ist $",
"workspace.reload.title": "Automatische Aufladung",
"workspace.reload.disabled.before": "Automatische Aufladung ist",
"workspace.reload.disabled.state": "deaktiviert",
"workspace.reload.disabled.after":
"Aktivieren Sie diese Option, damit bei niedrigem Kontostand automatisch aufgeladen wird.",
"workspace.reload.enabled.before": "Automatische Aufladung ist",
"workspace.reload.enabled.state": "aktiviert",
"workspace.reload.enabled.middle": "Wir laden auf",
"workspace.reload.processingFee": "Bearbeitungsgebühr",
"workspace.reload.enabled.after": "sobald der Kontostand",
"workspace.reload.edit": "Bearbeiten",
"workspace.reload.enable": "Aktivieren",
"workspace.reload.enableAutoReload": "Automatische Aufladung aktivieren",
"workspace.reload.reloadAmount": "Aufladebetrag $",
"workspace.reload.whenBalanceReaches": "Wenn der Kontostand $ erreicht",
"workspace.reload.saving": "Wird gespeichert...",
"workspace.reload.save": "Speichern",
"workspace.reload.failedAt": "Aufladung fehlgeschlagen am",
"workspace.reload.reason": "Grund:",
"workspace.reload.updatePaymentMethod": "Bitte aktualisieren Sie Ihre Zahlungsmethode und versuchen Sie es erneut.",
"workspace.reload.retrying": "Erneuter Versuch...",
"workspace.reload.retry": "Wiederholen",
"workspace.payments.title": "Zahlungshistorie",
"workspace.payments.subtitle": "Letzte Zahlungsvorgänge.",
"workspace.payments.table.date": "Datum",
"workspace.payments.table.paymentId": "Zahlungs-ID",
"workspace.payments.table.amount": "Betrag",
"workspace.payments.table.receipt": "Quittung",
"workspace.payments.type.credit": "Kredit",
"workspace.payments.type.subscription": "Abonnement",
"workspace.payments.view": "Anzeigen",
"workspace.black.loading": "Laden...",
"workspace.black.time.day": "Tag",
"workspace.black.time.days": "Tage",
"workspace.black.time.hour": "Stunde",
"workspace.black.time.hours": "Std.",
"workspace.black.time.minute": "Minute",
"workspace.black.time.minutes": "Minuten",
"workspace.black.time.fewSeconds": "ein paar Sekunden",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Sie haben OpenCode Black für ${{plan}} pro Monat abonniert.",
"workspace.black.subscription.manage": "Abonnement verwalten",
"workspace.black.subscription.rollingUsage": "5-stündige Nutzung",
"workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung",
"workspace.black.subscription.resetsIn": "Zurückgesetzt in",
"workspace.black.subscription.useBalance":
"Nutzen Sie Ihr verfügbares Guthaben, nachdem Sie die Nutzungslimits erreicht haben",
"workspace.black.waitlist.title": "Warteliste",
"workspace.black.waitlist.joined":
"Sie stehen auf der Warteliste für den OpenCode Black Tarif für ${{plan}} pro Monat.",
"workspace.black.waitlist.ready":
"Wir können Sie jetzt in den OpenCode Black Tarif für ${{plan}} pro Monat aufnehmen.",
"workspace.black.waitlist.leave": "Warteliste verlassen",
"workspace.black.waitlist.leaving": "Verlassen...",
"workspace.black.waitlist.left": "Verlassen",
"workspace.black.waitlist.enroll": "Einschreiben",
"workspace.black.waitlist.enrolling": "Anmeldung...",
"workspace.black.waitlist.enrolled": "Eingeschrieben",
"workspace.black.waitlist.enrollNote":
"Wenn Sie auf „Anmelden“ klicken, beginnt Ihr Abonnement sofort und Ihre Karte wird belastet.",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Modell",
"bench.list.table.score": "Score",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Task nicht gefunden",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Modell",
"bench.detail.labels.task": "Task",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Von",
"bench.detail.labels.to": "Bis",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Durchschnittliche Dauer",
"bench.detail.labels.averageScore": "Durchschnittlicher Score",
"bench.detail.labels.averageCost": "Durchschnittliche Kosten",
"bench.detail.labels.summary": "Zusammenfassung",
"bench.detail.labels.runs": "Durchläufe",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Basis",
"bench.detail.labels.penalty": "Strafe",
"bench.detail.labels.weight": "Gewichtung",
"bench.detail.table.run": "Durchlauf",
"bench.detail.table.score": "Score (Basis - Strafe)",
"bench.detail.table.cost": "Kosten",
"bench.detail.table.duration": "Dauer",
"bench.detail.run.title": "Durchlauf {{n}}",
"bench.detail.rawJson": "Raw JSON",
} satisfies Dict

View File

@@ -394,7 +394,7 @@ export const dict = {
"workspace.settings.edit": "Edit",
"workspace.billing.title": "Billing",
"workspace.billing.subtitle.beforeLink": "Manage payments methods.",
"workspace.billing.subtitle.beforeLink": "Manage payment methods.",
"workspace.billing.contactUs": "Contact us",
"workspace.billing.subtitle.afterLink": "if you have any questions.",
"workspace.billing.currentBalance": "Current Balance",

View File

@@ -4,220 +4,496 @@ import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Documentacion",
"nav.docs": "Documentación",
"nav.changelog": "Registro de cambios",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Empresas",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Iniciar sesion",
"nav.login": "Iniciar sesión",
"nav.free": "Gratis",
"nav.home": "Inicio",
"nav.openMenu": "Abrir menu",
"nav.openMenu": "Abrir menú",
"nav.getStartedFree": "Empezar gratis",
"nav.context.copyLogo": "Copiar logo como SVG",
"nav.context.copyWordmark": "Copiar logotipo como SVG",
"nav.context.brandAssets": "Recursos de marca",
"nav.context.copyWordmark": "Copiar marca como SVG",
"nav.context.brandAssets": "Activos de marca",
"footer.github": "GitHub",
"footer.docs": "Documentacion",
"footer.docs": "Documentación",
"footer.changelog": "Registro de cambios",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Marca",
"legal.privacy": "Privacidad",
"legal.terms": "Terminos",
"legal.terms": "Términos",
"email.title": "Se el primero en enterarte cuando lancemos nuevos productos",
"email.subtitle": "Unete a la lista de espera para acceso anticipado.",
"email.placeholder": "Correo electronico",
"email.title": "Sé el primero en enterarte cuando lancemos nuevos productos",
"email.subtitle": "Únete a la lista de espera para acceso anticipado.",
"email.placeholder": "Dirección de correo",
"email.subscribe": "Suscribirse",
"email.success": "Casi listo: revisa tu bandeja de entrada y confirma tu correo",
"email.success": "Casi listo, revisa tu bandeja de entrada y confirma tu correo",
"notFound.title": "No encontrado | opencode",
"notFound.heading": "404 - Pagina no encontrada",
"notFound.heading": "404 - Página no encontrada",
"notFound.home": "Inicio",
"notFound.docs": "Documentacion",
"notFound.docs": "Documentación",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"user.logout": "Cerrar sesion",
"user.logout": "Cerrar sesión",
"workspace.select": "Seleccionar workspace",
"workspace.createNew": "+ Crear nuevo workspace",
"workspace.modal.title": "Crear nuevo workspace",
"workspace.modal.placeholder": "Introduce el nombre del workspace",
"workspace.select": "Seleccionar espacio de trabajo",
"workspace.createNew": "+ Crear nuevo espacio de trabajo",
"workspace.modal.title": "Crear nuevo espacio de trabajo",
"workspace.modal.placeholder": "Introduce nombre del espacio de trabajo",
"common.cancel": "Cancelar",
"common.creating": "Creando...",
"common.create": "Crear",
"common.videoUnsupported": "Tu navegador no admite la etiqueta de video.",
"common.videoUnsupported": "Tu navegador no soporta la etiqueta de video.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Mas informacion",
"common.learnMore": "Más información",
"home.title": "OpenCode | El agente de codificacion con IA de codigo abierto",
"error.invalidPlan": "Plan inválido",
"error.workspaceRequired": "Se requiere ID del espacio de trabajo",
"error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
"error.limitRequired": "El límite es obligatorio.",
"error.monthlyLimitInvalid": "Establece un límite mensual válido.",
"error.workspaceNameRequired": "El nombre del espacio de trabajo es obligatorio.",
"error.nameTooLong": "El nombre debe tener 255 caracteres o menos.",
"error.emailRequired": "El correo es obligatorio",
"error.roleRequired": "El rol es obligatorio",
"error.idRequired": "El ID es obligatorio",
"error.nameRequired": "El nombre es obligatorio",
"error.providerRequired": "El proveedor es obligatorio",
"error.apiKeyRequired": "La clave de API es obligatoria",
"error.modelRequired": "El modelo es obligatorio",
"error.reloadAmountMin": "La cantidad de recarga debe ser al menos ${{amount}}",
"error.reloadTriggerMin": "El disparador de saldo debe ser al menos ${{amount}}",
"home.title": "OpenCode | El agente de codificación IA de código abierto",
"temp.title": "opencode | Agente de codificación IA creado para la terminal",
"temp.hero.title": "El agente de codificación IA creado para la terminal",
"temp.zen": "opencode zen",
"temp.getStarted": "Empezar",
"temp.feature.native.title": "TUI Nativa",
"temp.feature.native.body": "Una interfaz de terminal responsiva, nativa y personalizable",
"temp.feature.zen.beforeLink": "Una lista",
"temp.feature.zen.link": "seleccionada de modelos",
"temp.feature.zen.afterLink": "proporcionada por opencode",
"temp.feature.models.beforeLink": "Soporta más de 75 proveedores de LLM a través de",
"temp.feature.models.afterLink": ", incluyendo modelos locales",
"temp.screenshot.caption": "opencode TUI con el tema tokyonight",
"temp.screenshot.alt": "opencode TUI con tema tokyonight",
"home.banner.badge": "Nuevo",
"home.banner.text": "App de escritorio disponible en beta",
"home.banner.text": "Aplicación de escritorio disponible en beta",
"home.banner.platforms": "en macOS, Windows y Linux",
"home.banner.downloadNow": "Descargar ahora",
"home.banner.downloadBetaNow": "Descargar ahora la beta de escritorio",
"home.banner.downloadBetaNow": "Descargar la beta de escritorio ahora",
"home.hero.title": "El agente de codificacion con IA de codigo abierto",
"home.hero.subtitle.a": "Modelos gratis incluidos o conecta cualquier modelo de cualquier proveedor,",
"home.hero.subtitle.b": "incluyendo Claude, GPT, Gemini y mas.",
"home.hero.title": "El agente de codificación IA de código abierto",
"home.hero.subtitle.a": "Modelos gratuitos incluidos o conecta cualquier modelo de cualquier proveedor,",
"home.hero.subtitle.b": "incluyendo Claude, GPT, Gemini y más.",
"home.install.ariaLabel": "Opciones de instalacion",
"home.install.ariaLabel": "Opciones de instalación",
"home.what.title": "Que es OpenCode?",
"home.what.title": "¿Qué es OpenCode?",
"home.what.body":
"OpenCode es un agente de codigo abierto que te ayuda a escribir codigo en tu terminal, IDE o escritorio.",
"OpenCode es un agente de código abierto que te ayuda a escribir código en tu terminal, IDE o escritorio.",
"home.what.lsp.title": "LSP habilitado",
"home.what.lsp.body": "Carga automaticamente los LSP correctos para el LLM",
"home.what.multiSession.title": "Multi-sesion",
"home.what.multiSession.body": "Inicia multiples agentes en paralelo en el mismo proyecto",
"home.what.lsp.body": "Carga automáticamente los LSPs correctos para el LLM",
"home.what.multiSession.title": "Multi-sesión",
"home.what.multiSession.body": "Inicia múltiples agentes en paralelo en el mismo proyecto",
"home.what.shareLinks.title": "Compartir enlaces",
"home.what.shareLinks.body": "Comparte un enlace a cualquier sesion para referencia o depuracion",
"home.what.shareLinks.body": "Comparte un enlace a cualquier sesión para referencia o depuración",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Inicia sesion con GitHub para usar tu cuenta de Copilot",
"home.what.copilot.body": "Inicia sesión con GitHub para usar tu cuenta de Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Inicia sesion con OpenAI para usar tu cuenta de ChatGPT Plus o Pro",
"home.what.chatgptPlus.body": "Inicia sesión con OpenAI para usar tu cuenta de ChatGPT Plus o Pro",
"home.what.anyModel.title": "Cualquier modelo",
"home.what.anyModel.body": "75+ proveedores de LLM a traves de Models.dev, incluidos modelos locales",
"home.what.anyModel.body": "Más de 75 proveedores de LLM a través de Models.dev, incluyendo modelos locales",
"home.what.anyEditor.title": "Cualquier editor",
"home.what.anyEditor.body": "Disponible como interfaz de terminal, app de escritorio y extension de IDE",
"home.what.readDocs": "Leer docs",
"home.what.anyEditor.body": "Disponible como interfaz de terminal, aplicación de escritorio y extensión de IDE",
"home.what.readDocs": "Leer documentación",
"home.growth.title": "El agente de codificacion con IA de codigo abierto",
"home.growth.title": "El agente de codificación IA de código abierto",
"home.growth.body":
"Con mas de <strong>{{stars}}</strong> estrellas en GitHub, <strong>{{contributors}}</strong> colaboradores y mas de <strong>{{commits}}</strong> commits, OpenCode es usado y confiado por mas de <strong>{{monthlyUsers}}</strong> desarrolladores cada mes.",
"home.growth.githubStars": "Estrellas de GitHub",
"Con más de <strong>{{stars}}</strong> estrellas en GitHub, <strong>{{contributors}}</strong> colaboradores y más de <strong>{{commits}}</strong> commits, OpenCode es usado y confiado por más de <strong>{{monthlyUsers}}</strong> desarrolladores cada mes.",
"home.growth.githubStars": "Estrellas en GitHub",
"home.growth.contributors": "Colaboradores",
"home.growth.monthlyDevs": "Devs mensuales",
"home.growth.monthlyDevs": "Desarrolladores Mensuales",
"home.privacy.title": "Creado para la privacidad primero",
"home.privacy.title": "Creado pensando en la privacidad",
"home.privacy.body":
"OpenCode no almacena tu codigo ni datos de contexto, para poder operar en entornos sensibles a la privacidad.",
"home.privacy.learnMore": "Mas informacion sobre",
"OpenCode no almacena tu código ni datos de contexto, para que pueda operar en entornos sensibles a la privacidad.",
"home.privacy.learnMore": "Más información sobre",
"home.privacy.link": "privacidad",
"home.faq.q1": "Que es OpenCode?",
"home.faq.q1": "¿Qué es OpenCode?",
"home.faq.a1":
"OpenCode es un agente de codigo abierto que te ayuda a escribir y ejecutar codigo con cualquier modelo de IA. Esta disponible como interfaz de terminal, app de escritorio o extension de IDE.",
"home.faq.q2": "Como uso OpenCode?",
"home.faq.a2.before": "La forma mas facil de empezar es leer la",
"home.faq.a2.link": "introduccion",
"home.faq.q3": "Necesito suscripciones extra de IA para usar OpenCode?",
"OpenCode es un agente de código abierto que te ayuda a escribir y ejecutar código con cualquier modelo de IA. Está disponible como interfaz de terminal, aplicación de escritorio o extensión de IDE.",
"home.faq.q2": "¿Cómo uso OpenCode?",
"home.faq.a2.before": "La forma más fácil de empezar es leer la",
"home.faq.a2.link": "introducción",
"home.faq.q3": "¿Necesito suscripciones extra de IA para usar OpenCode?",
"home.faq.a3.p1":
"No necesariamente: OpenCode incluye un conjunto de modelos gratis que puedes usar sin crear una cuenta.",
"home.faq.a3.p2.beforeZen": "Ademas, puedes usar modelos populares para codigo creando una cuenta de",
"No necesariamente, OpenCode viene con un conjunto de modelos gratuitos que puedes usar sin crear una cuenta.",
"home.faq.a3.p2.beforeZen":
"Aparte de estos, puedes usar cualquiera de los modelos de codificación populares creando una cuenta de",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Aunque alentamos a los usuarios a usar Zen, OpenCode tambien funciona con los proveedores populares como OpenAI, Anthropic, xAI, etc.",
"Aunque animamos a los usuarios a usar Zen, OpenCode también funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
"home.faq.a3.p4.beforeLocal": "Incluso puedes conectar tus",
"home.faq.a3.p4.localLink": "modelos locales",
"home.faq.q4": "Puedo usar mis suscripciones de IA existentes con OpenCode?",
"home.faq.q4": "¿Puedo usar mis suscripciones de IA existentes con OpenCode?",
"home.faq.a4.p1":
"Si, OpenCode admite planes de suscripcion de los principales proveedores. Puedes usar Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
"home.faq.q5": "Solo puedo usar OpenCode en la terminal?",
"home.faq.a5.beforeDesktop": "Ya no! OpenCode ahora esta disponible como una app para",
"Sí, OpenCode soporta planes de suscripción de los principales proveedores. Puedes usar tus suscripciones de Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
"home.faq.q5": "¿Solo puedo usar OpenCode en la terminal?",
"home.faq.a5.beforeDesktop": "¡Ya no! OpenCode ahora está disponible como una aplicación para tu",
"home.faq.a5.desktop": "escritorio",
"home.faq.a5.and": "y",
"home.faq.a5.web": "web",
"home.faq.q6": "Cuanto cuesta OpenCode?",
"home.faq.q6": "¿Cuánto cuesta OpenCode?",
"home.faq.a6":
"OpenCode es 100% gratis. Tambien incluye modelos gratuitos. Puede haber costos adicionales si conectas otro proveedor.",
"home.faq.q7": "Y sobre datos y privacidad?",
"OpenCode es 100% gratuito de usar. También viene con un conjunto de modelos gratuitos. Puede haber costos adicionales si conectas cualquier otro proveedor.",
"home.faq.q7": "¿Qué hay sobre datos y privacidad?",
"home.faq.a7.p1":
"Tus datos e informacion solo se almacenan cuando usas nuestros modelos gratis o creas enlaces compartibles.",
"home.faq.a7.p2.beforeModels": "Mas informacion sobre",
"Tus datos e información solo se almacenan cuando usas nuestros modelos gratuitos o creas enlaces compartibles.",
"home.faq.a7.p2.beforeModels": "Más información sobre",
"home.faq.a7.p2.modelsLink": "nuestros modelos",
"home.faq.a7.p2.and": "y",
"home.faq.a7.p2.shareLink": "paginas para compartir",
"home.faq.q8": "OpenCode es de codigo abierto?",
"home.faq.a8.p1": "Si, OpenCode es totalmente open source. El codigo fuente es publico en",
"home.faq.a7.p2.shareLink": "páginas compartidas",
"home.faq.q8": "¿Es OpenCode de código abierto?",
"home.faq.a8.p1": "Sí, OpenCode es totalmente de código abierto. El código fuente es público en",
"home.faq.a8.p2": "bajo la",
"home.faq.a8.mitLicense": "Licencia MIT",
"home.faq.a8.p3":
", lo que significa que cualquiera puede usarlo, modificarlo o contribuir a su desarrollo. Cualquiera de la comunidad puede abrir issues, enviar pull requests y ampliar la funcionalidad.",
", lo que significa que cualquiera puede usar, modificar o contribuir a su desarrollo. Cualquiera de la comunidad puede abrir problemas, enviar solicitudes de extracción y extender la funcionalidad.",
"home.zenCta.title": "Accede a modelos confiables y optimizados para agentes de codigo",
"home.zenCta.title": "Accede a modelos optimizados y confiables para agentes de codificación",
"home.zenCta.body":
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y benchmarkeado especificamente para agentes de codigo. No necesitas preocuparte por el rendimiento y la calidad inconsistentes entre proveedores: usa modelos validados que funcionan.",
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes entre proveedores, usa modelos validados que funcionan.",
"home.zenCta.link": "Aprende sobre Zen",
"download.title": "OpenCode | Descargar",
"zen.title": "OpenCode Zen | Un conjunto seleccionado de modelos confiables y optimizados para agentes de codigo",
"zen.hero.title": "Accede a modelos confiables y optimizados para agentes de codigo",
"zen.title":
"OpenCode Zen | Un conjunto seleccionado de modelos optimizados y confiables para agentes de codificación",
"zen.hero.title": "Modelos optimizados y confiables para agentes de codificación",
"zen.hero.body":
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y benchmarkeado especificamente para agentes de codigo. No necesitas preocuparte por el rendimiento y la calidad inconsistentes entre proveedores: usa modelos validados que funcionan.",
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes, usa modelos validados que funcionan.",
"zen.faq.q1": "Que es OpenCode Zen?",
"zen.faq.q1": "¿Qué es OpenCode Zen?",
"zen.faq.a1":
"Zen es un conjunto seleccionado de modelos de IA probados y benchmarkeados para agentes de codigo, creado por el equipo detras de OpenCode.",
"zen.faq.q2": "Que hace a Zen mas preciso?",
"Zen es un conjunto seleccionado de modelos de IA probados y evaluados para agentes de codificación, creado por el equipo detrás de OpenCode.",
"zen.faq.q2": "¿Qué hace a Zen más preciso?",
"zen.faq.a2":
"Zen solo ofrece modelos que han sido probados y benchmarkeados especificamente para agentes de codigo. No usarias un cuchillo de mantequilla para cortar un filete; no uses malos modelos para programar.",
"zen.faq.q3": "Zen es mas barato?",
"Zen solo proporciona modelos que han sido específicamente probados y evaluados para agentes de codificación. No usarías un cuchillo de mantequilla para cortar carne, no uses modelos pobres para codificar.",
"zen.faq.q3": "¿Es Zen más barato?",
"zen.faq.a3":
"Zen no tiene fines de lucro. Zen traslada los costos de los proveedores de modelos directamente a ti. Cuanto mas uso tenga Zen, mas puede OpenCode negociar mejores tarifas y trasladartelas.",
"zen.faq.q4": "Cuanto cuesta Zen?",
"Zen no tiene fines de lucro. Zen te transfiere los costos de los proveedores de modelos. Cuanto mayor sea el uso de Zen, más podrá OpenCode negociar mejores tarifas y transferírtelas.",
"zen.faq.q4": "¿Cuánto cuesta Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "cobra por solicitud",
"zen.faq.a4.p1.afterPricing": "sin margenes, asi que pagas exactamente lo que cobra el proveedor del modelo.",
"zen.faq.a4.p2.beforeAccount": "Tu costo total depende del uso, y puedes establecer limites de gasto mensuales en tu",
"zen.faq.a4.p1.afterPricing": "sin recargos, así que pagas exactamente lo que cobra el proveedor del modelo.",
"zen.faq.a4.p2.beforeAccount": "Tu costo total depende del uso, y puedes establecer límites de gasto mensuales en tu",
"zen.faq.a4.p2.accountLink": "cuenta",
"zen.faq.a4.p3":
"Para cubrir costos, OpenCode solo agrega una pequena tarifa de procesamiento de pagos de $1.23 por cada recarga de saldo de $20.",
"zen.faq.q5": "Y sobre datos y privacidad?",
"Para cubrir costos, OpenCode añade solo una pequeña tarifa de procesamiento de pagos de $1.23 por cada recarga de saldo de $20.",
"zen.faq.q5": "¿Qué hay sobre datos y privacidad?",
"zen.faq.a5.beforeExceptions":
"Todos los modelos de Zen estan alojados en EE. UU. Los proveedores siguen una politica de cero retencion y no usan tus datos para entrenar modelos, con las",
"Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
"zen.faq.a5.exceptionsLink": "siguientes excepciones",
"zen.faq.q6": "Puedo establecer limites de gasto?",
"zen.faq.a6": "Si, puedes establecer limites de gasto mensuales en tu cuenta.",
"zen.faq.q7": "Puedo cancelar?",
"zen.faq.a7": "Si, puedes desactivar la facturacion en cualquier momento y usar tu saldo restante.",
"zen.faq.q8": "Puedo usar Zen con otros agentes de codigo?",
"zen.faq.q6": "¿Puedo establecer límites de gasto?",
"zen.faq.a6": "Sí, puedes establecer límites de gasto mensuales en tu cuenta.",
"zen.faq.q7": "¿Puedo cancelar?",
"zen.faq.a7": "Sí, puedes deshabilitar la facturación en cualquier momento y usar tu saldo restante.",
"zen.faq.q8": "¿Puedo usar Zen con otros agentes de codificación?",
"zen.faq.a8":
"Aunque Zen funciona muy bien con OpenCode, puedes usar Zen con cualquier agente. Sigue las instrucciones de configuracion en tu agente preferido.",
"zen.cta.start": "Comience con Zen",
"zen.pricing.title": "Agregue $20 de saldo de pago por uso",
"Aunque Zen funciona genial con OpenCode, puedes usar Zen con cualquier agente. Sigue las instrucciones de configuración en tu agente de codificación preferido.",
"zen.cta.start": "Empieza con Zen",
"zen.pricing.title": "Añade $20 de saldo prepago",
"zen.pricing.fee": "(+$1.23 tarifa de procesamiento de tarjeta)",
"zen.pricing.body": "Úselo con cualquier agente. Establezca límites de gasto mensual. Cancela en cualquier momento.",
"zen.pricing.body": "Úsalo con cualquier agente. Establece límites de gasto mensual. Cancela en cualquier momento.",
"zen.problem.title": "¿Qué problema está resolviendo Zen?",
"zen.problem.body":
"Hay muchos modelos disponibles, pero sólo unos pocos funcionan bien con agentes codificadores. La mayoría de los proveedores los configuran de manera diferente con resultados variables.",
"zen.problem.subtitle": "Estamos solucionando este problema para todos, no solo para los usuarios de OpenCode.",
"zen.problem.item1": "Probar modelos seleccionados y consultar a sus equipos.",
"zen.problem.item2": "Trabajar con proveedores para garantizar que se entreguen correctamente.",
"zen.problem.item3": "Comparación de todas las combinaciones de modelo y proveedor que recomendamos",
"Hay muchos modelos disponibles, pero solo unos pocos funcionan bien con agentes de codificación. La mayoría de los proveedores los configuran de manera diferente con resultados variables.",
"zen.problem.subtitle": "Estamos arreglando esto para todos, no solo para usuarios de OpenCode.",
"zen.problem.item1": "Probando modelos seleccionados y consultando a sus equipos",
"zen.problem.item2": "Trabajando con proveedores para asegurar que se entreguen correctamente",
"zen.problem.item3": "Evaluando todas las combinaciones modelo-proveedor que recomendamos",
"zen.how.title": "Cómo funciona Zen",
"zen.how.body": "Si bien le sugerimos que utilice Zen con OpenCode, puede utilizar Zen con cualquier agente.",
"zen.how.step1.title": "Regístrese y agregue un saldo de $20",
"zen.how.step1.beforeLink": "sigue el",
"zen.how.body": "Aunque sugerimos usar Zen con OpenCode, puedes usar Zen con cualquier agente.",
"zen.how.step1.title": "Regístrate y añade $20 de saldo",
"zen.how.step1.beforeLink": "sigue las",
"zen.how.step1.link": "instrucciones de configuración",
"zen.how.step2.title": "Utilice Zen con precios transparentes",
"zen.how.step2.link": "pago por solicitud",
"zen.how.step2.afterLink": "con cero marcas",
"zen.how.step3.title": "Recarga automática",
"zen.how.step3.body": "cuando su saldo alcance $5, agregaremos automáticamente $20",
"zen.how.step2.title": "Usa Zen con precios transparentes",
"zen.how.step2.link": "paga por solicitud",
"zen.how.step2.afterLink": "con cero recargos",
"zen.how.step3.title": "Auto-recarga",
"zen.how.step3.body": "cuando tu saldo alcance $5 añadiremos automáticamente $20",
"zen.privacy.title": "Tu privacidad es importante para nosotros",
"zen.privacy.beforeExceptions":
"Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan sus datos para la capacitación de modelos, con la",
"Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
"zen.privacy.exceptionsLink": "siguientes excepciones",
"black.meta.title": "OpenCode Black | Accede a los mejores modelos de codificación del mundo",
"black.meta.description": "Obtén acceso a Claude, GPT, Gemini y más con los planes de suscripción de OpenCode Black.",
"black.hero.title": "Accede a los mejores modelos de codificación del mundo",
"black.hero.subtitle": "Incluyendo Claude, GPT, Gemini y más",
"black.title": "OpenCode Black | Precios",
"black.plan.icon20": "Plan Black 20",
"black.plan.icon100": "Plan Black 100",
"black.plan.icon200": "Plan Black 200",
"black.plan.multiplier100": "5x más uso que Black 20",
"black.plan.multiplier200": "20x más uso que Black 20",
"black.price.perMonth": "al mes",
"black.price.perPersonBilledMonthly": "por persona facturado mensualmente",
"black.terms.1": "Tu suscripción no comenzará inmediatamente",
"black.terms.2": "Serás añadido a la lista de espera y activado pronto",
"black.terms.3": "Tu tarjeta solo se cargará cuando tu suscripción se active",
"black.terms.4": "Aplican límites de uso, el uso fuertemente automatizado puede alcanzar los límites antes",
"black.terms.5": "Las suscripciones son para individuos, contacta a Enterprise para equipos",
"black.terms.6": "Los límites pueden ajustarse y los planes pueden discontinuarse en el futuro",
"black.terms.7": "Cancela tu suscripción en cualquier momento",
"black.action.continue": "Continuar",
"black.finePrint.beforeTerms": "Los precios mostrados no incluyen impuestos aplicables",
"black.finePrint.terms": "Términos de Servicio",
"black.workspace.title": "OpenCode Black | Seleccionar Espacio de Trabajo",
"black.workspace.selectPlan": "Selecciona un espacio de trabajo para este plan",
"black.workspace.name": "Espacio de trabajo {{n}}",
"black.subscribe.title": "Suscribirse a OpenCode Black",
"black.subscribe.paymentMethod": "Método de pago",
"black.subscribe.loadingPaymentForm": "Cargando formulario de pago...",
"black.subscribe.selectWorkspaceToContinue": "Selecciona un espacio de trabajo para continuar",
"black.subscribe.failurePrefix": "¡Oh no!",
"black.subscribe.error.generic": "Ocurrió un error",
"black.subscribe.error.invalidPlan": "Plan inválido",
"black.subscribe.error.workspaceRequired": "Se requiere ID del espacio de trabajo",
"black.subscribe.error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
"black.subscribe.processing": "Procesando...",
"black.subscribe.submit": "Suscribirse ${{plan}}",
"black.subscribe.form.chargeNotice": "Solo se te cobrará cuando tu suscripción se active",
"black.subscribe.success.title": "Estás en la lista de espera de OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Plan de suscripción",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Cantidad",
"black.subscribe.success.amountValue": "${{plan}} al mes",
"black.subscribe.success.paymentMethod": "Método de pago",
"black.subscribe.success.dateJoined": "Fecha de unión",
"black.subscribe.success.chargeNotice": "Tu tarjeta se cargará cuando tu suscripción se active",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "Claves API",
"workspace.nav.members": "Miembros",
"workspace.nav.billing": "Facturación",
"workspace.nav.settings": "Configuración",
"workspace.home.banner.beforeLink": "Modelos optimizados y confiables para agentes de codificación.",
"workspace.home.billing.loading": "Cargando...",
"workspace.home.billing.enable": "Habilitar facturación",
"workspace.home.billing.currentBalance": "Saldo actual",
"workspace.newUser.feature.tested.title": "Modelos Probados y Verificados",
"workspace.newUser.feature.tested.body":
"Hemos evaluado y probado modelos específicamente para agentes de codificación para asegurar el mejor rendimiento.",
"workspace.newUser.feature.quality.title": "Máxima Calidad",
"workspace.newUser.feature.quality.body":
"Accede a modelos configurados para un rendimiento óptimo - sin degradaciones ni enrutamiento a proveedores más baratos.",
"workspace.newUser.feature.lockin.title": "Sin Bloqueo",
"workspace.newUser.feature.lockin.body":
"Usa Zen con cualquier agente de codificación, y continúa usando otros proveedores con opencode cuando quieras.",
"workspace.newUser.copyApiKey": "Copiar clave API",
"workspace.newUser.copyKey": "Copiar Clave",
"workspace.newUser.copied": "¡Copiada!",
"workspace.newUser.step.enableBilling": "Habilitar facturación",
"workspace.newUser.step.login.before": "Ejecuta",
"workspace.newUser.step.login.after": "y selecciona opencode",
"workspace.newUser.step.pasteKey": "Pega tu clave API",
"workspace.newUser.step.models.before": "Inicia opencode y ejecuta",
"workspace.newUser.step.models.after": "para seleccionar un modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink": "Gestiona qué modelos pueden acceder los miembros del espacio de trabajo.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Habilitado",
"workspace.providers.title": "Trae Tu Propia Clave",
"workspace.providers.subtitle": "Configura tus propias claves API de proveedores de IA.",
"workspace.providers.placeholder": "Introduce clave API de {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Eliminar",
"workspace.providers.saving": "Guardando...",
"workspace.providers.save": "Guardar",
"workspace.providers.table.provider": "Proveedor",
"workspace.providers.table.apiKey": "Clave API",
"workspace.usage.title": "Historial de Uso",
"workspace.usage.subtitle": "Uso reciente de API y costos.",
"workspace.usage.empty": "Haz tu primera llamada a la API para empezar.",
"workspace.usage.table.date": "Fecha",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Entrada",
"workspace.usage.table.output": "Salida",
"workspace.usage.table.cost": "Costo",
"workspace.usage.breakdown.input": "Entrada",
"workspace.usage.breakdown.cacheRead": "Lectura de Caché",
"workspace.usage.breakdown.cacheWrite": "Escritura de Caché",
"workspace.usage.breakdown.output": "Salida",
"workspace.usage.breakdown.reasoning": "Razonamiento",
"workspace.usage.subscription": "suscripción (${{amount}})",
"workspace.cost.title": "Costo",
"workspace.cost.subtitle": "Costos de uso desglosados por modelo.",
"workspace.cost.allModels": "Todos los Modelos",
"workspace.cost.allKeys": "Todas las Claves",
"workspace.cost.deletedSuffix": "(eliminado)",
"workspace.cost.empty": "No hay datos de uso disponibles para el periodo seleccionado.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "Claves API",
"workspace.keys.subtitle": "Gestiona tus claves API para acceder a los servicios de opencode.",
"workspace.keys.create": "Crear Clave API",
"workspace.keys.placeholder": "Introduce nombre de la clave",
"workspace.keys.empty": "Crea una clave API de opencode Gateway",
"workspace.keys.table.name": "Nombre",
"workspace.keys.table.key": "Clave",
"workspace.keys.table.createdBy": "Creado Por",
"workspace.keys.table.lastUsed": "Último Uso",
"workspace.keys.copyApiKey": "Copiar clave API",
"workspace.keys.delete": "Eliminar",
"workspace.members.title": "Miembros",
"workspace.members.subtitle": "Gestiona miembros del espacio de trabajo y sus permisos.",
"workspace.members.invite": "Invitar Miembro",
"workspace.members.inviting": "Invitando...",
"workspace.members.beta.beforeLink": "Los espacios de trabajo son gratuitos para equipos durante la beta.",
"workspace.members.form.invitee": "Invitado",
"workspace.members.form.emailPlaceholder": "Introduce correo",
"workspace.members.form.role": "Rol",
"workspace.members.form.monthlyLimit": "Límite de gasto mensual",
"workspace.members.noLimit": "Sin límite",
"workspace.members.noLimitLowercase": "sin límite",
"workspace.members.invited": "invitado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Eliminar",
"workspace.members.saving": "Guardando...",
"workspace.members.save": "Guardar",
"workspace.members.table.email": "Correo",
"workspace.members.table.role": "Rol",
"workspace.members.table.monthLimit": "Límite mensual",
"workspace.members.role.admin": "Administrador",
"workspace.members.role.adminDescription": "Puede gestionar modelos, miembros y facturación",
"workspace.members.role.member": "Miembro",
"workspace.members.role.memberDescription": "Solo puede generar claves API para sí mismo",
"workspace.settings.title": "Configuración",
"workspace.settings.subtitle": "Actualiza el nombre de tu espacio de trabajo y preferencias.",
"workspace.settings.workspaceName": "Nombre del espacio de trabajo",
"workspace.settings.defaultName": "Por defecto",
"workspace.settings.updating": "Actualizando...",
"workspace.settings.save": "Guardar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Facturación",
"workspace.billing.subtitle.beforeLink": "Gestionar métodos de pago.",
"workspace.billing.contactUs": "Contáctanos",
"workspace.billing.subtitle.afterLink": "si tienes alguna pregunta.",
"workspace.billing.currentBalance": "Saldo Actual",
"workspace.billing.add": "Añadir $",
"workspace.billing.enterAmount": "Introduce cantidad",
"workspace.billing.loading": "Cargando...",
"workspace.billing.addAction": "Añadir",
"workspace.billing.addBalance": "Añadir Saldo",
"workspace.billing.linkedToStripe": "Vinculado con Stripe",
"workspace.billing.manage": "Gestionar",
"workspace.billing.enable": "Habilitar Facturación",
"workspace.monthlyLimit.title": "Límite Mensual",
"workspace.monthlyLimit.subtitle": "Establece un límite de uso mensual para tu cuenta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Estableciendo...",
"workspace.monthlyLimit.set": "Establecer",
"workspace.monthlyLimit.edit": "Editar Límite",
"workspace.monthlyLimit.noLimit": "Sin límite de uso establecido.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso actual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "es $",
"workspace.reload.title": "Auto Recarga",
"workspace.reload.disabled.before": "La auto recarga está",
"workspace.reload.disabled.state": "deshabilitada",
"workspace.reload.disabled.after": "Habilita para recargar automáticamente cuando el saldo sea bajo.",
"workspace.reload.enabled.before": "La auto recarga está",
"workspace.reload.enabled.state": "habilitada",
"workspace.reload.enabled.middle": "Recargaremos",
"workspace.reload.processingFee": "tarifa de procesamiento",
"workspace.reload.enabled.after": "cuando el saldo alcance",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Habilitar",
"workspace.reload.enableAutoReload": "Habilitar Auto Recarga",
"workspace.reload.reloadAmount": "Recargar $",
"workspace.reload.whenBalanceReaches": "Cuando el saldo alcance $",
"workspace.reload.saving": "Guardando...",
"workspace.reload.save": "Guardar",
"workspace.reload.failedAt": "La recarga falló en",
"workspace.reload.reason": "Razón:",
"workspace.reload.updatePaymentMethod": "Por favor actualiza tu método de pago e intenta de nuevo.",
"workspace.reload.retrying": "Reintentando...",
"workspace.reload.retry": "Reintentar",
"workspace.payments.title": "Historial de Pagos",
"workspace.payments.subtitle": "Transacciones de pago recientes.",
"workspace.payments.table.date": "Fecha",
"workspace.payments.table.paymentId": "ID de Pago",
"workspace.payments.table.amount": "Cantidad",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "suscripción",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Cargando...",
"workspace.black.time.day": "día",
"workspace.black.time.days": "días",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "unos pocos segundos",
"workspace.black.subscription.title": "Suscripción",
"workspace.black.subscription.message": "Estás suscrito a OpenCode Black por ${{plan}} al mes.",
"workspace.black.subscription.manage": "Gestionar Suscripción",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Se reinicia en",
"workspace.black.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
"workspace.black.waitlist.title": "Lista de Espera",
"workspace.black.waitlist.joined": "Estás en la lista de espera para el plan OpenCode Black de ${{plan}} al mes.",
"workspace.black.waitlist.ready": "Estamos listos para inscribirte en el plan OpenCode Black de ${{plan}} al mes.",
"workspace.black.waitlist.leave": "Abandonar Lista de Espera",
"workspace.black.waitlist.leaving": "Abandonando...",
"workspace.black.waitlist.left": "Abandonada",
"workspace.black.waitlist.enroll": "Inscribirse",
"workspace.black.waitlist.enrolling": "Inscribiéndose...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Cuando haces clic en Inscribirse, tu suscripción comienza inmediatamente y se cargará a tu tarjeta.",
"download.title": "OpenCode | Descargar",
"download.meta.description": "Descarga OpenCode para macOS, Windows y Linux",
"download.hero.title": "Descargar OpenCode",
"download.hero.subtitle": "Disponible en Beta para macOS, Windows y Linux",
"download.hero.button": "Descargar para {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Extensiones de OpenCode",
"download.section.integrations": "Integraciones de OpenCode",
"download.section.extensions": "Extensiones OpenCode",
"download.section.integrations": "Integraciones OpenCode",
"download.action.download": "Descargar",
"download.action.install": "Instalar",
@@ -228,244 +504,95 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"No necesariamente, pero probablemente. Necesitaras una suscripcion de IA si quieres conectar OpenCode a un proveedor de pago, aunque puedes trabajar con",
"No necesariamente, pero probablemente. Necesitarás una suscripción de IA si quieres conectar OpenCode a un proveedor de pago, aunque puedes trabajar con",
"download.faq.a3.localLink": "modelos locales",
"download.faq.a3.afterLocal.beforeZen": "gratis. Aunque animamos a los usuarios a usar",
"download.faq.a3.afterZen":
", OpenCode funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
"download.faq.a5.p1": "OpenCode es 100% gratis.",
"download.faq.a5.p1": "OpenCode es 100% gratuito de usar.",
"download.faq.a5.p2.beforeZen":
"Cualquier costo adicional vendra de tu suscripcion a un proveedor de modelos. Aunque OpenCode funciona con cualquier proveedor de modelos, recomendamos usar",
"Cualquier costo adicional vendrá de tu suscripción a un proveedor de modelos. Aunque OpenCode funciona con cualquier proveedor de modelos, recomendamos usar",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Tus datos e informacion solo se almacenan cuando creas enlaces compartibles en OpenCode.",
"download.faq.a6.p2.beforeShare": "Mas informacion sobre",
"download.faq.a6.shareLink": "paginas para compartir",
"download.faq.a6.p1": "Tus datos e información solo se almacenan cuando creas enlaces compartibles en OpenCode.",
"download.faq.a6.p2.beforeShare": "Más información sobre",
"download.faq.a6.shareLink": "páginas compartidas",
"enterprise.title": "OpenCode | Soluciones empresariales para tu organizacion",
"enterprise.title": "OpenCode | Soluciones empresariales para tu organización",
"enterprise.meta.description": "Contacta a OpenCode para soluciones empresariales",
"enterprise.hero.title": "Tu codigo es tuyo",
"enterprise.hero.title": "Tu código es tuyo",
"enterprise.hero.body1":
"OpenCode opera de forma segura dentro de tu organizacion sin almacenar datos ni contexto, y sin restricciones de licencia ni reclamaciones de propiedad. Inicia una prueba con tu equipo y luego despliegalo en toda tu organizacion integrandolo con tu SSO y tu gateway interno de IA.",
"enterprise.hero.body2": "Cuentanos como podemos ayudar.",
"OpenCode opera de forma segura dentro de tu organización sin almacenar datos ni contexto, y sin restricciones de licencia ni reclamaciones de propiedad. Inicia una prueba con tu equipo, luego despliégalo en toda tu organización integrándolo con tu SSO y pasarela de IA interna.",
"enterprise.hero.body2": "Déjanos saber cómo podemos ayudar.",
"enterprise.form.name.label": "Nombre completo",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Cargo",
"enterprise.form.role.placeholder": "Presidente ejecutivo",
"enterprise.form.email.label": "Correo de la empresa",
"enterprise.form.role.label": "Rol",
"enterprise.form.role.placeholder": "Presidente Ejecutivo",
"enterprise.form.email.label": "Correo de empresa",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Que problema intentas resolver?",
"enterprise.form.message.label": "¿Qué problema estás intentando resolver?",
"enterprise.form.message.placeholder": "Necesitamos ayuda con...",
"enterprise.form.send": "Enviar",
"enterprise.form.sending": "Enviando...",
"enterprise.form.success": "Mensaje enviado, nos pondremos en contacto pronto.",
"enterprise.form.success": "Mensaje enviado, estaremos en contacto pronto.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Que es OpenCode Enterprise?",
"enterprise.faq.q1": "¿Qué es OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise es para organizaciones que quieren asegurarse de que su codigo y datos nunca salgan de su infraestructura. Puede lograrlo mediante una configuracion centralizada que se integra con tu SSO y tu gateway interno de IA/LLM.",
"enterprise.faq.q2": "Como empiezo con OpenCode Enterprise?",
"OpenCode Enterprise es para organizaciones que quieren asegurar que su código y datos nunca salgan de su infraestructura. Puede hacer esto usando una configuración centralizada que se integra con tu SSO y pasarela de IA interna.",
"enterprise.faq.q2": "¿Cómo empiezo con OpenCode Enterprise?",
"enterprise.faq.a2":
"Empieza con una prueba interna con tu equipo. OpenCode por defecto no almacena tu codigo ni datos de contexto, lo que facilita comenzar. Despues, contactanos para hablar sobre precios y opciones de implementacion.",
"enterprise.faq.q3": "Como funciona el precio para empresas?",
"Simplemente empieza con una prueba interna con tu equipo. OpenCode por defecto no almacena tu código ni datos de contexto, haciendo fácil empezar. Luego contáctanos para discutir precios y opciones de implementación.",
"enterprise.faq.q3": "¿Cómo funciona el precio para empresas?",
"enterprise.faq.a3":
"Ofrecemos precios enterprise por asiento. Si tienes tu propio gateway de LLM, no cobramos por los tokens usados. Para mas detalles, contactanos para una cotizacion personalizada segun las necesidades de tu organizacion.",
"enterprise.faq.q4": "Mis datos estan seguros con OpenCode Enterprise?",
"Ofrecemos precios empresariales por asiento. Si tienes tu propia pasarela de LLM, no cobramos por los tokens usados. Para más detalles, contáctanos para una cotización personalizada basada en las necesidades de tu organización.",
"enterprise.faq.q4": "¿Están mis datos seguros con OpenCode Enterprise?",
"enterprise.faq.a4":
"Si. OpenCode no almacena tu codigo ni datos de contexto. Todo el procesamiento ocurre localmente o mediante llamadas directas a la API de tu proveedor de IA. Con configuracion centralizada e integracion SSO, tus datos permanecen seguros dentro de la infraestructura de tu organizacion.",
"Sí. OpenCode no almacena tu código ni datos de contexto. Todo el procesamiento ocurre localmente o a través de llamadas directas a la API de tu proveedor de IA. Con configuración central y integración SSO, tus datos permanecen seguros dentro de la infraestructura de tu organización.",
"brand.title": "OpenCode | Marca",
"brand.meta.description": "Guia de marca de OpenCode",
"brand.heading": "Guia de marca",
"brand.subtitle": "Recursos y materiales para ayudarte a trabajar con la marca OpenCode.",
"brand.downloadAll": "Descargar todos los recursos",
"brand.meta.description": "Guías de marca de OpenCode",
"brand.heading": "Guías de marca",
"brand.subtitle": "Recursos y activos para ayudarte a trabajar con la marca OpenCode.",
"brand.downloadAll": "Descargar todos los activos",
"changelog.title": "OpenCode | Registro de cambios",
"changelog.meta.description": "Notas de version y registro de cambios de OpenCode",
"changelog.meta.description": "Notas de versión y registro de cambios de OpenCode",
"changelog.hero.title": "Registro de cambios",
"changelog.hero.subtitle": "Nuevas actualizaciones y mejoras de OpenCode",
"changelog.hero.subtitle": "Nuevas actualizaciones y mejoras para OpenCode",
"changelog.empty": "No se encontraron entradas en el registro de cambios.",
"changelog.viewJson": "Ver JSON",
"workspace.nav.zen": "zen",
"workspace.nav.apiKeys": "API claves",
"workspace.nav.members": "Miembros",
"workspace.nav.billing": "Facturación",
"workspace.nav.settings": "Ajustes",
"workspace.home.banner.beforeLink": "Modelos optimizados confiables para agentes de codificación.",
"workspace.home.billing.loading": "Cargando...",
"workspace.home.billing.enable": "Habilitar facturación",
"workspace.home.billing.currentBalance": "Saldo actual",
"workspace.newUser.feature.tested.title": "Modelos probados y verificados",
"workspace.newUser.feature.tested.body":
"Hemos evaluado y probado modelos específicamente para agentes de codificación para garantizar el mejor rendimiento.",
"workspace.newUser.feature.quality.title": "La más alta calidad",
"workspace.newUser.feature.quality.body":
"Acceda a modelos configurados para un rendimiento óptimo, sin degradaciones ni enrutamiento a proveedores más baratos.",
"workspace.newUser.feature.lockin.title": "Sin bloqueo",
"workspace.newUser.feature.lockin.body":
"Utilice Zen con cualquier agente de codificación y continúe utilizando otros proveedores con opencode cuando lo desee.",
"workspace.newUser.copyApiKey": "Copiar la clave API",
"workspace.newUser.copyKey": "Copiar clave",
"workspace.newUser.copied": "¡Copiado!",
"workspace.newUser.step.enableBilling": "Habilitar facturación",
"workspace.newUser.step.login.before": "Correr",
"workspace.newUser.step.login.after": "y seleccione opencode",
"workspace.newUser.step.pasteKey": "Pega tu clave API",
"workspace.newUser.step.models.before": "Inicie opencode y ejecute",
"workspace.newUser.step.models.after": "para seleccionar un modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink":
"Administre a qué modelos pueden acceder los miembros del espacio de trabajo.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Activado",
"workspace.providers.title": "Trae tu propia llave",
"workspace.providers.subtitle": "Configure sus propias claves API de proveedores de IA.",
"workspace.providers.placeholder": "Ingrese la clave {{provider}} API ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Borrar",
"workspace.providers.saving": "Ahorro...",
"workspace.providers.save": "Ahorrar",
"workspace.providers.table.provider": "Proveedor",
"workspace.providers.table.apiKey": "Clave API",
"workspace.usage.title": "Historial de uso",
"workspace.usage.subtitle": "Uso y costos recientes de API.",
"workspace.usage.empty": "Realice su primera llamada API para comenzar.",
"workspace.usage.table.date": "Fecha",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Aporte",
"workspace.usage.table.output": "Producción",
"workspace.usage.table.cost": "Costo",
"workspace.usage.breakdown.input": "Aporte",
"workspace.usage.breakdown.cacheRead": "Lectura de caché",
"workspace.usage.breakdown.cacheWrite": "Escritura en caché",
"workspace.usage.breakdown.output": "Producción",
"workspace.usage.breakdown.reasoning": "Razonamiento",
"workspace.usage.subscription": "suscripción (${{amount}})",
"workspace.cost.title": "Costo",
"workspace.cost.subtitle": "Costes de uso desglosados por modelo.",
"workspace.cost.allModels": "Todos los modelos",
"workspace.cost.allKeys": "Todas las claves",
"workspace.cost.deletedSuffix": "(eliminado)",
"workspace.cost.empty": "No hay datos de uso disponibles para el período seleccionado.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API claves",
"workspace.keys.subtitle": "Administre sus claves API para acceder a los servicios opencode.",
"workspace.keys.create": "Crear clave API",
"workspace.keys.placeholder": "Introduzca el nombre de la clave",
"workspace.keys.empty": "Cree una clave opencode de puerta de enlace API",
"workspace.keys.table.name": "Nombre",
"workspace.keys.table.key": "Llave",
"workspace.keys.table.createdBy": "Creado por",
"workspace.keys.table.lastUsed": "Usado por última vez",
"workspace.keys.copyApiKey": "Copiar la clave API",
"workspace.keys.delete": "Borrar",
"workspace.members.title": "Miembros",
"workspace.members.subtitle": "Administre los miembros del espacio de trabajo y sus permisos.",
"workspace.members.invite": "Invitar miembro",
"workspace.members.inviting": "Atractivo...",
"workspace.members.beta.beforeLink":
"Los espacios de trabajo son gratuitos para los equipos durante la versión beta.",
"workspace.members.form.invitee": "invitado",
"workspace.members.form.emailPlaceholder": "Ingrese el correo electrónico",
"workspace.members.form.role": "Role",
"workspace.members.form.monthlyLimit": "Límite de gasto mensual",
"workspace.members.noLimit": "Sin límite",
"workspace.members.noLimitLowercase": "sin limite",
"workspace.members.invited": "invitado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Borrar",
"workspace.members.saving": "Ahorro...",
"workspace.members.save": "Ahorrar",
"workspace.members.table.email": "Correo electrónico",
"workspace.members.table.role": "Role",
"workspace.members.table.monthLimit": "Límite de meses",
"workspace.members.role.admin": "Administración",
"workspace.members.role.adminDescription": "Puede gestionar modelos, miembros y facturación.",
"workspace.members.role.member": "Miembro",
"workspace.members.role.memberDescription": "Solo pueden generar claves API para ellos mismos",
"workspace.settings.title": "Ajustes",
"workspace.settings.subtitle": "Actualice el nombre y las preferencias de su espacio de trabajo.",
"workspace.settings.workspaceName": "Nombre del espacio de trabajo",
"workspace.settings.defaultName": "Por defecto",
"workspace.settings.updating": "Actualizando...",
"workspace.settings.save": "Ahorrar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Facturación",
"workspace.billing.subtitle.beforeLink": "Administrar métodos de pago.",
"workspace.billing.contactUs": "Contáctenos",
"workspace.billing.subtitle.afterLink": "si tienes alguna pregunta.",
"workspace.billing.currentBalance": "Saldo actual",
"workspace.billing.add": "Agregar $",
"workspace.billing.enterAmount": "Ingrese la cantidad",
"workspace.billing.loading": "Cargando...",
"workspace.billing.addAction": "Agregar",
"workspace.billing.addBalance": "Agregar saldo",
"workspace.billing.linkedToStripe": "Vinculado a Stripe",
"workspace.billing.manage": "Administrar",
"workspace.billing.enable": "Habilitar facturación",
"workspace.monthlyLimit.title": "Límite mensual",
"workspace.monthlyLimit.subtitle": "Establezca un límite de uso mensual para su cuenta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Configuración...",
"workspace.monthlyLimit.set": "Colocar",
"workspace.monthlyLimit.edit": "Editar límite",
"workspace.monthlyLimit.noLimit": "No se ha establecido ningún límite de uso.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso actual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "es $",
"workspace.reload.title": "Recarga automática",
"workspace.reload.disabled.before": "La recarga automática es",
"workspace.reload.disabled.state": "desactivado",
"workspace.reload.disabled.after": "Habilite la recarga automática cuando el saldo sea bajo.",
"workspace.reload.enabled.before": "La recarga automática es",
"workspace.reload.enabled.state": "activado",
"workspace.reload.enabled.middle": "vamos a recargar",
"workspace.reload.processingFee": "tarifa de procesamiento",
"workspace.reload.enabled.after": "cuando el saldo llega",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Permitir",
"workspace.reload.enableAutoReload": "Habilitar recarga automática",
"workspace.reload.reloadAmount": "Recargar $",
"workspace.reload.whenBalanceReaches": "Cuando el saldo llega a $",
"workspace.reload.saving": "Ahorro...",
"workspace.reload.save": "Ahorrar",
"workspace.reload.failedAt": "La recarga falló en",
"workspace.reload.reason": "Razón:",
"workspace.reload.updatePaymentMethod": "Actualice su método de pago e inténtelo nuevamente.",
"workspace.reload.retrying": "Reintentando...",
"workspace.reload.retry": "Rever",
"workspace.payments.title": "Historial de pagos",
"workspace.payments.subtitle": "Transacciones de pago recientes.",
"workspace.payments.table.date": "Fecha",
"workspace.payments.table.paymentId": "ID de pago",
"workspace.payments.table.amount": "Cantidad",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "suscripción",
"workspace.payments.view": "Vista",
"workspace.black.loading": "Cargando...",
"workspace.black.time.day": "día",
"workspace.black.time.days": "días",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "unos segundos",
"workspace.black.subscription.title": "Suscripción",
"workspace.black.subscription.message": "Estás suscrito a OpenCode Black por ${{plan}} al mes.",
"workspace.black.subscription.manage": "Administrar suscripción",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso semanal",
"workspace.black.subscription.resetsIn": "Se reinicia en",
"workspace.black.subscription.useBalance": "Utilice su saldo disponible después de alcanzar los límites de uso",
"workspace.black.waitlist.title": "Lista de espera",
"workspace.black.waitlist.joined": "Estás en la lista de espera para el plan Black de ${{plan}} por mes OpenCode.",
"workspace.black.waitlist.ready": "Estamos listos para inscribirlo en el plan Black de ${{plan}} por mes OpenCode.",
"workspace.black.waitlist.leave": "Salir de la lista de espera",
"workspace.black.waitlist.leaving": "Partida...",
"workspace.black.waitlist.left": "Izquierda",
"workspace.black.waitlist.enroll": "Inscribirse",
"workspace.black.waitlist.enrolling": "Inscribiéndose...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Cuando hace clic en Inscribirse, su suscripción comienza inmediatamente y se cargará en su tarjeta.",
} satisfies Dict
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agente",
"bench.list.table.model": "Modelo",
"bench.list.table.score": "Puntuación",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tarea no encontrada",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agente",
"bench.detail.labels.model": "Modelo",
"bench.detail.labels.task": "Tarea",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "A",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Duración Promedio",
"bench.detail.labels.averageScore": "Puntuación Promedio",
"bench.detail.labels.averageCost": "Costo Promedio",
"bench.detail.labels.summary": "Resumen",
"bench.detail.labels.runs": "Ejecuciones",
"bench.detail.labels.score": "Puntuación",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalización",
"bench.detail.labels.weight": "peso",
"bench.detail.table.run": "Ejecución",
"bench.detail.table.score": "Puntuación (Base - Penalización)",
"bench.detail.table.cost": "Costo",
"bench.detail.table.duration": "Duración",
"bench.detail.run.title": "Ejecución {{n}}",
"bench.detail.rawJson": "JSON Crudo",
} as const satisfies Dict

View File

@@ -27,360 +27,370 @@ export const dict = {
"footer.x": "X",
"legal.brand": "Marque",
"legal.privacy": "Confidentialite",
"legal.privacy": "Confidentialité",
"legal.terms": "Conditions",
"email.title": "Soyez le premier a etre informe lorsque nous sortons de nouveaux produits",
"email.subtitle": "Inscrivez-vous a la liste d'attente pour un acces anticipe.",
"email.title": "Soyez le premier à être informé de nos nouveaux produits",
"email.subtitle": "Inscrivez-vous à la liste d'attente pour un accès anticipé.",
"email.placeholder": "Adresse e-mail",
"email.subscribe": "S'abonner",
"email.success": "Presque termine - verifiez votre boite de reception et confirmez votre adresse e-mail",
"email.success": "Presque terminé - vérifiez votre boîte de réception et confirmez votre adresse e-mail",
"notFound.title": "Introuvable | opencode",
"notFound.title": "Introuvable | OpenCode",
"notFound.heading": "404 - Page introuvable",
"notFound.home": "Accueil",
"notFound.docs": "Documentation",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"user.logout": "Se deconnecter",
"user.logout": "Se déconnecter",
"workspace.select": "Choisir un espace de travail",
"workspace.createNew": "+ Creer un nouvel espace",
"workspace.modal.title": "Creer un nouvel espace",
"workspace.select": "Sélectionner un espace de travail",
"workspace.createNew": "+ Créer un nouvel espace",
"workspace.modal.title": "Créer un nouvel espace",
"workspace.modal.placeholder": "Saisir le nom de l'espace",
"common.cancel": "Annuler",
"common.creating": "Creation...",
"common.create": "Creer",
"common.creating": "Création...",
"common.create": "Créer",
"common.videoUnsupported": "Votre navigateur ne prend pas en charge la balise video.",
"common.videoUnsupported": "Votre navigateur ne prend pas en charge la balise vidéo.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "En savoir plus",
"error.invalidPlan": "Forfait invalide",
"error.workspaceRequired": "L'ID de l'espace de travail est requis",
"error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
"error.limitRequired": "La limite est requise.",
"error.monthlyLimitInvalid": "Définissez une limite mensuelle valide.",
"error.workspaceNameRequired": "Le nom de l'espace de travail est requis.",
"error.nameTooLong": "Le nom doit comporter 255 caractères ou moins.",
"error.emailRequired": "L'e-mail est requis",
"error.roleRequired": "Le rôle est requis",
"error.idRequired": "L'ID est requis",
"error.nameRequired": "Le nom est requis",
"error.providerRequired": "Le fournisseur est requis",
"error.apiKeyRequired": "La clé API est requise",
"error.modelRequired": "Le modèle est requis",
"error.reloadAmountMin": "Le montant de recharge doit être d'au moins {{amount}} $",
"error.reloadTriggerMin": "Le seuil de déclenchement doit être d'au moins {{amount}} $",
"home.title": "OpenCode | L'agent de code IA open source",
"temp.title": "OpenCode | Agent de code IA conçu pour le terminal",
"temp.hero.title": "L'agent de code IA conçu pour le terminal",
"temp.zen": "OpenCode Zen",
"temp.getStarted": "Commencer",
"temp.feature.native.title": "TUI Native",
"temp.feature.native.body": "Une interface terminal native, réactive et thémable",
"temp.feature.zen.beforeLink": "Une",
"temp.feature.zen.link": "liste organisée de modèles",
"temp.feature.zen.afterLink": "fournie par OpenCode",
"temp.feature.models.beforeLink": "Prend en charge plus de 75 fournisseurs LLM via",
"temp.feature.models.afterLink": ", y compris les modèles locaux",
"temp.screenshot.caption": "OpenCode TUI avec le thème tokyonight",
"temp.screenshot.alt": "OpenCode TUI avec le thème tokyonight",
"home.banner.badge": "Nouveau",
"home.banner.text": "Application desktop disponible en beta",
"home.banner.text": "Application desktop disponible en bêta",
"home.banner.platforms": "sur macOS, Windows et Linux",
"home.banner.downloadNow": "Telecharger maintenant",
"home.banner.downloadBetaNow": "Telecharger la beta desktop maintenant",
"home.banner.downloadNow": "Télécharger maintenant",
"home.banner.downloadBetaNow": "Télécharger la bêta desktop maintenant",
"home.hero.title": "L'agent de code IA open source",
"home.hero.subtitle.a":
"Modeles gratuits inclus ou connectez n'importe quel modele depuis n'importe quel fournisseur,",
"Modèles gratuits inclus ou connectez n'importe quel modèle depuis n'importe quel fournisseur,",
"home.hero.subtitle.b": "dont Claude, GPT, Gemini et plus.",
"home.install.ariaLabel": "Options d'installation",
"home.what.title": "Qu'est-ce que OpenCode?",
"home.what.title": "Qu'est-ce que OpenCode ?",
"home.what.body":
"OpenCode est un agent open source qui vous aide a ecrire du code dans votre terminal, IDE ou desktop.",
"home.what.lsp.title": "LSP active",
"OpenCode est un agent open source qui vous aide à écrire du code dans votre terminal, IDE ou desktop.",
"home.what.lsp.title": "LSP activé",
"home.what.lsp.body": "Charge automatiquement les bons LSP pour le LLM",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Lancez plusieurs agents en parallele sur le meme projet",
"home.what.multiSession.body": "Lancez plusieurs agents en parallèle sur le même projet",
"home.what.shareLinks.title": "Liens de partage",
"home.what.shareLinks.body": "Partagez un lien vers n'importe quelle session pour reference ou debug",
"home.what.shareLinks.body": "Partagez un lien vers n'importe quelle session pour référence ou debug",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Connectez-vous avec GitHub pour utiliser votre compte Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Connectez-vous avec OpenAI pour utiliser votre compte ChatGPT Plus ou Pro",
"home.what.anyModel.title": "N'importe quel modele",
"home.what.anyModel.body": "75+ fournisseurs de LLM via Models.dev, y compris des modeles locaux",
"home.what.anyEditor.title": "N'importe quel editeur",
"home.what.anyModel.title": "N'importe quel modèle",
"home.what.anyModel.body": "75+ fournisseurs de LLM via Models.dev, y compris des modèles locaux",
"home.what.anyEditor.title": "N'importe quel éditeur",
"home.what.anyEditor.body": "Disponible en interface terminal, application desktop et extension IDE",
"home.what.readDocs": "Lire la doc",
"home.growth.title": "L'agent de code IA open source",
"home.growth.body":
"Avec plus de <strong>{{stars}}</strong> etoiles sur GitHub, <strong>{{contributors}}</strong> contributeurs et plus de <strong>{{commits}}</strong> commits, OpenCode est utilise et approuve par plus de <strong>{{monthlyUsers}}</strong> developpeurs chaque mois.",
"home.growth.githubStars": "Etoiles GitHub",
"Avec plus de <strong>{{stars}}</strong> étoiles sur GitHub, <strong>{{contributors}}</strong> contributeurs et plus de <strong>{{commits}}</strong> commits, OpenCode est utilisé et approuvé par plus de <strong>{{monthlyUsers}}</strong> développeurs chaque mois.",
"home.growth.githubStars": "Étoiles GitHub",
"home.growth.contributors": "Contributeurs",
"home.growth.monthlyDevs": "Devs mensuels",
"home.privacy.title": "Concu pour la confidentialite",
"home.privacy.title": "Conçu pour la confidentialité",
"home.privacy.body":
"OpenCode ne stocke ni votre code ni vos donnees de contexte, afin de pouvoir fonctionner dans des environnements sensibles a la confidentialite.",
"OpenCode ne stocke ni votre code ni vos données de contexte, afin de pouvoir fonctionner dans des environnements sensibles à la confidentialité.",
"home.privacy.learnMore": "En savoir plus sur",
"home.privacy.link": "la confidentialite",
"home.privacy.link": "la confidentialité",
"home.faq.q1": "Qu'est-ce que OpenCode?",
"home.faq.q1": "Qu'est-ce que OpenCode ?",
"home.faq.a1":
"OpenCode est un agent open source qui vous aide a ecrire et executer du code avec n'importe quel modele d'IA. Il est disponible en interface terminal, application desktop ou extension IDE.",
"home.faq.q2": "Comment utiliser OpenCode?",
"OpenCode est un agent open source qui vous aide à écrire et exécuter du code avec n'importe quel modèle d'IA. Il est disponible en interface terminal, application desktop ou extension IDE.",
"home.faq.q2": "Comment utiliser OpenCode ?",
"home.faq.a2.before": "Le moyen le plus simple de commencer est de lire l'",
"home.faq.a2.link": "intro",
"home.faq.q3": "Ai-je besoin d'abonnements IA supplementaires pour utiliser OpenCode?",
"home.faq.q3": "Ai-je besoin d'abonnements IA supplémentaires pour utiliser OpenCode ?",
"home.faq.a3.p1":
"Pas forcement: OpenCode propose des modeles gratuits que vous pouvez utiliser sans creer de compte.",
"home.faq.a3.p2.beforeZen": "En plus, vous pouvez utiliser des modeles populaires pour le code en creant un compte",
"Pas forcément : OpenCode propose des modèles gratuits que vous pouvez utiliser sans créer de compte.",
"home.faq.a3.p2.beforeZen": "En plus, vous pouvez utiliser des modèles populaires pour le code en créant un compte",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Nous encourageons l'utilisation de Zen, mais OpenCode fonctionne aussi avec les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
"home.faq.a3.p4.beforeLocal": "Vous pouvez meme connecter vos",
"home.faq.a3.p4.localLink": "modeles locaux",
"home.faq.q4": "Puis-je utiliser mes abonnements IA existants avec OpenCode?",
"home.faq.a3.p4.beforeLocal": "Vous pouvez même connecter vos",
"home.faq.a3.p4.localLink": "modèles locaux",
"home.faq.q4": "Puis-je utiliser mes abonnements IA existants avec OpenCode ?",
"home.faq.a4.p1":
"Oui, OpenCode prend en charge les abonnements des principaux fournisseurs. Vous pouvez utiliser Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
"home.faq.q5": "Puis-je utiliser OpenCode uniquement dans le terminal?",
"home.faq.a5.beforeDesktop": "Plus maintenant! OpenCode est desormais disponible en application pour",
"home.faq.q5": "Puis-je utiliser OpenCode uniquement dans le terminal ?",
"home.faq.a5.beforeDesktop": "Plus maintenant ! OpenCode est désormais disponible en application pour",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "et",
"home.faq.a5.web": "web",
"home.faq.q6": "Combien coute OpenCode?",
"home.faq.q6": "Combien coûte OpenCode ?",
"home.faq.a6":
"OpenCode est 100% gratuit. Il inclut aussi des modeles gratuits. Des couts supplementaires peuvent s'appliquer si vous connectez un autre fournisseur.",
"home.faq.q7": "Qu'en est-il des donnees et de la confidentialite?",
"OpenCode est 100% gratuit. Il inclut aussi des modèles gratuits. Des coûts supplémentaires peuvent s'appliquer si vous connectez un autre fournisseur.",
"home.faq.q7": "Qu'en est-il des données et de la confidentialité ?",
"home.faq.a7.p1":
"Vos donnees ne sont stockees que lorsque vous utilisez nos modeles gratuits ou creez des liens partageables.",
"Vos données ne sont stockées que lorsque vous utilisez nos modèles gratuits ou créez des liens partageables.",
"home.faq.a7.p2.beforeModels": "En savoir plus sur",
"home.faq.a7.p2.modelsLink": "nos modeles",
"home.faq.a7.p2.modelsLink": "nos modèles",
"home.faq.a7.p2.and": "et",
"home.faq.a7.p2.shareLink": "les pages de partage",
"home.faq.q8": "OpenCode est-il open source?",
"home.faq.a8.p1": "Oui, OpenCode est entierement open source. Le code source est public sur",
"home.faq.q8": "OpenCode est-il open source ?",
"home.faq.a8.p1": "Oui, OpenCode est entièrement open source. Le code source est public sur",
"home.faq.a8.p2": "sous la",
"home.faq.a8.mitLicense": "Licence MIT",
"home.faq.a8.p3":
", ce qui signifie que tout le monde peut l'utiliser, le modifier ou contribuer a son developpement. Toute personne de la communaute peut ouvrir des issues, soumettre des pull requests et etendre les fonctionnalites.",
", ce qui signifie que tout le monde peut l'utiliser, le modifier ou contribuer à son développement. Toute personne de la communauté peut ouvrir des tickets, soumettre des pull requests et étendre les fonctionnalités.",
"home.zenCta.title": "Accedez a des modeles fiables et optimises pour les agents de code",
"home.zenCta.title": "Accédez à des modèles fiables et optimisés pour les agents de code",
"home.zenCta.body":
"Zen vous donne acces a un ensemble selectionne de modeles d'IA que OpenCode a testes et benchmarkes specifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualite selon les fournisseurs: utilisez des modeles valides qui fonctionnent.",
"Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
"home.zenCta.link": "En savoir plus sur Zen",
"download.title": "OpenCode | Telechargement",
"zen.title": "OpenCode Zen | Un ensemble selectionne de modeles fiables et optimises pour les agents de code",
"zen.hero.title": "Accedez a des modeles fiables et optimises pour les agents de code",
"zen.title": "OpenCode Zen | Un ensemble sélectionné de modèles fiables et optimisés pour les agents de code",
"zen.hero.title": "Modèles fiables et optimisés pour les agents de code",
"zen.hero.body":
"Zen vous donne acces a un ensemble selectionne de modeles d'IA que OpenCode a testes et benchmarkes specifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualite selon les fournisseurs: utilisez des modeles valides qui fonctionnent.",
"Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
"zen.faq.q1": "Qu'est-ce que OpenCode Zen?",
"zen.faq.q1": "Qu'est-ce que OpenCode Zen ?",
"zen.faq.a1":
"Zen est un ensemble selectionne de modeles d'IA testes et benchmarkes pour les agents de code, cree par l'equipe derriere OpenCode.",
"zen.faq.q2": "Qu'est-ce qui rend Zen plus precis?",
"Zen est un ensemble sélectionné de modèles d'IA testés et benchmarkés pour les agents de code, créé par l'équipe derrière OpenCode.",
"zen.faq.q2": "Qu'est-ce qui rend Zen plus précis ?",
"zen.faq.a2":
"Zen ne propose que des modeles testes et benchmarkes specifiquement pour les agents de code. Vous n'utiliseriez pas un couteau a beurre pour couper un steak; n'utilisez pas de mauvais modeles pour coder.",
"zen.faq.q3": "Zen est-il moins cher?",
"Zen ne propose que des modèles testés et benchmarkés spécifiquement pour les agents de code. Vous n'utiliseriez pas un couteau à beurre pour couper un steak ; n'utilisez pas de mauvais modèles pour coder.",
"zen.faq.q3": "Zen est-il moins cher ?",
"zen.faq.a3":
"Zen n'est pas a but lucratif. Zen vous facture au prix coutant des fournisseurs de modeles. Plus Zen est utilise, plus OpenCode peut negocier de meilleurs tarifs et vous les repercuter.",
"zen.faq.q4": "Combien coute Zen?",
"Zen n'est pas à but lucratif. Zen vous facture au prix coûtant des fournisseurs de modèles. Plus Zen est utilisé, plus OpenCode peut négocier de meilleurs tarifs et vous les répercuter.",
"zen.faq.q4": "Combien coûte Zen ?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "facture par requete",
"zen.faq.a4.p1.afterPricing": "sans marge, vous payez donc exactement ce que facture le fournisseur du modele.",
"zen.faq.a4.p1.pricingLink": "facture par requête",
"zen.faq.a4.p1.afterPricing": "sans marge, vous payez donc exactement ce que facture le fournisseur du modèle.",
"zen.faq.a4.p2.beforeAccount":
"Votre cout total depend de l'usage, et vous pouvez definir des limites de depense mensuelles dans votre",
"Votre coût total dépend de l'usage, et vous pouvez définir des limites de dépense mensuelles dans votre",
"zen.faq.a4.p2.accountLink": "compte",
"zen.faq.a4.p3":
"Pour couvrir les frais, OpenCode ajoute uniquement de petits frais de traitement de paiement de $1.23 par recharge de $20.",
"zen.faq.q5": "Et pour les donnees et la confidentialite?",
"Pour couvrir les coûts, OpenCode ajoute uniquement de petits frais de traitement de paiement de 1,23 $ par recharge de 20 $.",
"zen.faq.q5": "Et pour les données et la confidentialité ?",
"zen.faq.a5.beforeExceptions":
"Tous les modeles Zen sont heberges aux Etats-Unis. Les fournisseurs appliquent une politique de zero retention et n'utilisent pas vos donnees pour l'entrainement des modeles, avec les",
"Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs appliquent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"zen.faq.a5.exceptionsLink": "exceptions suivantes",
"zen.faq.q6": "Puis-je definir des limites de depense?",
"zen.faq.a6": "Oui, vous pouvez definir des limites de depense mensuelles dans votre compte.",
"zen.faq.q7": "Puis-je annuler?",
"zen.faq.a7": "Oui, vous pouvez desactiver la facturation a tout moment et utiliser votre solde restant.",
"zen.faq.q8": "Puis-je utiliser Zen avec d'autres agents de code?",
"zen.faq.q6": "Puis-je définir des limites de dépense ?",
"zen.faq.a6": "Oui, vous pouvez définir des limites de dépense mensuelles dans votre compte.",
"zen.faq.q7": "Puis-je annuler ?",
"zen.faq.a7": "Oui, vous pouvez désactiver la facturation à tout moment et utiliser votre solde restant.",
"zen.faq.q8": "Puis-je utiliser Zen avec d'autres agents de code ?",
"zen.faq.a8":
"Zen fonctionne tres bien avec OpenCode, mais vous pouvez utiliser Zen avec n'importe quel agent. Suivez les instructions de configuration dans votre agent prefere.",
"Zen fonctionne très bien avec OpenCode, mais vous pouvez utiliser Zen avec n'importe quel agent. Suivez les instructions de configuration dans votre agent préféré.",
"zen.cta.start": "Commencez avec Zen",
"zen.pricing.title": "Ajoutez 20 $ de solde Pay as you go",
"zen.pricing.fee": "(+1,23 $ de frais de traitement de carte)",
"zen.pricing.body":
"À utiliser avec n'importe quel agent. Fixez des limites de dépenses mensuelles. Annulez à tout moment.",
"Utilisez avec n'importe quel agent. Fixez des limites de dépenses mensuelles. Annulez à tout moment.",
"zen.problem.title": "Quel problème Zen résout-il ?",
"zen.problem.body":
"Il existe de nombreux modèles disponibles, mais seuls quelques-uns fonctionnent bien avec les agents de codage. La plupart des fournisseurs les configurent différemment avec des résultats variables.",
"Il existe de nombreux modèles disponibles, mais seuls quelques-uns fonctionnent bien avec les agents de code. La plupart des fournisseurs les configurent différemment avec des résultats variables.",
"zen.problem.subtitle":
"Nous résolvons ce problème pour tout le monde, pas seulement pour les utilisateurs de OpenCode.",
"zen.problem.item1": "Tester les modèles sélectionnés et consulter leurs équipes",
"zen.problem.item2": "Travailler avec les fournisseurs pour garantir qu'ils sont livrés correctement",
"zen.problem.item3": "Analyse comparative de toutes les combinaisons modèle-fournisseur que nous recommandons",
"zen.problem.item1": "Test des modèles sélectionnés et consultation de leurs équipes",
"zen.problem.item2": "Collaboration avec les fournisseurs pour garantir une livraison correcte",
"zen.problem.item3": "Benchmark de toutes les combinaisons modèle-fournisseur que nous recommandons",
"zen.how.title": "Comment fonctionne Zen",
"zen.how.body":
"Bien que nous vous suggérions d'utiliser Zen avec OpenCode, vous pouvez utiliser Zen avec n'importe quel agent.",
"zen.how.step1.title": "Inscrivez-vous et ajoutez un solde de 20 $",
"zen.how.step1.beforeLink": "suivre le",
"zen.how.step1.beforeLink": "suivez les",
"zen.how.step1.link": "instructions de configuration",
"zen.how.step2.title": "Utilisez Zen avec une tarification transparente",
"zen.how.step2.link": "payer par demande",
"zen.how.step2.afterLink": "avec zéro majoration",
"zen.how.step2.link": "payez par requête",
"zen.how.step2.afterLink": "sans marge",
"zen.how.step3.title": "Recharge automatique",
"zen.how.step3.body": "lorsque votre solde atteint 5 $, nous ajouterons automatiquement 20 $",
"zen.privacy.title": "Votre vie privée est importante pour nous",
"zen.privacy.beforeExceptions":
"Tous les modèles Zen 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 la formation de modèles, avec le",
"Tous les modèles Zen 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",
"zen.privacy.exceptionsLink": "exceptions suivantes",
"download.meta.description": "Telechargez OpenCode pour macOS, Windows et Linux",
"download.hero.title": "Telecharger OpenCode",
"download.hero.subtitle": "Disponible en beta pour macOS, Windows et Linux",
"download.hero.button": "Telecharger pour {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Extensions OpenCode",
"download.section.integrations": "Integrations OpenCode",
"download.action.download": "Telecharger",
"download.action.install": "Installer",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"black.meta.title": "OpenCode Black | Accédez aux meilleurs modèles de code au monde",
"black.meta.description": "Accédez à Claude, GPT, Gemini et plus avec les forfaits d'abonnement OpenCode Black.",
"black.hero.title": "Accédez aux meilleurs modèles de code au monde",
"black.hero.subtitle": "Y compris Claude, GPT, Gemini et plus",
"black.title": "OpenCode Black | Tarification",
"black.plan.icon20": "Forfait Black 20",
"black.plan.icon100": "Forfait Black 100",
"black.plan.icon200": "Forfait Black 200",
"black.plan.multiplier100": "5x plus d'utilisation que Black 20",
"black.plan.multiplier200": "20x plus d'utilisation que Black 20",
"black.price.perMonth": "par mois",
"black.price.perPersonBilledMonthly": "par personne facturé mensuellement",
"black.terms.1": "Votre abonnement ne commencera pas immédiatement",
"black.terms.2": "Vous serez ajouté à la liste d'attente et activé bientôt",
"black.terms.3": "Votre carte ne sera débitée que lorsque votre abonnement sera activé",
"black.terms.4":
"Des limites d'utilisation s'appliquent, une utilisation fortement automatisée peut atteindre les limites plus tôt",
"black.terms.5": "Les abonnements sont pour les individus, contactez Enterprise pour les équipes",
"black.terms.6": "Les limites peuvent être ajustées et les forfaits peuvent être interrompus à l'avenir",
"black.terms.7": "Annulez votre abonnement à tout moment",
"black.action.continue": "Continuer",
"black.finePrint.beforeTerms": "Les prix affichés n'incluent pas les taxes applicables",
"black.finePrint.terms": "Conditions d'utilisation",
"black.workspace.title": "OpenCode Black | Sélectionner un espace de travail",
"black.workspace.selectPlan": "Sélectionnez un espace de travail pour ce forfait",
"black.workspace.name": "Espace de travail {{n}}",
"black.subscribe.title": "S'abonner à OpenCode Black",
"black.subscribe.paymentMethod": "Méthode de paiement",
"black.subscribe.loadingPaymentForm": "Chargement du formulaire de paiement...",
"black.subscribe.selectWorkspaceToContinue": "Sélectionnez un espace de travail pour continuer",
"black.subscribe.failurePrefix": "Oh oh !",
"black.subscribe.error.generic": "Une erreur est survenue",
"black.subscribe.error.invalidPlan": "Forfait invalide",
"black.subscribe.error.workspaceRequired": "L'ID de l'espace de travail est requis",
"black.subscribe.error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
"black.subscribe.processing": "Traitement...",
"black.subscribe.submit": "S'abonner ${{plan}}",
"black.subscribe.form.chargeNotice": "Vous ne serez débité que lorsque votre abonnement sera activé",
"black.subscribe.success.title": "Vous êtes sur la liste d'attente OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Forfait d'abonnement",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Montant",
"black.subscribe.success.amountValue": "{{plan}} $ par mois",
"black.subscribe.success.paymentMethod": "Méthode de paiement",
"black.subscribe.success.dateJoined": "Date d'inscription",
"black.subscribe.success.chargeNotice": "Votre carte sera débitée lorsque votre abonnement sera activé",
"download.faq.a3.beforeLocal":
"Pas forcement, mais probablement. Vous aurez besoin d'un abonnement IA si vous voulez connecter OpenCode a un fournisseur payant, mais vous pouvez travailler avec",
"download.faq.a3.localLink": "des modeles locaux",
"download.faq.a3.afterLocal.beforeZen": "gratuitement. Meme si nous encourageons les utilisateurs a utiliser",
"download.faq.a3.afterZen":
", OpenCode fonctionne avec tous les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
"download.faq.a5.p1": "OpenCode est 100% gratuit a utiliser.",
"download.faq.a5.p2.beforeZen":
"Les couts supplementaires viendront de votre abonnement a un fournisseur de modele. Meme si OpenCode fonctionne avec n'importe quel fournisseur, nous recommandons d'utiliser",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"Vos donnees et informations ne sont stockees que lorsque vous creez des liens partageables dans OpenCode.",
"download.faq.a6.p2.beforeShare": "En savoir plus sur",
"download.faq.a6.shareLink": "les pages de partage",
"enterprise.title": "OpenCode | Solutions entreprise pour votre organisation",
"enterprise.meta.description": "Contactez OpenCode pour des solutions entreprise",
"enterprise.hero.title": "Votre code vous appartient",
"enterprise.hero.body1":
"OpenCode fonctionne de maniere securisee au sein de votre organisation, sans stocker de donnees ni de contexte, et sans restrictions de licence ni revendications de propriete. Demarrez un essai avec votre equipe, puis deployeez-le dans votre organisation en l'integrant a votre SSO et a votre passerelle IA interne.",
"enterprise.hero.body2": "Dites-nous comment nous pouvons vous aider.",
"enterprise.form.name.label": "Nom complet",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Poste",
"enterprise.form.role.placeholder": "President executif",
"enterprise.form.email.label": "E-mail professionnel",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Quel probleme essayez-vous de resoudre?",
"enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...",
"enterprise.form.send": "Envoyer",
"enterprise.form.sending": "Envoi...",
"enterprise.form.success": "Message envoye, nous vous contacterons bientot.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Qu'est-ce que OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise s'adresse aux organisations qui veulent s'assurer que leur code et leurs donnees ne quittent jamais leur infrastructure. Cela est possible grace a une configuration centralisee qui s'integre a votre SSO et a votre passerelle IA/LLM interne.",
"enterprise.faq.q2": "Comment demarrer avec OpenCode Enterprise?",
"enterprise.faq.a2":
"Commencez simplement par un essai interne avec votre equipe. Par defaut, OpenCode ne stocke pas votre code ni vos donnees de contexte, ce qui facilite la prise en main. Ensuite, contactez-nous pour discuter des tarifs et des options de mise en oeuvre.",
"enterprise.faq.q3": "Comment fonctionne la tarification entreprise?",
"enterprise.faq.a3":
"Nous proposons une tarification entreprise par siege. Si vous avez votre propre passerelle LLM, nous ne facturons pas les tokens utilises. Pour plus de details, contactez-nous pour un devis sur mesure en fonction des besoins de votre organisation.",
"enterprise.faq.q4": "Mes donnees sont-elles securisees avec OpenCode Enterprise?",
"enterprise.faq.a4":
"Oui. OpenCode ne stocke pas votre code ni vos donnees de contexte. Tout le traitement se fait localement ou via des appels API directs vers votre fournisseur d'IA. Avec une configuration centralisee et une integration SSO, vos donnees restent securisees au sein de votre infrastructure.",
"brand.title": "OpenCode | Marque",
"brand.meta.description": "Guide de marque OpenCode",
"brand.heading": "Guide de marque",
"brand.subtitle": "Ressources et elements pour vous aider a utiliser la marque OpenCode.",
"brand.downloadAll": "Telecharger tous les assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Notes de version et changelog d'OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nouvelles mises a jour et ameliorations pour OpenCode",
"changelog.empty": "Aucune entree de changelog trouvee.",
"changelog.viewJson": "Voir le JSON",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "Clés API",
"workspace.nav.members": "Membres",
"workspace.nav.billing": "Facturation",
"workspace.nav.settings": "Paramètres",
"workspace.home.banner.beforeLink": "Modèles optimisés fiables pour les agents de codage.",
"workspace.home.banner.beforeLink": "Modèles optimisés fiables pour les agents de code.",
"workspace.home.billing.loading": "Chargement...",
"workspace.home.billing.enable": "Activer la facturation",
"workspace.home.billing.currentBalance": "Solde courant",
"workspace.home.billing.currentBalance": "Solde actuel",
"workspace.newUser.feature.tested.title": "Modèles testés et vérifiés",
"workspace.newUser.feature.tested.body":
"Nous avons comparé et testé des modèles spécifiquement pour les agents de codage afin de garantir les meilleures performances.",
"Nous avons benchmarké et testé des modèles spécifiquement pour les agents de code afin de garantir les meilleures performances.",
"workspace.newUser.feature.quality.title": "La plus haute qualité",
"workspace.newUser.feature.quality.body":
"Modèles d'accès configurés pour des performances optimales - pas de rétrogradation ni de routage vers des fournisseurs moins chers.",
"Accédez à des modèles configurés pour des performances optimales - pas de rétrogradation ni de routage vers des fournisseurs moins chers.",
"workspace.newUser.feature.lockin.title": "Pas de verrouillage",
"workspace.newUser.feature.lockin.body":
"Utilisez Zen avec n'importe quel agent de codage et continuez à utiliser d'autres fournisseurs avec opencode quand vous le souhaitez.",
"Utilisez Zen avec n'importe quel agent de code et continuez à utiliser d'autres fournisseurs avec OpenCode quand vous le souhaitez.",
"workspace.newUser.copyApiKey": "Copier la clé API",
"workspace.newUser.copyKey": "Copier la clé",
"workspace.newUser.copied": "Copié!",
"workspace.newUser.copied": "Copié !",
"workspace.newUser.step.enableBilling": "Activer la facturation",
"workspace.newUser.step.login.before": "Courir",
"workspace.newUser.step.login.after": "et sélectionnez opencode",
"workspace.newUser.step.login.before": "Exécuter",
"workspace.newUser.step.login.after": "et sélectionnez OpenCode",
"workspace.newUser.step.pasteKey": "Collez votre clé API",
"workspace.newUser.step.models.before": "Démarrez opencode et exécutez",
"workspace.newUser.step.models.before": "Démarrez OpenCode et exécutez",
"workspace.newUser.step.models.after": "pour sélectionner un modèle",
"workspace.models.title": "Modèles",
"workspace.models.subtitle.beforeLink":
"Gérez les modèles auxquels les membres de lespace de travail peuvent accéder.",
"Gérez les modèles auxquels les membres de l'espace de travail peuvent accéder.",
"workspace.models.table.model": "Modèle",
"workspace.models.table.enabled": "Activé",
"workspace.providers.title": "Apportez votre propre clé",
"workspace.providers.subtitle": "Configurez vos propres clés API auprès des fournisseurs d'IA.",
"workspace.providers.placeholder": "Entrez la clé {{provider}} API ({{prefix}}...)",
"workspace.providers.placeholder": "Entrez la clé API {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurer",
"workspace.providers.edit": "Modifier",
"workspace.providers.delete": "Supprimer",
"workspace.providers.saving": "Économie...",
"workspace.providers.save": "Sauvegarder",
"workspace.providers.saving": "Enregistrement...",
"workspace.providers.save": "Enregistrer",
"workspace.providers.table.provider": "Fournisseur",
"workspace.providers.table.apiKey": "Clé API",
"workspace.usage.title": "Historique d'utilisation",
"workspace.usage.subtitle": "Utilisation et coûts récents de API.",
"workspace.usage.empty": "Passez votre premier appel API pour commencer.",
"workspace.usage.subtitle": "Utilisation récente de l'API et coûts.",
"workspace.usage.empty": "Faites votre premier appel API pour commencer.",
"workspace.usage.table.date": "Date",
"workspace.usage.table.model": "Modèle",
"workspace.usage.table.input": "Saisir",
"workspace.usage.table.output": "Sortir",
"workspace.usage.table.input": "Entrée",
"workspace.usage.table.output": "Sortie",
"workspace.usage.table.cost": "Coût",
"workspace.usage.breakdown.input": "Saisir",
"workspace.usage.breakdown.cacheRead": "Lecture du cache",
"workspace.usage.breakdown.cacheWrite": "Écriture du cache",
"workspace.usage.breakdown.output": "Sortir",
"workspace.usage.breakdown.input": "Entrée",
"workspace.usage.breakdown.cacheRead": "Lecture cache",
"workspace.usage.breakdown.cacheWrite": "Écriture cache",
"workspace.usage.breakdown.output": "Sortie",
"workspace.usage.breakdown.reasoning": "Raisonnement",
"workspace.usage.subscription": "abonnement (${{amount}})",
"workspace.usage.subscription": "abonnement ({{amount}} $)",
"workspace.cost.title": "Coût",
"workspace.cost.subtitle": "Coûts d'utilisation répartis par modèle.",
"workspace.cost.allModels": "Tous les modèles",
"workspace.cost.allKeys": "Toutes les clés",
"workspace.cost.deletedSuffix": "(supprimé)",
"workspace.cost.empty": "Aucune donnée d'utilisation disponible pour la période sélectionnée.",
"workspace.cost.subscriptionShort": "sous",
"workspace.cost.subscriptionShort": "abo",
"workspace.keys.title": "Clés API",
"workspace.keys.subtitle": "Gérez vos clés API pour accéder aux services opencode.",
"workspace.keys.subtitle": "Gérez vos clés API pour accéder aux services OpenCode.",
"workspace.keys.create": "Créer une clé API",
"workspace.keys.placeholder": "Entrez le nom de la clé",
"workspace.keys.empty": "Créer une clé opencode Gateway API",
"workspace.keys.empty": "Créer une clé API OpenCode Gateway",
"workspace.keys.table.name": "Nom",
"workspace.keys.table.key": "Clé",
"workspace.keys.table.createdBy": "Créé par",
"workspace.keys.table.lastUsed": "Dernière utilisation",
"workspace.keys.copyApiKey": "Copier la clé API",
"workspace.keys.delete": "Supprimer",
"workspace.members.title": "Membres",
"workspace.members.subtitle": "Gérez les membres de l'espace de travail et leurs autorisations.",
"workspace.members.invite": "Inviter un membre",
"workspace.members.inviting": "Attrayant...",
"workspace.members.inviting": "Invitation en cours...",
"workspace.members.beta.beforeLink": "Les espaces de travail sont gratuits pour les équipes pendant la version bêta.",
"workspace.members.form.invitee": "Invité",
"workspace.members.form.emailPlaceholder": "Entrez l'e-mail",
"workspace.members.form.role": "Rôle",
"workspace.members.form.monthlyLimit": "Limite de dépenses mensuelle",
"workspace.members.form.monthlyLimit": "Limite de dépense mensuelle",
"workspace.members.noLimit": "Aucune limite",
"workspace.members.noLimitLowercase": "pas de limite",
"workspace.members.invited": "invité",
"workspace.members.edit": "Modifier",
"workspace.members.delete": "Supprimer",
"workspace.members.saving": "Économie...",
"workspace.members.save": "Sauvegarder",
"workspace.members.saving": "Enregistrement...",
"workspace.members.save": "Enregistrer",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Rôle",
"workspace.members.table.monthLimit": "Limite mensuelle",
@@ -388,35 +398,39 @@ export const dict = {
"workspace.members.role.adminDescription": "Peut gérer les modèles, les membres et la facturation",
"workspace.members.role.member": "Membre",
"workspace.members.role.memberDescription": "Ne peut générer que des clés API pour lui-même",
"workspace.settings.title": "Paramètres",
"workspace.settings.subtitle": "Mettez à jour le nom et les préférences de votre espace de travail.",
"workspace.settings.workspaceName": "Nom de l'espace de travail",
"workspace.settings.defaultName": "Défaut",
"workspace.settings.updating": "Mise à jour...",
"workspace.settings.save": "Sauvegarder",
"workspace.settings.save": "Enregistrer",
"workspace.settings.edit": "Modifier",
"workspace.billing.title": "Facturation",
"workspace.billing.subtitle.beforeLink": "Gérer les méthodes de paiement.",
"workspace.billing.contactUs": "Contactez-nous",
"workspace.billing.subtitle.afterLink": "si vous avez des questions.",
"workspace.billing.currentBalance": "Solde actuel",
"workspace.billing.add": "Ajouter $",
"workspace.billing.enterAmount": "Entrez le montant",
"workspace.billing.enterAmount": "Saisir le montant",
"workspace.billing.loading": "Chargement...",
"workspace.billing.addAction": "Ajouter",
"workspace.billing.addBalance": "Ajouter un solde",
"workspace.billing.linkedToStripe": "Lié à Stripe",
"workspace.billing.manage": "Gérer",
"workspace.billing.enable": "Activer la facturation",
"workspace.monthlyLimit.title": "Limite mensuelle",
"workspace.monthlyLimit.subtitle": "Définissez une limite d'utilisation mensuelle pour votre compte.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Paramètre...",
"workspace.monthlyLimit.set": "Ensemble",
"workspace.monthlyLimit.setting": "Définition...",
"workspace.monthlyLimit.set": "Défini",
"workspace.monthlyLimit.edit": "Modifier la limite",
"workspace.monthlyLimit.noLimit": "Aucune limite d'utilisation définie.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Utilisation actuelle pour",
"workspace.monthlyLimit.currentUsage.beforeAmount": "est $",
"workspace.monthlyLimit.currentUsage.beforeMonth": "L'utilisation actuelle pour",
"workspace.monthlyLimit.currentUsage.beforeAmount": "est de",
"workspace.reload.title": "Rechargement automatique",
"workspace.reload.disabled.before": "Le rechargement automatique est",
"workspace.reload.disabled.state": "désactivé",
@@ -425,28 +439,30 @@ export const dict = {
"workspace.reload.enabled.state": "activé",
"workspace.reload.enabled.middle": "Nous rechargerons",
"workspace.reload.processingFee": "frais de traitement",
"workspace.reload.enabled.after": "quand l'équilibre atteint",
"workspace.reload.enabled.after": "quand le solde atteint",
"workspace.reload.edit": "Modifier",
"workspace.reload.enable": "Activer",
"workspace.reload.enableAutoReload": "Activer le rechargement automatique",
"workspace.reload.reloadAmount": "Recharger $",
"workspace.reload.whenBalanceReaches": "Lorsque le solde atteint $",
"workspace.reload.saving": "Économie...",
"workspace.reload.save": "Sauvegarder",
"workspace.reload.whenBalanceReaches": "Lorsque le solde atteint $",
"workspace.reload.saving": "Enregistrement...",
"workspace.reload.save": "Enregistrer",
"workspace.reload.failedAt": "Le rechargement a échoué à",
"workspace.reload.reason": "Raison:",
"workspace.reload.updatePaymentMethod": "Veuillez mettre à jour votre mode de paiement et réessayer.",
"workspace.reload.reason": "Raison :",
"workspace.reload.updatePaymentMethod": "Veuillez mettre à jour votre méthode de paiement et réessayer.",
"workspace.reload.retrying": "Nouvelle tentative...",
"workspace.reload.retry": "Réessayer",
"workspace.payments.title": "Historique des paiements",
"workspace.payments.subtitle": "Opérations de paiement récentes.",
"workspace.payments.subtitle": "Transactions de paiement récentes.",
"workspace.payments.table.date": "Date",
"workspace.payments.table.paymentId": "Identifiant de paiement",
"workspace.payments.table.paymentId": "ID de paiement",
"workspace.payments.table.amount": "Montant",
"workspace.payments.table.receipt": "Reçu",
"workspace.payments.type.credit": "crédit",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Voir",
"workspace.black.loading": "Chargement...",
"workspace.black.time.day": "jour",
"workspace.black.time.days": "jours",
@@ -456,23 +472,136 @@ export const dict = {
"workspace.black.time.minutes": "minutes",
"workspace.black.time.fewSeconds": "quelques secondes",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Vous êtes abonné à OpenCode Black pour {{plan}} $ par mois.",
"workspace.black.subscription.message": "Vous êtes abonné à OpenCode Black pour {{plan}} $ par mois.",
"workspace.black.subscription.manage": "Gérer l'abonnement",
"workspace.black.subscription.rollingUsage": "Utilisation de 5 heures",
"workspace.black.subscription.rollingUsage": "Utilisation 5 heures",
"workspace.black.subscription.weeklyUsage": "Utilisation hebdomadaire",
"workspace.black.subscription.resetsIn": "Réinitialise dans",
"workspace.black.subscription.resetsIn": "Réinitialisation dans",
"workspace.black.subscription.useBalance":
"Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
"workspace.black.waitlist.title": "Liste d'attente",
"workspace.black.waitlist.joined":
"Vous êtes sur la liste d'attente pour le forfait Black {{plan}} $ par mois OpenCode.",
"workspace.black.waitlist.ready": "Nous sommes prêts à vous inscrire au forfait Black {{plan}} $ par mois OpenCode.",
"Vous êtes sur la liste d'attente pour le forfait OpenCode Black à {{plan}} $ par mois.",
"workspace.black.waitlist.ready":
"Nous sommes prêts à vous inscrire au forfait OpenCode Black à {{plan}} $ par mois.",
"workspace.black.waitlist.leave": "Quitter la liste d'attente",
"workspace.black.waitlist.leaving": "Sortie...",
"workspace.black.waitlist.left": "Gauche",
"workspace.black.waitlist.enroll": "Inscrire",
"workspace.black.waitlist.left": "Quitté",
"workspace.black.waitlist.enroll": "S'inscrire",
"workspace.black.waitlist.enrolling": "Inscription...",
"workspace.black.waitlist.enrolled": "Inscrit",
"workspace.black.waitlist.enrollNote":
"Lorsque vous cliquez sur S'inscrire, votre abonnement démarre immédiatement et votre carte sera débitée.",
"download.title": "OpenCode | Téléchargement",
"download.meta.description": "Téléchargez OpenCode pour macOS, Windows et Linux",
"download.hero.title": "Télécharger OpenCode",
"download.hero.subtitle": "Disponible en bêta pour macOS, Windows et Linux",
"download.hero.button": "Télécharger pour {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Bêta)",
"download.section.extensions": "Extensions OpenCode",
"download.section.integrations": "Intégrations OpenCode",
"download.action.download": "Télécharger",
"download.action.install": "Installer",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Pas forcément, mais probablement. Vous aurez besoin d'un abonnement IA si vous voulez connecter OpenCode à un fournisseur payant, mais vous pouvez travailler avec des",
"download.faq.a3.localLink": "modèles locaux",
"download.faq.a3.afterLocal.beforeZen": "gratuitement. Même si nous encourageons les utilisateurs à utiliser",
"download.faq.a3.afterZen":
", OpenCode fonctionne avec tous les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
"download.faq.a5.p1": "OpenCode est 100% gratuit à utiliser.",
"download.faq.a5.p2.beforeZen":
"Les coûts supplémentaires viendront de votre abonnement à un fournisseur de modèle. Même si OpenCode fonctionne avec n'importe quel fournisseur, nous recommandons d'utiliser",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"Vos données et informations ne sont stockées que lorsque vous créez des liens partageables dans OpenCode.",
"download.faq.a6.p2.beforeShare": "En savoir plus sur",
"download.faq.a6.shareLink": "les pages de partage",
"enterprise.title": "OpenCode | Solutions entreprise pour votre organisation",
"enterprise.meta.description": "Contactez OpenCode pour des solutions entreprise",
"enterprise.hero.title": "Votre code vous appartient",
"enterprise.hero.body1":
"OpenCode fonctionne de manière sécurisée au sein de votre organisation, sans stocker de données ni de contexte, et sans restrictions de licence ni revendications de propriété. Démarrez un essai avec votre équipe, puis déployez-le dans votre organisation en l'intégrant à votre SSO et à votre passerelle IA interne.",
"enterprise.hero.body2": "Dites-nous comment nous pouvons vous aider.",
"enterprise.form.name.label": "Nom complet",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Poste",
"enterprise.form.role.placeholder": "Président exécutif",
"enterprise.form.email.label": "E-mail professionnel",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Quel problème essayez-vous de résoudre ?",
"enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...",
"enterprise.form.send": "Envoyer",
"enterprise.form.sending": "Envoi...",
"enterprise.form.success": "Message envoyé, nous vous contacterons bientôt.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Qu'est-ce que OpenCode Enterprise ?",
"enterprise.faq.a1":
"OpenCode Enterprise s'adresse aux organisations qui veulent s'assurer que leur code et leurs données ne quittent jamais leur infrastructure. Cela est possible grâce à une configuration centralisée qui s'intègre à votre SSO et à votre passerelle IA interne.",
"enterprise.faq.q2": "Comment démarrer avec OpenCode Enterprise ?",
"enterprise.faq.a2":
"Commencez simplement par un essai interne avec votre équipe. Par défaut, OpenCode ne stocke pas votre code ni vos données de contexte, ce qui facilite la prise en main. Ensuite, contactez-nous pour discuter des tarifs et des options de mise en œuvre.",
"enterprise.faq.q3": "Comment fonctionne la tarification entreprise ?",
"enterprise.faq.a3":
"Nous proposons une tarification entreprise par siège. Si vous avez votre propre passerelle LLM, nous ne facturons pas les tokens utilisés. Pour plus de détails, contactez-nous pour un devis sur mesure en fonction des besoins de votre organisation.",
"enterprise.faq.q4": "Mes données sont-elles sécurisées avec OpenCode Enterprise ?",
"enterprise.faq.a4":
"Oui. OpenCode ne stocke pas votre code ni vos données de contexte. Tout le traitement se fait localement ou via des appels API directs vers votre fournisseur d'IA. Avec une configuration centralisée et une intégration SSO, vos données restent sécurisées au sein de l'infrastructure de votre organisation.",
"brand.title": "OpenCode | Marque",
"brand.meta.description": "Guide de marque OpenCode",
"brand.heading": "Guide de marque",
"brand.subtitle": "Ressources et éléments pour vous aider à travailler avec la marque OpenCode.",
"brand.downloadAll": "Télécharger tous les assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Notes de version et changelog d'OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nouvelles mises à jour et améliorations pour OpenCode",
"changelog.empty": "Aucune entrée de changelog trouvée.",
"changelog.viewJson": "Voir le JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Modèle",
"bench.list.table.score": "Score",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tâche introuvable",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Modèle",
"bench.detail.labels.task": "Tâche",
"bench.detail.labels.repo": "Dépôt",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "À",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Durée moyenne",
"bench.detail.labels.averageScore": "Score moyen",
"bench.detail.labels.averageCost": "Coût moyen",
"bench.detail.labels.summary": "Résumé",
"bench.detail.labels.runs": "Exécutions",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Pénalité",
"bench.detail.labels.weight": "poids",
"bench.detail.table.run": "Exécution",
"bench.detail.table.score": "Score (Base - Pénalité)",
"bench.detail.table.cost": "Coût",
"bench.detail.table.duration": "Durée",
"bench.detail.run.title": "Exécution {{n}}",
"bench.detail.rawJson": "JSON brut",
} satisfies Dict

View File

@@ -34,7 +34,7 @@ export const dict = {
"email.subtitle": "Iscriviti alla waitlist per l'accesso anticipato.",
"email.placeholder": "Indirizzo email",
"email.subscribe": "Iscriviti",
"email.success": "Quasi fatto: controlla la posta in arrivo e conferma il tuo indirizzo email",
"email.success": "Quasi fatto, controlla la posta in arrivo e conferma il tuo indirizzo email",
"notFound.title": "Non trovato | opencode",
"notFound.heading": "404 - Pagina non trovata",
@@ -57,10 +57,41 @@ export const dict = {
"common.videoUnsupported": "Il tuo browser non supporta il tag video.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Scopri di piu",
"common.learnMore": "Scopri di più",
"error.invalidPlan": "Piano non valido",
"error.workspaceRequired": "ID Workspace richiesto",
"error.alreadySubscribed": "Questo workspace ha già un abbonamento",
"error.limitRequired": "Il limite è richiesto.",
"error.monthlyLimitInvalid": "Imposta un limite mensile valido.",
"error.workspaceNameRequired": "Il nome del workspace è richiesto.",
"error.nameTooLong": "Il nome deve essere di 255 caratteri o meno.",
"error.emailRequired": "L'email è richiesta",
"error.roleRequired": "Il ruolo è richiesto",
"error.idRequired": "L'ID è richiesto",
"error.nameRequired": "Il nome è richiesto",
"error.providerRequired": "Il provider è richiesto",
"error.apiKeyRequired": "La chiave API è richiesta",
"error.modelRequired": "Il modello è richiesto",
"error.reloadAmountMin": "L'importo della ricarica deve essere almeno ${{amount}}",
"error.reloadTriggerMin": "La soglia del saldo deve essere almeno ${{amount}}",
"home.title": "OpenCode | L'agente di coding IA open source",
"temp.title": "opencode | Agente di coding IA costruito per il terminale",
"temp.hero.title": "L'agente di coding IA costruito per il terminale",
"temp.zen": "opencode zen",
"temp.getStarted": "Inizia",
"temp.feature.native.title": "TUI Nativa",
"temp.feature.native.body": "Un'interfaccia terminale reattiva, nativa e personalizzabile",
"temp.feature.zen.beforeLink": "Una",
"temp.feature.zen.link": "lista curata di modelli",
"temp.feature.zen.afterLink": "fornita da opencode",
"temp.feature.models.beforeLink": "Supporta 75+ provider LLM tramite",
"temp.feature.models.afterLink": ", inclusi modelli locali",
"temp.screenshot.caption": "OpenCode TUI con il tema tokyonight",
"temp.screenshot.alt": "OpenCode TUI con tema tokyonight",
"home.banner.badge": "Nuovo",
"home.banner.text": "App desktop disponibile in beta",
"home.banner.platforms": "su macOS, Windows e Linux",
@@ -73,12 +104,12 @@ export const dict = {
"home.install.ariaLabel": "Opzioni di installazione",
"home.what.title": "Che cos'e OpenCode?",
"home.what.body": "OpenCode e un agente open source che ti aiuta a scrivere codice nel terminale, IDE o desktop.",
"home.what.title": "Che cos'è OpenCode?",
"home.what.body": "OpenCode è un agente open source che ti aiuta a scrivere codice nel terminale, IDE o desktop.",
"home.what.lsp.title": "LSP abilitato",
"home.what.lsp.body": "Carica automaticamente gli LSP giusti per il LLM",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Avvia piu agenti in parallelo sullo stesso progetto",
"home.what.multiSession.body": "Avvia più agenti in parallelo sullo stesso progetto",
"home.what.shareLinks.title": "Link condivisi",
"home.what.shareLinks.body": "Condividi un link a qualsiasi sessione per riferimento o debug",
"home.what.copilot.title": "GitHub Copilot",
@@ -93,22 +124,22 @@ export const dict = {
"home.growth.title": "L'agente di coding IA open source",
"home.growth.body":
"Con oltre <strong>{{stars}}</strong> stelle su GitHub, <strong>{{contributors}}</strong> contributori e oltre <strong>{{commits}}</strong> commit, OpenCode e usato e apprezzato da oltre <strong>{{monthlyUsers}}</strong> sviluppatori ogni mese.",
"Con oltre <strong>{{stars}}</strong> stelle su GitHub, <strong>{{contributors}}</strong> contributori e oltre <strong>{{commits}}</strong> commit, OpenCode è usato e apprezzato da oltre <strong>{{monthlyUsers}}</strong> sviluppatori ogni mese.",
"home.growth.githubStars": "Stelle GitHub",
"home.growth.contributors": "Contributori",
"home.growth.monthlyDevs": "Devs mensili",
"home.privacy.title": "Progettato per la privacy",
"home.privacy.body":
"OpenCode non archivia il tuo codice ne i dati di contesto, cosi puo operare in ambienti sensibili alla privacy.",
"home.privacy.learnMore": "Scopri di piu su",
"OpenCode non archivia il tuo codice né i dati di contesto, così può operare in ambienti sensibili alla privacy.",
"home.privacy.learnMore": "Scopri di più su",
"home.privacy.link": "privacy",
"home.faq.q1": "Che cos'e OpenCode?",
"home.faq.q1": "Che cos'è OpenCode?",
"home.faq.a1":
"OpenCode e un agente open source che ti aiuta a scrivere ed eseguire codice con qualsiasi modello di IA. E disponibile come interfaccia terminale, app desktop o estensione IDE.",
"OpenCode è un agente open source che ti aiuta a scrivere ed eseguire codice con qualsiasi modello di IA. È disponibile come interfaccia terminale, app desktop o estensione IDE.",
"home.faq.q2": "Come uso OpenCode?",
"home.faq.a2.before": "Il modo piu semplice per iniziare e leggere l'",
"home.faq.a2.before": "Il modo più semplice per iniziare è leggere l'",
"home.faq.a2.link": "introduzione",
"home.faq.q3": "Mi servono abbonamenti IA extra per usare OpenCode?",
"home.faq.a3.p1":
@@ -116,59 +147,57 @@ export const dict = {
"home.faq.a3.p2.beforeZen": "Inoltre, puoi usare modelli popolari per il coding creando un account",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Anche se incoraggiamo gli utenti a usare Zen, OpenCode funziona anche con i provider piu diffusi come OpenAI, Anthropic, xAI, ecc.",
"Anche se incoraggiamo gli utenti a usare Zen, OpenCode funziona anche con i provider più diffusi come OpenAI, Anthropic, xAI, ecc.",
"home.faq.a3.p4.beforeLocal": "Puoi anche collegare i tuoi",
"home.faq.a3.p4.localLink": "modelli locali",
"home.faq.q4": "Posso usare i miei abbonamenti IA esistenti con OpenCode?",
"home.faq.a4.p1":
"Si, OpenCode supporta gli abbonamenti dei principali provider. Puoi usare Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
"Sì, OpenCode supporta gli abbonamenti dei principali provider. Puoi usare Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
"home.faq.q5": "Posso usare OpenCode solo nel terminale?",
"home.faq.a5.beforeDesktop": "Non piu! OpenCode ora e disponibile come app per",
"home.faq.a5.beforeDesktop": "Non più! OpenCode ora è disponibile come app per",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "e",
"home.faq.a5.web": "web",
"home.faq.q6": "Quanto costa OpenCode?",
"home.faq.a6":
"OpenCode e gratuito al 100%. Include anche un set di modelli gratuiti. Potrebbero esserci costi aggiuntivi se colleghi altri provider.",
"OpenCode è gratuito al 100%. Include anche un set di modelli gratuiti. Potrebbero esserci costi aggiuntivi se colleghi altri provider.",
"home.faq.q7": "E per quanto riguarda dati e privacy?",
"home.faq.a7.p1":
"I tuoi dati vengono archiviati solo quando usi i nostri modelli gratuiti o crei link condivisibili.",
"home.faq.a7.p2.beforeModels": "Scopri di piu su",
"home.faq.a7.p2.beforeModels": "Scopri di più su",
"home.faq.a7.p2.modelsLink": "i nostri modelli",
"home.faq.a7.p2.and": "e",
"home.faq.a7.p2.shareLink": "le pagine di condivisione",
"home.faq.q8": "OpenCode e open source?",
"home.faq.a8.p1": "Si, OpenCode e completamente open source. Il codice sorgente e pubblico su",
"home.faq.q8": "OpenCode è open source?",
"home.faq.a8.p1": "Sì, OpenCode è completamente open source. Il codice sorgente è pubblico su",
"home.faq.a8.p2": "sotto la",
"home.faq.a8.mitLicense": "Licenza MIT",
"home.faq.a8.p3":
", il che significa che chiunque puo usarlo, modificarlo o contribuire al suo sviluppo. Chiunque nella comunita puo aprire issue, inviare pull request ed estendere le funzionalita.",
", il che significa che chiunque può usarlo, modificarlo o contribuire al suo sviluppo. Chiunque nella comunità può aprire issue, inviare pull request ed estendere le funzionalità.",
"home.zenCta.title": "Accedi a modelli affidabili e ottimizzati per agenti di coding",
"home.zenCta.body":
"Zen ti da accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente piu preoccupazioni per prestazioni e qualita incoerenti tra provider: usa modelli validati che funzionano.",
"Zen ti dà accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente più preoccupazioni per prestazioni e qualità incoerenti tra provider: usa modelli validati che funzionano.",
"home.zenCta.link": "Scopri Zen",
"download.title": "OpenCode | Download",
"zen.title": "OpenCode Zen | Una selezione curata di modelli affidabili e ottimizzati per agenti di coding",
"zen.hero.title": "Accedi a modelli affidabili e ottimizzati per agenti di coding",
"zen.hero.body":
"Zen ti da accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente piu preoccupazioni per prestazioni e qualita incoerenti tra provider: usa modelli validati che funzionano.",
"Zen ti dà accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente più preoccupazioni per prestazioni e qualità incoerenti tra provider: usa modelli validati che funzionano.",
"zen.faq.q1": "Cos'e OpenCode Zen?",
"zen.faq.q1": "Cos'è OpenCode Zen?",
"zen.faq.a1":
"Zen e un set curato di modelli di IA testati e benchmarkati per agenti di coding, creato dal team dietro OpenCode.",
"zen.faq.q2": "Cosa rende Zen piu accurato?",
"Zen è un set curato di modelli di IA testati e benchmarkati per agenti di coding, creato dal team dietro OpenCode.",
"zen.faq.q2": "Cosa rende Zen più accurato?",
"zen.faq.a2":
"Zen offre solo modelli testati e benchmarkati specificamente per agenti di coding. Non useresti un coltello da burro per tagliare una bistecca; non usare modelli scarsi per programmare.",
"zen.faq.q3": "Zen e piu economico?",
"zen.faq.q3": "Zen è più economico?",
"zen.faq.a3":
"Zen non e a scopo di lucro. Zen ribalta i costi dei provider di modelli direttamente su di te. Piu Zen viene usato, piu OpenCode puo negoziare tariffe migliori e passarle a te.",
"Zen non è a scopo di lucro. Zen ribalta i costi dei provider di modelli direttamente su di te. Più Zen viene usato, più OpenCode può negoziare tariffe migliori e passarle a te.",
"zen.faq.q4": "Quanto costa Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "addebita per richiesta",
"zen.faq.a4.p1.afterPricing": "senza ricarichi, quindi paghi esattamente cio che addebita il provider del modello.",
"zen.faq.a4.p1.afterPricing": "senza ricarichi, quindi paghi esattamente ciò che addebita il provider del modello.",
"zen.faq.a4.p2.beforeAccount": "Il costo totale dipende dall'uso e puoi impostare limiti di spesa mensili nel tuo",
"zen.faq.a4.p2.accountLink": "account",
"zen.faq.a4.p3":
@@ -178,45 +207,292 @@ export const dict = {
"Tutti i modelli Zen 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",
"zen.faq.a5.exceptionsLink": "seguenti eccezioni",
"zen.faq.q6": "Posso impostare limiti di spesa?",
"zen.faq.a6": "Si, puoi impostare limiti di spesa mensuali nel tuo account.",
"zen.faq.a6": "Sì, puoi impostare limiti di spesa mensuali nel tuo account.",
"zen.faq.q7": "Posso annullare?",
"zen.faq.a7": "Si, puoi disattivare la fatturazione in qualsiasi momento e usare il saldo rimanente.",
"zen.faq.a7": "Sì, puoi disattivare la fatturazione in qualsiasi momento e usare il saldo rimanente.",
"zen.faq.q8": "Posso usare Zen con altri agenti di coding?",
"zen.faq.a8":
"Anche se Zen funziona alla grande con OpenCode, puoi usare Zen con qualsiasi agente. Segui le istruzioni di configurazione nel tuo agente di coding preferito.",
"zen.cta.start": "Inizia con Zen",
"zen.pricing.title": "Aggiungi $ 20 di saldo a consumo",
"zen.pricing.fee": "(+$ 1,23 commissione di elaborazione della carta)",
"zen.pricing.body": "Utilizzare con qualsiasi agente. Imposta limiti di spesa mensili. Annulla in qualsiasi momento.",
"zen.problem.title": "Quale problema sta risolvendo Zen?",
"zen.pricing.title": "Aggiungi $20 di saldo a consumo",
"zen.pricing.fee": "(+$1.23 commissione di elaborazione carta)",
"zen.pricing.body": "Usa con qualsiasi agente. Imposta limiti di spesa mensili. Annulla in qualsiasi momento.",
"zen.problem.title": "Quale problema risolve Zen?",
"zen.problem.body":
"Sono disponibili numerosi modelli, ma solo pochi funzionano bene con gli agenti di codifica. La maggior parte dei provider li configura in modo diverso con risultati diversi.",
"Sono disponibili numerosi modelli, ma solo pochi funzionano bene con gli agenti di coding. La maggior parte dei provider li configura in modo diverso con risultati variabili.",
"zen.problem.subtitle": "Stiamo risolvendo questo problema per tutti, non solo per gli utenti OpenCode.",
"zen.problem.item1": "Testare modelli selezionati e consultare i loro team",
"zen.problem.item2": "Collaborare con i fornitori per garantire che vengano consegnati correttamente",
"zen.problem.item3": "Eseguiamo il benchmarking di tutte le combinazioni di fornitori di modelli che consigliamo",
"zen.problem.item2": "Collaborare con i provider per garantire che vengano consegnati correttamente",
"zen.problem.item3": "Benchmark di tutte le combinazioni modello-provider che raccomandiamo",
"zen.how.title": "Come funziona Zen",
"zen.how.body": "Anche se ti consigliamo di utilizzare Zen con OpenCode, puoi utilizzare Zen con qualsiasi agente.",
"zen.how.step1.title": "Iscriviti e aggiungi un saldo di $ 20",
"zen.how.step1.beforeLink": "seguire il",
"zen.how.step1.title": "Iscriviti e aggiungi un saldo di $20",
"zen.how.step1.beforeLink": "segui le",
"zen.how.step1.link": "istruzioni di configurazione",
"zen.how.step2.title": "Utilizza Zen con prezzi trasparenti",
"zen.how.step2.link": "pagare per richiesta",
"zen.how.step2.afterLink": "con zero ricarichi",
"zen.how.step2.title": "Usa Zen con prezzi trasparenti",
"zen.how.step2.link": "paga per richiesta",
"zen.how.step2.afterLink": "senza ricarichi",
"zen.how.step3.title": "Ricarica automatica",
"zen.how.step3.body": "quando il tuo saldo raggiunge $ 5, aggiungeremo automaticamente $ 20",
"zen.how.step3.body": "quando il tuo saldo raggiunge $5, aggiungeremo automaticamente $20",
"zen.privacy.title": "La tua privacy è importante per noi",
"zen.privacy.beforeExceptions":
"Tutti i modelli Zen sono ospitati negli Stati Uniti. I fornitori seguono una politica di conservazione zero e non utilizzano i tuoi dati per l'addestramento del modello, con il",
"Tutti i modelli Zen 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",
"zen.privacy.exceptionsLink": "seguenti eccezioni",
"black.meta.title": "OpenCode Black | Accedi ai migliori modelli di coding al mondo",
"black.meta.description":
"Ottieni l'accesso a Claude, GPT, Gemini e altri con i piani di abbonamento OpenCode Black.",
"black.hero.title": "Accedi ai migliori modelli di coding al mondo",
"black.hero.subtitle": "Inclusi Claude, GPT, Gemini e altri",
"black.title": "OpenCode Black | Prezzi",
"black.plan.icon20": "Piano Black 20",
"black.plan.icon100": "Piano Black 100",
"black.plan.icon200": "Piano Black 200",
"black.plan.multiplier100": "5x più utilizzo rispetto a Black 20",
"black.plan.multiplier200": "20x più utilizzo rispetto a Black 20",
"black.price.perMonth": "al mese",
"black.price.perPersonBilledMonthly": "per persona fatturato mensilmente",
"black.terms.1": "Il tuo abbonamento non inizierà immediatamente",
"black.terms.2": "Verrai aggiunto alla lista d'attesa e attivato presto",
"black.terms.3": "La tua carta verrà addebitata solo quando il tuo abbonamento sarà attivato",
"black.terms.4":
"Si applicano limiti di utilizzo, un uso fortemente automatizzato potrebbe raggiungere i limiti prima",
"black.terms.5": "Gli abbonamenti sono per individui, contatta Enterprise per i team",
"black.terms.6": "I limiti potrebbero essere modificati e i piani potrebbero essere interrotti in futuro",
"black.terms.7": "Annulla il tuo abbonamento in qualsiasi momento",
"black.action.continue": "Continua",
"black.finePrint.beforeTerms": "I prezzi mostrati non includono le tasse applicabili",
"black.finePrint.terms": "Termini di servizio",
"black.workspace.title": "OpenCode Black | Seleziona Workspace",
"black.workspace.selectPlan": "Seleziona un workspace per questo piano",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Abbonati a OpenCode Black",
"black.subscribe.paymentMethod": "Metodo di pagamento",
"black.subscribe.loadingPaymentForm": "Caricamento modulo di pagamento...",
"black.subscribe.selectWorkspaceToContinue": "Seleziona un workspace per continuare",
"black.subscribe.failurePrefix": "Oh no!",
"black.subscribe.error.generic": "Si è verificato un errore",
"black.subscribe.error.invalidPlan": "Piano non valido",
"black.subscribe.error.workspaceRequired": "ID Workspace richiesto",
"black.subscribe.error.alreadySubscribed": "Questo workspace ha già un abbonamento",
"black.subscribe.processing": "Elaborazione...",
"black.subscribe.submit": "Abbonati ${{plan}}",
"black.subscribe.form.chargeNotice": "Ti verrà addebitato solo quando il tuo abbonamento sarà attivato",
"black.subscribe.success.title": "Sei nella lista d'attesa di OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Piano di abbonamento",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Importo",
"black.subscribe.success.amountValue": "${{plan}} al mese",
"black.subscribe.success.paymentMethod": "Metodo di pagamento",
"black.subscribe.success.dateJoined": "Data di adesione",
"black.subscribe.success.chargeNotice": "La tua carta verrà addebitata quando il tuo abbonamento sarà attivato",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "Chiavi API",
"workspace.nav.members": "Membri",
"workspace.nav.billing": "Fatturazione",
"workspace.nav.settings": "Impostazioni",
"workspace.home.banner.beforeLink": "Modelli ottimizzati e affidabili per agenti di coding.",
"workspace.home.billing.loading": "Caricamento...",
"workspace.home.billing.enable": "Abilita fatturazione",
"workspace.home.billing.currentBalance": "Saldo attuale",
"workspace.newUser.feature.tested.title": "Modelli testati e verificati",
"workspace.newUser.feature.tested.body":
"Abbiamo benchmarkato e testato modelli specificamente per agenti di coding per garantire le migliori prestazioni.",
"workspace.newUser.feature.quality.title": "Massima qualità",
"workspace.newUser.feature.quality.body":
"Accedi a modelli configurati per prestazioni ottimali - nessun downgrade o instradamento verso provider più economici.",
"workspace.newUser.feature.lockin.title": "Nessun lock-in",
"workspace.newUser.feature.lockin.body":
"Usa Zen con qualsiasi agente di coding, e continua a usare altri provider con opencode quando vuoi.",
"workspace.newUser.copyApiKey": "Copia chiave API",
"workspace.newUser.copyKey": "Copia Chiave",
"workspace.newUser.copied": "Copiato!",
"workspace.newUser.step.enableBilling": "Abilita fatturazione",
"workspace.newUser.step.login.before": "Esegui",
"workspace.newUser.step.login.after": "e seleziona opencode",
"workspace.newUser.step.pasteKey": "Incolla la tua chiave API",
"workspace.newUser.step.models.before": "Avvia opencode ed esegui",
"workspace.newUser.step.models.after": "per selezionare un modello",
"workspace.models.title": "Modelli",
"workspace.models.subtitle.beforeLink": "Gestisci i modelli a cui possono accedere i membri del workspace.",
"workspace.models.table.model": "Modello",
"workspace.models.table.enabled": "Abilitato",
"workspace.providers.title": "Bring Your Own Key",
"workspace.providers.subtitle": "Configura le tue chiavi API dai provider di IA.",
"workspace.providers.placeholder": "Inserisci chiave API {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configura",
"workspace.providers.edit": "Modifica",
"workspace.providers.delete": "Elimina",
"workspace.providers.saving": "Salvataggio...",
"workspace.providers.save": "Salva",
"workspace.providers.table.provider": "Provider",
"workspace.providers.table.apiKey": "Chiave API",
"workspace.usage.title": "Cronologia Utilizzo",
"workspace.usage.subtitle": "Utilizzo API recente e costi.",
"workspace.usage.empty": "Effettua la tua prima chiamata API per iniziare.",
"workspace.usage.table.date": "Data",
"workspace.usage.table.model": "Modello",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Costo",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Lettura Cache",
"workspace.usage.breakdown.cacheWrite": "Scrittura Cache",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Reasoning",
"workspace.usage.subscription": "abbonamento (${{amount}})",
"workspace.cost.title": "Costo",
"workspace.cost.subtitle": "Costi di utilizzo suddivisi per modello.",
"workspace.cost.allModels": "Tutti i Modelli",
"workspace.cost.allKeys": "Tutte le Chiavi",
"workspace.cost.deletedSuffix": "(eliminato)",
"workspace.cost.empty": "Nessun dato di utilizzo disponibile per il periodo selezionato.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "Chiavi API",
"workspace.keys.subtitle": "Gestisci le tue chiavi API per accedere ai servizi opencode.",
"workspace.keys.create": "Crea Chiave API",
"workspace.keys.placeholder": "Inserisci nome chiave",
"workspace.keys.empty": "Crea una chiave API opencode Gateway",
"workspace.keys.table.name": "Nome",
"workspace.keys.table.key": "Chiave",
"workspace.keys.table.createdBy": "Creato da",
"workspace.keys.table.lastUsed": "Ultimo Utilizzo",
"workspace.keys.copyApiKey": "Copia chiave API",
"workspace.keys.delete": "Elimina",
"workspace.members.title": "Membri",
"workspace.members.subtitle": "Gestisci i membri del workspace e le loro autorizzazioni.",
"workspace.members.invite": "Invita Membro",
"workspace.members.inviting": "Invito in corso...",
"workspace.members.beta.beforeLink": "I workspace sono gratuiti per i team durante la beta.",
"workspace.members.form.invitee": "Invitato",
"workspace.members.form.emailPlaceholder": "Inserisci email",
"workspace.members.form.role": "Ruolo",
"workspace.members.form.monthlyLimit": "Limite di spesa mensile",
"workspace.members.noLimit": "Nessun limite",
"workspace.members.noLimitLowercase": "nessun limite",
"workspace.members.invited": "invitato",
"workspace.members.edit": "Modifica",
"workspace.members.delete": "Elimina",
"workspace.members.saving": "Salvataggio...",
"workspace.members.save": "Salva",
"workspace.members.table.email": "Email",
"workspace.members.table.role": "Ruolo",
"workspace.members.table.monthLimit": "Limite mensile",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Può gestire modelli, membri e fatturazione",
"workspace.members.role.member": "Membro",
"workspace.members.role.memberDescription": "Può generare chiavi API solo per sé",
"workspace.settings.title": "Impostazioni",
"workspace.settings.subtitle": "Aggiorna il nome e le preferenze del workspace.",
"workspace.settings.workspaceName": "Nome Workspace",
"workspace.settings.defaultName": "Predefinito",
"workspace.settings.updating": "Aggiornamento...",
"workspace.settings.save": "Salva",
"workspace.settings.edit": "Modifica",
"workspace.billing.title": "Fatturazione",
"workspace.billing.subtitle.beforeLink": "Gestisci i metodi di pagamento.",
"workspace.billing.contactUs": "Contattaci",
"workspace.billing.subtitle.afterLink": "se hai domande.",
"workspace.billing.currentBalance": "Saldo Attuale",
"workspace.billing.add": "Aggiungi $",
"workspace.billing.enterAmount": "Inserisci importo",
"workspace.billing.loading": "Caricamento...",
"workspace.billing.addAction": "Aggiungi",
"workspace.billing.addBalance": "Aggiungi Saldo",
"workspace.billing.linkedToStripe": "Collegato a Stripe",
"workspace.billing.manage": "Gestisci",
"workspace.billing.enable": "Abilita Fatturazione",
"workspace.monthlyLimit.title": "Limite Mensile",
"workspace.monthlyLimit.subtitle": "Imposta un limite di utilizzo mensile per il tuo account.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Impostazione...",
"workspace.monthlyLimit.set": "Impostato",
"workspace.monthlyLimit.edit": "Modifica Limite",
"workspace.monthlyLimit.noLimit": "Nessun limite di utilizzo impostato.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Utilizzo attuale per",
"workspace.monthlyLimit.currentUsage.beforeAmount": "è $",
"workspace.reload.title": "Ricarica Auto",
"workspace.reload.disabled.before": "La ricarica auto è",
"workspace.reload.disabled.state": "disabilitata",
"workspace.reload.disabled.after": "Abilita per ricaricare automaticamente quando il saldo è basso.",
"workspace.reload.enabled.before": "La ricarica auto è",
"workspace.reload.enabled.state": "abilitata",
"workspace.reload.enabled.middle": "Ricaricheremo",
"workspace.reload.processingFee": "commissione",
"workspace.reload.enabled.after": "quando il saldo raggiunge",
"workspace.reload.edit": "Modifica",
"workspace.reload.enable": "Abilita",
"workspace.reload.enableAutoReload": "Abilita Ricarica Auto",
"workspace.reload.reloadAmount": "Ricarica $",
"workspace.reload.whenBalanceReaches": "Quando il saldo raggiunge $",
"workspace.reload.saving": "Salvataggio...",
"workspace.reload.save": "Salva",
"workspace.reload.failedAt": "Ricarica fallita il",
"workspace.reload.reason": "Motivo:",
"workspace.reload.updatePaymentMethod": "Aggiorna il tuo metodo di pagamento e riprova.",
"workspace.reload.retrying": "Riprovo...",
"workspace.reload.retry": "Riprova",
"workspace.payments.title": "Cronologia Pagamenti",
"workspace.payments.subtitle": "Transazioni di pagamento recenti.",
"workspace.payments.table.date": "Data",
"workspace.payments.table.paymentId": "ID Pagamento",
"workspace.payments.table.amount": "Importo",
"workspace.payments.table.receipt": "Ricevuta",
"workspace.payments.type.credit": "credito",
"workspace.payments.type.subscription": "abbonamento",
"workspace.payments.view": "Visualizza",
"workspace.black.loading": "Caricamento...",
"workspace.black.time.day": "giorno",
"workspace.black.time.days": "giorni",
"workspace.black.time.hour": "ora",
"workspace.black.time.hours": "ore",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minuti",
"workspace.black.time.fewSeconds": "pochi secondi",
"workspace.black.subscription.title": "Abbonamento",
"workspace.black.subscription.message": "Sei abbonato a OpenCode Black per ${{plan}} al mese.",
"workspace.black.subscription.manage": "Gestisci Abbonamento",
"workspace.black.subscription.rollingUsage": "Utilizzo 5-ore",
"workspace.black.subscription.weeklyUsage": "Utilizzo Settimanale",
"workspace.black.subscription.resetsIn": "Si resetta tra",
"workspace.black.subscription.useBalance": "Usa il tuo saldo disponibile dopo aver raggiunto i limiti di utilizzo",
"workspace.black.waitlist.title": "Waitlist",
"workspace.black.waitlist.joined": "Sei nella waitlist per il piano OpenCode Black da ${{plan}} al mese.",
"workspace.black.waitlist.ready": "Siamo pronti per iscriverti al piano OpenCode Black da ${{plan}} al mese.",
"workspace.black.waitlist.leave": "Lascia Waitlist",
"workspace.black.waitlist.leaving": "Uscita...",
"workspace.black.waitlist.left": "Uscito",
"workspace.black.waitlist.enroll": "Iscriviti",
"workspace.black.waitlist.enrolling": "Iscrizione...",
"workspace.black.waitlist.enrolled": "Iscritto",
"workspace.black.waitlist.enrollNote":
"Quando clicchi su Iscriviti, il tuo abbonamento inizia immediatamente e la tua carta verrà addebitata.",
"download.title": "OpenCode | Download",
"download.meta.description": "Scarica OpenCode per macOS, Windows e Linux",
"download.hero.title": "Scarica OpenCode",
"download.hero.subtitle": "Disponibile in beta per macOS, Windows e Linux",
"download.hero.subtitle": "Disponibile in Beta per macOS, Windows e Linux",
"download.hero.button": "Scarica per {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Estensioni OpenCode",
"download.section.integrations": "Integrazioni OpenCode",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrations",
"download.action.download": "Scarica",
"download.action.install": "Installa",
@@ -227,242 +503,94 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Non necessariamente, ma probabilmente. Ti serve un abbonamento IA se vuoi collegare OpenCode a un provider a pagamento, ma puoi lavorare con",
"Non necessariamente, ma probabilmente. Avrai bisogno di un abbonamento IA se vuoi collegare OpenCode a un provider a pagamento, sebbene tu possa lavorare con",
"download.faq.a3.localLink": "modelli locali",
"download.faq.a3.afterLocal.beforeZen": "gratis. Anche se incoraggiamo gli utenti a usare",
"download.faq.a3.afterZen": ", OpenCode funziona con tutti i provider popolari come OpenAI, Anthropic, xAI, ecc.",
"download.faq.a3.afterLocal.beforeZen": "gratuitamente. Mentre incoraggiamo gli utenti a usare",
"download.faq.a3.afterZen": ", OpenCode funziona con tutti i provider popolari come OpenAI, Anthropic, xAI ecc.",
"download.faq.a5.p1": "OpenCode e gratuito al 100%.",
"download.faq.a5.p1": "OpenCode è gratuito al 100%.",
"download.faq.a5.p2.beforeZen":
"Eventuali costi aggiuntivi dipendono dal tuo abbonamento a un provider di modelli. Anche se OpenCode funziona con qualsiasi provider, consigliamo di usare",
"Eventuali costi aggiuntivi proverranno dal tuo abbonamento a un provider di modelli. Mentre OpenCode funziona con qualsiasi provider di modelli, raccomandiamo di usare",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"I tuoi dati e le tue informazioni vengono archiviati solo quando crei link condivisibili in OpenCode.",
"download.faq.a6.p2.beforeShare": "Scopri di piu su",
"download.faq.a6.shareLink": "le pagine di condivisione",
"download.faq.a6.p1": "I tuoi dati e informazioni sono archiviati solo quando crei link condivisibili in OpenCode.",
"download.faq.a6.p2.beforeShare": "Scopri di più sulle",
"download.faq.a6.shareLink": "pagine condivise",
"enterprise.title": "OpenCode | Soluzioni enterprise per la tua organizzazione",
"enterprise.title": "OpenCode | Soluzioni Enterprise per la tua organizzazione",
"enterprise.meta.description": "Contatta OpenCode per soluzioni enterprise",
"enterprise.hero.title": "Il tuo codice e tuo",
"enterprise.hero.title": "Il tuo codice è tuo",
"enterprise.hero.body1":
"OpenCode opera in modo sicuro all'interno della tua organizzazione senza archiviare dati o contesto e senza restrizioni di licenza o rivendicazioni di proprieta. Avvia una prova con il tuo team, poi distribuiscilo in tutta l'organizzazione integrandolo con il tuo SSO e il tuo gateway IA interno.",
"enterprise.hero.body2": "Dicci come possiamo aiutarti.",
"OpenCode opera in modo sicuro all'interno della tua organizzazione senza dati o contesto archiviati e senza restrizioni di licenza o rivendicazioni di proprietà. Inizia una prova con il tuo team, poi distribuisci attraverso la tua organizzazione integrandolo con il tuo SSO e gateway IA interno.",
"enterprise.hero.body2": "Facci sapere come possiamo aiutare.",
"enterprise.form.name.label": "Nome completo",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Ruolo",
"enterprise.form.role.placeholder": "Presidente esecutivo",
"enterprise.form.role.placeholder": "Presidente Esecutivo",
"enterprise.form.email.label": "Email aziendale",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Quale problema stai cercando di risolvere?",
"enterprise.form.message.placeholder": "Abbiamo bisogno di aiuto per...",
"enterprise.form.message.placeholder": "Abbiamo bisogno di aiuto con...",
"enterprise.form.send": "Invia",
"enterprise.form.sending": "Invio...",
"enterprise.form.success": "Messaggio inviato, ti contatteremo a breve.",
"enterprise.form.success": "Messaggio inviato, ti contatteremo presto.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Cos'e OpenCode Enterprise?",
"enterprise.faq.q1": "Cos'è OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise e pensato per le organizzazioni che vogliono assicurarsi che il loro codice e i loro dati non lascino mai la propria infrastruttura. Lo fa tramite una configurazione centralizzata che si integra con il tuo SSO e il tuo gateway IA interno.",
"enterprise.faq.q2": "Come posso iniziare con OpenCode Enterprise?",
"OpenCode Enterprise è per le organizzazioni che vogliono garantire che il loro codice e dati non lascino mai la loro infrastruttura. Può farlo usando una configurazione centralizzata che si integra con il tuo SSO e gateway IA interno.",
"enterprise.faq.q2": "Come inizio con OpenCode Enterprise?",
"enterprise.faq.a2":
"Inizia semplicemente con una prova interna con il tuo team. OpenCode, per impostazione predefinita, non archivia il tuo codice ne i dati di contesto, rendendo facile partire. Poi contattaci per discutere prezzi e opzioni di implementazione.",
"enterprise.faq.q3": "Come funziona la tariffazione enterprise?",
"Inizia semplicemente con una prova interna con il tuo team. OpenCode per impostazione predefinita non archivia il tuo codice o dati di contesto, rendendo facile iniziare. Poi contattaci per discutere prezzi e opzioni di implementazione.",
"enterprise.faq.q3": "Come funziona il prezzo enterprise?",
"enterprise.faq.a3":
"Offriamo una tariffazione enterprise per postazione. Se hai il tuo gateway LLM, non addebitiamo i token utilizzati. Per ulteriori dettagli, contattaci per un preventivo personalizzato in base alle esigenze della tua organizzazione.",
"enterprise.faq.q4": "I miei dati sono al sicuro con OpenCode Enterprise?",
"Offriamo prezzi enterprise per postazione. Se hai il tuo gateway LLM, non addebitiamo per i token usati. Per ulteriori dettagli, contattaci per un preventivo personalizzato basato sulle esigenze della tua organizzazione.",
"enterprise.faq.q4": "I miei dati sono sicuri con OpenCode Enterprise?",
"enterprise.faq.a4":
"Si. OpenCode non archivia il tuo codice ne i dati di contesto. Tutta l'elaborazione avviene localmente o tramite chiamate API dirette al tuo provider di IA. Con configurazione centralizzata e integrazione SSO, i tuoi dati rimangono al sicuro all'interno dell'infrastruttura della tua organizzazione.",
"Sì. OpenCode non archivia il tuo codice o dati di contesto. Tutto il trattamento avviene localmente o attraverso chiamate API dirette al tuo provider IA. Con configurazione centrale e integrazione SSO, i tuoi dati rimangono sicuri all'interno dell'infrastruttura della tua organizzazione.",
"brand.title": "OpenCode | Brand",
"brand.meta.description": "Linee guida del brand OpenCode",
"brand.heading": "Linee guida del brand",
"brand.subtitle": "Risorse e asset per aiutarti a lavorare con il brand OpenCode.",
"brand.downloadAll": "Scarica tutti gli asset",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Note di rilascio e changelog di OpenCode",
"changelog.meta.description": "Note di rilascio e changelog OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nuovi aggiornamenti e miglioramenti per OpenCode",
"changelog.empty": "Nessuna voce di changelog trovata.",
"changelog.viewJson": "Visualizza JSON",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "Chiavi API",
"workspace.nav.members": "Membri",
"workspace.nav.billing": "Fatturazione",
"workspace.nav.settings": "Impostazioni",
"workspace.home.banner.beforeLink": "Modelli ottimizzati affidabili per agenti di codifica.",
"workspace.home.billing.loading": "Caricamento...",
"workspace.home.billing.enable": "Abilita fatturazione",
"workspace.home.billing.currentBalance": "Saldo attuale",
"workspace.newUser.feature.tested.title": "Modelli testati e verificati",
"workspace.newUser.feature.tested.body":
"Abbiamo confrontato e testato modelli specifici per gli agenti di codifica per garantire le migliori prestazioni.",
"workspace.newUser.feature.quality.title": "Massima qualità",
"workspace.newUser.feature.quality.body":
"Modelli di accesso configurati per prestazioni ottimali: senza downgrade o instradamento verso fornitori più economici.",
"workspace.newUser.feature.lockin.title": "Nessun lock-in",
"workspace.newUser.feature.lockin.body":
"Utilizza Zen con qualsiasi agente di codifica e continua a utilizzare altri provider con opencode ogni volta che vuoi.",
"workspace.newUser.copyApiKey": "Copia la chiave API",
"workspace.newUser.copyKey": "Copia chiave",
"workspace.newUser.copied": "Copiato!",
"workspace.newUser.step.enableBilling": "Abilita fatturazione",
"workspace.newUser.step.login.before": "Esegui",
"workspace.newUser.step.login.after": "e seleziona opencode",
"workspace.newUser.step.pasteKey": "Incolla la tua chiave API",
"workspace.newUser.step.models.before": "Avvia opencode ed esegui",
"workspace.newUser.step.models.after": "per selezionare un modello",
"workspace.models.title": "Modelli",
"workspace.models.subtitle.beforeLink": "Gestire i modelli a cui possono accedere i membri dell'area di lavoro.",
"workspace.models.table.model": "Modello",
"workspace.models.table.enabled": "Abilitato",
"workspace.providers.title": "Bring Your Own Key (BYOK)",
"workspace.providers.subtitle": "Configura le tue chiavi API dai fornitori di intelligenza artificiale.",
"workspace.providers.placeholder": "Inserisci la chiave {{provider}} API ({{prefix}}...)",
"workspace.providers.configure": "Configura",
"workspace.providers.edit": "Modificare",
"workspace.providers.delete": "Eliminare",
"workspace.providers.saving": "Salvataggio in corso...",
"workspace.providers.save": "Salva",
"workspace.providers.table.provider": "Fornitore",
"workspace.providers.table.apiKey": "Chiave API",
"workspace.usage.title": "Cronologia dell'utilizzo",
"workspace.usage.subtitle": "Utilizzo e costi recenti di API.",
"workspace.usage.empty": "Effettua la tua prima chiamata API per iniziare.",
"workspace.usage.table.date": "Data",
"workspace.usage.table.model": "Modello",
"workspace.usage.table.input": "Ingresso",
"workspace.usage.table.output": "Produzione",
"workspace.usage.table.cost": "Costo",
"workspace.usage.breakdown.input": "Ingresso",
"workspace.usage.breakdown.cacheRead": "Lettura cache",
"workspace.usage.breakdown.cacheWrite": "Scrittura nella cache",
"workspace.usage.breakdown.output": "Produzione",
"workspace.usage.breakdown.reasoning": "Ragionamento",
"workspace.usage.subscription": "abbonamento (${{amount}})",
"workspace.cost.title": "Costo",
"workspace.cost.subtitle": "Costi di utilizzo suddivisi per modello.",
"workspace.cost.allModels": "Tutti i modelli",
"workspace.cost.allKeys": "Tutte le chiavi",
"workspace.cost.deletedSuffix": "(eliminato)",
"workspace.cost.empty": "Nessun dato di utilizzo disponibile per il periodo selezionato.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "Chiavi API",
"workspace.keys.subtitle": "Gestisci le tue chiavi API per accedere ai servizi opencode.",
"workspace.keys.create": "Crea chiave API",
"workspace.keys.placeholder": "Inserisci il nome della chiave",
"workspace.keys.empty": "Crea una chiave opencode Gateway API",
"workspace.keys.table.name": "Nome",
"workspace.keys.table.key": "Chiave",
"workspace.keys.table.createdBy": "Creato da",
"workspace.keys.table.lastUsed": "Ultimo utilizzo",
"workspace.keys.copyApiKey": "Copia la chiave API",
"workspace.keys.delete": "Eliminare",
"workspace.members.title": "Membri",
"workspace.members.subtitle": "Gestire i membri dell'area di lavoro e le relative autorizzazioni.",
"workspace.members.invite": "Invita membro",
"workspace.members.inviting": "Invito in corso...",
"workspace.members.beta.beforeLink": "Gli spazi di lavoro sono gratuiti per i team durante la beta.",
"workspace.members.form.invitee": "Invitato",
"workspace.members.form.emailPlaceholder": "Inserisci l'e-mail",
"workspace.members.form.role": "Ruolo",
"workspace.members.form.monthlyLimit": "Limite di spesa mensile",
"workspace.members.noLimit": "Nessun limite",
"workspace.members.noLimitLowercase": "nessun limite",
"workspace.members.invited": "invitato",
"workspace.members.edit": "Modificare",
"workspace.members.delete": "Eliminare",
"workspace.members.saving": "Salvataggio in corso...",
"workspace.members.save": "Salva",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Ruolo",
"workspace.members.table.monthLimit": "Limite mensile",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Può gestire modelli, membri e fatturazione",
"workspace.members.role.member": "Membro",
"workspace.members.role.memberDescription": "Possono generare chiavi API solo per se stessi",
"workspace.settings.title": "Impostazioni",
"workspace.settings.subtitle": "Aggiorna il nome e le preferenze dell'area di lavoro.",
"workspace.settings.workspaceName": "Nome dell'area di lavoro",
"workspace.settings.defaultName": "Predefinito",
"workspace.settings.updating": "Aggiornamento...",
"workspace.settings.save": "Salva",
"workspace.settings.edit": "Modificare",
"workspace.billing.title": "Fatturazione",
"workspace.billing.subtitle.beforeLink": "Gestisci i metodi di pagamento.",
"workspace.billing.contactUs": "Contattaci",
"workspace.billing.subtitle.afterLink": "se hai qualche domanda",
"workspace.billing.currentBalance": "Saldo attuale",
"workspace.billing.add": "Aggiungi $",
"workspace.billing.enterAmount": "Inserisci l'importo",
"workspace.billing.loading": "Caricamento...",
"workspace.billing.addAction": "Aggiungi",
"workspace.billing.addBalance": "Aggiungi saldo",
"workspace.billing.linkedToStripe": "Collegato a Stripe",
"workspace.billing.manage": "Gestisci",
"workspace.billing.enable": "Abilita fatturazione",
"workspace.monthlyLimit.title": "Limite mensile",
"workspace.monthlyLimit.subtitle": "Imposta un limite di utilizzo mensile per il tuo account.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Impostazione in corso...",
"workspace.monthlyLimit.set": "Impostato",
"workspace.monthlyLimit.edit": "Modifica limite",
"workspace.monthlyLimit.noLimit": "Nessun limite di utilizzo impostato.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Utilizzo attuale per",
"workspace.monthlyLimit.currentUsage.beforeAmount": "è $",
"workspace.reload.title": "Ricarica automatica",
"workspace.reload.disabled.before": "La ricarica automatica è",
"workspace.reload.disabled.state": "disabilitato",
"workspace.reload.disabled.after": "Abilita la ricarica automatica quando il saldo è basso.",
"workspace.reload.enabled.before": "La ricarica automatica è",
"workspace.reload.enabled.state": "abilitato",
"workspace.reload.enabled.middle": "Ricaricheremo",
"workspace.reload.processingFee": "tassa di elaborazione",
"workspace.reload.enabled.after": "quando il saldo raggiunge",
"workspace.reload.edit": "Modificare",
"workspace.reload.enable": "Abilitare",
"workspace.reload.enableAutoReload": "Abilita ricarica automatica",
"workspace.reload.reloadAmount": "Ricarica $",
"workspace.reload.whenBalanceReaches": "Quando il saldo raggiunge $",
"workspace.reload.saving": "Salvataggio in corso...",
"workspace.reload.save": "Salva",
"workspace.reload.failedAt": "Ricarica non riuscita a",
"workspace.reload.reason": "Motivo:",
"workspace.reload.updatePaymentMethod": "Aggiorna il tuo metodo di pagamento e riprova.",
"workspace.reload.retrying": "Nuovo tentativo...",
"workspace.reload.retry": "Riprova",
"workspace.payments.title": "Cronologia dei pagamenti",
"workspace.payments.subtitle": "Transazioni di pagamento recenti.",
"workspace.payments.table.date": "Data",
"workspace.payments.table.paymentId": "ID pagamento",
"workspace.payments.table.amount": "Importo",
"workspace.payments.table.receipt": "Ricevuta",
"workspace.payments.type.credit": "credito",
"workspace.payments.type.subscription": "sottoscrizione",
"workspace.payments.view": "Visualizza",
"workspace.black.loading": "Caricamento...",
"workspace.black.time.day": "giorno",
"workspace.black.time.days": "giorni",
"workspace.black.time.hour": "ora",
"workspace.black.time.hours": "ore",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minuti",
"workspace.black.time.fewSeconds": "pochi secondi",
"workspace.black.subscription.title": "Sottoscrizione",
"workspace.black.subscription.message": "Sei abbonato a OpenCode Black per ${{plan}} al mese.",
"workspace.black.subscription.manage": "Gestisci abbonamento",
"workspace.black.subscription.rollingUsage": "Utilizzo di 5 ore",
"workspace.black.subscription.weeklyUsage": "Utilizzo settimanale",
"workspace.black.subscription.resetsIn": "Si reimposta tra",
"workspace.black.subscription.useBalance": "Utilizza il saldo disponibile dopo aver raggiunto i limiti di utilizzo",
"workspace.black.waitlist.title": "Lista d'attesa",
"workspace.black.waitlist.joined": "Sei in lista d'attesa per il piano OpenCode Black da ${{plan}} al mese.",
"workspace.black.waitlist.ready": "Siamo pronti per iscriverti al piano OpenCode Black da ${{plan}} al mese.",
"workspace.black.waitlist.leave": "Lascia la lista d'attesa",
"workspace.black.waitlist.leaving": "Uscita in corso...",
"workspace.black.waitlist.left": "Uscito dalla lista d'attesa",
"workspace.black.waitlist.enroll": "Iscriversi",
"workspace.black.waitlist.enrolling": "Iscrizione...",
"workspace.black.waitlist.enrolled": "Iscritto",
"workspace.black.waitlist.enrollNote":
"Quando fai clic su Iscriviti, l'abbonamento inizia immediatamente e l'importo verrà addebitato sulla tua carta.",
"changelog.hero.subtitle": "Nuovi aggiornamenti e miglioramenti a OpenCode",
"changelog.empty": "Nessuna voce del changelog trovata.",
"changelog.viewJson": "Vedi JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmark",
"bench.list.table.agent": "Agente",
"bench.list.table.model": "Modello",
"bench.list.table.score": "Punteggio",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Task non trovato",
"bench.detail.na": "N/D",
"bench.detail.labels.agent": "Agente",
"bench.detail.labels.model": "Modello",
"bench.detail.labels.task": "Task",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Da",
"bench.detail.labels.to": "A",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Durata Media",
"bench.detail.labels.averageScore": "Punteggio Medio",
"bench.detail.labels.averageCost": "Costo Medio",
"bench.detail.labels.summary": "Riepilogo",
"bench.detail.labels.runs": "Esecuzioni",
"bench.detail.labels.score": "Punteggio",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalità",
"bench.detail.labels.weight": "peso",
"bench.detail.table.run": "Esecuzione",
"bench.detail.table.score": "Punteggio (Base - Penalità)",
"bench.detail.table.cost": "Costo",
"bench.detail.table.duration": "Durata",
"bench.detail.run.title": "Esecuzione {{n}}",
"bench.detail.rawJson": "Raw JSON",
} satisfies Dict

View File

@@ -4,420 +4,392 @@ import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
"nav.changelog": "\u5909\u66f4\u5c65\u6b74",
"nav.docs": "ドキュメント",
"nav.changelog": "変更履歴",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba",
"nav.enterprise": "エンタープライズ",
"nav.zen": "Zen",
"nav.login": "\u30ed\u30b0\u30a4\u30f3",
"nav.free": "\u7121\u6599",
"nav.home": "\u30db\u30fc\u30e0",
"nav.openMenu": "\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304f",
"nav.getStartedFree": "\u7121\u6599\u3067\u306f\u3058\u3081\u308b",
"nav.login": "ログイン",
"nav.free": "無料",
"nav.home": "ホーム",
"nav.openMenu": "メニューを開く",
"nav.getStartedFree": "無料ではじめる",
"nav.context.copyLogo": "\u30ed\u30b4\u3092SVG\u3067\u30b3\u30d4\u30fc",
"nav.context.copyWordmark": "\u30ef\u30fc\u30c9\u30de\u30fc\u30af\u3092SVG\u3067\u30b3\u30d4\u30fc",
"nav.context.brandAssets": "\u30d6\u30e9\u30f3\u30c9\u7d20\u6750",
"nav.context.copyLogo": "ロゴをSVGでコピー",
"nav.context.copyWordmark": "ワードマークをSVGでコピー",
"nav.context.brandAssets": "ブランド素材",
"footer.github": "GitHub",
"footer.docs": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
"footer.changelog": "\u5909\u66f4\u5c65\u6b74",
"footer.docs": "ドキュメント",
"footer.changelog": "変更履歴",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "\u30d6\u30e9\u30f3\u30c9",
"legal.privacy": "\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc",
"legal.terms": "\u5229\u7528\u898f\u7d04",
"legal.brand": "ブランド",
"legal.privacy": "プライバシー",
"legal.terms": "利用規約",
"email.title":
"\u65b0\u88fd\u54c1\u30ea\u30ea\u30fc\u30b9\u306e\u60c5\u5831\u3092\u3044\u3061\u65e9\u304f\u53d7\u3051\u53d6\u308b",
"email.subtitle":
"\u65e9\u671f\u30a2\u30af\u30bb\u30b9\u306e\u305f\u3081\u306b\u30a6\u30a7\u30a4\u30c8\u30ea\u30b9\u30c8\u306b\u767b\u9332\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
"email.placeholder": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9",
"email.subscribe": "\u767b\u9332",
"email.success":
"\u307b\u307c\u5b8c\u4e86\u3067\u3059\u3002\u53d7\u4fe1\u30c8\u30ec\u30a4\u3092\u78ba\u8a8d\u3057\u3066\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044",
"email.title": "新製品リリースの情報をいち早く受け取る",
"email.subtitle": "早期アクセスのためにウェイトリストに登録してください。",
"email.placeholder": "メールアドレス",
"email.subscribe": "登録",
"email.success": "ほぼ完了です。受信トレイを確認してメールアドレスを認証してください",
"notFound.title": "\u898b\u3064\u304b\u308a\u307e\u305b\u3093 | opencode",
"notFound.heading": "404 - \u30da\u30fc\u30b8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
"notFound.home": "\u30db\u30fc\u30e0",
"notFound.docs": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
"notFound.title": "見つかりません | OpenCode",
"notFound.heading": "404 - ページが見つかりません",
"notFound.home": "ホーム",
"notFound.docs": "ドキュメント",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"user.logout": "\u30ed\u30b0\u30a2\u30a6\u30c8",
"user.logout": "ログアウト",
"workspace.select": "\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u9078\u629e",
"workspace.createNew": "+ \u65b0\u3057\u3044\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f5c\u6210",
"workspace.modal.title": "\u65b0\u3057\u3044\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f5c\u6210",
"workspace.modal.placeholder": "\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u540d\u3092\u5165\u529b",
"workspace.select": "ワークスペースを選択",
"workspace.createNew": "+ 新しいワークスペースを作成",
"workspace.modal.title": "新しいワークスペースを作成",
"workspace.modal.placeholder": "ワークスペース名を入力",
"common.cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb",
"common.creating": "\u4f5c\u6210\u4e2d...",
"common.create": "\u4f5c\u6210",
"common.cancel": "キャンセル",
"common.creating": "作成中...",
"common.create": "作成",
"common.videoUnsupported":
"\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u306f video \u30bf\u30b0\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002",
"common.figure": "\u56f3{{n}}",
"common.videoUnsupported": "お使いのブラウザは video タグをサポートしていません。",
"common.figure": "図 {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "\u8a73\u3057\u304f\u898b\u308b",
"common.learnMore": "詳しく見る",
"home.title":
"OpenCode | \u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eAI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8",
"error.invalidPlan": "無効なプラン",
"error.workspaceRequired": "ワークスペースIDが必要です",
"error.alreadySubscribed": "このワークスペースは既にサブスクリプションを持っています",
"error.limitRequired": "制限値が必要です。",
"error.monthlyLimitInvalid": "有効な月間制限を設定してください。",
"error.workspaceNameRequired": "ワークスペース名が必要です。",
"error.nameTooLong": "名前は255文字以下である必要があります。",
"error.emailRequired": "メールアドレスが必要です",
"error.roleRequired": "ロールが必要です",
"error.idRequired": "IDが必要です",
"error.nameRequired": "名前が必要です",
"error.providerRequired": "プロバイダーが必要です",
"error.apiKeyRequired": "APIキーが必要です",
"error.modelRequired": "モデルが必要です",
"error.reloadAmountMin": "リロード額は少なくとも ${{amount}} である必要があります",
"error.reloadTriggerMin": "残高トリガーは少なくとも ${{amount}} である必要があります",
"home.banner.badge": "\u65b0\u7740",
"home.banner.text":
"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u304c\u30d9\u30fc\u30bf\u7248\u3067\u5229\u7528\u53ef\u80fd",
"home.banner.platforms": "macOS\u3001Windows\u3001Linux\u3067",
"home.banner.downloadNow": "\u4eca\u3059\u3050\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"home.banner.downloadBetaNow":
"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306e\u30d9\u30fc\u30bf\u7248\u3092\u4eca\u3059\u3050\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"home.title": "OpenCode | オープンソースのAIコーディングエージェント",
"home.hero.title":
"\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eAI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8",
"home.hero.subtitle.a":
"\u7121\u6599\u30e2\u30c7\u30eb\u4ed8\u304d\u3002\u4efb\u610f\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u306e\u4efb\u610f\u306e\u30e2\u30c7\u30eb\u306b\u63a5\u7d9a\u3067\u304d\u3001",
"home.hero.subtitle.b": "Claude\u3001GPT\u3001Gemini\u306a\u3069\u306b\u3082\u5bfe\u5fdc\u3057\u307e\u3059\u3002",
"temp.title": "OpenCode | ターミナル向けに構築されたAIコーディングエージェント",
"temp.hero.title": "ターミナル向けに構築されたAIコーディングエージェント",
"temp.zen": "OpenCode Zen",
"temp.getStarted": "はじめる",
"temp.feature.native.title": "ネイティブ TUI",
"temp.feature.native.body": "レスポンシブでネイティブ、テーマ変更可能なターミナルUI",
"temp.feature.zen.beforeLink": "OpenCodeが提供する",
"temp.feature.zen.link": "厳選されたモデルリスト",
"temp.feature.zen.afterLink": "",
"temp.feature.models.beforeLink": "ローカルモデルを含む、",
"temp.feature.models.afterLink": "を通じて75以上のLLMプロバイダーをサポート",
"temp.screenshot.caption": "tokyonight テーマを使用した OpenCode TUI",
"temp.screenshot.alt": "tokyonight テーマの OpenCode TUI",
"home.install.ariaLabel": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5",
"home.banner.badge": "新着",
"home.banner.text": "デスクトップアプリのベータ版が利用可能",
"home.banner.platforms": "macOS、Windows、Linux で",
"home.banner.downloadNow": "今すぐダウンロード",
"home.banner.downloadBetaNow": "デスクトップベータ版を今すぐダウンロード",
"home.what.title": "OpenCode\u3068\u306f\uff1f",
"home.hero.title": "オープンソースのAIコーディングエージェント",
"home.hero.subtitle.a": "無料モデルが含まれています。また、任意のプロバイダーの任意のモデルに接続でき、",
"home.hero.subtitle.b": "Claude、GPT、Gemini などにも対応します。",
"home.install.ariaLabel": "インストールオプション",
"home.what.title": "OpenCodeとは",
"home.what.body":
"OpenCode\u306f\u3001\u30bf\u30fc\u30df\u30ca\u30eb\u3001IDE\u3001\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u3067\u306e\u30b3\u30fc\u30c9\u4f5c\u6210\u3092\u652f\u63f4\u3059\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3059\u3002",
"home.what.lsp.title": "LSP\u5bfe\u5fdc",
"home.what.lsp.body": "LLM\u306b\u9069\u3057\u305fLSP\u3092\u81ea\u52d5\u3067\u8aad\u307f\u8fbc\u307f\u307e\u3059",
"home.what.multiSession.title": "\u30de\u30eb\u30c1\u30bb\u30c3\u30b7\u30e7\u30f3",
"home.what.multiSession.body":
"\u540c\u3058\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u8907\u6570\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u4e26\u884c\u5b9f\u884c\u3067\u304d\u307e\u3059",
"home.what.shareLinks.title": "\u5171\u6709\u30ea\u30f3\u30af",
"home.what.shareLinks.body":
"\u53c2\u7167\u3084\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306b\u3001\u4efb\u610f\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u3078\u306e\u30ea\u30f3\u30af\u3092\u5171\u6709\u3067\u304d\u307e\u3059",
"OpenCodeは、ターミナル、IDE、またはデスクトップでのコード作成を支援するオープンソースのエージェントです。",
"home.what.lsp.title": "LSP対応",
"home.what.lsp.body": "LLMに適したLSPを自動的に読み込みます",
"home.what.multiSession.title": "マルチセッション",
"home.what.multiSession.body": "同じプロジェクトで複数のエージェントを並行実行できます",
"home.what.shareLinks.title": "共有リンク",
"home.what.shareLinks.body": "参照やデバッグのために、任意のセッションへのリンクを共有できます",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body":
"GitHub\u3067\u30ed\u30b0\u30a4\u30f3\u3057\u3066Copilot\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u5229\u7528\u3067\u304d\u307e\u3059",
"home.what.copilot.body": "GitHubでログインしてCopilotアカウントを利用できます",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body":
"OpenAI\u3067\u30ed\u30b0\u30a4\u30f3\u3057\u3066ChatGPT Plus/Pro\u3092\u5229\u7528\u3067\u304d\u307e\u3059",
"home.what.anyModel.title": "\u3042\u3089\u3086\u308b\u30e2\u30c7\u30eb",
"home.what.anyModel.body":
"Models.dev\u7d4c\u7531\u306775\u4ee5\u4e0a\u306eLLM\u30d7\u30ed\u30d0\u30a4\u30c0\u306b\u5bfe\u5fdc\uff08\u30ed\u30fc\u30ab\u30eb\u30e2\u30c7\u30eb\u542b\u3080\uff09",
"home.what.anyEditor.title": "\u3042\u3089\u3086\u308b\u30a8\u30c7\u30a3\u30bf",
"home.what.anyEditor.body":
"\u30bf\u30fc\u30df\u30ca\u30ebUI\u3001\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u3001IDE\u62e1\u5f35\u3068\u3057\u3066\u5229\u7528\u3067\u304d\u307e\u3059",
"home.what.readDocs": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u8aad\u3080",
"home.what.chatgptPlus.body": "OpenAIでログインしてChatGPT PlusまたはProアカウントを利用できます",
"home.what.anyModel.title": "あらゆるモデル",
"home.what.anyModel.body": "Models.dev経由で75以上のLLMプロバイダーに対応ローカルモデル含む",
"home.what.anyEditor.title": "あらゆるエディタ",
"home.what.anyEditor.body": "ターミナルインターフェース、デスクトップアプリ、IDE拡張機能として利用できます",
"home.what.readDocs": "ドキュメントを読む",
"home.growth.title":
"\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eAI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8",
"home.growth.title": "オープンソースのAIコーディングエージェント",
"home.growth.body":
"GitHub\u30b9\u30bf\u30fc<strong>{{stars}}</strong>\u4ee5\u4e0a\u3001\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30fc<strong>{{contributors}}</strong>\u4eba\u3001\u30b3\u30df\u30c3\u30c8<strong>{{commits}}</strong>\u4ef6\u4ee5\u4e0a\u3002\u6bce\u6708<strong>{{monthlyUsers}}</strong>\u4eba\u4ee5\u4e0a\u306e\u958b\u767a\u8005\u306b\u5229\u7528\u30fb\u4fe1\u983c\u3055\u308c\u3066\u3044\u307e\u3059\u3002",
"home.growth.githubStars": "GitHub\u30b9\u30bf\u30fc",
"home.growth.contributors": "\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30fc",
"home.growth.monthlyDevs": "\u6708\u9593\u958b\u767a\u8005\u6570",
"GitHubスター<strong>{{stars}}</strong>以上、コントリビューター<strong>{{contributors}}</strong>人、コミット<strong>{{commits}}</strong>件以上。毎月<strong>{{monthlyUsers}}</strong>人以上の開発者に利用・信頼されています。",
"home.growth.githubStars": "GitHubスター",
"home.growth.contributors": "コントリビューター",
"home.growth.monthlyDevs": "月間開発者数",
"home.privacy.title": "\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u3092\u6700\u512a\u5148\u306b\u8a2d\u8a08",
"home.privacy.title": "プライバシーを最優先に設計",
"home.privacy.body":
"OpenCode\u306f\u30b3\u30fc\u30c9\u3084\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u4e00\u5207\u4fdd\u5b58\u3057\u306a\u3044\u305f\u3081\u3001\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u304c\u91cd\u8996\u3055\u308c\u308b\u74b0\u5883\u3067\u3082\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"home.privacy.learnMore": "\u8a73\u3057\u304f\u306f",
"home.privacy.link": "\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc",
"OpenCodeはコードやコンテキストデータを一切保存しないため、プライバシーが重視される環境でも利用できます。",
"home.privacy.learnMore": "詳しくは",
"home.privacy.link": "プライバシー",
"home.faq.q1": "OpenCode\u3068\u306f\uff1f",
"home.faq.q1": "OpenCodeとは?",
"home.faq.a1":
"OpenCode\u306f\u3001\u4efb\u610f\u306eAI\u30e2\u30c7\u30eb\u3067\u30b3\u30fc\u30c9\u306e\u4f5c\u6210\u30fb\u5b9f\u884c\u3092\u652f\u63f4\u3059\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3059\u3002\u30bf\u30fc\u30df\u30ca\u30eb\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3001\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u3001IDE\u62e1\u5f35\u3068\u3057\u3066\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"home.faq.q2": "OpenCode\u306e\u4f7f\u3044\u65b9\u306f\uff1f",
"home.faq.a2.before": "\u6700\u3082\u7c21\u5358\u306a\u59cb\u3081\u65b9\u306f",
"home.faq.a2.link": "\u30a4\u30f3\u30c8\u30ed\u3092\u8aad\u3080",
"home.faq.q3":
"OpenCode\u306b\u306f\u8ffd\u52a0\u306eAI\u30b5\u30d6\u30b9\u30af\u304c\u5fc5\u8981\u3067\u3059\u304b\uff1f",
"home.faq.a3.p1":
"\u5fc5\u305a\u3057\u3082\u5fc5\u8981\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002OpenCode\u306b\u306f\u3001\u30a2\u30ab\u30a6\u30f3\u30c8\u4e0d\u8981\u3067\u4f7f\u3048\u308b\u7121\u6599\u30e2\u30c7\u30eb\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002",
"home.faq.a3.p2.beforeZen": "\u307e\u305f\u3001",
"home.faq.a3.p2.afterZen":
"\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u3067\u3001\u4eba\u6c17\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30e2\u30c7\u30eb\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"OpenCodeは、任意のAIモデルでコードの作成・実行を支援するオープンソースのエージェントです。ターミナルベースのインターフェース、デスクトップアプリ、IDE拡張として利用できます。",
"home.faq.q2": "OpenCodeの使い方は?",
"home.faq.a2.before": "最も簡単な始め方は",
"home.faq.a2.link": "イントロを読む",
"home.faq.q3": "OpenCodeには追加のAIサブスクリプションが必要ですか",
"home.faq.a3.p1": "必ずしも必要ではありません。OpenCodeには、アカウント不要で使える無料モデルが含まれています。",
"home.faq.a3.p2.beforeZen": "これらに加えて、",
"home.faq.a3.p2.afterZen": " アカウントを作成することで、人気のコーディングモデルを利用できます。",
"home.faq.a3.p3":
"Zen\u306e\u5229\u7528\u3092\u63a8\u5968\u3057\u3066\u3044\u307e\u3059\u304c\u3001OpenCode\u306fOpenAI\u3001Anthropic\u3001xAI\u306a\u3069\u306e\u4e3b\u8981\u30d7\u30ed\u30d0\u30a4\u30c0\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002",
"home.faq.a3.p4.beforeLocal": "\u3055\u3089\u306b\u3001",
"home.faq.a3.p4.localLink": "\u30ed\u30fc\u30ab\u30eb\u30e2\u30c7\u30eb",
"home.faq.q4": "\u65e2\u5b58\u306eAI\u30b5\u30d6\u30b9\u30af\u3092OpenCode\u3067\u4f7f\u3048\u307e\u3059\u304b\uff1f",
"Zenの利用を推奨していますが、OpenCodeはOpenAI、Anthropic、xAIなどの主要プロバイダーにも対応しています。",
"home.faq.a3.p4.beforeLocal": "さらに、",
"home.faq.a3.p4.localLink": "ローカルモデル",
"home.faq.q4": "既存のAIサブスクリプションをOpenCodeで使えますか",
"home.faq.a4.p1":
"\u306f\u3044\u3002OpenCode\u306f\u4e3b\u8981\u30d7\u30ed\u30d0\u30a4\u30c0\u306e\u30b5\u30d6\u30b9\u30af\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002Claude Pro/Max\u3001ChatGPT Plus/Pro\u3001GitHub Copilot\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"home.faq.q5": "\u30bf\u30fc\u30df\u30ca\u30eb\u3060\u3051\u3067\u4f7f\u3048\u307e\u3059\u304b\uff1f",
"home.faq.a5.beforeDesktop": "\u3082\u3046\u9055\u3044\u307e\u3059! OpenCode\u306f\u4eca\u306f",
"home.faq.a5.desktop": "\u30c7\u30b9\u30af\u30c8\u30c3\u30d7",
"home.faq.a5.and": "\u3068",
"home.faq.a5.web": "\u30a6\u30a7\u30d6",
"home.faq.q6": "OpenCode\u306e\u4fa1\u683c\u306f\uff1f",
"はい、OpenCodeは主要プロバイダーのサブスクリプションプランに対応しています。Claude Pro/MaxChatGPT Plus/ProGitHub Copilotのサブスクリプションを利用できます。",
"home.faq.q5": "ターミナルだけで使えますか?",
"home.faq.a5.beforeDesktop": "もう違いますOpenCodeは今は",
"home.faq.a5.desktop": "デスクトップ",
"home.faq.a5.and": "",
"home.faq.a5.web": "ウェブ",
"home.faq.q6": "OpenCodeの価格は?",
"home.faq.a6":
"OpenCode\u306f100%\u7121\u6599\u3067\u4f7f\u3048\u307e\u3059\u3002\u7121\u6599\u30e2\u30c7\u30eb\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u4ed6\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u306b\u63a5\u7d9a\u3059\u308b\u5834\u5408\u306f\u8ffd\u52a0\u8cbb\u7528\u304c\u767a\u751f\u3059\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002",
"home.faq.q7": "\u30c7\u30fc\u30bf\u3068\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u306f\uff1f",
"home.faq.a7.p1":
"\u7121\u6599\u30e2\u30c7\u30eb\u3092\u4f7f\u3046\u5834\u5408\u3084\u5171\u6709\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3059\u308b\u5834\u5408\u306b\u306e\u307f\u3001\u30c7\u30fc\u30bf\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002",
"home.faq.a7.p2.beforeModels": "\u8a73\u3057\u304f\u306f",
"home.faq.a7.p2.modelsLink": "\u30e2\u30c7\u30eb\u306e\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc",
"home.faq.a7.p2.and": "\u3068",
"home.faq.a7.p2.shareLink": "\u5171\u6709\u30da\u30fc\u30b8\u306e\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc",
"home.faq.q8": "OpenCode\u306f\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u3067\u3059\u304b\uff1f",
"home.faq.a8.p1":
"\u306f\u3044\u3002OpenCode\u306f\u5b8c\u5168\u306b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u3067\u3059\u3002\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306f",
"home.faq.a8.p2": "\u306e",
"home.faq.a8.mitLicense": "MIT\u30e9\u30a4\u30bb\u30f3\u30b9",
"OpenCodeは100%無料で使えます。無料モデルも含まれています。他のプロバイダーに接続する場合は追加費用が発生することがあります。",
"home.faq.q7": "データとプライバシーは?",
"home.faq.a7.p1": "無料モデルを使う場合や共有リンクを作成する場合にのみ、データが保存されます。",
"home.faq.a7.p2.beforeModels": "詳しくは",
"home.faq.a7.p2.modelsLink": "モデルのプライバシー",
"home.faq.a7.p2.and": "と",
"home.faq.a7.p2.shareLink": "共有ページのプライバシー",
"home.faq.q8": "OpenCodeはオープンソースですか",
"home.faq.a8.p1": "はい、OpenCodeは完全にオープンソースです。ソースコードは",
"home.faq.a8.p2": "の",
"home.faq.a8.mitLicense": "MITライセンス",
"home.faq.a8.p3":
"\u306e\u3082\u3068\u3067\u516c\u958b\u3055\u308c\u3066\u304a\u308a\u3001\u8ab0\u3067\u3082\u4f7f\u7528\u30fb\u5909\u66f4\u30fb\u958b\u767a\u3078\u306e\u53c2\u52a0\u304c\u3067\u304d\u307e\u3059\u3002\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u306e\u8ab0\u3067\u3082issue\u3092\u8d77\u3053\u3057\u305f\u308a\u3001pull request\u3092\u9001\u3063\u305f\u308a\u3001\u6a5f\u80fd\u3092\u62e1\u5f35\u3067\u304d\u307e\u3059\u3002",
"のもとで公開されており、誰でも使用、変更、開発への参加ができます。コミュニティの誰でもissueを起こしたり、pull requestを送ったり、機能を拡張できます。",
"home.zenCta.title":
"\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306e\u4fe1\u983c\u3067\u304d\u308b\u6700\u9069\u5316\u30e2\u30c7\u30eb",
"home.zenCta.title": "コーディングエージェント向けの信頼できる最適化モデル",
"home.zenCta.body":
"Zen\u306f\u3001OpenCode\u304c\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306b\u30c6\u30b9\u30c8\u30fb\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u6e08\u307f\u306eAI\u30e2\u30c7\u30eb\u3092\u53b3\u9078\u3057\u3066\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30d7\u30ed\u30d0\u30a4\u30c0\u9593\u306e\u6027\u80fd\u30fb\u54c1\u8cea\u306e\u30d6\u30ec\u3092\u6c17\u306b\u305b\u305a\u3001\u691c\u8a3c\u6e08\u307f\u306e\u30e2\u30c7\u30eb\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"home.zenCta.link": "Zen\u306b\u3064\u3044\u3066\u77e5\u308b",
"Zenは、OpenCodeがコーディングエージェント向けにテスト・ベンチマーク済みのAIモデルを厳選して提供します。プロバイダー間の性能・品質のブレを気にせず、検証済みのモデルを利用できます。",
"home.zenCta.link": "Zenについて知る",
"download.title": "OpenCode | \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"zen.title":
"OpenCode Zen | \u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306e\u4fe1\u983c\u3067\u304d\u308b\u6700\u9069\u5316\u30e2\u30c7\u30eb\u3092\u53b3\u9078",
"zen.hero.title":
"\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306e\u4fe1\u983c\u3067\u304d\u308b\u6700\u9069\u5316\u30e2\u30c7\u30eb",
"zen.title": "OpenCode Zen | コーディングエージェント向けの信頼できる最適化モデル",
"zen.hero.title": "コーディングエージェント向けの信頼できる最適化モデル",
"zen.hero.body":
"Zen\u306f\u3001OpenCode\u304c\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306b\u30c6\u30b9\u30c8\u30fb\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u6e08\u307f\u306eAI\u30e2\u30c7\u30eb\u3092\u53b3\u9078\u3057\u3066\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30d7\u30ed\u30d0\u30a4\u30c0\u9593\u306e\u6027\u80fd\u30fb\u54c1\u8cea\u306e\u30d6\u30ec\u3092\u6c17\u306b\u305b\u305a\u3001\u691c\u8a3c\u6e08\u307f\u306e\u30e2\u30c7\u30eb\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"Zenは、OpenCodeがコーディングエージェント向けにテスト・ベンチマーク済みのAIモデルを厳選して提供します。プロバイダー間の性能・品質のブレを気にせず、検証済みのモデルを利用できます。",
"zen.faq.q1": "OpenCode Zen\u3068\u306f?",
"zen.faq.q1": "OpenCode Zenとは?",
"zen.faq.a1":
"Zen \u306f\u3001OpenCode \u306e\u30c1\u30fc\u30e0\u304c\u4f5c\u6210\u3057\u305f\u3001\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306b\u30c6\u30b9\u30c8\u30fb\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u3055\u308c\u305f AI \u30e2\u30c7\u30eb\u306e\u53b3\u9078\u30bb\u30c3\u30c8\u3067\u3059\u3002",
"zen.faq.q2": "Zen \u306f\u306a\u305c\u7cbe\u5ea6\u304c\u9ad8\u3044\u306e\u3067\u3059\u304b?",
"Zenは、OpenCodeのチームが作成した、コーディングエージェント向けにテスト・ベンチマークされたAIモデルの厳選セットです。",
"zen.faq.q2": "Zenはなぜ精度が高いのですか?",
"zen.faq.a2":
"Zen \u306f\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u5411\u3051\u306b\u30c6\u30b9\u30c8\u30fb\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u3055\u308c\u305f\u30e2\u30c7\u30eb\u3060\u3051\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30d0\u30bf\u30fc\u30ca\u30a4\u30d5\u3067\u30b9\u30c6\u30fc\u30ad\u3092\u5207\u3089\u306a\u3044\u3088\u3046\u306b\u3001\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306b\u306f\u8cea\u306e\u4f4e\u3044\u30e2\u30c7\u30eb\u3092\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"zen.faq.q3": "Zen \u306f\u5b89\u3044\u3067\u3059\u304b?",
"Zenはコーディングエージェント向けにテスト・ベンチマークされたモデルだけを提供します。ステーキを切るのにバターナイフを使わないように、コーディングには品質の低いモデルを使わないでください。",
"zen.faq.q3": "Zenは安いですか?",
"zen.faq.a3":
"Zen \u306f\u55b6\u5229\u76ee\u7684\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002Zen \u306f\u30e2\u30c7\u30eb\u63d0\u4f9b\u5143\u306e\u30b3\u30b9\u30c8\u3092\u305d\u306e\u307e\u307e\u3042\u306a\u305f\u306b\u6e21\u3057\u307e\u3059\u3002Zen \u306e\u5229\u7528\u304c\u5897\u3048\u308b\u307b\u3069\u3001OpenCode \u306f\u3088\u308a\u826f\u3044\u30ec\u30fc\u30c8\u3092\u4ea4\u6e09\u3057\u3001\u305d\u306e\u5206\u3092\u3042\u306a\u305f\u306b\u9084\u5143\u3067\u304d\u307e\u3059\u3002",
"zen.faq.q4": "Zen \u306e\u6599\u91d1\u306f?",
"zen.faq.a4.p1.beforePricing": "Zen \u306f",
"zen.faq.a4.p1.pricingLink": "\u30ea\u30af\u30a8\u30b9\u30c8\u5358\u4f4d\u3067\u8ab2\u91d1",
"zen.faq.a4.p1.afterPricing":
"\u3057\u3001\u30de\u30fc\u30af\u30a2\u30c3\u30d7\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u3064\u307e\u308a\u3001\u30e2\u30c7\u30eb\u63d0\u4f9b\u5143\u306e\u8acb\u6c42\u984d\u3092\u305d\u306e\u307e\u307e\u652f\u6255\u3044\u307e\u3059\u3002",
"zen.faq.a4.p2.beforeAccount":
"\u7dcf\u30b3\u30b9\u30c8\u306f\u5229\u7528\u91cf\u306b\u4f9d\u5b58\u3057\u3001\u6708\u6b21\u306e\u652f\u51fa\u4e0a\u9650\u3092",
"zen.faq.a4.p2.accountLink": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u8a2d\u5b9a\u3067\u304d\u307e\u3059",
"zen.faq.a4.p3":
"\u30b3\u30b9\u30c8\u3092\u8cc4\u3046\u305f\u3081\u306b\u3001OpenCode \u306f $20 \u306e\u6b8b\u9ad8\u30c1\u30e3\u30fc\u30b8\u3042\u305f\u308a $1.23 \u306e\u5c0f\u3055\u306a\u6c7a\u6e08\u624b\u6570\u6599\u306e\u307f\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002",
"zen.faq.q5": "\u30c7\u30fc\u30bf\u3068\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u306f?",
"Zenは営利目的ではありません。Zenはモデル提供元のコストをそのままあなたに渡します。Zenの利用が増えるほど、OpenCodeはより良いレートを交渉し、その分をあなたに還元できます。",
"zen.faq.q4": "Zenの料金は?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "リクエスト単位で課金",
"zen.faq.a4.p1.afterPricing": "し、マークアップはありません。つまり、モデル提供元の請求額をそのまま支払います。",
"zen.faq.a4.p2.beforeAccount": "総コストは利用量に依存し、月次の支出上限を",
"zen.faq.a4.p2.accountLink": "アカウント",
"zen.faq.a4.p3": "コストを賄うために、OpenCodeは$20の残高チャージあたり$1.23の小さな決済手数料のみを追加します。",
"zen.faq.q5": "データとプライバシーは?",
"zen.faq.a5.beforeExceptions":
"Zen \u306e\u30e2\u30c7\u30eb\u306f\u3059\u3079\u3066\u7c73\u56fd\u3067\u30db\u30b9\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30d7\u30ed\u30d0\u30a4\u30c0\u306f\u30bc\u30ed\u4fdd\u6301\u30dd\u30ea\u30b7\u30fc\u3092\u5b88\u308a\u3001\u30c7\u30fc\u30bf\u3092\u30e2\u30c7\u30eb\u5b66\u7fd2\u306b\u4f7f\u7528\u3057\u307e\u305b\u3093\u3002",
"zen.faq.a5.exceptionsLink": "\u4f8b\u5916\u306f\u3053\u3061\u3089",
"zen.faq.q6": "\u652f\u51fa\u4e0a\u9650\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u304b?",
"zen.faq.a6":
"\u306f\u3044\u3001\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u6708\u6b21\u306e\u652f\u51fa\u4e0a\u9650\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002",
"zen.faq.q7": "\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u3059\u304b?",
"zen.faq.a7":
"\u306f\u3044\u3001\u3044\u3064\u3067\u3082\u8acb\u6c42\u3092\u7121\u52b9\u5316\u3057\u3001\u6b8b\u308a\u306e\u6b8b\u9ad8\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"zen.faq.q8":
"\u4ed6\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3082 Zen \u3092\u4f7f\u3048\u307e\u3059\u304b?",
"Zenのモデルはすべて米国でホストされています。プロバイダーはゼロ保持ポリシーを守り、データをモデル学習に使用しません(",
"zen.faq.a5.exceptionsLink": "以下の例外",
"zen.faq.q6": "支出上限を設定できますか?",
"zen.faq.a6": "はい、アカウントで月次の支出上限を設定できます。",
"zen.faq.q7": "キャンセルできますか?",
"zen.faq.a7": "はい、いつでも請求を無効化し、残りの残高を利用できます。",
"zen.faq.q8": "他のコーディングエージェントでもZenを使えますか",
"zen.faq.a8":
"Zen \u306f OpenCode \u3068\u306e\u76f8\u6027\u304c\u826f\u3044\u3067\u3059\u304c\u3001\u3069\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3082 Zen \u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002\u304a\u4f7f\u3044\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806\u306b\u5f93\u3063\u3066\u304f\u3060\u3055\u3044\u3002",
"zen.cta.start": "Zen を始めましょう",
"zen.pricing.title": "$20 の従量課金制残高を追加",
"ZenはOpenCodeとの相性が良いですが、どのエージェントでもZenを利用できます。お使いのコーディングエージェントのセットアップ手順に従ってください。",
"zen.cta.start": "Zenをはじめる",
"zen.pricing.title": "$20の従量課金制残高を追加",
"zen.pricing.fee": "(+$1.23 カード処理手数料)",
"zen.pricing.body":
"任意のエージェントと一緒に使用ます。毎月の支出制限を設定ます。いつでもキャンセルしてください。",
"zen.problem.title": "Zen はどのような問題を解決していますか?",
"任意のエージェントと一緒に使用できます。毎月の支出制限を設定できます。いつでもキャンセルできます。",
"zen.problem.title": "Zenはどのような問題を解決していますか",
"zen.problem.body":
"利用可能なモデルは非常に多くありますが、コーディング エージェントで適切に機能するモデルはほんのわずかです。ほとんどのプロバイダーは、それらを異なる方法で構成し、結果も異なります。",
"zen.problem.subtitle": "OpenCode ユーザーだけでなく、すべての人を対象にこの問題を修正しています。",
"利用可能なモデルは非常に多くありますが、コーディングエージェントで適切に機能するモデルはほんのわずかです。ほとんどのプロバイダーは、それらを異なる設定で提供し、結果も異なります。",
"zen.problem.subtitle": "OpenCodeユーザーだけでなく、すべての人を対象にこの問題を修正しています。",
"zen.problem.item1": "選択したモデルをテストし、チームに相談する",
"zen.problem.item2": "プロバイダーと連携して適切に配信されるようにする",
"zen.problem.item3": "私たちが推奨するすべてのモデルとプロバイダーの組み合わせベンチマーク",
"zen.how.title": "Zen の仕組み",
"zen.how.body": "ZenOpenCode とともに使用することをお勧めしますが、Zen はどのエージェントでも使用できます。",
"zen.how.step1.title": "サインアップして 20 ドルの残高を追加してください",
"zen.how.step1.beforeLink": "に従ってください",
"zen.problem.item2": "プロバイダーと連携して適切に提供されるようにする",
"zen.problem.item3": "私たちが推奨するすべてのモデルとプロバイダーの組み合わせベンチマークする",
"zen.how.title": "Zenの仕組み",
"zen.how.body": "ZenOpenCodeとともに使用することをお勧めしますが、Zenはどのエージェントでも使用できます。",
"zen.how.step1.title": "サインアップして$20の残高を追加",
"zen.how.step1.beforeLink": "",
"zen.how.step1.link": "セットアップ手順",
"zen.how.step2.title": "透明性のある価格設定で Zen を使用する",
"zen.how.step2.title": "透明性のある価格設定でZenを使用する",
"zen.how.step2.link": "リクエストごとに支払う",
"zen.how.step2.afterLink": "値上げゼロで",
"zen.how.step3.title": "自動補充",
"zen.how.step3.body": "残高が 5 ドルに達すると、自動的に 20 ドルが追加されます",
"zen.how.step2.afterLink": "(マークアップなし)",
"zen.how.step3.title": "自動チャージ",
"zen.how.step3.body": "残高が$5に達すると、自動的に$20が追加されます",
"zen.privacy.title": "あなたのプライバシーは私たちにとって重要です",
"zen.privacy.beforeExceptions":
"すべての Zen モデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません",
"すべてのZenモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません",
"zen.privacy.exceptionsLink": "以下の例外",
"download.meta.description":
"macOS\u3001Windows\u3001Linux \u5411\u3051\u306b OpenCode \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u307e\u3059",
"download.hero.title": "OpenCode \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"download.hero.subtitle":
"macOS\u3001Windows\u3001Linux \u5411\u3051\u306b\u30d9\u30fc\u30bf\u7248\u3092\u63d0\u4f9b\u4e2d",
"download.hero.button": "{{os}} \u5411\u3051\u306b\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"download.section.terminal": "OpenCode \u30bf\u30fc\u30df\u30ca\u30eb",
"download.section.desktop": "OpenCode \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\uff08Beta\uff09",
"download.section.extensions": "OpenCode \u62e1\u5f35\u6a5f\u80fd",
"download.section.integrations": "OpenCode \u9023\u643a",
"download.action.download": "\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"download.action.install": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"\u5fc5\u305a\u3057\u3082\u305d\u3046\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u304c\u3001\u304a\u305d\u3089\u304f\u5fc5\u8981\u3067\u3059\u3002OpenCode \u3092\u6709\u6599\u30d7\u30ed\u30d0\u30a4\u30c0\u306b\u63a5\u7d9a\u3057\u305f\u3044\u5834\u5408\u306f AI \u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u304c\u5fc5\u8981\u3067\u3059\u304c\u3001",
"download.faq.a3.localLink": "\u30ed\u30fc\u30ab\u30eb\u30e2\u30c7\u30eb",
"download.faq.a3.afterLocal.beforeZen":
"\u306f\u7121\u6599\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u306b",
"download.faq.a3.afterZen":
"\u306e\u5229\u7528\u3092\u52e7\u3081\u3066\u3044\u307e\u3059\u304c\u3001OpenCode \u306f OpenAI\u3001Anthropic\u3001xAI \u306a\u3069\u306e\u4e3b\u8981\u306a\u30d7\u30ed\u30d0\u30a4\u30c0\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002",
"download.faq.a5.p1": "OpenCode \u306f 100% \u7121\u6599\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002",
"download.faq.a5.p2.beforeZen":
"\u8ffd\u52a0\u30b3\u30b9\u30c8\u306f\u30e2\u30c7\u30eb\u30d7\u30ed\u30d0\u30a4\u30c0\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u304b\u3089\u767a\u751f\u3057\u307e\u3059\u3002OpenCode \u306f\u3069\u306e\u30e2\u30c7\u30eb\u30d7\u30ed\u30d0\u30a4\u30c0\u3067\u3082\u5229\u7528\u3067\u304d\u307e\u3059\u304c\u3001",
"download.faq.a5.p2.afterZen": "\u306e\u5229\u7528\u3092\u304a\u3059\u3059\u3081\u3057\u307e\u3059\u3002",
"download.faq.a6.p1":
"\u3042\u306a\u305f\u306e\u30c7\u30fc\u30bf\u3068\u60c5\u5831\u306f\u3001OpenCode \u3067\u5171\u6709\u53ef\u80fd\u306a\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3057\u305f\u3068\u304d\u306b\u306e\u307f\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002",
"download.faq.a6.p2.beforeShare": "\u8a73\u3057\u304f\u306f",
"download.faq.a6.shareLink": "\u5171\u6709\u30da\u30fc\u30b8",
"black.meta.title": "OpenCode Black | 世界最高峰のコーディングモデルすべてにアクセス",
"black.meta.description": "OpenCode Black サブスクリプションプランで、Claude、GPT、Gemini などにアクセス。",
"black.hero.title": "世界最高峰のコーディングモデルすべてにアクセス",
"black.hero.subtitle": "Claude、GPT、Gemini などを含む",
"black.title": "OpenCode Black | 料金",
"black.plan.icon20": "Black 20 プラン",
"black.plan.icon100": "Black 100 プラン",
"black.plan.icon200": "Black 200 プラン",
"black.plan.multiplier100": "Black 20 の5倍の利用量",
"black.plan.multiplier200": "Black 20 の20倍の利用量",
"black.price.perMonth": "/月",
"black.price.perPersonBilledMonthly": "1人あたり / 月額請求",
"black.terms.1": "サブスクリプションはすぐには開始されません",
"black.terms.2": "ウェイトリストに追加され、まもなく有効化されます",
"black.terms.3": "サブスクリプションが有効化された時点でのみカードに請求されます",
"black.terms.4": "利用制限が適用されます。過度な自動化利用は早く制限に達する可能性があります",
"black.terms.5": "サブスクリプションは個人向けです。チーム利用はエンタープライズにお問い合わせください",
"black.terms.6": "将来的に制限が調整されたり、プランが廃止される可能性があります",
"black.terms.7": "サブスクリプションはいつでもキャンセル可能です",
"black.action.continue": "続ける",
"black.finePrint.beforeTerms": "表示価格には適用される税金は含まれていません",
"black.finePrint.terms": "利用規約",
"black.workspace.title": "OpenCode Black | ワークスペースの選択",
"black.workspace.selectPlan": "このプランのワークスペースを選択してください",
"black.workspace.name": "ワークスペース {{n}}",
"black.subscribe.title": "OpenCode Black を購読する",
"black.subscribe.paymentMethod": "支払い方法",
"black.subscribe.loadingPaymentForm": "支払いフォームを読み込み中...",
"black.subscribe.selectWorkspaceToContinue": "続けるにはワークスペースを選択してください",
"black.subscribe.failurePrefix": "おっと!",
"black.subscribe.error.generic": "エラーが発生しました",
"black.subscribe.error.invalidPlan": "無効なプランです",
"black.subscribe.error.workspaceRequired": "ワークスペースIDが必要です",
"black.subscribe.error.alreadySubscribed": "このワークスペースは既にサブスクリプションを持っています",
"black.subscribe.processing": "処理中...",
"black.subscribe.submit": "購読する ${{plan}}",
"black.subscribe.form.chargeNotice": "サブスクリプションが有効化された時点でのみ請求されます",
"black.subscribe.success.title": "OpenCode Black ウェイトリストに登録されました",
"black.subscribe.success.subscriptionPlan": "サブスクリプションプラン",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "金額",
"black.subscribe.success.amountValue": "${{plan}} / 月",
"black.subscribe.success.paymentMethod": "支払い方法",
"black.subscribe.success.dateJoined": "登録日",
"black.subscribe.success.chargeNotice": "サブスクリプションが有効化された時点でカードに請求されます",
"enterprise.title":
"OpenCode | \u7d44\u7e54\u5411\u3051\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3",
"enterprise.meta.description":
"\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066 OpenCode \u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044",
"enterprise.hero.title": "\u3042\u306a\u305f\u306e\u30b3\u30fc\u30c9\u306f\u3042\u306a\u305f\u306e\u3082\u306e",
"enterprise.hero.body1":
"OpenCode \u306f\u3001\u30c7\u30fc\u30bf\u3084\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u4fdd\u5b58\u305b\u305a\u3001\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u5236\u9650\u3084\u6240\u6709\u6a29\u306e\u4e3b\u5f35\u3082\u306a\u304f\u3001\u7d44\u7e54\u5185\u3067\u5b89\u5168\u306b\u52d5\u4f5c\u3057\u307e\u3059\u3002\u30c1\u30fc\u30e0\u3067\u30c8\u30e9\u30a4\u30a2\u30eb\u3092\u958b\u59cb\u3057\u3001\u305d\u306e\u5f8c SSO \u3068\u793e\u5185 AI \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3068\u7d71\u5408\u3057\u3066\u7d44\u7e54\u5168\u4f53\u306b\u5c55\u958b\u3067\u304d\u307e\u3059\u3002",
"enterprise.hero.body2":
"\u3069\u306e\u3088\u3046\u306b\u304a\u624b\u4f1d\u3044\u3067\u304d\u308b\u304b\u304a\u805e\u304b\u305b\u304f\u3060\u3055\u3044\u3002",
"enterprise.form.name.label": "\u6c0f\u540d",
"enterprise.form.name.placeholder": "\u30b8\u30a7\u30d5\u30fb\u30d9\u30be\u30b9",
"enterprise.form.role.label": "\u5f79\u8077",
"enterprise.form.role.placeholder": "\u53d6\u7de0\u5f79\u4f1a\u4f1a\u9577",
"enterprise.form.email.label": "\u4f1a\u793e\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "\u89e3\u6c7a\u3057\u305f\u3044\u8ab2\u984c\u306f\u4f55\u3067\u3059\u304b\uff1f",
"enterprise.form.message.placeholder":
"\u79c1\u305f\u3061\u306f...\u306b\u3064\u3044\u3066\u52a9\u3051\u304c\u5fc5\u8981\u3067\u3059",
"enterprise.form.send": "\u9001\u4fe1",
"enterprise.form.sending": "\u9001\u4fe1\u4e2d...",
"enterprise.form.success":
"\u9001\u4fe1\u3057\u307e\u3057\u305f\u3002\u8fd1\u65e5\u4e2d\u306b\u3054\u9023\u7d61\u3057\u307e\u3059\u3002",
"enterprise.faq.title": "\u3088\u304f\u3042\u308b\u8cea\u554f",
"enterprise.faq.q1": "OpenCode Enterprise \u3068\u306f\uff1f",
"enterprise.faq.a1":
"OpenCode Enterprise \u306f\u3001\u30b3\u30fc\u30c9\u3068\u30c7\u30fc\u30bf\u304c\u6c7a\u3057\u3066\u30a4\u30f3\u30d5\u30e9\u306e\u5916\u306b\u51fa\u306a\u3044\u3053\u3068\u3092\u4fdd\u8a3c\u3057\u305f\u3044\u7d44\u7e54\u5411\u3051\u3067\u3059\u3002SSO \u3068\u793e\u5185 AI \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3068\u9023\u643a\u3059\u308b\u96c6\u4e2d\u7ba1\u7406\u306e\u8a2d\u5b9a\u306b\u3088\u3063\u3066\u5b9f\u73fe\u3057\u307e\u3059\u3002",
"enterprise.faq.q2": "OpenCode Enterprise \u3092\u59cb\u3081\u308b\u306b\u306f\uff1f",
"enterprise.faq.a2":
"\u307e\u305a\u306f\u30c1\u30fc\u30e0\u3067\u793e\u5185\u30c8\u30e9\u30a4\u30a2\u30eb\u3092\u59cb\u3081\u3066\u304f\u3060\u3055\u3044\u3002OpenCode \u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u30b3\u30fc\u30c9\u3084\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3057\u306a\u3044\u305f\u3081\u3001\u7c21\u5358\u306b\u59cb\u3081\u3089\u308c\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u4fa1\u683c\u3084\u5c0e\u5165\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3054\u76f8\u8ac7\u304f\u3060\u3055\u3044\u3002",
"enterprise.faq.q3":
"\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u4fa1\u683c\u306f\u3069\u306e\u3088\u3046\u306b\u6c7a\u307e\u308a\u307e\u3059\u304b\uff1f",
"enterprise.faq.a3":
"\u5e2d\u5358\u4f4d\uff08\u30e6\u30fc\u30b6\u30fc\u6570\uff09\u3067\u306e\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u4fa1\u683c\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u72ec\u81ea\u306e LLM \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u304c\u3042\u308b\u5834\u5408\u3001\u4f7f\u7528\u3057\u305f\u30c8\u30fc\u30af\u30f3\u306b\u5bfe\u3057\u3066\u8ab2\u91d1\u3057\u307e\u305b\u3093\u3002\u8a73\u7d30\u306f\u3001\u7d44\u7e54\u306e\u8981\u4ef6\u306b\u57fa\u3065\u3044\u305f\u304a\u898b\u7a4d\u308a\u306e\u305f\u3081\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002",
"enterprise.faq.q4": "OpenCode Enterprise \u3067\u30c7\u30fc\u30bf\u306f\u5b89\u5168\u3067\u3059\u304b\uff1f",
"enterprise.faq.a4":
"\u306f\u3044\u3002OpenCode \u306f\u30b3\u30fc\u30c9\u3084\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3057\u307e\u305b\u3093\u3002\u51e6\u7406\u306f\u30ed\u30fc\u30ab\u30eb\u3067\u884c\u308f\u308c\u308b\u304b\u3001AI \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3078\u306e\u76f4\u63a5 API \u547c\u3073\u51fa\u3057\u3092\u901a\u3058\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\u96c6\u4e2d\u7ba1\u7406\u306e\u8a2d\u5b9a\u3068 SSO \u9023\u643a\u306b\u3088\u308a\u3001\u30c7\u30fc\u30bf\u306f\u7d44\u7e54\u306e\u30a4\u30f3\u30d5\u30e9\u5185\u3067\u5b89\u5168\u306b\u4fdd\u305f\u308c\u307e\u3059\u3002",
"brand.title": "OpenCode | \u30d6\u30e9\u30f3\u30c9",
"brand.meta.description": "OpenCode \u30d6\u30e9\u30f3\u30c9\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3",
"brand.heading": "\u30d6\u30e9\u30f3\u30c9\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3",
"brand.subtitle":
"OpenCode \u30d6\u30e9\u30f3\u30c9\u3092\u6271\u3046\u305f\u3081\u306e\u30ea\u30bd\u30fc\u30b9\u3068\u7d20\u6750\u3067\u3059\u3002",
"brand.downloadAll": "\u3059\u3079\u3066\u306e\u7d20\u6750\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
"changelog.title": "OpenCode | \u5909\u66f4\u5c65\u6b74",
"changelog.meta.description":
"OpenCode \u306e\u30ea\u30ea\u30fc\u30b9\u30ce\u30fc\u30c8\u3068\u5909\u66f4\u5c65\u6b74",
"changelog.hero.title": "\u5909\u66f4\u5c65\u6b74",
"changelog.hero.subtitle": "OpenCode \u306e\u66f4\u65b0\u3068\u6539\u5584",
"changelog.empty": "\u5909\u66f4\u5c65\u6b74\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002",
"changelog.viewJson": "JSON \u3092\u8868\u793a",
"workspace.nav.zen": "禅",
"workspace.nav.apiKeys": "API キー",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "APIキー",
"workspace.nav.members": "メンバー",
"workspace.nav.billing": "請求する",
"workspace.nav.billing": "請求",
"workspace.nav.settings": "設定",
"workspace.home.banner.beforeLink": "コーディングエージェント向けに信頼性の高い最適化されたモデル。",
"workspace.home.billing.loading": "読み込み中...",
"workspace.home.billing.enable": "課金を有効にする",
"workspace.home.billing.currentBalance": "現在の残高",
"workspace.newUser.feature.tested.title": "テストおよび検証されたモデル",
"workspace.newUser.feature.tested.title": "テスト・検証済みモデル",
"workspace.newUser.feature.tested.body":
"最高のパフォーマンスを保証するために、コーディング エージェントに特化したモデルのベンチマークとテストを行いました。",
"workspace.newUser.feature.quality.title": "最高品質",
"最高のパフォーマンスを保証するために、コーディングエージェントに特化したモデルのベンチマークとテストを行いました。",
"workspace.newUser.feature.quality.title": "最高品質",
"workspace.newUser.feature.quality.body":
"最適なパフォーマンスを実現するように構成されたモデルにアクセスします。ダウングレードしたり、より安価なプロバイダールーティングしたりする必要はありません。",
"最適なパフォーマンスを実現するように構成されたモデルにアクセスします。ダウングレード安価なプロバイダーへのルーティングはありません。",
"workspace.newUser.feature.lockin.title": "ロックインなし",
"workspace.newUser.feature.lockin.body":
"任意のコーディング エージェントで Zen を使用、必要に応じていつでも opencode を備えた他のプロバイダーを使用し続けます。",
"workspace.newUser.copyApiKey": "API キーをコピーします",
"workspace.newUser.copyKey": "キーをコピーする",
"任意のコーディングエージェントでZenを使用でき、必要に応じていつでもOpenCodeを備えた他のプロバイダーを使用し続けることができます。",
"workspace.newUser.copyApiKey": "APIキーをコピー",
"workspace.newUser.copyKey": "キーをコピー",
"workspace.newUser.copied": "コピーしました!",
"workspace.newUser.step.enableBilling": "課金を有効にする",
"workspace.newUser.step.login.before": "走る",
"workspace.newUser.step.login.after": "opencode を選択します",
"workspace.newUser.step.pasteKey": "API キーを貼り付けます",
"workspace.newUser.step.models.before": "opencode を開始して実行します",
"workspace.newUser.step.models.after": "モデルを選択するには",
"workspace.newUser.step.login.before": "実行",
"workspace.newUser.step.login.after": "してOpenCodeを選択",
"workspace.newUser.step.pasteKey": "APIキーを貼り付け",
"workspace.newUser.step.models.before": "OpenCodeを起動し実行",
"workspace.newUser.step.models.after": "してモデルを選択",
"workspace.models.title": "モデル",
"workspace.models.subtitle.beforeLink": "ワークスペースのメンバーがアクセスできるモデルを管理します。",
"workspace.models.table.model": "モデル",
"workspace.models.table.enabled": "有効",
"workspace.providers.title": "自分の鍵を持参する",
"workspace.providers.subtitle": "AI プロバイダーから独自の API キーを構成します。",
"workspace.providers.placeholder": "{{provider}} API キー ({{prefix}}...) を入力してください",
"workspace.providers.configure": "設定する",
"workspace.providers.title": "APIキーの設定",
"workspace.providers.subtitle": "AIプロバイダーの独自のAPIキーを設定します。",
"workspace.providers.placeholder": "{{provider}} APIキーを入力 ({{prefix}}...)",
"workspace.providers.configure": "設定",
"workspace.providers.edit": "編集",
"workspace.providers.delete": "消去",
"workspace.providers.delete": "削除",
"workspace.providers.saving": "保存中...",
"workspace.providers.save": "保存",
"workspace.providers.table.provider": "プロバイダー",
"workspace.providers.table.apiKey": "API キー",
"workspace.providers.table.apiKey": "APIキー",
"workspace.usage.title": "利用履歴",
"workspace.usage.subtitle": "最近の API の使用状況とコスト。",
"workspace.usage.empty": "開始するには、最初の API 呼び出しを行ってください。",
"workspace.usage.subtitle": "最近のAPIの使用状況とコスト。",
"workspace.usage.empty": "開始するには、最初のAPI呼び出しを行ってください。",
"workspace.usage.table.date": "日付",
"workspace.usage.table.model": "モデル",
"workspace.usage.table.input": "入力",
"workspace.usage.table.output": "出力",
"workspace.usage.table.cost": "料金",
"workspace.usage.table.cost": "コスト",
"workspace.usage.breakdown.input": "入力",
"workspace.usage.breakdown.cacheRead": "キャッシュ読み取り",
"workspace.usage.breakdown.cacheWrite": "キャッシュ書き込み",
"workspace.usage.breakdown.output": "出力",
"workspace.usage.breakdown.reasoning": "推論",
"workspace.usage.subscription": "サブスクリプション (${{amount}})",
"workspace.cost.title": "料金",
"workspace.cost.title": "コスト",
"workspace.cost.subtitle": "モデルごとの使用料金の内訳。",
"workspace.cost.allModels": "全モデル",
"workspace.cost.allKeys": "すべてのキー",
"workspace.cost.deletedSuffix": "(削除されました)",
"workspace.cost.deletedSuffix": "(削除済み)",
"workspace.cost.empty": "選択した期間の使用状況データはありません。",
"workspace.cost.subscriptionShort": "サブ",
"workspace.keys.title": "API キー",
"workspace.keys.subtitle": "opencode サービスにアクセスするための API キーを管理します。",
"workspace.keys.create": "API キーの作成",
"workspace.keys.title": "APIキー",
"workspace.keys.subtitle": "OpenCodeサービスにアクセスするためのAPIキーを管理します。",
"workspace.keys.create": "APIキーの作成",
"workspace.keys.placeholder": "キー名を入力してください",
"workspace.keys.empty": "opencode ゲートウェイ API キーを作成する",
"workspace.keys.empty": "OpenCodeゲートウェイAPIキーを作成する",
"workspace.keys.table.name": "名前",
"workspace.keys.table.key": "",
"workspace.keys.table.key": "キー",
"workspace.keys.table.createdBy": "作成者",
"workspace.keys.table.lastUsed": "最後に使用したもの",
"workspace.keys.copyApiKey": "API キーをコピーします",
"workspace.keys.delete": "消去",
"workspace.keys.table.lastUsed": "最終利用",
"workspace.keys.copyApiKey": "APIキーをコピー",
"workspace.keys.delete": "削除",
"workspace.members.title": "メンバー",
"workspace.members.subtitle": "ワークスペースのメンバーとその権限を管理します。",
"workspace.members.invite": "メンバーを招待する",
"workspace.members.invite": "メンバーを招待",
"workspace.members.inviting": "招待中...",
"workspace.members.beta.beforeLink": "ベータ期間中、チームはワークスペースを無料で利用できます。",
"workspace.members.form.invitee": "招待",
"workspace.members.form.emailPlaceholder": "メールアドレスを入力してください",
"workspace.members.form.role": "役割",
"workspace.members.form.monthlyLimit": "月々の利用限度額",
"workspace.members.form.invitee": "招待する人",
"workspace.members.form.emailPlaceholder": "メールアドレスを入力",
"workspace.members.form.role": "ロール",
"workspace.members.form.monthlyLimit": "月間支出上限",
"workspace.members.noLimit": "制限なし",
"workspace.members.noLimitLowercase": "制限なし",
"workspace.members.invited": "招待されました",
"workspace.members.invited": "招待済み",
"workspace.members.edit": "編集",
"workspace.members.delete": "消去",
"workspace.members.delete": "削除",
"workspace.members.saving": "保存中...",
"workspace.members.save": "保存",
"workspace.members.table.email": "電子メール",
"workspace.members.table.role": "役割",
"workspace.members.table.monthLimit": "月の制限",
"workspace.members.table.email": "メールアドレス",
"workspace.members.table.role": "ロール",
"workspace.members.table.monthLimit": "月間上限",
"workspace.members.role.admin": "管理者",
"workspace.members.role.adminDescription": "モデル、メンバー、請求を管理でき",
"workspace.members.role.adminDescription": "モデル、メンバー、請求を管理できます",
"workspace.members.role.member": "メンバー",
"workspace.members.role.memberDescription": "自分自身の API キーのみを生成できます",
"workspace.members.role.memberDescription": "自分自身のAPIキーのみを生成できます",
"workspace.settings.title": "設定",
"workspace.settings.subtitle": "ワークスペース名と設定を更新します。",
"workspace.settings.workspaceName": "ワークスペース名",
@@ -425,58 +397,63 @@ export const dict = {
"workspace.settings.updating": "更新中...",
"workspace.settings.save": "保存",
"workspace.settings.edit": "編集",
"workspace.billing.title": "請求する",
"workspace.billing.title": "請求",
"workspace.billing.subtitle.beforeLink": "支払い方法を管理します。",
"workspace.billing.contactUs": "お問い合わせ",
"workspace.billing.subtitle.afterLink": "ご質問がございましたら。",
"workspace.billing.currentBalance": "現在の残高",
"workspace.billing.add": "$を追加",
"workspace.billing.enterAmount": "金額を入力してください",
"workspace.billing.enterAmount": "金額を入力",
"workspace.billing.loading": "読み込み中...",
"workspace.billing.addAction": "追加",
"workspace.billing.addBalance": "残高を追加",
"workspace.billing.linkedToStripe": "ストライプにリンク",
"workspace.billing.linkedToStripe": "Stripeと連携済み",
"workspace.billing.manage": "管理",
"workspace.billing.enable": "課金を有効にする",
"workspace.monthlyLimit.title": "月間限度額",
"workspace.monthlyLimit.title": "月間上限",
"workspace.monthlyLimit.subtitle": "アカウントの月間使用制限を設定します。",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "設定...",
"workspace.monthlyLimit.set": "セット",
"workspace.monthlyLimit.edit": "編集制限",
"workspace.monthlyLimit.setting": "設定...",
"workspace.monthlyLimit.set": "設定",
"workspace.monthlyLimit.edit": "上限を編集",
"workspace.monthlyLimit.noLimit": "使用制限は設定されていません。",
"workspace.monthlyLimit.currentUsage.beforeMonth": "現在の使用状況",
"workspace.monthlyLimit.currentUsage.beforeAmount": "は$です",
"workspace.reload.title": "オートリロード",
"workspace.reload.disabled.before": "オートリロードは",
"workspace.monthlyLimit.currentUsage.beforeMonth": "現在の使用状況",
"workspace.monthlyLimit.currentUsage.beforeAmount": ")は $",
"workspace.reload.title": "自動チャージ",
"workspace.reload.disabled.before": "自動チャージは",
"workspace.reload.disabled.state": "無効",
"workspace.reload.disabled.after": "残高が少なくなったときに自動的にリロードできるようにします。",
"workspace.reload.enabled.before": "オートリロードは",
"workspace.reload.disabled.after": "です。残高が少なくなったときに自動的にチャージするには有効にしてください。",
"workspace.reload.enabled.before": "自動チャージは",
"workspace.reload.enabled.state": "有効",
"workspace.reload.enabled.middle": "リロードします",
"workspace.reload.enabled.middle": "チャージします",
"workspace.reload.processingFee": "手数料",
"workspace.reload.enabled.after": "残高が達したとき",
"workspace.reload.enabled.after": ")。残高が以下に達したとき",
"workspace.reload.edit": "編集",
"workspace.reload.enable": "有効にする",
"workspace.reload.enableAutoReload": "自動リロードを有効にする",
"workspace.reload.reloadAmount": "$をリロード",
"workspace.reload.whenBalanceReaches": "残高が$に達すると",
"workspace.reload.enableAutoReload": "自動チャージを有効にする",
"workspace.reload.reloadAmount": "チャージ額 $",
"workspace.reload.whenBalanceReaches": "残高が $ に達したとき",
"workspace.reload.saving": "保存中...",
"workspace.reload.save": "保存",
"workspace.reload.failedAt": "リロードに失敗しました",
"workspace.reload.failedAt": "チャージ失敗:",
"workspace.reload.reason": "理由:",
"workspace.reload.updatePaymentMethod": "支払い方法を更新して、もう一度お試しください。",
"workspace.reload.updatePaymentMethod": "支払い方法を更新して、もう一度お試しください。",
"workspace.reload.retrying": "再試行中...",
"workspace.reload.retry": "リトライ",
"workspace.reload.retry": "再試行",
"workspace.payments.title": "支払い履歴",
"workspace.payments.subtitle": "最近の支払い取引。",
"workspace.payments.table.date": "日付",
"workspace.payments.table.paymentId": "支払いID",
"workspace.payments.table.amount": "額",
"workspace.payments.table.receipt": "レシート",
"workspace.payments.table.amount": "額",
"workspace.payments.table.receipt": "領収書",
"workspace.payments.type.credit": "クレジット",
"workspace.payments.type.subscription": "サブスクリプション",
"workspace.payments.view": "ビュー",
"workspace.payments.view": "表示",
"workspace.black.loading": "読み込み中...",
"workspace.black.time.day": "日",
"workspace.black.time.days": "日",
@@ -486,22 +463,133 @@ export const dict = {
"workspace.black.time.minutes": "分",
"workspace.black.time.fewSeconds": "数秒",
"workspace.black.subscription.title": "サブスクリプション",
"workspace.black.subscription.message": "あなたはOpenCode Black を月額 ${{plan}} で購読しています。",
"workspace.black.subscription.message": "あなたは OpenCode Black を月額 ${{plan}} で購読しています。",
"workspace.black.subscription.manage": "サブスクリプションの管理",
"workspace.black.subscription.rollingUsage": "5時間利用",
"workspace.black.subscription.weeklyUsage": "毎週の使用量",
"workspace.black.subscription.resetsIn": "リセットします",
"workspace.black.subscription.useBalance": "利用限度額に達したら利用可能な残高を使い切る",
"workspace.black.waitlist.title": "順番待ちリスト",
"workspace.black.subscription.weeklyUsage": "週間利用量",
"workspace.black.subscription.resetsIn": "リセットまで",
"workspace.black.subscription.useBalance": "利用限度額に達したら利用可能な残高を使用する",
"workspace.black.waitlist.title": "ウェイトリスト",
"workspace.black.waitlist.joined":
"あなたは月額 ${{plan}} OpenCode ブラック プランの待機リストに登録されています。",
"workspace.black.waitlist.ready": "月額 ${{plan}} の OpenCode ブラック プランに登録する準備ができました。",
"workspace.black.waitlist.leave": "順番待ちリストを残す",
"workspace.black.waitlist.leaving": "出発中...",
"workspace.black.waitlist.left": "",
"あなたは月額 ${{plan}} OpenCode Black プランのウェイトリストに登録されています。",
"workspace.black.waitlist.ready": "月額 ${{plan}} の OpenCode Black プランに登録する準備ができました。",
"workspace.black.waitlist.leave": "ウェイトリストから抜ける",
"workspace.black.waitlist.leaving": "処理中...",
"workspace.black.waitlist.left": "退会済み",
"workspace.black.waitlist.enroll": "登録する",
"workspace.black.waitlist.enrolling": "登録中...",
"workspace.black.waitlist.enrolled": "登録済み",
"workspace.black.waitlist.enrollNote":
"[登録] をクリックすると、サブスクリプションがすぐに開始され、カードに請求されます。",
"登録する」をクリックすると、サブスクリプションがすぐに開始され、カードに請求されます。",
"download.title": "OpenCode | ダウンロード",
"download.meta.description": "OpenCode を macOS、Windows、Linux 向けにダウンロード",
"download.hero.title": "OpenCode をダウンロード",
"download.hero.subtitle": "macOS、Windows、Linux 向けベータ版を利用可能",
"download.hero.button": "{{os}} 向けダウンロード",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrations",
"download.action.download": "ダウンロード",
"download.action.install": "インストール",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"必ずしもそうではありませんが、おそらく必要です。OpenCodeを有料プロバイダーに接続したい場合はAIサブスクリプションが必要ですが、",
"download.faq.a3.localLink": "ローカルモデル",
"download.faq.a3.afterLocal.beforeZen": "であれば無料で利用できます。ユーザーには",
"download.faq.a3.afterZen":
"の利用をお勧めしていますが、OpenCodeはOpenAI、Anthropic、xAIなどの主要なプロバイダーに対応しています。",
"download.faq.a5.p1": "OpenCodeは100%無料で利用できます。",
"download.faq.a5.p2.beforeZen":
"追加コストはモデルプロバイダーのサブスクリプションから発生します。OpenCodeはどのモデルプロバイダーでも利用できますが、",
"download.faq.a5.p2.afterZen": "の利用をおすすめします。",
"download.faq.a6.p1": "あなたのデータと情報は、OpenCodeで共有リンクを作成したときにのみ保存されます。",
"download.faq.a6.p2.beforeShare": "詳しくは",
"download.faq.a6.shareLink": "共有ページ",
"enterprise.title": "OpenCode | 組織向けエンタープライズソリューション",
"enterprise.meta.description": "エンタープライズソリューションについてOpenCodeに問い合わせる",
"enterprise.hero.title": "あなたのコードはあなたのもの",
"enterprise.hero.body1":
"OpenCodeは、データやコンテキストを一切保存せず、ライセンス制限や所有権の主張もなく、組織内で安全に動作します。チームでのトライアルから始め、SSOや社内AIゲートウェイと統合して組織全体に展開できます。",
"enterprise.hero.body2": "どのような支援ができるか、お聞かせください。",
"enterprise.form.name.label": "氏名",
"enterprise.form.name.placeholder": "ジェフ・ベゾス",
"enterprise.form.role.label": "役職",
"enterprise.form.role.placeholder": "会長",
"enterprise.form.email.label": "会社メールアドレス",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "どのような課題を解決したいですか?",
"enterprise.form.message.placeholder": "これについて支援が必要です...",
"enterprise.form.send": "送信",
"enterprise.form.sending": "送信中...",
"enterprise.form.success": "送信しました。まもなくご連絡いたします。",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "OpenCode Enterpriseとは",
"enterprise.faq.a1":
"OpenCode Enterpriseは、コードとデータが決してインフラの外に出ないことを保証したい組織向けです。SSOや社内AIゲートウェイと統合する集中設定を使用することでこれを実現します。",
"enterprise.faq.q2": "OpenCode Enterpriseを始めるには",
"enterprise.faq.a2":
"まずはチームでの社内トライアルから始めてください。OpenCodeはデフォルトでコードやコンテキストデータを保存しないため、簡単に始められます。その後、価格や導入オプションについてお問い合わせください。",
"enterprise.faq.q3": "エンタープライズ価格の仕組みは?",
"enterprise.faq.a3":
"シート単位ユーザー数でのエンタープライズ価格を提供します。独自のLLMゲートウェイをお持ちの場合、使用トークンに対する課金はありません。詳細は、組織の要件に基づいた見積もりのためにお問い合わせください。",
"enterprise.faq.q4": "OpenCode Enterpriseでデータは安全ですか",
"enterprise.faq.a4":
"はい。OpenCodeはコードやコンテキストデータを保存しません。すべての処理はローカル、またはAIプロバイダーへの直接API呼び出しを通じて行われます。集中設定とSSO統合により、データは組織のインフラ内で安全に保たれます。",
"brand.title": "OpenCode | ブランド",
"brand.meta.description": "OpenCode ブランドガイドライン",
"brand.heading": "ブランドガイドライン",
"brand.subtitle": "OpenCodeブランドを扱うためのリソースと素材です。",
"brand.downloadAll": "すべての素材をダウンロード",
"changelog.title": "OpenCode | 変更履歴",
"changelog.meta.description": "OpenCode リリースノートと変更履歴",
"changelog.hero.title": "変更履歴",
"changelog.hero.subtitle": "OpenCodeの新しいアップデートと改善",
"changelog.empty": "変更履歴が見つかりませんでした。",
"changelog.viewJson": "JSONを表示",
"bench.list.title": "ベンチマーク",
"bench.list.heading": "ベンチマーク",
"bench.list.table.agent": "エージェント",
"bench.list.table.model": "モデル",
"bench.list.table.score": "スコア",
"bench.detail.title": "ベンチマーク - {{task}}",
"bench.detail.notFound": "タスクが見つかりません",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "エージェント",
"bench.detail.labels.model": "モデル",
"bench.detail.labels.task": "タスク",
"bench.detail.labels.repo": "リポジトリ",
"bench.detail.labels.from": "From",
"bench.detail.labels.to": "To",
"bench.detail.labels.prompt": "プロンプト",
"bench.detail.labels.commit": "コミット",
"bench.detail.labels.averageDuration": "平均所要時間",
"bench.detail.labels.averageScore": "平均スコア",
"bench.detail.labels.averageCost": "平均コスト",
"bench.detail.labels.summary": "概要",
"bench.detail.labels.runs": "実行回数",
"bench.detail.labels.score": "スコア",
"bench.detail.labels.base": "ベース",
"bench.detail.labels.penalty": "ペナルティ",
"bench.detail.labels.weight": "重み",
"bench.detail.table.run": "実行",
"bench.detail.table.score": "スコア (ベース - ペナルティ)",
"bench.detail.table.cost": "コスト",
"bench.detail.table.duration": "所要時間",
"bench.detail.run.title": "実行 {{n}}",
"bench.detail.rawJson": "Raw JSON",
} satisfies Dict

File diff suppressed because it is too large Load Diff

View File

@@ -13,12 +13,12 @@ export const dict = {
"nav.login": "Logg inn",
"nav.free": "Gratis",
"nav.home": "Hjem",
"nav.openMenu": "Aapne meny",
"nav.openMenu": "Åpne meny",
"nav.getStartedFree": "Kom i gang gratis",
"nav.context.copyLogo": "Kopier logo som SVG",
"nav.context.copyWordmark": "Kopier wordmark som SVG",
"nav.context.brandAssets": "Brand-ressurser",
"nav.context.brandAssets": "Merkevareressurser",
"footer.github": "GitHub",
"footer.docs": "Dokumentasjon",
@@ -26,12 +26,12 @@ export const dict = {
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Brand",
"legal.brand": "Merkevare",
"legal.privacy": "Personvern",
"legal.terms": "Vilkår",
"email.title": "Fa beskjed forst nar vi lanserer nye produkter",
"email.subtitle": "Meld deg pa ventelisten for tidlig tilgang.",
"email.title": "Få beskjed først når vi lanserer nye produkter",
"email.subtitle": "Meld deg på ventelisten for tidlig tilgang.",
"email.placeholder": "E-postadresse",
"email.subscribe": "Abonner",
"email.success": "Nesten ferdig - sjekk innboksen din og bekreft e-postadressen",
@@ -45,169 +45,444 @@ export const dict = {
"user.logout": "Logg ut",
"workspace.select": "Velg workspace",
"workspace.createNew": "+ Opprett nytt workspace",
"workspace.modal.title": "Opprett nytt workspace",
"workspace.modal.placeholder": "Skriv inn workspace-navn",
"workspace.select": "Velg arbeidsområde",
"workspace.createNew": "+ Opprett nytt arbeidsområde",
"workspace.modal.title": "Opprett nytt arbeidsområde",
"workspace.modal.placeholder": "Skriv inn navn på arbeidsområde",
"common.cancel": "Avbryt",
"common.creating": "Oppretter...",
"common.create": "Opprett",
"common.videoUnsupported": "Nettleseren din stotter ikke video-taggen.",
"common.videoUnsupported": "Nettleseren din støtter ikke video-taggen.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Les mer",
"home.title": "OpenCode | Den apne kildekode AI-kodingsagenten",
"error.invalidPlan": "Ugyldig plan",
"error.workspaceRequired": "Arbeidsområde-ID er påkrevd",
"error.alreadySubscribed": "Dette arbeidsområdet har allerede et abonnement",
"error.limitRequired": "Grense er påkrevd.",
"error.monthlyLimitInvalid": "Angi en gyldig månedlig grense.",
"error.workspaceNameRequired": "Navn på arbeidsområde er påkrevd.",
"error.nameTooLong": "Navnet må være 255 tegn eller mindre.",
"error.emailRequired": "E-post er påkrevd",
"error.roleRequired": "Rolle er påkrevd",
"error.idRequired": "ID er påkrevd",
"error.nameRequired": "Navn er påkrevd",
"error.providerRequired": "Leverandør er påkrevd",
"error.apiKeyRequired": "API-nøkkel er påkrevd",
"error.modelRequired": "Modell er påkrevd",
"error.reloadAmountMin": "Påfyllingsbeløp må være minst ${{amount}}",
"error.reloadTriggerMin": "Saldo-trigger må være minst ${{amount}}",
"home.title": "OpenCode | Den åpne kildekode AI-kodingsagenten",
"temp.title": "opencode | AI-kodingsagent bygget for terminalen",
"temp.hero.title": "AI-kodingsagenten bygget for terminalen",
"temp.zen": "opencode zen",
"temp.getStarted": "Kom i gang",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "Et responsivt, native terminal-brukergrensesnitt som kan temes",
"temp.feature.zen.beforeLink": "En",
"temp.feature.zen.link": "kuratert liste over modeller",
"temp.feature.zen.afterLink": "levert av opencode",
"temp.feature.models.beforeLink": "Støtter 75+ LLM-leverandører gjennom",
"temp.feature.models.afterLink": ", inkludert lokale modeller",
"temp.screenshot.caption": "opencode TUI med tokyonight-tema",
"temp.screenshot.alt": "opencode TUI med tokyonight-tema",
"home.banner.badge": "Ny",
"home.banner.text": "Desktop-app tilgjengelig i beta",
"home.banner.platforms": "pa macOS, Windows og Linux",
"home.banner.downloadNow": "Last ned na",
"home.banner.downloadBetaNow": "Last ned desktop-betaen na",
"home.banner.platforms": "på macOS, Windows og Linux",
"home.banner.downloadNow": "Last ned nå",
"home.banner.downloadBetaNow": "Last ned desktop-betaen nå",
"home.hero.title": "Den apne kildekode AI-kodingsagenten",
"home.hero.title": "Den åpne kildekode AI-kodingsagenten",
"home.hero.subtitle.a":
"Gratis modeller inkludert, eller koble til hvilken som helst modell fra hvilken som helst leverandor,",
"Gratis modeller inkludert, eller koble til hvilken som helst modell fra hvilken som helst leverandør,",
"home.hero.subtitle.b": "inkludert Claude, GPT, Gemini og mer.",
"home.install.ariaLabel": "Installeringsalternativer",
"home.what.title": "Hva er OpenCode?",
"home.what.body": "OpenCode er en apen kildekode-agent som hjelper deg a skrive kode i terminal, IDE eller desktop.",
"home.what.body": "OpenCode er en åpen kildekode-agent som hjelper deg å skrive kode i terminal, IDE eller desktop.",
"home.what.lsp.title": "LSP aktivert",
"home.what.lsp.body": "Laster automatisk de riktige LSP-ene for LLM-en",
"home.what.multiSession.title": "Multi-sesjon",
"home.what.multiSession.body": "Start flere agenter parallelt pa samme prosjekt",
"home.what.multiSession.body": "Start flere agenter parallelt på samme prosjekt",
"home.what.shareLinks.title": "Del lenker",
"home.what.shareLinks.body": "Del en lenke til en sesjon for referanse eller feilsoking",
"home.what.shareLinks.body": "Del en lenke til en sesjon for referanse eller feilsøking",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Logg inn med GitHub for a bruke Copilot-kontoen din",
"home.what.copilot.body": "Logg inn med GitHub for å bruke Copilot-kontoen din",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Logg inn med OpenAI for a bruke ChatGPT Plus- eller Pro-kontoen din",
"home.what.chatgptPlus.body": "Logg inn med OpenAI for å bruke ChatGPT Plus- eller Pro-kontoen din",
"home.what.anyModel.title": "Hvilken som helst modell",
"home.what.anyModel.body": "75+ LLM-leverandorer via Models.dev, inkludert lokale modeller",
"home.what.anyModel.body": "75+ LLM-leverandører via Models.dev, inkludert lokale modeller",
"home.what.anyEditor.title": "Hvilken som helst editor",
"home.what.anyEditor.body": "Tilgjengelig som terminalgrensesnitt, desktop-app og IDE-utvidelse",
"home.what.readDocs": "Les docs",
"home.what.readDocs": "Les dokumentasjonen",
"home.growth.title": "Den apne kildekode AI-kodingsagenten",
"home.growth.title": "Den åpne kildekode AI-kodingsagenten",
"home.growth.body":
"Med over <strong>{{stars}}</strong> GitHub-stjerner, <strong>{{contributors}}</strong> bidragsytere og over <strong>{{commits}}</strong> commits, brukes OpenCode av over <strong>{{monthlyUsers}}</strong> utviklere hver maned.",
"Med over <strong>{{stars}}</strong> GitHub-stjerner, <strong>{{contributors}}</strong> bidragsytere og over <strong>{{commits}}</strong> commits, brukes OpenCode av over <strong>{{monthlyUsers}}</strong> utviklere hver måned.",
"home.growth.githubStars": "GitHub-stjerner",
"home.growth.contributors": "Bidragsytere",
"home.growth.monthlyDevs": "Manedlige devs",
"home.growth.monthlyDevs": "Månedlige utviklere",
"home.privacy.title": "Bygget med personvern forst",
"home.privacy.title": "Bygget med personvern først",
"home.privacy.body":
"OpenCode lagrer ikke koden din eller kontekstdata, slik at den kan fungere i personvernsensitive miljoer.",
"OpenCode lagrer ikke koden din eller kontekstdata, slik at den kan fungere i personvernsensitive miljøer.",
"home.privacy.learnMore": "Les mer om",
"home.privacy.link": "personvern",
"home.faq.q1": "Hva er OpenCode?",
"home.faq.a1":
"OpenCode er en apen kildekode-agent som hjelper deg a skrive og kjore kode med hvilken som helst AI-modell. Den er tilgjengelig som terminalgrensesnitt, desktop-app eller IDE-utvidelse.",
"OpenCode er en åpen kildekode-agent som hjelper deg å skrive og kjøre kode med hvilken som helst AI-modell. Den er tilgjengelig som terminalgrensesnitt, desktop-app eller IDE-utvidelse.",
"home.faq.q2": "Hvordan bruker jeg OpenCode?",
"home.faq.a2.before": "Den enkleste maten a komme i gang pa er a lese",
"home.faq.a2.before": "Den enkleste måten å komme i gang på er å lese",
"home.faq.a2.link": "introen",
"home.faq.q3": "Trenger jeg ekstra AI-abonnementer for a bruke OpenCode?",
"home.faq.a3.p1": "Ikke nodvendigvis. OpenCode kommer med gratis modeller du kan bruke uten a opprette en konto.",
"home.faq.a3.p2.beforeZen": "I tillegg kan du bruke populære kodemodeller ved a opprette en",
"home.faq.q3": "Trenger jeg ekstra AI-abonnementer for å bruke OpenCode?",
"home.faq.a3.p1":
"Ikke nødvendigvis. OpenCode kommer med et sett gratis modeller du kan bruke uten å opprette en konto.",
"home.faq.a3.p2.beforeZen": "I tillegg kan du bruke populære kodemodeller ved å opprette en",
"home.faq.a3.p2.afterZen": " konto.",
"home.faq.a3.p3":
"Vi oppfordrer til a bruke Zen, men OpenCode fungerer ogsa med populære leverandorer som OpenAI, Anthropic, xAI osv.",
"Vi oppfordrer til å bruke Zen, men OpenCode fungerer også med populære leverandører som OpenAI, Anthropic, xAI osv.",
"home.faq.a3.p4.beforeLocal": "Du kan til og med koble til dine",
"home.faq.a3.p4.localLink": "lokale modeller",
"home.faq.q4": "Kan jeg bruke mine eksisterende AI-abonnementer med OpenCode?",
"home.faq.a4.p1":
"Ja. OpenCode stotter abonnementer fra alle store leverandorer. Du kan bruke Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot.",
"Ja, OpenCode støtter abonnementer fra alle store leverandører. Du kan bruke Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot-abonnementer.",
"home.faq.q5": "Kan jeg bare bruke OpenCode i terminalen?",
"home.faq.a5.beforeDesktop": "Ikke lenger! OpenCode er na tilgjengelig som en app for",
"home.faq.a5.beforeDesktop": "Ikke lenger! OpenCode er nå tilgjengelig som en app for",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "og",
"home.faq.a5.web": "web",
"home.faq.q6": "Hva koster OpenCode?",
"home.faq.a6":
"OpenCode er 100% gratis a bruke. Det kommer ogsa med et sett gratis modeller. Det kan vare ekstra kostnader hvis du kobler til en annen leverandor.",
"OpenCode er 100% gratis å bruke. Det kommer også med et sett gratis modeller. Det kan være ekstra kostnader hvis du kobler til en annen leverandør.",
"home.faq.q7": "Hva med data og personvern?",
"home.faq.a7.p1": "Dataene dine lagres kun nar du bruker vare gratis modeller eller lager delbare lenker.",
"home.faq.a7.p1": "Dataene dine lagres kun når du bruker våre gratis modeller eller lager delbare lenker.",
"home.faq.a7.p2.beforeModels": "Les mer om",
"home.faq.a7.p2.modelsLink": "vare modeller",
"home.faq.a7.p2.modelsLink": "våre modeller",
"home.faq.a7.p2.and": "og",
"home.faq.a7.p2.shareLink": "delingssider",
"home.faq.q8": "Er OpenCode apen kildekode?",
"home.faq.a8.p1": "Ja, OpenCode er fullt open source. Kildekoden er offentlig pa",
"home.faq.q8": "Er OpenCode åpen kildekode?",
"home.faq.a8.p1": "Ja, OpenCode er fullt open source. Kildekoden er offentlig på",
"home.faq.a8.p2": "under",
"home.faq.a8.mitLicense": "MIT-lisensen",
"home.faq.a8.p3":
", som betyr at hvem som helst kan bruke, endre eller bidra til utviklingen. Alle i communityet kan opprette issues, sende inn pull requests og utvide funksjonalitet.",
"home.zenCta.title": "Fa tilgang til palitelige, optimaliserte modeller for kodingsagenter",
"home.zenCta.title": "Få tilgang til pålitelige, optimaliserte modeller for kodeagenter",
"home.zenCta.body":
"Zen gir deg tilgang til et handplukket sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodingsagenter. Du slipper a bekymre deg for ujevn ytelse og kvalitet pa tvers av leverandorer: bruk validerte modeller som fungerer.",
"Zen gir deg tilgang til et håndplukket sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodeagenter. Du slipper å bekymre deg for ujevn ytelse og kvalitet på tvers av leverandører; bruk validerte modeller som fungerer.",
"home.zenCta.link": "Les om Zen",
"download.title": "OpenCode | Nedlasting",
"zen.title": "OpenCode Zen | Et kuratert sett med palitelige, optimaliserte modeller for kodingsagenter",
"zen.hero.title": "Fa tilgang til palitelige, optimaliserte modeller for kodingsagenter",
"zen.title": "OpenCode Zen | Et kuratert sett med pålitelige, optimaliserte modeller for kodeagenter",
"zen.hero.title": "Pålitelige optimaliserte modeller for kodeagenter",
"zen.hero.body":
"Zen gir deg tilgang til et handplukket sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodingsagenter. Du slipper a bekymre deg for ujevn ytelse og kvalitet pa tvers av leverandorer: bruk validerte modeller som fungerer.",
"Zen gir deg tilgang til et kuratert sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodeagenter. Du slipper å bekymre deg for ujevn ytelse og kvalitet; bruk validerte modeller som fungerer.",
"zen.faq.q1": "Hva er OpenCode Zen?",
"zen.faq.a1":
"Zen er et kuratert sett med AI-modeller testet og benchmarked for kodingsagenter, laget av teamet bak OpenCode.",
"zen.faq.q2": "Hva gjor Zen mer presis?",
"Zen er et kuratert sett med AI-modeller testet og benchmarked for kodeagenter, laget av teamet bak OpenCode.",
"zen.faq.q2": "Hva gjør Zen mer presis?",
"zen.faq.a2":
"Zen tilbyr bare modeller som er testet og benchmarked spesifikt for kodingsagenter. Du ville ikke brukt en smorkniv til a skjare biff; ikke bruk darlige modeller til koding.",
"Zen tilbyr bare modeller som er testet og benchmarked spesifikt for kodeagenter. Du ville ikke brukt en smørkniv til å skjære biff; ikke bruk dårlige modeller til koding.",
"zen.faq.q3": "Er Zen billigere?",
"zen.faq.a3":
"Zen er ikke for profitt. Zen videreformidler kostnadene fra modellleverandorene direkte til deg. Jo mer Zen brukes, desto mer kan OpenCode forhandle bedre priser og gi dem videre til deg.",
"Zen er ikke for profitt. Zen videreformidler kostnadene fra modellleverandørene direkte til deg. Jo mer Zen brukes, desto bedre priser kan OpenCode forhandle og gi videre til deg.",
"zen.faq.q4": "Hva koster Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "tar betalt per foresporsel",
"zen.faq.a4.p1.afterPricing": "uten paslag, sa du betaler akkurat det modellleverandoren tar betalt.",
"zen.faq.a4.p2.beforeAccount": "Totalprisen avhenger av bruk, og du kan sette manedlige utgiftsgrenser i din",
"zen.faq.a4.p1.pricingLink": "tar betalt per forespørsel",
"zen.faq.a4.p1.afterPricing": "uten påslag, så du betaler akkurat det modellleverandøren tar betalt.",
"zen.faq.a4.p2.beforeAccount": "Totalprisen avhenger av bruk, og du kan sette månedlige utgiftsgrenser i din",
"zen.faq.a4.p2.accountLink": "konto",
"zen.faq.a4.p3":
"For a dekke kostnader legger OpenCode til bare en liten betalingsbehandlingsavgift pa $1.23 per $20 saldo-pafyll.",
"For å dekke kostnader legger OpenCode til bare et lite betalingsbehandlingsgebyr på $1.23 per $20 saldo-påfyll.",
"zen.faq.q5": "Hva med data og personvern?",
"zen.faq.a5.beforeExceptions":
"Alle Zen-modeller hostes i USA. Leverandorer folger en zero-retention-policy og bruker ikke dataene dine til modelltrening, med de",
"zen.faq.a5.exceptionsLink": "folgende unntakene",
"Alle Zen-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med de",
"zen.faq.a5.exceptionsLink": "følgende unntakene",
"zen.faq.q6": "Kan jeg sette utgiftsgrenser?",
"zen.faq.a6": "Ja, du kan sette manedlige utgiftsgrenser i kontoen din.",
"zen.faq.a6": "Ja, du kan sette månedlige utgiftsgrenser i kontoen din.",
"zen.faq.q7": "Kan jeg avslutte?",
"zen.faq.a7": "Ja, du kan deaktivere fakturering nar som helst og bruke resterende saldo.",
"zen.faq.q8": "Kan jeg bruke Zen med andre kodingsagenter?",
"zen.faq.a7": "Ja, du kan deaktivere fakturering når som helst og bruke gjenværende saldo.",
"zen.faq.q8": "Kan jeg bruke Zen med andre kodeagenter?",
"zen.faq.a8":
"Zen fungerer veldig bra med OpenCode, men du kan bruke Zen med hvilken som helst agent. Folg oppsettinstruksjonene i din foretrukne kodingsagent.",
"Selv om Zen fungerer veldig bra med OpenCode, kan du bruke Zen med hvilken som helst agent. Følg oppsettinstruksjonene i din foretrukne kodeagent.",
"zen.cta.start": "Kom i gang med Zen",
"zen.pricing.title": "Legg til $20 Pay as you go-saldo",
"zen.pricing.fee": "(+$1,23 kortbehandlingsgebyr)",
"zen.pricing.body": "Bruk med ethvert middel. Angi månedlige forbruksgrenser. Avbryt når som helst.",
"zen.pricing.fee": "(+$1.23 kortbehandlingsgebyr)",
"zen.pricing.body": "Bruk med hvilken som helst agent. Angi månedlige forbruksgrenser. Avslutt når som helst.",
"zen.problem.title": "Hvilket problem løser Zen?",
"zen.problem.body":
"Det er så mange modeller tilgjengelig, men bare noen få fungerer bra med kodemidler. De fleste leverandører konfigurerer dem annerledes med varierende resultater.",
"Det er så mange modeller tilgjengelig, men bare noen få fungerer bra med kodeagenter. De fleste leverandører konfigurerer dem annerledes med varierende resultater.",
"zen.problem.subtitle": "Vi fikser dette for alle, ikke bare OpenCode-brukere.",
"zen.problem.item1": "Tester utvalgte modeller og konsulterer teamene deres",
"zen.problem.item2": "Samarbeide med leverandører for å sikre at de blir levert riktig",
"zen.problem.item3": "Benchmarking av alle modellleverandørkombinasjoner anbefaler vi",
"zen.problem.item2": "Samarbeider med leverandører for å sikre at de blir levert riktig",
"zen.problem.item3": "Benchmarker alle modell-leverandør-kombinasjoner vi anbefaler",
"zen.how.title": "Hvordan Zen fungerer",
"zen.how.body": "Selv om vi foreslår at du bruker Zen med OpenCode, kan du bruke Zen med hvilken som helst agent.",
"zen.how.step1.title": "Registrer deg og legg til $20-saldo",
"zen.how.step1.title": "Registrer deg og legg til $20 saldo",
"zen.how.step1.beforeLink": "følg",
"zen.how.step1.link": "oppsettsinstruksjoner",
"zen.how.step1.link": "oppsettsinstruksjonene",
"zen.how.step2.title": "Bruk Zen med transparente priser",
"zen.how.step2.link": "betale per forespørsel",
"zen.how.step2.afterLink": "med null markeringer",
"zen.how.step3.title": "Automatisk påfylling",
"zen.how.step3.body": "når saldoen din når $5, legger vi automatisk til $20",
"zen.how.step2.link": "betal per forespørsel",
"zen.how.step2.afterLink": "uten påslag",
"zen.how.step3.title": "Auto-påfyll",
"zen.how.step3.body": "når saldoen din når $5, fyller vi automatisk $20",
"zen.privacy.title": "Personvernet ditt er viktig for oss",
"zen.privacy.beforeExceptions":
"Alle Zen-modeller er vert i USA. Leverandører følger en nulloppbevaringspolicy og bruker ikke dataene dine til modelltrening, med",
"Alle Zen-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
"zen.privacy.exceptionsLink": "følgende unntak",
"black.meta.title": "OpenCode Black | Få tilgang til verdens beste kodemodeller",
"black.meta.description": "Få tilgang til Claude, GPT, Gemini og mer med OpenCode Black-abonnementer.",
"black.hero.title": "Få tilgang til verdens beste kodemodeller",
"black.hero.subtitle": "Inkludert Claude, GPT, Gemini og mer",
"black.title": "OpenCode Black | Priser",
"black.plan.icon20": "Black 20-plan",
"black.plan.icon100": "Black 100-plan",
"black.plan.icon200": "Black 200-plan",
"black.plan.multiplier100": "5x mer bruk enn Black 20",
"black.plan.multiplier200": "20x mer bruk enn Black 20",
"black.price.perMonth": "per måned",
"black.price.perPersonBilledMonthly": "per person fakturert månedlig",
"black.terms.1": "Abonnementet ditt starter ikke umiddelbart",
"black.terms.2": "Du blir lagt til i ventelisten og aktivert snart",
"black.terms.3": "Kortet ditt belastes kun når abonnementet aktiveres",
"black.terms.4": "Bruksgrenser gjelder, tung automatisert bruk kan nå grensene raskere",
"black.terms.5": "Abonnementer er for enkeltpersoner, kontakt Enterprise for team",
"black.terms.6": "Grenser kan justeres og planer kan avvikles i fremtiden",
"black.terms.7": "Avslutt abonnementet når som helst",
"black.action.continue": "Fortsett",
"black.finePrint.beforeTerms": "Priser vist inkluderer ikke gjeldende skatt",
"black.finePrint.terms": "Vilkår for bruk",
"black.workspace.title": "OpenCode Black | Velg arbeidsområde",
"black.workspace.selectPlan": "Velg et arbeidsområde for denne planen",
"black.workspace.name": "Arbeidsområde {{n}}",
"black.subscribe.title": "Abonner på OpenCode Black",
"black.subscribe.paymentMethod": "Betalingsmetode",
"black.subscribe.loadingPaymentForm": "Laster betalingsskjema...",
"black.subscribe.selectWorkspaceToContinue": "Velg et arbeidsområde for å fortsette",
"black.subscribe.failurePrefix": "Å nei!",
"black.subscribe.error.generic": "Det oppstod en feil",
"black.subscribe.error.invalidPlan": "Ugyldig plan",
"black.subscribe.error.workspaceRequired": "Arbeidsområde-ID er påkrevd",
"black.subscribe.error.alreadySubscribed": "Dette arbeidsområdet har allerede et abonnement",
"black.subscribe.processing": "Behandler...",
"black.subscribe.submit": "Abonner ${{plan}}",
"black.subscribe.form.chargeNotice": "Du blir kun belastet når abonnementet ditt aktiveres",
"black.subscribe.success.title": "Du er på ventelisten for OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Abonnementsplan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Beløp",
"black.subscribe.success.amountValue": "${{plan}} per måned",
"black.subscribe.success.paymentMethod": "Betalingsmetode",
"black.subscribe.success.dateJoined": "Dato meldt på",
"black.subscribe.success.chargeNotice": "Kortet ditt vil bli belastet når abonnementet aktiveres",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API-nøkler",
"workspace.nav.members": "Medlemmer",
"workspace.nav.billing": "Fakturering",
"workspace.nav.settings": "Innstillinger",
"workspace.home.banner.beforeLink": "Pålitelige optimaliserte modeller for kodeagenter.",
"workspace.home.billing.loading": "Laster...",
"workspace.home.billing.enable": "Aktiver fakturering",
"workspace.home.billing.currentBalance": "Gjeldende saldo",
"workspace.newUser.feature.tested.title": "Testede og verifiserte modeller",
"workspace.newUser.feature.tested.body":
"Vi har benchmarked og testet modeller spesifikt for kodeagenter for å sikre best mulig ytelse.",
"workspace.newUser.feature.quality.title": "Høyeste kvalitet",
"workspace.newUser.feature.quality.body":
"Få tilgang til modeller konfigurert for optimal ytelse ingen nedgraderinger eller ruting til billigere leverandører.",
"workspace.newUser.feature.lockin.title": "Ingen innlåsing",
"workspace.newUser.feature.lockin.body":
"Bruk Zen med hvilken som helst kodeagent, og fortsett å bruke andre leverandører med opencode når du vil.",
"workspace.newUser.copyApiKey": "Kopier API-nøkkel",
"workspace.newUser.copyKey": "Kopier nøkkel",
"workspace.newUser.copied": "Kopiert!",
"workspace.newUser.step.enableBilling": "Aktiver fakturering",
"workspace.newUser.step.login.before": "Kjør",
"workspace.newUser.step.login.after": "og velg opencode",
"workspace.newUser.step.pasteKey": "Lim inn API-nøkkelen",
"workspace.newUser.step.models.before": "Start opencode og kjør",
"workspace.newUser.step.models.after": "for å velge en modell",
"workspace.models.title": "Modeller",
"workspace.models.subtitle.beforeLink": "Administrer hvilke modeller medlemmene i arbeidsområdet har tilgang til.",
"workspace.models.table.model": "Modell",
"workspace.models.table.enabled": "Aktivert",
"workspace.providers.title": "Ta med din egen nøkkel",
"workspace.providers.subtitle": "Konfigurer dine egne API-nøkler fra AI-leverandører.",
"workspace.providers.placeholder": "Skriv inn {{provider}} API-nøkkel ({{prefix}}...)",
"workspace.providers.configure": "Konfigurer",
"workspace.providers.edit": "Rediger",
"workspace.providers.delete": "Slett",
"workspace.providers.saving": "Lagrer...",
"workspace.providers.save": "Lagre",
"workspace.providers.table.provider": "Leverandør",
"workspace.providers.table.apiKey": "API-nøkkel",
"workspace.usage.title": "Brukshistorikk",
"workspace.usage.subtitle": "Nylig API-bruk og kostnader.",
"workspace.usage.empty": "Gjør ditt første API-kall for å komme i gang.",
"workspace.usage.table.date": "Dato",
"workspace.usage.table.model": "Modell",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Kostnad",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache Lest",
"workspace.usage.breakdown.cacheWrite": "Cache Skrevet",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Resonnering",
"workspace.usage.subscription": "abonnement (${{amount}})",
"workspace.cost.title": "Kostnad",
"workspace.cost.subtitle": "Brukskostnader fordelt på modell.",
"workspace.cost.allModels": "Alle modeller",
"workspace.cost.allKeys": "Alle nøkler",
"workspace.cost.deletedSuffix": "(slettet)",
"workspace.cost.empty": "Ingen bruksdata tilgjengelig for den valgte perioden.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API-nøkler",
"workspace.keys.subtitle": "Administrer API-nøklene dine for å få tilgang til opencode-tjenester.",
"workspace.keys.create": "Opprett API-nøkkel",
"workspace.keys.placeholder": "Skriv inn navn på nøkkel",
"workspace.keys.empty": "Opprett en opencode Gateway API-nøkkel",
"workspace.keys.table.name": "Navn",
"workspace.keys.table.key": "Nøkkel",
"workspace.keys.table.createdBy": "Opprettet av",
"workspace.keys.table.lastUsed": "Sist brukt",
"workspace.keys.copyApiKey": "Kopier API-nøkkel",
"workspace.keys.delete": "Slett",
"workspace.members.title": "Medlemmer",
"workspace.members.subtitle": "Administrer medlemmer i arbeidsområdet og deres tillatelser.",
"workspace.members.invite": "Inviter medlem",
"workspace.members.inviting": "Inviterer...",
"workspace.members.beta.beforeLink": "Arbeidsområder er gratis for team i beta-perioden.",
"workspace.members.form.invitee": "Invitert",
"workspace.members.form.emailPlaceholder": "Skriv inn e-post",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Månedlig utgiftsgrense",
"workspace.members.noLimit": "Ingen grense",
"workspace.members.noLimitLowercase": "ingen grense",
"workspace.members.invited": "invitert",
"workspace.members.edit": "Rediger",
"workspace.members.delete": "Slett",
"workspace.members.saving": "Lagrer...",
"workspace.members.save": "Lagre",
"workspace.members.table.email": "E-post",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Månedsgrense",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
"workspace.members.role.member": "Medlem",
"workspace.members.role.memberDescription": "Kan kun generere API-nøkler for seg selv",
"workspace.settings.title": "Innstillinger",
"workspace.settings.subtitle": "Oppdater arbeidsområdets navn og preferanser.",
"workspace.settings.workspaceName": "Navn på arbeidsområde",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Oppdaterer...",
"workspace.settings.save": "Lagre",
"workspace.settings.edit": "Rediger",
"workspace.billing.title": "Fakturering",
"workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
"workspace.billing.contactUs": "Kontakt oss",
"workspace.billing.subtitle.afterLink": "hvis du har spørsmål.",
"workspace.billing.currentBalance": "Gjeldende saldo",
"workspace.billing.add": "Legg til $",
"workspace.billing.enterAmount": "Angi beløp",
"workspace.billing.loading": "Laster...",
"workspace.billing.addAction": "Legg til",
"workspace.billing.addBalance": "Legg til saldo",
"workspace.billing.linkedToStripe": "Koblet til Stripe",
"workspace.billing.manage": "Administrer",
"workspace.billing.enable": "Aktiver fakturering",
"workspace.monthlyLimit.title": "Månedlig grense",
"workspace.monthlyLimit.subtitle": "Angi en månedlig bruksgrense for kontoen din.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Angir...",
"workspace.monthlyLimit.set": "Sett",
"workspace.monthlyLimit.edit": "Rediger grense",
"workspace.monthlyLimit.noLimit": "Ingen bruksgrense satt.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Gjeldende forbruk for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
"workspace.reload.title": "Auto-påfyll",
"workspace.reload.disabled.before": "Auto-påfyll er",
"workspace.reload.disabled.state": "deaktivert",
"workspace.reload.disabled.after": "Aktiver for å fylle på automatisk når saldoen er lav.",
"workspace.reload.enabled.before": "Auto-påfyll er",
"workspace.reload.enabled.state": "aktivert",
"workspace.reload.enabled.middle": "Vi fyller på",
"workspace.reload.processingFee": "behandlingsgebyr",
"workspace.reload.enabled.after": "når saldoen når",
"workspace.reload.edit": "Rediger",
"workspace.reload.enable": "Aktiver",
"workspace.reload.enableAutoReload": "Aktiver Auto-påfyll",
"workspace.reload.reloadAmount": "Fyll på $",
"workspace.reload.whenBalanceReaches": "Når saldoen når $",
"workspace.reload.saving": "Lagrer...",
"workspace.reload.save": "Lagre",
"workspace.reload.failedAt": "Påfylling mislyktes kl",
"workspace.reload.reason": "Årsak:",
"workspace.reload.updatePaymentMethod": "Vennligst oppdater betalingsmetoden din og prøv på nytt.",
"workspace.reload.retrying": "Prøver på nytt...",
"workspace.reload.retry": "Prøv på nytt",
"workspace.payments.title": "Betalingshistorikk",
"workspace.payments.subtitle": "Nylige betalingstransaksjoner.",
"workspace.payments.table.date": "Dato",
"workspace.payments.table.paymentId": "Betalings-ID",
"workspace.payments.table.amount": "Beløp",
"workspace.payments.table.receipt": "Kvittering",
"workspace.payments.type.credit": "kreditt",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Laster...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dager",
"workspace.black.time.hour": "time",
"workspace.black.time.hours": "timer",
"workspace.black.time.minute": "minutt",
"workspace.black.time.minutes": "minutter",
"workspace.black.time.fewSeconds": "noen få sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} per måned.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.rollingUsage": "5-timers bruk",
"workspace.black.subscription.weeklyUsage": "Ukentlig bruk",
"workspace.black.subscription.resetsIn": "Nullstilles om",
"workspace.black.subscription.useBalance": "Bruk din tilgjengelige saldo etter å ha nådd bruksgrensene",
"workspace.black.waitlist.title": "Venteliste",
"workspace.black.waitlist.joined": "Du står på venteliste for OpenCode Black-planen til ${{plan}} per måned.",
"workspace.black.waitlist.ready": "Vi er klare til å melde deg på OpenCode Black-planen til ${{plan}} per måned.",
"workspace.black.waitlist.leave": "Forlat venteliste",
"workspace.black.waitlist.leaving": "Forlater...",
"workspace.black.waitlist.left": "Forlot",
"workspace.black.waitlist.enroll": "Meld på",
"workspace.black.waitlist.enrolling": "Melder på...",
"workspace.black.waitlist.enrolled": "Påmeldt",
"workspace.black.waitlist.enrollNote":
"Når du klikker på Meld på, starter abonnementet umiddelbart og kortet ditt belastes.",
"download.title": "OpenCode | Last ned",
"download.meta.description": "Last ned OpenCode for macOS, Windows og Linux",
"download.hero.title": "Last ned OpenCode",
"download.hero.subtitle": "Tilgjengelig i beta for macOS, Windows og Linux",
@@ -226,33 +501,33 @@ export const dict = {
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Ikke nodvendigvis, men sannsynligvis. Du trenger et AI-abonnement hvis du vil koble OpenCode til en betalt leverandor, men du kan jobbe med",
"Ikke nødvendigvis, men sannsynligvis. Du trenger et AI-abonnement hvis du vil koble OpenCode til en betalt leverandør, selv om du kan jobbe med",
"download.faq.a3.localLink": "lokale modeller",
"download.faq.a3.afterLocal.beforeZen": "gratis. Selv om vi oppfordrer brukere til a bruke",
"download.faq.a3.afterZen": ", fungerer OpenCode med alle populære leverandorer som OpenAI, Anthropic, xAI osv.",
"download.faq.a3.afterLocal.beforeZen": "gratis. Selv om vi oppfordrer brukere til å bruke",
"download.faq.a3.afterZen": ", fungerer OpenCode med alle populære leverandører som OpenAI, Anthropic, xAI osv.",
"download.faq.a5.p1": "OpenCode er 100% gratis a bruke.",
"download.faq.a5.p1": "OpenCode er 100% gratis å bruke.",
"download.faq.a5.p2.beforeZen":
"Eventuelle ekstra kostnader kommer fra abonnementet ditt hos en modellleverandor. Selv om OpenCode fungerer med enhver modellleverandor, anbefaler vi a bruke",
"Eventuelle ekstra kostnader kommer fra abonnementet ditt hos en modellleverandør. Selv om OpenCode fungerer med enhver modellleverandør, anbefaler vi å bruke",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Dataene og informasjonen din lagres bare nar du oppretter delbare lenker i OpenCode.",
"download.faq.a6.p1": "Dataene og informasjonen din lagres bare når du oppretter delbare lenker i OpenCode.",
"download.faq.a6.p2.beforeShare": "Les mer om",
"download.faq.a6.shareLink": "delingssider",
"enterprise.title": "OpenCode | Enterprise-losninger for din organisasjon",
"enterprise.meta.description": "Kontakt OpenCode for enterprise-losninger",
"enterprise.title": "OpenCode | Enterprise-løsninger for din organisasjon",
"enterprise.meta.description": "Kontakt OpenCode for enterprise-løsninger",
"enterprise.hero.title": "Koden din er din",
"enterprise.hero.body1":
"OpenCode opererer sikkert inne i organisasjonen din uten at data eller kontekst lagres, og uten lisensbegrensninger eller eierskapskrav. Start en proveperiode med teamet ditt, og rull den deretter ut i hele organisasjonen ved a integrere den med SSO-en din og den interne AI-gatewayen.",
"OpenCode opererer sikkert inne i organisasjonen din uten at data eller kontekst lagres, og uten lisensbegrensninger eller eierskapskrav. Start en prøveperiode med teamet ditt, og rull den deretter ut i hele organisasjonen ved å integrere den med SSO og din interne AI-gateway.",
"enterprise.hero.body2": "Fortell oss hvordan vi kan hjelpe.",
"enterprise.form.name.label": "Fullt navn",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Rolle",
"enterprise.form.role.placeholder": "Styrets leder",
"enterprise.form.email.label": "Bedriftens e-post",
"enterprise.form.role.placeholder": "Styreleder",
"enterprise.form.email.label": "Bedrifts-e-post",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.message.label": "Hvilket problem prover du a lose?",
"enterprise.form.message.label": "Hvilket problem prøver dere å løse?",
"enterprise.form.message.placeholder": "Vi trenger hjelp med...",
"enterprise.form.send": "Send",
"enterprise.form.sending": "Sender...",
@@ -260,207 +535,60 @@ export const dict = {
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Hva er OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise er for organisasjoner som vil sikre at koden og dataene deres aldri forlater infrastrukturen deres. Dette kan gjores med en sentral konfigurasjon som integreres med SSO-en din og den interne AI-gatewayen.",
"OpenCode Enterprise er for organisasjoner som vil sikre at koden og dataene deres aldri forlater infrastrukturen. Dette kan gjøres med en sentral konfigurasjon som integreres med SSO og intern AI-gateway.",
"enterprise.faq.q2": "Hvordan kommer jeg i gang med OpenCode Enterprise?",
"enterprise.faq.a2":
"Start enkelt med en intern proveperiode med teamet ditt. OpenCode lagrer som standard ikke koden din eller kontekstdata, noe som gjor det enkelt a komme i gang. Kontakt oss deretter for a diskutere priser og implementeringsalternativer.",
"Start enkelt med en intern prøveperiode med teamet ditt. OpenCode lagrer som standard ikke koden din eller kontekstdata, noe som gjør det enkelt å komme i gang. Kontakt oss deretter for å diskutere priser og implementeringsalternativer.",
"enterprise.faq.q3": "Hvordan fungerer enterprise-prising?",
"enterprise.faq.a3":
"Vi tilbyr enterprise-prising per sete. Har du din egen LLM-gateway, tar vi ikke betalt for brukte tokens. Kontakt oss for flere detaljer og et tilpasset tilbud basert pa organisasjonens behov.",
"Vi tilbyr enterprise-prising per sete. Har du din egen LLM-gateway, tar vi ikke betalt for brukte tokens. Kontakt oss for flere detaljer og et tilpasset tilbud basert på organisasjonens behov.",
"enterprise.faq.q4": "Er dataene mine sikre med OpenCode Enterprise?",
"enterprise.faq.a4":
"Ja. OpenCode lagrer ikke koden din eller kontekstdata. All behandling skjer lokalt eller gjennom direkte API-kall til AI-leverandoren din. Med sentral konfigurasjon og SSO-integrasjon forblir dataene dine sikre innenfor organisasjonens infrastruktur.",
"Ja. OpenCode lagrer ikke koden din eller kontekstdata. All behandling skjer lokalt eller gjennom direkte API-kall til AI-leverandøren din. Med sentral konfigurasjon og SSO-integrasjon forblir dataene dine sikre innenfor organisasjonens infrastruktur.",
"brand.title": "OpenCode | Brand",
"brand.meta.description": "OpenCode retningslinjer for merkevaren",
"brand.heading": "Retningslinjer for merkevaren",
"brand.title": "OpenCode | Merkevare",
"brand.meta.description": "OpenCode retningslinjer for merkevare",
"brand.heading": "Retningslinjer for merkevare",
"brand.subtitle": "Ressurser og assets som hjelper deg å jobbe med OpenCode-brandet.",
"brand.downloadAll": "Last ned alle assets",
"changelog.title": "OpenCode | Endringslogg",
"changelog.meta.description": "Utgivelsesnotater og endringslogg for OpenCode",
"changelog.hero.title": "Endringslogg",
"changelog.hero.subtitle": "Nye oppdateringer og forbedringer for OpenCode",
"changelog.empty": "Ingen endringsloggoppforinger funnet.",
"changelog.empty": "Ingen endringsloggoppføringer funnet.",
"changelog.viewJson": "Vis JSON",
"workspace.nav.zen": "Zen",
"workspace.nav.apiKeys": "API Taster",
"workspace.nav.members": "Medlemmer",
"workspace.nav.billing": "Fakturering",
"workspace.nav.settings": "Innstillinger",
"workspace.home.banner.beforeLink": "Pålitelige optimaliserte modeller for kodingsagenter.",
"workspace.home.billing.loading": "Laster inn...",
"workspace.home.billing.enable": "Aktiver fakturering",
"workspace.home.billing.currentBalance": "Gjeldende saldo",
"workspace.newUser.feature.tested.title": "Testede og verifiserte modeller",
"workspace.newUser.feature.tested.body":
"Vi har benchmarked og testet modeller spesifikt for kodingsagenter for å sikre best mulig ytelse.",
"workspace.newUser.feature.quality.title": "Høyeste kvalitet",
"workspace.newUser.feature.quality.body":
"Få tilgang til modeller konfigurert for optimal ytelse ingen nedgraderinger eller ruting til billigere leverandører.",
"workspace.newUser.feature.lockin.title": "Ingen innlåsing",
"workspace.newUser.feature.lockin.body":
"Bruk Zen med hvilken som helst kodeagent, og fortsett å bruke andre leverandører med opencode når du vil.",
"workspace.newUser.copyApiKey": "Kopier API-nøkkelen",
"workspace.newUser.copyKey": "Kopier nøkkel",
"workspace.newUser.copied": "Kopiert!",
"workspace.newUser.step.enableBilling": "Aktiver fakturering",
"workspace.newUser.step.login.before": "Løp",
"workspace.newUser.step.login.after": "og velg opencode",
"workspace.newUser.step.pasteKey": "Lim inn API-nøkkelen",
"workspace.newUser.step.models.before": "Start opencode og kjør",
"workspace.newUser.step.models.after": "for å velge en modell",
"workspace.models.title": "Modeller",
"workspace.models.subtitle.beforeLink": "Administrer hvilke modeller arbeidsområdemedlemmer har tilgang til.",
"workspace.models.table.model": "Modell",
"workspace.models.table.enabled": "Aktivert",
"workspace.providers.title": "Ta med din egen nøkkel",
"workspace.providers.subtitle": "Konfigurer dine egne API-nøkler fra AI-leverandører.",
"workspace.providers.placeholder": "Skriv inn {{provider}} API nøkkel ({{prefix}}...)",
"workspace.providers.configure": "Konfigurer",
"workspace.providers.edit": "Redigere",
"workspace.providers.delete": "Slett",
"workspace.providers.saving": "Lagrer...",
"workspace.providers.save": "Spare",
"workspace.providers.table.provider": "Leverandør",
"workspace.providers.table.apiKey": "API nøkkel",
"workspace.usage.title": "Brukshistorikk",
"workspace.usage.subtitle": "Nylig API bruk og kostnader.",
"workspace.usage.empty": "Foreta ditt første API-anrop for å komme i gang.",
"workspace.usage.table.date": "Dato",
"workspace.usage.table.model": "Modell",
"workspace.usage.table.input": "Inndata",
"workspace.usage.table.output": "Produksjon",
"workspace.usage.table.cost": "Koste",
"workspace.usage.breakdown.input": "Inndata",
"workspace.usage.breakdown.cacheRead": "Cache lest",
"workspace.usage.breakdown.cacheWrite": "Cache-skriving",
"workspace.usage.breakdown.output": "Produksjon",
"workspace.usage.breakdown.reasoning": "Argumentasjon",
"workspace.usage.subscription": "abonnement (${{amount}})",
"workspace.cost.title": "Koste",
"workspace.cost.subtitle": "Brukskostnader fordelt på modell.",
"workspace.cost.allModels": "Alle modeller",
"workspace.cost.allKeys": "Alle nøkler",
"workspace.cost.deletedSuffix": "(slettet)",
"workspace.cost.empty": "Ingen bruksdata tilgjengelig for den valgte perioden.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API Taster",
"workspace.keys.subtitle": "Administrer API-nøklene dine for å få tilgang til opencode-tjenester.",
"workspace.keys.create": "Opprett API-nøkkel",
"workspace.keys.placeholder": "Skriv inn nøkkelnavn",
"workspace.keys.empty": "Opprett en opencode Gateway API nøkkel",
"workspace.keys.table.name": "Navn",
"workspace.keys.table.key": "Nøkkel",
"workspace.keys.table.createdBy": "Laget av",
"workspace.keys.table.lastUsed": "Sist brukt",
"workspace.keys.copyApiKey": "Kopier API-nøkkelen",
"workspace.keys.delete": "Slett",
"workspace.members.title": "Medlemmer",
"workspace.members.subtitle": "Administrer arbeidsområdemedlemmer og deres tillatelser.",
"workspace.members.invite": "Inviter medlem",
"workspace.members.inviting": "Inviterer...",
"workspace.members.beta.beforeLink": "Arbeidsområder er gratis for team under betaversjonen.",
"workspace.members.form.invitee": "Invitert",
"workspace.members.form.emailPlaceholder": "Skriv inn e-post",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Månedlig utgiftsgrense",
"workspace.members.noLimit": "Ingen grense",
"workspace.members.noLimitLowercase": "ingen grense",
"workspace.members.invited": "invitert",
"workspace.members.edit": "Redigere",
"workspace.members.delete": "Slett",
"workspace.members.saving": "Lagrer...",
"workspace.members.save": "Spare",
"workspace.members.table.email": "E-post",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Månedsgrense",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
"workspace.members.role.member": "Medlem",
"workspace.members.role.memberDescription": "Kan bare generere API-nøkler for seg selv",
"workspace.settings.title": "Innstillinger",
"workspace.settings.subtitle": "Oppdater arbeidsområdets navn og preferanser.",
"workspace.settings.workspaceName": "Navn på arbeidsområde",
"workspace.settings.defaultName": "Misligholde",
"workspace.settings.updating": "Oppdaterer...",
"workspace.settings.save": "Spare",
"workspace.settings.edit": "Redigere",
"workspace.billing.title": "Fakturering",
"workspace.billing.subtitle.beforeLink": "Administrer betalingsmåter.",
"workspace.billing.contactUs": "Kontakt oss",
"workspace.billing.subtitle.afterLink": "hvis du har spørsmål.",
"workspace.billing.currentBalance": "Nåværende saldo",
"workspace.billing.add": "Legg til $",
"workspace.billing.enterAmount": "Angi beløp",
"workspace.billing.loading": "Laster inn...",
"workspace.billing.addAction": "Legge til",
"workspace.billing.addBalance": "Legg til saldo",
"workspace.billing.linkedToStripe": "Knyttet til Stripe",
"workspace.billing.manage": "Administrer",
"workspace.billing.enable": "Aktiver fakturering",
"workspace.monthlyLimit.title": "Månedlig grense",
"workspace.monthlyLimit.subtitle": "Angi en månedlig bruksgrense for kontoen din.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Innstilling...",
"workspace.monthlyLimit.set": "Sett",
"workspace.monthlyLimit.edit": "Rediger grense",
"workspace.monthlyLimit.noLimit": "Ingen bruksgrense satt.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Gjeldende bruk for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
"workspace.reload.title": "Last inn automatisk",
"workspace.reload.disabled.before": "Automatisk reload er",
"workspace.reload.disabled.state": "funksjonshemmet",
"workspace.reload.disabled.after": "Aktiver for å laste automatisk på nytt når balansen er lav.",
"workspace.reload.enabled.before": "Automatisk reload er",
"workspace.reload.enabled.state": "aktivert",
"workspace.reload.enabled.middle": "Vi laster på nytt",
"workspace.reload.processingFee": "behandlingsgebyr",
"workspace.reload.enabled.after": "når balansen når",
"workspace.reload.edit": "Redigere",
"workspace.reload.enable": "Aktiver",
"workspace.reload.enableAutoReload": "Aktiver automatisk reload",
"workspace.reload.reloadAmount": "Last inn $",
"workspace.reload.whenBalanceReaches": "Når saldoen når $",
"workspace.reload.saving": "Lagrer...",
"workspace.reload.save": "Spare",
"workspace.reload.failedAt": "Omlasting mislyktes kl",
"workspace.reload.reason": "Grunn:",
"workspace.reload.updatePaymentMethod": "Oppdater betalingsmåten og prøv på nytt.",
"workspace.reload.retrying": "Prøver på nytt...",
"workspace.reload.retry": "Prøv på nytt",
"workspace.payments.title": "Betalingshistorikk",
"workspace.payments.subtitle": "Nylige betalingstransaksjoner.",
"workspace.payments.table.date": "Dato",
"workspace.payments.table.paymentId": "Betalings-ID",
"workspace.payments.table.amount": "Beløp",
"workspace.payments.table.receipt": "Kvittering",
"workspace.payments.type.credit": "kreditt",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Utsikt",
"workspace.black.loading": "Laster inn...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dager",
"workspace.black.time.hour": "time",
"workspace.black.time.hours": "timer",
"workspace.black.time.minute": "minutt",
"workspace.black.time.minutes": "minutter",
"workspace.black.time.fewSeconds": "noen få sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} per måned.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.rollingUsage": "5-timers bruk",
"workspace.black.subscription.weeklyUsage": "Ukentlig bruk",
"workspace.black.subscription.resetsIn": "Tilbakestilles inn",
"workspace.black.subscription.useBalance": "Bruk din tilgjengelige saldo etter å ha nådd bruksgrensene",
"workspace.black.waitlist.title": "Venteliste",
"workspace.black.waitlist.joined": "Du er på ventelisten for ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.ready": "Vi er klare til å melde deg på ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.leave": "Gå ut av venteliste",
"workspace.black.waitlist.leaving": "Forlater...",
"workspace.black.waitlist.left": "Igjen",
"workspace.black.waitlist.enroll": "Registrere",
"workspace.black.waitlist.enrolling": "Registrerer...",
"workspace.black.waitlist.enrolled": "Påmeldt",
"workspace.black.waitlist.enrollNote":
"Når du klikker på Registrer, starter abonnementet umiddelbart og kortet ditt belastes.",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Modell",
"bench.list.table.score": "Poengsum",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Oppgave ikke funnet",
"bench.detail.na": "I/T",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Modell",
"bench.detail.labels.task": "Oppgave",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Fra",
"bench.detail.labels.to": "Til",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Gjennomsnittlig varighet",
"bench.detail.labels.averageScore": "Gjennomsnittlig poengsum",
"bench.detail.labels.averageCost": "Gjennomsnittlig kostnad",
"bench.detail.labels.summary": "Sammendrag",
"bench.detail.labels.runs": "Kjøringer",
"bench.detail.labels.score": "Poengsum",
"bench.detail.labels.base": "Basis",
"bench.detail.labels.penalty": "Straff",
"bench.detail.labels.weight": "vekt",
"bench.detail.table.run": "Kjøring",
"bench.detail.table.score": "Poengsum (Basis - Straff)",
"bench.detail.table.cost": "Kostnad",
"bench.detail.table.duration": "Varighet",
"bench.detail.run.title": "Kjøring {{n}}",
"bench.detail.rawJson": "Rå JSON",
} satisfies Dict

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