Files
apes-sidebar/src/client/locales-tr.ts
T
Menghuan1918 5c95002641 perf(sidebar): fs.tree 22.8ms→3.8ms + 删除工作区路径检测(放开权限)+ 树展开状态按会话
用户实测反馈:

1) `/sidebar/api/fs.tree` 性能极差 —— 先测后改(10k 条目目录、热缓存、中位数):
   - 冷调用 cap=1000:22.76ms → **3.77ms**;TTL 内重复:≈23ms → **0.000ms**
   - 改法:opendir for-await → readdir(withFileTypes) 一次取回;只为 cap 条建行
     (slice + 定长数组);路径用字符串拼接而非 path.join;排序弃 localeCompare
     (14.6ms/10k → 0.35ms)改小写比较 + 原名码点兜底;新增 1.5s 目录级缓存
     (键 绝对路径\0cap,上限 512),由 fs.write/rename/remove/mkdir/upload 与
     fs-watch 的变更通知显式失效
   - 契约逐字不变;新增 tests/fs-tree.spec.ts 6 例 + fs-watch 失效用例(判别性验证)

2) 删除工作区路径检测(默认不检测、放开权限):
   - path-security 变纯词法解析(realpath/包含性判定删除)、fs-operations 去 fence
     分支、所有 fs 路由不再读 fence、403 分支消失、config 删 workspaceFence 字段
     (schemastery 容忍未知键,旧 profile 不会加载失败)、settings 开关删除
   - ⚠️ 安全影响:插件 fs 路由(tree/read/write/rename/remove/mkdir/媒体/HTML/
     upload/archive)现在可读写宿主用户可访问的任意路径,只受 OS 权限约束;
     指南 §8.1 已加醒目声明
   - 死代码清理:FenceErrorNotice 组件 + EditorHost 分支 + 4 个词条(settingsFence*、
     fenceErrorReason、fenceDisableAction)+ isOutsideWorkspace* 助手 + TreePanel 的
     store prop + 相关 CSS 块

3) 批量列举路由 `fs.trees`(单层失败只在该层带 error)+ 客户端批量加载:
   挂载/刷新时的 N+1 请求变为 1 个(8 个展开目录:9 → 1,探针断言)
   refreshTick 不再先清缓存(旧行保留到新答案;失败保留旧行 + warn 提示)

4) 修复「关闭文件后返回文件树,展开状态被重置」:
   原生承载面的展开集合原来存在每个 tab 的记录里(drop 即丢),改为**每会话状态**
   的投影(ensure 从会话态读、toggleExpanded 写回会话态、registerNativeSurface 用
   attachStore 订阅);同一会话多 tab 共享、不同会话隔离;revealed 保持 per-tab

验证:typecheck / lint / test(136 文件 / 1484 通过 / 9 跳过)/ build 全绿;
DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过;
版本镜像同步(dsh.plugin.json + SIDEBAR_SERVICE_VERSION)
2026-09-28 20:37:56 +08:00

526 lines
35 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* The tr (Turkish) dictionary for the betterSidebar namespace.
*
* Mirrors the key set of `zh` in `locales.ts`. The sidebar's `t()`
* consults this dict when `attachBetterLocale(store)` has been called
* with an active better-locale store whose `active` is `'tr'`; absent
* that, the existing zh/en chain runs unchanged.
*
* Translation conventions:
* - Common dev-tool loanwords stay in Turkish (Terminal, Tarayıcı, Klasör).
* - Git vocabulary follows standard Turkish usage ( Sahnele, İşle, Dal).
* - Settings labels end in noun/infinitive forms to mirror the zh cadence.
* - Placeholders keep `{name}` verbatim (interpolation runs after lookup).
* - English brand names (VS Code, Cursor, Zed, SSH) stay as-is.
*/
/** The tr dictionary (key-set-equal to zh, enforced by the type annotation in locales.ts). */
export const tr: Record<string, string> = {
files: 'Dosyalar',
guideDescFiles: 'Çalışma alanı dosya ağacına göz atın; tıklayınca önizleme veya düzenleme açılır',
guideDescGit: 'Git değişiklikleri ve bu oturumun dosya değişiklikleri tek sekmede',
guideDescSubagent: 'İş akışı grafiği, takım görev panosu ve arka plan görevleri, canlı',
guideDescSidechat: 'Bu oturumun bağlamını devralan bağımsız bir yan konu',
guideDescTerminal: 'Gerçek bir shell (xterm + pty), yeniden bağlanma destekli',
guideDescBrowser: 'Sohbet bağlantılarını devralabilen gömülü tarayıcı',
changesSessionEmpty: 'Bu oturumda henüz dosya işlemi yok',
changesRead: 'Okuma',
changesMdReading: 'Okuma',
changesHtmlRender: "Render",
changesHtmlRaw: "Kaynak",
changesPdfRender: "Render",
changesPdfRaw: "Kaynak",
changesMdRaw: 'Ham',
changesWrite: 'Yazma',
changesEdit: 'Düzenleme',
changesRunning: 'çalışıyor',
changesError: 'hata',
changesFold: '{count} satır… genişletmek için tıklayın',
changesFoldLoading: 'Genişletiliyor…',
changesFoldUnavailable: 'Bağlam yüklenemedi',
changesContext: 'bağlam',
changesPriorUnknown: 'Değişiklik öncesi içerik pencere dışında; tamamen yeni eklenmiş olarak gösteriliyor',
explorer: 'Gezgin',
terminal: 'Terminal',
editor: 'Düzenleyici',
editorExplorer: 'Dosya açma davranışı',
editorExplorerDesc: 'Dosyaların açılma biçimini denetler',
editorExplorerMerged: 'Birleşik',
editorExplorerMergedDesc: 'Dosyalar aynı pencerede yerinde geçer; yeni pencereler ağaç açık başlar',
editorExplorerSplit: 'Ayrı',
editorExplorerSplitDesc: 'Yolsuz pencere tek başına gezgindir (yalnızca ağaç); her dosya kendi penceresini açar (ağaç yuvalanmış, varsayılan kapalı)',
editorTreeToggle: 'Dosya ağacı paneli',
editorPathPlaceholder: 'Dosya yolu (oturum dizinine göreli veya mutlak), Enter ile aç',
editorSearchPlaceholder: 'Dosya adına göre ara…',
editorSearchNoResults: 'Eşleşen dosya yok',
editorSearchTruncated: 'Sonuç çok fazla — kısmi liste gösteriliyor',
editorEmptyHint: 'Önizlemeye başlamak için sağdaki dosya ağacından veya yukarıdaki yol girişinden bir dosya seçin',
openFileNewTab: 'Yeni sekmede aç',
openFileSide: 'Yana aç',
zipProgress: 'Arşivleniyor {done}/{total}',
settingsOpenWithPluginTitle: 'Eklentinin kendi "Birlikte aç" seçeneklerini her zaman göster',
settingsOpenWithPluginDesc: 'Varsayılan olarak eklentinin kendi "Birlikte aç" seçenekleri yalnızca ana makine yerel bir ilişkili uygulama algılamadığında gösterilir (Dosya yöneticisi / VS Code / Cursor / Zed / özel düzenleyiciler, uzak SSH); açıldığında ana makine uygulamaları ile eklenti hedefleri bir arada bulunur',
zipDownload: 'Sıkıştır ve indir',
zipDownloadCount: 'Sıkıştır ve indir ({count} öğe)',
zipFailed: 'Arşiv oluşturulamadı: {message}',
openWithMenu: 'Birlikte aç',
openWithSshSuffix: ' (SSH)',
pinOpenWith: 'Menüye sabitle',
unpinOpenWith: 'Sabitlemeyi kaldır',
openWithExplorer: 'Dosya yöneticisi',
openWithVscode: 'VS Code',
openWithCursor: 'Cursor',
openWithZed: 'Zed',
openWithSettingsSshTitle: 'SSH uzak ana makine',
openWithSettingsSshDesc: 'Boş = yerel çalışma alanı; bir user@host veya SSH rumuzu verilirse VSCode ailesi açıcılar vscode-remote/ssh-remote protokolüne geçer ve Dosya yöneticisi / Zed / VSCode ailesi olmayan özel düzenleyiciler menüden gizlenir',
openWithSettingsSshPlaceholder: 'user@host veya SSH rumuzu',
openWithSettingsCustomTitle: 'Özel düzenleyiciler',
openWithSettingsCustomDesc: 'Ad + URL şablonu ({path} yer tutucusu) + VSCode ailesi bayrağı; uzak modda yalnızca VSCode ailesi düzenleyiciler uzak yolu açabilir',
openWithSettingsAdd: 'Ekle',
openWithSettingsName: 'Ad',
openWithSettingsTemplate: 'ör. cursor://file/{path}',
openWithSettingsFamily: 'VSCode ailesi',
openWithSettingsFamilyDesc: 'Bu düzenleyici VSCode URL dilini konuşur (SSH uzak açmayı destekler)',
openWithSettingsRemove: 'Kaldır',
openWithSettingsInvalidHint: 'Adı eksik veya {path}/scheme:// içermeyen şablonlu düzenleyiciler menüde gösterilmez',
openInAppDefault: 'Varsayılan uygulamayla aç',
openInAppEmpty: 'Bunu açabilecek bir uygulama yok',
openInAppFailed: 'Açılamadı: {path}',
revealInFileManager: 'Dosya yöneticisinde göster',
filesSelected: '{count} öğe seçildi',
clearSelection: 'Seçimi temizle',
copyPaths: 'Yolları kopyala',
deleteSelected: 'Seçilenleri sil',
deleteSelectedTitle: 'Seçili {count} öğe silinsin mi?',
deleteSelectedDesc: 'Bu dosyalar ve klasörler kalıcı olarak silinecek. Bu işlem geri alınamaz.',
newFolder: 'Yeni klasör',
newFolderPlaceholder: 'Klasör adı',
newFolderInvalid: 'Klasör adı geçersiz',
filesTruncated: 'Bu klasörde çok fazla öğe var; yalnızca ilk kısmı gösteriliyor',
gitStatusModified: 'Değiştirildi',
gitStatusAdded: 'Eklendi',
gitStatusDeleted: 'Silindi',
gitStatusUntracked: 'İzlenmiyor',
gitStatusRenamed: 'Yeniden adlandırıldı',
gitStatusConflict: 'Çakışma',
changesClean: 'Çalışma alanında değişiklik yok',
changesNoHistory: 'Henüz commit geçmişi yok',
changesStageFailed: 'Sahneleme başarısız: {message}',
changesOpGone: 'Bu işlem artık oturum günlüğünde değil',
newTab: 'Yeni sekme',
brokenSymlink: 'Bozuk sembolik bağ',
close: 'Kapat',
closeOtherTabs: 'Diğer sekmeleri kapat',
closeLeftTabs: 'Soldaki sekmeleri kapat',
closeRightTabs: 'Sağdaki sekmeleri kapat',
pinTerminal: 'Terminali Sabitle',
pinAgentTerminal: 'Agent Terminalini Sabitle',
pinToWorkspace: 'Çalışma Alanına Sabitle',
pinToGlobal: 'Genel Olarak Sabitle',
unpinTerminal: 'Sabitlemeyi Kaldır',
collapseBottomPanel: 'Alt paneli daralt',
expandBottomPanel: 'Alt paneli genişlet',
terminalError: 'Terminal bağlantısı başarısız',
terminalConnectFailed: 'Terminal art arda bağlanamadı',
terminalRetry: 'Yeniden dene',
terminalWaitBanner: 'Ajan {needle} bekliyor',
terminalSkipWait: 'Beklemeyi atla',
terminalDepsFailed: 'Terminal bağımlılığı node-pty yüklenemedi',
terminalDepsHint: 'Onarmak için DSH makinesindeki bir terminalde veya cmd’de aşağıdaki komutu çalıştırın, sonra yeniden deneyin (node-pty, DSH çekirdek sürümüyle senkron kalır):',
terminalDepsProfile: ' (algılanan profil: {profile})',
terminalShellNotFound: 'Yapılandırılan kabuk bulunamadı: {name} — Ayarlar → Side card → Terminal altındaki kabuk yolunu denetleyin',
preview: 'Önizleme',
toc: 'İçindekiler',
edit: 'Düzenle',
mermaidError: 'Mermaid oluşturma başarısız',
mermaidZoomIn: 'Yakınlaştır',
mermaidZoomOut: 'Uzaklaştır',
mermaidZoomReset: 'Sıfırla',
mermaidZoomHint: 'Yakınlaştırmak için kaydır · taşımak için sürükle · kapatmak için Esc',
refresh: 'Yenile',
showInFolder: 'Klasörde göster',
refreshUnsavedConfirm: 'Dosya diskte değişti. Yenileme kaydedilmemiş düzenlemeleri atar. Devam edilsin mi?',
save: 'Kaydet',
saved: 'Kaydedildi',
unsaved: 'Kaydedilmedi',
saveFailed: 'Kaydetme başarısız',
truncation: 'Dosya çok büyük — ilk 512KB gösteriliyor',
binary: 'İkili dosya, önizleme kullanılamıyor',
loading: 'Yükleniyor…',
error: 'Yükleme başarısız',
retry: 'Yeniden dene',
notRepo: 'Bu dizin bir git deposu değil',
statusTruncated: 'Çok fazla değişiklik var; yalnızca ilk 2000 giriş gösteriliyor',
stage: 'Sahnele',
unstage: 'Sahnelemeden kaldır',
stageAll: 'Tümünü sahnele',
unstageAll: 'Tümünü sahnelemeden kaldır',
commitPlaceholder: 'İşleme iletisi (Ctrl+Enter)',
commit: 'İşle',
branch: 'Dal',
worktree: 'Çalışma ağacı',
checkoutError: 'Dal değiştirme başarısız',
history: 'Geçmiş',
changes: 'Dosya değişiklikleri',
changesGitLens: 'Git',
changesSessionLens: 'Oturum',
changesFilterAll: 'Tümü',
changesFilterEmpty: 'Bu türde işlem yok',
changesOpenDiffTab: 'Ayrı bir diff sekmesinde aç',
changesClosePreview: 'Önizlemeyi kapat',
changesResizePreview: 'Önizlemeyi boyutlandır',
changesLoadError: 'Oturum dosya kayıtları şu anda kullanılamıyor',
staged: 'Sahnelendi',
unstaged: 'Sahnelenmedi',
cancel: 'İptal',
diffEmpty: 'Metin değişikliği yok',
diffLoadError: 'Diff yüklenemedi',
diffBinary: 'İkili',
diffAdded: 'Eklendi',
diffDeleted: 'Silindi',
diffRenamed: 'Yeniden adlandırıldı',
diffExpand: '{count} satır daha göster',
discard: 'Değişiklikleri at',
discardTitle: 'Değişiklikleri at',
discardDesc: 'Bu, «{path}» öğesinin çalışma ağacı değişikliklerini atar (geri alınamaz).',
viewCommitDiff: 'İşleme diff’ini görüntüle',
copyShortHash: 'Kısa karmayı kopyala',
copyFullHash: 'Tam karmayı kopyala',
copySubject: 'İşleme iletisini kopyala',
revertCommit: 'İşlemeyi geri al',
revertTitle: 'İşlemeyi geri al',
revertDesc: '«{subject}» işlemini geriye alan yeni bir işleme geçerli dalda oluşturur.',
cherryPickCommit: 'İşlemeyi seç-al',
cherryPickTitle: 'İşlemeyi seç-al',
cherryPickDesc: '«{subject}» değişikliklerini geçerli dala uygular.',
timeJustNow: 'az önce',
timeMinutesAgo: '{n} dk önce',
timeHoursAgo: '{n} sa önce',
timeYesterday: 'dün',
loadMore: 'Daha fazla yükle',
historyLoadError: 'Daha fazla geçmiş yüklenemedi',
produced: 'Üretilenler',
disconnected: 'Terminal bağlantısı kesildi, yeniden bağlanılıyor…',
exited: 'Terminal süreci sonlandı',
noSession: 'Kenar çubuğunu kullanmak için bir oturum seçin',
pluginNotLoaded: 'Eklenti yüklenmedi; sekme kullanılamıyor:',
parent: 'Üst dizin',
copied: 'Kopyalandı',
copy: 'Kopyala',
openEditor: 'Düzenleyiciyi aç',
referenceFile: '@dosya',
addToConversation: 'Sohbete ekle',
copyRelative: 'Göreli yolu kopyala',
copyAbsolute: 'Mutlak yolu kopyala',
rename: 'Yeniden adlandır',
renameInvalid: 'Ad boş olamaz veya yol ayırıcıları içeremez.',
delete: 'Sil',
deleteTitle: '"{name}" silinsin mi?',
deleteDescFile: 'Bu, dosyayı kalıcı olarak siler. Bu işlem geri alınamaz.',
deleteDescDir: 'Bu, dizini ve tüm içeriğini kalıcı olarak siler. Bu işlem geri alınamaz.',
dismiss: 'Kapat',
download: 'İndir',
uploadFiles: 'Dosyaları yükle',
uploadFolder: 'Klasör yükle',
uploadHere: 'Buraya yükle',
uploadDropHint: 'Yüklemek için dosyaları/klasörleri buraya bırakın',
uploadDropChat: 'Resim eklemek için sohbet alanına bırakın',
uploadTo: '{dir} içine yükle',
uploadingTo: '{dir} içine yükleniyor…',
uploadProgress: 'Yükleniyor {done}/{total}: {name}',
uploadDone: '{count} dosya yüklendi',
uploadFailed: 'Yükleme başarısız: {error}',
uploadFailedUnknown: 'Bilinmeyen hata',
uploadTooLarge: 'Dosya çok büyük (yükleme sınırını aşıyor)',
uploadCancelled: 'Yükleme iptal edildi',
settingsNav: 'Yan kart',
settingsIntro: 'Yan kartın ne gösterdiğini ve nasıl davrandığını yönetin',
settingsPopupDesc: '«{feature}» için ilgili seçenekleri yapılandırın',
settingsDone: 'Bitti',
settingsOpenToolsTitle: 'Model için kenar çubuğu açma aracı enjekte et',
settingsOpenToolsDesc: 'Etkinleştirildiğinde model, sidebar_open aracıyla kenar çubuğunda dosyaları, klasörleri ve HTTP(S) sayfalarını açabilir (varsayılan kapalı)',
settingsTitleBarTitle: 'Konum uyumluluk modu',
settingsTitleBarDesc: 'Başlık çubuğu uyumluluk düzenini seçin: otomatik algıla (varsayılan, tutucu) / DSH resmi web / bilinen masaüstü kabukları / özel (kaydırma mesafesi + özel CSS)',
settingsTitleBarStripTitle: 'Kaydırma mesafesi',
settingsTitleBarStripDesc: 'Başlık çubuğu şerit yüksekliği: kenar çubuğu düğmelerinin ve içeriğin kaç px aşağı kayacağı (0–120, varsayılan 40; özel düzen altında geçerli)',
settingsSchemeAutoTitle: 'Otomatik algıla',
settingsSchemeAutoDesc: 'Tutucu: yalnızca standart Window Controls Overlay API’si katkıda bulunur (gerçek başlık katmanı yüksekliği); sade web ortamlarında hiçbir değişiklik yapılmaz',
settingsSchemeWebTitle: 'DSH resmi web',
settingsSchemeWebDesc: 'Resmi web arayüzünde çalıştığını açıkça bildir: hiçbir uyarlama yapılmaz (standart WCO geometrisi bile uygulanmaz)',
settingsSchemeCustomTitle: 'Özel',
settingsSchemeCustomDesc: 'Tam denetim: özel CSS enjekte et (yerleşik stilleri geçersiz kılabilir) ve başlık çubuğu kaydırma mesafesini ayarla',
settingsSchemeDetectedSuffix: 'algılandı',
settingsCustomCssTitle: 'Özel CSS',
settingsCustomCssPlaceholder: '/* örn. özel çizili başlık çubuğu olan bir kabuk için 36px ayır */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
settingsSaveFailed: 'Kaydetme başarısız',
settingsConflict: 'Ayar başka bir pencerede değiştirildi — lütfen yeniden deneyin',
binaryNoPreview: 'Bu dosya türü önizlenemiyor',
downloadToView: 'Görüntülemek için indir',
settingsSubagentTitle: 'Bir alt aracı belirdiğinde Görevler sayfasını otomatik etkinleştir',
settingsSubagentDesc: 'Geçerli sohbet yeni bir alt aracı oluşturduğunda Görevler sayfasını etkinleştir; geniş ekranlarda yan kart da genişletilir, dar ekranlarda tam ekran çekmecesi zorla açılmaz; kapalıyken elle açılması gerekir',
settingsJobsTitle: 'Yeni bir arka plan işi belirdiğinde Görevler sayfasını otomatik etkinleştir',
settingsJobsDesc: 'Geçerli sohbette her yeni arka plan işi belirdiğinde Görevler sayfasını etkinleştir (her yeni iş tetikler); geniş ekranlarda yan kart da genişletilir, dar ekranlarda tam ekran çekmecesi zorla açılmaz; kapalıyken elle açılması gerekir',
settingsToolsTitle: 'Model için terminal araçları enjekte et',
settingsToolsDesc: 'Etkinleştirildiğinde model, 8 terminal_* aracı üzerinden kenar çubuğu terminalleri oluşturup kullanabilir (varsayılan kapalı)',
settingsBottomTerminalTitle: 'Alt panelin ilk genişletilmesinde otomatik terminal aç',
settingsBottomTerminalDesc: 'Bir oturumda alt panel ilk genişletildiğinde orada yeni bir terminal sekmesi açmayı dene (terminal kotası yine geçerli; varsayılan açık)',
settingsFontFamilyTitle: 'Terminal yazı tipi ailesi',
settingsFontFamilyDesc: 'Özel terminal yazı tipi ailesi (bir CSS font-family yığını gibi "JetBrains Mono", monospace; temanın sabit genişlikli yazı tipini izlemek için boş bırakın)',
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
settingsFontSizeTitle: 'Terminal yazı boyutu',
settingsFontSizeDesc: 'px cinsinden terminal yazı boyutu (9–32, varsayılan 13)',
settingsShellTitle: 'Kabuk yolu',
settingsShellDesc: 'Arayüz ve model terminalleri için başlatılan kabuk (mutlak yol veya yalın yürütülebilir). Boş, eski sırayı korur: yaml config.shell → $SHELL / oturum açma kabuğu / Windows powershell.exe. Sonradan açılan terminaller için geçerli',
settingsShellPlaceholder: 'ör. /bin/zsh (boş = otomatik)',
settingsShellArgsTitle: 'Kabuk bağımsız değişkenleri',
settingsShellArgsDesc: 'Açık kabuk bağımsız değişkenleri, boşlukla ayrılmış; boş olmadıklarında varsayılanları tamamen değiştirir (yaml shellArgs ile aynı sözleşme)',
settingsShellArgsPlaceholder: 'ör. -l (boş = varsayılanlar)',
settingsTabsTitle: 'Kenar çubuğu içeriği',
settingsViewersTitle: 'Dosya önizleyicileri',
settingsMobileTitle: "Mobil",
settingsMobileNoAutoOpenTitle: "Dar ekranlarda otomatik açma",
settingsMobileNoAutoOpenDesc: "Telefonda / dar görünümde yeni bir alt ajan veya arka plan görevi artık kendiliğinden Görevler sayfasına geçmez (elle açılabilir)",
settingsMobileTreeTitle: "Görevler sayfası varsayılan olarak ağaç",
settingsMobileTreeDesc: "Telefonda / dar görünümde Görevler sayfası iş akışı grafiği yerine klasik ağaç olarak açılır; sayfadaki düğme çalışmaya devam eder",
settingsGeneralTitle: 'Genel',
settingsPopup: 'Özellik ayarları',
settingsViewerCatchAll: 'Hepsi yakala: herhangi bir dosya',
viewerMarkdown: 'Markdown',
viewerCode: 'Kod',
viewerHtml: 'HTML',
browser: 'Tarayıcı',
browserPlaceholder: 'Bir URL girin, örn. example.com',
browserGo: 'Git',
browserBack: 'Geri',
browserForward: 'İleri',
browserStart: 'Gezinmeye başlamak için bir URL girin (kum modu)',
browserBlockedScheme: 'Engellendi: yalnızca http/https URL’lerine izin verilir',
browserBlockedLoopback: 'Engellendi: yerel ve iç adresler burada gezilemez',
browserInvalid: 'Geçersiz URL',
htmlNoSandboxWarning: 'Kum kapalı: bu HTML tam arayüz ayrıcalıklarıyla çalışır (ayarlardan yeniden etkinleştirin)',
sandboxStatusOn: 'Kum modu: açık · sayfalar arayüzün verilerine veya yerel dosyalara erişemez; oturum açmalar ve üçüncü taraf çerezler çalışmayabilir',
sandboxUnlock: 'Geçici olarak devre dışı bırak (güvenli değil)',
sandboxRestore: 'Kumu geri yükle',
settingsHtmlDefaultUnsafeTitle: 'HTML önizlemelerini varsayılan olarak kumsuz aç (güvenli değil)',
settingsHtmlDefaultUnsafeDesc: 'Açıkken, yeni açılan her HTML önizlemesi kumsuz durumda başlar (arayüzle aynı kaynak — oturum dosyalarını ve iç API’leri okuyabilir); durum satırı yine tek dokunuşla geri yükleme sunar',
settingsHtmlSandboxTitle: 'HTML önizleme kumunu devre dışı bırak (güvenli değil)',
settingsHtmlSandboxDesc: 'Kum kapalıyken önizlenen HTML arayüzle aynı kaynakta çalışır: oturum dosyalarını, yerel depoyu okuyabilir ve iç API’leri çağırabilir. Yalnızca tamamen güvenilen dosyalar için etkinleştirin',
settingsBrowserSandboxTitle: 'Tarayıcı kumunu devre dışı bırak (güvenli değil)',
settingsBrowserSandboxDesc: 'Kum kapalıyken ziyaret edilen her site arayüzle aynı kaynakta çalışır: oturum verilerini okuyabilir ve oturum açmış halinize bürünebilir. Yalnızca tamamen güvenilen siteler için etkinleştirin',
settingsBrowserLoopbackTitle: 'İzin verilen yerel adresler',
settingsBrowserLoopbackDesc: 'Kenar çubuğu tarayıcısının ziyaret edebileceği geri döngü adreslerinin virgülle ayrılmış izin listesi (ör. localhost:5174 veya 127.0.0.1:8080); boş, varsayılan olarak tüm yerel adresleri engeller. Kum havuzu hala geçerlidir — sayfalar GUI verilerini okuyamaz',
settingsBrowserLoopbackPlaceholder: 'ör. localhost:5174, 127.0.0.1:8080',
browserOpenExternal: 'Tarayıcıda aç',
browserEmbedBlocked: '{host} gömülmeyi reddetti',
browserEmbedBlockedDesc: 'Site başka sayfalar içinde gösterilmeyi yasaklıyor (X-Frame-Options / frame-ancestors), bu yüzden kenar çubuğunda yüklenemiyor. Bunun yerine doğrudan tarayıcınızda açın.',
browserEmbedAnyway: 'Yine de yükle',
subagent: 'Görevler',
subagentMainAgent: 'Ana aracı',
subagentEmpty: 'Alt aracı yok',
subagentEmptyDesc: 'Ana aracının altında doğan alt aracılar burada görünür',
subagentInactive: 'Etkin değil',
subagentModeOneShot: 'Tek seferlik',
subagentModeContinuable: 'Sürdürülebilir',
subagentCount: '{count} alt aracı',
subagentCountRunning: '{count} alt aracı · {running} çalışıyor',
subagentThinking: 'Düşünüyor…',
sideChat: 'Yan sohbet (beta)',
sideChatNew: 'Yeni iş parçacığı',
sideChatUntitled: 'Yeni iş parçacığı',
sideChatEmpty: 'Yan sohbet yok',
sideChatEmptyDesc: 'Her yan sohbet sekme şeridindeki kendi sekmesidir — geçerli oturumun bağlamını miras alır ve asla ana sohbete girmez',
sideChatCreating: 'Yan sohbet oluşturuluyor…',
sideChatRetry: 'Yeniden dene',
sideChatThreads: 'İş parçacığını değiştir / yeni',
sideChatSave: 'Yeni oturum olarak kaydet',
sideChatSaveTitle: 'Bu iş parçacığını ana oturum listesinde üst düzey oturuma yükselt',
sideChatSaved: 'Yeni oturum olarak kaydedildi',
sideChatNoTurn: 'Kaydetme ilk tamamlanan turdan sonra kullanılabilir',
sideChatPendingDrop: 'Son yanıtlanmamış devam sorusu kaydedilen oturuma dahil edilmez',
sideChatFirstPlaceholder: 'İlk soruyu sorun — bağlam miras alındı…',
sideChatComposerPlaceholder: 'Devam sorusu sor…',
sideChatThinking: 'Derin dalıyor…',
sideChatThink: 'Düşünme',
sideChatInjection: 'Bağlam enjekte edildi',
sideChatSend: 'Gönder',
sideChatCancelTitle: 'Geçerli turu durdur (sıradaki iş korunur)',
sideChatError: 'Yan sohbet hatası: {message}',
sideChatTurnUsage: 'Giriş {input} tok · Çıkış {output} tok',
sideChatBlockCollapse: 'Daralt',
sideChatBlockCollapseAria: 'Daralt',
sideChatBlockExpand: '{hidden} satırı genişlet',
sideChatBlockExpandAria: '{hidden} satır daha genişlet',
sideChatBlockSignal: 'Sinyalle sonlandırıldı: {signal}',
sideChatBlockExitCode: 'Çıkış kodu {code}',
sideChatBlockNoExitCode: "Çıkış kodu olmadan bitti",
sideChatBlockRunning: 'Çalışıyor',
sideChatBlockFailed: 'Başarısız',
sideChatBlockDone: 'Tamamlandı',
sideChatBlockNoOutput: '(çıktı yok)',
codeBlockTitle: 'Kod bloğu',
codeBlockWrap: 'Satırları kaydır',
codeBlockUnwrap: 'Satırları kaydırma',
sideChatBlockWindow: '{total} satırdan {shown} satır',
sideChatConnDisconnected: 'Bağlantı koptu',
sideChatConnConnecting: 'Yeniden bağlanıyor…',
sideChatConnRecovered: 'Bağlantı geri yüklendi',
sideChatConnReconnectAction: 'Şimdi yeniden bağlan',
sideChatConnRestartAction: 'Bağlantıyı yeniden başlat',
jobs: 'Arka plan işleri',
jobsCount: '{count} arka plan işi',
jobsCountRunning: '{count} arka plan işi · {running} çalışıyor',
jobStatusRunning: 'Çalışıyor',
jobStatusStopping: 'Durduruluyor',
jobStatusCompleted: 'Tamamlandı',
jobStatusKilled: 'Sonlandırıldı',
jobStatusFailed: 'Başarısız',
jobDurationSeconds: '{seconds} sn',
jobDurationMinutes: '{minutes} dk {seconds} sn',
jobDurationHours: '{hours} sa {minutes} dk',
jobViewOutput: 'Çıkışı görüntüle',
jobNoOutput: 'Henüz çıkış yok',
jobNotReadYet: 'Modelin bu işin çıkışını okuması bekleniyor; model job_output çalıştırdıktan sonra çıkış burada görünür',
jobOutputTruncated: 'Çıkış kırpıldı',
jobOutputError: 'Çıkış okunamadı',
jobKill: 'Sonlandır',
jobKillConfirm: 'Sonlandırmayı onaylamak için tekrar tıklayın',
jobKillError: 'Sonlandırma başarısız',
tasksViewGraph: 'İş akışı grafiği',
tasksViewTree: 'Ağaç',
tasksViewSwitchToGraph: 'İş akışı grafiğine geç',
tasksViewSwitchToTree: 'Ağaç görünümüne geç',
settingsViewModeTitle: 'Görevler sayfası varsayılan görünümü',
settingsViewModeDesc: 'Görevler sayfasının açılıştaki görünümü (sayfa içi düğme yine anlık değiştirebilir)',
settingsViewModeGraph: 'İş akışı grafiği',
settingsViewModeGraphDesc: 'Yakınlaştırma ve kaydırma ile katmanlı düğüm grafiği',
settingsViewModeTree: 'Ağaç',
settingsViewModeTreeDesc: 'Klasik girintili ağaç, klavye ile gezilebilir',
tasksFoldIdleGroup: 'N waiting',
tasksFoldIdle: 'Idle {count}',
tasksFoldCompleted: '✓ {count} tamamlandı',
tasksFoldOne: 'Tamamlananlara katla',
tasksFoldExpand: 'Tamamlanan düğümleri genişlet',
tasksFoldCollapse: 'Tamamlanan düğümleri daralt',
tasksZoomIn: 'Yakınlaştır',
tasksZoomOut: 'Uzaklaştır',
tasksZoomFit: 'Tuvale sığdır',
tasksNodeJump: 'Transkripti aç',
tasksNodeDetail: 'Düğüm ayrıntıları',
workflowRun: 'İş akışı',
tasksNodeState: 'Durum',
tasksNodeMode: 'Mod',
tasksNodeModel: 'Model',
tasksNodeTeamRole: 'Takım rolü',
tasksNodeActivity: 'Son etkinlik',
tasksStateRunning: 'Çalışıyor',
tasksStateIdle: 'Beklemede',
tasksStateProvisioning: 'Provisioning',
tasksStateDone: 'Tamamlandı',
tasksStateError: 'Hata',
tasksKindSubagent: 'Alt ajan',
tasksKindTeammate: 'Ekip üyesi',
tasksKindWorkflow: 'İş akışı',
taskWindowCreate: 'New task',
taskWindowDetail: 'Task detail',
teamBoard: 'Takım görev panosu',
teamChip: 'Takım {members} üye · {tasks} görev',
teamTasksEmpty: 'Henüz paylaşılan görev yok',
teamTaskCreate: 'Yeni görev',
teamTaskSubject: 'Konu',
teamTaskDescription: 'Açıklama',
teamTaskOwner: 'Sahip',
teamTaskUnowned: 'Sahipsiz',
teamTaskPending: 'Bekliyor',
teamTaskInProgress: 'Devam ediyor',
teamTaskCompleted: 'Tamamlandı',
teamTaskBlocked: 'Engelli',
teamTaskClaim: 'Claim',
teamTaskComplete: 'Tamamla',
teamTaskReopen: 'Yeniden aç',
teamTaskDelete: 'Sil',
teamTaskDeleteConfirm: 'Silmeyi onayla',
teamTaskEdit: 'Düzenle',
teamTaskSave: 'Kaydet',
teamTaskCancel: 'İptal',
teamTaskConflict: 'Görev başkası tarafından değiştirildi, güncellendi',
teamTaskError: 'İşlem başarısız: {message}',
teamTaskDeleted: 'Silindi',
teamTaskActions: 'Görev eylemleri',
teamTaskDetail: 'Görev ayrıntısı',
teamTaskNoDescription: 'Henüz açıklama yok — eklemek için Düzenle adımına tıklayın',
teamTaskBlockedBy: 'Engellendiği görevler',
teamTaskSubjectPlaceholder: 'İşi tek satırda açıkla',
teamTaskDescriptionPlaceholder: 'Ek ayrıntılar (isteğe bağlı)',
teamFilterAll: 'Tümü',
tasksNodeTasks: 'Paylaşılan görevler',
jobCopyOutput: 'Çıkışı kopyala',
jobCopied: 'Kopyalandı',
jobFollowTail: 'En sona kaydır',
jobDragHint: 'Taşımak için sürükle',
workflowRunning: 'Çalışıyor',
workflowCompleted: 'Tamamlandı',
workflowCancelled: 'İptal edildi',
workflowFailed: 'Başarısız',
workflowPhaseUnnamed: 'Adsız aşama',
workflowMembers: '{done}/{total} üye',
jobsAutoCollapsed: 'Otomatik daraltıldı (çok sayıda ajan)',
catalogLoadFailed: '{count} dal yüklenemedi',
addPluginsTabCard: 'Sekme eklentileri ekle',
addPluginsTabCardDesc: 'Yeni bir kenar çubuğu sayfası kaydet',
addPluginsViewerCard: 'Önizleme eklentileri ekle',
addPluginsViewerCardDesc: 'Yeni bir dosya türü önizlemesi kaydet',
addPluginsTabDesc: 'Kenar çubuğu sayfaları (sekmeler) eklentilerce genişletilebilir. Eklentiler ctx.betterSidebar hizmeti aracılığıyla kaydolur; Yükle’ye tıklamak kurulum komutunu kopyalar — DSH profilinizin yaşadığı bir terminale yapıştırın ve çalıştırın.',
addPluginsViewerDesc: 'Dosya önizleyicileri eklentilerce genişletilebilir. Eklentiler ctx.betterSidebar hizmeti aracılığıyla kaydolur; Yükle’ye tıklamak kurulum komutunu kopyalar — DSH profilinizin yaşadığı bir terminale yapıştırın ve çalıştırın.',
addPluginsBrowseMore: 'GitHub’da daha fazla eklentiye göz atın (topic: dsh-better-sidebar)',
addPluginsSearch: 'Eklenti adı / açıklamasına göre ara…',
addPluginsNoMatch: 'Eşleşen eklenti yok',
addPluginsRecommended: 'Önerilen eklentiler',
addPluginsEmpty: 'Henüz derlenen eklenti yok — eklentinizi GitHub topic’i altında yayınlayın',
openPlugin: 'Aç',
copyInstall: 'Kurulum komutunu kopyala',
pluginOfficeDesc: 'better-sidebar düzenleyicisi için Office üçlüsü önizlemesi (.docx / .xlsx / .pptx); ağır Office oluşturma kitaplıklarını çekirdek paketin dışında tutar, isteğe bağlı kurulur',
pluginFlowglassDesc: 'Canlı oturum akış grafiği: kullanıcı, asistan ve araç çağrıları için üç şeritli kulvar; paralel gruplar, alt aracı dalları, derinlemesine inme ve canlı durum; better-sidebar kuruluyken yerli «Flowglass» sekmesi kaydeder, kurulmadığında bağımsız çekmecesi korunur',
pluginGitForgeDesc: 'Git Forge sekmesi: GitHub/Gitea (ve diğer formlar) hesap kitaplığı + proje başına yetkiler + sıkı itme ilkesi; token’lar yalnızca yerel sırlardadır (asla model bağlamında değil); salt okunur GitForge aracı ve aracı HTTPS kimlik bilgisi yardımcısı',
pluginGithubWorkbenchDesc: 'GitHub Workbench sekmesi: uzak depo ağacı + Issues / Pull requests / Actions tam yazma desteğiyle — Issue/PR oluşturma, yorum yapma, düzenleme, kapatma/yeniden açma, squash·merge·rebase birleştirme (güçlü onay), CI’yi yeniden çalıştırma/iptal etme; repo değiştirici erişilebilir depoları otomatik listeler ve genel depolarda arama yapar; better-sidebar yoksa bağımsız sağ panele geri düşer',
pluginMdExportDesc: 'better-sidebar Markdown araç çubuğuna «Dışa aktar» düğmesi ekler: geçerli .md dosyasını tek tıkla bağımsız HTML biçimine dönüştürür (tablolar/kod blokları/Mermaid diyagramları gömülü, düzen önizleme temasını izler) ve .md dosyasının yanına kaydeder ya da yazdırma penceresinden PDF dışa aktarır',
pluginCodeNavDesc: 'Kod önizleme gezinmesi: dosya türünden dili otomatik algılayıp söz dizimini vurgular, simge şeması (sınıf/yöntem/değişken filtreleri + tek tıkla atlama) ve dosya içi arama (tüm eşleşmeleri vurgula, önceki/sonraki, büyük/küçük harf duyarlı) — better-sidebar düzenleyicisinde kod dosyası önizlemesini devralır',
pluginSuhuangScrollDesc: 'Yerel Suhuang Scroll Runtime ortamını model yapılandırması, bağlantı testi ve kesintisiz değerlendirme denetimi için DSH ayarlarına ve better-sidebar öğesine bağlar; Suhuang Scroll Runtime ve dsh-better-sidebar gerektirir',
pluginBetterOverleafDesc: 'better-sidebar için Overleaf sekmesi: doğrudan CDP tarayıcı girişi (üçüncü taraf Chromium destekli), proje listesi/geçiş, <workspace>/overleaf/ altında yerel git aynaları, salt okunur API yedekli çift yönlü git senkronizasyonu ve dosya önizlemesi kenar çubuğu workbench üzerinden',
pluginGitRemotesDesc: 'Git Remotes sekmesi: dal/yukarı akış/ahead-behind, fetch (isteğe bağlı prune), ff-only pull ve yalnızca sekme içi onaydan sonra push. Yerleşik Git sahnele/işle sekmesini değiştirmez; force-push veya model otomatik push aracı sunmaz',
pluginSentinelDesc: 'Koşul odaklı aracı uyandırma: dosya/süreç/port/HTTP/komut/web algılayıcılar koşullar tetiklendiğinde uyuyan oturumları uyandırır; sunucu geneli izleme tablosuyla «Sentinel» sekmesi kaydeder',
pluginServerDeckDesc: 'Sunucu kart panosu: her ana makine için çevrimiçi durum, işletim sistemi, çalışma süresi, CPU/bellek/disk kullanımı ve gecikme gösteren bir kart; karta tıklayarak etkileşimli xterm.js terminalini açın; tek tıkla ~/.ssh/config içe aktarma (git barındırma takma adları otomatik atlanır). better-sidebar kuruluysa yerel 「Sunucular」 sekmesini kaydeder, değilse bağımsız çekmece paneli korunur',
pluginSidebarQaDesc: 'Seç ve sor: Sohbet metnini seç → sağ panelde sor → aynı çalışma alanında özel devam oturumu (❓devam·konu): hızlı bir düşünmesiz model ana bağlamı sıkıştırıp alıntıyla birlikte enjekte eder, ana sohbeti bölmez. Devam soruları iç içe geçer, sürdürülebilir ve arşivlenebilir',
pluginSidenoteDesc: 'Codex tarzı side chat + seçim notları: mevcut oturumu kalıcı bir yan panele fork edin (oturum listesinden arşive kaldırılır, aynı anda birden çok örnek, /side komutu, yeniden yüklemeye dayanır, model ana oturumu izler); assistant metnini seçin → numaralı rozet + not düzenleyici → bir sonraki iletinizle birlikte giden "N not" çipi, ya da doğrudan bir side chat içinde sorun',
pluginSshTunnelDesc: 'SSH Tunnel sekmesi: çok ana makinelik envanter + proje başına yetkiler + yerel sır saklama; SSHManager aracı (exec/SFTP/oturum stratejileri); merkez etkileşimli terminal ve çift panelli SFTP',
pluginTurnReviewDesc: 'Az önce biten turun diff’i için Approve / Request changes insan kapısı: yalnızca son turu inceler, oturumu çatallamaz; dosyalar ana oturum / alt aracı / atfedilmemiş olarak gruplanır, dosya başına işaretle geri çevir + isteğe bağlı yorum, dosyaya tıklayınca tur başlangıcı anlık görüntüsü ile şimdiki diff gösterilir. /rewind değil',
pluginVideoPreviewDesc: 'better-sidebar düzenleyicisinde satır içi video önizlemesi (.mp4/.webm/.mov/.mkv/.avi vb.); HTTP Range (206) destekli özel /video sunucu rotasıyla — ilerleme çubuğu sürükleme çalışır ve 20MB mediaLimit ile sınırlanmaz',
pluginDocsPanelDesc: 'DSH kenar çubuğunda «Genel belgeler»: herhangi bir çalışma alanından kendi Markdown notlarınızı okuyun — dosya listesi, ana hat, Chrome / VS Code’da açma ve kopyalama düğmeleri; belgeler dizini yapılandırılabilir (varsayılan ~/.dsh/docs)',
pluginEgoBrowserDesc: 'DeepSeek Harness için aracı tarayıcı: 32 ego_* aracı gerçek bir Chromium’u yönetir; kenar çubuğundaki yerel «ego tarayıcı» sekmesi aracının ziyaret ettiği her sayfayı canlı gösterir — tıklayarak, sürükleyerek ve yazarak kontrolü devralabilirsiniz. better-sidebar varsa sekme otomatik kaydedilir, yoksa yüzen baloncuğa düşer',
pluginBilingualReaderDesc: 'DSH kenar çubuğunda PDF okuyun: yerel PDF görüntüleme, LLM ile çevirmek için metin seçin, bağlamı kullanarak ve ana sohbetten tamamen izole',
changesRedactOn: "Maskeleme açık: gizli değerler [REDACTED] olarak görünür; kapatmak için tıklayın (kendiniz sorumlusunuz)",
changesRedactOff: "Maskeleme kapalı: içerik olduğu gibi görünür; açmak için tıklayın",
changesRedactOnLabel: "Maskeleme",
changesRedactOffLabel: "Maskeleme yok",
changesRedactBanner: "Maskelendi",
pluginSentinelName: 'dsh-sentinel Uyandırma sistemi',
pluginEgoBrowserName: 'ego-browser Ajan tarayıcısı',
pluginBetterOverleafName: 'dsh-better-overleaf Overleaf sekmesi',
pluginDocsPanelName: 'dsh-docs-panel Genel belgeler',
pluginFlowglassName: 'dsh-flowglass Flowglass',
pluginGitForgeName: 'dsh-git-forge Git kimlik bilgileri',
pluginGitRemotesName: 'dsh-git-remotes Git uzak depoları',
pluginGithubWorkbenchName: 'dsh-github-workbench GitHub çalışma tezgâhı',
pluginSidebarQaName: 'dsh-sidebar-qa Seç ve sor',
pluginSidenoteName: 'dsh-sidenote Yan sohbet',
pluginServerDeckName: 'dsh-server-deck Sunucu paneli',
pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll',
pluginSshTunnelName: 'dsh-ssh-tunnel SSH tüneli',
pluginTurnReviewName: 'dsh-turn-review Tur incelemesi',
pluginBilingualReaderName: 'dsh-bilingual-reader İki dilli okuyucu',
pluginOfficeName: 'Office önizlemesi',
pluginMdExportName: 'Markdown dışa aktarma',
pluginCodeNavName: 'Kod önizleme gezgini',
pluginVideoPreviewName: 'Video önizlemesi',
presetDshDesktopDesc: 'Electron gelişmiş (çerçevesiz) mod: macOS üstte 20px ayırır; Windows, WCO yokken başlık çubuğu için 32px ayırır',
}