From 6b3118883c01ea6b1996490610b862964b9488f4 Mon Sep 17 00:00:00 2001
From: Frank
Date: Fri, 27 Feb 2026 02:56:41 -0500
Subject: [PATCH 001/211] wip: zen
---
packages/console/app/src/routes/zen/util/handler.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
index 7d829917cf..3f6d69bf20 100644
--- a/packages/console/app/src/routes/zen/util/handler.ts
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -632,7 +632,7 @@ export async function handler(
})
if (result.status === "rate-limited")
throw new SubscriptionUsageLimitError(
- `Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
+ `Subscription quota exceeded. You can continue using free models.`,
result.resetInSec,
)
}
@@ -647,7 +647,7 @@ export async function handler(
})
if (result.status === "rate-limited")
throw new SubscriptionUsageLimitError(
- `Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
+ `Subscription quota exceeded. You can continue using free models.`,
result.resetInSec,
)
}
@@ -662,7 +662,7 @@ export async function handler(
})
if (result.status === "rate-limited")
throw new SubscriptionUsageLimitError(
- `Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
+ `Subscription quota exceeded. You can continue using free models.`,
result.resetInSec,
)
}
From 1f108bc4010c9b6fd28d1640863de9acffb109a1 Mon Sep 17 00:00:00 2001
From: Filip <34747899+neriousy@users.noreply.github.com>
Date: Fri, 27 Feb 2026 12:33:22 +0100
Subject: [PATCH 002/211] feat(app): recent projects section in command
pallette (#15270)
---
.../components/dialog-select-directory.tsx | 59 ++++++++++++++++++-
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/packages/app/src/components/dialog-select-directory.tsx b/packages/app/src/components/dialog-select-directory.tsx
index 515e640c9f..91e23f8ffa 100644
--- a/packages/app/src/components/dialog-select-directory.tsx
+++ b/packages/app/src/components/dialog-select-directory.tsx
@@ -8,6 +8,7 @@ import fuzzysort from "fuzzysort"
import { createMemo, createResource, createSignal } from "solid-js"
import { useGlobalSDK } from "@/context/global-sdk"
import { useGlobalSync } from "@/context/global-sync"
+import { useLayout } from "@/context/layout"
import { useLanguage } from "@/context/language"
interface DialogSelectDirectoryProps {
@@ -19,6 +20,7 @@ interface DialogSelectDirectoryProps {
type Row = {
absolute: string
search: string
+ group: "recent" | "folders"
}
function cleanInput(value: string) {
@@ -101,7 +103,7 @@ function displayPath(path: string, input: string, home: string) {
return tildeOf(full, home) || full
}
-function toRow(absolute: string, home: string): Row {
+function toRow(absolute: string, home: string, group: Row["group"]): Row {
const full = trimTrailing(absolute)
const tilde = tildeOf(full, home)
const withSlash = (value: string) => {
@@ -113,7 +115,16 @@ function toRow(absolute: string, home: string): Row {
const search = Array.from(
new Set([full, withSlash(full), tilde, withSlash(tilde), getFilename(full)].filter(Boolean)),
).join("\n")
- return { absolute: full, search }
+ return { absolute: full, search, group }
+}
+
+function uniqueRows(rows: Row[]) {
+ const seen = new Set()
+ return rows.filter((row) => {
+ if (seen.has(row.absolute)) return false
+ seen.add(row.absolute)
+ return true
+ })
}
function useDirectorySearch(args: {
@@ -237,6 +248,7 @@ function useDirectorySearch(args: {
export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
const sync = useGlobalSync()
const sdk = useGlobalSDK()
+ const layout = useLayout()
const dialog = useDialog()
const language = useLanguage()
@@ -266,9 +278,42 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
start,
})
+ const recentProjects = createMemo(() => {
+ const projects = layout.projects.list()
+ const byProject = new Map()
+
+ for (const project of projects) {
+ let at = 0
+ const dirs = [project.worktree, ...(project.sandboxes ?? [])]
+ for (const directory of dirs) {
+ const sessions = sync.child(directory, { bootstrap: false })[0].session
+ for (const session of sessions) {
+ if (session.time.archived) continue
+ const updated = session.time.updated ?? session.time.created
+ if (updated > at) at = updated
+ }
+ }
+ byProject.set(project.worktree, at)
+ }
+
+ return projects
+ .map((project, index) => ({ project, at: byProject.get(project.worktree) ?? 0, index }))
+ .sort((a, b) => b.at - a.at || a.index - b.index)
+ .slice(0, 5)
+ .map(({ project }) => {
+ const row = toRow(project.worktree, home(), "recent")
+ const name = project.name || getFilename(project.worktree)
+ return {
+ ...row,
+ search: `${row.search}\n${name}`,
+ }
+ })
+ })
+
const items = async (value: string) => {
const results = await directories(value)
- return results.map((absolute) => toRow(absolute, home()))
+ const directoryRows = results.map((absolute) => toRow(absolute, home(), "folders"))
+ return uniqueRows([...recentProjects(), ...directoryRows])
}
function resolve(absolute: string) {
@@ -285,6 +330,14 @@ export function DialogSelectDirectory(props: DialogSelectDirectoryProps) {
items={items}
key={(x) => x.absolute}
filterKeys={["search"]}
+ groupBy={(item) => item.group}
+ sortGroupsBy={(a, b) => {
+ if (a.category === b.category) return 0
+ return a.category === "recent" ? -1 : 1
+ }}
+ groupHeader={(group) =>
+ group.category === "recent" ? language.t("home.recentProjects") : language.t("command.project.open")
+ }
ref={(r) => (list = r)}
onFilter={(value) => setFilter(cleanInput(value))}
onKeyEvent={(e, item) => {
From dc8c0115101e132666f64c71354e8ba065b9a989 Mon Sep 17 00:00:00 2001
From: Pirro Zani <131965864+pirrozani@users.noreply.github.com>
Date: Fri, 27 Feb 2026 13:39:56 +0200
Subject: [PATCH 003/211] docs(readme): add Greek translation and update
language navigation (#15281)
---
README.ar.md | 3 +-
README.bn.md | 3 +-
README.br.md | 3 +-
README.bs.md | 3 +-
README.da.md | 3 +-
README.de.md | 3 +-
README.es.md | 3 +-
README.fr.md | 3 +-
README.gr.md | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++
README.it.md | 3 +-
README.ja.md | 3 +-
README.ko.md | 3 +-
README.md | 3 +-
README.no.md | 3 +-
README.pl.md | 3 +-
README.ru.md | 3 +-
README.th.md | 3 +-
README.tr.md | 3 +-
README.uk.md | 3 +-
README.zh.md | 3 +-
README.zht.md | 3 +-
21 files changed, 180 insertions(+), 20 deletions(-)
create mode 100644 README.gr.md
diff --git a/README.ar.md b/README.ar.md
index aeb2f04b72..987cb3234e 100644
--- a/README.ar.md
+++ b/README.ar.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.bn.md b/README.bn.md
index a3ffdc0d80..24c083e79e 100644
--- a/README.bn.md
+++ b/README.bn.md
@@ -34,7 +34,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.br.md b/README.br.md
index 6044dad6c0..f7e82fa09d 100644
--- a/README.br.md
+++ b/README.br.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.bs.md b/README.bs.md
index ef54a83695..5bba870859 100644
--- a/README.bs.md
+++ b/README.bs.md
@@ -34,7 +34,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.da.md b/README.da.md
index 3ffbbe8202..d1e686d7d7 100644
--- a/README.da.md
+++ b/README.da.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.de.md b/README.de.md
index 64c6628b45..7a3572324a 100644
--- a/README.de.md
+++ b/README.de.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.es.md b/README.es.md
index 875c8b0832..b454182328 100644
--- a/README.es.md
+++ b/README.es.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.fr.md b/README.fr.md
index 254d38577b..02e66e5e87 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.gr.md b/README.gr.md
new file mode 100644
index 0000000000..976eab5cc3
--- /dev/null
+++ b/README.gr.md
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+Ο πράκτορας τεχνητής νοημοσύνης ανοικτού κώδικα για προγραμματισμό.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά
+
+
+[](https://opencode.ai)
+
+---
+
+### Εγκατάσταση
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Διαχειριστές πακέτων
+npm i -g opencode-ai@latest # ή bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS και Linux (προτείνεται, πάντα ενημερωμένο)
+brew install opencode # macOS και Linux (επίσημος τύπος brew, λιγότερο συχνές ενημερώσεις)
+sudo pacman -S opencode # Arch Linux (Σταθερό)
+paru -S opencode-bin # Arch Linux (Τελευταία έκδοση από AUR)
+mise use -g opencode # Οποιοδήποτε λειτουργικό σύστημα
+nix run nixpkgs#opencode # ή github:anomalyco/opencode με βάση την πιο πρόσφατη αλλαγή από το dev branch
+```
+
+> [!TIP]
+> Αφαίρεσε παλαιότερες εκδόσεις από τη 0.1.x πριν από την εγκατάσταση.
+
+### Εφαρμογή Desktop (BETA)
+
+Το OpenCode είναι επίσης διαθέσιμο ως εφαρμογή. Κατέβασε το απευθείας από τη [σελίδα εκδόσεων](https://github.com/anomalyco/opencode/releases) ή το [opencode.ai/download](https://opencode.ai/download).
+
+| Πλατφόρμα | Λήψη |
+| --------------------- | ------------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
+| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, ή AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Κατάλογος Εγκατάστασης
+
+Το script εγκατάστασης τηρεί την ακόλουθη σειρά προτεραιότητας για τη διαδρομή εγκατάστασης:
+
+1. `$OPENCODE_INSTALL_DIR` - Προσαρμοσμένος κατάλογος εγκατάστασης
+2. `$XDG_BIN_DIR` - Διαδρομή συμβατή με τις προδιαγραφές XDG Base Directory
+3. `$HOME/bin` - Τυπικός κατάλογος εκτελέσιμων αρχείων χρήστη (εάν υπάρχει ή μπορεί να δημιουργηθεί)
+4. `$HOME/.opencode/bin` - Προεπιλεγμένη εφεδρική διαδρομή
+
+```bash
+# Παραδείγματα
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Πράκτορες
+
+Το OpenCode περιλαμβάνει δύο ενσωματωμένους πράκτορες μεταξύ των οποίων μπορείτε να εναλλάσσεστε με το πλήκτρο `Tab`.
+
+- **build** - Προεπιλεγμένος πράκτορας με πλήρη πρόσβαση για εργασία πάνω σε κώδικα
+- **plan** - Πράκτορας μόνο ανάγνωσης για ανάλυση και εξερεύνηση κώδικα
+ - Αρνείται την επεξεργασία αρχείων από προεπιλογή
+ - Ζητά άδεια πριν εκτελέσει εντολές bash
+ - Ιδανικός για εξερεύνηση άγνωστων αρχείων πηγαίου κώδικα ή σχεδιασμό αλλαγών
+
+Περιλαμβάνεται επίσης ένας **general** υποπράκτορας για σύνθετες αναζητήσεις και πολυβηματικές διεργασίες.
+Χρησιμοποιείται εσωτερικά και μπορεί να κληθεί χρησιμοποιώντας `@general` στα μηνύματα.
+
+Μάθετε περισσότερα για τους [πράκτορες](https://opencode.ai/docs/agents).
+
+### Οδηγός Χρήσης
+
+Για περισσότερες πληροφορίες σχετικά με τη ρύθμιση του OpenCode, [**πλοηγήσου στον οδηγό χρήσης μας**](https://opencode.ai/docs).
+
+### Συνεισφορά
+
+Εάν ενδιαφέρεσαι να συνεισφέρεις στο OpenCode, διαβάστε τα [οδηγό χρήσης συνεισφοράς](./CONTRIBUTING.md) πριν υποβάλεις ένα pull request.
+
+### Δημιουργία πάνω στο OpenCode
+
+Εάν εργάζεσαι σε ένα έργο σχετικό με το OpenCode και χρησιμοποιείτε το "opencode" ως μέρος του ονόματός του, για παράδειγμα "opencode-dashboard" ή "opencode-mobile", πρόσθεσε μια σημείωση στο README σας για να διευκρινίσεις ότι δεν είναι κατασκευασμένο από την ομάδα του OpenCode και δεν έχει καμία σχέση με εμάς.
+
+### Συχνές Ερωτήσεις
+
+#### Πώς διαφέρει αυτό από το Claude Code;
+
+Είναι πολύ παρόμοιο με το Claude Code ως προς τις δυνατότητες. Ακολουθούν οι βασικές διαφορές:
+
+- 100% ανοιχτού κώδικα
+- Δεν είναι συνδεδεμένο με κανέναν πάροχο. Αν και συνιστούμε τα μοντέλα που παρέχουμε μέσω του [OpenCode Zen](https://opencode.ai/zen), το OpenCode μπορεί να χρησιμοποιηθεί με Claude, OpenAI, Google, ή ακόμα και τοπικά μοντέλα. Καθώς τα μοντέλα εξελίσσονται, τα κενά μεταξύ τους θα κλείσουν και οι τιμές θα μειωθούν, οπότε είναι σημαντικό να είσαι ανεξάρτητος από τον πάροχο.
+- Out-of-the-box υποστήριξη LSP
+- Εστίαση στο TUI. Το OpenCode είναι κατασκευασμένο από χρήστες που χρησιμοποιούν neovim και τους δημιουργούς του [terminal.shop](https://terminal.shop)· θα εξαντλήσουμε τα όρια του τι είναι δυνατό στο terminal.
+- Αρχιτεκτονική client/server. Αυτό, για παράδειγμα, μπορεί να επιτρέψει στο OpenCode να τρέχει στον υπολογιστή σου ενώ το χειρίζεσαι εξ αποστάσεως από μια εφαρμογή κινητού, που σημαίνει ότι το TUI frontend είναι μόνο ένας από τους πιθανούς clients.
+
+---
+
+**Γίνε μέλος της κοινότητάς μας** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.it.md b/README.it.md
index b1f75c2d2c..b0d7247415 100644
--- a/README.it.md
+++ b/README.it.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.ja.md b/README.ja.md
index 31d11dcf1a..e381fbc603 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.ko.md b/README.ko.md
index 5f9de2cf3f..63b9fb4091 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.md b/README.md
index 620415c961..8d92450374 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.no.md b/README.no.md
index 125e181257..1ccefaa760 100644
--- a/README.no.md
+++ b/README.no.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.pl.md b/README.pl.md
index 61ef5870c1..0b246d5d5a 100644
--- a/README.pl.md
+++ b/README.pl.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.ru.md b/README.ru.md
index fed1101c0e..ff30d380fd 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.th.md b/README.th.md
index 01d68dd8dc..6a9a956a88 100644
--- a/README.th.md
+++ b/README.th.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.tr.md b/README.tr.md
index bfb18e1b43..9deedfb3c6 100644
--- a/README.tr.md
+++ b/README.tr.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.uk.md b/README.uk.md
index ed20fbf236..dfd8fa8d75 100644
--- a/README.uk.md
+++ b/README.uk.md
@@ -34,7 +34,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.zh.md b/README.zh.md
index c6d1c1d11f..9a1e1b2fb6 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
diff --git a/README.zht.md b/README.zht.md
index 0dd44a9f0f..238f11289f 100644
--- a/README.zht.md
+++ b/README.zht.md
@@ -33,7 +33,8 @@
ไทย |
Türkçe |
Українська |
- বাংলা
+ বাংলা |
+ Ελληνικά
[](https://opencode.ai)
From a325c9af8fbf2c70767af070113332c4ed955c07 Mon Sep 17 00:00:00 2001
From: vaur94 <100377859+vaur94@users.noreply.github.com>
Date: Fri, 27 Feb 2026 14:41:06 +0300
Subject: [PATCH 004/211] feat(app): add Turkish (tr) locale for app and ui
packages (#15278)
Co-authored-by: Ugur
---
packages/app/src/context/language.tsx | 8 +
packages/app/src/i18n/en.ts | 1 +
packages/app/src/i18n/parity.test.ts | 3 +-
packages/app/src/i18n/tr.ts | 831 ++++++++++++++++++++++++++
packages/ui/src/i18n/tr.ts | 123 ++++
5 files changed, 965 insertions(+), 1 deletion(-)
create mode 100644 packages/app/src/i18n/tr.ts
create mode 100644 packages/ui/src/i18n/tr.ts
diff --git a/packages/app/src/context/language.tsx b/packages/app/src/context/language.tsx
index 905305d3af..50cc302f43 100644
--- a/packages/app/src/context/language.tsx
+++ b/packages/app/src/context/language.tsx
@@ -19,6 +19,7 @@ import { dict as no } from "@/i18n/no"
import { dict as br } from "@/i18n/br"
import { dict as th } from "@/i18n/th"
import { dict as bs } from "@/i18n/bs"
+import { dict as tr } from "@/i18n/tr"
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
@@ -35,6 +36,7 @@ import { dict as uiNo } from "@opencode-ai/ui/i18n/no"
import { dict as uiBr } from "@opencode-ai/ui/i18n/br"
import { dict as uiTh } from "@opencode-ai/ui/i18n/th"
import { dict as uiBs } from "@opencode-ai/ui/i18n/bs"
+import { dict as uiTr } from "@opencode-ai/ui/i18n/tr"
export type Locale =
| "en"
@@ -53,6 +55,7 @@ export type Locale =
| "br"
| "th"
| "bs"
+ | "tr"
type RawDictionary = typeof en & typeof uiEn
type Dictionary = i18n.Flatten
@@ -78,6 +81,7 @@ const LOCALES: readonly Locale[] = [
"no",
"br",
"th",
+ "tr",
]
const LABEL_KEY: Record = {
@@ -97,6 +101,7 @@ const LABEL_KEY: Record = {
br: "language.br",
th: "language.th",
bs: "language.bs",
+ tr: "language.tr",
}
const base = i18n.flatten({ ...en, ...uiEn })
@@ -117,6 +122,7 @@ const DICT: Record = {
br: { ...base, ...i18n.flatten({ ...br, ...uiBr }) },
th: { ...base, ...i18n.flatten({ ...th, ...uiTh }) },
bs: { ...base, ...i18n.flatten({ ...bs, ...uiBs }) },
+ tr: { ...base, ...i18n.flatten({ ...tr, ...uiTr }) },
}
const localeMatchers: Array<{ locale: Locale; match: (language: string) => boolean }> = [
@@ -138,6 +144,7 @@ const localeMatchers: Array<{ locale: Locale; match: (language: string) => boole
{ locale: "br", match: (language) => language.startsWith("pt") },
{ locale: "th", match: (language) => language.startsWith("th") },
{ locale: "bs", match: (language) => language.startsWith("bs") },
+ { locale: "tr", match: (language) => language.startsWith("tr") },
]
type ParityKey = "command.session.previous.unseen" | "command.session.next.unseen"
@@ -157,6 +164,7 @@ const PARITY_CHECK: Record, Record> = {
br,
th,
bs,
+ tr,
}
void PARITY_CHECK
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index e13d407af6..4b97bfb89e 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -397,6 +397,7 @@ export const dict = {
"language.br": "Português (Brasil)",
"language.bs": "Bosanski",
"language.th": "ไทย",
+ "language.tr": "Türkçe",
"toast.language.title": "Language",
"toast.language.description": "Switched to {{language}}",
diff --git a/packages/app/src/i18n/parity.test.ts b/packages/app/src/i18n/parity.test.ts
index a75dbd3a30..c06a55ab17 100644
--- a/packages/app/src/i18n/parity.test.ts
+++ b/packages/app/src/i18n/parity.test.ts
@@ -15,8 +15,9 @@ import { dict as ru } from "./ru"
import { dict as th } from "./th"
import { dict as zh } from "./zh"
import { dict as zht } from "./zht"
+import { dict as tr } from "./tr"
-const locales = [ar, br, bs, da, de, es, fr, ja, ko, no, pl, ru, th, zh, zht]
+const locales = [ar, br, bs, da, de, es, fr, ja, ko, no, pl, ru, th, tr, zh, zht]
const keys = ["command.session.previous.unseen", "command.session.next.unseen"] as const
describe("i18n parity", () => {
diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts
new file mode 100644
index 0000000000..164d2eb3b3
--- /dev/null
+++ b/packages/app/src/i18n/tr.ts
@@ -0,0 +1,831 @@
+import { dict as en } from "./en"
+
+type Keys = keyof typeof en
+
+export const dict = {
+ "command.category.suggested": "Önerilen",
+ "command.category.view": "Görünüm",
+ "command.category.project": "Proje",
+ "command.category.provider": "Sağlayıcı",
+ "command.category.server": "Sunucu",
+ "command.category.session": "Oturum",
+ "command.category.theme": "Tema",
+ "command.category.language": "Dil",
+ "command.category.file": "Dosya",
+ "command.category.context": "Bağlam",
+ "command.category.terminal": "Terminal",
+ "command.category.model": "Model",
+ "command.category.mcp": "MCP",
+ "command.category.agent": "Ajan",
+ "command.category.permissions": "İzinler",
+ "command.category.workspace": "Çalışma Alanı",
+ "command.category.settings": "Ayarlar",
+
+ "theme.scheme.system": "Sistem",
+ "theme.scheme.light": "Açık",
+ "theme.scheme.dark": "Koyu",
+
+ "command.sidebar.toggle": "Kenar çubuğunu aç/kapat",
+ "command.project.open": "Proje aç",
+ "command.provider.connect": "Sağlayıcı bağla",
+ "command.server.switch": "Sunucu değiştir",
+ "command.settings.open": "Ayarları aç",
+ "command.session.previous": "Önceki oturum",
+ "command.session.next": "Sonraki oturum",
+ "command.session.previous.unseen": "Önceki okunmamış oturum",
+ "command.session.next.unseen": "Sonraki okunmamış oturum",
+ "command.session.archive": "Oturumu arşivle",
+
+ "command.palette": "Komut paleti",
+
+ "command.theme.cycle": "Tema değiştir",
+ "command.theme.set": "Tema kullan: {{theme}}",
+ "command.theme.scheme.cycle": "Renk şemasını değiştir",
+ "command.theme.scheme.set": "Renk şeması kullan: {{scheme}}",
+
+ "command.language.cycle": "Dil değiştir",
+ "command.language.set": "Dil kullan: {{language}}",
+
+ "command.session.new": "Yeni oturum",
+ "command.file.open": "Dosya aç",
+ "command.tab.close": "Sekmeyi kapat",
+ "command.context.addSelection": "Seçimi bağlama ekle",
+ "command.context.addSelection.description": "Mevcut dosyadan seçili satırları ekle",
+ "command.input.focus": "Girişi odakla",
+ "command.terminal.toggle": "Terminali aç/kapat",
+ "command.fileTree.toggle": "Dosya ağacını aç/kapat",
+ "command.review.toggle": "İncelemeyi aç/kapat",
+ "command.terminal.new": "Yeni terminal",
+ "command.terminal.new.description": "Yeni bir terminal sekmesi oluştur",
+ "command.steps.toggle": "Adımları aç/kapat",
+ "command.steps.toggle.description": "Mevcut mesaj için adımları göster veya gizle",
+ "command.message.previous": "Önceki mesaj",
+ "command.message.previous.description": "Önceki kullanıcı mesajına git",
+ "command.message.next": "Sonraki mesaj",
+ "command.message.next.description": "Sonraki kullanıcı mesajına git",
+ "command.model.choose": "Model seç",
+ "command.model.choose.description": "Farklı bir model seç",
+ "command.mcp.toggle": "MCP'leri aç/kapat",
+ "command.mcp.toggle.description": "MCP'leri aç/kapat",
+ "command.agent.cycle": "Ajan değiştir",
+ "command.agent.cycle.description": "Sonraki ajana geç",
+ "command.agent.cycle.reverse": "Ajanı geri değiştir",
+ "command.agent.cycle.reverse.description": "Önceki ajana geç",
+ "command.model.variant.cycle": "Düşünme eforu değiştir",
+ "command.model.variant.cycle.description": "Sonraki efor seviyesine geç",
+ "command.prompt.mode.shell": "Kabuk",
+ "command.prompt.mode.normal": "Komut",
+ "command.permissions.autoaccept.enable": "Düzenlemeleri otomatik kabul et",
+ "command.permissions.autoaccept.disable": "Otomatik kabulü durdur",
+ "command.workspace.toggle": "Çalışma alanlarını aç/kapat",
+ "command.workspace.toggle.description": "Kenar çubuğunda birden fazla çalışma alanını göster veya gizle",
+ "command.session.undo": "Geri al",
+ "command.session.undo.description": "Son mesajı geri al",
+ "command.session.redo": "Yinele",
+ "command.session.redo.description": "Son geri alınan mesajı yinele",
+ "command.session.compact": "Oturumu sıkıştır",
+ "command.session.compact.description": "Bağlam boyutunu azaltmak için oturumu özetle",
+ "command.session.fork": "Mesajdan dallandır",
+ "command.session.fork.description": "Önceki bir mesajdan yeni oturum oluştur",
+ "command.session.share": "Oturumu paylaş",
+ "command.session.share.description": "Bu oturumu paylaş ve URL'yi panoya kopyala",
+ "command.session.unshare": "Paylaşımı kaldır",
+ "command.session.unshare.description": "Bu oturumun paylaşımını durdur",
+
+ "palette.search.placeholder": "Dosya, komut ve oturum ara",
+ "palette.empty": "Sonuç bulunamadı",
+ "palette.group.commands": "Komutlar",
+ "palette.group.files": "Dosyalar",
+
+ "dialog.provider.search.placeholder": "Sağlayıcı ara",
+ "dialog.provider.empty": "Sağlayıcı bulunamadı",
+ "dialog.provider.group.popular": "Popüler",
+ "dialog.provider.group.other": "Diğer",
+ "dialog.provider.tag.recommended": "Önerilen",
+ "dialog.provider.opencode.note": "Claude, GPT, Gemini ve daha fazlasını içeren seçilmiş modeller",
+ "dialog.provider.opencode.tagline": "Güvenilir optimize edilmiş modeller",
+ "dialog.provider.opencodeGo.tagline": "Herkes için düşük maliyetli abonelik",
+ "dialog.provider.anthropic.note": "Pro ve Max dahil Claude modellerine doğrudan erişim",
+ "dialog.provider.copilot.note": "GitHub Copilot üzerinden kodlama yardımı için yapay zekâ modelleri",
+ "dialog.provider.openai.note": "Hızlı ve yetenekli genel yapay zekâ görevleri için GPT modelleri",
+ "dialog.provider.google.note": "Hızlı ve yapılandırılmış yanıtlar için Gemini modelleri",
+ "dialog.provider.openrouter.note": "Tek bir sağlayıcıdan tüm desteklenen modellere eriş",
+ "dialog.provider.vercel.note": "Akıllı yönlendirme ile yapay zekâ modellerine birleşik erişim",
+
+ "dialog.model.select.title": "Model seç",
+ "dialog.model.search.placeholder": "Model ara",
+ "dialog.model.empty": "Model sonucu yok",
+ "dialog.model.manage": "Modelleri yönet",
+ "dialog.model.manage.description": "Model seçicide hangi modellerin görüneceğini özelleştirin.",
+ "dialog.model.manage.provider.toggle": "Tüm {{provider}} modellerini aç/kapat",
+
+ "dialog.model.unpaid.freeModels.title": "OpenCode tarafından sunulan ücretsiz modeller",
+ "dialog.model.unpaid.addMore.title": "Popüler sağlayıcılardan daha fazla model ekleyin",
+
+ "dialog.provider.viewAll": "Daha fazla sağlayıcı göster",
+
+ "provider.connect.title": "{{provider}} bağla",
+ "provider.connect.title.anthropicProMax": "Claude Pro/Max ile giriş yap",
+ "provider.connect.selectMethod": "{{provider}} için giriş yöntemini seçin.",
+ "provider.connect.method.apiKey": "API anahtarı",
+ "provider.connect.status.inProgress": "Yetkilendirme devam ediyor...",
+ "provider.connect.status.waiting": "Yetkilendirme bekleniyor...",
+ "provider.connect.status.failed": "Yetkilendirme başarısız: {{error}}",
+ "provider.connect.apiKey.description":
+ "{{provider}} hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için {{provider}} API anahtarınızı girin.",
+ "provider.connect.apiKey.label": "{{provider}} API anahtarı",
+ "provider.connect.apiKey.placeholder": "API anahtarı",
+ "provider.connect.apiKey.required": "API anahtarı gerekli",
+ "provider.connect.opencodeZen.line1":
+ "OpenCode Zen, kodlama ajanları için seçilmiş güvenilir optimize edilmiş modellere erişim sağlar.",
+ "provider.connect.opencodeZen.line2":
+ "Tek bir API anahtarıyla Claude, GPT, Gemini, GLM ve daha fazlası gibi modellere erişebilirsiniz.",
+ "provider.connect.opencodeZen.visit.prefix": "",
+ "provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
+ "provider.connect.opencodeZen.visit.suffix": " adresini ziyaret ederek API anahtarınızı alın.",
+ "provider.connect.oauth.code.visit.prefix": "Hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için ",
+ "provider.connect.oauth.code.visit.link": "bu bağlantıya",
+ "provider.connect.oauth.code.visit.suffix": " tıklayarak yetkilendirme kodunuzu alın.",
+ "provider.connect.oauth.code.label": "{{method}} yetkilendirme kodu",
+ "provider.connect.oauth.code.placeholder": "Yetkilendirme kodu",
+ "provider.connect.oauth.code.required": "Yetkilendirme kodu gerekli",
+ "provider.connect.oauth.code.invalid": "Geçersiz yetkilendirme kodu",
+ "provider.connect.oauth.auto.visit.prefix": "",
+ "provider.connect.oauth.auto.visit.link": "Bu bağlantıya",
+ "provider.connect.oauth.auto.visit.suffix":
+ " tıklayarak aşağıdaki kodu girin ve hesabınızı bağlayarak OpenCode'da {{provider}} modellerini kullanın.",
+ "provider.connect.oauth.auto.confirmationCode": "Onay kodu",
+ "provider.connect.toast.connected.title": "{{provider}} bağlandı",
+ "provider.connect.toast.connected.description": "{{provider}} modelleri artık kullanımda.",
+
+ "provider.custom.title": "Özel sağlayıcı",
+ "provider.custom.description.prefix": "OpenAI uyumlu bir sağlayıcı yapılandırın. ",
+ "provider.custom.description.link": "Sağlayıcı yapılandırma dökümanları",
+ "provider.custom.description.suffix": " sayfasına bakın.",
+ "provider.custom.field.providerID.label": "Sağlayıcı kimlik",
+ "provider.custom.field.providerID.placeholder": "saglayicim",
+ "provider.custom.field.providerID.description": "Küçük harfler, rakamlar, tire veya alt çizgi",
+ "provider.custom.field.name.label": "Görünen ad",
+ "provider.custom.field.name.placeholder": "Yapay Zekâ Sağlayıcım",
+ "provider.custom.field.baseURL.label": "Temel URL",
+ "provider.custom.field.baseURL.placeholder": "https://api.saglayicim.com/v1",
+ "provider.custom.field.apiKey.label": "API anahtarı",
+ "provider.custom.field.apiKey.placeholder": "API anahtarı",
+ "provider.custom.field.apiKey.description": "İsteğe bağlı. Kimlik doğrulamayı başlıklar ile yönetiyorsanız boş bırakın.",
+ "provider.custom.models.label": "Modeller",
+ "provider.custom.models.id.label": "Kimlik",
+ "provider.custom.models.id.placeholder": "model-kimlik",
+ "provider.custom.models.name.label": "Ad",
+ "provider.custom.models.name.placeholder": "Görünen Ad",
+ "provider.custom.models.remove": "Modeli kaldır",
+ "provider.custom.models.add": "Model ekle",
+ "provider.custom.headers.label": "Başlıklar (isteğe bağlı)",
+ "provider.custom.headers.key.label": "Başlık",
+ "provider.custom.headers.key.placeholder": "Başlık-Adı",
+ "provider.custom.headers.value.label": "Değer",
+ "provider.custom.headers.value.placeholder": "değer",
+ "provider.custom.headers.remove": "Başlığı kaldır",
+ "provider.custom.headers.add": "Başlık ekle",
+ "provider.custom.error.providerID.required": "Sağlayıcı kimlik gerekli",
+ "provider.custom.error.providerID.format": "Küçük harf, rakam, tire veya alt çizgi kullanın",
+ "provider.custom.error.providerID.exists": "Bu sağlayıcı kimlik zaten mevcut",
+ "provider.custom.error.name.required": "Görünen ad gerekli",
+ "provider.custom.error.baseURL.required": "Temel URL gerekli",
+ "provider.custom.error.baseURL.format": "http:// veya https:// ile başlamalı",
+ "provider.custom.error.required": "Gerekli",
+ "provider.custom.error.duplicate": "Tekrar",
+
+ "provider.disconnect.toast.disconnected.title": "{{provider}} bağlantısı kesildi",
+ "provider.disconnect.toast.disconnected.description": "{{provider}} modelleri artık kullanılabilir değil.",
+
+ "model.tag.free": "Ücretsiz",
+ "model.tag.latest": "En yeni",
+ "model.provider.anthropic": "Anthropic",
+ "model.provider.openai": "OpenAI",
+ "model.provider.google": "Google",
+ "model.provider.xai": "xAI",
+ "model.provider.meta": "Meta",
+ "model.input.text": "metin",
+ "model.input.image": "görsel",
+ "model.input.audio": "ses",
+ "model.input.video": "video",
+ "model.input.pdf": "pdf",
+ "model.tooltip.allows": "Kabul eder: {{inputs}}",
+ "model.tooltip.reasoning.allowed": "Akıl yürütme destekler",
+ "model.tooltip.reasoning.none": "Akıl yürütme yok",
+ "model.tooltip.context": "Bağlam limiti {{limit}}",
+
+ "common.search.placeholder": "Ara",
+ "common.goBack": "Geri git",
+ "common.goForward": "İleri git",
+ "common.loading": "Yükleniyor",
+ "common.loading.ellipsis": "...",
+ "common.cancel": "İptal",
+ "common.connect": "Bağlan",
+ "common.disconnect": "Bağlantı Kes",
+ "common.submit": "Gönder",
+ "common.save": "Kaydet",
+ "common.saving": "Kaydediliyor...",
+ "common.default": "Varsayılan",
+ "common.attachment": "ek",
+
+ "prompt.placeholder.shell": "Kabuk komutu girin...",
+ "prompt.placeholder.normal": 'Bir şeyler sorun... "{{example}}"',
+ "prompt.placeholder.simple": "Bir şeyler sorun...",
+ "prompt.placeholder.summarizeComments": "Yorumları özetle…",
+ "prompt.placeholder.summarizeComment": "Yorumu özetle…",
+ "prompt.mode.shell": "Kabuk",
+ "prompt.mode.normal": "Komut",
+ "prompt.mode.shell.exit": "çıkmak için esc",
+
+ "prompt.example.1": "Kod tabanındaki bir TODO'yu düzelt",
+ "prompt.example.2": "Bu projenin teknoloji yığını nedir?",
+ "prompt.example.3": "Bozuk testleri düzelt",
+ "prompt.example.4": "Kimlik doğrulamanın nasıl çalıştığını açıkla",
+ "prompt.example.5": "Güvenlik açıkları bul ve düzelt",
+ "prompt.example.6": "Kullanıcı servisi için birim testleri ekle",
+ "prompt.example.7": "Bu fonksiyonu daha okunabilir hale getir",
+ "prompt.example.8": "Bu hata ne anlama geliyor?",
+ "prompt.example.9": "Bu sorunu ayıklamama yardım et",
+ "prompt.example.10": "API dokümantasyonu oluştur",
+ "prompt.example.11": "Veritabanı sorgularını optimize et",
+ "prompt.example.12": "Girdi doğrulama ekle",
+ "prompt.example.13": "İçin yeni bir bileşen oluştur...",
+ "prompt.example.14": "Bu projeyi nasıl dağıtabilirim?",
+ "prompt.example.15": "Kodumu en iyi uygulamalar için incele",
+ "prompt.example.16": "Bu fonksiyona hata yönetimi ekle",
+ "prompt.example.17": "Bu regex kalıbını açıkla",
+ "prompt.example.18": "Bunu TypeScript'e dönüştür",
+ "prompt.example.19": "Kod tabanı boyunca loglama ekle",
+ "prompt.example.20": "Hangi bağımlılıklar güncellenmemiş?",
+ "prompt.example.21": "Bir göç betiği yazmama yardım et",
+ "prompt.example.22": "Bu uç nokta için önbellekleme uygula",
+ "prompt.example.23": "Bu listeye sayfalama ekle",
+ "prompt.example.24": "İçin bir CLI komutu oluştur...",
+ "prompt.example.25": "Ortam değişkenleri burada nasıl çalışıyor?",
+
+ "prompt.popover.emptyResults": "Eşleşen sonuç yok",
+ "prompt.popover.emptyCommands": "Eşleşen komut yok",
+ "prompt.dropzone.label": "Görsel veya PDF'leri buraya bırakın",
+ "prompt.dropzone.file.label": "@bahsetmek için dosyayı bırakın",
+ "prompt.slash.badge.custom": "özel",
+ "prompt.slash.badge.skill": "beceri",
+ "prompt.slash.badge.mcp": "mcp",
+ "prompt.context.active": "aktif",
+ "prompt.context.includeActiveFile": "Aktif dosyayı dahil et",
+ "prompt.context.removeActiveFile": "Aktif dosyayı bağlamdan çıkar",
+ "prompt.context.removeFile": "Dosyayı bağlamdan çıkar",
+ "prompt.action.attachFile": "Dosya ekle",
+ "prompt.attachment.remove": "Eki kaldır",
+ "prompt.action.send": "Gönder",
+ "prompt.action.stop": "Durdur",
+
+ "prompt.toast.pasteUnsupported.title": "Desteklenmeyen yapıştırma",
+ "prompt.toast.pasteUnsupported.description": "Buraya sadece görsel veya PDF yapıştırılabilir.",
+ "prompt.toast.modelAgentRequired.title": "Bir ajan ve model seçin",
+ "prompt.toast.modelAgentRequired.description": "Komut göndermeden önce bir ajan ve model seçin.",
+ "prompt.toast.worktreeCreateFailed.title": "Çalışma ağacı oluşturulamadı",
+ "prompt.toast.sessionCreateFailed.title": "Oturum oluşturulamadı",
+ "prompt.toast.shellSendFailed.title": "Kabuk komutu gönderilemedi",
+ "prompt.toast.commandSendFailed.title": "Komut gönderilemedi",
+ "prompt.toast.promptSendFailed.title": "Komut gönderilemedi",
+ "prompt.toast.promptSendFailed.description": "Oturum alınamadı",
+
+ "dialog.mcp.title": "MCP'ler",
+ "dialog.mcp.description": "{{total}} içerisinden {{enabled}} etkin",
+ "dialog.mcp.empty": "Yapılandırılmış MCP yok",
+
+ "dialog.lsp.empty": "LSP'ler dosya türlerinden otomatik algılanır",
+ "dialog.plugins.empty": "Eklentiler opencode.json içinde yapılandırılır",
+
+ "mcp.status.connected": "bağlı",
+ "mcp.status.failed": "başarısız",
+ "mcp.status.needs_auth": "kimlik doğrulama gerekli",
+ "mcp.status.disabled": "devre dışı",
+
+ "dialog.fork.empty": "Dallandırılacak mesaj yok",
+
+ "dialog.directory.search.placeholder": "Klasör ara",
+ "dialog.directory.empty": "Klasör bulunamadı",
+
+ "dialog.server.title": "Sunucular",
+ "dialog.server.description": "Bu uygulamanın hangi OpenCode sunucusuna bağlanacağını değiştirin.",
+ "dialog.server.search.placeholder": "Sunucu ara",
+ "dialog.server.empty": "Henüz sunucu yok",
+ "dialog.server.add.title": "Sunucu ekle",
+ "dialog.server.add.url": "Sunucu URL'si",
+ "dialog.server.add.placeholder": "http://localhost:4096",
+ "dialog.server.add.error": "Sunucuya bağlanılamadı",
+ "dialog.server.add.checking": "Kontrol ediliyor...",
+ "dialog.server.add.button": "Sunucu ekle",
+ "dialog.server.default.title": "Varsayılan sunucu",
+ "dialog.server.default.description":
+ "Uygulama başlatıldığında yerel sunucu başlatmak yerine bu sunucuya bağlan. Yeniden başlatma gerektirir.",
+ "dialog.server.default.none": "Sunucu seçilmedi",
+ "dialog.server.default.set": "Mevcut sunucuyu varsayılan olarak ayarla",
+ "dialog.server.default.clear": "Temizle",
+ "dialog.server.action.remove": "Sunucuyu kaldır",
+
+ "dialog.server.menu.edit": "Düzenle",
+ "dialog.server.menu.default": "Varsayılan olarak ayarla",
+ "dialog.server.menu.defaultRemove": "Varsayılanı kaldır",
+ "dialog.server.menu.delete": "Sil",
+ "dialog.server.current": "Mevcut Sunucu",
+ "dialog.server.status.default": "Varsayılan",
+
+ "dialog.project.edit.title": "Projeyi düzenle",
+ "dialog.project.edit.name": "Ad",
+ "dialog.project.edit.icon": "Simge",
+ "dialog.project.edit.icon.alt": "Proje simgesi",
+ "dialog.project.edit.icon.hint": "Tıkla veya bir görsel sürükle",
+ "dialog.project.edit.icon.recommended": "Önerilen: 128x128px",
+ "dialog.project.edit.color": "Renk",
+ "dialog.project.edit.color.select": "{{color}} rengini seç",
+ "dialog.project.edit.worktree.startup": "Çalışma alanı başlatma betiği",
+ "dialog.project.edit.worktree.startup.description": "Yeni bir çalışma alanı (worktree) oluşturduktan sonra çalışır.",
+ "dialog.project.edit.worktree.startup.placeholder": "örneğin bun install",
+
+ "context.breakdown.title": "Bağlam Dökümü",
+ "context.breakdown.note": 'Girdi tokenlerinin yaklaşık dökümü. "Diğer" araç tanımları ve ek yükleri içerir.',
+ "context.breakdown.system": "Sistem",
+ "context.breakdown.user": "Kullanıcı",
+ "context.breakdown.assistant": "Asistan",
+ "context.breakdown.tool": "Araç Çağrıları",
+ "context.breakdown.other": "Diğer",
+
+ "context.systemPrompt.title": "Sistem Komutu",
+ "context.rawMessages.title": "Ham mesajlar",
+
+ "context.stats.session": "Oturum",
+ "context.stats.messages": "Mesajlar",
+ "context.stats.provider": "Sağlayıcı",
+ "context.stats.model": "Model",
+ "context.stats.limit": "Bağlam Limiti",
+ "context.stats.totalTokens": "Toplam Token",
+ "context.stats.usage": "Kullanım",
+ "context.stats.inputTokens": "Girdi Tokenleri",
+ "context.stats.outputTokens": "Çıktı Tokenleri",
+ "context.stats.reasoningTokens": "Akıl Yürütme Tokenleri",
+ "context.stats.cacheTokens": "Önbellek Tokenleri (okuma/yazma)",
+ "context.stats.userMessages": "Kullanıcı Mesajları",
+ "context.stats.assistantMessages": "Asistan Mesajları",
+ "context.stats.totalCost": "Toplam Maliyet",
+ "context.stats.sessionCreated": "Oturum Oluşturulma",
+ "context.stats.lastActivity": "Son Etkinlik",
+
+ "context.usage.tokens": "Tokenler",
+ "context.usage.usage": "Kullanım",
+ "context.usage.cost": "Maliyet",
+ "context.usage.clickToView": "Bağlamı görüntüle",
+ "context.usage.view": "Bağlam kullanımını görüntüle",
+
+ "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": "ไทย",
+ "language.tr": "Türkçe",
+
+ "toast.language.title": "Dil",
+ "toast.language.description": "{{language}} diline geçildi",
+
+ "toast.theme.title": "Tema değiştirildi",
+ "toast.scheme.title": "Renk şeması",
+
+ "toast.workspace.enabled.title": "Çalışma alanları etkinleştirildi",
+ "toast.workspace.enabled.description": "Kenar çubuğunda birden fazla çalışma ağacı gösterilecek",
+ "toast.workspace.disabled.title": "Çalışma alanları devre dışı bırakıldı",
+ "toast.workspace.disabled.description": "Kenar çubuğunda yalnızca ana çalışma ağacı gösterilecek",
+
+ "toast.permissions.autoaccept.on.title": "Düzenlemeler otomatik kabul ediliyor",
+ "toast.permissions.autoaccept.on.description": "Düzenleme ve yazma izinleri otomatik olarak onaylanacak",
+ "toast.permissions.autoaccept.off.title": "Otomatik kabul durduruldu",
+ "toast.permissions.autoaccept.off.description": "Düzenleme ve yazma izinleri onay gerektirecek",
+
+ "toast.model.none.title": "Model seçilmedi",
+ "toast.model.none.description": "Bu oturumu özetlemek için bir sağlayıcı bağlayın",
+
+ "toast.file.loadFailed.title": "Dosya yüklenemedi",
+ "toast.file.listFailed.title": "Dosyalar listelenemedi",
+
+ "toast.context.noLineSelection.title": "Satır seçimi yok",
+ "toast.context.noLineSelection.description": "Önce bir dosya sekmesinde satır aralığı seçin.",
+
+ "toast.session.share.copyFailed.title": "URL panoya kopyalanamadı",
+ "toast.session.share.success.title": "Oturum paylaşıldı",
+ "toast.session.share.success.description": "Paylaşım URL'si panoya kopyalandı!",
+ "toast.session.share.failed.title": "Oturum paylaşılamadı",
+ "toast.session.share.failed.description": "Oturum paylaşılırken bir hata oluştu",
+
+ "toast.session.unshare.success.title": "Oturum paylaşımı kaldırıldı",
+ "toast.session.unshare.success.description": "Oturum paylaşımı başarıyla kaldırıldı!",
+ "toast.session.unshare.failed.title": "Oturum paylaşımı kaldırılamadı",
+ "toast.session.unshare.failed.description": "Oturum paylaşımı kaldırılırken bir hata oluştu",
+
+ "toast.session.listFailed.title": "{{project}} için oturumlar yüklenemedi",
+
+ "toast.update.title": "Güncelleme mevcut",
+ "toast.update.description": "OpenCode'un yeni bir sürümü ({{version}}) yüklemeye hazır.",
+ "toast.update.action.installRestart": "Yükle ve yeniden başlat",
+ "toast.update.action.notYet": "Şimdi değil",
+
+ "error.page.title": "Bir şeyler yanlış gitti",
+ "error.page.description": "Uygulama yüklenirken bir hata oluştu.",
+ "error.page.details.label": "Hata Detayları",
+ "error.page.action.restart": "Yeniden Başlat",
+ "error.page.action.checking": "Kontrol ediliyor...",
+ "error.page.action.checkUpdates": "Güncellemeleri kontrol et",
+ "error.page.action.updateTo": "{{version}} sürümüne güncelle",
+ "error.page.report.prefix": "Lütfen bu hatayı OpenCode ekibine bildirin",
+ "error.page.report.discord": "Discord üzerinden",
+ "error.page.version": "Sürüm: {{version}}",
+
+ "error.dev.rootNotFound":
+ "Kök eleman bulunamadı. index.html dosyanıza eklemeyi unuttunuz mu? Ya da id özelliği yanlış mı yazıldı?",
+
+ "error.globalSync.connectFailed": "Sunucuya bağlanılamadı. `{{url}}` adresinde çalışan bir sunucu var mı?",
+ "directory.error.invalidUrl": "URL'de geçersiz dizin.",
+
+ "error.chain.unknown": "Bilinmeyen hata",
+ "error.chain.causedBy": "Nedeni:",
+ "error.chain.apiError": "API hatası",
+ "error.chain.status": "Durum: {{status}}",
+ "error.chain.retryable": "Yeniden denenebilir: {{retryable}}",
+ "error.chain.responseBody": "Yanıt gövdesi:\n{{body}}",
+ "error.chain.didYouMean": "Bunu mu demek istediniz: {{suggestions}}",
+ "error.chain.modelNotFound": "Model bulunamadı: {{provider}}/{{model}}",
+ "error.chain.checkConfig": "Yapılandırma dosyanızı (opencode.json) sağlayıcı/model adlarını kontrol edin",
+ "error.chain.mcpFailed": 'MCP sunucusu "{{name}}" başarısız oldu. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.',
+ "error.chain.providerAuthFailed": "Sağlayıcı kimlik doğrulaması başarısız ({{provider}}): {{message}}",
+ "error.chain.providerInitFailed":
+ '"{{provider}}" sağlayıcısı başlatılamadı. Kimlik bilgilerini ve yapılandırmayı kontrol edin.',
+ "error.chain.configJsonInvalid": "{{path}} adresindeki yapılandırma dosyası geçerli JSON(C) değil",
+ "error.chain.configJsonInvalidWithMessage": "{{path}} adresindeki yapılandırma dosyası geçerli JSON(C) değil: {{message}}",
+ "error.chain.configDirectoryTypo":
+ '"{{dir}}" dizini {{path}} içinde geçerli değil. Dizini "{{suggestion}}" olarak yeniden adlandırın veya kaldırın. Bu yaygın bir yazım hatasıdır.',
+ "error.chain.configFrontmatterError": "{{path}} içindeki ön bilgi ayrıştırılamadı:\n{{message}}",
+ "error.chain.configInvalid": "{{path}} adresindeki yapılandırma dosyası geçersiz",
+ "error.chain.configInvalidWithMessage": "{{path}} adresindeki yapılandırma dosyası geçersiz: {{message}}",
+
+ "notification.permission.title": "İzin gerekli",
+ "notification.permission.description": "{{projectName}} içindeki {{sessionTitle}} izin gerektiriyor",
+ "notification.question.title": "Soru",
+ "notification.question.description": "{{projectName}} içindeki {{sessionTitle}} bir soru soruyor",
+ "notification.action.goToSession": "Oturuma git",
+
+ "notification.session.responseReady.title": "Yanıt hazır",
+ "notification.session.error.title": "Oturum hatası",
+ "notification.session.error.fallbackDescription": "Bir hata oluştu",
+
+ "home.recentProjects": "Son projeler",
+ "home.empty.title": "Son proje yok",
+ "home.empty.description": "Yerel bir proje açarak başlayın",
+
+ "session.tab.session": "Oturum",
+ "session.tab.review": "İnceleme",
+ "session.tab.context": "Bağlam",
+ "session.panel.reviewAndFiles": "İnceleme ve dosyalar",
+ "session.review.filesChanged": "{{count}} Dosya Değişti",
+ "session.review.change.one": "Değişiklik",
+ "session.review.change.other": "Değişiklik",
+ "session.review.loadingChanges": "Değişiklikler yükleniyor...",
+ "session.review.empty": "Bu oturumda henüz değişiklik yok",
+ "session.review.noVcs": "Git VCS algılanamadı, oturum değişiklikleri tespit edilemeyecek",
+ "session.review.noChanges": "Değişiklik yok",
+
+ "session.files.selectToOpen": "Açmak için bir dosya seçin",
+ "session.files.all": "Tüm dosyalar",
+ "session.files.binaryContent": "İkili dosya (içerik görüntülenemiyor)",
+
+ "session.messages.renderEarlier": "Önceki mesajları göster",
+ "session.messages.loadingEarlier": "Önceki mesajlar yükleniyor...",
+ "session.messages.loadEarlier": "Önceki mesajları yükle",
+ "session.messages.loading": "Mesajlar yükleniyor...",
+ "session.messages.jumpToLatest": "En sona atla",
+
+ "session.context.addToContext": "{{selection}} bağlama ekle",
+ "session.todo.title": "Görevler",
+ "session.todo.collapse": "Daralt",
+ "session.todo.expand": "Genişlet",
+
+ "session.new.worktree.main": "Ana dal",
+ "session.new.worktree.mainWithBranch": "Ana dal ({{branch}})",
+ "session.new.worktree.create": "Yeni çalışma ağacı oluştur",
+ "session.new.lastModified": "Son değişiklik",
+
+ "session.header.search.placeholder": "{{project}} ara",
+ "session.header.searchFiles": "Dosya ara",
+ "session.header.openIn": "Aç",
+ "session.header.open.action": "{{app}} ile aç",
+ "session.header.open.ariaLabel": "{{app}} ile aç",
+ "session.header.open.menu": "Açma seçenekleri",
+ "session.header.open.copyPath": "Yolu kopyala",
+
+ "status.popover.trigger": "Durum",
+ "status.popover.ariaLabel": "Sunucu yapılandırmaları",
+ "status.popover.tab.servers": "Sunucular",
+ "status.popover.tab.mcp": "MCP",
+ "status.popover.tab.lsp": "LSP",
+ "status.popover.tab.plugins": "Eklentiler",
+ "status.popover.action.manageServers": "Sunucuları yönet",
+
+ "session.share.popover.title": "Web'de yayınla",
+ "session.share.popover.description.shared":
+ "Bu oturum web'de herkese açıktır. Bağlantıya sahip herkes erişebilir.",
+ "session.share.popover.description.unshared":
+ "Oturumu web'de herkese açık olarak paylaşın. Bağlantıya sahip herkes erişebilecek.",
+ "session.share.action.share": "Paylaş",
+ "session.share.action.publish": "Yayınla",
+ "session.share.action.publishing": "Yayınlanıyor...",
+ "session.share.action.unpublish": "Yayından kaldır",
+ "session.share.action.unpublishing": "Yayından kaldırılıyor...",
+ "session.share.action.view": "Görüntüle",
+ "session.share.copy.copied": "Kopyalandı",
+ "session.share.copy.copyLink": "Bağlantı kopyala",
+
+ "lsp.tooltip.none": "LSP sunucusu yok",
+ "lsp.label.connected": "{{count}} LSP",
+
+ "prompt.loading": "Komut yükleniyor...",
+ "terminal.loading": "Terminal yükleniyor...",
+ "terminal.title": "Terminal",
+ "terminal.title.numbered": "Terminal {{number}}",
+ "terminal.close": "Terminali kapat",
+ "terminal.connectionLost.title": "Bağlantı Kesildi",
+ "terminal.connectionLost.description":
+ "Terminal bağlantısı kesildi. Bu durum sunucu yeniden başladığında oluşabilir.",
+
+ "common.closeTab": "Sekmeyi kapat",
+ "common.dismiss": "Kapat",
+ "common.requestFailed": "İstek başarısız",
+ "common.moreOptions": "Daha fazla seçenek",
+ "common.learnMore": "Daha fazla bilgi",
+ "common.rename": "Yeniden adlandır",
+ "common.reset": "Sıfırla",
+ "common.archive": "Arşivle",
+ "common.delete": "Sil",
+ "common.close": "Kapat",
+ "common.edit": "Düzenle",
+ "common.loadMore": "Daha fazla yükle",
+ "common.key.esc": "ESC",
+
+ "sidebar.menu.toggle": "Menüyü aç/kapat",
+ "sidebar.nav.projectsAndSessions": "Projeler ve oturumlar",
+ "sidebar.settings": "Ayarlar",
+ "sidebar.help": "Yardım",
+ "sidebar.workspaces.enable": "Çalışma alanlarını etkinleştir",
+ "sidebar.workspaces.disable": "Çalışma alanlarını devre dışı bırak",
+ "sidebar.gettingStarted.title": "Başlarken",
+ "sidebar.gettingStarted.line1": "OpenCode ücretsiz modeller içerir, böylece hemen başlayabilirsiniz.",
+ "sidebar.gettingStarted.line2": "Claude, GPT, Gemini vb. modelleri kullanmak için herhangi bir sağlayıcı bağlayın.",
+ "sidebar.project.recentSessions": "Son oturumlar",
+ "sidebar.project.viewAllSessions": "Tüm oturumları görüntüle",
+ "sidebar.project.clearNotifications": "Bildirimleri temizle",
+
+ "app.name.desktop": "OpenCode Masaüstü",
+
+ "settings.section.desktop": "Masaüstü",
+ "settings.section.server": "Sunucu",
+ "settings.tab.general": "Genel",
+ "settings.tab.shortcuts": "Kısayollar",
+ "settings.desktop.section.wsl": "WSL",
+ "settings.desktop.wsl.title": "WSL entegrasyonu",
+ "settings.desktop.wsl.description": "OpenCode sunucusunu Windows'ta WSL içinde çalıştırın.",
+
+ "settings.general.section.appearance": "Görünüm",
+ "settings.general.section.notifications": "Sistem bildirimleri",
+ "settings.general.section.updates": "Güncellemeler",
+ "settings.general.section.sounds": "Ses efektleri",
+ "settings.general.section.feed": "Akış",
+ "settings.general.section.display": "Ekran",
+
+ "settings.general.row.language.title": "Dil",
+ "settings.general.row.language.description": "OpenCode'un görünüm dilini değiştirin",
+ "settings.general.row.appearance.title": "Görünüm",
+ "settings.general.row.appearance.description": "OpenCode'un cihazınızdaki görünümünü özelleştirin",
+ "settings.general.row.theme.title": "Tema",
+ "settings.general.row.theme.description": "OpenCode'un temasını özelleştirin.",
+ "settings.general.row.font.title": "Yazı Tipi",
+ "settings.general.row.font.description": "Kod bloklarında kullanılan monospace yazı tipini özelleştirin",
+ "settings.general.row.reasoningSummaries.title": "Akıl yürütme özetlerini göster",
+ "settings.general.row.reasoningSummaries.description": "Zaman çizelgesinde model akıl yürütme özetlerini görüntüle",
+ "settings.general.row.shellToolPartsExpanded.title": "Kabuk araç bileşenlerini genişlet",
+ "settings.general.row.shellToolPartsExpanded.description":
+ "Zaman çizelgesinde kabuk araç bileşenlerini varsayılan olarak genişletilmiş göster",
+ "settings.general.row.editToolPartsExpanded.title": "Düzenleme araç bileşenlerini genişlet",
+ "settings.general.row.editToolPartsExpanded.description":
+ "Zaman çizelgesinde düzenleme, yazma ve yama araç bileşenlerini varsayılan olarak genişletilmiş göster",
+
+ "settings.general.row.wayland.title": "Yerel Wayland kullan",
+ "settings.general.row.wayland.description": "Wayland'da X11 geri dönüşünü devre dışı bırak. Yeniden başlatma gerektirir.",
+ "settings.general.row.wayland.tooltip":
+ "Karışık yenileme hızlı monitörlere sahip Linux'ta yerel Wayland daha kararlı olabilir.",
+
+ "settings.general.row.releaseNotes.title": "Sürüm notları",
+ "settings.general.row.releaseNotes.description": "Güncellemelerden sonra Yenilikler bildirimlerini göster",
+
+ "settings.updates.row.startup.title": "Başlangıçta güncellemeleri kontrol et",
+ "settings.updates.row.startup.description": "OpenCode başladığında otomatik güncelleme kontrolü yap",
+ "settings.updates.row.check.title": "Güncellemeleri kontrol et",
+ "settings.updates.row.check.description": "Elle güncelleme kontrolü yap ve varsa yükle",
+ "settings.updates.action.checkNow": "Şimdi kontrol et",
+ "settings.updates.action.checking": "Kontrol ediliyor...",
+ "settings.updates.toast.latest.title": "Güncelsiniz",
+ "settings.updates.toast.latest.description": "OpenCode'un en son sürümünü kullanıyorsunuz.",
+
+ "font.option.ibmPlexMono": "IBM Plex Mono",
+ "font.option.cascadiaCode": "Cascadia Code",
+ "font.option.firaCode": "Fira Code",
+ "font.option.hack": "Hack",
+ "font.option.inconsolata": "Inconsolata",
+ "font.option.intelOneMono": "Intel One Mono",
+ "font.option.iosevka": "Iosevka",
+ "font.option.jetbrainsMono": "JetBrains Mono",
+ "font.option.mesloLgs": "Meslo LGS",
+ "font.option.robotoMono": "Roboto Mono",
+ "font.option.sourceCodePro": "Source Code Pro",
+ "font.option.ubuntuMono": "Ubuntu Mono",
+ "font.option.geistMono": "Geist Mono",
+
+ "sound.option.none": "Yok",
+ "sound.option.alert01": "Uyarı 01",
+ "sound.option.alert02": "Uyarı 02",
+ "sound.option.alert03": "Uyarı 03",
+ "sound.option.alert04": "Uyarı 04",
+ "sound.option.alert05": "Uyarı 05",
+ "sound.option.alert06": "Uyarı 06",
+ "sound.option.alert07": "Uyarı 07",
+ "sound.option.alert08": "Uyarı 08",
+ "sound.option.alert09": "Uyarı 09",
+ "sound.option.alert10": "Uyarı 10",
+ "sound.option.bipbop01": "Bip-bop 01",
+ "sound.option.bipbop02": "Bip-bop 02",
+ "sound.option.bipbop03": "Bip-bop 03",
+ "sound.option.bipbop04": "Bip-bop 04",
+ "sound.option.bipbop05": "Bip-bop 05",
+ "sound.option.bipbop06": "Bip-bop 06",
+ "sound.option.bipbop07": "Bip-bop 07",
+ "sound.option.bipbop08": "Bip-bop 08",
+ "sound.option.bipbop09": "Bip-bop 09",
+ "sound.option.bipbop10": "Bip-bop 10",
+ "sound.option.staplebops01": "Staplebops 01",
+ "sound.option.staplebops02": "Staplebops 02",
+ "sound.option.staplebops03": "Staplebops 03",
+ "sound.option.staplebops04": "Staplebops 04",
+ "sound.option.staplebops05": "Staplebops 05",
+ "sound.option.staplebops06": "Staplebops 06",
+ "sound.option.staplebops07": "Staplebops 07",
+ "sound.option.nope01": "Hayır 01",
+ "sound.option.nope02": "Hayır 02",
+ "sound.option.nope03": "Hayır 03",
+ "sound.option.nope04": "Hayır 04",
+ "sound.option.nope05": "Hayır 05",
+ "sound.option.nope06": "Hayır 06",
+ "sound.option.nope07": "Hayır 07",
+ "sound.option.nope08": "Hayır 08",
+ "sound.option.nope09": "Hayır 09",
+ "sound.option.nope10": "Hayır 10",
+ "sound.option.nope11": "Hayır 11",
+ "sound.option.nope12": "Hayır 12",
+ "sound.option.yup01": "Evet 01",
+ "sound.option.yup02": "Evet 02",
+ "sound.option.yup03": "Evet 03",
+ "sound.option.yup04": "Evet 04",
+ "sound.option.yup05": "Evet 05",
+ "sound.option.yup06": "Evet 06",
+
+ "settings.general.notifications.agent.title": "Ajan",
+ "settings.general.notifications.agent.description":
+ "Ajan tamamlandığında veya dikkat gerektirdiğinde sistem bildirimi göster",
+ "settings.general.notifications.permissions.title": "İzinler",
+ "settings.general.notifications.permissions.description": "İzin gerektiğinde sistem bildirimi göster",
+ "settings.general.notifications.errors.title": "Hatalar",
+ "settings.general.notifications.errors.description": "Hata oluştuğunda sistem bildirimi göster",
+
+ "settings.general.sounds.agent.title": "Ajan",
+ "settings.general.sounds.agent.description": "Ajan tamamlandığında veya dikkat gerektirdiğinde ses çal",
+ "settings.general.sounds.permissions.title": "İzinler",
+ "settings.general.sounds.permissions.description": "İzin gerektiğinde ses çal",
+ "settings.general.sounds.errors.title": "Hatalar",
+ "settings.general.sounds.errors.description": "Hata oluştuğunda ses çal",
+
+ "settings.shortcuts.title": "Klavye kısayolları",
+ "settings.shortcuts.reset.button": "Varsayılanlara sıfırla",
+ "settings.shortcuts.reset.toast.title": "Kısayollar sıfırlandı",
+ "settings.shortcuts.reset.toast.description": "Klavye kısayolları varsayılanlara sıfırlandı.",
+ "settings.shortcuts.conflict.title": "Kısayol zaten kullanılıyor",
+ "settings.shortcuts.conflict.description": "{{keybind}} zaten {{titles}} için atanmış.",
+ "settings.shortcuts.unassigned": "Atanmamış",
+ "settings.shortcuts.pressKeys": "Tuşlara basın",
+ "settings.shortcuts.search.placeholder": "Kısayol ara",
+ "settings.shortcuts.search.empty": "Kısayol bulunamadı",
+
+ "settings.shortcuts.group.general": "Genel",
+ "settings.shortcuts.group.session": "Oturum",
+ "settings.shortcuts.group.navigation": "Gezinme",
+ "settings.shortcuts.group.modelAndAgent": "Model ve ajan",
+ "settings.shortcuts.group.terminal": "Terminal",
+ "settings.shortcuts.group.prompt": "Komut",
+
+ "settings.providers.title": "Sağlayıcılar",
+ "settings.providers.description": "Sağlayıcı ayarları burada yapılandırılabilecek.",
+ "settings.providers.section.connected": "Bağlı sağlayıcılar",
+ "settings.providers.connected.empty": "Bağlı sağlayıcı yok",
+ "settings.providers.section.popular": "Popüler sağlayıcılar",
+ "settings.providers.tag.environment": "Ortam",
+ "settings.providers.tag.config": "Yapılandırma",
+ "settings.providers.tag.custom": "Özel",
+ "settings.providers.tag.other": "Diğer",
+ "settings.models.title": "Modeller",
+ "settings.models.description": "Model ayarları burada yapılandırılabilecek.",
+ "settings.agents.title": "Ajanlar",
+ "settings.agents.description": "Ajan ayarları burada yapılandırılabilecek.",
+ "settings.commands.title": "Komutlar",
+ "settings.commands.description": "Komut ayarları burada yapılandırılabilecek.",
+ "settings.mcp.title": "MCP",
+ "settings.mcp.description": "MCP ayarları burada yapılandırılabilecek.",
+
+ "settings.permissions.title": "İzinler",
+ "settings.permissions.description": "Sunucunun varsayılan olarak hangi araçları kullanabileceğini kontrol edin.",
+ "settings.permissions.section.tools": "Araçlar",
+ "settings.permissions.toast.updateFailed.title": "İzinler güncellenemedi",
+
+ "settings.permissions.action.allow": "İzin Ver",
+ "settings.permissions.action.ask": "Sor",
+ "settings.permissions.action.deny": "Reddet",
+
+ "settings.permissions.tool.read.title": "Oku",
+ "settings.permissions.tool.read.description": "Bir dosyayı okuma (dosya yoluyla eşleşir)",
+ "settings.permissions.tool.edit.title": "Düzenle",
+ "settings.permissions.tool.edit.description": "Düzenleme, yazma, yama ve çoklu düzenleme dahil dosyaları değiştir",
+ "settings.permissions.tool.glob.title": "Glob",
+ "settings.permissions.tool.glob.description": "Glob kalıpları kullanarak dosyaları eşle",
+ "settings.permissions.tool.grep.title": "Grep",
+ "settings.permissions.tool.grep.description": "Düzenli ifadeler kullanarak dosya içerikleri ara",
+ "settings.permissions.tool.list.title": "Listele",
+ "settings.permissions.tool.list.description": "Bir dizindeki dosyaları listele",
+ "settings.permissions.tool.bash.title": "Bash",
+ "settings.permissions.tool.bash.description": "Kabuk komutları çalıştır",
+ "settings.permissions.tool.task.title": "Görev",
+ "settings.permissions.tool.task.description": "Alt ajanlar başlat",
+ "settings.permissions.tool.skill.title": "Beceri",
+ "settings.permissions.tool.skill.description": "Ada göre bir beceri yükle",
+ "settings.permissions.tool.lsp.title": "LSP",
+ "settings.permissions.tool.lsp.description": "Dil sunucusu sorguları çalıştır",
+ "settings.permissions.tool.todoread.title": "Görev Oku",
+ "settings.permissions.tool.todoread.description": "Görev listesini oku",
+ "settings.permissions.tool.todowrite.title": "Görev Yaz",
+ "settings.permissions.tool.todowrite.description": "Görev listesini güncelle",
+ "settings.permissions.tool.webfetch.title": "Web Getir",
+ "settings.permissions.tool.webfetch.description": "Bir URL'den içerik getir",
+ "settings.permissions.tool.websearch.title": "Web Ara",
+ "settings.permissions.tool.websearch.description": "Web'de ara",
+ "settings.permissions.tool.codesearch.title": "Kod Ara",
+ "settings.permissions.tool.codesearch.description": "Web'de kod ara",
+ "settings.permissions.tool.external_directory.title": "Harici Dizin",
+ "settings.permissions.tool.external_directory.description": "Proje dizini dışındaki dosyalara eriş",
+ "settings.permissions.tool.doom_loop.title": "Sonsuz Döngü",
+ "settings.permissions.tool.doom_loop.description": "Aynı girdiyle tekrarlanan araç çağrılarını algıla",
+
+ "session.delete.failed.title": "Oturum silinemedi",
+ "session.delete.title": "Oturumu sil",
+ "session.delete.confirm": '"{{name}}" oturumu silinsin mi?',
+ "session.delete.button": "Oturumu sil",
+
+ "workspace.new": "Yeni çalışma alanı",
+ "workspace.type.local": "yerel",
+ "workspace.type.sandbox": "sandbox",
+ "workspace.create.failed.title": "Çalışma alanı oluşturulamadı",
+ "workspace.delete.failed.title": "Çalışma alanı silinemedi",
+ "workspace.resetting.title": "Çalışma alanı sıfırlanıyor",
+ "workspace.resetting.description": "Bu bir dakika sürebilir.",
+ "workspace.reset.failed.title": "Çalışma alanı sıfırlanamadı",
+ "workspace.reset.success.title": "Çalışma alanı sıfırlandı",
+ "workspace.reset.success.description": "Çalışma alanı artık varsayılan dalla eşleşiyor.",
+ "workspace.error.stillPreparing": "Çalışma alanı hâlâ hazırlanıyor",
+ "workspace.status.checking": "Birleşmemiş değişiklikler kontrol ediliyor...",
+ "workspace.status.error": "Git durumu doğrulanamadı.",
+ "workspace.status.clean": "Birleşmemiş değişiklik algılanmadı.",
+ "workspace.status.dirty": "Bu çalışma alanında birleşmemiş değişiklikler algılandı.",
+ "workspace.delete.title": "Çalışma alanını sil",
+ "workspace.delete.confirm": '"{{name}}" çalışma alanı silinsin mi?',
+ "workspace.delete.button": "Çalışma alanını sil",
+ "workspace.reset.title": "Çalışma alanını sıfırla",
+ "workspace.reset.confirm": '"{{name}}" çalışma alanı sıfırlansın mı?',
+ "workspace.reset.button": "Çalışma alanını sıfırla",
+ "workspace.reset.archived.none": "Arşivlenecek aktif oturum yok.",
+ "workspace.reset.archived.one": "1 oturum arşivlenecek.",
+ "workspace.reset.archived.many": "{{count}} oturum arşivlenecek.",
+ "workspace.reset.note": "Bu işlem çalışma alanını varsayılan dalla eşleşecek şekilde sıfırlayacak.",
+} satisfies Partial>
diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts
new file mode 100644
index 0000000000..15db281cda
--- /dev/null
+++ b/packages/ui/src/i18n/tr.ts
@@ -0,0 +1,123 @@
+import { dict as en } from "./en"
+
+type Keys = keyof typeof en
+
+export const dict = {
+ "ui.sessionReview.title": "Oturum değişiklikleri",
+ "ui.sessionReview.title.lastTurn": "Son tur değişiklikleri",
+ "ui.sessionReview.diffStyle.unified": "Birleşik",
+ "ui.sessionReview.diffStyle.split": "Bölünmüş",
+ "ui.sessionReview.expandAll": "Tümünü genişlet",
+ "ui.sessionReview.collapseAll": "Tümünü daralt",
+
+ "ui.sessionReview.change.added": "Eklendi",
+ "ui.sessionReview.change.removed": "Kaldırıldı",
+ "ui.sessionReview.change.modified": "Değiştirildi",
+ "ui.sessionReview.image.loading": "Yükleniyor...",
+ "ui.sessionReview.image.placeholder": "Görsel",
+ "ui.sessionReview.largeDiff.title": "Fark gösterimi için çok büyük",
+ "ui.sessionReview.largeDiff.meta": "Limit: {{limit}} değişen satır. Mevcut: {{current}} değişen satır.",
+ "ui.sessionReview.largeDiff.renderAnyway": "Yine de göster",
+
+ "ui.lineComment.label.prefix": "Yorum: ",
+ "ui.lineComment.label.suffix": "",
+ "ui.lineComment.editorLabel.prefix": "Yorum yapılıyor: ",
+ "ui.lineComment.editorLabel.suffix": "",
+ "ui.lineComment.placeholder": "Yorum ekle",
+ "ui.lineComment.submit": "Yorum yap",
+
+ "ui.sessionTurn.steps.show": "Adımları göster",
+ "ui.sessionTurn.steps.hide": "Adımları gizle",
+ "ui.sessionTurn.summary.response": "Yanıt",
+ "ui.sessionTurn.diff.showMore": "Daha fazla değişiklik göster ({{count}})",
+
+ "ui.sessionTurn.retry.retrying": "yeniden deneniyor",
+ "ui.sessionTurn.retry.inSeconds": "{{seconds}}sn içinde",
+ "ui.sessionTurn.error.freeUsageExceeded": "Ücretsiz kullanım aşıldı",
+ "ui.sessionTurn.error.addCredits": "Kredi ekle",
+
+ "ui.sessionTurn.status.delegating": "Görev devrediliyor",
+ "ui.sessionTurn.status.planning": "Sonraki adımlar planlanıyor",
+ "ui.sessionTurn.status.gatheringContext": "Keşfediliyor",
+ "ui.sessionTurn.status.gatheredContext": "Keşfedildi",
+ "ui.sessionTurn.status.searchingCodebase": "Kod tabanı aranıyor",
+ "ui.sessionTurn.status.searchingWeb": "Web aranıyor",
+ "ui.sessionTurn.status.makingEdits": "Düzenlemeler yapılıyor",
+ "ui.sessionTurn.status.runningCommands": "Komutlar çalıştırılıyor",
+ "ui.sessionTurn.status.thinking": "Düşünüyor",
+ "ui.sessionTurn.status.thinkingWithTopic": "Düşünüyor - {{topic}}",
+ "ui.sessionTurn.status.gatheringThoughts": "Düşünceler toplanıyor",
+ "ui.sessionTurn.status.consideringNextSteps": "Sonraki adımlar değerlendiriliyor",
+
+ "ui.messagePart.diagnostic.error": "Hata",
+ "ui.messagePart.title.edit": "Düzenle",
+ "ui.messagePart.title.write": "Yaz",
+ "ui.messagePart.option.typeOwnAnswer": "Kendi cevabınızı yazın",
+ "ui.messagePart.review.title": "Cevapları inceleyin",
+
+ "ui.list.loading": "Yükleniyor",
+ "ui.list.empty": "Sonuç bulunamadı",
+ "ui.list.clearFilter": "Filtreyi temizle",
+ "ui.list.emptyWithFilter.prefix": "Sonuç bulunamadı:",
+ "ui.list.emptyWithFilter.suffix": "",
+
+ "ui.messageNav.newMessage": "Yeni mesaj",
+
+ "ui.textField.copyToClipboard": "Panoya kopyala",
+ "ui.textField.copyLink": "Bağlantı kopyala",
+ "ui.textField.copied": "Kopyalandı",
+
+ "ui.imagePreview.alt": "Görsel önizleme",
+
+ "ui.tool.read": "Oku",
+ "ui.tool.loaded": "Yüklendi",
+ "ui.tool.list": "Listele",
+ "ui.tool.glob": "Glob",
+ "ui.tool.grep": "Grep",
+ "ui.tool.webfetch": "Web getir",
+ "ui.tool.shell": "Kabuk",
+ "ui.tool.patch": "Yama",
+ "ui.tool.todos": "Görevler",
+ "ui.tool.todos.read": "Görevleri oku",
+ "ui.tool.questions": "Sorular",
+ "ui.tool.agent": "{{type}} Ajan",
+
+ "ui.common.file.one": "dosya",
+ "ui.common.file.other": "dosya",
+ "ui.common.question.one": "soru",
+ "ui.common.question.other": "soru",
+
+ "ui.common.add": "Ekle",
+ "ui.common.back": "Geri",
+ "ui.common.cancel": "İptal",
+ "ui.common.confirm": "Onayla",
+ "ui.common.dismiss": "Kapat",
+ "ui.common.close": "Kapat",
+ "ui.common.next": "İleri",
+ "ui.common.submit": "Gönder",
+
+ "ui.permission.deny": "Reddet",
+ "ui.permission.allowAlways": "Her zaman izin ver",
+ "ui.permission.allowOnce": "Bir kez izin ver",
+
+ "ui.message.expand": "Mesajı genişlet",
+ "ui.message.collapse": "Mesajı daralt",
+ "ui.message.copy": "Kopyala",
+ "ui.message.copyMessage": "Mesajı kopyala",
+ "ui.message.copyResponse": "Yanıtı kopyala",
+ "ui.message.copied": "Kopyalandı",
+ "ui.message.interrupted": "Kesildi",
+ "ui.message.attachment.alt": "ek",
+
+ "ui.patch.action.deleted": "Silindi",
+ "ui.patch.action.created": "Oluşturuldu",
+ "ui.patch.action.moved": "Taşındı",
+ "ui.patch.action.patched": "Yamalandı",
+
+ "ui.question.subtitle.answered": "{{count}} cevaplandı",
+ "ui.question.answer.none": "(cevap yok)",
+ "ui.question.review.notAnswered": "(cevaplanmadı)",
+ "ui.question.multiHint": "Geçerli tüm cevapları seçin",
+ "ui.question.singleHint": "Bir cevap seçin",
+ "ui.question.custom.placeholder": "Cevabınızı yazın...",
+} satisfies Partial>
From 3407ded9d010e3b1d2d6377ae764ccf79b2c4b6a Mon Sep 17 00:00:00 2001
From: "opencode-agent[bot]"
Date: Fri, 27 Feb 2026 11:41:55 +0000
Subject: [PATCH 005/211] chore: generate
---
packages/app/src/i18n/tr.ts | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts
index 164d2eb3b3..4a38e61ec8 100644
--- a/packages/app/src/i18n/tr.ts
+++ b/packages/app/src/i18n/tr.ts
@@ -143,7 +143,8 @@ export const dict = {
"provider.connect.opencodeZen.visit.prefix": "",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " adresini ziyaret ederek API anahtarınızı alın.",
- "provider.connect.oauth.code.visit.prefix": "Hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için ",
+ "provider.connect.oauth.code.visit.prefix":
+ "Hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için ",
"provider.connect.oauth.code.visit.link": "bu bağlantıya",
"provider.connect.oauth.code.visit.suffix": " tıklayarak yetkilendirme kodunuzu alın.",
"provider.connect.oauth.code.label": "{{method}} yetkilendirme kodu",
@@ -171,7 +172,8 @@ export const dict = {
"provider.custom.field.baseURL.placeholder": "https://api.saglayicim.com/v1",
"provider.custom.field.apiKey.label": "API anahtarı",
"provider.custom.field.apiKey.placeholder": "API anahtarı",
- "provider.custom.field.apiKey.description": "İsteğe bağlı. Kimlik doğrulamayı başlıklar ile yönetiyorsanız boş bırakın.",
+ "provider.custom.field.apiKey.description":
+ "İsteğe bağlı. Kimlik doğrulamayı başlıklar ile yönetiyorsanız boş bırakın.",
"provider.custom.models.label": "Modeller",
"provider.custom.models.id.label": "Kimlik",
"provider.custom.models.id.placeholder": "model-kimlik",
@@ -466,12 +468,14 @@ export const dict = {
"error.chain.didYouMean": "Bunu mu demek istediniz: {{suggestions}}",
"error.chain.modelNotFound": "Model bulunamadı: {{provider}}/{{model}}",
"error.chain.checkConfig": "Yapılandırma dosyanızı (opencode.json) sağlayıcı/model adlarını kontrol edin",
- "error.chain.mcpFailed": 'MCP sunucusu "{{name}}" başarısız oldu. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.',
+ "error.chain.mcpFailed":
+ 'MCP sunucusu "{{name}}" başarısız oldu. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.',
"error.chain.providerAuthFailed": "Sağlayıcı kimlik doğrulaması başarısız ({{provider}}): {{message}}",
"error.chain.providerInitFailed":
'"{{provider}}" sağlayıcısı başlatılamadı. Kimlik bilgilerini ve yapılandırmayı kontrol edin.',
"error.chain.configJsonInvalid": "{{path}} adresindeki yapılandırma dosyası geçerli JSON(C) değil",
- "error.chain.configJsonInvalidWithMessage": "{{path}} adresindeki yapılandırma dosyası geçerli JSON(C) değil: {{message}}",
+ "error.chain.configJsonInvalidWithMessage":
+ "{{path}} adresindeki yapılandırma dosyası geçerli JSON(C) değil: {{message}}",
"error.chain.configDirectoryTypo":
'"{{dir}}" dizini {{path}} içinde geçerli değil. Dizini "{{suggestion}}" olarak yeniden adlandırın veya kaldırın. Bu yaygın bir yazım hatasıdır.',
"error.chain.configFrontmatterError": "{{path}} içindeki ön bilgi ayrıştırılamadı:\n{{message}}",
@@ -541,8 +545,7 @@ export const dict = {
"status.popover.action.manageServers": "Sunucuları yönet",
"session.share.popover.title": "Web'de yayınla",
- "session.share.popover.description.shared":
- "Bu oturum web'de herkese açıktır. Bağlantıya sahip herkes erişebilir.",
+ "session.share.popover.description.shared": "Bu oturum web'de herkese açıktır. Bağlantıya sahip herkes erişebilir.",
"session.share.popover.description.unshared":
"Oturumu web'de herkese açık olarak paylaşın. Bağlantıya sahip herkes erişebilecek.",
"session.share.action.share": "Paylaş",
@@ -628,7 +631,8 @@ export const dict = {
"Zaman çizelgesinde düzenleme, yazma ve yama araç bileşenlerini varsayılan olarak genişletilmiş göster",
"settings.general.row.wayland.title": "Yerel Wayland kullan",
- "settings.general.row.wayland.description": "Wayland'da X11 geri dönüşünü devre dışı bırak. Yeniden başlatma gerektirir.",
+ "settings.general.row.wayland.description":
+ "Wayland'da X11 geri dönüşünü devre dışı bırak. Yeniden başlatma gerektirir.",
"settings.general.row.wayland.tooltip":
"Karışık yenileme hızlı monitörlere sahip Linux'ta yerel Wayland daha kararlı olabilir.",
From 4a940969947654deca40454503491793ce1b347c Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Fri, 27 Feb 2026 06:00:54 -0600
Subject: [PATCH 006/211] fix(app): update provider sprite
---
.../ui/src/assets/icons/provider/evroc.svg | 3 ++
.../ui/src/assets/icons/provider/meganova.svg | 8 ++---
.../src/assets/icons/provider/opencode-go.svg | 3 ++
.../ui/src/assets/icons/provider/opencode.svg | 1 -
.../src/components/provider-icons/sprite.svg | 30 +++++++------------
.../ui/src/components/provider-icons/types.ts | 2 ++
6 files changed, 21 insertions(+), 26 deletions(-)
create mode 100644 packages/ui/src/assets/icons/provider/evroc.svg
create mode 100644 packages/ui/src/assets/icons/provider/opencode-go.svg
diff --git a/packages/ui/src/assets/icons/provider/evroc.svg b/packages/ui/src/assets/icons/provider/evroc.svg
new file mode 100644
index 0000000000..7597820a19
--- /dev/null
+++ b/packages/ui/src/assets/icons/provider/evroc.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/ui/src/assets/icons/provider/meganova.svg b/packages/ui/src/assets/icons/provider/meganova.svg
index ab294f1e17..59e8b3a1f2 100644
--- a/packages/ui/src/assets/icons/provider/meganova.svg
+++ b/packages/ui/src/assets/icons/provider/meganova.svg
@@ -1,7 +1,3 @@
-