dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Русский язык для DeepSeek Harness: 2615 строк веб-интерфейса + 165 строк оболочки (меню, трей, диалоги, окно входа)
Клиентский плагин DSH: добавляет в веб-интерфейс язык «Русский» и словари перевода для всех пространств имён, которые поставляет DSH.
0.2.0-rc.2
(locales/source-en.json).ru → en.lib/client.js.| Файл | Назначение |
|---|---|
package.json | Манифест: dsh.client (браузерная половина), dsh.bundle (patch для установки как набора), exports["./client"] |
lib/index.js | Хостовая половина: пустой apply, нужна только чтобы у пакета была строка в Loader |
lib/client.js | Собранный браузерный бандл: определение языка + все словари (window.__ModuleLoader__.load) |
locales/ru.json | Исходник перевода: пространство имён → ключ → русский текст |
locales/source-en.json | Английский/китайский источник, по которому сделан перевод (для проверки и дообновления) |
locale/en.json, locale/ru.json | Отображаемые название и описание плагина на странице «Плагины» |
cordis.patch.yml | Patch-слой набора: вставляет собственную строку плагина |
tools/build-client.mjs | Собирает lib/client.js из locales/ru.json |
tools/verify.mjs | Автономная проверка: манифест, хостовая половина, загрузка бандла, регистрация языка и словарей, покрытие источника, совпадение подстановок {...} |
tools/install.mjs | Установка/удаление в профиле DSH одной командой |
tools/extract-dictionaries.cjs | Извлекает словари из установленного DSH (после обновления DSH) |
Плагин — обычный локальный модуль (не набор из npm), поэтому установка сводится к копированию папки в профиль и одной строке в пользовательском patch-файле профиля.
# из этой папки; по умолчанию профиль "desktop"
node tools/install.mjs --dry-run # посмотреть, что будет сделано
node tools/install.mjs # установить
Скрипт:
копирует пакет в <DSH_HOME>\profiles\<профиль>\plugins\dsh-locale-ru;
добавляет в <DSH_HOME>\profiles\<профиль>\cordis.patch.yml (с резервной копией
cordis.patch.yml.before-locale-ru):
- insert:
- id: locale-ru
name: './plugins/dsh-locale-ru/lib/index.js'
Путь внутри insert-строки разрешается относительно самого patch-файла, поэтому
pnpm install и зависимости профиля не нужны.
# <DSH_HOME>\profiles\desktop\cordis.patch.yml — добавить в конец
- insert:
- id: locale-ru
name: './plugins/dsh-locale-ru/lib/index.js'
Страница «Плагины» принимает git-адрес, tarball, абсолютный локальный путь или имя пакета: вставьте адрес репозитория в «Добавить плагин», и DSH установит пакет как набор, который потом можно включать и выключать там же.
Публикация собственного репозитория — tools\publish-github.cmd <адрес репозитория>:
скрипт добавит origin, запушит ветку main, поставит тег v1.0.0 и напомнит про
релиз с архивом. Репозиторий должен существовать и быть пустым; вход в GitHub
подтверждается в окне Git Credential Manager.
Настройки → Общие → Язык → «Русский». Выбор запоминается в настройках DSH.
Профильный HMR перечитывает конфигурацию сам, поэтому перезапуск хоста не нужен; если язык не появился — обновите страницу (F5).
node tools/install.mjs --remove
# 1. что изменилось в установленном DSH
node tools/extract-dictionaries.cjs --check
# 2. переизвлечь источник (при необходимости)
node tools/extract-dictionaries.cjs
# 3. дополнить locales/ru.json новыми ключами и пересобрать бандл
node tools/build-client.mjs
node tools/verify.mjs
Это единственное место интерфейса, которое живёт вне веб-словарей, и оно разделено на две части:
| Часть | Кто рисует | Переводится плагином? |
|---|---|---|
| Подписи «Application», «Edit» в строке заголовка (Windows) | десктоп-оболочка, вставляя меню-бар прямо в страницу (shadow DOM, lib/preload-app.cjs) | да — пакет переписывает подписи и aria-label, пока активен русский |
| Пункты внутри («Undo», «Redo», «Cut», «Copy», «Paste», «Delete», «Select All», подменю «Application») | главный процесс оболочки — это нативное меню Electron (Menu.popup, lib/main.js) | нет — из страницы до него не достать |
У оболочки свой словарь ровно на два языка (165 строк, английский и китайский,
lib/main.js и два preload-скрипта), и её функция выбора языка принимает только
zh и en:
// lib/main.js
function resolveDesktopLocale(locale) {
return locale.toLowerCase().startsWith("zh") ? { id: "zh-CN", messages: zh } : { id: "en", messages: en };
}
Поэтому при выбранном русском (locale.preference = "ru") оболочка откатывается
на английский: пункты нативных меню, меню в трее, системные диалоги, экраны
приветствия и обновления остаются английскими. Это ограничение приложения, а не
пакета: чтобы их перевести, DSH должен сам поставлять русскую таблицу для
оболочки. Пакет переводит то, что доступно из страницы, — подписи меню-бара.
Пакет регистрирует себя в боковой панели «Плагины» (слот plugins.item):
карточка «Русский язык» с кратким описанием, а на её странице — что переведено,
как устроен перевод оболочки и какие есть ручные команды. Запускать оттуда ничего
не нужно: перевод оболочки пакет готовит сам (см. ниже).
Оболочка приложения (меню окна, трей, диалоги, окно входа, экраны обновления)
содержит свой словарь только на английском и китайском, поэтому её перевод
дописывается прямо в установленное приложение — в три файла внутри app.asar:
| Файл | Что переводит |
|---|---|
lib/main.js | пункты меню окна, меню в трее, системные диалоги (выход, фоновая работа), экраны обновления и ошибок запуска, выбор языка |
lib/preload-app.cjs | подписи меню-бара «Приложение» / «Правка» |
lib/preload-welcome.cjs | окно входа и приветствия |
Что происходит само:
lib/index.js) проверяет архив
приложения; если русского словаря там нет, она готовит исправленный архив
рядом (app.asar.locale-ru.new). Это обычная запись файла — приложение
продолжает работать как обычно.launch-dsh-ru.vbs) применяет подготовленный архив тогда, когда
приложение ещё не запущено, и затем запускает DeepSeek Harness. Поэтому после
обновления DSH достаточно запускать приложение как обычно — перевод вернётся сам.Чтобы это работало, ярлыки DeepSeek Harness должны указывать на лаунчер:
# один раз; исходные ярлыки сохраняются рядом как *.lnk.before-locale-ru
pwsh -File dsh-locale-ru\tools\install-launcher.ps1
# откат ярлыков
pwsh -File dsh-locale-ru\tools\install-launcher.ps1 -Restore
Ручные способы (если ярлыки менять не хочется):
.\apply-shell-ru.cmd # применить сразу (DeepSeek Harness должен быть закрыт)
.\watch-shell-ru.cmd # сторож: применит в момент закрытия приложения
.\restore-shell-ru.cmd # вернуть исходный app.asar
Сторож — тот же скрипт в режиме --swap-when-free: он проверяет подготовленный
архив, а затем каждые 2 секунды пытается его подменить, пока Windows не отдаст
файл (то есть ровно в момент выхода приложения). По умолчанию ждёт 12 часов;
результат виден в окне и в shell-patch.log.
Скрипт осторожен по устройству: каждая правка — замена точного фрагмента текста,
который обязан найтись, иначе ничего не меняется; пересобранный архив проверяется
побайтово по всем записям (меняться могут только три файла), а каждый
исправленный файл проходит node --check. Исходный архив сохраняется рядом как
app.asar.before-locale-ru.
Важно: обновление DSH заменяет app.asar и возвращает английский. Пакет
подготовит патч заново, лаунчер применит его при следующем запуске. Это
неофициальный патч файлов приложения, поэтому он не заменяет исправление на
стороне DSH (оболочке не хватает русской таблицы).
Не включайте пакет одновременно с другой русской локализацией DSH (например, с
одноимённым плагином из npm от другого автора): язык ru регистрируется один
раз, и второй плагин не загрузится. Если русский язык уже есть в «Настройки →
Общие → Язык» до включения пакета — сначала отключите другой плагин.
Loading plugins…, Failed to load plugins) зашит в бандл оболочки и
плагином не переводится — он виден доли секунды при первом открытии страницы.{en, zh} и разрешаются вне словарей
клиента, поэтому для них показывается английский вариант.{count} переведены нейтральными
конструкциями вида «Файлы ({count})», «Выбрано: {count}».node tools/verify.mjs
Скрипт загружает lib/client.js так же, как это делает браузерная система
модулей, монтирует плагин на подставной ctx и проверяет: идентификатор строки
модуля совпадает с именем пакета, бандл самодостаточен, язык ru зарегистрирован
с откатом на en, все 58 пространств имён зарегистрированы, все 2615 ключей
источника переведены и множества подстановок {...} совпадают с английскими.