feat(i18n): add multi-language support (ja/ko/vi/ru/zh-TW) with system auto-detection
- Extend AppLanguage to 7 locales: zh-CN, zh-TW, en, ja, ko, vi, ru - Auto-detect system language via navigator.languages; fallback to English - Add BCP47 locale mapping for date formatting and sorting - Create 50 translation JSON files (5 languages × 10 namespaces, 1137 keys each) - Update language selector with native language names - Extend locale key parity test to cover all 7 languages (70 assertions) - Add VNC/RDP desktop, serial terminal, AI agent, port forwarding, and SFTP features - Add credential encryption, host metrics, session backup crypto, and zmodem bridge - Update Rust backend: desktop services, host metrics, SSH/SFTP enhancements
This commit is contained in:
1 parent
fea6d8db04
commit
b0d0e3a5f3
301 files changed
+28002
-2705
No files matched your search
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Агент CLI",
|
||||
"modelConfigured": "{{provider}} · {{model}}",
|
||||
"modelNotConfigured": "Модель не настроена",
|
||||
"sshReady": "SSH · {{target}}",
|
||||
"sshNotConnected": "Удалённое SSH-подключение отсутствует",
|
||||
"defaultTarget": "Текущий SSH-сеанс",
|
||||
"emptyHint": "Опишите задачу эксплуатации и отправьте. Продолжайте в той же ветке или нажмите + для новой темы.",
|
||||
"newTopic": "Новая тема",
|
||||
"close": "Закрыть",
|
||||
"thinking": "Размышление…",
|
||||
"conclusion": "Итог",
|
||||
"copy": "Копировать",
|
||||
"copied": "Скопировано",
|
||||
"stop": "Остановить",
|
||||
"send": "Отправить",
|
||||
"placeholder": "Задача или уточнение… (Enter — отправить, Shift+Enter — новая строка)",
|
||||
"hintFollowUp": "Уточнения включают контекст этой ветки",
|
||||
"hintSelection": "Будет включено {{lines}} выбранных строк",
|
||||
"hintSteps": "До {{max}} шагов · ничего не сохраняется",
|
||||
"footerNote": "Высокий риск требует подтверждения · критический блокируется · сеанс не сохраняется"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "Режим безопасности агента",
|
||||
"strict": {
|
||||
"label": "Строгий",
|
||||
"short": "Подтверждение от среднего риска",
|
||||
"description": "Изменения файлов, правки прав доступа и команды повышенного риска требуют подтверждения. Лучше всего для продакшена или незнакомых хостов."
|
||||
},
|
||||
"relaxed": {
|
||||
"label": "Свободный",
|
||||
"short": "Подтверждать только высокий риск",
|
||||
"description": "Команды только для чтения и обычные правки выполняются автоматически; удаления, перезапуски, установки и т. п. требуют подтверждения."
|
||||
}
|
||||
},
|
||||
"risk": {
|
||||
"safe": "Безопасно",
|
||||
"low": "Низкий риск",
|
||||
"medium": "Средний риск",
|
||||
"high": "Высокий риск",
|
||||
"critical": "Заблокировано"
|
||||
},
|
||||
"step": {
|
||||
"round": "Шаг {{round}}",
|
||||
"awaiting": "Ожидает подтверждения",
|
||||
"running": "Выполняется",
|
||||
"done": "Готово",
|
||||
"confirmTitle": "Шаг {{round}} · {{risk}}",
|
||||
"confirmMessage": "SSH · {{target}}\n{{mode}}\n\n$ {{command}}",
|
||||
"rejected": "Команда шага {{round}} отклонена.",
|
||||
"terminated": "Прервано",
|
||||
"stoppedMessage": "Остановлено. Запрошено прерывание выполняемой удалённой команды."
|
||||
},
|
||||
"confirm": {
|
||||
"reject": "Отклонить",
|
||||
"once": "Один раз",
|
||||
"always": "Всегда",
|
||||
"hint": "Enter · Один раз Esc · Отклонить Всегда · пропускать похожие подтверждения в этом сеансе"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "Сначала настройте AI-провайдера в Настройки → AI",
|
||||
"noApiKey": "Для «{{provider}}» не сохранён API-ключ",
|
||||
"emptyTask": "Введите задачу или уточнение",
|
||||
"sshRequired": "Требуется подключённый удалённый SSH-сеанс",
|
||||
"modelEmpty": "Модель не вернула содержимого",
|
||||
"protocolFailed": "Модель дважды нарушила протокол инструментов; остановлено",
|
||||
"noConclusion": "Модель не вернула пригодного итога",
|
||||
"multipleCommands": "Модель вернула несколько команд; выполнение отклонено",
|
||||
"invalidCommand": "Модель не вернула единственную однострочную команду; выполнение отклонено",
|
||||
"repeatLoop": "Обнаружен повторяющийся цикл команд; остановлено: {{command}}",
|
||||
"criticalBlocked": "Команда попала под деструктивную жёсткую блокировку; обход невозможен: {{command}}",
|
||||
"execFailed": "Сбой ssh-exec: {{error}}",
|
||||
"execUnknown": "Неизвестная ошибка",
|
||||
"execNoOutput": "Команда завершилась без вывода",
|
||||
"maxSteps": "Достигнут лимит в {{max}} шагов; сузьте задачу и повторите"
|
||||
},
|
||||
"output": {
|
||||
"empty": "(пустой вывод)",
|
||||
"truncatedMiddle": "... [пропущено {{count}} строк] ...",
|
||||
"totalLines": "Всего строк: {{count}}{{truncatedSuffix}}",
|
||||
"truncatedSuffix": " (начало/конец сохранены)",
|
||||
"errorLines": "Возможные строки ошибки/предупреждения ({{count}}):\n{{lines}}",
|
||||
"noErrorKeywords": "Очевидных ключевых слов ошибок не найдено",
|
||||
"snippetLabel": "Фрагмент вывода:\n{{snippet}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,326 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "Подтвердить",
|
||||
"cancel": "Отмена",
|
||||
"close": "Закрыть",
|
||||
"delete": "Удалить",
|
||||
"save": "Сохранить",
|
||||
"create": "Создать",
|
||||
"copy": "Копировать",
|
||||
"copied": "Скопировано",
|
||||
"refresh": "Обновить",
|
||||
"gotIt": "Понятно",
|
||||
"edit": "Изменить",
|
||||
"open": "Открыть",
|
||||
"clone": "Клонировать",
|
||||
"reconnect": "Переподключиться",
|
||||
"disconnect": "Отключиться",
|
||||
"submit": "OK"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Загрузка...",
|
||||
"processing": "Обработка...",
|
||||
"connecting": "Подключение...",
|
||||
"connected": "Подключено",
|
||||
"disconnected": "Отключено",
|
||||
"background": "Фон",
|
||||
"suspended": "Приостановлено",
|
||||
"reconnecting": "Переподключение",
|
||||
"error": "Ошибка подключения",
|
||||
"reading": "Загрузка...",
|
||||
"saving": "Сохранение..."
|
||||
},
|
||||
"error": {
|
||||
"title": "Что-то пошло не так",
|
||||
"body": "В приложении возникла непредвиденная проблема",
|
||||
"recoverable": "Эта ошибка обратима. Попробуйте обновить страницу.",
|
||||
"refreshPage": "Обновить страницу",
|
||||
"restartApp": "Перезапустить приложение",
|
||||
"supportHint": "Если проблема сохраняется, проверьте журналы или обратитесь в поддержку"
|
||||
},
|
||||
"toast": {
|
||||
"closeAria": "Закрыть уведомление"
|
||||
},
|
||||
"metrics": {
|
||||
"timezone": "Часовой пояс {{value}}",
|
||||
"memory": "Память {{percent}}%{{detail}}",
|
||||
"sessionTransfer": "Трафик сеанса {{value}}"
|
||||
},
|
||||
"palette": {
|
||||
"title": "Палитра команд",
|
||||
"aria": "Палитра команд",
|
||||
"placeholder": "Поиск команд, сеансов или сниппетов...",
|
||||
"empty": "Совпадений не найдено",
|
||||
"emptyHint": "Попробуйте другое ключевое слово",
|
||||
"resultCount": "Результатов: {{count}}",
|
||||
"badge": {
|
||||
"command": "Команда",
|
||||
"session": "Сеанс",
|
||||
"snippet": "Сниппет"
|
||||
},
|
||||
"hint": {
|
||||
"nav": "Навигация",
|
||||
"run": "Выполнить",
|
||||
"close": "Закрыть"
|
||||
},
|
||||
"cmd": {
|
||||
"newSession": "Новый сеанс",
|
||||
"newSessionDesc": "Создать профиль SSH-сеанса",
|
||||
"quickConnect": "Быстрое подключение",
|
||||
"quickConnectDesc": "Подключиться напрямую по данным хоста",
|
||||
"localTerminal": "Локальный терминал",
|
||||
"localTerminalDesc": "Открыть локальную оболочку",
|
||||
"settings": "Открыть настройки",
|
||||
"settingsDesc": "Параметры приложения",
|
||||
"toggleSidebar": "Показать/скрыть боковую панель",
|
||||
"toggleSidebarDesc": "Скрыть боковую панель, чтобы сосредоточиться на терминале",
|
||||
"newTab": "Новая вкладка",
|
||||
"closeTab": "Закрыть текущую вкладку",
|
||||
"closeAllTabs": "Закрыть все вкладки",
|
||||
"portForward": "Новый проброс портов",
|
||||
"upgradePro": "Обновить OpsXShell Pro",
|
||||
"editSession": "Изменить сеанс: {{name}}"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"welcome": "Добро пожаловать",
|
||||
"new": "Новая вкладка",
|
||||
"settings": "Настройки",
|
||||
"portForward": "Проброс портов",
|
||||
"terminal": "Терминал",
|
||||
"batch": "Пакетное выполнение",
|
||||
"newTerminal": "Новый терминал",
|
||||
"kind": {
|
||||
"terminal": "Терминал",
|
||||
"sftp": "SFTP",
|
||||
"portforward": "Проброс",
|
||||
"serial": "Serial",
|
||||
"rdp": "RDP",
|
||||
"vnc": "VNC",
|
||||
"batch": "Пакет",
|
||||
"settings": "Настройки"
|
||||
},
|
||||
"menu": {
|
||||
"closeOthers": "Закрыть остальные",
|
||||
"closeRight": "Закрыть вкладки справа",
|
||||
"closeLeft": "Закрыть вкладки слева",
|
||||
"closeAll": "Закрыть все",
|
||||
"clone": "Дублировать вкладку"
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"brandSub": "Терминал SSH / SFTP",
|
||||
"collapse": "Свернуть боковую панель (Ctrl/Cmd+B)",
|
||||
"collapseAria": "Свернуть боковую панель",
|
||||
"expand": "Развернуть боковую панель",
|
||||
"expandAria": "Развернуть боковую панель",
|
||||
"toggle": "Показать/скрыть боковую панель",
|
||||
"searchPlaceholder": "Поиск...",
|
||||
"localShell": {
|
||||
"openDefault": "Открыть локальную оболочку по умолчанию",
|
||||
"choose": "Выберите оболочку",
|
||||
"title": "Локальная оболочка",
|
||||
"subtitle": "Открыть терминал на этой машине",
|
||||
"default": "По умолчанию"
|
||||
}
|
||||
},
|
||||
"connectionPanel": {
|
||||
"title": "Подключения",
|
||||
"empty": "Нет подключений",
|
||||
"emptyDesc": "Нет активных подключений. Они появятся здесь после подключения к серверу.",
|
||||
"stat": {
|
||||
"total": "Всего",
|
||||
"active": "Активные",
|
||||
"background": "Фоновые",
|
||||
"error": "Отключено/ошибка"
|
||||
},
|
||||
"status": {
|
||||
"connected": "Подключено",
|
||||
"connecting": "Подключение",
|
||||
"background": "Фон",
|
||||
"suspended": "Приостановлено",
|
||||
"error": "Ошибка",
|
||||
"disconnected": "Отключено",
|
||||
"reconnecting": "Переподключение"
|
||||
},
|
||||
"refCount": "×{{count}} ссылок",
|
||||
"reconnect": "Переподключиться",
|
||||
"reconnecting": "Переподключение...",
|
||||
"disconnect": "Отключиться"
|
||||
},
|
||||
"pro": {
|
||||
"upgrade": "Обновить Pro",
|
||||
"feature": "Возможности Pro",
|
||||
"unlock": "Разблокировать {{feature}}",
|
||||
"comingSoon": "Скоро",
|
||||
"activateSuccess": "Активировано",
|
||||
"activateFailed": "Сбой активации",
|
||||
"licenseActivated": "Лицензия Pro активирована",
|
||||
"paymentPending": "После оплаты вставьте лицензию сюда или попробуйте активировать позже",
|
||||
"invalidLicense": "Сбой активации: недействительная лицензия",
|
||||
"goUpgrade": "Обновить",
|
||||
"haveLicense": "Есть лицензия? Активировать",
|
||||
"title": "OpsXShell Pro · Оперативные возможности Pro",
|
||||
"subtitleComingSoon": "{{feature}} скоро · обновите Pro для раннего доступа",
|
||||
"subtitleUnlock": "Разблокировка: {{feature}}",
|
||||
"subtitleDefault": "Проброс портов, прокси, serial, AI, пакетное выполнение и рассылка",
|
||||
"activated": "Pro активирован",
|
||||
"expiresAt": " · действует до {{date}}",
|
||||
"lifetime": " · бессрочная лицензия",
|
||||
"oneTimeFee": "Разовая покупка · бессрочно на этом устройстве · без подписки",
|
||||
"pasteLicense": "Вставить лицензию",
|
||||
"activateButton": "Активировать",
|
||||
"clearLicense": "Очистить локальную лицензию",
|
||||
"paymentNote": "Оплата обрабатывается Waffo; это приложение не собирает данные карт.",
|
||||
"testDeviceId": "Тестовая среда · ID устройства: {{deviceId}}",
|
||||
"later": "Может быть позже",
|
||||
"viewPro": "Посмотреть Pro",
|
||||
"wallComingSoonSuffix": " · скоро",
|
||||
"wallUnlock": "Разблокировать {{feature}}",
|
||||
"wallMessageComingSoon": "Эта возможность Pro ещё в разработке. Обновите для раннего доступа.",
|
||||
"wallMessageDefault": "Эта функция требует OpsXShell Pro. Обновите, чтобы использовать её на этом устройстве.",
|
||||
"checkoutUnavailable": "Оформление недоступно ({{status}})",
|
||||
"freeTier": "Бесплатно",
|
||||
"proTier": "Pro",
|
||||
"freeItems": {
|
||||
"ssh": "SSH-терминал",
|
||||
"sftp": "Менеджер файлов SFTP",
|
||||
"local": "Локальный терминал",
|
||||
"crud": "CRUD сеансов",
|
||||
"import": "Импорт одиночный / из ssh_config"
|
||||
},
|
||||
"proItems": {
|
||||
"forward": "Проброс портов",
|
||||
"proxy": "Прокси сеанса / SOCKS",
|
||||
"serial": "Последовательный терминал",
|
||||
"ai": "Терминальный AI-ассистент",
|
||||
"batch": "Пакетное выполнение / синхронизация рассылки",
|
||||
"broadcast": "Синхронизация ввода рассылки",
|
||||
"importExport": "Массовый импорт/экспорт хостов",
|
||||
"desktop": "Удалённый рабочий стол RDP / VNC"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"title": "Быстрый запуск",
|
||||
"description": "Сеансы, локальные оболочки и консоли устройств",
|
||||
"cards": {
|
||||
"quickConnect": { "title": "Быстрое подключение", "desc": "user@host:port" },
|
||||
"saveSession": { "title": "Сохранить сеанс", "desc": "Учётные данные, группы, прокси" },
|
||||
"serial": { "title": "Последовательный терминал", "desc": "Скорость (baud) и настройки порта" }
|
||||
},
|
||||
"sectionLocalShell": "Локальная оболочка",
|
||||
"sectionSavedSessions": "Сохранённые сеансы",
|
||||
"systemDefault": "Системное по умолчанию"
|
||||
},
|
||||
"statusBar": {
|
||||
"socksLabel": "Проброс",
|
||||
"socksIdle": "Открыть проброс портов · правый клик для копирования SOCKS",
|
||||
"socksRunning": "SOCKS5 работает · клик для управления · правый клик для копирования",
|
||||
"forwardOpenIdle": "Открыть проброс портов · правый клик для копирования socks5://127.0.0.1:{{port}}",
|
||||
"forwardOpenRunning": "SOCKS5 работает (:{{port}}) · клик для управления · правый клик для копирования",
|
||||
"forwardStarted": "Проброс запущен",
|
||||
"forwardStartedDynamic": "SOCKS5 запущен: socks5://127.0.0.1:{{port}}",
|
||||
"socksStartFailed": "Сбой запуска: {{message}}",
|
||||
"socksStopFailed": "Сбой остановки: {{message}}",
|
||||
"socksCopied": "Скопировано socks5://127.0.0.1:{{port}}"
|
||||
},
|
||||
"portForward": {
|
||||
"title": "Проброс портов",
|
||||
"connectedAs": "Подключено: {{target}}",
|
||||
"notConnected": "Нет подключения — сначала установите SSH",
|
||||
"socksDefaultHint": "Локальный SOCKS5: 127.0.0.1:1080",
|
||||
"socksRunning": "SOCKS5 работает",
|
||||
"socksStart": "Запустить SOCKS5",
|
||||
"addRule": "Добавить",
|
||||
"emptyTitle": "Пробросов портов нет",
|
||||
"emptyDesc": "Запустите SOCKS5 или добавьте Local / Remote правила",
|
||||
"emptyAction": "Запустить 127.0.0.1:1080",
|
||||
"typeLocal": "Local",
|
||||
"typeRemote": "Remote",
|
||||
"typeDynamic": "Dynamic",
|
||||
"running": "Выполняется",
|
||||
"socksProxy": "SOCKS5: 127.0.0.1:{{port}}",
|
||||
"remoteToLocal": "Удалённый {{remote}} → локальный {{local}}",
|
||||
"stats": "{{connections}} подкл. · ↑{{up}} · ↓{{down}}",
|
||||
"copyProxy": "Копировать прокси",
|
||||
"copyRule": "Дублировать правило",
|
||||
"editRule": "Изменить",
|
||||
"stopListener": "Остановить",
|
||||
"start": "Запустить",
|
||||
"delete": "Удалить",
|
||||
"editTitle": "Изменить проброс",
|
||||
"addTitle": "Добавить проброс",
|
||||
"typeLocalDesc": "Локальный → удалённый",
|
||||
"typeRemoteDesc": "Удалённый → локальный",
|
||||
"typeDynamicDesc": "SOCKS5",
|
||||
"selectType": "Тип",
|
||||
"drawerSubtitle": "Туннель через текущий SSH-сеанс",
|
||||
"ruleFields": "Подробности",
|
||||
"dynamicHint": "Локальный SOCKS5, по умолчанию 127.0.0.1:1080 (можно менять). Трафик выходит через публичный IP этого SSH-сервера.",
|
||||
"dynamicSingleHint": "Одно правило Dynamic на SSH-хост; измените порт прослушивания при остановке.",
|
||||
"dynamicPortHint": "Если порт занят, выберите другой локальный порт (напр. 1081).",
|
||||
"ruleList": "Правила",
|
||||
"ruleListEmpty": "Правил Local / Remote пока нет",
|
||||
"addSection": "Добавить новое",
|
||||
"errorDynamicExists": "Dynamic уже существует. Запустите/остановите его или измените порт.",
|
||||
"diagram": {
|
||||
"title": "Как это работает",
|
||||
"localApp": "Локальное приложение",
|
||||
"sshHost": "SSH-хост",
|
||||
"remoteService": "Удалённый сервис",
|
||||
"remoteClient": "Удалённый клиент",
|
||||
"localService": "Локальный сервис",
|
||||
"localClient": "Локальный",
|
||||
"browser": "Локальный клиент",
|
||||
"socksProxy": "Локальный SOCKS",
|
||||
"anyTarget": "Любой адресат",
|
||||
"localSide": "Локально",
|
||||
"remoteSide": "Удалённо",
|
||||
"firewall": "Файрвол",
|
||||
"viaApp": "через OpsXShell",
|
||||
"viaSsh": "через SSH",
|
||||
"toTarget": "к цели",
|
||||
"toListen": "для прослушивания",
|
||||
"targetDb": "БД",
|
||||
"targetWeb": "Web",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "Удалённый A",
|
||||
"remotePeerB": "Удалённый B",
|
||||
"remotePeerC": "Удалённый C",
|
||||
"cloudA": "Облако A",
|
||||
"cloudB": "Облако B",
|
||||
"internet": "Интернет",
|
||||
"localCaption": "Local: обращение к удалённому порту как к локальному.",
|
||||
"remoteCaption": "Remote: удалённый доступ пробрасывается к локальному сервису.",
|
||||
"dynamicCaption": "Dynamic: эта машина становится прокси SOCKS5, выходящим через публичный IP текущего SSH-сервера."
|
||||
},
|
||||
"ruleName": "Название",
|
||||
"ruleNamePlaceholder": "напр. MySQL",
|
||||
"localListenPort": "Локальный порт прослушивания",
|
||||
"localTargetPort": "Локальный целевой порт",
|
||||
"remoteTargetPort": "Удалённый целевой порт",
|
||||
"remoteListenPort": "Удалённый порт прослушивания",
|
||||
"portPlaceholder": "напр. 3306",
|
||||
"remoteHost": "Удалённый хост",
|
||||
"remoteHostPlaceholder": "localhost или IP",
|
||||
"socksRuleName": "Прокси SOCKS5",
|
||||
"defaultLocalName": "Локальный проброс",
|
||||
"defaultRemoteName": "Удалённый проброс",
|
||||
"sessionRestoredTitle": "Сеанс восстановлен",
|
||||
"sessionRestoredDesc": "Вкладка проброса портов из прошлого сеанса восстановлена.\nПереподключите SSH, чтобы использовать её снова.",
|
||||
"stopEditTitle": "Остановите перед редактированием",
|
||||
"stopEditMessage": "Этот проброс выполняется. Остановить его перед редактированием?",
|
||||
"stopEditConfirm": "Остановить и изменить",
|
||||
"deleteTitle": "Удалить правило",
|
||||
"deleteRunning": "Выполняемый проброс будет сначала остановлен.",
|
||||
"deleteConfirm": "Удалить это правило?",
|
||||
"errorNamePort": "Введите имя и корректный порт (1–65535)",
|
||||
"errorTargetPort": "Введите корректный целевой порт (1–65535)",
|
||||
"errorRemoteHost": "Введите удалённый хост",
|
||||
"errorNotConnected": "Нет подключения",
|
||||
"errorStartFailed": "Сбой запуска",
|
||||
"errorStopFailed": "Сбой остановки",
|
||||
"errorSocksRunning": "SOCKS5 уже работает",
|
||||
"copySuffix": "Копировать"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"rdpTitle": "Подключение RDP",
|
||||
"vncTitle": "Подключение VNC",
|
||||
"rdpDesc": "Удалённый рабочий стол Windows · нативный движок IronRDP",
|
||||
"vncDesc": "Удалённый рабочий стол VNC / RFB · нативный движок",
|
||||
"confirm": "Подключиться",
|
||||
"host": "Хост",
|
||||
"hostPlaceholderRdp": "windows.example.com",
|
||||
"hostPlaceholderVnc": "192.168.1.10",
|
||||
"port": "Порт",
|
||||
"username": "Имя пользователя",
|
||||
"domain": "Домен (необязательно)",
|
||||
"password": "Пароль",
|
||||
"passwordOptional": "Пароль (необязательно)",
|
||||
"width": "Ширина",
|
||||
"height": "Высота",
|
||||
"rdpFootnote": "Нативный IronRDP: TCP → X.224 → TLS → CredSSP/NLA → MCS; тайм-аут рукопожатия 45 с. Проверка сертификата во время разработки ослаблена.",
|
||||
"vncFootnote": "Нативный vnc-rs RFB с декодированием Tight JPEG; буфер обмена передаётся в UTF-8 (очень старые серверы могут искажать текст).",
|
||||
"errorHostRequired": "Введите адрес хоста",
|
||||
"errorUsernameRequired": "Введите имя пользователя"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "Вставить локальный буфер обмена на удалённый сервер",
|
||||
"pasteAria": "Вставить на удалённый сервер",
|
||||
"shareDrive": "Скопировать локальный файл в общий диск (локальная папка Downloads = удалённая Downloads в OpsXShell)",
|
||||
"shareDriveAria": "Добавить в общий диск",
|
||||
"openShareDir": "Открыть общую папку локально (Downloads)",
|
||||
"openShareDirAria": "Открыть общую папку",
|
||||
"disconnect": "Отключиться",
|
||||
"disconnectAria": "Отключиться"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "Подключение…",
|
||||
"connected": "Подключено",
|
||||
"disconnected": "Отключено",
|
||||
"connectFailed": "Сбой подключения",
|
||||
"clipboardSynced": "Удалённый буфер обмена синхронизирован",
|
||||
"savedToDownloads": "Сохранено в локальную папку Downloads: {{name}}",
|
||||
"pastedToRemote": "Вставлено на удалённый сервер",
|
||||
"fileTooLarge": "Ограничение одного файла — 50 МБ",
|
||||
"fileShared": "Добавлено в общую папку Downloads: {{name}} (видно на удалённом «Этот компьютер»)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"code": {
|
||||
"1000": "Сбой подключения. Проверьте сеть или адрес хоста.",
|
||||
"1001": "Превышено время ожидания подключения. Проверьте сеть или повторите позже.",
|
||||
"1002": "Сбой аутентификации. Проверьте имя пользователя и пароль.",
|
||||
"1003": "Хост недоступен. Проверьте настройки сети.",
|
||||
"1004": "Подключение закрыто",
|
||||
"1100": "Не удалось создать терминал",
|
||||
"1101": "Сбой выполнения команды",
|
||||
"1102": "Сбой настройки проброса портов",
|
||||
"1200": "Сбой SFTP-подключения",
|
||||
"1201": "Файл не найден",
|
||||
"1202": "Отказано в доступе к этому файлу или каталогу",
|
||||
"1203": "Сбой передачи файла",
|
||||
"1204": "Не удалось прочитать содержимое каталога",
|
||||
"1300": "Сеанс не найден",
|
||||
"1301": "Не удалось сохранить сеанс",
|
||||
"1302": "Не удалось загрузить сеанс",
|
||||
"1400": "Некорректный формат адреса хоста",
|
||||
"1401": "Порт должен быть от 1 до 65535",
|
||||
"1402": "Некорректный формат учётных данных",
|
||||
"9000": "Произошла неизвестная ошибка",
|
||||
"9001": "Внутренняя ошибка связи",
|
||||
"9002": "Ошибка файловой системы",
|
||||
"9003": "Сетевая ошибка"
|
||||
},
|
||||
"action": {
|
||||
"retry": "Повторить",
|
||||
"reconnect": "Переподключиться",
|
||||
"ignore": "Игнорировать",
|
||||
"exit": "Выйти",
|
||||
"none": "Нет"
|
||||
},
|
||||
"connection": {
|
||||
"failed": "Сбой подключения. Проверьте сеть или адрес хоста.",
|
||||
"timeout": "Превышено время ожидания подключения. Проверьте сеть или повторите позже.",
|
||||
"authFailed": "Сбой аутентификации. Проверьте имя пользователя и пароль.",
|
||||
"hostUnreachable": "Хост недоступен. Проверьте настройки сети.",
|
||||
"closed": "Подключение закрыто",
|
||||
"dnsFailed": "Не удалось разрешить имя хоста",
|
||||
"refused": "В подключении отказано",
|
||||
"disconnected": "Отключено"
|
||||
},
|
||||
"auth": {
|
||||
"failed": "Сбой аутентификации. Проверьте имя пользователя и пароль.",
|
||||
"invalidCredentials": "Некорректный формат учётных данных",
|
||||
"keyLoadFailed": "Не удалось загрузить закрытый ключ",
|
||||
"passphraseRequired": "Для закрытого ключа требуется парольная фраза",
|
||||
"passphraseWrong": "Неверная парольная фраза закрытого ключа"
|
||||
},
|
||||
"shell": {
|
||||
"createFailed": "Не удалось создать терминал",
|
||||
"execFailed": "Сбой выполнения команды",
|
||||
"localCreateFailed": "Не удалось создать локальную оболочку",
|
||||
"remoteCreateFailed": "Не удалось создать удалённую оболочку"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "Сбой подключения к прокси",
|
||||
"authFailed": "Сбой аутентификации прокси",
|
||||
"tunnelFailed": "Не удалось установить туннель прокси",
|
||||
"unsupported": "Неподдерживаемый тип прокси",
|
||||
"jumpFailed": "Сбой подключения через jump-хост",
|
||||
"hostRequired": "Требуется хост прокси",
|
||||
"hostNoSpaces": "Хост прокси не может содержать пробелы",
|
||||
"portRequired": "Порт прокси должен быть больше 0",
|
||||
"portTooHigh": "Порт прокси не может превышать 65535"
|
||||
},
|
||||
"forward": {
|
||||
"failed": "Сбой настройки проброса портов",
|
||||
"bindFailed": "Не удалось привязать порт",
|
||||
"alreadyInUse": "Порт уже занят"
|
||||
},
|
||||
"sftp": {
|
||||
"connectFailed": "Сбой SFTP-подключения",
|
||||
"fileNotFound": "Файл не найден",
|
||||
"permissionDenied": "Отказано в доступе к этому файлу или каталогу",
|
||||
"transferFailed": "Сбой передачи файла",
|
||||
"listFailed": "Не удалось прочитать содержимое каталога",
|
||||
"readFailed": "Сбой чтения",
|
||||
"writeFailed": "Сбой сохранения",
|
||||
"renameFailed": "Сбой переименования",
|
||||
"chmodFailed": "Не удалось обновить права доступа",
|
||||
"apiUnavailable": "SFTP API недоступен"
|
||||
},
|
||||
"session": {
|
||||
"notFound": "Сеанс не найден",
|
||||
"saveFailed": "Не удалось сохранить сеанс",
|
||||
"loadFailed": "Не удалось загрузить сеанс",
|
||||
"readConfigFailed": "Не удалось прочитать конфигурацию сеанса",
|
||||
"exportWriteFailed": "Не удалось записать файл экспорта",
|
||||
"exportFailed": "Сбой экспорта сеансов",
|
||||
"importReadFailed": "Не удалось прочитать файл",
|
||||
"importFailed": "Сбой импорта сеансов",
|
||||
"importEmpty": "Импортируемые сеансы не найдены"
|
||||
},
|
||||
"validation": {
|
||||
"invalidHost": "Некорректный формат адреса хоста",
|
||||
"invalidPort": "Порт должен быть от 1 до 65535",
|
||||
"invalidCredentials": "Некорректный формат учётных данных",
|
||||
"hostRequired": "Введите адрес хоста",
|
||||
"usernameRequired": "Введите имя пользователя",
|
||||
"targetRequired": "Введите хост, напр. root@192.168.1.10 или opsbase.cn:5555",
|
||||
"serialPathRequired": "Введите путь к последовательному устройству",
|
||||
"taskRequired": "Введите задачу или уточнение"
|
||||
},
|
||||
"filesystem": {
|
||||
"error": "Ошибка файловой системы",
|
||||
"readFailed": "Не удалось прочитать файл",
|
||||
"writeFailed": "Не удалось записать файл"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Не удалось прочитать буфер обмена",
|
||||
"writeFailed": "Не удалось записать в буфер обмена",
|
||||
"copyPathFailed": "Не удалось скопировать путь",
|
||||
"unsupportedRead": "Чтение буфера обмена не поддерживается в этой среде",
|
||||
"unsupportedWrite": "Запись в буфер обмена не поддерживается в этой среде"
|
||||
},
|
||||
"ipc": {
|
||||
"error": "Внутренняя ошибка связи",
|
||||
"nativeApiUnavailable": "Нативный API недоступен"
|
||||
},
|
||||
"network": {
|
||||
"error": "Сетевая ошибка"
|
||||
},
|
||||
"pool": {
|
||||
"limitReached": "Достигнут предел подключений ({{max}}). Сначала закройте часть подключений."
|
||||
},
|
||||
"desktop": {
|
||||
"connectFailed": "Сбой подключения",
|
||||
"fileTooLarge": "Ограничение одного файла — 50 МБ",
|
||||
"nativeOnly": "Удалённые подключения доступны только в десктоп-приложении OpsXShell Tauri",
|
||||
"rdpNativeOnly": "RDP доступен только в десктоп-приложении OpsXShell Tauri",
|
||||
"vncNativeOnly": "VNC доступен только в десктоп-приложении OpsXShell Tauri"
|
||||
},
|
||||
"serial": {
|
||||
"openFailed": "Не удалось открыть последовательный порт",
|
||||
"writeFailed": "Сбой записи в последовательный порт",
|
||||
"nativeOnly": "Последовательные порты доступны только в десктоп-приложении Tauri"
|
||||
},
|
||||
"ai": {
|
||||
"noProvider": "Сначала настройте AI-провайдера в Настройки → AI",
|
||||
"noApiKey": "Для «{{provider}}» не сохранён API-ключ",
|
||||
"modelEmpty": "Модель не вернула содержимого",
|
||||
"protocolFailed": "Модель дважды нарушила протокол инструментов; остановлено",
|
||||
"noConclusion": "Модель не вернула пригодного итога",
|
||||
"multipleCommands": "Модель вернула несколько команд; выполнение отклонено",
|
||||
"invalidCommand": "Модель не вернула единственную однострочную команду; выполнение отклонено",
|
||||
"repeatLoop": "Обнаружен повторяющийся цикл команд; остановлено: {{command}}",
|
||||
"criticalBlocked": "Команда попала под деструктивную жёсткую блокировку; обход невозможен: {{command}}",
|
||||
"execFailed": "Сбой ssh-exec: {{error}}",
|
||||
"maxSteps": "Достигнут лимит в {{max}} шагов; сузьте задачу и повторите",
|
||||
"sshRequired": "Требуется подключённый удалённый SSH-сеанс"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "Сбой чтения: {{name}}",
|
||||
"writeFailed": "Сбой записи: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "Произошла неизвестная ошибка"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"title": "Подключение к последовательному порту",
|
||||
"description": "Нативный последовательный терминал · маршрутизаторы, коммутаторы, платы и отладочные консоли",
|
||||
"confirm": "Открыть порт",
|
||||
"device": "Устройство",
|
||||
"refresh": "Обновить",
|
||||
"devicePlaceholder": "{{path}}",
|
||||
"noDevicesHint": "Если устройств нет в списке, введите путь вручную, напр. {{examples}}.",
|
||||
"examplesWindows": "{{default}}, COM3",
|
||||
"examplesLinux": "{{default}}, /dev/ttyACM0",
|
||||
"examplesMac": "{{default}}, /dev/tty.usbserial-*",
|
||||
"baudRate": "Скорость (baud)",
|
||||
"dataBits": "Биты данных",
|
||||
"stopBits": "Стоп-биты",
|
||||
"parity": "Чётность",
|
||||
"parityNone": "Нет",
|
||||
"parityOdd": "Нечётная",
|
||||
"parityEven": "Чётная",
|
||||
"flowControl": "Управление потоком",
|
||||
"flowNone": "Нет",
|
||||
"flowSoftware": "Программное XON/XOFF",
|
||||
"flowHardware": "Аппаратное RTS/CTS",
|
||||
"lineEnding": "Конец строки",
|
||||
"lineEndingLf": "LF (\\n)",
|
||||
"lineEndingCr": "CR (\\r)",
|
||||
"lineEndingCrlf": "CRLF (\\r\\n)",
|
||||
"localEcho": "Локальный эхо-вывод",
|
||||
"localEchoHint": "(полудуплексная отладка)",
|
||||
"errorPathRequired": "Введите путь к последовательному устройству"
|
||||
},
|
||||
"terminal": {
|
||||
"title": "Serial",
|
||||
"connected": "Подключено",
|
||||
"disconnected": "Отключено",
|
||||
"connecting": "Подключение…",
|
||||
"error": "Ошибка Serial",
|
||||
"configSummary": "{{path}} · {{baud}} · {{dataBits}}-{{parity}}-{{stopBits}}",
|
||||
"opening": "Открытие {{path}} @ {{baud}}...",
|
||||
"openFailed": "Не удалось открыть последовательный порт: {{message}}",
|
||||
"connectedBanner": "Подключено {{path}} · {{baud}} {{frame}} · {{lineEnding}}{{echo}}",
|
||||
"localEchoSuffix": " · локальный эхо-вывод"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"sidebar": {
|
||||
"quickConnect": "Быстрое подключение",
|
||||
"quickConnectShort": "Подключить",
|
||||
"newSession": "Новый сеанс",
|
||||
"newSessionShort": "Новый",
|
||||
"searchPlaceholder": "Поиск сеансов...",
|
||||
"batchMode": "Пакетные действия",
|
||||
"exitBatchMode": "Выйти из пакетного режима",
|
||||
"batchSelected": "Выбрано SSH: {{count}}",
|
||||
"batchExcludedDesktop": " · RDP/VNC исключены",
|
||||
"selectAllVisible": "Выбрать все видимые",
|
||||
"deselectAllVisible": "Снять выделение видимых",
|
||||
"batchExec": "Пакетное выполнение",
|
||||
"settings": "Настройки",
|
||||
"resizeHint": "Перетаскивайте для изменения размера; двойной клик — свернуть"
|
||||
},
|
||||
"tree": {
|
||||
"selectSession": "Выберите сеанс",
|
||||
"noMatchTitle": "Совпадающие сеансы не найдены",
|
||||
"noMatchDesc": "Попробуйте другое ключевое слово",
|
||||
"emptyTitle": "Сеансов пока нет",
|
||||
"emptyDesc": "Быстрое подключение или создайте сеанс; двойной клик открывает терминал",
|
||||
"emptyAction": "Новый сеанс"
|
||||
},
|
||||
"contextMenu": {
|
||||
"blank": {
|
||||
"newGroup": "Новая группа",
|
||||
"newSession": "Новый сеанс"
|
||||
},
|
||||
"group": {
|
||||
"newSessionHere": "Новый сеанс здесь",
|
||||
"newGroup": "Новая группа",
|
||||
"renameGroup": "Переименовать группу",
|
||||
"deleteEmptyGroup": "Удалить пустую группу"
|
||||
},
|
||||
"session": {
|
||||
"open": "Открыть",
|
||||
"edit": "Изменить",
|
||||
"duplicate": "Дублировать",
|
||||
"delete": "Удалить"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"default": "По умолчанию",
|
||||
"new": {
|
||||
"title": "Новая группа",
|
||||
"message": "Введите имя группы",
|
||||
"placeholder": "напр. Продакшен",
|
||||
"confirm": "Создать"
|
||||
},
|
||||
"rename": {
|
||||
"title": "Переименовать группу",
|
||||
"message": "Переименовать «{{name}}» в",
|
||||
"placeholder": "Имя группы",
|
||||
"confirm": "Сохранить"
|
||||
},
|
||||
"deleteBlocked": {
|
||||
"title": "Невозможно удалить",
|
||||
"message": "В группе «{{name}}» ещё есть сеансы. Сначала переместите или удалите их.",
|
||||
"confirm": "Понятно"
|
||||
},
|
||||
"newOption": "Новая группа…",
|
||||
"hint": "Используется группа по умолчанию, если не выбрать или не создать другую"
|
||||
},
|
||||
"deleteSession": {
|
||||
"title": "Удалить сеанс",
|
||||
"message": "Удалить сеанс «{{name}}»?",
|
||||
"confirm": "Удалить"
|
||||
},
|
||||
"welcome": {
|
||||
"tagline": "Удалённый терминал · SFTP · Проброс портов",
|
||||
"sectionStart": "Начало работы",
|
||||
"sectionDesktop": "Удалённый рабочий стол",
|
||||
"sectionRecent": "Недавние сеансы",
|
||||
"quickConnect": {
|
||||
"title": "Быстрое подключение",
|
||||
"desc": "Разовое SSH; не сохраняется в библиотеке"
|
||||
},
|
||||
"newSession": {
|
||||
"title": "Новый сеанс",
|
||||
"desc": "Сохраняйте хосты; двойной клик в боковой панели для подключения"
|
||||
},
|
||||
"localShell": {
|
||||
"title": "Локальная оболочка",
|
||||
"selectShell": "Выберите оболочку",
|
||||
"default": "По умолчанию"
|
||||
},
|
||||
"rdp": {
|
||||
"title": "Удалённый рабочий стол RDP",
|
||||
"desc": "Windows · NLA / CredSSP"
|
||||
},
|
||||
"vnc": {
|
||||
"title": "Удалённый рабочий стол VNC",
|
||||
"desc": "RFB · кроссплатформенный графический сеанс"
|
||||
},
|
||||
"recentEmpty": {
|
||||
"title": "Сохранённых сеансов нет",
|
||||
"desc": "Попробуйте быстрое подключение или создайте сеанс для повторного использования"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"searchPlaceholder": "Поиск хостов, групп или вкладок"
|
||||
},
|
||||
"quickConnect": {
|
||||
"title": "Быстрое подключение",
|
||||
"target": "Цель",
|
||||
"targetPlaceholder": "root@192.168.1.10:22",
|
||||
"targetHint": "Поддерживаются host, user@host, user@host:port",
|
||||
"password": "Пароль",
|
||||
"passwordOptional": "Необязательно · оставьте пустым при использовании ключа",
|
||||
"connect": "Подключить",
|
||||
"errorInvalidTarget": "Введите хост, напр. root@192.168.1.10 или opsbase.cn:5555",
|
||||
"errorConnectFailed": "Сбой подключения"
|
||||
},
|
||||
"dialog": {
|
||||
"create": "Новый сеанс",
|
||||
"edit": "Изменить сеанс",
|
||||
"subtitle": "Цель одной строкой · расширенные параметры свернуты",
|
||||
"saving": "Сохранение…",
|
||||
"save": "Сохранить",
|
||||
"createAndSave": "Создать и сохранить",
|
||||
"basic": "Основные",
|
||||
"login": "Вход",
|
||||
"advanced": "Дополнительно",
|
||||
"advancedCollapsed": "Прокси · jump-хост · теги",
|
||||
"collapse": "Свернуть",
|
||||
"protocol": "Протокол",
|
||||
"displayName": "Отображаемое имя (необязательно)",
|
||||
"displayNamePlaceholder": "По умолчанию user@host или vnc:host",
|
||||
"host": "Хост",
|
||||
"hostPlaceholder": "192.168.1.10",
|
||||
"hostHint": "IP или имя хоста; также принимается host:port",
|
||||
"port": "Порт",
|
||||
"username": "Имя пользователя",
|
||||
"usernamePlaceholderRdp": "Administrator",
|
||||
"usernamePlaceholderSsh": "root",
|
||||
"width": "Ширина",
|
||||
"height": "Высота",
|
||||
"group": "Группа",
|
||||
"authPassword": "Пароль",
|
||||
"authKey": "Ключ",
|
||||
"password": "Пароль",
|
||||
"domain": "Домен (необязательно)",
|
||||
"domainPlaceholder": "Редко требуется, кроме доменных учётных записей",
|
||||
"keySource": "Источник ключа",
|
||||
"keyFile": "Файл",
|
||||
"keyText": "Текст",
|
||||
"privateKeyPath": "Путь к закрытому ключу",
|
||||
"privateKeyText": "Текст закрытого ключа",
|
||||
"privateKeyTextHint": "Вставленные ключи шифруются на диске как пароли",
|
||||
"pickKeyFile": "Обзор…",
|
||||
"pickKeyDialogTitle": "Выберите файл закрытого ключа",
|
||||
"allFilesFilter": "Все файлы",
|
||||
"passphrase": "Парольная фраза ключа (необязательно)",
|
||||
"passphrasePlaceholder": "Необязательно",
|
||||
"tags": "Теги",
|
||||
"tagsPlaceholder": "prod, web",
|
||||
"startupCommand": "Команда при запуске (необязательно)",
|
||||
"startupCommandPlaceholder": "Выполнить после подключения, напр. cd /var/log",
|
||||
"proxy": "Прокси",
|
||||
"proxyNone": "Нет",
|
||||
"proxyHostPlaceholder": "Хост прокси",
|
||||
"proxyPortPlaceholder": "Порт",
|
||||
"proxyUserPlaceholder": "Имя пользователя (необязательно)",
|
||||
"proxyPasswordPlaceholder": "Пароль (необязательно)",
|
||||
"jumpHost": "Jump-хост (необязательно)",
|
||||
"jumpNone": "Без jump-хоста",
|
||||
"jumpNoneAlt": "Без jump-хоста",
|
||||
"jumpHint": "Сохранённый сеанс можно использовать как jump-хост"
|
||||
},
|
||||
"batch": {
|
||||
"title": "Пакетное выполнение",
|
||||
"subtitle": "Выбрано {{selected}} · параллелизм {{concurrency}} · результаты отбрасываются при закрытии вкладки",
|
||||
"dialogTitle": "Пакетная команда",
|
||||
"dialogDesc": "Выбрано хостов {{selected}}/{{total}} · макс. параллелизм {{concurrency}}",
|
||||
"targetCount": "Целей: {{count}}",
|
||||
"runningProgress": "Выполняется {{completed}}/{{total}}",
|
||||
"execute": "Запустить на {{count}} хостах",
|
||||
"executeAgain": "Запустить снова",
|
||||
"success": "Успешно: {{count}}",
|
||||
"failed": "Сбой: {{count}}",
|
||||
"command": "Удалённая команда",
|
||||
"commandPlaceholder": "напр. uptime",
|
||||
"targets": "Целевые хосты",
|
||||
"filterPlaceholder": "Имя, IP, группа или тег",
|
||||
"filterAria": "Фильтр хостов",
|
||||
"noMatchHosts": "Совпадающие хосты не найдены",
|
||||
"resultMatrix": "Матрица результатов",
|
||||
"resultMatrixHint": "Хост × статус × вывод",
|
||||
"emptySelection": "Выберите цели слева или откройте из пакетного режима боковой панели с выделением",
|
||||
"noOutput": "(нет вывода)",
|
||||
"errorReadConfig": "Не удалось прочитать конфигурацию сеанса",
|
||||
"errorConnectFailed": "Сбой подключения",
|
||||
"errorExecFailed": "Сбой выполнения команды",
|
||||
"results": "Результаты",
|
||||
"resultsHint": "Вывод хранится только в этом диалоге",
|
||||
"ctrlEnterHint": "Ctrl/⌘ + Enter для запуска",
|
||||
"executeTo": "Запустить на {{count}} хостах",
|
||||
"selectFromLeft": "Выберите цели слева"
|
||||
},
|
||||
"importExport": {
|
||||
"exportTitle": "Экспорт сеансов",
|
||||
"exportDefaultPath": "opsxshell-sessions.bak",
|
||||
"exportFilterBak": "Резервная копия OpsXShell",
|
||||
"exportFilterJson": "JSON",
|
||||
"exportSuccess": "Экспортировано сеансов: {{count}} в:\n{{path}}",
|
||||
"exportWriteFailed": "Не удалось записать файл экспорта",
|
||||
"exportFailed": "Сбой экспорта сеансов",
|
||||
"exportFailedDetail": "Сбой экспорта сеансов: {{message}}",
|
||||
"exportPasswordTitle": "Задайте пароль резервной копии",
|
||||
"exportPasswordMessage": "Файл экспорта зашифрует группы хостов, закрытые ключи, пароли и другие секреты. Выберите пароль резервной копии.",
|
||||
"exportPasswordPlaceholder": "Введите пароль резервной копии",
|
||||
"exportPasswordConfirmTitle": "Подтвердите пароль резервной копии",
|
||||
"exportPasswordConfirmMessage": "Введите пароль резервной копии ещё раз для подтверждения.",
|
||||
"exportPasswordConfirmPlaceholder": "Повторите пароль резервной копии",
|
||||
"exportPasswordMismatch": "Пароли не совпадают",
|
||||
"exportPasswordRequired": "Для экспорта требуется пароль резервной копии",
|
||||
"importTitle": "Импорт сеансов",
|
||||
"importFilterBak": "Резервная копия OpsXShell",
|
||||
"importFilterJson": "JSON",
|
||||
"importFilterSshConfig": "SSH Config",
|
||||
"importFilterAll": "Все файлы",
|
||||
"readFileFailed": "Не удалось прочитать файл",
|
||||
"readFileFailedDetail": "Не удалось прочитать файл: {{message}}",
|
||||
"importPasswordTitle": "Введите пароль резервной копии",
|
||||
"importPasswordMessage": "Этот файл зашифрован. Введите пароль, заданный при экспорте, чтобы импортировать группы хостов и учётные данные.",
|
||||
"importPasswordPlaceholder": "Введите пароль резервной копии",
|
||||
"importPasswordRequired": "Для импорта зашифрованной резервной копии требуется пароль",
|
||||
"importPasswordInvalid": "Неверный пароль резервной копии или файл повреждён",
|
||||
"noSessionsFound": "Импортируемые сеансы не найдены",
|
||||
"noValidSessions": "В файле нет корректных записей сеансов",
|
||||
"importSuccess": "Импортировано сеансов: {{created}}/{{total}}",
|
||||
"importFailed": "Сбой импорта сеансов",
|
||||
"importFailedDetail": "Сбой импорта сеансов: {{message}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "Рабочее пространство",
|
||||
"generalDesc": "Макет и ресурсы",
|
||||
"appearance": "Внешний вид",
|
||||
"appearanceDesc": "Тема и язык",
|
||||
"terminal": "Терминал",
|
||||
"terminalDesc": "Шрифт и цвета",
|
||||
"shortcuts": "Горячие клавиши",
|
||||
"shortcutsDesc": "Назначение клавиш",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "Подключение и пул",
|
||||
"security": "Безопасность",
|
||||
"securityDesc": "Учётные данные и ключи хостов",
|
||||
"ai": "AI-модели",
|
||||
"aiDesc": "AI-провайдеры",
|
||||
"about": "О приложении",
|
||||
"aboutDesc": "Версия и данные"
|
||||
},
|
||||
"title": "Настройки",
|
||||
"search": {
|
||||
"placeholder": "Поиск по настройкам..."
|
||||
},
|
||||
"language": {
|
||||
"label": "Язык",
|
||||
"description": "Применяется сразу",
|
||||
"zhCN": "简体中文",
|
||||
"zhTW": "繁體中文",
|
||||
"en": "English",
|
||||
"ja": "日本語",
|
||||
"ko": "한국어",
|
||||
"vi": "Tiếng Việt",
|
||||
"ru": "Русский"
|
||||
},
|
||||
"general": {
|
||||
"layout": "Макет рабочего пространства",
|
||||
"sidebarWidth": "Ширина боковой панели",
|
||||
"sidebarWidthDesc": "Ширина панели сеансов по умолчанию",
|
||||
"collapseSidebar": "Сворачивать боковую панель",
|
||||
"collapseSidebarDesc": "Скрывать дерево сеансов, чтобы сосредоточиться на терминале; переключайте через Ctrl/Cmd+B"
|
||||
},
|
||||
"appearance": {
|
||||
"themeGroup": "Тема",
|
||||
"theme": "Тема",
|
||||
"themeDesc": "Цвета интерфейса приложения (независимо от цветов терминала)",
|
||||
"dark": "Тёмная",
|
||||
"light": "Светлая",
|
||||
"system": "Системная"
|
||||
},
|
||||
"terminal": {
|
||||
"fontGroup": "Шрифт и размер",
|
||||
"fontFamily": "Шрифт",
|
||||
"fontFamilyDesc": "Используйте Nerd Font для значков в приглашении Zsh",
|
||||
"fontSize": "Размер",
|
||||
"fontSizeDesc": "Размер текста терминала",
|
||||
"scrollback": "Буфер прокрутки",
|
||||
"scrollbackDesc": "Количество сохраняемых строк истории на терминал",
|
||||
"keywordHighlight": "Подсветка ключевых слов",
|
||||
"keywordHighlightDesc": "Подсвечивать ошибки, предупреждения и состояния успеха",
|
||||
"colorTheme": "Цветовая тема"
|
||||
},
|
||||
"shortcuts": {
|
||||
"resetAll": "Сбросить все по умолчанию",
|
||||
"custom": "Свои",
|
||||
"pressKeys": "Нажмите клавиши...",
|
||||
"resetDefault": "Сбросить по умолчанию",
|
||||
"conflict": "Конфликтует с «{{label}}»",
|
||||
"setTo": "Установлено: {{keys}}",
|
||||
"hint": "Нажмите на горячую клавишу, чтобы переназначить · Esc для отмены",
|
||||
"category": {
|
||||
"tabs": "Вкладки",
|
||||
"view": "Вид",
|
||||
"session": "Сеанс",
|
||||
"tools": "Инструменты"
|
||||
},
|
||||
"actions": {
|
||||
"tabNext": "Следующая вкладка",
|
||||
"tabPrev": "Предыдущая вкладка",
|
||||
"tabGotoN": "Перейти к вкладке N",
|
||||
"tabClose": "Закрыть текущую вкладку",
|
||||
"tabNew": "Новая вкладка",
|
||||
"viewFullscreen": "Полноэкранный режим",
|
||||
"viewToggleSidebar": "Показать/скрыть боковую панель",
|
||||
"sessionNew": "Новый сеанс",
|
||||
"sessionQuickConnect": "Быстрое подключение",
|
||||
"toolsCommandPalette": "Палитра команд"
|
||||
}
|
||||
},
|
||||
"ssh": {
|
||||
"connection": "Подключение",
|
||||
"keepAlive": "Keep-alive",
|
||||
"keepAliveDesc": "Отправлять keep-alive при простое для уменьшения разрывов",
|
||||
"autoReconnect": "Авто-переподключение",
|
||||
"autoReconnectDesc": "Автоматически повторять после неожиданного разрыва",
|
||||
"timeout": "Тайм-аут подключения",
|
||||
"timeoutDesc": "Максимальное время ожидания при установке SSH (секунды)",
|
||||
"maxReconnect": "Попытки переподключения",
|
||||
"maxReconnectDesc": "Максимум повторов после неожиданного разрыва",
|
||||
"pool": "Пул подключений",
|
||||
"maxConnections": "Максимум подключений",
|
||||
"maxConnectionsDesc": "Общий лимит для SSH, SFTP и пакетных подключений",
|
||||
"maxBackground": "Лимит фоновых подключений",
|
||||
"maxBackgroundDesc": "Вытеснять давно не использованные подключения при превышении лимита",
|
||||
"suspend": "Фоновая приостановка",
|
||||
"suspendDesc": "Минуты до освобождения активных каналов, когда вкладка в фоне"
|
||||
},
|
||||
"security": {
|
||||
"credentials": "Защита учётных данных",
|
||||
"sessionPassword": "Пароли сеансов и парольные фразы ключей",
|
||||
"sessionPasswordDesc": "Шифруются AES-256-GCM в Rust перед сохранением; отключить нельзя",
|
||||
"enabled": "Включено",
|
||||
"masterKey": "Локальный мастер-ключ",
|
||||
"masterKeyDesc": "Доступен только текущему системному пользователю; путь ~/.opsxshell/master.key (устаревший ~/.opsxshsell мигрируется автоматически)",
|
||||
"knownHosts": "Известные хосты",
|
||||
"knownHostsHint": "При первом подключении запрашивается отпечаток хоста. Если переустановка или клон изменяют ключ, выберите «Доверять и обновить» в запросе, чтобы заменить старую запись. Здесь можно удалить отдельную запись или очистить все.",
|
||||
"clearAll": "Очистить все",
|
||||
"removeHost": "Удалить запись этого хоста",
|
||||
"empty": "Записей нет",
|
||||
"clearConfirm": "Очистить все известные ключи хостов? При следующем подключении запрос появится снова."
|
||||
},
|
||||
"about": {
|
||||
"tagline": "Лёгкий нативный терминал эксплуатации SSH / SFTP",
|
||||
"appVersion": "Приложение v{{version}}",
|
||||
"copyVersion": "Копировать сведения о версии",
|
||||
"runtime": "Среда выполнения",
|
||||
"system": "Система",
|
||||
"localData": "Локальные данные",
|
||||
"sessionsSettings": "Сеансы и настройки",
|
||||
"masterKeyPath": "Мастер-ключ",
|
||||
"privacyNote": "Пароли и парольные фразы ключей шифруются AES-256-GCM в Rust. OpsXShell не сохраняет историю команд терминала.",
|
||||
"license": "Лицензия MIT · Rust · XTerm.js"
|
||||
},
|
||||
"ai": {
|
||||
"presets": "Пресеты провайдеров",
|
||||
"add": "Добавить",
|
||||
"configured": "Настроено",
|
||||
"configuredHint": "Выберите провайдера и нажмите «Добавить»",
|
||||
"emptyHint": "Добавьте провайдера, чтобы начать",
|
||||
"noModel": "Модель не выбрана",
|
||||
"name": "Название",
|
||||
"model": "Модель",
|
||||
"protocol": "Протокол",
|
||||
"auth": "Аутентификация",
|
||||
"authNone": "Нет",
|
||||
"test": "Проверить",
|
||||
"testing": "Проверка",
|
||||
"testingMessage": "Проверка...",
|
||||
"saved": "Сохранено",
|
||||
"retest": "Пожалуйста, перепроверьте",
|
||||
"testFailed": "Сбой проверки подключения",
|
||||
"available": "OK · {{latency}} мс",
|
||||
"savedKeepBlank": "Сохранено — оставьте пустым, чтобы сохранить",
|
||||
"notRequired": "Не требуется",
|
||||
"otherModels": "Другие модели…",
|
||||
"customModel": "Своя модель",
|
||||
"backToList": "Назад к списку",
|
||||
"apiKeyOptional": "API Key (не требуется)",
|
||||
"advanced": "Дополнительно",
|
||||
"allowHttp": "Разрешить HTTP (localhost/LAN)",
|
||||
"setActive": "Сделать активным",
|
||||
"deleteTitle": "Удалить",
|
||||
"apiKeySaveFailed": "Не удалось сохранить API-ключ",
|
||||
"providerNotFound": "Провайдер не найден",
|
||||
"modelCatalogReadFailed": "Не удалось прочитать каталог моделей",
|
||||
"catalogUnavailable": "models.dev недоступен"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "Совместимый с OpenAI",
|
||||
"standalone": "────────",
|
||||
"plan": "План",
|
||||
"local": "Self-hosted",
|
||||
"custom": "Своё"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"panel": {
|
||||
"local": "Локально",
|
||||
"remote": "Удалённо",
|
||||
"notConnectedTitle": "Нет подключения к удалённому серверу",
|
||||
"notConnectedDesc": "Сначала подключите SSH-сеанс, чтобы использовать SFTP",
|
||||
"ariaLabel": "Панель файлов: {{title}}"
|
||||
},
|
||||
"connection": {
|
||||
"selectServer": "Выберите сервер",
|
||||
"noSessions": "Нет сохранённых сеансов",
|
||||
"createSessionHint": "Сначала создайте сеанс на боковой панели",
|
||||
"reconnect": "Переподключиться",
|
||||
"notConnected": "Нет подключения",
|
||||
"connecting": "Подключение..."
|
||||
},
|
||||
"errors": {
|
||||
"notConnected": "SFTP не подключён",
|
||||
"noUploadFiles": "Нет файлов для загрузки",
|
||||
"localStatFailed": "Не удалось прочитать информацию о локальном файле",
|
||||
"loadRemoteFailed": "Не удалось загрузить удалённый каталог: {{message}}",
|
||||
"noFolderDownload": "Не удалось скачать папку",
|
||||
"selectDownloadFiles": "Сначала выберите файлы для скачивания",
|
||||
"uploadFailed": "Сбой загрузки",
|
||||
"downloadFailed": "Сбой скачивания",
|
||||
"fileError": "{{fileName}}: {{message}}"
|
||||
},
|
||||
"toolbar": {
|
||||
"upload": "Загрузить",
|
||||
"uploadAria": "Загрузить",
|
||||
"download": "Скачать",
|
||||
"downloadAria": "Скачать",
|
||||
"downloadNeedSelection": "Сначала выберите удалённые файлы",
|
||||
"downloadHint": "Скачать выбранные удалённые файлы",
|
||||
"refresh": "Обновить",
|
||||
"refreshAria": "Обновить",
|
||||
"newFolder": "Новая папка",
|
||||
"newFolderAria": "Новая папка"
|
||||
},
|
||||
"sort": {
|
||||
"name": "Имя",
|
||||
"modified": "Изменён",
|
||||
"size": "Размер",
|
||||
"type": "Тип"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Домой",
|
||||
"back": "Назад",
|
||||
"forward": "Вперёд",
|
||||
"up": "Вверх",
|
||||
"searchPlaceholder": "Поиск по именам файлов",
|
||||
"clearSearch": "Очистить поиск",
|
||||
"clearSearchAria": "Очистить поиск",
|
||||
"showHidden": "Показать скрытые файлы",
|
||||
"hideHidden": "Скрыть dot-файлы (.xxx)",
|
||||
"showHiddenAria": "Показать скрытые файлы",
|
||||
"hideHiddenAria": "Скрыть dot-файлы",
|
||||
"searchAria": "Поиск в {{title}}"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Загрузка...",
|
||||
"selected": "Выбрано: {{count}}",
|
||||
"filtered": "Показано {{shown}} / {{total}}",
|
||||
"hiddenCount": "{{total}} объектов ({{hidden}} скрыто)",
|
||||
"total": "Объектов: {{count}}",
|
||||
"filterHint": "Фильтр: {{query}}"
|
||||
},
|
||||
"empty": {
|
||||
"dirTitle": "Пустой каталог",
|
||||
"dirDescLocal": "В этом каталоге нет файлов",
|
||||
"dirDescRemote": "Попробуйте перейти вверх или обновить",
|
||||
"goUp": "Перейти вверх",
|
||||
"hiddenOnlyTitle": "Только скрытые файлы",
|
||||
"hiddenOnlyDesc": "Нажмите значок глаза в шапке, чтобы показать dot-файлы",
|
||||
"showHiddenAction": "Показать скрытые файлы",
|
||||
"noMatchTitle": "Совпадающие файлы не найдены",
|
||||
"noMatchDesc": "Нет файлов, соответствующих «{{query}}»"
|
||||
},
|
||||
"fileType": {
|
||||
"folder": "Папка",
|
||||
"symlink": "Ссылка",
|
||||
"symlinkLong": "Символическая ссылка",
|
||||
"file": "Файл",
|
||||
"text": "Текст",
|
||||
"log": "Журнал",
|
||||
"database": "База данных",
|
||||
"imageIso": "Образ диска",
|
||||
"executable": "Исполняемый",
|
||||
"library": "Библиотека"
|
||||
},
|
||||
"relativeDate": {
|
||||
"today": "Сегодня",
|
||||
"yesterday": "Вчера",
|
||||
"daysAgo": "{{count}} дн. назад"
|
||||
},
|
||||
"contextMenu": {
|
||||
"open": "Открыть",
|
||||
"upload": "Загрузить",
|
||||
"download": "Скачать",
|
||||
"edit": "Изменить",
|
||||
"rename": "Переименовать",
|
||||
"copyPath": "Копировать путь",
|
||||
"properties": "Свойства",
|
||||
"permissions": "Права доступа",
|
||||
"delete": "Удалить"
|
||||
},
|
||||
"dialog": {
|
||||
"renameTitle": "Переименовать",
|
||||
"renameMessage": "Введите новое имя:",
|
||||
"renamePlaceholder": "Новое имя",
|
||||
"newFolderTitle": "Новая папка",
|
||||
"newFolderMessage": "Введите имя папки:",
|
||||
"newFolderPlaceholder": "Имя папки",
|
||||
"propertiesTitle": "Свойства файла",
|
||||
"propertiesClose": "Закрыть",
|
||||
"chmodTitle": "Изменить права доступа",
|
||||
"chmodApply": "Применить",
|
||||
"pickUploadTitle": "Выберите файлы или папки для загрузки",
|
||||
"pickUploadRzTitle": "Выберите файл для загрузки (rz)"
|
||||
},
|
||||
"properties": {
|
||||
"name": "Имя",
|
||||
"path": "Путь",
|
||||
"size": "Размер",
|
||||
"permissions": "Права доступа",
|
||||
"modified": "Изменён",
|
||||
"accessed": "Доступ",
|
||||
"symlink": "Символическая ссылка",
|
||||
"loadingDetails": "Загрузка подробностей..."
|
||||
},
|
||||
"chmod": {
|
||||
"read": "Чтение",
|
||||
"write": "Запись",
|
||||
"execute": "Выполнение",
|
||||
"owner": "Владелец",
|
||||
"group": "Группа",
|
||||
"other": "Остальные",
|
||||
"current": "Текущий режим:",
|
||||
"readR": "Чтение (r)",
|
||||
"writeW": "Запись (w)",
|
||||
"executeX": "Выполнение (x)"
|
||||
},
|
||||
"transfer": {
|
||||
"queue": "Очередь передачи",
|
||||
"active": "Активно: {{count}}",
|
||||
"completed": "Завершено: {{count}}",
|
||||
"taskCount": "Задач: {{count}}",
|
||||
"empty": "Нет задач передачи",
|
||||
"cancel": "Отмена",
|
||||
"remove": "Удалить",
|
||||
"statusWaiting": "Ожидание",
|
||||
"statusDone": "Готово",
|
||||
"statusFailed": "Сбой",
|
||||
"statusCancelled": "Отменено",
|
||||
"dropUpload": "Загрузить в {{path}}",
|
||||
"dropDownload": "Скачать в {{path}}"
|
||||
},
|
||||
"editor": {
|
||||
"readFailed": "Сбой чтения",
|
||||
"saveFailed": "Сбой сохранения",
|
||||
"unsavedClose": "Есть несохранённые изменения. Всё равно закрыть?",
|
||||
"saving": "Сохранение...",
|
||||
"save": "Сохранить",
|
||||
"saved": "Файл сохранён",
|
||||
"loadingEditor": "Загрузка редактора...",
|
||||
"footer": "UTF-8 · Monaco · ⌘/Ctrl+S сохранить · максимум ~2 МБ",
|
||||
"charCount": "Символов: {{count}}",
|
||||
"unsavedMark": " · не сохранено",
|
||||
"savedMark": " · сохранено"
|
||||
},
|
||||
"toast": {
|
||||
"renamed": "Переименовано в {{name}}",
|
||||
"renameFailed": "Сбой переименования",
|
||||
"pathCopied": "Путь скопирован в буфер обмена",
|
||||
"pathCopyFailed": "Не удалось скопировать путь",
|
||||
"chmodUpdated": "Права доступа изменены на {{mode}}",
|
||||
"chmodFailed": "Не удалось обновить права доступа",
|
||||
"uploadPartial": "{{action}} завершено для {{completed}}, сбой {{failed}}: {{detail}}",
|
||||
"uploadSuccess": "{{action}} выполнено для {{completed}} элемент(ов)",
|
||||
"uploadAction": "Загрузка",
|
||||
"downloadAction": "Скачивание",
|
||||
"noFolderUpload": "Сбой загрузки папки",
|
||||
"noDragPath": "Пути перетаскивания недоступны; используйте «Загрузить»",
|
||||
"noFolderRecursive": "Сбой рекурсивной передачи папки; повторите или используйте «Загрузить»"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Сниппеты команд"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Поиск сниппетов..."
|
||||
},
|
||||
"form": {
|
||||
"name": "Название",
|
||||
"command": "Команда",
|
||||
"tags": "Теги",
|
||||
"tagsHint": "(через запятую)",
|
||||
"namePlaceholder": "напр. Перезапуск Nginx",
|
||||
"commandPlaceholder": "sudo systemctl restart nginx\n# поддерживает {{host}} {{username}} {{date}}",
|
||||
"variables": "Переменные:"
|
||||
},
|
||||
"dialog": {
|
||||
"createTitle": "Новый сниппет",
|
||||
"editTitle": "Изменить сниппет"
|
||||
},
|
||||
"empty": {
|
||||
"noMatch": "Совпадающие сниппеты не найдены",
|
||||
"noMatchDesc": "Попробуйте другое ключевое слово",
|
||||
"noSnippets": "Сниппетов пока нет",
|
||||
"noSnippetsDesc": "Сохраняйте частые команды и вставляйте их в терминал"
|
||||
},
|
||||
"action": {
|
||||
"create": "Новый сниппет",
|
||||
"insert": "Вставить в терминал",
|
||||
"noTerminal": "Нет активного терминала"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"toolbar": {
|
||||
"splitHorizontal": "Разделить влево/вправо",
|
||||
"splitVertical": "Разделить сверху/снизу",
|
||||
"addPane": "Добавить панель",
|
||||
"closePane": "Закрыть текущую панель",
|
||||
"maximizePane": "Развернуть текущую панель",
|
||||
"restoreLayout": "Восстановить разделённый макет",
|
||||
"broadcast": "Широковещательная рассылка",
|
||||
"broadcastAria": "Широковещательный ввод",
|
||||
"broadcastOn": "Рассылка включена: ввод синхронизируется в {{count}} терминалах в области",
|
||||
"broadcastOffPro": "Широковещательный ввод (Pro) · {{count}} терминалов в области",
|
||||
"broadcastNeedPanesTab": "Для рассылки этой вкладке нужно минимум 2 готовые панели (сначала разделите)",
|
||||
"broadcastNeedPanesAll": "Для рассылки во всех вкладках терминала нужно минимум 2 готовых терминала",
|
||||
"broadcastScopeAria": "Область рассылки",
|
||||
"broadcastScopeTab": "Панели текущей вкладки",
|
||||
"broadcastScopeAll": "Все вкладки терминала",
|
||||
"broadcastActive": "Рассылка · {{count}}",
|
||||
"aiAssistant": "AI-ассистент",
|
||||
"aiOpen": "Открыть терминального AI-ассистента",
|
||||
"aiClose": "Закрыть терминального AI-ассистента",
|
||||
"aiTitle": "Терминальный AI-ассистент (Pro)",
|
||||
"paneCount": "{{current}}/{{max}}",
|
||||
"labelLocal": "Локальный терминал",
|
||||
"labelSsh": "SSH-терминал",
|
||||
"closePaneLabel": "Закрыть текущую панель",
|
||||
"closeTabLabel": "Закрыть текущую вкладку терминала",
|
||||
"targetSshSession": "Текущий SSH-сеанс"
|
||||
},
|
||||
"overlay": {
|
||||
"shellClosedIdle": "Тайм-аут простоя; оболочка завершилась",
|
||||
"shellClosed": "Оболочка завершилась",
|
||||
"shellClosedHint": "SSH-подключение сохранено; остальные панели, SFTP и туннели не затронуты",
|
||||
"reopenShell": "Открыть оболочку снова",
|
||||
"reopening": "Открытие…",
|
||||
"disconnected": "Отключено",
|
||||
"disconnectedHint": "SSH-сеанс завершился или сеть упала. Нажмите ниже, чтобы переподключиться.",
|
||||
"reconnect": "Переподключиться",
|
||||
"suspended": "Подключение приостановлено",
|
||||
"suspendedHint": "Долгое отсутствие активности; подключение приостановлено для экономии ресурсов",
|
||||
"resume": "Возобновить подключение",
|
||||
"connectFailed": "Сбой подключения",
|
||||
"connectFailedHint": "Проверьте хост, порт, имя пользователя и аутентификацию",
|
||||
"retryConnect": "Повторить подключение",
|
||||
"connecting": "Подключение…",
|
||||
"reconnecting": "Автопереподключение{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "Локальная оболочка завершилась"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "Проверка ключа хоста",
|
||||
"titleChanged": "Ключ хоста изменился",
|
||||
"descNew": "Первое подключение к этому хосту. Проверьте отпечаток перед доверием.",
|
||||
"descChanged": "SSH-ключ этого хоста больше не совпадает с локальной записью. Возможен риск MITM.",
|
||||
"host": "Хост",
|
||||
"type": "Тип",
|
||||
"fingerprint": "SHA256-отпечаток",
|
||||
"previousFingerprint": "Предыдущий отпечаток",
|
||||
"reject": "Отклонить",
|
||||
"acceptOnce": "Доверять один раз",
|
||||
"acceptAlways": "Всегда доверять",
|
||||
"acceptAlwaysChanged": "Доверять и обновить в любом случае"
|
||||
},
|
||||
"contextMenu": {
|
||||
"aria": "Действия терминала",
|
||||
"copy": "Копировать",
|
||||
"paste": "Вставить",
|
||||
"selectAll": "Выделить всё",
|
||||
"clear": "Очистить экран",
|
||||
"splitRight": "Разделить справа",
|
||||
"splitDown": "Разделить вниз",
|
||||
"maximizePane": "Развернуть текущую панель",
|
||||
"restoreLayout": "Восстановить разделённый макет"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Поиск...",
|
||||
"previous": "Предыдущее (Shift+Enter)",
|
||||
"next": "Следующее (Enter)",
|
||||
"close": "Закрыть (Escape)"
|
||||
},
|
||||
"zmodem": {
|
||||
"uploadTransferring": "rz загрузка: {{detail}}",
|
||||
"downloadTransferring": "sz скачивание: {{detail}}",
|
||||
"selectLocalFile": "Выберите локальный файл",
|
||||
"pickUploadTitle": "Выберите файл для загрузки (rz)",
|
||||
"uploadedCount": "Загружено файлов: {{count}}",
|
||||
"downloadedSingle": "{{path}}",
|
||||
"downloadedCount": "Скачано файлов: {{count}} → {{dir}}",
|
||||
"transferDone": "Передача завершена",
|
||||
"transferFailed": "Сбой передачи {{message}}",
|
||||
"uploadSuccessTerminal": "✓ Загружено файлов: {{count}} в удалённый рабочий каталог",
|
||||
"downloadSuccessTerminal": "✓ Скачано {{path}}",
|
||||
"savedDownloadsSingle": "✓ Сохранено в Downloads",
|
||||
"savedDownloadsMultiple": "✓ Сохранено файлов: {{count}} в Downloads",
|
||||
"nativeApiUnavailable": "Нативный API недоступен",
|
||||
"readFailed": "Сбой чтения: {{name}}",
|
||||
"writeFailed": "Сбой записи: {{name}}",
|
||||
"createLocalShellFailed": "Не удалось создать локальную оболочку",
|
||||
"createRemoteShellFailed": "Не удалось создать удалённую оболочку",
|
||||
"createShellFailed": "Не удалось создать оболочку: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Не удалось прочитать буфер обмена",
|
||||
"writeFailed": "Не удалось записать в буфер обмена"
|
||||
},
|
||||
"input": {
|
||||
"failed": "Сбой ввода в терминал"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "Ошибка: {{message}}",
|
||||
"autoReconnecting": "Автопереподключение ({{attempt}})...",
|
||||
"autoReconnectLimit": "Достигнут предел автопереподключений ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "Отключено, повтор {{attempt}}/{{max}} через {{seconds}} с...",
|
||||
"autoReconnectBanner": "[Автопереподключение] Повтор {{attempt}}/{{max}} через {{seconds}} с",
|
||||
"disconnectedBanner": "[Отключено] {{reason}}",
|
||||
"noConfig": "Данные для подключения отсутствуют"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user