@ragnoryok1/dsh-client-locale-ru 0.2.0 → 0.2.2
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 +968 -0
- package/NAMESPACES.md +93 -0
- package/README.en.md +551 -0
- package/README.md +563 -287
- package/README.zh.md +267 -0
- package/assets/banner.jpg +0 -0
- package/images/plugins-ru.png +0 -0
- package/images/settings-ru.png +0 -0
- package/lib/client.js +2157 -163
- package/lib/index.d.ts +8 -2
- package/lib/typography.d.ts +31 -0
- package/lib/typography.js +36 -16
- package/package.json +58 -21
- package/assets/banner.png +0 -0
- package/assets/icon.png +0 -0
- package/lib/client.d.ts +0 -6
- package/lib/client.js.map +0 -1
package/lib/client.js
CHANGED
|
@@ -22,7 +22,7 @@ window.__ModuleLoader__.load({
|
|
|
22
22
|
"copy.value": "Копировать значение",
|
|
23
23
|
"copy.json": "Копировать JSON",
|
|
24
24
|
"copy.path": "Копировать путь",
|
|
25
|
-
"copy.prettyJson": "Копировать
|
|
25
|
+
"copy.prettyJson": "Копировать форматированный JSON",
|
|
26
26
|
"copy.compactJson": "Копировать компактный JSON",
|
|
27
27
|
"copy.optionsHint": "{action}; правый клик — варианты копирования",
|
|
28
28
|
"retry": "Повторить",
|
|
@@ -47,7 +47,7 @@ window.__ModuleLoader__.load({
|
|
|
47
47
|
"truncated": "Обрезано",
|
|
48
48
|
"json.label": "JSON",
|
|
49
49
|
"markdown.footnotes": "Сноски",
|
|
50
|
-
"markdown.truncatedCharacters": "…
|
|
50
|
+
"markdown.truncatedCharacters": "… обрезано, символов: {total}",
|
|
51
51
|
"number.thousand": "{value} тыс.",
|
|
52
52
|
"number.million": "{value} млн",
|
|
53
53
|
"codeBlock.title": "Блок кода",
|
|
@@ -62,7 +62,7 @@ window.__ModuleLoader__.load({
|
|
|
62
62
|
"createPluginDescription": "Войдите в режим создания и сделайте свой плагин для DSH",
|
|
63
63
|
"createPluginChecking": "Проверяем, доступен ли режим создания",
|
|
64
64
|
"createPluginUnavailable": "Временно недоступно. Откройте это меню ещё раз, чтобы повторить",
|
|
65
|
-
"createPluginMissing": "Режим создания не входит в эту
|
|
65
|
+
"createPluginMissing": "Режим создания не входит в эту конфигурацию",
|
|
66
66
|
"seatHint": "Выберите пресет агента для новой задачи",
|
|
67
67
|
"headerHint": "Пресет агента, выбранный при запуске этой задачи",
|
|
68
68
|
"nav": "Пресеты агента",
|
|
@@ -103,9 +103,7 @@ window.__ModuleLoader__.load({
|
|
|
103
103
|
"guideCordisIntro": "Выбирайте режим Creator для новой задачи. Опишите, какая возможность вам нужна, где она должна появиться и как вы будете её проверять.",
|
|
104
104
|
"guideCordisExplanation": "### Что можно создать\n\nРежим Creator включает стандартные инструменты для задач, а также инспекцию среды выполнения, постоянное управление плагинами и руководство по написанию плагинов Cordis и пресетов агента. Он может создать плагин, добавляющий возможность или интерфейс, либо пресет, объединяющий инструменты и промпты для конкретной работы.\n\n### Плагины и режимы\n\nПлагин добавляет возможности в DSH, например инструмент, подключение к сервису или элемент интерфейса. Режим — это пресет агента, который выбирает инструменты и определяет, как агент работает над задачей. Плагин можно включить в пользовательский пресет.\n\n### Как результат вступает в силу\n\nПопросите агента установить и проверить результат, а не просто сгенерировать исходный код. Плагин может загрузиться сразу или потребовать перезапуска — в зависимости от того, что он меняет. Новый созданный пресет выбирается при запуске новой задачи.",
|
|
105
105
|
"guideCordisUsage": "### Добавить интерфейс\n\n> Создайте плагин DSH, который добавляет в боковую панель пункт «Заметки проекта». Дайте мне просматривать файлы Markdown в этом рабочем пространстве и открывать предпросмотр выбранной заметки. Установите его и проверьте, что страница открывается.\n\nОжидаемый результат: установленный плагин с работающим пунктом и страницей предпросмотра, а также оставшиеся шаги для активации.\n\n### Добавить инструмент\n\n> Создайте плагин с инструментом, который читает отчёт о тестах этого проекта и обобщает неудачные тесты. Зарегистрируйте его и проверьте на образце отчёта.\n\nОжидаемый результат: плагин с вызываемым инструментом и проверенным примером вызова.\n\n### Создать собственный режим\n\n> Создайте режим «Code review» на основе режима Standard. Пусть он в первую очередь обращает внимание на потенциальные ошибки и пробелы в тестах, ссылается на пути к файлам и номера строк и спрашивает перед изменением файлов. Сохраните его как выбираемый пресет.\n\nОжидаемый результат: пользовательский пресет для новых задач. Эти инструкции по ревью направляют агента; настройки разрешений определяют, какие действия он может выполнять.",
|
|
106
|
-
"view": "Посмотреть конфигурацию"
|
|
107
|
-
"enableDevToolsToSetDefault": "Включите «Инструменты для кода» в основных настройках, чтобы выбрать значение по умолчанию",
|
|
108
|
-
"enableDevToolsToCreate": "Включите «Инструменты для кода» в основных настройках, чтобы включить режим Creator"
|
|
106
|
+
"view": "Посмотреть конфигурацию"
|
|
109
107
|
},
|
|
110
108
|
"approval": {
|
|
111
109
|
"detail.aria": "Детали запроса",
|
|
@@ -145,6 +143,8 @@ window.__ModuleLoader__.load({
|
|
|
145
143
|
"token.export": "экспорт"
|
|
146
144
|
},
|
|
147
145
|
"conversation": {
|
|
146
|
+
"row.commandArguments": "Аргументы команды",
|
|
147
|
+
"terminal.commandLine": "Строка команды {n}",
|
|
148
148
|
"ask.pending": "продолжено; ответ всё ещё можно дать",
|
|
149
149
|
"ask.pendingDetail": "На эти вопросы всё ещё можно ответить из поля ввода.",
|
|
150
150
|
"ask.reopen": "Ответить",
|
|
@@ -181,7 +181,7 @@ window.__ModuleLoader__.load({
|
|
|
181
181
|
"image.preview": "Просмотр оригинала",
|
|
182
182
|
"image.closePreview": "Закрыть просмотр оригинала",
|
|
183
183
|
"image.unsupportedType": "Поддерживаются только изображения PNG, JPG, WebP и GIF",
|
|
184
|
-
"image.tooMany": "
|
|
184
|
+
"image.tooMany": "Изображений в сообщении: не больше {count}",
|
|
185
185
|
"image.fileTooLarge": "Каждое изображение должно быть меньше {size}",
|
|
186
186
|
"image.totalTooLarge": "Суммарный размер изображений превышает {size}; удалите часть и повторите",
|
|
187
187
|
"image.tooManyPixels": "Разрешение изображения слишком высокое; сожмите его и повторите",
|
|
@@ -213,7 +213,7 @@ window.__ModuleLoader__.load({
|
|
|
213
213
|
"todo.title": "Задачи",
|
|
214
214
|
"todo.progress.done": "{done} выполнено",
|
|
215
215
|
"todo.progress.active": "{active} в процессе",
|
|
216
|
-
"todo.progress.pending": "{pending}
|
|
216
|
+
"todo.progress.pending": "{pending} в ожидании",
|
|
217
217
|
"todo.rowTitle": "Обновить список задач",
|
|
218
218
|
"todo.completed": "{done}/{total} выполнено",
|
|
219
219
|
"command.attachmentsUnsupported": "/{command} не принимает вложения; сначала удалите их",
|
|
@@ -254,14 +254,14 @@ window.__ModuleLoader__.load({
|
|
|
254
254
|
"diff.collapseAria": "Свернуть изменения",
|
|
255
255
|
"diff.expandAria": "Показать ещё {count} стр. изменений",
|
|
256
256
|
"diff.expandRest": "… ещё {count} стр.",
|
|
257
|
-
"read.window": "
|
|
257
|
+
"read.window": "Строк: {shown} из {total}",
|
|
258
258
|
"read.collapseAria": "Свернуть содержимое",
|
|
259
259
|
"read.expandAria": "Показать ещё {count} стр.",
|
|
260
260
|
"read.expandRest": "… ещё {count} стр.",
|
|
261
|
-
"search.paths": "{shown}
|
|
262
|
-
"search.paths.truncated": "
|
|
263
|
-
"search.matches": "{shown}
|
|
264
|
-
"search.matches.truncated": "
|
|
261
|
+
"search.paths": "Путей: {shown}",
|
|
262
|
+
"search.paths.truncated": "Путей: {shown} из {total}",
|
|
263
|
+
"search.matches": "Совпадений: {shown} · файлов: {files}",
|
|
264
|
+
"search.matches.truncated": "Совпадений: {shown} из {total} · файлов: {files}",
|
|
265
265
|
"search.noResults": "Ничего не найдено",
|
|
266
266
|
"search.collapseAria": "Свернуть результаты",
|
|
267
267
|
"search.expandAria": "Показать ещё {count} стр. результатов",
|
|
@@ -275,7 +275,7 @@ window.__ModuleLoader__.load({
|
|
|
275
275
|
"queue.image": "Изображение в очереди сообщения",
|
|
276
276
|
"queue.file": "Файл {name} в очереди",
|
|
277
277
|
"queue.edit": "Изменить сообщение из очереди",
|
|
278
|
-
"queue.edit.unsupported": "
|
|
278
|
+
"queue.edit.unsupported": "Нетекстовое содержимое; редактирование пока не поддерживается",
|
|
279
279
|
"queue.save": "Сохранить сообщение из очереди",
|
|
280
280
|
"queue.cancelEdit": "Отменить редактирование",
|
|
281
281
|
"queue.remove": "Удалить сообщение из очереди",
|
|
@@ -291,8 +291,14 @@ window.__ModuleLoader__.load({
|
|
|
291
291
|
"terminal.done": "Готово",
|
|
292
292
|
"terminal.noOutput": "Нет вывода",
|
|
293
293
|
"terminal.collapseAria": "Свернуть вывод",
|
|
294
|
-
"terminal.expandAria": "Развернуть оставшиеся
|
|
295
|
-
"terminal.
|
|
294
|
+
"terminal.expandAria": "Развернуть оставшиеся {n} строк вывода",
|
|
295
|
+
"terminal.expandAria.one": "Развернуть оставшуюся {n} строку вывода",
|
|
296
|
+
"terminal.expandAria.few": "Развернуть оставшиеся {n} строки вывода",
|
|
297
|
+
"terminal.expandAria.many": "Развернуть оставшиеся {n} строк вывода",
|
|
298
|
+
"terminal.expandRest": "… ещё {n} строк",
|
|
299
|
+
"terminal.expandRest.one": "… ещё {n} строку",
|
|
300
|
+
"terminal.expandRest.few": "… ещё {n} строки",
|
|
301
|
+
"terminal.expandRest.many": "… ещё {n} строк",
|
|
296
302
|
"terminal.sendInput": "(отправить ввод)",
|
|
297
303
|
"terminal.session": "Терминал {sessionId}",
|
|
298
304
|
"input.send.queue": "Отправить в очередь",
|
|
@@ -513,7 +519,9 @@ window.__ModuleLoader__.load({
|
|
|
513
519
|
"detail.weekday.5": "Пт",
|
|
514
520
|
"detail.weekday.6": "Сб",
|
|
515
521
|
"detail.weekday.7": "Вс",
|
|
516
|
-
"detail.weekday.join": ", "
|
|
522
|
+
"detail.weekday.join": ", ",
|
|
523
|
+
"row.imageSize": "{width}×{height} px, {bytes} Б",
|
|
524
|
+
"row.imageSizeDownscaled": "{width}×{height} px (уменьшено с {originalWidth}×{originalHeight} px), {bytes} Б"
|
|
517
525
|
},
|
|
518
526
|
"deliverables": {
|
|
519
527
|
"presented.all": "Все файлы: {count}",
|
|
@@ -603,9 +611,14 @@ window.__ModuleLoader__.load({
|
|
|
603
611
|
"suggestions.aria": "Возможные варианты по триггеру"
|
|
604
612
|
},
|
|
605
613
|
"job": {
|
|
614
|
+
"terminal.commandLine": "Строка команды {n}",
|
|
606
615
|
"count.live.one": "{count} фоновая задача выполняется",
|
|
616
|
+
"count.live.few": "{count} фоновые задачи выполняются",
|
|
617
|
+
"count.live.many": "{count} фоновых задач выполняется",
|
|
607
618
|
"count.live.other": "Фоновых задач выполняется: {count}",
|
|
608
619
|
"count.idle.one": "{count} фоновая задача",
|
|
620
|
+
"count.idle.few": "{count} фоновые задачи",
|
|
621
|
+
"count.idle.many": "{count} фоновых задач",
|
|
609
622
|
"count.idle.other": "Фоновых задач: {count}",
|
|
610
623
|
"list.aria": "Фоновые задачи",
|
|
611
624
|
"status.running": "выполняется",
|
|
@@ -641,7 +654,13 @@ window.__ModuleLoader__.load({
|
|
|
641
654
|
"terminal.collapse": "Свернуть",
|
|
642
655
|
"terminal.collapseAria": "Свернуть вывод",
|
|
643
656
|
"terminal.expand": "Показать ещё {n} строк",
|
|
644
|
-
"terminal.
|
|
657
|
+
"terminal.expand.one": "Показать ещё {n} строку",
|
|
658
|
+
"terminal.expand.few": "Показать ещё {n} строки",
|
|
659
|
+
"terminal.expand.many": "Показать ещё {n} строк",
|
|
660
|
+
"terminal.expandAria": "Развернуть {n} скрытых строк вывода",
|
|
661
|
+
"terminal.expandAria.one": "Развернуть {n} скрытую строку вывода",
|
|
662
|
+
"terminal.expandAria.few": "Развернуть {n} скрытые строки вывода",
|
|
663
|
+
"terminal.expandAria.many": "Развернуть {n} скрытых строк вывода"
|
|
645
664
|
},
|
|
646
665
|
"feedback": {
|
|
647
666
|
"action.like": "Хороший ответ",
|
|
@@ -666,6 +685,8 @@ window.__ModuleLoader__.load({
|
|
|
666
685
|
"toast.recorded": "Спасибо за отзыв"
|
|
667
686
|
},
|
|
668
687
|
"model": {
|
|
688
|
+
"search.clear": "Очистить поиск",
|
|
689
|
+
"search.placeholder": "Поиск моделей…",
|
|
669
690
|
"search.empty": "Нет подходящих моделей.",
|
|
670
691
|
"command.description": "Выбор модели для этого диалога",
|
|
671
692
|
"option.loadError": "Не удалось загрузить каталог: {message}",
|
|
@@ -684,14 +705,19 @@ window.__ModuleLoader__.load({
|
|
|
684
705
|
"warning.groupLoad": "Не удалось загрузить {name}: {message}",
|
|
685
706
|
"empty.models": "Нет доступных моделей.",
|
|
686
707
|
"empty.efforts": "У этой модели нет уровней рассуждения.",
|
|
687
|
-
"option.deepseekV4Flash.description": "Быстрая, эффективная и экономная; подходит для сосредоточенных, рутинных или параллельных задач.",
|
|
688
|
-
"option.deepseekV4Pro.description": "Усиленное агентное программирование, знания и сложные рассуждения; для комплексных или критичных к качеству задач с большей стоимостью.",
|
|
689
708
|
"command.label": "Модель",
|
|
690
709
|
"error.sessionInUse": "Эта сессия уже используется — возможно, другим запущенным экземпляром DSH (например, dsh web или десктопным приложением). Закройте другие экземпляры DSH и повторите.",
|
|
691
|
-
"provider.account": "Учётная запись DeepSeek"
|
|
692
|
-
"blocked.composer": "Эта модель недоступна — выберите другую, чтобы продолжить"
|
|
710
|
+
"provider.account": "Учётная запись DeepSeek"
|
|
693
711
|
},
|
|
694
712
|
"settings.permission": {
|
|
713
|
+
"auto.badge": "ЭКСП",
|
|
714
|
+
"auto.confirm.acknowledge": "Я понимаю эти риски и хочу продолжить",
|
|
715
|
+
"auto.confirm.description": "Автопроверка работает без песочницы. Перед каждым вызовом нативного инструмента и внутренним вызовом PTC та же модель, что и у текущего агента, решает, разрешить ли его; вы подтверждаете или отклоняете каждый вызов, который она запретила. Возможность экспериментальная: она может ошибочно разрешить или запретить действие и расходует дополнительные токены.",
|
|
716
|
+
"auto.confirm.enable": "Включить автопроверку",
|
|
717
|
+
"auto.confirm.title": "Включить автопроверку (экспериментально)?",
|
|
718
|
+
"auto.description": "Работа без песочницы после экспериментальной проверки той же моделью каждого вызова нативного инструмента и внутреннего вызова PTC.",
|
|
719
|
+
"auto.label": "Автопроверка",
|
|
720
|
+
"mode": "Режим доступа, сейчас: {name}",
|
|
695
721
|
"title": "Права доступа",
|
|
696
722
|
"description": "Выберите режим прав по умолчанию для новых сессий",
|
|
697
723
|
"loading": "Загрузка",
|
|
@@ -700,17 +726,20 @@ window.__ModuleLoader__.load({
|
|
|
700
726
|
"preset.workspaceWrite": "Запись в рабочую папку",
|
|
701
727
|
"preset.fullAccess": "Полный доступ",
|
|
702
728
|
"confirm.title": "Включить «Полный доступ»?",
|
|
703
|
-
"confirm.description": "«Полный доступ» позволяет новым сессиям
|
|
729
|
+
"confirm.description": "«Полный доступ» позволяет новым сессиям уменьшать число шагов подтверждения и выполнять больше действий напрямую, включая чувствительные операции, изменение файлов или внешние команды. Используйте его, только если доверяете последующим задачам.",
|
|
704
730
|
"confirm.acknowledge": "Я понимаю риски и хочу продолжить",
|
|
705
731
|
"confirm.cancel": "Отмена",
|
|
706
732
|
"confirm.enable": "Включить «Полный доступ»"
|
|
707
733
|
},
|
|
708
734
|
"permission.access": {
|
|
735
|
+
"description": "Выберите режим прав по умолчанию для новых сессий",
|
|
736
|
+
"title": "Права доступа",
|
|
737
|
+
"unavailable": "Недоступно",
|
|
709
738
|
"preset.readOnly": "Только чтение",
|
|
710
739
|
"preset.workspaceWrite": "Запись в рабочую папку",
|
|
711
740
|
"preset.fullAccess": "Полный доступ",
|
|
712
741
|
"confirm.title": "Включить «Полный доступ»?",
|
|
713
|
-
"confirm.description": "«Полный доступ»
|
|
742
|
+
"confirm.description": "«Полный доступ» позволяет новым сессиям уменьшать число шагов подтверждения и выполнять больше действий напрямую, включая чувствительные операции, изменение файлов или внешние команды. Используйте его, только если доверяете последующим задачам.",
|
|
714
743
|
"confirm.acknowledge": "Я понимаю риски и хочу продолжить",
|
|
715
744
|
"confirm.cancel": "Отмена",
|
|
716
745
|
"confirm.enable": "Включить «Полный доступ»",
|
|
@@ -754,9 +783,20 @@ window.__ModuleLoader__.load({
|
|
|
754
783
|
"time.days": "{n} д",
|
|
755
784
|
"time.months": "{n} мес",
|
|
756
785
|
"time.years": "{n} г",
|
|
757
|
-
"section.subagents": "Субагенты"
|
|
786
|
+
"section.subagents": "Субагенты",
|
|
787
|
+
"fileOpen.close": "Закрыть",
|
|
788
|
+
"fileOpen.failed": "Не удалось открыть «{path}». Повторите попытку или закройте это сообщение.",
|
|
789
|
+
"fileOpen.retry": "Повторить",
|
|
790
|
+
"fileOpen.title": "Не удалось открыть файл"
|
|
758
791
|
},
|
|
759
792
|
"settings": {
|
|
793
|
+
"hostRelease.title": "Версия службы изменилась",
|
|
794
|
+
"hostRelease.description": "Версия службы изменилась. Страница приостановила обновление на лету; перезагрузите её, чтобы загрузить новую версию.",
|
|
795
|
+
"hostRelease.service": "Служба",
|
|
796
|
+
"hostRelease.page": "Страница",
|
|
797
|
+
"hostRelease.unknown": "Неизвестно",
|
|
798
|
+
"hostRelease.reload": "Перезагрузить, чтобы загрузить новую версию",
|
|
799
|
+
"hostRelease.later": "Не сейчас",
|
|
760
800
|
"trigger": "Настройки",
|
|
761
801
|
"title": "Настройки",
|
|
762
802
|
"close": "Закрыть",
|
|
@@ -793,6 +833,16 @@ window.__ModuleLoader__.load({
|
|
|
793
833
|
"shortcut.open": "Открыть настройки"
|
|
794
834
|
},
|
|
795
835
|
"settings.models": {
|
|
836
|
+
"modelReasoning": "Уровни рассуждений",
|
|
837
|
+
"modelReasoningLevel": "Уровень",
|
|
838
|
+
"modelReasoningValue": "Значение в API",
|
|
839
|
+
"modelReasoningHelp": "Об уровнях рассуждений",
|
|
840
|
+
"modelReasoningHelpText": "Значение API отправляется в поле reasoning_effort запроса — например, reasoning_effort у OpenAI. По умолчанию берётся имя уровня; если документация API провайдера модели задаёт другое значение, следуйте ей. «Выкл.» отключает рассуждения и значения не требует; уже записанное в конфигурации значение сохраняется и отправляется.",
|
|
841
|
+
"modelReasoningNeedsLevel": "Добавьте хотя бы один уровень, кроме «Выкл.», или отключите уровни рассуждений.",
|
|
842
|
+
"modelReasoningValueRequired": "Каждому уровню, кроме «Выкл.», нужно значение в API, и ни одно значение не может быть пустым.",
|
|
843
|
+
"modelReasoningAdd": "Добавить уровень",
|
|
844
|
+
"modelReasoningRemove": "Удалить уровень",
|
|
845
|
+
"modelReasoningOffValuePlaceholder": "Отключает рассуждения",
|
|
796
846
|
"nav": "Модели",
|
|
797
847
|
"title": "Модели",
|
|
798
848
|
"intro": "Введите API-ключи, чтобы использовать модели указанных провайдеров.",
|
|
@@ -814,15 +864,12 @@ window.__ModuleLoader__.load({
|
|
|
814
864
|
"savedProvider": "Сохранено: {provider}.",
|
|
815
865
|
"credentialConfigured": "API-ключ настроен",
|
|
816
866
|
"credentialMissing": "API-ключ отсутствует",
|
|
817
|
-
"readOnly": "Документ настроек в
|
|
867
|
+
"readOnly": "Документ настроек в этом развёртывании доступен только для чтения.",
|
|
818
868
|
"loadFailed": "Не удалось загрузить каталог провайдеров",
|
|
819
869
|
"conflict": "Пока эта карточка была открыта, настройки изменились в другом месте. Закройте её и откройте заново, чтобы редактировать актуальные значения.",
|
|
820
870
|
"retry": "Повторить",
|
|
821
871
|
"keyInput": "API-ключ",
|
|
822
872
|
"keyPlaceholder": "Введите API-ключ",
|
|
823
|
-
"keyPlaceholderNative": "Введите API-ключ или оставьте поле пустым, чтобы использовать аутентификацию из окружения",
|
|
824
|
-
"keyStored": "Настроен — введите новое значение, чтобы заменить",
|
|
825
|
-
"keyEnvLocked": "Предоставлен окружением запуска (только для чтения)",
|
|
826
873
|
"customized": "Изменённые настройки",
|
|
827
874
|
"baseUrl": "Базовый URL",
|
|
828
875
|
"baseUrlDefault": "По умолчанию у провайдера",
|
|
@@ -905,7 +952,21 @@ window.__ModuleLoader__.load({
|
|
|
905
952
|
"protocolOpenAiResponses": "OpenAI Responses",
|
|
906
953
|
"protocolAnthropicMessages": "Anthropic Messages",
|
|
907
954
|
"customAnthropicBaseUrlPlaceholder": "https://gateway.example",
|
|
908
|
-
"deepSeekAccount": "Учётная запись DeepSeek"
|
|
955
|
+
"deepSeekAccount": "Учётная запись DeepSeek",
|
|
956
|
+
"accountSignedIn": "Выполнен вход",
|
|
957
|
+
"authHelp": "Сведения об аутентификации",
|
|
958
|
+
"baseUrlConfigured": "Эндпоинт, заданный провайдером",
|
|
959
|
+
"baseUrlEnvironment": "Настройка эндпоинта провайдера: {env}",
|
|
960
|
+
"baseUrlPlaceholder": "{url}",
|
|
961
|
+
"keyFallbackDetected": "Переменная окружения найдена. ({hint})",
|
|
962
|
+
"keyFallbackDetectedHidden": "Переменная окружения найдена.",
|
|
963
|
+
"keyFallbackMissing": "Переменная окружения не найдена. Введите ключ API или задайте {hint} в окружении.",
|
|
964
|
+
"keyFallbackUnchecked": "Статус учётных данных из окружения не подтверждён.",
|
|
965
|
+
"keyHelp": "Сначала используются сохранённые учётные данные. Резервные варианты из окружения перечислены здесь по порядку: {env}. Источники: окружение запуска, $cwd/.env, затем $DSH_HOME/.env.",
|
|
966
|
+
"keyHide": "Скрыть секрет",
|
|
967
|
+
"keyPlaceholderFallback": "Оставьте пустым, чтобы использовать окружение для аутентификации ({hint})",
|
|
968
|
+
"keyPlaceholderSaved": "Оставьте пустым, чтобы использовать сохранённые учётные данные",
|
|
969
|
+
"keyReveal": "Показать секрет"
|
|
909
970
|
},
|
|
910
971
|
"settings.pluginInventory": {
|
|
911
972
|
"tab": "Список плагинов",
|
|
@@ -926,7 +987,6 @@ window.__ModuleLoader__.load({
|
|
|
926
987
|
"unloading": "Отключение",
|
|
927
988
|
"presetTitle": "Плагины сессии",
|
|
928
989
|
"presetSubtitle": "Собираются для каждой сессии пресетами агента",
|
|
929
|
-
"countUnit": "плагинов",
|
|
930
990
|
"switcherLabel": "Выберите пресет агента для просмотра",
|
|
931
991
|
"presetOptionDefault": "{name} (по умолчанию)",
|
|
932
992
|
"presetOptionBroken": "{name} (не удалось загрузить)",
|
|
@@ -934,9 +994,7 @@ window.__ModuleLoader__.load({
|
|
|
934
994
|
"globalSubtitle": "Общие для системы и всех сессий",
|
|
935
995
|
"presetProvidedDetail": "Глобально отключён; пресеты агента включают его на уровне сессии",
|
|
936
996
|
"enabledIn": "Включён в",
|
|
937
|
-
"viewInPreset": "Открыть в группе пресета",
|
|
938
997
|
"matchesInOtherPresets": "Ещё совпадений в других пресетах: {count} ",
|
|
939
|
-
"failedCountLabel": "ошибок",
|
|
940
998
|
"conditionalTag": "Условно",
|
|
941
999
|
"presetEnabledTag": "Включён через пресеты",
|
|
942
1000
|
"failedTag": "Сбой",
|
|
@@ -950,11 +1008,11 @@ window.__ModuleLoader__.load({
|
|
|
950
1008
|
"metadataError": "Ошибка метаданных пакета: {error}"
|
|
951
1009
|
},
|
|
952
1010
|
"settings.plugins": {
|
|
953
|
-
"nav": "Встроенные
|
|
1011
|
+
"nav": "Встроенные",
|
|
954
1012
|
"title": "Встроенные плагины",
|
|
955
|
-
"intro": "Просмотр плагинов,
|
|
1013
|
+
"intro": "Просмотр плагинов, которые поставляет это развёртывание.",
|
|
956
1014
|
"tabs": "Виды плагинов",
|
|
957
|
-
"empty": "
|
|
1015
|
+
"empty": "Это развёртывание не открывает представлений плагинов."
|
|
958
1016
|
},
|
|
959
1017
|
"sidebar": {
|
|
960
1018
|
"session.new": "Новая сессия",
|
|
@@ -974,6 +1032,42 @@ window.__ModuleLoader__.load({
|
|
|
974
1032
|
"row.preparing": "Подготовка к загрузке навыка"
|
|
975
1033
|
},
|
|
976
1034
|
"subagent": {
|
|
1035
|
+
"overridden": "Переопределено",
|
|
1036
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
1037
|
+
"reset": "Сбросить к значению по умолчанию",
|
|
1038
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
1039
|
+
"saving": "Сохранение…",
|
|
1040
|
+
"unavailable": "Этот плагин не загружен, поэтому сейчас его нельзя настроить.",
|
|
1041
|
+
"subagentTitle": "Субагент",
|
|
1042
|
+
"subagentDescription": "Настройка глубины рекурсии, количества и моделей субагентов.",
|
|
1043
|
+
"subagentLimitsTitle": "Ограничения",
|
|
1044
|
+
"subagentMaxDepth": "Максимальная глубина рекурсии",
|
|
1045
|
+
"subagentDepthHelpLabel": "О максимальной глубине рекурсии",
|
|
1046
|
+
"subagentDepthHelp": "Ограничивает, сколько уровней субагентов может создать агент.",
|
|
1047
|
+
"subagentDepthZero": "Отключить субагентов",
|
|
1048
|
+
"subagentDepthOne": "Только основной агент может создавать субагентов",
|
|
1049
|
+
"subagentDepthOverride": "Если инструмент задаёт собственную максимальную глубину рекурсии, приоритет у неё.",
|
|
1050
|
+
"subagentMaxActive": "Предел параллельных субагентов",
|
|
1051
|
+
"subagentCapacityHelpLabel": "О пределе параллельных субагентов",
|
|
1052
|
+
"subagentCapacityHelp": "Общее число живых субагентов под одним основным агентом на всех уровнях рекурсии. Основной агент не считается. При достижении предела новые запуски отклоняются.",
|
|
1053
|
+
"subagentDepthInvalid": "Введите целое число 0 или больше.",
|
|
1054
|
+
"subagentCapacityInvalid": "Введите целое число 1 или больше.",
|
|
1055
|
+
"subagentModelSelectionTitle": "Выбор модели",
|
|
1056
|
+
"subagentModelSelectionToggle": "Разрешить агентам выбирать модели для субагентов",
|
|
1057
|
+
"subagentModelSelectionChoose": "Если включено, агенты могут выбирать провайдера, модель и уровень рассуждения для каждого субагента из разрешённых моделей ниже. Применяется только к новым сессиям.",
|
|
1058
|
+
"subagentModelSelectionAllowed": "Модели, доступные агентам для выбора",
|
|
1059
|
+
"subagentModelSelectionLoading": "Загрузка моделей…",
|
|
1060
|
+
"subagentModelSelectionLoadFailed": "Не удалось загрузить модели.",
|
|
1061
|
+
"subagentModelSelectionRetry": "Повторить",
|
|
1062
|
+
"subagentModelSelectionPartial": "Часть провайдеров моделей не загрузилась; сохранённые выборки по-прежнему можно удалить.",
|
|
1063
|
+
"subagentModelSelectionUnavailable": "Сейчас недоступно",
|
|
1064
|
+
"subagentModelSelectionUnavailableGroup": "Сохранено, но сейчас недоступно",
|
|
1065
|
+
"subagentModelSelectionEmpty": "Ни один провайдер моделей сейчас не предлагает моделей.",
|
|
1066
|
+
"subagentModelSelectionRequired": "Перед сохранением выберите хотя бы одну модель.",
|
|
1067
|
+
"subagentModelSelectionConflict": "Настройки изменены в другом месте. Отмените черновик и повторите.",
|
|
1068
|
+
"subagentModelSelectionOff": "Субагенты используют настроенные значения по умолчанию или наследуют модель родительского агента. Сохранённые выборки моделей остаются.",
|
|
1069
|
+
"catalog.migrationRequired": "Требуется миграция",
|
|
1070
|
+
"mode.external": "Внешняя задача",
|
|
977
1071
|
"duration.seconds": "{seconds} с",
|
|
978
1072
|
"duration.minutes": "{minutes} мин {seconds} с",
|
|
979
1073
|
"duration.hours": "{hours} ч {minutes} мин {seconds} с",
|
|
@@ -995,8 +1089,12 @@ window.__ModuleLoader__.load({
|
|
|
995
1089
|
"branch.collapse": "Свернуть потомков {label}",
|
|
996
1090
|
"branch.expand": "Развернуть потомков {label}",
|
|
997
1091
|
"count.total.one": "{count} субагент",
|
|
1092
|
+
"count.total.few": "{count} субагента",
|
|
1093
|
+
"count.total.many": "{count} субагентов",
|
|
998
1094
|
"count.total.other": "Субагентов: {count}",
|
|
999
1095
|
"count.running.one": "{count} субагент выполняется",
|
|
1096
|
+
"count.running.few": "{count} субагента выполняются",
|
|
1097
|
+
"count.running.many": "{count} субагентов выполняется",
|
|
1000
1098
|
"count.running.other": "Субагентов выполняется: {count}",
|
|
1001
1099
|
"switcher.aria": "Переключить субагента: {title}",
|
|
1002
1100
|
"tree.aria": "Сессии субагентов",
|
|
@@ -1015,17 +1113,34 @@ window.__ModuleLoader__.load({
|
|
|
1015
1113
|
"open.sidebar.aria": "Открыть {label} в боковой панели"
|
|
1016
1114
|
},
|
|
1017
1115
|
"settings.theme": {
|
|
1116
|
+
"fontSize.text.title": "Размер шрифта",
|
|
1117
|
+
"fontSize.text.description": "Влияет только на содержимое диалога",
|
|
1118
|
+
"fontSize.text.increase": "Увеличить размер шрифта",
|
|
1119
|
+
"fontSize.text.decrease": "Уменьшить размер шрифта",
|
|
1120
|
+
"fontSize.code.title": "Размер шрифта кода",
|
|
1121
|
+
"fontSize.code.description": "Для блоков кода, встроенного кода и вывода инструментов",
|
|
1122
|
+
"fontSize.code.increase": "Увеличить размер шрифта кода",
|
|
1123
|
+
"fontSize.code.decrease": "Уменьшить размер шрифта кода",
|
|
1124
|
+
"fontSize.terminal.title": "Размер шрифта терминала",
|
|
1125
|
+
"fontSize.terminal.description": "Для терминала на боковой панели",
|
|
1126
|
+
"fontSize.terminal.increase": "Увеличить размер шрифта терминала",
|
|
1127
|
+
"fontSize.terminal.decrease": "Уменьшить размер шрифта терминала",
|
|
1128
|
+
"fontSize.more": "Другие настройки шрифтов",
|
|
1129
|
+
"fontFamily.text.title": "Шрифт текста",
|
|
1130
|
+
"fontFamily.text.description": "Для интерфейса и текста диалога. Разделяйте шрифты запятыми; оставьте пустым для значения по умолчанию",
|
|
1131
|
+
"fontFamily.code.title": "Шрифт кода",
|
|
1132
|
+
"fontFamily.code.description": "Для блоков кода, встроенного кода и вывода инструментов. Разделяйте шрифты запятыми; оставьте пустым для значения по умолчанию",
|
|
1133
|
+
"fontFamily.terminal.title": "Шрифт терминала",
|
|
1134
|
+
"fontFamily.terminal.description": "Для терминала на боковой панели. Разделяйте шрифты запятыми; оставьте пустым для значения по умолчанию",
|
|
1135
|
+
"fontFamily.placeholder": "По умолчанию",
|
|
1018
1136
|
"appearance.title": "Оформление",
|
|
1019
1137
|
"appearance.light": "Светлая",
|
|
1020
1138
|
"appearance.dark": "Тёмная",
|
|
1021
1139
|
"appearance.system": "Как в системе",
|
|
1022
|
-
"fontSize.
|
|
1023
|
-
"fontSize.description": "Влияет только на содержимое беседы",
|
|
1024
|
-
"fontSize.unit": "px",
|
|
1025
|
-
"fontSize.increase": "Увеличить размер шрифта",
|
|
1026
|
-
"fontSize.decrease": "Уменьшить размер шрифта"
|
|
1140
|
+
"fontSize.unit": "px"
|
|
1027
1141
|
},
|
|
1028
1142
|
"trajectory": {
|
|
1143
|
+
"details.lastAttemptError": "Ошибка последней попытки",
|
|
1029
1144
|
"view.trajectory": "Траектория",
|
|
1030
1145
|
"toolbar.aria": "Панель траектории",
|
|
1031
1146
|
"toolbar.duration": "Длительность",
|
|
@@ -1085,15 +1200,15 @@ window.__ModuleLoader__.load({
|
|
|
1085
1200
|
"timeline.total": "Всего: {duration}",
|
|
1086
1201
|
"timeline.started": "Начало: {time}",
|
|
1087
1202
|
"layout.toolCallOnly": "Только вызов инструмента",
|
|
1088
|
-
"kind.system": "
|
|
1089
|
-
"kind.user": "
|
|
1090
|
-
"kind.context": "
|
|
1091
|
-
"kind.compacted": "
|
|
1203
|
+
"kind.system": "СИСТЕМА",
|
|
1204
|
+
"kind.user": "ПОЛЬЗОВАТЕЛЬ",
|
|
1205
|
+
"kind.context": "КОНТЕКСТ",
|
|
1206
|
+
"kind.compacted": "СЖАТО",
|
|
1092
1207
|
"kind.message": "Сообщение",
|
|
1093
|
-
"kind.assistant": "
|
|
1094
|
-
"kind.tool": "
|
|
1095
|
-
"kind.subtool": "
|
|
1096
|
-
"kind.sub": "
|
|
1208
|
+
"kind.assistant": "АССИСТЕНТ",
|
|
1209
|
+
"kind.tool": "ИНСТРУМЕНТ",
|
|
1210
|
+
"kind.subtool": "ИНСТРУМЕНТ СУБАГЕНТА",
|
|
1211
|
+
"kind.sub": "СУБАГЕНТ",
|
|
1097
1212
|
"column.output": "Вывод",
|
|
1098
1213
|
"column.think": "Размышление",
|
|
1099
1214
|
"column.time": "Время",
|
|
@@ -1171,8 +1286,12 @@ window.__ModuleLoader__.load({
|
|
|
1171
1286
|
"request.rowAriaCompaction": "Запрос {request}, сжатие",
|
|
1172
1287
|
"request.noContent": "нет содержимого",
|
|
1173
1288
|
"summary.toolCalls.one": "{count} вызов инструмента",
|
|
1289
|
+
"summary.toolCalls.few": "{count} вызова инструментов",
|
|
1290
|
+
"summary.toolCalls.many": "{count} вызовов инструментов",
|
|
1174
1291
|
"summary.toolCalls.other": "Вызовов инструментов: {count}",
|
|
1175
1292
|
"summary.steps.one": "{count} шаг",
|
|
1293
|
+
"summary.steps.few": "{count} шага",
|
|
1294
|
+
"summary.steps.many": "{count} шагов",
|
|
1176
1295
|
"summary.steps.other": "Шагов: {count}",
|
|
1177
1296
|
"details.status": "Состояние",
|
|
1178
1297
|
"details.purpose": "Назначение",
|
|
@@ -1182,7 +1301,6 @@ window.__ModuleLoader__.load({
|
|
|
1182
1301
|
"details.error": "Ошибка",
|
|
1183
1302
|
"details.failure.auth": "Недействительный API-ключ",
|
|
1184
1303
|
"details.retry": "Повтор",
|
|
1185
|
-
"details.scheduled": "Запланирован",
|
|
1186
1304
|
"details.retryDelay": "Задержка повтора",
|
|
1187
1305
|
"details.result": "Результат",
|
|
1188
1306
|
"details.compacted": "Сжато",
|
|
@@ -1220,6 +1338,7 @@ window.__ModuleLoader__.load({
|
|
|
1220
1338
|
"layout.toolsRemovedCount": "удалено: {count}"
|
|
1221
1339
|
},
|
|
1222
1340
|
"question": {
|
|
1341
|
+
"error.unavailable": "Сейчас отправить нельзя; повторите через мгновение.",
|
|
1223
1342
|
"error.resubmit": "Ответ не успел дойти до продолжения работы; отправьте его ещё раз.",
|
|
1224
1343
|
"status.sent": "Ответ отправлен; панель не удалось закрыть.",
|
|
1225
1344
|
"wait.takeTime": "Не спешите",
|
|
@@ -1254,6 +1373,8 @@ window.__ModuleLoader__.load({
|
|
|
1254
1373
|
"workflowRun": {
|
|
1255
1374
|
"run.title": "{name}",
|
|
1256
1375
|
"run.members.one": "{count} участник",
|
|
1376
|
+
"run.members.few": "{count} участника",
|
|
1377
|
+
"run.members.many": "{count} участников",
|
|
1257
1378
|
"run.members.other": "Участников: {count}",
|
|
1258
1379
|
"run.empty": "Участники не запущены",
|
|
1259
1380
|
"phase.unassigned": "Без фазы",
|
|
@@ -1272,6 +1393,8 @@ window.__ModuleLoader__.load({
|
|
|
1272
1393
|
"status.interrupted": "Прервано"
|
|
1273
1394
|
},
|
|
1274
1395
|
"workspace": {
|
|
1396
|
+
"toast.forkRequiresOpen": "Откройте исходную сессию, чтобы завершить миграцию, прежде чем создавать ветку.",
|
|
1397
|
+
"toast.openForkSource": "Открыть исходную сессию",
|
|
1275
1398
|
"session.untitled": "Без названия",
|
|
1276
1399
|
"draft.workspaceRequired": "Сначала выберите рабочее пространство.",
|
|
1277
1400
|
"draft.initializationFailed": "Не удалось заполнить черновик. Повторите попытку немного позже.",
|
|
@@ -1314,12 +1437,16 @@ window.__ModuleLoader__.load({
|
|
|
1314
1437
|
"menu.fork": "Создать ответвление сессии",
|
|
1315
1438
|
"menu.archiveSession": "Архивировать сессию",
|
|
1316
1439
|
"sessions.count.one": "{n} сессия",
|
|
1440
|
+
"sessions.count.few": "{n} сессии",
|
|
1441
|
+
"sessions.count.many": "{n} сессий",
|
|
1317
1442
|
"sessions.count.other": "Сессий: {n}",
|
|
1318
1443
|
"actions.workspace.aria": "Действия рабочего пространства {name}",
|
|
1319
1444
|
"actions.session.aria": "Действия сессии {name}",
|
|
1320
1445
|
"actions.newSession.aria": "Новая сессия в {name}",
|
|
1321
1446
|
"status.running": "Выполняется",
|
|
1322
1447
|
"status.subagentsRunning.one": "{n} субагент выполняется",
|
|
1448
|
+
"status.subagentsRunning.few": "{n} субагента выполняются",
|
|
1449
|
+
"status.subagentsRunning.many": "{n} субагентов выполняется",
|
|
1323
1450
|
"status.subagentsRunning.other": "Субагентов выполняется: {n}",
|
|
1324
1451
|
"status.idle": "Ожидает",
|
|
1325
1452
|
"status.waitingApproval": "Ожидает одобрения",
|
|
@@ -1337,8 +1464,6 @@ window.__ModuleLoader__.load({
|
|
|
1337
1464
|
"time.years": "{n} г",
|
|
1338
1465
|
"time.ago": "{t} назад",
|
|
1339
1466
|
"defaultWorkspace.failed": "Не удалось создать рабочее пространство по умолчанию. Выберите папку через «Выбрать рабочее пространство».",
|
|
1340
|
-
"defaultWorkspace.title": "Рабочее пространство по умолчанию",
|
|
1341
|
-
"schedule.active": "Есть активная задача по расписанию",
|
|
1342
1467
|
"groupBy.workspaceTree": "Дерево рабочих пространств",
|
|
1343
1468
|
"filterBy.label": "Фильтр сессий",
|
|
1344
1469
|
"viewOptions.showArchived": "Все диалоги (с архивными)",
|
|
@@ -1356,12 +1481,20 @@ window.__ModuleLoader__.load({
|
|
|
1356
1481
|
"archive.confirm.activity": "Работа, которая будет остановлена",
|
|
1357
1482
|
"archive.confirm.turn": "Текущий ход",
|
|
1358
1483
|
"archive.confirm.subagents.one": "{n} выполняющийся субагент: {names}",
|
|
1484
|
+
"archive.confirm.subagents.few": "{n} выполняющихся субагента: {names}",
|
|
1485
|
+
"archive.confirm.subagents.many": "{n} выполняющихся субагентов: {names}",
|
|
1359
1486
|
"archive.confirm.subagents.other": "Выполняющихся субагентов: {n} — {names}",
|
|
1360
1487
|
"archive.confirm.jobs.one": "{n} фоновая задача: {names}",
|
|
1488
|
+
"archive.confirm.jobs.few": "{n} фоновые задачи: {names}",
|
|
1489
|
+
"archive.confirm.jobs.many": "{n} фоновых задач: {names}",
|
|
1361
1490
|
"archive.confirm.jobs.other": "Фоновых задач: {n} — {names}",
|
|
1362
1491
|
"archive.confirm.schedules.one": "{n} запланированное напоминание: {names}",
|
|
1492
|
+
"archive.confirm.schedules.few": "{n} запланированных напоминания: {names}",
|
|
1493
|
+
"archive.confirm.schedules.many": "{n} запланированных напоминаний: {names}",
|
|
1363
1494
|
"archive.confirm.schedules.other": "Запланированных напоминаний: {n} — {names}",
|
|
1364
1495
|
"archive.confirm.other.one": "{n} другая единица работы ({kind})",
|
|
1496
|
+
"archive.confirm.other.few": "{n} другие единицы работы ({kind})",
|
|
1497
|
+
"archive.confirm.other.many": "{n} других единиц работы ({kind})",
|
|
1365
1498
|
"archive.confirm.other.other": "Других единиц работы: {n} ({kind})",
|
|
1366
1499
|
"archive.confirm.listSeparator": ", ",
|
|
1367
1500
|
"archive.confirm.action": "Остановить и архивировать",
|
|
@@ -1387,7 +1520,10 @@ window.__ModuleLoader__.load({
|
|
|
1387
1520
|
"shortcut.forkFailed": "Не удалось создать форк сессии. Повторите попытку.",
|
|
1388
1521
|
"viewOptions.hideArchived": "Скрыть архивные",
|
|
1389
1522
|
"empty.noneArchived": "Архивных сессий пока нет",
|
|
1390
|
-
"empty.viewOthers": "Показать другие сессии"
|
|
1523
|
+
"empty.viewOthers": "Показать другие сессии",
|
|
1524
|
+
"menu.sessionId": "Скопировать ID сессии",
|
|
1525
|
+
"toast.sessionIdCopied": "ID сессии скопирован",
|
|
1526
|
+
"toast.sessionIdCopyFailed": "Не удалось скопировать. Повторите попытку."
|
|
1391
1527
|
},
|
|
1392
1528
|
"agent-team": {
|
|
1393
1529
|
"memberStatus.running": "Выполняется",
|
|
@@ -1482,16 +1618,20 @@ window.__ModuleLoader__.load({
|
|
|
1482
1618
|
"menu.feedback": "Отзыв"
|
|
1483
1619
|
},
|
|
1484
1620
|
"chat": {
|
|
1621
|
+
"settings.collapse.title": "Когда сворачивать ход работы",
|
|
1622
|
+
"settings.collapse.description": "Выберите, когда автоматически сворачивать ход работы",
|
|
1623
|
+
"settings.collapse.completion": "По завершении",
|
|
1624
|
+
"settings.collapse.nextInput": "При следующем сообщении",
|
|
1485
1625
|
"chat.deepDivingFor": "Углублённый анализ: {duration} ···",
|
|
1486
1626
|
"duration.secondUnit": "с",
|
|
1487
1627
|
"duration.minuteUnit": "мин ",
|
|
1488
1628
|
"duration.hourUnit": "ч ",
|
|
1489
1629
|
"view.chat": "Чат",
|
|
1490
|
-
"number.groupSeparator": "
|
|
1630
|
+
"number.groupSeparator": "\xA0",
|
|
1491
1631
|
"duration.compactSeconds": "{seconds} с",
|
|
1492
1632
|
"duration.compactMinutes": "{minutes} мин {seconds} с",
|
|
1493
1633
|
"duration.milliseconds": "{milliseconds} мс",
|
|
1494
|
-
"stats.counts": "{turns}
|
|
1634
|
+
"stats.counts": "Ходов: {turns}, шагов: {steps}",
|
|
1495
1635
|
"stats.cacheHit": "Попадание в кэш {percent}%",
|
|
1496
1636
|
"chat.loadingHistory": "Загрузка истории…",
|
|
1497
1637
|
"chat.loadError": "Не удалось загрузить историю: {message} ({code})",
|
|
@@ -1505,7 +1645,6 @@ window.__ModuleLoader__.load({
|
|
|
1505
1645
|
"settings.transcript.title": "Детали работы",
|
|
1506
1646
|
"settings.transcript.description": "Выберите, сколько деталей показывать для вызовов инструментов",
|
|
1507
1647
|
"settings.transcript.compact": "Компактный",
|
|
1508
|
-
"settings.transcript.expanded": "Полностью развёрнутый",
|
|
1509
1648
|
"fileOpen.title": "Не удалось открыть файл",
|
|
1510
1649
|
"fileOpen.unknown": "Не удалось открыть этот файл",
|
|
1511
1650
|
"message.extraBlock": "Дополнительный блок содержимого",
|
|
@@ -1526,7 +1665,7 @@ window.__ModuleLoader__.load({
|
|
|
1526
1665
|
"message.context.recall.truncated": "обрезано",
|
|
1527
1666
|
"message.compaction": "Контекст сжат",
|
|
1528
1667
|
"message.compaction.running": "Сжатие контекста…",
|
|
1529
|
-
"message.compaction.completed": "Сжато {items}
|
|
1668
|
+
"message.compaction.completed": "Сжато записей истории: {items} (~{tokens} ток)",
|
|
1530
1669
|
"message.compaction.expand": "Показать сводку сжатия",
|
|
1531
1670
|
"message.compaction.unavailable": "Сводка сжатия недоступна",
|
|
1532
1671
|
"message.compaction.commandTitle": "compact",
|
|
@@ -1534,10 +1673,16 @@ window.__ModuleLoader__.load({
|
|
|
1534
1673
|
"message.unknownSurface": "Неизвестное surface-событие: {type}",
|
|
1535
1674
|
"message.unknownBlock": "Неизвестный блок содержимого",
|
|
1536
1675
|
"message.turnProcess.toolCalls.one": "{count} вызов инструмента",
|
|
1676
|
+
"message.turnProcess.toolCalls.few": "{count} вызова инструментов",
|
|
1677
|
+
"message.turnProcess.toolCalls.many": "{count} вызовов инструментов",
|
|
1537
1678
|
"message.turnProcess.toolCalls.other": "Вызовов инструментов: {count}",
|
|
1538
1679
|
"message.turnProcess.messages.one": "{count} сообщение",
|
|
1680
|
+
"message.turnProcess.messages.few": "{count} сообщения",
|
|
1681
|
+
"message.turnProcess.messages.many": "{count} сообщений",
|
|
1539
1682
|
"message.turnProcess.messages.other": "Сообщений: {count}",
|
|
1540
1683
|
"message.turnProcess.subagents.one": "{count} субагент",
|
|
1684
|
+
"message.turnProcess.subagents.few": "{count} субагента",
|
|
1685
|
+
"message.turnProcess.subagents.many": "{count} субагентов",
|
|
1541
1686
|
"message.turnProcess.subagents.other": "Субагентов: {count}",
|
|
1542
1687
|
"message.turnProcess.thoughtForAWhile": "Думал некоторое время",
|
|
1543
1688
|
"message.turnProcess.separator": " · ",
|
|
@@ -1574,7 +1719,7 @@ window.__ModuleLoader__.load({
|
|
|
1574
1719
|
"command.title": "Команда",
|
|
1575
1720
|
"row.running": "Выполняется",
|
|
1576
1721
|
"row.failed": "Ошибка",
|
|
1577
|
-
"json.truncated": "… обрезано,
|
|
1722
|
+
"json.truncated": "… обрезано, символов: {total}",
|
|
1578
1723
|
"clock.md": "{d}.{m}",
|
|
1579
1724
|
"clock.ymd": "{d}.{m}.{y}",
|
|
1580
1725
|
"message.systemPromptUpdate": "Системный промпт обновлён",
|
|
@@ -1625,8 +1770,7 @@ window.__ModuleLoader__.load({
|
|
|
1625
1770
|
"message.trigger.plugin": "Обновлён статус плагина",
|
|
1626
1771
|
"message.trigger.explanation": "Это уведомление запустило этот ответ.",
|
|
1627
1772
|
"message.turnProcess.worked": "Работал",
|
|
1628
|
-
"message.turnProcess.
|
|
1629
|
-
"message.turnProcess.took": "Заняло {duration}",
|
|
1773
|
+
"message.turnProcess.took": "Заняло ",
|
|
1630
1774
|
"message.turnProcess.failed": "Сбой",
|
|
1631
1775
|
"settings.performance.title": "Производительность и расход",
|
|
1632
1776
|
"settings.performance.description": "Выберите, сколько сведений о производительности и расходе показывать",
|
|
@@ -1669,10 +1813,11 @@ window.__ModuleLoader__.load({
|
|
|
1669
1813
|
"message.toolsRemoved": "Удалены: {names}",
|
|
1670
1814
|
"message.toolsRemovedCount": "удалено: {count}",
|
|
1671
1815
|
"message.toolsUpdated": "Инструменты обновлены",
|
|
1672
|
-
"message.accountStopped": "Задача остановлена",
|
|
1673
1816
|
"message.failure.accountSignedOut": "Остановлено, потому что вы вышли из DeepSeek.",
|
|
1674
1817
|
"message.failure.accountSignInRequired": "Войдите в DeepSeek и убедитесь, что адресат запроса поддерживает авторизацию по учётной записи.",
|
|
1675
|
-
"message.failure.quota": "Квота запросов исчерпана."
|
|
1818
|
+
"message.failure.quota": "Квота запросов исчерпана.",
|
|
1819
|
+
"message.taskStopped": "Задача остановлена",
|
|
1820
|
+
"message.failure.interrupted": "Процесс DSH завершился до окончания этого хода (например, его остановили, он упал или истёк тайм-аут при завершении), поэтому при перезапуске DSH ход был закрыт. Исход незавершённых вызовов инструментов неизвестен."
|
|
1676
1821
|
},
|
|
1677
1822
|
"open-in-app": {
|
|
1678
1823
|
"open.title": "Открыть в {app}",
|
|
@@ -1766,7 +1911,7 @@ window.__ModuleLoader__.load({
|
|
|
1766
1911
|
"dock.splitPaneDisabled": "Максимум две области",
|
|
1767
1912
|
"dock.splitPaneNarrow": "Недостаточно ширины для разделения — расширьте боковую панель",
|
|
1768
1913
|
"tab.guide.title": "Начало",
|
|
1769
|
-
"tab.unavailable": "
|
|
1914
|
+
"tab.unavailable": "Такое содержимое здесь пока не отображается.",
|
|
1770
1915
|
"command.close": "Закрыть текущую страницу или окно",
|
|
1771
1916
|
"command.refresh": "Обновить текущую страницу",
|
|
1772
1917
|
"command.noRefresh": "Эту страницу нельзя обновить",
|
|
@@ -1778,8 +1923,8 @@ window.__ModuleLoader__.load({
|
|
|
1778
1923
|
"command.collapsed": "Сначала разверните правую панель",
|
|
1779
1924
|
"command.float": "Действие недоступно в плавающей панели",
|
|
1780
1925
|
"command.empty": "Сначала откройте страницу",
|
|
1781
|
-
"command.budget": "
|
|
1782
|
-
"command.width": "Недостаточно ширины для
|
|
1926
|
+
"command.budget": "Максимум две области",
|
|
1927
|
+
"command.width": "Недостаточно ширины для разделения — расширьте боковую панель"
|
|
1783
1928
|
},
|
|
1784
1929
|
"documentHtml": {
|
|
1785
1930
|
"title": "HTML",
|
|
@@ -1877,6 +2022,12 @@ window.__ModuleLoader__.load({
|
|
|
1877
2022
|
"terminalLimit": "Достигнут предел числа терминалов. Закройте ненужные и повторите. Завершённые терминалы тоже учитываются.",
|
|
1878
2023
|
"shortcut.noSession": "Сначала выберите сессию"
|
|
1879
2024
|
},
|
|
2025
|
+
"settings.sessionLog": {
|
|
2026
|
+
"title": "Загружать журнал сессии при работе с официальным API модели",
|
|
2027
|
+
"description": "Помогите улучшать модели и продукты DeepSeek.",
|
|
2028
|
+
"saved": "Настройка сохранена",
|
|
2029
|
+
"failed": "Не удалось сохранить настройку"
|
|
2030
|
+
},
|
|
1880
2031
|
"settings.agentLoop": {
|
|
1881
2032
|
"title": "Цикл агента",
|
|
1882
2033
|
"description": "Управляет тем, как агент распределяет вызовы инструментов.",
|
|
@@ -1884,11 +2035,11 @@ window.__ModuleLoader__.load({
|
|
|
1884
2035
|
"maxParallelHint": "Верхний предел одновременно выполняемых параллельно безопасных вызовов в пределах одного шага.",
|
|
1885
2036
|
"overridden": "Переопределено",
|
|
1886
2037
|
"reset": "Сбросить к значению по умолчанию",
|
|
1887
|
-
"readOnly": "В
|
|
2038
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
1888
2039
|
"unavailable": "Этот плагин не загружен, поэтому сейчас его нельзя настроить.",
|
|
1889
2040
|
"save": "Сохранить",
|
|
1890
2041
|
"saving": "Сохранение…",
|
|
1891
|
-
"saveFailed": "
|
|
2042
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
1892
2043
|
"invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию."
|
|
1893
2044
|
},
|
|
1894
2045
|
"settings.shell": {
|
|
@@ -1900,14 +2051,23 @@ window.__ModuleLoader__.load({
|
|
|
1900
2051
|
"maxOutputBytesHint": "Вывод сверх лимита сохраняется во временный файл, а не теряется.",
|
|
1901
2052
|
"overridden": "Переопределено",
|
|
1902
2053
|
"reset": "Сбросить к значению по умолчанию",
|
|
1903
|
-
"readOnly": "В
|
|
2054
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
1904
2055
|
"unavailable": "Этот плагин не загружен, поэтому сейчас его нельзя настроить.",
|
|
1905
2056
|
"save": "Сохранить",
|
|
1906
2057
|
"saving": "Сохранение…",
|
|
1907
|
-
"saveFailed": "
|
|
2058
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
1908
2059
|
"invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию."
|
|
1909
2060
|
},
|
|
1910
2061
|
"settings.webSearch": {
|
|
2062
|
+
"useSearchApi": "Использовать новый API веб-поиска",
|
|
2063
|
+
"useSearchApiHint": "По умолчанию выключено: поиск идёт через DeepSeek Messages. О возможностях и ценах нового API веб-поиска читайте в ",
|
|
2064
|
+
"searchGuide": "Руководство по Search & Fetch",
|
|
2065
|
+
"searchGuideUrl": "https://api-docs.deepseek.com/guides/search",
|
|
2066
|
+
"searchApiBaseUrl": "Базовый URL API поиска и загрузки",
|
|
2067
|
+
"searchApiBaseUrlHint": "Укажите префикс API, например https://api.deepseek.com/v1/tools. Провайдер добавит /search или /fetch. Оставьте пустым, чтобы вернуть значение по умолчанию.",
|
|
2068
|
+
"count": "Результатов на поиск",
|
|
2069
|
+
"countHint": "Сколько результатов на запрос: целое от 1 до 50, по умолчанию 10. Это число результатов, а не число вызовов поиска. web_search держит не больше источников, чем позволяет его собственный лимит результатов.",
|
|
2070
|
+
"invalidCount": "Введите целое от 1 до 50 или оставьте пустым, чтобы использовать значение по умолчанию.",
|
|
1911
2071
|
"title": "Веб-поиск",
|
|
1912
2072
|
"description": "Настройка поискового провайдера DeepSeek.",
|
|
1913
2073
|
"apiKey": "API-ключ",
|
|
@@ -1915,16 +2075,16 @@ window.__ModuleLoader__.load({
|
|
|
1915
2075
|
"apiKeySet": "Ключ настроен.",
|
|
1916
2076
|
"apiKeyUnset": "Ключ не настроен; поиск недоступен, пока он не будет добавлен.",
|
|
1917
2077
|
"baseUrl": "Эндпоинт",
|
|
1918
|
-
"baseUrlHint": "Оставьте пустым, чтобы
|
|
2078
|
+
"baseUrlHint": "Укажите адрес с префиксом API, например https://api.deepseek.com/anthropic/v1: провайдер добавит к нему /messages. Оставьте пустым, чтобы вернуть адрес по умолчанию.",
|
|
1919
2079
|
"maxUses": "Максимум поисков за запрос",
|
|
1920
|
-
"maxUsesHint": "Сколько
|
|
2080
|
+
"maxUsesHint": "Сколько поисков вспомогательная модель может выполнить в одном запросе Messages. Действует только для Messages API.",
|
|
1921
2081
|
"overridden": "Переопределено",
|
|
1922
2082
|
"reset": "Сбросить к значению по умолчанию",
|
|
1923
|
-
"readOnly": "В
|
|
2083
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
1924
2084
|
"unavailable": "Этот плагин не загружен, поэтому сейчас его нельзя настроить.",
|
|
1925
2085
|
"save": "Сохранить",
|
|
1926
2086
|
"saving": "Сохранение…",
|
|
1927
|
-
"saveFailed": "
|
|
2087
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
1928
2088
|
"invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию."
|
|
1929
2089
|
},
|
|
1930
2090
|
"sidebarExcel": {
|
|
@@ -1992,11 +2152,11 @@ window.__ModuleLoader__.load({
|
|
|
1992
2152
|
"settings.subagent": {
|
|
1993
2153
|
"overridden": "Переопределено",
|
|
1994
2154
|
"reset": "Сбросить к значению по умолчанию",
|
|
1995
|
-
"readOnly": "В
|
|
2155
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
1996
2156
|
"unavailable": "Этот плагин не загружен, поэтому сейчас его нельзя настроить.",
|
|
1997
2157
|
"save": "Сохранить",
|
|
1998
2158
|
"saving": "Сохранение…",
|
|
1999
|
-
"saveFailed": "
|
|
2159
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
2000
2160
|
"subagentTitle": "Субагент",
|
|
2001
2161
|
"subagentDescription": "Настройка глубины рекурсии, количества и моделей субагентов.",
|
|
2002
2162
|
"subagentLimitsTitle": "Ограничения",
|
|
@@ -2114,25 +2274,25 @@ window.__ModuleLoader__.load({
|
|
|
2114
2274
|
"onboardingSaveFailed": "Не удалось сохранить настройки. Повторите попытку.",
|
|
2115
2275
|
"onboardingRetry": "Повторить",
|
|
2116
2276
|
"onboardingLoading": "Загрузка настроек…",
|
|
2117
|
-
"contactUsSignedOut": "Связаться с нами",
|
|
2118
2277
|
"signOutUnknownDescription": "Не удалось проверить выполняющиеся задачи. Выход может прервать задачи, использующие эту учётную запись. Выйти сейчас?",
|
|
2119
2278
|
"signOutDescription": "Выход не удалит данные. В эту учётную запись можно войти снова.",
|
|
2120
2279
|
"signOutRunningDescription": "Сейчас выполняются задачи. Выход прервёт их. Выйти сейчас?",
|
|
2121
2280
|
"quotaTitle": "Нет доступного баланса",
|
|
2122
2281
|
"quotaDescription": "Без баланса DeepSeek Harness не может начать новую задачу в этой учётной записи. Пополнить баланс? Это можно сделать и позже в «Настройки» → «Учётная запись».",
|
|
2123
2282
|
"quotaTopUp": "Пополнить",
|
|
2124
|
-
"bonusNoticeTitle": "Бонус начислен"
|
|
2125
|
-
"bonusEmpty": "Бонус отсутствует"
|
|
2283
|
+
"bonusNoticeTitle": "Бонус начислен"
|
|
2126
2284
|
},
|
|
2127
2285
|
"claude-code-mods": {
|
|
2128
2286
|
"band": "Модификаторы Claude Code",
|
|
2129
2287
|
"pressing": "Работа…",
|
|
2130
|
-
"press.failed": "
|
|
2131
|
-
"press.stale": "Эта кнопка
|
|
2288
|
+
"press.failed": "Кнопка не сработала: {message}",
|
|
2289
|
+
"press.stale": "Эта кнопка осталась от прошлой отрисовки; полоса обновилась"
|
|
2132
2290
|
},
|
|
2133
2291
|
"inspectorPanel": {
|
|
2292
|
+
"title": "Инспектор Node.js",
|
|
2293
|
+
"toggle": "Показать или скрыть инспектор Node.js",
|
|
2134
2294
|
"resize": "Изменить высоту панели NodeJS Inspector",
|
|
2135
|
-
"frameTitle": "
|
|
2295
|
+
"frameTitle": "Инспектор Node.js"
|
|
2136
2296
|
},
|
|
2137
2297
|
"session-inspector": {
|
|
2138
2298
|
"tab.title": "Журнал сессии",
|
|
@@ -2142,7 +2302,7 @@ window.__ModuleLoader__.load({
|
|
|
2142
2302
|
"view.chatNode": "Группа чата",
|
|
2143
2303
|
"picker.pick": "Выбрать элемент в виде чата",
|
|
2144
2304
|
"picker.cancel": "Отменить выбор (Esc)",
|
|
2145
|
-
"picker.instructions": "Наведите в основном чате для предпросмотра, затем щёлкните для выбора. Esc отменяет.",
|
|
2305
|
+
"picker.instructions": "Наведите курсор в основном чате для предпросмотра, затем щёлкните для выбора. Esc отменяет.",
|
|
2146
2306
|
"picker.noMatch": "В этой таблице нет подходящей записи. Выберите другой элемент или нажмите Esc для отмены.",
|
|
2147
2307
|
"picker.noChat": "Сначала откройте эту сессию в основном чате.",
|
|
2148
2308
|
"table.id": "Индекс",
|
|
@@ -2189,6 +2349,23 @@ window.__ModuleLoader__.load({
|
|
|
2189
2349
|
"object.navigation": "Навигация по сырым данным"
|
|
2190
2350
|
},
|
|
2191
2351
|
"pluginManager": {
|
|
2352
|
+
"tabsLabel": "Разделы плагинов",
|
|
2353
|
+
"installedTab": "Установленные",
|
|
2354
|
+
"installConfirmedTitle": "Установить плагин",
|
|
2355
|
+
"installConfirmedRefused": "Этот плагин установить нельзя",
|
|
2356
|
+
"basicTitle": "Настройки встроенных плагинов",
|
|
2357
|
+
"extensionsTitle": "Экспериментальные плагины",
|
|
2358
|
+
"moreTitle": "Экспериментальные плагины",
|
|
2359
|
+
"moreAction": "Ещё",
|
|
2360
|
+
"statusNotInstalled": "Не установлен",
|
|
2361
|
+
"statusMissingFiles": "Пакет недоступен",
|
|
2362
|
+
"statusUpdateAvailable": "Доступно обновление",
|
|
2363
|
+
"sourceNotInstalled": "Не установлен",
|
|
2364
|
+
"sourceTargetSpec": "Источник для этого DSH",
|
|
2365
|
+
"sourceTargetVersion": "Версия для этого DSH",
|
|
2366
|
+
"update": "Обновить",
|
|
2367
|
+
"updateLabel": "Обновить {name}",
|
|
2368
|
+
"terminalCommandLine": "Строка команды {n}",
|
|
2192
2369
|
"infoLabel": "О плагинах",
|
|
2193
2370
|
"infoDescription": "Здесь настраиваются официальные плагины, а также устанавливаются и управляются остальные. Список встроенных плагинов и их состояние — в разделе «Настройки → Встроенные плагины».",
|
|
2194
2371
|
"refreshError": "Не удалось обновить. Попробуйте ещё раз.",
|
|
@@ -2212,15 +2389,14 @@ window.__ModuleLoader__.load({
|
|
|
2212
2389
|
"intro": "Добавление плагинов и управление ими",
|
|
2213
2390
|
"loading": "Чтение плагинов…",
|
|
2214
2391
|
"error": "Не удалось прочитать все плагины — возможно, проблема с сетью",
|
|
2215
|
-
"unavailable": "
|
|
2392
|
+
"unavailable": "Это развёртывание работает без управляемого профиля, поэтому здесь нельзя устанавливать плагины и переключать их.",
|
|
2216
2393
|
"retry": "Повторить",
|
|
2217
2394
|
"refresh": "Обновить",
|
|
2218
2395
|
"empty": "Пока не установлено ни одного плагина.",
|
|
2219
2396
|
"addPlugin": "Добавить плагин",
|
|
2220
|
-
"restartNotice": "
|
|
2397
|
+
"restartNotice": "Чтобы изменение вступило в силу, перезапустите DSH. {reason}",
|
|
2221
2398
|
"overriddenNotice": "{name} сохранён, но конфигурация с более высоким приоритетом переопределяет его, поэтому он не действует",
|
|
2222
2399
|
"bundlesTitle": "Установленные",
|
|
2223
|
-
"officialTitle": "Официальные",
|
|
2224
2400
|
"statusProblem": "Проблема",
|
|
2225
2401
|
"statusBeta": "Экспериментально",
|
|
2226
2402
|
"reasonLabel": "Причина",
|
|
@@ -2259,12 +2435,6 @@ window.__ModuleLoader__.load({
|
|
|
2259
2435
|
"installGuideIdTitle": "Имя пакета",
|
|
2260
2436
|
"installGuideIdExample": "@deepseek-ai/dsh-subagent-codex",
|
|
2261
2437
|
"installGuideIdHint": "Имя пакета плагина — это имя пакета в npm (например, dsh-xxx или @author/plugin): то, что идёт после dsh plugin add или pnpm add в команде установки из README стороннего плагина.",
|
|
2262
|
-
"installGuideGitTitle": "Адрес репозитория GitHub",
|
|
2263
|
-
"installGuideGitExample": "https://github.com/author/dsh-plugin",
|
|
2264
|
-
"installGuideGitHint": "Адрес открытого репозитория плагина на GitHub; другие хостинги Git тоже подойдут.",
|
|
2265
|
-
"installGuidePathTitle": "Локальный каталог плагина",
|
|
2266
|
-
"installGuidePathExample": "/Users/name/my-plugin",
|
|
2267
|
-
"installGuidePathHint": "Абсолютный путь к каталогу плагина на этой машине — созданному здесь или скачанному.",
|
|
2268
2438
|
"installGuideExampleLabel": "Пример: ",
|
|
2269
2439
|
"installGuideFill": "Подставить пример",
|
|
2270
2440
|
"installGuideFillAria": "Подставить пример {example}",
|
|
@@ -2273,10 +2443,9 @@ window.__ModuleLoader__.load({
|
|
|
2273
2443
|
"registryLegend": "Реестр npm, из которого скачивается плагин",
|
|
2274
2444
|
"registryDefault": "Реестр по умолчанию",
|
|
2275
2445
|
"registryNpmmirror": "Зеркало для материкового Китая",
|
|
2276
|
-
"registryWithHost": "{name} ({host})",
|
|
2277
2446
|
"registryCustom": "Свой адрес",
|
|
2278
2447
|
"registryCustomPlaceholder": "https://npm.example.com/",
|
|
2279
|
-
"registryCustomHint": "Корпоративный или частный реестр npm; если для него нужен вход, храните учётные данные в ~/.npmrc на этой
|
|
2448
|
+
"registryCustomHint": "Корпоративный или частный реестр npm; если для него нужен вход, храните учётные данные в ~/.npmrc на этой машине.",
|
|
2280
2449
|
"registryCustomInvalid": "Введите адрес, начинающийся с http:// или https://",
|
|
2281
2450
|
"registryListSeparator": ", ",
|
|
2282
2451
|
"installRun": "Установить",
|
|
@@ -2330,7 +2499,7 @@ window.__ModuleLoader__.load({
|
|
|
2330
2499
|
"installAttemptBadge": "Попытка {index} · {registry}",
|
|
2331
2500
|
"installFailureNetwork": "Не удалось подключиться к сети",
|
|
2332
2501
|
"installFailureNetworkAll": "Ни один реестр не ответил (проверены: {registries}). Проверьте сеть и настройки прокси или смените реестр и повторите.",
|
|
2333
|
-
"installFailureNetworkHost": "Не удалось связаться с {host}. Адрес GitHub или ссылка .tgz не загружаются через реестр: эта машина должна иметь к ним прямой доступ
|
|
2502
|
+
"installFailureNetworkHost": "Не удалось связаться с {host}. Адрес GitHub или прямая ссылка на .tgz не загружаются через реестр: эта машина должна иметь к ним прямой доступ либо доступ через прокси. Если плагин также опубликован в npm, введите вместо этого имя его пакета.",
|
|
2334
2503
|
"installFailureNotFound": "Такой плагин не найден",
|
|
2335
2504
|
"installFailureNoMatchingVersion": "Нет версии, подходящей под запрос",
|
|
2336
2505
|
"installFailureDiskFull": "Диск заполнен; установка остановлена",
|
|
@@ -2349,13 +2518,19 @@ window.__ModuleLoader__.load({
|
|
|
2349
2518
|
"terminalNoOutput": "Нет вывода",
|
|
2350
2519
|
"terminalCollapseAria": "Свернуть вывод",
|
|
2351
2520
|
"terminalCollapse": "Свернуть",
|
|
2352
|
-
"terminalExpandAria": "Развернуть оставшиеся
|
|
2521
|
+
"terminalExpandAria": "Развернуть оставшиеся {n} строк вывода",
|
|
2522
|
+
"terminalExpandAria.one": "Развернуть оставшуюся {n} строку вывода",
|
|
2523
|
+
"terminalExpandAria.few": "Развернуть оставшиеся {n} строки вывода",
|
|
2524
|
+
"terminalExpandAria.many": "Развернуть оставшиеся {n} строк вывода",
|
|
2353
2525
|
"terminalExpand": "… ещё {n} строк",
|
|
2526
|
+
"terminalExpand.one": "… ещё {n} строку",
|
|
2527
|
+
"terminalExpand.few": "… ещё {n} строки",
|
|
2528
|
+
"terminalExpand.many": "… ещё {n} строк",
|
|
2354
2529
|
"terminalExitCode": "код выхода {code}",
|
|
2355
2530
|
"terminalSignal": "сигнал {signal}",
|
|
2356
2531
|
"terminalNoExitCode": "нет кода выхода",
|
|
2357
2532
|
"installDoneNothing": "Установка завершена, новых зависимостей нет.",
|
|
2358
|
-
"installDoneRestart": "Установлено;
|
|
2533
|
+
"installDoneRestart": "Установлено; чтобы загрузить, перезапустите DSH. {reason}",
|
|
2359
2534
|
"installDoneApproved": "Скрипты установки разрешены для {names}",
|
|
2360
2535
|
"installApprovalTitle": "Скриптам установки нужно разрешение",
|
|
2361
2536
|
"installApprovalDescription": "У этих пакетов есть скрипты установки, которые pnpm не выполнил.",
|
|
@@ -2389,12 +2564,28 @@ window.__ModuleLoader__.load({
|
|
|
2389
2564
|
"installGithubFailedDescription": "Попробуйте другой источник установки.",
|
|
2390
2565
|
"installUseGithubMirror": "Использовать зеркало для материкового Китая",
|
|
2391
2566
|
"installPackageLabel": "Имя пакета плагина",
|
|
2392
|
-
"reasonIncompatibleVersion": "{plugin} несовместим с DSH {runtime} (требуется {
|
|
2567
|
+
"reasonIncompatibleVersion": "{plugin} несовместим с DSH {runtime} (требуется {requirements}); его запуск может привести к сбоям или потере данных. Установите версию плагина, совместимую с этим DSH.",
|
|
2393
2568
|
"reasonIncompatibleVersionUnnamed": "Этот плагин несовместим с текущей версией DSH; его запуск может привести к сбоям или потере данных.",
|
|
2394
2569
|
"registryOfficial": "Официальный реестр npm",
|
|
2395
|
-
"installTryAnotherWay": "Попробовать другой способ"
|
|
2570
|
+
"installTryAnotherWay": "Попробовать другой способ",
|
|
2571
|
+
"previewAlt": "Предпросмотр возможности {name}",
|
|
2572
|
+
"previewUnavailable": "Не удалось показать предпросмотр функции",
|
|
2573
|
+
"reasonAlreadyInstalled": "Этот пакет уже установлен; удалите его, прежде чем устанавливать другую версию.",
|
|
2574
|
+
"restartReasonHostModule": "Изменение затрагивает модули, которые загрузил сам DSH.",
|
|
2575
|
+
"restartReasonModuleComparison": "DSH не смог сравнить загруженные плагины с их файлами.",
|
|
2576
|
+
"restartReasonNoHmr": "Этот профиль применяет изменения только при запуске.",
|
|
2577
|
+
"restartReasonPackageMoved": "Установленный пакет теперь указывает на другой каталог, либо изменение заменяет пакет, который поставляет сама установка DSH. Удалите пакет, прежде чем устанавливать его из другого места.",
|
|
2578
|
+
"restartReasonUnmanagedPlugin": "Изменение затрагивает плагин, работающий вне списка плагинов."
|
|
2396
2579
|
},
|
|
2397
2580
|
"voice-input": {
|
|
2581
|
+
"inputDevice": "Устройство ввода",
|
|
2582
|
+
"systemMicrophone": "Системное по умолчанию",
|
|
2583
|
+
"systemMicrophoneNamed": "Системное по умолчанию ({name})",
|
|
2584
|
+
"unnamedSelectedMicrophone": "Микрофон",
|
|
2585
|
+
"unnamedMicrophone": "Микрофон {number}",
|
|
2586
|
+
"inputLevel": "Уровень входного сигнала микрофона",
|
|
2587
|
+
"deviceUnavailable": "Недоступно",
|
|
2588
|
+
"deviceMissing": "Микрофон недоступен. Выберите другое устройство ввода.",
|
|
2398
2589
|
"dictate": "Диктовать",
|
|
2399
2590
|
"setupPrompt.title": "Настройте голосовой ввод перед записью",
|
|
2400
2591
|
"setupPrompt.body": "Голосовой ввод включён. При первом использовании нужно скачать и подготовить локальные модели распознавания. Откройте сведения о плагине, чтобы оценить место на диске, память и время до начала настройки.",
|
|
@@ -2402,11 +2593,11 @@ window.__ModuleLoader__.load({
|
|
|
2402
2593
|
"setupPrompt.open": "Перейти к настройке",
|
|
2403
2594
|
"setup.local": "Локальные модели будут скачаны на машину с DSH. Python и компилятор не требуются.",
|
|
2404
2595
|
"setup.disk": "Место на диске",
|
|
2405
|
-
"setup.diskValue": "
|
|
2596
|
+
"setup.diskValue": "Планируйте около {gb} ГБ на модели, среду выполнения и кэш загрузок",
|
|
2406
2597
|
"setup.memory": "Память",
|
|
2407
2598
|
"setup.memoryValue": "Около {gb} ГБ с загруженной моделью; при распознавании может потребоваться больше",
|
|
2408
2599
|
"setup.time": "Первая настройка",
|
|
2409
|
-
"setup.timeValue": "
|
|
2600
|
+
"setup.timeValue": "Планируйте примерно {min}–{max} минут в зависимости от сети и машины",
|
|
2410
2601
|
"setup.estimateNote": "Это оценки; в медленной сети может занять больше времени. Загрузки используются повторно; неактивные модели по умолчанию освобождают память.",
|
|
2411
2602
|
"step.check": "Проверка локальных ресурсов",
|
|
2412
2603
|
"step.model": "Подготовка модели распознавания",
|
|
@@ -2421,7 +2612,7 @@ window.__ModuleLoader__.load({
|
|
|
2421
2612
|
"short.downloading": "Загрузка",
|
|
2422
2613
|
"short.failed": "Сбой настройки",
|
|
2423
2614
|
"retryRecording": "Записать снова",
|
|
2424
|
-
"preparationSteps": "
|
|
2615
|
+
"preparationSteps": "Шаги подготовки",
|
|
2425
2616
|
"prepare": "Скачать и подготовить",
|
|
2426
2617
|
"retryPrepare": "Повторить подготовку",
|
|
2427
2618
|
"cancelPrepare": "Отменить подготовку",
|
|
@@ -2481,11 +2672,11 @@ window.__ModuleLoader__.load({
|
|
|
2481
2672
|
"cloud": "Аудио будет отправлено в выбранную облачную службу.",
|
|
2482
2673
|
"empty": "Речь не распознана",
|
|
2483
2674
|
"cancelled": "Голосовой ввод отменён.",
|
|
2484
|
-
"conflict": "Черновик изменился. Расшифровка
|
|
2675
|
+
"conflict": "Черновик изменился. Расшифровка сохранена — её можно вставить в позицию курсора.",
|
|
2485
2676
|
"failed": "Сбой распознавания речи: {message}",
|
|
2486
2677
|
"unavailable": "Этот браузер не может записывать аудио. Используйте браузер с поддержкой микрофона.",
|
|
2487
2678
|
"permission": "Доступ к микрофону запрещён. Разрешите его в настройках браузера и системы.",
|
|
2488
|
-
"tooLarge": "Запись превышает ограничение службы.
|
|
2679
|
+
"tooLarge": "Запись превышает ограничение службы. Сделайте её короче.",
|
|
2489
2680
|
"sourceChoice": "Источник загрузки моделей",
|
|
2490
2681
|
"sourceAuto": "Автоматически (рекомендуется)",
|
|
2491
2682
|
"sourceHuggingFace": "Hugging Face",
|
|
@@ -2497,6 +2688,40 @@ window.__ModuleLoader__.load({
|
|
|
2497
2688
|
"setupPrompt.unavailableTitle": "Распознавание речи не готово",
|
|
2498
2689
|
"setupPrompt.unavailableBody": "Откройте сведения о голосовом плагине, чтобы проверить состояние распознавания, ход подготовки или ошибки."
|
|
2499
2690
|
},
|
|
2691
|
+
"cotTranslation": {
|
|
2692
|
+
"provider": "Служба перевода",
|
|
2693
|
+
"google": "Google",
|
|
2694
|
+
"bing": "Bing",
|
|
2695
|
+
"deepseekAccount": "DeepSeek Flash — аккаунт (платно)",
|
|
2696
|
+
"deepseekOfficial": "DeepSeek Flash — официальный API (платно)",
|
|
2697
|
+
"providerUnavailableOption": "{provider} — недоступно",
|
|
2698
|
+
"providerUnavailable": "Эта служба недоступна. Настройте аккаунт DeepSeek или официальный API либо выберите доступную службу.",
|
|
2699
|
+
"paidNotice": "Каждый некэшированный фрагмент отправляет отдельный платный запрос DeepSeek Flash через выбранный аккаунт или учётные данные официального API. Повторное открытие рассуждений использует сохранённые результаты; смена службы, языка, исходного текста или параметров запроса может отправить новый платный запрос.",
|
|
2700
|
+
"anonymousNotice": "Bing и Google не требуют входа или API-ключа. Их анонимные эндпоинты могут отклонять запросы или ограничивать их.",
|
|
2701
|
+
"targetLanguage": "Язык перевода",
|
|
2702
|
+
"targetLanguageHint": "auto следует языку интерфейса; коды языков, например zh, en и ja, тоже работают.",
|
|
2703
|
+
"privacy": "Развёрнутые рассуждения отправляются в выбранную службу. Они могут содержать приватный код или детали переписки.",
|
|
2704
|
+
"translation": "Показать перевод",
|
|
2705
|
+
"original": "Показать оригинал",
|
|
2706
|
+
"retry": "Повторить",
|
|
2707
|
+
"failed": "Не удалось перевести. Показан оригинал.",
|
|
2708
|
+
"translating": "Перевод рассуждений",
|
|
2709
|
+
"invalidProvider": "Выберите службу перевода.",
|
|
2710
|
+
"invalidLanguage": "Введите auto или код языка, например zh, en или ja.",
|
|
2711
|
+
"overridden": "Переопределено",
|
|
2712
|
+
"reset": "Сбросить по умолчанию",
|
|
2713
|
+
"unavailable": "Настройки перевода недоступны.",
|
|
2714
|
+
"readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
2715
|
+
"saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
|
|
2716
|
+
"save": "Сохранить",
|
|
2717
|
+
"saving": "Сохранение…",
|
|
2718
|
+
"copy": "Копировать",
|
|
2719
|
+
"copied": "Скопировано",
|
|
2720
|
+
"codeTitle": "Блок кода",
|
|
2721
|
+
"wrap": "Переносить строки",
|
|
2722
|
+
"unwrap": "Не переносить строки",
|
|
2723
|
+
"footnotes": "Примечания"
|
|
2724
|
+
},
|
|
2500
2725
|
"schedule.catalog": {
|
|
2501
2726
|
"trigger.label": "Напоминания",
|
|
2502
2727
|
"list.loading": "Загрузка напоминаний…",
|
|
@@ -2507,19 +2732,19 @@ window.__ModuleLoader__.load({
|
|
|
2507
2732
|
"delete.label": "Удалить напоминание: {title}",
|
|
2508
2733
|
"list.open": "Открыть сведения о напоминании: {title}",
|
|
2509
2734
|
"trigger.one": "{count} напоминание",
|
|
2735
|
+
"trigger.few": "{count} напоминания",
|
|
2736
|
+
"trigger.many": "{count} напоминаний",
|
|
2510
2737
|
"trigger.other": "Напоминаний: {count}",
|
|
2511
2738
|
"list.aria": "Активные напоминания",
|
|
2512
|
-
"status.scheduled": "По расписанию",
|
|
2513
|
-
"status.overdue": "Просрочено",
|
|
2514
2739
|
"list.nextRun": "Следующий запуск",
|
|
2515
2740
|
"frequency.once": "Один раз",
|
|
2516
|
-
"frequency.every": "
|
|
2517
|
-
"time.locale": "
|
|
2741
|
+
"frequency.every": "Раз в {value} {unit}",
|
|
2742
|
+
"time.locale": "ru",
|
|
2518
2743
|
"time.utcPrefix": "UTC",
|
|
2519
2744
|
"frequency.daily": "Каждый день в {time} ({timeZone})",
|
|
2520
2745
|
"frequency.dailyLocal": "Каждый день в {time}",
|
|
2521
|
-
"frequency.weekly": "
|
|
2522
|
-
"frequency.weeklyLocal": "
|
|
2746
|
+
"frequency.weekly": "{weekdays} в {time} ({timeZone})",
|
|
2747
|
+
"frequency.weeklyLocal": "{weekdays} в {time}",
|
|
2523
2748
|
"frequency.cron": "Cron {expression} ({timeZone})",
|
|
2524
2749
|
"frequency.cronLocal": "Cron {expression}",
|
|
2525
2750
|
"frequency.cronRule": "{rule} ({timeZone})",
|
|
@@ -2527,7 +2752,7 @@ window.__ModuleLoader__.load({
|
|
|
2527
2752
|
"cron.part.join": " ",
|
|
2528
2753
|
"cron.weekday.name": "{weekday}",
|
|
2529
2754
|
"cron.weekday.range": "{from}–{to}",
|
|
2530
|
-
"cron.months": "
|
|
2755
|
+
"cron.months": " ({months})",
|
|
2531
2756
|
"cron.day.every": "Каждый день{months}",
|
|
2532
2757
|
"cron.day.weekdays": "{weekdays}{months}",
|
|
2533
2758
|
"cron.day.monthDays": "{days} числа каждого месяца{months}",
|
|
@@ -2536,19 +2761,29 @@ window.__ModuleLoader__.load({
|
|
|
2536
2761
|
"cron.hours.range": "{from}–{to}",
|
|
2537
2762
|
"cron.hours.list": "{hours}",
|
|
2538
2763
|
"cron.time.everyMinute": "Каждую минуту",
|
|
2539
|
-
"cron.time.everyMinutes": "Каждые {step}
|
|
2764
|
+
"cron.time.everyMinutes": "Каждые {step} минут",
|
|
2765
|
+
"cron.time.everyMinutes.few": "Каждые {step} минуты",
|
|
2766
|
+
"cron.time.everyMinutes.many": "Каждые {step} минут",
|
|
2540
2767
|
"cron.time.joinedEveryMinute": "каждую минуту",
|
|
2541
|
-
"cron.time.joinedEveryMinutes": "каждые {step}
|
|
2768
|
+
"cron.time.joinedEveryMinutes": "каждые {step} минут",
|
|
2769
|
+
"cron.time.joinedEveryMinutes.few": "каждые {step} минуты",
|
|
2770
|
+
"cron.time.joinedEveryMinutes.many": "каждые {step} минут",
|
|
2542
2771
|
"cron.time.everyHour": "Каждый час",
|
|
2543
2772
|
"cron.time.joinedEveryHour": "каждый час",
|
|
2544
|
-
"cron.time.everyNHours": "Каждые {count}
|
|
2545
|
-
"cron.time.
|
|
2546
|
-
"cron.time.
|
|
2547
|
-
"cron.time.
|
|
2548
|
-
"cron.time.
|
|
2549
|
-
"cron.time.
|
|
2773
|
+
"cron.time.everyNHours": "Каждые {count} часов",
|
|
2774
|
+
"cron.time.everyNHours.few": "Каждые {count} часа",
|
|
2775
|
+
"cron.time.everyNHours.many": "Каждые {count} часов",
|
|
2776
|
+
"cron.time.joinedEveryNHours": "каждые {count} часов",
|
|
2777
|
+
"cron.time.joinedEveryNHours.few": "каждые {count} часа",
|
|
2778
|
+
"cron.time.joinedEveryNHours.many": "каждые {count} часов",
|
|
2779
|
+
"cron.time.hourlyAt": "Каждый час, минуты: {minutes}",
|
|
2780
|
+
"cron.time.joinedHourlyAt": "каждый час, минуты: {minutes}",
|
|
2781
|
+
"cron.time.hoursEveryMinute": "каждую минуту, часы: {hours}",
|
|
2782
|
+
"cron.time.hoursEveryMinutes": "каждые {step} минут, часы: {hours}",
|
|
2783
|
+
"cron.time.hoursEveryMinutes.few": "каждые {step} минуты, часы: {hours}",
|
|
2784
|
+
"cron.time.hoursEveryMinutes.many": "каждые {step} минут, часы: {hours}",
|
|
2550
2785
|
"cron.time.at": "в {times}",
|
|
2551
|
-
"cron.time.hoursAt": "
|
|
2786
|
+
"cron.time.hoursAt": "минуты: {minutes}, часы: {hours}",
|
|
2552
2787
|
"frequency.weekday.join": ", ",
|
|
2553
2788
|
"frequency.weekday.1": "Пн",
|
|
2554
2789
|
"frequency.weekday.2": "Вт",
|
|
@@ -2558,13 +2793,21 @@ window.__ModuleLoader__.load({
|
|
|
2558
2793
|
"frequency.weekday.6": "Сб",
|
|
2559
2794
|
"frequency.weekday.7": "Вс",
|
|
2560
2795
|
"unit.day.one": "день",
|
|
2561
|
-
"unit.day.
|
|
2796
|
+
"unit.day.few": "дня",
|
|
2797
|
+
"unit.day.many": "дней",
|
|
2798
|
+
"unit.day.other": "дня",
|
|
2562
2799
|
"unit.hour.one": "час",
|
|
2563
|
-
"unit.hour.
|
|
2564
|
-
"unit.
|
|
2565
|
-
"unit.
|
|
2566
|
-
"unit.
|
|
2567
|
-
"unit.
|
|
2800
|
+
"unit.hour.few": "часа",
|
|
2801
|
+
"unit.hour.many": "часов",
|
|
2802
|
+
"unit.hour.other": "часа",
|
|
2803
|
+
"unit.minute.one": "минуту",
|
|
2804
|
+
"unit.minute.few": "минуты",
|
|
2805
|
+
"unit.minute.many": "минут",
|
|
2806
|
+
"unit.minute.other": "минуты",
|
|
2807
|
+
"unit.second.one": "секунду",
|
|
2808
|
+
"unit.second.few": "секунды",
|
|
2809
|
+
"unit.second.many": "секунд",
|
|
2810
|
+
"unit.second.other": "секунды",
|
|
2568
2811
|
"relative.now": "Подходит время",
|
|
2569
2812
|
"relative.future": "через {value} {unit}",
|
|
2570
2813
|
"relative.overdue": "просрочено на {value} {unit}",
|
|
@@ -2572,6 +2815,17 @@ window.__ModuleLoader__.load({
|
|
|
2572
2815
|
"hover.more": "ещё {count}"
|
|
2573
2816
|
},
|
|
2574
2817
|
"schedule.manager": {
|
|
2818
|
+
"delete.label": "Удалить напоминание: {title}",
|
|
2819
|
+
"hover.more": "ещё {count}",
|
|
2820
|
+
"list.aria": "Активные напоминания",
|
|
2821
|
+
"list.nextRun": "Следующий запуск",
|
|
2822
|
+
"list.open": "Открыть сведения о напоминании: {title}",
|
|
2823
|
+
"mark.aria": "Задач по расписанию: {count}",
|
|
2824
|
+
"trigger.label": "Напоминания",
|
|
2825
|
+
"trigger.one": "{count} напоминание",
|
|
2826
|
+
"trigger.few": "{count} напоминания",
|
|
2827
|
+
"trigger.many": "{count} напоминаний",
|
|
2828
|
+
"trigger.other": "Напоминаний: {count}",
|
|
2575
2829
|
"timing.subagentSession": "Эта сессия принадлежит субагенту, который не получает доставленные напоминания.",
|
|
2576
2830
|
"panel": "Задачи автоматизации",
|
|
2577
2831
|
"title": "Задачи автоматизации",
|
|
@@ -2611,7 +2865,7 @@ window.__ModuleLoader__.load({
|
|
|
2611
2865
|
"delivery.collapse": "Свернуть",
|
|
2612
2866
|
"delivery.pruned": "Более ранние записи о запусках удалены",
|
|
2613
2867
|
"delivery.retention": "Правила хранения",
|
|
2614
|
-
"delivery.retentionBounds": "Каждая задача хранит до {records}
|
|
2868
|
+
"delivery.retentionBounds": "Каждая задача хранит записи о запусках: до {records}, за последние {days} дн.",
|
|
2615
2869
|
"delivery.retentionExplanation": "При сохранении новой записи более старые записи сверх этих пределов удаляются автоматически. Удаление записей не останавливает задачу.",
|
|
2616
2870
|
"detail.name": "Название задачи автоматизации",
|
|
2617
2871
|
"detail.instruction": "Инструкция для задачи",
|
|
@@ -2628,7 +2882,7 @@ window.__ModuleLoader__.load({
|
|
|
2628
2882
|
"detail.missing": "Задача недоступна. Возможно, она удалена.",
|
|
2629
2883
|
"delivery.label": "Сохранённая запись о запуске",
|
|
2630
2884
|
"frequency.once": "Один раз",
|
|
2631
|
-
"frequency.every": "
|
|
2885
|
+
"frequency.every": "Раз в {value} {unit}",
|
|
2632
2886
|
"timing.date": "Дата",
|
|
2633
2887
|
"timing.time": "Время",
|
|
2634
2888
|
"timing.hour": "Часы",
|
|
@@ -2650,7 +2904,7 @@ window.__ModuleLoader__.load({
|
|
|
2650
2904
|
"timing.intervalHint.second": "Не менее 60 с. Интервал отсчитывается от создания задачи или последнего изменения правила и не зависит от часового пояса.",
|
|
2651
2905
|
"timing.zoneNoStored": "Одноразовая задача хранит только момент срабатывания, без часового пояса. Дата и время трактуются в выбранном часовом поясе.",
|
|
2652
2906
|
"timing.inactive": "Неактивные задачи доступны только для чтения, их расписание нельзя изменить.",
|
|
2653
|
-
"timing.conflict": "Задача изменилась, пока вы её редактировали. Черновик сохранён. Отмените правку и откройте задачу заново после обновления, чтобы изменить последнее правило.",
|
|
2907
|
+
"timing.conflict": "Задача изменилась, пока вы её редактировали. Черновик сохранён. Отмените правку и откройте задачу заново после обновления, чтобы изменить последнее правило. ",
|
|
2654
2908
|
"timing.notFound": "Эта задача больше недоступна. Черновик сохранён; отмените правку, чтобы закрыть редактор.",
|
|
2655
2909
|
"timing.invalid": "Введите корректные дату и время или проверьте поля расписания.",
|
|
2656
2910
|
"timing.invalidZone": "Введите корректный часовой пояс IANA, например Asia/Shanghai.",
|
|
@@ -2695,7 +2949,7 @@ window.__ModuleLoader__.load({
|
|
|
2695
2949
|
"rule.error.unknown": "Не удалось подтвердить обновление правила. В строке показано сохранённое правило.",
|
|
2696
2950
|
"delete.action": "Удалить задачу",
|
|
2697
2951
|
"delete.title": "Удалить эту задачу?",
|
|
2698
|
-
"delete.description": "Задача перестанет срабатывать, а сама она и сохранённые записи о запусках будут удалены. Исходная сессия и её сообщения сохранятся; поставленные в очередь сообщения не будут отозваны.",
|
|
2952
|
+
"delete.description": "Задача перестанет срабатывать, а сама она и сохранённые записи о запусках будут удалены. Исходная сессия и её сообщения сохранятся; поставленные в очередь сообщения не будут отозваны. ",
|
|
2699
2953
|
"delete.confirm": "Подтвердить удаление",
|
|
2700
2954
|
"delete.cancel": "Отмена",
|
|
2701
2955
|
"delete.close": "Закрыть подтверждение удаления",
|
|
@@ -2706,12 +2960,12 @@ window.__ModuleLoader__.load({
|
|
|
2706
2960
|
"card.openLabel": "Открыть сведения о задаче: {title}",
|
|
2707
2961
|
"card.deleted": "Удалена",
|
|
2708
2962
|
"tool.invoked": "Вызвано: {name}",
|
|
2709
|
-
"time.locale": "
|
|
2963
|
+
"time.locale": "ru",
|
|
2710
2964
|
"time.utcPrefix": "UTC",
|
|
2711
2965
|
"frequency.daily": "Каждый день в {time} ({timeZone})",
|
|
2712
2966
|
"frequency.dailyLocal": "Каждый день в {time}",
|
|
2713
|
-
"frequency.weekly": "
|
|
2714
|
-
"frequency.weeklyLocal": "
|
|
2967
|
+
"frequency.weekly": "{weekdays} в {time} ({timeZone})",
|
|
2968
|
+
"frequency.weeklyLocal": "{weekdays} в {time}",
|
|
2715
2969
|
"frequency.cron": "Cron {expression} ({timeZone})",
|
|
2716
2970
|
"frequency.cronLocal": "Cron {expression}",
|
|
2717
2971
|
"frequency.cronRule": "{rule} ({timeZone})",
|
|
@@ -2719,7 +2973,7 @@ window.__ModuleLoader__.load({
|
|
|
2719
2973
|
"cron.part.join": " ",
|
|
2720
2974
|
"cron.weekday.name": "{weekday}",
|
|
2721
2975
|
"cron.weekday.range": "{from}–{to}",
|
|
2722
|
-
"cron.months": "
|
|
2976
|
+
"cron.months": " ({months})",
|
|
2723
2977
|
"cron.day.every": "Каждый день{months}",
|
|
2724
2978
|
"cron.day.weekdays": "{weekdays}{months}",
|
|
2725
2979
|
"cron.day.monthDays": "{days} числа каждого месяца{months}",
|
|
@@ -2740,7 +2994,7 @@ window.__ModuleLoader__.load({
|
|
|
2740
2994
|
"cron.time.hoursEveryMinute": "каждую минуту в часы {hours}",
|
|
2741
2995
|
"cron.time.hoursEveryMinutes": "Каждые {step} мин в часы {hours}",
|
|
2742
2996
|
"cron.time.at": "в {times}",
|
|
2743
|
-
"cron.time.hoursAt": "
|
|
2997
|
+
"cron.time.hoursAt": "минуты {minutes} в часы {hours}",
|
|
2744
2998
|
"frequency.weekday.join": ", ",
|
|
2745
2999
|
"frequency.weekday.1": "Пн",
|
|
2746
3000
|
"frequency.weekday.2": "Вт",
|
|
@@ -2750,13 +3004,21 @@ window.__ModuleLoader__.load({
|
|
|
2750
3004
|
"frequency.weekday.6": "Сб",
|
|
2751
3005
|
"frequency.weekday.7": "Вс",
|
|
2752
3006
|
"unit.day.one": "день",
|
|
2753
|
-
"unit.day.
|
|
3007
|
+
"unit.day.few": "дня",
|
|
3008
|
+
"unit.day.many": "дней",
|
|
3009
|
+
"unit.day.other": "дня",
|
|
2754
3010
|
"unit.hour.one": "час",
|
|
2755
|
-
"unit.hour.
|
|
2756
|
-
"unit.
|
|
2757
|
-
"unit.
|
|
2758
|
-
"unit.
|
|
2759
|
-
"unit.
|
|
3011
|
+
"unit.hour.few": "часа",
|
|
3012
|
+
"unit.hour.many": "часов",
|
|
3013
|
+
"unit.hour.other": "часа",
|
|
3014
|
+
"unit.minute.one": "минуту",
|
|
3015
|
+
"unit.minute.few": "минуты",
|
|
3016
|
+
"unit.minute.many": "минут",
|
|
3017
|
+
"unit.minute.other": "минуты",
|
|
3018
|
+
"unit.second.one": "секунду",
|
|
3019
|
+
"unit.second.few": "секунды",
|
|
3020
|
+
"unit.second.many": "секунд",
|
|
3021
|
+
"unit.second.other": "секунды",
|
|
2760
3022
|
"relative.now": "Подходит время",
|
|
2761
3023
|
"relative.future": "через {value} {unit}",
|
|
2762
3024
|
"relative.overdue": "просрочено на {value} {unit}"
|
|
@@ -2819,9 +3081,1693 @@ window.__ModuleLoader__.load({
|
|
|
2819
3081
|
"move": "Переместить выделение в меню",
|
|
2820
3082
|
"select": "Выбрать пункт меню",
|
|
2821
3083
|
"dismiss": "Закрыть меню или верхний диалог"
|
|
3084
|
+
},
|
|
3085
|
+
"secretMask": {
|
|
3086
|
+
"secret.reveal": "Показать секрет",
|
|
3087
|
+
"secret.hide": "Скрыть секрет"
|
|
3088
|
+
},
|
|
3089
|
+
"pluginMarket": {
|
|
3090
|
+
"title": "Обзор плагинов",
|
|
3091
|
+
"refresh": "Обновить",
|
|
3092
|
+
"loading": "Чтение индекса",
|
|
3093
|
+
"retry": "Повторить",
|
|
3094
|
+
"close": "Закрыть",
|
|
3095
|
+
"cancel": "Отмена",
|
|
3096
|
+
"emptyTitle": "Каталогов плагинов пока нет",
|
|
3097
|
+
"emptyDescription": "Добавьте индекс каталога плагинов, чтобы просматривать и устанавливать плагины прямо здесь.",
|
|
3098
|
+
"addFirstSource": "Добавить источник индекса",
|
|
3099
|
+
"sourcesFailed": "Не удалось прочитать источники индекса.",
|
|
3100
|
+
"manageSources": "Управление источниками индекса…",
|
|
3101
|
+
"marketMenu": "Сменить каталог плагинов (сейчас {market})",
|
|
3102
|
+
"sourcesTitle": "Источники индекса",
|
|
3103
|
+
"sourcesDescription": "Каталог плагинов публикуется как адрес одного файла индекса. Обзор просматривает индексы, перечисленные здесь.",
|
|
3104
|
+
"sourcesLabel": "Добавленные источники индекса",
|
|
3105
|
+
"sourceUrl": "Адрес индекса",
|
|
3106
|
+
"sourcePlaceholder": "https://example.com/index.json",
|
|
3107
|
+
"addSource": "Добавить",
|
|
3108
|
+
"removeSource": "Удалить",
|
|
3109
|
+
"removeSourceNamed": "Удалить {url}",
|
|
3110
|
+
"sourcesTrust": "Индексы приходят от третьих сторон. Добавляйте только те источники, которым доверяете: их плагины после установки работают с вашими правами.",
|
|
3111
|
+
"sourceInvalid": "Укажите адрес http или https без имени пользователя, пароля и фрагмента после #.",
|
|
3112
|
+
"sourceDuplicate": "Этот источник индекса уже добавлен.",
|
|
3113
|
+
"sourceUnavailable": "Здесь нельзя сохранить источники индекса.",
|
|
3114
|
+
"sourceFailed": "Не удалось сохранить источники индекса.",
|
|
3115
|
+
"readFailed": "Не удалось прочитать этот индекс.",
|
|
3116
|
+
"readInvalid": "Этот индекс не в допустимом формате.",
|
|
3117
|
+
"readChanged": "Индекс изменился во время загрузки.",
|
|
3118
|
+
"search": "Искать плагины",
|
|
3119
|
+
"filter": "Метки",
|
|
3120
|
+
"filterCount": "Метки · {count}",
|
|
3121
|
+
"sortBy": "Сортировка: {sort}",
|
|
3122
|
+
"sortRelevance": "Лучшее совпадение",
|
|
3123
|
+
"sortDefault": "Порядок по умолчанию",
|
|
3124
|
+
"sortPublished": "Дата публикации",
|
|
3125
|
+
"switchToAscending": "По возрастанию",
|
|
3126
|
+
"switchToDescending": "По убыванию",
|
|
3127
|
+
"categoriesLabel": "Категории",
|
|
3128
|
+
"allCategories": "Все",
|
|
3129
|
+
"emptyIndex": "В этом индексе нет плагинов.",
|
|
3130
|
+
"noMatches": "Подходящих плагинов нет.",
|
|
3131
|
+
"showMore": "Показать ещё",
|
|
3132
|
+
"entryMeta": "{version} · {date}",
|
|
3133
|
+
"entryMetaAuthor": "{version} · {author} · {date}",
|
|
3134
|
+
"openEntry": "Открыть {name}",
|
|
3135
|
+
"install": "Установить",
|
|
3136
|
+
"installTitle": "Установить {name}",
|
|
3137
|
+
"installVersionTitle": "Установить {name} {version}",
|
|
3138
|
+
"openInstalled": "Открыть {name} в «Установленных»",
|
|
3139
|
+
"statusInstalled": "Установлен",
|
|
3140
|
+
"statusUpdate": "Доступно обновление",
|
|
3141
|
+
"statusProvided": "Предоставлено DSH",
|
|
3142
|
+
"incompatible": "Эта версия несовместима с работающим DSH {runtime}; требуется DSH {range}.",
|
|
3143
|
+
"noCompatibleVersion": "Нет версии, совместимой с DSH {runtime}",
|
|
3144
|
+
"exempted": "Эта версия несовместима с работающим DSH, но для неё задано исключение совместимости.",
|
|
3145
|
+
"backToList": "Обзор плагинов",
|
|
3146
|
+
"factSource": "Источник",
|
|
3147
|
+
"factPackage": "Пакет",
|
|
3148
|
+
"factRegistry": "Реестр",
|
|
3149
|
+
"factRepository": "Репозиторий",
|
|
3150
|
+
"factCommit": "Коммит",
|
|
3151
|
+
"factDirectory": "Каталог",
|
|
3152
|
+
"factPublished": "Опубликовано",
|
|
3153
|
+
"factAuthor": "Автор",
|
|
3154
|
+
"factHomepage": "Домашняя страница",
|
|
3155
|
+
"factSourceCode": "Исходный код",
|
|
3156
|
+
"factCategory": "Категория",
|
|
3157
|
+
"factLabels": "Метки",
|
|
3158
|
+
"factMarket": "Каталог плагинов",
|
|
3159
|
+
"versionsTitle": "Версии",
|
|
3160
|
+
"versionsLabel": "Версии {name}",
|
|
3161
|
+
"versionDefault": "Рекомендуемая",
|
|
3162
|
+
"versionInstalled": "Установлена",
|
|
3163
|
+
"versionIncompatible": "Несовместима",
|
|
3164
|
+
"versionExempted": "Есть исключение",
|
|
3165
|
+
"versionPrerelease": "Предварительная",
|
|
3166
|
+
"confirmTitle": "Установить «{name}»?",
|
|
3167
|
+
"installTrust": "Плагины работают на этой машине с вашими правами. Убедитесь, что доверяете источнику этого плагина."
|
|
3168
|
+
},
|
|
3169
|
+
"deepseek-model-label-1017": { "badge.label": "1017" },
|
|
3170
|
+
"update": {
|
|
3171
|
+
"update.availableLabel": "Доступна новая версия. Проверить обновления",
|
|
3172
|
+
"update.badge": "Доступно обновление",
|
|
3173
|
+
"update.checking": "Проверяем удалённый репозиторий на новые выпуски…",
|
|
3174
|
+
"update.close": "Закрыть панель обновления",
|
|
3175
|
+
"update.componentVersions": "Посмотреть версии компонентов",
|
|
3176
|
+
"update.cooldownNotice": "Обновление, запущенное вручную, обходит 24-часовой карантин pnpm (защита от атак на цепочку поставок) и сразу устанавливает выбранную версию.",
|
|
3177
|
+
"update.done": "Обновление завершено",
|
|
3178
|
+
"update.doneDetail": "Все компоненты обновлены.",
|
|
3179
|
+
"update.error": "Обновление не удалось",
|
|
3180
|
+
"update.error.link": "dsh-web или один из его компонентов подключён локальной ссылкой. Синхронизируйте рабочую копию или уберите отдельную ссылку, дублирующую агрегат.",
|
|
3181
|
+
"update.error.notFound": "Агрегатный пакет dsh-web не установлен — обновлять нечего.",
|
|
3182
|
+
"update.error.pnpmFailed": "Обновление не удалось (pnpm завершился с кодом {code}); вывод ниже.",
|
|
3183
|
+
"update.error.pnpmMissing": "pnpm не найден (пробовали pnpm, corepack и npx). Установите pnpm и перезапустите приложение (Windows: npm install -g pnpm или corepack enable; macOS: brew install pnpm или corepack enable).",
|
|
3184
|
+
"update.error.stale": "Команда обновления выполнилась, но установленные версии не изменились. Вероятная причина: порог minimumReleaseAge в pnpm 11 молча пропускает выпуски, опубликованные меньше 24 часов назад. Добавьте minimumReleaseAgeExclude (например, @linxin666/*) или установите minimumReleaseAge: 0 в pnpm-workspace.yaml в каталоге профиля (~/.dsh/profiles/<profile>) и запустите обновление снова.",
|
|
3185
|
+
"update.error.timeout": "Обновление не уложилось в отведённое время, процесс установки остановлен; попробуйте снова.",
|
|
3186
|
+
"update.error.unknown": "Обновление не удалось; попробуйте снова.",
|
|
3187
|
+
"update.error.verifyFailed": "Команда обновления выполнилась, но проверить установленные версии не удалось (запрос к реестру не прошёл или путь установки изменился). Посмотрите вывод ниже или повторите позже.",
|
|
3188
|
+
"update.found": "Вышла новая версия",
|
|
3189
|
+
"update.foundDetail": "У {name} есть более новый выпуск v{version}. Подтвердите, чтобы начать обновление.",
|
|
3190
|
+
"update.label": "Проверить обновления",
|
|
3191
|
+
"update.linkMode": "Режим локальной разработки",
|
|
3192
|
+
"update.linkModeDetail": "dsh-web или один из его компонентов установлен локальной ссылкой и не может обновляться удалённо. Последний выпуск в npm: {version}. Синхронизируйте локальную рабочую копию или уберите отдельную ссылку, дублирующую агрегат.",
|
|
3193
|
+
"update.missing": "dsh-web не найден",
|
|
3194
|
+
"update.missingDetail": "Не удалось найти установленный агрегатный пакет dsh-web. Установите его: dsh plugin --profile <profile> add @linxin666/dsh-web-all",
|
|
3195
|
+
"update.offline": "Источник обновлений недоступен",
|
|
3196
|
+
"update.offlineDetail": "Сеть недоступна или служба обновлений не отвечает; повторите позже.",
|
|
3197
|
+
"update.packages": "Версии компонентов",
|
|
3198
|
+
"update.releaseFeatures": "Новые возможности",
|
|
3199
|
+
"update.releaseFixes": "Исправления",
|
|
3200
|
+
"update.releaseNotes": "Заметки к выпуску v{version}",
|
|
3201
|
+
"update.releaseOther": "Прочие изменения",
|
|
3202
|
+
"update.releaseUnavailable": "Заметок к выпуску для этой версии нет; смотрите релиз на GitHub.",
|
|
3203
|
+
"update.requiresDsh": "Требуется DSH {version}",
|
|
3204
|
+
"update.restartHint": "Перезапустите dsh web, чтобы новая версия вступила в силу: остановите его по Ctrl+C в терминале и запустите dsh web снова.",
|
|
3205
|
+
"update.retry": "Проверить ещё раз",
|
|
3206
|
+
"update.start": "Обновить сейчас",
|
|
3207
|
+
"update.title": "Проверить обновления",
|
|
3208
|
+
"update.unmounted": "Служба обновлений не загружена",
|
|
3209
|
+
"update.unmountedDetail": "Запущенный процесс dsh web загрузил сборку плагина без службы обновлений; перезапустите dsh web (Ctrl+C, затем снова dsh web) и повторите.",
|
|
3210
|
+
"update.upToDate": "Всё обновлено",
|
|
3211
|
+
"update.upToDateDetail": "{name} — последняя версия v{version}.",
|
|
3212
|
+
"update.updating": "Обновляем {name} до v{version}; это может занять 1–2 минуты…",
|
|
3213
|
+
"update.updatingTitle": "Обновление…"
|
|
3214
|
+
},
|
|
3215
|
+
"git-graph": {
|
|
3216
|
+
"branch.create": "Создать ветку и переключиться…",
|
|
3217
|
+
"branch.createDialog.cancel": "Отмена",
|
|
3218
|
+
"branch.createDialog.confirm": "Создать и переключиться",
|
|
3219
|
+
"branch.createDialog.description": "Создайте новую локальную ветку от текущего HEAD и сразу переключитесь на неё.",
|
|
3220
|
+
"branch.createDialog.nameLabel": "Имя ветки",
|
|
3221
|
+
"branch.createDialog.placeholder": "Например, feature/git-branch-switcher",
|
|
3222
|
+
"branch.createDialog.title": "Создать ветку и переключиться",
|
|
3223
|
+
"branch.detached": "Отсоединённый HEAD",
|
|
3224
|
+
"branch.dirty": "Незакоммиченные изменения: файлов — {count}",
|
|
3225
|
+
"branch.empty": "Подходящих веток нет",
|
|
3226
|
+
"branch.graph": "Граф Git",
|
|
3227
|
+
"branch.search": "Поиск веток",
|
|
3228
|
+
"chip.aria.branch": "Ветка",
|
|
3229
|
+
"error.baseRefNotFound": "Базовой ветки или ревизии не существует.",
|
|
3230
|
+
"error.branchAlreadyExists": "Такая ветка уже есть. Выберите другое имя.",
|
|
3231
|
+
"error.branchInOtherWorktree": "Эта ветка уже выгружена в другом рабочем дереве.",
|
|
3232
|
+
"error.conflictsPresent": "В репозитории остались неразрешённые конфликты. Разрешите их, прежде чем переключать ветку.",
|
|
3233
|
+
"error.internal": "Операция не удалась. Попробуйте ещё раз.",
|
|
3234
|
+
"error.invalidBranchName": "Имя ветки недопустимо. Введите другое имя.",
|
|
3235
|
+
"error.invalidWorktreeName": "Имя рабочего дерева недопустимо. Введите другое имя.",
|
|
3236
|
+
"error.moreFiles": "ещё файлов: {count}",
|
|
3237
|
+
"error.operationInProgress": "В репозитории идёт другая операция Git. Завершите её, прежде чем переключать ветку.",
|
|
3238
|
+
"error.pathsSeparator": ", ",
|
|
3239
|
+
"error.requestFailed": "Операция с веткой не удалась: {error}",
|
|
3240
|
+
"error.targetBranchNotFound": "Целевой ветки нет локально.",
|
|
3241
|
+
"error.trackedOverwrite": "Переключение не удалось: отслеживаемые файлы были бы перезаписаны: {paths}.",
|
|
3242
|
+
"error.untrackedOverwrite": "Переключение не удалось: неотслеживаемые файлы были бы перезаписаны: {paths}.",
|
|
3243
|
+
"error.workspaceUnknown": "Эта папка не зарегистрирована как рабочая область.",
|
|
3244
|
+
"error.worktreeAlreadyExists": "Рабочее дерево или ветка с таким именем уже есть. Выберите другое имя.",
|
|
3245
|
+
"error.worktreeDirty": "В рабочем дереве есть незакоммиченные изменения.",
|
|
3246
|
+
"error.worktreeIsMain": "Основную рабочую копию удалить нельзя.",
|
|
3247
|
+
"error.worktreeNotFound": "Рабочее дерево не найдено — возможно, оно уже удалено.",
|
|
3248
|
+
"graph.close": "Закрыть",
|
|
3249
|
+
"graph.empty": "Коммитов нет",
|
|
3250
|
+
"graph.loadMore": "Загрузить ещё",
|
|
3251
|
+
"graph.loading": "Загрузка…",
|
|
3252
|
+
"graph.subtitle": "Коммитов: {count}; дорожек: {lanes}",
|
|
3253
|
+
"graph.time.daysAgo": "{count} дн. назад",
|
|
3254
|
+
"graph.time.hoursAgo": "{count} ч назад",
|
|
3255
|
+
"graph.time.justNow": "только что",
|
|
3256
|
+
"graph.time.minutesAgo": "{count} мин назад",
|
|
3257
|
+
"graph.title": "Граф Git",
|
|
3258
|
+
"toast.switchSuccess": "Переключились на ветку {branchName}",
|
|
3259
|
+
"toast.worktreeCreated": "Создано рабочее дерево {name}",
|
|
3260
|
+
"worktree.create": "Начать сессию в рабочем дереве…",
|
|
3261
|
+
"worktree.dialog.baseLabel": "Базовая ветка",
|
|
3262
|
+
"worktree.dialog.cancel": "Отмена",
|
|
3263
|
+
"worktree.dialog.confirm": "Создать и начать сессию",
|
|
3264
|
+
"worktree.dialog.description": "Создать изолированное рабочее дерево в каталоге, которым управляет DSH ($DSH_HOME/worktrees/), на новой ветке wt/<name> и открыть в нём новую сессию. Текущая рабочая копия не затрагивается.",
|
|
3265
|
+
"worktree.dialog.nameLabel": "Имя рабочего дерева",
|
|
3266
|
+
"worktree.dialog.namePlaceholder": "Например, fix-login-race",
|
|
3267
|
+
"worktree.dialog.title": "Начать сессию в рабочем дереве",
|
|
3268
|
+
"worktree.manage": "Управление рабочими деревьями…",
|
|
3269
|
+
"worktree.manager.close": "Закрыть",
|
|
3270
|
+
"worktree.manager.deleteBranch": "Удалить и ветку",
|
|
3271
|
+
"worktree.manager.detached": "отсоединённый HEAD",
|
|
3272
|
+
"worktree.manager.empty": "Управляемых рабочих деревьев нет",
|
|
3273
|
+
"worktree.manager.forceConfirm": "В рабочем дереве есть незакоммиченные изменения. Удалить принудительно?",
|
|
3274
|
+
"worktree.manager.forceYes": "Удалить принудительно",
|
|
3275
|
+
"worktree.manager.loading": "Загрузка…",
|
|
3276
|
+
"worktree.manager.main": "основная рабочая копия",
|
|
3277
|
+
"worktree.manager.remove": "Удалить",
|
|
3278
|
+
"worktree.manager.title": "Управление рабочими деревьями"
|
|
3279
|
+
},
|
|
3280
|
+
"dsh-web-ui-usage": {
|
|
3281
|
+
"usage.balance": "Баланс",
|
|
3282
|
+
"usage.balance.noCredential": "Учётные данные не заданы",
|
|
3283
|
+
"usage.balance.noneConfigured": "Провайдеры не настроены",
|
|
3284
|
+
"usage.balance.unsupported": "Запрос баланса не поддерживается",
|
|
3285
|
+
"usage.bank.drawError": "Не удалось нарисовать купон: {error}",
|
|
3286
|
+
"usage.bank.hint": "Каждый 1 000 000 токенов, потраченных на официальном API DeepSeek или на MiMo, даёт один китовый юань; сохраните купон или поделитесь им.",
|
|
3287
|
+
"usage.bank.minted": "Китовых юаней начислено: {minted} (потрачено токенов: {tokens})",
|
|
3288
|
+
"usage.bank.noUsage": "Пока нет расходов на официальном API DeepSeek или на MiMo (счёт начинается с момента включения плагина)",
|
|
3289
|
+
"usage.bank.save": "Сохранить картинку",
|
|
3290
|
+
"usage.bank.share": "Поделиться",
|
|
3291
|
+
"usage.bank.spend.estimated": "Расчётная трата: около ¥{cost}",
|
|
3292
|
+
"usage.bank.spend.observed": "Потрачено ¥{cost} по официальному балансу (наблюдаем с {since})",
|
|
3293
|
+
"usage.bank.title": "Купон на китовый юань",
|
|
3294
|
+
"usage.bank.window": "Период {from} — {to}",
|
|
3295
|
+
"usage.bank.windowAll": "Все сохранённые дни",
|
|
3296
|
+
"usage.calls": "Запросов: {n}",
|
|
3297
|
+
"usage.config.enabled": "Включить плагин",
|
|
3298
|
+
"usage.config.pollIntervalSec": "Интервал опроса (секунды)",
|
|
3299
|
+
"usage.config.saveFailed": "Не удалось сохранить: развёртывание не приняло настройку.",
|
|
3300
|
+
"usage.config.title": "Настройки",
|
|
3301
|
+
"usage.current": "Текущий",
|
|
3302
|
+
"usage.day.cost": "Трата за день (оценка)",
|
|
3303
|
+
"usage.day.empty": "За этот день расходов нет",
|
|
3304
|
+
"usage.day.error": "Не удалось загрузить день: {error}",
|
|
3305
|
+
"usage.day.label": "День",
|
|
3306
|
+
"usage.day.loading": "Загружаем день…",
|
|
3307
|
+
"usage.day.title": "Расход · {date}",
|
|
3308
|
+
"usage.day.today": "Сегодня",
|
|
3309
|
+
"usage.disabled": "Плагин выключен. Поставьте галочку ниже, чтобы статистика возобновилась.",
|
|
3310
|
+
"usage.error": "Не удалось загрузить: {error}",
|
|
3311
|
+
"usage.errorListSeparator": "; ",
|
|
3312
|
+
"usage.foot.collapse": "Свернуть карточку расхода",
|
|
3313
|
+
"usage.foot.cost": "Трата за сегодня",
|
|
3314
|
+
"usage.foot.expand": "Развернуть карточку расхода",
|
|
3315
|
+
"usage.foot.noData": "Сегодня расходов пока нет",
|
|
3316
|
+
"usage.foot.open": "Открыть настройки статистики расхода",
|
|
3317
|
+
"usage.loading": "Загружаем данные о расходе…",
|
|
3318
|
+
"usage.noData": "Данных о расходе пока нет (счёт начинается с момента включения плагина)",
|
|
3319
|
+
"usage.oauth": "Учётные данные OAuth, запрос баланса недоступен",
|
|
3320
|
+
"usage.peak.off": "У DeepSeek непиковые часы: половина цены пика, пиковые вернутся в {time}",
|
|
3321
|
+
"usage.peak.on": "У DeepSeek пиковые часы: двойная цена, закончатся в {time}",
|
|
3322
|
+
"usage.plan.noPlan": "Данных о тарифном плане не обнаружено",
|
|
3323
|
+
"usage.plan.noneConfigured": "Не настроен провайдер с тарифными планами (например, Kimi, GLM, OpenCode Go, MiniMax, подписка Codex)",
|
|
3324
|
+
"usage.plan.reset": "сброс {date}",
|
|
3325
|
+
"usage.plan.windows.5h": "5 часов",
|
|
3326
|
+
"usage.plan.windows.month": "Месяц",
|
|
3327
|
+
"usage.plan.windows.week": "Неделя",
|
|
3328
|
+
"usage.provider.error": "Запрос не удался: {error}",
|
|
3329
|
+
"usage.refresh": "Обновить",
|
|
3330
|
+
"usage.refreshing": "Обновляем…",
|
|
3331
|
+
"usage.tab.bank": "Банк токенов",
|
|
3332
|
+
"usage.tab.plans": "Планы",
|
|
3333
|
+
"usage.tab.usage": "Расход",
|
|
3334
|
+
"usage.title": "Статистика расхода",
|
|
3335
|
+
"usage.today": "Сегодня",
|
|
3336
|
+
"usage.today.cost": "Трата за сегодня (оценка)",
|
|
3337
|
+
"usage.tokens.cacheRead": "Чтение из кэша",
|
|
3338
|
+
"usage.tokens.cacheWrite": "Запись в кэш",
|
|
3339
|
+
"usage.tokens.input": "Ввод",
|
|
3340
|
+
"usage.tokens.output": "Вывод",
|
|
3341
|
+
"usage.tokens.total": "Всего токенов",
|
|
3342
|
+
"usage.trend": "Последние 30 дней",
|
|
3343
|
+
"usage.updated": "Обновлено {time}"
|
|
3344
|
+
},
|
|
3345
|
+
"dsh-web-ui-session-archive": {
|
|
3346
|
+
"arch.auto.archiveDays": "Порог неактивности (дни)",
|
|
3347
|
+
"arch.auto.archiveToggle": "Автоматически архивировать сессии, неактивные дольше порога",
|
|
3348
|
+
"arch.auto.basis": "Как считается: автоархивация опирается на время последней активности сессии, а не на время создания; автоудаление — на записанное время архивации, а не на время файлов. Исторические архивы с неизвестным временем архивации никогда не удаляются автоматически; восстановление и повторная архивация запускают срок хранения заново. Запущенные сессии, сессия, которую вы смотрите, и сессии с работающими потомками защищены всегда.",
|
|
3349
|
+
"arch.auto.cycleRunning": "Идёт автоматическая проверка…",
|
|
3350
|
+
"arch.auto.days.unit": "дней",
|
|
3351
|
+
"arch.auto.defaultOff": "Автоархивация и автоудаление по умолчанию выключены; ничего не изменится, пока вы их не включите.",
|
|
3352
|
+
"arch.auto.deleteDays": "Срок хранения архива (дни)",
|
|
3353
|
+
"arch.auto.deleteToggle": "Автоматически удалять архивные сессии по истечении срока хранения",
|
|
3354
|
+
"arch.auto.invalidDays": "Число дней должно быть целым от {min} до {max}",
|
|
3355
|
+
"arch.auto.lastArchive": "Последняя автоархивация: {time}; всего: {total}, успешно: {ok}, пропущено: {skipped}, с ошибкой: {failed}",
|
|
3356
|
+
"arch.auto.lastDelete": "Последняя автоочистка: {time}; всего: {total}, успешно: {ok}, пропущено: {skipped}, с ошибкой: {failed}",
|
|
3357
|
+
"arch.auto.neverRun": "Ещё не запускалась",
|
|
3358
|
+
"arch.auto.nextRun": "Следующая проверка по расписанию: {time}",
|
|
3359
|
+
"arch.auto.preview": "Предпросмотр с текущими настройками",
|
|
3360
|
+
"arch.auto.preview.archive": "Сессий к архивации: {n}",
|
|
3361
|
+
"arch.auto.preview.delete": "Сессий к удалению: {n}, освободится {size}",
|
|
3362
|
+
"arch.auto.preview.loading": "Считаем…",
|
|
3363
|
+
"arch.auto.preview.none": "С текущими настройками обрабатывать нечего",
|
|
3364
|
+
"arch.auto.runArchive": "Запустить проверку архивации",
|
|
3365
|
+
"arch.auto.runDelete": "Запустить проверку очистки",
|
|
3366
|
+
"arch.auto.runError": "Запуск не удался: {error}",
|
|
3367
|
+
"arch.auto.saveFailed": "Не удалось сохранить: хост не принял настройку; попробуйте ещё раз",
|
|
3368
|
+
"arch.auto.title": "Автоматическое обслуживание",
|
|
3369
|
+
"arch.batch.archive": "Заархивировать выбранные",
|
|
3370
|
+
"arch.batch.delete": "Удалить выбранные",
|
|
3371
|
+
"arch.batch.failed": "С ошибкой: {n}",
|
|
3372
|
+
"arch.batch.finished": "Готово",
|
|
3373
|
+
"arch.batch.freed": "Освобождено места: {size}",
|
|
3374
|
+
"arch.batch.ok": "Успешно: {n}",
|
|
3375
|
+
"arch.batch.progress": "Прогресс: {processed} из {total}",
|
|
3376
|
+
"arch.batch.reason": "Причина",
|
|
3377
|
+
"arch.batch.retryFailed": "Повторить только неудачные",
|
|
3378
|
+
"arch.batch.running": "Обрабатываем…",
|
|
3379
|
+
"arch.batch.skipSummary": "Подробности пропусков: {summary}",
|
|
3380
|
+
"arch.batch.skipped": "Пропущено: {n}",
|
|
3381
|
+
"arch.batch.title.archive": "Пакетная архивация",
|
|
3382
|
+
"arch.batch.title.delete": "Пакетное удаление",
|
|
3383
|
+
"arch.batch.title.unarchive": "Пакетное восстановление",
|
|
3384
|
+
"arch.batch.unarchive": "Восстановить выбранные",
|
|
3385
|
+
"arch.batch.withError": "Готово (часть запросов не удалась)",
|
|
3386
|
+
"arch.close": "Закрыть",
|
|
3387
|
+
"arch.confirm.cancel": "Отмена",
|
|
3388
|
+
"arch.confirm.confirm": "Удалить безвозвратно",
|
|
3389
|
+
"arch.confirm.deleteTitle": "Удаление сессий",
|
|
3390
|
+
"arch.confirm.descendants": "Удаляется по связи «родитель — потомок», сессий: {n}",
|
|
3391
|
+
"arch.confirm.direct": "Выбрано напрямую, сессий: {n}",
|
|
3392
|
+
"arch.confirm.freed": "Ожидаемое освобождение места: {size}",
|
|
3393
|
+
"arch.confirm.irrecoverable": "Физическое удаление необратимо. Содержимое сессий будет потеряно навсегда.",
|
|
3394
|
+
"arch.confirm.skipped": "Защищённых сессий к пропуску: {n}",
|
|
3395
|
+
"arch.confirm.strongCheck": "Я понимаю, что это действие нельзя отменить",
|
|
3396
|
+
"arch.confirm.total": "Всего к удалению, сессий: {n}",
|
|
3397
|
+
"arch.current.badge": "текущая",
|
|
3398
|
+
"arch.empty": "Под текущие условия не подходит ни одна сессия",
|
|
3399
|
+
"arch.error": "Не удалось загрузить: {error}",
|
|
3400
|
+
"arch.filter.active": "Неархивные",
|
|
3401
|
+
"arch.filter.all": "Все",
|
|
3402
|
+
"arch.filter.archived": "Архивные",
|
|
3403
|
+
"arch.filter.issues": "Только сессии с проблемами",
|
|
3404
|
+
"arch.filter.search": "Поиск по названию или ID сессии",
|
|
3405
|
+
"arch.filter.workspace": "Рабочая область",
|
|
3406
|
+
"arch.filter.workspace.any": "Все рабочие области",
|
|
3407
|
+
"arch.filter.workspace.none": "Без рабочей области",
|
|
3408
|
+
"arch.issue.no-archive-time": "Время архивации неизвестно",
|
|
3409
|
+
"arch.issue.no-data": "Нет данных сессии",
|
|
3410
|
+
"arch.issue.no-title": "Нет названия",
|
|
3411
|
+
"arch.issue.unreadable": "Неполные метаданные",
|
|
3412
|
+
"arch.loading": "Загружаем сессии…",
|
|
3413
|
+
"arch.nav": "Архивные сессии",
|
|
3414
|
+
"arch.op.archive": "Заархивировать",
|
|
3415
|
+
"arch.op.delete": "Удалить",
|
|
3416
|
+
"arch.op.preview": "Предпросмотр",
|
|
3417
|
+
"arch.op.unarchive": "Восстановить",
|
|
3418
|
+
"arch.page.info": "Страница {page} из {pages} · всего {n}",
|
|
3419
|
+
"arch.page.next": "Следующая страница",
|
|
3420
|
+
"arch.page.prev": "Предыдущая страница",
|
|
3421
|
+
"arch.preview.basic": "Основные сведения",
|
|
3422
|
+
"arch.preview.empty": "Показывать нечего — переписка пуста",
|
|
3423
|
+
"arch.preview.excerpt": "Фрагмент переписки (первые сообщения)",
|
|
3424
|
+
"arch.preview.loadError": "Предпросмотр не удался: {error}",
|
|
3425
|
+
"arch.preview.messages": "Всего сообщений: {n}",
|
|
3426
|
+
"arch.preview.title": "Предпросмотр сессии",
|
|
3427
|
+
"arch.reason.already-archived": "Сессия уже в архиве",
|
|
3428
|
+
"arch.reason.attached": "Сессию всё ещё удерживает процесс DSH; перезапустите службу или закройте сессию перед удалением",
|
|
3429
|
+
"arch.reason.busy": "Идёт другая операция",
|
|
3430
|
+
"arch.reason.current": "Сессия сейчас открыта",
|
|
3431
|
+
"arch.reason.error": "Операция не удалась",
|
|
3432
|
+
"arch.reason.family-protected": "В семействе есть защищённый участник; пропущено всё семейство",
|
|
3433
|
+
"arch.reason.in-flight": "Сессию обрабатывает другая операция",
|
|
3434
|
+
"arch.reason.missing-seam": "Текущее окружение SDK этого не поддерживает",
|
|
3435
|
+
"arch.reason.not-archived": "Сессия не в архиве",
|
|
3436
|
+
"arch.reason.not-found": "Сессия не найдена",
|
|
3437
|
+
"arch.reason.running": "Сессия выполняется",
|
|
3438
|
+
"arch.reason.unreadable": "Данные сессии не читаются",
|
|
3439
|
+
"arch.refresh": "Обновить",
|
|
3440
|
+
"arch.refreshing": "Обновляем…",
|
|
3441
|
+
"arch.results.count": "Всего сессий: {n}",
|
|
3442
|
+
"arch.retry": "Повторить",
|
|
3443
|
+
"arch.row.archivedAt": "Заархивирована: {time}",
|
|
3444
|
+
"arch.row.archivedAt.unknown": "Заархивирована: неизвестно",
|
|
3445
|
+
"arch.row.children": "Подсессий: {n}",
|
|
3446
|
+
"arch.row.created": "Создана {time}",
|
|
3447
|
+
"arch.row.lastActivity": "Последняя активность: {time}",
|
|
3448
|
+
"arch.row.lastActivity.unknown": "Последняя активность: неизвестно",
|
|
3449
|
+
"arch.row.noTitle": "(без названия)",
|
|
3450
|
+
"arch.row.size": "Размер: {size}",
|
|
3451
|
+
"arch.select.all": "Выбрать все результаты",
|
|
3452
|
+
"arch.select.clear": "Снять выделение",
|
|
3453
|
+
"arch.select.holdNote": "Выбрано {selected}; {outside} вне текущего фильтра, но всё равно будут включены",
|
|
3454
|
+
"arch.select.selected": "Выбрано: {n}",
|
|
3455
|
+
"arch.sort": "Сортировка",
|
|
3456
|
+
"arch.sort.archivedAt": "Время архивации",
|
|
3457
|
+
"arch.sort.asc": "Сначала старые",
|
|
3458
|
+
"arch.sort.createdAt": "Время создания",
|
|
3459
|
+
"arch.sort.desc": "Сначала новые",
|
|
3460
|
+
"arch.sort.lastActivity": "Последняя активность",
|
|
3461
|
+
"arch.sort.size": "Размер",
|
|
3462
|
+
"arch.sort.title": "Название",
|
|
3463
|
+
"arch.status.active": "Обычная",
|
|
3464
|
+
"arch.status.archived": "В архиве",
|
|
3465
|
+
"arch.status.blank": "Пустая",
|
|
3466
|
+
"arch.status.running": "Выполняется",
|
|
3467
|
+
"arch.status.subagent": "Подсессия",
|
|
3468
|
+
"arch.time.unknown": "неизвестно",
|
|
3469
|
+
"arch.title": "Менеджер архива сессий"
|
|
3470
|
+
},
|
|
3471
|
+
"pet": {
|
|
3472
|
+
"pet.collapseSessions": "Свернуть пузыри сессий",
|
|
3473
|
+
"pet.confirm": "ОК",
|
|
3474
|
+
"pet.feed": "Покормить",
|
|
3475
|
+
"pet.gameplay.back": "Назад",
|
|
3476
|
+
"pet.gameplay.buy": "Купить",
|
|
3477
|
+
"pet.gameplay.currency.treats": "Лакомства",
|
|
3478
|
+
"pet.gameplay.insufficient": "Не хватает: {currency}",
|
|
3479
|
+
"pet.gameplay.menu": "Играть",
|
|
3480
|
+
"pet.gameplay.prize": "Приз +{amount} {currency}",
|
|
3481
|
+
"pet.gameplay.shop": "Магазин",
|
|
3482
|
+
"pet.gameplay.skin": "Облик",
|
|
3483
|
+
"pet.gameplay.skinDefault": "Обычный",
|
|
3484
|
+
"pet.gameplay.sleep": "Спать",
|
|
3485
|
+
"pet.gameplay.sleeping": "Спит",
|
|
3486
|
+
"pet.gameplay.stat.affection": "Привязанность",
|
|
3487
|
+
"pet.gameplay.stat.energy": "Энергия",
|
|
3488
|
+
"pet.gameplay.stat.hunger": "Голод",
|
|
3489
|
+
"pet.gameplay.stat.mood": "Настроение",
|
|
3490
|
+
"pet.gameplay.stopWork": "Закончить работу",
|
|
3491
|
+
"pet.gameplay.wake": "Разбудить",
|
|
3492
|
+
"pet.gameplay.work": "Работать",
|
|
3493
|
+
"pet.gameplay.working": "Работает",
|
|
3494
|
+
"pet.hide": "Скрыть",
|
|
3495
|
+
"pet.live2d.core-missing": "Live2D Cubism Core не установлен: положите официальный live2dcubismcore.min.js в $DSH_HOME/pets/.runtime/ и обновите страницу (см. README плагина питомца).",
|
|
3496
|
+
"pet.live2d.load-failed": "Модель Live2D не загрузилась; проверьте, что каталог питомца не повреждён.",
|
|
3497
|
+
"pet.live2d.vendor-missing": "Компонент Live2D отсутствует; обновите плагин питомца.",
|
|
3498
|
+
"pet.moreSessions": "Развернуть ещё пузырей сессий: {n}",
|
|
3499
|
+
"pet.namePlaceholder": "Введите новое имя",
|
|
3500
|
+
"pet.openSessionHint": "Нажмите, чтобы перейти к этой сессии",
|
|
3501
|
+
"pet.points": "{points} очк.",
|
|
3502
|
+
"pet.rank": "Привязанность {rank}",
|
|
3503
|
+
"pet.rank.name.伙伴": "Компаньон",
|
|
3504
|
+
"pet.rank.name.传说羁绊": "Легендарная связь",
|
|
3505
|
+
"pet.rank.name.幼鲸": "Китёнок",
|
|
3506
|
+
"pet.rank.name.心有灵犀": "Родство душ",
|
|
3507
|
+
"pet.rank.name.挚友": "Близкий друг",
|
|
3508
|
+
"pet.rank.name.永恒之契": "Вечный союз",
|
|
3509
|
+
"pet.rank.name.深海羁绊": "Связь глубин",
|
|
3510
|
+
"pet.rank.name.神话羁绊": "Мифическая связь",
|
|
3511
|
+
"pet.rank.name.鲸生共渡": "Спутник на всю жизнь",
|
|
3512
|
+
"pet.rename": "Переименовать",
|
|
3513
|
+
"pet.renderer.unavailable": "Этому питомцу нужен обработчик ({renderer}), которого нет в этой сборке.",
|
|
3514
|
+
"pet.state.error": "Питомец потерян (соединение не удалось)",
|
|
3515
|
+
"pet.state.loading": "Питомец уже в пути…",
|
|
3516
|
+
"pet.summon": "Призвать {name}",
|
|
3517
|
+
"pet.treats": "Лакомства ×{n}",
|
|
3518
|
+
"settings.bottom": "Отступ снизу (пикс.)",
|
|
3519
|
+
"settings.bottomHint": "Вертикальный отступ от нижнего края окна.",
|
|
3520
|
+
"settings.bubbleScale": "Множитель текста пузырей",
|
|
3521
|
+
"settings.bubbleScaleHint": "Пузыри состояния, шёпота и расхода масштабируются вместе с питомцем; этот множитель применяется к результату (0,5–2, по умолчанию 1). Итоговый текст остаётся в пределах 10–24 пикс.",
|
|
3522
|
+
"settings.collapse": "Скрыть настройки",
|
|
3523
|
+
"settings.decoration": "Украшение состояния",
|
|
3524
|
+
"settings.decorationHint": "Показывать орнаменты вроде фонтана кита внутри пузырей состояния; если выключено, пузыри остаются текстовыми.",
|
|
3525
|
+
"settings.description": "Выберите питомца и настройте его расположение.",
|
|
3526
|
+
"settings.discard": "Отменить изменения",
|
|
3527
|
+
"settings.enabled": "Включить питомца",
|
|
3528
|
+
"settings.enabledHint": "Если выключено, питомец скрыт и опрос прекращается; включите его здесь.",
|
|
3529
|
+
"settings.expand": "Показать настройки",
|
|
3530
|
+
"settings.inherit": "Наследовать",
|
|
3531
|
+
"settings.invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию.",
|
|
3532
|
+
"settings.notExposed": "Эта версия DSH не показывает странице настроек пространство имён этого плагина, поэтому форма недоступна. Отредактируйте $DSH_HOME/settings.yaml напрямую или убедитесь, что плагин-владелец пространства имён подключён вместе со своим доменом настроек, и перезапустите.",
|
|
3533
|
+
"settings.off": "Выкл.",
|
|
3534
|
+
"settings.on": "Вкл.",
|
|
3535
|
+
"settings.overridden": "Переопределено",
|
|
3536
|
+
"settings.pet": "Питомец",
|
|
3537
|
+
"settings.petHint": "Выберите, какой питомец показывается. Имена хранятся отдельно для каждого питомца; переименовать можно из панели при наведении.",
|
|
3538
|
+
"settings.readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
3539
|
+
"settings.reset": "Сбросить к значению по умолчанию",
|
|
3540
|
+
"settings.right": "Отступ справа (пикс.)",
|
|
3541
|
+
"settings.rightHint": "Горизонтальный отступ от правого края окна.",
|
|
3542
|
+
"settings.save": "Сохранить",
|
|
3543
|
+
"settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены вам для исправления.",
|
|
3544
|
+
"settings.saving": "Сохранение…",
|
|
3545
|
+
"settings.size": "Размер (пикс.)",
|
|
3546
|
+
"settings.sizeHint": "Высота ячейки спрайта, 32–1024.",
|
|
3547
|
+
"settings.statusBubbles": "Пузыри состояния",
|
|
3548
|
+
"settings.statusBubblesHint": "Собственные пузыри сессий и состояния питомца (думает, использует …). Если выключить, останутся только пузыри, которые сторонние плагины отправляют через контракт объявлений, и пузырь обратной связи; по умолчанию включено.",
|
|
3549
|
+
"settings.title": "Питомец",
|
|
3550
|
+
"settings.unsaved": "Не сохранено",
|
|
3551
|
+
"settings.visible": "Показывать питомца",
|
|
3552
|
+
"settings.visibleHint": "Если выключено, питомец скрыт; призовите его снова из строки ввода."
|
|
3553
|
+
},
|
|
3554
|
+
"remote": {
|
|
3555
|
+
"action.copied": "Скопировано",
|
|
3556
|
+
"action.copiedToken": "Токен скопирован",
|
|
3557
|
+
"action.copy": "Скопировать ссылку",
|
|
3558
|
+
"action.copyLink": "Скопировать ссылку",
|
|
3559
|
+
"action.copyToken": "Скопировать токен",
|
|
3560
|
+
"action.refresh": "Обновить QR",
|
|
3561
|
+
"action.stop": "Остановить",
|
|
3562
|
+
"address.auto": "QR-код всегда указывает на публичный адрес; телефон в той же сети сам переключится на адрес локальной сети.",
|
|
3563
|
+
"address.pinnedLan": "QR-код указывает на адрес локальной сети.",
|
|
3564
|
+
"card.title": "Сопряжение устройства",
|
|
3565
|
+
"close.label": "Закрыть панель удалённого доступа",
|
|
3566
|
+
"devices.empty": "Сопряжённых устройств пока нет. Отсканируйте QR-код или откройте ссылку, чтобы добавить устройство.",
|
|
3567
|
+
"devices.lastSeen": "Последняя активность {time}",
|
|
3568
|
+
"devices.offline": "Не в сети",
|
|
3569
|
+
"devices.online": "В сети",
|
|
3570
|
+
"devices.revoke": "Отменить сопряжение",
|
|
3571
|
+
"devices.revoke.label": "Отменить сопряжение этого устройства",
|
|
3572
|
+
"devices.title": "Разрешённые устройства",
|
|
3573
|
+
"devices.unknown": "Неизвестное устройство",
|
|
3574
|
+
"entry.label": "Удалённый доступ",
|
|
3575
|
+
"fence.unpaired.eyebrow": "Требуется сопряжение устройства",
|
|
3576
|
+
"fence.unpaired.footnote": "Не используйте ссылки сопряжения от людей, которым не доверяете. Администратор может в любой момент отозвать это устройство.",
|
|
3577
|
+
"fence.unpaired.hint": "Чтобы защитить данные рабочей области, сессий и плагинов, удалённый компьютер должен сначала получить разрешение от основного компьютера.",
|
|
3578
|
+
"fence.unpaired.pairAction": "Сопрячь сейчас",
|
|
3579
|
+
"fence.unpaired.pairing": "Сопрягаем…",
|
|
3580
|
+
"fence.unpaired.retry": "Проверить ещё раз",
|
|
3581
|
+
"fence.unpaired.stepDesktop": "На основном компьютере откройте http://127.0.0.1:3080 и перейдите в раздел «Удалённый доступ».",
|
|
3582
|
+
"fence.unpaired.stepLink": "Скопируйте ссылку сопряжения компьютера в блоке «Сопряжение устройства».",
|
|
3583
|
+
"fence.unpaired.stepOpen": "Откройте эту ссылку в текущем браузере. После авторизации рабочая область станет доступна.",
|
|
3584
|
+
"fence.unpaired.title": "Это устройство не сопряжено и не может получить доступ к данным рабочей области",
|
|
3585
|
+
"fence.unpaired.tokenFailed": "Сопряжение не удалось: проверьте сеть или выпустите новую ссылку",
|
|
3586
|
+
"fence.unpaired.tokenInvalid": "Ссылка сопряжения или токен недействительны либо просрочены",
|
|
3587
|
+
"fence.unpaired.tokenPlaceholder": "Или вставьте ссылку сопряжения или токен",
|
|
3588
|
+
"lan.bind": "Привязка: {host}:{port}",
|
|
3589
|
+
"lan.cardTitle": "Доступ по локальной сети",
|
|
3590
|
+
"lan.firewall.bad": "брандмауэр блокирует (нужны права администратора)",
|
|
3591
|
+
"lan.firewall.ok": "брандмауэр открыт",
|
|
3592
|
+
"lan.firewall.unmanaged": "брандмауэр не управляется (поддерживаемый брандмауэр не найден)",
|
|
3593
|
+
"lan.off": "Сейчас доступен только localhost.",
|
|
3594
|
+
"lan.pendingRestart": "Изменение привязки вступит в силу после перезапуска dsh web.",
|
|
3595
|
+
"lan.untouched": "Переключатель ещё ни разу не использовали; патч профиля записывается только при его переключении.",
|
|
3596
|
+
"lan.urls": "Адреса в локальной сети: {urls}",
|
|
3597
|
+
"mobile.whale.open": "Открыть боковую панель",
|
|
3598
|
+
"pair.dockerHint": "В Docker и за обратным прокси скопируйте этот токен, чтобы сопрячь устройство напрямую на целевом устройстве.",
|
|
3599
|
+
"pair.expired": "Срок действия QR-кода истёк — обновите его",
|
|
3600
|
+
"pair.expires": "QR-код действует до {time}",
|
|
3601
|
+
"pair.failed.detail": "Ссылка недействительна или просрочена. Обновите QR-код на компьютере и отсканируйте снова.",
|
|
3602
|
+
"pair.failed.title": "Сопряжение не удалось",
|
|
3603
|
+
"pair.hint": "Не получается отсканировать? Откройте одну из ссылок сопряжения ниже",
|
|
3604
|
+
"pair.linkLabel": "Ссылка сопряжения",
|
|
3605
|
+
"pair.oneTimeHint": "Ссылка несёт токен с ограниченным сроком: пока он не истёк и QR-код не обновлён, одна и та же ссылка может сопрячь несколько устройств, каждое со своей сессией устройства.",
|
|
3606
|
+
"pair.publicHint": "Публичные ссылки работают, когда устройство не в той же сети",
|
|
3607
|
+
"pair.tokenLabel": "Токен сопряжения",
|
|
3608
|
+
"posture.exposed": "Канал /api открыт для несопряжённых устройств",
|
|
3609
|
+
"posture.exposedHint": "Запросы от {hosts} доходят до полного API рабочего стола без сопряжения. Уберите для них --trusted-host (сопряжение уже покрывает удалённый доступ) либо привяжите сервер только к петлевому адресу и используйте туннель.",
|
|
3610
|
+
"public.badge": "Публичный",
|
|
3611
|
+
"relay.failed": "Не удалось синхронизировать постоянное имя хоста: {error}. Повторяем автоматически; пока QR-код может использовать временный адрес.",
|
|
3612
|
+
"relay.registering": "Синхронизируем временный туннель с постоянным именем хоста (<id>.dsh-market.com)…",
|
|
3613
|
+
"settings.autoTunnel": "Автоматический публичный туннель",
|
|
3614
|
+
"settings.autoTunnelHint": "Когда включено, плагин поднимает собственный быстрый туннель Cloudflare (устанавливать ничего не нужно) и сам поддерживает публичный адрес и параметры доверия, чтобы телефон из любой сети мог сопрячься в любой момент; учтите, что временное имя хоста меняется при каждом перезапуске, поэтому телефонам придётся сканировать заново. Пока это включено, токен именованного туннеля ниже и ручной публичный адрес выше игнорируются.",
|
|
3615
|
+
"settings.collapse": "Скрыть настройки",
|
|
3616
|
+
"settings.cookieName": "Имя cookie устройства",
|
|
3617
|
+
"settings.cookieNameHint": "Cookie, в которой лежит идентификатор сопряжённого устройства.",
|
|
3618
|
+
"settings.description": "Сопряжение телефона, публичный туннель и лимиты устройств.",
|
|
3619
|
+
"settings.discard": "Отменить изменения",
|
|
3620
|
+
"settings.enabled": "Включить удалённый доступ",
|
|
3621
|
+
"settings.enabledHint": "Когда выключено, пункт боковой панели убирается, а маршруты сопряжения и защита локальной сети останавливаются.",
|
|
3622
|
+
"settings.expand": "Показать настройки",
|
|
3623
|
+
"settings.idleExpireMs": "Истечение при бездействии (мс)",
|
|
3624
|
+
"settings.idleExpireMsHint": "Сопряжённое устройство, от которого не было ни сигнала активности, ни запросов столько времени, удаляется, и ему придётся сканировать заново. По умолчанию 7 дней.",
|
|
3625
|
+
"settings.inherit": "Наследовать",
|
|
3626
|
+
"settings.invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию.",
|
|
3627
|
+
"settings.lanBind": "Доступ по локальной сети (привязка к 0.0.0.0)",
|
|
3628
|
+
"settings.lanBindHint": "Когда включено, плагин записывает управляемый блок в патч профиля с привязкой по умолчанию к 0.0.0.0 (явный флаг --host всё равно главнее) и поддерживает соответствующее правило брандмауэра хоста (Windows и Linux; на других платформах оно не нужно). Когда выключено, блок закрепляет 127.0.0.1. Изменение привязки обычно вступает в силу после перезапуска dsh web.",
|
|
3629
|
+
"settings.maxDevices": "Предел сопряжённых устройств",
|
|
3630
|
+
"settings.maxDevicesHint": "Жёсткий предел сессий сопряжённых устройств; при заполнении вытесняется самая старая.",
|
|
3631
|
+
"settings.notExposed": "Эта версия DSH не показывает странице настроек пространство имён этого плагина, поэтому форма недоступна. Отредактируйте $DSH_HOME/settings.yaml напрямую или убедитесь, что плагин-владелец пространства имён подключён вместе со своим доменом настроек, и перезапустите.",
|
|
3632
|
+
"settings.off": "Выкл.",
|
|
3633
|
+
"settings.offlineAfterMs": "Порог офлайна устройства (мс)",
|
|
3634
|
+
"settings.offlineAfterMsHint": "Сопряжённое устройство переходит в офлайн, если его не видели столько времени.",
|
|
3635
|
+
"settings.on": "Вкл.",
|
|
3636
|
+
"settings.overridden": "Переопределено",
|
|
3637
|
+
"settings.publicBaseUrl": "Публичный адрес (необязательно)",
|
|
3638
|
+
"settings.publicBaseUrlHint": "Публичный URL туннеля перед этим сервером, например Cloudflare Tunnel: https://xxx.trycloudflare.com; туннель с фиксированным именем хоста (токен ниже) тоже указывается здесь. Если адрес задан, ссылка в QR-коде строится от него, и телефон из любой сети может сопрячься; оставьте пустым для работы только в локальной сети.",
|
|
3639
|
+
"settings.readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
3640
|
+
"settings.relay": "Ретрансляция с постоянным именем хоста (рекомендуется)",
|
|
3641
|
+
"settings.relayHint": "Когда включено, автоматический туннель дополнительно регистрирует неизменный публичный поддомен (<id>.dsh-market.com, который пограничный узел dsh-market перенаправляет на ваш временный туннель), так что телефон сопрягается один раз, а QR-код и закладка остаются рабочими после перезапусков. Трафик проходит через пограничный узел dsh-market (та же точка доверия, что и у временного туннеля); выключите, чтобы вернуться к сырому временному адресу, который требует повторного сопряжения после каждого перезапуска. Действует только для автоматического публичного туннеля.",
|
|
3642
|
+
"settings.requirePairingForLan": "Требовать сопряжение для доступа по локальной сети",
|
|
3643
|
+
"settings.requirePairingForLanHint": "Включено: веб-интерфейс рабочего стола с адреса, отличного от петлевого, идёт через закрытый канал /remote и обязан нести cookie живого сопряжённого устройства. Выключено: рабочий стол остаётся на своих путях (полезно, только если этому адресу уже доверяют), а сопряжение управляет лишь токенами и статусом.",
|
|
3644
|
+
"settings.reset": "Сбросить к значению по умолчанию",
|
|
3645
|
+
"settings.save": "Сохранить",
|
|
3646
|
+
"settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены вам для исправления.",
|
|
3647
|
+
"settings.saving": "Сохранение…",
|
|
3648
|
+
"settings.title": "Удалённый доступ",
|
|
3649
|
+
"settings.tokenTtlMs": "Срок жизни токена сопряжения (мс)",
|
|
3650
|
+
"settings.tokenTtlMsHint": "Сколько действует выпущенная ссылка в QR-коде, прежде чем перестать работать.",
|
|
3651
|
+
"settings.tunnelToken": "Токен туннеля с фиксированным именем хоста (Cloudflare Tunnel)",
|
|
3652
|
+
"settings.tunnelTokenHint": "Вставьте токен именованного туннеля Cloudflare (значение cloudflared tunnel run --token), и плагин поднимет туннель сам: публичное имя хоста остаётся неизменным, поэтому телефон сопрягается один раз и больше никогда — в том числе после перезапусков. Сначала сопоставьте публичное имя хоста с http://127.0.0.1:<порт> в панели Cloudflare и впишите то же имя хоста в публичный адрес выше. Приоритет ниже, чем у автоматического быстрого туннеля.",
|
|
3653
|
+
"settings.unsaved": "Не сохранено",
|
|
3654
|
+
"status.connected": "Подключено устройств: {n}",
|
|
3655
|
+
"status.disconnected": "Сопряжённые устройства не в сети",
|
|
3656
|
+
"status.lanRequired": "Этой функции нужна привязка к локальной сети или публичный адрес",
|
|
3657
|
+
"status.lanRequiredHint": "Сервер привязан к 127.0.0.1 и публичный адрес не настроен, поэтому телефон до него не дотянется. Включите доступ по локальной сети в карточке настроек этого плагина (в разделе «Настройки → Веб-плагины → Удалённый доступ», если установлено всё семейство, или в строке плагина в разделе «Настройки → Плагины» при отдельной установке), либо перезапустите с dsh web --host 0.0.0.0, либо задайте публичный адрес туннеля.",
|
|
3658
|
+
"status.loopbackRequired": "Панель сопряжения работает только на этой машине",
|
|
3659
|
+
"status.loopbackRequiredHint": "Откройте эту страницу по адресу http://127.0.0.1, чтобы выпустить QR-код; телефоны используют сопряжённую ссылку.",
|
|
3660
|
+
"status.stopped": "Удалённый доступ остановлен",
|
|
3661
|
+
"status.unreachable": "Служба сопряжения недоступна",
|
|
3662
|
+
"status.unreachableHint": "Обновите страницу и попробуйте снова.",
|
|
3663
|
+
"status.waiting": "Ждём устройство",
|
|
3664
|
+
"stopped.hint": "Удалённый доступ остановлен. Нажмите «Обновить QR», чтобы включить его снова.",
|
|
3665
|
+
"subtitle": "Сопрягите телефон или другой компьютер, чтобы открыть тот же веб-интерфейс (официальный интерфейс и мобильная адаптация)",
|
|
3666
|
+
"title": "Удалённый доступ",
|
|
3667
|
+
"tunnel.failed": "Публичный туннель не запустился: {error}",
|
|
3668
|
+
"tunnel.starting": "Публичный туннель запускается; вскоре QR-код переключится на публичную ссылку…",
|
|
3669
|
+
"tunnel.unknownError": "неизвестная ошибка"
|
|
3670
|
+
},
|
|
3671
|
+
"dsh-skill-explorer": {
|
|
3672
|
+
"create.content": "Инструкции (тело SKILL.md, Markdown)",
|
|
3673
|
+
"create.created": "Создан: {path}",
|
|
3674
|
+
"create.description": "Описание (по нему модель решает, когда применять навык)",
|
|
3675
|
+
"create.empty": "Имя, описание и содержимое навыка не могут быть пустыми",
|
|
3676
|
+
"create.failed": "Не удалось создать: {error}",
|
|
3677
|
+
"create.name": "Имя навыка (kebab-case, совпадает с именем каталога)",
|
|
3678
|
+
"create.namePlaceholder": "например, my-workflow",
|
|
3679
|
+
"create.note": "Навык вступает в силу сразу (skill-filesystem сканирует на лету). Его содержимое подставляется в контекст модели как инструкции — не кладите туда конфиденциальные сведения.",
|
|
3680
|
+
"create.root": "Расположение",
|
|
3681
|
+
"create.root.project": "Навыки проекта (каталог .dsh/skills текущего проекта)",
|
|
3682
|
+
"create.root.user": "Пользовательские навыки (~/.dsh/skills, доступны всем проектам)",
|
|
3683
|
+
"create.submit": "Создать навык",
|
|
3684
|
+
"create.whenToUse": "Когда применять (необязательно)",
|
|
3685
|
+
"edit.back": "Назад к списку",
|
|
3686
|
+
"edit.failed": "Не удалось сохранить: {error}",
|
|
3687
|
+
"edit.loadFailed": "Не удалось загрузить: {error}",
|
|
3688
|
+
"edit.loading": "Загружаем навык…",
|
|
3689
|
+
"edit.name": "Имя навыка (не меняется)",
|
|
3690
|
+
"edit.note": "Меняются только описание, условие применения и тело: имя, расположение и состояние остаются прежними. Правка вступает в силу сразу (skill-filesystem сканирует на лету).",
|
|
3691
|
+
"edit.submit": "Сохранить изменения",
|
|
3692
|
+
"entry.label": "Центр навыков",
|
|
3693
|
+
"entry.tooltip": "Центр навыков: просмотр и управление загруженными навыками",
|
|
3694
|
+
"filter.empty": "Ни один навык не подходит под «{query}»",
|
|
3695
|
+
"filter.emptyWorkspace": "Под текущий фильтр навыков нет.",
|
|
3696
|
+
"filter.searchLabel": "Поиск",
|
|
3697
|
+
"filter.searchPlaceholder": "Фильтр по имени или описанию",
|
|
3698
|
+
"filter.workspaceAll": "Все рабочие области",
|
|
3699
|
+
"filter.workspaceCurrent": "Текущая рабочая область ({name})",
|
|
3700
|
+
"filter.workspaceLabel": "Рабочая область",
|
|
3701
|
+
"group.bundled": "Системные, в поставке",
|
|
3702
|
+
"group.custom": "Свои каталоги",
|
|
3703
|
+
"group.project-agents": "Навыки проекта (.agents/skills)",
|
|
3704
|
+
"group.project-dsh": "Навыки проекта (.dsh/skills)",
|
|
3705
|
+
"group.runtime": "Зарегистрированы во время работы",
|
|
3706
|
+
"group.user-agents": "Пользовательские навыки (~/.agents/skills)",
|
|
3707
|
+
"group.user-dsh": "Пользовательские навыки (~/.dsh/skills)",
|
|
3708
|
+
"groupHint.bundled": "Глобальные навыки, поставляемые с DSH и его плагинами",
|
|
3709
|
+
"groupHint.custom": "Конфигурация customSkillDirs",
|
|
3710
|
+
"groupHint.project-agents": "Лежат в каталоге проекта и ограничены его рабочей областью",
|
|
3711
|
+
"groupHint.project-dsh": "Лежат в каталоге проекта и ограничены его рабочей областью",
|
|
3712
|
+
"groupHint.runtime": "Навыки, зарегистрированные плагинами во время работы",
|
|
3713
|
+
"groupHint.user-agents": "Глобальные навыки (~/.agents/skills), общие для всех проектов",
|
|
3714
|
+
"groupHint.user-dsh": "Глобальные навыки (~/.dsh/skills), общие для всех проектов",
|
|
3715
|
+
"list.count": "{count}",
|
|
3716
|
+
"list.delete": "Удалить",
|
|
3717
|
+
"list.deleteConfirm": "Удалить навык «{name}»? Он переместится в .trash.",
|
|
3718
|
+
"list.deleteFailed": "Не удалось удалить: {error}",
|
|
3719
|
+
"list.disabled": "Выключен: модель не может его вызвать (нажмите, чтобы включить)",
|
|
3720
|
+
"list.edit": "Изменить",
|
|
3721
|
+
"list.empty": "Навыки ещё не загружены.",
|
|
3722
|
+
"list.enabled": "Включён: модель может его вызвать (нажмите, чтобы выключить)",
|
|
3723
|
+
"list.invokable": "Может вызывать: {marks}",
|
|
3724
|
+
"list.invokableTooltip": "Модель может вызывать этот навык автоматически; ручные команды /skill остаются доступны",
|
|
3725
|
+
"list.linked": "символическая ссылка",
|
|
3726
|
+
"list.loadFailed": "Не удалось загрузить: {error}",
|
|
3727
|
+
"list.loading": "Загрузка…",
|
|
3728
|
+
"list.mark.model": "модель",
|
|
3729
|
+
"list.mark.user": "пользователь",
|
|
3730
|
+
"list.noFile": "Локального файла нет",
|
|
3731
|
+
"list.noFileHint": "У этого навыка нет локального файла SKILL.md, поэтому включить или выключить его, изменить или удалить здесь нельзя.",
|
|
3732
|
+
"list.noFileTooltip": "Навык зарегистрирован во время работы или поставлен плагином, поэтому файла SKILL.md у него нет",
|
|
3733
|
+
"list.providerFile": "Предоставлен плагином",
|
|
3734
|
+
"list.providerFileHint": "Навык поставляет плагин, и файл SKILL.md у него есть, но лежит вне корней, которые просматривает эта панель, поэтому изменить или удалить его здесь нельзя. Переключатель меняет лишь то, что панель считает вызываемым; модель всё равно загружает навык.",
|
|
3735
|
+
"list.providerFileTooltip": "Файл этого навыка предоставлен его плагином и лежит вне корней, которые просматривает эта панель",
|
|
3736
|
+
"list.toggleFailed": "Операция не удалась: {error}",
|
|
3737
|
+
"list.when": "Когда: {when}",
|
|
3738
|
+
"panel.title": "Центр навыков",
|
|
3739
|
+
"provider.filesystem": "Файловая система",
|
|
3740
|
+
"provider.tooltip": "Источник навыка: {provider}",
|
|
3741
|
+
"refresh": "Обновить",
|
|
3742
|
+
"tab.create": "Создать",
|
|
3743
|
+
"tab.edit": "Изменить навык",
|
|
3744
|
+
"tab.list": "Навыки",
|
|
3745
|
+
"workspace.isolated": "Рабочая область изолирована",
|
|
3746
|
+
"workspace.isolatedHint": "Этот навык принадлежит рабочей области «{workspace}» и изолирован от контекста текущей сессии"
|
|
3747
|
+
},
|
|
3748
|
+
"dsh-web-ui-market": {
|
|
3749
|
+
"badge.market": "dsh-market.com",
|
|
3750
|
+
"cancel": "Отмена",
|
|
3751
|
+
"category.agent": "Агент",
|
|
3752
|
+
"category.integration": "Интеграции",
|
|
3753
|
+
"category.knowledge": "Знания",
|
|
3754
|
+
"category.other": "Другое",
|
|
3755
|
+
"category.roleplay": "Ролевые",
|
|
3756
|
+
"category.security": "Безопасность",
|
|
3757
|
+
"category.tools": "Инструменты",
|
|
3758
|
+
"category.ui": "Интерфейс",
|
|
3759
|
+
"category.utility": "Утилиты",
|
|
3760
|
+
"command.title": "Скопируйте эту команду в терминал хоста dsh",
|
|
3761
|
+
"conflict.text": "{dest} уже существует. Продолжение заменит его файлы старой версией (отменить нельзя).",
|
|
3762
|
+
"conflict.title": "Каталог с таким именем уже есть",
|
|
3763
|
+
"copied": "Скопировано",
|
|
3764
|
+
"copyCommand": "Скопировать команду установки",
|
|
3765
|
+
"empty": "Список мастерской пуст (сеть недоступна? нажмите «Повторить»)",
|
|
3766
|
+
"filter.all": "Все",
|
|
3767
|
+
"filter.category": "Фильтр по категории",
|
|
3768
|
+
"filter.subcategory": "Подкатегория",
|
|
3769
|
+
"install": "Установить",
|
|
3770
|
+
"install.path": "Каталог установки: {path}",
|
|
3771
|
+
"installAll": "Установить всё",
|
|
3772
|
+
"installAllChecking": "Проверяем, чего не хватает…",
|
|
3773
|
+
"installAllConfirm": "Установить скины, которых у вас ещё нет ({count})? Это может занять много места на диске.",
|
|
3774
|
+
"installAllDone": "Установлено скинов: {count}",
|
|
3775
|
+
"installAllFailed": "Не удалось установить скинов: {count}",
|
|
3776
|
+
"installAllNone": "Все скины уже установлены",
|
|
3777
|
+
"installAllRunning": "Установка: {done} из {total}…",
|
|
3778
|
+
"installAllSummary": "Отправлено установок одной пачкой: {count}",
|
|
3779
|
+
"installFailed": "Не удалось установить: {reason}",
|
|
3780
|
+
"installNow": "Установить сейчас",
|
|
3781
|
+
"installSpecInvalid": "Недопустимый источник установки; поддерживаются только имена пакетов npm и git-ссылки https://",
|
|
3782
|
+
"installed": "Установлено",
|
|
3783
|
+
"installedAt": "Установлено в {path}",
|
|
3784
|
+
"installing": "Устанавливаем…",
|
|
3785
|
+
"installs": "Установок: {count}",
|
|
3786
|
+
"like": "Нравится",
|
|
3787
|
+
"likeFailed": "Не удалось проголосовать",
|
|
3788
|
+
"liked": "Нравится",
|
|
3789
|
+
"loading": "Загрузка…",
|
|
3790
|
+
"manageInPluginPage": "Управлять в разделе «Плагины»",
|
|
3791
|
+
"noMatch": "Подходящих записей нет",
|
|
3792
|
+
"npmDownloads": "npm: {count} за 30 дней",
|
|
3793
|
+
"offline": "Данные мастерской недоступны",
|
|
3794
|
+
"online": "",
|
|
3795
|
+
"openSite": "Открыть сайт мастерской",
|
|
3796
|
+
"picks.empty": "Выбор редакции пока пуст.",
|
|
3797
|
+
"presetPanel.missing": "Плагин центра пресетов (@linxin666/dsh-client-ui-preset-center) не установлен, поэтому пресетами сообщества управлять нельзя.",
|
|
3798
|
+
"preview": "Предпросмотр",
|
|
3799
|
+
"remote.note": "Удалённый браузер может только просматривать и копировать команды; установка одним нажатием требует локального (петлевого) браузера.",
|
|
3800
|
+
"replace": "Заменить и установить",
|
|
3801
|
+
"repository": "Исходный репозиторий",
|
|
3802
|
+
"result.count": "Записей: {shown} из {total}",
|
|
3803
|
+
"retry": "Повторить",
|
|
3804
|
+
"search.label": "Поиск по имени, автору или описанию…",
|
|
3805
|
+
"settings.collapse": "Свернуть",
|
|
3806
|
+
"settings.description": "Смотрите скины, питомцев и плагины сообщества на dsh-market.com и ставьте их локально одним нажатием.",
|
|
3807
|
+
"settings.descriptionPrefix": "Смотрите скины, питомцев и плагины сообщества на ",
|
|
3808
|
+
"settings.descriptionSuffix": " и ставьте их локально одним нажатием.",
|
|
3809
|
+
"settings.discard": "Отменить изменения",
|
|
3810
|
+
"settings.enable": "Включить карточку мастерской",
|
|
3811
|
+
"settings.enableHint": "Скрывает содержимое мастерской и оставляет только переключатель.",
|
|
3812
|
+
"settings.expand": "Развернуть",
|
|
3813
|
+
"settings.inherit": "Наследовать",
|
|
3814
|
+
"settings.invalidNumber": "Недопустимое значение",
|
|
3815
|
+
"settings.notExposed": "Раздел не показан (нет пространства имён хоста)",
|
|
3816
|
+
"settings.off": "Выкл.",
|
|
3817
|
+
"settings.on": "Вкл.",
|
|
3818
|
+
"settings.overridden": "Переопределяет значение по умолчанию",
|
|
3819
|
+
"settings.readOnly": "Только чтение",
|
|
3820
|
+
"settings.reset": "Сбросить",
|
|
3821
|
+
"settings.save": "Сохранить",
|
|
3822
|
+
"settings.saveFailed": "Не удалось сохранить",
|
|
3823
|
+
"settings.saving": "Сохранение…",
|
|
3824
|
+
"settings.title": "Мастерская",
|
|
3825
|
+
"settings.unsaved": "Есть несохранённые изменения",
|
|
3826
|
+
"subcategory.access": "Управление доступом",
|
|
3827
|
+
"subcategory.api": "API и сетевые инструменты",
|
|
3828
|
+
"subcategory.bridge": "Мост между системами",
|
|
3829
|
+
"subcategory.browser": "Автоматизация браузера",
|
|
3830
|
+
"subcategory.chat": "Улучшения чата",
|
|
3831
|
+
"subcategory.cleanup": "Очистка системы",
|
|
3832
|
+
"subcategory.context": "Анализ контекста",
|
|
3833
|
+
"subcategory.dev": "Рабочий процесс разработки",
|
|
3834
|
+
"subcategory.external-ai": "Внешний ИИ",
|
|
3835
|
+
"subcategory.memory": "Память",
|
|
3836
|
+
"subcategory.model": "Модели и мультимодальность",
|
|
3837
|
+
"subcategory.net": "Сеть",
|
|
3838
|
+
"subcategory.notify": "Уведомления",
|
|
3839
|
+
"subcategory.panel": "Панель в боковой колонке",
|
|
3840
|
+
"subcategory.policy": "Политика подтверждений",
|
|
3841
|
+
"subcategory.preset": "Пресеты агентов",
|
|
3842
|
+
"subcategory.qa": "Вопросы по базе знаний",
|
|
3843
|
+
"subcategory.reading": "Глубокое чтение",
|
|
3844
|
+
"subcategory.remote": "Удалённый доступ",
|
|
3845
|
+
"subcategory.render": "Отрисовка ответов",
|
|
3846
|
+
"subcategory.stats": "Статистика",
|
|
3847
|
+
"subcategory.sync": "Облачная синхронизация",
|
|
3848
|
+
"subcategory.terminal": "Интерфейс терминала",
|
|
3849
|
+
"tab.pet": "Питомцы",
|
|
3850
|
+
"tab.picks": "Выбор редакции",
|
|
3851
|
+
"tab.plugin": "Плагины",
|
|
3852
|
+
"tab.preset": "Пресеты",
|
|
3853
|
+
"tab.skin": "Скины",
|
|
3854
|
+
"votes": "Голосов: {count}"
|
|
3855
|
+
},
|
|
3856
|
+
"liangshen": {
|
|
3857
|
+
"burst.line1": "Три секунды, три жизни кода",
|
|
3858
|
+
"burst.line2": "Вэньянь · двоичный код · азбука Морзе",
|
|
3859
|
+
"lever.a11y": "Рычаг режима LiangShen",
|
|
3860
|
+
"lever.busy": "Переключаем…",
|
|
3861
|
+
"lever.failed.failed": "Переключение не удалось: {reason}",
|
|
3862
|
+
"lever.failed.locked": "Сессия уже началась, поэтому режим зафиксирован",
|
|
3863
|
+
"lever.failed.missing": "Пресет LiangShen не найден",
|
|
3864
|
+
"lever.failed.timeout": "Переключение не уложилось в отведённое время; попробуйте снова",
|
|
3865
|
+
"lever.hint.locked": "Сессия уже началась, поэтому её режим больше не изменить",
|
|
3866
|
+
"lever.hint.missing": "Пресет LiangShen не установлен; сначала включите его в списке плагинов",
|
|
3867
|
+
"lever.hint.pull": "Потяните рычаг вниз, чтобы включить режим LiangShen",
|
|
3868
|
+
"lever.hint.push": "Поднимите рычаг вверх, чтобы вернуться к «{preset}»",
|
|
3869
|
+
"lever.name": "Режим LiangShen",
|
|
3870
|
+
"lever.state.off": "Обычный",
|
|
3871
|
+
"lever.state.on": "LiangShen",
|
|
3872
|
+
"presentation.native": "родной (собственный набор инструментов)",
|
|
3873
|
+
"presentation.ptc": "ptc (только run_code)",
|
|
3874
|
+
"settings.announceToAgent": "Объявлять плагин агентам",
|
|
3875
|
+
"settings.announceToAgentHint": "Добавляет объявление этого плагина в системный промпт каждого агента; по умолчанию выключено, чтобы промпты оставались чистыми.",
|
|
3876
|
+
"settings.collapse": "Скрыть настройки",
|
|
3877
|
+
"settings.description": "Управляет этим плагином и представлением инструментов в запросе.",
|
|
3878
|
+
"settings.discard": "Отменить изменения",
|
|
3879
|
+
"settings.dispatcher": "Роль диспетчера",
|
|
3880
|
+
"settings.dispatcherHint": "Когда включено, режим работает как агент-диспетчер: сначала оценивает сложность (работу L0/L1 выполняет сам, для задачи L2 запускает полный поток), уточняет задачу L2 в интервью перед планированием, а ведущий агент раздаёт подзадачи субагентам и принимает их слой за слоем. К представлению инструментов в запросе это отношения не имеет — решает только роль и дисциплину процесса. Включено по умолчанию; выключение возвращает промпт к чистой персоне с её рабочей дисциплиной.",
|
|
3881
|
+
"settings.enabled": "Включить режим LiangShen",
|
|
3882
|
+
"settings.enabledHint": "Когда выключено, пресет не объявляется и объявление агентам не выполняется.",
|
|
3883
|
+
"settings.expand": "Показать настройки",
|
|
3884
|
+
"settings.inherit": "Наследовать (значение развёртывания)",
|
|
3885
|
+
"settings.invalidValue": "Значение не принимается",
|
|
3886
|
+
"settings.notExposed": "Эта версия DSH не показывает странице настроек пространство имён этого плагина, поэтому форма недоступна. Отредактируйте ~/.dsh/settings.yaml напрямую или добавьте пространство имён в список разрешённых в настройках хоста и перезапустите.",
|
|
3887
|
+
"settings.off": "Выкл.",
|
|
3888
|
+
"settings.on": "Вкл.",
|
|
3889
|
+
"settings.overridden": "Переопределено",
|
|
3890
|
+
"settings.presentation": "Представление инструментов в запросе",
|
|
3891
|
+
"settings.presentationHint": "Записывается в строку каталога инструментов того пресета, который объявляет этот плагин: ptc (значение по умолчанию) сводит запрос к run_code, а остальные инструменты доступны через сгенерированный SDK; родной режим сохраняет собственный набор. Изменение сразу переобъявляет пресет; уже начавшиеся сессии сохраняют объявленный состав.",
|
|
3892
|
+
"settings.readOnly": "Это развёртывание отдаёт настройки только для чтения.",
|
|
3893
|
+
"settings.reset": "Сбросить",
|
|
3894
|
+
"settings.save": "Сохранить",
|
|
3895
|
+
"settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены вам для исправления.",
|
|
3896
|
+
"settings.saving": "Сохранение…",
|
|
3897
|
+
"settings.title": "Режим LiangShen",
|
|
3898
|
+
"settings.unsaved": "Не сохранено"
|
|
3899
|
+
},
|
|
3900
|
+
"dsh-web-ui-preset-center": {
|
|
3901
|
+
"action.cancel": "Отмена",
|
|
3902
|
+
"action.disable": "Выключить",
|
|
3903
|
+
"action.enable": "Включить",
|
|
3904
|
+
"action.install": "Установить",
|
|
3905
|
+
"action.refresh": "Обновить",
|
|
3906
|
+
"action.uninstall": "Удалить",
|
|
3907
|
+
"action.update": "Обновить",
|
|
3908
|
+
"action.view": "Посмотреть состав",
|
|
3909
|
+
"code.detail": "Файлов кода: {files}, js-выражений: {expressions}, плагинов: {plugins}",
|
|
3910
|
+
"code.inline": "Есть встроенные выражения",
|
|
3911
|
+
"code.local": "Поставляет локальный код",
|
|
3912
|
+
"code.none": "Собирается только из установленных плагинов",
|
|
3913
|
+
"confirm.text": "Установка «{name}» загружает его состав внутрь процесса хоста DSH, а это тот же уровень доверия, что и доступ к командной строке. {detail} Продолжить?",
|
|
3914
|
+
"confirm.title": "Установка исполняемого пресета",
|
|
3915
|
+
"count.installs": "Установок: {count}",
|
|
3916
|
+
"installing": "Работаем…",
|
|
3917
|
+
"note.actionFailed": "Действие не удалось: {reason}",
|
|
3918
|
+
"note.broken": "Не удалось загрузить: {reason}",
|
|
3919
|
+
"note.conflict": "Каталог с таким id уже есть локально; ничего не перезаписано",
|
|
3920
|
+
"note.defaultPreset": "Это текущий пресет по умолчанию; сначала смените значение по умолчанию в разделе «Настройки → Пресеты агентов»",
|
|
3921
|
+
"note.disabled": "Выключен; файлы остаются в библиотеке пресетов, и его можно включить снова",
|
|
3922
|
+
"note.emptyCatalog": "Каталог пресетов сообщества пуст",
|
|
3923
|
+
"note.enabled": "Установлен и включён; обновите страницу, чтобы увидеть его в разделе «Настройки → Пресеты агентов»",
|
|
3924
|
+
"note.gatewayUnavailable": "Локальный шлюз недоступен: удалённый браузер или маршруты хоста не подключены; установка и включение недоступны",
|
|
3925
|
+
"note.installFailed": "Не удалось установить: {reason}",
|
|
3926
|
+
"note.loadFailed": "Не удалось прочитать состояние пресетов: {reason}",
|
|
3927
|
+
"note.noMatch": "Подходящего пресета нет",
|
|
3928
|
+
"note.remoteInstall": "Выполните это в браузере на машине, где работает DSH",
|
|
3929
|
+
"note.rosterUnavailable": "Хост не предоставляет службу реестра пресетов агентов, поэтому объявить пресеты нельзя",
|
|
3930
|
+
"note.shadowed": "Этот id уже занят пресетом другого плагина, поэтому объявить его нельзя",
|
|
3931
|
+
"note.uninstalled": "Удалён",
|
|
3932
|
+
"note.updated": "Обновлён до последней версии",
|
|
3933
|
+
"search.placeholder": "Поиск пресетов",
|
|
3934
|
+
"state.broken": "Не загружается",
|
|
3935
|
+
"state.conflict": "Конфликт состояния каталога",
|
|
3936
|
+
"state.enabled": "Включён",
|
|
3937
|
+
"state.installed": "Установлен — выключен",
|
|
3938
|
+
"state.local": "Локальный пресет с таким id",
|
|
3939
|
+
"state.modified": "Изменён локально",
|
|
3940
|
+
"state.newVersion": "Доступно обновление {version}",
|
|
3941
|
+
"state.notInstalled": "Не установлен",
|
|
3942
|
+
"state.shadowed": "Id занят пресетом другого плагина",
|
|
3943
|
+
"uninstall.text": "Снимает регистрацию «{name}» и удаляет его локальные файлы (копию в $DSH_HOME/agent-presets). Сессии, которые уже его используют, продолжают работу.",
|
|
3944
|
+
"uninstall.title": "Удаление пресета",
|
|
3945
|
+
"viewer.empty": "(файл состава пуст или не читается)",
|
|
3946
|
+
"viewer.title": "{name} — agent.cordis.yml"
|
|
3947
|
+
},
|
|
3948
|
+
"dsh-ssh": {
|
|
3949
|
+
"cluster.aliases": "Псевдонимы хостов (через запятую; нужен хотя бы один фильтр)",
|
|
3950
|
+
"cluster.col.alias": "Хост",
|
|
3951
|
+
"cluster.col.duration": "Длительность",
|
|
3952
|
+
"cluster.col.error": "Ошибка",
|
|
3953
|
+
"cluster.col.exit": "Код выхода",
|
|
3954
|
+
"cluster.col.status": "Состояние",
|
|
3955
|
+
"cluster.col.stderr": "Stderr",
|
|
3956
|
+
"cluster.col.stdout": "Stdout",
|
|
3957
|
+
"cluster.command": "Команда",
|
|
3958
|
+
"cluster.confirm": "Выполнить эту команду на подходящих хостах? Она выполнится по-настоящему на удалённых серверах.",
|
|
3959
|
+
"cluster.empty": "Введите команду и нажмите «Запустить».",
|
|
3960
|
+
"cluster.environment": "Фильтр по среде",
|
|
3961
|
+
"cluster.fail": "С ошибкой",
|
|
3962
|
+
"cluster.noMatch": "Подходящих хостов нет.",
|
|
3963
|
+
"cluster.ok": "Успешно",
|
|
3964
|
+
"cluster.results": "Результаты",
|
|
3965
|
+
"cluster.run": "Запустить",
|
|
3966
|
+
"cluster.tags": "Фильтр по меткам (через запятую)",
|
|
3967
|
+
"cluster.timeout": "Истекло время",
|
|
3968
|
+
"common.confirm": "Подтвердить",
|
|
3969
|
+
"common.error": "Ошибка: {error}",
|
|
3970
|
+
"common.loading": "Загрузка…",
|
|
3971
|
+
"common.refresh": "Обновить",
|
|
3972
|
+
"entry.label": "SSH",
|
|
3973
|
+
"entry.tooltip": "Панель удалённых операций по SSH",
|
|
3974
|
+
"error.disabled": "Плагин SSH выключен на хосте. Включите его в разделе «Настройки → Веб-плагины → SSH».",
|
|
3975
|
+
"form.agentPath": "Путь к агенту",
|
|
3976
|
+
"form.agentPathHint": "Оставьте пустым для автоопределения (SSH_AUTH_SOCK / Pageant в Windows) или укажите путь к сокету либо «pageant»",
|
|
3977
|
+
"form.alias": "Псевдоним",
|
|
3978
|
+
"form.aliasHint": "Строчные буквы, цифры и одиночные дефисы; используется во всех операциях",
|
|
3979
|
+
"form.auth": "Аутентификация",
|
|
3980
|
+
"form.auth.agent": "Агент SSH",
|
|
3981
|
+
"form.auth.key": "Ключ",
|
|
3982
|
+
"form.auth.password": "Пароль",
|
|
3983
|
+
"form.authKeepHint": "При редактировании пустые секретные поля сохраняют текущие способ и данные аутентификации; введите новые значения, чтобы сменить способ.",
|
|
3984
|
+
"form.cancel": "Отмена",
|
|
3985
|
+
"form.description": "Описание",
|
|
3986
|
+
"form.environment": "Среда",
|
|
3987
|
+
"form.environmentHint": "например, development / production",
|
|
3988
|
+
"form.host": "Хост",
|
|
3989
|
+
"form.keyPath": "Путь к закрытому ключу",
|
|
3990
|
+
"form.keyPathHint": "например, ~/.ssh/id_ed25519",
|
|
3991
|
+
"form.location": "Расположение",
|
|
3992
|
+
"form.passphrase": "Парольная фраза ключа",
|
|
3993
|
+
"form.password": "Пароль",
|
|
3994
|
+
"form.passwordHint": "Хранится открытым текстом в $DSH_HOME/dsh-ssh.json (локальный приватный файл)",
|
|
3995
|
+
"form.passwordRequired": "Для входа по паролю пароль обязателен.",
|
|
3996
|
+
"form.port": "Порт",
|
|
3997
|
+
"form.portInvalid": "Порт должен быть целым числом от 1 до 65535.",
|
|
3998
|
+
"form.proxyCommand": "ProxyCommand",
|
|
3999
|
+
"form.proxyCommandHint": "OpenSSH ProxyCommand: %h — хост, %p — порт, %r — пользователь, %n — псевдоним; пустое значение или none отключает его. Несовместим с цепочкой перехода.",
|
|
4000
|
+
"form.proxyJump": "Псевдонимы хостов перехода",
|
|
4001
|
+
"form.proxyJumpHint": "Локальные псевдонимы или адреса вида пользователь@хост:порт через запятую, выстраиваются в цепочку по порядку",
|
|
4002
|
+
"form.required": "Не хватает обязательных полей: псевдоним, хост, пользователь.",
|
|
4003
|
+
"form.save": "Сохранить",
|
|
4004
|
+
"form.tags": "Метки",
|
|
4005
|
+
"form.tagsHint": "Через запятую",
|
|
4006
|
+
"form.title.create": "Добавить хост",
|
|
4007
|
+
"form.title.edit": "Изменить хост {alias}",
|
|
4008
|
+
"form.user": "Пользователь",
|
|
4009
|
+
"hosts.add": "Добавить хост",
|
|
4010
|
+
"hosts.col.actions": "Действия",
|
|
4011
|
+
"hosts.col.alias": "Псевдоним",
|
|
4012
|
+
"hosts.col.auth": "Аутентификация",
|
|
4013
|
+
"hosts.col.description": "Описание",
|
|
4014
|
+
"hosts.col.environment": "Среда",
|
|
4015
|
+
"hosts.col.host": "Хост",
|
|
4016
|
+
"hosts.col.tags": "Метки",
|
|
4017
|
+
"hosts.col.user": "Пользователь",
|
|
4018
|
+
"hosts.connected": "Подключиться",
|
|
4019
|
+
"hosts.delete": "Удалить",
|
|
4020
|
+
"hosts.deleteConfirm": "Удалить хост «{alias}»? Его туннели будут остановлены.",
|
|
4021
|
+
"hosts.edit": "Изменить",
|
|
4022
|
+
"hosts.empty": "Хосты не настроены. Нажмите «Добавить хост» или импортируйте из ~/.ssh/config.",
|
|
4023
|
+
"hosts.group.count": "Хостов: {count}",
|
|
4024
|
+
"hosts.group.noTags": "Без меток",
|
|
4025
|
+
"hosts.group.testAll": "Проверить все",
|
|
4026
|
+
"hosts.group.ungrouped": "Без среды",
|
|
4027
|
+
"hosts.groupBy.environment": "Группировать по среде",
|
|
4028
|
+
"hosts.groupBy.label": "Группировка",
|
|
4029
|
+
"hosts.groupBy.none": "Без группировки",
|
|
4030
|
+
"hosts.groupBy.tags": "Группировать по меткам",
|
|
4031
|
+
"hosts.import": "Импорт из ~/.ssh/config",
|
|
4032
|
+
"hosts.imported": "Разобрано блоков: {parsed}, добавлено хостов: {added}, пропущено: {skipped}.",
|
|
4033
|
+
"hosts.notConnected": "Не подключено",
|
|
4034
|
+
"hosts.proxyBadge": "прокси",
|
|
4035
|
+
"hosts.search": "Поиск по псевдониму, описанию или меткам…",
|
|
4036
|
+
"hosts.test": "Проверить",
|
|
4037
|
+
"hosts.testFail": "Подключение не удалось: {error}",
|
|
4038
|
+
"hosts.testOk": "Подключено ({latency} мс)",
|
|
4039
|
+
"hosts.testing": "Проверяем подключение…",
|
|
4040
|
+
"import.more": "Ещё не показано: {count}",
|
|
4041
|
+
"import.reason.existing": "псевдоним уже настроен",
|
|
4042
|
+
"import.reason.invalid": "недопустимые поля — не импортировано",
|
|
4043
|
+
"import.reason.match": "Блок Match не поддерживается",
|
|
4044
|
+
"import.reason.wildcard": "шаблон с подстановкой — настройте вручную",
|
|
4045
|
+
"panel.backToConversation": "Вернуться в чат",
|
|
4046
|
+
"panel.title": "Удалённый SSH",
|
|
4047
|
+
"tab.cluster": "Кластер",
|
|
4048
|
+
"tab.hosts": "Хосты",
|
|
4049
|
+
"tab.terminal": "Терминал",
|
|
4050
|
+
"tab.transfer": "Передача файлов",
|
|
4051
|
+
"tab.tunnels": "Туннели",
|
|
4052
|
+
"terminal.auth.cancel": "Отмена",
|
|
4053
|
+
"terminal.auth.hint": "Сервер запросил интерактивную двухфакторную аутентификацию (только на сессию, не сохраняется):",
|
|
4054
|
+
"terminal.auth.placeholder": "Введите код или парольную фразу",
|
|
4055
|
+
"terminal.auth.submit": "Отправить код",
|
|
4056
|
+
"terminal.auth.title": "Двухфакторная аутентификация (2FA)",
|
|
4057
|
+
"terminal.connect": "Подключиться",
|
|
4058
|
+
"terminal.connecting": "Подключаемся…",
|
|
4059
|
+
"terminal.disconnect": "Отключиться",
|
|
4060
|
+
"terminal.error": "Ошибка терминала: {error}",
|
|
4061
|
+
"terminal.exited": "Терминал завершён ({alias})",
|
|
4062
|
+
"terminal.noWebSocket": "Эта страница не может работать через WebSocket (оболочка приложения не опубликовала локальный адрес хоста). Откройте веб-интерфейс в браузере, чтобы пользоваться терминалом.",
|
|
4063
|
+
"terminal.placeholder": "Выберите хост и нажмите «Подключиться», чтобы открыть удалённый терминал.",
|
|
4064
|
+
"terminal.ready": "Терминал подключён ({alias})",
|
|
4065
|
+
"terminal.selectHost": "Выберите хост",
|
|
4066
|
+
"transfer.browseRemote": "Просмотреть удалённый каталог",
|
|
4067
|
+
"transfer.bytes": "{value} Б",
|
|
4068
|
+
"transfer.dir": "Каталог",
|
|
4069
|
+
"transfer.done": "Готово, байт: {bytes}",
|
|
4070
|
+
"transfer.download": "Скачать",
|
|
4071
|
+
"transfer.downloading": "Скачиваем…",
|
|
4072
|
+
"transfer.failed": "Передача не удалась: {error}",
|
|
4073
|
+
"transfer.file": "Файл",
|
|
4074
|
+
"transfer.gib": "{value} ГБ",
|
|
4075
|
+
"transfer.kib": "{value} КБ",
|
|
4076
|
+
"transfer.mib": "{value} МБ",
|
|
4077
|
+
"transfer.modified": "Изменён",
|
|
4078
|
+
"transfer.name": "Имя",
|
|
4079
|
+
"transfer.percent": "{value} %",
|
|
4080
|
+
"transfer.refresh": "Обновить",
|
|
4081
|
+
"transfer.remotePath": "Удалённый путь",
|
|
4082
|
+
"transfer.remotePathHint": "например, /tmp/ или /home/user/app.tar.gz",
|
|
4083
|
+
"transfer.selectHost": "Выберите хост",
|
|
4084
|
+
"transfer.size": "Размер",
|
|
4085
|
+
"transfer.speed": "{value}/с",
|
|
4086
|
+
"transfer.upLevel": "Родительский каталог",
|
|
4087
|
+
"transfer.upload": "Загрузить",
|
|
4088
|
+
"transfer.uploading": "Загружаем {file}…",
|
|
4089
|
+
"tunnel.alias": "Псевдоним хоста",
|
|
4090
|
+
"tunnel.empty": "Активных туннелей нет.",
|
|
4091
|
+
"tunnel.failed": "Туннель не удался: {error}",
|
|
4092
|
+
"tunnel.localPort": "Локальный порт",
|
|
4093
|
+
"tunnel.localPortHint": "Оставьте пустым для автоматического выбора",
|
|
4094
|
+
"tunnel.remoteHost": "Удалённый хост",
|
|
4095
|
+
"tunnel.remoteHostHint": "По умолчанию 127.0.0.1 (сам сервер)",
|
|
4096
|
+
"tunnel.remotePort": "Удалённый порт",
|
|
4097
|
+
"tunnel.row": "{alias}: 127.0.0.1:{localPort} -> {remoteHost}:{remotePort}",
|
|
4098
|
+
"tunnel.start": "Новый туннель",
|
|
4099
|
+
"tunnel.started": "Туннель поднят: 127.0.0.1:{localPort}",
|
|
4100
|
+
"tunnel.stop": "Остановить",
|
|
4101
|
+
"tunnel.stopAll": "Остановить все",
|
|
4102
|
+
"tunnel.stopAllConfirm": "Остановить все туннели?"
|
|
4103
|
+
},
|
|
4104
|
+
"task-board": {
|
|
4105
|
+
"archive.empty": "Архивных задач нет",
|
|
4106
|
+
"board.archive": "Архив",
|
|
4107
|
+
"board.archiveView": "В архиве ({count})",
|
|
4108
|
+
"board.backToBoard": "Назад к доске",
|
|
4109
|
+
"board.close": "Вернуться в чат",
|
|
4110
|
+
"board.created": "Создано",
|
|
4111
|
+
"board.density.comfortable": "Переключить на полные карточки",
|
|
4112
|
+
"board.density.compact": "Переключить на компактные карточки",
|
|
4113
|
+
"board.empty": "В этой колонке задач нет",
|
|
4114
|
+
"board.filterAll": "Все",
|
|
4115
|
+
"board.group.collapse": "Свернуть",
|
|
4116
|
+
"board.group.earlier": "Ранее",
|
|
4117
|
+
"board.group.expand": "Показать {count}",
|
|
4118
|
+
"board.group.today": "Сегодня",
|
|
4119
|
+
"board.group.week": "Последние 7 дней",
|
|
4120
|
+
"board.hideSubtasks": "Скрыть подзадачи",
|
|
4121
|
+
"board.hostError": "Действие хоста не удалось: {error}",
|
|
4122
|
+
"board.hostError.degraded": "Строка доски задач сломалась при запуске, поэтому её Host API не зарегистрирован: {detail}",
|
|
4123
|
+
"board.hostError.forbidden": "Запрос не прошёл проверку одного источника: оболочка рабочего стола или обратный прокси могли не передать учётные данные браузера",
|
|
4124
|
+
"board.hostError.ledgerLocked": "Журнал доски задач удерживает другой процесс DSH (pid {pid}), поэтому этот экземпляр не зарегистрировал Host API: закройте тот экземпляр DSH или дождитесь его выхода и повторите. Перезапуск этого экземпляра не поможет (причина: {detail})",
|
|
4125
|
+
"board.hostError.locked": "Журнал доски задач заблокирован: {detail}",
|
|
4126
|
+
"board.hostError.notMounted": "Host API доски задач не подключён: хост не загрузил этот плагин (не установлен, выключен или его строка не запустилась). Перезапустите службу DSH и повторите",
|
|
4127
|
+
"board.hostError.timeout": "Хост не ответил за {seconds} с; повторите чуть позже",
|
|
4128
|
+
"board.hostError.unauthorized": "Эта сессия больше не авторизована; перезагрузите страницу и повторите",
|
|
4129
|
+
"board.hostError.unexpected": "Хост вернул нераспознанный ответ (HTTP {status})",
|
|
4130
|
+
"board.hostError.unreachable": "Локальная служба DSH недоступна; убедитесь, что она ещё работает",
|
|
4131
|
+
"board.hostMeta": "Часовой пояс хоста {timeZone} · ревизия {revision}",
|
|
4132
|
+
"board.new": "Новая задача",
|
|
4133
|
+
"board.pending": "Отправляем",
|
|
4134
|
+
"board.project": "Проект",
|
|
4135
|
+
"board.projectAll": "Все проекты",
|
|
4136
|
+
"board.projectCreate": "Создать проект",
|
|
4137
|
+
"board.projectCreateFailed": "Не удалось создать проект: {error}",
|
|
4138
|
+
"board.projectNew": "Новый проект…",
|
|
4139
|
+
"board.projectNewPath": "Каталог проекта (абсолютный путь на хосте)",
|
|
4140
|
+
"board.projectNewPathPlaceholder": "например, C:\\work\\my-project или /home/me/project",
|
|
4141
|
+
"board.retryHost": "Повторить подключение к хосту",
|
|
4142
|
+
"board.runs": "запусков",
|
|
4143
|
+
"board.search": "Фильтр задач…",
|
|
4144
|
+
"board.showSubtasks": "Показать подзадачи",
|
|
4145
|
+
"board.status": "Состояние",
|
|
4146
|
+
"board.status.backlog": "Бэклог",
|
|
4147
|
+
"board.status.done": "Готово",
|
|
4148
|
+
"board.status.failed": "С ошибкой",
|
|
4149
|
+
"board.status.running": "В работе",
|
|
4150
|
+
"board.status.todo": "К выполнению",
|
|
4151
|
+
"board.subtaskFilterHint": "Доска показывает только родительские задачи; текстовый фильтр или фильтр по меткам раскрывает подзадачи автоматически.",
|
|
4152
|
+
"board.tagEmpty": "Нет задачи, у которой есть все эти метки",
|
|
4153
|
+
"board.tagFilter": "Фильтр по метке",
|
|
4154
|
+
"board.tagFilterClear": "Сбросить фильтр по метке",
|
|
4155
|
+
"board.tagManage": "Управление метками",
|
|
4156
|
+
"board.title": "Доска задач",
|
|
4157
|
+
"card.declared": "задано вручную",
|
|
4158
|
+
"card.declaredHint": "Колонка не совпадает с последним запуском: её задал ручной перенос или внешняя система (например, закрытая задача в трекере), а не завершение запуска.",
|
|
4159
|
+
"card.frozen": "заморожено",
|
|
4160
|
+
"card.openSession": "Открыть последнюю сессию выполнения",
|
|
4161
|
+
"card.result.cancelled": "последний отменён",
|
|
4162
|
+
"card.result.failed": "последний с ошибкой",
|
|
4163
|
+
"card.result.succeeded": "последний успешен",
|
|
4164
|
+
"card.scheduled": "по расписанию",
|
|
4165
|
+
"card.scheduledOnce": "однократно",
|
|
4166
|
+
"card.subtask": "подзадача",
|
|
4167
|
+
"card.subtasks": "Подзадач: {count}",
|
|
4168
|
+
"card.subtasksBreakdown": "Подзадачи {total}: готово {done}, выполняется {running}, с ошибкой {failed}",
|
|
4169
|
+
"card.subtasksFailed": "С ошибкой: {count}",
|
|
4170
|
+
"card.subtasksRunning": "Выполняется: {count}",
|
|
4171
|
+
"card.tagsLabel": "метки {tags}",
|
|
4172
|
+
"card.time.archived": "Заархивирована {time}",
|
|
4173
|
+
"card.time.created": "Создана {time}",
|
|
4174
|
+
"card.time.settled": "Завершена {time}",
|
|
4175
|
+
"card.time.started": "Выполняется {time}",
|
|
4176
|
+
"card.time.updated": "Обновлена {time}",
|
|
4177
|
+
"delete.cancel": "Отмена",
|
|
4178
|
+
"delete.confirm": "Удалить «{name}»? Это нельзя отменить.",
|
|
4179
|
+
"delete.ok": "Удалить",
|
|
4180
|
+
"delete.title": "Удаление задачи",
|
|
4181
|
+
"detail.archive": "Заархивировать",
|
|
4182
|
+
"detail.archivedAt": "Заархивирована · {time}",
|
|
4183
|
+
"detail.close": "Закрыть",
|
|
4184
|
+
"detail.collapse": "Показать меньше",
|
|
4185
|
+
"detail.delete": "Удалить",
|
|
4186
|
+
"detail.description": "Описание",
|
|
4187
|
+
"detail.duplicate": "Дублировать задачу",
|
|
4188
|
+
"detail.duplicateAndEdit": "Изменить как новую копию",
|
|
4189
|
+
"detail.edit": "Изменить",
|
|
4190
|
+
"detail.editTags": "Изменить метки",
|
|
4191
|
+
"detail.execution": "История выполнения",
|
|
4192
|
+
"detail.execution.external": "Выполнено вне этого хоста: {agent}",
|
|
4193
|
+
"detail.execution.initiator": "Инициатор — сессия {session}",
|
|
4194
|
+
"detail.executionEnded": "Окончено",
|
|
4195
|
+
"detail.executionSettings": "Настройки выполнения",
|
|
4196
|
+
"detail.executionStarted": "Начато",
|
|
4197
|
+
"detail.expand": "Показать больше",
|
|
4198
|
+
"detail.freeze": "Замороженный снимок",
|
|
4199
|
+
"detail.freeze.frozenAt": "Заморожен {time}",
|
|
4200
|
+
"detail.freeze.frozenBy": "Исходная сессия {session}",
|
|
4201
|
+
"detail.freeze.goal": "Цель",
|
|
4202
|
+
"detail.freeze.next": "Дальше",
|
|
4203
|
+
"detail.freeze.progress": "Прогресс",
|
|
4204
|
+
"detail.freeze.redacted": "В замороженном тексте найдены чувствительные шаблоны, они заменены на [REDACTED]; проверьте вручную, прежде чем продолжать.",
|
|
4205
|
+
"detail.handover": "Пакет передачи",
|
|
4206
|
+
"detail.handover.bundledAt": "Собран {time}",
|
|
4207
|
+
"detail.handover.references": "Ссылки",
|
|
4208
|
+
"detail.noExecution": "Ещё не выполнялась",
|
|
4209
|
+
"detail.noSession": "Сессии нет",
|
|
4210
|
+
"detail.parent": "Родительская задача",
|
|
4211
|
+
"detail.parent.open": "Открыть родительскую задачу",
|
|
4212
|
+
"detail.permissionConfirm": "Подтвердить привязку разрешения",
|
|
4213
|
+
"detail.permissionConfirmed": "Разрешение подтверждено · {time}",
|
|
4214
|
+
"detail.permissionPending": "Разрешение ждёт подтверждения: действующее разрешение этой карточки ({permission}) выше умолчания сессии; ручные запуски и cron отклоняются, пока человек не подтвердит.",
|
|
4215
|
+
"detail.prompt": "Промпт запуска",
|
|
4216
|
+
"detail.rerun": "Запустить снова",
|
|
4217
|
+
"detail.restore": "Восстановить",
|
|
4218
|
+
"detail.result.cancelled": "Отменено",
|
|
4219
|
+
"detail.result.failed": "С ошибкой",
|
|
4220
|
+
"detail.result.running": "Выполняется",
|
|
4221
|
+
"detail.result.succeeded": "Успешно",
|
|
4222
|
+
"detail.run": "Запустить",
|
|
4223
|
+
"detail.schedule": "Запуски по расписанию",
|
|
4224
|
+
"detail.schedule.at": "Запустить в",
|
|
4225
|
+
"detail.schedule.atHint": "Запланированный момент, читается в выбранном поясе; он должен быть в будущем.",
|
|
4226
|
+
"detail.schedule.atInvalid": "Выберите корректное будущее время",
|
|
4227
|
+
"detail.schedule.cancel": "Отменить расписание",
|
|
4228
|
+
"detail.schedule.cron": "Выражение cron",
|
|
4229
|
+
"detail.schedule.dueSoon": "Скоро сработает",
|
|
4230
|
+
"detail.schedule.duration.days": "{count} д",
|
|
4231
|
+
"detail.schedule.duration.hours": "{count} ч",
|
|
4232
|
+
"detail.schedule.duration.minutes": "{count} мин",
|
|
4233
|
+
"detail.schedule.duration.seconds": "{count} с",
|
|
4234
|
+
"detail.schedule.enable": "Включить запуски по расписанию",
|
|
4235
|
+
"detail.schedule.ended": "Расписание завершено: {reason}",
|
|
4236
|
+
"detail.schedule.invalid": "Недопустимое выражение cron",
|
|
4237
|
+
"detail.schedule.lastTriggered": "Последнее срабатывание",
|
|
4238
|
+
"detail.schedule.maxRuns": "Предел запусков",
|
|
4239
|
+
"detail.schedule.maxRunsCustom": "Своё значение",
|
|
4240
|
+
"detail.schedule.maxRunsInvalid": "Предел запусков должен быть положительным целым числом",
|
|
4241
|
+
"detail.schedule.maxRunsUnlimited": "Без ограничения",
|
|
4242
|
+
"detail.schedule.maxRunsValue": "Предел запусков: {count}",
|
|
4243
|
+
"detail.schedule.mode": "Режим",
|
|
4244
|
+
"detail.schedule.mode.cron": "Повторяющийся",
|
|
4245
|
+
"detail.schedule.mode.once": "Однократный",
|
|
4246
|
+
"detail.schedule.nextRun": "Следующий запуск",
|
|
4247
|
+
"detail.schedule.nextRunOverdue": "Просрочено на {duration}",
|
|
4248
|
+
"detail.schedule.notScheduled": "Ещё не запланировано",
|
|
4249
|
+
"detail.schedule.plannedAt": "Запланированное время",
|
|
4250
|
+
"detail.schedule.preset.daily9": "Каждый день в 09:00",
|
|
4251
|
+
"detail.schedule.preset.hourly": "Каждый час",
|
|
4252
|
+
"detail.schedule.preset.tenMin": "Каждые 10 минут",
|
|
4253
|
+
"detail.schedule.preset.weeklyMon9": "Каждый понедельник в 09:00",
|
|
4254
|
+
"detail.schedule.presets": "Готовые наборы",
|
|
4255
|
+
"detail.schedule.remaining": "Осталось: {count}",
|
|
4256
|
+
"detail.schedule.runs": "Выполнено {done} из {total}",
|
|
4257
|
+
"detail.schedule.runsUnlimited": "Выполнено {done}",
|
|
4258
|
+
"detail.schedule.skipped": "Последний пропуск: {reason}",
|
|
4259
|
+
"detail.schedule.stop.busy": "задача уже выполнялась, поэтому срабатывание пропущено",
|
|
4260
|
+
"detail.schedule.stop.fired": "однократный запуск сработал",
|
|
4261
|
+
"detail.schedule.stop.launch-failed": "запуск не удался до создания выполнения, поэтому срабатывание возвращено",
|
|
4262
|
+
"detail.schedule.stop.limit": "достигнут предел запусков",
|
|
4263
|
+
"detail.schedule.stop.missed": "момент был пропущен",
|
|
4264
|
+
"detail.schedule.stop.no-target": "в плане нет достижимого срабатывания",
|
|
4265
|
+
"detail.schedule.stop.permission": "разрешение ждало подтверждения человека, поэтому срабатывание пропущено",
|
|
4266
|
+
"detail.schedule.timeZone": "Часовой пояс",
|
|
4267
|
+
"detail.schedule.timeZoneHint": "Настенное время cron читается в этом поясе; пропуски из-за перехода на летнее время пропускаются, а повторяющееся время срабатывает один раз.",
|
|
4268
|
+
"detail.schedule.timeZoneHost": "Часовой пояс хоста ({timeZone})",
|
|
4269
|
+
"detail.schedule.timeZoneHostUnknown": "Часовой пояс хоста (неизвестен)",
|
|
4270
|
+
"detail.schedule.timeZoneNone": "Подходящего часового пояса нет",
|
|
4271
|
+
"detail.schedule.timeZoneSearch": "Поиск часовых поясов…",
|
|
4272
|
+
"detail.schedule.zoneOnceHint": "Выбранный момент читается в этом поясе.",
|
|
4273
|
+
"detail.subtasks": "Подзадачи",
|
|
4274
|
+
"detail.subtasks.add": "Добавить подзадачу",
|
|
4275
|
+
"detail.subtasks.depthLimit": "Предел вложенности подзадач — {depth}; подзадача не может создать или привязать новые подзадачи.",
|
|
4276
|
+
"detail.subtasks.detach": "Отвязать",
|
|
4277
|
+
"detail.subtasks.empty": "Подзадач пока нет",
|
|
4278
|
+
"detail.subtasks.hostOnly": "Подключитесь к хосту, чтобы создавать или привязывать подзадачи.",
|
|
4279
|
+
"detail.subtasks.link": "Привязать существующую задачу",
|
|
4280
|
+
"detail.subtasks.runHint": "Запуск этой задачи одновременно запускает её незавершённые подзадачи ({count}); подзадача, уже стоящая в колонке «Готово», не запускается снова, а ошибка одной подзадачи не останавливает остальные.",
|
|
4281
|
+
"detail.subtasks.runHintSettled": "Все подзадачи этой задачи уже в колонке «Готово»; запуск задачи их не повторяет. Чтобы запустить какую-то снова, верните её в колонку «К выполнению» или запустите отдельно.",
|
|
4282
|
+
"detail.subtasks.runningLock": "Подзадача выполняется; отвязать или привязать заново можно, когда она завершится",
|
|
4283
|
+
"detail.subtasks.waiting": "Ждём подзадачи",
|
|
4284
|
+
"detail.title": "Детали задачи",
|
|
4285
|
+
"detail.viewSession": "Открыть сессию",
|
|
4286
|
+
"edit.save": "Сохранить",
|
|
4287
|
+
"edit.title": "Изменение задачи",
|
|
4288
|
+
"entry.label": "Доска задач",
|
|
4289
|
+
"exec.error.noWorkspace": "Нет рабочей области для запуска задачи",
|
|
4290
|
+
"exec.error.promptRejected": "Промпт отклонён",
|
|
4291
|
+
"exec.goalRun": "Запускать через встроенный /goal в dsh",
|
|
4292
|
+
"exec.goalRunHint": "По умолчанию выключено: если отметить, запуск вооружает встроенный /goal в dsh целью задачи, и сессия продолжает автоматические раунды, пока агент не объявит цель выполненной, а доска завершит выполнение только тогда, когда эта цель действительно закончится. Без отметки — один обычный раунд.",
|
|
4293
|
+
"exec.hint": "Применяется при запуске задачи: рабочая область определяет, где окажется сессия выполнения; пресет агента собирает сессию (набор инструментов и разделы промпта); разрешение применяется командой /permission. Пустое значение наследует умолчание развёртывания.",
|
|
4294
|
+
"exec.mode.brokenSuffix": " (недоступен)",
|
|
4295
|
+
"exec.mode.builtinGroup": "Встроенные пресеты",
|
|
4296
|
+
"exec.mode.customGroup": "Свои пресеты",
|
|
4297
|
+
"exec.mode.defaultSuffix": " (по умолчанию)",
|
|
4298
|
+
"exec.mode.inherit": "Наследовать (умолчание развёртывания)",
|
|
4299
|
+
"exec.mode.inheritWith": "Наследовать (умолчание развёртывания: {preset})",
|
|
4300
|
+
"exec.mode.removed": " (удалён)",
|
|
4301
|
+
"exec.model.default": "Умолчание хоста (agent-default-model)",
|
|
4302
|
+
"exec.model.unknown": " (неизвестно / откат к умолчанию)",
|
|
4303
|
+
"exec.permission.danger-full-access": "Полный доступ",
|
|
4304
|
+
"exec.permission.default": "Умолчание сессии",
|
|
4305
|
+
"exec.permission.inheritParent": "Наследовать от родителя ({permission})",
|
|
4306
|
+
"exec.permission.read-only": "Только чтение",
|
|
4307
|
+
"exec.permission.workspace-write": "Запись в рабочей области",
|
|
4308
|
+
"exec.reasoning": "Уровень рассуждения",
|
|
4309
|
+
"exec.reasoning.hint.inherit": "Оставьте пустым, чтобы следовать умолчанию модели или хоста.",
|
|
4310
|
+
"exec.reasoning.hint.noEfforts": "Эта модель не предлагает выбираемых уровней рассуждения, поэтому всегда действует умолчание модели или хоста.",
|
|
4311
|
+
"exec.reasoning.hint.pickModel": "Сначала закрепите модель, затем выберите её уровень рассуждения.",
|
|
4312
|
+
"exec.reasoning.hint.unknownModel": "Текущий набор не позволяет подтвердить уровни рассуждения этой модели; сохранённое значение остаётся как есть.",
|
|
4313
|
+
"exec.reasoning.inherit": "Модель или умолчание хоста",
|
|
4314
|
+
"exec.reasoning.unknown": " (уровень неизвестен)",
|
|
4315
|
+
"exec.reuseSession": "Продолжать в том же разговоре",
|
|
4316
|
+
"exec.reuseSessionHint": "Когда включено, последующие запуски продолжают предыдущую сессию (если она свободна и ещё существует), а не начинают новый разговор каждый раз; закреплённые выше разрешение и модель применяются заново при каждом переиспользовании.",
|
|
4317
|
+
"exec.skipVerification": "Не проверять приёмку для этой задачи",
|
|
4318
|
+
"exec.skipVerificationHint": "По умолчанию выключено: если отмечено, запуск этой задачи в форме цели больше не связывает update_goal с успешной приёмкой, а запись выполнения помечается как пропущенная. Действует только на выполнения, начатые после этого, и ничего не значит, пока общий переключатель приёмки на доске выключен.",
|
|
4319
|
+
"exec.teamRun": "Запустить командой агентов (ведущий и участники)",
|
|
4320
|
+
"exec.teamRunAutoHint": "Как только появляется или привязывается подзадача, родительская задача автоматически включает выполнение командой агентов (это можно выключить в любой момент).",
|
|
4321
|
+
"exec.teamRunHint": "Включено: запуск задачи открывает одну сессию ведущего и порождает в ней участника на каждую подзадачу, работающих параллельно (закреплённое разрешение подзадачи не применяется). Выключено: у каждого участника своя отдельная сессия.",
|
|
4322
|
+
"exec.teamRunUnavailable": "Это развёртывание не предоставляет службу команд агентов, поэтому командные запуски включить нельзя.",
|
|
4323
|
+
"exec.workspace.recent": "Самый недавний (по умолчанию)",
|
|
4324
|
+
"link.subtask.confirm": "Привязать",
|
|
4325
|
+
"link.subtask.empty": "Нет задачи, которую можно привязать",
|
|
4326
|
+
"link.subtask.hint": "Привязать можно только задачу с доски без родителя; после этого она становится подзадачей этой задачи.",
|
|
4327
|
+
"link.subtask.title": "Привязать существующую задачу",
|
|
4328
|
+
"new.agentPreset": "Пресет агента",
|
|
4329
|
+
"new.aiParse": "Разобрать с помощью ИИ",
|
|
4330
|
+
"new.aiParseCancel": "Отменить разбор",
|
|
4331
|
+
"new.aiParseEmpty": "Сначала вставьте текст для разбора",
|
|
4332
|
+
"new.aiParseFailed": "Разбор не удался: {error}",
|
|
4333
|
+
"new.aiParseHint": "Вставьте скопированный откуда-то текст и дайте модели превратить его в название, описание и промпт запуска; результат лишь заполняет форму ниже, так что его можно отредактировать до создания задачи.",
|
|
4334
|
+
"new.aiParseModel": "Модель для разбора",
|
|
4335
|
+
"new.aiParseNoModel": "В этом развёртывании нет доступной модели; настройте провайдера моделей в DSH или выберите другую модель",
|
|
4336
|
+
"new.aiParsePlaceholder": "Вставьте содержимое, из которого нужно сделать задачу…",
|
|
4337
|
+
"new.aiParseRun": "Разобрать и заполнить",
|
|
4338
|
+
"new.aiParseTimeout": "Модель не ответила за {seconds} с; повторите или выберите модель быстрее",
|
|
4339
|
+
"new.aiParseUnavailable": "У хоста нет точки разбора; перезапустите службу DSH и повторите",
|
|
4340
|
+
"new.archiveOriginal": "Заархивировать исходную задачу при создании",
|
|
4341
|
+
"new.cancel": "Отмена",
|
|
4342
|
+
"new.createAndRun": "Создать и запустить",
|
|
4343
|
+
"new.description": "Описание",
|
|
4344
|
+
"new.descriptionPlaceholder": "Контекст, границы, критерии приёмки (необязательно)",
|
|
4345
|
+
"new.duplicateTitle": "Новая задача (копия)",
|
|
4346
|
+
"new.freeze": "Замороженный снимок (необязательно)",
|
|
4347
|
+
"new.freezePlaceholder": "Вставьте блок <<<FREEZE … >>>FREEZE из сессии; он разберётся на цель, прогресс и следующий шаг (необязательно)",
|
|
4348
|
+
"new.handover": "Ссылки для передачи (необязательно)",
|
|
4349
|
+
"new.handoverPlaceholder": "По одной ссылке на документ или скрипт в строке; если заполнено, закреплённый выше набор (рабочая область, режим, разрешение) прикладывается к карточке как пакет передачи",
|
|
4350
|
+
"new.model": "Модель",
|
|
4351
|
+
"new.permission": "Разрешение",
|
|
4352
|
+
"new.prompt": "Промпт запуска",
|
|
4353
|
+
"new.promptPlaceholder": "Полная инструкция для агента (если пусто, берётся название)",
|
|
4354
|
+
"new.required": "Название обязательно",
|
|
4355
|
+
"new.section.content": "Содержание задачи",
|
|
4356
|
+
"new.section.execution": "Настройки выполнения",
|
|
4357
|
+
"new.section.handover": "Передача",
|
|
4358
|
+
"new.section.labels": "Метки",
|
|
4359
|
+
"new.section.parse": "Разбор ИИ",
|
|
4360
|
+
"new.section.run": "Режим запуска",
|
|
4361
|
+
"new.section.schedule": "Запуски по расписанию",
|
|
4362
|
+
"new.submit": "Создать",
|
|
4363
|
+
"new.subtaskInherit": "Незаданные настройки выполнения наследуются от родителя (рабочая область, режим, разрешение, модель); любую из них можно переопределить здесь.",
|
|
4364
|
+
"new.subtaskTitle": "Новая подзадача",
|
|
4365
|
+
"new.summary.filled": "Заполнено",
|
|
4366
|
+
"new.summary.labelCount": "Меток: {count}",
|
|
4367
|
+
"new.summary.multiRound": "многораундовый /goal",
|
|
4368
|
+
"new.summary.none": "Не задано",
|
|
4369
|
+
"new.summary.scheduleOff": "Выкл.",
|
|
4370
|
+
"new.summary.singleRound": "один раунд",
|
|
4371
|
+
"new.tagAdd": "Добавить метку",
|
|
4372
|
+
"new.tagName": "Имя метки",
|
|
4373
|
+
"new.tagNamePlaceholder": "например, Работа",
|
|
4374
|
+
"new.tagPrompt": "Подсказка для запуска (необязательно)",
|
|
4375
|
+
"new.tagPromptPlaceholder": "например, складывать артефакты в 02-work/",
|
|
4376
|
+
"new.tagRemove": "Удалить метку {name}",
|
|
4377
|
+
"new.tags": "Метки (необязательно)",
|
|
4378
|
+
"new.tagsHint": "Метки задают значки на карточках и фильтр доски; строка с подсказкой для запуска вставляется перед промптом при каждом запуске, а пустая служит только отображением.",
|
|
4379
|
+
"new.title": "Название",
|
|
4380
|
+
"new.titlePlaceholder": "Что нужно сделать, одной строкой",
|
|
4381
|
+
"new.workspace": "Рабочая область",
|
|
4382
|
+
"preset.builtin.cordis": "Cordis",
|
|
4383
|
+
"preset.builtin.minimal": "Минимальный",
|
|
4384
|
+
"preset.builtin.ptc": "PTC (программный вызов инструментов)",
|
|
4385
|
+
"preset.builtin.standard": "Стандартный",
|
|
4386
|
+
"run.failed": "Запуск не удался: {error}",
|
|
4387
|
+
"running.executing": "Выполняется",
|
|
4388
|
+
"running.repairing": "Исправляем неудачную приёмку",
|
|
4389
|
+
"running.verificationFailed": "Приёмка не пройдена",
|
|
4390
|
+
"running.verificationInvalid": "Недопустимая приёмка, ждём человека",
|
|
4391
|
+
"running.verificationPassed": "Приёмка пройдена",
|
|
4392
|
+
"running.verifying": "Проверяем",
|
|
4393
|
+
"settings.announceToAgent": "Объявлять доску задач агентам",
|
|
4394
|
+
"settings.announceToAgentHint": "Включено: в системный промпт каждого агента добавляется краткое упоминание этой доски. Выключено: объявления нет, агенты узнают о доске, только когда вы о ней скажете.",
|
|
4395
|
+
"settings.cardDefaultModeHint": "Пустое значение ничего не закрепляет: новая карточка следует умолчанию развёртывания. Значение выбирается так: явный выбор в диалоге новой задачи, затем значение, перенесённое с исходной карточки или родителя, затем это умолчание; подзадача сохраняет то, что уже закрепил родитель.",
|
|
4396
|
+
"settings.cardDefaultModelHint": "Пустое значение — умолчание хоста (agent-default-model). Явный выбор в диалоге главнее значения, перенесённого с исходной карточки или родителя, а то главнее этого умолчания; вызывающий, закрепивший свою модель, не наследует уровень рассуждения по умолчанию.",
|
|
4397
|
+
"settings.cardDefaultPermissionHint": "Пустое значение ничего не задаёт (действует умолчание сессии). Умолчание выше базового разрешения сессии остаётся лишь предзаполнением: карточке всё равно нужно подтверждение человека, прежде чем она сможет запуститься. Подзадача никогда не наследует разрешение родителя; это умолчание заполняется только там, где родитель ничего не закрепил.",
|
|
4398
|
+
"settings.cardDefaultsCardHint": "То, с чем открывается диалог новой задачи: пресет агента, разрешение, модель и уровень рассуждения. Пустое значение ничего не задаёт, поэтому создание карточки ведёт себя как без настройки. Это лишь предзаполнение, оно не меняет существующих смыслов, и каждая новая карточка остаётся редактируемой; уровень рассуждения по умолчанию действует, только пока карточка остаётся на настроенной модели по умолчанию.",
|
|
4399
|
+
"settings.cardDefaultsTitle": "Умолчания новой карточки",
|
|
4400
|
+
"settings.collapse": "Скрыть настройки",
|
|
4401
|
+
"settings.description": "Оркестрация задач, объявление агентам и приёмка цели.",
|
|
4402
|
+
"settings.discard": "Отменить изменения",
|
|
4403
|
+
"settings.enabled": "Включить доску задач",
|
|
4404
|
+
"settings.enabledCardHint": "Общий переключатель, объявление, защита от сна и глубина подзадач.",
|
|
4405
|
+
"settings.enabledHint": "Когда выключено, пункт боковой панели и вид доски скрыты, а инструменты task_board_* у агента не зарегистрированы; пока включено, любая сессия может читать доску, её подзадачи и расписания и управлять ими через эти инструменты.",
|
|
4406
|
+
"settings.expand": "Показать настройки",
|
|
4407
|
+
"settings.goalRunGlobal": "Глобально: запускать задачи через встроенный /goal",
|
|
4408
|
+
"settings.goalRunGlobalDisabledTaskOption": "Глобальный переключатель встроенного /goal выключен: задачный флаг можно отметить или снять, но сейчас он не действует, а сохранённый выбор никогда не перезаписывается; включение глобального переключателя применит его. Это выполнение пройдёт один обычный раунд без приёмки цели.",
|
|
4409
|
+
"settings.goalRunGlobalHint": "По умолчанию выключено. Пока выключено, каждая задача проходит один обычный раунд и никогда не вызывает встроенный /goal в dsh; запуск использует /goal, только если включено И отмечен задачный флаг (см. флаг задачи ниже). Задачный флажок всегда доступен, и этот переключатель его не перезаписывает: общий выключатель решает лишь, действует ли выбор. Состояние фиксируется при старте выполнения, поэтому влияет только на запуски, открытые после этого.",
|
|
4410
|
+
"settings.goalVerification": "Включить приёмку задач",
|
|
4411
|
+
"settings.goalVerificationCardHint": "Переключатель, модель-судья и порог критериев.",
|
|
4412
|
+
"settings.goalVerificationEffort": "Уровень рассуждения",
|
|
4413
|
+
"settings.goalVerificationEffortFallback": "Выбранный уровень рассуждения {requested} не поддерживается целевой моделью; используется {resolved}.",
|
|
4414
|
+
"settings.goalVerificationEffortFallbackNone": "Выбранный уровень рассуждения {requested} не поддерживается целевой моделью; используется уровень по умолчанию этой модели (явно не передаётся).",
|
|
4415
|
+
"settings.goalVerificationEffortHint": "Пустое значение наследует уровень хоста по умолчанию. Уровень, который целевая модель не объявляет, не передаётся вслепую: приёмка откатывается к уровню по умолчанию этой модели, и откат указывается ниже.",
|
|
4416
|
+
"settings.goalVerificationEffortInherit": "Наследовать от хоста ({effort})",
|
|
4417
|
+
"settings.goalVerificationEffortInheritUnknown": "Наследовать от хоста (уровень по умолчанию модели)",
|
|
4418
|
+
"settings.goalVerificationHint": "Включено по умолчанию: задача, выполненная в форме цели, должна пройти приёмку, прежде чем update_goal сможет отметить её выполненной (три критерия качества кода для инженерных задач, порог 0,65, два раунда на критерий с переменой мест A/B, и работа должна обойти базовую линию пустой работы). Первый провал возвращает исправляющему агенту итоговый балл, оценки по критериям и найденные замечания, и одно выполнение может быть принято максимум дважды; второй провал завершает выполнение неудачей. Это влияет только на выполнения доски в форме цели и никогда — на обычный чат или задачу с выключенным флагом запуска через /goal. Каждая приёмка действительно обращается к модели-судье и расходует квоту.",
|
|
4419
|
+
"settings.goalVerificationModel": "Модель-судья",
|
|
4420
|
+
"settings.goalVerificationModelHint": "Пустое значение наследует хост: маршрут по умолчанию каталога моделей хоста, а не модель, закреплённую на карточке.",
|
|
4421
|
+
"settings.goalVerificationModelInherit": "Наследовать от хоста ({model})",
|
|
4422
|
+
"settings.goalVerificationModelInheritUnknown": "Наследовать от хоста (каталога моделей нет)",
|
|
4423
|
+
"settings.goalVerificationModelInvalid": "Настроенная модель-судья не является маршрутом провайдер/модель; вместо неё используется умолчание хоста.",
|
|
4424
|
+
"settings.goalVerificationResolved": "Итоговая конфигурация приёмки",
|
|
4425
|
+
"settings.goalVerificationResolvedEffort": "Уровень рассуждения: {effort}",
|
|
4426
|
+
"settings.goalVerificationResolvedModel": "Модель-судья: {model}",
|
|
4427
|
+
"settings.goalVerificationResolvedNoEffort": "Уровень рассуждения: явно не передаётся (умолчание модели)",
|
|
4428
|
+
"settings.goalVerificationResolvedPreset": "Рубрика: качество кода (следование спецификации / соответствие результату / обнаружение сигналов ошибок), порог {threshold}",
|
|
4429
|
+
"settings.goalVerificationResolvedSource": "Источник: {source}",
|
|
4430
|
+
"settings.goalVerificationRouteMissing": "Хост не предоставляет каталог моделей, поэтому маршрут для судьи не определяется: при включённой приёмке заявление о выполнении цели отклоняется и записывается как аномалия приёмки.",
|
|
4431
|
+
"settings.goalVerificationSourceExplicit": "явная настройка",
|
|
4432
|
+
"settings.goalVerificationSourceInherit": "унаследовано от хоста",
|
|
4433
|
+
"settings.goalVerificationTitle": "Приёмка задач",
|
|
4434
|
+
"settings.inherit": "Наследовать",
|
|
4435
|
+
"settings.invalidNumber": "Введите число или оставьте поле пустым, чтобы использовать значение по умолчанию.",
|
|
4436
|
+
"settings.maxSubtaskDepth": "Предел вложенности подзадач",
|
|
4437
|
+
"settings.maxSubtaskDepthHint": "По умолчанию 1: задача может нести один уровень подзадач, и подзадача не может создавать или привязывать новые подзадачи. Максимум 3. Запуск задачи одновременно запускает всё дерево её подзадач, и каждый дополнительный уровень открывает больше сессий за запуск.",
|
|
4438
|
+
"settings.maxSubtaskDepthOption": "Уровней: {depth}",
|
|
4439
|
+
"settings.notExposed": "Эта версия DSH не показывает странице настроек пространство имён этого плагина, поэтому форма недоступна. Отредактируйте ~/.dsh/settings.yaml напрямую или добавьте пространство имён в список разрешённых в настройках хоста и перезапустите.",
|
|
4440
|
+
"settings.off": "Выкл.",
|
|
4441
|
+
"settings.on": "Вкл.",
|
|
4442
|
+
"settings.overridden": "Переопределено",
|
|
4443
|
+
"settings.powerBoundary": "Это может расходовать больше батареи. Закрытие крышки, ручной сон, гибернация, завершение работы, действия при низком заряде и корпоративные политики вне гарантии; уже спящий компьютер не будится.",
|
|
4444
|
+
"settings.powerError": "Последняя ошибка защиты от сна: {error}",
|
|
4445
|
+
"settings.powerStatus": "Платформа: {platform}; защита: {phase}; работающих сессий: {running}; включённых расписаний: {schedules}",
|
|
4446
|
+
"settings.powerUnknown": "неизвестно",
|
|
4447
|
+
"settings.preventIdleSleep": "Не давать системе засыпать при простое",
|
|
4448
|
+
"settings.preventIdleSleepHint": "По умолчанию выключено. Когда включено, хост не даёт системе заснуть при простое, пока работает какая-либо сессия DSH, включено какое-либо расписание или состояние сессий ещё неизвестно. Экран при этом может гаснуть.",
|
|
4449
|
+
"settings.readOnly": "В этом развёртывании настройки хранятся только для чтения.",
|
|
4450
|
+
"settings.reset": "Сбросить к значению по умолчанию",
|
|
4451
|
+
"settings.runBehaviorCardHint": "Глобальный переключатель встроенного /goal (общее управление, по умолчанию выключен).",
|
|
4452
|
+
"settings.runBehaviorTitle": "Поведение запуска",
|
|
4453
|
+
"settings.runLaunchWidth": "Одновременных запусков",
|
|
4454
|
+
"settings.runLaunchWidthHint": "По умолчанию 3. Запуск открывает всё своё поддерево, но только столько участников одновременно создают сессию и ставят промпт в очередь; остальные ждут своей очереди. Каждый участник всё равно стартует, попадая в колонку «В работе» партиями. Значение по умолчанию взято из измеренных рекомендаций этого репозитория для тяжёлых субагентов-исполнителей (не более трёх). Диапазон от 1 до 16: большее значение запускает раньше и стоит хосту больше памяти и подкачки. Изменённое во время запуска, оно ограничивает ещё не принятые запуски.",
|
|
4455
|
+
"settings.save": "Сохранить",
|
|
4456
|
+
"settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены вам для исправления.",
|
|
4457
|
+
"settings.saving": "Сохранение…",
|
|
4458
|
+
"settings.sessionPollSeconds": "Интервал опроса сессий (секунды)",
|
|
4459
|
+
"settings.sessionPollSecondsHint": "По умолчанию 5. Хост читает список сессий DSH, только пока доске есть что согласовывать: выполняющаяся карточка или открытое выполнение. Если нет ни того, ни другого, опрос прекращается и сохранённый каталог сессий больше не пересканируется. Диапазон от 1 до 300 секунд: меньший интервал завершает запуски раньше и стоит хосту больше.",
|
|
4460
|
+
"settings.title": "Доска задач",
|
|
4461
|
+
"settings.unsaved": "Не сохранено",
|
|
4462
|
+
"status.move.backlog": "Переместить в бэклог",
|
|
4463
|
+
"status.move.done": "Переместить в «Готово»",
|
|
4464
|
+
"status.move.failed": "Переместить в «С ошибкой»",
|
|
4465
|
+
"status.move.running": "Переместить в «В работе»",
|
|
4466
|
+
"status.move.todo": "Переместить в «К выполнению»",
|
|
4467
|
+
"tags.delete": "Удалить",
|
|
4468
|
+
"tags.deleteConfirm": "Убрать метку «{name}» у задач ({count})? Её подсказка для запуска удаляется вместе с ней; сами задачи не затрагиваются.",
|
|
4469
|
+
"tags.deleteFailed": "Удаление не было принято.",
|
|
4470
|
+
"tags.deleteOk": "Удалить",
|
|
4471
|
+
"tags.deleteTitle": "Удаление метки",
|
|
4472
|
+
"tags.done": "Готово",
|
|
4473
|
+
"tags.empty": "Используемых меток нет.",
|
|
4474
|
+
"tags.hint": "Метки питают фильтр доски и значки на карточках. Переименование записывает их во все карточки (сливаясь с уже существующей меткой), а удаление убирает метку у всех задач, включая архивные; сами задачи не затрагиваются.",
|
|
4475
|
+
"tags.mergeHint": "Сливается с существующей меткой «{name}»",
|
|
4476
|
+
"tags.rename": "Переименовать",
|
|
4477
|
+
"tags.renameFailed": "Переименование не было принято.",
|
|
4478
|
+
"tags.renameLabel": "Переименовать метку {name}",
|
|
4479
|
+
"tags.save": "Сохранить",
|
|
4480
|
+
"tags.title": "Управление метками",
|
|
4481
|
+
"tags.usage": "Задач: {count}",
|
|
4482
|
+
"time.justNow": "только что",
|
|
4483
|
+
"verify.applicability.disabled": "На момент старта этого выполнения приёмка была выключена; оно завершается по историческому вердикту.",
|
|
4484
|
+
"verify.applicability.goalDisabled": "На момент старта этого выполнения глобальный переключатель встроенного /goal был выключен, поэтому прошёл один обычный раунд: приёмка цели не выполнялась, и это не считается ни успехом, ни провалом запуска.",
|
|
4485
|
+
"verify.applicability.goalUnavailable": "Это выполнение так и не стало запуском цели (карточка не отметила «Начать с /goal», либо /goal был отклонён или недоступен), поэтому приёмка не применялась.",
|
|
4486
|
+
"verify.applicability.skipped": "Карточка отметила «Не проверять приёмку», поэтому выполнение не оценивалось.",
|
|
4487
|
+
"verify.applicability.teamMember": "Участник команды: сводка ведущего принимается как одно выполнение.",
|
|
4488
|
+
"verify.attempt": "Приёмка {index}",
|
|
4489
|
+
"verify.attemptException": "Аномалия приёмки {index}",
|
|
4490
|
+
"verify.attemptInvalid": "Недопустимая приёмка {index}",
|
|
4491
|
+
"verify.cleanup.audit": "Сохранённое свидетельство: попытка {index} · {stage} · балл {score} · хеш доказательств {hash}",
|
|
4492
|
+
"verify.cleanup.cleaned": "Подробности приёмки этого выполнения удалены автоматически после успешного завершения; остаётся лёгкое аудиторское свидетельство.",
|
|
4493
|
+
"verify.cleanup.failed": "Очистка подробностей приёмки не удалась после {attempts} попыток: {error}. Запись об успехе остаётся действительной, и хост повторит очистку при следующем запуске.",
|
|
4494
|
+
"verify.cleanup.pending": "Подробности приёмки ждут очистки (она начнётся, когда выполнение успешно завершится).",
|
|
4495
|
+
"verify.cleanup.stage.budget": "исчерпан бюджет времени",
|
|
4496
|
+
"verify.cleanup.stage.exception": "аномалия приёмки",
|
|
4497
|
+
"verify.cleanup.stage.invalid": "недопустимая приёмка",
|
|
4498
|
+
"verify.cleanup.stage.quality": "вердикт качества",
|
|
4499
|
+
"verify.counts": "Вердиктов качества {quality} из {max} · аномалий {exceptions} из {max}",
|
|
4500
|
+
"verify.criteria": "Оценки по критериям",
|
|
4501
|
+
"verify.criterion": "{name}: {score} (порог {threshold})",
|
|
4502
|
+
"verify.criterionFinding": "{criterion} · {location}: «{quote}»",
|
|
4503
|
+
"verify.criterionFindingFull": "{criterion} · {location}: «{quote}» требование: {requirement} наблюдение: {observation} расхождение: {gap}",
|
|
4504
|
+
"verify.criterionFindings": "Структурированные замечания (критерий · указанное место · дословная цитата)",
|
|
4505
|
+
"verify.detailRemoved": "Подробности этой попытки удалены автоматически после успешного завершения выполнения (судья действительно предъявил доказательства).",
|
|
4506
|
+
"verify.effortFallback": "Откат уровня рассуждения: {requested} → {resolved}",
|
|
4507
|
+
"verify.evidence": "Доказательства: символов {chars} · записей трассировки {entries} · усечено символов {omitted}",
|
|
4508
|
+
"verify.finalFailure": "Основание вердикта: {reason}",
|
|
4509
|
+
"verify.findings": "Замечания",
|
|
4510
|
+
"verify.invalidCounts": "Допустимых вердиктов качества {quality} из {max} · недопустимых приёмок {invalid} из {maxInvalid} · аномалий {exceptions} из {max}",
|
|
4511
|
+
"verify.invalidDetail": "Недопустима, потому что: {reason}",
|
|
4512
|
+
"verify.invalidReason.baseline-finding": "Замечание указывает на базовую линию пустой работы, а не на работу этого выполнения",
|
|
4513
|
+
"verify.invalidReason.insufficient-evidence": "Судья увидел слишком мало доказательств (например, усечённую трассировку), чтобы обосновать вето",
|
|
4514
|
+
"verify.invalidReason.missing-finding": "Проваленный критерий не несёт собственного структурированного замечания",
|
|
4515
|
+
"verify.invalidReason.unknown": "Пригодный вердикт качества не был получен",
|
|
4516
|
+
"verify.invalidReason.unlocatable-quote": "Замечание цитирует фрагмент, которого нет в доказательствах, виденных судьёй",
|
|
4517
|
+
"verify.invalidReason.vacuous-finding": "Замечание пустое или является общей оценкой без наблюдения и расхождения",
|
|
4518
|
+
"verify.judge": "Судья {model} (уровень рассуждения {effort})",
|
|
4519
|
+
"verify.judgeInherited": "Судья {model} (унаследован от хоста)",
|
|
4520
|
+
"verify.judgeNoEffort": "Судья {model} (уровень рассуждения явно не передаётся)",
|
|
4521
|
+
"verify.location.baseline": "базовая линия пустой работы (не доказательство против работы)",
|
|
4522
|
+
"verify.location.task": "постановка задачи",
|
|
4523
|
+
"verify.location.trajectory": "траектория выполнения",
|
|
4524
|
+
"verify.location.unknown": "место не указано",
|
|
4525
|
+
"verify.location.workspace": "изменения, записанные хостом",
|
|
4526
|
+
"verify.noFindings": "Судья не предъявил ни одного замечания с указанным местом",
|
|
4527
|
+
"verify.rounds": "Раундов на критерий: {rounds}, места A/B меняются, результат усредняется",
|
|
4528
|
+
"verify.status.exception": "Аномалия",
|
|
4529
|
+
"verify.status.failed": "Не пройдена",
|
|
4530
|
+
"verify.status.invalid": "Недопустимая приёмка",
|
|
4531
|
+
"verify.status.invalidHeld": "Недопустимая приёмка, ждём человека",
|
|
4532
|
+
"verify.status.off": "Приёмка была выключена для этого выполнения",
|
|
4533
|
+
"verify.status.passed": "Пройдена",
|
|
4534
|
+
"verify.status.pending": "Ещё не проверено",
|
|
4535
|
+
"verify.status.verifying": "Проверяем",
|
|
4536
|
+
"verify.summary": "Итог {score} (порог {threshold}) · базовая линия пустой работы {baseline}",
|
|
4537
|
+
"verify.thresholdValue": "{value} %",
|
|
4538
|
+
"verify.title": "Отчёт о приёмке",
|
|
4539
|
+
"verify.usage": "Расход: запросов {calls} · на входе {input} · на выходе {output} · токенов рассуждения {reasoning}",
|
|
4540
|
+
"verify.usageIncomplete": " (расход хотя бы одного запроса неизвестен; эти значения — нижняя граница)",
|
|
4541
|
+
"verify.workspaceEvidence": "Изменённых файлов, замеченных хостом: {files}"
|
|
4542
|
+
},
|
|
4543
|
+
"task-board-github": {
|
|
4544
|
+
"card.openIssue": "Открыть {reference} на GitHub",
|
|
4545
|
+
"common.cancel": "Отмена",
|
|
4546
|
+
"detail.baseBranch": "Целевая базовая ветка",
|
|
4547
|
+
"detail.createPr": "Создать PR",
|
|
4548
|
+
"detail.createPrTitle": "Создать пул-реквест",
|
|
4549
|
+
"detail.deactivated": "Метка включения снята на GitHub; элемент отключён на доске.",
|
|
4550
|
+
"detail.headBranch": "Удалённая ветка-источник",
|
|
4551
|
+
"detail.headBranchPlaceholder": "например, feature-branch",
|
|
4552
|
+
"detail.linkPr": "Привязать PR",
|
|
4553
|
+
"detail.linkPrTitle": "Привязать существующий пул-реквест",
|
|
4554
|
+
"detail.pr": "Пул-реквест",
|
|
4555
|
+
"detail.prDraft": "Черновик",
|
|
4556
|
+
"detail.prNumber": "PR №{number}",
|
|
4557
|
+
"detail.prNumberInput": "Номер PR",
|
|
4558
|
+
"detail.prState.closed": "Закрыт",
|
|
4559
|
+
"detail.prState.merged": "Слит",
|
|
4560
|
+
"detail.prState.open": "Открыт",
|
|
4561
|
+
"detail.refresh": "Синхронизировать задачу",
|
|
4562
|
+
"detail.refreshing": "Синхронизируем…",
|
|
4563
|
+
"detail.state.closed": "Закрыта",
|
|
4564
|
+
"detail.state.open": "Открыта",
|
|
4565
|
+
"detail.syncError": "Ошибка синхронизации: {error}",
|
|
4566
|
+
"detail.syncedAt": "Синхронизировано {time}",
|
|
4567
|
+
"detail.title": "Задача GitHub",
|
|
4568
|
+
"prompt.acceptance": "Критерии завершения",
|
|
4569
|
+
"prompt.analysisError": "Анализ ИИ не удался: {error}",
|
|
4570
|
+
"prompt.analysisFresh": "Анализ ИИ, написанный моделью {model} в {time}, входит в промпт выполнения.",
|
|
4571
|
+
"prompt.analysisNone": "Анализа ИИ пока нет.",
|
|
4572
|
+
"prompt.analysisPending": "Готовим анализ ИИ…",
|
|
4573
|
+
"prompt.analysisStale": "Задача изменилась после анализа ИИ: старый анализ не включён в промпт выполнения. Сгенерируйте его заново, чтобы обновить.",
|
|
4574
|
+
"prompt.clear": "Удалить анализ ИИ",
|
|
4575
|
+
"prompt.edited": "Промпт выполнения отредактирован вручную: синхронизация больше его не перезаписывает, а для повторной генерации нужно подтверждение.",
|
|
4576
|
+
"prompt.frozen": "Карточка начала выполняться, поэтому её промпт выполнения заморожен.",
|
|
4577
|
+
"prompt.generate": "Сгенерировать анализ ИИ",
|
|
4578
|
+
"prompt.goal": "Цель",
|
|
4579
|
+
"prompt.modelLabel": "Модель для анализа",
|
|
4580
|
+
"prompt.modelPlaceholder": "провайдер/модель; пусто — настройка репозитория, модель карточки или умолчание хоста",
|
|
4581
|
+
"prompt.moveBacklog": "Переместить в бэклог",
|
|
4582
|
+
"prompt.noCodeChange": "Модель решила, что эта задача не требует изменений кода (уведомление или обсуждение). Рассмотрите перенос в бэклог, чтобы запуск не выдумывал изменения ради завершения цели.",
|
|
4583
|
+
"prompt.notes": "Заметки",
|
|
4584
|
+
"prompt.overwrite": "Перезаписать и сгенерировать заново",
|
|
4585
|
+
"prompt.regenerate": "Сгенерировать заново",
|
|
4586
|
+
"prompt.steps": "Предлагаемые шаги",
|
|
4587
|
+
"prompt.templateHint": "Промпт выполнения генерируется из шаблона: заголовок задачи, рабочий процесс и правила обратной записи фиксированы, а тело задачи добавляется дословно внутри блока происхождения. Анализ ИИ — необязательный раздел, который добавляет только цель, шаги и критерии завершения.",
|
|
4588
|
+
"prompt.title": "Промпт выполнения",
|
|
4589
|
+
"settings.announce": "Объявлять это расширение агентам",
|
|
4590
|
+
"settings.announceHint": "Включено: в системный промпт каждого агента добавляется заметка об этом расширении и его словах-триггерах. Выключено: агенты узнают о нём, только когда вы его упомянете. По умолчанию выключено, чтобы промпты оставались чистыми.",
|
|
4591
|
+
"settings.collapse": "Скрыть настройки",
|
|
4592
|
+
"settings.description": "Синхронизирует задачи GitHub в карточки доски и записывает смену колонок обратно в метки задачи.",
|
|
4593
|
+
"settings.discard": "Отменить изменения",
|
|
4594
|
+
"settings.enabled": "Включить синхронизацию задач GitHub",
|
|
4595
|
+
"settings.enabledHint": "Когда выключено, расширение ничего не регистрирует на доске: опрос прекращается, обратная запись останавливается, инструменты агента снимаются с регистрации, состояние синхронизации очищается, а его раздел в деталях и оформление карточек исчезают. Эта карточка настроек остаётся доступной и сообщает, что расширение не работает, поэтому переключатель можно вернуть. Доска и уже синхронизированные карточки не затрагиваются.",
|
|
4596
|
+
"settings.expand": "Показать настройки",
|
|
4597
|
+
"settings.inherit": "Наследовать (значение развёртывания)",
|
|
4598
|
+
"settings.integrationOff": "Расширение сейчас выключено: настройка репозитория и учётных данных не загружена, а его блоки исчезли с карточек доски и из деталей задачи. Включите переключатель выше, чтобы настроить интеграцию.",
|
|
4599
|
+
"settings.invalidValue": "Значение не принимается",
|
|
4600
|
+
"settings.notExposed": "Эта версия DSH не показывает странице настроек пространство имён этого плагина, поэтому форма недоступна. Отредактируйте ~/.dsh/settings.yaml напрямую или добавьте пространство имён в список разрешённых в настройках хоста и перезапустите.",
|
|
4601
|
+
"settings.off": "Выкл.",
|
|
4602
|
+
"settings.on": "Вкл.",
|
|
4603
|
+
"settings.overridden": "Переопределено",
|
|
4604
|
+
"settings.readOnly": "Это развёртывание отдаёт настройки только для чтения.",
|
|
4605
|
+
"settings.reset": "Сбросить",
|
|
4606
|
+
"settings.save": "Сохранить",
|
|
4607
|
+
"settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены вам для исправления.",
|
|
4608
|
+
"settings.saving": "Сохранение…",
|
|
4609
|
+
"settings.title": "Синхронизация задач GitHub",
|
|
4610
|
+
"settings.unsaved": "Не сохранено",
|
|
4611
|
+
"setup.apiUnavailable": "API конфигурации хоста недоступен: {error}",
|
|
4612
|
+
"setup.assignee": "Исполнитель включения",
|
|
4613
|
+
"setup.assigneeChip": "назначено {login}",
|
|
4614
|
+
"setup.assigneePlaceholder": "@me или логин",
|
|
4615
|
+
"setup.credentialConfigured": "Учётные данные хоста: настроены ({name}, источник {source})",
|
|
4616
|
+
"setup.credentialMissing": "Учётные данные хоста: не настроены (вставьте токен GitHub ниже; он сохранится в локальном хранилище учётных данных как {name})",
|
|
4617
|
+
"setup.credentialSourceUnknown": "неизвестно",
|
|
4618
|
+
"setup.healthErrors": "Последняя синхронизация сообщила об ошибках: {count}; смотрите журнал хоста (dsh-task-board-github).",
|
|
4619
|
+
"setup.healthNever": "Фоновая синхронизация: с момента запуска этого хоста ни одна синхронизация не завершилась успешно.",
|
|
4620
|
+
"setup.healthOk": "Фоновая синхронизация: последнее обращение к GitHub было {at}.",
|
|
4621
|
+
"setup.healthStale": "Фоновая синхронизация: успешных синхронизаций нет {minutes} мин (настройка выглядит верной, но синхронизация остановилась).",
|
|
4622
|
+
"setup.inclusionLabel": "Метка включения",
|
|
4623
|
+
"setup.inclusionLabelPlaceholder": "Метка (по умолчанию dsh)",
|
|
4624
|
+
"setup.repositoriesCollapse": "Свернуть список репозиториев",
|
|
4625
|
+
"setup.repositoriesCount": "Настроено репозиториев: {count}",
|
|
4626
|
+
"setup.repositoriesEmpty": "Пока ни один репозиторий не синхронизируется.",
|
|
4627
|
+
"setup.repositoriesExpand": "Развернуть список репозиториев",
|
|
4628
|
+
"setup.repositoriesHint": "Карточками доски становятся задачи с меткой включения, назначенные настроенному логину (@me — это учётная запись хоста), либо — для репозитория, принимающего неназначенные задачи, — не назначенные никому. Изменения здесь применяются сразу, без перезапуска. Тонкие настройки (соответствие меток состояниям, правила черновиков PR, интервал опроса, …) по-прежнему задаются в патче профиля.",
|
|
4629
|
+
"setup.repositoryAdd": "Добавить",
|
|
4630
|
+
"setup.repositoryLabel": "Репозиторий",
|
|
4631
|
+
"setup.repositoryPlaceholder": "owner/repo или вставьте ссылку на GitHub",
|
|
4632
|
+
"setup.repositoryRemove": "Убрать",
|
|
4633
|
+
"setup.test": "Проверить подключение",
|
|
4634
|
+
"setup.testFailed": "Проверка не удалась: {error}",
|
|
4635
|
+
"setup.testLogin": "Авторизовано как {login}",
|
|
4636
|
+
"setup.testNoCredential": "Учётных данных нет, поэтому GitHub не авторизован; сначала сохраните токен.",
|
|
4637
|
+
"setup.testing": "Проверяем…",
|
|
4638
|
+
"setup.tokenClear": "Очистить учётные данные",
|
|
4639
|
+
"setup.tokenEmpty": "Сначала вставьте токен",
|
|
4640
|
+
"setup.tokenHint": "Токен один раз отправляется локальному хосту и сохраняется в хранилище учётных данных DSH (в то же, куда страница моделей пишет ключи API); браузер его больше никогда не читает. Достаточно гранулированного токена с доступом только к репозиториям.",
|
|
4641
|
+
"setup.tokenLabel": "Токен GitHub",
|
|
4642
|
+
"setup.tokenPlaceholder": "Вставьте токен GitHub (ghp_… или github_pat_…)",
|
|
4643
|
+
"setup.tokenSave": "Сохранить учётные данные",
|
|
4644
|
+
"setup.tokenSaved": "Сохранено. Следующая синхронизация сразу использует новые учётные данные.",
|
|
4645
|
+
"setup.tokenSaving": "Сохранение…",
|
|
4646
|
+
"setup.unassignedChip": "включает неназначенные",
|
|
4647
|
+
"setup.unassignedOff": "Брать неназначенные",
|
|
4648
|
+
"setup.unassignedOn": "Берём неназначенные",
|
|
4649
|
+
"summary.autoPr": "авто-PR",
|
|
4650
|
+
"summary.credentialMissing": "Учётные данные хоста: не обнаружены (задайте переменную окружения GITHUB_TOKEN или укажите другую в параметре имени переменной)",
|
|
4651
|
+
"summary.credentialReady": "Учётные данные хоста: действительны",
|
|
4652
|
+
"summary.label": "метка",
|
|
4653
|
+
"summary.noRepositories": "Репозитории GitHub не настроены (объявите их в строке этого расширения в патче профиля)",
|
|
4654
|
+
"summary.notRunning": "Расширение не работает: состояние синхронизации появится, когда переключатель будет включён.",
|
|
4655
|
+
"summary.repositories": "Настроенные репозитории ({count})",
|
|
4656
|
+
"summary.title": "Интеграция с GitHub"
|
|
2822
4657
|
}
|
|
2823
4658
|
};
|
|
2824
4659
|
//#endregion
|
|
4660
|
+
//#region src/client/plural.ts
|
|
4661
|
+
/**
|
|
4662
|
+
* CLDR plural category to dictionary suffix. `other` covers fractions
|
|
4663
|
+
* («1,5 субагента») and keeps the caller's key instead of inventing a form.
|
|
4664
|
+
*/
|
|
4665
|
+
const SUFFIX_BY_CATEGORY = {
|
|
4666
|
+
one: "one",
|
|
4667
|
+
few: "few",
|
|
4668
|
+
many: "many",
|
|
4669
|
+
other: void 0
|
|
4670
|
+
};
|
|
4671
|
+
/** Count-driven dictionary keys end in `.one` / `.other`; the category replaces that suffix. */
|
|
4672
|
+
const PLURAL_KEY = /^(.*)\.(?:one|other)$/u;
|
|
4673
|
+
/** Prototype to installation, so activation is reference counted rather than stacked. */
|
|
4674
|
+
const installations = /* @__PURE__ */ new WeakMap();
|
|
4675
|
+
/** `Intl.PluralRules` for Russian, or undefined where the runtime lacks it. */
|
|
4676
|
+
function pluralRules() {
|
|
4677
|
+
return typeof Intl === "undefined" || typeof Intl.PluralRules !== "function" ? void 0 : new Intl.PluralRules("ru");
|
|
4678
|
+
}
|
|
4679
|
+
/**
|
|
4680
|
+
* Numeric count carried by a translate call, from the harness convention
|
|
4681
|
+
* (`count`) or the workspace and archive keys (`n`).
|
|
4682
|
+
*
|
|
4683
|
+
* @param params - interpolation parameters of the call.
|
|
4684
|
+
* @returns the count, or undefined when the call carries none.
|
|
4685
|
+
*/
|
|
4686
|
+
function countOf(params) {
|
|
4687
|
+
if (params === void 0) return void 0;
|
|
4688
|
+
const raw = params.count ?? params.n;
|
|
4689
|
+
if (typeof raw === "number") return Number.isFinite(raw) ? raw : void 0;
|
|
4690
|
+
if (typeof raw === "string" && raw.trim() !== "") {
|
|
4691
|
+
const parsed = Number(raw);
|
|
4692
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
4693
|
+
}
|
|
4694
|
+
for (const value of Object.values(params)) if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
4695
|
+
}
|
|
4696
|
+
/**
|
|
4697
|
+
* Active locale id as the runtime publishes it.
|
|
4698
|
+
*
|
|
4699
|
+
* @param receiver - the runtime instance a translate call runs on.
|
|
4700
|
+
* @returns the active locale, or undefined on a runtime that does not expose it.
|
|
4701
|
+
*/
|
|
4702
|
+
function activeLocale(receiver) {
|
|
4703
|
+
return (receiver.getLocale?.())?.active;
|
|
4704
|
+
}
|
|
4705
|
+
/**
|
|
4706
|
+
* Translate one key, substituting the Russian form its count calls for.
|
|
4707
|
+
*
|
|
4708
|
+
* @param original - the runtime's own `translate`.
|
|
4709
|
+
* @param rules - Russian plural rules.
|
|
4710
|
+
* @param receiver - the runtime instance.
|
|
4711
|
+
* @param ns - locale namespace.
|
|
4712
|
+
* @param key - dictionary key.
|
|
4713
|
+
* @param params - interpolation parameters.
|
|
4714
|
+
* @returns the translated string.
|
|
4715
|
+
*/
|
|
4716
|
+
function translateWithPlurals(original, rules, receiver, ns, key, params) {
|
|
4717
|
+
if (activeLocale(receiver) === "ru") {
|
|
4718
|
+
const count = countOf(params);
|
|
4719
|
+
if (count !== void 0) {
|
|
4720
|
+
const suffix = SUFFIX_BY_CATEGORY[rules.select(count)];
|
|
4721
|
+
if (suffix !== void 0) {
|
|
4722
|
+
const paired = PLURAL_KEY.exec(key);
|
|
4723
|
+
const candidate = paired !== null ? `${paired[1]}.${suffix}` : `${key}.${suffix}`;
|
|
4724
|
+
if (candidate !== key && original.call(receiver, ns, candidate, void 0) !== candidate) return original.call(receiver, ns, candidate, params);
|
|
4725
|
+
}
|
|
4726
|
+
}
|
|
4727
|
+
}
|
|
4728
|
+
return original.call(receiver, ns, key, params);
|
|
4729
|
+
}
|
|
4730
|
+
/** Drop one holder and restore the method when the last one disposes. */
|
|
4731
|
+
function release(prototype, installation) {
|
|
4732
|
+
installation.holders -= 1;
|
|
4733
|
+
if (installation.holders > 0) return;
|
|
4734
|
+
installations.delete(prototype);
|
|
4735
|
+
const holder = prototype;
|
|
4736
|
+
if (holder.translate === installation.patched) holder.translate = installation.original;
|
|
4737
|
+
}
|
|
4738
|
+
/**
|
|
4739
|
+
* Start substituting Russian plural forms for count-driven strings.
|
|
4740
|
+
*
|
|
4741
|
+
* @param locale - the injected locale service instance.
|
|
4742
|
+
* @returns disposer restoring the runtime's own method.
|
|
4743
|
+
*/
|
|
4744
|
+
function startRussianPlurals(locale) {
|
|
4745
|
+
const prototype = Object.getPrototypeOf(locale);
|
|
4746
|
+
if (prototype === null) return () => {};
|
|
4747
|
+
const existing = installations.get(prototype);
|
|
4748
|
+
if (existing !== void 0) {
|
|
4749
|
+
existing.holders += 1;
|
|
4750
|
+
return () => release(prototype, existing);
|
|
4751
|
+
}
|
|
4752
|
+
const holder = prototype;
|
|
4753
|
+
const original = holder.translate;
|
|
4754
|
+
if (typeof original !== "function") return () => {};
|
|
4755
|
+
const rules = pluralRules();
|
|
4756
|
+
if (rules === void 0) return () => {};
|
|
4757
|
+
const own = original;
|
|
4758
|
+
const patched = function(ns, key, params) {
|
|
4759
|
+
return translateWithPlurals(own, rules, this, ns, key, params);
|
|
4760
|
+
};
|
|
4761
|
+
const installation = {
|
|
4762
|
+
original: own,
|
|
4763
|
+
patched,
|
|
4764
|
+
holders: 1
|
|
4765
|
+
};
|
|
4766
|
+
installations.set(prototype, installation);
|
|
4767
|
+
holder.translate = patched;
|
|
4768
|
+
return () => release(prototype, installation);
|
|
4769
|
+
}
|
|
4770
|
+
//#endregion
|
|
2825
4771
|
//#region src/client/typography.ts
|
|
2826
4772
|
/**
|
|
2827
4773
|
* Russian screen typography for translated strings.
|
|
@@ -2833,6 +4779,9 @@ window.__ModuleLoader__.load({
|
|
|
2833
4779
|
* rewrites text nodes in place. The rules are deliberately conservative: they
|
|
2834
4780
|
* only fire on unambiguous straight-quote and spaced-hyphen patterns, and the
|
|
2835
4781
|
* DOM pass skips code, form fields and editable content.
|
|
4782
|
+
*
|
|
4783
|
+
* Text that changes after the first pass — counters, timers, progress — is
|
|
4784
|
+
* rewritten again, so a live «4 с» keeps its non-breaking space.
|
|
2836
4785
|
*/
|
|
2837
4786
|
/** Straight double quotes around a span become Russian guillemets. */
|
|
2838
4787
|
const QUOTED = /"([^"\n]{1,200})"/g;
|
|
@@ -2844,9 +4793,20 @@ window.__ModuleLoader__.load({
|
|
|
2844
4793
|
const NUMBER_UNIT = /(\d) ([а-яё]{1,24})(?![а-яё])/giu;
|
|
2845
4794
|
/** Non-breaking space keeps a number attached to a short unit-like token. */
|
|
2846
4795
|
const NUMBER_SYMBOL = /(\d) ([%°₽$€£]|кб|КБ|МБ|ГБ)(?=\s|$)/giu;
|
|
4796
|
+
/**
|
|
4797
|
+
* A short word — a preposition, a conjunction or a particle — keeps the word
|
|
4798
|
+
* that follows it, so a line break cannot leave it alone at the end of a line.
|
|
4799
|
+
* Russian typography forbids a one-letter word there and discourages a
|
|
4800
|
+
* two-letter one, and the list holds only the words that never carry stress.
|
|
4801
|
+
*
|
|
4802
|
+
* A numeric range rule would be the obvious neighbour — Russian writes ranges
|
|
4803
|
+
* with an en dash — but the pack's only digit-hyphen-digit string is the cron
|
|
4804
|
+
* example `0 9 * * 1-5`, which an en dash would corrupt. Measured, and left out.
|
|
4805
|
+
*/
|
|
4806
|
+
const SHORT_WORD = /(?<=^|[\s(«"—])((?:в|во|на|за|к|ко|с|со|о|об|от|до|по|из|у|и|а|но|да|не|ни|же|ли|бы|то)) (?=[«"(]?[а-яё])/giu;
|
|
2847
4807
|
/** Guillemets, em dash, ellipsis, and non-breaking spaces in running text. */
|
|
2848
4808
|
function applyRussianTypography(text) {
|
|
2849
|
-
return text.replace(QUOTED, "«$1»").replace(SPACED_HYPHEN, " — ").replace(ELLIPSIS, "…").replace(NUMBER_UNIT, "$1\xA0$2").replace(NUMBER_SYMBOL, "$1\xA0$2");
|
|
4809
|
+
return text.replace(QUOTED, "«$1»").replace(SPACED_HYPHEN, " — ").replace(ELLIPSIS, "…").replace(NUMBER_UNIT, "$1\xA0$2").replace(NUMBER_SYMBOL, "$1\xA0$2").replace(SHORT_WORD, "$1\xA0");
|
|
2850
4810
|
}
|
|
2851
4811
|
/** Elements whose text is code, data or user input and must stay verbatim. */
|
|
2852
4812
|
const SKIP_SELECTOR = [
|
|
@@ -2862,40 +4822,46 @@ window.__ModuleLoader__.load({
|
|
|
2862
4822
|
"[contenteditable]:not([contenteditable=\"false\"])",
|
|
2863
4823
|
"[data-typography=\"off\"]"
|
|
2864
4824
|
].join(",");
|
|
2865
|
-
/** Text nodes already rewritten, so a later pass leaves them alone. */
|
|
2866
|
-
const processed = /* @__PURE__ */ new WeakSet();
|
|
2867
4825
|
/** Whether the node sits inside content that must not be rewritten. */
|
|
2868
4826
|
function isSkipped(node) {
|
|
2869
4827
|
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
2870
4828
|
return element === null || element.closest(SKIP_SELECTOR) !== null;
|
|
2871
4829
|
}
|
|
2872
|
-
function rewriteNode(node) {
|
|
2873
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
2874
|
-
if (processed.has(node)) return;
|
|
2875
|
-
processed.add(node);
|
|
2876
|
-
const before = node.data;
|
|
2877
|
-
const after = applyRussianTypography(before);
|
|
2878
|
-
if (after !== before) node.data = after;
|
|
2879
|
-
return;
|
|
2880
|
-
}
|
|
2881
|
-
if (node.nodeType !== Node.ELEMENT_NODE || isSkipped(node)) return;
|
|
2882
|
-
for (const child of node.childNodes) rewriteNode(child);
|
|
2883
|
-
}
|
|
2884
4830
|
/**
|
|
2885
4831
|
* Start the typography pass on a document and keep it current as the app
|
|
2886
4832
|
* renders. Returns a disposer that stops observing.
|
|
2887
4833
|
*
|
|
2888
4834
|
* @param doc - document whose body carries the rendered interface.
|
|
4835
|
+
* @param isActive - whether the pass may run; the rules are Russian, so a pack
|
|
4836
|
+
* installed while another language is active must not rewrite that language's
|
|
4837
|
+
* punctuation. Checked before every rewrite, so a language switch takes effect
|
|
4838
|
+
* on the next render.
|
|
2889
4839
|
* @returns disposer removing the observer.
|
|
2890
4840
|
*/
|
|
2891
|
-
function startRussianTypography(doc) {
|
|
4841
|
+
function startRussianTypography(doc, isActive = () => true) {
|
|
2892
4842
|
const root = doc.body;
|
|
2893
4843
|
if (root === null) return () => {};
|
|
4844
|
+
/** Text nodes already rewritten, so a batch of mutations does not re-walk them. */
|
|
4845
|
+
const processed = /* @__PURE__ */ new WeakSet();
|
|
4846
|
+
function rewriteNode(node) {
|
|
4847
|
+
if (!isActive()) return;
|
|
4848
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
4849
|
+
if (processed.has(node)) return;
|
|
4850
|
+
processed.add(node);
|
|
4851
|
+
const before = node.data;
|
|
4852
|
+
const after = applyRussianTypography(before);
|
|
4853
|
+
if (after !== before) node.data = after;
|
|
4854
|
+
return;
|
|
4855
|
+
}
|
|
4856
|
+
if (node.nodeType !== Node.ELEMENT_NODE || isSkipped(node)) return;
|
|
4857
|
+
for (const child of node.childNodes) rewriteNode(child);
|
|
4858
|
+
}
|
|
2894
4859
|
rewriteNode(root);
|
|
2895
4860
|
const observer = new MutationObserver((records) => {
|
|
2896
4861
|
for (const record of records) {
|
|
2897
4862
|
if (record.type === "characterData") {
|
|
2898
4863
|
if (isSkipped(record.target)) continue;
|
|
4864
|
+
processed.delete(record.target);
|
|
2899
4865
|
rewriteNode(record.target);
|
|
2900
4866
|
continue;
|
|
2901
4867
|
}
|
|
@@ -2911,24 +4877,52 @@ window.__ModuleLoader__.load({
|
|
|
2911
4877
|
}
|
|
2912
4878
|
//#endregion
|
|
2913
4879
|
//#region src/client/index.ts
|
|
4880
|
+
/** Skip only occupied slots; validation and unexpected service errors still fail. */
|
|
4881
|
+
function skipDuplicate(register, duplicateMessage) {
|
|
4882
|
+
try {
|
|
4883
|
+
return register();
|
|
4884
|
+
} catch (error) {
|
|
4885
|
+
if (!(error instanceof Error) || error.message !== duplicateMessage) throw error;
|
|
4886
|
+
return () => {};
|
|
4887
|
+
}
|
|
4888
|
+
}
|
|
2914
4889
|
/** Required service: the locale registry that owns languages and dictionaries. */
|
|
2915
4890
|
const inject = ["locale"];
|
|
2916
4891
|
/**
|
|
2917
4892
|
* Client plugin body: add `ru` to the selectable language catalog, register
|
|
2918
4893
|
* a ru dictionary for every namespace this pack contributes, and start the
|
|
2919
|
-
* Russian typography
|
|
2920
|
-
* language, dictionaries
|
|
2921
|
-
* plugin's fiber.
|
|
4894
|
+
* Russian plural and typography passes. Registration is an effect, so the
|
|
4895
|
+
* contributed language, dictionaries, the plural wrapper and the typography
|
|
4896
|
+
* observer are torn down with this plugin's fiber. Existing languages and
|
|
4897
|
+
* dictionaries belong to their first registrant: skip duplicates without
|
|
4898
|
+
* replacing or disposing those resources. The typography pass runs only while
|
|
4899
|
+
* Russian is the active language, and follows a switch through `locale/change`.
|
|
2922
4900
|
* @param ctx - client root context.
|
|
2923
4901
|
*/
|
|
2924
4902
|
function apply(ctx) {
|
|
2925
|
-
ctx.effect(() => ctx.locale.addLanguage({
|
|
4903
|
+
ctx.effect(() => skipDuplicate(() => ctx.locale.addLanguage({
|
|
2926
4904
|
id: "ru",
|
|
2927
4905
|
label: RU_LABEL,
|
|
2928
4906
|
fallback: "en"
|
|
2929
|
-
}), "locale-ru: language");
|
|
2930
|
-
for (const [ns, dict] of Object.entries(RU_DICTS)) ctx.effect(() => ctx.locale.register(ns, "ru", dict), `locale-ru: ${ns} dictionary`);
|
|
2931
|
-
ctx.effect(() =>
|
|
4907
|
+
}), "locale \"ru\" is already registered"), "locale-ru: language");
|
|
4908
|
+
for (const [ns, dict] of Object.entries(RU_DICTS)) ctx.effect(() => skipDuplicate(() => ctx.locale.register(ns, "ru", dict), `locale namespace "${ns}" already has locale "ru"`), `locale-ru: ${ns} dictionary`);
|
|
4909
|
+
ctx.effect(() => startRussianPlurals(ctx.locale), "locale-ru: plurals");
|
|
4910
|
+
ctx.effect(() => {
|
|
4911
|
+
const isRussian = () => ctx.locale.getLocale().active === "ru";
|
|
4912
|
+
let stop = isRussian() ? startRussianTypography(document, isRussian) : null;
|
|
4913
|
+
const off = ctx.on("locale/change", () => {
|
|
4914
|
+
if (isRussian() && stop === null) stop = startRussianTypography(document, isRussian);
|
|
4915
|
+
else if (!isRussian() && stop !== null) {
|
|
4916
|
+
stop();
|
|
4917
|
+
stop = null;
|
|
4918
|
+
}
|
|
4919
|
+
});
|
|
4920
|
+
return () => {
|
|
4921
|
+
off();
|
|
4922
|
+
stop?.();
|
|
4923
|
+
stop = null;
|
|
4924
|
+
};
|
|
4925
|
+
}, "locale-ru: typography");
|
|
2932
4926
|
}
|
|
2933
4927
|
//#endregion
|
|
2934
4928
|
exports.apply = apply;
|