@goodandready/dsh-russian-lang 0.3.6 → 0.3.8

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.
@@ -1 +1 @@
1
- {"dsh-task-tracker":{"board.back":"В чат","board.backHint":"Закрыть трекер задач и вернуться в чат","field.base":"URL сервера Task Tracker","field.filePath":"Пользовательский путь к файлу tasks.json (необязательно)","field.filePathPlaceholder":"~/.dsh/task-tracker/tasks.json","field.pass":"Пароль / Токен","field.passFile":"Путь к файлу пароля","field.user":"Пользователь","filePath":"Путь к файлу","loading":"Загрузка настроек трекера…","passHint":"Токен доступа к API Task Tracker","passPlaceholder":"Секретный токен","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","sessions":"Сессии","sub":"Интеграция с внутренним трекером задач и тикетов","subtitle":"API входящих задач (базовый URL и Basic-аутентификация)","tasks.active":"Активные","tasks.add":"+ Добавить","tasks.addTask":"+ Добавить задачу","tasks.all":"Все","tasks.backToChat":"К чату","tasks.cancel":"Отмена","tasks.changeIcon":"Сменить иконку","tasks.chatWithAgent":"Чат с агентом","tasks.close":"Закрыть","tasks.completed":"Выполнено","tasks.confirmDelete":"Удалить эту задачу?","tasks.create":"+ Создать","tasks.createFolder":"Создать папку","tasks.delete":"Удалить","tasks.descPlaceholder":"Подробное описание задачи…","tasks.description":"Описание","tasks.empty":"Задачи не найдены","tasks.emptyInFolder":"В папке нет задач ","tasks.folder":"Папка","tasks.folderBtn":"Папка","tasks.folders":"Папки","tasks.form.desc":"Описание","tasks.form.descPlaceholder":"Подробное описание задачи…","tasks.form.folder":"Папка","tasks.form.priority":"Приоритет","tasks.form.title":"Название","tasks.form.titlePlaceholder":"Название задачи","tasks.loadingTasks":"Загрузка задач…","tasks.markComplete":"Отметить как выполненную","tasks.markIncomplete":"Вернуть в работу","tasks.meta.author":"Автор:","tasks.meta.created":"Создано:","tasks.modal.title":"Задача","tasks.newFolderPrompt":"Название новой папки:","tasks.newPlaceholder":"Что нужно сделать?","tasks.newTask":"Новая задача","tasks.openAgentChat":"💬 Обсудить задачу с агентом","tasks.priority":"Приоритет","tasks.priority.high":"Высокий","tasks.priority.low":"Низкий","tasks.priority.medium":"Средний","tasks.priority.normal":"Обычный","tasks.priorityHigh":"Высокий","tasks.priorityLow":"Низкий","tasks.priorityMedium":"Средний","tasks.priorityNone":"Обычный","tasks.promptTemplate":"Шаблон промпта","tasks.quickAddPlaceholder":"Что нужно сделать? Нажмите Enter для добавления","tasks.search":"Поиск задач…","tasks.showAllFolders":"Показать все папки","tasks.startChatWithAgent":"💬 Начать чат с агентом","tasks.status":"Статус","tasks.status.completed":"Завершено","tasks.statusActive":"Активно","tasks.statusCompleted":"Выполнено","tasks.taskDetails":"Детали задачи","tasks.tasksCountSuffix":"задач","tasks.title":"Задачи","tasks.titleLabel":"Название *","title":"Трекер задач (Task Tracker)","unavailable":"Область настроек недоступна","updater.available":"Доступно обновление: v{v}","updater.checkFailed":"Не удалось проверить обновления","updater.checking":"Проверка обновлений…","updater.upToDate":"Актуальная версия","updater.updateFailed":"Ошибка при обновлении","updater.updateNow":"Обновить сейчас","updater.updated":"Успешно обновлено до v{v}. Перезапустите DSH для применения.","updater.updating":"Обновление…","updater.version":"Версия","userHint":"Логин сервисного аккаунта"}}
1
+ {"dsh-task-tracker":{"board.back":"В чат","board.backHint":"Закрыть трекер задач и вернуться в чат","field.base":"URL сервера Task Tracker","field.filePath":"Пользовательский путь к файлу tasks.json (необязательно)","field.filePathPlaceholder":"~/.dsh/task-tracker/tasks.json","field.pass":"Пароль / Токен","field.passFile":"Путь к файлу пароля","field.user":"Пользователь","filePath":"Путь к файлу","loading":"Загрузка настроек трекера…","passHint":"Токен доступа к API Task Tracker","passPlaceholder":"Секретный токен","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","sessions":"Сессии","sub":"Интеграция с внутренним трекером задач и тикетов","subtitle":"API входящих задач (базовый URL и Basic-аутентификация)","tasks.active":"Активные","tasks.add":"+ Добавить","tasks.addTask":"+ Добавить задачу","tasks.all":"Все","tasks.backToChat":"К чату","tasks.cancel":"Отмена","tasks.changeIcon":"Сменить иконку","tasks.chatWithAgent":"Чат с агентом","tasks.close":"Закрыть","tasks.completed":"Выполнено","tasks.confirmDelete":"Удалить эту задачу?","tasks.create":"+ Создать","tasks.createFolder":"Создать папку","tasks.delete":"Удалить","tasks.descPlaceholder":"Подробное описание задачи…","tasks.description":"Описание","tasks.empty":"Задачи не найдены","tasks.emptyInFolder":"В папке нет задач ","tasks.folder":"Папка","tasks.folderBtn":"Папка","tasks.folders":"Папки","tasks.form.desc":"Описание","tasks.form.descPlaceholder":"Подробное описание задачи…","tasks.form.folder":"Папка","tasks.form.priority":"Приоритет","tasks.form.title":"Название","tasks.form.titlePlaceholder":"Название задачи","tasks.loadingTasks":"Загрузка задач…","tasks.markComplete":"Отметить как выполненную","tasks.markIncomplete":"Вернуть в работу","tasks.meta.author":"Автор:","tasks.meta.created":"Создано:","tasks.modal.title":"Задача","tasks.newFolderPrompt":"Название новой папки:","tasks.newPlaceholder":"Что нужно сделать?","tasks.newTask":"Новая задача","tasks.openAgentChat":"💬 Обсудить задачу с агентом","tasks.priority":"Приоритет","tasks.priority.high":"Высокий","tasks.priority.low":"Низкий","tasks.priority.medium":"Средний","tasks.priority.normal":"Обычный","tasks.priorityHigh":"Высокий","tasks.priorityLow":"Низкий","tasks.priorityMedium":"Средний","tasks.priorityNone":"Обычный","tasks.promptTemplate":"Шаблон промпта","tasks.quickAddPlaceholder":"Что нужно сделать? Нажмите Enter для добавления","tasks.refresh":"Обновить","tasks.search":"Поиск задач…","tasks.showAllFolders":"Показать все папки","tasks.startChatWithAgent":"💬 Начать чат с агентом","tasks.status":"Статус","tasks.status.completed":"Завершено","tasks.statusActive":"Активно","tasks.statusCompleted":"Выполнено","tasks.taskDetails":"Детали задачи","tasks.tasksCountSuffix":"задач","tasks.title":"Задачи","tasks.titleLabel":"Название *","title":"Трекер задач (Task Tracker)","unavailable":"Область настроек недоступна","updater.available":"Доступно обновление: v{v}","updater.checkFailed":"Не удалось проверить обновления","updater.checking":"Проверка обновлений…","updater.upToDate":"Актуальная версия","updater.updateFailed":"Ошибка при обновлении","updater.updateNow":"Обновить сейчас","updater.updated":"Успешно обновлено до v{v}. Перезапустите DSH для применения.","updater.updating":"Обновление…","updater.version":"Версия","userHint":"Логин сервисного аккаунта"}}
@@ -1 +1 @@
1
- {"dsh-server-monitor":{"active":"Активен","add":"Добавить сервер","addServer":"Добавить сервер","address":"Адрес","architecture":"Архитектура","auth":"Способ аутентификации","available":"Доступно","cancel":"Отмена","checkUpdateFailed":"Сбой проверки","command":"Команда","confirmDelete":"Удалить этот профиль сервера?","connected":"В сети","containers":"Контейнеры","copied":"Скопировано!","copyInstallCmd":"Скопировать команду настройки сервера","cpu":"Процессор","delete":"Удалить","deleteServer":"Удалить профиль","disks":"Диски","editServer":"Редактировать сервер","error":"Ошибка","filesystem":"Файловая система","generateKey":"Сгенерировать SSH-ключ","generating":"Генерация…","guideDescription":"Мониторинг статуса Linux-серверов (только чтение)","host":"Хост","hostname":"Имя узла","image":"Образ","interface":"Сетевой интерфейс","keepSecret":"Оставьте поле пустым, чтобы сохранить текущее значение.","kernel":"Ядро","key":"Закрытый ключ","keyHint":"Ключ хранится только в хранилище этого плагина.","keyPath":"Путь к ключу","keygenSection":"Настройка SSH-ключа","load":"Средняя нагрузка","loading":"Загрузка…","memory":"Память","mount":"Точка монтирования","name":"Название","network":"Сеть","noServers":"Серверы не настроены.","noSnapshot":"Снимок состояния недоступен.","offline":"Не в сети","os":"Операционная система","partial":"Частично","passphrase":"Парольная фраза ключа","password":"Пароль","port":"Порт","ports":"Прослушиваемые порты","processes":"Наиболее ресурсоёмкие процессы","protocol":"Протокол","refresh":"Обновить","resources":"Ресурсы","rx":"Получено (RX)","save":"Сохранить сервер","saved":"Сохранено","saving":"Сохранение…","select":"Выберите сервер","servers":"Серверы","shareWorkspaceHint":"Сохранено в ~/.dsh/keys/id_ed25519_dsh (совместимо с Remote Workspace)","state":"Состояние","subtitle":"Состояние Linux-серверов — только для просмотра","swap":"Область подкачки","system":"Система","test":"Проверить подключение","testAfterInstall":"Команда выполнена — проверить подключение","testing":"Проверка подключения…","title":"Монитор серверов","tx":"Передано (TX)","unavailable":"Недоступно","upToDate":"Актуальная версия","updateAvailable":"Доступно обновление: v{v}","updateChecking":"Проверка обновлений…","updateFailed":"Сбой обновления: {msg}","updateNow":"Обновить сейчас","updateSuccess":"Обновлено до v{v}. Перезапустите сервис DSH для применения изменений.","updating":"Обновление…","uptime":"Время работы","used":"Использовано","username":"Имя пользователя","version":"Версия"}}
1
+ {"dsh-server-monitor":{"active":"Активен","add":"Добавить сервер","addServer":"Добавить сервер","address":"Адрес","allTags":"Все","architecture":"Архитектура","auth":"Способ аутентификации","available":"Доступно","cancel":"Отмена","checkUpdateFailed":"Сбой проверки","command":"Команда","confirmDelete":"Удалить этот профиль сервера?","connected":"В сети","containers":"Контейнеры","copied":"Скопировано!","copyInstallCmd":"Скопировать команду настройки сервера","cpu":"Процессор","delete":"Удалить","deleteServer":"Удалить профиль","diskPressure":"Файловая система заполнена больше чем на 85%","diskShort":"Диск","disks":"Диски","editServer":"Редактировать сервер","error":"Ошибка","filesystem":"Файловая система","generateKey":"Сгенерировать SSH-ключ","generating":"Генерация…","guideDescription":"Мониторинг статуса Linux-серверов (только чтение)","host":"Хост","hostname":"Имя узла","image":"Образ","importEmpty":"В SSH-конфиге нет хостов","importSelected":"Импортировать выбранные","importSsh":"Импорт из SSH-конфига","interface":"Сетевой интерфейс","keepSecret":"Оставьте поле пустым, чтобы сохранить текущее значение.","kernel":"Ядро","key":"Закрытый ключ","keyHint":"Ключ хранится только в хранилище этого плагина.","keyPath":"Путь к ключу","keygenSection":"Настройка SSH-ключа","lastError":"Последняя ошибка","latency":"Задержка","load":"Средняя нагрузка","loading":"Загрузка…","makeActive":"Сделать текущим","memory":"Память","memoryShort":"Память","monthTraffic":"Трафик за месяц","mount":"Точка монтирования","name":"Название","network":"Сеть","networkInterface":"Основной интерфейс","noHistory":"Истории пока нет","noServers":"Серверы не настроены.","noSnapshot":"Снимок состояния недоступен.","offline":"Не в сети","os":"Операционная система","partial":"Частично","passphrase":"Парольная фраза ключа","password":"Пароль","port":"Порт","ports":"Прослушиваемые порты","processes":"Наиболее ресурсоёмкие процессы","protocol":"Протокол","proxyJump":"Jump-хост (бастион)","refresh":"Обновить","resources":"Ресурсы","rx":"Получено (RX)","save":"Сохранить сервер","saved":"Сохранено","saving":"Сохранение…","search":"Поиск","select":"Выберите сервер","servers":"Серверы","shareWorkspaceHint":"Сохранено в ~/.dsh/keys/id_ed25519_dsh (совместимо с Remote Workspace)","shellLabel":"Удалённая оболочка","shellPosix":"POSIX (sh)","shellPowerShell":"PowerShell","state":"Состояние","subtitle":"Состояние Linux-серверов — только для просмотра","swap":"Область подкачки","system":"Система","tags":"Теги","terminal":"Терминал","terminalClose":"Закрыть","terminalFull":"На весь экран","terminalWindow":"Окно","test":"Проверить подключение","testAfterInstall":"Команда выполнена — проверить подключение","testing":"Проверка подключения…","title":"Монитор серверов","tx":"Передано (TX)","unavailable":"Недоступно","upToDate":"Актуальная версия","updateAvailable":"Доступно обновление: v{v}","updateChecking":"Проверка обновлений…","updateFailed":"Сбой обновления: {msg}","updateNow":"Обновить сейчас","updateSuccess":"Обновлено до v{v}. Перезапустите сервис DSH для применения изменений.","updating":"Обновление…","uptime":"Время работы","used":"Использовано","username":"Имя пользователя","version":"Версия"}}
@@ -1 +1 @@
1
- {"@goodandready/dsh-web-gateway":{"allowInternalUrls":"Разрешить внутренние URL для извлечения","allowInternalUrlsDesc":"Опасно: разрешает извлечение адресов, разрешающихся в loopback или приватные сети. Оставляйте выключенным без явной необходимости.","cacheTtlMs":"Время жизни кэша (мс)","cacheTtlMsDesc":"Срок хранения результатов в оперативной памяти. 0 отключает кэширование.","crawl4aiTokenEnv":"Имя учётных данных Crawl4AI","crawl4aiUrl":"Базовый URL Crawl4AI","crawl4aiUrlDesc":"Необязательный Crawl4AI для извлечения страниц. Пустое значение отключает его.","defaultLimit":"Лимит результатов по умолчанию","defaultLimitDesc":"Количество результатов по умолчанию для вызова web_gateway_search.","exaApiKeyEnv":"Имя учётных данных Exa","firecrawlApiKeyEnv":"Имя учётных данных Firecrawl","header_desc":"Резервный веб-поиск (Tavily → Firecrawl → Exa → SearXNG) и извлечение страниц при исчерпании лимитов встроенных web_search / web_fetch.","keysDesc":"Храните секретные значения в Настройки → Учётные данные под этими именами. Не вставляйте сами API-ключи сюда.","maxLimit":"Жёсткий лимит результатов","maxLimitDesc":"Максимальное количество результатов за один поисковый запрос.","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","searxngUrl":"Базовый URL SearXNG","searxngUrlDesc":"Необязательный локальный SearXNG (например http://127.0.0.1:8080). Пустое значение отключает этот резерв.","settings.loading":"Загрузка настроек Web Gateway…","settings.retry":"Повторить","settings.unavailable":"Область настроек недоступна (пространство имён хоста не готово).","subtitle":"Отказоустойчивая цепочка поиска и извлечения веб-страниц","tavilyApiKeyEnv":"Имя учётных данных Tavily","timeoutMs":"Таймаут провайдера (мс)","timeoutMsDesc":"HTTP-таймаут на одного провайдера в миллисекундах.","title":"Веб-шлюз (Web Gateway)","updater_check":"Проверить обновления","updater_checking":"Проверка…","updater_current":"Текущая","updater_failed":"Сбой проверки обновлений","updater_latest":"Последняя","updater_success":"Обновлено. Перезапустите DSH для загрузки новой версии.","updater_title":"Версия плагина","updater_unavailable":"Автоматическое обновление недоступно для этого профиля.","updater_up_to_date":"Актуальная версия","updater_update_now":"Обновить до {version}","updater_updating":"Обновление…"},"dsh-web-gateway":{"allowInternalUrls":"Разрешить внутренние URL для извлечения","allowInternalUrlsDesc":"Опасно: разрешает извлечение адресов, разрешающихся в loopback или приватные сети. Оставляйте выключенным без явной необходимости.","cacheTtlMs":"Время жизни кэша (мс)","cacheTtlMsDesc":"Срок хранения результатов в оперативной памяти. 0 отключает кэширование.","crawl4aiTokenEnv":"Имя учётных данных Crawl4AI","crawl4aiUrl":"Базовый URL Crawl4AI","crawl4aiUrlDesc":"Необязательный Crawl4AI для извлечения страниц. Пустое значение отключает его.","dailyCapCrawl4ai":"Дневной лимит: Crawl4AI","dailyCapExa":"Дневной лимит: Exa","dailyCapFirecrawl":"Дневной лимит: Firecrawl","dailyCapSearxng":"Дневной лимит: SearXNG","dailyCapTavily":"Дневной лимит: Tavily","dailyCapsDesc":"0 = без ограничений. Счётчики сбрасываются каждый календарный день по UTC.","defaultLimit":"Лимит результатов по умолчанию","defaultLimitDesc":"Количество результатов по умолчанию для вызова web_gateway_search.","diskCacheEnabled":"Дисковый кэш","diskCacheEnabledDesc":"Сохранять результаты в профиле DSH, чтобы кэш переживал перезапуски.","diskCacheMaxEntries":"Макс. записей дискового кэша","diskCacheMaxEntriesDesc":"Мягкий лимит на количество записей кэша на диске.","exaApiKeyEnv":"Имя учётных данных Exa","excludeDomains":"Исключить домены","excludeDomainsDesc":"Чёрный список доменов для результатов поиска через запятую.","extractProviderOrder":"Порядок провайдеров извлечения","extractProviderOrderDesc":"Порядок через запятую. Допустимо: firecrawl, tavily, crawl4ai.","firecrawlApiKeyEnv":"Имя учётных данных Firecrawl","freshness":"Свежесть","freshnessDesc":"any | day | week | month — применяется, если поддерживается провайдером.","header_desc":"Резервный веб-поиск (Tavily → Firecrawl → Exa → SearXNG) и извлечение страниц при исчерпании лимитов встроенных web_search / web_fetch.","health_caps":"Дневное использование","health_credentials":"Учётные данные","health_endpoints":"Локальные эндпоинты","health_error":"ошибка","health_failed":"Сбой проверки работоспособности","health_loading":"Проверка…","health_missing":"отсутствует","health_ok":"ок","health_present":"присутствует","health_refresh":"Обновить","health_skipped":"пропущено","health_title":"Состояние провайдеров","includeDomains":"Включить домены","includeDomainsDesc":"Белый список доменов для результатов поиска через запятую (пусто = все).","jinaEnabled":"Включить резервный Jina Reader","jinaEnabledDesc":"Бесключевое извлечение через r.jina.ai (соблюдайте их лимиты и правила).","keysDesc":"Храните секретные значения в Настройки → Учётные данные под этими именами. Не вставляйте сами API-ключи сюда.","maxLimit":"Жёсткий лимит результатов","maxLimitDesc":"Максимальное количество результатов за один поисковый запрос.","readabilityEnabled":"Включить резервный HTML Readability","readabilityEnabledDesc":"Резервное бесключевое извлечение путём очистки HTML-тегов.","researchDefaultLimit":"Источников для исследования по умолчанию","researchMaxChars":"Макс. символов сводки исследования","researchMaxLimit":"Макс. источников для исследования","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","searchProviderOrder":"Порядок провайдеров поиска","searchProviderOrderDesc":"Порядок через запятую. Допустимо: tavily, firecrawl, exa, searxng.","searxngUrl":"Базовый URL SearXNG","searxngUrlDesc":"Необязательный локальный SearXNG (например http://127.0.0.1:8080). Пустое значение отключает этот резерв.","settings.loading":"Загрузка настроек Web Gateway…","settings.retry":"Повторить","settings.unavailable":"Область настроек недоступна (пространство имён хоста не готово).","subtitle":"Отказоустойчивая цепочка поиска и извлечения веб-страниц","tavilyApiKeyEnv":"Имя учётных данных Tavily","timeoutMs":"Таймаут провайдера (мс)","timeoutMsDesc":"HTTP-таймаут на одного провайдера в миллисекундах.","title":"Веб-шлюз (Web Gateway)","updater_check":"Проверить обновления","updater_checking":"Проверка…","updater_current":"Текущая","updater_failed":"Сбой проверки обновлений","updater_latest":"Последняя","updater_success":"Обновлено. Перезапустите DSH для загрузки новой версии.","updater_title":"Версия плагина","updater_unavailable":"Автоматическое обновление недоступно для этого профиля.","updater_up_to_date":"Актуальная версия","updater_update_now":"Обновить до {version}","updater_updating":"Обновление…"}}
1
+ {"@goodandready/dsh-web-gateway":{"allowInternalUrls":"Разрешить внутренние URL для извлечения","allowInternalUrlsDesc":"Опасно: разрешает извлечение адресов, разрешающихся в loopback или приватные сети. Оставляйте выключенным без явной необходимости.","cacheTtlMs":"Время жизни кэша (мс)","cacheTtlMsDesc":"Срок хранения результатов в оперативной памяти. 0 отключает кэширование.","crawl4aiTokenEnv":"Имя учётных данных Crawl4AI","crawl4aiUrl":"Базовый URL Crawl4AI","crawl4aiUrlDesc":"Необязательный Crawl4AI для извлечения страниц. Пустое значение отключает его.","defaultLimit":"Лимит результатов по умолчанию","defaultLimitDesc":"Количество результатов по умолчанию для вызова web_gateway_search.","exaApiKeyEnv":"Имя учётных данных Exa","firecrawlApiKeyEnv":"Имя учётных данных Firecrawl","header_desc":"Резервный веб-поиск (Tavily → Firecrawl → Exa → SearXNG) и извлечение страниц при исчерпании лимитов встроенных web_search / web_fetch.","keysDesc":"Храните секретные значения в Настройки → Учётные данные под этими именами. Не вставляйте сами API-ключи сюда.","maxLimit":"Жёсткий лимит результатов","maxLimitDesc":"Максимальное количество результатов за один поисковый запрос.","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","searxngUrl":"Базовый URL SearXNG","searxngUrlDesc":"Необязательный локальный SearXNG (например http://127.0.0.1:8080). Пустое значение отключает этот резерв.","settings.loading":"Загрузка настроек Web Gateway…","settings.retry":"Повторить","settings.unavailable":"Область настроек недоступна (пространство имён хоста не готово).","subtitle":"Отказоустойчивая цепочка поиска и извлечения веб-страниц","tavilyApiKeyEnv":"Имя учётных данных Tavily","timeoutMs":"Таймаут провайдера (мс)","timeoutMsDesc":"HTTP-таймаут на одного провайдера в миллисекундах.","title":"Веб-шлюз (Web Gateway)","updater_check":"Проверить обновления","updater_checking":"Проверка…","updater_current":"Текущая","updater_failed":"Сбой проверки обновлений","updater_latest":"Последняя","updater_success":"Обновлено. Перезапустите DSH для загрузки новой версии.","updater_title":"Версия плагина","updater_unavailable":"Автоматическое обновление недоступно для этого профиля.","updater_up_to_date":"Актуальная версия","updater_update_now":"Обновить до {version}","updater_updating":"Обновление…"},"dsh-web-gateway":{"allowInternalUrls":"Разрешить внутренние URL для извлечения","allowInternalUrlsDesc":"Опасно: разрешает извлечение адресов, разрешающихся в loopback или приватные сети. Оставляйте выключенным без явной необходимости.","braveApiKeyEnv":"Имя учётных данных Brave","cacheTtlMs":"Время жизни кэша (мс)","cacheTtlMsDesc":"Срок хранения результатов в оперативной памяти. 0 отключает кэширование.","circuitBreakerThreshold":"Порог срабатывания предохранителя","circuitBreakerThresholdDesc":"Количество последовательных ошибок до временной приостановки провайдера (0 отключает).","compactExtract":"Компактное извлечение контента","compactExtractDesc":"Удалять уведомления о cookies, навигационный мусор и избыточное форматирование для экономии токенов.","crawl4aiTokenEnv":"Имя учётных данных Crawl4AI","crawl4aiUrl":"Базовый URL Crawl4AI","crawl4aiUrlDesc":"Необязательный Crawl4AI для извлечения страниц. Пустое значение отключает его.","dailyCapBrave":"Дневной лимит: Brave","dailyCapCrawl4ai":"Дневной лимит: Crawl4AI","dailyCapDuckduckgo":"Дневной лимит: DuckDuckGo","dailyCapExa":"Дневной лимит: Exa","dailyCapFirecrawl":"Дневной лимит: Firecrawl","dailyCapSearxng":"Дневной лимит: SearXNG","dailyCapTavily":"Дневной лимит: Tavily","dailyCapsDesc":"0 = без ограничений. Счётчики сбрасываются каждый календарный день по UTC.","defaultLimit":"Лимит результатов по умолчанию","defaultLimitDesc":"Количество результатов по умолчанию для вызова web_gateway_search.","diskCacheEnabled":"Дисковый кэш","diskCacheEnabledDesc":"Сохранять результаты в профиле DSH, чтобы кэш переживал перезапуски.","diskCacheMaxEntries":"Макс. записей дискового кэша","diskCacheMaxEntriesDesc":"Мягкий лимит на количество записей кэша на диске.","exaApiKeyEnv":"Имя учётных данных Exa","excludeDomains":"Исключить домены","excludeDomainsDesc":"Чёрный список доменов для результатов поиска через запятую.","extractProviderOrder":"Порядок провайдеров извлечения","extractProviderOrderDesc":"Порядок через запятую. Допустимо: firecrawl, tavily, crawl4ai.","firecrawlApiKeyEnv":"Имя учётных данных Firecrawl","freshness":"Свежесть","freshnessDesc":"any | day | week | month — применяется, если поддерживается провайдером.","header_desc":"Резервный веб-поиск (Tavily → Firecrawl → Exa → SearXNG) и извлечение страниц при исчерпании лимитов встроенных web_search / web_fetch.","health_caps":"Дневное использование","health_circuit_breaker":"Состояние предохранителя (Circuit Breaker)","health_credentials":"Учётные данные","health_endpoints":"Локальные эндпоинты","health_error":"ошибка","health_failed":"Сбой проверки работоспособности","health_loading":"Проверка…","health_missing":"отсутствует","health_ok":"ок","health_present":"присутствует","health_refresh":"Обновить","health_skipped":"пропущено","health_title":"Состояние провайдеров","includeDomains":"Включить домены","includeDomainsDesc":"Белый список доменов для результатов поиска через запятую (пусто = все).","jinaEnabled":"Включить резервный Jina Reader","jinaEnabledDesc":"Бесключевое извлечение через r.jina.ai (соблюдайте их лимиты и правила).","keysDesc":"Храните секретные значения в Настройки → Учётные данные под этими именами. Не вставляйте сами API-ключи сюда.","maxLimit":"Жёсткий лимит результатов","maxLimitDesc":"Максимальное количество результатов за один поисковый запрос.","readabilityEnabled":"Включить резервный HTML Readability","readabilityEnabledDesc":"Резервное бесключевое извлечение путём очистки HTML-тегов.","researchDefaultLimit":"Источников для исследования по умолчанию","researchMaxChars":"Макс. символов сводки исследования","researchMaxLimit":"Макс. источников для исследования","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","searchProviderOrder":"Порядок провайдеров поиска","searchProviderOrderDesc":"Порядок через запятую. Допустимо: tavily, firecrawl, exa, searxng.","searxngUrl":"Базовый URL SearXNG","searxngUrlDesc":"Необязательный локальный SearXNG (например http://127.0.0.1:8080). Пустое значение отключает этот резерв.","settings.loading":"Загрузка настроек Web Gateway…","settings.retry":"Повторить","settings.unavailable":"Область настроек недоступна (пространство имён хоста не готово).","subtitle":"Отказоустойчивая цепочка поиска и извлечения веб-страниц","tavilyApiKeyEnv":"Имя учётных данных Tavily","timeoutMs":"Таймаут провайдера (мс)","timeoutMsDesc":"HTTP-таймаут на одного провайдера в миллисекундах.","title":"Веб-шлюз (Web Gateway)","updater_check":"Проверить обновления","updater_checking":"Проверка…","updater_current":"Текущая","updater_failed":"Сбой проверки обновлений","updater_latest":"Последняя","updater_success":"Обновлено. Перезапустите DSH для загрузки новой версии.","updater_title":"Версия плагина","updater_unavailable":"Автоматическое обновление недоступно для этого профиля.","updater_up_to_date":"Актуальная версия","updater_update_now":"Обновить до {version}","updater_updating":"Обновление…"}}
@@ -0,0 +1 @@
1
+ {"dsh-smart-restart":{"delayMs":"Задержка перед перезапуском (мс)","delayMsHint":"Достаточно времени, чтобы ответ успел дойти до вызывающей стороны.","enabled":"Включено","enabledHint":"Регистрировать инструменты и проверять каждый запуск.","expectTools":"Требуемые инструменты (через запятую)","expectToolsHint":"Отсутствие инструмента делает вердикт запуска деградировавшим.","invalid":"Введите число, а не текст.","maxRestarts":"Лимит перезапусков","maxRestartsHint":"Отклонять перезапуск при превышении этого количества внутри окна.","restartMode":"Режим перезапуска","restartModeHint":"«kill» завершает процесс и доверяет перезапуск systemd (без привилегий); «systemctl» выполняет systemctl restart <unit>.","save":"Сохранить","saved":"Сохранено","stateDir":"Директория состояния","stateDirHint":"Внутри $DSH_HOME: маркер загрузки, намерение, последний отчёт, история.","summary":"Проверенный перезапуск: загрузка проверяется, вердикт возвращается в запросившую сессию, работа возобновляется.","target":"Куда отправлять отчёт","targetHint":"requester, primary или идентификатор сессии.","title":"Защита перезапуска","toolEnabled":"Предоставлять инструменты","toolEnabledHint":"dsh_restart и dsh_restart_status.","unavailable":"Служба настроек недоступна, форма не может быть сохранена прямо сейчас.","unit":"Юнит systemd","unitHint":"Если пусто — юнит определяется автоматически из cgroup процесса.","windowMs":"Окно мониторинга (мс)","windowMsHint":"Временное окно для защиты от циклических перезапусков."}}
package/lib/translator.js CHANGED
@@ -50,26 +50,26 @@ function isLoopback(value) {
50
50
  )
51
51
  }
52
52
 
53
+ export const TRANSLATOR_HEADER = 'x-dsh-translator'
54
+
53
55
  export function isTrustedTranslatorRequest(request) {
54
- if (request?.socket?.remoteAddress && !isLoopback(request.socket.remoteAddress)) {
55
- return false
56
- }
56
+ if (header(request, TRANSLATOR_HEADER) !== '1') return false
57
+ if (!isLoopback(request?.socket?.remoteAddress)) return false
57
58
  const site = header(request, 'sec-fetch-site')
58
- if (site !== undefined && site !== 'same-origin' && site !== 'none') {
59
- return false
60
- }
59
+ if (site !== undefined && site !== 'same-origin') return false
61
60
  const origin = header(request, 'origin')
62
61
  const host = header(request, 'host')
63
- if (origin !== undefined) {
64
- try {
65
- const url = new URL(origin)
66
- if (!isLoopback(url.hostname)) return false
67
- if (host && url.host !== host) return false
68
- } catch {
69
- return false
70
- }
62
+ if (origin === undefined || host === undefined) return false
63
+ try {
64
+ const url = new URL(origin)
65
+ return (
66
+ (url.protocol === 'http:' || url.protocol === 'https:') &&
67
+ isLoopback(url.hostname) &&
68
+ url.host === host
69
+ )
70
+ } catch {
71
+ return false
71
72
  }
72
- return true
73
73
  }
74
74
 
75
75
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Russian localization for DeepSeek Harness (DSH v0.1.7-rc.1+) web UI: adds Русский as native language option. 100.0% coverage across 11,295 keys (127 namespaces). Features full DSH v0.1.7-rc.1 core support (terminal, archive, command palette, Auto review, trajectory, PTC/Creator presets) and complete GoodAndReady plugin catalog (subscriptions, tts, image-gen, voice, key-limits, notify, commandcode, plugin-console).",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -15,9 +15,7 @@
15
15
  "bin",
16
16
  "cordis.patch.yml",
17
17
  "README.md",
18
- "README.ru.md",
19
- "LICENSE",
20
- "docs/media"
18
+ "LICENSE"
21
19
  ],
22
20
  "dsh": {
23
21
  "bundle": {
package/README.ru.md DELETED
@@ -1,194 +0,0 @@
1
- # 📦 @goodandready/dsh-russian-lang
2
-
3
- <div align="center">
4
-
5
- <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
-
7
- <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.3.6-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
- <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
- <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
- <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
- </p>
13
-
14
- <p align="center">
15
- <img src="https://img.shields.io/badge/DSH-v0.1.7--rc.1%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.7-rc.1+">
16
- <img src="https://img.shields.io/badge/Покрытие-100%25-10b981.svg?style=for-the-badge&labelColor=064e3b" alt="Покрытие 100%">
17
- <img src="https://img.shields.io/badge/Ключей_UI-8735-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="8735 ключей">
18
- <img src="https://img.shields.io/badge/Ручная_вычитка-100%25-0ea5e9.svg?style=for-the-badge&labelColor=082f49" alt="100% ручная вычитка">
19
- </p>
20
-
21
- <p align="center">
22
- <a href="https://goodandready.app/"><img src="https://img.shields.io/badge/Все_проекты_автора-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="Все проекты автора"></a>
23
- </p>
24
-
25
- <p align="center">
26
- <img src="docs/media/banner.jpg" alt="dsh-russian-lang hero banner" width="100%">
27
- </p>
28
-
29
- <table align="center">
30
- <tr>
31
- <td align="center">
32
- ⭐ <strong>Если вам нравится этот плагин, поставьте ему звезду на GitHub</strong> — это покажет мне, что плагин вам полезен, и будет мотивировать меня развивать его дальше.
33
- <br><br>
34
- 🐛 <strong>Если вы нашли баг или хотите предложить новый функционал</strong>, создайте issue на GitHub на любом языке — я рассмотрю ваше предложение и реализую полезные идеи в одной из следующих версий плагина.
35
- </td>
36
- </tr>
37
- </table>
38
-
39
- </div>
40
-
41
- ---
42
-
43
- ## ⚡ Обзор
44
-
45
- **`dsh-russian-lang`** — официальный, всеобъемлющий пакет русской локализации для веб-интерфейса [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh).
46
-
47
- Пакет не просто переводит интерфейс ядра и всех популярных плагинов экосистемы, но и добавляет интеллектуальные функции для комфортной русскоязычной работы: **100% ручная вычитка терминов**, **грамматические формы множественного числа (plural)**, автоматическую **расстановку экранной типографики** («ёлочки», длинные тире, неразрывные пробелы) и **исправление ошибочно набранного текста** на неверной раскладке по горячей клавише <kbd>Alt+L</kbd>.
48
-
49
- ```mermaid
50
- graph LR
51
- subgraph DSHCore [Ядро DeepSeek Harness]
52
- DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
53
- end
54
-
55
- subgraph TranslationLayer [Слой перевода и адаптации — 8735 ключей / 100% вычитано]
56
- Loader --> CoreDict[49 Пространств имён ядра DSH / 2146 ключей]
57
- Loader --> PluginDict[60+ Плагинов экосистемы DSH / 6589 ключей]
58
- Loader --> PluralEngine[Движок грамматических Plural-форм: 1/2/5]
59
- end
60
-
61
- subgraph SmartFeatures [Интеллектуальные модули]
62
- Loader --> Typo[Модуль типографики: кавычки-«ёлочки» и длинные тире]
63
- Loader --> LayoutFix[Детектор неверной раскладки + Hotkey Alt+L]
64
- Loader --> Spell[Активация русской проверки орфографии]
65
- Loader --> Overrides[Пользовательские переопределения ключей]
66
- end
67
-
68
- subgraph Result [Результат]
69
- CoreDict --> NativeUI[Нативный русский интерфейс]
70
- PluginDict --> NativeUI
71
- PluralEngine --> NativeUI
72
- Typo --> NativeUI
73
- LayoutFix --> NativeUI
74
- Spell --> NativeUI
75
- Overrides --> NativeUI
76
- end
77
-
78
- style DSHCore fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
79
- style TranslationLayer fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
80
- style SmartFeatures fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
81
- style Result fill:#181825,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4
82
- ```
83
-
84
- ---
85
-
86
- ## ✨ Полный обзор возможностей
87
-
88
- ### 1. 🌐 100% покрытие ядра DSH (49 Пространств имён, 2146 ключей)
89
- * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
90
- * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
91
- * **Трейсы рассуждений (`trajectory`)**: детальные шаги, параметры вызовов инструментов, временные метки и визуализация размышлений модели.
92
- * **Настройки ядра (`settings`, `common`, `settings.theme`)**: параметры подключения, горячие клавиши, системные уведомления, масштабирование шрифтов, модальные окна и подтверждения.
93
- * **Рабочие области (`workspace`, `subagent`)**: дерево файлов, управление контекстом, запуск и координация субагентов.
94
- * **Планировщик и инвентарь (`schedule.catalog`, `settings.pluginInventory`, `settings.plugins`)**: фоновые задания, периодичность, фильтры и каталог установленных плагинов.
95
- * **Права доступа и безопасность (`permission.access`, `plan`, `skill`)**: пресеты прав (полный доступ, только чтение, запись в рабочую область), выполнение планов и навыки.
96
-
97
- > **О качестве перевода.** Все **8735 ключей интерфейса (2146 ядра + 6589 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
98
-
99
- ### 2. 🧩 Встроенный перевод 60+ плагинов экосистемы DSH (6589 ключей)
100
- Локализация автоматически распространяется на все ключевые плагины экосистемы DeepSeek Harness:
101
- * **`dsh-session-control`** — расширенное управление сессиями: закрепление диалогов, архив по периодам, просмотр расшифровок и фильтрация шума;
102
- * **`dsh-kanban` и `task-board`** — канбан-доски задач, карточки, чек-листы, дедлайны, критерии готовности (DoD) и шлюз приёмки (Acceptance Gate);
103
- * **`dsh-cost-meter`** — учёт стоимости токенов, калькуляция расходов и тарифные сетки моделей в реальном времени;
104
- * **`dsh-goal`** — автономный целеполагающий агент с безопасным циклом и рефлексией;
105
- * **`dsh-moa`** — многоагентная архитектура Mixture-of-Agents;
106
- * **`dsh-context-lens` и `dsh-context`** — визуализатор и оптимизатор контекста, аналитика токенов и сжатие;
107
- * **`dsh-time-machine`** — снимки рабочей области и откат состояний файлов;
108
- * **`dsh-shadow-auditor`** — теневой аудит изменений и безопасность;
109
- * **`dsh-cron` и `schedule.catalog`** — планировщик периодических cron-задач;
110
- * **`dsh-clinebot` и `im-hub`** — интеграции и шлюзы для Telegram, Discord, Slack;
111
- * **`dsh-subscriptions`** — управление персональными подписками на модели;
112
- * **`dsh-voice` и `dsh-tts`** — распознавание речи и голосовое озвучивание;
113
- * **`dsh-image-gen`** — генерация изображений;
114
- * **`dsh-lanmode`** — сетевой доступ по локальной сети и генерация TLS-сертификатов;
115
- * **`dsh-model-sync`** — синхронизация моделей и эндпоинтов;
116
- * **`dsh-usage-guard` и `token-dashboard`** — контроль лимитов и аналитика расходов токенов;
117
- * **`skills-manager` и `dsh-skill-hub`** — менеджер навыков агента и витрина способностей;
118
- * **`commandcode` и `settings.commandcode`** — провайдеры команд и аккаунты;
119
- * **`better-sidebar`, `better-input`, `opencode-palette`, `context-doctor`, `plugin-store`, `autoReview`** и др.
120
-
121
- ### 3. 🔢 Русские грамматические формы числительных (Plural)
122
- Английский язык различает только `1` и `other`. Русский язык требует 3 грамматические формы числительных (`1 файл`, `2 файла`, `5 файлов` / `1 секунда`, `3 секунды`, `10 секунд`). Движок локализации автоматически подставляет правильные окончания в зависимости от числового значения.
123
-
124
- ### 4. ✍️ Интеллектуальный модуль типографики (`russian-lang.typography`)
125
- Автоматически приводит тексты сообщений и описаний к правилам русской экранной типографики:
126
- * Заменяет прямые "лапки" на правильные кавычки-«ёлочки» (а вложенные — на „лапки“);
127
- * Заменяет дефисы между словами на длинные тире (—);
128
- * Добавляет неразрывные пробелы после коротких союзов и предлогов, предотвращая висячие строки;
129
- * **Безопасность кода**: типографика строго изолирована и никогда не затрагивает блоки исходного кода, формулы LaTeX и моноширинные поля ввода.
130
-
131
- ### 5. ⌨️ Исправление ошибочной раскладки клавиатуры (<kbd>Alt+L</kbd>)
132
- Если вы забыли переключить раскладку и набрали текст латиницей (например, `ghjtrn d gzkmt` вместо `проект в пальто`), плагин мгновенно:
133
- * Определяет ошибочный ввод в реальном времени;
134
- * Показывает ненавязчивую плавающую подсказку над полем ввода;
135
- * При нажатии горячей клавиши <kbd>Alt+L</kbd> мгновенно конвертирует набранный текст в правильную кириллицу.
136
-
137
- ### 6. 🔍 Интерактивный Инспектор перевода и живые оверрайды (<kbd>Alt+Click</kbd> / <kbd>Alt+I</kbd>)
138
- Мощный встроенный инструмент для инспекции строк интерфейса и мгновенного редактирования переводов на лету:
139
- * **Точечная инспекция (<kbd>Alt+Click</kbd>)**: зажмите клавишу <kbd>Alt</kbd> и кликните по любому элементу интерфейса (кнопке, пункту меню, лейблу), чтобы открыть модальное окно инспектора.
140
- * **Постоянный режим (<kbd>Alt+I</kbd>)**: переключает интерфейс в интерактивный режим исследования — наведение курсора подсвечивает элементы аккуратной рамкой с бейджем источника (`Core`, `Plugin`, `DOM`, `Untranslated`), а в правом нижнем углу экрана отображается плавающий статус-виджет с кнопкой быстрого выхода.
141
- * **Модальное окно инспектора**:
142
- * Точное определение системного ключа, пространства имён и типа источника.
143
- * Быстрое копирование ключа или готового стандартизированного Markdown-сниппета для баг-репорта в 1 клик.
144
- * Поле ввода собственного перевода (оверрайда) с кнопкой **«Применить»**: мгновенно изменяет текст в DOM и сохраняет оверрайд в настройки (`russian-lang.overrides`) без перезагрузки страницы. Все аналогичные элементы интерфейса обновляются автоматически.
145
- * Кнопка **«Сбросить»** для мгновенного отката к стандартному словарному переводу.
146
- * **Управление в карточке настроек (Раздел 4.5)**:
147
- * Кнопка быстрого включения/выключения инспектора (<kbd>Alt+I</kbd>).
148
- * Кнопки **«Экспорт JSON»** и **«Импорт JSON»** для резервного копирования, переноса и синхронизации списка ваших оверрайдов между браузерами и рабочими профилями.
149
-
150
- ### 7. ⚡ Оптимизации производительности и архитектурная безопасность
151
- * **Пакетная обработка MutationObserver**: оптимизированный наблюдатель мутаций интерфейса с адаптивным debounce (16 мс) предотвращает лавинообразные перерисовки и перерасчёт макета (reflow) при интенсивном рендеринге списков и стриминге LLM-токенов.
152
- * **Защита HTTP-маршрутов словарей (405 Method Not Allowed)**: серверные эндпоинты `/dict/core`, `/dict/plugins`, `/dict/all`, `/dict/search` строго защищены и принимают только безопасные методы GET/HEAD.
153
- * **Клиентский бандл с запасом**: оптимизированная архитектура и компактный бутстрап обеспечивают размер клиентского скрипта 153.7 KiB (запас более 10 KiB до предельного лимита).
154
-
155
- ### 8. 🔤 Нативная интеграция в ядро
156
- Плагин нативно регистрирует пункт **«Русский»** в меню **Настройки → Общие → Язык**, переключает атрибут `<html lang="ru-RU">` и активирует встроенный браузерный словарь проверки орфографии (`spellcheck`).
157
-
158
- ---
159
-
160
- ## 📦 Установка
161
-
162
- ```bash
163
- dsh plugin --profile web add @goodandready/dsh-russian-lang
164
- ```
165
-
166
- После установки откройте веб-интерфейс, перейдите в **Настройки → Общие → Язык**, выберите **«Русский»** и обновите страницу.
167
-
168
- ---
169
-
170
- ## ⚙️ Параметры конфигурации (`settings.yaml`)
171
-
172
- Пространство настроек — `russian-lang`. Схема объявлена в [`lib/index.js`](lib/index.js),
173
- все поля необязательные:
174
-
175
- ```yaml
176
- russian-lang:
177
- enabled: true # Русский язык интерфейса
178
- typography:
179
- enabled: true # Ёлочки, длинные тире, неразрывные пробелы
180
- yo: false # Восстанавливать «ё» (по умолчанию выключено)
181
- agentPrompt: false # Просить агента отвечать по-русски
182
- overrides: {} # Свои значения для любых ключей перевода
183
- ```
184
-
185
- Проще то же самое — в **Настройки → Плагины → Русская локализация**.
186
-
187
- Исправление раскладки (<kbd>Alt+L</kbd>) и браузерный спелчек включаются вместе с
188
- русским языком и отдельных ключей не имеют.
189
-
190
- ---
191
-
192
- ## 📄 Лицензия
193
-
194
- MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
Binary file