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()