dsh-locale-ru
Русский язык для DeepSeek Harness: 2615 строк веб-интерфейса + 165 строк оболочки (меню, трей, диалоги, окно входа)
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 3, 2026
- Updated
- Oct 3, 2026
Introduction
dsh-locale-ru — русский язык для веб-интерфейса DeepSeek Harness
Клиентский плагин DSH: добавляет в веб-интерфейс язык «Русский» и словари перевода для всех пространств имён, которые поставляет DSH.
- 2615 строк в 58 пространствах имён — это все словари английского и
китайского интерфейса, извлечённые из установленного DSH
0.2.0-rc.2(locales/source-en.json). - Непереведённые строки (например, из более новой версии DSH) автоматически
остаются английскими: у языка объявлена цепочка отката
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 (без архива и без npm)
Страница «Плагины» принимает git-адрес, tarball, абсолютный локальный путь или имя пакета: вставьте адрес репозитория в «Добавить плагин», и DSH установит пакет как набор, который потом можно включать и выключать там же.
Публикация собственного репозитория — tools\publish-github.cmd <адрес репозитория>:
скрипт добавит origin, запушит ветку main, поставит тег v1.0.0 и напомнит про
релиз с архивом. Репозиторий должен существовать и быть пустым; вход в GitHub
подтверждается в окне Git Credential Manager.
Включение языка
Настройки → Общие → Язык → «Русский». Выбор запоминается в настройках DSH.
Профильный HMR перечитывает конфигурацию сам, поэтому перезапуск хоста не нужен; если язык не появился — обновите страницу (F5).
Удаление
node tools/install.mjs --remove
Обновление перевода после обновления DSH
# 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»)
Это единственное место интерфейса, которое живёт вне веб-словарей, и оно разделено на две части:
| Часть | Кто рисует | Переводится плагином? |
|---|---|---|
| Подписи «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}и разрешаются вне словарей клиента, поэтому для них показывается английский вариант. - Нет правил множественного числа. Система локализации DSH не поддерживает
склонения по числам, поэтому строки со
{count}переведены нейтральными конструкциями вида «Файлы ({count})», «Выбрано: {count}». - Медиа и кнопки сторонних библиотек (например, подписи в просмотрщике PDF) могут остаться английскими.
- Плагин не переводит ответы модели и системные подсказки — только интерфейс.
Проверка
node tools/verify.mjs
Скрипт загружает lib/client.js так же, как это делает браузерная система
модулей, монтирует плагин на подставной ctx и проверяет: идентификатор строки
модуля совпадает с именем пакета, бандл самодостаточен, язык ru зарегистрирован
с откатом на en, все 58 пространств имён зарегистрированы, все 2615 ключей
источника переведены и множества подстановок {...} совпадают с английскими.