← Back to home@Balla1ore

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.ymlPatch-слой набора: вставляет собственную строку плагина
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             # установить

Скрипт:

  1. копирует пакет в <DSH_HOME>\profiles\<профиль>\plugins\dsh-locale-ru;

  2. добавляет в <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окно входа и приветствия

Что происходит само:

  1. При запуске хостовая половина пакета (lib/index.js) проверяет архив приложения; если русского словаря там нет, она готовит исправленный архив рядом (app.asar.locale-ru.new). Это обычная запись файла — приложение продолжает работать как обычно.
  2. Лаунчер (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 ключей источника переведены и множества подстановок {...} совпадают с английскими.