diff --git a/gitnexus-web/src/i18n/languages.ts b/gitnexus-web/src/i18n/languages.ts index af6cc7cd0..4f1c030ea 100644 --- a/gitnexus-web/src/i18n/languages.ts +++ b/gitnexus-web/src/i18n/languages.ts @@ -1,4 +1,4 @@ -export type SupportedLanguage = 'en' | 'zh-CN'; +export type SupportedLanguage = 'en' | 'zh-CN' | 'ru'; export interface LanguageMetadata { code: SupportedLanguage; @@ -12,6 +12,7 @@ export const DEFAULT_LANGUAGE: SupportedLanguage = 'en'; export const SUPPORTED_LANGUAGES: LanguageMetadata[] = [ { code: 'en', nativeName: 'English', englishName: 'English', dir: 'ltr' }, { code: 'zh-CN', nativeName: '简体中文', englishName: 'Simplified Chinese', dir: 'ltr' }, + { code: 'ru', nativeName: 'Русский', englishName: 'Russian', dir: 'ltr'} ]; export const SUPPORTED_LANGUAGE_CODES = SUPPORTED_LANGUAGES.map((language) => language.code); @@ -31,6 +32,7 @@ export function normalizeSupportedLanguage( ) { return 'zh-CN'; } + if (normalized === "ru" || normalized.startsWith("ru-")) return "ru"; return null; } diff --git a/gitnexus-web/src/locales/ru/chat.json b/gitnexus-web/src/locales/ru/chat.json new file mode 100644 index 000000000..3a8069b8b --- /dev/null +++ b/gitnexus-web/src/locales/ru/chat.json @@ -0,0 +1,40 @@ +{ + "tabs": { + "chat": "Nexus AI", + "processes": "Процессы" + }, + "suggestions": { + "architecture": "Объясни архитектуру проекта", + "whatDoes": "Что делает этот проект?", + "importantFiles": "Покажи мне самые важные файлы", + "apiHandlers": "Найди все обработчики API" + }, + "empty": { + "title": "Спроси меня о чём угодно", + "description": "Я могу помочь разобраться в архитектуре, найти функции или объяснить связи." + }, + "input": { + "placeholder": "Спроси о кодовой базе...", + "initializing": "Инициализация AI-агента...", + "configureProvider": "Настройте провайдера LLM, чтобы включить чат." + }, + "actions": { + "closePanel": "Закрыть панель", + "scrollBottom": "Перейти вниз", + "clearChat": "Очистить чат", + "stopResponse": "Остановить создание ответа" + }, + "stopped": "Остановлено пользователем", + "badges": { + "configureAI": "Настроить AI", + "connecting": "Подключение" + }, + "chatOnly": { + "banner": "Граф не загружен (большой проект). Чат работает нормально, но встроенные ссылки на узлы не будут подсвечиваться в представлении графа." + }, + "roles": { + "you": "Вы", + "assistant": "Nexus AI" + }, + "newBadge": "СОЗДАТЬ ДИАЛОГ" +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/common.json b/gitnexus-web/src/locales/ru/common.json new file mode 100644 index 000000000..d3a9bfcb7 --- /dev/null +++ b/gitnexus-web/src/locales/ru/common.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "GitNexus", + "nexusAI": "Nexus AI" + }, + "actions": { + "cancel": "Отменить", + "dismiss": "Отклонить", + "tryAgain": "Попробовать снова", + "hide": "Скрыть", + "retry": "Повторить", + "copy": "Копировать", + "copied": "Скопировано", + "close": "Закрыть", + "run": "Выполнить", + "clear": "Очистить", + "remove": "Удалить", + "focusInGraph": "Сфокусировать в графе", + "expand": "Развернуть", + "collapse": "Свернуть" + }, + "chat": { + "viewNodeInCodePanel": "Просмотреть {{inner}} в панели кода", + "openInCodePanel": "Открыть в панели кода • {{inner}}", + "waitForVectorIndex": "Подождите, создаётся векторный индекс." + }, + "counts": { + "files_one": "{{count}} файл", + "files_few": "{{count}} файла", + "files_many": "{{count}} файлов", + "files_other": "{{count}} файлов", + "nodes_one": "{{count}} узел", + "nodes_few": "{{count}} узла", + "nodes_many": "{{count}} узлов", + "nodes_other": "{{count}} узлов", + "edges_one": "{{count}} ребро", + "edges_few": "{{count}} ребра", + "edges_many": "{{count}} рёбер", + "edges_other": "{{count}} рёбер", + "symbols_one": "{{count}} символ", + "symbols_few": "{{count}} символа", + "symbols_many": "{{count}} символов", + "symbols_other": "{{count}} символов", + "flows_one": "{{count}} поток", + "flows_few": "{{count}} потока", + "flows_many": "{{count}} потоков", + "flows_other": "{{count}} потоков" + }, + "progress": { + "connecting": "Подключение к серверу...", + "connectingShort": "Подключение...", + "validatingServer": "Проверка сервера", + "validatingServerEllipsis": "Проверка сервера...", + "downloadingGraph": "Загрузка графа...", + "downloadedMb": "Загружено {{mb}} МБ", + "downloadingWithPercent": "Загрузка графа... {{percent}}%", + "downloadingMb": "Загрузка... {{mb}} МБ", + "processing": "Обработка...", + "processingGraph": "Обработка графа...", + "extractingFileContents": "Извлечение содержимого файлов", + "loadingGraph": "Загрузка графа...", + "starting": "Запуск...", + "executing": "Выполнение...", + "truncated": "... (обрезано)", + "ready": "Готово", + "switchingRepository": "Переключение репозитория...", + "loadingRepository": "Загрузка {{repo}}", + "validating": "Проверка", + "failedSwitchRepository": "Не удалось переключить репозиторий", + "unknownError": "Неизвестная ошибка" + }, + "analyzePhases": { + "queued": "В очереди", + "cloning": "Клонирование репозитория", + "pulling": "Получение последних изменений", + "extracting": "Сканирование файлов", + "structure": "Построение структуры", + "parsing": "Разбор кода", + "imports": "Обработка импортов", + "calls": "Трассировка вызовов", + "heritage": "Извлечение наследования", + "scopeResolution": "Обработка типов", + "communities": "Обнаружение групп", + "processes": "Обнаружение процессов", + "complete": "Обработка завершена", + "lbug": "Загрузка в базу данных", + "fts": "Создание поисковых индексов", + "embeddings": "Генерация эмбеддингов", + "done": "Готово", + "retrying": "Повторная попытка после сбоя" + }, + "units": { + "elapsedSeconds": "{{seconds}} сек.", + "elapsedMinutesSeconds": "{{minutes}} мин. {{seconds}} сек." + } +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/errors.json b/gitnexus-web/src/locales/ru/errors.json new file mode 100644 index 000000000..9db1bf833 --- /dev/null +++ b/gitnexus-web/src/locales/ru/errors.json @@ -0,0 +1,22 @@ +{ + "unknown": "Неизвестная ошибка", + "connectFailed": "Не удалось подключиться к серверу", + "loadGraphFailed": "Не удалось загрузить граф", + "failedToConnect": "Не удалось подключиться", + "analysisFailed": "Анализ не удался. Проверьте логи сервера.", + "startAnalysisFailed": "Не удалось запустить анализ", + "invalidGithubUrl": "Пожалуйста, введите корректный URL репозитория GitHub.", + "invalidAzureDevOpsUrl": "Пожалуйста, введите корректный URL репозитория Azure DevOps.", + "missingFolderPath": "Пожалуйста, укажите путь к папке.", + "backend": { + "reconnecting": "Соединение с сервером потеряно. Переподключение...", + "network": "Не удаётся подключиться к серверу GitNexus. Убедитесь, что была запущена команда `gitnexus serve`.", + "timeout": "Сервер слишком долго не отвечает. Попробуйте снова через {{seconds}} сек.", + "rateLimited": "Слишком много запросов. Попробуйте снова через {{seconds}} сек.", + "notFound": "Запрашиваемый репозиторий или ресурс не найден.", + "unauthorized": "Этот деплой GitNexus требует токен доступа. Найдите его в панели Render в переменной окружения GITNEXUS_SERVE_AUTH_TOKEN для сервиса gitnexus-web, затем вставьте его во вкладке Настройки.", + "originBlocked": "Это действие недоступно из интерфейса хостинга. Откройте GitNexus с адреса локального сервера (например, http://localhost:4747), чтобы продолжить.", + "client": "Ошибка запроса: {{message}}", + "server": "Ошибка сервера: {{message}}" + } +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/graph.json b/gitnexus-web/src/locales/ru/graph.json new file mode 100644 index 000000000..85a74bac1 --- /dev/null +++ b/gitnexus-web/src/locales/ru/graph.json @@ -0,0 +1,208 @@ +{ + "statusBar": { + "sponsor": "Спонсор", + "sponsorHint": "нужно купить немного кредитов API, чтобы запустить SWE-bench 😅" + }, + "loading": { + "filesProgress": "{{processed}} / {{total}} файлов" + }, + "toolCall": { + "status": { + "running": "выполняется", + "completed": "завершено", + "error": "ошибка", + "stopped": "остановлено" + }, + "tools": { + "search": "🔍 Поиск по коду", + "cypher": "🔗 Запрос на Cypher", + "grep": "🔎 Поиск по шаблону", + "read": "📄 Чтение файла", + "overview": "🗺️ Обзор кодовой базы", + "explore": "🔬 Исследование", + "impact": "💥 Анализ влияния" + }, + "query": "Запрос", + "input": "Входные данные", + "result": "Результат", + "searchPrefix": "Поиск: \"{{query}}\"" + }, + "embedding": { + "generateTitle": "Сгенерировать эмбеддинги для семантического поиска", + "enable": "Включить семантический поиск", + "loadingModel": "Загрузка AI-модели...", + "embeddingNodes_one": "Эмбеддинг {{processed}}/{{total}} узла", + "embeddingNodes_other": "Эмбеддинг {{processed}}/{{total}} узлов", + "creatingIndex": "Создание векторного индекса...", + "readyTitle": "Семантический поиск готов! Используйте естественный язык в чате с AI.", + "ready": "Семантический готов", + "errorTitle": "Создание эмбеддингов не удалось. Нажмите для повтора.", + "failedRetry": "Ошибка — повторить", + "fallback": { + "title": "WebGPU сказал – «Нет!»", + "subtitle": "Ваш браузер не поддерживает ускорение через GPU", + "description": "Не удалось создать эмбеддинги с WebGPU, поэтому семантический поиск (графовый RAG) будет не таким умным. Но граф всё равно работает отлично!", + "options": "Ваши варианты:", + "useCpu": "Использовать CPU", + "useCpuDescriptionSmall": "Работает, но немного медленнее", + "useCpuDescriptionLarge": "Работает, но намного медленнее", + "estimated_one": "(~{{minutes}} мин. для {{count}} узла)", + "estimated_other": "(~{{minutes}} мин. для {{count}} узлов)", + "skipIt": "Пропустить", + "skipDescription": "Граф работает, просто без AI-семантического поиска", + "smallCodebase": "Обнаружена маленькая кодовая база! CPU подойдёт.", + "tip": "💡 Совет: попробуйте Chrome или Edge для поддержки WebGPU", + "skipEmbeddings": "Пропустить эмбеддинги", + "useCpuRecommended": "Использовать CPU (рекомендуется)", + "useCpuSlow": "Использовать CPU (медленно)" + } + }, + "queryFab": { + "query": "Запрос", + "cypherQuery": "Запрос Cypher", + "examples": "Примеры", + "run": "Выполнить", + "noProject": "Проект не загружен. Сначала загрузите проект.", + "dbNotReady": "База данных не готова. Подождите завершения загрузки.", + "executionFailed": "Не удалось выполнить запрос", + "exampleLabels": { + "functions": "Все функции", + "classes": "Все классы", + "interfaces": "Все интерфейсы", + "calls": "Вызовы функций", + "imports": "Импортирования" + }, + "clear": "Очистить", + "rows": "строк", + "highlighted": "выделено", + "showingRows_other": "Показано 50 из {{count}} строк" + }, + "fileTree": { + "expandPanel": "Развернуть панель", + "fileExplorer": "Файловый проводник", + "filters": "Фильтры", + "collapsePanel": "Свернуть панель", + "searchFiles": "Поиск файлов...", + "noFilesLoaded": "Файлы не загружены", + "all": "Все", + "selectNodeDepth": "Выберите узел, чтобы применить фильтр по глубине", + "explorer": "Проводник", + "nodeTypes": "Типы узлов", + "nodeTypesDesc": "Включение/отключение типов узлов в графе", + "edgeTypes": "Типы рёбер", + "edgeTypesDesc": "Включение/отключение типов связей", + "focusDepth": "Глубина фокуса", + "focusDepthDesc": "Показывать узлы в пределах N переходов от выбранного", + "hops_one": "{{count}} переход", + "hops_few": "{{count}} перехода", + "hops_many": "{{count}} переходов", + "hops_other": "{{count}} переходов", + "colorLegend": "Цветовая легенда" + }, + "codePanel": { + "expand": "Развернуть панель кода", + "dragResize": "Перетащите для изменения размера", + "title": "Инспектор кода", + "clearCitations": "Очистить цитаты AI", + "clearSelection": "Снять выделение", + "loadingSource": "Загрузка исходного кода...", + "selectFile": "Выберите файловый узел, чтобы просмотреть его содержимое.", + "code": "Код", + "selected": "Выбрано", + "aiCitations": "Цитаты AI", + "references_one": "{{count}} ссылка", + "references_few": "{{count}} ссылки", + "references_many": "{{count}} ссылок", + "references_other": "{{count}} ссылок", + "lines_one": "{{count}} строка", + "lines_few": "{{count}} строки", + "lines_many": "{{count}} строк", + "lines_other": "{{count}} строк", + "codeNotAvailable": "Код недоступен в памяти для {{path}}" + }, + "canvas": { + "viewModes": { + "label": "Режим отображения графа", + "force": "Динамическая раскладка", + "tree": "Последовательная раскладка", + "circles": "Радиальная раскладка" + }, + "zoomIn": "Приблизить", + "zoomOut": "Отдалить", + "fit": "По размеру экрана", + "focusSelected": "Сфокусироваться на выбранном узле", + "clearSelection": "Снять выделение", + "clear": "Очистить", + "stopLayout": "Остановить раскладку", + "runLayout": "Запустить раскладку заново", + "layoutOptimizing": "Оптимизация раскладки...", + "turnOffHighlights": "Выключить все подсветки", + "turnOnHighlights": "Включить подсветки AI", + "chatOnly": { + "title": "Граф не загружен", + "description": "Это большой проект, поэтому граф был пропущен, чтобы браузер не тормозил. AI-чат работает нормально.", + "descriptionWithCount": "В этом проекте {{count}} узлов, поэтому граф был пропущен, чтобы браузер не тормозил. AI-чат работает нормально.", + "citationNote": "Пока граф не загружен, встроенные ссылки на файлы из чата не будут автоматически открываться в панели кода.", + "loadAnyway": "Всё равно загрузить граф", + "loadAnywayWarning": "В этом проекте {{count}} узлов. Загрузка полного графа может замедлить браузер или сделать его неотзывчивым. Продолжить?", + "loadAnywayWarningUnknown": "Возможно, это большой проект. Загрузка полного графа может замедлить браузер или сделать его неотзывчивым. Продолжить?" + } + }, + "processes": { + "unknownStep": "Неизвестно", + "allProcessesLabel_one": "Все процессы (объединено {{count}})", + "allProcessesLabel_other": "Все процессы (объединено {{count}})", + "emptyTitle": "Процессы не обнаружены", + "emptyDescription": "Процессы — это потоки выполнения, прослеженные от точек входа. Загрузите кодовую базу, чтобы увидеть обнаруженные процессы.", + "filterPlaceholder": "Фильтровать процессы...", + "detected_one": "Обнаружен {{count}} процесс", + "detected_few": "Обнаружено {{count}} процесса", + "detected_many": "Обнаружено {{count}} процессов", + "detected_other": "Обнаружено {{count}} процессов", + "fullMap": "Полная карта процессов", + "viewCombined_one": "Просмотреть объединённую карту {{count}} процесса", + "viewCombined_other": "Просмотреть объединённую карту {{count}} процессов", + "crossCommunity": "Межсообщественный", + "intraCommunity": "Внутрисообщественный", + "steps_one": "{{count}} шаг", + "steps_few": "{{count}} шага", + "steps_many": "{{count}} шагов", + "steps_other": "{{count}} шагов", + "clusters_one": "{{count}} кластер", + "clusters_few": "{{count}} кластера", + "clusters_many": "{{count}} кластеров", + "clusters_other": "{{count}} кластеров", + "highlightTitle": "Нажмите, чтобы включить подсветку в графе", + "removeHighlightTitle": "Нажмите, чтобы выключить подсветку в графе", + "loading": "Загрузка...", + "viewing": "Просмотр", + "view": "Смотреть" + }, + "processFlow": { + "title": "Процесс: {{label}}", + "diagramTooLarge": "📊 Диаграмма слишком большая", + "renderError": "⚠️ Ошибка рендеринга", + "tooComplex_one": "Эта диаграмма содержит {{count}} шаг и слишком сложна для отображения. Попробуйте просматривать отдельные процессы вместо «Все процессы».", + "tooComplex_few": "Эта диаграмма содержит {{count}} шага и слишком сложна для отображения. Попробуйте просматривать отдельные процессы вместо «Все процессы».", + "tooComplex_many": "Эта диаграмма содержит {{count}} шагов и слишком сложна для отображения. Попробуйте просматривать отдельные процессы вместо «Все процессы».", + "tooComplex_other": "Эта диаграмма содержит {{count}} шагов и слишком сложна для отображения. Попробуйте просматривать отдельные процессы вместо «Все процессы».", + "unableToRender_one": "Не удалось отобразить диаграмму. Шаг: {{count}}", + "unableToRender_few": "Не удалось отобразить диаграмму. Шагов: {{count}}", + "unableToRender_many": "Не удалось отобразить диаграмму. Шагов: {{count}}", + "unableToRender_other": "Не удалось отобразить диаграмму. Шагов: {{count}}", + "zoomOutTitle": "Отдалить (-)", + "zoomInTitle": "Приблизить (+)", + "resetTitle": "Сбросить масштаб и панорамирование", + "resetView": "Сбросить вид", + "toggleFocus": "Переключить фокус", + "copyMermaid": "Копировать Mermaid-запись диаграммы" + }, + "diagram": { + "aiGenerated": "Диаграмма, сгенерированная AI", + "error": "Ошибка диаграммы", + "showSource": "Показать исходник", + "label": "Диаграмма", + "expandTitle": "Развернуть", + "loading": "Загрузка диаграммы…" + } +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/header.json b/gitnexus-web/src/locales/ru/header.json new file mode 100644 index 000000000..0c0b769fa --- /dev/null +++ b/gitnexus-web/src/locales/ru/header.json @@ -0,0 +1,18 @@ +{ + "repositories": "Репозитории", + "active": "активен", + "reanalyzing": "Повторный анализ...", + "reanalyzeRepo": "Повторно анализировать {{repoName}}", + "deleteRepo": "Удалить {{repoName}}", + "reanalyzingRepo": "Переанализ {{repoName}}: {{message}}", + "analyzeNew": "Анализировать новый репозиторий...", + "searchRepositories": "Поиск репозиториев...", + "noRepositoriesFound": "Репозитории по запросу «{{query}}» не найдены", + "searchNodes": "Поиск узлов...", + "noNodesFound": "Узлы по запросу «{{query}}» не найдены", + "starIfCool": "Поставь звезду, если круто", + "aiSettings": "Настройки AI", + "help": "Помощь", + "language": "Язык", + "selectLanguage": "Выберите язык" +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/help.json b/gitnexus-web/src/locales/ru/help.json new file mode 100644 index 000000000..6435c5de4 --- /dev/null +++ b/gitnexus-web/src/locales/ru/help.json @@ -0,0 +1,96 @@ +{ + "tabs": { + "overview": "Обзор", + "ai": "Nexus AI", + "shortcuts": "Горячие клавиши", + "status": "Строка состояния", + "graph": "Граф и узлы", + "search": "Поиск и фильтр" + }, + "shortcuts": { + "searchNodes": "Поиск узлов", + "deselectClose": "Снять выделение / закрыть", + "columns": { + "action": "Действие", + "mac": "Mac", + "windows": "Windows" + } + }, + "nodeTypes": { + "function": "Функция", + "functionDesc": "Объявления функций", + "file": "Файл", + "fileDesc": "Исходные файлы", + "class": "Класс", + "classDesc": "Объявления классов", + "method": "Метод", + "methodDesc": "Методы классов", + "interface": "Интерфейс", + "interfaceDesc": "Интерфейсы TypeScript", + "folder": "Папка", + "folderDesc": "Узлы-каталоги" + }, + "status": { + "ready": "Готово", + "readyDesc": "Граф полностью загружен и интерактивен", + "nodesCount": "Количество узлов", + "nodesCountDesc": "Всего файлов и символов в графе", + "edgesCount": "Количество рёбер", + "edgesCountDesc": "Связи импортов / зависимостей", + "aiIndexStatus": "Статус AI-индекса", + "aiIndexStatusDesc": "Репозиторий полностью проиндексирован для AI-запросов", + "semanticReadyBadge": "Семантический готов", + "explained": "Пояснение к строке состояния" + }, + "tryAsking": "Попробуйте спросить:", + "footer": "GitNexus — обозреватель графа", + "title": "Справка и справочник", + "footerLong": "GitNexus — обозреватель графа кодовой базы с открытым исходным кодом", + "docsGithub": "Документация и GitHub ↗", + "overview": { + "gettingStarted": "Начало работы", + "whatIsTitle": "Что такое GitNexus?", + "whatIsDescription": "Интерактивный обозреватель графа для вашей кодовой базы. Каждый файл, функция и импорт становятся узлом, который можно визуально исследовать, запрашивать и перемещаться по нему.", + "currentRepoTitle": "Ваш текущий репозиторий", + "loadedCounts": "Загружено: {{nodeCount}} узлов · {{edgeCount}} рёбер", + "threeWaysTitle": "Три способа исследования", + "wayInspect": "Нажимайте на узлы для просмотра", + "waySearch": "Ищите по имени или типу", + "wayAsk": "Задайте Nexus AI вопрос на естественном языке", + "navigationTitle": "Навигация", + "navZoom": "Прокрутка для масштабирования", + "navPan": "Перетаскивание для панорамирования", + "navFocus": "Двойной клик по узлу для фокусировки на его подграфе" + }, + "graph": { + "nodeColorLegend": "Цветовая легенда узлов", + "nodeLabel": "Узлы: {{label}}", + "sizeDescription": "Размер узла отражает количество связей — крупные узлы зависят от большего числа файлов. Рёбра направлены от импортирующего к импортируемому.", + "detailDescription": "Нажмите на любой узел, чтобы открыть панель с подробностями — импорты, экспорты и обратные зависимости." + }, + "search": { + "title": "Поиск и фильтр", + "searchNodes": "Поиск узлов", + "searchDescription": "Поиск по имени файла, имени функции или пути импорта. Совпадающие узлы подсвечиваются в графе в реальном времени.", + "filterPanel": "Панель фильтров", + "filterDescription": "Используйте значок фильтра на левой боковой панели, чтобы изолировать определённые типы узлов, скрыть листовые узлы или сфокусироваться на диапазоне глубины от выбранного корня.", + "syntax": "Синтаксис поиска", + "hints": { + "nameFragment": "совпадение по фрагменту имени", + "pathPrefix": "совпадение по префиксу пути", + "nodeType": "фильтр по типу узла" + } + }, + "ai": { + "title": "Nexus AI", + "semanticReady": "✓ Семантический анализ готов", + "description": "Ваш репозиторий проиндексирован и готов к семантическим запросам. Nexus AI понимает структуру кода и связи, а не только имена файлов.", + "questions": { + "dependencies": "\"Какие файлы зависят от модуля аутентификации?\"", + "circular": "\"Найди циклические зависимости в этом репозитории\"", + "connected": "\"Каковы наиболее связанные компоненты?\"", + "imports": "\"Покажи мне все файлы, которые импортируют useEffect\"" + }, + "openPrompt": "Откройте промпт через кнопку Nexus AI (в правом верхнем углу)." + } +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/onboarding.json b/gitnexus-web/src/locales/ru/onboarding.json new file mode 100644 index 000000000..898b8e63c --- /dev/null +++ b/gitnexus-web/src/locales/ru/onboarding.json @@ -0,0 +1,81 @@ +{ + "success": { + "title": "Сервер подключён", + "description": "Подготовка графа знаний о вашем коде..." + }, + "loading": { + "largeRepoHint": "Для больших репозиториев это может занять некоторое время" + }, + "guide": { + "copyAria": "Скопировать в буфер обмена", + "copiedAria": "Скопировано!", + "startServer": "Запустите локальный сервер", + "devDescription": "Запустите бэкенд Express в отдельном терминале, чтобы открыть полный граф.", + "prodDescription": "Достаточно одной команды. Браузер подключается автоматически.", + "copyCommand": "Скопируйте команду", + "copyCommandDescription": "Нажмите на значок в терминале, чтобы скопировать.", + "done": "готово", + "orInstallGlobally": "или установите глобально", + "globalInstall": "Глобальная установка", + "startBackend": "Запустить бэкенд", + "terminal": "Терминал", + "waitingForServer": "Ожидание запуска сервера", + "pasteAndRun": "Вставьте и выполните в терминале", + "pasteAndRunDescription": "Откройте терминал в корне проекта, вставьте и нажмите Enter.", + "listeningForServer": "Ожидание сервера", + "willAutoConnect": "Автоматически подключится при обнаружении", + "autoConnects": "Автоматически подключается и открывает граф", + "autoConnectsDescription": "Обновление не требуется — страница обнаруживает сервер автоматически.", + "requires": "Требуется", + "port": "Порт 4747" + }, + "analyzeFirst": { + "title": "Проанализируйте свой первый репозиторий", + "description": "Вставьте URL репозитория, и GitNexus клонирует его, разберёт код и построит интерактивный граф знаний — прямо в вашем браузере.", + "footer": "Только публичные репозитории · Клонируется локально сервером · Данные не покидают ваш компьютер" + }, + "landing": { + "chooseRepository": "Выберите репозиторий", + "description": "Выберите проиндексированный репозиторий для изучения или проанализируйте новый.", + "indexed": "Индексирован {{time}}", + "orAnalyzeNew": "или проанализировать новый", + "footer": "Публичные и приватные репозитории · Клонируется локально сервером · Данные не покидают ваш компьютер", + "time": { + "justNow": "только что", + "minutesAgo": "{{count}} мин. назад", + "hoursAgo": "{{count}} ч. назад", + "daysAgo": "{{count}} д. назад" + } + }, + "repoAnalyzer": { + "inputType": "Тип ввода", + "githubUrl": "URL GitHub", + "gitlabUrl": "URL GitLab", + "azureDevOpsUrl": "Azure DevOps", + "localFolder": "Локальная папка", + "starting": "Запуск анализа...", + "analyzeRepository": "Анализировать репозиторий", + "complete": "Анализ завершён", + "loadingGraph": "Загрузка графа...", + "defaultRepoName": "репозиторий", + "githubRepositoryUrl": "URL репозитория GitHub", + "githubTokenLabel": "Персональный токен доступа (необязательно)", + "githubTokenPlaceholder": "ghp_... или github_pat_...", + "githubTokenHelp": "Требуется для приватных репозиториев. Нужно разрешение 'repo' (или fine-grained Contents:read). Отправляется один раз, не сохраняется.", + "gitlabRepositoryUrl": "URL репозитория GitLab", + "gitlabSupported": "Поддерживает GitLab.com и собственные экземпляры GitLab.", + "azureDevOpsRepositoryUrl": "URL репозитория Azure DevOps", + "azureDevOpsSupported": "Формат: https://dev.azure.com/organization/project/_git/repository", + "localFolderPath": "Путь к локальной папке", + "hideBackground": "Скрыть (анализ продолжается в фоне)", + "upload": { + "button": "Загрузить папку", + "uploading": "Загрузка...", + "selected_one": "{{fileCount}} файл готов ({{dropped}} пропущено: .git, node_modules, build output)", + "selected_few": "{{fileCount}} файла готово ({{dropped}} пропущено: .git, node_modules, build output)", + "selected_many": "{{fileCount}} файлов готово ({{dropped}} пропущено: .git, node_modules, build output)", + "selected_other": "{{fileCount}} файлов готово ({{dropped}} пропущено: .git, node_modules, build output)", + "empty": "В этой папке не найдено анализируемых файлов." + } + } +} \ No newline at end of file diff --git a/gitnexus-web/src/locales/ru/settings.json b/gitnexus-web/src/locales/ru/settings.json new file mode 100644 index 000000000..b496becd7 --- /dev/null +++ b/gitnexus-web/src/locales/ru/settings.json @@ -0,0 +1,116 @@ +{ + "title": "Настройки AI", + "subtitle": "Настройте провайдера LLM", + "localServer": "Локальный сервер", + "backendUrl": "URL бэкенда", + "connected": "Подключено", + "notConnected": "Не подключено", + "runServeHint": "Выполните `gitnexus serve`, чтобы подключить веб‑интерфейс к локальному бэкенду.", + "accessToken": { + "label": "Токен доступа", + "placeholder": "Вставьте ваш токен доступа для развёртывания", + "hint": "Требуется только для защищённого развёртывания. Найдите его в панели Render в переменной окружения GITNEXUS_SERVE_AUTH_TOKEN сервиса gitnexus-web. Для локального сервера оставьте пустым.", + "title": "Это развёртывание требует токен доступа", + "promptHint": "Сервер GitNexus запущен, но защищён. Найдите токен в панели Render в переменной окружения GITNEXUS_SERVE_AUTH_TOKEN сервиса gitnexus-web.", + "connect": "Подключиться", + "reveal": "Показать токен доступа", + "hide": "Скрыть токен доступа", + "sessionNote": "Хранится только для этой сессии браузера. Вам потребуется ввести его заново в новой вкладке или после закрытия браузера." + }, + "provider": "Провайдер", + "apiKey": "API-ключ", + "learnMore": "Подробнее", + "model": "Модель", + "searchModelPlaceholder": "Поиск или ввод ID модели...", + "selectModelPlaceholder": "Выберите или введите модель...", + "customModelHint": "Введите ID модели или нажмите Enter", + "customModelExample": "например, openai/gpt-4o", + "pressEnterCustom": "Нажмите Enter, чтобы использовать как пользовательский ID", + "baseUrl": "Базовый URL", + "optional": "необязательно", + "deploymentName": "Имя развёртывания", + "apiVersion": "Версия API", + "checkConnection": "Проверить подключение", + "privacyLabel": "Конфиденциальность:", + "privacyText": "Ваши API-ключи хранятся локально в этом браузере.", + "providers": { + "openai": { + "description": "Используйте модели OpenAI для чата и анализа кода.", + "apiKeyPlaceholder": "Введите ваш API-ключ OpenAI", + "helperText": "Получите API-ключ на", + "helperLinkLabel": "платформе OpenAI", + "modelPlaceholder": "например, gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "baseUrlPlaceholder": "https://api.openai.com/v1 (по умолчанию)", + "baseUrlHint": "Оставьте пустым для использования стандартного API OpenAI. Укажите свой URL для прокси или совместимых API." + }, + "gemini": { + "description": "Используйте модели Google Gemini.", + "apiKeyPlaceholder": "Введите ваш API-ключ Google AI", + "helperText": "Получите API-ключ в", + "helperLinkLabel": "Google AI Studio", + "modelPlaceholder": "например, gemini-2.0-flash, gemini-1.5-pro" + }, + "anthropic": { + "description": "Используйте модели Claude от Anthropic.", + "apiKeyPlaceholder": "Введите ваш API-ключ Anthropic", + "helperText": "Получите API-ключ в", + "helperLinkLabel": "консоли Anthropic", + "modelPlaceholder": "например, claude-sonnet-4-20250514, claude-3-opus" + }, + "azure": { + "apiKeyPlaceholder": "Введите ваш API-ключ Azure OpenAI", + "deploymentNamePlaceholder": "например, gpt-4o-deployment" + }, + "ollama": { + "quickStart": "📋 Быстрый старт:", + "installFrom": "Установите Ollama с", + "thenRun": ", затем выполните:", + "modelPlaceholder": "например, llama3.2, mistral, codellama" + }, + "openrouter": { + "apiKeyPlaceholder": "Введите ваш API-ключ OpenRouter", + "helperText": "Получите API-ключ на", + "helperLinkLabel": "странице ключей OpenRouter" + }, + "minimax": { + "apiKeyPlaceholder": "Введите ваш API-ключ MiniMax", + "helperText": "Получите API-ключ на", + "helperLinkLabel": "платформе MiniMax", + "modelPlaceholder": "например, MiniMax-M3 или MiniMax-M2.7", + "helperModel": "Доступны: MiniMax-M3 (по умолчанию) и MiniMax-M2.7", + "endpoint": "Региональный эндпоинт", + "endpoints": { + "global": "Глобальный (api.minimax.io)", + "china": "Китайский (api.minimaxi.com)" + }, + "thinking": "Режим мышления", + "thinkingModes": { + "adaptive": "Адаптивный", + "disabled": "Отключён", + "always_on": "Всегда включён" + }, + "capabilities": "Окно контекста {{contextWindow}} | Входные данные: {{modalities}}" + }, + "glm": { + "apiKeyPlaceholder": "Введите ваш API-ключ Z.AI" + } + }, + "loadingModels": "Загрузка моделей...", + "noModelsMatch": "Нет моделей, соответствующих «{{searchTerm}}»", + "moreModels": "+ ещё {{count}} • Уточните поиск", + "apiKeySession": "API-ключи хранятся в сессионном хранилище и будут удалены при закрытии этой вкладки.", + "startLocalServer": "запустите локальный сервер", + "settingsSaved": "Настройки сохранены", + "failedToSave": "Не удалось сохранить", + "saveSettings": "Сохранить настройки", + "endpoint": "Эндпоинт", + "azurePortal": "Портал Azure", + "azureHint": "Настройте службу Azure OpenAI в", + "defaultPort": "Порт по умолчанию:", + "pullModel": "Загрузите модель с помощью", + "browseModels": "Просмотр всех моделей на", + "openRouterModels": "Модели OpenRouter", + "zaiPlatform": "Платформа Z.AI", + "glmCodingApi": "API для кодинга (по умолчанию). Используйте https://api.z.ai/api/paas/v4 для общего API.", + "privacyFull": "Ваши API-ключи хранятся только в сессионном хранилище браузера и удаляются при закрытии вкладки. Они отправляются напрямую провайдеру LLM при общении в чате. Ваш код никогда не покидает ваш компьютер." +} \ No newline at end of file