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:
Logan.Li committed 2026-08-12 00:07:48 +08:00
1 parent fea6d8db04
commit b0d0e3a5f3
301 files changed
+28002 -2705

No files matched your search

+87
View File
@@ -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}}"
}
}
+326
View File
@@ -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": "Копировать"
}
}
+44
View File
@@ -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}} (видно на удалённом «Этот компьютер»)"
}
}
+161
View File
@@ -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": "Произошла неизвестная ошибка"
}
}
+44
View File
@@ -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": " · локальный эхо-вывод"
}
}
+237
View File
@@ -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}}"
}
}
+174
View File
@@ -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": "Своё"
}
}
+186
View File
@@ -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": "Сбой рекурсивной передачи папки; повторите или используйте «Загрузить»"
}
}
+32
View File
@@ -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": "Нет активного терминала"
}
}
+119
View File
@@ -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": "Данные для подключения отсутствуют"
}
}