diff --git a/src/client/SideCardSection.tsx b/src/client/SideCardSection.tsx index 5a6e0a26..50d63ec9 100644 --- a/src/client/SideCardSection.tsx +++ b/src/client/SideCardSection.tsx @@ -947,9 +947,11 @@ export function SideCardSection({ store, service }: SideCardSectionProps) { ...getShellPresets().map(preset => ({ value: `preset:${preset.id}`, title: preset.title, + // The preset desc is i18n-friendly (string or () => string) + // — resolve it like every other settings text here. desc: preset.detect?.(detectedEnv) === true - ? `${preset.desc}(${t('settingsSchemeDetectedSuffix')})` - : preset.desc, + ? `${textOf(preset.desc)}(${t('settingsSchemeDetectedSuffix')})` + : textOf(preset.desc), })), { value: 'custom', title: t('settingsSchemeCustomTitle'), desc: t('settingsSchemeCustomDesc') }, ]} diff --git a/src/client/add-plugin-modal.tsx b/src/client/add-plugin-modal.tsx index fa6351a7..ae7cb7fc 100644 --- a/src/client/add-plugin-modal.tsx +++ b/src/client/add-plugin-modal.tsx @@ -56,8 +56,9 @@ export function PluginListBody(props: { service: BetterSidebarService; kind: Plu const needle = query.trim().toLowerCase() const matches = (entry: PluginEntry): boolean => { if (needle === '') return true + const name = typeof entry.name === 'function' ? entry.name() : entry.name const description = typeof entry.description === 'function' ? entry.description() : entry.description - return entry.name.toLowerCase().includes(needle) + return name.toLowerCase().includes(needle) || entry.id.toLowerCase().includes(needle) || description.toLowerCase().includes(needle) } @@ -93,8 +94,12 @@ export function PluginListBody(props: { service: BetterSidebarService; kind: Plu window.open(entry.url, '_blank', 'noopener') } - /** One catalog row (extracted so the group render stays flat). */ - const renderEntry = (entry: PluginEntry): ReactNode => ( + /** One catalog row (extracted so the group render stays flat). The name + * resolves like the description (string or () => string) so it follows + * the active locale; a plain-string entry keeps its raw name. */ + const renderEntry = (entry: PluginEntry): ReactNode => { + const name = typeof entry.name === 'function' ? entry.name() : entry.name + return (
{/* The name is a BUTTON on the same window.open path as the @@ -104,16 +109,16 @@ export function PluginListBody(props: { service: BetterSidebarService; kind: Plu
{entry.install}
- ) + ) + } return (
diff --git a/src/client/index.tsx b/src/client/index.tsx index 2915d427..bf7cc097 100644 --- a/src/client/index.tsx +++ b/src/client/index.tsx @@ -166,14 +166,21 @@ export function apply(ctx: Context): void { ) // A failure anywhere in the client lifecycle must never take the app down // silently: log with the plugin prefix and pin a visible diagnostic strip - // to the page so a blank panel is never the only symptom. + // to the page so a blank panel is never the only symptom. This strip is + // the last-resort reporter (no CSS module is reachable from here), so its + // colors go through skin token chains with the previous hexes as the + // chain tails — worst case (no skin tokens on the page) it renders + // byte-identical to the old hardcoded bar, and any `--dsw-alias-*` skin + // re-themes it (guide §12: no hardcoded colors). const fail = (phase: string, error: unknown): void => { console.error(`[dsh-better-sidebar] ${phase} error:`, error) try { const bar = document.createElement('div') bar.style.cssText = 'position:fixed;left:8px;bottom:8px;z-index:2147483000;max-width:70vw;padding:8px 12px;' - + 'font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:#f2a1a1;background:#1b1b22;' - + 'border:1px solid #f2a1a1;border-radius:8px;white-space:pre-wrap' + + 'font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;' + + 'color:var(--dsw-alias-state-error-primary,#f2a1a1);' + + 'background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-base,#1b1b22));' + + 'border:1px solid var(--dsw-alias-state-error-primary,#f2a1a1);border-radius:8px;white-space:pre-wrap' bar.textContent = `[dsh-better-sidebar] ${phase} error: ${error instanceof Error ? error.message : String(error)}` document.body.appendChild(bar) } catch { diff --git a/src/client/locales-ar.ts b/src/client/locales-ar.ts index 5ab861eb..79dbd850 100644 --- a/src/client/locales-ar.ts +++ b/src/client/locales-ar.ts @@ -422,4 +422,24 @@ export const ar: Record = { pluginDocsPanelDesc: '«وثائق عامة» في شريط DSH الجانبي: ملاحظات Markdown عامة، قابلة للقراءة من أي مساحة عمل — قائمة ملفات، مخطط تفصيلي، فتح في Chrome / VS Code، وأزرار نسخ؛ دليل الوثائق قابل للتكوين (الافتراضي ~/.dsh/docs)', pluginEgoBrowserDesc: 'متصفح الوكيل لـ DeepSeek Harness: 32 أداة ego_* تقود متصفح Chromium حقيقي، مع تبويب «متصفح ego» أصلي في الشريط الجانبي يعرض مباشرة كل صفحة يزورها الوكيل — يمكنك النقر والسحب والكتابة لتولي التحكم. يسجّل التبويب تلقائيًا عند وجود better-sidebar، وإلا يظهر كفقاعة عائمة', pluginBilingualReaderDesc: 'اقرأ ملفات PDF في الشريط الجانبي لـ DSH: عرض PDF أصلي، حدد نصًا لترجمته بواسطة النموذج اللغوي مع السياق، معزولًا تمامًا عن المحادثة الرئيسية', + pluginSentinelName: 'dsh-sentinel نظام الاستيقاظ', + pluginEgoBrowserName: 'ego-browser متصفح الوكيل', + pluginBetterOverleafName: 'dsh-better-overleaf تبويب Overleaf', + pluginDocsPanelName: 'dsh-docs-panel مستندات عامة', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge بيانات اعتماد Git', + pluginGitRemotesName: 'dsh-git-remotes أجهزة Git البعيدة', + pluginGithubWorkbenchName: 'dsh-github-workbench منصة GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa تحديد وسؤال', + pluginSidenoteName: 'dsh-sidenote محادثة جانبية', + pluginServerDeckName: 'dsh-server-deck لوحة الخوادم', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel نفق SSH', + pluginTurnReviewName: 'dsh-turn-review مراجعة الجولة', + pluginBilingualReaderName: 'dsh-bilingual-reader قارئ ثنائي اللغة', + pluginOfficeName: 'معاينة Office', + pluginMdExportName: 'تصدير Markdown', + pluginCodeNavName: 'مستكشف معاينة الكود', + pluginVideoPreviewName: 'معاينة الفيديو', + presetDshDesktopDesc: 'وضع Electron المتقدم (بلا إطار): يحجز macOS شريطًا علويًا بمقدار 20px، ويحجز Windows بمقدار 32px لشريط العنوان عند غياب WCO', } diff --git a/src/client/locales-de.ts b/src/client/locales-de.ts index b48c3962..a3c022c8 100644 --- a/src/client/locales-de.ts +++ b/src/client/locales-de.ts @@ -407,4 +407,24 @@ export const de: Record = { pluginDocsPanelDesc: '„Globale Dokumente“ in der DSH-Seitenleiste: eigene Markdown-Notizen aus jedem Arbeitsbereich lesen – Dateiliste, Gliederung, Öffnen in Chrome / VS Code und Kopieren-Buttons; das Dokumentenverzeichnis ist konfigurierbar (Standard ~/.dsh/docs)', pluginEgoBrowserDesc: 'Der Agent-Browser für DeepSeek Harness: 32 ego_*-Tools steuern ein echtes Chromium; ein nativer „ego-Browser“-Tab in der Seitenleiste zeigt live jede Seite, die der Agent besucht – Klicken, Ziehen und Tippen zum Übernehmen. Registriert den Tab automatisch, wenn better-sidebar vorhanden ist, sonst eine schwebende Blase', pluginBilingualReaderDesc: 'PDFs im DSH-Seitenbereich lesen: native PDF-Anzeige, Text auswählen und mit dem LLM übersetzen — mit Kontext, vollständig vom Hauptgespräch isoliert', + pluginSentinelName: 'dsh-sentinel Wecksystem', + pluginEgoBrowserName: 'ego-browser Agent-Browser', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf-Tab', + pluginDocsPanelName: 'dsh-docs-panel Globale Dokumente', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git-Zugangsdaten', + pluginGitRemotesName: 'dsh-git-remotes Git-Remotes', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub-Workbench', + pluginSidebarQaName: 'dsh-sidebar-qa Auswählen & Fragen', + pluginSidenoteName: 'dsh-sidenote Seiten-Chat', + pluginServerDeckName: 'dsh-server-deck Server-Deck', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH-Tunnel', + pluginTurnReviewName: 'dsh-turn-review Runden-Review', + pluginBilingualReaderName: 'dsh-bilingual-reader Zweisprachiger Reader', + pluginOfficeName: 'Office-Vorschau', + pluginMdExportName: 'Markdown-Export', + pluginCodeNavName: 'Code-Vorschau-Navigation', + pluginVideoPreviewName: 'Video-Vorschau', + presetDshDesktopDesc: 'Elektronischer Erweiterte-Modus (rahmenlos): macOS reserviert oben 20px; Windows reserviert ohne WCO 32px für die Titelleiste', } diff --git a/src/client/locales-fr.ts b/src/client/locales-fr.ts index 5df03a20..ffc56bc5 100644 --- a/src/client/locales-fr.ts +++ b/src/client/locales-fr.ts @@ -414,4 +414,24 @@ export const fr: Record = { pluginDocsPanelDesc: '« Documentation globale » dans la barre latérale DSH : notes Markdown globales, lisibles depuis n’importe quel espace de travail — sélection dans la liste, saut via le plan flottant, ouverture externe Chrome / VS Code, copie de code, répertoire configurable (défaut ~/.dsh/docs)', pluginEgoBrowserDesc: 'Le navigateur d’agent pour DeepSeek Harness : 32 outils ego_* pilotent un vrai Chromium ; un onglet natif « ego browser » dans la barre latérale montre en direct chaque page visitée par l’agent — cliquez, glissez et tapez pour reprendre la main. Enregistre l’onglet automatiquement si better-sidebar est présent, sinon une bulle flottante', pluginBilingualReaderDesc: 'Lire des PDF dans la barre latérale DSH : affichage PDF natif, sélectionnez du texte pour le traduire avec le LLM, avec contexte et totalement isolé de la conversation principale', + pluginSentinelName: 'dsh-sentinel Système de réveil', + pluginEgoBrowserName: 'ego-browser Navigateur d’agents', + pluginBetterOverleafName: 'dsh-better-overleaf Onglet Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Docs globales', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Identifiants Git', + pluginGitRemotesName: 'dsh-git-remotes Dépôts distants Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Atelier GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Sélectionner & demander', + pluginSidenoteName: 'dsh-sidenote Chat latéral', + pluginServerDeckName: 'dsh-server-deck Tableau de bord serveurs', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Tunnel SSH', + pluginTurnReviewName: 'dsh-turn-review Revue du tour', + pluginBilingualReaderName: 'dsh-bilingual-reader Lecteur bilingue', + pluginOfficeName: 'Aperçu Office', + pluginMdExportName: 'Exportation Markdown', + pluginCodeNavName: 'Navigateur d’aperçu de code', + pluginVideoPreviewName: 'Aperçu vidéo', + presetDshDesktopDesc: 'Mode avancé Electron (sans bordure) : macOS réserve 20px en haut ; Windows réserve 32px pour la barre de titre sans WCO', } diff --git a/src/client/locales-hi.ts b/src/client/locales-hi.ts index 54f85637..940aad06 100644 --- a/src/client/locales-hi.ts +++ b/src/client/locales-hi.ts @@ -421,4 +421,24 @@ export const hi: Record = { pluginDocsPanelDesc: 'DSH साइडबार में ग्लोबल डॉक्स: किसी भी वर्कस्पेस से अपने Markdown नोट्स पढ़ें — फ़ाइल सूची, रूपरेखा, Chrome / VS Code में खोलें, और कॉपी बटन; docs डायरेक्टरी कॉन्फ़िगर करने योग्य (डिफ़ॉल्ट ~/.dsh/docs)', pluginEgoBrowserDesc: 'DeepSeek Harness के लिए एजेंट ब्राउज़र: 32 ego_* टूल असली Chromium चलाते हैं; साइडबार में नेटिव «ego browser» टैब एजेंट के हर विज़िट किए गए पेज को लाइव दिखाता है — आप क्लिक, ड्रैग और टाइप करके नियंत्रण ले सकते हैं। better-sidebar मौजूद होने पर टैब स्वतः रजिस्टर होता है, अन्यथा फ्लोटिंग बबल के रूप में दिखता है', pluginBilingualReaderDesc: 'DSH साइडबार में PDF पढ़ें: मूल PDF प्रदर्शन, टेक्स्ट चुनकर LLM से अनुवाद करें, संदर्भ के साथ और मुख्य संवाद से पूरी तरह अलग', + pluginSentinelName: 'dsh-sentinel वेक-अप सिस्टम', + pluginEgoBrowserName: 'ego-browser एजेंट ब्राउज़र', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf टैब', + pluginDocsPanelName: 'dsh-docs-panel ग्लोबल डॉक्स', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git क्रेडेंशियल', + pluginGitRemotesName: 'dsh-git-remotes Git रिमोट', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub वर्कबेंच', + pluginSidebarQaName: 'dsh-sidebar-qa चुनें और पूछें', + pluginSidenoteName: 'dsh-sidenote साइड चैट', + pluginServerDeckName: 'dsh-server-deck सर्वर डेक', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH टनल', + pluginTurnReviewName: 'dsh-turn-review टर्न समीक्षा', + pluginBilingualReaderName: 'dsh-bilingual-reader द्विभाषी रीडर', + pluginOfficeName: 'Office प्रीव्यू', + pluginMdExportName: 'Markdown एक्सपोर्ट', + pluginCodeNavName: 'कोड प्रीव्यू नेविगेटर', + pluginVideoPreviewName: 'वीडियो प्रीव्यू', + presetDshDesktopDesc: 'Electron एडवांस्ड (फ्रेमलेस) मोड: macOS ऊपर 20px सुरक्षित रखता है; Windows WCO अनुपलब्ध होने पर टाइटल बार के लिए 32px रखता है', } diff --git a/src/client/locales-id.ts b/src/client/locales-id.ts index d8fcf19b..0f307607 100644 --- a/src/client/locales-id.ts +++ b/src/client/locales-id.ts @@ -419,4 +419,24 @@ export const id: Record = { pluginDocsPanelDesc: 'Dokumen global di sidebar DSH: baca catatan Markdown Anda sendiri dari ruang kerja apa pun — daftar berkas, kerangka, buka di Chrome / VS Code, dan tombol salin; direktori docs dapat dikonfigurasi (default ~/.dsh/docs)', pluginEgoBrowserDesc: 'Browser agen untuk DeepSeek Harness: 32 alat ego_* menggerakkan Chromium sungguhan; tab «ego browser» native di bilah samping menampilkan langsung setiap halaman yang dikunjungi agen — Anda bisa mengklik, menyeret, dan mengetik untuk mengambil alih. Tab terdaftar otomatis jika better-sidebar terpasang; jika tidak, jatuh ke gelembung mengambang', pluginBilingualReaderDesc: 'Baca PDF di sidebar DSH: tampilan PDF asli, pilih teks untuk diterjemahkan dengan LLM, dengan konteks dan sepenuhnya terisolasi dari percakapan utama', + pluginSentinelName: 'dsh-sentinel Sistem bangun', + pluginEgoBrowserName: 'ego-browser Peramban agen', + pluginBetterOverleafName: 'dsh-better-overleaf Tab Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Dokumen global', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Kredensial Git', + pluginGitRemotesName: 'dsh-git-remotes Remote Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Meja kerja GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Pilih & tanya', + pluginSidenoteName: 'dsh-sidenote Obrolan samping', + pluginServerDeckName: 'dsh-server-deck Dek server', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Terowongan SSH', + pluginTurnReviewName: 'dsh-turn-review Tinjauan giliran', + pluginBilingualReaderName: 'dsh-bilingual-reader Pembaca dwibahasa', + pluginOfficeName: 'Pratinjau Office', + pluginMdExportName: 'Ekspor Markdown', + pluginCodeNavName: 'Navigator pratinjau kode', + pluginVideoPreviewName: 'Pratinjau video', + presetDshDesktopDesc: 'Mode Electron lanjutan (tanpa bingkai): macOS mencadangkan 20px di atas; Windows mencadangkan 32px untuk bilah judul saat WCO tidak tersedia', } diff --git a/src/client/locales-it.ts b/src/client/locales-it.ts index b1477398..aa84920b 100644 --- a/src/client/locales-it.ts +++ b/src/client/locales-it.ts @@ -412,4 +412,24 @@ export const it: Record = { pluginDocsPanelDesc: 'Documenti globali nella barra laterale di DSH: legga le sue note Markdown da qualsiasi spazio di lavoro — una lista di file, una struttura, apertura in Chrome / VS Code e pulsanti di copia; la directory dei documenti è configurabile (predefinita ~/.dsh/docs)', pluginEgoBrowserDesc: 'Il browser agente per DeepSeek Harness: 32 strumenti ego_* pilotano un vero Chromium; una scheda nativa «ego browser» nella barra laterale mostra in tempo reale ogni pagina visitata dall’agente — puoi cliccare, trascinare e digitare per prendere il controllo. Registra la scheda automaticamente se better-sidebar è presente, altrimenti una bolla flottante', pluginBilingualReaderDesc: 'Leggi PDF nella barra laterale DSH: visualizzazione PDF nativa, seleziona il testo per tradurlo con l’LLM, con contesto e completamente isolato dalla conversazione principale', + pluginSentinelName: 'dsh-sentinel Sistema di riattivazione', + pluginEgoBrowserName: 'ego-browser Browser dell’agente', + pluginBetterOverleafName: 'dsh-better-overleaf Scheda Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Documenti globali', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Credenziali Git', + pluginGitRemotesName: 'dsh-git-remotes Remote Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Banco di lavoro GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Seleziona e chiedi', + pluginSidenoteName: 'dsh-sidenote Chat laterale', + pluginServerDeckName: 'dsh-server-deck Ponte server', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Tunnel SSH', + pluginTurnReviewName: 'dsh-turn-review Revisione del turno', + pluginBilingualReaderName: 'dsh-bilingual-reader Lettore bilingue', + pluginOfficeName: 'Anteprima Office', + pluginMdExportName: 'Esportazione Markdown', + pluginCodeNavName: 'Navigatore anteprima codice', + pluginVideoPreviewName: 'Anteprima video', + presetDshDesktopDesc: 'Modalità avanzata Electron (senza bordi): macOS riserva 20px in alto; Windows riserva 32px per la barra del titolo quando WCO non è disponibile', } diff --git a/src/client/locales-ja.ts b/src/client/locales-ja.ts index 79dfb0f1..7d2adef2 100644 --- a/src/client/locales-ja.ts +++ b/src/client/locales-ja.ts @@ -421,4 +421,24 @@ export const ja: Record = { pluginDocsPanelDesc: 'DSH サイドバー内の「グローバルドキュメント」:任意のワークスペースから読めるグローバル Markdown ノート。リストで選んで閲覧、ホバーでアウトラインジャンプ、Chrome / VS Code で外部オープン、コードコピー。ディレクトリは設定可(デフォルト ~/.dsh/docs)', pluginEgoBrowserDesc: 'DeepSeek Harness 用エージェントブラウザ:32 個の ego_* ツールが本物の Chromium を操作し、サイドバーのネイティブ「ego ブラウザ」Tab がエージェントの訪れる全ページをライブ表示。クリック・ドラッグ・入力で操作を引き継げます。better-sidebar があれば Tab を自動登録、なければフローティングバブルにフォールバック', pluginBilingualReaderDesc: 'DSH サイドバーで論文 PDF を読む:ネイティブ PDF 表示、テキストを選択して LLM で翻訳。コンテキストを使い、メイン会話から完全に分離', + pluginSentinelName: 'dsh-sentinel ウェイクアップシステム', + pluginEgoBrowserName: 'ego-browser エージェントブラウザー', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf タブ', + pluginDocsPanelName: 'dsh-docs-panel グローバルドキュメント', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git 認証情報', + pluginGitRemotesName: 'dsh-git-remotes Git リモート', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub ワークベンチ', + pluginSidebarQaName: 'dsh-sidebar-qa 選択して質問', + pluginSidenoteName: 'dsh-sidenote サイドチャット', + pluginServerDeckName: 'dsh-server-deck サーバーデッキ', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH トンネル', + pluginTurnReviewName: 'dsh-turn-review ターンレビュー', + pluginBilingualReaderName: 'dsh-bilingual-reader バイリンガルリーダー', + pluginOfficeName: 'Office プレビュー', + pluginMdExportName: 'Markdown エクスポート', + pluginCodeNavName: 'コードプレビューナビゲーター', + pluginVideoPreviewName: '動画プレビュー', + presetDshDesktopDesc: 'Electron 高度モード(枠なし):macOS は上部 20px、Windows は WCO 未提供時に 32px のタイトルバー分を確保', } diff --git a/src/client/locales-ko.ts b/src/client/locales-ko.ts index d4d8e5a2..3895115a 100644 --- a/src/client/locales-ko.ts +++ b/src/client/locales-ko.ts @@ -413,4 +413,24 @@ export const ko: Record = { pluginDocsPanelDesc: 'DSH 사이드바의 "전역 문서": 전역 Markdown 메모로, 어떤 작업 공간에서든 언제든 읽을 수 있습니다. 목록을 클릭해 읽기, 마우스를 올리면 개요로 이동, Chrome / VS Code에서 외부 열기, 코드 복사. 디렉터리를 설정할 수 있습니다(기본 ~/.dsh/docs)', pluginEgoBrowserDesc: 'DeepSeek Harness용 에이전트 브라우저: 32개의 ego_* 도구가 실제 Chromium을 구동하며, 사이드바의 네이티브 «ego 브라우저» 탭에서 에이전트가 방문하는 모든 페이지를 실시간으로 볼 수 있습니다 — 클릭, 드래그, 타이핑으로 직접 조작할 수 있습니다. better-sidebar가 있으면 탭을 자동 등록하고, 없으면 플로팅 버블로 대체합니다', pluginBilingualReaderDesc: 'DSH 사이드바에서 PDF 읽기: 네이티브 PDF 표시, 텍스트를 선택해 LLM으로 번역, 컨텍스트 사용 및 메인 대화와 완전 격리', + pluginSentinelName: 'dsh-sentinel 웨이크업 시스템', + pluginEgoBrowserName: 'ego-browser 에이전트 브라우저', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf 탭', + pluginDocsPanelName: 'dsh-docs-panel 전역 문서', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git 자격 증명', + pluginGitRemotesName: 'dsh-git-remotes Git 리모트', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub 워크벤치', + pluginSidebarQaName: 'dsh-sidebar-qa 선택 후 질문', + pluginSidenoteName: 'dsh-sidenote 사이드 채팅', + pluginServerDeckName: 'dsh-server-deck 서버 데크', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH 터널', + pluginTurnReviewName: 'dsh-turn-review 턴 리뷰', + pluginBilingualReaderName: 'dsh-bilingual-reader 이중언어 리더', + pluginOfficeName: 'Office 미리보기', + pluginMdExportName: 'Markdown 내보내기', + pluginCodeNavName: '코드 미리보기 내비게이터', + pluginVideoPreviewName: '동영상 미리보기', + presetDshDesktopDesc: 'Electron 고급 모드(테두리 없음): macOS는 상단에 20px, Windows는 WCO가 없을 때 타이틀 바에 32px를 확보', } diff --git a/src/client/locales-nl.ts b/src/client/locales-nl.ts index 82b463ba..5b7dd2a3 100644 --- a/src/client/locales-nl.ts +++ b/src/client/locales-nl.ts @@ -419,4 +419,24 @@ export const nl: Record = { pluginDocsPanelDesc: 'Globale docs in de DSH-zijbalk: lees uw eigen Markdown-notities vanuit elke werkruimte — een bestandslijst, een outline, openen in Chrome / VS Code, en kopieerknoppen; de docs-map is configureerbaar (standaard ~/.dsh/docs)', pluginEgoBrowserDesc: 'De agentbrowser voor DeepSeek Harness: 32 ego_*-tools besturen een echt Chromium; een native «ego-browser»-tab in de zijbalk toont live elke pagina die de agent bezoekt — u kunt klikken, slepen en typen om over te nemen. Registreert de tab automatisch als better-sidebar aanwezig is, anders een zwevende bel', pluginBilingualReaderDesc: 'Lees PDF’s in de DSH-zijbalk: native PDF-weergave, selecteer tekst om te vertalen met de LLM, met context en volledig geïsoleerd van het hoofdgesprek', + pluginSentinelName: 'dsh-sentinel Weksysteem', + pluginEgoBrowserName: 'ego-browser Agentbrowser', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf-tab', + pluginDocsPanelName: 'dsh-docs-panel Globale documenten', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git-inloggegevens', + pluginGitRemotesName: 'dsh-git-remotes Git-remotes', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub-workbench', + pluginSidebarQaName: 'dsh-sidebar-qa Selecteren & vragen', + pluginSidenoteName: 'dsh-sidenote Zijchat', + pluginServerDeckName: 'dsh-server-deck Serverdeck', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH-tunnel', + pluginTurnReviewName: 'dsh-turn-review Beurtreview', + pluginBilingualReaderName: 'dsh-bilingual-reader Tweetalige lezer', + pluginOfficeName: 'Office-voorvertoning', + pluginMdExportName: 'Markdown-export', + pluginCodeNavName: 'Codevoorvertoning-navigator', + pluginVideoPreviewName: 'Videovoorvertoning', + presetDshDesktopDesc: 'Geavanceerde Electronmodus (zonder rand): macOS reserveert 20px bovenaan; Windows reserveert 32px voor de titelbalk wanneer WCO niet beschikbaar is', } diff --git a/src/client/locales-pl.ts b/src/client/locales-pl.ts index a0a304d7..4b672bf6 100644 --- a/src/client/locales-pl.ts +++ b/src/client/locales-pl.ts @@ -423,4 +423,24 @@ export const pl: Record = { pluginDocsPanelDesc: 'Globalne dokumenty w panelu bocznym DSH: globalne notatki Markdown, czytelne z dowolnego obszaru roboczego — lista z kliknięciem, kontur z przejściami, otwieranie w Chrome / VS Code i przyciski kopiowania kodu; katalog konfigurowalny (domyślnie ~/.dsh/docs)', pluginEgoBrowserDesc: 'Przeglądarka agenta dla DeepSeek Harness: 32 narzędzia ego_* sterują prawdziwym Chromium; natywna karta «ego browser» na pasku bocznym pokazuje na żywo każdą stronę odwiedzaną przez agenta — możesz klikać, przeciągać i pisać, aby przejąć kontrolę. Karta rejestruje się automatycznie, gdy better-sidebar jest zainstalowany; w przeciwnym razie pływający dymek', pluginBilingualReaderDesc: 'Czytaj PDF-y w panelu bocznym DSH: natywny podgląd PDF, zaznacz tekst, aby przetłumaczyć go LLM-em, z kontekstem i całkowicie izolowany od głównej rozmowy', + pluginSentinelName: 'dsh-sentinel System wybudzania', + pluginEgoBrowserName: 'ego-browser Przeglądarka agenta', + pluginBetterOverleafName: 'dsh-better-overleaf Karta Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Dokumenty globalne', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Dane uwierzytelniające Git', + pluginGitRemotesName: 'dsh-git-remotes Zdalne repozytoria Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Warsztat GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Zaznacz i zapytaj', + pluginSidenoteName: 'dsh-sidenote Czat boczny', + pluginServerDeckName: 'dsh-server-deck Panel serwerów', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Tunel SSH', + pluginTurnReviewName: 'dsh-turn-review Rewizja tury', + pluginBilingualReaderName: 'dsh-bilingual-reader Czytnik dwujęzyczny', + pluginOfficeName: 'Podgląd Office', + pluginMdExportName: 'Eksport Markdown', + pluginCodeNavName: 'Nawigator podglądu kodu', + pluginVideoPreviewName: 'Podgląd wideo', + presetDshDesktopDesc: 'Tryb zaawansowany Electron (bez ramki): macOS rezerwuje 20px u góry; Windows bez WCO rezerwuje 32px na pasek tytułu', } diff --git a/src/client/locales-pt.ts b/src/client/locales-pt.ts index 8b62b13d..401e63aa 100644 --- a/src/client/locales-pt.ts +++ b/src/client/locales-pt.ts @@ -404,4 +404,24 @@ export const pt: Record = { pluginDocsPanelDesc: 'Documentos globais na barra lateral do DSH: leia suas próprias notas Markdown de qualquer workspace — uma lista de arquivos, um sumário, abrir no Chrome / VS Code e botões de copiar; o diretório de documentos é configurável (padrão ~/.dsh/docs)', pluginEgoBrowserDesc: 'O navegador de agente para o DeepSeek Harness: 32 ferramentas ego_* controlam um Chromium real; uma aba nativa «ego browser» na barra lateral mostra ao vivo cada página visitada pelo agente — você pode clicar, arrastar e digitar para assumir. Registra a aba automaticamente quando o better-sidebar está presente; caso contrário, uma bolha flutuante', pluginBilingualReaderDesc: 'Leia PDFs na barra lateral do DSH: visualização nativa de PDF, selecione o texto para traduzir com o LLM, com contexto e totalmente isolado da conversa principal', + pluginSentinelName: 'dsh-sentinel Sistema de despertar', + pluginEgoBrowserName: 'ego-browser Navegador de agentes', + pluginBetterOverleafName: 'dsh-better-overleaf Aba Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Documentos globais', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Credenciais Git', + pluginGitRemotesName: 'dsh-git-remotes Remotos Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Bancada GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Selecionar e perguntar', + pluginSidenoteName: 'dsh-sidenote Chat lateral', + pluginServerDeckName: 'dsh-server-deck Deck de servidores', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Túnel SSH', + pluginTurnReviewName: 'dsh-turn-review Revisão do turno', + pluginBilingualReaderName: 'dsh-bilingual-reader Leitor bilíngue', + pluginOfficeName: 'Pré-visualização Office', + pluginMdExportName: 'Exportação Markdown', + pluginCodeNavName: 'Navegador de pré-visualização de código', + pluginVideoPreviewName: 'Pré-visualização de vídeo', + presetDshDesktopDesc: 'Modo avançado Electron (sem moldura): o macOS reserva 20px no topo; o Windows reserva 32px para a barra de título sem WCO', } diff --git a/src/client/locales-ru.ts b/src/client/locales-ru.ts index d3d28b18..1d5068b6 100644 --- a/src/client/locales-ru.ts +++ b/src/client/locales-ru.ts @@ -419,4 +419,24 @@ export const ru: Record = { pluginDocsPanelDesc: '«Глобальные документы» в боковой панели DSH: глобальные Markdown-заметки, доступные из любой рабочей области — список для чтения, навигация по плавающему оглавлению, открытие в Chrome / VS Code, копирование кода; каталог настраивается (по умолчанию ~/.dsh/docs)', pluginEgoBrowserDesc: 'Браузер агента для DeepSeek Harness: 32 инструмента ego_* управляют настоящим Chromium; встроенная вкладка «ego browser» в боковой панели показывает в реальном времени каждую страницу, которую посещает агент — кликайте, перетаскивайте и вводите текст, чтобы перехватить управление. Вкладка регистрируется автоматически при наличии better-sidebar, иначе используется плавающий пузырёк', pluginBilingualReaderDesc: 'Читайте PDF в боковой панели DSH: нативный просмотр PDF, выделите текст для перевода с помощью LLM, используя контекст и полностью изолированно от основного разговора', + pluginSentinelName: 'dsh-sentinel Система пробуждения', + pluginEgoBrowserName: 'ego-browser Браузер агента', + pluginBetterOverleafName: 'dsh-better-overleaf Вкладка Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Глобальные документы', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Учётные данные Git', + pluginGitRemotesName: 'dsh-git-remotes Удалённые репозитории Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Рабочая среда GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Выделить и спросить', + pluginSidenoteName: 'dsh-sidenote Боковой чат', + pluginServerDeckName: 'dsh-server-deck Панель серверов', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH-туннель', + pluginTurnReviewName: 'dsh-turn-review Ревью раунда', + pluginBilingualReaderName: 'dsh-bilingual-reader Двуязычный ридер', + pluginOfficeName: 'Предпросмотр Office', + pluginMdExportName: 'Экспорт Markdown', + pluginCodeNavName: 'Навигатор предпросмотра кода', + pluginVideoPreviewName: 'Предпросмотр видео', + presetDshDesktopDesc: 'Расширенный режим Electron (без рамки): macOS резервирует 20px сверху; Windows без WCO резервирует 32px под строку заголовка', } diff --git a/src/client/locales-sv.ts b/src/client/locales-sv.ts index a304a1eb..72280cd7 100644 --- a/src/client/locales-sv.ts +++ b/src/client/locales-sv.ts @@ -404,4 +404,24 @@ export const sv: Record = { pluginDocsPanelDesc: 'Globala dokument i DSH-sidopanelen: läs era egna Markdown-anteckningar från valfri arbetsyta — en fillista, en översikt, öppna i Chrome / VS Code och kopieringsknappar; dokumentkatalogen är konfigurerbar (standard ~/.dsh/docs)', pluginEgoBrowserDesc: 'Agentwebbläsaren för DeepSeek Harness: 32 ego_*-verktyg styr en riktig Chromium; en inbyggd «ego browser»-flik i sidopanelen visar varje sida agenten besöker i realtid — du kan klicka, dra och skriva för att ta över. Registrerar fliken automatiskt när better-sidebar finns, annars en flytande bubbla', pluginBilingualReaderDesc: 'Läs PDF-filer i DSH-sidopanelen: inbyggd PDF-visning, markera text för att översätta med LLM, med kontext och helt isolerad från huvudkonversationen', + pluginSentinelName: 'dsh-sentinel Väcksystem', + pluginEgoBrowserName: 'ego-browser Agentwebbläsare', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf-flik', + pluginDocsPanelName: 'dsh-docs-panel Globala dokument', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git-autentiseringsuppgifter', + pluginGitRemotesName: 'dsh-git-remotes Git-fjärrarkiv', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub-arbetsbänk', + pluginSidebarQaName: 'dsh-sidebar-qa Markera och fråga', + pluginSidenoteName: 'dsh-sidenote Sidchatt', + pluginServerDeckName: 'dsh-server-deck Serverdäck', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH-tunnel', + pluginTurnReviewName: 'dsh-turn-review Varvgranskning', + pluginBilingualReaderName: 'dsh-bilingual-reader Tvåspråkig läsare', + pluginOfficeName: 'Office-förhandsvisning', + pluginMdExportName: 'Markdown-export', + pluginCodeNavName: 'Kodförhandsvisningsnavigatör', + pluginVideoPreviewName: 'Videoförhandsvisning', + presetDshDesktopDesc: 'Electrons avancerade läge (ramlöst): macOS reserverar 20px högst upp; Windows reserverar 32px för namnlisten när WCO inte är tillgängligt', } diff --git a/src/client/locales-th.ts b/src/client/locales-th.ts index 23f5e2a3..de718d26 100644 --- a/src/client/locales-th.ts +++ b/src/client/locales-th.ts @@ -421,4 +421,24 @@ export const th: Record = { pluginDocsPanelDesc: 'เอกสารส่วนกลางในแถบด้านข้าง DSH: อ่านบันทึก Markdown ของคุณเองจากพื้นที่ทำงานใดๆ — รายการไฟล์, เค้าโครง, เปิดใน Chrome / VS Code และปุ่มคัดลอก; ไดเรกทอรีเอกสารสามารถกำหนดค่าได้ (ค่าเริ่มต้น ~/.dsh/docs)', pluginEgoBrowserDesc: 'เบราว์เซอร์เอเจนต์สำหรับ DeepSeek Harness: เครื่องมือ ego_* 32 ตัวขับเคลื่อน Chromium จริง แท็บ «ego browser» เนทีฟในแถบด้านข้างแสดงทุกหน้าที่เอเจนต์เยี่ยมชมแบบสด — คลิก ลาก และพิมพ์เพื่อเข้าไปควบคุมแทนได้ ลงทะเบียนแท็บอัตโนมัติเมื่อมี better-sidebar มิฉะนั้นจะใช้บับเบิลลอย', pluginBilingualReaderDesc: 'อ่าน PDF ในแถบด้านข้าง DSH: แสดง PDF ต้นฉบับ เลือกข้อความเพื่อแปลด้วย LLM พร้อมบริบทและแยกจากการสนทนาหลักโดยสิ้นเชิง', + pluginSentinelName: 'dsh-sentinel ระบบปลุกเตือน', + pluginEgoBrowserName: 'ego-browser เบราว์เซอร์เอเจนต์', + pluginBetterOverleafName: 'dsh-better-overleaf แท็บ Overleaf', + pluginDocsPanelName: 'dsh-docs-panel เอกสารส่วนกลาง', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge ข้อมูลรับรอง Git', + pluginGitRemotesName: 'dsh-git-remotes Remote ของ Git', + pluginGithubWorkbenchName: 'dsh-github-workbench เวิร์กเบนช์ GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa เลือกแล้วถาม', + pluginSidenoteName: 'dsh-sidenote แชทข้างเคียง', + pluginServerDeckName: 'dsh-server-deck เด็คเซิร์ฟเวอร์', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel อุโมงค์ SSH', + pluginTurnReviewName: 'dsh-turn-review รีวิวรอบ', + pluginBilingualReaderName: 'dsh-bilingual-reader ตัวอ่านสองภาษา', + pluginOfficeName: 'พรีวิว Office', + pluginMdExportName: 'ส่งออก Markdown', + pluginCodeNavName: 'ตัวนำทางพรีวิวโค้ด', + pluginVideoPreviewName: 'พรีวิววิดีโอ', + presetDshDesktopDesc: 'โหมดขั้นสูงของ Electron (ไร้กรอบ): macOS จองแถบด้านบน 20px; Windows จอง 32px ให้แถบหัวเรื่องเมื่อไม่มี WCO', } diff --git a/src/client/locales-tr.ts b/src/client/locales-tr.ts index 848d11c3..abe14b0e 100644 --- a/src/client/locales-tr.ts +++ b/src/client/locales-tr.ts @@ -421,4 +421,24 @@ export const tr: Record = { 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', + 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', } diff --git a/src/client/locales-vi.ts b/src/client/locales-vi.ts index 898b6423..c08d162a 100644 --- a/src/client/locales-vi.ts +++ b/src/client/locales-vi.ts @@ -421,4 +421,24 @@ export const vi: Record = { pluginDocsPanelDesc: '«Tài liệu toàn cục» trong thanh bên DSH: ghi chú Markdown toàn cục, đọc từ bất kỳ workspace nào — danh sách chọn để đọc, outline hover để nhảy, mở ngoài trong Chrome / VS Code, sao chép code, thư mục cấu hình được (mặc định ~/.dsh/docs)', pluginEgoBrowserDesc: 'Trình duyệt agent cho DeepSeek Harness: 32 công cụ ego_* điều khiển Chromium thật; tab «ego browser» gốc trong thanh bên hiển thị trực tiếp mọi trang agent truy cập — bạn có thể bấm, kéo và gõ để tiếp quản. Tự động đăng ký tab khi có better-sidebar, nếu không thì rơi về bong bóng nổi', pluginBilingualReaderDesc: 'Đọc PDF trong thanh bên DSH: hiển thị PDF gốc, chọn văn bản để dịch bằng LLM, dùng ngữ cảnh và hoàn toàn tách biệt khỏi cuộc trò chuyện chính', + pluginSentinelName: 'dsh-sentinel Hệ thống đánh thức', + pluginEgoBrowserName: 'ego-browser Trình duyệt agent', + pluginBetterOverleafName: 'dsh-better-overleaf Tab Overleaf', + pluginDocsPanelName: 'dsh-docs-panel Tài liệu toàn cục', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Thông tin đăng nhập Git', + pluginGitRemotesName: 'dsh-git-remotes Remote Git', + pluginGithubWorkbenchName: 'dsh-github-workbench Bàn làm việc GitHub', + pluginSidebarQaName: 'dsh-sidebar-qa Chọn & hỏi', + pluginSidenoteName: 'dsh-sidenote Trò chuyện bên', + pluginServerDeckName: 'dsh-server-deck Bảng máy chủ', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel Đường hầm SSH', + pluginTurnReviewName: 'dsh-turn-review Duyệt vòng', + pluginBilingualReaderName: 'dsh-bilingual-reader Trình đọc song ngữ', + pluginOfficeName: 'Xem trước Office', + pluginMdExportName: 'Xuất Markdown', + pluginCodeNavName: 'Trình điều hướng xem trước mã', + pluginVideoPreviewName: 'Xem trước video', + presetDshDesktopDesc: 'Chế độ Electron nâng cao (không viền): macOS dành 20px ở trên cùng; Windows dành 32px cho thanh tiêu đề khi không có WCO', } diff --git a/src/client/locales-zh-HK.ts b/src/client/locales-zh-HK.ts index 6a26b55e..6771f6ba 100644 --- a/src/client/locales-zh-HK.ts +++ b/src/client/locales-zh-HK.ts @@ -436,4 +436,24 @@ export const zhHK: Record = { pluginDocsPanelDesc: 'DSH 側邊欄裡的「全域文件」:全域 Markdown 筆記,任何工作區隨時可讀——列表點選閱讀、懸浮大綱跳轉、Chrome / VS Code 外部開啟、程式碼複製,目錄可設定(預設 ~/.dsh/docs)', pluginEgoBrowserDesc: '將 CitroLabs/ego-lite 接進 DeepSeek Harness 的 agent 瀏覽器:32 個 ego_* 工具驅動真實 Chromium,側邊欄原生「ego 瀏覽器」Tab 實時觀察 agent 逛的每個頁面,可直接點擊/拖拽/輸入接管;裝 better-sidebar 時自動註冊 Tab,沒裝則退回浮動浮窗', pluginBilingualReaderDesc: '喺 DSH 側邊欄讀論文 PDF:原生 PDF 顯示,揀一段文字就用大模型劃詞翻譯,結合上下文、完全隔離主對話,只做閱讀輔助', + pluginSentinelName: 'dsh-sentinel 喚醒系統', + pluginEgoBrowserName: 'ego-browser Agent 瀏覽器', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf 標籤', + pluginDocsPanelName: 'dsh-docs-panel 全域文件', + pluginFlowglassName: 'dsh-flowglass 流鏡', + pluginGitForgeName: 'dsh-git-forge Git 憑證', + pluginGitRemotesName: 'dsh-git-remotes Git 遠端', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub 工作台', + pluginSidebarQaName: 'dsh-sidebar-qa 劃選追問', + pluginSidenoteName: 'dsh-sidenote 側邊對話', + pluginServerDeckName: 'dsh-server-deck 伺服器甲板', + pluginSuhuangScrollName: 'dsh-suhuang-scroll 蘇黃共閱', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH 隧道', + pluginTurnReviewName: 'dsh-turn-review 本輪審查', + pluginBilingualReaderName: 'dsh-bilingual-reader 雙語閱讀', + pluginOfficeName: 'Office 預覽插件', + pluginMdExportName: 'Markdown 匯出插件', + pluginCodeNavName: '程式碼預覽導航', + pluginVideoPreviewName: '影片預覽插件', + presetDshDesktopDesc: 'Electron 進階模式(無邊框):macOS 頂欄 20px、Windows 無 WCO 時 32px 標題欄讓位', } diff --git a/src/client/locales-zh-MO.ts b/src/client/locales-zh-MO.ts index 8de6d9b3..940c7fed 100644 --- a/src/client/locales-zh-MO.ts +++ b/src/client/locales-zh-MO.ts @@ -436,4 +436,24 @@ export const zhMO: Record = { pluginDocsPanelDesc: 'DSH 側邊欄裡的「全域文件」:全域 Markdown 筆記,任何工作區隨時可讀——列表點選閱讀、懸浮大綱跳轉、Chrome / VS Code 外部開啟、程式碼複製,目錄可設定(預設 ~/.dsh/docs)', pluginEgoBrowserDesc: '將 CitroLabs/ego-lite 接進 DeepSeek Harness 的 agent 瀏覽器:32 個 ego_* 工具驅動真實 Chromium,側邊欄原生「ego 瀏覽器」Tab 實時觀察 agent 逛的每個頁面,可直接點擊/拖拽/輸入接管;裝 better-sidebar 時自動註冊 Tab,沒裝則退回浮動浮窗', pluginBilingualReaderDesc: '喺 DSH 側邊欄讀論文 PDF:原生 PDF 顯示,揀一段文字就用大模型劃詞翻譯,結合上下文、完全隔離主對話,只做閱讀輔助', + pluginSentinelName: 'dsh-sentinel 喚醒系統', + pluginEgoBrowserName: 'ego-browser Agent 瀏覽器', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf 標籤', + pluginDocsPanelName: 'dsh-docs-panel 全域文件', + pluginFlowglassName: 'dsh-flowglass 流鏡', + pluginGitForgeName: 'dsh-git-forge Git 憑證', + pluginGitRemotesName: 'dsh-git-remotes Git 遠端', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub 工作台', + pluginSidebarQaName: 'dsh-sidebar-qa 劃選追問', + pluginSidenoteName: 'dsh-sidenote 側邊對話', + pluginServerDeckName: 'dsh-server-deck 伺服器甲板', + pluginSuhuangScrollName: 'dsh-suhuang-scroll 蘇黃共閱', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH 隧道', + pluginTurnReviewName: 'dsh-turn-review 本輪審查', + pluginBilingualReaderName: 'dsh-bilingual-reader 雙語閱讀', + pluginOfficeName: 'Office 預覽插件', + pluginMdExportName: 'Markdown 匯出插件', + pluginCodeNavName: '代碼預覽導航', + pluginVideoPreviewName: '影片預覽插件', + presetDshDesktopDesc: 'Electron 進階模式(無邊框):macOS 頂欄 20px、Windows 無 WCO 時 32px 標題欄讓位', } diff --git a/src/client/locales-zh-TW.ts b/src/client/locales-zh-TW.ts index f2d4cbf6..68724554 100644 --- a/src/client/locales-zh-TW.ts +++ b/src/client/locales-zh-TW.ts @@ -436,4 +436,24 @@ export const zhTW: Record = { pluginDocsPanelDesc: 'DSH 側邊欄裡的「全域文件」:全域 Markdown 筆記,任何工作區隨時可讀——列表點選閱讀、懸浮大綱跳轉、Chrome / VS Code 外部開啟、程式碼複製,目錄可設定(預設 ~/.dsh/docs)', pluginEgoBrowserDesc: '將 CitroLabs/ego-lite 接進 DeepSeek Harness 的 agent 瀏覽器:32 個 ego_* 工具驅動真實 Chromium,側邊欄原生「ego 瀏覽器」Tab 實時觀察 agent 逛的每個頁面,可直接點擊/拖拽/輸入接管;裝 better-sidebar 時自動註冊 Tab,沒裝則退回浮動浮窗', pluginBilingualReaderDesc: '在 DSH 側邊欄讀論文 PDF:原生 PDF 顯示,選取一段文字即用大模型劃詞翻譯,結合上下文、完全隔離主對話,只作閱讀輔助', + pluginSentinelName: 'dsh-sentinel 喚醒系統', + pluginEgoBrowserName: 'ego-browser Agent 瀏覽器', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf 標籤', + pluginDocsPanelName: 'dsh-docs-panel 全域文件', + pluginFlowglassName: 'dsh-flowglass 流鏡', + pluginGitForgeName: 'dsh-git-forge Git 憑證', + pluginGitRemotesName: 'dsh-git-remotes Git 遠端', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub 工作台', + pluginSidebarQaName: 'dsh-sidebar-qa 劃選追問', + pluginSidenoteName: 'dsh-sidenote 側邊對話', + pluginServerDeckName: 'dsh-server-deck 伺服器甲板', + pluginSuhuangScrollName: 'dsh-suhuang-scroll 蘇黃共閱', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH 隧道', + pluginTurnReviewName: 'dsh-turn-review 本輪審查', + pluginBilingualReaderName: 'dsh-bilingual-reader 雙語閱讀', + pluginOfficeName: 'Office 預覽插件', + pluginMdExportName: 'Markdown 匯出插件', + pluginCodeNavName: '程式碼預覽導覽', + pluginVideoPreviewName: '影片預覽插件', + presetDshDesktopDesc: 'Electron 進階模式(無邊框):macOS 頂欄 20px、Windows 無 WCO 時 32px 標題列讓位', } diff --git a/src/client/locales.ts b/src/client/locales.ts index a00530df..45a5a27f 100644 --- a/src/client/locales.ts +++ b/src/client/locales.ts @@ -428,6 +428,26 @@ export const zh = { pluginDocsPanelDesc: 'DSH 侧边栏里的「全局文档」:全局 Markdown 笔记,任何工作区随时可读——列表点选阅读、悬浮大纲跳转、Chrome / VS Code 外部打开、代码复制,目录可配置(默认 ~/.dsh/docs)', pluginEgoBrowserDesc: '把 CitroLabs/ego-lite 接进 DeepSeek Harness 的 agent 浏览器:32 个 ego_* 工具驱动真实 Chromium,侧边栏原生「ego 浏览器」Tab 实时观察 agent 逛的每个页面,可直接点击/拖拽/输入接管;装 better-sidebar 时自动注册 Tab,没装则退回浮动浮窗', pluginBilingualReaderDesc: '在 DSH 侧边栏读论文 PDF:原生 PDF 显示,选中一段文字即用大模型划词翻译,结合上下文、完全隔离主对话,只作阅读辅助', + pluginSentinelName: 'dsh-sentinel 唤醒系统', + pluginEgoBrowserName: 'ego-browser Agent 浏览器', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf 标签页', + pluginDocsPanelName: 'dsh-docs-panel 全局文档', + pluginFlowglassName: 'dsh-flowglass 流镜', + pluginGitForgeName: 'dsh-git-forge Git 凭据', + pluginGitRemotesName: 'dsh-git-remotes Git 远程', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub 工作台', + pluginSidebarQaName: 'dsh-sidebar-qa 划选追问', + pluginSidenoteName: 'dsh-sidenote 侧边聊天', + pluginServerDeckName: 'dsh-server-deck 服务器甲板', + pluginSuhuangScrollName: 'dsh-suhuang-scroll 苏黄共阅', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH 隧道', + pluginTurnReviewName: 'dsh-turn-review 本轮审查', + pluginBilingualReaderName: 'dsh-bilingual-reader 双语阅读', + pluginOfficeName: 'Office 预览插件', + pluginMdExportName: 'Markdown 导出插件', + pluginCodeNavName: '代码预览导航', + pluginVideoPreviewName: '视频预览插件', + presetDshDesktopDesc: 'Electron 高级模式(无边框):macOS 顶栏 20px、Windows 无 WCO 时 32px 标题栏让位', } /** The en dictionary (key-set-equal to zh, enforced by the type annotation). */ @@ -837,6 +857,26 @@ export const en: Record = { pluginEgoBrowserDesc: 'The agent browser for DeepSeek Harness: 32 ego_* tools drive a real Chromium, with a native sidebar "ego browser" tab giving a live view of every page the agent visits — you can click, drag, and type to take over. Registers the tab automatically when better-sidebar is present, otherwise falls back to a floating bubble', pluginBetterOverleafDesc: 'Overleaf tab for better-sidebar: direct-CDP browser login (third-party Chromium supported), project list/switch, local git mirrors under /overleaf/, two-way git sync with read-only API fallback, and file preview through the sidebar workbench', pluginBilingualReaderDesc: 'Read paper PDFs in the DSH sidebar: native PDF rendering, select text to translate it with the LLM, using context while staying fully isolated from the main conversation — a reading aid only', + pluginSentinelName: 'dsh-sentinel Wake-up System', + pluginEgoBrowserName: 'ego-browser Agent Browser', + pluginBetterOverleafName: 'dsh-better-overleaf Overleaf Tab', + pluginDocsPanelName: 'dsh-docs-panel Global Docs', + pluginFlowglassName: 'dsh-flowglass Flowglass', + pluginGitForgeName: 'dsh-git-forge Git Credentials', + pluginGitRemotesName: 'dsh-git-remotes Git Remotes', + pluginGithubWorkbenchName: 'dsh-github-workbench GitHub Workbench', + pluginSidebarQaName: 'dsh-sidebar-qa Select & Ask', + pluginSidenoteName: 'dsh-sidenote Side Chat', + pluginServerDeckName: 'dsh-server-deck Server Deck', + pluginSuhuangScrollName: 'dsh-suhuang-scroll Suhuang Scroll', + pluginSshTunnelName: 'dsh-ssh-tunnel SSH Tunnel', + pluginTurnReviewName: 'dsh-turn-review Turn Review', + pluginBilingualReaderName: 'dsh-bilingual-reader Bilingual Reader', + pluginOfficeName: 'Office Preview', + pluginMdExportName: 'Markdown Export', + pluginCodeNavName: 'Code Preview Navigator', + pluginVideoPreviewName: 'Video Preview', + presetDshDesktopDesc: 'Electron advanced (frameless) mode: macOS reserves a 20px top strip; Windows reserves a 32px title bar when WCO is unavailable', } /** diff --git a/src/client/plugins-shared.ts b/src/client/plugins-shared.ts index 44df762b..02d2426e 100644 --- a/src/client/plugins-shared.ts +++ b/src/client/plugins-shared.ts @@ -14,8 +14,10 @@ export const PLUGIN_TOPIC_URL = 'https://github.com/topics/dsh-better-sidebar' export interface PluginEntry { /** Unique id (the npm package name). */ id: string - /** Short display name. */ - name: string + /** Short display name (i18n friendly: string or () => string — the plain + * string form is the raw-name fallback when no dictionary key covers the + * entry, mirroring `description`). */ + name: string | (() => string) /** GitHub repository URL. */ url: string /** One-line description (i18n friendly: string or () => string). */ diff --git a/src/client/plugins-tabs.ts b/src/client/plugins-tabs.ts index 1ac1ec8e..4a05162a 100644 --- a/src/client/plugins-tabs.ts +++ b/src/client/plugins-tabs.ts @@ -2,11 +2,11 @@ * The built-in catalog of TAB-registration plugins (sidebar pages), * shown in the "add tab plugin" modal (Side card settings → 侧边栏内容 grid * → the dashed card). Adding an entry: append one object here (unique - * `id` = npm package name, `url` = GitHub repo, `description` = - * i18n-friendly (add a `pluginXxxDesc` key in locales.ts), `install` = the - * full one-line install script — it starts with `cd ~/.dsh` so the install - * runs with the DSH home as the working directory). Data integrity is - * guarded by `tests/plugin-list.spec.ts`. + * `id` = npm package name, `name` / `description` = i18n-friendly (add a + * `pluginXxxName` / `pluginXxxDesc` key in locales.ts), `url` = GitHub repo, + * `install` = the full one-line install script — it starts with `cd ~/.dsh` + * so the install runs with the DSH home as the working directory). Data + * integrity is guarded by `tests/plugin-list.spec.ts`. */ import { t } from './locales.ts' import type { PluginEntry } from './plugins-shared.ts' @@ -15,7 +15,7 @@ import type { PluginEntry } from './plugins-shared.ts' export const builtinTabPlugins: readonly PluginEntry[] = [ { id: '@dsh-external/dsh-sentinel', - name: 'dsh-sentinel 唤醒系统', + name: () => t('pluginSentinelName'), url: 'https://github.com/fuhefei/dsh-sentinel', description: () => t('pluginSentinelDesc'), // The official one-line bundle-channel install (git source, build @@ -26,7 +26,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: '@dsh-external/ego-browser', - name: 'ego-browser Agent 浏览器', + name: () => t('pluginEgoBrowserName'), url: 'https://github.com/Fisfzy/ego-browser', description: () => t('pluginEgoBrowserDesc'), // Registers a sidebar tab for the agent browser; optional peer of @@ -35,7 +35,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-better-overleaf', - name: 'dsh-better-overleaf Overleaf 标签页', + name: () => t('pluginBetterOverleafName'), url: 'https://github.com/Hoemr/dsh-better-overleaf', description: () => t('pluginBetterOverleafDesc'), // Published on npm; peer-depends on dsh-better-sidebar (Overleaf tab), @@ -44,7 +44,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-docs-panel', - name: 'dsh-docs-panel 全局文档', + name: () => t('pluginDocsPanelName'), url: 'https://github.com/mlosun/dsh-docs-panel', description: () => t('pluginDocsPanelDesc'), // dsh-docs-panel hard-depends on dsh-better-sidebar (required peer), so @@ -53,7 +53,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-flowglass', - name: 'dsh-flowglass 流镜', + name: () => t('pluginFlowglassName'), url: 'https://github.com/Iwctwbh/dsh-flowglass', description: () => t('pluginFlowglassDesc'), // Flowglass keeps its standalone drawer as a fallback and registers the @@ -62,7 +62,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-git-forge', - name: 'dsh-git-forge Git 凭据', + name: () => t('pluginGitForgeName'), url: 'https://github.com/thirsty5034/dsh-git-forge', description: () => t('pluginGitForgeDesc'), // Peer-depends on dsh-better-sidebar (Git Forge tab). Install the @@ -71,14 +71,14 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-git-remotes', - name: 'dsh-git-remotes Git 远程', + name: () => t('pluginGitRemotesName'), url: 'https://github.com/yq04/dsh-git-remotes', description: () => t('pluginGitRemotesDesc'), install: 'cd ~/.dsh && dsh plugin --profile web add dsh-better-sidebar && dsh plugin --profile web add git+https://github.com/yq04/dsh-git-remotes.git', }, { id: 'dsh-github-workbench', - name: 'dsh-github-workbench GitHub 工作台', + name: () => t('pluginGithubWorkbenchName'), url: 'https://github.com/meyaomiao/dsh-github-workbench', description: () => t('pluginGithubWorkbenchDesc'), // Full GitHub workbench tab: remote repo tree + Issues/PRs/Actions tabs @@ -88,7 +88,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-sidebar-qa', - name: 'dsh-sidebar-qa 划选追问', + name: () => t('pluginSidebarQaName'), url: 'https://github.com/ChenRuoT/dsh-sidebar-qa', description: () => t('pluginSidebarQaDesc'), // dsh-sidebar-qa hard-depends on dsh-better-sidebar (required peer), so @@ -97,7 +97,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-sidenote', - name: 'dsh-sidenote 侧边聊天', + name: () => t('pluginSidenoteName'), url: 'https://github.com/g-yixuan/dsh-sidenote', description: () => t('pluginSidenoteDesc'), // dsh-sidenote hard-depends on dsh-better-sidebar (required peer), so @@ -106,7 +106,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-server-deck', - name: 'dsh-server-deck 服务器甲板', + name: () => t('pluginServerDeckName'), url: 'https://github.com/meyaomiao/DSH-server-deck', description: () => t('pluginServerDeckDesc'), // Published on npm; dual-mount like flowglass — registers the native @@ -116,7 +116,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-suhuang-scroll', - name: 'dsh-suhuang-scroll 苏黄共阅', + name: () => t('pluginSuhuangScrollName'), url: 'https://github.com/YZDame/dsh-suhuang-scroll', description: () => t('pluginSuhuangScrollDesc'), // Suhuang Scroll is a DSH Web plugin whose runtime console registers in @@ -125,7 +125,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-ssh-tunnel', - name: 'dsh-ssh-tunnel SSH 隧道', + name: () => t('pluginSshTunnelName'), url: 'https://github.com/thirsty5034/dsh-ssh-tunnel', description: () => t('pluginSshTunnelDesc'), // Peer-depends on dsh-better-sidebar (SSH Tunnel tab + center terminal/SFTP). @@ -134,7 +134,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-turn-review', - name: 'dsh-turn-review 本轮审查', + name: () => t('pluginTurnReviewName'), url: 'https://github.com/yq04/dsh-turn-review', description: () => t('pluginTurnReviewDesc'), // Needs dsh-better-sidebar (optional peer) for the tab; no model tools. @@ -142,7 +142,7 @@ export const builtinTabPlugins: readonly PluginEntry[] = [ }, { id: 'dsh-bilingual-reader', - name: 'dsh-bilingual-reader 双语阅读', + name: () => t('pluginBilingualReaderName'), url: 'https://github.com/Johnblur/dsh-bilingual-reader', description: () => t('pluginBilingualReaderDesc'), // Bilingual paper reading: a native-PDF tab with LLM selection translation, diff --git a/src/client/plugins-viewers.ts b/src/client/plugins-viewers.ts index 4ef36ca3..1273baa1 100644 --- a/src/client/plugins-viewers.ts +++ b/src/client/plugins-viewers.ts @@ -2,8 +2,9 @@ * The built-in catalog of FILE-PREVIEWER plugins (file-type previewers), * shown in the "add preview plugin" modal (Side card settings → 文件预览 * grid → the dashed card). Adding an entry: append one object here (unique - * `id` = npm package name, `url` = GitHub repo, `description` = - * i18n-friendly, `install` = the full shell command pre-filled into the + * `id` = npm package name, `name` / `description` = i18n-friendly (add a + * `pluginXxxName` / `pluginXxxDesc` key in locales.ts), `url` = GitHub repo, + * `install` = the full shell command pre-filled into the * install terminal — it starts with `cd ~/.dsh` so the install runs with * the DSH home as the working directory). Data integrity is guarded by * `tests/plugin-list.spec.ts`. @@ -15,28 +16,28 @@ import type { PluginEntry } from './plugins-shared.ts' export const builtinViewerPlugins: readonly PluginEntry[] = [ { id: '@huanlin/dsh-plugin-better-sidebar-plugin-office', - name: 'Office 预览插件', + name: () => t('pluginOfficeName'), url: 'https://github.com/HuanLinOTO/dsh-plugin-better-sidebar-plugin-office', description: () => t('pluginOfficeDesc'), install: 'cd ~/.dsh && dsh plugin --profile web add @huanlin/dsh-plugin-better-sidebar-plugin-office', }, { id: 'dsh-md-export', - name: 'Markdown 导出插件', + name: () => t('pluginMdExportName'), url: 'https://github.com/AnakinCao/dsh-md-export', description: () => t('pluginMdExportDesc'), install: 'cd ~/.dsh && dsh plugin --profile web add dsh-md-export', }, { id: 'dsh-code-nav', - name: '代码预览导航', + name: () => t('pluginCodeNavName'), url: 'https://github.com/AnakinCao/dsh-code-nav', description: () => t('pluginCodeNavDesc'), install: 'cd ~/.dsh && dsh plugin --profile web add https://github.com/AnakinCao/dsh-code-nav.git', }, { id: 'dsh-video-preview', - name: '视频预览插件', + name: () => t('pluginVideoPreviewName'), url: 'https://github.com/zemul/dsh-video-preview', description: () => t('pluginVideoPreviewDesc'), install: 'cd ~/.dsh && dsh plugin --profile web add dsh-video-preview', diff --git a/src/client/shell-presets.ts b/src/client/shell-presets.ts index 4f15949e..517470f0 100644 --- a/src/client/shell-presets.ts +++ b/src/client/shell-presets.ts @@ -10,6 +10,7 @@ * 100+ GitHub stars (a real user base). The mechanism is opt-in: auto * detection never applies a preset — the settings badge only SUGGESTS it. */ +import { t } from './locales.ts' import type { DesktopEnv } from './desktop-env.ts' export interface ShellPreset { @@ -17,8 +18,10 @@ export interface ShellPreset { readonly id: string /** User-facing name of the shell. */ readonly title: string - /** One-line description shown in the settings popup. */ - readonly desc: string + /** One-line description shown in the settings popup (i18n friendly: + * string or () => string — the plain string form is the raw-text + * fallback when no dictionary key covers the preset). */ + readonly desc: string | (() => string) /** * The top strip (px) this shell reserves over web content, per * environment — the fallback used when neither the standard WCO API nor @@ -53,7 +56,7 @@ export interface ShellPreset { const DSH_DESKTOP: ShellPreset = { id: 'dsh-desktop', title: 'DeepSeek Harness Desktop', - desc: 'Electron 高级模式(无边框):macOS 顶栏 20px、Windows 无 WCO 时 32px 标题栏让位', + desc: () => t('presetDshDesktopDesc'), stripFor: (env) => { if (env.mode !== 'advanced') return undefined if (env.platform === 'darwin') return 20 diff --git a/tests/add-plugin-modal.spec.tsx b/tests/add-plugin-modal.spec.tsx index d508dd06..6b75e0cf 100644 --- a/tests/add-plugin-modal.spec.tsx +++ b/tests/add-plugin-modal.spec.tsx @@ -30,6 +30,14 @@ import { setupReactAct } from './test-utils.ts' setupReactAct() const officeEntry = builtinViewerPlugins[0] as PluginEntry +const sentinelEntry = builtinTabPlugins.find(entry => entry.id === '@dsh-external/dsh-sentinel') as PluginEntry + +/** Resolve an i18n-friendly string-or-function value (mirror of textOf). + * Catalog names went through the same union as descriptions, so they + * render through t() in the active (test: en) locale. */ +function textOf(value: string | (() => string)): string { + return typeof value === 'function' ? value() : value +} describe('PluginListBody (render)', () => { it('viewer kind renders the topic button and the office catalog entry', () => { @@ -43,7 +51,7 @@ describe('PluginListBody (render)', () => { expect(html).not.toContain('href=') // The seeded catalog entry: name, description, install script, // a jump button (opens the repo in a NEW browser tab) and a copy button. - expect(html).toContain(officeEntry.name) + expect(html).toContain(textOf(officeEntry.name)) expect(html).toContain(officeEntry.install.replaceAll('&', '&')) expect(html).toContain('Open') expect(html).toContain('Copy') @@ -53,9 +61,9 @@ describe('PluginListBody (render)', () => { const store = createSidebarStore() const service = createBetterSidebarService(store) const html = renderToString(createElement(PluginListBody, { service, kind: 'tab' })) - expect(html).toContain('dsh-sentinel 唤醒系统') + expect(html).toContain(textOf(sentinelEntry.name)) expect(html).toContain('github:fuhefei/dsh-sentinel') - expect(html).not.toContain(officeEntry.name) + expect(html).not.toContain(textOf(officeEntry.name)) }) }) @@ -75,9 +83,9 @@ describe('AddPluginModal wiring', () => { }) const html = document.body.innerHTML if (kind === 'viewer') { - expect(html).toContain(officeEntry.name) + expect(html).toContain(textOf(officeEntry.name)) } else { - expect(html).toContain('dsh-sentinel 唤醒系统') + expect(html).toContain(textOf(sentinelEntry.name)) } act(() => { root.unmount() }) container.remove() diff --git a/tests/plugin-list.spec.ts b/tests/plugin-list.spec.ts index 46774059..5a2a6ae0 100644 --- a/tests/plugin-list.spec.ts +++ b/tests/plugin-list.spec.ts @@ -2,11 +2,11 @@ * Built-in plugin catalog data-integrity tests (both files: the TAB * catalog in plugins-tabs.ts and the FILE-PREVIEWER catalog in * plugins-viewers.ts). Every entry must be installable as data — a unique - * id (npm package name), a GitHub URL, a non-empty localized description - * (string or () => string), and an install script that mentions the dsh - * plugin CLI. The catalogs are the discovery surface of the two "add - * plugin" modals; a malformed entry would break the install flow, so the - * shape is pinned here. + * id (npm package name), a GitHub URL, a non-empty localized name and + * description (string or () => string), and an install script that mentions + * the dsh plugin CLI. The catalogs are the discovery surface of the two + * "add plugin" modals; a malformed entry would break the install flow, so + * the shape is pinned here. */ import { describe, expect, it } from 'vitest' import { builtinTabPlugins } from '../src/client/plugins-tabs.ts' @@ -42,9 +42,11 @@ describe('builtin plugin catalogs', () => { } }) - it('every entry has a name, a GitHub URL, and an install script', () => { + it('every entry has a localized name, a GitHub URL, and an install script', () => { for (const entry of list) { - expect(entry.name.length).toBeGreaterThan(0) + // Names went through the same i18n-friendly union as descriptions + // (string or () => string), so resolve before asserting. + expect(textOf(entry.name).length).toBeGreaterThan(0) expect(entry.url.startsWith('https://github.com/')).toBe(true) expect(entry.install.length).toBeGreaterThan(0) expect(entry.install).toContain('dsh plugin') diff --git a/tests/shell-presets.spec.ts b/tests/shell-presets.spec.ts index a03aa2d7..9f7c932c 100644 --- a/tests/shell-presets.spec.ts +++ b/tests/shell-presets.spec.ts @@ -1,13 +1,21 @@ /** * Built-in shell-preset data tests: registry integrity (unique ids, non-empty - * titles, pure strip/detect functions) and the anywhere-labs DSH Desktop - * entry's strip values (darwin advanced 20px, win32 advanced 32px as the - * no-WCO fallback, compatibility/plain browser nothing). + * titles, non-empty localized descs, pure strip/detect functions) and the + * anywhere-labs DSH Desktop entry's strip values (darwin advanced 20px, + * win32 advanced 32px as the no-WCO fallback, compatibility/plain browser + * nothing). */ import { describe, expect, it } from 'vitest' import { getShellPreset, getShellPresets, presetStripFor } from '../src/client/shell-presets.ts' import type { DesktopEnv } from '../src/client/desktop-env.ts' +/** Resolve an i18n-friendly string-or-function value (mirror of textOf). + * Preset descs went through the same union as the plugin catalog's texts, + * so they resolve through t() in the active (test: en) locale. */ +function textOf(value: string | (() => string)): string { + return typeof value === 'function' ? value() : value +} + const env = (partial: Partial): DesktopEnv => ({ desktop: false, mode: null, @@ -25,7 +33,8 @@ describe('shell presets', () => { expect(ids.has(preset.id)).toBe(false) ids.add(preset.id) expect(preset.title.length).toBeGreaterThan(0) - expect(preset.desc.length).toBeGreaterThan(0) + // Descs are i18n-friendly now (string or () => string) — resolve first. + expect(textOf(preset.desc).length).toBeGreaterThan(0) // The strip function must be total — an unknown environment yields // undefined, never a throw. expect(() => presetStripFor(preset, env({ desktop: false, mode: null, platform: null }))).not.toThrow()