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}}"
}
}