From 33224ace479eb59f953dc211beb6fe405e8a05d6 Mon Sep 17 00:00:00 2001 From: Tuzhibaev Timur Date: Fri, 21 Aug 2026 00:22:19 +0300 Subject: [PATCH] Russian localization fixes by a native speaker (#3586) Co-authored-by: Mohamed Boudra --- packages/app/src/i18n/resources/ru.ts | 1781 +++++++++++++------------ 1 file changed, 893 insertions(+), 888 deletions(-) diff --git a/packages/app/src/i18n/resources/ru.ts b/packages/app/src/i18n/resources/ru.ts index 7ec42e279..994f4da5f 100644 --- a/packages/app/src/i18n/resources/ru.ts +++ b/packages/app/src/i18n/resources/ru.ts @@ -1,4 +1,4 @@ -import { en, type TranslationResources } from "./en"; +import type { TranslationResources } from "./en"; import { pluginSettings } from "./plugin-settings"; export const ru: TranslationResources = { @@ -8,25 +8,25 @@ export const ru: TranslationResources = { actions: { back: "Назад", cancel: "Отмена", - close: "Закрывать", + close: "Закрыть", copy: "Копировать", - dismiss: "Увольнять", - retry: "Повторить попытку", + dismiss: "Отклонить", + retry: "Повторить", search: "Поиск", - select: "Выбирать", + select: "Выбрать", }, placeholders: { search: "Поиск...", }, empty: { - noResults: "Результаты не найдены", + noResults: "Ничего не найдено", noOptionsMatchSearch: "Нет вариантов, соответствующих вашему запросу.", }, states: { loading: "Загрузка...", starting: "Начало...", copied: "Скопировано", - copiedLabel: "Скопировано{{label}}", + copiedLabel: "Скопировано {{label}}", downloadComplete: "Загрузка завершена", downloadFailed: "Загрузка не удалась", }, @@ -35,9 +35,9 @@ export const ru: TranslationResources = { unableToSave: "Не удалось сохранить", nameRequired: "Требуется имя", daemonUnavailable: "Daemon недоступен", - daemonClientUnavailable: "Клиент Daemon недоступен", - daemonClientDisconnected: "Клиент Daemon отключен", - noFileFound: "Файл для{{token}}не найден", + daemonClientUnavailable: "Daemon клиента недоступен", + daemonClientDisconnected: "Daemon клиента отключен", + noFileFound: "Файл для {{token}} не найден", unexpectedDictationError: "При обработке диктовки произошла непредвиденная ошибка.", }, connectionStatus: { @@ -45,7 +45,7 @@ export const ru: TranslationResources = { connecting: "Подключение", offline: "Оффлайн", error: "Ошибка", - idle: "Праздный", + idle: "Ожидание", }, }, shell: { @@ -65,16 +65,16 @@ export const ru: TranslationResources = { agents: "Агенты", newAgent: "Новый агент", addProject: "Добавить проект", - home: "Дом", + home: "Главная", groupByProject: "Группировать по проекту", groupByStatus: "Группировать по статусу", modelGroupLabel: "Модель", - modelSearchKeywords: "сменить модель изменить модель выбрать модель установить модель", + modelSearchKeywords: "Сменить, изменить, выбрать или установить модель", thinkingGroupLabel: "Мышление", - thinkingSearchKeywords: "рассуждение усилие мышление", + thinkingSearchKeywords: "Уровень усилия рассуждения", modeGroupLabel: "Режим", - modeSearchKeywords: "доступ разрешение одобрение режим", - planModeGroupLabel: "Режим плана", + modeSearchKeywords: "режим подтверждения разрешений доступа", + planModeGroupLabel: "Режим планирования", planModeSearchKeywords: "план планирование режим плана", fastModeGroupLabel: "Быстрый", fastModeSearchKeywords: "быстрый скорость низкая задержка", @@ -90,22 +90,22 @@ export const ru: TranslationResources = { terminal: "Prompt", }, input: { - accessibilityLabel: "Агент сообщений...", + accessibilityLabel: "Написать агенту...", terminalAccessibilityLabel: "Terminal prompt", - focusHint: "{{shortcut}}, чтобы сосредоточиться", + focusHint: "{{shortcut}}, для фокуса", addAttachment: "Добавить вложение", - interruptAgent: "Агент прерываний", - queueMessage: "Сообщение в очереди", + interruptAgent: "Прервать агента", + queueMessage: "Сообщение в очередь", sendAndInterrupt: "Отправить и прервать", sendAndSteer: "Отправить и направить", sendMessage: "Отправить сообщение", queue: "Очередь", - send: "Отправлять", + send: "Отправить", }, cancel: { - cancelingAgent: "Отменяющий агент", - stopAgent: "Остановить агент", - interrupt: "Прерывать", + cancelingAgent: "Отменить агента", + stopAgent: "Остановить агента", + interrupt: "Прервать", }, voice: { enableVoiceMode: "Включить голосовой режим", @@ -116,82 +116,82 @@ export const ru: TranslationResources = { startDictation: "Начать диктовку", unmuteVoice: "Включить звук", muteVoice: "Отключить голос", - dictation: "Диктант", - interruptBeforeVoice: "Прерывайте агента перед запуском голосового режима", + dictation: "Диктовка", + interruptBeforeVoice: "Остановите агента перед запуском голосового режима", }, attachments: { addImage: "Добавить изображение", pasteImage: "Вставить изображение", - addFile: "Upload file", + addFile: "Загрузить файл", addIssueOrPr: "Добавить проблему или PR", addIssueOrPr_mr: "Добавить проблему или MR", dropImagesHere: "Скиньте изображения сюда", - dropFilesHere: "Drop files here", - editQueuedMessage: "Изменить сообщение в очереди", - sendQueuedMessageNow: "Отправить сообщение в очереди сейчас", + dropFilesHere: "Переместите файлы сюда", + editQueuedMessage: "Изменить сообщение из очереди", + sendQueuedMessageNow: "Отправить сообщение из очереди сейчас", openImage: "Открыть прикрепленное изображение", removeImage: "Удалить прикрепленное изображение", - removeFile: "Remove file attachment", + removeFile: "Удалить прикрепленный файл", openGithub: "Открыть {{kind}} {{number}}", removeGithub: "Удалить {{kind}} {{number}}", element: "Элемент", - openBrowserElement: "Открыть вложение элемента браузера", - removeBrowserElement: "Удалить вложение элемента браузера", - openReview: "Открыть прикрепленный файл с отзывом", - removeReview: "Удалить прикрепленный отзыв", + openBrowserElement: "Открыть вложение с элементом браузера", + removeBrowserElement: "Удалить вложение с элементом браузера", + openReview: "Открыть вложение проверки", + removeReview: "Удалить вложение проверки", }, errors: { failedToSend: "Не удалось отправить сообщение", failedToCreateAgent: "Не удалось создать агента.", noHostSelected: "Хост не выбран", - initialPromptRequired: "Требуется начальное приглашение", + initialPromptRequired: "Необходим инициализирующий промпт", alreadyLoading: "Уже загружается", - uploadFailed: "Failed to upload file", + uploadFailed: "Ошибка загрузки файла", noClipboardImage: "В буфере обмена нет изображения", pasteImageFailed: "Не удалось вставить изображение", - fileTooLarge: "{{fileName}} is too large (max {{size}})", + fileTooLarge: "Файл {{fileName}} слишком большой (максимальный размер: {{size}})", }, clientCommands: { archiveAgent: "Архивировать текущего агента", - freshDraft: "Архивируйте этот агент и начните новый черновик", + freshDraft: "Архивировать этого агента и создать новый черновик", }, github: { searching: "Идет поиск...", noResults: "Результаты не найдены.", - searchPlaceholder: "Поиск проблем и пиар...", - searchPlaceholder_mr: "Поиск проблем и MR...", - title: "Прикрепите проблему или PR", - title_mr: "Прикрепите проблему или MR", + searchPlaceholder: "Поиск задач и PR...", + searchPlaceholder_mr: "Поиск задач и MR...", + title: "Прикрепить задачу или PR", + title_mr: "Прикрепить задачу или MR", }, }, agentControls: { provider: { - fallback: "Поставщик", - select: "Выберите поставщика агентов", + fallback: "Провайдер", + select: "Выбрать провайдера агента", }, thinking: { - title: "мышление", - unknown: "Неизвестный", + title: "Рассуждения", + unknown: "Неизвестно", extraHigh: "Очень высокий", - select: "Выберите вариант мышления", - selectWithValue: "Выберите вариант мышления ({{value}})", + select: "Выбрать уровень рассуждений", + selectWithValue: "Выбрать уровень рассуждений ({{value}})", }, model: { unknown: "Неизвестная модель", }, features: { title: "Функции", - open: "Открытые возможности агента", - on: "На", - off: "Выключенный", + open: "Открыть настройки функций агента", + on: "Включено", + off: "Выключено", }, mode: { title: "Режим", - searchPlaceholder: "Режимы поиска...", - selectWithValue: "Выберите режим агента ({{value}})", + searchPlaceholder: "Поиск режимов...", + selectWithValue: "Выбрать режим агента ({{value}})", }, hints: { - thinking: "Режим мышления", + thinking: "Режим рассуждений", model: "Изменить модель", mode: "Изменить режим", }, @@ -203,35 +203,35 @@ export const ru: TranslationResources = { permission: { plan: "План", required: "Требуется разрешение", - deny: "Отрицать", - accept: "Принимать", - implement: "Осуществлять", + deny: "Отклонить", + accept: "Разрешить", + implement: "Реализовать", question: "Как бы вы хотели продолжить?", proposedPlan: "Предлагаемый план", }, }, agentPanel: { states: { - notFound: "Agent не найден", - failedToLoad: "Не удалось загрузить агент", + notFound: "Агент не найден", + failedToLoad: "Не удалось загрузить агента", reconnecting: "Повторное подключение", timelineSyncFailed: "Не удалось обновить историю агента.", timelineSyncRetrying: "Повторная попытка…", - archivingTitle: "Архивный агент...", - archivingSubtitle: "Пожалуйста, подождите, пока мы архивируем этого агента.", + archivingTitle: "Агент перемещается в архив...", + archivingSubtitle: "Подождите, пока агент будет перемещён в архив.", }, unavailable: { selectedHost: "Выбранный хост", unknownHost: - "Невозможно открыть этот агент, поскольку{{serverLabel}}не настроен на этом устройстве.", + "Невозможно открыть этого агента, поскольку {{serverLabel}} не настроен на этом устройстве.", addHost: - "Добавьте хост в настройках или откройте агент на настроенном сервере, чтобы продолжить.", - preparingSession: "Подготовка сеанса{{serverLabel}}...", - connecting: "Подключение к{{serverLabel}}...", - showSoon: "Мы покажем этого агента через минуту.", - showWhenOnline: "Мы покажем этого агента, как только хост будет онлайн.", - reconnectingTo: "Повторное подключение к{{serverLabel}}...", - showAgainWhenReachable: "Мы снова покажем этого агента, как только хост станет доступен.", + "Добавьте хост в настройках или откройте агента на настроенном хосте, чтобы продолжить.", + preparingSession: "Подготовка сессии на хосте {{serverLabel}}...", + connecting: "Подключение к {{serverLabel}}...", + showSoon: "Агент скоро появится.", + showWhenOnline: "Агент появится, как только хост будет в сети.", + reconnectingTo: "Повторное подключение к {{serverLabel}}...", + showAgainWhenReachable: "Агент снова появится, как только хост станет доступен.", }, archived: { callout: "Этот агент находится в архиве", @@ -240,63 +240,63 @@ export const ru: TranslationResources = { }, sessions: { title: "История", - empty: "Сеансов пока нет", - noMatches: "Нет подходящих сеансов", + empty: "Сессий пока нет", + noMatches: "Подходящих сессий не найдено", tooManyMatches: "Слишком много совпадений — уточните запрос", - hostLoadFailed: "{{host}}: Не удалось загрузить историю", + hostLoadFailed: "{{host}}: не удалось загрузить историю", searchPlaceholder: "Поиск по истории", actions: { - loadMore: "Загрузить больше", + loadMore: "Загрузить ещё", clearSearch: "Очистить поиск", }, }, agentList: { fallbackTitle: "Новая сессия", dateSections: { - recent: "Недавний", + recent: "Недавние", today: "Сегодня", yesterday: "Вчера", thisWeek: "На этой неделе", thisMonth: "В этом месяце", - older: "Старше", + older: "Более ранние", }, status: { - initializing: "Начало", - idle: "Праздный", - running: "Бег", + initializing: "Запускается", + idle: "Ожидает", + running: "Работает", error: "Ошибка", - closed: "Закрыто", + closed: "Закрыт", }, badges: { archived: "В архиве", - pending: "{{count}}на рассмотрении", + pending: "На рассмотрении: {{count}}", attention: "Внимание", }, archiveSheet: { - hostOffline: "Host оффлайн", - runningAgent: "Этот агент все еще работает. Архивирование остановит агент.", - archive: "Архив", + hostOffline: "Хост не в сети", + runningAgent: "Этот агент всё ещё работает. Перемещение в архив остановит его.", + archive: "Архивировать", }, }, message: { diagram: { diagram: "Диаграмма", - zoomIn: "Приблизить", - zoomOut: "Отдалить", - resetZoom: "Сбросить вид", - viewSource: "Показать код", + zoomIn: "Увеличить масштаб", + zoomOut: "Уменьшить масштаб", + resetZoom: "Сбросить масштаб", + viewSource: "Показать исходный код", viewDiagram: "Показать диаграмму", }, actions: { copyCode: "Скопировать код", - copyTurn: "Копировать ход", + copyTurn: "Скопировать ответ", copyMessage: "Копировать сообщение", - forkMenu: "Форкнуть сообщение", - forkInNewTab: "Форкнуть в новой вкладке", - forkInNewWorkspace: "Форкнуть в новом рабочем пространстве", - forkUnavailable: "Обновите хост, чтобы использовать это.", - forkMissingWorkspace: "Этот агент не находится в рабочем пространстве.", - forkFailed: "Не удалось форкнуть чат", + forkMenu: "Форкнуть чат отсюда", + forkInNewTab: "Создать форк в новой вкладке", + forkInNewWorkspace: "Создать форк в новом рабочем пространстве", + forkUnavailable: "Обновите хост, чтобы использовать эту функцию.", + forkMissingWorkspace: "Этот агент не связан с рабочим пространством.", + forkFailed: "Не удалось создать форк чата", openFile: "Открыть файл", copied: "Скопировано", }, @@ -306,7 +306,7 @@ export const ru: TranslationResources = { imageLoadFailed: "Не удалось загрузить изображение", imageUnavailable: "Изображение недоступно", imagePreviewUnavailable: "Предварительный просмотр изображения недоступен.", - imagePreviewLoadFailed: "Невозможно загрузить предварительный просмотр изображения.", + imagePreviewLoadFailed: "Не удалось загрузить предварительный просмотр изображения.", review: "Ревью", commentsOne: "1 комментарий", commentsMany: "Комментарии: {{count}}", @@ -315,30 +315,30 @@ export const ru: TranslationResources = { file: "Файл", }, speak: { - header: "Говорил", + header: "Сказал", }, activity: { details: "Подробности", }, dictation: { - start: "Начать голосовой диктовку", + start: "Начать диктовку голосом", cancel: "Отменить диктовку", retry: "Повторить диктовку", insert: "Вставить транскрипцию", - insertAndSend: "Вставьте транскрипцию и отправьте", - failed: "Диктовка не удалась:{{error}}", - failedRetry: "Диктант не удался. Нажмите «Повторить».", + insertAndSend: "Вставить транскрипцию и отправить", + failed: "Диктовка не удалась: {{error}}", + failedRetry: "Диктовка не удалась. Нажмите «Повторить».", }, question: { - submit: "Представлять на рассмотрение", + submit: "Отправить", next: "Далее", answerPlaceholder: "Введите ответ...", - otherPlaceholder: "Другой...", + otherPlaceholder: "Другой ответ...", }, todo: { title: "Задачи", - empty: "Заданий пока нет.", - tasksProgress: "{{completed}}/{{total}} задач", + empty: "Задач пока нет.", + tasksProgress: "Задачи: {{completed}}/{{total}}", activity: { created: "Создано задач: {{count}}", added: "Добавлена", @@ -348,68 +348,68 @@ export const ru: TranslationResources = { }, }, compaction: { - loading: "Уплотнение...", - auto: "Контекст автоматически сжимается", - manual: "Контекст сжимается вручную", - withTokens: "Сжатый контекст (токены{{tokens}}K)", + loading: "Сжатие контекста...", + auto: "Контекст сжат автоматически", + manual: "Контекст сжат вручную", + withTokens: "Контекст сжат ({{tokens}} тыс. токенов)", completed: "Контекст сжат", }, }, importSession: { - title: "Импортировать сеанс", + title: "Импортировать сессию", filters: { all: "Все", }, status: { - connectHost: "Подключитесь к хосту, чтобы импортировать сеансы", - updateHost: "Обновите хост для импорта сеансов.", - noProviders: "Импортируемые поставщики не включены.", - loading: "Загрузка последних сеансов...", - failedAll: "Не удалось загрузить последние сеансы.", - failedProviders: "Не удалось загрузить сеансы для{{providers}}.", - failedImport: "Не удалось импортировать выбранный сеанс.", + connectHost: "Подключитесь к хосту, чтобы импортировать сессии", + updateHost: "Обновите хост, чтобы импортировать сессии.", + noProviders: "Нет включённых провайдеров с поддержкой импорта.", + loading: "Загрузка недавних сессий...", + failedAll: "Не удалось загрузить недавние сессии.", + failedProviders: "Не удалось загрузить сессии следующих провайдеров: {{providers}}.", + failedImport: "Не удалось импортировать выбранную сессию.", }, actions: { - refresh: "Обновить сеансы", + refresh: "Обновить список сессий", }, preview: { untitledSession: "Сессия без названия", - noPrompt: "Нет быстрого предварительного просмотра", + noPrompt: "Нет промпта для предварительного просмотра", }, empty: { - noRecent: "Нет последних сеансов для импорта.", - alreadyImported: "Все последние сеансы уже импортированы.", - noProviderSessions: "Сеансы{{provider}}не найдены.", + noRecent: "Нет недавних сессий для импорта.", + alreadyImported: "Все недавние сессии уже импортированы.", + noProviderSessions: "Сессии провайдера {{provider}} не найдены.", }, row: { - importing: "Импорт...", + importing: "Импортируется...", }, }, workspace: { route: { - loading: "Загрузка рабочей области", + loading: "Загрузка рабочего пространства", connecting: "Подключение", - hostOffline: "{{hostName}}не в сети", - cannotReachHost: "Невозможно связаться с{{hostName}}", - hostStatus: "Статус Host:{{status}}", - needsHostUpgrade: "Обновите хост, чтобы восстановить эту рабочую область", + hostOffline: "{{hostName}} не в сети", + cannotReachHost: "Не удаётся связаться с {{hostName}}", + hostStatus: "Статус хоста: {{status}}", + needsHostUpgrade: "Обновите хост, чтобы восстановить это рабочее пространство", manageHost: "Управление хостом", recovery: { archivedTitle: "Рабочая область в архиве", restoreDescription: - "{{workspaceName}} была архивирована, а её worktree удалён. Восстановите ветку {{branch}}, чтобы открыть её снова.", + "Рабочее пространство «{{workspaceName}}» было архивировано, а его worktree удалён. Восстановите ветку {{branch}}, чтобы снова открыть рабочее пространство.", unarchiveDescription: - "{{workspaceName}} находится в архиве. Разархивируйте её, чтобы открыть снова.", + "Рабочее пространство «{{workspaceName}}» находится в архиве. Разархивируйте его, чтобы снова открыть.", restoreAction: "Восстановить", unarchiveAction: "Разархивировать", - restoringTitle: "Восстановление рабочей области", + restoringTitle: "Восстановление рабочего пространства", restoringAction: "Восстановление...", unavailableTitle: "Рабочая область недоступна", - checkFailedTitle: "Не удалось проверить рабочую область", + checkFailedTitle: "Не удалось проверить рабочее пространство", }, }, hoverCard: { - scriptsAccessibility: "Скрипты Workspace", + scriptsAccessibility: "Скрипты рабочего пространства", copyPath: "Копировать путь", copyBranchName: "Копировать имя ветки", copied: "Скопировано", @@ -426,13 +426,13 @@ export const ru: TranslationResources = { newFolder: "Новая папка", collapseFolder: "Свернуть папку", rename: "Переименовать", - duplicate: "Дублировать", + duplicate: "Создать копию", revert: "Отменить изменения", delete: "Удалить", confirmDelete: { fileTitle: "Удалить файл?", folderTitle: "Удалить папку?", - message: "«{{name}}» будет удалён безвозвратно.", + message: "Элемент «{{name}}» будет удалён безвозвратно.", confirm: "Удалить", cancel: "Отмена", }, @@ -447,12 +447,12 @@ export const ru: TranslationResources = { fileExplorer: { sort: { name: "Имя", - modified: "Модифицированный", + modified: "Дата изменения", size: "Размер", }, context: { size: "Размер", - modified: "Модифицированный", + modified: "Дата изменения", }, actions: { back: "Назад", @@ -467,15 +467,15 @@ export const ru: TranslationResources = { noVisibleFiles: "Нет видимых файлов", }, states: { - unavailable: "Workspace недоступен", + unavailable: "Рабочее пространство недоступно", loading: "Загрузка файлов...", }, errors: { - failedToListDirectory: "Не удалось указать каталог", + failedToListDirectory: "Не удалось получить содержимое каталога", createFailed: "Не удалось создать элемент", renameFailed: "Не удалось переименовать элемент", - duplicateFailed: "Не удалось дублировать элемент", - revealFailed: "Не удалось показать элемент", + duplicateFailed: "Не удалось создать копию элемента", + revealFailed: "Не удалось показать расположение элемента", deleteFailed: "Не удалось удалить элемент", }, draft: { @@ -485,24 +485,24 @@ export const ru: TranslationResources = { }, setup: { descriptor: { - label: "Настраивать", + label: "Настройка", completed: "Настройка завершена", - failed: "Установка не удалась", - workspace: "Настройка Workspace", + failed: "Настройка не удалась", + workspace: "Настройка рабочего пространства", }, status: { - running: "Бег", - completed: "Завершенный", - failed: "Неуспешный", - waiting: "Ожидание вывода настройки", + running: "Выполняется", + completed: "Завершено", + failed: "Завершено с ошибкой", + waiting: "Ожидание вывода команд настройки", }, - waiting: "Настройка рабочего места...", + waiting: "Настройка рабочего пространства...", empty: { - noCommands: "Для этой рабочей области не выполнялись команды настройки.", + noCommands: "Для этого рабочего пространства не выполнялись команды настройки.", }, accessibility: { - noCommands: "Для этой рабочей области не выполнялись команды настройки.", - log: "Журнал настройки Workspace", + noCommands: "Для этого рабочего пространства не выполнялись команды настройки.", + log: "Журнал настройки рабочего пространства", }, log: { noOutput: "Нет вывода", @@ -510,83 +510,84 @@ export const ru: TranslationResources = { }, browser: { unavailable: { - title: "Браузер доступен только на рабочем столе", + title: "Встроенный браузер доступен только в настольном приложении", subtitle: "Откройте это рабочее пространство в Electron, чтобы использовать встроенный браузер.", }, - session: "Сеанс браузера{{browserId}}", + session: "Сеанс браузера {{browserId}}", controls: { back: "Назад", forward: "Вперед", stopLoading: "Остановить загрузку", refresh: "Обновить", - browserUrl: "Браузер URL", + browserUrl: "URL браузера", enterUrl: "Введите URL", - openDevTools: "Открыть инструменты разработки браузера", + openDevTools: "Открыть инструменты разработчика браузера", cancelSelector: "Отменить выбор элемента", - annotateElement: "Аннотировать элемент", - screenshotElement: "Снимок элемента", + annotateElement: "Добавить примечание к элементу", + screenshotElement: "Сделать снимок элемента", screenshotCopied: "Снимок скопирован в буфер обмена", elementCopied: "Элемент скопирован в буфер обмена", screenshotFailed: "Не удалось скопировать снимок", selectorLoading: "Дождитесь окончания загрузки страницы", - selectorFailed: "Не удалось запустить выбор элемента", + selectorFailed: "Не удалось включить режим выбора элемента", }, annotate: { - title: "Аннотировать элемент", + title: "Добавить примечание к элементу", placeholder: "Сообщение агенту об этом элементе…", submit: "Прикрепить", cancel: "Отмена", }, devices: { - label: "Размер устройства", - responsive: "Адаптивный", + label: "Размер экрана устройства", + responsive: "Адаптивный режим", }, errors: { failedToLoad: "Не удалось загрузить страницу", - invalidUrl: "Неверный браузер URL", - unsupportedProtocol: "Заблокирован неподдерживаемый браузер URL:{{protocol}}", + invalidUrl: "Недопустимый URL браузера", + unsupportedProtocol: + "URL браузера с неподдерживаемым протоколом заблокирован: {{protocol}}", }, }, terminal: { - hostDisconnected: "Host не подключен", - updateHost: "Обновите хост, чтобы использовать нативный терминал.", - unableToSubscribe: "Невозможно подписаться на терминал", + hostDisconnected: "Хост не подключён", + updateHost: "Обновите хост, чтобы использовать нативный рендерер терминала.", + unableToSubscribe: "Не удалось подключиться к терминалу", }, tabs: { loading: "Загрузка...", modified: "Несохранённые изменения", - loadingAgentTitle: "Название агента загрузки", + loadingAgentTitle: "Загрузка названия агента", fallback: { newAgent: "Новый агент", - setup: "Настраивать", - workspaceSetup: "Настройка Workspace", - terminal: "Terminal", + setup: "Настройка", + workspaceSetup: "Настройка рабочего пространства", + terminal: "Терминал", browser: "Браузер", - agent: "Agent", - workspace: "Workspace", + agent: "Агент", + workspace: "Рабочее пространство", }, switcher: { - trigger: "Переключить вкладки ({{count}}открыт)", + trigger: "Переключить вкладки (открыто: {{count}})", title: "Переключить вкладку", - searchPlaceholder: "Вкладки поиска", + searchPlaceholder: "Поиск вкладок", }, menu: { - openFor: "Открыть меню для{{label}}", - copyResumeCommand: "Копировать команду возобновления", + openFor: "Открыть меню для {{label}}", + copyResumeCommand: "Скопировать команду возобновления", copyAgentId: "Скопировать идентификатор агента", copyTerminalId: "Скопировать идентификатор терминала", - copyFilePath: "Copy file path", + copyFilePath: "Скопировать путь к файлу", rename: "Переименовать", closeAbove: "Закрыть вкладки выше", - closeBelow: "Закройте вкладки ниже", - closeLeft: "Ближе к левому краю", - closeRight: "Ближе к правому", + closeBelow: "Закрыть вкладки ниже", + closeLeft: "Закрыть вкладки слева", + closeRight: "Закрыть вкладки справа", closeOthers: "Закрыть другие вкладки", - reloadAgent: "Перезагрузить агент", + reloadAgent: "Перезагрузить агента", reloadAgentTooltip: "Перезагрузите агента, чтобы обновить навыки, MCP или статус входа.", - close: "Закрывать", - renameTerminal: "Переименование терминала", + close: "Закрыть", + renameTerminal: "Переименовать терминал", renameAgent: "Переименовать агента", }, actions: { @@ -601,12 +602,12 @@ export const ru: TranslationResources = { closePane: "Закрыть панель", exitFocusMode: "Выйти из режима фокусировки", splitRight: "Разделить панель справа", - splitDown: "Разделить панель вниз", + splitDown: "Разделить панель снизу", changes: "Изменения", files: "Файлы", - pullRequest: "Запрос на слияние", - terminalProfilesMenu: "Terminal profiles", - editTerminalProfiles: "Edit profiles…", + pullRequest: "PR", + terminalProfilesMenu: "Профили терминала", + editTerminalProfiles: "Изменить профили…", }, sidePanel: { open: "Открыть боковую панель", @@ -617,16 +618,16 @@ export const ru: TranslationResources = { }, toasts: { copyFailed: "Не удалось скопировать", - agentIdCopiedLabel: "AgentID", + agentIdCopiedLabel: "ID агента", terminalIdCopiedLabel: "Идентификатор терминала", resumeCommandCopiedLabel: "команда возобновления", - filePathCopiedLabel: "File path", - resumeIdUnavailable: "Резюме ID недоступно", + filePathCopiedLabel: "Путь к файлу", + resumeIdUnavailable: "ID возобновления недоступен", resumeCommandUnavailable: "Команда возобновления недоступна", reloadingAgent: "Перезагрузка агента...", - reloadedAgent: "Перезагруженный агент", - failedToReloadAgent: "Не удалось перезагрузить агент", - failedToCloseAgent: "Не удалось закрыть агент", + reloadedAgent: "Агент перезагружен", + failedToReloadAgent: "Не удалось перезагрузить агента", + failedToCloseAgent: "Не удалось закрыть агента", }, confirmations: { unsavedTitle: "Несохранённые изменения", @@ -635,51 +636,51 @@ export const ru: TranslationResources = { closeWithoutSaving: "Закрыть без сохранения", closePaneTitle: "Закрыть панель?", bulkUnsaved: - "В {{count}} вкладках есть несохранённые изменения. При закрытии черновики будут удалены.", - close: "Закрывать", + "Вкладок с несохранёнными изменениями: {{count}}. При закрытии черновики будут удалены.", + close: "Закрыть", cancel: "Отмена", - archive: "Архив", + archive: "Архивировать", closeTerminalTitle: "Закрыть терминал?", closeTerminalMessage: "Любой запущенный процесс в этом терминале будет немедленно остановлен.", - archiveRunningAgentTitle: "Агент запуска архива?", + archiveRunningAgentTitle: "Архивировать работающего агента?", archiveRunningAgentMessage: - "Этот агент все еще работает. Архивирование остановит агент и закроет вкладку.", + "Этот агент всё ещё работает. При архивировании агент будет остановлен, а вкладка закрыта.", closeTabsLeftTitle: "Закрыть вкладки слева?", closeTabsRightTitle: "Закрыть вкладки справа?", closeOtherTabsTitle: "Закрыть другие вкладки?", bulk: { - all: "При этом агенты{{agents}}будут заархивированы, терминалы{{terminals}}закроются, а вкладки{{tabs}}будут закрыты. Любой запущенный процесс в закрытом терминале будет немедленно остановлен.", + all: "Будут архивированы агенты ({{agents}}), закрыты терминалы ({{terminals}}) и вкладки ({{tabs}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.", agentsAndTerminals: - "Это приведет к архивированию агентов{{agents}}и закрытию терминалов{{terminals}}. Любой запущенный процесс в закрытом терминале будет немедленно остановлен.", + "Будут архивированы агенты ({{agents}}) и закрыты терминалы ({{terminals}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.", terminalsAndTabs: - "Это закроет терминал(ы){{terminals}}и закроет вкладки(и){{tabs}}. Любой запущенный процесс в закрытом терминале будет немедленно остановлен.", - agentsAndTabs: - "При этом агенты{{agents}}будут заархивированы, а вкладки{{tabs}}закроются.", + "Будут закрыты терминалы ({{terminals}}) и вкладки ({{tabs}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.", + agentsAndTabs: "Будут архивированы агенты ({{agents}}) и закрыты вкладки ({{tabs}}).", terminals: - "Это закроет терминал(ы){{terminals}}. Любой запущенный процесс в закрытом терминале будет немедленно остановлен.", - tabs: "Это закроет вкладки{{tabs}}.", - agents: "Это приведет к архивированию агентов{{agents}}.", + "Будут закрыты терминалы ({{terminals}}). Все запущенные процессы в них будут немедленно остановлены.", + tabs: "Будут закрыты вкладки ({{tabs}}).", + agents: "Будут архивированы агенты ({{agents}}).", }, }, }, header: { actions: { - workspaceActions: "Действия Workspace", + workspaceActions: "Действия с рабочим пространством", newAgent: "Новый агент", newTerminal: "Новый терминал", newBrowser: "Новая вкладка браузера", - importSession: "Импортировать сеанс", - copyPath: "Копировать путь к рабочей области", + importSession: "Импортировать сессию", + copyPath: "Скопировать путь к рабочему пространству", copyBranchName: "Скопировать название ветки", - showSetup: "Показать настройки", + showSetup: "Показать настройку рабочего пространства", }, toasts: { - workspacePathUnavailable: "Путь Workspace пока недоступен.", - branchNameUnavailable: "Название филиала недоступно", - terminalQueued: "Подготовка рабочего пространства, открытие терминала по готовности...", - workspacePathCopiedLabel: "Путь Workspace", - branchNameCopiedLabel: "Название филиала", + workspacePathUnavailable: "Путь к рабочему пространству пока недоступен.", + branchNameUnavailable: "Имя ветки недоступно", + terminalQueued: + "Рабочее пространство подготавливается. Терминал откроется, когда оно будет готово...", + workspacePathCopiedLabel: "Путь к рабочему пространству", + branchNameCopiedLabel: "Имя ветки", }, }, scripts: { @@ -687,32 +688,32 @@ export const ru: TranslationResources = { actions: { chooseUrl: "Выбрать URL", copyUrl: "Скопировать URL", - openService: "Просмотреть сервис", + openService: "Открыть сервис", restart: "Перезапустить", - run: "Бегать", + run: "Запустить", stop: "Остановить", view: "Открыть терминал", }, accessibility: { - trigger: "Скрипты Workspace", - openService: "Просмотреть сервис {{scriptName}}", - viewTerminal: "Посмотреть терминал{{scriptName}}", - runScript: "Запустите скрипт{{scriptName}}", - stopScript: "Остановить{{scriptName}}", - restartScript: "Перезапустить{{scriptName}}", - copyUrl: "Скопировать URL {{scriptName}}", + trigger: "Скрипты рабочего пространства", + openService: "Открыть сервис {{scriptName}}", + viewTerminal: "Открыть терминал скрипта {{scriptName}}", + runScript: "Запустить скрипт {{scriptName}}", + stopScript: "Остановить скрипт {{scriptName}}", + restartScript: "Перезапустить скрипт {{scriptName}}", + copyUrl: "Скопировать URL скрипта {{scriptName}}", chooseUrl: "Выбрать URL для {{scriptName}}", - script: "скрипт{{scriptName}}", + script: "Скрипт {{scriptName}}", }, routes: { public: "Обратный прокси", - paseo: "Memorable", + paseo: "Запоминающийся адрес", direct: "Прямой адрес", }, states: { - exitCode: "выйти из{{code}}", - startFailed: "Не удалось запустить{{scriptName}}", - stopFailed: "Не удалось остановить{{scriptName}}", + exitCode: "Код выхода: {{code}}", + startFailed: "Не удалось запустить скрипт {{scriptName}}", + stopFailed: "Не удалось остановить скрипт {{scriptName}}", }, }, tree: { @@ -721,44 +722,44 @@ export const ru: TranslationResources = { }, git: { actions: { - moreOptions: "Больше возможностей", + moreOptions: "Дополнительные параметры", moreActions: "Дополнительные действия", commit: { - label: "Совершить", - pending: "Совершение...", - success: "Преданный идее", + label: "Создать коммит", + pending: "Создание коммита...", + success: "Коммит создан", }, pull: { - label: "Тянуть", - pending: "Тяну...", - success: "Вытащил", + label: "Получить изменения", + pending: "Получение изменений...", + success: "Изменения получены", }, push: { - label: "Толкать", - pending: "Толкаю...", - success: "Нажатый", + label: "Отправить изменения", + pending: "Отправка изменений...", + success: "Изменения отправлены", }, pullAndPush: { - label: "Тяни и толкай", - pending: "Тянет и толкает...", - success: "Вытащил и толкнул", + label: "Получить и отправить изменения", + pending: "Получение и отправка изменений...", + success: "Изменения получены и отправлены", }, viewPr: "Посмотреть PR", createPr: { label: "Создать PR", pending: "Создание PR...", - success: "PR создано", + success: "PR создан", label_mr: "Создать MR", pending_mr: "Создание MR...", - success_mr: "MR создано", + success_mr: "MR создан", }, mergeBranch: { - label: "Объединить локально", + label: "Выполнить слияние локально", pending: "Слияние...", - success: "Объединено", + success: "Слияние выполнено", }, mergeFromBase: { - label: "Обновление от{{baseRef}}", + label: "Обновить из {{baseRef}}", pending: "Обновление...", success: "Обновлено", }, @@ -768,151 +769,143 @@ export const ru: TranslationResources = { success: "В архиве", }, mergePr: { - squash: "Объединить PR (squash)", - merge: "Объединить PR (merge)", - rebase: "Объединить PR (rebase)", - pending: "Объединение PR...", - success: "PR объединен", - squash_mr: "Объединить MR (squash)", - merge_mr: "Объединить MR (merge)", - rebase_mr: "Объединить MR (rebase)", - pending_mr: "Объединение MR...", - success_mr: "MR объединен", + squash: "Выполнить слияние PR (squash)", + merge: "Выполнить слияние PR (merge)", + rebase: "Выполнить слияние PR (rebase)", + pending: "Слияние PR...", + success: "Слияние PR выполнено", + squash_mr: "Выполнить слияние MR (squash)", + merge_mr: "Выполнить слияние MR (merge)", + rebase_mr: "Выполнить слияние MR (rebase)", + pending_mr: "Слияние MR...", + success_mr: "Слияние MR выполнено", }, viewPr_mr: "Посмотреть MR", autoMerge: { - enableSquash: "Автообъединение (squash)", - enableMerge: "Автообъединение (merge)", - enableRebase: "Автообъединение (rebase)", - enabled: "Автоматическое объединение включено", - enabling: "Включение автоматического объединения...", - disabling: "Отключение автоматического объединения...", - disabled: "Автоматическое объединение отключено", + enableSquash: "Включить автослияние (squash)", + enableMerge: "Включить автослияние (merge)", + enableRebase: "Включить автослияние (rebase)", + enabled: "Автослияние включено", + enabling: "Включение автослияния...", + disabling: "Отключение автослияния...", + disabled: "Автослияние отключено", }, unavailable: { - viewPrNoForge: "Просмотр {{noun}} сейчас недоступен, поскольку {{brand}} не подключен.", + viewPrNoForge: "Просмотр {{noun}} сейчас недоступен: {{brand}} не подключён.", pullNoRemote: - "Функция Pull здесь недоступна, поскольку эта ветка еще не подключена к удаленному серверу.", + "Получение изменений недоступно: эта ветка ещё не связана с удалённым репозиторием.", pullDirty: - "Функция Pull недоступна, пока у вас есть локальные изменения, поэтому сначала зафиксируйте или сохраните их.", - pullUpToDate: "Функция Pull недоступна, поскольку эта ветка уже обновлена.", + "Получение изменений недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.", + pullUpToDate: "Получение изменений недоступно: ветка уже в актуальном состоянии.", pushNoRemote: - "Push здесь недоступен, поскольку эта ветка еще не подключена к удаленному устройству.", - pushBehind: "Push пока недоступен, поскольку сначала нужно внести новые изменения.", - pushNothing: "Push недоступен, поскольку нет ничего нового для отправки.", + "Отправка изменений недоступна: эта ветка ещё не связана с удалённым репозиторием.", + pushBehind: "Отправка изменений пока недоступна: сначала получите более новые изменения.", + pushNothing: "Отправка изменений недоступна: нет новых изменений для отправки.", pullAndPushNoRemote: - "Функция Pull and Push здесь недоступна, поскольку эта ветка еще не подключена к удаленному устройству.", + "Получение и отправка изменений недоступны: эта ветка ещё не связана с удалённым репозиторием.", pullAndPushDirty: - "Функция извлечения и отправки недоступна, пока у вас есть локальные изменения, поэтому сначала зафиксируйте или сохраните их.", + "Получение и отправка изменений недоступны при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.", pullAndPushNoIncoming: - "Функция Pull and Push недоступна, поскольку сначала нечего получать.", + "Получение и отправка изменений недоступны: нет входящих изменений для получения.", pullAndPushInSync: - "Функция Pull and Push недоступна, поскольку эта ветвь уже синхронизирована.", + "Получение и отправка изменений недоступны: ветка уже синхронизирована.", pullAndPushNothingToPush: - "Функция Pull and Push недоступна, поскольку после pull нечего отправлять.", - createPrNoForge: - "Функция «Создать {{noun}}» сейчас недоступна, поскольку {{brand}} не подключен.", - createPrNoCommits: - "Функция «Создать PR» недоступна, поскольку в этой ветке еще нет новых коммитов.", - mergeNoBase: "Объединение недоступно, поскольку нам не удалось определить базовую ветку.", + "Получение и отправка изменений недоступны: после получения нечего отправлять.", + createPrNoForge: "Создание {{noun}} сейчас недоступно: {{brand}} не подключён.", + createPrNoCommits: "Создание PR недоступно: в этой ветке пока нет новых коммитов.", + mergeNoBase: "Слияние недоступно: не удалось определить базовую ветку.", mergeDirty: - "Объединение недоступно, пока у вас есть локальные изменения, поэтому сначала зафиксируйте или сохраните их.", - mergeNothing: - "Объединение недоступно, поскольку в этой ветке еще нет ничего нового для объединения.", - updateNoBase: "Обновление недоступно, поскольку нам не удалось определить базовую ветку.", + "Слияние недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.", + mergeNothing: "Слияние недоступно: в этой ветке пока нет новых изменений для слияния.", + updateNoBase: "Обновление недоступно: не удалось определить базовую ветку.", updateDirty: - "Обновление недоступно, пока у вас есть локальные изменения, поэтому сначала зафиксируйте или сохраните их.", - updateCurrent: - "Обновление недоступно, поскольку эта ветка уже обновлена ​​до версии{{baseRef}}.", - mergePrNoGithub: "Объединение PR сейчас недоступно, поскольку GitHub не подключен.", + "Обновление недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.", + updateCurrent: "Обновление недоступно: эта ветка уже синхронизирована с {{baseRef}}.", + mergePrNoGithub: "Слияние PR сейчас недоступно: GitHub не подключён.", archiveNotWorktree: - "Архив здесь недоступен, поскольку это рабочее пространство не было создано как рабочее дерево Paseo.", - mergePrNoForge: - "Объединение {{noun}} сейчас недоступно, поскольку {{brand}} не подключен.", - mergePrMissing: "Объединение PR недоступно, поскольку еще нет запроса на включение", - mergePrDraft: - "Объединение PR недоступно, поскольку запрос на включение все еще находится на стадии черновика.", - mergePrMerged: "Объединение PR недоступно, поскольку запрос на включение уже объединен.", - mergePrClosed: "Объединение PR недоступно, поскольку запрос на включение закрыт.", - mergePrConflicts: - "Объединение PR недоступно, поскольку запрос на включение содержит конфликты.", - mergePrQueue: - "Слияние PR здесь недоступно, поскольку этот репозиторий использует очередь слияния.", + "Архивирование недоступно: это рабочее пространство не было создано как worktree Paseo.", + mergePrNoForge: "Слияние {{noun}} сейчас недоступно: {{brand}} не подключён.", + mergePrMissing: "Слияние PR недоступно: PR ещё не создан.", + mergePrDraft: "Слияние PR недоступно: PR всё ещё является черновиком.", + mergePrMerged: "Слияние PR недоступно: PR уже объединён.", + mergePrClosed: "Слияние PR недоступно: PR закрыт.", + mergePrConflicts: "Слияние PR недоступно: в PR есть конфликты слияния.", + mergePrQueue: "Слияние PR недоступно: в этом репозитории используется очередь слияния.", mergePrNotReady: "Функция слияния {{noun}} недоступна до тех пор, пока {{brand}} не сообщит, что {{noun}} готов к слиянию.", autoMergeCannotDisable: - "Автоматическое объединение включено, но этот аккаунт не может его отключить.", + "Автослияние включено, но эта учётная запись не может его отключить.", }, toasts: { - failedCommit: "Не удалось совершить фиксацию", - failedPull: "Не удалось вытащить", - failedPush: "Не удалось нажать", - failedPullAndPush: "Не удалось тянуть и толкать", + failedCommit: "Не удалось создать коммит", + failedPull: "Не удалось получить изменения", + failedPush: "Не удалось отправить изменения", + failedPullAndPush: "Не удалось получить и отправить изменения", failedCreatePr: "Не удалось создать PR.", - failedMergePr: "Не удалось объединить PR.", - failedEnableAutoMerge: "Не удалось включить автоматическое объединение", - failedDisableAutoMerge: "Не удалось отключить автоматическое объединение", - baseRefUnavailable: "Базовый номер недоступен.", - failedMerge: "Не удалось объединиться", - failedMergeFromBase: "Не удалось объединиться с базой.", + failedMergePr: "Не удалось выполнить слияние PR", + failedEnableAutoMerge: "Не удалось включить автослияние", + failedDisableAutoMerge: "Не удалось отключить автослияние", + baseRefUnavailable: "Базовая ветка недоступна", + failedMerge: "Не удалось выполнить слияние", + failedMergeFromBase: "Не удалось выполнить слияние с базовой веткой", }, archiveWarning: { - title: 'Архив "{{workspaceName}}"?', - confirm: "Архив", + title: "Архивировать «{{workspaceName}}»?", + confirm: "Архивировать", cancel: "Отмена", uncommittedChanges: "Незафиксированные изменения", uncommittedChangesWithDiff: "Незафиксированные изменения ({{diffStat}})", - addedLine: "{{count}}добавлена ​​строка", - addedLines: "{{count}}добавил строки", - deletedLine: "{{count}}удалена строка", - deletedLines: "{{count}}удалил строки", - unpushedCommit: "Неотправленная фиксация{{count}}", - unpushedCommits: "Неотправленные коммиты{{count}}", + addedLine: "Добавлено строк: {{count}}", + addedLines: "Добавлено строк: {{count}}", + deletedLine: "Удалено строк: {{count}}", + deletedLines: "Удалено строк: {{count}}", + unpushedCommit: "Неотправленных коммитов: {{count}}", + unpushedCommits: "Неотправленных коммитов: {{count}}", }, }, diff: { openChangesTab: "Открыть вкладку «Изменения»", closeChangesTab: "Закрыть вкладку «Изменения»", binaryFile: "Бинарный файл", - tooLarge: "Разница слишком велика для отображения", - previewTooLargeTitle: "Этот diff слишком велик для предпросмотра", - previewTooLargeDescription: "Сузьте сравнение, чтобы просмотреть его здесь", - unified: "Единый дифференциал", - split: "Параллельная разница", - switchToUnified: "Переключить на объединенный diff", - switchToSplit: "Переключить на diff рядом", - options: "Параметры diff", - hideWhitespace: "Скрыть пробелы", - showWhitespace: "Показать пробелы", + tooLarge: "Дифф слишком велик для отображения", + previewTooLargeTitle: "Этот дифф слишком велик для предварительного просмотра", + previewTooLargeDescription: "Сузьте диапазон сравнения, чтобы просмотреть дифф здесь", + unified: "Унифицированный дифф", + split: "Параллельный дифф", + switchToUnified: "Переключиться на унифицированный дифф", + switchToSplit: "Переключиться на параллельный дифф", + options: "Параметры диффа", + hideWhitespace: "Скрыть пробельные изменения", + showWhitespace: "Показать пробельные изменения", scrollLongLines: "Прокручивать длинные строки", wrapLongLines: "Перенос длинных строк", collapseAllFolders: "Свернуть все папки", expandAllFolders: "Развернуть все папки", collapseAllFiles: "Свернуть все файлы", expandAllFiles: "Развернуть все файлы", - refreshing: "Освежающий", + refreshing: "Обновление", refresh: "Обновить", - refreshState: "Обновить состояние git и {{brand}}", - failedRefresh: "Не удалось обновить состояние git.", - emptyHiddenWhitespace: "Никаких видимых изменений после скрытия пробелов", + refreshState: "Обновить состояние Git и {{brand}}", + failedRefresh: "Не удалось обновить состояние Git.", + emptyHiddenWhitespace: "После скрытия пробельных изменений видимых изменений нет", emptyUncommitted: "Нет незафиксированных изменений", - emptyAgainstBase: "Никаких изменений по сравнению с{{baseRef}}", + emptyAgainstBase: "Нет изменений относительно {{baseRef}}", checkingRepository: "Проверяем репозиторий...", - notRepository: "Не git- репозиторий", - diffMode: "Режим разницы", - uncommitted: "Незафиксированный", - committed: "Преданный идее", - branchUnknown: "Неизвестный", - base: "база", + notRepository: "Это не репозиторий Git", + diffMode: "Режим диффа", + uncommitted: "Незафиксированные изменения", + committed: "Зафиксированные изменения", + branchUnknown: "Неизвестная ветка", + base: "базовая ветка", newFile: "Новый", - deletedFile: "Удалено", - modifiedFile: "Изменено", + deletedFile: "Файл удалён", + modifiedFile: "Файл изменён", commits: { title: "Коммиты", - countLabel: "{{count}} коммитов рабочего пространства", - noneAhead: "Коммитов впереди {{baseRef}} пока нет", + countLabel: "Коммитов в рабочем пространстве: {{count}}", + noneAhead: "Пока нет коммитов, отсутствующих в {{baseRef}}", fileDiffEmpty: "Нет изменений для отображения", - fileDiffError: "Не удалось загрузить различия файла", + fileDiffError: "Не удалось загрузить дифф файла", loading: "Загрузка коммитов…", loadError: "Не удалось загрузить коммиты", empty: "Коммитов пока нет", @@ -921,13 +914,13 @@ export const ru: TranslationResources = { openInEditor: { open: "Открыть", chooseEditor: "Выбрать редактор", - openIn: "Открыть рабочую область в{{target}}", - openFileIn: "Open {{fileName}} in {{target}}", - failedOpen: "Не удалось открыть рабочую область", + openIn: "Открыть рабочее пространство в {{target}}", + openFileIn: "Открыть {{fileName}} в {{target}}", + failedOpen: "Не удалось открыть рабочее пространство", }, pr: { actions: { - viewPullRequest: "Открыть", + viewPullRequest: "Просмотреть", openOn: "Открыть на {{brand}}", }, checksSummary: { @@ -939,42 +932,42 @@ export const ru: TranslationResources = { runningAccessible: "Проверки выполняются", }, sections: { - checks: "Чеки", + checks: "Проверки", pipeline: "Пайплайн", - reviews: "Отзывы", + reviews: "Ревью", }, empty: { - noJobs: "Нет задач", + noJobs: "Нет заданий", loadingPipeline: "Загрузка пайплайна...", - pipelineJobsLoadFailed: "Не удалось загрузить задачи пайплайна", + pipelineJobsLoadFailed: "Не удалось загрузить задания пайплайна", allowedToFail: "допускается сбой", }, - approvals: "{{given}} из {{required}} одобрений", + approvals: "Одобрено: {{given}} из {{required}}", accessibility: { - pullRequest: "Запрос на извлечение №{{number}}", - pullRequest_mr: "Запрос на слияние !{{number}}", + pullRequest: "PR #{{number}}", + pullRequest_mr: "MR !{{number}}", }, states: { draft: "Черновик", - merged: "Объединено", - closed: "Закрыто", - open: "Открыть", + merged: "Объединён", + closed: "Закрыт", + open: "Открыт", }, activity: { - commented: "Прокомментировал", - approved: "Одобренный", - requestedChanges: "Запрошенные изменения", - reviewed: "Рассмотрено", + commented: "Оставлен комментарий", + approved: "Одобрено", + requestedChanges: "Запрошены изменения", + reviewed: "Проведено ревью", }, time: { justNow: "прямо сейчас", }, thread: { - discussion: "Обсуждение", + discussion: "Ветка обсуждения", }, errors: { - statusLoadFailed: "Невозможно загрузить статус запроса на включение", - activityLoadFailed: "Невозможно загрузить активность запроса на включение", + statusLoadFailed: "Не удалось загрузить статус PR", + activityLoadFailed: "Не удалось загрузить активность PR", }, }, forgeSetup: { @@ -995,7 +988,7 @@ export const ru: TranslationResources = { errors: { update: "Не удалось обновить метку", load: "Не удалось загрузить метки" }, colors: { violet: "Фиолетовый", - sky: "Небесный", + sky: "Голубой", emerald: "Изумрудный", orange: "Оранжевый", pink: "Розовый", @@ -1017,14 +1010,14 @@ export const ru: TranslationResources = { search: "Поиск меток", empty: "На этом хосте нет меток.", edit: "Изменить метку", - editLabel: "Изменить {{name}}", + editLabel: "Изменить метку «{{name}}»", name: "Название", color: "Цвет", save: "Сохранить", delete: "Удалить", - deleteTitle: "Удалить {{name}}?", - deleteMessage_one: "Метка будет удалена из {{count}} рабочего пространства на этом хосте.", - deleteMessage_other: "Метка будет удалена из {{count}} рабочих пространств на этом хосте.", + deleteTitle: "Удалить метку «{{name}}»?", + deleteMessage_one: "Метка будет снята с {{count}} рабочего пространства на этом хосте.", + deleteMessage_other: "Метка будет снята с {{count}} рабочих пространств на этом хосте.", offline: "Этот хост не в сети.", updateHost: "Обновите этот хост для управления метками.", }, @@ -1049,7 +1042,7 @@ export const ru: TranslationResources = { branch: "Ветка", project: "Проект", host: "Хост", - changeRequest: "Pull request", + changeRequest: "PR", checks: "Проверки", services: "Сервисы", labels: "Метки", @@ -1078,7 +1071,7 @@ export const ru: TranslationResources = { addProject: "Добавить проект", newWorkspace: "Новое рабочее пространство", hosts: "Хосты", - home: "Дом", + home: "Главная", settings: "Настройки", closeSidebar: "Закрыть боковую панель", }, @@ -1089,7 +1082,7 @@ export const ru: TranslationResources = { shortcuts: "Сочетания клавиш", reportIssue: "Сообщить о проблеме", discord: "Discord", - github: "Создать issue в GitHub", + github: "Создать issue на GitHub", whatsNew: "Что нового", appName: "Paseo", }, @@ -1098,87 +1091,87 @@ export const ru: TranslationResources = { schedules: "Расписания", }, worktreeSetup: { - title: "Настройка сценариев рабочего дерева", + title: "Настроить скрипты worktree", description: - "Добавьте команды настройки, чтобы новые рабочие деревья могли автоматически устанавливать зависимости и готовиться.", + "Добавьте команды настройки для автоматической установки зависимостей и подготовки новых worktree.", openProjectSettings: "Открыть настройки проекта", }, project: { actions: { menu: "Действия проекта", openSettings: "Открыть настройки проекта", - openNewWindow: "Open in new window", - openNewWindowFailed: "Couldn't open a new window", - openFolder: "Open in file manager", - openFolderFailed: "Couldn't open folder", + openNewWindow: "Открыть в новом окне", + openNewWindowFailed: "Не удалось открыть новое окно", + openFolder: "Открыть в файловом менеджере", + openFolderFailed: "Не удалось открыть папку", remove: "Удалить проект", removing: "Удаление...", }, confirmations: { removeTitle: "Удалить проект?", removeMessage: - "Удалить «{{projectName}}» с боковой панели?\n\n Файлы на диске не будут изменены.", - removeConfirm: "Удалять", + "Удалить проект «{{projectName}}» с боковой панели?\n\nФайлы на диске не будут изменены.", + removeConfirm: "Удалить", cancel: "Отмена", }, toasts: { - hostDisconnected: "Host не подключен", - removeFailed: "Не удалось удалить некоторые рабочие области.", - updateHostToRemove: "Обновите host, чтобы удалять проекты.", + hostDisconnected: "Хост не подключён", + removeFailed: "Не удалось удалить некоторые рабочие пространства.", + updateHostToRemove: "Обновите хост, чтобы удалять проекты.", }, empty: { title: "Пока нет проектов", - description: "Добавьте проект, чтобы начать", + description: "Добавьте проект, чтобы начать работу", }, }, workspace: { status: { serviceRunning: "Сервис {{name}} запущен", - serviceUnhealthy: "Сервис {{name}} неисправен", + serviceUnhealthy: "Сервис {{name}} работает некорректно", creating: "Создание...", }, actions: { - menu: "Действия Workspace", + menu: "Действия рабочего пространства", newWorkspace: "Новое рабочее пространство", showMore: "Показать ещё", showLess: "Показать меньше", - createWorkspaceFor: "Создайте новое рабочее пространство для{{projectName}}.", + createWorkspaceFor: "Создать новое рабочее пространство для {{projectName}}", copyPath: "Копировать путь", - copyBranchName: "Скопировать название ветки", - rename: "Переименовать рабочую область", + copyBranchName: "Скопировать имя ветки", + rename: "Переименовать рабочее пространство", pin: "Закрепить вверху", unpin: "Открепить", - archive: "Архив", + archive: "Архивировать", archiveWorkspace: "Архивировать рабочее пространство", - hideFromSidebar: "Скрыть с боковой панели", + hideFromSidebar: "Скрыть на боковой панели", archiving: "Архивирование...", hiding: "Скрытие...", }, confirmations: { hideTitle: "Скрыть рабочее пространство?", hideMessage: - "Скрыть «{{workspaceName}}» на боковой панели?\n\n Файлы на диске не будут изменены.", - hideConfirm: "Скрывать", + "Скрыть «{{workspaceName}}» на боковой панели?\n\nФайлы на диске не будут изменены.", + hideConfirm: "Скрыть", cancel: "Отмена", }, rename: { - title: "Переименовать рабочую область", + title: "Переименовать рабочее пространство", submit: "Переименовать", - invalidBranchName: "Неверное название ветки", + invalidBranchName: "Недопустимое имя ветки", }, toasts: { - workspacePathUnavailable: "Путь Workspace недоступен", + workspacePathUnavailable: "Путь к рабочему пространству недоступен", pathCopied: "Путь скопирован", - branchNameCopied: "Название филиала скопировано.", - hostDisconnected: "Host не подключен", - hideFailed: "Не удалось скрыть рабочую область.", - archiveFailed: "Не удалось заархивировать рабочее пространство.", + branchNameCopied: "Имя ветки скопировано", + hostDisconnected: "Хост не подключён", + hideFailed: "Не удалось скрыть рабочее пространство", + archiveFailed: "Не удалось архивировать рабочее пространство", }, }, }, newWorkspace: { title: "Новое рабочее пространство", - create: "Создавать", + create: "Создать", isolation: { local: "Локально", worktree: "Новый worktree", @@ -1186,212 +1179,214 @@ export const ru: TranslationResources = { }, fields: { project: "Проект", - base: "База", + base: "Базовая ветка", baseNotApplicable: "Неприменимо", }, - titlePlaceholder: "Название (необязательно)", + titlePlaceholder: "Заголовок (необязательно)", errors: { - hostDisconnected: "Host не подключен", - createWorktreeFailed: "Не удалось создать рабочее дерево.", - composerStateRequired: "Требуется состояние композитора.", + hostDisconnected: "Хост не подключён", + createWorktreeFailed: "Не удалось создать worktree.", + composerStateRequired: "Редактор сообщения ещё не готов.", selectModel: "Выберите модель", }, tooltips: { - project: "Choose the project", - host: "Choose the host", - isolation: "Choose the isolation level", + project: "Выберите проект", + host: "Выберите хост", + isolation: "Выберите уровень изоляции", startingRef: "Выберите, с чего начать", - launch: "Choose what to launch", + launch: "Выберите, что запустить", }, refPicker: { - startingRef: "Начальная ссылка", - intoBase: "в {{baseRef}}", + startingRef: "Исходная точка", + intoBase: "в ветку {{baseRef}}", searching: "Идет поиск...", - noMatchingRefs: "Нет подходящих ссылок.", - searchPlaceholder: "Поиск филиалов и PR", + noMatchingRefs: "Нет подходящих веток или PR.", + searchPlaceholder: "Поиск веток и PR", title: "Начать с", }, launch: { - title: "What to launch", - chat: "Chat", - terminal: "Terminal", - manageProfiles: "Manage profiles", - submit: "Launch", - promptPlaceholder: "Prompt {{name}}", - commandPlaceholder: "Run a command, or leave empty for a blank terminal", + title: "Что запустить", + chat: "Чат", + terminal: "Терминал", + manageProfiles: "Управление профилями терминала", + submit: "Запустить", + promptPlaceholder: "Промпт для {{name}}", + commandPlaceholder: + "Введите команду или оставьте поле пустым, чтобы открыть терминал без запуска команды", }, }, desktop: { quitting: { - title: "Выход из Paseo...", + title: "Завершение работы Paseo...", detail: "Остановка локального демона.", }, daemon: { - title: "Daemon", + title: "Демон", status: { title: "Статус", - builtInOnly: "Здесь показан только встроенный демон рабочего стола.", - running: "бег", + builtInOnly: "Здесь показан только встроенный демон настольного приложения.", + running: "работает", notRunning: "не работает", - pid: "PID{{pid}}", + pid: "PID {{pid}}", }, management: { title: "Управление встроенным демоном", - hint: "Позвольте Paseo запустить и остановить встроенный демон.", + hint: "Разрешить Paseo запускать и останавливать встроенный демон", pauseTitle: "Приостановить встроенный демон", pauseMessage: "Это немедленно остановит встроенный демон. Запущенные агенты и терминалы, подключенные к встроенному демону, будут остановлены.", - pauseAndStop: "Пауза и остановка", + pauseAndStop: "Приостановить управление и остановить демон", registrationFailed: - "Built-in daemon started, but Paseo could not save the localhost connection. Toggle daemon management off and on again, or add localhost manually.", + "Встроенный демон запущен, но Paseo не удалось сохранить подключение к localhost. Выключите и снова включите управление демоном или добавьте localhost вручную.", pausedStopFailed: "Встроенное управление демоном было приостановлено, но Paseo не смог остановить демон.", - updateFailed: "Невозможно обновить встроенное управление демонами.", + updateFailed: "Не удалось изменить настройки управления встроенным демоном.", }, keepRunning: { title: "Продолжать работу демона после выхода", - hint: "Daemon продолжает работать, когда вы выходите из Paseo", + hint: "Демон продолжит работать после выхода из Paseo", }, logs: { title: "Файл журнала", - modalTitle: "Журналы Daemon", + modalTitle: "Журналы демона", unavailable: "Путь к журналу недоступен", empty: "(файл журнала пуст)", copied: "Путь к журналу скопирован.", - copyFailed: "Невозможно скопировать путь к журналу.", + copyFailed: "Не удалось скопировать путь к журналу.", open: "Открыть журналы", copyPath: "Копировать путь", }, fullStatus: { title: "Полный статус", - modalTitle: "Статус Daemon", - hint: "Запускает`paseo daemon status`и показывает результат", + modalTitle: "Статус демона", + hint: "Выполняет команду `paseo daemon status` и показывает результат", view: "Посмотреть статус", copied: "Статус скопирован в буфер обмена.", - fetchFailed: "Не удалось получить статус демона:{{message}}.", + fetchFailed: "Не удалось получить статус демона: {{message}}", }, advancedSettings: "Расширенные настройки", openAdvancedSettings: "Открыть дополнительные настройки демона", versionMismatch: - "Версии приложения и демона не совпадают. Обновите обе версии до одной и той же версии для лучшего опыта.", - loadFailed: "Невозможно загрузить статус демона рабочего стола.", + "Версии приложения и демона не совпадают. Обновите приложение и демон до одной версии, чтобы избежать проблем.", + loadFailed: "Не удалось загрузить статус встроенного демона.", }, updates: { status: { checking: "Проверка обновлений приложения...", installing: "Установка обновления приложения...", - upToDate: "Приложение актуально.", - upToDateWithLastChecked: "Up to date. Last checked at {{time}}.", + upToDate: "Установлена последняя версия приложения.", + upToDateWithLastChecked: + "Установлена последняя версия приложения. Последняя проверка: {{time}}.", pending: "Мы сообщим вам, когда обновление будет готово.", pendingWithLastChecked: "Мы сообщим вам, когда обновление будет готово. Последняя проверка в {{time}}.", pendingWithVersion: "Найдено обновление: {{version}}. Загрузка...", pendingWithVersionAndLastChecked: "Найдено обновление: {{version}}. Загрузка... Последняя проверка в {{time}}.", - availableWithVersion: "Обновление готово:{{version}}", + availableWithVersion: "Обновление готово: {{version}}", availableWithVersionAndLastChecked: - "Обновление готово:{{version}}. Последняя проверка в {{time}}.", + "Обновление готово: {{version}}. Последняя проверка: {{time}}.", available: "Обновление приложения готово к установке.", availableWithLastChecked: "Обновление приложения готово к установке. Последняя проверка в {{time}}.", - installed: "Обновление приложения установлено. Требуется перезагрузка.", + installed: "Обновление приложения установлено. Требуется перезапуск.", failed: "Не удалось обновить приложение.", - idle: "Статус обновления еще не проверен.", + idle: "Статус обновления ещё не проверен.", }, - installError: "Невозможно установить обновление настольного приложения.", + installError: "Не удалось установить обновление настольного приложения.", callout: { installingTitle: "Установка обновления", failedTitle: "Обновление не выполнено", availableTitle: "Доступно обновление", - genericError: "Что- то пошло не так.", + genericError: "Что-то пошло не так.", whatsNew: "Что нового", installingAction: "Установка...", installAndRestart: "Установить и перезапустить", installingDescription: "Установка и перезапуск...", - versionReady: "{{version}}готов к установке.", + versionReady: "Версия {{version}} готова к установке.", newVersionReady: "Новая версия готова к установке.", restartWarning: - "Обновление приложения приведет к остановке работы агентов и закрытию сеансов терминала.", + "При обновлении приложения работающие агенты будут остановлены, а сеансы терминала закрыты.", }, }, settings: { - loadFailed: "Невозможно загрузить настройки рабочего стола.", - saveFailed: "Невозможно сохранить настройки рабочего стола.", + loadFailed: "Не удалось загрузить настройки настольного приложения.", + saveFailed: "Не удалось сохранить настройки настольного приложения.", }, rosetta: { title: "Загрузите сборку Apple Silicon", - runningIntel: "Вы используете сборку Intel для Paseo под Rosetta на Apple Silicon.", + runningIntel: "Вы используете сборку Paseo для Intel через Rosetta на Apple Silicon.", highCpu: - "Это приводит к высокой загрузке ЦП. Загрузите сборку Apple Silicon, чтобы исправить это.", + "Из-за этого процессор сильно загружен. Чтобы устранить проблему, скачайте сборку для Apple Silicon.", download: "Скачать", }, permissions: { notifications: { allowed: "Уведомления разрешены операционной системой.", denied: "Уведомления запрещены в настройках системы.", - notGranted: "Уведомления еще не были предоставлены.", - webOnly: "Статус уведомлений на рабочем столе доступен только в веб- среде выполнения.", + notGranted: "Разрешение на уведомления ещё не предоставлено.", + webOnly: "Статус системных уведомлений доступен только в веб-среде выполнения.", supported: "Уведомления на рабочем столе поддерживаются.", unsupported: "Уведомления на рабочем столе не поддерживаются на этой платформе.", - apiUnavailable: "API веб- уведомлений недоступен в этой среде.", + apiUnavailable: "Web Notification API недоступен в этой среде.", requestsWebOnly: - "Запросы уведомлений на рабочем столе доступны только в веб- среде выполнения.", - requestUnavailable: "API веб- уведомлений requestPermission() недоступен.", - requestFailed: "Не удалось запросить разрешение на уведомление:{{message}}.", - unexpectedState: "Состояние разрешения на непредвиденное уведомление:{{state}}.", + "Запрашивать разрешение на системные уведомления можно только в веб-среде выполнения.", + requestUnavailable: "В Web Notification API недоступен метод requestPermission().", + requestFailed: "Не удалось запросить разрешение на уведомления: {{message}}", + unexpectedState: "Неожиданное состояние разрешения на уведомления: {{state}}", }, microphone: { - webOnly: "Статус настольного микрофона доступен только в веб- среде выполнения.", - navigatorUnavailable: "Навигатор недоступен в этой среде.", - granted: "Доступ к микрофону разрешен.", + webOnly: "Статус микрофона доступен только в веб-среде выполнения.", + navigatorUnavailable: "Объект Navigator недоступен в этой среде.", + granted: "Доступ к микрофону разрешён.", denied: "Доступ к микрофону запрещен в настройках системы.", - notGranted: "Разрешение на использование микрофона еще не получено.", - unexpectedState: "Неожиданное состояние разрешения микрофона:{{state}}.", + notGranted: "Разрешение на использование микрофона ещё не получено.", + unexpectedState: "Неожиданное состояние разрешения на микрофон: {{state}}", statusApiUnavailable: - "API состояния микрофона недоступен в этой среде выполнения. Используйте Запрос, чтобы проверить доступ.", - queryFailed: "Не удалось запросить статус микрофона:{{message}}.", + "API проверки состояния микрофона недоступен в этой среде выполнения. Запросите доступ, чтобы проверить его.", + queryFailed: "Не удалось проверить состояние микрофона: {{message}}", captureUnavailable: "В этой среде захват микрофона недоступен.", permissionApiUnavailable: - "API статуса разрешения недоступен. Используйте Запрос, чтобы проверить доступ.", - requestsWebOnly: "Запросы настольного микрофона доступны только в веб- среде выполнения.", + "API проверки разрешений недоступен. Запросите доступ, чтобы проверить его.", + requestsWebOnly: "Запрашивать доступ к микрофону можно только в веб-среде выполнения.", captureApiUnavailable: "API захвата микрофона недоступен в этой среде.", requestDenied: "Разрешение на использование микрофона было отклонено пользователем или системой.", - noDevice: "Микрофонное устройство не обнаружено.", - requestFailed: "Не удалось запросить разрешение микрофона:{{message}}.", + noDevice: "Микрофон не найден.", + requestFailed: "Не удалось запросить доступ к микрофону: {{message}}", }, empty: { - notifications: "Статус уведомления еще не проверен.", - microphone: "Состояние микрофона еще не проверялось.", + notifications: "Статус уведомлений ещё не проверен.", + microphone: "Состояние микрофона ещё не проверялось.", }, testNotification: { title: "Тест уведомлений Paseo", body: "Если вы это видите, уведомления на рабочем столе работают.", notDelivered: - "Уведомление не было доставлено. Проверьте Системные настройки > Уведомления.", + "Уведомление не доставлено. Проверьте раздел «Уведомления» в системных настройках.", failed: "Не удалось отправить уведомление.", }, }, integrations: { cli: { - statusFailed: "Невозможно проверить статус установки CLI.", - installFailed: "Невозможно установить PaseoCLI.", + statusFailed: "Не удалось проверить состояние установки CLI.", + installFailed: "Не удалось установить Paseo CLI.", }, }, }, rootError: { title: "В Paseo возникла проблема.", - body: "Попробуйте снова перезагрузить приложение. Если это повторяется, приложите приведенные ниже подробности к отчету.", + body: "Попробуйте перезагрузить приложение. Если ошибка повторится, приложите приведённые ниже сведения к отчёту.", details: "Подробности", }, startup: { - errorTitle: "Что- то пошло не так", + errorTitle: "Что-то пошло не так", errorDescription: - "Локальный сервер не удалось запустить. Если это повторяется, сообщите о проблеме на GitHub и приложите журналы ниже.", + "Не удалось запустить локальный сервер. Если ошибка повторится, сообщите о ней на GitHub и приложите приведённые ниже журналы.", logs: { loading: "Загрузка журналов демона...", unavailable: "Журналы демона отсутствуют.", - loadFailed: "Невозможно загрузить журналы демона:{{message}}", + loadFailed: "Не удалось загрузить журналы демона: {{message}}", }, }, openProject: { @@ -1401,15 +1396,15 @@ export const ru: TranslationResources = { description: "Откройте папку на своем компьютере", }, importSession: { - title: "Импортировать сеанс", - description: "Добавьте последние внешние сеансы CLI.", + title: "Импортировать сессию", + description: "Импортируйте недавние сессии из внешних CLI", }, setupProviders: { - title: "Поставщики установки", - description: "Настройте Claude Code,Codex и другие", + title: "Настроить провайдеров", + description: "Настройте Claude Code, Codex и другие провайдеры", }, pairDevice: { - title: "Сопряжение устройства", + title: "Подключить устройство", description: "Подключите свой телефон к этому демону", }, }, @@ -1428,26 +1423,26 @@ export const ru: TranslationResources = { }, branchSwitcher: { triggerTooltip: "Переключить ветку рабочего пространства", - currentBranch: "Текущая ветка:{{branchName}}. Нажмите, чтобы переключить ветку.", + currentBranch: "Текущая ветка: {{branchName}}. Нажмите, чтобы переключить ветку.", placeholder: "Сменить ветку...", searchPlaceholder: "Фильтровать ветки...", - empty: "Филиалов не найдено.", + empty: "Ветки не найдены.", title: "Переключить ветку", uncommittedTitle: "Незафиксированные изменения", uncommittedMessage: - "У вас есть незафиксированные изменения. Спрятать их перед переключением веток?", - stashAndSwitch: "Тайник и переключатель", - failedToStash: "Не удалось сохранить изменения.", + "У вас есть незафиксированные изменения. Убрать их в stash перед переключением ветки?", + stashAndSwitch: "Убрать в stash и переключиться", + failedToStash: "Не удалось убрать изменения в stash", failedToSwitch: "Не удалось переключить ветку", - restoreStashTitle: "Восстановить спрятанные изменения?", + restoreStashTitle: "Восстановить изменения из stash?", restoreStashMessage: - "В этой ветке сохранены изменения с предыдущего сеанса. Хотели бы вы их восстановить?", + "В этой ветке есть изменения из предыдущей сессии, сохранённые в stash. Восстановить их?", restore: "Восстановить", later: "Позже", - stashRestored: "Спрятанные изменения восстановлены.", + stashRestored: "Изменения из stash восстановлены.", }, agentAutocomplete: { - searchingWorkspace: "Ищем рабочее место...", + searchingWorkspace: "Поиск в рабочем пространстве...", loadingCommands: "Загрузка команд...", noFiles: "Файлы и каталоги не найдены", noCommands: "Команды не найдены", @@ -1458,22 +1453,21 @@ export const ru: TranslationResources = { }, imageAttachmentPicker: { permissionTitle: "Требуется разрешение", - permissionMessage: - "Пожалуйста, разрешите доступ к вашей библиотеке фотографий, чтобы прикреплять изображения.", + permissionMessage: "Разрешите доступ к медиатеке, чтобы прикреплять изображения.", errorTitle: "Ошибка", failedToSelect: "Не удалось выбрать изображение", - dialogTitle: "Прикрепите изображения", + dialogTitle: "Прикрепить изображения", dialogFilterName: "Изображения", }, workspaceSetup: { - title: "Создать рабочую область", + title: "Создать рабочее пространство", errors: { - failedCreateWorktree: "Не удалось создать рабочее дерево.", + failedCreateWorktree: "Не удалось создать worktree.", failedOpenProject: "Не удалось открыть проект", selectModel: "Выберите модель", - hostDisconnected: "Host не подключен", - pendingRequired: "Никакой настройки рабочей области не ожидается.", - composerStateRequired: "Требуется состояние композитора настройки Workspace.", + hostDisconnected: "Хост не подключён", + pendingRequired: "Нет ожидающей настройки рабочего пространства.", + composerStateRequired: "Редактор настройки рабочего пространства ещё не готов.", }, }, onboarding: { @@ -1509,22 +1503,22 @@ export const ru: TranslationResources = { noMatchesForQuery: "Нет моделей, соответствующих «{{query}}»", searchAllPlaceholder: "Поиск по всем моделям...", searchPlaceholder: "Поиск моделей...", - openProviderSettings: "Открыть настройки{{provider}}", + openProviderSettings: "Открыть настройки {{provider}}", }, providerCatalog: { title: "Добавить провайдера", - search: "Поиск поставщиков", - noProviders: "Поставщики не найдены", + search: "Поиск провайдеров", + noProviders: "Провайдеры не найдены", actions: { - add: "Добавлять", + add: "Добавить", adding: "Добавление", installed: "Установлено", cancel: "Отмена", installInstructions: "Инструкции по установке", - installInstructionsFor: "Инструкция по установке{{provider}}", + installInstructionsFor: "Инструкции по установке {{provider}}", }, errors: { - unableToInstall: "Невозможно установить провайдера", + unableToInstall: "Не удалось установить провайдера", }, }, providerSelection: { @@ -1535,45 +1529,45 @@ export const ru: TranslationResources = { unavailable: "Недоступно", unknownError: "Неизвестная ошибка", readiness: { - initialPromptRequired: "Требуется начальное приглашение", + initialPromptRequired: "Требуется начальный промпт", noProviders: "На выбранном хосте нет доступных провайдеров", - modelDefaultsLoading: "Настройки модели по умолчанию все еще загружаются", - noModelAvailable: "Для выбранного поставщика модель недоступна.", - workspaceDirectoryNotFound: "Каталог Workspace не найден", - hostDisconnected: "Host не подключен", + modelDefaultsLoading: "Настройки модели по умолчанию всё ещё загружаются", + noModelAvailable: "Для выбранного провайдера нет доступных моделей.", + workspaceDirectoryNotFound: "Каталог рабочего пространства не найден", + hostDisconnected: "Хост не подключён", }, }, pairing: { connectionMethods: { - title: "Добавить соединение", + title: "Добавить подключение", direct: { title: "Прямое подключение", description: "Локальная сеть или VPN.", }, scanQr: { - title: "Сканировать код QR", - description: "Зашифрованное релейное соединение.", + title: "Сканировать QR-код", + description: "Зашифрованное подключение через ретранслятор.", }, pasteLink: { - title: "Вставьте ссылку на сопряжение", - description: "Зашифрованное релейное соединение.", + title: "Вставить ссылку для сопряжения", + description: "Зашифрованное подключение через ретранслятор.", }, }, direct: { title: "Прямое подключение", helper: "Введите адрес сервера Paseo.", fields: { - host: "Host", + host: "Хост", port: "Порт", password: "Пароль", - optional: "Необязательный", + optional: "Необязательно", useSsl: "Использовать SSL", connectionUri: "URI подключения", }, advanced: { - label: "Передовой", - show: "Показать расширенные", - hide: "Скрыть расширенные", + label: "Дополнительные параметры", + show: "Показать дополнительные параметры", + hide: "Скрыть дополнительные параметры", }, passwordVisibility: { show: "Показать пароль", @@ -1581,79 +1575,80 @@ export const ru: TranslationResources = { }, actions: { cancel: "Отмена", - connect: "Соединять", + connect: "Подключиться", connecting: "Подключение...", }, errors: { - hostRequired: "Требуется Host", + hostRequired: "Требуется хост", invalidPort: "Порт должен быть в диапазоне от 1 до 65535.", invalidConnection: "Неверное соединение", failedTitle: "Соединение не удалось", - failedToConnect: "Нам не удалось подключиться к{{endpoint}}.", - noAdditionalDetails: "{{detail}}(дополнительная информация не предоставлена)", - timedOut: "Время подключения истекло. Проверьте хост /port и вашу сеть.", - refused: "В соединении отказано. Сервер работает по этому адресу?", - hostNotFound: "Host не найден. Проверьте имя хоста и повторите попытку.", - hostUnreachable: "Host недоступен. Проверьте свою сеть и брандмауэр.", + failedToConnect: "Не удалось подключиться к {{endpoint}}.", + noAdditionalDetails: "{{detail}} (дополнительные сведения отсутствуют)", + timedOut: "Время подключения истекло. Проверьте адрес хоста, порт и сеть.", + refused: "В подключении отказано. Демон запущен по этому адресу?", + hostNotFound: "Хост не найден. Проверьте имя хоста и повторите попытку.", + hostUnreachable: "Хост недоступен. Проверьте сеть и брандмауэр.", tlsError: "Ошибка TLS. Прямые соединения используют SSL только тогда, когда перед демоном находится терминатор TLS.", unableToConnect: - "Не удалось подключиться. Проверьте хост /port и убедитесь, что демон доступен.", - details: "Подробности:{{detail}}", + "Не удалось подключиться. Проверьте адрес хоста и порт, а также доступность демона.", + details: "Подробности: {{detail}}", }, }, link: { - title: "Вставьте ссылку на сопряжение", + title: "Вставить ссылку для сопряжения", helper: "Вставьте ссылку на сопряжение с вашего сервера.", label: "Ссылка на сопряжение", errors: { required: "Вставьте ссылку для сопряжения (.../#offer=...)", missingOffer: "Ссылка должна содержать #offer=...", - emptyOffer: "Полезная нагрузка предложения пуста.", + emptyOffer: "Параметр #offer не содержит данных.", invalid: "Неверная ссылка для сопряжения", - unableToPair: "Невозможно подключить хост", + unableToPair: "Не удалось выполнить сопряжение с хостом", }, alert: { failedTitle: "Сопряжение не удалось", }, actions: { cancel: "Отмена", - pair: "Пара", + pair: "Подключить", pairing: "Сопряжение...", }, }, scan: { - title: "Сканировать QR", - webUnavailableTitle: "Недоступно в Интернете", + title: "Сканировать QR-код", + webUnavailableTitle: "Недоступно в веб-версии", webUnavailableBody: - "Сканирование QR не поддерживается в веб- сборке. Вместо этого используйте «Вставить ссылку».", + "Сканирование QR-кодов не поддерживается в веб-сборке. Используйте «Вставить ссылку».", backToSettings: "Вернуться к настройкам", cameraPermissionTitle: "Разрешение камеры", cameraPermissionBody: - "Разрешите камере доступ к сканированию кода сопряжения QR с вашего демона.", + "Разрешите доступ к камере, чтобы отсканировать QR-код для сопряжения с вашим демоном.", grantPermission: "Предоставить разрешение", pairing: "Сопряжение...", - unableToPair: "Невозможно подключить хост", + unableToPair: "Не удалось выполнить сопряжение с хостом", errorTitle: "Ошибка", }, device: { - loadingOffer: "Загрузка предложения по сопряжению...", - failedToLoadOffer: "Не удалось загрузить предложение сопряжения.", - relayDisabled: "Реле не включено. Включите реле для сопряжения устройства.", - enableTitle: "Включить реле?", + loadingOffer: "Загрузка данных для сопряжения...", + failedToLoadOffer: "Не удалось загрузить данные для сопряжения.", + relayDisabled: + "Ретранслятор не включён. Включите его, чтобы выполнить сопряжение устройства.", + enableTitle: "Включить ретранслятор?", enableDescription: - "Реле позволяет подключаться с этого устройства откуда угодно. Трафик сопряжения защищён сквозным шифрованием.", - relayDocs: "Как работает реле", - relayDocsAccessibility: "Прочитать, как работает реле Paseo", - enableRelay: "Включить реле", - enablingRelay: "Включение...", + "Ретранслятор позволяет этому устройству подключаться откуда угодно. Трафик сопряжения защищён сквозным шифрованием.", + relayDocs: "Как работает ретранслятор", + relayDocsAccessibility: "Узнать, как работает ретранслятор Paseo", + enableRelay: "Включить ретранслятор", + enablingRelay: "Включение ретранслятора...", notNow: "Не сейчас", directConnectionHint: - "Без реле подключайтесь напрямую через TCP, Tailscale или другую VPN. QR-код не создаётся.", - updateRequired: "Обновите хост, чтобы включить реле из Paseo Desktop.", - unavailable: "Предложение по сопряжению недоступно.", - hint: "Отсканируйте этот код QR с помощью Paseo на своем телефоне или скопируйте ссылку ниже.", - qrUnavailable: "Код QR недоступен.", + "Без ретранслятора подключайтесь напрямую через TCP, Tailscale или другую VPN. QR-код создаваться не будет.", + updateRequired: "Обновите хост, чтобы включить ретранслятор из Paseo Desktop.", + unavailable: "Данные для сопряжения недоступны.", + hint: "Отсканируйте этот QR-код с помощью Paseo на телефоне или скопируйте ссылку ниже.", + qrUnavailable: "QR-код недоступен.", qrAccessibility: "QR-код сопряжения", retry: "Повторить попытку", copy: "Копировать", @@ -1662,32 +1657,32 @@ export const ru: TranslationResources = { }, realtimeVoice: { actions: { - mute: "Отключить звук в реальном времени", - unmute: "Включить звук голоса в реальном времени", - stop: "Остановить голос в реальном времени и прервать поворот", + mute: "Отключить микрофон в голосовом режиме реального времени", + unmute: "Включить микрофон в голосовом режиме реального времени", + stop: "Остановить голосовой режим реального времени и прервать текущий ответ", }, }, rewind: { - tooltip: "Перемотка назад к этому сообщению", + tooltip: "Вернуться к этому сообщению", warning: "Это действие нельзя отменить.", actions: { - conversation: "Перемотать разговор назад", - files: "Перемотка файлов", - both: "Перемотка разговора и файлов назад", + conversation: "Откатить диалог", + files: "Откатить файлы", + both: "Откатить диалог и файлы", }, errors: { - failed: "Не удалось перемотать агент", + failed: "Не удалось откатить состояние агента", }, }, diffViewer: { empty: "Нет изменений для отображения", }, serviceUrl: { - title: "Открыть сервис URL", - message: "Открыть{{url}}?", + title: "Открыть URL сервиса", + message: "Открыть {{url}}?", inPaseo: "В Paseo", externalBrowser: "Внешний браузер", - dontAskAgain: "Не спрашивай больше", + dontAskAgain: "Больше не спрашивать", }, downloads: { requestTokenFailed: "Не удалось запросить токен загрузки.", @@ -1703,16 +1698,16 @@ export const ru: TranslationResources = { subagents: { title: "Субагенты", pillLabelOne: "1 субагент", - pillLabelMany: "{{count}} субагентов", + pillLabelMany: "Субагентов: {{count}}", pillLabelWorking: "{{count}} в работе", pillLabelFailed: "{{count}} с ошибкой", pillLabelNeedsInputOne: "1 ожидает ввода", pillLabelNeedsInputMany: "{{count}} ожидают ввода", pillLabelReadyToReview: "{{count}} на проверку", detachAction: "Отсоединить {{label}}", - detachTooltip: "Отсоединить субагент", - archiveAction: "Архив{{label}}", - archiveTooltip: "Архивный субагент", + detachTooltip: "Отсоединить субагента", + archiveAction: "Архивировать {{label}}", + archiveTooltip: "Архивировать субагента", archiveFinishedAction: "Архивировать завершенные субагенты", archiveFinishedRetry: "Повторить ({{failed}}/{{total}})", }, @@ -1722,7 +1717,7 @@ export const ru: TranslationResources = { creatingAgent: "Создание агента", }, file: { - directoryMissing: "Каталог Workspace не найден.", + directoryMissing: "Каталог рабочего пространства не найден.", loading: "Загрузка файла...", noPreview: "Предварительный просмотр недоступен", binaryPreviewUnavailable: "Предварительный просмотр двоичного файла недоступен.", @@ -1738,12 +1733,13 @@ export const ru: TranslationResources = { changedOnDisk: "Изменён на диске", vimMode: "Режим Vim {{mode}}", cursor: "Строка {{line}}, столбец {{column}}", - preview: "Просмотр", - source: "Исходник", + preview: "Предпросмотр", + source: "Исходный текст", deletedTitle: "Файл удалён с диска", checkFailedTitle: "Не удалось проверить файл на диске", - preservedDescription: "Открытая копия сохранена.", - conflictDescription: "Локальный буфер сохранён. Выберите версию, которую нужно оставить.", + preservedDescription: "Открытая копия сохранена в редакторе.", + conflictDescription: + "Локальный буфер сохранён в редакторе. Выберите, какую версию оставить.", overwrite: "Перезаписать", reload: "Перезагрузить", reloadTitle: "Перезагрузить с диска?", @@ -1756,55 +1752,54 @@ export const ru: TranslationResources = { tooltip: "Просмотр файлов рабочего пространства", }, pullRequest: { - label: "Запрос на слияние", - subtitle: "Сведения о запросе на слияние", - emptyTitle: "Запроса на слияние пока нет", - emptyDescription: - "Создайте запрос на слияние для этой рабочей копии, чтобы увидеть здесь его сведения.", + label: "PR", + subtitle: "Сведения о PR", + emptyTitle: "PR пока нет", + emptyDescription: "Создайте PR для этой рабочей копии, чтобы увидеть здесь сведения о нём.", }, diff: { changesLabel: "Изменения", - changesSubtitle: "Различия рабочего дерева", - commitSubtitle: "Различия коммита", + changesSubtitle: "Изменения в worktree", + commitSubtitle: "Изменения в коммите", uncommittedSubtitle: "Незафиксированные изменения", baseSubtitle: "Сравнение с {{baseRef}}", - directoryMissing: "Каталог Workspace не найден.", + directoryMissing: "Каталог рабочего пространства не найден.", empty: "Нет изменений", - loadError: "Не удалось загрузить различия", - capabilityMissing: "Обновите хост, чтобы просматривать различия коммитов.", + loadError: "Не удалось загрузить список изменений", + capabilityMissing: "Обновите хост, чтобы просматривать изменения в коммитах.", }, }, toolCallDetails: { error: "Ошибка", empty: "Дополнительные сведения отсутствуют", - subAgentActivity: "Субагентская деятельность", - input: "Вход", - output: "Выход", + subAgentActivity: "Активность субагента", + input: "Входные данные", + output: "Выходные данные", }, toolCallGroup: { editedFiles: { one: "изменён {{count}} файл", - other: "изменено {{count}} файлов", + other: "изменены файлы ({{count}})", }, commands: { one: "выполнена {{count}} команда", - other: "выполнено {{count}} команд", + other: "выполнены команды ({{count}})", }, readFiles: { one: "прочитан {{count}} файл", - other: "прочитано {{count}} файлов", + other: "прочитаны файлы ({{count}})", }, searches: { one: "выполнен {{count}} поиск", - other: "выполнено {{count}} поисков", + other: "выполнены поисковые запросы ({{count}})", }, otherTools: { one: "использован {{count}} другой инструмент", - other: "использовано {{count}} других инструментов", + other: "использованы другие инструменты ({{count}})", }, paseoCalls: { - one: "Paseo вызван {{count}} раз", - other: "Paseo вызван {{count}} раз", + one: "выполнен {{count}} вызов Paseo", + other: "выполнены вызовы Paseo ({{count}})", }, and: "и", }, @@ -1813,26 +1808,26 @@ export const ru: TranslationResources = { saving: "Сохранение...", }, sidebarCallout: { - dismiss: "Увольнять", + dismiss: "Закрыть", }, contextWindow: { title: "Контекстное окно", - used: "{{percentage}}% использовано", - tokens: "Токены{{used}}/{{max}}", - sessionCost: "Стоимость сеанса{{cost}}", - accessibility: "Контекстное окно{{percentage}}% использовано", + used: "Использовано: {{percentage}}%", + tokens: "Токены: {{used}} / {{max}}", + sessionCost: "Стоимость сессии: {{cost}}", + accessibility: "Использовано {{percentage}}% контекстного окна", }, review: { comment: { - add: "Добавить комментарий к обзору", - edit: "Изменить комментарий к отзыву", - delete: "Удалить комментарий к отзыву", - label: "Посмотреть комментарий", + add: "Добавить комментарий к ревью", + edit: "Изменить комментарий к ревью", + delete: "Удалить комментарий к ревью", + label: "Комментарий к ревью", placeholder: "Оставить комментарий", cancel: "Отмена", - cancelAccessibility: "Отменить комментарий к отзыву", - save: "Комментарий", - saveAccessibility: "Сохранить комментарий к отзыву", + cancelAccessibility: "Отменить ввод комментария к ревью", + save: "Сохранить", + saveAccessibility: "Сохранить комментарий к ревью", }, }, settings: { @@ -1840,35 +1835,35 @@ export const ru: TranslationResources = { loading: "Загрузка настроек...", groups: { app: "Приложение", - host: "Host", + host: "Хост", }, hostPicker: { switchHost: "Сменить хост", - local: "Местный", + local: "Локальный", }, backToWorkspace: "Назад", addHost: "Добавить хост", enableBuiltInDaemon: "Включить встроенный демон", projects: "Проекты", projectList: { - hostLoadFailed: "Не удалось загрузить проекты с хоста{{hostName}}:{{message}}.", - editProject: "Изменить{{projectName}}", + hostLoadFailed: "Не удалось загрузить проекты с хоста {{hostName}}: {{message}}", + editProject: "Изменить {{projectName}}", }, - groupInfo: "О{{title}}", + groupInfo: "О разделе «{{title}}»", sections: { - general: "Общий", - appearance: "Появление", + general: "Основные", + appearance: "Оформление", editor: "Редактор", - shortcuts: "Ярлыки", + shortcuts: "Сочетания клавиш", integrations: "Интеграции", notifications: "Уведомления", permissions: "Разрешения", diagnostics: "Диагностика", - about: "О", + about: "О приложении", }, editor: { title: "Редактор", - vimKeybindings: "Клавиши Vim", + vimKeybindings: "Сочетания клавиш Vim", vimHint: "Применяется к исходным файлам в веб- и настольной версии.", }, notifications: { @@ -1888,21 +1883,21 @@ export const ru: TranslationResources = { }, hostSections: { projects: "Проекты", - connections: "Соединения", - agents: "Agents", + connections: "Подключения", + agents: "Агенты", metadata: "Метаданные", - workspaces: "Workspaces", + workspaces: "Рабочие пространства", providers: "Провайдеры", usage: "Использование", - terminals: "Terminals", - plugins: "Plugins", + terminals: "Терминалы", + plugins: "Плагины", host: "Обзор", }, plugins: pluginSettings.ru, metadataGeneration: { - title: "Создание метаданных", + title: "Генерация метаданных", description: - "Выберите модель, которую Paseo использует для названий рабочих пространств, веток, сообщений коммитов и черновиков pull request", + "Выберите модель, которую Paseo будет использовать для названий рабочих пространств и веток, сообщений коммитов и черновиков PR", selection: "Выбор модели", automatic: "Автоматически", preferred: "Вручную", @@ -1911,49 +1906,51 @@ export const ru: TranslationResources = { model: "Модель", fallbackHint: "Если она недоступна, Paseo использует другую доступную модель", docs: "Документация", - saveError: "Не удалось обновить создание метаданных", + saveError: "Не удалось обновить настройки генерации метаданных", }, general: { - title: "Общий", + title: "Основные", browserData: { title: "Данные браузера", siteData: "Файлы cookie и данные сайтов", - description: "Вкладки браузера используют общие данные входа и данные сайтов в Paseo.", + description: "Вкладки браузера в Paseo используют общие данные входа и данные сайтов.", clear: "Очистить данные браузера", clearing: "Очистка...", confirmTitle: "Очистить данные браузера?", confirmMessage: - "На сайтах будет выполнен выход, а открытые вкладки браузера перезагрузятся.", + "Вы выйдете из аккаунтов на сайтах, а открытые вкладки браузера перезагрузятся.", success: "Данные браузера очищены.", error: "Не удалось очистить данные браузера.", }, defaultSend: { label: "Отправка по умолчанию", descriptions: { - interrupt: "Когда агент работает, Enter прерывает. Command/Ctrl+Enter ставит в очередь.", + interrupt: + "Когда агент работает, Enter прерывает его работу, а Command/Ctrl+Enter ставит сообщение в очередь.", steer: - "Когда агент работает, Enter направляет текущий ход. Command/Ctrl+Enter ставит в очередь.", - queue: "Когда агент работает, Enter ставит в очередь. Command/Ctrl+Enter отправляет.", + "Когда агент работает, Enter дополняет текущий ответ новым указанием, а Command/Ctrl+Enter ставит сообщение в очередь.", + queue: + "Когда агент работает, Enter ставит сообщение в очередь, а Command/Ctrl+Enter отправляет его.", }, options: { interrupt: "Прерывать", steer: "Направить", - queue: "Очередь", + queue: "Поставить в очередь", }, }, serviceUrls: { - label: "URL- адреса служб", - description: "Где открыть URL- адреса запущенных скриптов", + label: "URL-адреса сервисов", + description: "Где открывать URL-адреса запущенных скриптов", options: { - ask: "Просить", + ask: "Спрашивать", inApp: "В Paseo", external: "Внешний браузер", }, }, terminalScrollback: { - label: "Terminal прокрутка назад", - description: "Строки, хранящиеся во встроенном буфере терминала.", - accessibilityLabel: "Линии прокрутки Terminal", + label: "Буфер прокрутки терминала", + description: "Количество строк, сохраняемых во встроенном буфере терминала", + accessibilityLabel: "Количество строк в буфере прокрутки терминала", }, sidePanelRouting: { label: "Открывать вспомогательные вкладки в боковой панели", @@ -1963,7 +1960,7 @@ export const ru: TranslationResources = { autoExpandReasoning: { label: "Всегда разворачивать размышления", description: - "По умолчанию показывать блоки размышлений и логики агента полностью развернутыми", + "По умолчанию полностью разворачивать блоки размышлений и хода рассуждений агента", }, toolCallDetail: { label: "Отображение вызовов инструментов", @@ -1971,14 +1968,14 @@ export const ru: TranslationResources = { accessibilityLabel: "Выбрать отображение вызовов инструментов ({{value}})", options: { overview: "Сводка", - detailed: "Полная детализация", + detailed: "Все подробности", }, }, language: { label: "Язык", description: "Язык приложения", options: { - system: "Система", + system: "Как в системе", ar: "العربية", en: "English", es: "Español", @@ -1987,7 +1984,7 @@ export const ru: TranslationResources = { ko: "한국어", ptBR: "Português brasileiro", ru: "Русский", - zhCN: "中文", + zhCN: "简体中文", }, }, }, @@ -1998,117 +1995,118 @@ export const ru: TranslationResources = { description: "Использовать прежний WebView-терминал после повторного открытия", accessibilityLabel: "Использовать прежний рендерер терминала", }, - testAudio: "Тестирование звука", - playTest: "Игровой тест", - playing: "Игра...", - playbackFailed: "Ошибка воспроизведения:{{message}}", + testAudio: "Проверка звука", + playTest: "Воспроизвести тестовый звук", + playing: "Воспроизведение...", + playbackFailed: "Ошибка воспроизведения: {{message}}", app: { - title: "App diagnostic", - rowTitle: "App diagnostic", - rowHint: "Collect connection, daemon, provider, desktop, and log details", - run: "Run", - running: "Running diagnostic...", - copyLabel: "diagnostic", - copyAccessibility: "Copy diagnostic", - copyFailed: "Failed to copy diagnostic", - refreshAccessibility: "Refresh diagnostic", - refreshingAccessibility: "Refreshing diagnostic", + title: "Диагностика приложения", + rowTitle: "Диагностика приложения", + rowHint: + "Собрать сведения о подключениях, демоне, провайдерах, настольном приложении и журналах", + run: "Запустить", + running: "Выполняется диагностика...", + copyLabel: "результаты диагностики", + copyAccessibility: "Скопировать результаты диагностики", + copyFailed: "Не удалось скопировать результаты диагностики", + refreshAccessibility: "Обновить результаты диагностики", + refreshingAccessibility: "Диагностика обновляется", progress: { - client: "Client", - desktop: "Desktop", + client: "Клиент", + desktop: "Настольное приложение", }, }, }, about: { - title: "О", + title: "О приложении", appVersion: "Версия приложения", thisDevice: "Это устройство", connectedHosts: "Подключенные хосты", offline: "Оффлайн", - versionDiffers: "Версия отличается от этого устройства", + versionDiffers: "Версия отличается от версии на этом устройстве", releaseChannel: { label: "Канал выпуска", description: - "Перейдите на Beta, чтобы получать обновления раньше и помогать их формировать.", - stable: "Stable", - beta: "Beta", + "Переключитесь на бета-канал, чтобы раньше получать обновления и помогать развивать Paseo.", + stable: "Стабильный", + beta: "Бета", }, updates: { - label: "Обновления приложений", - readyToInstall: "Готово к установке:{{version}}", - installTitle: "Установить обновление рабочего стола", + label: "Обновления приложения", + readyToInstall: "Версия {{version}} готова к установке", + installTitle: "Установить обновление настольного приложения", installMessage: "Это обновит Paseo на этом компьютере.", installConfirm: "Установить обновление", - update: "Обновлять", - updateTo: "Обновление до{{version}}", + update: "Обновить", + updateTo: "Обновить до {{version}}", installing: "Установка...", - check: "Проверять", + check: "Проверить", checking: "Проверка...", alertTitle: "Ошибка", - alertMessage: "Невозможно открыть диалоговое окно подтверждения обновления.", + alertMessage: "Не удалось открыть диалог подтверждения обновления.", }, }, appearance: { theme: { title: "Тема", - accessibilityLabel: "Тема:{{value}}", + accessibilityLabel: "Тема: {{value}}", options: { - light: "Свет", - dark: "Темный", + light: "Светлая", + dark: "Тёмная", zinc: "Цинк", midnight: "Полночь", - claude: "Клод", - ghostty: "Призрачный", - pureBlack: "Чистый чёрный", - auto: "Система", + claude: "Claude", + ghostty: "Ghostty", + pureBlack: "Абсолютно чёрная", + auto: "Системная", }, }, detailLevel: { title: "Уровень детализации", }, chatOutline: { - title: "Структура чата", - description: "Показывать структуру для перехода между запросами", + title: "Оглавление чата", + description: "Показывать оглавление для перехода между запросами", }, fonts: { title: "Шрифты", - systemDefault: "Система по умолчанию", + systemDefault: "Системный шрифт", interfaceFont: "Шрифт интерфейса", interfaceFontHint: - "Используется во всем приложении. Оставьте пустым для системного значения по умолчанию.", + "Используется во всём приложении. Оставьте поле пустым, чтобы использовать системный шрифт.", interfaceFontAccessibility: "Семейство интерфейсных шрифтов", baseSize: "Базовый размер", baseSizeAccessibility: "Базовый размер шрифта", codeFont: "Шрифт кода", codeFontHint: - "Используется в коде, различиях и выводе терминала. Оставьте пустым для системного значения по умолчанию.", + "Используется для кода, диффов и вывода терминала. Оставьте поле пустым, чтобы использовать системный шрифт.", codeFontAccessibility: "Семейство шрифтов кода", codeSize: "Размер кода", codeSizeAccessibility: "Размер шрифта кода", }, syntax: { title: "Синтаксис", - highlightTheme: "Выделить тему", - highlightThemeHint: "Цвета кода независимо от темы приложения", - highlightThemeAccessibility: "Выделить тему:{{value}}", + highlightTheme: "Тема подсветки", + highlightThemeHint: "Цвета кода, не зависящие от темы приложения", + highlightThemeAccessibility: "Тема подсветки: {{value}}", previewAccessibility: "Предварительный просмотр темы синтаксиса и шрифта кода в реальном времени.", }, }, shortcuts: { - dialogTitle: "Ярлыки", + dialogTitle: "Сочетания клавиш", searchPlaceholder: "Поиск сочетаний клавиш", unavailableOnMobile: "Сочетания клавиш доступны только на рабочем столе.", - capturePrompt: "Нажмите ярлык...", + capturePrompt: "Нажмите сочетание клавиш...", unassigned: "Не задано", actions: { menu: "Действия для {{name}}", - done: "Сделанный", + done: "Готово", cancel: "Отмена", - bind: "Привязать", - rebind: "Перепривязка", + bind: "Назначить", + rebind: "Переназначить", clear: "Очистить", - reset: "Сбросить к значению по умолчанию", + reset: "Восстановить значение по умолчанию", resetAll: "Сбросить все", }, sections: { @@ -2116,27 +2114,27 @@ export const ru: TranslationResources = { workspaces: "Проекты и рабочие пространства", tabsPanes: "Вкладки и панели", layout: "Макет", - agentInput: "Вход Agent", + agentInput: "Ввод для агента", }, help: { openProject: "Открыть проект", newWorkspace: "Новое рабочее пространство", - newWorktree: "Новое рабочее дерево", + newWorktree: "Новый worktree", archiveWorkspace: "Архивировать рабочее пространство", newTab: "Новая вкладка", closeCurrentTab: "Закрыть текущую вкладку", - jumpToWorkspace: "Перейти в рабочую область", + jumpToWorkspace: "Перейти к рабочему пространству", jumpToTab: "Перейти на вкладку", - previousWorkspace: "Предыдущая рабочая область", - nextWorkspace: "Следующая рабочая область", + previousWorkspace: "Предыдущее рабочее пространство", + nextWorkspace: "Следующее рабочее пространство", previousTab: "Предыдущая вкладка", nextTab: "Следующая вкладка", splitPaneRight: "Разделить панель справа", splitPaneDown: "Разделить панель вниз", - focusPaneLeft: "Панель фокусировки слева", - focusPaneRight: "Панель фокусировки справа", - focusPaneUp: "Панель фокусировки вверх", - focusPaneDown: "Панель фокусировки вниз", + focusPaneLeft: "Перейти на панель слева", + focusPaneRight: "Перейти на панель справа", + focusPaneUp: "Перейти на панель выше", + focusPaneDown: "Перейти на панель ниже", moveTabLeft: "Переместить вкладку влево", moveTabRight: "Переместить вкладку вправо", moveTabUp: "Переместить вкладку вверх", @@ -2151,16 +2149,16 @@ export const ru: TranslationResources = { toggleBothSidebars: "Переключить обе боковые панели", toggleSettings: "Переключить настройки", toggleFocusMode: "Переключить режим фокусировки", - toggleExplorerPaneMaximization: "Переключить разворачивание боковой панели", - cycleTheme: "Циклическая тема", - focusMessageInput: "Фокус ввода сообщения", + toggleExplorerPaneMaximization: "Развернуть или восстановить боковую панель", + cycleTheme: "Переключить тему", + focusMessageInput: "Перейти к полю ввода сообщения", cycleAgentMode: "Переключить режим агента", toggleVoiceMode: "Переключить голосовой режим", - startStopDictation: "Начать диктовку /stop", - interruptAgent: "Агент прерываний", + startStopDictation: "Начать/остановить диктовку", + interruptAgent: "Прервать агента", sendMessage: "Отправить сообщение", - queueMessage: "Сообщение в очереди", - muteUnmuteVoiceMode: "Отключить голосовой режим /unmute", + queueMessage: "Поставить сообщение в очередь", + muteUnmuteVoiceMode: "Выключить/включить звук в голосовом режиме", switchProject: "Сменить проект", }, helpNotes: { @@ -2175,7 +2173,7 @@ export const ru: TranslationResources = { }, commandLine: { title: "Командная строка", - description: "Агенты управления и сценариев с вашего терминала", + description: "Управляйте агентами и автоматизируйте их работу из терминала", }, actions: { install: "Установить", @@ -2187,12 +2185,12 @@ export const ru: TranslationResources = { title: "Разрешения", microphone: "Микрофон", refresh: "Обновить", - refreshing: "Освежающий...", + refreshing: "Обновление...", refreshAccessibility: "Обновить разрешения рабочего стола", actions: { - granted: "Предоставленный", - request: "Запрос", - requesting: "Запрос...", + granted: "Предоставлено", + request: "Запросить", + requesting: "Запрашивается...", }, }, host: { @@ -2207,7 +2205,7 @@ export const ru: TranslationResources = { options: { none: "По умолчанию", violet: "Фиолетовый", - sky: "Небесный", + sky: "Голубой", emerald: "Изумрудный", orange: "Оранжевый", pink: "Розовый", @@ -2231,55 +2229,59 @@ export const ru: TranslationResources = { workspaceName: "my-workspace", }, }, - notFound: "Host не найден", + notFound: "Хост не найден", badges: { - relay: "Реле", - local: "Местный", + relay: "Ретранслятор", + local: "Локальный", }, connections: { - title: "Соединения", - removeTitle: "Удалить соединение", - removeMessage: "Удалить{{name}}? Это невозможно отменить.", - removeAction: "Удалять", + title: "Подключения", + removeTitle: "Удалить подключение", + removeMessage: "Удалить {{name}}? Это действие нельзя отменить.", + removeAction: "Удалить", removeErrorTitle: "Ошибка", - removeErrorMessage: "Невозможно удалить соединение", - timeout: "Тайм- аут", + removeErrorMessage: "Не удалось удалить подключение", + timeout: "Время ожидания истекло", }, pairDevices: { - title: "Сопряжение устройств", - rowTitle: "Сопряжение устройства", + title: "Подключение устройств", + rowTitle: "Подключить устройство", rowHint: - "Отсканируйте код QR или скопируйте ссылку, чтобы подключить свой телефон к этому хосту.", + "Отсканируйте QR-код или скопируйте ссылку, чтобы подключить телефон к этому хосту.", }, skills: { - ...en.settings.host.skills, - sectionTitle: "Навыки оркестровки", - title: "Навыки оркестровки", - description: "Научите своих агентов организовывать работу через CLI", + sectionTitle: "Навыки оркестрации", + title: "Навыки оркестрации", + description: "Научите агентов координировать работу через CLI", + docs: "Навыки", + openDocs: "Открыть документацию по навыкам", + unavailable: "Подключитесь к этому хосту, чтобы управлять навыками оркестрации", + unsupported: "Обновите этот хост, чтобы управлять навыками оркестрации", updateAvailable: "Доступно обновление", updateTitle: "Обновить навыки Paseo?", - updateFallback: "Синхронизируйте связанные навыки с вашим компьютером.", + updateFallback: "Встроенные навыки будут синхронизированы с этим хостом.", uninstallTitle: "Удалить навыки Paseo?", - uninstallMessage: "Удаляет все навыки оркестровки Paseo из ~/.agents, ~/.claude, ~/.codex.", + uninstallMessage: + "Удаляет все навыки оркестрации Paseo из ~/.agents, ~/.claude и ~/.codex на этом хосте.", choose: "Выбрать навыки", chooseAll: "Все навыки", - chooseAllHint: "Держите установленными все входящие навыки, включая добавленные позже.", - chooseList: "Входящие навыки", - chooseEmpty: "В этой сборке нет навыков.", + chooseAllHint: "Устанавливать все встроенные навыки, включая добавленные позже.", + chooseList: "Встроенные навыки", + chooseEmpty: "На этом хосте нет встроенных навыков.", removeTitle: "Удалить снятые навыки?", removeMessage: - "{{skills}} будут удалены из ~/.agents, ~/.claude и ~/.codex. Всё, что вы добавили внутри этих папок навыков, тоже удаляется.", + "{{skills}} будут удалены из ~/.agents, ~/.claude и ~/.codex на этом хосте. Всё, что вы добавили в эти папки навыков, тоже будет удалено.", saveFailed: "Не удалось сохранить выбор навыков.", - statusFailed: "Невозможно проверить статус навыков оркестровки.", - updateFailed: "Невозможно обновить навыки оркестровки.", - uninstallFailed: "Невозможно удалить навыки оркестровки.", - saveSelectionFailed: "Не удалось сохранить выбор навыков оркестровки.", + statusFailed: "Не удалось проверить состояние навыков оркестрации.", + updateFailed: "Не удалось обновить навыки оркестрации.", + uninstallFailed: "Не удалось удалить навыки оркестрации.", + saveSelectionFailed: "Не удалось сохранить выбор навыков оркестрации.", actions: { install: "Установить", installing: "Установка...", installed: "Установлено", - update: "Обновлять", - working: "Работающий...", + update: "Обновить", + working: "Выполняется...", remove: "Удалить", uninstall: "Удалить", save: "Сохранить", @@ -2293,18 +2295,18 @@ export const ru: TranslationResources = { }, }, orchestration: { - title: "оркестровка", + title: "Оркестрация", unavailable: "Подключитесь к этому хосту, чтобы управлять оркестрацией.", enableTools: { title: "Включить инструменты Paseo", - hint: "Агенты смогут управлять рабочими деревьями, агентами и расписаниями.", - accessibilityLabel: "Инструменты внедрения Paseo", + hint: "Агенты смогут управлять worktree, агентами и расписаниями.", + accessibilityLabel: "Добавить инструменты Paseo", }, systemPrompt: { - title: "Системная подсказка", - hint: "Добавляет системное приглашение всем агентам", - sheetTitle: "Добавить системное приглашение", - accessibilityLabel: "Добавить системное приглашение", + title: "Системный промпт", + hint: "Добавляет системный промпт всем агентам", + sheetTitle: "Добавить системный промпт", + accessibilityLabel: "Добавить системный промпт", placeholder: "Всегда отвечайте кратко.", edit: "Редактировать", reset: "Сбросить", @@ -2313,39 +2315,40 @@ export const ru: TranslationResources = { }, }, agents: { - unavailable: "Connect to this host to manage agents", + unavailable: "Подключитесь к этому хосту, чтобы управлять агентами", }, workspaces: { - unavailable: "Connect to this host to manage workspaces", + unavailable: "Подключитесь к этому хосту, чтобы управлять рабочими пространствами", }, terminalProfiles: { - unavailable: "Connect to this host to manage terminal profiles", - sectionTitle: "Terminal profiles", - editProfile: "Edit profile", - addProfileTitle: "Add terminal profile", - editProfileTitle: "Edit terminal profile", + unavailable: "Подключитесь к этому хосту, чтобы управлять профилями терминала", + sectionTitle: "Профили терминала", + editProfile: "Изменить профиль", + addProfileTitle: "Добавить профиль терминала", + editProfileTitle: "Изменить профиль терминала", namePlaceholder: "Claude Code", commandPlaceholder: "claude", argsPlaceholder: "--dangerously-skip-permissions", - nameLabel: "Name", - commandLabel: "Command", - argsLabel: "Arguments", - nameRequired: "Name is required", - commandRequired: "Command is required", - argsHint: "Space-separated arguments passed to the command", - saving: "Saving...", - remove: "Remove", - removeConfirmTitle: "Remove profile?", - removeConfirmMessage: 'Remove "{{name}}"?', - moveUp: "Move up", - moveDown: "Move down", - save: "Save", - emptyState: "No profiles yet. Add one to launch terminals with a specific command.", + nameLabel: "Название", + commandLabel: "Команда", + argsLabel: "Аргументы", + nameRequired: "Укажите название", + commandRequired: "Укажите команду", + argsHint: "Аргументы, разделённые пробелами и передаваемые команде", + saving: "Сохранение...", + remove: "Удалить", + removeConfirmTitle: "Удалить профиль?", + removeConfirmMessage: "Удалить «{{name}}»?", + moveUp: "Переместить вверх", + moveDown: "Переместить вниз", + save: "Сохранить", + emptyState: + "Профилей пока нет. Добавьте профиль, чтобы запускать терминалы с заданной командой.", }, agentProfiles: { - sectionTitle: "Профили агента", - unavailable: "Подключитесь к этому хосту, чтобы управлять профилями агента", - unsupported: "На этом хосте работает daemon, который пока не поддерживает профили агента", + sectionTitle: "Профили агентов", + unavailable: "Подключитесь к этому хосту, чтобы управлять профилями агентов", + unsupported: "На этом хосте запущен демон, который пока не поддерживает профили агентов", emptyState: "Пока нет профилей. Добавьте один, чтобы запускать агентов с сохранённым провайдером и моделью.", addProfileTitle: "Добавить профиль агента", @@ -2363,15 +2366,15 @@ export const ru: TranslationResources = { noModels: "У этого провайдера нет моделей для выбора", modeLabel: "Режим", noModes: "У этого провайдера нет режимов для выбора", - thinkingLabel: "Мышление", - noThinkingOptions: "У этой модели нет уровней мышления", + thinkingLabel: "Рассуждения", + noThinkingOptions: "У этой модели нет уровней рассуждений", featuresLabel: "Функции", - featureCount: "{{count}} функций", + featureCount: "Функции: {{count}}", featureCountOne: "{{count}} функция", notesLabel: "Заметки для агентов", notesPlaceholder: "Используйте для работы над UI — компоненты, макет и токены дизайна.", notesHint: - "Возвращается инструментом MCP «list_profiles». Напишите это как инструкцию для другого агента.", + "MCP-инструмент «list_profiles» возвращает эти заметки. Сформулируйте их как инструкцию для другого агента.", save: "Сохранить", saving: "Сохранение...", remove: "Удалить", @@ -2382,134 +2385,136 @@ export const ru: TranslationResources = { }, daemon: { rename: { - editLabel: "Изменить ярлык", + editLabel: "Изменить название", title: "Переименовать хост", - placeholder: "Мой Host", + placeholder: "Мой хост", submit: "Переименовать", }, restart: { title: "Перезапустить демон", hint: "Перезапускает процесс демона. Приложение автоматически переподключится", confirm: "Перезапустить", - confirmTitle: "Перезапустите{{name}}", + confirmTitle: "Перезапустить {{name}}", confirmMessage: - "Это перезапустит демон. Агенты, работающие на нем, будут продолжать работать; приложение автоматически повторно подключится.", + "Это перезапустит демон. Агенты, работающие на нём, продолжат работу, а приложение автоматически переподключится.", restarting: "Перезапуск...", - unableToReconnectTitle: "Невозможно повторно подключиться", + unableToReconnectTitle: "Не удалось переподключиться", unableToReconnectMessage: - "{{name}}не вернулся в онлайн. Пожалуйста, убедитесь, что он перезапущен.", - unavailableTitle: "Host недоступен", + "Хост {{name}} не вернулся в сеть. Убедитесь, что демон перезапустился.", + unavailableTitle: "Хост недоступен", unavailableMessage: - "Этот хост не подключен. Подождите, пока он подключится к сети, прежде чем перезапустить.", - offlineTitle: "Host оффлайн", + "Этот хост не подключён. Дождитесь его появления в сети перед перезапуском.", + offlineTitle: "Хост не в сети", offlineMessage: - "Этот хост не в сети.Paseo автоматически повторно подключается — подождите, пока он снова подключится к сети, прежде чем перезапускаться.", + "Этот хост не в сети. Paseo переподключится автоматически. Дождитесь подключения перед перезапуском.", requestFailedTitle: "Ошибка", requestFailedMessage: - "Не удалось отправить запрос на перезапуск.Paseo автоматически повторно подключается. Повторите попытку, как только хост окажется в сети.", - dialogFailedMessage: "Невозможно открыть диалоговое окно подтверждения перезапуска.", + "Не удалось отправить запрос на перезапуск. Paseo переподключается автоматически. Повторите попытку, когда хост появится в сети.", + dialogFailedMessage: "Не удалось открыть диалог подтверждения перезапуска.", }, update: { desktopManagedHint: "Этот демон управляется Paseo Desktop. Обновите Paseo Desktop на хосте.", - title: "Update daemon", - hint: "Update the daemon to the latest version and restart it", - confirm: "Update", - confirmTitle: "Update {{name}}", + title: "Обновить демон", + hint: "Обновить демон до последней версии и перезапустить его", + confirm: "Обновить", + confirmTitle: "Обновить {{name}}", confirmMessage: - "This will update the daemon to the latest version and restart it. Running agents will be briefly interrupted.", - updating: "Updating...", - phaseStarting: "Preparing update...", - phaseDownloading: "Downloading packages...", - phaseInstalling: "Installing...", - phaseComplete: "Update complete, restarting...", - unableToReconnectTitle: "Unable to reconnect", + "Демон будет обновлён до последней версии и перезапущен. Работа агентов будет ненадолго прервана.", + updating: "Обновление...", + phaseStarting: "Подготовка обновления...", + phaseDownloading: "Загрузка пакетов...", + phaseInstalling: "Установка...", + phaseComplete: "Обновление завершено. Перезапуск...", + unableToReconnectTitle: "Не удалось переподключиться", unableToReconnectMessage: - "{{name}} did not come back online after updating. Please verify the daemon restarted.", - unavailableTitle: "Host unavailable", + "Хост {{name}} не вернулся в сеть после обновления. Убедитесь, что демон перезапустился.", + unavailableTitle: "Хост недоступен", unavailableMessage: - "This host is not connected. Wait for it to come online before updating.", - offlineTitle: "Host offline", - offlineMessage: "This host is offline. Wait until it is back online before updating.", - requestFailedTitle: "Update failed", - requestFailedMessage: "Failed to update the daemon: {{error}}", - dialogFailedMessage: "Unable to open the update confirmation dialog.", + "Этот хост не подключён. Дождитесь его появления в сети перед обновлением.", + offlineTitle: "Хост не в сети", + offlineMessage: "Этот хост не в сети. Дождитесь его появления в сети перед обновлением.", + requestFailedTitle: "Не удалось обновить", + requestFailedMessage: "Не удалось обновить демон: {{error}}", + dialogFailedMessage: "Не удалось открыть диалог подтверждения обновления.", }, dangerZone: "Опасная зона", remove: { title: "Удалить хост", - localTitle: "Remove localhost connection", - hint: "Удаляет этот хост и его сохраненные подключения с этого устройства.", - localHint: "Removes localhost from this device and stops the built-in daemon", - localConfirmTitle: "Remove localhost connection and stop daemon?", - confirmMessage: "Удалить{{name}}? Это приведет к удалению сохраненных соединений.", + localTitle: "Удалить подключение к localhost", + hint: "Удаляет этот хост и сохранённые подключения к нему с этого устройства.", + localHint: + "Удаляет подключение к localhost с этого устройства и останавливает встроенный демон", + localConfirmTitle: "Удалить подключение к localhost и остановить демон?", + confirmMessage: "Удалить {{name}}? Сохранённые подключения к этому хосту будут удалены.", localConfirmMessage: - "This will remove the localhost connection, turn off built-in daemon management, and stop the managed daemon. Remote hosts remain connected.", + "Подключение к localhost будет удалено, управление встроенным демоном отключено, а управляемый демон остановлен. Удалённые хосты останутся подключёнными.", errorTitle: "Ошибка", - errorMessage: "Невозможно удалить хост", - localErrorMessage: "Unable to remove localhost connection", + errorMessage: "Не удалось удалить хост", + localErrorMessage: "Не удалось удалить подключение к localhost", }, }, }, providers: { title: "Провайдеры", addProvider: "Добавить провайдера", - providerDetails: "Подробности о провайдере{{name}}", - enableProvider: "Включить{{name}}", - unavailable: "Подключитесь к этому хосту, чтобы увидеть поставщиков", + providerDetails: "Сведения о провайдере {{name}}", + enableProvider: "Включить {{name}}", + unavailable: "Подключитесь к этому хосту, чтобы увидеть провайдеров", loading: "Загрузка...", - addErrorTitle: "Unable to add provider", - updateErrorTitle: "Невозможно обновить провайдера", + addErrorTitle: "Не удалось добавить провайдера", + updateErrorTitle: "Не удалось обновить провайдера", actions: { - menu: "{{name}} actions", - remove: "Remove provider", - removing: "Removing...", + menu: "Действия с {{name}}", + remove: "Удалить провайдера", + removing: "Удаление...", }, remove: { - confirmTitle: "Remove {{name}}?", - confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.", - confirm: "Remove", - errorTitle: "Unable to remove provider", + confirmTitle: "Удалить {{name}}?", + confirmMessage: + "Запись провайдера будет удалена из config.json. Это действие нельзя отменить.", + confirm: "Удалить", + errorTitle: "Не удалось удалить провайдера", }, statuses: { - disabled: "Неполноценный", + disabled: "Отключён", loading: "Загрузка", error: "Ошибка", - available: "Доступный", - notInstalled: "Не установлено", + available: "Доступен", + notInstalled: "Не установлен", }, models: { one: "1 модель", many: "{{count}} моделей", addModel: "Добавить модель", addCustomTitle: "Добавить пользовательскую модель", - modelId: "Модель ID", - modelIdPlaceholder: "например опенай /gpt-5", - add: "Добавлять", + modelId: "ID модели", + modelIdPlaceholder: "например, openai/gpt-5", + add: "Добавить", adding: "Добавление...", failedToSave: "Не удалось сохранить модель.", - removeModel: "Удалить{{id}}", + removeModel: "Удалить {{id}}", searchPlaceholder: "Поиск моделей", loading: "Загрузка моделей...", retry: "Повторить попытку", retrying: "Повторная попытка...", noSearchMatches: "Ни одна модель не соответствует вашему запросу", noneDetected: "Модели не обнаружены", - discovered: "Обнаруженный", + discovered: "Обнаруженные модели", custom: "Пользовательские модели", - updated: "Обновлен{{time}}", + updated: "Обновлено {{time}}", }, diagnostic: { title: "Диагностика", button: "Диагностика", refresh: "Обновить", - refreshing: "Освежающий...", - copyLabel: "диагностика", - copyAccessibility: "Скопировать диагностику", - copyFailed: "Не удалось скопировать диагностику", + refreshing: "Обновление...", + copyLabel: "результаты диагностики", + copyAccessibility: "Скопировать результаты диагностики", + copyFailed: "Не удалось скопировать результаты диагностики", refreshAccessibility: "Обновить диагностику", - refreshingAccessibility: "Обновление диагностики", - running: "Запускаю диагностику...", + refreshingAccessibility: "Диагностика обновляется", + running: "Выполняется диагностика...", none: "Диагностика недоступна", failedToFetch: "Не удалось получить диагностику.", unknownError: "Неизвестная ошибка", @@ -2524,84 +2529,84 @@ export const ru: TranslationResources = { nameLabel: "Название проекта", icon: "Значок", chooseImage: "Выбрать изображение", - useAutomatic: "Использовать автоматический", + useAutomatic: "Использовать автоматический значок", imageUrl: "URL изображения или сайта", save: "Сохранить изменения", savedToast: "Проект обновлён", }, readFailures: { - invalidTitle: "paseo.json не удалось разобрать", - invalidDescription: "Исправьте файл на диске, затем перезагрузите.", + invalidTitle: "Не удалось разобрать paseo.json", + invalidDescription: "Исправьте файл на диске, затем загрузите его заново.", missingTitle: "У этого хоста нет этого проекта", missingSingleHost: "У выбранного хоста нет записей об этом проекте.", transportTitle: "Не удалось загрузить paseo.json.", - transportFallback: "Хозяин не ответил.", + transportFallback: "Хост не ответил.", failedTitle: "Не удалось загрузить paseo.json.", - failedDescription: "Перезагрузите, чтобы попробовать еще раз.", + failedDescription: "Загрузите данные заново, чтобы повторить попытку.", }, worktree: { - title: "Перехватчики жизненного цикла Worktree", - info: "Команды, которые выполняются при создании или удалении рабочего дерева для этого проекта.", - docs: "Документы", + title: "Хуки жизненного цикла worktree", + info: "Команды, которые выполняются при создании или удалении worktree для этого проекта.", + docs: "Документация", docsTooltip: "Дополнительную информацию и переменные среды, доступные для этих команд, см. в документации.", - setup: "Настраивать", - setupAccessibility: "Команды настройки рабочего дерева", - uncommittedTitle: "Закоммитьте изменения paseo.json", + setup: "Настройка", + setupAccessibility: "Команды настройки worktree", + uncommittedTitle: "Закоммитьте изменения в paseo.json", uncommittedDescription: - "Новые рабочие деревья используют сценарий настройки из выбранной базовой ветки.", - teardown: "Срывать", - teardownAccessibility: "Команды разрушения рабочего дерева", + "Новые worktree используют скрипт настройки из выбранной базовой ветки.", + teardown: "Удаление", + teardownAccessibility: "Команды удаления worktree", }, scripts: { title: "Скрипты", - info: "Долгоработающие службы и одноразовые команды, которые можно запускать из любого агента в этом проекте.", + info: "Долго работающие сервисы и одноразовые команды, которые можно запускать из любого агента этого проекта.", empty: "Скриптов пока нет.", - untitled: "Безымянный сценарий", - port: "порт{{port}}", + untitled: "Безымянный скрипт", + port: "порт {{port}}", menuAccessibility: "Открыть меню скриптов", removeTitle: "Удалить скрипт?", - removeMessage: "Удалить{{name}}?", - removeFallbackName: "этот сценарий", - name: "Имя", + removeMessage: "Удалить {{name}}?", + removeFallbackName: "этот скрипт", + name: "Название", command: "Команда", - nameAccessibility: "Имя сценария", - commandAccessibility: "Команда сценария", - nameRequired: "Требуется имя", + nameAccessibility: "Название скрипта", + commandAccessibility: "Команда скрипта", + nameRequired: "Укажите название", commandRequired: "Требуется команда", - newScript: "Новый сценарий", - editScript: "Изменить{{name}}", - runAsService: "Запуск как служба", - serviceHint: "Paseo контролирует процесс и назначает порт через $PASEO_PORT.", + newScript: "Новый скрипт", + editScript: "Изменить {{name}}", + runAsService: "Запускать как сервис", + serviceHint: "Paseo управляет процессом и назначает порт через переменную $PASEO_PORT.", actions: { add: "Добавить скрипт", edit: "Редактировать", - remove: "Удалять", + remove: "Удалить", }, }, metadata: { title: "Генерация метаданных", - info: "Инструкции для конкретного проекта, внедренные в подсказки ИИ, которые Paseo использует для генерации метаданных. Используйте их для обеспечения соблюдения соглашений вашей команды, таких как наименование ветвей, стиль фиксации или формат PR.", - branchName: "Названия ветвей", - branchNamePlaceholder: "Префиксные ветки с feat/ или fix/, mb/ для личных веток", - commitMessage: "Фиксировать сообщения", - commitMessagePlaceholder: "Используйте обычные фиксации с областью действия", - pullRequest: "Запросы на вытягивание", + info: "Инструкции для этого проекта, добавляемые в промпты ИИ, с помощью которых Paseo генерирует метаданные. Используйте их, чтобы соблюдать принятые в команде правила именования веток, оформления коммитов и формата PR.", + branchName: "Названия веток", + branchNamePlaceholder: + "Добавляйте к веткам префиксы feat/ или fix/, а к личным веткам — mb/", + commitMessage: "Сообщения коммитов", + commitMessagePlaceholder: "Используйте формат Conventional Commits с областью", + pullRequest: "PR", pullRequestPlaceholder: - "Начните с резюме в один абзац, включая раздел «План тестирования».", + "Начинайте с краткого резюме в один абзац и добавляйте раздел «План тестирования».", }, writeFailures: { staleTitle: "Конфигурация изменена на диске", - staleDescription: - "Перед сохранением перезагрузите компьютер, чтобы получить последнюю версию файла paseo.json.", + staleDescription: "Перед сохранением загрузите с диска последнюю версию paseo.json.", failedTitle: "Не удалось сохранить paseo.json.", - failedDescription: "Попробуйте еще раз или перезагрузите последнюю версию с диска.", + failedDescription: "Повторите попытку или загрузите с диска последнюю версию paseo.json.", }, actions: { - reload: "Перезагрузить", - tryAgain: "Попробуйте еще раз", - save: "Сохранять", - saved: "Проект сохранен.", + reload: "Загрузить заново", + tryAgain: "Повторить", + save: "Сохранить", + saved: "Проект сохранён.", saving: "Сохранение...", cancel: "Отмена", },