Files
paseo/packages/app/src/i18n/resources/ru.ts
T
Mohamed Boudraandpaseo-bot[bot] e135e9c101 Open files and subagents in a closable sheet on phones (#6827)
* feat(app): open files and subagents in a closable sheet on compact

On phones, opening a file, a provider subagent, or a Paseo subagent now shows it
in a bottom sheet over the current tab instead of adding a tab, so the tab strip
stays for terminals and root agents. Paseo subagents get "Open as tab" to move
the same tab (same tabId and state) into a full tab with a composer; agents in a
sheet hide the composer.

The decision lives in the workspace layout store's openTab, driven by a
per-kind `compactSheet` rule in the panel manifest, so every open path (chat
links, Explorer, subagents track, notifications, plugins) follows it without
call-site branching, and a new kind opts in with one manifest entry. The app
shell publishes the layout mode (compact / single-pane / split-panes) once, so
callers stop passing isCompact for placement.

A sheet holding unsaved edits is never implicitly displaced; later opens go to
tabs underneath, and closing it goes through the existing discard guard. The
editor host is position: sticky because CodeMirror's scrollIntoView otherwise
scrolls the bottom sheet's container and drags the sheet to full height.

* test(app): fail the compact sheet snap check when the sheet is oversized

---------

Co-authored-by: paseo-bot[bot] <paseo-bot[bot]@users.noreply.github.com>
2026-10-14 00:20:10 +07:00

2883 lines
151 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { en, type TranslationResources } from "./en";
import { pluginSettings } from "./plugin-settings";
export const ru: TranslationResources = {
paneFind: {
connectionFailure:
"Не удалось выполнить поиск в чате. Проверьте подключение к хосту и повторите попытку.",
historyChangedFailure: "Чат изменился во время поиска. Выполните поиск снова.",
revealFailure: "Не удалось показать это совпадение. Повторите попытку.",
searching: "Поиск…",
loading: "Загрузка…",
failed: "Ошибка",
retry: "Повторить",
title: "Найти",
placeholder: "Найти в панели",
close: "Закрыть поиск",
matches: "Совпадения",
previous: "Предыдущее совпадение",
next: "Следующее совпадение",
toggleReplace: "Показать замену",
replaceWith: "Заменить на",
replace: "Заменить",
replaceAll: "Заменить всё",
noMatches: "Нет совпадений",
position: "{{current}} из {{total}}",
total: "Совпадений: {{total}}",
},
common: {
bottomSheetBackdrop: "Фон нижней панели",
back: "Назад",
loading: "Загрузка...",
actions: {
save: "Сохранить",
back: "Назад",
cancel: "Отмена",
close: "Закрыть",
copy: "Копировать",
copyLine: "Копировать строку",
dismiss: "Отклонить",
reload: "Перезагрузить",
retry: "Повторить",
search: "Поиск",
select: "Выбрать",
selectAll: "Выбрать все",
},
placeholders: {
search: "Поиск...",
},
empty: {
noResults: "Ничего не найдено",
noOptionsMatchSearch: "Нет вариантов, соответствующих вашему запросу.",
},
states: {
loading: "Загрузка...",
starting: "Начало...",
copied: "Скопировано",
copiedLabel: "Скопировано {{label}}",
downloadComplete: "Загрузка завершена",
downloadFailed: "Загрузка не удалась",
},
errors: {
error: "Ошибка",
unableToSave: "Не удалось сохранить",
unableToCopy: "Не удалось скопировать",
nameRequired: "Требуется имя",
daemonUnavailable: "Daemon недоступен",
daemonClientUnavailable: "Daemon клиента недоступен",
daemonClientDisconnected: "Daemon клиента отключен",
noFileFound: "Файл для {{token}} не найден",
unexpectedDictationError: "При обработке диктовки произошла непредвиденная ошибка.",
},
connectionStatus: {
online: "Онлайн",
connecting: "Подключение",
offline: "Оффлайн",
error: "Ошибка",
idle: "Ожидание",
},
},
shell: {
menu: {
toggleSidebar: "Переключить боковую панель",
open: "Открыть меню",
close: "Закрыть меню",
},
commandCenter: {
placeholder: "Поиск команд, файлов, рабочих пространств и агентов...",
filePlaceholder: "Поиск файлов...",
searchingFiles: "Поиск файлов...",
noMatches: "Нет совпадений",
actions: "Действия",
files: "Файлы",
workspaces: "Рабочие пространства",
agents: "Агенты",
newAgent: "Новый агент",
open: "Открыть {{name}}",
openInSidePane: "Открыть {{name}} в боковой панели",
openInFocusedPane: "Открыть {{name}} в активной области",
addProject: "Добавить проект",
home: "Главная",
groupByProject: "Группировать по проекту",
groupByStatus: "Группировать по статусу",
modelGroupLabel: "Модель",
modelSearchKeywords: "Сменить, изменить, выбрать или установить модель",
thinkingGroupLabel: "Мышление",
thinkingSearchKeywords: "Уровень усилия рассуждения",
modeGroupLabel: "Режим",
modeSearchKeywords: "режим подтверждения разрешений доступа",
planModeGroupLabel: "Режим планирования",
planModeSearchKeywords: "план планирование режим плана",
fastModeGroupLabel: "Быстрый",
fastModeSearchKeywords: "быстрый скорость низкая задержка",
settingOn: "Вкл",
settingOff: "Выкл",
},
},
composer: {
placeholders: {
desktop: "Напишите агенту сообщение, отметьте @files или используйте /commands и /skills.",
mobile: "Сообщение,@files,/commands",
fallback: "Сообщение...",
terminal: "Prompt",
},
input: {
accessibilityLabel: "Написать агенту...",
terminalAccessibilityLabel: "Terminal prompt",
fullscreen: "Полный экран",
exitFullscreen: "Выйти из полноэкранного режима",
focusHint: "{{shortcut}}, для фокуса",
addAttachment: "Добавить вложение",
interruptAgent: "Прервать агента",
queueMessage: "Сообщение в очередь",
sendAndInterrupt: "Отправить и прервать",
sendAndSteer: "Отправить и направить",
sendMessage: "Отправить сообщение",
queue: "Очередь",
send: "Отправить",
},
cancel: {
cancelingAgent: "Отменить агента",
stopAgent: "Остановить агента",
interrupt: "Прервать",
},
voice: {
enableVoiceMode: "Включить голосовой режим",
voiceMode: "Голосовой режим",
unmuteVoiceMode: "Включить голосовой режим",
muteVoiceMode: "Отключить голосовой режим",
stopDictation: "Остановить диктовку",
startDictation: "Начать диктовку",
unmuteVoice: "Включить звук",
muteVoice: "Отключить голос",
dictation: "Диктовка",
interruptBeforeVoice: "Остановите агента перед запуском голосового режима",
},
attachments: {
addImage: "Добавить изображение",
pasteImage: "Вставить изображение",
addFile: "Загрузить файл",
addIssueOrPr: "Добавить проблему или PR",
addIssueOrPr_mr: "Добавить проблему или MR",
dropImagesHere: "Скиньте изображения сюда",
dropFilesHere: "Переместите файлы сюда",
editQueuedMessage: "Изменить сообщение из очереди",
sendQueuedMessageNow: "Отправить сообщение из очереди сейчас",
openImage: "Открыть прикрепленное изображение",
removeImage: "Удалить прикрепленное изображение",
removeFile: "Удалить прикрепленный файл",
openGithub: "Открыть {{kind}} {{number}}",
removeGithub: "Удалить {{kind}} {{number}}",
element: "Элемент",
openBrowserElement: "Открыть вложение с элементом браузера",
removeBrowserElement: "Удалить вложение с элементом браузера",
openReview: "Открыть вложение проверки",
removeReview: "Удалить вложение проверки",
},
errors: {
failedToSend: "Не удалось отправить сообщение",
failedToCreateAgent: "Не удалось создать агента.",
noHostSelected: "Хост не выбран",
initialPromptRequired: "Необходим инициализирующий промпт",
alreadyLoading: "Уже загружается",
uploadFailed: "Ошибка загрузки файла",
noClipboardImage:
"В текущем буфере обмена нет изображения. Попробуйте вставить его с клавиатуры.",
pasteImageFailed: "Не удалось вставить изображение",
fileTooLarge: "Файл {{fileName}} слишком большой (максимальный размер: {{size}})",
},
clientCommands: {
archiveAgent: "Архивировать текущего агента",
freshDraft: "Архивировать этого агента и создать новый черновик",
},
github: {
searching: "Идет поиск...",
noResults: "Результаты не найдены.",
searchPlaceholder: "Поиск задач и PR...",
searchPlaceholder_mr: "Поиск задач и MR...",
title: "Прикрепить задачу или PR",
title_mr: "Прикрепить задачу или MR",
},
},
agentControls: {
provider: {
fallback: "Провайдер",
select: "Выбрать провайдера агента",
},
thinking: {
title: "Рассуждения",
unknown: "Неизвестно",
extraHigh: "Очень высокий",
select: "Выбрать уровень рассуждений",
selectWithValue: "Выбрать уровень рассуждений ({{value}})",
},
model: {
unknown: "Неизвестная модель",
},
features: {
title: "Функции",
open: "Открыть настройки функций агента",
on: "Включено",
off: "Выключено",
},
mode: {
title: "Режим",
searchPlaceholder: "Поиск режимов...",
selectWithValue: "Выбрать режим агента ({{value}})",
},
hints: {
thinking: "Режим рассуждений",
model: "Изменить модель",
mode: "Изменить режим",
},
},
agentStream: {
empty: "Начните общаться с этим агентом...",
scrollToBottom: "Прокрутить вниз",
historyLoadFailed: "Не удалось загрузить историю агента",
messageCapped: "Это сообщение было обрезано ({{bytes}} байт).",
permission: {
rejectedPlan: "Отклонённый план",
approvedPlan: "Одобренный план",
canceledPlan: "Отменённый план",
plan: "План",
required: "Требуется разрешение",
deny: "Отклонить",
accept: "Разрешить",
implement: "Реализовать",
question: "Как бы вы хотели продолжить?",
proposedPlan: "Предлагаемый план",
},
},
agentPanel: {
states: {
notFound: "Агент не найден",
failedToLoad: "Не удалось загрузить агента",
reconnecting: "Повторное подключение к хосту",
updating: "Обновление сообщений",
timelineSyncFailed: "Не удалось обновить историю агента.",
timelineSyncRetrying: "Повторная попытка…",
archivingTitle: "Агент перемещается в архив...",
archivingSubtitle: "Подождите, пока агент будет перемещён в архив.",
},
unavailable: {
selectedHost: "Выбранный хост",
unknownHost:
"Невозможно открыть этого агента, поскольку {{serverLabel}} не настроен на этом устройстве.",
addHost:
"Добавьте хост в настройках или откройте агента на настроенном хосте, чтобы продолжить.",
preparingSession: "Подготовка сессии на хосте {{serverLabel}}...",
connecting: "Подключение к {{serverLabel}}...",
showSoon: "Агент скоро появится.",
showWhenOnline: "Агент появится, как только хост будет в сети.",
reconnectingTo: "Повторное подключение к {{serverLabel}}...",
showAgainWhenReachable: "Агент снова появится, как только хост станет доступен.",
},
archived: {
callout: "Этот агент находится в архиве",
unarchive: "Разархивировать",
},
},
sessions: {
title: "История",
empty: "Сессий пока нет",
noMatches: "Подходящих сессий не найдено",
tooManyMatches: "Слишком много совпадений — уточните запрос",
hostLoadFailed: "{{host}}: не удалось загрузить историю",
searchPlaceholder: "Поиск по истории",
actions: {
loadMore: "Загрузить ещё",
clearSearch: "Очистить поиск",
},
},
agentList: {
fallbackTitle: "Новая сессия",
dateSections: {
recent: "Недавние",
today: "Сегодня",
yesterday: "Вчера",
thisWeek: "На этой неделе",
thisMonth: "В этом месяце",
older: "Более ранние",
},
status: {
initializing: "Запускается",
idle: "Ожидает",
running: "Работает",
error: "Ошибка",
closed: "Закрыт",
},
badges: {
archived: "В архиве",
pending: "На рассмотрении: {{count}}",
attention: "Внимание",
},
archiveSheet: {
hostOffline: "Хост не в сети",
runningAgent: "Этот агент всё ещё работает. Перемещение в архив остановит его.",
archive: "Архивировать",
},
},
message: {
diagram: {
diagram: "Диаграмма",
zoomIn: "Увеличить масштаб",
zoomOut: "Уменьшить масштаб",
resetZoom: "Сбросить масштаб",
fullscreen: "Полноэкранный режим",
viewSource: "Показать исходный код",
viewDiagram: "Показать диаграмму",
},
actions: {
copyCode: "Скопировать код",
copyTurn: "Скопировать ответ",
copyMessage: "Копировать сообщение",
forkMenu: "Форкнуть чат отсюда",
forkInNewTab: "Создать форк в новой вкладке",
forkInNewWorkspace: "Создать форк в новом рабочем пространстве",
forkUnavailable: "Обновите хост, чтобы использовать эту функцию.",
forkMissingWorkspace: "Этот агент не связан с рабочим пространством.",
forkFailed: "Не удалось создать форк чата",
openFile: "Открыть файл",
copied: "Скопировано",
},
attachments: {
dismissImage: "Закрыть изображение",
closeImage: "Закрыть изображение",
imageLoadFailed: "Не удалось загрузить изображение",
imageUnavailable: "Изображение недоступно",
imagePreviewUnavailable: "Предварительный просмотр изображения недоступен.",
imagePreviewLoadFailed: "Не удалось загрузить предварительный просмотр изображения.",
review: "Ревью",
commentsOne: "1 комментарий",
commentsMany: "Комментарии: {{count}}",
textAttachment: "Текстовое вложение",
text: "Текст",
file: "Файл",
},
speak: {
header: "Сказал",
},
activity: {
details: "Подробности",
},
dictation: {
start: "Начать диктовку голосом",
cancel: "Отменить диктовку",
retry: "Повторить диктовку",
insert: "Вставить транскрипцию",
insertAndSend: "Вставить транскрипцию и отправить",
failed: "Диктовка не удалась: {{error}}",
failedRetry: "Диктовка не удалась. Нажмите «Повторить».",
},
question: {
submit: "Отправить",
next: "Далее",
answerPlaceholder: "Введите ответ...",
otherPlaceholder: "Другой ответ...",
},
todo: {
title: "Задачи",
empty: "Задач пока нет.",
tasksProgress: "Задачи: {{completed}}/{{total}}",
activity: {
created: "Создано задач: {{count}}",
added: "Добавлена",
started: "Начата",
completed: "Завершена",
},
},
turnFooter: {
workedFor: "Время работы: {{duration}}",
},
compaction: {
loading: "Сжатие контекста...",
auto: "Контекст сжат автоматически",
manual: "Контекст сжат вручную",
withTokens: "Контекст сжат ({{tokens}} тыс. токенов)",
completed: "Контекст сжат",
},
},
importSession: {
chooseHostTitle: en.importSession.chooseHostTitle,
title: "Импортировать сессию",
searchPlaceholder: "Поиск сессий...",
scope: {
host: "Сессии на {{host}}",
workspace: "Это рабочее пространство",
},
filters: {
all: "Все",
},
status: {
connectHost: "Подключитесь к хосту, чтобы импортировать сессии",
updateHost: "Обновите хост, чтобы импортировать сессии.",
noProviders: "Нет включённых провайдеров с поддержкой импорта.",
loading: "Загрузка недавних сессий...",
failedProvider: "Не удалось загрузить сессии провайдера {{provider}}",
failedImport: "Не удалось импортировать выбранную сессию.",
},
actions: {
refresh: "Обновить список сессий",
showAll: "Показать все",
loadMore: "Загрузить ещё",
},
preview: {
untitledSession: "Сессия без названия",
noPrompt: "Нет промпта для предварительного просмотра",
},
empty: {
noRecent: "Нет недавних сессий для импорта.",
noMatches: "Нет сессий, соответствующих запросу.",
alreadyImported: "Все недавние сессии уже импортированы.",
noProviderSessions: "Сессии провайдера {{provider}} не найдены.",
},
row: {
importing: "Импортируется...",
},
},
workspace: {
route: {
loading: "Загрузка рабочего пространства",
connecting: "Подключение",
hostOffline: "{{hostName}} не в сети",
cannotReachHost: "Не удаётся связаться с {{hostName}}",
hostStatus: "Статус хоста: {{status}}",
needsHostUpgrade: "Обновите хост, чтобы восстановить это рабочее пространство",
manageHost: "Управление хостом",
recovery: {
archivedTitle: "Рабочая область в архиве",
restoreDescription:
"Восстановите «{{workspaceName}}», чтобы вернуться к его агентам. Worktree будет использовать ветку {{branch}}.",
restoreWithoutBranchDescription:
"Восстановите «{{workspaceName}}», чтобы вернуться к его агентам. Новая ветка будет создана от сохранённой базовой или ветки репозитория по умолчанию.",
unarchiveDescription:
"Рабочее пространство «{{workspaceName}}» находится в архиве. Разархивируйте его, чтобы снова открыть.",
restoreAction: "Восстановить",
unarchiveAction: "Разархивировать",
restoringTitle: "Восстановление рабочего пространства",
restoringAction: "Восстановление...",
unavailableTitle: "Рабочая область недоступна",
checkFailedTitle: "Не удалось проверить рабочее пространство",
},
},
hoverCard: {
scriptsAccessibility: "Скрипты рабочего пространства",
copyPath: "Копировать путь",
copyBranchName: "Копировать имя ветки",
copied: "Скопировано",
},
fileActions: {
openFile: "Открыть файл",
openIn: "Открыть в {{target}}",
openToSide: "Открыть сбоку",
copyPath: "Копировать путь",
copyRelativePath: "Копировать относительный путь",
revealIn: "Показать в {{target}}",
download: "Скачать",
addToChat: "Добавить в чат",
moreActions: "Дополнительные действия",
newFile: "Новый файл",
newFolder: "Новая папка",
collapseFolder: "Свернуть папку",
rename: "Переименовать",
duplicate: "Создать копию",
revert: "Отменить изменения",
delete: "Удалить",
confirmDelete: {
fileTitle: "Удалить файл?",
folderTitle: "Удалить папку?",
message: "Элемент «{{name}}» будет удалён безвозвратно.",
confirm: "Удалить",
cancel: "Отмена",
},
confirmRevert: {
title: "Отменить изменения?",
message: "Изменения в «{{name}}» будут безвозвратно отменены.",
confirm: "Отменить",
cancel: "Отмена",
failed: "Не удалось отменить изменения",
},
},
fileExplorer: {
sort: {
name: "Имя",
modified: "Дата изменения",
size: "Размер",
},
context: {
size: "Размер",
modified: "Дата изменения",
},
actions: {
back: "Назад",
retry: "Повторить попытку",
refresh: "Обновить файлы",
refreshing: "Обновление файлов",
hideHiddenFiles: "Скрыть скрытые файлы",
showHiddenFiles: "Показать скрытые файлы",
},
empty: {
noFiles: "Нет файлов",
noVisibleFiles: "Нет видимых файлов",
},
states: {
unavailable: "Рабочее пространство недоступно",
loading: "Загрузка файлов...",
},
errors: {
failedToListDirectory: "Не удалось получить содержимое каталога",
createFailed: "Не удалось создать элемент",
renameFailed: "Не удалось переименовать элемент",
duplicateFailed: "Не удалось создать копию элемента",
revealFailed: "Не удалось показать расположение элемента",
deleteFailed: "Не удалось удалить элемент",
},
draft: {
filePlaceholder: "Имя файла",
folderPlaceholder: "Имя папки",
},
},
setup: {
descriptor: {
label: "Настройка",
completed: "Настройка завершена",
failed: "Настройка не удалась",
workspace: "Настройка рабочего пространства",
blocked: "Настройка заблокирована",
},
status: {
running: "Выполняется",
completed: "Завершено",
failed: "Завершено с ошибкой",
waiting: "Ожидание вывода команд настройки",
blocked: "Заблокировано",
},
waiting: "Настройка рабочего пространства...",
blocked: {
title: "Настройка не запускалась",
description:
"Этот PR поступил из другого репозитория — {{repository}}. Его настройка и скрипты могут выполнить код, который вы не проверяли.",
run: "Запустить настройку",
runFailed: "Не удалось запустить настройку рабочего пространства",
},
empty: {
noCommands: "Для этого рабочего пространства не выполнялись команды настройки.",
},
accessibility: {
noCommands: "Для этого рабочего пространства не выполнялись команды настройки.",
log: "Журнал настройки рабочего пространства",
},
log: {
noOutput: "Нет вывода",
},
},
browser: {
unavailable: {
title: "Встроенный браузер доступен только в настольном приложении",
subtitle:
"Откройте это рабочее пространство в Electron, чтобы использовать встроенный браузер.",
},
session: "Сеанс браузера {{browserId}}",
controls: {
back: "Назад",
forward: "Вперед",
stopLoading: "Остановить загрузку",
refresh: "Обновить",
browserUrl: "URL браузера",
enterUrl: "Введите URL",
openDevTools: "Открыть инструменты разработчика браузера",
cancelSelector: "Отменить выбор элемента",
annotateElement: "Добавить примечание к элементу",
screenshotElement: "Сделать снимок элемента",
screenshotCopied: "Снимок скопирован в буфер обмена",
elementCopied: "Элемент скопирован в буфер обмена",
screenshotFailed: "Не удалось скопировать снимок",
selectorLoading: "Дождитесь окончания загрузки страницы",
selectorFailed: "Не удалось включить режим выбора элемента",
},
annotate: {
title: "Добавить примечание к элементу",
placeholder: "Сообщение агенту об этом элементе…",
submit: "Прикрепить",
cancel: "Отмена",
},
devices: {
label: "Размер экрана устройства",
responsive: "Адаптивный режим",
},
errors: {
failedToLoad: "Не удалось загрузить страницу",
invalidUrl: "Недопустимый URL браузера",
unsupportedProtocol:
"URL браузера с неподдерживаемым протоколом заблокирован: {{protocol}}",
},
},
terminal: {
hostDisconnected: "Хост не подключён",
updateHost: "Обновите хост, чтобы использовать нативный рендерер терминала.",
unableToSubscribe: "Не удалось подключиться к терминалу",
},
sheet: {
openAsTab: "Открыть во вкладке",
},
tabs: {
loading: "Загрузка...",
modified: "Несохранённые изменения",
loadingAgentTitle: "Загрузка названия агента",
fallback: {
newAgent: "Новый агент",
setup: "Настройка",
workspaceSetup: "Настройка рабочего пространства",
terminal: "Терминал",
browser: "Браузер",
agent: "Агент",
workspace: "Рабочее пространство",
},
switcher: {
trigger: "Переключить вкладки (открыто: {{count}})",
title: "Переключить вкладку",
searchPlaceholder: "Поиск вкладок",
},
menu: {
openFor: "Открыть меню для {{label}}",
copyResumeCommand: "Копировать команду продолжения",
copyAgentId: "Скопировать идентификатор агента",
copyTerminalId: "Скопировать идентификатор терминала",
copyFilePath: "Скопировать путь к файлу",
rename: "Переименовать",
closeAbove: "Закрыть вкладки выше",
closeBelow: "Закрыть вкладки ниже",
closeLeft: "Закрыть вкладки слева",
closeRight: "Закрыть вкладки справа",
closeOthers: "Закрыть другие вкладки",
moveToMain: "Переместить на основную панель",
reloadAgent: "Перезагрузить агента",
reloadAgentTooltip: "Перезагрузите агента, чтобы обновить навыки, MCP или статус входа.",
close: "Закрыть",
renameTerminal: "Переименовать терминал",
renameAgent: "Переименовать агента",
},
actions: {
newTab: "Новая вкладка",
newAgent: "Новый агент",
newTerminal: "Новый терминал",
preparingTerminal: "Подготовка вкладки терминала",
preparingTerminalTooltip: "Подготовка терминала...",
newBrowser: "Новый браузер",
maximizePane: "Развернуть панель",
restorePane: "Восстановить панель",
closePane: "Закрыть панель",
exitFocusMode: "Выйти из режима фокусировки",
splitRight: "Разделить панель справа",
splitDown: "Разделить панель снизу",
changes: "Изменения",
files: "Файлы",
pullRequest: "PR",
terminalProfilesMenu: "Профили терминала",
editTerminalProfiles: "Изменить профили",
},
explorerSidebar: {
open: "Открыть боковую панель",
close: "Закрыть боковую панель",
toggle: "Переключить боковую панель",
changes: "Изменения",
files: "Файлы",
},
toasts: {
copyFailed: "Не удалось скопировать",
agentIdCopiedLabel: "ID агента",
terminalIdCopiedLabel: "Идентификатор терминала",
resumeCommandCopiedLabel: "команда продолжения",
filePathCopiedLabel: "Путь к файлу",
resumeIdUnavailable: "ID возобновления недоступен",
resumeCommandUnavailable: "Команда возобновления недоступна",
reloadingAgent: "Перезагрузка агента...",
reloadedAgent: "Агент перезагружен",
failedToReloadAgent: "Не удалось перезагрузить агента",
failedToCloseAgent: "Не удалось закрыть агента",
},
confirmations: {
unsavedTitle: "Несохранённые изменения",
unsavedMessage:
"В этой вкладке есть несохранённые изменения. При закрытии черновик будет удалён.",
closeWithoutSaving: "Закрыть без сохранения",
closePaneTitle: "Закрыть панель?",
bulkUnsaved:
"Вкладок с несохранёнными изменениями: {{count}}. При закрытии черновики будут удалены.",
close: "Закрыть",
cancel: "Отмена",
archive: "Архивировать",
closeTerminalTitle: "Закрыть терминал?",
closeTerminalMessage:
"Любой запущенный процесс в этом терминале будет немедленно остановлен.",
archiveRunningAgentTitle: "Архивировать работающего агента?",
archiveRunningAgentMessage:
"Этот агент всё ещё работает. При архивировании агент будет остановлен, а вкладка закрыта.",
closeTabsLeftTitle: "Закрыть вкладки слева?",
closeTabsRightTitle: "Закрыть вкладки справа?",
closeOtherTabsTitle: "Закрыть другие вкладки?",
bulk: {
all: "Будут архивированы агенты ({{agents}}), закрыты терминалы ({{terminals}}) и вкладки ({{tabs}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.",
agentsAndTerminals:
"Будут архивированы агенты ({{agents}}) и закрыты терминалы ({{terminals}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.",
terminalsAndTabs:
"Будут закрыты терминалы ({{terminals}}) и вкладки ({{tabs}}). Все запущенные процессы в закрытых терминалах будут немедленно остановлены.",
agentsAndTabs: "Будут архивированы агенты ({{agents}}) и закрыты вкладки ({{tabs}}).",
terminals:
"Будут закрыты терминалы ({{terminals}}). Все запущенные процессы в них будут немедленно остановлены.",
tabs: "Будут закрыты вкладки ({{tabs}}).",
agents: "Будут архивированы агенты ({{agents}}).",
},
},
},
header: {
actions: {
workspaceActions: "Действия с рабочим пространством",
newAgent: "Новый агент",
newTerminal: "Новый терминал",
newBrowser: "Новая вкладка браузера",
importSession: "Импортировать сессию",
copyPath: "Скопировать путь к рабочему пространству",
copyBranchName: "Скопировать название ветки",
showSetup: "Показать настройку рабочего пространства",
},
toasts: {
workspacePathUnavailable: "Путь к рабочему пространству пока недоступен.",
branchNameUnavailable: "Имя ветки недоступно",
terminalQueued:
"Рабочее пространство подготавливается. Терминал откроется, когда оно будет готово...",
workspacePathCopiedLabel: "Путь к рабочему пространству",
branchNameCopiedLabel: "Имя ветки",
},
},
scripts: {
title: "Скрипты",
actions: {
chooseUrl: "Выбрать URL",
copyUrl: "Скопировать URL",
openService: "Открыть сервис",
restart: "Перезапустить",
run: "Запустить",
stop: "Остановить",
view: "Открыть терминал",
},
accessibility: {
trigger: "Скрипты рабочего пространства",
openService: "Открыть сервис {{scriptName}}",
viewTerminal: "Открыть терминал скрипта {{scriptName}}",
runScript: "Запустить скрипт {{scriptName}}",
stopScript: "Остановить скрипт {{scriptName}}",
restartScript: "Перезапустить скрипт {{scriptName}}",
copyUrl: "Скопировать URL скрипта {{scriptName}}",
chooseUrl: "Выбрать URL для {{scriptName}}",
script: "Скрипт {{scriptName}}",
},
routes: {
public: "Обратный прокси",
paseo: "Запоминающийся адрес",
direct: "Прямой адрес",
},
states: {
exitCode: "Код выхода: {{code}}",
startFailed: "Не удалось запустить скрипт {{scriptName}}",
stopFailed: "Не удалось остановить скрипт {{scriptName}}",
},
},
tree: {
showFolderTree: "Показать дерево папок",
hideFolderTree: "Скрыть дерево папок",
},
git: {
actions: {
moreOptions: "Дополнительные параметры",
moreActions: "Дополнительные действия",
commit: {
label: "Создать коммит",
pending: "Создание коммита...",
success: "Коммит создан",
},
pull: {
label: "Получить изменения",
pending: "Получение изменений...",
success: "Изменения получены",
},
push: {
label: "Отправить изменения",
pending: "Отправка изменений...",
success: "Изменения отправлены",
},
pullAndPush: {
label: "Получить и отправить изменения",
pending: "Получение и отправка изменений...",
success: "Изменения получены и отправлены",
},
viewPr: "Посмотреть PR",
createPr: {
label: "Создать PR",
pending: "Создание PR...",
success: "PR создан",
label_mr: "Создать MR",
pending_mr: "Создание MR...",
success_mr: "MR создан",
},
mergeBranch: {
label: "Выполнить слияние локально",
pending: "Слияние...",
success: "Слияние выполнено",
},
mergeFromBase: {
label: "Обновить из {{baseRef}}",
pending: "Обновление...",
success: "Обновлено",
},
archive: {
label: "Архивировать рабочее пространство",
pending: "Архивирование...",
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 выполнено",
},
viewPr_mr: "Посмотреть MR",
autoMerge: {
enableSquash: "Включить автослияние (squash)",
enableMerge: "Включить автослияние (merge)",
enableRebase: "Включить автослияние (rebase)",
enabled: "Автослияние включено",
enabling: "Включение автослияния...",
disabling: "Отключение автослияния...",
disabled: "Автослияние отключено",
},
unavailable: {
viewPrNoForge: "Просмотр {{noun}} сейчас недоступен: {{brand}} не подключён.",
pullNoRemote:
"Получение изменений недоступно: эта ветка ещё не связана с удалённым репозиторием.",
pullDirty:
"Получение изменений недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.",
pullUpToDate: "Получение изменений недоступно: ветка уже в актуальном состоянии.",
pushNoRemote:
"Отправка изменений недоступна: эта ветка ещё не связана с удалённым репозиторием.",
pushBehind: "Отправка изменений пока недоступна: сначала получите более новые изменения.",
pushNothing: "Отправка изменений недоступна: нет новых изменений для отправки.",
pullAndPushNoRemote:
"Получение и отправка изменений недоступны: эта ветка ещё не связана с удалённым репозиторием.",
pullAndPushDirty:
"Получение и отправка изменений недоступны при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.",
pullAndPushNoIncoming:
"Получение и отправка изменений недоступны: нет входящих изменений для получения.",
pullAndPushInSync:
"Получение и отправка изменений недоступны: ветка уже синхронизирована.",
pullAndPushNothingToPush:
"Получение и отправка изменений недоступны: после получения нечего отправлять.",
createPrNoForge: "Создание {{noun}} сейчас недоступно: {{brand}} не подключён.",
createPrNoCommits: "Создание PR недоступно: в этой ветке пока нет новых коммитов.",
mergeNoBase: "Слияние недоступно: не удалось определить базовую ветку.",
mergeDirty:
"Слияние недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.",
mergeNothing: "Слияние недоступно: в этой ветке пока нет новых изменений для слияния.",
updateNoBase: "Обновление недоступно: не удалось определить базовую ветку.",
updateDirty:
"Обновление недоступно при наличии локальных изменений. Сначала создайте коммит или сохраните изменения в stash.",
updateCurrent: "Обновление недоступно: эта ветка уже синхронизирована с {{baseRef}}.",
mergePrNoGithub: "Слияние PR сейчас недоступно: GitHub не подключён.",
archiveNotWorktree:
"Архивирование недоступно: это рабочее пространство не было создано как 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: "Не удалось получить и отправить изменения",
failedCreatePr: "Не удалось создать PR.",
failedMergePr: "Не удалось выполнить слияние PR",
failedEnableAutoMerge: "Не удалось включить автослияние",
failedDisableAutoMerge: "Не удалось отключить автослияние",
baseRefUnavailable: "Базовая ветка недоступна",
failedMerge: "Не удалось выполнить слияние",
failedMergeFromBase: "Не удалось выполнить слияние с базовой веткой",
},
archiveWarning: {
title: "Архивировать «{{workspaceName}}»?",
confirm: "Архивировать",
cancel: "Отмена",
uncommittedChanges: "Незафиксированные изменения",
uncommittedChangesWithDiff: "Незафиксированные изменения ({{diffStat}})",
addedLine: "Добавлено строк: {{count}}",
addedLines: "Добавлено строк: {{count}}",
deletedLine: "Удалено строк: {{count}}",
deletedLines: "Удалено строк: {{count}}",
unpushedCommit: "Неотправленных коммитов: {{count}}",
unpushedCommits: "Неотправленных коммитов: {{count}}",
},
},
diff: {
openChangesTab: "Открыть вкладку «Изменения»",
openDiffTab: "Открыть вкладку «Дифф»",
closeChangesTab: "Закрыть вкладку «Изменения»",
jumpToFile: {
title: "Перейти к файлу",
},
binaryFile: "Бинарный файл",
tooLarge: "Дифф слишком велик для отображения",
previewTooLargeTitle: "Этот дифф слишком велик для предварительного просмотра",
previewTooLargeDescription: "Сузьте диапазон сравнения, чтобы просмотреть дифф здесь",
unified: "Унифицированный дифф",
split: "Параллельный дифф",
switchToUnified: "Переключиться на унифицированный дифф",
switchToSplit: "Переключиться на параллельный дифф",
options: "Параметры диффа",
inlineDiff: "Встроенный дифф",
hideWhitespace: "Скрыть пробельные изменения",
showWhitespace: "Показать пробельные изменения",
scrollLongLines: "Прокручивать длинные строки",
wrapLongLines: "Перенос длинных строк",
collapseAllFolders: "Свернуть все папки",
expandAllFolders: "Развернуть все папки",
collapseAllFiles: "Свернуть все файлы",
expandAllFiles: "Развернуть все файлы",
refreshing: "Обновление",
refresh: "Обновить",
refreshState: "Обновить состояние Git и {{brand}}",
failedRefresh: "Не удалось обновить состояние Git.",
seeUncommittedChanges: "Показать незафиксированные изменения",
seeCommittedChanges: "Показать зафиксированные изменения",
checkingRepository: "Проверяем репозиторий...",
notRepository: "Это не репозиторий Git",
diffMode: "Режим диффа",
uncommitted: "Незафиксированные изменения",
committed: "Зафиксированные изменения",
branchUnknown: "Неизвестная ветка",
base: "базовая ветка",
newFile: "Новый",
deletedFile: "Файл удалён",
modifiedFile: "Файл изменён",
commits: {
title: "Коммиты",
countLabel: "Коммитов в рабочем пространстве: {{count}}",
noneAhead: "Пока нет коммитов, отсутствующих в {{baseRef}}",
fileDiffEmpty: "Нет изменений для отображения",
fileDiffError: "Не удалось загрузить дифф файла",
loading: "Загрузка коммитов…",
loadError: "Не удалось загрузить коммиты",
empty: "Коммитов пока нет",
},
},
openInEditor: {
open: "Открыть",
chooseEditor: "Выбрать редактор",
openIn: "Открыть рабочее пространство в {{target}}",
openFileIn: "Открыть {{fileName}} в {{target}}",
failedOpen: "Не удалось открыть рабочее пространство",
},
pr: {
actions: {
viewPullRequest: "Просмотреть",
openOn: "Открыть на {{brand}}",
addToChat: "Добавить в чат",
addAllToChat: "Добавить всё в чат",
addingToChat: "Добавление...",
},
checksOverview: {
headline: {
actionRequired: "Некоторые проверки требуют внимания",
failure: "Некоторые проверки не пройдены",
pending: "Некоторые проверки ещё не завершены",
success: "Все проверки пройдены",
none: "Нет проверок",
},
count: {
actionRequired: "требует действий: {{count}}",
warning: "с предупреждением: {{count}}",
failure: "не пройдено: {{count}}",
pending: "выполняется: {{count}}",
manual: "вручную: {{count}}",
success: "пройдено: {{count}}",
ignored: "пропущено: {{count}}",
},
detailOne: "Проверка ({{parts}})",
detailMany: "Проверки ({{parts}})",
groupOne: {
actionRequired: "Требует действий: {{count}}",
warning: "С предупреждением: {{count}}",
failure: "Не пройдена: {{count}}",
pending: "Выполняется: {{count}}",
manual: "Ручная: {{count}}",
success: "Пройдена: {{count}}",
ignored: "Пропущена: {{count}}",
},
groupMany: {
actionRequired: "Требуют действий: {{count}}",
warning: "С предупреждением: {{count}}",
failure: "Не пройдены: {{count}}",
pending: "Выполняются: {{count}}",
manual: "Ручные: {{count}}",
success: "Пройдены: {{count}}",
ignored: "Пропущены: {{count}}",
},
},
checksSummary: {
passedLabel: "успешно",
failedLabel: "ошибка",
runningLabel: "выполняется",
passedAccessible: "Проверки пройдены",
failedAccessible: "Проверки не пройдены",
runningAccessible: "Проверки выполняются",
},
sections: {
checks: "Проверки",
pipeline: "Пайплайн",
reviews: "Ревью",
activity: "Активность",
},
empty: {
noJobs: "Нет заданий",
loadingPipeline: "Загрузка пайплайна...",
pipelineJobsLoadFailed: "Не удалось загрузить задания пайплайна",
allowedToFail: "допускается сбой",
noActivity: "Активности пока нет",
},
approvals: "Одобрено: {{given}} из {{required}}",
accessibility: {
pullRequest: "PR #{{number}}",
pullRequest_mr: "MR !{{number}}",
commentActions: "Действия с комментарием",
threadActions: "Действия с обсуждением",
checkStatus: {
passed: "Успешно",
failed: "Ошибка",
warning: "Предупреждение",
actionRequired: "Требуется действие",
manual: "Вручную",
pending: "Ожидание",
skipped: "Пропущено",
cancelled: "Отменено",
},
},
states: {
draft: "Черновик",
merged: "Объединён",
closed: "Закрыт",
open: "Открыт",
},
activity: {
commented: "Оставлен комментарий",
approved: "Одобрено",
requestedChanges: "Запрошены изменения",
reviewed: "Проведено ревью",
},
time: {
justNow: "прямо сейчас",
},
thread: {
discussion: "Ветка обсуждения",
resolved: "Решено",
outdated: "Устарело",
},
errors: {
statusLoadFailed: "Не удалось загрузить статус PR",
activityLoadFailed: "Не удалось загрузить активность PR",
},
},
forgeSetup: {
installCli: "Установите CLI {{cli}}, чтобы использовать возможности {{brand}}.",
signIn: "Выполните {{command}}, чтобы использовать возможности {{brand}}.",
generic: "Настройте {{brand}} на этом хосте, чтобы использовать его функции.",
},
},
},
workspaceLabels: {
title: "Метки",
unlabelled: "Без метки",
create: "Создать метку",
createConfirm: "Создать",
creating: "Создание…",
name: "Название метки",
updateHostUse: "Обновите этот хост, чтобы использовать метки.",
errors: { update: "Не удалось обновить метку", load: "Не удалось загрузить метки" },
colors: {
violet: "Фиолетовый",
sky: "Голубой",
emerald: "Изумрудный",
orange: "Оранжевый",
pink: "Розовый",
indigo: "Индиго",
teal: "Бирюзовый",
red: "Красный",
amber: "Янтарный",
blue: "Синий",
},
filter: {
clear: "Очистить фильтр",
},
manage: {
open: "Управление метками…",
title: "Управление метками",
search: "Поиск меток",
empty: "На этом хосте нет меток.",
edit: "Изменить метку",
editLabel: "Изменить метку «{{name}}»",
name: "Название",
color: "Цвет",
save: "Сохранить",
delete: "Удалить",
deleteTitle: "Удалить метку «{{name}}»?",
deleteMessage_one: "Метка будет снята с {{count}} рабочего пространства на этом хосте.",
deleteMessage_other: "Метка будет снята с {{count}} рабочих пространств на этом хосте.",
offline: "Этот хост не в сети.",
updateHost: "Обновите этот хост для управления метками.",
},
},
changelog: {
title: "Что нового",
installed: "Установлена",
showMore: "Показать ещё",
openWebsite: "Полный список изменений",
error: {
title: "Не удалось загрузить список изменений",
description: "Проверьте подключение и попробуйте снова.",
},
},
sidebar: {
statusGroupAccessibility: "Группа «{{label}}»",
statusBucket: {
needsInput: "Ожидает ввода",
failed: "Ошибка",
readyToReview: "На проверку",
working: "В работе",
done: "Готово",
},
display: {
showBackground: "Показать фоновые пространства",
trigger: "Настройки отображения",
heading: "Отображение",
grouping: {
label: "Группировка",
project: "Проект",
status: "Статус",
labels: "Метки",
},
titleSource: {
label: "Заголовок",
title: "Заголовок",
branch: "Имя ветки",
},
show: {
label: "Показывать",
branch: "Ветка",
project: "Проект",
host: "Хост",
changeRequest: "PR",
checks: "Проверки",
services: "Сервисы",
labels: "Метки",
diff: "Статистика изменений",
timestamp: "Последняя активность",
},
checks: {
iconAndText: "Значок и текст",
icon: "Только значок",
none: "Скрыто",
},
hostFilter: {
label: "Хост",
all: "Все хосты",
},
projectFilter: {
label: "Проект",
all: "Все проекты",
},
},
filterEmpty: {
title: "Нет подходящих рабочих пространств",
description:
"Измените или очистите фильтры боковой панели, чтобы увидеть рабочие пространства.",
clear: "Очистить фильтры",
},
pinned: {
title: "Закреплённые",
},
host: {
noHost: "Нет хоста",
switchTitle: "Сменить хост",
searchPlaceholder: "Поиск хостов...",
},
actions: {
addProject: "Добавить проект",
newWorkspace: "Новое рабочее пространство",
hosts: "Хосты",
settings: "Настройки",
closeSidebar: "Закрыть боковую панель",
},
footer: {
usage: "Использование",
},
help: {
trigger: "Помощь и поддержка",
sectionHelp: "Помощь",
diagnostics: "Запустить диагностику",
shortcuts: "Сочетания клавиш",
reportIssue: "Сообщить о проблеме",
discord: "Discord",
github: "Создать issue на GitHub",
whatsNew: "Что нового",
appName: "Paseo",
},
sections: {
sessions: "История",
search: "Поиск",
schedules: "Расписания",
},
worktreeSetup: {
title: "Настроить скрипты worktree",
description:
"Добавьте команды настройки для автоматической установки зависимостей и подготовки новых worktree.",
openProjectSettings: "Открыть настройки проекта",
},
project: {
actions: {
menu: "Действия проекта",
openSettings: "Открыть настройки проекта",
openNewWindow: "Открыть в новом окне",
openNewWindowFailed: "Не удалось открыть новое окно",
openFolder: "Открыть в файловом менеджере",
openFolderFailed: "Не удалось открыть папку",
remove: "Удалить проект",
removing: "Удаление...",
},
confirmations: {
removeTitle: "Удалить проект?",
removeMessage:
"Удалить проект «{{projectName}}» с боковой панели?\n\nФайлы на диске не будут изменены.",
removeConfirm: "Удалить",
cancel: "Отмена",
},
toasts: {
hostDisconnected: "Хост не подключён",
removeFailed: "Не удалось удалить некоторые рабочие пространства.",
updateHostToRemove: "Обновите хост, чтобы удалять проекты.",
},
empty: {
title: "Пока нет проектов",
description: "Добавьте проект, чтобы начать работу",
},
},
workspace: {
status: {
serviceRunning: "Сервис {{name}} запущен",
serviceUnhealthy: "Сервис {{name}} работает некорректно",
creating: "Создание...",
},
checks: {
passed: "Успешные: {{count}}",
failed: "Ошибки: {{count}}",
warning: "Предупреждения: {{count}}",
actionRequired: "Требуется действие: {{count}}",
manual: "Вручную: {{count}}",
pending: "Ожидают: {{count}}",
},
actions: {
menu: "Действия рабочего пространства",
newWorkspace: "Новое рабочее пространство",
showMore: "Показать ещё",
showLess: "Показать меньше",
createWorkspaceFor: "Создать новое рабочее пространство для {{projectName}}",
copyPath: "Копировать путь",
copyBranchName: "Скопировать имя ветки",
rename: "Переименовать рабочее пространство",
pin: "Закрепить вверху",
unpin: "Открепить",
archive: "Архивировать",
archiveWorkspace: "Архивировать рабочее пространство",
hideFromSidebar: "Скрыть на боковой панели",
archiving: "Архивирование...",
hiding: "Скрытие...",
},
confirmations: {
hideTitle: "Скрыть рабочее пространство?",
hideMessage:
"Скрыть «{{workspaceName}}» на боковой панели?\n\nФайлы на диске не будут изменены.",
hideConfirm: "Скрыть",
cancel: "Отмена",
},
rename: {
title: "Переименовать рабочее пространство",
submit: "Переименовать",
invalidBranchName: "Недопустимое имя ветки",
},
toasts: {
workspacePathUnavailable: "Путь к рабочему пространству недоступен",
pathCopied: "Путь скопирован",
branchNameCopied: "Имя ветки скопировано",
hostDisconnected: "Хост не подключён",
hideFailed: "Не удалось скрыть рабочее пространство",
archiveFailed: "Не удалось архивировать рабочее пространство",
},
},
},
newWorkspace: {
title: "Новое рабочее пространство",
create: "Создать",
isolation: {
local: "Локально",
worktree: "Новый worktree",
label: "Изоляция",
},
fields: {
project: "Проект",
base: "Базовая ветка",
baseNotApplicable: "Неприменимо",
},
titlePlaceholder: "Заголовок (необязательно)",
errors: {
hostDisconnected: "Хост не подключён",
createWorktreeFailed: "Не удалось создать worktree.",
composerStateRequired: "Редактор сообщения ещё не готов.",
selectModel: "Выберите модель",
},
tooltips: {
project: "Выберите проект",
host: "Выберите хост",
isolation: "Выберите уровень изоляции",
startingRef: "Выберите, с чего начать",
launch: "Выберите, что запустить",
},
refPicker: {
startingRef: "Исходная точка",
intoBase: "в ветку {{baseRef}}",
searching: "Идет поиск...",
noMatchingRefs: "Нет подходящих веток или PR.",
searchPlaceholder: "Поиск веток и PR",
title: "Начать с",
},
launch: {
title: "Что запустить",
chat: "Чат",
terminal: "Терминал",
manageProfiles: "Управление профилями терминала",
submit: "Запустить",
promptPlaceholder: "Промпт для {{name}}",
commandPlaceholder:
"Введите команду или оставьте поле пустым, чтобы открыть терминал без запуска команды",
},
},
desktop: {
windowControls: {
minimize: "Свернуть окно",
maximize: "Развернуть окно",
restore: "Восстановить окно",
close: "Закрыть окно",
},
quitting: {
title: "Завершение работы Paseo...",
detail: "Остановка локального демона.",
},
daemon: {
lifecycle: en.desktop.daemon.lifecycle,
title: "Демон",
status: {
title: "Статус",
builtInOnly: "Здесь показан только встроенный демон настольного приложения.",
running: "работает",
notRunning: "не работает",
pid: "PID {{pid}}",
},
management: {
title: "Управление встроенным демоном",
hint: "Разрешить Paseo запускать и останавливать встроенный демон",
pauseTitle: "Приостановить встроенный демон",
pauseMessage:
"Это немедленно остановит встроенный демон. Запущенные агенты и терминалы, подключенные к встроенному демону, будут остановлены.",
pauseAndStop: "Приостановить управление и остановить демон",
registrationFailed:
"Встроенный демон запущен, но Paseo не удалось сохранить подключение к localhost. Выключите и снова включите управление демоном или добавьте localhost вручную.",
pausedStopFailed:
"Встроенное управление демоном было приостановлено, но Paseo не смог остановить демон.",
updateFailed: "Не удалось изменить настройки управления встроенным демоном.",
},
keepRunning: {
title: "Продолжать работу демона после выхода",
hint: "Демон продолжит работать после выхода из Paseo",
},
logs: {
title: "Файл журнала",
modalTitle: "Журналы демона",
unavailable: "Путь к журналу недоступен",
empty: "(файл журнала пуст)",
copied: "Путь к журналу скопирован.",
copyFailed: "Не удалось скопировать путь к журналу.",
open: "Открыть журналы",
copyPath: "Копировать путь",
},
fullStatus: {
title: "Полный статус",
modalTitle: "Статус демона",
hint: "Выполняет команду `paseo daemon status` и показывает результат",
view: "Посмотреть статус",
copied: "Статус скопирован в буфер обмена.",
fetchFailed: "Не удалось получить статус демона: {{message}}",
},
advancedSettings: "Расширенные настройки",
openAdvancedSettings: "Открыть дополнительные настройки демона",
versionMismatch:
"Версии приложения и демона не совпадают. Обновите приложение и демон до одной версии, чтобы избежать проблем.",
loadFailed: "Не удалось загрузить статус встроенного демона.",
},
updates: {
status: {
checking: "Проверка обновлений приложения...",
installing: "Установка обновления приложения...",
upToDate: "Установлена последняя версия приложения.",
upToDateWithLastChecked:
"Установлена последняя версия приложения. Последняя проверка: {{time}}.",
pending: "Мы сообщим вам, когда обновление будет готово.",
pendingWithLastChecked:
"Мы сообщим вам, когда обновление будет готово. Последняя проверка в {{time}}.",
pendingWithVersion: "Найдено обновление: {{version}}. Загрузка...",
pendingWithVersionAndLastChecked:
"Найдено обновление: {{version}}. Загрузка... Последняя проверка в {{time}}.",
availableWithVersion: "Обновление готово: {{version}}",
availableWithVersionAndLastChecked:
"Обновление готово: {{version}}. Последняя проверка: {{time}}.",
available: "Обновление приложения готово к установке.",
availableWithLastChecked:
"Обновление приложения готово к установке. Последняя проверка в {{time}}.",
installed: "Обновление приложения установлено. Требуется перезапуск.",
failed: "Не удалось обновить приложение.",
idle: "Статус обновления ещё не проверен.",
},
installError: "Не удалось установить обновление настольного приложения.",
callout: {
installingTitle: "Установка обновления",
failedTitle: "Обновление не выполнено",
availableTitle: "Доступно обновление",
genericError: "Что-то пошло не так.",
whatsNew: "Что нового",
installingAction: "Установка...",
installAndRestart: "Установить и перезапустить",
installingDescription: "Установка и перезапуск...",
versionReady: "Версия {{version}} готова к установке.",
newVersionReady: "Новая версия готова к установке.",
restartWarning:
"При обновлении приложения работающие агенты будут остановлены, а сеансы терминала закрыты.",
},
},
settings: {
loadFailed: "Не удалось загрузить настройки настольного приложения.",
saveFailed: "Не удалось сохранить настройки настольного приложения.",
},
rosetta: {
title: "Загрузите сборку Apple Silicon",
runningIntel: "Вы используете сборку Paseo для Intel через Rosetta на Apple Silicon.",
highCpu:
"Из-за этого процессор сильно загружен. Чтобы устранить проблему, скачайте сборку для Apple Silicon.",
download: "Скачать",
},
permissions: {
notifications: {
allowed: "Уведомления разрешены операционной системой.",
denied: "Уведомления запрещены в настройках системы.",
notGranted: "Разрешение на уведомления ещё не предоставлено.",
webOnly: "Статус системных уведомлений доступен только в веб-среде выполнения.",
supported: "Уведомления на рабочем столе поддерживаются.",
unsupported: "Уведомления на рабочем столе не поддерживаются на этой платформе.",
apiUnavailable: "Web Notification API недоступен в этой среде.",
requestsWebOnly:
"Запрашивать разрешение на системные уведомления можно только в веб-среде выполнения.",
requestUnavailable: "В Web Notification API недоступен метод requestPermission().",
requestFailed: "Не удалось запросить разрешение на уведомления: {{message}}",
unexpectedState: "Неожиданное состояние разрешения на уведомления: {{state}}",
},
microphone: {
webOnly: "Статус микрофона доступен только в веб-среде выполнения.",
navigatorUnavailable: "Объект Navigator недоступен в этой среде.",
granted: "Доступ к микрофону разрешён.",
denied: "Доступ к микрофону запрещен в настройках системы.",
notGranted: "Разрешение на использование микрофона ещё не получено.",
unexpectedState: "Неожиданное состояние разрешения на микрофон: {{state}}",
statusApiUnavailable:
"API проверки состояния микрофона недоступен в этой среде выполнения. Запросите доступ, чтобы проверить его.",
queryFailed: "Не удалось проверить состояние микрофона: {{message}}",
captureUnavailable: "В этой среде захват микрофона недоступен.",
permissionApiUnavailable:
"API проверки разрешений недоступен. Запросите доступ, чтобы проверить его.",
requestsWebOnly: "Запрашивать доступ к микрофону можно только в веб-среде выполнения.",
captureApiUnavailable: "API захвата микрофона недоступен в этой среде.",
requestDenied:
"Разрешение на использование микрофона было отклонено пользователем или системой.",
noDevice: "Микрофон не найден.",
requestFailed: "Не удалось запросить доступ к микрофону: {{message}}",
},
empty: {
notifications: "Статус уведомлений ещё не проверен.",
microphone: "Состояние микрофона ещё не проверялось.",
},
testNotification: {
title: "Тест уведомлений Paseo",
body: "Если вы это видите, уведомления на рабочем столе работают.",
notDelivered:
"Уведомление не доставлено. Проверьте раздел «Уведомления» в системных настройках.",
failed: "Не удалось отправить уведомление.",
},
},
integrations: {
cli: {
statusFailed: "Не удалось проверить состояние установки CLI.",
installFailed: "Не удалось установить Paseo CLI.",
},
},
},
rootError: {
title: "В Paseo возникла проблема.",
body: "Попробуйте перезагрузить приложение. Если ошибка повторится, приложите приведённые ниже сведения к отчёту.",
details: "Подробности",
},
startup: {
errorTitle: "Что-то пошло не так",
errorDescription:
"Не удалось запустить локальный сервер. Если ошибка повторится, сообщите о ней на GitHub и приложите приведённые ниже журналы.",
logs: {
loading: "Загрузка журналов демона...",
unavailable: "Журналы демона отсутствуют.",
loadFailed: "Не удалось загрузить журналы демона: {{message}}",
},
},
openProject: {
tiles: {
addProject: {
title: "Добавить проект",
description: "Откройте папку на своем компьютере",
},
importSession: {
title: "Импортировать сессию",
description: "Импортируйте недавние сессии из внешних CLI",
},
setupProviders: {
title: "Настроить провайдеров",
description: "Настройте Claude Code, Codex и другие провайдеры",
},
pairDevice: {
title: "Подключить устройство",
description: "Подключите свой телефон к этому демону",
},
},
},
projectPicker: {
placeholder: "Введите текст для поиска...",
browse: "Обзор…",
opening: "Открытие проекта...",
searching: "Идет поиск...",
empty: "Начните вводить путь",
errors: {
directory_not_found: "Каталог не найден.",
open_failed: "Не удалось открыть проект.",
},
openPath: "Открыть путь",
},
branchSwitcher: {
triggerTooltip: "Переключить ветку рабочего пространства",
currentBranch: "Текущая ветка: {{branchName}}. Нажмите, чтобы переключить ветку.",
placeholder: "Сменить ветку...",
searchPlaceholder: "Фильтровать ветки...",
empty: "Ветки не найдены.",
title: "Переключить ветку",
uncommittedTitle: "Незафиксированные изменения",
uncommittedMessage:
"У вас есть незафиксированные изменения. Убрать их в stash перед переключением ветки?",
stashAndSwitch: "Убрать в stash и переключиться",
failedToStash: "Не удалось убрать изменения в stash",
failedToSwitch: "Не удалось переключить ветку",
restoreStashTitle: "Восстановить изменения из stash?",
restoreStashMessage:
"В этой ветке есть изменения из предыдущей сессии, сохранённые в stash. Восстановить их?",
restore: "Восстановить",
later: "Позже",
stashRestored: "Изменения из stash восстановлены.",
},
agentAutocomplete: {
searchingWorkspace: "Поиск в рабочем пространстве...",
loadingCommands: "Загрузка команд...",
noFiles: "Файлы и каталоги не найдены",
noCommands: "Команды не найдены",
failedToLoad: "Не удалось загрузить",
chooseProjectForCommands: "Выберите проект, чтобы увидеть команды",
chooseModelForCommands: "Выберите модель, чтобы увидеть команды",
},
loadOlderHistory: {
failed: "Не удалось загрузить старую историю.",
},
imageAttachmentPicker: {
permissionTitle: "Требуется разрешение",
permissionMessage: "Разрешите доступ к медиатеке, чтобы прикреплять изображения.",
errorTitle: "Ошибка",
failedToSelect: "Не удалось выбрать изображение",
dialogTitle: "Прикрепить изображения",
dialogFilterName: "Изображения",
},
workspaceSetup: {
title: "Создать рабочее пространство",
errors: {
failedCreateWorktree: "Не удалось создать worktree.",
failedOpenProject: "Не удалось открыть проект",
selectModel: "Выберите модель",
hostDisconnected: "Хост не подключён",
pendingRequired: "Нет ожидающей настройки рабочего пространства.",
composerStateRequired: "Редактор настройки рабочего пространства ещё не готов.",
},
},
onboarding: {
title: "Добро пожаловать в Paseo",
subtitle: "Подключите компьютер, чтобы начать",
actions: {
settings: "Настройки",
},
},
modelSelector: {
title: "Выберите провайдера",
selectModel: "Выберите модель",
selectedModel: "Выберите модель ({{model}})",
loading: "Загрузка...",
loadingShort: "Загрузка",
loadingSelector: "Загрузка выбора модели...",
error: "Ошибка",
defaultModel: "По умолчанию",
profiles: "Профили",
providers: "Провайдеры",
model: "Модель",
editProfiles: "Изменить",
editProfilesLabel: "Изменить профили агентов",
createProfile: "Создать профиль",
createProfileFromModel: "Создать профиль из этой модели",
editProfileLabel: "Изменить {{name}}",
editProfilesCount: "Изменить профили ({{count}})",
modelCount: "{{count}} модель",
modelCountPlural: "{{count}} моделей",
retry: "Повторить попытку",
retrying: "Повторная попытка...",
noMatches: "Ни одна модель не соответствует вашему запросу",
noMatchesForQuery: "Нет моделей, соответствующих «{{query}}»",
searchAllPlaceholder: "Поиск по всем моделям...",
searchPlaceholder: "Поиск моделей...",
openProviderSettings: "Открыть настройки {{provider}}",
},
providerCatalog: {
title: "Добавить провайдера",
search: "Поиск провайдеров",
noProviders: "Провайдеры не найдены",
actions: {
add: "Добавить",
adding: "Добавление",
installed: "Установлено",
cancel: "Отмена",
installInstructions: "Инструкции по установке",
installInstructionsFor: "Инструкции по установке {{provider}}",
},
errors: {
unableToInstall: "Не удалось установить провайдера",
},
},
providerSelection: {
defaultModel: "По умолчанию",
selectModel: "Выберите модель",
loading: "Загрузка...",
error: "Ошибка",
unavailable: "Недоступно",
unknownError: "Неизвестная ошибка",
readiness: {
initialPromptRequired: "Требуется начальный промпт",
noProviders: "На выбранном хосте нет доступных провайдеров",
modelDefaultsLoading: "Настройки модели по умолчанию всё ещё загружаются",
noModelAvailable: "Для выбранного провайдера нет доступных моделей.",
workspaceDirectoryNotFound: "Каталог рабочего пространства не найден",
hostDisconnected: "Хост не подключён",
},
},
pairing: {
hostPassword: {
title: "Пароль для {{host}}",
label: "Пароль хоста",
},
hostConfirmation: {
title: "Подключиться к этому хосту?",
description:
"Этот хост сможет выполнять код в приложении и обращаться к другим вашим подключённым хостам. Подключайтесь, только если узнаёте его.",
descriptionChanged:
"Эта ссылка меняет способ подключения к этому хосту. Хост сможет выполнять код в приложении и обращаться к другим вашим подключённым хостам. Подключайтесь, только если узнаёте его.",
hostLabel: "Хост",
fingerprintLabel: "Отпечаток ключа",
relayLabel: "Реле",
connect: "Подключить",
},
connectionMethods: {
title: "Добавить подключение",
direct: {
title: "Прямое подключение",
description: "Локальная сеть или VPN.",
},
remoteSsh: {
title: "Удалённый SSH",
description: "Подключение через SSH-клиент настольного приложения.",
},
scanQr: {
title: "Сканировать QR-код",
description: "Зашифрованное подключение через ретранслятор.",
},
pasteLink: {
title: "Вставить ссылку для сопряжения",
description: "Зашифрованное подключение через ретранслятор.",
},
},
direct: {
title: "Прямое подключение",
helper: "Введите адрес сервера Paseo.",
fields: {
host: "Хост",
port: "Порт",
password: "Пароль",
optional: "Необязательно",
useSsl: "Использовать SSL",
connectionUri: "URI подключения",
},
advanced: {
label: "Дополнительные параметры",
show: "Показать дополнительные параметры",
hide: "Скрыть дополнительные параметры",
},
passwordVisibility: {
show: "Показать пароль",
hide: "Скрыть пароль",
},
actions: {
cancel: "Отмена",
connect: "Подключиться",
connecting: "Подключение...",
},
errors: {
hostRequired: "Требуется хост",
invalidPort: "Порт должен быть в диапазоне от 1 до 65535.",
invalidConnection: "Неверное соединение",
failedTitle: "Соединение не удалось",
failedToConnect: "Не удалось подключиться к {{endpoint}}.",
noAdditionalDetails: "{{detail}} (дополнительные сведения отсутствуют)",
timedOut: "Время подключения истекло. Проверьте адрес хоста, порт и сеть.",
refused: "В подключении отказано. Демон запущен по этому адресу?",
hostNotFound: "Хост не найден. Проверьте имя хоста и повторите попытку.",
hostUnreachable: "Хост недоступен. Проверьте сеть и брандмауэр.",
tlsError:
"Ошибка TLS. Прямые соединения используют SSL только тогда, когда перед демоном находится терминатор TLS.",
unableToConnect:
"Не удалось подключиться. Проверьте адрес хоста и порт, а также доступность демона.",
details: "Подробности: {{detail}}",
},
},
remoteSsh: {
title: "Удалённый SSH",
helper: "Подключитесь к демону Paseo на удалённом хосте.",
fields: {
target: "Хост SSH",
password: "Пароль демона",
optional: "Необязательно",
},
passwordVisibility: {
show: "Показать пароль",
hide: "Скрыть пароль",
},
actions: {
cancel: "Отмена",
connect: "Подключить",
connecting: "Подключение...",
},
errors: {
targetRequired: "Укажите хост SSH",
invalidTarget: "Укажите корректный хост ssh://",
failedToConnect: "Не удалось подключиться по SSH. {{detail}}",
},
},
link: {
title: "Вставить ссылку для сопряжения",
helper: "Вставьте ссылку на сопряжение с вашего сервера.",
label: "Ссылка на сопряжение",
errors: {
required: "Вставьте ссылку для сопряжения (.../#offer=...)",
missingOffer: "Ссылка должна содержать #offer=...",
emptyOffer: "Параметр #offer не содержит данных.",
invalid: "Неверная ссылка для сопряжения",
unableToPair: "Не удалось выполнить сопряжение с хостом",
},
alert: {
failedTitle: "Сопряжение не удалось",
},
actions: {
cancel: "Отмена",
pair: "Подключить",
pairing: "Сопряжение...",
},
},
scan: {
title: "Сканировать QR-код",
webUnavailableTitle: "Недоступно в веб-версии",
webUnavailableBody:
"Сканирование QR-кодов не поддерживается в веб-сборке. Используйте «Вставить ссылку».",
backToSettings: "Вернуться к настройкам",
cameraPermissionTitle: "Разрешение камеры",
cameraPermissionBody:
"Разрешите доступ к камере, чтобы отсканировать QR-код для сопряжения с вашим демоном.",
grantPermission: "Предоставить разрешение",
pairing: "Сопряжение...",
unableToPair: "Не удалось выполнить сопряжение с хостом",
errorTitle: "Ошибка",
},
device: {
loadingOffer: "Загрузка данных для сопряжения...",
failedToLoadOffer: "Не удалось загрузить данные для сопряжения.",
relayDisabled:
"Ретранслятор не включён. Включите его, чтобы выполнить сопряжение устройства.",
enableTitle: "Включить ретранслятор?",
enableDescription:
"Ретранслятор позволяет этому устройству подключаться откуда угодно. Трафик сопряжения защищён сквозным шифрованием.",
relayDocs: "Как работает ретранслятор",
relayDocsAccessibility: "Узнать, как работает ретранслятор Paseo",
enableRelay: "Включить ретранслятор",
enablingRelay: "Включение ретранслятора...",
notNow: "Не сейчас",
directConnectionHint:
"Без ретранслятора подключайтесь напрямую через TCP, Tailscale или другую VPN. QR-код создаваться не будет.",
updateRequired: "Обновите хост, чтобы включить ретранслятор из Paseo Desktop.",
unavailable: "Данные для сопряжения недоступны.",
hint: "Отсканируйте этот QR-код с помощью Paseo на телефоне или скопируйте ссылку ниже.",
securityWarning:
"Обращайтесь с этой ссылкой для сопряжения как с паролем. Любой, у кого она есть, может получить доступ к этому демону.",
qrUnavailable: "QR-код недоступен.",
qrAccessibility: "QR-код сопряжения",
retry: "Повторить попытку",
copy: "Копировать",
copied: "Скопировано",
},
},
realtimeVoice: {
actions: {
mute: "Отключить микрофон в голосовом режиме реального времени",
unmute: "Включить микрофон в голосовом режиме реального времени",
stop: "Остановить голосовой режим реального времени и прервать текущий ответ",
},
},
rewind: {
tooltip: "Вернуться к этому сообщению",
warning: "Это действие нельзя отменить.",
actions: {
conversation: "Откатить диалог",
files: "Откатить файлы",
both: "Откатить диалог и файлы",
},
errors: {
failed: "Не удалось откатить состояние агента",
},
},
diffViewer: {
empty: "Нет изменений для отображения",
},
serviceUrl: {
title: "Открыть URL сервиса",
message: "Открыть {{url}}?",
inPaseo: "В Paseo",
externalBrowser: "Внешний браузер",
dontAskAgain: "Больше не спрашивать",
},
downloads: {
requestTokenFailed: "Не удалось запросить токен загрузки.",
hostUnavailable: "Хост загрузки недоступен.",
cancelled: "Загрузка отменена.",
failed: "Не удалось загрузить файл.",
shareFile: "Поделиться файлом",
shareFileNamed: "Поделиться {{fileName}}",
},
menu: {
backdrop: "Фон меню",
},
subagents: {
title: "Субагенты",
pillLabelOne: "1 субагент",
pillLabelMany: "Субагентов: {{count}}",
pillLabelWorking: "{{count}} в работе",
pillLabelFailed: "{{count}} с ошибкой",
pillLabelNeedsInputOne: "1 ожидает ввода",
pillLabelNeedsInputMany: "{{count}} ожидают ввода",
pillLabelReadyToReview: "{{count}} на проверку",
detachAction: "Отсоединить {{label}}",
detachTooltip: "Отсоединить субагента",
archiveAction: "Архивировать {{label}}",
archiveTooltip: "Архивировать субагента",
archiveFinishedAction: "Архивировать завершенные субагенты",
archiveFinishedRetry: "Повторить ({{failed}}/{{total}})",
},
panels: {
draft: {
newAgent: "Новый агент",
creatingAgent: "Создание агента",
},
file: {
directoryMissing: "Каталог рабочего пространства не найден.",
loading: "Загрузка файла...",
noPreview: "Предварительный просмотр недоступен",
binaryPreviewUnavailable: "Предварительный просмотр двоичного файла недоступен.",
tooLargeToDisplay: "Этот файл слишком велик для отображения",
failedToLoad: "Не удалось загрузить файл",
failedToLoadPreview: "Не удалось загрузить предварительный просмотр файла.",
editor: {
fileSize: "Размер файла {{size}}",
lines: "Строк: {{count}}",
editorStatus: "Состояние редактора: {{status}}",
unsavedChanges: "Несохранённые изменения",
saving: "Сохранение...",
saveFailed: "Не удалось сохранить",
changedOnDisk: "Изменён на диске",
vimMode: "Режим Vim {{mode}}",
cursor: "Строка {{line}}, столбец {{column}}",
preview: "Предпросмотр",
source: "Исходный текст",
deletedTitle: "Файл удалён с диска",
checkFailedTitle: "Не удалось проверить файл на диске",
preservedDescription: "Открытая копия сохранена в редакторе.",
conflictDescription:
"Локальный буфер сохранён в редакторе. Выберите, какую версию оставить.",
overwrite: "Перезаписать",
reload: "Перезагрузить",
reloadTitle: "Перезагрузить с диска?",
reloadMessage: "Локальные изменения будут потеряны.",
},
},
files: {
label: "Файлы",
subtitle: "Файлы рабочего пространства",
tooltip: "Просмотр файлов рабочего пространства",
chooseFile: "Выберите файл",
},
pullRequest: {
label: "PR",
subtitle: "Сведения о PR",
emptyTitle: "PR пока нет",
emptyDescription: "Создайте PR для этой рабочей копии, чтобы увидеть здесь сведения о нём.",
},
diff: {
changesLabel: "Изменения",
diffLabel: "Дифф",
changesSubtitle: "Изменения в worktree",
commitSubtitle: "Изменения в коммите",
uncommittedSubtitle: "Незафиксированные изменения",
baseSubtitle: "Сравнение с {{baseRef}}",
directoryMissing: "Каталог рабочего пространства не найден.",
empty: "Нет изменений",
loadError: "Не удалось загрузить список изменений",
capabilityMissing: "Обновите хост, чтобы просматривать изменения в коммитах.",
},
},
toolCallDetails: {
error: "Ошибка",
empty: "Дополнительные сведения отсутствуют",
subAgentActivity: "Активность субагента",
input: "Входные данные",
output: "Выходные данные",
},
toolCallGroup: {
editedFiles: {
one: "изменён {{count}} файл",
other: "изменены файлы ({{count}})",
},
commands: {
one: "выполнена {{count}} команда",
other: "выполнены команды ({{count}})",
},
readFiles: {
one: "прочитан {{count}} файл",
other: "прочитаны файлы ({{count}})",
},
searches: {
one: "выполнен {{count}} поиск",
other: "выполнены поисковые запросы ({{count}})",
},
otherTools: {
one: "использован {{count}} другой инструмент",
other: "использованы другие инструменты ({{count}})",
},
paseoCalls: {
one: "выполнен {{count}} вызов Paseo",
other: "выполнены вызовы Paseo ({{count}})",
},
and: "и",
},
renameModal: {
rename: "Переименовать",
saving: "Сохранение...",
},
sidebarCallout: {
dismiss: "Закрыть",
},
contextWindow: {
noData: "Нет данных о контексте",
accessibilityNoData: "Контекстное окно: нет данных о контексте",
title: "Контекстное окно",
used: "Использовано: {{percentage}}%",
tokens: "Токены: {{used}} / {{max}}",
sessionCost: "Стоимость сессии: {{cost}}",
accessibility: "Использовано {{percentage}}% контекстного окна",
},
review: {
feedback: {
send: "Отправить отзыв ({{count}})",
sending: "Отправка отзыва ({{count}})",
chooseAgent: "Выберите агента",
sent: "Отзыв отправлен: {{recipient}}",
"no-agents": "Откройте вкладку агента в этой рабочей области, чтобы отправить отзыв.",
disconnected: "Подключитесь к хосту, чтобы отправить отзыв.",
"no-context": "Сохранённые комментарии больше не соответствуют этому diff.",
failed: "Не удалось отправить отзыв. Повторите попытку.",
prompt: "Пожалуйста, учтите эту проверку кода.",
},
comment: {
add: "Добавить комментарий к ревью",
edit: "Изменить комментарий к ревью",
delete: "Удалить комментарий к ревью",
label: "Комментарий к ревью",
placeholder: "Оставить комментарий",
cancel: "Отмена",
cancelAccessibility: "Отменить ввод комментария к ревью",
save: "Сохранить",
saveAccessibility: "Сохранить комментарий к ревью",
},
},
settings: {
title: "Настройки",
loading: "Загрузка настроек...",
groups: {
app: "Приложение",
host: "Хост",
},
hostPicker: {
switchHost: "Сменить хост",
local: "Локальный",
},
backToWorkspace: "Назад",
addHost: "Добавить хост",
enableBuiltInDaemon: "Включить встроенный демон",
projects: "Проекты",
projectList: {
hostLoadFailed: "Не удалось загрузить проекты с хоста {{hostName}}: {{message}}",
editProject: "Изменить {{projectName}}",
},
groupInfo: "О разделе «{{title}}»",
sections: {
general: "Основные",
chat: "Чат",
appearance: "Оформление",
sidebar: "Боковая панель",
terminal: "Терминал",
browser: "Браузер",
editor: "Редактор",
shortcuts: "Сочетания клавиш",
integrations: "Интеграции",
notifications: "Уведомления",
permissions: "Разрешения",
diagnostics: "Диагностика",
about: "О приложении",
},
layout: en.settings.layout,
editor: {
title: "Редактор",
vimKeybindings: "Сочетания клавиш Vim",
vimHint: "Применяется к исходным файлам в веб- и настольной версии.",
},
notifications: {
title: "Уведомления",
permission: "Разрешение на уведомления",
refreshAccessibility: "Обновить разрешение на уведомления",
playSound: "Воспроизводить звук",
playSoundHint: "Воспроизводит звук при получении уведомления на компьютере",
test: "Проверить уведомление",
testHint: "Отправляет уведомление с текущими настройками",
permissionRequired: "Разрешите доступ к уведомлениям перед проверкой",
send: "Отправить",
sending: "Отправка...",
sentTitle: "Тестовое уведомление отправлено",
sentDescription: "Paseo передал уведомление операционной системе.",
sendFailedTitle: "Не удалось отправить тестовое уведомление",
},
hostSections: {
projects: "Проекты",
connections: "Подключения",
agents: "Агенты",
metadata: "Метаданные",
workspaces: "Рабочие пространства",
providers: "Провайдеры",
usage: "Использование",
terminals: "Терминалы",
plugins: "Плагины",
host: "Обзор",
},
plugins: pluginSettings.ru,
metadataGeneration: {
title: "Генерация метаданных",
description:
"Выберите модель, которую Paseo будет использовать для названий рабочих пространств и веток, сообщений коммитов и черновиков PR",
selection: "Выбор модели",
automatic: "Автоматически",
preferred: "Вручную",
automaticHint: "Paseo выбирает быструю доступную модель",
preferredHint: "Выберите модель, которую использует Paseo",
model: "Модель",
fallbackHint: "Если она недоступна, Paseo использует другую доступную модель",
docs: "Документация",
saveError: "Не удалось обновить настройки генерации метаданных",
},
general: {
title: "Основные",
sending: "Отправка",
browserData: {
title: "Данные браузера",
siteData: "Файлы cookie и данные сайтов",
description: "Вкладки браузера в Paseo используют общие данные входа и данные сайтов.",
clear: "Очистить данные браузера",
clearing: "Очистка...",
confirmTitle: "Очистить данные браузера?",
confirmMessage:
"Вы выйдете из аккаунтов на сайтах, а открытые вкладки браузера перезагрузятся.",
success: "Данные браузера очищены.",
error: "Не удалось очистить данные браузера.",
},
defaultSend: {
label: "Отправка по умолчанию",
descriptions: {
interrupt:
"Когда агент работает, Enter прерывает его работу, а Command/Ctrl+Enter ставит сообщение в очередь.",
steer:
"Когда агент работает, Enter дополняет текущий ответ новым указанием, а Command/Ctrl+Enter ставит сообщение в очередь.",
queue:
"Когда агент работает, Enter ставит сообщение в очередь, а Command/Ctrl+Enter отправляет его.",
},
options: {
interrupt: "Прерывать",
steer: "Направить",
queue: "Поставить в очередь",
},
},
serviceUrls: {
options: {
ask: "Спрашивать",
inApp: "В Paseo",
external: "Внешний браузер",
},
},
terminalScrollback: {
label: "Буфер прокрутки терминала",
description: "Количество строк, сохраняемых во встроенном буфере терминала",
accessibilityLabel: "Количество строк в буфере прокрутки терминала",
},
autoExpandReasoning: {
label: "Всегда разворачивать размышления",
description:
"По умолчанию полностью разворачивать блоки размышлений и хода рассуждений агента",
},
toolCallDetail: {
label: "Отображение вызовов инструментов",
description: "Как вызовы инструментов отображаются на временной шкале",
options: {
overview: "Сводка",
detailed: "Все подробности",
},
},
language: {
label: "Язык",
description: "Язык приложения",
options: {
system: "Как в системе",
ar: "العربية",
en: "English",
es: "Español",
fr: "Français",
ja: "日本語",
ko: "한국어",
ptBR: "Português brasileiro",
ru: "Русский",
zhCN: "简体中文",
},
},
},
diagnostics: {
title: "Диагностика",
legacyTerminalRenderer: {
label: "Использовать прежний рендерер терминала",
description: "Использовать прежний WebView-терминал после повторного открытия",
accessibilityLabel: "Использовать прежний рендерер терминала",
},
testAudio: "Проверка звука",
playTest: "Воспроизвести тестовый звук",
playing: "Воспроизведение...",
playbackFailed: "Ошибка воспроизведения: {{message}}",
app: {
title: "Диагностика приложения",
rowTitle: "Диагностика приложения",
rowHint:
"Собрать сведения о подключениях, демоне, провайдерах, настольном приложении и журналах",
run: "Запустить",
running: "Выполняется диагностика...",
copyLabel: "результаты диагностики",
copyAccessibility: "Скопировать результаты диагностики",
copyFailed: "Не удалось скопировать результаты диагностики",
refreshAccessibility: "Обновить результаты диагностики",
refreshingAccessibility: "Диагностика обновляется",
progress: {
client: "Клиент",
desktop: "Настольное приложение",
},
},
},
about: {
title: "О приложении",
appVersion: "Версия приложения",
whatsNewHint: "Заметки о выпуске для каждой версии",
thisDevice: "Это устройство",
connectedHosts: "Подключенные хосты",
offline: "Оффлайн",
versionDiffers: "Версия отличается от версии на этом устройстве",
releaseChannel: {
label: "Канал выпуска",
description:
"Переключитесь на бета-канал, чтобы раньше получать обновления и помогать развивать Paseo.",
stable: "Стабильный",
beta: "Бета",
},
updates: {
label: "Обновления приложения",
readyToInstall: "Версия {{version}} готова к установке",
installTitle: "Установить обновление настольного приложения",
installMessage: "Это обновит Paseo на этом компьютере.",
installConfirm: "Установить обновление",
update: "Обновить",
updateTo: "Обновить до {{version}}",
installing: "Установка...",
check: "Проверить",
checking: "Проверка...",
alertTitle: "Ошибка",
alertMessage: "Не удалось открыть диалог подтверждения обновления.",
},
},
appearance: {
theme: {
title: "Тема",
accessibilityLabel: "Тема: {{value}}",
options: {
light: "Светлая",
dark: "Тёмная",
zinc: "Цинк",
midnight: "Полночь",
claude: "Claude",
ghostty: "Ghostty",
pureBlack: "Абсолютно чёрная",
auto: "Системная",
},
},
detailLevel: {
title: "Уровень детализации",
},
chatOutline: {
title: "Оглавление чата",
description: "Показывать оглавление для перехода между запросами",
},
sidebar: {
header: {
title: "Верх",
description:
"Выберите, какие элементы отображаются вверху боковой панели и в каком порядке",
},
footer: {
title: "Низ",
description:
"Выберите, какие строки отображаются внизу боковой панели и в каком порядке. «Добавить проект» и ряд значков видны всегда",
},
moveUp: "Переместить вверх",
moveDown: "Переместить вниз",
},
fonts: {
title: "Шрифты",
systemDefault: "Системный шрифт",
interfaceFont: "Шрифт интерфейса",
interfaceFontHint:
"Используется во всём приложении. Оставьте поле пустым, чтобы использовать системный шрифт.",
interfaceFontAccessibility: "Семейство интерфейсных шрифтов",
interfaceSize: "Размер интерфейса",
interfaceSizeHint: "Используется для навигации, элементов управления и подписей",
interfaceSizeAccessibility: "Размер шрифта интерфейса",
contentSize: "Размер содержимого",
contentSizeHint: "Используется для текста чата и отображаемого Markdown",
contentSizeAccessibility: "Размер шрифта содержимого",
codeFont: "Шрифт кода",
codeFontHint:
"Используется для кода, диффов и вывода терминала. Оставьте поле пустым, чтобы использовать системный шрифт.",
codeFontAccessibility: "Семейство шрифтов кода",
codeSize: "Размер кода",
codeSizeHint: "Используется для кода, диффов и вывода терминала",
codeSizeAccessibility: "Размер шрифта кода",
},
layout: {
title: "Макет",
contentWidth: "Ширина содержимого",
contentWidthHint: "Максимальная ширина чата и файлов Markdown на широких экранах",
contentWidthAccessibility: "Ширина содержимого в пикселях",
reset: "Сбросить",
resetAccessibility: "Сбросить ширину содержимого",
},
syntax: {
title: "Синтаксис",
highlightTheme: "Тема подсветки",
highlightThemeHint: "Цвета кода, не зависящие от темы приложения",
highlightThemeAccessibility: "Тема подсветки: {{value}}",
previewAccessibility:
"Предварительный просмотр типографики содержимого, темы синтаксиса и шрифта кода в реальном времени.",
previewContent: "Предварительный просмотр содержимого и кода",
},
},
shortcuts: {
dialogTitle: "Сочетания клавиш",
searchPlaceholder: "Поиск сочетаний клавиш",
unavailableOnMobile: "Сочетания клавиш доступны только на рабочем столе.",
capturePrompt: "Нажмите сочетание клавиш...",
unassigned: "Не задано",
actions: {
menu: "Действия для {{name}}",
done: "Готово",
cancel: "Отмена",
bind: "Назначить",
rebind: "Переназначить",
clear: "Очистить",
reset: "Восстановить значение по умолчанию",
resetAll: "Сбросить все",
},
sections: {
general: "Общие",
workspaces: "Проекты и рабочие пространства",
tabsPanes: "Вкладки и панели",
layout: "Макет",
agentInput: "Ввод для агента",
},
help: {
openProject: "Открыть проект",
newWorkspace: "Новое рабочее пространство",
newWorktree: "Новый worktree",
archiveWorkspace: "Архивировать рабочее пространство",
newTab: "Новая вкладка",
closeCurrentTab: "Закрыть текущую вкладку",
jumpToWorkspace: "Перейти к рабочему пространству",
jumpToTab: "Перейти на вкладку",
previousWorkspace: "Предыдущее рабочее пространство",
nextWorkspace: "Следующее рабочее пространство",
previousTab: "Предыдущая вкладка",
nextTab: "Следующая вкладка",
splitPaneRight: "Разделить панель справа",
splitPaneDown: "Разделить панель вниз",
focusPaneLeft: "Перейти на панель слева",
focusPaneRight: "Перейти на панель справа",
focusPaneUp: "Перейти на панель выше",
focusPaneDown: "Перейти на панель ниже",
moveTabLeft: "Переместить вкладку влево",
moveTabRight: "Переместить вкладку вправо",
moveTabUp: "Переместить вкладку вверх",
moveTabDown: "Переместить вкладку вниз",
closePane: "Закрыть панель",
newTerminal: "Новый терминал",
searchFiles: "Поиск файлов",
toggleCommandCenter: "Переключить командный центр",
showKeyboardShortcuts: "Показать сочетания клавиш",
toggleLeftSidebar: "Переключить левую боковую панель",
toggleRightSidebar: "Переключить боковую панель",
toggleBothSidebars: "Переключить обе боковые панели",
toggleSettings: "Переключить настройки",
toggleFocusMode: "Переключить режим фокусировки",
cycleTheme: "Переключить тему",
focusMessageInput: "Перейти к полю ввода сообщения",
cycleAgentMode: "Переключить режим агента",
toggleVoiceMode: "Переключить голосовой режим",
startStopDictation: "Начать/остановить диктовку",
interruptAgent: "Прервать агента",
sendMessage: "Отправить сообщение",
queueMessage: "Поставить сообщение в очередь",
muteUnmuteVoiceMode: "Выключить/включить звук в голосовом режиме",
switchProject: "Сменить проект",
},
helpNotes: {
showKeyboardShortcuts: "Доступно, когда фокус находится не в текстовом поле или терминале.",
},
},
integrations: {
title: "Интеграции",
docs: {
cli: "Документация CLI",
openCli: "Открыть документацию CLI",
},
commandLine: {
title: "Командная строка",
description: "Управляйте агентами и автоматизируйте их работу из терминала",
},
actions: {
install: "Установить",
installing: "Установка...",
installed: "Установлено",
},
},
permissions: {
title: "Разрешения",
microphone: "Микрофон",
refresh: "Обновить",
refreshing: "Обновление...",
refreshAccessibility: "Обновить разрешения рабочего стола",
actions: {
granted: "Предоставлено",
request: "Запросить",
requesting: "Запрашивается...",
},
},
host: {
password: {
guidance:
"Удалите этот хост и добавьте его снова с паролем, который запрашивает этот демон.",
},
appearance: {
title: "Оформление",
name: {
label: "Имя",
},
color: {
label: "Цвет",
accessibilityLabel: "Цвет, {{value}}",
options: {
none: "По умолчанию",
violet: "Фиолетовый",
sky: "Голубой",
emerald: "Изумрудный",
orange: "Оранжевый",
pink: "Розовый",
indigo: "Индиго",
teal: "Бирюзовый",
red: "Красный",
amber: "Янтарный",
blue: "Синий",
},
},
badge: {
label: "Значок на боковой панели",
accessibilityLabel: "Значок на боковой панели, {{value}}",
options: {
name: "Имя",
icon: "Только значок",
hidden: "Скрыт",
},
},
preview: {
workspaceName: "my-workspace",
},
},
notFound: "Хост не найден",
badges: {
relay: "Ретранслятор",
local: "Локальный",
remoteSsh: "Удалённый SSH",
},
connections: {
title: "Подключения",
removeTitle: "Удалить подключение",
removeMessage: "Удалить {{name}}? Это действие нельзя отменить.",
removeAction: "Удалить",
removeErrorTitle: "Ошибка",
removeErrorMessage: "Не удалось удалить подключение",
timeout: "Время ожидания истекло",
},
pairDevices: {
title: "Подключение устройств",
rowTitle: "Подключить устройство",
rowHint:
"Отсканируйте QR-код или скопируйте ссылку, чтобы подключить телефон к этому хосту.",
},
skills: {
sectionTitle: "Навыки оркестрации",
title: "Навыки оркестрации",
description: "Научите агентов координировать работу через CLI",
docs: "Навыки",
openDocs: "Открыть документацию по навыкам",
unavailable: "Подключитесь к этому хосту, чтобы управлять навыками оркестрации",
unsupported: "Обновите этот хост, чтобы управлять навыками оркестрации",
updateAvailable: "Доступно обновление",
updateTitle: "Обновить навыки Paseo?",
updateFallback: "Встроенные навыки будут синхронизированы с этим хостом.",
uninstallTitle: "Удалить навыки Paseo?",
uninstallMessage:
"Удаляет все навыки оркестрации Paseo из ~/.agents, ~/.claude и ~/.codex на этом хосте.",
choose: "Выбрать навыки",
chooseAll: "Все навыки",
chooseAllHint: "Устанавливать все встроенные навыки, включая добавленные позже.",
chooseList: "Встроенные навыки",
chooseEmpty: "На этом хосте нет встроенных навыков.",
removeTitle: "Удалить снятые навыки?",
removeMessage:
"{{skills}} будут удалены из ~/.agents, ~/.claude и ~/.codex на этом хосте. Всё, что вы добавили в эти папки навыков, тоже будет удалено.",
saveFailed: "Не удалось сохранить выбор навыков.",
statusFailed: "Не удалось проверить состояние навыков оркестрации.",
updateFailed: "Не удалось обновить навыки оркестрации.",
uninstallFailed: "Не удалось удалить навыки оркестрации.",
saveSelectionFailed: "Не удалось сохранить выбор навыков оркестрации.",
actions: {
install: "Установить",
installing: "Установка...",
installed: "Установлено",
update: "Обновить",
working: "Выполняется...",
remove: "Удалить",
uninstall: "Удалить",
save: "Сохранить",
saving: "Сохранение...",
cancel: "Отмена",
},
operations: {
add: "Добавить навык",
update: "Обновить навык",
delete: "Удалить навык",
},
},
orchestration: {
title: "Оркестрация",
unavailable: "Подключитесь к этому хосту, чтобы управлять оркестрацией.",
enableTools: {
title: "Включить инструменты Paseo",
hint: "Агенты смогут управлять worktree, агентами и расписаниями.",
accessibilityLabel: "Добавить инструменты Paseo",
},
systemPrompt: {
title: "Системный промпт",
hint: "Добавляет системный промпт всем агентам",
sheetTitle: "Добавить системный промпт",
accessibilityLabel: "Добавить системный промпт",
placeholder: "Всегда отвечайте кратко.",
edit: "Редактировать",
reset: "Сбросить",
save: "Сохранить",
saving: "Сохранение...",
},
},
agents: {
unavailable: "Подключитесь к этому хосту, чтобы управлять агентами",
},
workspaces: {
unavailable: "Подключитесь к этому хосту, чтобы управлять рабочими пространствами",
},
terminalProfiles: {
unavailable: "Подключитесь к этому хосту, чтобы управлять профилями терминала",
sectionTitle: "Профили терминала",
editProfile: "Изменить профиль",
addProfileTitle: "Добавить профиль терминала",
editProfileTitle: "Изменить профиль терминала",
namePlaceholder: "Claude Code",
commandPlaceholder: "claude",
argsPlaceholder: "--dangerously-skip-permissions",
nameLabel: "Название",
commandLabel: "Команда",
argsLabel: "Аргументы",
nameRequired: "Укажите название",
commandRequired: "Укажите команду",
argsHint: "Аргументы, разделённые пробелами и передаваемые команде",
saving: "Сохранение...",
remove: "Удалить",
removeConfirmTitle: "Удалить профиль?",
removeConfirmMessage: "Удалить «{{name}}»?",
moveUp: "Переместить вверх",
moveDown: "Переместить вниз",
save: "Сохранить",
emptyState:
"Профилей пока нет. Добавьте профиль, чтобы запускать терминалы с заданной командой.",
},
agentProfiles: {
sectionTitle: "Профили агентов",
unavailable: "Подключитесь к этому хосту, чтобы управлять профилями агентов",
unsupported: "На этом хосте запущен демон, который пока не поддерживает профили агентов",
emptyState:
"Пока нет профилей. Добавьте один, чтобы запускать агентов с сохранённым провайдером и моделью.",
addProfileTitle: "Добавить профиль агента",
newProfile: "Новый профиль",
editProfile: "Изменить профиль",
editProfileTitle: "Изменить профиль агента",
nameLabel: "Имя",
namePlaceholder: "Работа над UI",
iconLabel: "Значок",
noIcon: "Нет",
providerLabel: "Провайдер",
providerPlaceholder: "Выберите провайдера",
noProviders: "На этом хосте нет доступных провайдеров",
modelLabel: "Модель",
noModels: "У этого провайдера нет моделей для выбора",
modeLabel: "Режим",
noModes: "У этого провайдера нет режимов для выбора",
thinkingLabel: "Рассуждения",
noThinkingOptions: "У этой модели нет уровней рассуждений",
featuresLabel: "Функции",
featureCount: "Функции: {{count}}",
featureCountOne: "{{count}} функция",
notesLabel: "Когда использовать",
notesPlaceholder: "Используйте для работы над UI — компоненты, макет и токены дизайна.",
notesHint: "Помогает агентам выбрать этот профиль при запуске другого агента.",
save: "Сохранить",
saving: "Сохранение...",
remove: "Удалить",
removeConfirmTitle: "Удалить профиль?",
removeConfirmMessage: "Удалить «{{name}}»?",
moveUp: "Переместить вверх",
moveDown: "Переместить вниз",
},
daemon: {
rename: {
editLabel: "Изменить название",
title: "Переименовать хост",
placeholder: "Мой хост",
submit: "Переименовать",
},
restart: {
title: "Перезапустить демон",
hint: "Перезапускает процесс демона. Приложение автоматически переподключится",
confirm: "Перезапустить",
confirmTitle: "Перезапустить {{name}}",
confirmMessage:
"Это перезапустит демон. Агенты, работающие на нём, продолжат работу, а приложение автоматически переподключится.",
restarting: "Перезапуск...",
unableToReconnectTitle: "Не удалось переподключиться",
unableToReconnectMessage:
"Хост {{name}} не вернулся в сеть. Убедитесь, что демон перезапустился.",
unavailableTitle: "Хост недоступен",
unavailableMessage:
"Этот хост не подключён. Дождитесь его появления в сети перед перезапуском.",
offlineTitle: "Хост не в сети",
offlineMessage:
"Этот хост не в сети. Paseo переподключится автоматически. Дождитесь подключения перед перезапуском.",
requestFailedTitle: "Ошибка",
requestFailedMessage:
"Не удалось отправить запрос на перезапуск. Paseo переподключается автоматически. Повторите попытку, когда хост появится в сети.",
dialogFailedMessage: "Не удалось открыть диалог подтверждения перезапуска.",
},
update: {
desktopManagedHint:
"Этот демон управляется Paseo Desktop. Обновите Paseo Desktop на хосте.",
title: "Обновить демон",
hint: "Обновить демон до последней версии и перезапустить его",
confirm: "Обновить",
confirmTitle: "Обновить {{name}}",
confirmMessage:
"Демон будет обновлён до последней версии и перезапущен. Работа агентов будет ненадолго прервана.",
updating: "Обновление...",
phaseStarting: "Подготовка обновления...",
phaseDownloading: "Загрузка пакетов...",
phaseInstalling: "Установка...",
phaseComplete: "Обновление завершено. Перезапуск...",
unableToReconnectTitle: "Не удалось переподключиться",
unableToReconnectMessage:
"Хост {{name}} не вернулся в сеть после обновления. Убедитесь, что демон перезапустился.",
unavailableTitle: "Хост недоступен",
unavailableMessage:
"Этот хост не подключён. Дождитесь его появления в сети перед обновлением.",
offlineTitle: "Хост не в сети",
offlineMessage: "Этот хост не в сети. Дождитесь его появления в сети перед обновлением.",
requestFailedTitle: "Не удалось обновить",
requestFailedMessage: "Не удалось обновить демон: {{error}}",
dialogFailedMessage: "Не удалось открыть диалог подтверждения обновления.",
},
dangerZone: "Опасная зона",
remove: {
title: "Удалить хост",
localTitle: "Удалить подключение к localhost",
hint: "Удаляет этот хост и сохранённые подключения к нему с этого устройства.",
localHint:
"Удаляет подключение к localhost с этого устройства и останавливает встроенный демон",
localConfirmTitle: "Удалить подключение к localhost и остановить демон?",
confirmMessage: "Удалить {{name}}? Сохранённые подключения к этому хосту будут удалены.",
localConfirmMessage:
"Подключение к localhost будет удалено, управление встроенным демоном отключено, а управляемый демон остановлен. Удалённые хосты останутся подключёнными.",
errorTitle: "Ошибка",
errorMessage: "Не удалось удалить хост",
localErrorMessage: "Не удалось удалить подключение к localhost",
},
},
},
providers: {
title: "Провайдеры",
addProvider: "Добавить провайдера",
providerDetails: "Сведения о провайдере {{name}}",
enableProvider: "Включить {{name}}",
unavailable: "Подключитесь к этому хосту, чтобы увидеть провайдеров",
loading: "Загрузка...",
addErrorTitle: "Не удалось добавить провайдера",
updateErrorTitle: "Не удалось обновить провайдера",
actions: {
menu: "Действия с {{name}}",
remove: "Удалить провайдера",
removing: "Удаление...",
},
remove: {
confirmTitle: "Удалить {{name}}?",
confirmMessage:
"Запись провайдера будет удалена из config.json. Это действие нельзя отменить.",
confirm: "Удалить",
errorTitle: "Не удалось удалить провайдера",
},
statuses: {
disabled: "Отключён",
loading: "Загрузка",
error: "Ошибка",
available: "Доступен",
notInstalled: "Не установлен",
},
models: {
one: "1 модель",
many: "{{count}} моделей",
addModel: "Добавить модель",
addCustomTitle: "Добавить пользовательскую модель",
modelId: "ID модели",
modelIdPlaceholder: "например, openai/gpt-5",
add: "Добавить",
adding: "Добавление...",
failedToSave: "Не удалось сохранить модель.",
removeModel: "Удалить {{id}}",
searchPlaceholder: "Поиск моделей",
loading: "Загрузка моделей...",
retry: "Повторить попытку",
retrying: "Повторная попытка...",
noSearchMatches: "Ни одна модель не соответствует вашему запросу",
noneDetected: "Модели не обнаружены",
discovered: "Обнаруженные модели",
custom: "Пользовательские модели",
updated: "Обновлено {{time}}",
},
diagnostic: {
title: "Диагностика",
button: "Диагностика",
refresh: "Обновить",
refreshing: "Обновление...",
copyLabel: "результаты диагностики",
copyAccessibility: "Скопировать результаты диагностики",
copyFailed: "Не удалось скопировать результаты диагностики",
refreshAccessibility: "Обновить диагностику",
refreshingAccessibility: "Диагностика обновляется",
running: "Выполняется диагностика...",
none: "Диагностика недоступна",
failedToFetch: "Не удалось получить диагностику.",
unknownError: "Неизвестная ошибка",
},
},
project: {
noEditableTarget: "Этот проект нельзя редактировать на этом хосте.",
backToProjects: "Вернуться к проектам",
edit: {
title: "Изменить проект",
name: "Название",
nameLabel: "Название проекта",
icon: "Значок",
chooseImage: "Выбрать изображение",
useAutomatic: "Использовать автоматический значок",
imageUrl: "URL изображения или сайта",
save: "Сохранить изменения",
savedToast: "Проект обновлён",
},
readFailures: {
invalidTitle: "Не удалось разобрать paseo.json",
invalidDescription: "Исправьте файл на диске, затем загрузите его заново.",
missingTitle: "У этого хоста нет этого проекта",
missingSingleHost: "У выбранного хоста нет записей об этом проекте.",
transportTitle: "Не удалось загрузить paseo.json.",
transportFallback: "Хост не ответил.",
failedTitle: "Не удалось загрузить paseo.json.",
failedDescription: "Загрузите данные заново, чтобы повторить попытку.",
},
worktree: {
title: "Хуки жизненного цикла worktree",
info: "Команды, которые выполняются при создании или удалении worktree для этого проекта.",
docs: "Документация",
docsTooltip:
"Дополнительную информацию и переменные среды, доступные для этих команд, см. в документации.",
setup: "Настройка",
setupAccessibility: "Команды настройки worktree",
uncommittedTitle: "Закоммитьте изменения в paseo.json",
uncommittedDescription:
"Новые worktree используют скрипт настройки из выбранной базовой ветки.",
teardown: "Удаление",
teardownAccessibility: "Команды удаления worktree",
},
scripts: {
title: "Скрипты",
info: "Долго работающие сервисы и одноразовые команды, которые можно запускать из любого агента этого проекта.",
empty: "Скриптов пока нет.",
untitled: "Безымянный скрипт",
port: "порт {{port}}",
menuAccessibility: "Открыть меню скриптов",
removeTitle: "Удалить скрипт?",
removeMessage: "Удалить {{name}}?",
removeFallbackName: "этот скрипт",
name: "Название",
command: "Команда",
nameAccessibility: "Название скрипта",
commandAccessibility: "Команда скрипта",
nameRequired: "Укажите название",
commandRequired: "Требуется команда",
newScript: "Новый скрипт",
editScript: "Изменить {{name}}",
runAsService: "Запускать как сервис",
serviceHint: "Paseo управляет процессом и назначает порт через переменную $PASEO_PORT.",
actions: {
add: "Добавить скрипт",
edit: "Редактировать",
remove: "Удалить",
},
},
metadata: {
title: "Генерация метаданных",
info: "Инструкции для этого проекта, добавляемые в промпты ИИ, с помощью которых Paseo генерирует метаданные. Используйте их, чтобы соблюдать принятые в команде правила именования веток, оформления коммитов и формата PR.",
branchName: "Названия веток",
branchNamePlaceholder:
"Добавляйте к веткам префиксы feat/ или fix/, а к личным веткам — mb/",
commitMessage: "Сообщения коммитов",
commitMessagePlaceholder: "Используйте формат Conventional Commits с областью",
pullRequest: "PR",
pullRequestPlaceholder:
"Начинайте с краткого резюме в один абзац и добавляйте раздел «План тестирования».",
},
writeFailures: {
staleTitle: "Конфигурация изменена на диске",
staleDescription: "Перед сохранением загрузите с диска последнюю версию paseo.json.",
failedTitle: "Не удалось сохранить paseo.json.",
failedDescription: "Повторите попытку или загрузите с диска последнюю версию paseo.json.",
},
actions: {
reload: "Загрузить заново",
tryAgain: "Повторить",
save: "Сохранить",
saved: "Проект сохранён.",
saving: "Сохранение...",
cancel: "Отмена",
},
},
},
};