@goodandready/dsh-russian-lang 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -1913,114 +1913,115 @@ window.__ModuleLoader__.load({
1913
1913
  "webdavUser": "Имя пользователя (необязательно)"
1914
1914
  },
1915
1915
  "dsh-skill-hub": {
1916
- "badge.source.bundled": "в комплекте",
1917
- "badge.source.custom": "Пользовательский",
1918
- "badge.source.project-agents": "проект .агенты",
1916
+ "badge.source.bundled": "встроенный",
1917
+ "badge.source.custom": "свой каталог",
1918
+ "badge.source.project-agents": "проект .agents",
1919
1919
  "badge.source.project-dsh": "проект .dsh",
1920
- "badge.source.runtime": "время выполнения",
1921
- "badge.source.user-agents": "пользователь .агенты",
1920
+ "badge.source.runtime": "runtime",
1921
+ "badge.source.user-agents": "пользователь .agents",
1922
1922
  "badge.source.user-dsh": "пользователь .dsh",
1923
- "delete.confirm": "Переместить в корзину",
1924
- "delete.confirmText": "Переместить \"{name}\" в корзину? Его можно будет восстановить в любое время.",
1925
- "delete.confirmTitle": "Переместить в корзину?",
1926
- "detail.addedAt": "Добавлено",
1927
- "detail.back": "Назад к списку",
1923
+ "delete.confirm": "В корзину",
1924
+ "delete.confirmText": "Переместить «{name}» в корзину? Его можно восстановить в любой момент.",
1925
+ "delete.confirmTitle": "В корзину?",
1926
+ "detail.addedAt": "Добавлен",
1927
+ "detail.back": "К списку",
1928
1928
  "detail.groups": "Группы",
1929
- "detail.loading": "Загрузка тела навыка…",
1929
+ "detail.loading": "Загрузка текста навыка…",
1930
1930
  "detail.path": "Путь",
1931
- "detail.provider": "Провайдер",
1932
- "detail.updatedAt": "Обновлено",
1933
- "detail.whenToUse": "Когда использовать",
1931
+ "detail.provider": "Поставщик",
1932
+ "detail.updatedAt": "Обновлён",
1933
+ "detail.uses": "Вызовы",
1934
+ "detail.whenToUse": "Когда применять",
1934
1935
  "entry.label": "Навыки",
1935
- "entry.tooltip": "Центр навыков: просматривайте, группируйте и синхронизируйте локальные навыки",
1936
- "err.dismiss": "Скрыть",
1936
+ "entry.tooltip": "Центр навыков: просмотр, группировка и синхронизация локальных навыков",
1937
+ "err.dismiss": "Понятно",
1937
1938
  "filter.allSources": "Все источники",
1938
- "filter.private": "Личное",
1939
+ "filter.private": "Личные",
1939
1940
  "form.busy": "Создание…",
1940
1941
  "form.cancel": "Отмена",
1941
- "form.capabilityHint": "Выбор способности: повторяемый метод → навык; внешняя система → MCP; долгосрочные знания → база знаний.",
1942
- "form.desc": "Описание (одно предложение о маршрутизации)",
1943
- "form.descPlaceholder": "Одна строка о том, что она делает (с триггерными словами) агенты автоматически активируются из этого",
1944
- "form.error": "Создание не удалось:",
1945
- "form.name": "Название навыка (в формате kebab-case, например, code-review)",
1946
- "form.root": "Целевой корень",
1942
+ "form.capabilityHint": "Как выбрать способность: повторяемый метод → навык; внешняя система → MCP; долгосрочные знания → база знаний.",
1943
+ "form.desc": "Описание (одно предложение для маршрутизации)",
1944
+ "form.descPlaceholder": "Одна строка что делает (с триггерными словами); по этому описанию агенты активируют навык",
1945
+ "form.error": "Ошибка создания: ",
1946
+ "form.name": "Имя навыка (kebab-case, например code-review)",
1947
+ "form.root": "Целевой каталог",
1947
1948
  "form.submit": "Создать",
1948
- "form.success": "Создано:",
1949
- "group.bundled": "В комплекте",
1949
+ "form.success": "Создано: ",
1950
+ "group.bundled": "Встроенные",
1950
1951
  "group.custom": "Пользовательские каталоги",
1951
1952
  "group.other": "Другие источники",
1952
- "group.project-agents": "Проект .agents/навыки",
1953
- "group.project-dsh": "Проект .dsh/навыки",
1954
- "group.runtime": "Время выполнения",
1955
- "group.user-agents": "Пользователь ~/.agents/skills",
1956
- "group.user-dsh": "Пользователь ~/.dsh/skills",
1953
+ "group.project-agents": "Проектные .agents/skills",
1954
+ "group.project-dsh": "Проектные .dsh/skills",
1955
+ "group.runtime": "Runtime",
1956
+ "group.user-agents": "Пользовательские ~/.agents/skills",
1957
+ "group.user-dsh": "Пользовательские ~/.dsh/skills",
1957
1958
  "groups.closeAll": "Закрыть все",
1958
- "groups.conflictText": "Эти навыки также активированы в других группах; их отключение повлияет на эти группы:",
1959
+ "groups.conflictText": "Эти навыки включены и в других группах; их закрытие затронет и те группы:",
1959
1960
  "groups.conflictTitle": "Закрыть эту группу?",
1960
- "groups.delete": "Удалить сцену",
1961
- "groups.edit": "Редактировать",
1962
- "groups.empty": "Сцен пока нет. Создайте одну и начните классифицировать навыки.",
1963
- "groups.keepOn": "Продолжать",
1964
- "groups.membersHint": "Выберите навыки для добавления в эту сцену (включая отключенные навыки).",
1961
+ "groups.delete": "Удалить сценарий",
1962
+ "groups.edit": "Изменить",
1963
+ "groups.empty": "Сценариев ещё нет. Создайте один и начните раскладывать навыки.",
1964
+ "groups.keepOn": "Оставить включёнными",
1965
+ "groups.membersHint": "Отметьте навыки, чтобы добавить их в сценарий (включая отключённые).",
1965
1966
  "groups.merge": "Объединить",
1966
- "groups.namePlaceholder": "Название сцены",
1967
- "groups.new": "Новая сцена",
1968
- "groups.noCollections": "Пока нет групп источников. Импортируйте навыки с рынка, чтобы сгруппировать их по источникам.",
1969
- "groups.noWritable": "Нет доступных для записи навыков в этой группе (навыки только для чтения нельзя переключить из хаба)",
1970
- "groups.personal": "Личное",
1971
- "groups.project": "Проект",
1972
- "groups.rename": "Сохранить имя",
1973
- "groups.saveMembers": "Сохранить участников",
1967
+ "groups.namePlaceholder": "Название сценария",
1968
+ "groups.new": "Новый сценарий",
1969
+ "groups.noCollections": "Групп по источникам пока нет. Импортируйте навыки из маркета они сгруппируются по источникам.",
1970
+ "groups.noWritable": "В группе нет перезаписываемых навыков (состояние навыков «только чтение» нельзя менять из центра)",
1971
+ "groups.personal": "Личные",
1972
+ "groups.project": "Проектные",
1973
+ "groups.rename": "Сохранить название",
1974
+ "groups.saveMembers": "Сохранить состав",
1974
1975
  "groups.subdivide": "Разделить",
1975
- "legend.hint": "Не более одной точки на навык; отсутствие точки = нельзя вызвать.",
1976
- "legend.model": "Модель, доступная для вызова — агенты могут вызывать автоматически",
1977
- "legend.user": "Пользовательский вызов — только явный вызов",
1976
+ "legend.hint": "У навыка не более одной точки; нет точки = не вызывается.",
1977
+ "legend.model": "Вызывается моделью — агенты могут вызывать автоматически",
1978
+ "legend.user": "Вызывается пользователем — только явный вызов",
1978
1979
  "market.add": "Добавить",
1979
- "market.addPlaceholder": "владелец/репозиторий или https://github.com/…",
1980
+ "market.addPlaceholder": "owner/repo или https://github.com/…",
1980
1981
  "market.addSource": "Добавить источник",
1981
1982
  "market.branchConfirm": "Подтвердить",
1982
- "market.branchHint": "В этом репозитории нет релизов. Выберите ветку для отслеживания (по умолчанию main):",
1983
+ "market.branchHint": "У репозитория нет релизов. Выберите ветку для отслеживания (по умолчанию main):",
1983
1984
  "market.branchTitle": "Выберите ветку",
1984
1985
  "market.catalog.anthropics": "Официальная коллекция навыков Anthropic (Claude Skills)",
1985
1986
  "market.catalog.mattpocock": "Коллекция навыков Matt Pocock",
1986
1987
  "market.catalog.openDesign": "Коллекция навыков дизайна (design-templates)",
1987
1988
  "market.catalog.superpowers": "Коллекция навыков сообщества Superpowers",
1988
- "market.catalogHint": "Кураторские репозитории навыков — добавьте один для сканирования и установки с проверкой обновлений.",
1989
+ "market.catalogHint": "Отобранные репозитории навыков — добавьте, чтобы сканировать и устанавливать, с постоянной проверкой обновлений.",
1989
1990
  "market.check": "Проверить",
1990
1991
  "market.checkAll": "Проверить все",
1991
- "market.checkUpdate": "Проверить наличие обновлений",
1992
+ "market.checkUpdate": "Проверить обновления",
1992
1993
  "market.checking": "Проверка…",
1993
1994
  "market.deleteSource": "Удалить источник",
1994
- "market.deletedUpstream": "{count} удалённых вышестоящих",
1995
- "market.installed": "{count} установлено",
1996
- "market.newRelease": "Новый релиз v{version}",
1997
- "market.noSources": "Нет источников рынка. Добавьте один из встроенного каталога ниже или введите репозиторий GitHub.",
1998
- "market.removeHint": "Удаление источника не влияет на установленные навыки.",
1995
+ "market.deletedUpstream": "Удалено в источнике: {count}",
1996
+ "market.installed": "Установлено: {count}",
1997
+ "market.newRelease": "Новая версия v{version}",
1998
+ "market.noSources": "Источников пока нет. Добавьте из каталога ниже или введите репозиторий GitHub.",
1999
+ "market.removeHint": "Удаление источника не затрагивает установленные навыки.",
1999
2000
  "market.scan": "Сканировать",
2000
2001
  "market.scanning": "Сканирование…",
2001
- "market.sync": "Синхронизация",
2002
+ "market.sync": "Синхронизировать",
2002
2003
  "market.syncCancel": "Пропустить",
2003
- "market.syncNone": "Локальные навыки из этого репозитория еще не отслеживаются.",
2004
- "market.syncText": "Источник рынка согласован с {ref}. Обновить эти локальные навыки?",
2004
+ "market.syncNone": "Из этого репозитория пока не импортировано ни одного навыка.",
2005
+ "market.syncText": "Источник выровнен с {ref}. Обновить эти локальные навыки?",
2005
2006
  "market.syncTitle": "Обновить локальные навыки",
2006
2007
  "market.syncing": "Синхронизация…",
2007
- "market.title": "Рынок",
2008
- "market.upToDate": "Обновлено",
2009
- "market.updatable": "{count} доступно для обновления",
2008
+ "market.title": "Маркет",
2009
+ "market.upToDate": "Актуально",
2010
+ "market.updatable": "Обновляемо: {count}",
2010
2011
  "market.update": "Обновить",
2011
- "market.updateAll": "Обновить все",
2012
- "market.updateAllConfirmText": "Обновляемые навыки этих источников будут перезаписаны их последними версиями из вышестоящих репозиториев:",
2013
- "market.updateAllConfirmTitle": "Обновить каждый навык?",
2014
- "market.updateAllDone": "Обновлено {count} источников",
2015
- "market.updateAllItem": "{repo} ({count} навыков)",
2012
+ "market.updateAll": "Обновить всё",
2013
+ "market.updateAllConfirmText": "Обновляемые навыки этих источников будут перезаписаны их новейшими версиями из источника:",
2014
+ "market.updateAllConfirmTitle": "Обновить все навыки?",
2015
+ "market.updateAllDone": "Обновлено источников: {count}",
2016
+ "market.updateAllItem": "{repo} (навыков: {count})",
2016
2017
  "market.updateCount": "Обновить {count}",
2017
- "market.updated": "Доступны обновления",
2018
- "panel.count": "{count} навыков всего",
2018
+ "market.updated": "Есть обновления",
2019
+ "panel.count": "Всего навыков: {count}",
2019
2020
  "panel.diagnostics": "Диагностика обнаружения",
2020
2021
  "panel.disabled": "Отключено",
2021
- "panel.disabledCount": "{count} отключено",
2022
+ "panel.disabledCount": "Отключено: {count}",
2022
2023
  "panel.empty": "Нет подходящих навыков.",
2023
- "panel.emptyAll": "Ещё не установлено ни одного навыка. Создайте первый.",
2024
+ "panel.emptyAll": "Навыков пока нет. Создайте первый.",
2024
2025
  "panel.enabled": "Включено",
2025
2026
  "panel.incomplete": "(каталог может быть неполным)",
2026
2027
  "panel.loading": "Загрузка…",
@@ -2028,110 +2029,112 @@ window.__ModuleLoader__.load({
2028
2029
  "panel.search": "Поиск навыков…",
2029
2030
  "panel.title": "Центр навыков",
2030
2031
  "panel.workspaceClear": "Очистить рабочую область",
2031
- "panel.workspaceHint": "Введите путь к проекту, чтобы также отобразить навыки из .dsh/skills и .agents/skills этого рабочего пространства (только для чтения); очистите + Enter, чтобы вернуться к пользовательскому представлению.",
2032
- "panel.workspacePlaceholder": "Путь к рабочей области (нажмите Enter для применения)",
2032
+ "panel.workspaceHint": "Укажите путь проекта, чтобы показать навыки его .dsh/skills и .agents/skills (только чтение); очистите и нажмите Enter, чтобы вернуться к пользовательскому виду.",
2033
+ "panel.workspacePlaceholder": "Путь рабочей области (Enter применить)",
2033
2034
  "repo.cancel": "Отмена",
2034
2035
  "repo.cancelled": "Отменено · {imported}/{total} сохранено, временные файлы удалены",
2035
2036
  "repo.clearAll": "Очистить",
2036
- "repo.empty": "Импортируемые навыки не найдены.",
2037
- "repo.existing": "Существующий",
2038
- "repo.failed": "Не удалось {count}",
2039
- "repo.files": "{count} файлов · {size}",
2037
+ "repo.empty": "Импортируемых навыков не найдено.",
2038
+ "repo.existing": "Существующие",
2039
+ "repo.failed": "Не удалось: {count}",
2040
+ "repo.files": "Файлов: {count} · {size}",
2040
2041
  "repo.import": "Импортировать выбранные ({count})",
2041
- "repo.imported": "Импортировано {count}",
2042
+ "repo.imported": "Импортировано: {count}",
2042
2043
  "repo.importing": "Импорт…",
2043
2044
  "repo.importingCurrent": "Импорт: {name} ({done}/{total})",
2044
- "repo.ready": "Найдено {count} импортируемых навыков",
2045
- "repo.root.designTemplates": "Шаблоны дизайна {design-templates}",
2045
+ "repo.ready": "Найдено импортируемых навыков: {count}",
2046
+ "repo.root.designTemplates": "Шаблоны design-templates",
2046
2047
  "repo.root.generic": "{root}",
2047
- "repo.root.skills": "Навыки",
2048
+ "repo.root.skills": "Навыки (skills)",
2048
2049
  "repo.selectAll": "Выбрать все",
2049
- "repo.skippedExisting": "Пропущено существующих {count}",
2050
- "row.delete": "Переместить в корзину",
2050
+ "repo.skippedExisting": "Пропущено существующих: {count}",
2051
+ "row.delete": "В корзину",
2051
2052
  "row.disable": "Отключить",
2052
2053
  "row.enable": "Включить",
2053
- "row.open": "Просмотреть детали {name} (Enter)",
2054
- "row.readonly": "только для чтения",
2055
- "settings.announceToAgent": "Сообщить агенту",
2056
- "settings.announceToAgentHint": "Добавляет раздел с системным приглашением, чтобы агенты знали, как взаимодействовать, когда пользователи упоминают управление навыками.",
2054
+ "row.open": "Подробнее о навыке {name} (Enter)",
2055
+ "row.readonly": "только чтение",
2056
+ "settings.announceToAgent": "Объявлять агенту",
2057
+ "settings.announceToAgentHint": "Добавляет раздел в системный промпт, чтобы агенты знали, как сотрудничать, когда пользователь упоминает управление навыками.",
2057
2058
  "settings.collapse": "Скрыть настройки",
2058
- "settings.description": "Управляйте локальным каталогом навыков dsh: просматривайте, группируйте, синхронизируйте и создавайте шаблоны навыков.",
2059
+ "settings.description": "Управление локальным каталогом навыков dsh: просмотр, группировка, синхронизация источников и создание.",
2059
2060
  "settings.discard": "Отменить",
2060
- "settings.dotModelColor": "Цвет точки, доступной для вызова модели",
2061
- "settings.dotModelColorHint": "Цвет синей точки «model-callable» в панели навыков и чате / меню (#rrggbb).",
2062
- "settings.dotUserColor": "Цвет точки, вызываемый пользователем",
2063
- "settings.dotUserColorHint": "Цвет зелёной точки «только для пользователя» на панели навыков и в чате / меню (#rrggbb).",
2061
+ "settings.dotModelColor": "Цвет точки «вызывается моделью»",
2062
+ "settings.dotModelColorHint": "Цвет синей точки «модель может вызвать» в панели навыков и чате/меню (#rrggbb).",
2063
+ "settings.dotUserColor": "Цвет точки «вызывается пользователем»",
2064
+ "settings.dotUserColorHint": "Цвет зелёной точки «только пользователь» в панели навыков и чате/меню (#rrggbb).",
2064
2065
  "settings.enabled": "Включить плагин",
2065
- "settings.enabledHint": "Отключает маршруты хаба, записи и объявления.",
2066
+ "settings.enabledHint": "Отключает маршруты, элементы и объявление центра навыков.",
2066
2067
  "settings.expand": "Показать настройки",
2067
2068
  "settings.inherit": "Наследовать",
2068
- "settings.notExposed": "Это развертывание не предоставляет доступ к пространству имен настроек.",
2069
- "settings.off": "Выключено",
2070
- "settings.on": "Включено",
2069
+ "settings.notExposed": "Это развёртывание не предоставляет пространство настроек.",
2070
+ "settings.off": "Выкл",
2071
+ "settings.on": "Вкл",
2071
2072
  "settings.overridden": "Переопределено",
2072
- "settings.readOnly": "Это развертывание сохраняет настройки только для чтения.",
2073
- "settings.reset": "Сбросить до значений по умолчанию",
2073
+ "settings.readOnly": "Настройки этого развёртывания доступны только для чтения.",
2074
+ "settings.reset": "Сбросить к значению по умолчанию",
2074
2075
  "settings.save": "Сохранить",
2075
- "settings.saveFailed": "Развертывание не приняло эти значения; они были оставлены для вас, чтобы исправить.",
2076
+ "settings.saveFailed": "Развёртывание не приняло эти значения; они оставлены для исправления.",
2076
2077
  "settings.saving": "Сохранение…",
2077
- "settings.showGroupSummary": "Показать сводки групп",
2078
- "settings.showGroupSummaryHint": "Обобщить количество вызовов и время последнего использования после заголовков групп.",
2079
- "settings.showUseCount": "Показать количество вызовов",
2080
- "settings.showUseCountHint": "Показывать количество янтарных призывов рядом с названием каждого навыка.",
2081
- "settings.showUseTime": "Показать время последнего использования",
2082
- "settings.showUseTimeHint": "Показывать относительное время последнего использования в строке имени (например, \"3 дн. назад\").",
2083
- "settings.statsScanMinutes": "Интервал автостатистики (минуты)",
2084
- "settings.statsScanMinutesHint": "Как часто выполняется сканирование журнала сеансов в фоновом режиме (минимум 1); интенсивные сканирования автоматически увеличивают интервал.",
2085
- "settings.statsWindowDays": "Окно статистики (дни)",
2086
- "settings.statsWindowDaysHint": "Учитывать использование только за последние N дней (по умолчанию 14); 0 = полная история. Изменения применяются сразу.",
2078
+ "settings.showGroupSummary": "Показывать сводку по группам",
2079
+ "settings.showGroupSummaryHint": "После заголовков групп показывать число вызовов и время последнего вызова.",
2080
+ "settings.showUseCount": "Показывать число вызовов",
2081
+ "settings.showUseCountHint": "Показывать янтарный счётчик вызовов рядом с именем навыка.",
2082
+ "settings.showUseTime": "Показывать время последнего вызова",
2083
+ "settings.showUseTimeHint": "Показывать относительное время в строке имени (например «3 дн назад»).",
2084
+ "settings.statsScanMinutes": "Интервал автостатистики (минут)",
2085
+ "settings.statsScanMinutesHint": "Как часто фоновое сканирование журналов сессий выполняется (минимум 1); тяжёлые сканирования автоматически растягивают интервал.",
2086
+ "settings.statsWindowDays": "Окно статистики (дней)",
2087
+ "settings.statsWindowDaysHint": "Учитывать использование только за последние N дней (по умолчанию 14); 0 = вся история. Изменения применяются сразу.",
2087
2088
  "settings.title": "Центр навыков",
2088
- "settings.unsaved": "Не сохранено",
2089
- "sort.added": "Добавлено",
2090
- "sort.name": "По имени",
2091
- "source.check": "Проверить наличие обновлений",
2092
- "source.checkHint": "Нажмите, чтобы проверить наличие обновлений в вышестоящем репозитории",
2089
+ "settings.unsaved": "Есть несохранённые",
2090
+ "sort.added": "По дате добавления",
2091
+ "sort.name": "По названию",
2092
+ "sort.uses": "По числу вызовов",
2093
+ "source.check": "Проверить обновления",
2094
+ "source.checkHint": "Нажмите, чтобы проверить источник на обновления",
2093
2095
  "source.checking": "Проверка…",
2094
2096
  "source.clearTrash": "Очистить корзину",
2095
- "source.clearTrashConfirm": "Удалить навсегда",
2096
- "source.clearTrashConfirmText": "Навыки в корзине будут удалены навсегда и не могут быть восстановлены.",
2097
+ "source.clearTrashConfirm": "Удалить безвозвратно",
2098
+ "source.clearTrashConfirmText": "Навыки в корзине будут удалены безвозвратно и не могут быть восстановлены.",
2097
2099
  "source.clearTrashConfirmTitle": "Очистить корзину?",
2098
- "source.commit": "Синхронизированный коммит",
2099
- "source.deleteConfirmText": "Эти навыки были удалены в основном репозитории; их локальные папки перемещены в корзину (можно восстановить):",
2100
- "source.deleteConfirmTitle": "Следовать удалению вышестоящего?",
2100
+ "source.commit": "Синхронизированная ревизия",
2101
+ "source.deleteConfirmText": "Эти навыки удалены из источника; их локальные каталоги уйдут в корзину (восстановимо):",
2102
+ "source.deleteConfirmTitle": "Согласиться с удалением в источнике?",
2101
2103
  "source.deleteGroup": "Удалить группу",
2102
- "source.deleteGroupHint": "Удалить все {count} навыки в этой группе",
2103
- "source.deleteGroupText": "Все {count} навыки в группе \"{name}\" будут перемещены в корзину (восстановление возможно); навыки только для чтения будут пропущены:",
2104
+ "source.deleteGroupHint": "Удалить все навыки ({count}) этой группы",
2105
+ "source.deleteGroupText": "Все навыки ({count}) группы «{name}» будут перемещены в корзину (восстановимо); навыки «только чтение» будут пропущены:",
2104
2106
  "source.deleteGroupTitle": "Удалить группу?",
2105
- "source.deleted": "{count} удалённых вышестоящих",
2106
- "source.error": "Проверка не пройдена",
2107
- "source.private": "Личный навык (не привязан к вышестоящему источнику; проверка обновлений отсутствует)",
2107
+ "source.deleted": "Удалено в источнике: {count}",
2108
+ "source.error": "Проверка не удалась",
2109
+ "source.followDelete": "Согласиться с удалением",
2110
+ "source.private": "Личный навык (не привязан к источнику; проверки обновлений нет)",
2108
2111
  "source.restore": "Восстановить",
2109
- "source.sync": "Синхронизация",
2110
- "source.syncConfirmText": "Это перезаписывает локальные изменения этих навыков последней версией из основного репозитория:",
2112
+ "source.sync": "Синхронизировать",
2113
+ "source.syncConfirmText": "Локальные изменения этих навыков будут перезаписаны новейшими версиями из источника:",
2111
2114
  "source.syncConfirmTitle": "Синхронизировать навыки?",
2112
2115
  "source.syncing": "Синхронизация…",
2113
- "source.throttled": "Проверено недавно",
2116
+ "source.throttled": "Недавно проверено",
2114
2117
  "source.trash": "Корзина",
2115
- "source.unverified": "upstream еще не проверен",
2116
- "source.upToDate": "Обновлено",
2117
- "source.updated": "{count} обновлений",
2118
- "time.daysAgo": "{value} д. назад",
2118
+ "source.unverified": "источник ещё не проверен",
2119
+ "source.upToDate": "Актуально",
2120
+ "source.updated": "Обновлений: {count}",
2121
+ "time.daysAgo": "{value} дн назад",
2119
2122
  "time.hoursAgo": "{value} ч назад",
2120
2123
  "time.justNow": "только что",
2121
- "time.minutesAgo": "{value} мин. назад",
2122
- "time.weeksAgo": "{value} недель назад",
2124
+ "time.minutesAgo": "{value} мин назад",
2125
+ "time.weeksAgo": "{value} нед назад",
2123
2126
  "update.available": "Доступно обновление: v{version} (текущая v{current})",
2124
- "update.check": "Проверить наличие обновлений",
2127
+ "update.check": "Проверить обновления",
2125
2128
  "update.checking": "Проверка…",
2126
- "update.error": "Не удалось проверить обновление: {error}",
2129
+ "update.error": "Не удалось проверить обновления: {error}",
2127
2130
  "update.newVersion": "Новая версия v{version}",
2128
- "update.unavailable": "Нет доступного релиза",
2131
+ "update.unavailable": "Нет доступных релизов",
2129
2132
  "update.upToDate": "Актуальная версия: v{version}",
2130
- "update.viewRelease": "Просмотр релиза",
2131
- "view.flat": "Плоский",
2132
- "view.grouped": "Сгруппировано",
2133
- "view.market": "Рынок",
2134
- "view.scenes": "Сцены",
2133
+ "update.viewRelease": "Открыть релиз",
2134
+ "view.flat": "Списком",
2135
+ "view.grouped": "По группам",
2136
+ "view.market": "Маркет",
2137
+ "view.scenes": "Сценарии",
2135
2138
  "view.sources": "Источники"
2136
2139
  },
2137
2140
  "dsh-subscriptions": {
@@ -3044,6 +3047,175 @@ window.__ModuleLoader__.load({
3044
3047
  "row.running": "Загрузка скилла",
3045
3048
  "row.stopped": "Загрузка скилла остановлена"
3046
3049
  },
3050
+ "skills-manager": {
3051
+ "action.create": "создание",
3052
+ "action.delete": "удаление",
3053
+ "action.disable": "отключение",
3054
+ "action.enable": "включение",
3055
+ "action.restore": "восстановление",
3056
+ "action.toggle": "включение или отключение",
3057
+ "btn.cancel": "Отмена",
3058
+ "btn.close": "Закрыть",
3059
+ "btn.create": "Создать навык",
3060
+ "btn.create.now": "Создать навык",
3061
+ "btn.delete.forever": "Удалить безвозвратно",
3062
+ "btn.detail": "Подробнее",
3063
+ "btn.disable": "Отключить",
3064
+ "btn.enable": "Включить",
3065
+ "btn.file.pick": "Выбрать файл",
3066
+ "btn.folder.pick": "Выбрать папку",
3067
+ "btn.import": "Импорт",
3068
+ "btn.import.now": "Установить",
3069
+ "btn.refresh": "Обновить",
3070
+ "btn.repair.enable": "Исправить и включить",
3071
+ "btn.restore": "Восстановить",
3072
+ "btn.trash": "В корзину",
3073
+ "confirm.delete.desc": "«{name}» будет безвозвратно удалён из корзины; восстановить невозможно.",
3074
+ "confirm.delete.title": "Удалить безвозвратно?",
3075
+ "confirm.trash.desc": "«{name}» будет перемещён из текущего источника в корзину; позже его можно восстановить на прежнее место.",
3076
+ "confirm.trash.title": "Отправить в корзину?",
3077
+ "create.body": "Текст (Markdown)",
3078
+ "create.body.placeholder": "Опишите инструкции, шаги и границы навыка…",
3079
+ "create.chat.note": "Команда create_skill в чате по-прежнему создаёт пользовательский навык DSH; проектный навык можно создать здесь, выбрав активный проект.",
3080
+ "create.description": "Описание",
3081
+ "create.description.placeholder": "Одно предложение — когда использовать",
3082
+ "create.name": "Название",
3083
+ "create.name.placeholder": "например code-review-helper",
3084
+ "create.target": "Место создания",
3085
+ "create.title": "Создать навык",
3086
+ "desc": "Единая загрузка и управление Agent-навыками на этом компьютере.",
3087
+ "detail.body": "Текст",
3088
+ "detail.diagnostics": "Диагностика",
3089
+ "detail.frontmatter": "Frontmatter",
3090
+ "detail.noIssues": "Проблем не обнаружено.",
3091
+ "detail.path": "Исходный файл",
3092
+ "detail.title": "Подробности навыка",
3093
+ "diagnostic.description.missing": "В frontmatter нет description",
3094
+ "diagnostic.frontmatter.missing": "Отсутствует полный YAML frontmatter",
3095
+ "diagnostic.invocation.invalid": "Недопустимое значение политики вызова",
3096
+ "diagnostic.name.invalid": "Имя навыка не соответствует kebab-case: {name}",
3097
+ "diagnostic.name.missing": "В frontmatter нет name",
3098
+ "diagnostic.shadowed": "Перекрыт источником с более высоким приоритетом {root}",
3099
+ "empty.search": "Подходящих навыков нет.",
3100
+ "empty.source": "Этого каталога не существует или в нём пока нет навыков.",
3101
+ "error.action": "Действие не удалось: {error}",
3102
+ "error.browse.absolute": "Путь к папке должен быть абсолютным: {path}",
3103
+ "error.browse.notDirectory": "Это не папка: {path}",
3104
+ "error.browse.unreadable": "Не удалось прочитать папку: {path}",
3105
+ "error.create.bodyRequired": "Текст навыка обязателен",
3106
+ "error.create.conflict": "Навык с таким именем уже существует: {name}",
3107
+ "error.create.descriptionRequired": "Описание навыка обязательно",
3108
+ "error.create.tooLarge": "Содержимое навыка слишком велико",
3109
+ "error.import.duplicateName": "В пакетном источнике есть навыки с одинаковыми именами: {name}",
3110
+ "error.import.emptySource": "В каталоге не найдено ни одного элемента навыков: {path}",
3111
+ "error.import.failed": "Импорт не удался",
3112
+ "error.import.invalidName": "Не удалось сгенерировать корректное имя kebab-case (исходное: {name})",
3113
+ "error.import.overlap": "Источник импорта не может совпадать с каталогом навыков DSH, содержать или находиться внутри него",
3114
+ "error.import.rollbackFailed": "Откат перезаписывающего импорта не удался; резервные копии сохранены в: {path} ({error})",
3115
+ "error.proto.bodyTooLarge": "Тело запроса слишком велико",
3116
+ "error.proto.contentType": "Тело запроса должно быть application/json",
3117
+ "error.proto.forbidden": "Запрещённый запрос на изменение (нет клиентского маркера)",
3118
+ "error.proto.forbiddenHost": "Запрещённый источник запроса (неверный Host)",
3119
+ "error.proto.invalidJson": "Тело запроса — не корректный JSON",
3120
+ "error.proto.method": "Метод не поддерживается",
3121
+ "error.proto.nonJson": "Сервер вернул ответ не в формате JSON (HTTP {status})",
3122
+ "error.proto.unknownAction": "Неизвестное действие",
3123
+ "error.root.readonly": "Этот источник не разрешает: {action}",
3124
+ "error.root.unknown": "Неизвестный источник навыков: {root}",
3125
+ "error.root.unsafe": "Каталог проектных навыков небезопасен, запись отклонена: {path}",
3126
+ "error.skill.noFrontmatter": "У навыка неполный frontmatter, нельзя выполнить «{action}»: {name}",
3127
+ "error.skill.notFound": "Навык не найден: {name}",
3128
+ "error.source.notFound": "Путь не существует: {path}",
3129
+ "error.source.symlink": "Источники навыков с символическими ссылками не поддерживаются: {path}",
3130
+ "error.source.tooDeep": "Глубина каталога источника превышает {depth} уровней: {path}",
3131
+ "error.source.unrecognized": "Нераспознанный источник навыков: {path}",
3132
+ "error.state.invalid": "Файл состояния менеджера не читается, перезапись отклонена: {path}",
3133
+ "error.trash.conflict": "Нельзя восстановить: навык с таким именем уже существует: {name}",
3134
+ "error.trash.invalid": "Недопустимый путь элемента корзины: {id}",
3135
+ "error.trash.notFound": "Элемент корзины не найден: {id}",
3136
+ "error.trash.projectUnavailable": "Исходный проект не является активной рабочей областью, восстановление невозможно: {path}",
3137
+ "error.trash.rollbackFailed": "Откат перемещения в корзину не удался; невосстановленное содержимое сохранено в: {path} ({error})",
3138
+ "error.upload.archiveTooLarge": "ZIP-архив слишком велик; лимит {limit} байт",
3139
+ "error.upload.duplicate": "Загрузка содержит дублирующийся путь: {path}",
3140
+ "error.upload.empty": "Загрузка пуста",
3141
+ "error.upload.encoding": "Недопустимая кодировка загружаемого содержимого",
3142
+ "error.upload.path": "Загрузка содержит недопустимый путь: {path}",
3143
+ "error.upload.tooLarge": "Загрузка слишком велика; лимит {limit} байт",
3144
+ "error.upload.tooMany": "Слишком много файлов; максимум {limit}",
3145
+ "error.upload.zipInvalid": "ZIP-архив не удаётся распаковать",
3146
+ "filter.all": "Все источники",
3147
+ "filter.option": "{name} ({count})",
3148
+ "filter.source": "Источник",
3149
+ "import.title": "Импорт навыка",
3150
+ "loading": "Загрузка навыков…",
3151
+ "note.missing": "Описание не указано",
3152
+ "result.created": "Навык создан: {name}",
3153
+ "result.deleted": "Удалён безвозвратно: {name}",
3154
+ "result.importEmpty": "Не импортировано ни одного навыка.",
3155
+ "result.importPartial": "Импортировано: {imported}; пропущены одноимённые: {skipped}",
3156
+ "result.importSkipped": "Ничего не импортировано; пропущены существующие: {names}",
3157
+ "result.importWarnings": "{result}; предупреждения: {warnings}",
3158
+ "result.imported": "Импорт завершён: {names}",
3159
+ "result.restored": "Навык восстановлен: {name}",
3160
+ "result.trashed": "Отправлен в корзину: {name}",
3161
+ "result.updated": "Состояние обновлено.",
3162
+ "root.agents": "Общий Agent",
3163
+ "root.claude": "Claude",
3164
+ "root.codex": "Codex",
3165
+ "root.dsh": "Навыки DSH",
3166
+ "root.gemini": "Gemini",
3167
+ "root.opencode": "OpenCode",
3168
+ "root.projectAgents": "Проектный Agent",
3169
+ "root.projectDsh": "Проектный DSH",
3170
+ "search": "Поиск",
3171
+ "search.clear": "Очистить поиск",
3172
+ "search.placeholder": "Поиск по названию или описанию навыка",
3173
+ "select.file.invalid": "Выберите .zip или один файл SKILL.md.",
3174
+ "select.folder.invalid": "В выбранной папке не найдено SKILL.md.",
3175
+ "skill.toggle": "Вкл/выкл навык",
3176
+ "source.dsh.note": "Локальные навыки DSH можно создавать, импортировать и отправлять в корзину.",
3177
+ "source.external.note": "Загружается через Skills Manager только для чтения; переключения не меняют исходные файлы.",
3178
+ "source.toggle": "Вкл/выкл источник",
3179
+ "status.bundle": "Набор навыков",
3180
+ "status.disabled": "Отключён",
3181
+ "status.discovered": "Обнаружен",
3182
+ "status.enabled": "Загружен",
3183
+ "status.invalid": "Есть проблемы",
3184
+ "status.manageable": "Управляемый",
3185
+ "status.project": "Проектный",
3186
+ "status.rank": "Приоритет {rank}",
3187
+ "status.readonly": "Источник только для чтения",
3188
+ "status.selected": "Выбрано",
3189
+ "status.shadowed": "Перекрыт",
3190
+ "status.single": "Один файл",
3191
+ "status.source.off": "Отключён",
3192
+ "status.source.on": "Загружен",
3193
+ "summary.disabled": "Отключено: {count}",
3194
+ "summary.group": "Навыков: {count}",
3195
+ "summary.issues": "Проблем: {count}",
3196
+ "summary.loaded": "Загружено в DSH: {count}",
3197
+ "summary.total": "Навыков: {count}",
3198
+ "table.skill": "Название и описание навыка",
3199
+ "table.status": "Состояние в DSH",
3200
+ "title": "Навыки",
3201
+ "trash.count": "Навыков в очереди: {count}",
3202
+ "trash.deletedAt": "Удалено {time}",
3203
+ "trash.empty": "Корзина пуста.",
3204
+ "trash.source": "Источник: {source}",
3205
+ "trash.title": "Корзина",
3206
+ "upload.drop.copy": "Поддерживаются .zip, папка навыка или один SKILL.md",
3207
+ "upload.drop.title": "Перетащите навык сюда",
3208
+ "upload.importing": "Установка…",
3209
+ "upload.remove": "Убрать выбранное",
3210
+ "upload.requirement.copy": "Импорт копирует содержимое целиком и не меняет источник",
3211
+ "upload.requirement.frontmatter": "SKILL.md должен содержать YAML-название и описание",
3212
+ "upload.requirement.skill": "Архив или папка должны содержать SKILL.md",
3213
+ "upload.requirements": "Требования к файлам",
3214
+ "upload.selected": "Файлов: {count} · {size}",
3215
+ "warning.backupUncleaned": "Резервная копия старой версии не удалена: {path} ({error})",
3216
+ "warning.project.unavailable": "Не удалось получить активную рабочую область у хоста, проектные навыки скрыты: {path}",
3217
+ "warning.state.invalid": "Файл состояния менеджера не читается; внешние навыки отключены, перезапись заблокирована до исправления: {path}"
3218
+ },
3047
3219
  "slash.menu": {
3048
3220
  "command": "Команды",
3049
3221
  "loading": "Загрузка…",
@@ -3651,6 +3823,9 @@ window.__ModuleLoader__.load({
3651
3823
  }
3652
3824
  }
3653
3825
 
3826
+ /** zh-строка -> ru-строка для DOM-перевода панелей вне locale-ядра. */
3827
+ const ZH_RU = {"Anthropic 官方技能合集(Claude Skills)": "Официальная коллекция навыков Anthropic (Claude Skills)", "DSH 加载状态": "Состояние в DSH", "DSH 技能": "Навыки DSH", "DSH 本地技能可创建、导入和移到回收站。": "Локальные навыки DSH можно создавать, импортировать и отправлять в корзину.", "Matt Pocock 技能集": "Коллекция навыков Matt Pocock", "SKILL.md 需包含 YAML 格式的技能名称和描述": "SKILL.md должен содержать YAML-название и описание", "Superpowers 社区技能合集": "Коллекция навыков сообщества Superpowers", "ZIP 压缩包无法解压": "ZIP-архив не удаётся распаковать", "ZIP 压缩包过大,限制为 {limit} 字节": "ZIP-архив слишком велик; лимит {limit} байт", "frontmatter 缺少 description": "В frontmatter нет description", "frontmatter 缺少 name": "В frontmatter нет name", "owner/repo 或 https://github.com/…": "owner/repo или https://github.com/…", "skill 来源目录层级超过 {depth} 层: {path}": "Глубина каталога источника превышает {depth} уровней: {path}", "{count} 个已停用": "Отключено: {count}", "{count} 个已在 DSH 加载": "Загружено в DSH: {count}", "{count} 个待处理技能": "Навыков в очереди: {count}", "{count} 个技能": "Навыков: {count}", "{count} 个文件 · {size}": "Файлов: {count} · {size}", "{count} 个诊断项": "Проблем: {count}", "{repo}({count} 个技能)": "{repo} (навыков: {count})", "{result};警告:{warnings}": "{result}; предупреждения: {warnings}", "{value} 分钟前": "{value} мин назад", "{value} 周前": "{value} нед назад", "{value} 天前": "{value} дн назад", "{value} 小时前": "{value} ч назад", "“{name}”将从回收站永久删除,无法恢复。": "«{name}» будет безвозвратно удалён из корзины; восстановить невозможно.", "“{name}”将从当前技能来源移入回收站,之后可以恢复到原位置。": "«{name}» будет перемещён из текущего источника в корзину; позже его можно восстановить на прежнее место.", "一句话说明什么时候使用": "Одно предложение — когда использовать", "一句话说明用途(含触发词),Agent 靠它自动激活技能": "Одна строка — что делает (с триггерными словами); по этому описанию агенты активируют навык", "上传内容为空": "Загрузка пуста", "上传内容包含重复路径:{path}": "Загрузка содержит дублирующийся путь: {path}", "上传内容包含非法路径:{path}": "Загрузка содержит недопустимый путь: {path}", "上传内容编码无效": "Недопустимая кодировка загружаемого содержимого", "上传内容过大,限制为 {limit} 字节": "Загрузка слишком велика; лимит {limit} байт", "上传文件过多,最多 {limit} 个": "Слишком много файлов; максимум {limit}", "上游已删 {count}": "Удалено в источнике: {count}", "上游已删除 {count} 个": "Удалено в источнике: {count}", "不支持包含符号链接的 skill 来源: {path}": "Источники навыков с символическими ссылками не поддерживаются: {path}", "不支持的请求方法": "Метод не поддерживается", "不是目录:{path}": "Это не папка: {path}", "个人": "Личные", "个人技能(未绑定上游,不检查更新)": "Личный навык (не привязан к источнику; проверки обновлений нет)", "以下技能也在其他组中开启,关闭它们会影响那些组:": "Эти навыки включены и в других группах; их закрытие затронет и те группы:", "以下技能已从上游仓库移除,本地目录将移入回收站(可恢复):": "Эти навыки удалены из источника; их локальные каталоги уйдут в корзину (восстановимо):", "优先级 {rank}": "Приоритет {rank}", "例如 code-review-helper": "например code-review-helper", "保存": "Сохранить", "保存中…": "Сохранение…", "保存名称": "Сохранить название", "保存成员": "Сохранить состав", "保留开启": "Оставить включёнными", "修复并启用": "Исправить и включить", "停用": "Отключить", "全选": "Выбрать все", "全部关闭": "Закрыть все", "全部更新": "Обновить всё", "全部来源": "Все источники", "公共 Agent": "Общий Agent", "共 {count} 个技能": "Всего навыков: {count}", "关": "Выкл", "关闭": "Закрыть", "关闭后技能中枢的路由、入口与公告全部下线。": "Отключает маршруты, элементы и объявление центра навыков.", "关闭此组?": "Закрыть эту группу?", "其他来源": "Другие источники", "内置": "Встроенные", "写下技能要遵循的指令、步骤和边界…": "Опишите инструкции, шаги и границы навыка…", "分组": "По группам", "刚刚": "только что", "刚刚检查过": "Недавно проверено", "创建": "создание", "创建中…": "Создание…", "创建位置": "Место создания", "创建失败:": "Ошибка создания: ", "创建技能": "Создать навык", "删除": "удаление", "删除于 {time}": "Удалено {time}", "删除场景": "Удалить сценарий", "删除整组": "Удалить группу", "删除整组?": "Удалить группу?", "删除该分组下的全部 {count} 个技能": "Удалить все навыки ({count}) этой группы", "刷新": "Обновить", "勾选技能加入此场景(含已禁用)。": "Отметьте навыки, чтобы добавить их в сценарий (включая отключённые).", "单文件": "Один файл", "压缩包或文件夹需包含 SKILL.md": "Архив или папка должны содержать SKILL.md", "原项目当前不在活动工作区中,无法恢复:{path}": "Исходный проект не является активной рабочей областью, восстановление невозможно: {path}", "发现 {count} 个可导入技能": "Найдено импортируемых навыков: {count}", "发现新版本 v{version}(当前 v{current})": "Доступно обновление: v{version} (текущая v{current})", "发现诊断": "Диагностика обнаружения", "取消": "Отмена", "只统计最近 N 天的使用次数,默认 14 天;0 = 全部历史。改动立即生效。": "Учитывать использование только за последние N дней (по умолчанию 14); 0 = вся история. Изменения применяются сразу.", "只读": "только чтение", "可更新 {count}": "Обновляемо: {count}", "可管理": "Управляемый", "合并": "Объединить", "同名技能已存在: {name}": "Навык с таким именем уже существует: {name}", "同步": "Синхронизировать", "同步中…": "Синхронизация…", "同步技能?": "Синхронизировать навыки?", "同步本地技能": "Обновить локальные навыки", "名称": "Название", "后台扫描会话日志的间隔,最小 1 分钟;扫描耗时会自动拉长间隔。": "Как часто фоновое сканирование журналов сессий выполняется (минимум 1); тяжёлые сканирования автоматически растягивают интервал.", "向 Agent 公告": "Объявлять агенту", "启停技能": "Вкл/выкл навык", "启停来源": "Вкл/выкл источник", "启用": "Включить", "启用或停用": "включение или отключение", "启用插件": "Включить плагин", "回收站": "Корзина", "回收站为空。": "Корзина пуста.", "回收站条目不存在: {id}": "Элемент корзины не найден: {id}", "回收站条目路径非法: {id}": "Недопустимый путь элемента корзины: {id}", "回收站里的技能会被永久删除,无法恢复。此操作不可撤销。": "Навыки в корзине будут удалены безвозвратно и не могут быть восстановлены.", "在分组标题后汇总调用次数与最近调用时间。": "После заголовков групп показывать число вызовов и время последнего вызова.", "在技能名旁显示琥珀色调用次数。": "Показывать янтарный счётчик вызовов рядом с именем навыка.", "在技能名行右侧显示相对时间(如「3 天前」)。": "Показывать относительное время в строке имени (например «3 дн назад»).", "在系统提示中加入本插件说明,用户提到技能管理时 Agent 知道如何协作。": "Добавляет раздел в системный промпт, чтобы агенты знали, как сотрудничать, когда пользователь упоминает управление навыками.", "场景": "Сценарии", "场景名": "Название сценария", "填写项目路径后,面板同时显示该项目 .dsh/skills 与 .agents/skills 下的技能(只读);留空回车恢复用户级视图。": "Укажите путь проекта, чтобы показать навыки его .dsh/skills и .agents/skills (только чтение); очистите и нажмите Enter, чтобы вернуться к пользовательскому виду.", "失败 {count} 个": "Не удалось: {count}", "安装": "Установить", "对话中的 create_skill 仍创建用户级 DSH Skill;项目 Skill 可在这里选择活动项目后创建。": "Команда create_skill в чате по-прежнему создаёт пользовательский навык DSH; проектный навык можно создать здесь, выбрав активный проект.", "导入": "Импорт", "导入中…": "Импорт…", "导入失败": "Импорт не удался", "导入完成:{names}": "Импорт завершён: {names}", "导入成功 {count} 个": "Импортировано: {count}", "导入所选 ({count})": "Импортировать выбранные ({count})", "导入技能": "Импорт навыка", "导入时复制完整内容,不修改原始来源": "Импорт копирует содержимое целиком и не меняет источник", "导入来源不能与 DSH 技能目录相同、包含或位于其中": "Источник импорта не может совпадать с каталогом навыков DSH, содержать или находиться внутри него", "将把以下来源的可更新技能更新到上游最新版本(覆盖本地修改):": "Обновляемые навыки этих источников будут перезаписаны их новейшими версиями из источника:", "将把分组“{name}”下的全部 {count} 个技能移入回收站(可恢复),只读技能会跳过:": "Все навыки ({count}) группы «{name}» будут перемещены в корзину (восстановимо); навыки «только чтение» будут пропущены:", "将用上游最新版本覆盖本地对以下技能的所有修改:": "Локальные изменения этих навыков будут перезаписаны новейшими версиями из источника:", "尚未核对上游": "источник ещё не проверен", "展开设置": "Показать настройки", "工作区路径(回车应用)": "Путь рабочей области (Enter — применить)", "已停用": "Отключён", "已创建技能:{name}": "Навык создан: {name}", "已创建:": "Создано: ", "已加载": "Загружен", "已发现": "Обнаружен", "已取消 · 已导入 {imported}/{total} 已保留,临时文件已清理": "Отменено · {imported}/{total} сохранено, временные файлы удалены", "已同步版本": "Синхронизированная ревизия", "已启用": "Включено", "已存在": "Существующие", "已导入:{imported};已跳过同名技能:{skipped}": "Импортировано: {imported}; пропущены одноимённые: {skipped}", "已恢复技能:{name}": "Навык восстановлен: {name}", "已是最新": "Актуально", "已是最新版本 v{version}": "Актуальная версия: v{version}", "已更新 {count} 个来源": "Обновлено источников: {count}", "已永久删除:{name}": "Удалён безвозвратно: {name}", "已禁用": "Отключено", "已禁用 {count}": "Отключено: {count}", "已移到回收站:{name}": "Отправлен в корзину: {name}", "已装 {count}": "Установлено: {count}", "已覆盖": "Переопределено", "已选择": "Выбрано", "市场": "Маркет", "市场源已对齐到 {ref},要同步更新以下本地技能吗?": "Источник выровнен с {ref}. Обновить эти локальные навыки?", "平铺": "Списком", "开": "Вкл", "恢复": "Восстановить", "恢复默认": "Сбросить к значению по умолчанию", "所属场景": "Группы", "所选文件夹中没有找到 SKILL.md。": "В выбранной папке не найдено SKILL.md.", "扫描": "Сканировать", "扫描中…": "Сканирование…", "批量更新全部技能?": "Обновить все навыки?", "批量来源中存在多个同名技能: {name}": "В пакетном источнике есть навыки с одинаковыми именами: {name}", "技能": "Навыки", "技能 skills": "Навыки (skills)", "技能不存在: {name}": "Навык не найден: {name}", "技能中枢": "Центр навыков", "技能中枢:浏览、分组与同步管理本地技能": "Центр навыков: просмотр, группировка и синхронизация локальных навыков", "技能内容过长": "Содержимое навыка слишком велико", "技能名称不是合法 kebab-case:{name}": "Имя навыка не соответствует kebab-case: {name}", "技能名称与描述": "Название и описание навыка", "技能名(kebab-case,如 code-review)": "Имя навыка (kebab-case, например code-review)", "技能正文不能为空": "Текст навыка обязателен", "技能简介不能为空": "Описание навыка обязательно", "技能管理器状态文件不可读,已拒绝覆盖:{path}": "Файл состояния менеджера не читается, перезапись отклонена: {path}", "技能管理器状态文件不可读;外部技能已安全停用,修复文件前不会覆盖状态:{path}": "Файл состояния менеджера не читается; внешние навыки отключены, перезапись заблокирована до исправления: {path}", "技能缺少完整 frontmatter,无法{action}: {name}": "У навыка неполный frontmatter, нельзя выполнить «{action}»: {name}", "技能行/聊天 / 菜单中「仅用户可调」绿色圆点的颜色(#rrggbb)。": "Цвет зелёной точки «только пользователь» в панели навыков и чате/меню (#rrggbb).", "技能行/聊天 / 菜单中「模型可调」蓝色圆点的颜色(#rrggbb)。": "Цвет синей точки «модель может вызвать» в панели навыков и чате/меню (#rrggbb).", "技能详情": "Подробности навыка", "拖拽技能到此处": "Перетащите навык сюда", "按名称": "По названию", "按添加时间": "По дате добавления", "按调用次数": "По числу вызовов", "描述(一句话路由说明)": "Описание (одно предложение для маршрутизации)", "提供者": "Поставщик", "搜索": "Поиск", "搜索技能…": "Поиск навыков…", "搜索技能名称或描述": "Поиск по названию или описанию навыка", "操作失败:{error}": "Действие не удалось: {error}", "支持 .zip、技能文件夹或单个 SKILL.md": "Поддерживаются .zip, папка навыка или один SKILL.md", "收起设置": "Скрыть настройки", "放弃修改": "Отменить", "文件要求": "Требования к файлам", "新建场景": "Новый сценарий", "新建技能": "Новый навык", "新版本 v{version}": "Новая версия v{version}", "无法从宿主读取活动工作区,项目技能未显示:{path}": "Не удалось получить активную рабочую область у хоста, проектные навыки скрыты: {path}", "无法恢复,同名技能已存在: {name}": "Нельзя восстановить: навык с таким именем уже существует: {name}", "无法生成合法 kebab-case 名称(原始名: {name})": "Не удалось сгенерировать корректное имя kebab-case (исходное: {name})", "无法识别的 skill 来源: {path}": "Нераспознанный источник навыков: {path}", "无法读取目录:{path}": "Не удалось прочитать папку: {path}", "旧版本备份未清理: {path}({error})": "Резервная копия старой версии не удалена: {path} ({error})", "显示分组汇总": "Показывать сводку по группам", "显示最近调用时间": "Показывать время последнего вызова", "显示调用次数": "Показывать число вызовов", "暂无可用的发布版本": "Нет доступных релизов", "暂无来源组。从市场导入技能后自动按来源聚合。": "Групп по источникам пока нет. Импортируйте навыки из маркета — они сгруппируются по источникам.", "更新": "Обновить", "更新 {count} 个": "Обновить {count}", "更新时间": "Обновлён", "有更新": "Есть обновления", "有更新 {count} 个": "Обновлений: {count}", "服务端返回非 JSON 响应(HTTP {status})": "Сервер вернул ответ не в формате JSON (HTTP {status})", "未保存": "Есть несохранённые", "未发现诊断问题。": "Проблем не обнаружено.", "未导入任何技能。": "Не импортировано ни одного навыка.", "未导入任何技能;已跳过同名技能:{names}": "Ничего не импортировано; пропущены существующие: {names}", "未提供简介": "Описание не указано", "未知技能来源:{root}": "Неизвестный источник навыков: {root}", "未知操作": "Неизвестное действие", "本地还没有技能。点击「新建技能」创建第一个。": "Навыков пока нет. Создайте первый.", "本部署没有挂载该设置命名空间。": "Это развёртывание не предоставляет пространство настроек.", "本部署没有接受这些值,已保留供你修改。": "Развёртывание не приняло эти значения; они оставлены для исправления.", "本部署的设置为只读。": "Настройки этого развёртывания доступны только для чтения.", "来源": "Источник", "来源:{source}": "Источник: {source}", "查看 {name} 详情(回车)": "Подробнее о навыке {name} (Enter)", "查看发布": "Открыть релиз", "查看详情": "Подробнее", "检查": "Проверить", "检查中…": "Проверка…", "检查全部": "Проверить все", "检查失败": "Проверка не удалась", "检查更新": "Проверить обновления", "检查更新失败:{error}": "Не удалось проверить обновления: {error}", "模型可调 — Agent 可自动调用": "Вызывается моделью — агенты могут вызывать автоматически", "模型可调圆点颜色": "Цвет точки «вызывается моделью»", "模板 design-templates": "Шаблоны design-templates", "正在加载技能…": "Загрузка навыков…", "正在安装…": "Установка…", "正在导入: {name} ({done}/{total})": "Импорт: {name} ({done}/{total})", "正文": "Текст", "正文(Markdown)": "Текст (Markdown)", "每个技能最多一个圆点;无圆点 = 不可被调用。": "У навыка не более одной точки; нет точки = не вызывается.", "永久删除": "Удалить безвозвратно", "永久删除?": "Удалить безвозвратно?", "没有匹配的技能。": "Подходящих навыков нет.", "没有找到可导入技能。": "Импортируемых навыков не найдено.", "添加": "Добавить", "添加时间": "Добавлен", "添加源": "Добавить источник", "清空": "Очистить", "清空回收站": "Очистить корзину", "清空回收站?": "Очистить корзину?", "清除工作区": "Очистить рабочую область", "清除搜索": "Очистить поиск", "源文件": "Исходный файл", "源文件只读": "Источник только для чтения", "点击检查上游更新": "Нажмите, чтобы проверить источник на обновления", "状态已更新。": "Состояние обновлено.", "用户 .agents": "пользователь .agents", "用户 .dsh": "пользователь .dsh", "用户 ~/.agents/skills": "Пользовательские ~/.agents/skills", "用户 ~/.dsh/skills": "Пользовательские ~/.dsh/skills", "用户可调 — 仅显式点名时触发": "Вызывается пользователем — только явный вызов", "用户可调圆点颜色": "Цвет точки «вызывается пользователем»", "目录下未找到任何 skill 条目: {path}": "В каталоге не найдено ни одного элемента навыков: {path}", "目录技能": "Набор навыков", "目录路径必须是绝对路径:{path}": "Путь к папке должен быть абсолютным: {path}", "目标目录": "Целевой каталог", "知道了": "Понятно", "确定": "Подтвердить", "确定把「{name}」移入回收站吗?可随时恢复。": "Переместить «{name}» в корзину? Его можно восстановить в любой момент.", "禁止的修改请求(缺少客户端标记)": "Запрещённый запрос на изменение (нет клиентского маркера)", "禁止的请求来源(非法 Host)": "Запрещённый источник запроса (неверный Host)", "禁用": "Отключить", "移入回收站": "В корзину", "移入回收站回滚失败,未恢复内容保留在: {path}({error})": "Откат перемещения в корзину не удался; невосстановленное содержимое сохранено в: {path} ({error})", "移入回收站?": "В корзину?", "移到回收站": "В корзину", "移到回收站?": "Отправить в корзину?", "移除所选内容": "Убрать выбранное", "移除源": "Удалить источник", "移除源不影响已安装的技能。": "Удаление источника не затрагивает установленные навыки.", "简介": "Описание", "管理 dsh 本地技能目录:浏览、分组、来源同步与新建。": "Управление локальным каталогом навыков dsh: просмотр, группировка, синхронизация источников и создание.", "精选技能仓库,添加后即可扫描安装,并持续检查更新。": "Отобранные репозитории навыков — добавьте, чтобы сканировать и устанавливать, с постоянной проверкой обновлений.", "细分": "Разделить", "统一加载和管理本机 Agent Skills。": "Единая загрузка и управление Agent-навыками на этом компьютере.", "统计窗口(天)": "Окно статистики (дней)", "继承": "Наследовать", "编辑": "Изменить", "缺少完整 YAML frontmatter": "Отсутствует полный YAML frontmatter", "能力怎么选:重复方法 → 技能;外部系统 → MCP;长期资料 → 知识库。": "Как выбрать способность: повторяемый метод → навык; внешняя система → MCP; долгосрочные знания → база знаний.", "自动统计间隔(分钟)": "Интервал автостатистики (минут)", "自定义": "свой каталог", "自定义目录": "Пользовательские каталоги", "被更高优先级来源 {root} 覆盖": "Перекрыт источником с более высоким приоритетом {root}", "被覆盖": "Перекрыт", "覆盖导入回滚失败,备份保留在: {path}({error})": "Откат перезаписывающего импорта не удался; резервные копии сохранены в: {path} ({error})", "设计技能合集(design-templates)": "Коллекция навыков дизайна (design-templates)", "诊断": "Диагностика", "诊断异常": "Есть проблемы", "该仓库没有正式发布,选择要跟踪的分支(默认为 main):": "У репозитория нет релизов. Выберите ветку для отслеживания (по умолчанию main):", "该来源不允许{action}": "Этот источник не разрешает: {action}", "该来源目录不存在或暂时没有技能。": "Этого каталога не существует или в нём пока нет навыков.", "该来源还没有导入本地技能。": "Из этого репозитория пока не импортировано ни одного навыка.", "该组没有可写技能(只读技能无法由中枢开关)": "В группе нет перезаписываемых навыков (состояние навыков «только чтение» нельзя менять из центра)", "请求体不是合法 JSON": "Тело запроса — не корректный JSON", "请求体必须是 application/json": "Тело запроса должно быть application/json", "请求体过大": "Тело запроса слишком велико", "请选择 .zip 或单个 SKILL.md。": "Выберите .zip или один файл SKILL.md.", "读取中…": "Загрузка…", "读取技能正文…": "Загрузка текста навыка…", "调用次数": "Вызовы", "调用策略字段值无效": "Недопустимое значение политики вызова", "跟进上游删除?": "Согласиться с удалением в источнике?", "跟进删除": "Согласиться с удалением", "路径": "Путь", "路径不存在: {path}": "Путь не существует: {path}", "跳过": "Пропустить", "跳过已存在 {count} 个": "Пропущено существующих: {count}", "运行时": "Runtime", "返回列表": "К списку", "还没有场景。先新建一个,再把技能归类。": "Сценариев ещё нет. Создайте один и начните раскладывать навыки.", "还没有市场源。从下方内置市场添加,或输入一个 GitHub 仓库。": "Источников пока нет. Добавьте из каталога ниже или введите репозиторий GitHub.", "适用场景": "Когда применять", "选择分支": "Выберите ветку", "选择文件": "Выбрать файл", "选择文件夹": "Выбрать папку", "通过 Skills Manager 只读加载,启停不会改写源文件。": "Загружается через Skills Manager только для чтения; переключения не меняют исходные файлы.", "项目 .agents": "проект .agents", "项目 .agents/skills": "Проектные .agents/skills", "项目 .dsh": "проект .dsh", "项目 .dsh/skills": "Проектные .dsh/skills", "项目 Agent": "Проектный Agent", "项目 DSH": "Проектный DSH", "项目技能目录不安全,拒绝写入:{path}": "Каталог проектных навыков небезопасен, запись отклонена: {path}", "项目级": "Проектный", "(目录可能不完整)": "(каталог может быть неполным)"}
3828
+
3654
3829
  // Подписи собственной карточки настроек (namespace russian-lang).
3655
3830
  RU['russian-lang'] = {"cardTitle": "Русская локализация", "cardSub": "Язык интерфейса, типографика, раскладка", "enabled": "Русский язык включён", "typography": "Типографика вывода", "typographyDesc": "Исправляет типографику в тексте ответов: кавычки-«ёлочки», тире вместо дефисов, неразрывные пробелы после коротких предлогов. Код и ссылки не трогаются.", "yo": "Буква ё", "yoDesc": "Восстанавливать «ё» в частых словах (ещё, чёрный, идёт и др.), написанных через «е». Неоднозначные слова (например «все/всё») не трогаются.", "agentPrompt": "Русский промпт агента", "agentPromptDesc": "Добавляет в системный промпт инструкцию отвечать по-русски. Не по умолчанию.", "overridesCount": "Своих переопределений", "statusLoading": "Настройки загружаются…", "statusUnavailable": "Настройки недоступны на этом хосте", "hint": "Машинные переводы помечены в очереди выверки; ручная правка словарей приоритетна.", "altL": "Alt+L — конвертировать раскладку текущего поля"}
3656
3831
 
@@ -3755,39 +3930,12 @@ window.__ModuleLoader__.load({
3755
3930
  runtime.addLanguage({ id: 'ru', label: 'Русский', fallback: 'en' })
3756
3931
  syncLang()
3757
3932
 
3758
- // Хост-схема namespace "locale" знает только zh/en, запись preference
3759
- // "ru" он отклонит. Перехватываем её: выбор сохраняется нашим флагом
3760
- // russian-lang.enabled, остальные языки пишутся штатно.
3761
- //
3762
- // Кроме того, adopt() в ядре при каждом обновлении настроек возвращает
3763
- // активный язык к сохранённому preference (или языку браузера): он
3764
- // читает scope через getSnapshot. Пока активен русский, докладываем в
3765
- // снимок preference "ru", иначе любой settings-запись вернёт en.
3766
- const realHost = runtime.host
3767
- if (realHost) {
3768
- const origGetSnapshot = realHost.getSnapshot.bind(realHost)
3769
- const patchedGetSnapshot = () => {
3770
- const s = origGetSnapshot()
3771
- try {
3772
- if (runtime.getLocale().active === 'ru') {
3773
- return Object.assign({}, s, {
3774
- value: Object.assign({}, s && s.value ? s.value : {}, { preference: 'ru' })
3775
- })
3776
- }
3777
- } catch (err) { /* ignore */ }
3778
- return s
3779
- }
3780
- realHost.getSnapshot = patchedGetSnapshot
3781
- runtime.host = {
3782
- getSnapshot: patchedGetSnapshot,
3783
- subscribe: (fn) => realHost.subscribe(fn),
3784
- set: (field, value) => {
3785
- if (field === 'preference' && value === 'ru') return Promise.resolve()
3786
- return realHost.set(field, value)
3787
- },
3788
- unset: (field) => realHost.unset ? realHost.unset(field) : Promise.resolve()
3789
- }
3790
- }
3933
+ // Хост-monkey-patch (подмена runtime.host.getSnapshot/set ради
3934
+ // preference="ru") удалён: в DSH v0.1.2-alpha.2 settings пишется через
3935
+ // ctx.remote.settings.mutate, а adopt() читает preference из scope
3936
+ // snapshot напрямую. Подмена host конфликтовала с новой settings-mirror
3937
+ // и ломала запись namespace, из-за чего галочки не сохранялись. Выбор
3938
+ // языка держим своим russian-lang.enabled; включение делает tryBoot ниже.
3791
3939
  }
3792
3940
 
3793
3941
  // 3. Флаг russianLang.enabled всегда повторяет активный язык: выбор
@@ -3907,6 +4055,96 @@ window.__ModuleLoader__.load({
3907
4055
  }, 'dsh-russian-lang: spellcheck')
3908
4056
  syncSpell()
3909
4057
 
4058
+ // 5b. DOM-перевод панелей, игнорирующих locale-ядро. dsh-skill-hub
4059
+ // выбирает свой zh/en-словарь по documentElement.lang и умеет только эти
4060
+ // два языка; наш ru-словарь в его lookup не попадает. Эти строки
4061
+ // встречаются в DOM как готовый китайский текст, поэтому при активном
4062
+ // русском заменяем их по карте ZH_RU (собрана на сборке из zh-референса
4063
+ // плагина и нашего перевода по тем же ключам). Плейсхолдеры ({count} и
4064
+ // т.п.) к моменту рендера уже подставлены — шаблонные пары превращаем в
4065
+ // регексы, значения переносим в ru-шаблон. Реагируем на мутации DOM
4066
+ // (панель перерисовывается React'ом), при уходе с русского ничего не
4067
+ // восстанавливаем — панель сама перерисуется по новому lang.
4068
+ const ZH_CJK = /[\u3400-\u9fff\uf900-\ufaff]/
4069
+ const ZH_RE_ESC = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
4070
+ const ZH_EXACT = new Map()
4071
+ const ZH_PATTERNS = []
4072
+ for (const [zhText, ruText] of Object.entries(ZH_RU)) {
4073
+ if (typeof zhText !== 'string' || !ZH_CJK.test(zhText) || !ruText) continue
4074
+ if (/\{[a-zA-Z_]\w*\}/.test(zhText)) {
4075
+ const parts = zhText.split(/\{[a-zA-Z_]\w*\}/g)
4076
+ if (parts.some((p) => p.length === 0)) continue // якорь на соседние {} ненадёжен
4077
+ ZH_PATTERNS.push({ re: new RegExp(parts.map(ZH_RE_ESC).join('([\\s\\S]*?)')), ruParts: ruText.split(/\{[a-zA-Z_]\w*\}/g) })
4078
+ } else {
4079
+ ZH_EXACT.set(zhText, ruText)
4080
+ }
4081
+ }
4082
+ ZH_PATTERNS.sort((a, b) => b.re.source.length - a.re.source.length)
4083
+ const zhTranslateText = (text) => {
4084
+ if (!ZH_CJK.test(text)) return null
4085
+ const exact = ZH_EXACT.get(text)
4086
+ if (exact !== undefined) return exact
4087
+ for (const p of ZH_PATTERNS) {
4088
+ const m = p.re.exec(text)
4089
+ if (m && m[0] === text) {
4090
+ let out = p.ruParts[0]
4091
+ for (let i = 1; i < p.ruParts.length; i++) out += m[i] + p.ruParts[i]
4092
+ return out
4093
+ }
4094
+ }
4095
+ return null
4096
+ }
4097
+ const ZH_WALKER = (root) => {
4098
+ try {
4099
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)
4100
+ const hits = []
4101
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
4102
+ if (node.nodeValue && node.nodeValue.length >= 2 && ZH_CJK.test(node.nodeValue)) hits.push(node)
4103
+ }
4104
+ for (const node of hits) {
4105
+ const next = zhTranslateText(node.nodeValue)
4106
+ if (next) node.nodeValue = next
4107
+ }
4108
+ // title/placeholder/aria-label — атрибуты с пользовательским текстом.
4109
+ for (const el of root.querySelectorAll ? root.querySelectorAll('[title],[placeholder],[aria-label]') : []) {
4110
+ for (const attr of ['title', 'placeholder', 'aria-label']) {
4111
+ const v = el.getAttribute && el.getAttribute(attr)
4112
+ if (v && v.length >= 2 && ZH_CJK.test(v)) {
4113
+ const next = zhTranslateText(v)
4114
+ if (next) el.setAttribute(attr, next)
4115
+ }
4116
+ }
4117
+ }
4118
+ } catch (err) { /* ignore */ }
4119
+ }
4120
+ let zhObserver = null
4121
+ const syncZhDom = () => {
4122
+ try {
4123
+ if (typeof document === 'undefined') return
4124
+ const ru = runtime.getLocale().active === 'ru'
4125
+ if (!ru) {
4126
+ if (zhObserver) { zhObserver.disconnect(); zhObserver = null }
4127
+ return
4128
+ }
4129
+ if (!zhObserver) {
4130
+ zhObserver = new MutationObserver(() => {
4131
+ // Панель перерисовывается React'ом; обход после микрозадачи,
4132
+ // чтобы поймать уже вставленные узлы. Тяжёлых страниц мало —
4133
+ // ponytail: обход всего body, при тормозах ограничить секцией.
4134
+ queueMicrotask(() => { try { ZH_WALKER(document.body) } catch (err) { /* ignore */ } })
4135
+ })
4136
+ zhObserver.observe(document.body, { childList: true, subtree: true, characterData: true })
4137
+ }
4138
+ ZH_WALKER(document.body)
4139
+ } catch (err) { /* ignore */ }
4140
+ }
4141
+ const unsubscribeZh = runtime.subscribe(syncZhDom)
4142
+ ctx.effect(() => {
4143
+ unsubscribeZh()
4144
+ if (zhObserver) zhObserver.disconnect()
4145
+ }, 'dsh-russian-lang: zh-dom')
4146
+ syncZhDom()
4147
+
3910
4148
  // 6. Типографика (russian-lang.typography { enabled, yo }): постпроцессор
3911
4149
  // текстовых узлов при активном русском - ёлочки, тире, неразрывные
3912
4150
  // пробелы перед короткими словами, опционально ё (безопасный список).
@@ -4203,15 +4441,21 @@ window.__ModuleLoader__.load({
4203
4441
  } catch (err) { console.warn('dsh-russian-lang: settings slot unavailable', err) }
4204
4442
  }
4205
4443
 
4206
- // Карточка настроек: React-компонент вне apply (замыкание не нужно —
4207
- // зависимости приходят через props.inject).
4444
+ // Карточка настроек: React-компонент вне apply.
4445
+ // v0.1.2-alpha.2: раннер slot-registry вызывает entry.inject() и
4446
+ // РАЗВОРАЧИВАЕТ его результат прямо в props компонента
4447
+ // (props.scope / props.runtime / props.toggleRu) — так же, как ядро читает
4448
+ // props.save/props.edit в своих карточках. Формат props.inject() устарел:
4449
+ // на alpha.2 props.inject === undefined, поэтому scope был undefined и
4450
+ // scope.set падал ("Cannot read properties of undefined (reading 'set')").
4451
+ // Читаем новые props напрямую, с фолбэком на inject() для старых ядер.
4208
4452
  function SettingsCard(props) {
4209
- const src = typeof props.inject === 'function'
4453
+ const inj = typeof props.inject === 'function'
4210
4454
  ? (props.inject() || {})
4211
4455
  : (props.inject || {})
4212
- const scope = src.scope
4213
- const runtime = src.runtime
4214
- const toggleRu = src.toggleRu
4456
+ const scope = props.scope || inj.scope
4457
+ const runtime = props.runtime || inj.runtime
4458
+ const toggleRu = props.toggleRu || inj.toggleRu
4215
4459
  const t = typeof props.t === 'function' ? props.t : ((k) => k)
4216
4460
 
4217
4461
  const [open, setOpen] = React.useState(false)