Fixes #331 ## Summary - add an optional Markdown preview toggle for markdown files in the Files tab - add a word-wrap toggle for the source editor - escape raw HTML in preview mode and limit preview to plain Markdown file extensions ## Why The Files tab only showed raw source, which makes Markdown files harder to read quickly. This change adds a lightweight preview/source switch without introducing a larger viewer registry. ## What Changed - `packages/ui/src/components/instance/shell/right-panel/tabs/FilesTab.tsx` - added `Preview Markdown` / `Show source` toggle for markdown files - added a word-wrap toggle for the Monaco source viewer - restricted preview mode to plain Markdown extensions - escaped raw HTML in markdown preview mode - `packages/ui/src/components/file-viewer/monaco-file-viewer.tsx` - added configurable word-wrap support - `packages/ui/src/components/instance/shell/right-panel/RightPanel.tsx` - moved file-viewer word-wrap state up so it persists across tab switches - `packages/ui/src/components/instance/shell/storage.ts` - added storage key for file-viewer word wrap - `packages/ui/src/lib/i18n/messages/*/instance.ts` - added strings for preview/source and word-wrap controls ## Validation - `npm run build --workspace @codenomad/ui`
226 lines
19 KiB
TypeScript
226 lines
19 KiB
TypeScript
export const instanceMessages = {
|
||
"instanceTabs.new.title": "Новый экземпляр (Cmd/Ctrl+N)",
|
||
"instanceTabs.new.ariaLabel": "Новый экземпляр",
|
||
"instanceTabs.remote.title": "Удаленное подключение",
|
||
"instanceTabs.remote.ariaLabel": "Удаленное подключение",
|
||
|
||
"instanceInfo.title": "Информация об экземпляре",
|
||
"instanceInfo.labels.folder": "Папка",
|
||
"instanceInfo.labels.project": "Проект",
|
||
"instanceInfo.labels.versionControl": "Система контроля версий",
|
||
"instanceInfo.labels.opencodeVersion": "Версия OpenCode",
|
||
"instanceInfo.labels.binaryPath": "Путь к бинарнику",
|
||
"instanceInfo.labels.environmentVariables": "Переменные окружения ({count})",
|
||
"instanceInfo.loading": "Загрузка…",
|
||
"instanceInfo.server.title": "Сервер",
|
||
"instanceInfo.server.port": "Порт:",
|
||
"instanceInfo.server.pid": "PID:",
|
||
"instanceInfo.server.status": "Статус:",
|
||
|
||
"instanceTab.status.permission": "Ожидание разрешения",
|
||
"instanceTab.status.compacting": "Компактация",
|
||
"instanceTab.status.working": "Работает",
|
||
"instanceTab.status.idle": "Простой",
|
||
"instanceTab.status.ariaLabel": "Статус экземпляра: {status}",
|
||
"instanceTab.actions.close.ariaLabel": "Закрыть экземпляр",
|
||
|
||
"instanceShell.leftPanel.sessionsTitle": "Сессии",
|
||
"instanceShell.leftPanel.instanceInfo": "Информация об экземпляре",
|
||
"instanceShell.leftDrawer.pin": "Закрепить левую панель",
|
||
"instanceShell.leftDrawer.unpin": "Открепить левую панель",
|
||
"instanceShell.leftDrawer.toggle.pinned": "Левая панель закреплена",
|
||
"instanceShell.leftDrawer.toggle.open": "Открыть левую панель",
|
||
"instanceShell.leftDrawer.toggle.close": "Закрыть левую панель",
|
||
|
||
"instanceShell.rightDrawer.pin": "Закрепить правую панель",
|
||
"instanceShell.rightDrawer.unpin": "Открепить правую панель",
|
||
"instanceShell.rightDrawer.toggle.pinned": "Правая панель закреплена",
|
||
"instanceShell.rightDrawer.toggle.open": "Открыть правую панель",
|
||
"instanceShell.rightDrawer.toggle.close": "Закрыть правую панель",
|
||
|
||
"instanceShell.fullscreen.enter": "Полный экран",
|
||
"instanceShell.fullscreen.exit": "Выйти из полного экрана",
|
||
|
||
"instanceShell.metrics.usedLabel": "Использовано",
|
||
"instanceShell.metrics.availableLabel": "Доступно",
|
||
|
||
"instanceShell.commandPalette.openAriaLabel": "Открыть палитру команд",
|
||
"instanceShell.commandPalette.button": "Палитра команд",
|
||
|
||
"instanceShell.connection.ariaLabel": "Соединение {status}",
|
||
"instanceShell.connection.connected": "Подключено",
|
||
"instanceShell.connection.connecting": "Подключение…",
|
||
"instanceShell.connection.disconnected": "Отключено",
|
||
"instanceShell.connection.unknown": "Неизвестно",
|
||
|
||
"instanceWelcome.shortcuts.newSession": "Новая сессия",
|
||
"instanceWelcome.empty.title": "Нет предыдущих сессий",
|
||
"instanceWelcome.empty.description": "Создайте новую сессию ниже, чтобы начать",
|
||
"instanceWelcome.loading.title": "Загрузка сессий",
|
||
"instanceWelcome.loading.description": "Получаем ваши предыдущие сессии…",
|
||
"instanceWelcome.resume.title": "Продолжить сессию",
|
||
"instanceWelcome.resume.subtitle.one": "{count} сессия доступна",
|
||
"instanceWelcome.resume.subtitle.other": "{count} сессий доступно",
|
||
"instanceWelcome.session.untitled": "Сессия без названия",
|
||
"instanceWelcome.new.title": "Начать новую сессию",
|
||
"instanceWelcome.new.subtitle": "Мы автоматически используем последнего агента/модель",
|
||
"instanceWelcome.new.createButton": "Создать сессию",
|
||
"instanceWelcome.overlay.close": "Закрыть",
|
||
"instanceWelcome.actions.viewInstanceInfo": "Показать информацию об экземпляре",
|
||
"instanceWelcome.actions.renameTitle": "Переименовать сессию",
|
||
"instanceWelcome.actions.deleteTitle": "Удалить сессию",
|
||
"instanceWelcome.hints.navigate": "Навигация",
|
||
"instanceWelcome.hints.jump": "Перейти",
|
||
"instanceWelcome.hints.firstLast": "Первый/последний",
|
||
"instanceWelcome.hints.resume": "Продолжить",
|
||
"instanceWelcome.hints.delete": "Удалить",
|
||
"instanceWelcome.toasts.renameError": "Не удалось переименовать сессию",
|
||
|
||
"instanceDisconnected.title": "Экземпляр отключен",
|
||
"instanceDisconnected.folderFallback": "это рабочее пространство",
|
||
"instanceDisconnected.reasonFallback": "Сервер перестал отвечать",
|
||
"instanceDisconnected.description": "{folder} больше недоступно. Закройте вкладку, чтобы продолжить работу.",
|
||
"instanceDisconnected.details.title": "Подробности",
|
||
"instanceDisconnected.details.folderLabel": "Папка:",
|
||
"instanceDisconnected.actions.closeInstance": "Закрыть экземпляр",
|
||
|
||
"instanceShell.empty.title": "Сессия не выбрана",
|
||
"instanceShell.empty.description": "Выберите сессию, чтобы просмотреть сообщения",
|
||
|
||
"instanceShell.rightPanel.title": "Панель состояния",
|
||
"instanceShell.rightPanel.tabs.changes": "Изменения",
|
||
"instanceShell.rightPanel.tabs.gitChanges": "Изменения Git",
|
||
"instanceShell.rightPanel.tabs.files": "Файлы",
|
||
"instanceShell.rightPanel.tabs.status": "Статус",
|
||
"instanceShell.rightPanel.tabs.ariaLabel": "Вкладки правой панели",
|
||
"instanceShell.rightPanel.actions.refresh": "Обновить",
|
||
"instanceShell.rightPanel.actions.save": "Сохранить (Ctrl+S)",
|
||
"instanceShell.rightPanel.actions.saveConfirm.message": "Сохранить изменения в \"{path}\" перед переключением?",
|
||
"instanceShell.rightPanel.actions.saveConfirm.confirmLabel": "Сохранить",
|
||
"instanceShell.rightPanel.actions.saveConfirm.cancelLabel": "Отменить изменения",
|
||
"instanceShell.rightPanel.actions.conflict.message": "Файл был изменён агентом. Перезаписать изменения агента?",
|
||
"instanceShell.rightPanel.actions.conflict.confirmLabel": "Перезаписать",
|
||
"instanceShell.rightPanel.actions.conflict.cancelLabel": "Отмена",
|
||
"instanceShell.rightPanel.actions.refreshDirty.message": "Файл имеет несохранённые изменения. Обновление отменит ваши правки. Продолжить?",
|
||
"instanceShell.rightPanel.actions.refreshDirty.confirmLabel": "Обновить",
|
||
"instanceShell.rightPanel.actions.refreshDirty.cancelLabel": "Отмена",
|
||
"instanceShell.rightPanel.toast.saveSuccess": "Файл успешно сохранён",
|
||
"instanceShell.rightPanel.toast.saveError": "Не удалось сохранить файл",
|
||
"instanceShell.rightPanel.sections.yoloMode": "Режим Yolo",
|
||
"instanceShell.rightPanel.sections.yoloMode.tooltip": "Автоматически одобряет запросы разрешений для текущей сессии. Включайте только если доверяете запускаемым инструментам.",
|
||
"instanceShell.rightPanel.sections.sessionChanges": "Изменения сессии",
|
||
"instanceShell.rightPanel.sections.sessionChanges.tooltip": "Файлы, измененные в текущей сессии. Показывает добавления и удаления для каждого файла.",
|
||
"instanceShell.rightPanel.sections.plan": "План",
|
||
"instanceShell.rightPanel.sections.plan.tooltip": "Дорожная карта агента для этой сессии. Отслеживает задачи и их статус выполнения.",
|
||
"instanceShell.rightPanel.sections.backgroundProcesses": "Фоновые оболочки",
|
||
"instanceShell.rightPanel.sections.backgroundProcesses.tooltip": "Долгоработающие процессы, запущенные агентом. Вы можете следить за их выводом, останавливать или завершать их.",
|
||
"instanceShell.rightPanel.sections.mcp": "MCP-серверы",
|
||
"instanceShell.rightPanel.sections.mcp.tooltip": "Серверы протокола Model Context Protocol, расширяющие возможности агента внешними инструментами.",
|
||
"instanceShell.rightPanel.sections.lsp": "LSP-серверы",
|
||
"instanceShell.rightPanel.sections.lsp.tooltip": "Серверы протокола Language Server Protocol, обеспечивающие интеллектуальную поддержку кода и диагностику.",
|
||
"instanceShell.rightPanel.sections.plugins": "Плагины",
|
||
"instanceShell.rightPanel.sections.plugins.tooltip": "Плагины, настраивающие поведение интерфейса и сервера, добавляющие функции поверх MCP и LSP.",
|
||
|
||
"instanceShell.sessionChanges.noSessionSelected": "Выберите сессию, чтобы просмотреть изменения.",
|
||
"instanceShell.sessionChanges.loading": "Загрузка изменений...",
|
||
"instanceShell.sessionChanges.empty": "Пока нет изменений.",
|
||
"instanceShell.sessionChanges.filesChanged": "Изменено файлов: {count}",
|
||
"instanceShell.sessionChanges.actions.show": "Показать изменения",
|
||
|
||
"instanceShell.gitChanges.loading": "Загрузка изменений Git...",
|
||
"instanceShell.gitChanges.empty": "Изменений Git пока нет.",
|
||
"instanceShell.gitChanges.deleted": "Удалено",
|
||
"instanceShell.gitChanges.binaryViewer": "Невозможно показать бинарный файл",
|
||
"instanceShell.gitChanges.sections.staged": "Подготовленные изменения",
|
||
"instanceShell.gitChanges.sections.unstaged": "Изменения",
|
||
"instanceShell.gitChanges.actions.insertContext": "Добавить в промпт",
|
||
"instanceShell.gitChanges.actions.stage": "Подготовить файл",
|
||
"instanceShell.gitChanges.actions.unstage": "Убрать из staging",
|
||
"instanceShell.gitChanges.commit.placeholder": "Введите сообщение коммита",
|
||
"instanceShell.gitChanges.commit.submit": "Commit",
|
||
"instanceShell.gitChanges.commit.submitting": "Создание commit...",
|
||
"instanceShell.gitChanges.commit.success": "Commit успешно создан",
|
||
"instanceShell.gitChanges.commit.error": "Не удалось создать commit",
|
||
|
||
"instanceShell.filesShell.fileListTitle": "Список файлов",
|
||
"instanceShell.filesShell.mobileSelectorLabel": "Выбрать файл",
|
||
"instanceShell.filesShell.mobileSelectorEmpty": "Выберите файл",
|
||
"instanceShell.filesShell.viewerTitle": "Просмотр изменений",
|
||
"instanceShell.filesShell.viewerPlaceholder": "Подробный рендер изменений будет добавлен на следующем этапе.",
|
||
"instanceShell.filesShell.viewerEmpty": "Файл не выбран.",
|
||
"instanceShell.filesShell.listEmpty": "В этой папке нет файлов.",
|
||
"instanceShell.filesShell.search.placeholder": "Фильтровать файлы в этой папке",
|
||
"instanceShell.filesShell.search.ariaLabel": "Фильтровать файлы в этой папке",
|
||
"instanceShell.filesShell.search.empty": "Совпадающих файлов нет.",
|
||
"instanceShell.filesShell.actions.copyPath": "Скопировать путь",
|
||
"instanceShell.filesShell.toast.copyPathSuccess": "Путь скопирован",
|
||
"instanceShell.filesShell.toast.copyPathError": "Не удалось скопировать путь",
|
||
"instanceShell.filesShell.previewMarkdown": "Предпросмотр Markdown",
|
||
"instanceShell.filesShell.showSource": "Показать исходник",
|
||
"instanceShell.filesShell.enableWordWrap": "Включить перенос строк",
|
||
"instanceShell.filesShell.disableWordWrap": "Отключить перенос строк",
|
||
|
||
"instanceShell.plan.noSessionSelected": "Выберите сессию, чтобы просмотреть план.",
|
||
"instanceShell.plan.empty": "Пока ничего не запланировано.",
|
||
|
||
"instanceShell.yoloMode.noSessionSelected": "Выберите сессию, чтобы настроить режим Yolo.",
|
||
"instanceShell.yoloMode.title": "Режим Yolo",
|
||
"instanceShell.yoloMode.description": "Автоматически одобряет запросы разрешений для этой сессии. По умолчанию выключен.",
|
||
"instanceShell.yoloMode.badge": "Yolo",
|
||
"instanceShell.yoloMode.badgeAriaLabel": "Режим Yolo включен",
|
||
|
||
"instanceShell.backgroundProcesses.empty": "Нет фоновых процессов.",
|
||
"instanceShell.backgroundProcesses.status": "Статус: {status}",
|
||
"instanceShell.backgroundProcesses.output": "Вывод: {sizeKb}KB",
|
||
"instanceShell.backgroundProcesses.notify.enabled": "Уведомление о завершении включено",
|
||
"instanceShell.backgroundProcesses.notify.disabled": "Уведомление о завершении выключено",
|
||
"instanceShell.backgroundProcesses.actions.output": "Вывод",
|
||
"instanceShell.backgroundProcesses.actions.stop": "Остановить",
|
||
"instanceShell.backgroundProcesses.actions.terminate": "Завершить",
|
||
"instanceShell.worktree.delete.error.title": "Удаление не удалось",
|
||
"instanceShell.worktree.delete.error.fallback": "Не удалось удалить worktree",
|
||
"instanceShell.worktree.delete.error.causeLabel": "Вероятная причина:",
|
||
"instanceShell.worktree.delete.error.nextStepLabel": "Рекомендуемый следующий шаг:",
|
||
"instanceShell.worktree.delete.error.summary.localChanges": "Git отказался удалять этот worktree, потому что в нем есть измененные или неотслеживаемые файлы.",
|
||
"instanceShell.worktree.delete.error.summary.inUse": "CodeNomad не смог удалить этот worktree, потому что что-то все еще использует файлы в каталоге.",
|
||
"instanceShell.worktree.delete.error.summary.notFound": "CodeNomad не смог удалить этот worktree, потому что каталог или запись worktree не найдены.",
|
||
"instanceShell.worktree.delete.error.summary.permissionDenied": "CodeNomad не смог удалить этот worktree, потому что доступ к каталогу был запрещен.",
|
||
"instanceShell.worktree.delete.error.summary.unknown": "CodeNomad не смог удалить этот worktree.",
|
||
"instanceShell.worktree.delete.error.cause.localChanges": "Локальные изменения",
|
||
"instanceShell.worktree.delete.error.cause.inUse": "Другой процесс использует этот worktree",
|
||
"instanceShell.worktree.delete.error.cause.notFound": "Каталог или запись worktree отсутствуют",
|
||
"instanceShell.worktree.delete.error.cause.permissionDenied": "Недостаточно прав файловой системы",
|
||
"instanceShell.worktree.delete.error.cause.unknown": "Бэкенд вернул неклассифицированную ошибку удаления",
|
||
"instanceShell.worktree.delete.error.nextStep.localChanges": "Включите принудительное удаление, если хотите отбросить локальные изменения, либо очистите worktree и попробуйте снова.",
|
||
"instanceShell.worktree.delete.error.nextStep.inUse": "Закройте терминалы, редакторы, watcher-процессы или фоновые процессы, использующие этот worktree, и попробуйте снова.",
|
||
"instanceShell.worktree.delete.error.nextStep.notFound": "Обновите список worktree и попробуйте снова. Если ошибка сохранится, проверьте путь worktree на диске.",
|
||
"instanceShell.worktree.delete.error.nextStep.permissionDenied": "Проверьте права файловой системы и закройте приложения, которые могут удерживать этот каталог, затем попробуйте снова.",
|
||
"instanceShell.worktree.delete.error.nextStep.unknown": "Посмотрите необработанную ошибку ниже, затем попробуйте снова после устранения указанной проблемы.",
|
||
"instanceShell.worktree.delete.error.copyRaw": "Копировать ошибку",
|
||
"instanceShell.worktree.delete.error.copySanitized": "Копировать обезличенную",
|
||
"instanceShell.worktree.delete.error.copySuccess": "Ошибка удаления скопирована",
|
||
"instanceShell.worktree.delete.error.copySanitizedSuccess": "Обезличенная ошибка удаления скопирована",
|
||
"instanceShell.worktree.delete.error.copyFailure": "Не удалось скопировать ошибку удаления",
|
||
|
||
"versionPill.appWithVersion": "Приложение {version}",
|
||
"versionPill.ui": "UI",
|
||
"versionPill.uiWithVersion": "UI {version}",
|
||
"versionPill.source": " ({source})",
|
||
|
||
"opencodeBinarySelector.title": "Бинарник OpenCode",
|
||
"opencodeBinarySelector.subtitle": "Выберите, какой исполняемый файл OpenCode запускать",
|
||
"opencodeBinarySelector.customPath.placeholder": "Введите путь к бинарнику opencode…",
|
||
"opencodeBinarySelector.actions.add": "Добавить",
|
||
"opencodeBinarySelector.actions.browse": "Выбрать бинарник…",
|
||
"opencodeBinarySelector.actions.removeTitle": "Удалить бинарник",
|
||
"opencodeBinarySelector.badge.systemPath": "Использовать бинарник из системного PATH",
|
||
"opencodeBinarySelector.status.checkingVersions": "Проверка версий…",
|
||
"opencodeBinarySelector.status.checking": "Проверка…",
|
||
"opencodeBinarySelector.dialog.title": "Выберите бинарник OpenCode",
|
||
"opencodeBinarySelector.dialog.description": "Просматривайте файлы, доступные через CLI-сервер.",
|
||
"opencodeBinarySelector.validation.invalidBinary": "Неверный бинарник OpenCode",
|
||
"opencodeBinarySelector.validation.alreadyValidating": "Проверка уже выполняется",
|
||
"opencodeBinarySelector.display.systemPath": "{name} (system PATH)",
|
||
"opencodeBinarySelector.versionLabel": "v{version}",
|
||
} as const
|