@ragnoryok1/dsh-client-locale-ru 0.2.13 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1556 -1370
- package/NAMESPACES.md +504 -50
- package/README.en.md +600 -598
- package/README.md +599 -608
- package/README.zh.md +296 -293
- package/lib/client.js +54993 -266
- package/lib/index.d.ts +46 -7
- package/lib/index.js +101 -7
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,608 +1,599 @@
|
|
|
1
|
-
<!-- deepseek-harness-meta
|
|
2
|
-
{
|
|
3
|
-
"name": "Russian (ru) language pack for DeepSeek Harness",
|
|
4
|
-
"version": "0.2.
|
|
5
|
-
"tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
|
|
6
|
-
"description": "Full Russian
|
|
7
|
-
"icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
|
|
8
|
-
"compatible_versions": ["v0.2.1-rc.2", "v0.2.1-rc.1", "v0.2.1-alpha.5", "v0.2.1-alpha.4", "v0.2.1-alpha.3", "v0.2.1-alpha.2", "v0.2.1-alpha.1", "v0.2.0-rc.2", "v0.2.0-rc.1", "v0.1.7-rc.2", "v0.1.7-rc.1", "v0.1.7-alpha.2"],
|
|
9
|
-
"screenshots": "images",
|
|
10
|
-
"install_method": "dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru"
|
|
11
|
-
}
|
|
12
|
-
-->
|
|
13
|
-
|
|
14
|
-
# @ragnoryok1/dsh-client-locale-ru
|
|
15
|
-
|
|
16
|
-
**Русский** | [English](README.en.md) | [中文](README.zh.md)
|
|
17
|
-
|
|
18
|
-

|
|
19
|
-
|
|
20
|
-
[](https://www.npmjs.com/package/@ragnoryok1/dsh-client-locale-ru)
|
|
21
|
-
[](LICENSE)
|
|
22
|
-
[](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
|
|
23
|
-
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
24
|
-
[ — что было в каждом выпуске.
|
|
1
|
+
<!-- deepseek-harness-meta
|
|
2
|
+
{
|
|
3
|
+
"name": "Russian (ru) language pack for DeepSeek Harness",
|
|
4
|
+
"version": "0.2.15",
|
|
5
|
+
"tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
|
|
6
|
+
"description": "Full Russian (ru) interface for the DeepSeek Harness web GUI: 584 namespaces, 67724 strings, 520 third-party plugin dictionaries, Russian screen typography and Russian plural forms, with a locale audit in CI pinned to a harness tag.",
|
|
7
|
+
"icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
|
|
8
|
+
"compatible_versions": ["v0.2.1-rc.2", "v0.2.1-rc.1", "v0.2.1-alpha.5", "v0.2.1-alpha.4", "v0.2.1-alpha.3", "v0.2.1-alpha.2", "v0.2.1-alpha.1", "v0.2.0-rc.2", "v0.2.0-rc.1", "v0.1.7-rc.2", "v0.1.7-rc.1", "v0.1.7-alpha.2"],
|
|
9
|
+
"screenshots": "images",
|
|
10
|
+
"install_method": "dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru"
|
|
11
|
+
}
|
|
12
|
+
-->
|
|
13
|
+
|
|
14
|
+
# @ragnoryok1/dsh-client-locale-ru
|
|
15
|
+
|
|
16
|
+
**Русский** | [English](README.en.md) | [中文](README.zh.md)
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+
|
|
20
|
+
[](https://www.npmjs.com/package/@ragnoryok1/dsh-client-locale-ru)
|
|
21
|
+
[](LICENSE)
|
|
22
|
+
[](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
|
|
23
|
+
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
24
|
+
[](https://github.com/Ragnoryok1/dsh-client-locale-ru)
|
|
25
|
+
[](https://github.com/Ragnoryok1/dsh-client-locale-ru)
|
|
26
|
+
|
|
27
|
+
Русский (`ru`) язык для веб-интерфейса [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`). Пакет регистрирует `ru` как выбираемый язык клиента через сервис локали (`ctx.locale.addLanguage`) и везёт по словарю на каждый namespace — 584 namespace, 67 724 строки, сборка под dsh `0.2.1-rc.2`. Установка: `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru`, затем **Русский** в Settings → General. Недостающие ключи падают в английский, поэтому более новый харнесс продолжает работать. Область — собственный интерфейс харнесса (64 namespace и 2 996 строк) и словари 520 сторонних плагинов, переведённые с английского, который публикует сам плагин (64 728 строк всего). MIT, поддерживается сообществом, не связан с DeepSeek.
|
|
28
|
+
|
|
29
|
+
> **If the pack was useful to you, please star the repository.** It is the only signal that a
|
|
30
|
+
> translation is wanted, and it is what decides which parts get worked on next.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
Полный список переведённого — в [NAMESPACES.md](NAMESPACES.md): 584 namespace, 67 724 строки, словари плагинов помечены отдельно.
|
|
35
|
+
|
|
36
|
+
Плагины за пределами дерева харнесса переводятся так же, но их английский текст берётся из собственной публикации: `plugins/<namespace>.json` хранит пакет, версию, лицензию и строки, выгруженные из бандла. Что осталось английским в вашей установке, покажет `npm run report:plugins`: он обходит `node_modules` профиля, находит у каждого плагина его собственный словарь и сверяет ключи с нашими, а плагин без словаря так и помечает — переводить нечего, пока он не спросит перевод.
|
|
37
|
+
|
|
38
|
+
Отдельно стоит сказать про семейство `@linxin666`: тринадцать словарей, и каждый переведён целиком — от нескольких десятков строк до четырёх сотен.
|
|
39
|
+
|
|
40
|
+
| Словарь | Пакет | Строк |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `update` | `@linxin666/dsh-update` | 43 |
|
|
43
|
+
| `git-graph` | `@linxin666/dsh-client-ui-git-graph` | 63 |
|
|
44
|
+
| `dsh-web-ui-usage` | `@linxin666/dsh-usage` | 67 |
|
|
45
|
+
| `dsh-web-ui-session-archive` | `@linxin666/dsh-session-archive` | 124 |
|
|
46
|
+
| `pet` | `@linxin666/dsh-pet` | 81 |
|
|
47
|
+
| `remote` | `@linxin666/dsh-remote-web-ui` | 117 |
|
|
48
|
+
| `dsh-skill-explorer` | `@linxin666/dsh-client-ui-skill-explorer` | 114 |
|
|
49
|
+
| `dsh-web-ui-market` | `@linxin666/dsh-client-ui-market` | 106 |
|
|
50
|
+
| `liangshen` | `@linxin666/dsh-liangshen` | 42 |
|
|
51
|
+
| `dsh-web-ui-preset-center` | `@linxin666/dsh-client-ui-preset-center` | 46 |
|
|
52
|
+
| `dsh-ssh` | `@linxin666/dsh-ssh` | 158 |
|
|
53
|
+
| `task-board` | `@linxin666/dsh-client-ui-task-board` | 439 |
|
|
54
|
+
| `task-board-github` | `@linxin666/dsh-client-ui-task-board-github` | 113 |
|
|
55
|
+
| **Итого** | 13 словарей | **1 513** |
|
|
56
|
+
|
|
57
|
+
Названия и описания самих плагинов на странице «Плагины» пакет перевести не может: харнесс хранит их в `locale/<язык>.json` внутри каждого пакета и собирает из них карту перевода, а `resolveText` в сервисе локали словари не спрашивает вовсе. У 221 пакета есть `locale/en.json`, у 219 — `locale/zh.json`, и **ни у одного нет `locale/ru.json`**: эти 261 строка остаются английскими при любом языковом пакете. Разрыв считает `scripts/descriptor-coverage.mjs`, разбор механизма и 32 готовых перевода — в [docs/descriptor-upstream.md](https://github.com/Ragnoryok1/dsh-client-locale-ru/blob/main/docs/descriptor-upstream.md).
|
|
58
|
+
|
|
59
|
+
Чужой перевод мы не копируем: сверять его было бы не с чем, а аудит сравнивает наше значение с английским шаблоном того же плагина. И одно предупреждение на будущее: если в профиле окажется второй пакет, который сам регистрирует русский, язык достанется тому, кто зарегистрировал его первым, — второй молча пропустит свои namespace, и в интерфейсе будет чужой перевод.
|
|
60
|
+
|
|
61
|
+
## Как это выглядит
|
|
62
|
+
|
|
63
|
+
Русский в списке языков и переведённые разделы настроек (снимки сделаны в сборке `0.1.8`:
|
|
64
|
+
тот же экран, но формулировки и часть разделов с тех пор изменились — например, подпись
|
|
65
|
+
размера шрифта теперь «Влияет только на содержимое диалога»):
|
|
66
|
+
|
|
67
|
+

|
|
68
|
+
|
|
69
|
+

|
|
70
|
+
|
|
71
|
+
Оба снимка обрезаны по левой границе панели: в кадр не попадают названия рабочих
|
|
72
|
+
пространств и сессий.
|
|
73
|
+
|
|
74
|
+
Пакет — не только словарь. Сверх перевода он делает три вещи: приводит текст к русской экранной типографике («ёлочки», тире с пробелами, одно многоточие вместо трёх точек), выбирает формы числа по `Intl.PluralRules('ru')` вместо нейтральных подписей и подставляет русские названия тем плагинам, чей пакет не везёт своей локали.
|
|
75
|
+
|
|
76
|
+
Каждый проход можно выключить, не трогая перевод: в строке профиля `cordis.yml` достаточно `config: { typography: false }`, так же отключаются `plurals` и `pluginNames`. Пропущенный переключатель считается включённым, поэтому существующий профиль править не нужно.
|
|
77
|
+
|
|
78
|
+
Типографика — единственный проход, который переписывает введённый вами текст. Если она мешает в поле ввода, выключайте именно её: остальное останется русским.
|
|
79
|
+
|
|
80
|
+
## Установка
|
|
81
|
+
|
|
82
|
+
Это **гибридный плагин** (`dsh.bundle` + `dsh.client`), поэтому он ставится как обычный профиль-бандл через `dsh plugin`:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Дальше при следующем старте `dsh web` в настройках появится **Русский**. Отдельно `pnpm add` в собранный `dsh web` не нужен — плагин тянет штатную локаль через сервис `locale`.
|
|
89
|
+
|
|
90
|
+
Если pnpm отвечает `ERR_PNPM_NO_MATURE_MATCHING_VERSION` — это не поломка пакета, а
|
|
91
|
+
политика зрелости: профиль не ставит версии, опубликованные меньше 48 часов назад.
|
|
92
|
+
Подождите сутки-двое (имя версии в сообщении показывает, сколько осталось) или снимите
|
|
93
|
+
ограничение `minimumReleaseAge` в настройках профиля.
|
|
94
|
+
Манифест проверяется по правилам харнесса, а не на глаз (`npm run check:manifest`, входит в
|
|
95
|
+
`verify`). Правила вычитаны из его исходников и каждое — это отказ, который иначе увидел бы
|
|
96
|
+
пользователь: `parseDshClient` принимает `platform` любой строкой, но потребители отбирают
|
|
97
|
+
только `platform === 'web'`, поэтому опечатка `'Web'` **молча выключила бы** клиентскую
|
|
98
|
+
половину; declared `dsh.client` без экспорта `./client` заставляет `client-modules` бросить
|
|
99
|
+
ошибку; `dsh.bundle.patch` обязан указывать на существующий файл.
|
|
100
|
+
|
|
101
|
+
Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 2022 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
|
|
102
|
+
|
|
103
|
+
## Почему гибрид
|
|
104
|
+
|
|
105
|
+
`dsh web` берёт клиентские (UI) плагины только из **workspace-пакетов**, а внешний npm-пакет с одним `dsh.client` не подхватывается. Чтобы внешний плагин с UI-частью был устанавливаемым, он должен объявлять **`dsh.bundle`** (профиль-слой), чей `cordis.patch.yml` через `- insert:` добавляет клиентскую строку `locale-ru` в браузерный ростер. Так устроены и другие сторонние плагины (например `@zseven-w/dsh-android`).
|
|
106
|
+
|
|
107
|
+
## Как это работает
|
|
108
|
+
|
|
109
|
+
- **Хост-половина** (`lib/index.js`) — пустой `apply()`: языковому плагину не нужна серверная логика, она лишь даёт корректную cordis-строку для Loader.
|
|
110
|
+
- **Браузерная половина** (`lib/client.js`) — регистрирует `ru` и словари через сервис `locale` (инжект из `ctx`). Рантайм-импортов фреймворка нет — только сервис.
|
|
111
|
+
- **Рантайм-зависимостей нет** — `lib/client.js` не импортирует другие пакеты, поэтому не тянет тяжёлых зависимостей.
|
|
112
|
+
- **Эффекты** — язык и словари регистрируются через `ctx.effect(...)`, поэтому выгружаются вместе с плагином (HMR-безопасно).
|
|
113
|
+
- **Плюралы** — контракт локали не несёт правил плюрализации: компоненты выбирают форму
|
|
114
|
+
как `count === 1 ? 'ключ.one' : 'ключ.other'`, а русскому нужны три (1 вызов /
|
|
115
|
+
2 вызова / 5 вызовов). Пакет берёт это на себя: рядом с `.one` и `.other` в словарях
|
|
116
|
+
лежат `.few` и `.many`, а обёртка над `translate` рантайма пересчитывает форму через
|
|
117
|
+
`Intl.PluralRules('ru')` для любого вызова с числовым `count` или `n`. Форму решает
|
|
118
|
+
число, а не ключ, который выбрал компонент, поэтому «2 вызова инструментов» и
|
|
119
|
+
«5 вызовов инструментов» получаются из одного и того же места вызова. Формы есть не
|
|
120
|
+
только у парных ключей: если харнесс передаёт число ключу **без** пары (`terminal.expand`
|
|
121
|
+
с `{n}`), пакет добавляет к нему свои `.one` / `.few` / `.many` — «Показать ещё 1 строку /
|
|
122
|
+
3 строки / 7 строк», — а обёртка ищет форму и для таких ключей. Там, где форма неуместна
|
|
123
|
+
(в предложении несколько чисел), значение переписано нейтрально к числу: «Символов: {total}»
|
|
124
|
+
вместо «{total} символов», «файлов: {files}» вместо «{files} файлов». Проверяется скриптом:
|
|
125
|
+
`npm run check:plural` на счетах 0, 1, 2, 3, 5 и 22, на ключе без пары, на дробном числе
|
|
126
|
+
и на чужом языковом пакете, чьи формы наши правила не переписывают.
|
|
127
|
+
- **Фолбэк** — отсутствующий русский ключ падает на `en` (настроенный `fallback`).
|
|
128
|
+
|
|
129
|
+
## Типографика
|
|
130
|
+
|
|
131
|
+
Пакет приводит уже отрисованный русский текст к типографским правилам: «ёлочки» вместо
|
|
132
|
+
прямых кавычек, длинное тире вместо дефиса между словами, многоточие вместо трёх точек,
|
|
133
|
+
неразрывный пробел между числом и следующим словом или единицей измерения (чтобы «187
|
|
134
|
+
плагинов» не разрывалось на две строки) и такой же пробел после короткого слова — предлога,
|
|
135
|
+
союза или частицы: «в режим» переносится целиком, а не оставляет «в» висеть в конце строки.
|
|
136
|
+
Правила намеренно осторожны: срабатывают только на однозначных шаблонах, а код, поля ввода,
|
|
137
|
+
редактируемый текст и элементы с `data-typography="off"` не трогаются вообще. Повторный
|
|
138
|
+
проход ничего не меняет.
|
|
139
|
+
|
|
140
|
+
Сам проход видит только текстовые узлы, а значение из словаря попадает и в атрибуты —
|
|
141
|
+
`title`, `aria-label`, `placeholder`, — до которых он не достаёт. Поэтому значения
|
|
142
|
+
проверяются отдельно: в пакете не может быть прямых кавычек, дефиса вместо тире, тире без
|
|
143
|
+
пробела или трёх точек. Иначе одна и та же строка выглядела бы по-разному в зависимости от
|
|
144
|
+
того, куда её поставили, а в подсказке и в подписи для скринридера правила бы не работали
|
|
145
|
+
вовсе.
|
|
146
|
+
|
|
147
|
+
Текст, который меняется **после** первого прохода — счётчики токенов, таймеры, прогресс, —
|
|
148
|
+
обрабатывается заново: живое «4 с» сохраняет неразрывный пробел. Это проверяется на настоящем
|
|
149
|
+
документе, а не только на строках: `npm run check:typography:dom` (jsdom, шесть случаев —
|
|
150
|
+
первый проход, изменение текста, добавленное поддерево, остановка при выгрузке, чужой язык и
|
|
151
|
+
переключение языка).
|
|
152
|
+
|
|
153
|
+
Проход включается **только пока активен русский**: правила русские, и применять их к другому
|
|
154
|
+
языку значило бы править текст, который пакету не принадлежит — в английском интерфейсе
|
|
155
|
+
`"quotes"` превратились бы в «quotes». Пакет слушает `locale/change` и запускает или
|
|
156
|
+
останавливает проход при переключении, а не при установке.
|
|
157
|
+
|
|
158
|
+
Правило для числовых диапазонов («5–10» через среднее тире) **сознательно не добавлено**:
|
|
159
|
+
единственная строка с дефисом между числами во всём пакете — пример cron-выражения
|
|
160
|
+
`0 9 * * 1-5`, и тире его испортило бы. Измерено, а не предположено.
|
|
161
|
+
|
|
162
|
+
Правила проверяются скриптом, а не на глаз: `npm run check:typography`.
|
|
163
|
+
|
|
164
|
+
## Имена плагинов
|
|
165
|
+
|
|
166
|
+
Название плагина приходит из его собственного файла `locale/<язык>.json`, а служба локализации
|
|
167
|
+
разрешает эту карту, не обращаясь к зарегистрированным словарям: её собственная документация
|
|
168
|
+
говорит «maps do not consult registered dictionaries». Поэтому словарём название плагина не
|
|
169
|
+
перевести — у пакета нет доступа к чужой карте, и английское название остаётся английским,
|
|
170
|
+
пока сам плагин не привезёт `locale/ru.json`.
|
|
171
|
+
|
|
172
|
+
Пакет несёт эти названия сам: названия 32 плагинов харнесса и названия с описаниями 33
|
|
173
|
+
сторонних плагинов, чьи словари он переводит. У каждого — английский текст, из которого сделан
|
|
174
|
+
перевод, и русский. Отрисованный интерфейс проходит через проход, который подставляет
|
|
175
|
+
русский текст на место английского: в карточках плагинов, в строках состава bundle, на
|
|
176
|
+
странице плагина и в реестре настроек. Подменяется и имя для скринридера (`aria-label`),
|
|
177
|
+
чтобы карточка читалась по-русски целиком.
|
|
178
|
+
|
|
179
|
+
Проход берёт только точное совпадение: строка целиком равна названию или описанию из пакета.
|
|
180
|
+
Предложение, в котором название лишь упомянуто, остаётся как было; код, поля ввода и переписка
|
|
181
|
+
не трогаются. Как и типографский проход, он работает только пока активен русский.
|
|
182
|
+
|
|
183
|
+
Те же 32 названия уходят в харнесс отдельным патчем (`docs/harness-descriptors-ru.patch`): в
|
|
184
|
+
интерфейсе самого харнесса плагины называются по-русски, и патч этот до начала. Патч —
|
|
185
|
+
собираемый артефакт: он строится из переводов и дерева харнесса, а гейт
|
|
186
|
+
`npm run check:descriptor-patch` падает, когда собранный и лежащий в репозитории разошлись.
|
|
187
|
+
Сторонние названия лежат в `src/client/plugin-names-ru.json`: файл собирается из
|
|
188
|
+
выгруженных словарей плагинов (`npm run build:plugin-names`), а гейт
|
|
189
|
+
`npm run check:plugin-names:map` падает, когда карта разошлась со словарями. Одно и то же
|
|
190
|
+
английское название не может быть переведено дважды — по-разному у харнесса и у плагина.
|
|
191
|
+
`npm run check:plugin-names` доказывает на настоящем документе (jsdom, 12 случаев), что проход
|
|
192
|
+
переводит название, описание, имя для скринридера и строку bundle — и не трогает то, что не
|
|
193
|
+
должен.
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
## Проверки
|
|
197
|
+
|
|
198
|
+
```sh
|
|
199
|
+
npm run build # сборка трёх выходов
|
|
200
|
+
npm run check:typography # 18 правил типографики, включая «не трогать»
|
|
201
|
+
npm run check:locale # сосуществование словарей: 6 проверок
|
|
202
|
+
npm run check:plural # формы числа: 1 вызов / 2 вызова / 5 вызовов
|
|
203
|
+
npm run check:composition # собранные фразы: «Пн, Ср в 09:00», «Раз в 2 дня»
|
|
204
|
+
npm run check:namespaces # NAMESPACES.md совпадает с собранным бандлом
|
|
205
|
+
npm run check:tarball # что установят: архив распаковывается и проверяется
|
|
206
|
+
npm run check:workflows # оба workflow запускают всю цепочку verify
|
|
207
|
+
npm run check:readmes:pairs # три README двигаются вместе (хеши разделов)
|
|
208
|
+
npm run check:plugin-names # названия плагинов по-русски на настоящем документе
|
|
209
|
+
npm run check:descriptor-patch # патч для харнесса совпадает с переводами
|
|
210
|
+
npm run audit -- <дерево харнеса> # аудит локали
|
|
211
|
+
npm run verify -- <дерево харнеса> # всё вместе
|
|
212
|
+
|
|
213
|
+
npm run namespaces # перегенерировать NAMESPACES.md и pack-count.json
|
|
214
|
+
npm run readmes:record # перезаписать хеши разделов после правки трёх README
|
|
215
|
+
npm run diff:harness -- <старое> <новое> # что харнесс переформулировал
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Отдельная проверка складывает фразы так, как это делает харнесс, и читает результат
|
|
219
|
+
целиком. Аудит сверяет значение с его собственным шаблоном, поэтому фраза, верная в
|
|
220
|
+
одиночку, но сломанная подстановкой, для него невидима: `frequency.weekly` был переведён
|
|
221
|
+
как «По {weekdays} в {time}», а дни приходят как «Пн, Ср» — получалось «По Пн, Ср в 09:00»,
|
|
222
|
+
чего не увидит ни одна построчная проверка. Так же проверяются «Каждые 2 дня» (теперь «Раз в
|
|
223
|
+
2 дня»), «Каждый день в 09:00 (Europe/Moscow)» и составной интервал с формами числа.
|
|
224
|
+
Третье, что нашлось этим же способом: `time.locale` — не текст, а тег для `Intl`, и он был
|
|
225
|
+
`en`. Правило с ограничением по месяцу показывало «Каждый день в January», а подпись
|
|
226
|
+
часового пояса — «Moscow Standard Time» в русском интерфейсе. Теперь тег `ru` (у китайского
|
|
227
|
+
словаря харнесса точно так же `zh-CN`), а месяц встаёт в скобки: «Каждый день (январь,
|
|
228
|
+
март)».
|
|
229
|
+
|
|
230
|
+
Тот же разбор по частям нашёлся в описании cron. Там были сокращения («Каждые {step} мин»,
|
|
231
|
+
«Каждые {count} ч») и книжные обороты («в минуту {minutes}», «минуты {minutes} в часы
|
|
232
|
+
{hours}»). Счётные части получили формы числа — «Каждые 3 минуты» / «Каждые 5 минут»,
|
|
233
|
+
«Каждые 2 часа» / «Каждые 6 часов», — а остальные части переписаны в один читаемый вид с
|
|
234
|
+
метками: «Каждый час, минуты: 5, 30», «минуты: 5, часы: 09–17». Вся фраза расписания
|
|
235
|
+
складывается проверкой целиком: «Пн–Пт каждые 5 минут». Тем же способом закреплены даты: отметка «5 окт. 2026 г., 15:51» и подпись пояса «Москва, стандартное время» — из Intl с нашим тегом, без единого латинского слова.
|
|
236
|
+
|
|
237
|
+
Аудит выполняется в CI (`.github/workflows/verify.yml`) против **закреплённого тега**
|
|
238
|
+
харнеса, а не против случайного локального чекаута. Раз в неделю тот же прогон запускается
|
|
239
|
+
по расписанию: перевод гниёт и без наших правок — харнесс уезжает вперёд, локально всё
|
|
240
|
+
зелено, а расхождение всплывает только при сборке у пользователя. Гейтами проверяются
|
|
241
|
+
полнота (ключи и namespace), формы числа, плейсхолдеры, остатки английского и китайского,
|
|
242
|
+
терминология, латиница в прозе, гигиена текста, краевые пробелы, стиль, типографика значений,
|
|
243
|
+
«ё», составные фразы, длина подписей в боковой панели и заявленные числа — и каждая из этих
|
|
244
|
+
проверок уже ловила настоящие дефекты. Рядом аудит печатает **справочные
|
|
245
|
+
отчёты**, которые гейтом не являются, потому что требуют решения человека: сколько
|
|
246
|
+
namespace сверено и какие не удалось привязать, остались ли места «число + склоняемое
|
|
247
|
+
слово», и не выросли ли короткие строки больше чем в 2,8 раза от английского (риск для
|
|
248
|
+
вёрстки — «Effort» → «Уровень рассуждения» это нормальная длина русского, а не дефект).
|
|
249
|
+
|
|
250
|
+
Шаблоны харнесса аудит читает в том виде, в каком их пишут: строкой, **массивом абзацев**
|
|
251
|
+
(так хранятся руководства режимов) и **ссылкой на константу** (`'hint.plan':
|
|
252
|
+
PLAN_NEXT_ACTION_EN`). Пока читался только первый вид, десять ключей — восемь из них целые
|
|
253
|
+
руководства — молча выпадали из сверки. И наоборот: пустой файл политики (`keep-english.json`,
|
|
254
|
+
пустой раздел `terminology.json`) теперь валит аудит, а не ослабляет гейт незаметно. Так же
|
|
255
|
+
сверяются и числа, которые README о себе заявляют: устаревший счётчик — это просто неверное
|
|
256
|
+
утверждение, и аудит читает его из бейджа, описания и текста всех трёх README, а также из
|
|
257
|
+
описания в `package.json` — того, что npm показывает в поиске и на странице пакета (там
|
|
258
|
+
дольше всех жило «55 namespaces»), включая
|
|
259
|
+
разряды («2,542 строки») — именно эта запись дольше всех держала в себе число 2,489, пока
|
|
260
|
+
гейт видел только форму без разрядов. Там же сверяется и фраза о том, против какой версии
|
|
261
|
+
харнесса пакет собран: она сравнивается с тегом, закреплённым в workflow, потому что
|
|
262
|
+
проверяет пакет именно он (оба README обещали `0.2.1-alpha.2`, когда CI уже стоял на
|
|
263
|
+
`dsh-v0.2.1-rc.2`). Там же меряется и размер публикуемого пакета: `npm run check:size`
|
|
264
|
+
собирает архив и сравнивает заявленные килобайты с настоящими (допуск в один килобайт — gzip
|
|
265
|
+
на разных сборках Node сжимает чуть иначе, а сама фраза округлена до целых килобайт).
|
|
266
|
+
|
|
267
|
+
- **мёртвые namespace** — каждый namespace, который регистрирует пакет, обязан
|
|
268
|
+
существовать в харнессе. В 0.1.6 переводы каталога расписания были зарегистрированы
|
|
269
|
+
под именем `schedule.manager`, тогда как читает их `schedule.catalog`: проверка покрытия
|
|
270
|
+
по ключам при этом рапортовала «всё переведено»;
|
|
271
|
+
- **пары форм числа** — множества `.one`/`.other` должны совпадать, потому что клиент
|
|
272
|
+
выбирает форму как `count === 1 ? '.one' : '.other'`. Этого мало для русского: каждой
|
|
273
|
+
паре нужны ещё `.few` и `.many`, иначе обёртка молча вернётся к нейтральному `.other` и
|
|
274
|
+
вместо «2 дня» покажет «2 д». Проверка сверяет это **по namespace** — обёртка ищет форму
|
|
275
|
+
в том namespace, который спросил, поэтому пара, забытая в одном экране при наличии в
|
|
276
|
+
другом, иначе осталась бы незамеченной. Так нашлись четыре единицы времени
|
|
277
|
+
(`unit.day/hour/minute/second` в `schedule.catalog`) и `trigger` в менеджере задач;
|
|
278
|
+
заодно единицы перестали быть сокращениями («д», «ч», «мин») и получили полные формы в
|
|
279
|
+
нужном падеже — «через 2 дня», «через 5 часов», а «Каждые 2 дня» стало «Раз в 2 дня».
|
|
280
|
+
То же требование действует и для ключей, которые пакет добавил сам (`terminal.expand` и
|
|
281
|
+
родственные: харнесс передаёт им счёт, но пары не заводит) — их формы держатся только
|
|
282
|
+
нами, и потеря одной ничем больше не обнаружилась бы;
|
|
283
|
+
- **плейсхолдеры** — русское значение обязано нести ровно те `{name}`, что и английский
|
|
284
|
+
шаблон ключа: лишний плейсхолдер попадает на экран буквально (`Заняло {duration}7мин 26с`,
|
|
285
|
+
исправлено в #2), а потерянный молча убирает подставленное значение. Для пакетов,
|
|
286
|
+
которые везут только китайский словарь, шаблоном служит `zh`. Наши **собственные формы
|
|
287
|
+
числа** — добавленные `.few`/`.many` и `.one` у ключа, который харнесс не паровал, — в
|
|
288
|
+
харнессе отсутствуют, поэтому сверяются с шаблоном соседней формы того же слова (`.one`/
|
|
289
|
+
`.other`) или самого ключа. Без этого 52 значения не проверялись вовсе: именно так из
|
|
290
|
+
формы может пропасть `{count}`, и на экране останется фраза без числа.
|
|
291
|
+
- **остатки** — значение обязано быть русским: точная копия английского шаблона, китайский
|
|
292
|
+
иероглиф или пустая строка там, где шаблон не пуст, — это ошибка. Копии английского
|
|
293
|
+
допускаются только по решению, записанному в `scripts/keep-english.json` (адреса,
|
|
294
|
+
форматные строки без слов, названия протоколов и инструментов, аббревиатуры), поэтому
|
|
295
|
+
новая недопереведённая строка не проедет молча. Сами решения тоже проверяются: запись,
|
|
296
|
+
которая больше ничего не разрешает, валит сборку — либо ключа в пакете уже нет, либо
|
|
297
|
+
значение перевели и решение устарело. Так нашлась запись про `deepSeekBaseUrl`: английский
|
|
298
|
+
шаблон обзавёлся пояснением про `DEEPSEEK_BASE_URL`, а подсказка в поле ввода — пример
|
|
299
|
+
адреса, поэтому пояснение на экране было бы мусором внутри поля. Запись убрана, значение
|
|
300
|
+
оставлено. Решение может называть и целый закрытый список: `chat · app.*` разрешает
|
|
301
|
+
тридцать названий приложений одной строкой — словарь имён приложений и есть список имён.
|
|
302
|
+
А значения без слов вне плейсхолдеров (`{from}–{to}`, `{percent}%`, `, `) решения не
|
|
303
|
+
требуют вовсе: переводить в них нечего, и политика остаётся про слова, а не про
|
|
304
|
+
пунктуацию. Сверка остатков читает **все** шаблоны ключа, а не только блок `en`: раньше
|
|
305
|
+
60 значений в словарях с неопознанным блоком не проверялись вовсе, теперь сверено 2911
|
|
306
|
+
значения, 68 из них покрыты решениями (38 записей, одна из них — шаблон), и зона исчезла
|
|
307
|
+
как класс. Шире от этого правило не стало: пустое значение — ошибка только там, где ни
|
|
308
|
+
один шаблон не пуст, иначе русский справедливо опускает префикс, который английский тоже
|
|
309
|
+
опускает (`message.stepProcess.sharedPrefix`). И точное совпадение — не единственный вид
|
|
310
|
+
копии: значение, отличающееся от шаблона только регистром или краевыми пробелами
|
|
311
|
+
(`Cancel` при шаблоне `cancel`), — это тот же непереведённый текст, и оно тоже требует
|
|
312
|
+
решения. Иначе такая строка читалась бы как английская, а все проверки оставались бы
|
|
313
|
+
зелёными.
|
|
314
|
+
- **мёртвые ключи** — ключ, которого нет ни в одном словаре харнесса и на который не
|
|
315
|
+
ссылается ни один его исходник, — это остаток от прежней версии: он ничего не показывает
|
|
316
|
+
и только путает. Такие ключи валят сборку. Ключ, который компонент всё ещё спрашивает,
|
|
317
|
+
остаётся в справочном отчёте: его значение — единственное, что может попасть на экран.
|
|
318
|
+
- **терминология** — одно понятие переводится одним способом. Запрещённые варианты («кеш»
|
|
319
|
+
вместо «кэш», «сеанс» вместо «сессия», «этап» вместо «шаг») валят сборку, а
|
|
320
|
+
`scripts/terminology.json` хранит и решение, и счётчики выбранных форм, чтобы дрейф был
|
|
321
|
+
виден раньше, чем станет дефектом. Проверка сразу нашла ключ `confirm.description`,
|
|
322
|
+
переведённый в двух namespace по-разному — «шаги» и «этапы». Слово не может писаться с «ё»
|
|
323
|
+
и без него: «ещё» и «еще» в одном пакете читаются как машинный перевод, поэтому «ё» внутри
|
|
324
|
+
проверки сводится к «е», и два написания одной формы валят сборку. Исключения — настоящие
|
|
325
|
+
разные слова вроде «все» и «всё»: они объявлены в `scripts/yo-pairs.json`, а запись, чьи
|
|
326
|
+
написания из пакета ушли, тоже валит сборку. Там же проверяется латиница
|
|
327
|
+
внутри русских фраз: имя продукта, команды или код-токен допустимы, простое английское
|
|
328
|
+
слово в предложении — нет. Название продукта обязано писаться так, как его пишет харнесс:
|
|
329
|
+
«Github Desktop» вместо «GitHub Desktop» читается как опечатка в имени продукта, и
|
|
330
|
+
появляется она только у нас. Ориентир — английские шаблоны; слово, которое харнесс пишет
|
|
331
|
+
только строчными («cursor», «desktop»), не считается — там заглавная буква как раз и
|
|
332
|
+
означает имя продукта. Рядом проверяется механическая гигиена: двойные пробелы,
|
|
333
|
+
пробел перед знаком препинания, непарные «ёлочки» и скобки, неразрывный пробел внутри
|
|
334
|
+
значения, а также краевые пробелы — значение, которое начинается или кончается пробелом,
|
|
335
|
+
компонент склеивает с соседним, поэтому оно обязано совпадать с английским шаблоном
|
|
336
|
+
своего namespace. Тем же шаблоном сверяется стиль: если английский кончается знаком,
|
|
337
|
+
русский не должен его терять (на этом проверка нашла `registryCustomHint` без точки),
|
|
338
|
+
а регистр первой буквы обязан совпадать — кроме сокращений вроде `JSON` и шаблонов,
|
|
339
|
+
начинающихся с плейсхолдера. Отдельно проверяется обращение к пользователю: внутри фразы
|
|
340
|
+
русский интерфейс пишет «вы» со строчной, а «Вы» с заглавной — только в начале предложения,
|
|
341
|
+
где это просто орфография. Наконец, пакет сверяется сам с собой: одну и ту же английскую
|
|
342
|
+
фразу он обязан переводить одним способом. Если два namespace дают разные русские
|
|
343
|
+
предложения (считаются шаблоны от четырёх слов — короткая подпись законно зависит от
|
|
344
|
+
контекста), сборка падает. Так нашёлся `confirm.description`: один вариант обещал
|
|
345
|
+
«пропускать шаги подтверждения», другой — «уменьшать число шагов», а английское
|
|
346
|
+
«subsequent tasks» во втором стало «текущей задачей». Намеренное расхождение объявляется
|
|
347
|
+
в `scripts/one-rendering.json` вместе с причиной, и устаревшее исключение тоже валит
|
|
348
|
+
сборку — иначе список решений тихо расширял бы проверку. Обратное направление печатается
|
|
349
|
+
справочно: одинаковый русский ответ на **разные** английские фразы от четырёх слов — это
|
|
350
|
+
след копипасты (подсказка, приехавшая от соседнего ключа) либо два разных факта, слитых в
|
|
351
|
+
одну фразу. Гейтом это быть не может: русский законно сливает слова, которые английский
|
|
352
|
+
различает, — поэтому обе стороны печатаются рядом, и решение принимает человек.
|
|
353
|
+
|
|
354
|
+
За свежестью тега следит отдельный workflow: `watch-upstream` раз в неделю сравнивает
|
|
355
|
+
закреплённый тег с тегами харнесса, при новом открывает issue со списком шагов и красит
|
|
356
|
+
прогон — чтобы отставание находилось по расписанию, а не по чужому скриншоту. Сравнение
|
|
357
|
+
версий проверяется без сети (`npm run check:upstream`: порядок предрелизов, равенство версий,
|
|
358
|
+
переход между линиями) и входит в `verify`:
|
|
359
|
+
релиз должен быть новее собственных предрелизов, иначе дозор срабатывал бы вечно.
|
|
360
|
+
|
|
361
|
+
Число покрытия не является гейтом: часть разделов пакет сознательно оставляет на английском.
|
|
362
|
+
Рядом печатается отчёт **по namespace**: аудит восстанавливает связь «namespace → словарь»
|
|
363
|
+
по тому, кто его регистрирует (`NS` или литерал в `locale.register`; `bind` и `PropsLocale`
|
|
364
|
+
только читают namespace), и показывает ключи, которых нет ни в своём namespace, ни в общем
|
|
365
|
+
`common`, куда рантайм падает при поиске. Глобальное сравнение имён такие дыры не видит:
|
|
366
|
+
перевод, лежащий под чужим namespace, считается покрытием, а экран в это время показывает
|
|
367
|
+
английский. Отчёт справочный — одинаковое имя в разных namespace может значить разное
|
|
368
|
+
(`list.aria` — «Активные напоминания» в каталоге и «Фоновые задачи» в задачах), поэтому
|
|
369
|
+
перевод переносится в чужой namespace только там, где оба namespace обслуживает один и
|
|
370
|
+
тот же словарь. На закреплённом теге отчёт пуст: каждая строка, которую харнесс рисует в
|
|
371
|
+
нашем namespace, лежит именно в нём. Сверяются все 584 namespace пака — привязка строится и по
|
|
372
|
+
импорту словаря рядом с регистрацией, и по именам, которые передаёт сама регистрирующая
|
|
373
|
+
строка (`locale.register(NS, { zh, en })`); без второго правила `common` и `settings.locale`,
|
|
374
|
+
чьи словари лежат в соседнем каталоге, оставались бы вне сверки. Обратная сторона проверяется
|
|
375
|
+
жёстко: namespace, который харнесс регистрирует и наполняет ключами, а пак не регистрирует, —
|
|
376
|
+
это отказ сборки, потому что такой экран остаётся английским, а покрытие по именам ключей
|
|
377
|
+
этого не видит. Так нашёлся `settings.sessionLog` — строка «Загружать журнал сессии» на
|
|
378
|
+
странице общих настроек.
|
|
379
|
+
|
|
380
|
+
## Область покрытия: харнесс и словари плагинов
|
|
381
|
+
Пакет переводит **собственные namespace клиента харнесса** — 64 namespace сверенных с
|
|
382
|
+
закреплённым тегом, — и **словари сторонних плагинов**: 520 плагина, чей английский текст
|
|
383
|
+
выгружен из их собственной публикации вместе с версией и лицензией.
|
|
384
|
+
|
|
385
|
+
Поиск по реестру npm — шесть запросов вместо одного «dsh» — нашёл ещё 40 плагинов со своим
|
|
386
|
+
словарём. 39 из них переведены; три имени (`dsh-automation`, `remote`, `settings.ip-pool`)
|
|
387
|
+
уже заняты словарями других плагинов и оставлены прежним владельцам, чтобы не подменить
|
|
388
|
+
перевод чужого продукта. Итог на 22 октября 2026: **584 namespace, 67 724 значения,
|
|
389
|
+
520 словарей, 47 700 различных русских строк** в собранном пакете. Замер конкурентов тем же
|
|
390
|
+
методом — [docs/competitors.md](https://github.com/Ragnoryok1/dsh-client-locale-ru/blob/main/docs/competitors.md).
|
|
391
|
+
|
|
392
|
+
Раньше словари плагинов в область не входили, и на то была причина: у `dshmarket` уже
|
|
393
|
+
версия 1.66.44, её ключи меняются независимо от харнесса, а молчаливое обещание «покрыто
|
|
394
|
+
всё» — это не обещание, а долг, который нельзя предъявить. Ответ оказался простым: чужой
|
|
395
|
+
английский текст **выгружается** (`npm run fetch:plugins`) и хранится рядом с переводом —
|
|
396
|
+
с именем пакета, версией и лицензией, а аудит сверяет наш перевод именно с этим снимком, а
|
|
397
|
+
не с чужим русским. Мы проверили 17 самых скачиваемых плагинов экосистемы (npm,
|
|
398
|
+
`keywords:dsh-plugin`, скачивания за месяц) и посмотрели, какие из них вообще поставляют
|
|
399
|
+
собственные строки:
|
|
400
|
+
|
|
401
|
+
| Что обнаружено | Плагинов |
|
|
402
|
+
|---|---|
|
|
403
|
+
| **Своих строк нет** — интерфейс берёт текст из namespace харнесса | **11 из 17** |
|
|
404
|
+
| Крупный собственный словарь (подтверждено вручную) | 2 — `dshmarket` (733 ключа), `@nanmicoder/dsh-agent-teams` (420) |
|
|
405
|
+
| Только типы `.d.ts`, строк нет | 1 — `dsh-plugin-model-proxy` |
|
|
406
|
+
| Требует отдельной проверки | 3 |
|
|
407
|
+
|
|
408
|
+
У 11 из 17 популярнейших плагинов русский интерфейс уже работает без отдельного словаря:
|
|
409
|
+
их текст лежит в общих namespace харнесса, которые пакет переводит полностью. Словари
|
|
410
|
+
есть там, где плагин везёт свои строки, — их 32, и у каждого зафиксирована версия, с
|
|
411
|
+
которой выгружен английский текст.
|
|
412
|
+
|
|
413
|
+
Такой словарь — обязательство следить за чужими релизами, но теперь оно проверяемое:
|
|
414
|
+
новая версия плагина с другими ключами видна как расхождение снимка, а не как тишина.
|
|
415
|
+
Нужен конкретный плагин — заведите issue: словарь для него возможен как отдельный слой,
|
|
416
|
+
привязанный к версии, а не как молчаливое обещание «покрыто всё».
|
|
417
|
+
|
|
418
|
+
## Разработка
|
|
419
|
+
|
|
420
|
+
```sh
|
|
421
|
+
pnpm install
|
|
422
|
+
pnpm run build # tsdown -> lib/index.js (node half) + lib/client.js (client bundle)
|
|
423
|
+
npm pack # -> ragnoryok1-dsh-client-locale-ru-<version>.tgz
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
`lib/client.js` собирается в формате, который понимает клиентский загрузчик `dsh` (`__ModuleLoader__.load`), и экспортирует `inject`/`apply`.
|
|
427
|
+
|
|
428
|
+
## Релизы
|
|
429
|
+
|
|
430
|
+
Публикация в npm выполняется workflow `publish` по тегу — учётные данные лежат в секрете
|
|
431
|
+
репозитория (`NPM_TOKEN`), поэтому токен не нужно ни вводить в терминал, ни пересылать.
|
|
432
|
+
Ручная публикация с машины возможна, но не нужна.
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
npm version 0.3.0 --no-git-tag-version # поднять версию в package.json
|
|
436
|
+
# …и синхронно обновить версию в блоке deepseek-harness-meta в этом README
|
|
437
|
+
git commit -am "release: 0.3.0" && git tag v0.3.0 && git push origin v0.3.0
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
Перед публикацией workflow проверяет:
|
|
441
|
+
|
|
442
|
+
1. версия в теге совпадает с версией в `package.json`;
|
|
443
|
+
2. версия в блоке `deepseek-harness-meta` совпадает с `package.json` — маркетплейс берёт её оттуда,
|
|
444
|
+
причём читает **только при первой индексации**, поэтому расхождение не исправляется само;
|
|
445
|
+
3. типографику (18 правил);
|
|
446
|
+
4. аудит локализации против закреплённого тега харнесса — мёртвые namespace, дубли и пары форм
|
|
447
|
+
числа упадут и остановят публикацию;
|
|
448
|
+
5. **совместимость со всеми версиями из `compatible_versions`**: для каждой скачивается её
|
|
449
|
+
рантайм локали с npm и против него прогоняются три набора — сосуществование языков, формы
|
|
450
|
+
числа и собранные фразы (`npm run check:compat`, входит в CI) — обещание в meta-блоке
|
|
451
|
+
проверяется, а не подразумевается.
|
|
452
|
+
|
|
453
|
+
Отдельно проверяется само **объявление** совместимости (`npm run check:peers`, входит в
|
|
454
|
+
`verify`): харнесс читает наши `peerDependencies` для `@deepseek-ai/dsh*` не как версии пакетов,
|
|
455
|
+
а как диапазон **версий рантайма** и с `includePrerelease` — и если диапазон не удовлетворит
|
|
456
|
+
работающий dsh, пользователь увидит предупреждение о несовместимости и запрос на исключение.
|
|
457
|
+
Скрипт прогоняет это правило харнесса по всем заявленным версиям: сейчас проходят все восемь.
|
|
458
|
+
|
|
459
|
+
Проверить всё то же локально, без публикации:
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
npm run verify -- путь/к/дереву/харнесса
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
Для workflow есть ручной запуск с переключателем «только проверки, без публикации»
|
|
466
|
+
(`workflow_dispatch` → `dry-run`).
|
|
467
|
+
|
|
468
|
+
## Содержимое
|
|
469
|
+
|
|
470
|
+
- `src/client/dicts.ts` — русские словари (584 namespaces, 67724 перевод, ~68 000 строк). Это и есть основная ценность.
|
|
471
|
+
- `src/client/index.ts` — точка входа клиентского плагина (регистрация `ru` + словарей).
|
|
472
|
+
- `src/index.ts` — пустая host-половина (`apply()`).
|
|
473
|
+
- `cordis.patch.yml` — профиль-патч (`- insert:` клиентской строки `locale-ru`).
|
|
474
|
+
|
|
475
|
+
## Что переведено
|
|
476
|
+
|
|
477
|
+
Актуальный набор — по тегам харнеса: ключи сняты с профильного коммита, а добавленные
|
|
478
|
+
позже падают на `en` при поиске, поэтому пакет не ломает интерфейс на новых версиях.
|
|
479
|
+
|
|
480
|
+
### 0.1.7 — исправлен мёртвый namespace, переведён менеджер задач, переписаны числительные
|
|
481
|
+
|
|
482
|
+
Главное в релизе — **исправление ошибки из 0.1.6**. Тогда было записано, что namespace
|
|
483
|
+
`schedule.catalog` упразднён, а его место занял `schedule.manager`. На деле в харнесе
|
|
484
|
+
**оба** namespace живут и по отдельности: `schedule.catalog` — это каталог напоминаний в
|
|
485
|
+
шапке сессии с частотами и единицами, `schedule.manager` — новый менеджер задач
|
|
486
|
+
автоматизации. Из-за неверного вывода ~30 строк переводов (напоминания, частота, единицы
|
|
487
|
+
времени) были зарегистрированы под именем, которое никто не читает, и **никогда не
|
|
488
|
+
показывались** в интерфейсе. Теперь каталог зарегистрирован как `schedule.catalog`.
|
|
489
|
+
|
|
490
|
+
- **исправлено:** переводы каталога расписания снова видны — `trigger.*`, `list.*`,
|
|
491
|
+
`delete.*`, `frequency.*`, `cron.*`, `unit.*`, `relative.*`, `mark.aria`, `hover.more`;
|
|
492
|
+
- **добавлен `schedule.manager`** (188 ключей) — менеджер задач автоматизации целиком на
|
|
493
|
+
русском: панель и каталог задач, поиск, фильтр состояний, сведения о задаче и её вкладки,
|
|
494
|
+
**журнал запусков** с правилами хранения, редактор расписания (дата, время, час, минута,
|
|
495
|
+
секунда, часовой пояс, интервал повтора), правила повтора (разово, каждые N минут/часов/
|
|
496
|
+
секунд, ежедневно, пн–пт, еженедельно, свой cron), cron-форма с выбором дат и минуты,
|
|
497
|
+
удаление с подтверждением, уведомления и карточки;
|
|
498
|
+
- **числительные переписаны** (17 пар ключей): формы, которые ломались на числах 2–4,
|
|
499
|
+
заменены на корректные при любом `n ≥ 2` — например «2 субагентов» → «Субагентов: 2»,
|
|
500
|
+
«каждые 2 часов» → «каждые 2 ч». Ещё 8 строк с `{count}` перед склоняемым словом
|
|
501
|
+
переведены на сокращения: «ещё 3 строк» → «ещё 3 стр.»;
|
|
502
|
+
- **добавлено 7 ключей**, которые отсутствовали: `blocked.composer`,
|
|
503
|
+
`defaultWorkspace.title`, `schedule.active`, `settings.transcript.expanded`,
|
|
504
|
+
`status.scheduled`, `status.overdue` и namespace `shortcuts.layout` (подпись команды
|
|
505
|
+
показа левой панели);
|
|
506
|
+
- **новая проверка в проекте:** аудит имён namespace. Прежняя проверка покрытия
|
|
507
|
+
сверяла ключи внутри namespace, но не сверяла сами имена, поэтому целый namespace
|
|
508
|
+
мог быть зарегистрирован под несуществующим именем и тихо не работать. Теперь имена
|
|
509
|
+
извлекаются из всех способов их объявления (`const NS`/`SETTINGS_NS`/`namespace`,
|
|
510
|
+
`locale.register`, `locale.bind`, `PropsLocale<…>`) и сравниваются множествами.
|
|
511
|
+
|
|
512
|
+
В 0.1.2 добавлены разделы, которых не было в 0.1.1: `open-in-app` («Открыть в
|
|
513
|
+
приложении»), `sidebarFiles`, `sidebarRight` (правый сайдбар с файлами) и
|
|
514
|
+
`sidebarCodePreview` (предпросмотр кода). Также обновлены ключи, изменившиеся в
|
|
515
|
+
харнесе 0.1.5, и удалены 21 ключ, которых в нём больше нет.
|
|
516
|
+
|
|
517
|
+
В 0.1.3 пакет догнал харнес 0.1.6-alpha.1: добавлено 139 ключей и 7 новых
|
|
518
|
+
разделов — `sidebarTerminal` (терминал в правом сайдбаре), `settings.archivedSessions`
|
|
519
|
+
(архивные сессии) и семейство предпросмотра документов (`sidebarDocumentPreview`,
|
|
520
|
+
`documentHtml`, `sidebarImage`, `documentMarkdown`, `sidebarPdf`). Кроме этого
|
|
521
|
+
переведена экспериментальная «Автопроверка» (`permission.access`: `auto.*`),
|
|
522
|
+
подписи и токены палитры команд, поля эндпоинтов в настройках моделей и
|
|
523
|
+
изменения в `conversation`, `trajectory`, `chat`, `session-log-download`.
|
|
524
|
+
28 ключей, исчезнувших из харнеса, удалены.
|
|
525
|
+
|
|
526
|
+
Проверка покрытия выполняется по исходникам харнеса: для каждого namespace
|
|
527
|
+
сравниваются множества ключей, поэтому следующий выпуск начинается с точного
|
|
528
|
+
списка «добавить / проверить / удалить».
|
|
529
|
+
|
|
530
|
+
В 0.1.6 пакет догнал харнес **0.1.7-rc.2**: добавлено **252 ключа**, 18 обновлены,
|
|
531
|
+
26 удалены, добавлены два новых namespace. Изменения:
|
|
532
|
+
|
|
533
|
+
- **`shortcuts`** (новый namespace, 56 ключей) — редактор горячих клавиш: запись
|
|
534
|
+
сочетания, конфликты, зарезервированные комбинации, подсказки для macOS и
|
|
535
|
+
Windows, восстановление значений по умолчанию;
|
|
536
|
+
- **`schedule.manager`** (70 ключей на тот момент) — менеджер задач автоматизации: список,
|
|
537
|
+
удаление, повтор, история запусков, выражения Cron. **Ошибочно было записано, что
|
|
538
|
+
namespace `schedule.catalog` при этом упразднён; в 0.1.7 это исправлено — оба
|
|
539
|
+
namespace существуют параллельно**;
|
|
540
|
+
- **`settings.account`** (50 ключей) — первый запуск приложения: приветствие,
|
|
541
|
+
выбор назначения и глубины показа хода работы, пополнение баланса, выход из
|
|
542
|
+
учётной записи во время выполнения задач;
|
|
543
|
+
- добавлены подписи добавления и удаления инструментов на ходу
|
|
544
|
+
(`message.tools*`, `trajectory.layout.*`), команды правой боковой панели
|
|
545
|
+
(`sidebarRight`), состояния «сначала выберите сессию» в панелях, обновлено
|
|
546
|
+
название раздела настроек: «Инструменты для кода» вместо «Инструментов
|
|
547
|
+
разработчика»;
|
|
548
|
+
- 18 ключей обновлены под изменившийся английский текст, 26 удалены. Единый термин
|
|
549
|
+
«рабочая папка» вместо «рабочей области» в одном месте.
|
|
550
|
+
|
|
551
|
+
В 0.1.5 пакет догнал харнес **0.1.7-rc.1**: добавлено **49 ключей**, 13 обновлены,
|
|
552
|
+
16 удалены, namespace `directory-browser` убран (в rc.1 его больше нет). Появились
|
|
553
|
+
подписи шагов работы инструментов (`message.stepProcess.prepare.*` и `done.*` —
|
|
554
|
+
чтение изображений, запись файлов, подготовка к поиску по коду, веб-поиску,
|
|
555
|
+
координации субагентов и другие), просмотр изображений во весь экран
|
|
556
|
+
(`image.*`), режимы показа ходов «Стандартный» и «Подробный», установка плагинов
|
|
557
|
+
из GitHub с таймаутом и китайским зеркалом, предупреждение о несовместимой версии
|
|
558
|
+
плагина, выбор источника загрузки моделей для голосового ввода и сообщения
|
|
559
|
+
команды `Cordis`. Уточнены формулировки, где upstream заменил «teammate/agent»
|
|
560
|
+
на «subagent», а «Beta» — на «Experimental».
|
|
561
|
+
|
|
562
|
+
Также в 0.1.5 исправлена единица счёта в инвентаре плагинов: было «187 плагины»,
|
|
563
|
+
стало «187 плагинов». Переведены и встроенные снимки интерфейса, добавлены npm
|
|
564
|
+
keywords и исправлен peer-диапазон `@deepseek-ai/dsh-client-locale`
|
|
565
|
+
(`>=0.1.0-rc.2 <0.2.0`) — раньше `^0.1.0` не разрешался, потому что пакет
|
|
566
|
+
публикуется только под prerelease-версиями.
|
|
567
|
+
|
|
568
|
+
В 0.1.4 пакет догнал харнес **0.1.7-alpha.2** — самый крупный скачок: добавлено
|
|
569
|
+
**905 ключей**, 29 изменены, 126 удалены. Новые разделы:
|
|
570
|
+
|
|
571
|
+
- **`pluginManager`** — встроенная панель плагинов: установка, удаление,
|
|
572
|
+
включение и отключение компонентов, версии, реестры и подсказки по установке;
|
|
573
|
+
- **`settings.account`** — учётная запись DeepSeek: вход, баланс, расход,
|
|
574
|
+
API-ключ;
|
|
575
|
+
- отдельные разделы настроек, на которые разъехался прежний `settings.plugins`:
|
|
576
|
+
**`settings.agentLoop`**, **`settings.shell`**, **`settings.subagent`**,
|
|
577
|
+
**`settings.webSearch`**;
|
|
578
|
+
- **`sidebarBrowser`** — встроенный браузер в правой панели (адрес, песочница,
|
|
579
|
+
восстановление страницы);
|
|
580
|
+
- **`sidebarExcel`** и **`sidebarOffice`** — предпросмотр таблиц и документов
|
|
581
|
+
Office; масштабирование (`zoom.*`) добавлено в PDF и изображения;
|
|
582
|
+
- **`voice-input`** — экспериментальный голосовой ввод.
|
|
583
|
+
|
|
584
|
+
Также переведены новые тексты в `conversation` (+194), `chat` (+53),
|
|
585
|
+
`workspace` (+43: архив сессий, закрепление), `deliverables` (+31: обзор
|
|
586
|
+
изменений хода), `job` (+24: живой вывод фоновых задач), `settings` (+22:
|
|
587
|
+
обновление десктопного приложения), `plan`, `open-in-app`, `trajectory`,
|
|
588
|
+
`model`, `reference`, `session-log-download` и в руководствах по режимам
|
|
589
|
+
агента (`settings.agentPreset`, 12 длинных текстов). Раздел
|
|
590
|
+
`settings.archivedSessions` удалён: в 0.1.7 upstream убрал этот пакет, а архив
|
|
591
|
+
сессий переехал в `workspace`.
|
|
592
|
+
|
|
593
|
+
## Лицензия
|
|
594
|
+
|
|
595
|
+
MIT
|
|
596
|
+
|
|
597
|
+
## История изменений
|
|
598
|
+
|
|
599
|
+
[CHANGELOG.md](CHANGELOG.md) — что было в каждом выпуске.
|