@goodandready/dsh-russian-lang 0.3.9 → 0.3.11
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/README.md +9 -9
- package/lib/client.js +179 -457
- package/lib/client.template.js +50 -145
- package/lib/locales/core.json +1 -1
- package/lib/locales/plugins/46-memory-brain.json +1 -1
- package/lib/locales/plugins/53-remote-workspace.json +1 -1
- package/lib/locales/plugins/68-image-gen.json +1 -1
- package/lib/translator.js +46 -13
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"@goodandready-private/dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain"},"@goodandready/dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain"},"dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain"}}
|
|
1
|
+
{"@goodandready-private/dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.showMemoryIndicator":"Показывать индикатор памяти в ответах","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","memory.chip":"память","memory.chip.close":"Закрыть","memory.chip.copied":"Скопировано","memory.chip.copy":"Копировать","memory.chip.title":"Память, использованная в этом ответе","memory.chip.unavailable":"память недоступна","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain","update.action":"Обновить сейчас","update.autoOff":"Автоматическое обновление недоступно в этой среде; выполните обновление через стандартный интерфейс DSH.","update.available":"Доступна версия {version}","update.checking":"Проверка наличия обновлений…","update.failed":"Ошибка обновления: {error}","update.restart":"Обновлено до {version}. Перезапустите веб-профиль DSH, чтобы применить изменения.","update.title":"Версия плагина","update.unavailable":"Не удалось проверить реестр пакетов.","update.upToDate":"Установлена актуальная версия","update.working":"Обновление…"},"@goodandready/dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain"},"dsh-memory-brain":{"field.autoInject":"Автоматически добавлять воспоминания в контекст каждого хода","field.base":"Базовый URL memory-brain","field.checkpointBanking":"Сохранять в память контекст перед сжатием","field.includeNeighbors":"Включать соседние воспоминания (граф)","field.minRecallChars":"Мин. длина для инъекции (символов)","field.neighborK":"Количество соседних воспоминаний","field.predictionLoop":"Цикл прогнозирования контекста","field.recallBudget":"Бюджет воспоминаний (символов)","field.timeoutMs":"Таймаут HTTP (мс)","field.token":"Имя переменной токена / учётных данных","hint.token":"Никогда не вставляйте сам токен — только имя учётных данных или переменной окружения (по умолчанию MEMORY_BRAIN_TOKEN).","intro":"Укажите базовый URL сервиса memory-brain. Сохраните токен API в учётных данных (или переменных окружения) и введите только имя ниже.","save":"Сохранить","saved":"Настройки сохранены","settings.loading":"Загрузка настроек…","settings.save":"Сохранить","settings.saveFailed":"Ошибка сохранения: ","settings.saved":"Настройки сохранены","settings.saving":"Сохранение…","settings.unavailable":"Область настроек недоступна для этого плагина.","subtitle":"Долгосрочная память (recall / remember) через HTTP API memory-brain","title":"Memory Brain"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"dsh-remote-workspace":{"actionsCol":"Действия","activeBadge":"Активен","addBtn":"+ Добавить хост","alertLabel":"Оповещения ({count})","autoSyncDesc":"Автоматически отправлять изменённые файлы в удалённое рабочее пространство при локальном сохранении.","autoSyncTitle":"Автосинхронизация при сохранении","badgeKey":"🔑 Вход по ключу","badgeOffline":"Хост не выбран","badgeOnline":"Активный хост: {name} ({latency} мс)","badgePassword":"🔒 Вход по паролю","badgeTunnels":"Туннелей: {count}","btnBrowse":"📁 Выбрать на сервере…","btnCancel":"Отмена","btnDelete":"Удалить","btnImportSsh":"Импорт из ~/.ssh/config","btnLogs":"Логи","btnRestart":"Перезапустить","btnSave":"Сохранить профиль","btnSaveFile":"Сохранить изменения","btnSelectThis":"Выбрать эту папку","btnStop":"Остановить","btnTest":"⚡ Проверить связь (Ping)","btnTransfer":"Передать на хост…","containerImage":"Образ","containerName":"Контейнер","containerPorts":"Порты","containerStatus":"Статус","containersTitle":"Удалённый Docker / Podman Engine","delBtn":"Удалить","delConfirm":"Удалить профиль хоста «{name}»?","diagDesc":"Проверка доступности и измерение задержки активного сервера.","diagProbeBtn":"⚡ Быстрая диагностика","diagTitle":"📊 Диагностика активного подключения","diagnoseDisk":"Использование диска","diagnoseOom":"Проверка OOM Killer","diagnosePorts":"Открытые порты","diagnoseTitle":"Экспресс-диагностика","editBtn":"Изменить","envHideVal":"Скрыть","envKey":"Ключ","envSaveVar":"Сохранить","envShowVal":"Показать","envTitle":"Удалённые переменные окружения (.env)","envVal":"Значение","explorerTitle":"Удалённый файловый менеджер","fAuthKey":"SSH-ключ","fAuthPass":"Пароль","fAuthType":"Способ авторизации","fHost":"Хост / IP-адрес","fJumpHost":"Jump-хост (бастион)","fJumpHostNone":"Прямое подключение (без jump-хоста)","fKeyPath":"Путь к ключу","fKeyPathHint":"Путь к ~/.ssh/id_rsa или /home/user/.ssh/id_ed25519","fLocalMirror":"Локальная папка зеркала","fLocalMirrorHint":"Локальная директория для зеркалирования файлов при быстрой трёхсторонней синхронизации","fName":"Название подключения","fPassphrase":"Кодовая фраза ключа (если есть)","fPassword":"Пароль учетной записи","fPort":"Порт","fRemotePath":"Удалённая папка проекта","fRemotePathHint":"(Не обязательно сейчас — можно выбрать позже при работе)","fUser":"Имя пользователя","filePreviewTitle":"Просмотр файла: {path}","fileSaved":"Файл успешно сохранён.","fileSize":"{size} КБ","formTitleEdit":"Редактирование профиля хоста","formTitleNew":"Добавление нового SSH хоста","healthCpu":"ЦП: {val}%","healthDisk":"Диск: {val}%","healthMem":"ОЗУ: {val}% ({used}/{total} МБ)","healthUptime":"Аптайм: {val}","hostCol":"Хост / Пользователь","nameCol":"Имя","noContainers":"Активных контейнеров не найдено или демон Docker не запущен.","noHosts":"Удалённые хосты ещё не настроены. Нажмите «+ Добавить хост».","openLocalLink":"🌐 Открыть локальный порт","pathCol":"Удалённый путь","pinBtn":"Закрепить активный","pinned":"Активный хост","portCol":"Порт","profilesDesc":"Настройка удалённых хостов для выполнения команд, SFTP доступа и синхронизации.","profilesTitle":"🖥️ Профили SSH серверов","pullBtn":"⬇️ Скачать с сервера (Pull)","pulling":"Получение файлов…","pushBtn":"⬆️ Загрузить на сервер (Push)","pushing":"Отправка файлов…","saving":"Сохранение…","setActiveBtn":"Сделать активным","status":"Готово","subtitle":"Управление подключениями по SSH, синхронизацией SFTP и туннелями","syncConflict":"Предупреждение о конфликте: изменено с обеих сторон файлов — {count}.","syncDesc":"Ручная синхронизация файлов с удалённым сервером и статус проброса портов.","syncErr":"Ошибка синхронизации: {err}","syncFailed":"Ошибка синхронизации: ","syncOk":"Синхронизация завершена! Обновлено файлов: {count}.","syncSuccess":"Синхронизация успешно выполнена","syncTitle":"🔄 Синхронизация зеркала и туннели","tLocalPort":"Локальный порт","tNoTunnels":"Нет активных туннелей проброса портов.","tOpenBtn":"+ Открыть туннель","tOpenErr":"Не удалось открыть туннель: {err}","tOpenOk":"Туннель открыт: 127.0.0.1:{localPort} -> Удалённый:{remotePort}","tOpening":"Открытие…","tRemotePort":"Удалённый порт","tStopBtn":"Остановить","tabContainers":"🐳 Контейнеры","tabEnv":"🗃️ Менеджер .env","tabExplorer":"📂 Проводник файлов","tabProfiles":"🖥️ Профили хостов","tabSync":"🔄 Станция синхронизации","tabTerminal":"⚡ Веб-терминал","tabTunnels":"🔗 Порт-туннели","tarSyncFast":"🚀 Быстрый поток архива (Tarball Stream)","termClear":"Очистить","termConnected":"Подключено к PTY-сессии {id} на {host}","termDisconnected":"Терминал отключён.","termPlaceholder":"Введите команду и нажмите Enter (напр. htop, ls, docker ps)…","termStart":"Подключить терминал","termStop":"Отключить","testFail":"❌ Ошибка подключения: {err}","testOk":"✅ Соединение установлено! Задержка: {latency} мс | ОС: {os}","testing":"Проверка соединения…","title":"Удалённое рабочее пространство","transferBtnExec":"Передать напрямую","transferDestHost":"Целевой сервер","transferDestPath":"Целевой путь к файлу","transferSuccess":"Успешно передано {bytes} байт на {host}:{path}","transferTitle":"Прямая передача сервер-сервер","tunnelTraffic":"Вход: {rx} | Выход: {tx}","tunnelUptime":"Работает: {sec} с","tunnelsColActions":"Действия","tunnelsColId":"ID туннеля","tunnelsColRoute":"Маршрут проброса","tunnelsDesc":"Проброс удалённых портов (базы данных, веб-серверы, API) на локальный компьютер через зашифрованные SSH-туннели.","tunnelsTitle":"🔀 Проброс портов SSH (туннели)","vaultProtectedBadge":"🛡️ Защищено .env Vault"}}
|
|
1
|
+
{"dsh-remote-workspace":{"actionsCol":"Действия","activeBadge":"Активен","addBtn":"+ Добавить хост","alertLabel":"Оповещения ({count})","autoSyncDesc":"Автоматически отправлять изменённые файлы в удалённое рабочее пространство при локальном сохранении.","autoSyncTitle":"Автосинхронизация при сохранении","badgeKey":"🔑 Вход по ключу","badgeOffline":"Хост не выбран","badgeOnline":"Активный хост: {name} ({latency} мс)","badgePassword":"🔒 Вход по паролю","badgeTunnels":"Туннелей: {count}","btnBrowse":"📁 Выбрать на сервере…","btnCancel":"Отмена","btnDelete":"Удалить","btnImportSsh":"Импорт из ~/.ssh/config","btnLogs":"Логи","btnRestart":"Перезапустить","btnSave":"Сохранить профиль","btnSaveFile":"Сохранить изменения","btnSelectThis":"Выбрать эту папку","btnStop":"Остановить","btnTest":"⚡ Проверить связь (Ping)","btnTransfer":"Передать на хост…","clusterCommand":"Команда","clusterCount":"Настроено серверов: {count}","clusterFail":"ошибка","clusterOk":"успешно","clusterRun":"Выполнить","clusterRunning":"Выполняется...","containerImage":"Образ","containerName":"Контейнер","containerPorts":"Порты","containerStatus":"Статус","containersTitle":"Удалённый Docker / Podman Engine","delBtn":"Удалить","delConfirm":"Удалить профиль хоста «{name}»?","diagDesc":"Проверка доступности и измерение задержки активного сервера.","diagProbeBtn":"⚡ Быстрая диагностика","diagTitle":"📊 Диагностика активного подключения","diagnoseDisk":"Использование диска","diagnoseOom":"Проверка OOM Killer","diagnosePorts":"Открытые порты","diagnoseTitle":"Экспресс-диагностика","editBtn":"Изменить","envHideVal":"Скрыть","envKey":"Ключ","envSaveVar":"Сохранить","envShowVal":"Показать","envTitle":"Удалённые переменные окружения (.env)","envVal":"Значение","explorerTitle":"Удалённый файловый менеджер","fAgentPath":"Сокет агента","fAgentPathHint":"Оставьте пустым для использования SSH_AUTH_SOCK. В Windows используйте pageant.","fAuthAgent":"SSH Agent","fAuthAgentShort":"агент","fAuthKey":"SSH-ключ","fAuthKeyShort":"ключ","fAuthPass":"Пароль","fAuthPassShort":"пароль","fAuthType":"Способ авторизации","fDescription":"Описание","fEnvironment":"Окружение","fHost":"Хост / IP-адрес","fJumpHost":"Jump-хост (бастион)","fJumpHostNone":"Прямое подключение (без jump-хоста)","fJumpHosts":"Jump-хосты","fJumpHostsHint":"ID профилей по порядку через запятую. Первый хост — входной бастион.","fKeyPath":"Путь к ключу","fKeyPathHint":"Путь к ~/.ssh/id_rsa или /home/user/.ssh/id_ed25519","fLocalMirror":"Локальная папка зеркала","fLocalMirrorHint":"Локальная директория для зеркалирования файлов при быстрой трёхсторонней синхронизации","fLocation":"Локация","fName":"Название подключения","fPassphrase":"Кодовая фраза ключа (если есть)","fPassword":"Пароль учетной записи","fPort":"Порт","fProxyCommand":"Proxy-команда","fProxyCommandHint":"OpenSSH ProxyCommand. Заполнители: %h хост, %p порт, %r пользователь, %n имя профиля.","fRemotePath":"Удалённая папка проекта","fRemotePathHint":"(Не обязательно сейчас — можно выбрать позже при работе)","fTags":"Теги","fTerminalFont":"Шрифт терминала","fTerminalFontHint":"Семейство шрифтов для терминала. Оставьте пустым для моноширинного стека по умолчанию.","fUser":"Имя пользователя","filePreviewTitle":"Просмотр файла: {path}","fileSaved":"Файл успешно сохранён.","fileSize":"{size} КБ","formTitleEdit":"Редактирование профиля хоста","formTitleNew":"Добавление нового SSH хоста","groupEnvironment":"По окружению","groupFlat":"Сплошной список","groupOffline":"не в сети: {err}","groupOnline":"в сети, {latency} мс","groupTag":"По тегам","groupUngrouped":"Без группы","healthCpu":"ЦП: {val}%","healthDisk":"Диск: {val}%","healthMem":"ОЗУ: {val}% ({used}/{total} МБ)","healthUptime":"Аптайм: {val}","hostCol":"Хост / Пользователь","importAdded":"Импортировано серверов: {count}.","nameCol":"Имя","navLabel":"Удаленные серверы","noContainers":"Активных контейнеров не найдено или демон Docker не запущен.","noHosts":"Удалённые хосты ещё не настроены. Нажмите «+ Добавить хост».","openLocalLink":"🌐 Открыть локальный порт","pathCol":"Удалённый путь","pinBtn":"Закрепить активный","pinned":"Активный хост","portCol":"Порт","profilesDesc":"Настройка удалённых хостов для выполнения команд, SFTP доступа и синхронизации.","profilesTitle":"🖥️ Профили SSH серверов","pullBtn":"⬇️ Скачать с сервера (Pull)","pulling":"Получение файлов…","pushBtn":"⬆️ Загрузить на сервер (Push)","pushing":"Отправка файлов…","saving":"Сохранение…","setActiveBtn":"Сделать активным","status":"Готово","subtitle":"Управление подключениями по SSH, синхронизацией SFTP и туннелями","syncConflict":"Предупреждение о конфликте: изменено с обеих сторон файлов — {count}.","syncDesc":"Ручная синхронизация файлов с удалённым сервером и статус проброса портов.","syncErr":"Ошибка синхронизации: {err}","syncFailed":"Ошибка синхронизации: ","syncOk":"Синхронизация завершена! Обновлено файлов: {count}.","syncSuccess":"Синхронизация успешно выполнена","syncTitle":"🔄 Синхронизация зеркала и туннели","tLocalPort":"Локальный порт","tNoTunnels":"Нет активных туннелей проброса портов.","tOpenBtn":"+ Открыть туннель","tOpenErr":"Не удалось открыть туннель: {err}","tOpenOk":"Туннель открыт: 127.0.0.1:{localPort} -> Удалённый:{remotePort}","tOpening":"Открытие…","tRemotePort":"Удалённый порт","tStopBtn":"Остановить","tabContainers":"🐳 Контейнеры","tabEnv":"🗃️ Менеджер .env","tabExplorer":"📂 Проводник файлов","tabProfiles":"🖥️ Профили хостов","tabSync":"🔄 Станция синхронизации","tabTerminal":"⚡ Веб-терминал","tabTunnels":"🔗 Порт-туннели","tarSyncFast":"🚀 Быстрый поток архива (Tarball Stream)","termClear":"Очистить","termConnected":"Подключено к PTY-сессии {id} на {host}","termDisconnected":"Терминал отключён.","termPlaceholder":"Введите команду и нажмите Enter (напр. htop, ls, docker ps)…","termStart":"Подключить терминал","termStop":"Отключить","testFail":"❌ Ошибка подключения: {err}","testOk":"✅ Соединение установлено! Задержка: {latency} мс | ОС: {os}","testing":"Проверка соединения…","title":"Удалённое рабочее пространство","transferBtnExec":"Передать напрямую","transferDestHost":"Целевой сервер","transferDestPath":"Целевой путь к файлу","transferSuccess":"Успешно передано {bytes} байт на {host}:{path}","transferTitle":"Прямая передача сервер-сервер","tunnelTraffic":"Вход: {rx} | Выход: {tx}","tunnelUptime":"Работает: {sec} с","tunnelsColActions":"Действия","tunnelsColId":"ID туннеля","tunnelsColRoute":"Маршрут проброса","tunnelsDesc":"Проброс удалённых портов (базы данных, веб-серверы, API) на локальный компьютер через зашифрованные SSH-туннели.","tunnelsTitle":"🔀 Проброс портов SSH (туннели)","vaultProtectedBadge":"🛡️ Защищено .env Vault"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"dsh-image-gen":{"card.actionRemoveBg":"Удалить фон","card.actionReroll":"Перегенерировать","card.actionUpscale":"Увеличить разрешение","card.copyPrompt":"Скопировать промпт","card.failed":"Ошибка генерации","card.generating":"Генерация изображения…","card.image":"Результат Image Studio","card.origPrompt":"Исходный промпт","card.remix":"Ремикс","card.removeBg":"Удалить фон","card.reroll":"Перегенерировать","card.responsiveTabs":"Адаптивные экраны","card.seedPrefix":"Seed","card.sizePrefix":"Size","card.toolCall":"Вызов генерации изображения","card.unknownError":"An unknown error occurred during generation.","card.upscale":"Увеличить","card.vary":"Вариация","diagnostics.desc":"Быстрая проверка статуса подключения и задержки выбранного API сервиса генерации.","diagnostics.ready":"В норме","diagnostics.test":"Проверить подключение","diagnostics.testing":"Проверка...","diagnostics.title":"Диагностика подключения провайдера","f.apiKeyEnv":"Ссылка на ключ FAL","f.apiKeyEnvHint":"Имя записи в хранилище учётных данных, содержащей API-ключ FAL.","f.autoEnhancePrompt":"Auto Enhance Prompt","f.autoEnhancePromptHint":"Enrich prompts with photography, lighting, and composition quality tokens.","f.baseURL":"Базовый URL FAL","f.baseURLHint":"Эндпоинт сервиса очередей FAL.","f.cacheByPrompt":"Cache by Prompt Only","f.cacheByPromptHint":"Reuse existing result if the prompt has already been generated.","f.cacheBySeed":"Cache by Seed + Prompt","f.cacheBySeedHint":"Reuse existing result if the exact same seed and prompt are requested.","f.cacheTtlDays":"Cache Retention (Legacy)","f.cacheTtlDaysHint":"Legacy name for retention period in days.","f.customBaseURL":"Пользовательский базовый URL API","f.customBaseURLHint":"Корень OpenAI-совместимого эндпоинта изображений (например https://api.openai.com/v1).","f.customKeyEnv":"Ссылка на пользовательский ключ","f.customKeyEnvHint":"Имя записи в хранилище учётных данных, содержащей API-ключ для пользовательского эндпоинта.","f.customModel":"Пользовательский ID модели","f.customModelHint":"Имя модели, отправляемое на пользовательский эндпоинт изображений.","f.customSize":"Пользовательский размер изображения","f.customSizeHint":"Фиксированный размер, отправляемый на пользовательский эндпоинт (например 1024x1024).","f.dailyBudgetUsd":"Дневной бюджет ($ USD)","f.dailyBudgetUsdHint":"Дневной бюджет ($ USD)","f.defaultFormat":"Формат вывода","f.defaultFormatHint":"Целевой формат файла (PNG, JPEG или WEBP).","f.defaultSize":"Соотношение сторон по умолчанию","f.defaultSizeHint":"Соотношение сторон и разрешение, применяемые если image_size не указан.","f.defaultStylePreset":"Default Style Preset","f.defaultStylePresetHint":"Default style preset applied to generations (e.g. cinematic, anime, photorealistic).","f.deliverAs":"Режим доставки","f.deliverAsHint":"Как изображения передаются в диалог: \"link\" (безопасно для текстовых LLM) или \"image\" (мультимодальное зрение).","f.diskCache":"Дисковый кэш по хэшу","f.diskCacheHint":"Дисковый кэш по хэшу","f.enableLlmEnhancer":"Включить","f.enableLlmEnhancerHint":"Включить","f.enabled":"Включить","f.enabledHint":"Включить","f.enhanceBelowChars":"Улучшение промптов","f.enhanceBelowCharsHint":"Улучшение промптов","f.enhanceModel":"Улучшение промптов","f.enhanceModelHint":"Улучшение промптов","f.enhancePrompt":"Улучшение промптов","f.enhancePromptHint":"Улучшение промптов","f.geminiKeyEnv":"Gemini Key Reference","f.geminiKeyEnvHint":"Credential reference holding Google Gemini API key.","f.geminiModel":"Gemini Model ID","f.geminiModelHint":"Google Gemini image generation model identifier.","f.historyLimit":"History Limit","f.historyLimitHint":"Maximum number of recent generation records kept in memory.","f.inherit":"По умолчанию / Наследовать","f.localA1111Url":"Local A1111 URL (Legacy)","f.localA1111UrlHint":"Direct Automatic1111 endpoint URL.","f.localBaseURL":"Local Server URL","f.localBaseURLHint":"Server address (e.g. http://127.0.0.1:8188 for ComfyUI, http://127.0.0.1:7860 for A1111).","f.localCfg":"CFG Scale","f.localCfgHint":"Classifier-free guidance scale.","f.localComfyUrl":"Local ComfyUI URL (Legacy)","f.localComfyUrlHint":"Direct ComfyUI endpoint URL.","f.localKind":"Local Engine Architecture","f.localKindHint":"Select between ComfyUI API or Automatic1111 WebUI backend.","f.localModel":"Local Model / Checkpoint","f.localModelHint":"Checkpoint name or ComfyUI workflow name.","f.localSteps":"Sampling Steps","f.localStepsHint":"Number of denoising sampling steps.","f.loopGuardLimit":"Лимит защитного цикла (Loop Guard)","f.loopGuardLimitHint":"Лимит защитного цикла (Loop Guard)","f.model":"ID модели FAL","f.modelHint":"Целевая модель на эндпоинте FAL (например fal-ai/flux-2/klein/9b).","f.needCodex":"Built-in Codex subscription","f.needCustom":"Requires OpenAI-compatible endpoint","f.needFal":"Requires FAL API key","f.needGemini":"Requires Google Gemini API key","f.needGrok":"Built-in Grok subscription","f.needLocal":"Local ComfyUI or A1111","f.needReplicate":"Requires Replicate API token","f.needSeedream":"Requires SeaDream API key","f.outputDir":"Каталог сохранения","f.outputDirHint":"Путь к каталогу на диске, куда сохраняются сгенерированные изображения.","f.pollIntervalMs":"Интервал опроса (мс)","f.pollIntervalMsHint":"Частота проверки статуса задачи в асинхронной очереди.","f.provider":"Провайдер изображений","f.providerHint":"Бэкенд-сервис для генерации изображений.","f.pruneDays":"Срок хранения файлов (дней)","f.pruneDaysHint":"Срок хранения файлов (дней)","f.qualityGate":"Качество изображения","f.qualityGateHint":"Качество изображения","f.replicateKeyEnv":"Replicate Key Reference","f.replicateKeyEnvHint":"Credential reference holding the Replicate API token.","f.replicateModel":"Replicate Model ID","f.replicateModelHint":"Target model identifier on Replicate.","f.seedreamBaseURL":"SeaDream Base URL","f.seedreamBaseURLHint":"SeaDream API endpoint URL (ByteDance/Volcengine Ark).","f.seedreamKeyEnv":"SeaDream Key Reference","f.seedreamKeyEnvHint":"Credential reference holding the SeaDream API key.","f.seedreamModel":"SeaDream Model ID","f.seedreamModelHint":"ByteDance SeaDream model identifier.","f.stylePreset":"Суффикс художественного стиля","f.stylePresetHint":"Суффикс художественного стиля","f.subscriptionQuality":"Subscription Quality","f.subscriptionQualityHint":"Target quality profile when using Codex or Grok subscriptions.","f.timeoutMs":"Таймаут (мс)","f.timeoutMsHint":"Максимальный общий таймаут до прерывания запроса генерации.","gallery.copy_link":"Копировать Markdown-ссылку","gallery.copy_prompt":"Копировать промпт","gallery.empty":"Галерея пуста. Сгенерируйте первое изображение в чате!","gallery.inspector":"Детали записи генерации","gallery.loading":"Загрузка галереи…","gallery.title":"Галерея Image Studio","p.apiKeyEnv":"FAL_API_KEY","p.baseURL":"https://queue.fal.run","p.cacheTtlDays":"0","p.customBaseURL":"https://api.openai.com/v1","p.customKeyEnv":"OPENAI_API_KEY","p.customModel":"dall-e-3","p.customSize":"1024x1024","p.dailyBudgetUsd":"0.00","p.defaultStylePreset":"none","p.enhanceBelowChars":"200","p.enhanceModel":"Leave empty for default chat model","p.geminiKeyEnv":"GEMINI_API_KEY","p.geminiModel":"gemini-2.0-flash-exp-image-generation","p.historyLimit":"50","p.localA1111Url":"http://127.0.0.1:7860","p.localBaseURL":"http://127.0.0.1:8188","p.localCfg":"7","p.localComfyUrl":"http://127.0.0.1:8188","p.localModel":"v1-5-pruned-emaonly.safetensors","p.localSteps":"20","p.loopGuardLimit":"3","p.model":"fal-ai/flux-2/klein/9b","p.outputDir":"generated/images","p.pollIntervalMs":"2000","p.pruneDays":"0","p.replicateKeyEnv":"REPLICATE_API_TOKEN","p.replicateModel":"black-forest-labs/flux-schnell","p.seedreamBaseURL":"https://api.bytedanceapi.com/v1","p.seedreamKeyEnv":"SEEDREAM_API_KEY","p.seedreamModel":"seedream-4.0","p.timeoutMs":"180000","remix.copied":"✓ Copied!","remix.copy_instruction":"Copy Instruction","remix.creative_btn":"Creative (0.65)","remix.creativity_label":"Creativity / Denoising Strength","remix.drawer_title":"Variations & Style Remix Workbench","remix.prompt_placeholder":"Describe stylistic adjustments, new background, or variations...","remix.subtle_btn":"Subtle (0.25)","settings.collapse":"Свернуть","settings.credentialHint":"Ключи API хранятся в учётных данных DSH (~/.dsh/.credentials.yaml) и не попадают в файлы конфигурации.","settings.description":"Генерация изображений с помощью ИИ, дорисовка, вариации, апскейл и векторизация.","settings.discard":"Сбросить изменения","settings.expand":"Развернуть","settings.invalidNumber":"Пожалуйста, введите корректное число","settings.navLabel":"Студия изображений","settings.overridden":"переопределено","settings.readOnly":"Настройки доступны только для чтения в этом контексте.","settings.reset":"Сбросить по умолчанию","settings.save":"Сохранить настройки","settings.saveFailed":"Не удалось сохранить настройки. Пожалуйста, проверьте учетные данные и попробуйте снова.","settings.saving":"Сохранение…","settings.title":"Студия изображений","settings.unavailable":"Настройки плагина инициализируются. Они появятся автоматически через несколько секунд.","settings.unsaved":"Несохраненные изменения","stat.active_provider":"Активный провайдер","stat.budget_cache":"Бюджет и кэш","stat.format_size":"Стандартные параметры","stat.safety_status":"Безопасность и Loop Guard","tab.cache":"Кэш и хранилище","tab.enhancer":"Промпт и стили","tab.gallery":"Галерея","tab.general":"Общие","tab.provider":"Провайдер","tab.safety":"Безопасность и бюджет","updater.check":"Check updates","updater.checking":"Checking…","updater.current":"Current version","updater.failed":"Update check failed: ","updater.latest":"Latest version","updater.success":"Plugin updated successfully! Please restart DSH service.","updater.title":"Plugin Updates","updater.upToDate":"Up to date","updater.updateNow":"Update to v{version}","updater.updating":"Updating…"}}
|
|
1
|
+
{"dsh-image-gen":{"card.actionRemoveBg":"Удалить фон","card.actionReroll":"Перегенерировать","card.actionUpscale":"Увеличить разрешение","card.copyPrompt":"Скопировать промпт","card.failed":"Ошибка генерации","card.generating":"Генерация изображения…","card.image":"Результат Image Studio","card.inpaint":"Инпейнтинг","card.origPrompt":"Исходный промпт","card.remix":"Ремикс","card.removeBg":"Удалить фон","card.reroll":"Перегенерировать","card.responsiveTabs":"Адаптивные экраны","card.seedPrefix":"Seed","card.sizePrefix":"Size","card.toolCall":"Вызов генерации изображения","card.unknownError":"An unknown error occurred during generation.","card.upscale":"Увеличить","card.vary":"Вариация","diagnostics.desc":"Быстрая проверка статуса подключения и задержки выбранного API сервиса генерации.","diagnostics.ready":"В норме","diagnostics.test":"Проверить подключение","diagnostics.testing":"Проверка...","diagnostics.title":"Диагностика подключения провайдера","f.apiKeyEnv":"Ссылка на ключ FAL","f.apiKeyEnvHint":"Имя записи в хранилище учётных данных, содержащей API-ключ FAL.","f.autoEnhancePrompt":"Auto Enhance Prompt","f.autoEnhancePromptHint":"Enrich prompts with photography, lighting, and composition quality tokens.","f.baseURL":"Базовый URL FAL","f.baseURLHint":"Эндпоинт сервиса очередей FAL.","f.cacheByPrompt":"Cache by Prompt Only","f.cacheByPromptHint":"Reuse existing result if the prompt has already been generated.","f.cacheBySeed":"Cache by Seed + Prompt","f.cacheBySeedHint":"Reuse existing result if the exact same seed and prompt are requested.","f.cacheTtlDays":"Cache Retention (Legacy)","f.cacheTtlDaysHint":"Legacy name for retention period in days.","f.customBaseURL":"Пользовательский базовый URL API","f.customBaseURLHint":"Корень OpenAI-совместимого эндпоинта изображений (например https://api.openai.com/v1).","f.customKeyEnv":"Ссылка на пользовательский ключ","f.customKeyEnvHint":"Имя записи в хранилище учётных данных, содержащей API-ключ для пользовательского эндпоинта.","f.customModel":"Пользовательский ID модели","f.customModelHint":"Имя модели, отправляемое на пользовательский эндпоинт изображений.","f.customSize":"Пользовательский размер изображения","f.customSizeHint":"Фиксированный размер, отправляемый на пользовательский эндпоинт (например 1024x1024).","f.dailyBudgetUsd":"Дневной бюджет ($ USD)","f.dailyBudgetUsdHint":"Дневной бюджет ($ USD)","f.defaultFormat":"Формат вывода","f.defaultFormatHint":"Целевой формат файла (PNG, JPEG или WEBP).","f.defaultSize":"Соотношение сторон по умолчанию","f.defaultSizeHint":"Соотношение сторон и разрешение, применяемые если image_size не указан.","f.defaultStylePreset":"Default Style Preset","f.defaultStylePresetHint":"Default style preset applied to generations (e.g. cinematic, anime, photorealistic).","f.deliverAs":"Режим доставки","f.deliverAsHint":"Как изображения передаются в диалог: \"link\" (безопасно для текстовых LLM) или \"image\" (мультимодальное зрение).","f.diskCache":"Дисковый кэш по хэшу","f.diskCacheHint":"Дисковый кэш по хэшу","f.enableLlmEnhancer":"Включить","f.enableLlmEnhancerHint":"Включить","f.enabled":"Включить","f.enabledHint":"Включить","f.enhanceBelowChars":"Улучшение промптов","f.enhanceBelowCharsHint":"Улучшение промптов","f.enhanceModel":"Улучшение промптов","f.enhanceModelHint":"Улучшение промптов","f.enhancePrompt":"Улучшение промптов","f.enhancePromptHint":"Улучшение промптов","f.fallbackProviders":"Цепочка резервных провайдеров","f.fallbackProvidersHint":"Список резервных провайдеров через запятую для перехода при ошибках 429, 5xx или исчерпании квоты (напр. replicate, custom, gemini).","f.geminiKeyEnv":"Gemini Key Reference","f.geminiKeyEnvHint":"Credential reference holding Google Gemini API key.","f.geminiModel":"Gemini Model ID","f.geminiModelHint":"Google Gemini image generation model identifier.","f.historyLimit":"History Limit","f.historyLimitHint":"Maximum number of recent generation records kept in memory.","f.inherit":"По умолчанию / Наследовать","f.localA1111Url":"Local A1111 URL (Legacy)","f.localA1111UrlHint":"Direct Automatic1111 endpoint URL.","f.localBaseURL":"Local Server URL","f.localBaseURLHint":"Server address (e.g. http://127.0.0.1:8188 for ComfyUI, http://127.0.0.1:7860 for A1111).","f.localCfg":"CFG Scale","f.localCfgHint":"Classifier-free guidance scale.","f.localComfyUrl":"Local ComfyUI URL (Legacy)","f.localComfyUrlHint":"Direct ComfyUI endpoint URL.","f.localKind":"Local Engine Architecture","f.localKindHint":"Select between ComfyUI API or Automatic1111 WebUI backend.","f.localModel":"Local Model / Checkpoint","f.localModelHint":"Checkpoint name or ComfyUI workflow name.","f.localSteps":"Sampling Steps","f.localStepsHint":"Number of denoising sampling steps.","f.loopGuardLimit":"Лимит защитного цикла (Loop Guard)","f.loopGuardLimitHint":"Лимит защитного цикла (Loop Guard)","f.model":"ID модели FAL","f.modelHint":"Целевая модель на эндпоинте FAL (например fal-ai/flux-2/klein/9b).","f.needCodex":"Built-in Codex subscription","f.needCustom":"Requires OpenAI-compatible endpoint","f.needFal":"Requires FAL API key","f.needGemini":"Requires Google Gemini API key","f.needGrok":"Built-in Grok subscription","f.needLocal":"Local ComfyUI or A1111","f.needReplicate":"Requires Replicate API token","f.needSeedream":"Requires SeaDream API key","f.outputDir":"Каталог сохранения","f.outputDirHint":"Путь к каталогу на диске, куда сохраняются сгенерированные изображения.","f.pollIntervalMs":"Интервал опроса (мс)","f.pollIntervalMsHint":"Частота проверки статуса задачи в асинхронной очереди.","f.provider":"Провайдер изображений","f.providerHint":"Бэкенд-сервис для генерации изображений.","f.pruneDays":"Срок хранения файлов (дней)","f.pruneDaysHint":"Срок хранения файлов (дней)","f.qualityGate":"Качество изображения","f.qualityGateHint":"Качество изображения","f.replicateKeyEnv":"Replicate Key Reference","f.replicateKeyEnvHint":"Credential reference holding the Replicate API token.","f.replicateModel":"Replicate Model ID","f.replicateModelHint":"Target model identifier on Replicate.","f.seedreamBaseURL":"SeaDream Base URL","f.seedreamBaseURLHint":"SeaDream API endpoint URL (ByteDance/Volcengine Ark).","f.seedreamKeyEnv":"SeaDream Key Reference","f.seedreamKeyEnvHint":"Credential reference holding the SeaDream API key.","f.seedreamModel":"SeaDream Model ID","f.seedreamModelHint":"ByteDance SeaDream model identifier.","f.stylePreset":"Суффикс художественного стиля","f.stylePresetHint":"Суффикс художественного стиля","f.subscriptionQuality":"Subscription Quality","f.subscriptionQualityHint":"Target quality profile when using Codex or Grok subscriptions.","f.timeoutMs":"Таймаут (мс)","f.timeoutMsHint":"Максимальный общий таймаут до прерывания запроса генерации.","gallery.copy_link":"Копировать Markdown-ссылку","gallery.copy_prompt":"Копировать промпт","gallery.empty":"Галерея пуста. Сгенерируйте первое изображение в чате!","gallery.inspector":"Детали записи генерации","gallery.loading":"Загрузка галереи…","gallery.title":"Галерея Image Studio","inpaint.apply":"Применить инпейнтинг","inpaint.brush":"Кисть","inpaint.brush_size":"Размер","inpaint.clear":"Очистить маску","inpaint.copied":"✓ Инструкция скопирована!","inpaint.eraser":"Ластик","inpaint.invert":"Инвертировать маску","inpaint.prompt_placeholder":"Опишите, что сгенерировать в области маски...","inpaint.title":"Холст инпейнтинга (закрасьте белой маской область для изменения)","inpaint.undo":"Отменить","matrix.blind_on":"Слепой режим активен","matrix.blind_toggle":"Показать стили","matrix.copied":"✓ Выбрано!","matrix.title":"Бенчмарк матрицы стилей (2×2)","matrix.use_style":"Использовать стиль","p.apiKeyEnv":"FAL_API_KEY","p.baseURL":"https://queue.fal.run","p.cacheTtlDays":"0","p.customBaseURL":"https://api.openai.com/v1","p.customKeyEnv":"OPENAI_API_KEY","p.customModel":"dall-e-3","p.customSize":"1024x1024","p.dailyBudgetUsd":"0.00","p.defaultStylePreset":"none","p.enhanceBelowChars":"200","p.enhanceModel":"Leave empty for default chat model","p.fallbackProviders":"replicate, custom, gemini","p.geminiKeyEnv":"GEMINI_API_KEY","p.geminiModel":"gemini-2.0-flash-exp-image-generation","p.historyLimit":"50","p.localA1111Url":"http://127.0.0.1:7860","p.localBaseURL":"http://127.0.0.1:8188","p.localCfg":"7","p.localComfyUrl":"http://127.0.0.1:8188","p.localModel":"v1-5-pruned-emaonly.safetensors","p.localSteps":"20","p.loopGuardLimit":"3","p.model":"fal-ai/flux-2/klein/9b","p.outputDir":"generated/images","p.pollIntervalMs":"2000","p.pruneDays":"0","p.replicateKeyEnv":"REPLICATE_API_TOKEN","p.replicateModel":"black-forest-labs/flux-schnell","p.seedreamBaseURL":"https://api.bytedanceapi.com/v1","p.seedreamKeyEnv":"SEEDREAM_API_KEY","p.seedreamModel":"seedream-4.0","p.timeoutMs":"180000","remix.copied":"✓ Copied!","remix.copy_instruction":"Copy Instruction","remix.creative_btn":"Creative (0.65)","remix.creativity_label":"Creativity / Denoising Strength","remix.drawer_title":"Variations & Style Remix Workbench","remix.prompt_placeholder":"Describe stylistic adjustments, new background, or variations...","remix.subtle_btn":"Subtle (0.25)","settings.collapse":"Свернуть","settings.credentialHint":"Ключи API хранятся в учётных данных DSH (~/.dsh/.credentials.yaml) и не попадают в файлы конфигурации.","settings.description":"Генерация изображений с помощью ИИ, дорисовка, вариации, апскейл и векторизация.","settings.discard":"Сбросить изменения","settings.expand":"Развернуть","settings.invalidNumber":"Пожалуйста, введите корректное число","settings.loading":"Загрузка настроек плагина…","settings.navLabel":"Студия изображений","settings.overridden":"переопределено","settings.readOnly":"Настройки доступны только для чтения в этом контексте.","settings.reset":"Сбросить по умолчанию","settings.save":"Сохранить настройки","settings.saveFailed":"Не удалось сохранить настройки. Пожалуйста, проверьте учетные данные и попробуйте снова.","settings.saving":"Сохранение…","settings.title":"Студия изображений","settings.unavailable":"Настройки плагина инициализируются. Они появятся автоматически через несколько секунд.","settings.unsaved":"Несохраненные изменения","stat.active_provider":"Активный провайдер","stat.budget_cache":"Бюджет и кэш","stat.format_size":"Стандартные параметры","stat.safety_status":"Безопасность и Loop Guard","studio.aspectRatio":"Соотношение сторон:","studio.canvas":"Холст студии","studio.copiedCommand":"Команда генерации скопирована в буфер обмена!","studio.copiedSnippet":"Фрагмент скопирован в буфер обмена!","studio.copyHtml":"Копировать HTML","studio.copyMarkdown":"Копировать Markdown","studio.download":"Скачать","studio.emptyCanvas":"Выберите изображение из ленты недавних ниже или нажмите «Сгенерировать».","studio.exitFullscreen":"Выйти из полноэкранного режима","studio.fullscreen":"На весь экран","studio.generate":"Сгенерировать в чате","studio.parameters":"Параметры генерации","studio.prompt":"Промпт:","studio.promptPlaceholder":"Опишите ваше видение...","studio.provider":"Провайдер:","studio.random":"Случайный","studio.randomizeSeed":"Случайный сид","studio.recent":"Недавние генерации","studio.seed":"Сид (необязательно):","studio.stylePreset":"Пресет стиля:","studio.title":"Студия изображений","studio.vault":"Хранилище ассетов","tab.cache":"Кэш и хранилище","tab.enhancer":"Промпт и стили","tab.gallery":"Галерея","tab.general":"Общие","tab.provider":"Провайдер","tab.safety":"Безопасность и бюджет","updater.check":"Check updates","updater.checking":"Checking…","updater.current":"Current version","updater.failed":"Update check failed: ","updater.latest":"Latest version","updater.success":"Plugin updated successfully! Please restart DSH service.","updater.title":"Plugin Updates","updater.upToDate":"Up to date","updater.updateNow":"Update to v{version}","updater.updating":"Updating…","vault.allProviders":"Все провайдеры","vault.allRatios":"Все соотношения","vault.confirmDelete":"Вы уверены, что хотите удалить этот ассет?","vault.copiedMarkdown":"Markdown-фрагмент скопирован в буфер обмена!","vault.copiedPrompt":"Промпт и сид скопированы в буфер обмена!","vault.delete":"Удалить","vault.deleteFailed":"Не удалось удалить ассет","vault.deleted":"Ассет удален","vault.download":"Скачать","vault.empty":"В хранилище нет ассетов.","vault.insert":"Вставить в чат","vault.inspector":"Инспектор ассетов","vault.loadMore":"Загрузить еще ассеты","vault.loading":"Загрузка...","vault.newest":"Сначала новые","vault.noPrompt":"Без промпта","vault.oldest":"Сначала старые","vault.provider":"Провайдер","vault.reroll":"Перегенерировать с тем же сидом","vault.search":"Поиск по промпту или тегам...","vault.seed":"Сид","vault.title":"Браузер ассетов и хранилище"}}
|
package/lib/translator.js
CHANGED
|
@@ -14,23 +14,53 @@ function execPromise(cmd, args, timeoutMs = 15000) {
|
|
|
14
14
|
})
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
function readJsonBody(request, limit = 500_000) {
|
|
17
|
+
export function readJsonBody(request, limit = 500_000) {
|
|
18
18
|
return new Promise((resolve, reject) => {
|
|
19
|
+
// 1. Ранняя проверка Content-Length
|
|
20
|
+
const contentLength = request?.headers?.['content-length']
|
|
21
|
+
if (contentLength && parseInt(contentLength, 10) > limit) {
|
|
22
|
+
const err = new Error('Payload too large')
|
|
23
|
+
err.statusCode = 413
|
|
24
|
+
return reject(err)
|
|
25
|
+
}
|
|
26
|
+
|
|
19
27
|
let body = ''
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
let bytesReceived = 0
|
|
29
|
+
let settled = false
|
|
30
|
+
|
|
31
|
+
const onData = (chunk) => {
|
|
32
|
+
if (settled) return
|
|
33
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))
|
|
34
|
+
bytesReceived += buf.length
|
|
35
|
+
if (bytesReceived > limit) {
|
|
36
|
+
settled = true
|
|
37
|
+
if (typeof request.removeListener === 'function') request.removeListener('data', onData)
|
|
38
|
+
if (typeof request.destroy === 'function') request.destroy()
|
|
39
|
+
const err = new Error('Payload too large')
|
|
40
|
+
err.statusCode = 413
|
|
41
|
+
return reject(err)
|
|
24
42
|
}
|
|
25
|
-
|
|
43
|
+
body += buf.toString('utf8')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
request.on('data', onData)
|
|
47
|
+
|
|
26
48
|
request.on('end', () => {
|
|
49
|
+
if (settled) return
|
|
50
|
+
settled = true
|
|
27
51
|
try {
|
|
28
52
|
resolve(body ? JSON.parse(body) : {})
|
|
29
53
|
} catch (err) {
|
|
54
|
+
err.statusCode = 400
|
|
30
55
|
reject(err)
|
|
31
56
|
}
|
|
32
57
|
})
|
|
33
|
-
|
|
58
|
+
|
|
59
|
+
request.on('error', (err) => {
|
|
60
|
+
if (settled) return
|
|
61
|
+
settled = true
|
|
62
|
+
reject(err)
|
|
63
|
+
})
|
|
34
64
|
})
|
|
35
65
|
}
|
|
36
66
|
|
|
@@ -232,8 +262,9 @@ export function registerTranslator(wctx, settingsCtx) {
|
|
|
232
262
|
})
|
|
233
263
|
response.end(JSON.stringify(status))
|
|
234
264
|
} catch (err) {
|
|
235
|
-
|
|
236
|
-
response.
|
|
265
|
+
const status = err && err.statusCode ? err.statusCode : 500
|
|
266
|
+
response.writeHead(status, { 'content-type': 'application/json; charset=utf-8' })
|
|
267
|
+
response.end(JSON.stringify({ error: err && err.message ? err.message : String(err) }))
|
|
237
268
|
}
|
|
238
269
|
}
|
|
239
270
|
})
|
|
@@ -266,8 +297,9 @@ export function registerTranslator(wctx, settingsCtx) {
|
|
|
266
297
|
})
|
|
267
298
|
response.end(JSON.stringify(result))
|
|
268
299
|
} catch (err) {
|
|
269
|
-
|
|
270
|
-
response.
|
|
300
|
+
const status = err && err.statusCode ? err.statusCode : 500
|
|
301
|
+
response.writeHead(status, { 'content-type': 'application/json; charset=utf-8' })
|
|
302
|
+
response.end(JSON.stringify({ error: err && err.message ? err.message : String(err) }))
|
|
271
303
|
}
|
|
272
304
|
}
|
|
273
305
|
})
|
|
@@ -341,8 +373,9 @@ export function registerTranslator(wctx, settingsCtx) {
|
|
|
341
373
|
})
|
|
342
374
|
response.end(JSON.stringify({ translatedText, engine }))
|
|
343
375
|
} catch (err) {
|
|
344
|
-
|
|
345
|
-
response.
|
|
376
|
+
const status = err && err.statusCode ? err.statusCode : 500
|
|
377
|
+
response.writeHead(status, { 'content-type': 'application/json; charset=utf-8' })
|
|
378
|
+
response.end(JSON.stringify({ error: err && err.message ? err.message : String(err) }))
|
|
346
379
|
}
|
|
347
380
|
}
|
|
348
381
|
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-russian-lang",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.11",
|
|
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",
|