@goodandready/dsh-russian-lang 0.1.0

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/lib/index.js ADDED
@@ -0,0 +1,20 @@
1
+ // dsh-russian-lang — серверная половина.
2
+ //
3
+ // Словари и переключатель живут в браузере (lib/client.js). Хосту переводить
4
+ // нечего, но у выбора языка есть сохраняемая настройка: регистрируем её схему
5
+ // в собственном namespace, чтобы запись переживала браузеры и машины через
6
+ // штатный механизм настроек DSH.
7
+ import { settingsNamespace } from '@deepseek-ai/dsh-settings'
8
+ import z from '@deepseek-ai/schemastery'
9
+
10
+ export const name = '@goodandready/dsh-russian-lang'
11
+
12
+ const RussianLangSettingsSchema = z.object({
13
+ enabled: z.boolean().required(false)
14
+ })
15
+
16
+ export function apply(ctx) {
17
+ ctx.inject(['settings'], (settingsCtx) => {
18
+ settingsCtx.settings.register(settingsNamespace('russian-lang'), RussianLangSettingsSchema)
19
+ })
20
+ }
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@goodandready/dsh-russian-lang",
3
+ "version": "0.1.0",
4
+ "description": "Russian localization for the DeepSeek Harness web UI: ru dictionaries for core namespaces plus a language switch in Settings - General.",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "exports": {
8
+ ".": "./lib/index.js",
9
+ "./client": "./lib/client.js",
10
+ "./cordis.patch.yml": "./cordis.patch.yml",
11
+ "./package.json": "./package.json"
12
+ },
13
+ "files": [
14
+ "lib",
15
+ "ru",
16
+ "ru-plugins",
17
+ "cordis.patch.yml",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "dsh": {
22
+ "bundle": {
23
+ "patch": "./cordis.patch.yml"
24
+ },
25
+ "client": {
26
+ "platform": "web",
27
+ "inject": [
28
+ "@deepseek-ai/dsh-client-locale",
29
+ "@deepseek-ai/dsh-client-ui-settings"
30
+ ]
31
+ }
32
+ },
33
+ "keywords": [
34
+ "deepseek-harness",
35
+ "dsh",
36
+ "dsh-plugin",
37
+ "i18n",
38
+ "locale",
39
+ "russian"
40
+ ],
41
+ "license": "MIT",
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "dependencies": {
46
+ "@deepseek-ai/schemastery": "^3.18.1"
47
+ },
48
+ "peerDependencies": {
49
+ "@deepseek-ai/cordis": "^4.0.1",
50
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.2"
51
+ },
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/GooDAnDReaDY/dsh-russian-lang.git"
55
+ },
56
+ "homepage": "https://github.com/GooDAnDReaDY/dsh-russian-lang#readme",
57
+ "bugs": {
58
+ "url": "https://github.com/GooDAnDReaDY/dsh-russian-lang/issues"
59
+ }
60
+ }
@@ -0,0 +1,97 @@
1
+ {
2
+ "common": {
3
+ "back": "Назад",
4
+ "cancel": "Отмена",
5
+ "close": "Закрыть",
6
+ "collapse": "Свернуть",
7
+ "copied": "Скопировано",
8
+ "copy": "Копировать",
9
+ "delete": "Удалить",
10
+ "edit": "Изменить",
11
+ "expand": "Развернуть",
12
+ "load.failed": "Не удалось загрузить",
13
+ "loading": "Загрузка…",
14
+ "more": "Ещё",
15
+ "next": "Дальше",
16
+ "none": "Нет",
17
+ "ok": "ОК",
18
+ "previous": "Назад",
19
+ "retry": "Повторить",
20
+ "save": "Сохранить",
21
+ "search": "Поиск",
22
+ "skip": "Пропустить",
23
+ "submit": "Отправить",
24
+ "submitting": "Отправка…",
25
+ "truncated": "Обрезано",
26
+ "unknown": "Неизвестно"
27
+ },
28
+ "sidebar": {
29
+ "session.new": "Новая сессия",
30
+ "session.new.label": "Новая сессия",
31
+ "toggle.collapse": "Свернуть панель",
32
+ "toggle.open": "Открыть панель"
33
+ },
34
+ "settings": {
35
+ "close": "Закрыть",
36
+ "general.nav": "Общие",
37
+ "openDocument": "Открыть файл настроек",
38
+ "openDocument.error": "Не удалось открыть файл настроек",
39
+ "title": "Настройки",
40
+ "trigger": "Настройки"
41
+ },
42
+ "settings.theme": {
43
+ "appearance.dark": "Тёмная",
44
+ "appearance.light": "Светлая",
45
+ "appearance.system": "Как в системе",
46
+ "appearance.title": "Оформление"
47
+ },
48
+ "settings.locale": {
49
+ "language.title": "Язык"
50
+ },
51
+ "plan": {
52
+ "chip.off.aria": "Режим плана выключен, нажмите, чтобы включить",
53
+ "chip.off.title": "Режим плана выключен — нажмите, чтобы включить (/plan)",
54
+ "chip.on.aria": "Режим плана включён, нажмите, чтобы выключить",
55
+ "chip.on.title": "Режим плана включён — нажмите, чтобы выключить (/plan off)"
56
+ },
57
+ "skill": {
58
+ "menu.userOnly": "только вручную",
59
+ "row.failed": "Не удалось загрузить скилл",
60
+ "row.instructions": "Инструкции",
61
+ "row.running": "Загрузка скилла",
62
+ "row.stopped": "Загрузка скилла остановлена"
63
+ },
64
+ "slash.menu": {
65
+ "command": "Команды",
66
+ "loading": "Загрузка…",
67
+ "skill": "Скиллы",
68
+ "subagent": "Субагенты",
69
+ "suggestions.aria": "Подсказки по вводу"
70
+ },
71
+ "deliverables": {
72
+ "produced.label": "Создано",
73
+ "produced.more": "+ {count} файлов",
74
+ "produced.moreOne": "+ 1 файл",
75
+ "produced.open": "Открыть {name}",
76
+ "produced.showInFolder": "Показать в папке"
77
+ },
78
+ "command": {
79
+ "listbox.aria": "Совпадения /{command}",
80
+ "notice.imagesUnsupported": "/{command} не принимает вложения-изображения — сначала удалите их",
81
+ "overlay.aria": "Параметры /{command}",
82
+ "search.aria": "Фильтр параметров",
83
+ "search.placeholder": "Поиск…",
84
+ "status.applying": "Применение…",
85
+ "status.empty": "Нет параметров",
86
+ "status.loading": "Загрузка параметров…"
87
+ },
88
+ "session-log-download": {
89
+ "dialog.close": "Закрыть",
90
+ "dialog.commandFailed": "Не удалось запустить экспорт сессии.",
91
+ "dialog.errorTitle": "Экспорт сессии не удался",
92
+ "dialog.preparingDescription": "Готовится ZIP с этой сессией, её подсессиями и вложениями.",
93
+ "dialog.preparingTitle": "Экспорт сессии",
94
+ "dialog.successDescription": "Браузер загружает ZIP с сессией.",
95
+ "dialog.successTitle": "Загрузка сессии началась"
96
+ }
97
+ }
@@ -0,0 +1,172 @@
1
+ {
2
+ "conversation": {
3
+ "access.confirm.acknowledge": "Я понимаю риски и хочу продолжить",
4
+ "access.confirm.cancel": "Отмена",
5
+ "access.confirm.description": "Полный доступ убирает часть подтверждений и позволяет агенту действовать напрямую, включая чувствительные операции, изменение файлов и внешние команды. Включайте, только если доверяете текущей задаче.",
6
+ "access.confirm.enable": "Включить полный доступ",
7
+ "access.confirm.title": "Включить полный доступ?",
8
+ "approval.allowOnce": "Разрешить один раз",
9
+ "approval.detail.aria": "Подробности запроса",
10
+ "approval.escalation": "Инструмент {toolName} просит повышенных прав",
11
+ "approval.reject": "Отклонить",
12
+ "approval.waiting": "Ожидание подтверждения",
13
+ "ask.answered": "{answered}/{total} отвечено",
14
+ "ask.cancelled": "отменено",
15
+ "ask.interrupted": "прервано",
16
+ "ask.rowTitle": "Вопрос",
17
+ "ask.waiting": "ожидание",
18
+ "bash.failed": "Ошибка",
19
+ "bash.running": "Выполняется",
20
+ "bash.stopped": "Остановлено",
21
+ "chat.loadError": "Не удалось загрузить историю: {message} ({code})",
22
+ "chat.loadOlder": "Загрузить раньше",
23
+ "chat.loadingHistory": "Загрузка истории…",
24
+ "chat.toBottom": "Вниз",
25
+ "clock.md": "{d}.{m}",
26
+ "clock.ymd": "{d}.{m}.{y}",
27
+ "command.done": "Готово",
28
+ "command.failed": "Команда не выполнена",
29
+ "command.imagesUnsupported": "/{command} не принимает вложения-изображения — сначала удалите их",
30
+ "command.running": "Выполняется…",
31
+ "command.title": "Команда",
32
+ "context.aria": "{percent} контекста занято",
33
+ "context.messages": "Сообщения",
34
+ "context.system": "Системный промпт",
35
+ "context.tools": "Инструменты",
36
+ "context.used": "контекста занято",
37
+ "details.close": "Закрыть подробности",
38
+ "details.empty": "Выберите строку инструмента в переписке, чтобы увидеть подробности",
39
+ "details.input": "Вход",
40
+ "details.notInWindow": "Этот вызов вне текущего окна",
41
+ "details.output": "Выход",
42
+ "details.running": "Выполняется…",
43
+ "details.title": "Подробности",
44
+ "duration.minutes": "{minutes} мин {seconds} с",
45
+ "duration.seconds": "{seconds} с",
46
+ "fileOpen.folderTitle": "Не удалось открыть папку",
47
+ "fileOpen.folderUnknown": "Не удалось открыть эту папку",
48
+ "fileOpen.title": "Не удалось открыть файл",
49
+ "fileOpen.unknown": "Не удалось открыть этот файл",
50
+ "hero.chooseWorkspace": "Выбрать рабочую папку",
51
+ "hero.headline": "Навстречу неизвестному",
52
+ "hero.preview": "Предпросмотр",
53
+ "hint.goal": "опишите цель длительной задачи",
54
+ "hint.goal.active": "цель активна — изменить / пауза / продолжить / снять",
55
+ "image.closePreview": "Закрыть просмотр оригинала",
56
+ "image.dimensionTooLarge": "Стороны изображения не больше {size}px — уменьшите его и попробуйте снова",
57
+ "image.dropBlocked": "Сейчас картинки добавить нельзя",
58
+ "image.dropDesc": "До {count} изображений, каждое до {size}",
59
+ "image.dropTitle": "Перетащите изображения сюда",
60
+ "image.fileTooLarge": "Каждое изображение должно быть меньше {size}",
61
+ "image.label": "Изображение",
62
+ "image.loadFailed": "Изображение не загрузилось, нажмите для повтора",
63
+ "image.loading": "Загрузка изображения…",
64
+ "image.modelUnsupported": "Текущая модель не принимает изображения; выберите подходящую",
65
+ "image.openOriginal": "Открыть оригинал",
66
+ "image.openOriginalLabel": "{label}, нажмите, чтобы открыть оригинал",
67
+ "image.original": "Оригинал",
68
+ "image.pending": "Изображения к отправке",
69
+ "image.preview": "Просмотр оригинала",
70
+ "image.remove": "Убрать изображение {name}",
71
+ "image.scrollLeft": "Прокрутить изображения влево",
72
+ "image.scrollRight": "Прокрутить изображения вправо",
73
+ "image.sendFailed": "Не удалось отправить изображения ({reason}); добавьте заново и повторите",
74
+ "image.serviceUnavailable": "Служба загрузки изображений недоступна",
75
+ "image.subagentUnsupported": "Сессии субагентов пока не поддерживают изображения",
76
+ "image.tooMany": "В одно сообщение помещается до {count} изображений",
77
+ "image.tooManyPixels": "Слишком большое разрешение; сожмите изображение и повторите",
78
+ "image.totalTooLarge": "Изображения весят больше {size}; уберите часть и повторите",
79
+ "image.unsupportedType": "Поддерживаются только PNG, JPG, WebP и GIF",
80
+ "input.accessMode": "Режим доступа, сейчас: {name}",
81
+ "input.commands": "Команды",
82
+ "input.send": "Отправить сообщение",
83
+ "input.stop": "Остановить генерацию",
84
+ "json.truncated": "… обрезано, всего символов: {total}",
85
+ "message.branch": "Ответвить новый диалог",
86
+ "message.branchUnavailable": "Доступно только на последнем сообщении завершённого хода",
87
+ "message.compaction": "Контекст сжат",
88
+ "message.compaction.completed": "Сжато элементов истории: {items} (~{tokens} токенов)",
89
+ "message.compaction.expand": "Показать итог сжатия",
90
+ "message.compaction.running": "Сжатие контекста…",
91
+ "message.compaction.unavailable": "Итог сжатия недоступен",
92
+ "message.context.catalog.more": "… ещё {count}",
93
+ "message.context.catalog.replaced": "Каталог заменён",
94
+ "message.context.instructions.added": "добавлено",
95
+ "message.context.instructions.loaded": "загружено",
96
+ "message.context.instructions.removed": "удалено",
97
+ "message.context.instructions.updated": "обновлено",
98
+ "message.context.recall.counts": "{retained} оставлено · {omitted} пропущено",
99
+ "message.context.recall.truncated": "обрезано",
100
+ "message.context.relay.from": "Из сессии {session}",
101
+ "message.context.snapshot.supersedes": "Заменяет прежние снимки",
102
+ "message.contextInjection": "Инъекция контекста",
103
+ "message.contextRecall": "Напоминание из сессии",
104
+ "message.extraBlock": "Дополнительный блок",
105
+ "message.maxTokens": "Достигнут лимит выходных токенов",
106
+ "message.maxTokens.hint": "Ответ обрезан; написанное ранее сохранено в переписке. Отправьте «продолжай», чтобы модель дописала.",
107
+ "message.ranFor": "Заняло {duration}",
108
+ "message.referenceSeparator": ", ",
109
+ "message.referenceSummary": "Упомянутая сессия · {labels}",
110
+ "message.retry.active": "Повтор запроса к модели",
111
+ "message.retry.cancelled": "Повтор запроса отменён",
112
+ "message.retry.delay": "Задержка перед повтором: ",
113
+ "message.retry.failure": "Причина сбоя: ",
114
+ "message.retry.scheduled": "Ожидание повтора запроса",
115
+ "message.retry.started": "Запрос к модели повторён",
116
+ "message.retry.status": "{label} ({retry}/{maximum}) · {seconds} с",
117
+ "message.stopped": "Остановлено",
118
+ "message.tokensPerSecond": "{tps} ток/с",
119
+ "message.ttft": "Первый токен {seconds} с",
120
+ "message.turnError": "Ход не удался",
121
+ "message.unknownBlock": "Неизвестный блок содержимого",
122
+ "message.unknownSurface": "Неизвестное событие: {type}",
123
+ "placeholder.default": "Напишите агенту",
124
+ "placeholder.hero": "Опишите, что хотите сделать",
125
+ "placeholder.parentOffline": "Родительская сессия офлайн: отправка недоступна, но остановить выполнение можно",
126
+ "placeholder.steerQueue": "Cmd/Ctrl+Enter направит все сообщения из очереди",
127
+ "placeholder.unavailable": "Сессия недоступна",
128
+ "placeholder.workspace": "Выберите рабочую папку, чтобы начать",
129
+ "queue.cancelEdit": "Отменить правку",
130
+ "queue.count": "Сообщений в очереди: {n}",
131
+ "queue.edit": "Изменить сообщение в очереди",
132
+ "queue.edit.unsupported": "Содержит не только текст; правка пока не поддерживается",
133
+ "queue.editFailed": "Не удалось изменить: сообщение, возможно, уже отправляется.",
134
+ "queue.remove": "Убрать из очереди",
135
+ "queue.removeFailed": "Не удалось убрать: сообщение, возможно, уже отправляется.",
136
+ "queue.save": "Сохранить сообщение",
137
+ "queue.steer": "Направить сообщение",
138
+ "queue.steer.unavailable": "Направлять можно только пока агент работает",
139
+ "queue.steerFailed": "Не удалось направить. Попробуйте ещё раз.",
140
+ "row.failed": "Ошибка",
141
+ "row.running": "Выполняется",
142
+ "row.stopped": "Остановлено",
143
+ "session.hierarchy": "Иерархия сессий",
144
+ "settings.enter.description": "Только когда агент занят; Cmd/Ctrl+Enter даёт другое поведение",
145
+ "settings.enter.queue": "В очередь",
146
+ "settings.enter.steer": "Направить",
147
+ "settings.enter.title": "Enter, когда агент занят",
148
+ "stats.cacheHit": "Попаданий в кэш {percent}%",
149
+ "stats.counts": "ходов: {turns} · шагов: {steps}",
150
+ "stats.llm": "Модель {duration}",
151
+ "stats.tokens": "Вход {input} ток · выход {output} ток",
152
+ "stats.tokensPerSecond": "{throughput} ток/с",
153
+ "stats.toolCall": "Инструменты {duration}",
154
+ "stats.ttftAverage": "Первый токен в среднем {duration}",
155
+ "terminal.collapseAria": "Свернуть вывод",
156
+ "terminal.done": "Готово",
157
+ "terminal.exitCode": "код возврата {code}",
158
+ "terminal.expandAria": "Показать оставшиеся строки вывода: {n}",
159
+ "terminal.expandRest": "… ещё строк: {n}",
160
+ "terminal.failed": "Ошибка",
161
+ "terminal.noOutput": "Вывода нет",
162
+ "terminal.running": "Выполняется",
163
+ "terminal.signal": "сигнал {signal}",
164
+ "todo.completed": "{done}/{total} выполнено",
165
+ "todo.progress.active": "{active} в работе",
166
+ "todo.progress.done": "{done} выполнено",
167
+ "todo.progress.pending": "{pending} в очереди",
168
+ "todo.rowTitle": "Обновить список задач",
169
+ "todo.title": "Задачи",
170
+ "view.chat": "Чат"
171
+ }
172
+ }
@@ -0,0 +1,160 @@
1
+ {
2
+ "settings.models": {
3
+ "add": "Добавить провайдера",
4
+ "addModel": "Добавить модель",
5
+ "advancedHint": "Остальные поля живут в settings.yaml — правьте этот раздел напрямую.",
6
+ "apply": "Применить",
7
+ "applying": "Применение…",
8
+ "baseUrl": "Базовый URL",
9
+ "baseUrlDefault": "По умолчанию у провайдера",
10
+ "cancel": "Отмена",
11
+ "close": "Закрыть",
12
+ "conflict": "Пока карточка была открыта, настройки изменил кто-то ещё. Закройте и откройте заново, чтобы править актуальные значения.",
13
+ "contextWindow": "Окно контекста",
14
+ "contextWindowPlaceholder": "Как у провайдера по умолчанию",
15
+ "create": "Создать провайдера",
16
+ "creating": "Создание…",
17
+ "credentialConfigured": "API-ключ задан",
18
+ "credentialMissing": "API-ключ не задан",
19
+ "customAdd": "Добавить своего провайдера",
20
+ "customApi": "Протокол API",
21
+ "customApiUnset": "Не выбран",
22
+ "customDisplayName": "Отображаемое имя",
23
+ "customNeedsBaseUrl": "Своему провайдеру нужен базовый URL.",
24
+ "customNeedsModels": "Своему провайдеру нужна хотя бы одна модель.",
25
+ "customRoute": "Идентификатор провайдера",
26
+ "customRouteHint": "Идентификатор в нижнем регистре, начинается с буквы. По нему провайдер адресуется в запросах, и так же называется его ключ.",
27
+ "customRouteInvalid": "Начните со строчной буквы, дальше строчные буквы, цифры и дефисы.",
28
+ "customRouteTaken": "Такой идентификатор уже занят другим провайдером.",
29
+ "customTag": "Свой",
30
+ "customTitle": "Свой провайдер",
31
+ "customized": "Настройки изменены",
32
+ "deleteConfirm": "Удалить {provider}",
33
+ "deleteDescription": "Удаление {provider} убирает его настройки. Ключ, которым он пользовался, хранится отдельно и останется.",
34
+ "deleteDescriptionWithCredential": "Удаление {provider} убирает его настройки и сохранённый API-ключ.",
35
+ "deleteTitle": "Удалить {provider}?",
36
+ "deleting": "Удаление {provider}…",
37
+ "edit": "Изменить",
38
+ "editProvider": "Изменить {provider}",
39
+ "fetchAdopt": "Добавить выбранные",
40
+ "fetchDeselectAll": "Снять выбор",
41
+ "fetchDescription": "Вот модели, доступные у этого провайдера. Отметьте те, что нужно добавить.",
42
+ "fetchEmpty": "Провайдер не вернул ни одной модели. Добавьте их вручную.",
43
+ "fetchModels": "Запросить список моделей",
44
+ "fetchNeedsBaseUrl": "Сначала укажите базовый URL, потом запрашивайте.",
45
+ "fetchSelectAll": "Выбрать все",
46
+ "fetchTitle": "Выберите модели",
47
+ "fetching": "Запрос к провайдеру…",
48
+ "intro": "Введите свои API-ключи, чтобы пользоваться моделями этих провайдеров.",
49
+ "keyBlank": "Введите API-ключ или оставьте поле пустым, чтобы сохранить прежний.",
50
+ "keyBlankNew": "Введите API-ключ или оставьте поле пустым, если провайдер авторизуется иначе.",
51
+ "keyEnvLocked": "Задан переменной окружения (только чтение)",
52
+ "keyIllegalCharacters": "Ключ в недопустимом формате. Проверьте его.",
53
+ "keyInput": "API-ключ",
54
+ "keyPlaceholder": "Введите API-ключ",
55
+ "keyPlaceholderNative": "Введите API-ключ или оставьте пустым для авторизации из окружения",
56
+ "keyRequired": "Чтобы продолжить, введите API-ключ.",
57
+ "keyStored": "Задан — введите новое значение, чтобы заменить",
58
+ "loadFailed": "Не удалось загрузить список провайдеров",
59
+ "maxTokens": "Максимум выходных токенов",
60
+ "maxTokensPlaceholder": "Как у провайдера по умолчанию",
61
+ "model": "Модель",
62
+ "modelAdvanced": "Ёмкости",
63
+ "modelCapacityInvalid": "Ёмкость задаётся числом, можно с суффиксом K или M.",
64
+ "modelContextInvalid": "Окно контекста — положительное число, например 131072, 256K или 1M.",
65
+ "modelContextWindow": "Окно контекста",
66
+ "modelDuplicate": "Каждый идентификатор модели встречается один раз.",
67
+ "modelId": "Идентификатор модели",
68
+ "modelIdDuplicate": "Идентификатор модели должен быть уникальным.",
69
+ "modelIdRequired": "Нужен идентификатор модели.",
70
+ "modelMaxTokens": "Максимум выходных токенов",
71
+ "modelMaxTokensInvalid": "Максимум выходных токенов — положительное число, например 8192, 64K или 1M.",
72
+ "modelName": "Отображаемое имя",
73
+ "modelNameInvalid": "Отображаемое имя не может быть пустым.",
74
+ "modelNamePlaceholder": "Пусто — возьмётся идентификатор модели",
75
+ "models": "Модели",
76
+ "modelsCustomized": "Каталог моделей изменён",
77
+ "modelsEmpty": "В выборе моделей не будет ничего. Неуказанные идентификаторы всё равно можно отправлять напрямую.",
78
+ "modelsInherited": "По умолчанию, как в адаптере",
79
+ "nav": "Модели",
80
+ "onboardingDescription": "Настройте официального провайдера DeepSeek, чтобы начать.",
81
+ "onboardingLater": "Настроить позже",
82
+ "onboardingSave": "Сохранить и продолжить",
83
+ "onboardingSaving": "Сохранение…",
84
+ "onboardingTitle": "Добавьте API-ключ, чтобы начать",
85
+ "provider": "Провайдер",
86
+ "readOnly": "В этой установке файл настроек доступен только для чтения.",
87
+ "remove": "Удалить",
88
+ "removeModel": "Удалить модель",
89
+ "removeProvider": "Удалить {provider}",
90
+ "resetModels": "Вернуть значения по умолчанию",
91
+ "retry": "Повторить",
92
+ "savedProvider": "{provider} сохранён.",
93
+ "title": "Модели",
94
+ "welcomeError": "Не удалось сохранить подтверждение. Попробуйте ещё раз."
95
+ },
96
+ "workspace": {
97
+ "actions.newSession.aria": "Новая сессия в {name}",
98
+ "actions.session.aria": "Действия с сессией {name}",
99
+ "actions.workspace.aria": "Действия с рабочей папкой {name}",
100
+ "conflict.named": "Рабочая папка «{name}» уже есть.",
101
+ "date.ymd": "{d}.{m}.{y}",
102
+ "delete.desc": "Уберёт «{name}» из списка рабочих папок. Сама папка и журналы сессий останутся, а её сессии переедут в «Без папки».",
103
+ "delete.pending": "Удаление рабочей папки…",
104
+ "delete.workspace": "Удалить рабочую папку",
105
+ "empty.noMatches": "Ничего не найдено",
106
+ "empty.none": "Сессий пока нет",
107
+ "field.sessionName": "Название сессии",
108
+ "field.workspaceName": "Название рабочей папки",
109
+ "folderError.retry": "Выбрать снова",
110
+ "folderError.title": "Не удалось открыть папку",
111
+ "group.ungrouped": "Без папки",
112
+ "groupBy.flat": "Одним списком",
113
+ "groupBy.label": "Группировать",
114
+ "groupBy.workspace": "По рабочим папкам",
115
+ "hover.copied": "Скопировано",
116
+ "hover.created": "Создано {time}",
117
+ "menu.addWorkspace": "Добавить рабочую папку…",
118
+ "menu.archiveSession": "Убрать сессию в архив",
119
+ "menu.fork": "Ответвить сессию",
120
+ "orderBy.label": "Сортировать",
121
+ "orderBy.manual": "Вручную",
122
+ "orderBy.updated": "По изменению",
123
+ "picker.loading": "Загрузка рабочих папок…",
124
+ "rename": "Переименовать",
125
+ "rename.session.title": "Переименовать сессию",
126
+ "rename.workspace.title": "Переименовать рабочую папку",
127
+ "search.clear": "Очистить поиск",
128
+ "search.hasMore": "Показаны первые {n} результатов. Уточните запрос.",
129
+ "search.noMatches": "Подходящих сессий нет",
130
+ "search.pending": "Поиск по истории сессий…",
131
+ "search.placeholder": "Поиск по сессиям...",
132
+ "search.results.aria": "Результаты поиска",
133
+ "search.sessions.aria": "Поиск сессий",
134
+ "search.unavailable": "Поиск по содержимому временно недоступен. Показаны совпадения по названию.",
135
+ "section.sessions": "Сессии",
136
+ "section.workspaces": "Рабочие папки",
137
+ "session.new": "Новая сессия",
138
+ "sessions.collapse": "Показать меньше",
139
+ "sessions.count.one": "{n} сессия",
140
+ "sessions.count.other": "{n} сессий",
141
+ "sessions.expand": "Показать ещё {n}",
142
+ "status.completed": "Завершено",
143
+ "status.idle": "Простаивает",
144
+ "status.planReview": "План ждёт проверки",
145
+ "status.running": "Работает",
146
+ "status.subagentsRunning.one": "{n} субагент работает",
147
+ "status.subagentsRunning.other": "{n} субагентов работает",
148
+ "status.waitingAnswer": "Ждёт ответа",
149
+ "status.waitingApproval": "Ждёт подтверждения",
150
+ "time.ago": "{t} назад",
151
+ "time.days": "{n} дн",
152
+ "time.hours": "{n} ч",
153
+ "time.minutes": "{n} мин",
154
+ "time.months": "{n} мес",
155
+ "time.now": "только что",
156
+ "time.years": "{n} г",
157
+ "viewOptions.label": "Параметры отображения",
158
+ "workspace.add": "Добавить рабочую папку"
159
+ }
160
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "settings.agentPreset": {
3
+ "brokenBadge": "Не загрузился",
4
+ "brokenNoCopy": "Пресет, который не загрузился, скопировать нельзя",
5
+ "builtIn": "Встроенный",
6
+ "builtInGroup": "Встроенные",
7
+ "cancel": "Отмена",
8
+ "close": "Закрыть",
9
+ "composition": "Композиция (agent.cordis.yml)",
10
+ "copyIntro": "Пресет копируется целиком на этой машине. Идентификатор станет именем каталога и позже не меняется; всё остальное правится в файлах самого пресета.",
11
+ "copyOf": "Скопирован с",
12
+ "copyTitle": "Скопировать пресет",
13
+ "create": "Создать",
14
+ "creating": "Создание…",
15
+ "creatorDraft": "Набросать свой пресет в режиме «Конструктор»",
16
+ "customGroup": "Свои",
17
+ "delete": "Удалить",
18
+ "deleteConfirm": "Удалить",
19
+ "deleteDescription": "Каталог пресета будет удалён. Уже запущенные на нём сессии продолжат работать, но выбрать его для новых нельзя.",
20
+ "deleteTitle": "Удалить этот пресет?",
21
+ "deleting": "Удаление…",
22
+ "description": "Действует на сессии, запущенные с этого момента. Работающие сессии остаются на своём пресете.",
23
+ "displayName": "Название",
24
+ "displayNamePlaceholder": "Показывается в списке; по умолчанию — идентификатор",
25
+ "duplicate": "Скопировать",
26
+ "duplicateUnavailable": "В этой установке нет каталога пресетов с правом записи",
27
+ "error": "Не удалось загрузить пресеты агента.",
28
+ "headerHint": "Пресет агента, на котором идёт сессия; зафиксирован при запуске",
29
+ "idInvalid": "Строчные буквы, цифры и дефисы, начиная с буквы или цифры.",
30
+ "idRequired": "Задайте пресету идентификатор.",
31
+ "idTaken": "Пресет с таким идентификатором уже есть.",
32
+ "inUse": "Используется",
33
+ "loading": "Загрузка пресетов…",
34
+ "nav": "Пресеты агента",
35
+ "noDescription": "Без описания.",
36
+ "openLocation": "Открыть папку",
37
+ "presetCodeDescription": "Всё, что умеет обычный режим, но инструменты отдаются через Code Mode SDK: модель собирает многошаговые операции в одну программу на TypeScript.",
38
+ "presetCodeName": "Режим кода",
39
+ "presetCordisDescription": "Для создания своих пресетов: всё из обычного режима плюс инспекция рантайма, опыты с плагинами и подсказки по авторству пресетов.",
40
+ "presetCordisName": "Конструктор",
41
+ "presetId": "Идентификатор",
42
+ "presetIdPlaceholder": "my-agent",
43
+ "presetMinimalDescription": "Агент из двух инструментов: постоянный bash и str_replace_editor.",
44
+ "presetMinimalName": "Минимальный режим",
45
+ "presetStandardDescription": "Полноценный кодинг-агент: правка файлов, консоль, поиск по файлам и в вебе, скиллы, планирование, цели, субагенты и воркфлоу.",
46
+ "presetStandardName": "Обычный режим",
47
+ "retry": "Повторить",
48
+ "revealedPathLabel": "Файлы пресета:",
49
+ "seatHint": "Пресет агента для сессии, которую вы собираетесь запустить",
50
+ "sectionIntro": "Пресет — это состав плагинов, на котором работает агент сессии: его инструменты, промпт и возможности. Скопируйте готовый и допилите под себя или попросите агента набросать свой в режиме «Конструктор».",
51
+ "setDefault": "Сделать основным",
52
+ "showLocation": "Показать расположение",
53
+ "title": "Пресет агента",
54
+ "userTrust": "Свой",
55
+ "view": "Посмотреть"
56
+ },
57
+ "cordis": {
58
+ "a11y.defining": "Определение плагина",
59
+ "a11y.failed": "Определить не удалось",
60
+ "a11y.stopped": "Определение прервано",
61
+ "action.approve": "Разрешить",
62
+ "action.approveOnce": "Разрешить только эту версию",
63
+ "action.approvePlugin": "Разрешить будущие версии этого плагина",
64
+ "action.decline": "Отклонить",
65
+ "action.remove": "Удалить",
66
+ "action.retry": "Повторить",
67
+ "action.rollback": "Откатить",
68
+ "action.run": "Запустить",
69
+ "action.stop": "Остановить",
70
+ "body.clientCode": "Клиент",
71
+ "body.copied": "Скопировано",
72
+ "body.copy": "Копировать",
73
+ "body.hostCode": "Хост",
74
+ "body.output": "Результат",
75
+ "body.source": "Исходник плагина",
76
+ "panel.approvals.aria": "Подтверждения Cordis",
77
+ "panel.current": "Текущая: {packageId}",
78
+ "panel.empty": "Плагинов пока нет",
79
+ "panel.group.current": "Эта сессия",
80
+ "panel.group.others": "Другие сессии",
81
+ "panel.hint": "Управление запуском — в панели Cordis над настройками",
82
+ "panel.loading": "Чтение…",
83
+ "panel.next": "Следующая: {packageId}",
84
+ "panel.plugins.aria": "Плагины Cordis",
85
+ "panel.readFailed": "Не удалось прочитать список плагинов: {message}",
86
+ "panel.runningCount": "работает: {count}",
87
+ "panel.title": "Плагины Cordis",
88
+ "panel.trigger": "Плагин Cordis",
89
+ "panel.version": "Версия",
90
+ "purpose.missing": "(назначение не указано)",
91
+ "render.failedAbdicated": "Отрисовка в {slot} не удалась, вернули стандартный интерфейс:",
92
+ "render.failedHeld": "Отрисовка в {slot} не удалась:",
93
+ "row.defineTitle": "Зарегистрировать плагин Cordis",
94
+ "row.removeTitle": "Удалить плагин Cordis",
95
+ "row.runTitle": "Запустить плагин Cordis",
96
+ "row.stopTitle": "Остановить плагин Cordis",
97
+ "row.updateTitle": "Обновить плагин Cordis",
98
+ "run.removed": "Этого пакета больше нет",
99
+ "run.superseded": "Ниже есть более свежая карточка запуска",
100
+ "status.awaitingApproval": "Ждёт подтверждения",
101
+ "status.clientPending": "Клиент готов к активации",
102
+ "status.failed": "Запуск не удался",
103
+ "status.idle": "Готов",
104
+ "status.removed": "Удалён",
105
+ "status.running": "Работает",
106
+ "status.superseded": "Есть более свежий запуск"
107
+ }
108
+ }