// Український інтерфейс Navi. Слаги ті самі, що в en.js, — словник читається за
// ними, а не за порядком рядків. Назви продуктів (Navi, Synapse, MCP, Ollama,
// GitHub…) не перекладаються: це і є назва. Форми множини вибираються за
// params.n, тому в числових рядків тут чотири ключі замість двох.
export default {
// оболонка застосунку — заголовки документа та інше поза самим чатом
'app.titleSettings': 'Navi — Налаштування',
// панель артефактів — опубліковані файли, посилання, файли сесії, фонові
'artifacts.panelLabel': 'Артефакти сесії',
'artifacts.resize': 'Змінити ширину панелі',
'artifacts.close': 'Закрити артефакти',
'artifacts.closeDetails': 'Закрити подробиці',
'artifacts.tabArtifacts': 'Артефакти',
'artifacts.tabLinks': 'Посилання',
'artifacts.tabFiles': 'Файли',
'artifacts.tabBackgrounds': 'Фонові',
'artifacts.viewedImages': 'Переглянуті зображення',
'artifacts.viewedImageAlt': 'Зображення, яке переглянув Navi {n}',
'artifacts.emptyArtifacts': 'Немає опублікованих файлів',
'artifacts.emptyLinks': 'Посилань поки не знайдено',
'artifacts.emptyFiles': 'У каталозі сесії немає файлів',
'artifacts.emptyBackgrounds': 'Немає фонових завдань і терміналів',
'artifacts.openPreview': 'Відкрити перегляд',
'artifacts.openRaw': 'Відкрити вихідний файл',
'artifacts.openInline': 'Відкрити у браузері',
'artifacts.showPreview': 'Показати перегляд',
'artifacts.showSource': 'Показати вихідний код',
'artifacts.copyFileLink': 'Скопіювати посилання на файл',
'artifacts.copyAllLinks': 'Скопіювати всі посилання',
'artifacts.openAllLinks': 'Відкрити всі посилання',
'artifacts.refreshFiles': 'Оновити файли',
'artifacts.linksInSession': {
one: '{n} посилання в сесії',
few: '{n} посилання в сесії',
many: '{n} посилань у сесії',
},
'artifacts.loadingSource': 'Завантаження вихідного коду...',
'artifacts.previewUnavailable': 'Перегляд недоступний',
'artifacts.sourceFailed': 'Не вдалося завантажити вихідний код: {error}',
'artifacts.latestProgress': 'Хід виконання',
'artifacts.noOutput': 'Виводу ще немає — він надійде нотаткою наступного ходу.',
'artifacts.terminal': 'Термінал',
'artifacts.directory': 'Каталог',
'artifacts.toolAndAge': '{tool} · {age} тому',
'artifacts.statusRunning': 'Виконується',
'artifacts.statusDone': 'Готово',
'artifacts.statusFailed': 'Збій',
'artifacts.statusStopped': 'Зупинено',
'artifacts.statusBusy': 'Зайнятий',
'artifacts.statusIdle': 'Вільний',
'artifacts.statusClosed': 'Закрито',
// спільна лексика, повторюється всюди, де сенс той самий
// бічна панель — розмови, смуга профілів, підпис унизу
'sidebar.newChat': 'Новий чат',
'sidebar.close': 'Закрити',
'sidebar.searchPlaceholder': 'Пошук за розмовами...',
'sidebar.results': {
one: '{n} результат',
few: '{n} результати',
many: '{n} результатів',
},
'sidebar.conversations': 'Розмови',
'sidebar.serviceSessions': 'Службові сесії',
'sidebar.pendingRecallsOnly': 'Лише із запланованим поверненням',
'sidebar.serviceSessionsLabel': 'Службові сесії (Synapse)',
'sidebar.search': 'Пошук',
'sidebar.refresh': 'Оновити',
'sidebar.loadingConversations': 'Завантаження розмов...',
'sidebar.noConversations': 'Розмов ще немає',
'sidebar.noMatch': 'Жодна розмова не відповідає фільтру',
'sidebar.pinned': 'Закріплено',
'sidebar.recallPending': 'Заплановано повернення до розмови',
'sidebar.serviceSession': 'Службова сесія (реакція Synapse)',
'sidebar.cancelRecall': 'Скасувати повернення',
'sidebar.skipNext': 'Пропустити наступний',
'sidebar.pin': 'Закріпити',
'sidebar.unpin': 'Відкріпити',
'sidebar.noAuthTitle': 'Авторизацію вимкнено',
'sidebar.localMode': 'Локальний режим',
'sidebar.localAvatar': 'локальний',
'sidebar.admin': 'Адмін',
'sidebar.openProfile': 'Відкрити профіль у gnexus-auth',
'sidebar.avatar': 'аватар',
'sidebar.logout': 'Вийти',
'sidebar.login': 'Увійти',
'common.error': 'Щось пішло не так',
'common.menu': 'Меню',
'common.save': 'Зберегти',
'common.cancel': 'Скасувати',
'common.create': 'Створити',
'common.add': 'Додати',
'common.done': 'Готово',
'common.never': 'Ніколи',
'common.always': 'Завжди',
'common.you': 'Ви',
'common.revoke': 'Відкликати',
'common.copyToClipboard': 'Копіювати в буфер обміну',
'common.copy': 'Копіювати',
'common.copied': 'Скопійовано!',
'common.download': 'Завантажити',
'common.yes': 'Так',
'common.no': 'Ні',
'common.notAvailable': 'Н/Д',
'common.result': 'Результат',
'common.liveOutput': 'Живий вивід',
'common.delete': 'Видалити',
'common.minutesAgo': {
one: '{n} хв тому',
few: '{n} хв тому',
many: '{n} хв тому',
},
'common.pullToRefresh': 'Потягніть, щоб оновити',
'common.releaseToRefresh': 'Відпустіть, щоб оновити',
'common.refreshing': 'Оновлення...',
'common.justNow': 'щойно',
// область повідомлень — з чого складається повідомлення і що робить агент
'messages.thinking': 'Роздум',
'messages.thinkingStatus': 'Розмірковує…',
'messages.plan': 'План',
'messages.arguments': 'Аргументи',
'messages.running': 'виконується',
'messages.starting': 'запуск',
'messages.runningTool': 'Виконується {tool}…',
'messages.preparingNext': 'Готує наступну дію…',
'messages.toolsCount': {
one: '{n} інструмент',
few: '{n} інструменти',
many: '{n} інструментів',
},
'messages.showAllTools': 'Показати всі інструменти',
'messages.hideOlderTools': 'Сховати попередні інструменти',
'messages.useful': 'Корисно',
'messages.notUseful': 'Не корисно',
'messages.scheduledRecall': 'Заплановане повернення',
'messages.openFile': 'Відкрити файл',
'messages.untitledContent': 'Вміст',
'messages.unknownUiComponent': 'Невідомий UI-компонент: {name}',
'messages.jsonItems': {
one: '{n} елемент',
few: '{n} елементи',
many: '{n} елементів',
},
'messages.jsonKeys': {
one: '{n} ключ',
few: '{n} ключі',
many: '{n} ключів',
},
'messages.contextSummary': 'Підсумок контексту',
'messages.compressingContext': 'Стискання контексту…',
'messages.contextCompressed': 'Контекст стиснуто',
'messages.compressionCounts': {
one: '({before} → {after} повідомлення)',
few: '({before} → {after} повідомлення)',
many: '({before} → {after} повідомлень)',
},
// колонки таблиць
'col.name': 'Назва',
'col.key': 'Ключ',
'col.created': 'Створено',
'col.lastUsed': 'Останнє використання',
'col.tool': 'Інструмент',
'col.status': 'Статус',
'col.started': 'Розпочато',
'col.finished': 'Завершено',
'col.subagentTokens': 'Токени під-агента',
'col.pid': 'PID',
'col.command': 'Команда',
'col.cwd': 'Робочий каталог',
'col.uptime': 'Час роботи',
'col.background': 'Фоновий',
'col.reason': 'Причина',
// діалоги підтвердження
'confirm.revokeKey': 'Відкликати API-ключ «{name}»? Це не можна скасувати.',
'confirm.revokeTarget': 'Відкликати ціль Synapse «{target}»? Це не можна скасувати.',
'confirm.mcpResetAdmin': 'Скинути ключ для «{server}» на спільний за замовчуванням?',
'confirm.deleteSession': 'Видалити цю розмову?',
'confirm.mcpReset':
'Видалити ваш ключ для «{server}»? Сервер перестане бути підключеним для вас.',
// сам акаунт
'profile.languageAuto': 'Авто (з акаунта)',
// Мова завжди пишеться сама собою, тому ці три рядки однакові в усіх
// словниках і перекладу не підлягають.
'profile.langEn': 'English',
'profile.langUk': 'Українська',
'profile.langRu': 'Русский',
// сповіщення-тости — заголовок, іноді рядок тексту під ним
'toast.languageSaved': 'Мову збережено',
'toast.keyCreateFailed': 'Не вдалося створити ключ',
'toast.keyRevoked': 'API-ключ відкликано',
'toast.keyRevokeFailed': 'Не вдалося відкликати ключ',
'toast.notificationsDenied': 'Дозвіл не надано',
'toast.notificationsAllowApp': 'Дозвольте сповіщення в системних налаштуваннях застосунку.',
'toast.notificationsAllowBrowser': 'Дозвольте сповіщення в налаштуваннях сайту в браузері.',
'toast.notificationsUnavailable': 'Push недоступний',
'toast.notificationsUnavailableText': 'Сервер зараз не приймає підписки на push.',
'toast.notificationsFailed': 'Помилка push',
'toast.mcpKeySaved': 'Ключ збережено для {server}',
'toast.mcpKeySaveFailed': 'Не вдалося зберегти ключ',
'toast.mcpKeyReset': 'Ключ скинуто для {server}',
'toast.mcpKeyResetFailed': 'Не вдалося скинути ключ',
'toast.synapseTargetAdded': 'Ціль додано',
'toast.synapseTargetAddFailed': 'Не вдалося додати ціль',
'toast.synapseTargetRevoked': 'Ціль відкликано',
'toast.synapseTargetRevokeFailed': 'Не вдалося відкликати ціль',
'toast.reactionsLoadFailed': 'Не вдалося завантажити налаштування реакцій',
'toast.saveFailed': 'Не вдалося зберегти',
'toast.instructionsSaved': 'Інструкції збережено',
'toast.instructionsFailed': 'Не вдалося зберегти інструкції',
'toast.toolsReloaded': {
one: 'Перезавантажено {n} інструмент',
few: 'Перезавантажено {n} інструменти',
many: 'Перезавантажено {n} інструментів',
},
'toast.toolsReloadErrors': 'Перезавантаження завершилося помилками — дивіться панель',
'toast.toolsReloadFailed': 'Не вдалося перезавантажити інструменти',
// налаштування — оболонка, далі по блоку на вкладку
'settings.title': 'Налаштування',
'settings.sectionsLabel': 'Розділи налаштувань',
'settings.tabApp': 'Застосунок',
'settings.tabAccount': 'Акаунт',
'settings.tabNotifications': 'Сповіщення',
'settings.tabSynapse': 'Synapse',
'settings.tabMcp': 'MCP',
'settings.languageToolbar': 'Мова інтерфейсу',
'settings.languageDescription':
'Стандартно Navi наслідує мову вашого акаунта gnexus-auth; вибір тут перекриває її лише для Navi. «Авто» повертає мову акаунта.',
'settings.languageDescriptionOpen':
'Вхід у цей Navi вимкнено, тому мова зберігається лише в цьому браузері.',
// налаштування — «Застосунок»
'settings.appTitle': 'Застосунок',
'settings.appDescription':
'Navi — це вебзастосунок, але він може жити на пристрої як звичайний: або встановлений у цей браузер, або як Android-застосунок, що обгортає той самий інтерфейс. Це не взаємовиключні варіанти: на телефоні варто мати Android-застосунок, а всюди інде — встановлений вебзастосунок.',
'settings.appInstallTitle': 'Встановлення в цей браузер',
'settings.appInstallText':
'Встановлення розміщує Navi в окремому вікні без адресного рядка, додає значок у док або на початковий екран і кешує інтерфейс, тож застосунок відкривається миттєво й показує сесії навіть без мережі. Воно ж вмикає сповіщення про готові відповіді — зокрема коли вкладку закрито.',
'settings.appAndroidAlert':
'Ви читаєте це всередині Android-застосунку, і він уже встановлений. Щоб оновити його, завантажте APK нижче й установіть поверх старого.',
'settings.appInstalledAlert':
'Встановлено — Navi працює в окремому вікні, а не у вкладці браузера.',
'settings.appInstallAction': 'Встановити',
'settings.appInstallHint': 'Браузер попросить підтвердити.',
'settings.appBrowserSafari': 'Safari:',
'settings.appIosTap': 'натисніть',
'settings.appIosShare': '«Поділитися», потім',
'settings.appIosAddHome': 'На початковий екран',
'settings.appIosNote':
'Сповіщення там потребують iOS 16.4 або новішої і працюють лише у встановленому застосунку, а не у вкладці Safari.',
'settings.appBrowserChrome': 'Chrome або Edge:',
'settings.appChromeClick':
'натисніть значок встановлення в правому кінці адресного рядка або відкрийте',
'settings.appChromeMenu': 'меню і виберіть',
'settings.appChromeInstall': 'Установити Navi',
'settings.appBrowserAndroid': 'Android:',
'settings.appAndroidOpen': 'відкрийте',
'settings.appAndroidMenu': 'меню і виберіть',
'settings.appAndroidInstall': 'Установити застосунок',
'settings.appAndroidAlso': '(іноді «На головний екран»)',
'settings.appHttpsBefore':
'Браузери пропонують це лише через HTTPS або на localhost — за звичайною адресою',
'settings.appHttpsAfter':
'такої можливості не з’явиться, як і офлайн-режиму зі сповіщеннями.',
'settings.appAndroidTitle': 'Android-застосунок',
'settings.appAndroidText':
'Той самий Navi у нативній оболонці. Те, чого не дасть вкладка браузера: сповіщення при заблокованому телефоні — фонова служба тримає з’єднання відкритим — плюс нативна камера й вибір фото, а посилання відкриваються у звичайному браузері. Сесії, профілі та налаштування живуть на сервері, тож застосунок і вебклієнт не розходяться.',
'settings.appApkMissing': 'APK не опубліковано на цьому сервері — зберіть його командою',
'settings.appVersion': 'Версія',
'settings.appSize': 'Розмір',
'settings.appBuilt': 'Збірка',
'settings.appDownloadApk': 'Завантажити APK',
'settings.appAndroidStep1':
'Відкрийте завантажений файл на телефоні. Android запитає, чи дозволити встановлення застосунків із цього джерела, — дозвольте.',
'settings.appAndroidStep2': 'При першому запуску застосунок запитає адресу Navi. Введіть',
'settings.appAndroidStep2Tail':
', потім увійдіть через браузер, коли він відкриється; застосунок повернеться сам.',
'settings.appAndroidStep3':
'Новіший APK встановлюється поверх старого й зберігає налаштування. Видаляти попередню версію довелося б лише в разі зміни ключа підпису.',
// налаштування — API-ключі
'settings.keysTitle': 'API-ключі',
'settings.keysCreate': 'Новий ключ',
'settings.keysDescription':
'API-ключі дозволяють безголовим клієнтам (скриптам, голосовим помічникам, пристроям IoT) автентифікуватися без OAuth у браузері.',
'settings.keysNoAuthWarning':
'Авторизацію зараз вимкнено. Будь-які створені тут ключі прив’язані до локального анонімного користувача й дають повний доступ до цього примірника Navi.',
'settings.keysLoading': 'Завантаження API-ключів',
'settings.keysEmpty': 'API-ключів ще немає. Створіть перший, щоб почати.',
'settings.keyCreateTitle': 'Створення API-ключа',
'settings.keyNamePlaceholder': 'наприклад, Розумний годинник, Скрипт автоматизації',
'settings.keyCreatedTitle': 'API-ключ створено',
'settings.keyCopyNow': 'Скопіюйте цей токен зараз — він',
'settings.keyCopyNowStrong': 'більше не буде показаний',
// налаштування — сповіщення
'settings.notificationsTitle': 'Сповіщення',
'settings.notificationsBridgeText':
'Застосунок тримає з’єднання відкритим у фоні й показує системне сповіщення, коли відповідь готова, а Navi згорнуто. Якщо закрити сам застосунок, сповіщення припиняться.',
'settings.notificationsWebText':
'Push-сповіщення дають Navi змогу повідомити вас про готову відповідь — навіть коли вкладку закрито. На кожну готову відповідь надходить одне сповіщення, але лише якщо жодне вікно Navi не відкрите на цій сесії.',
'settings.notificationsUnsupported':
'Цей браузер не підтримує web push (потрібні HTTPS, service worker і Push API). Спробуйте Chrome або свіжий Firefox.',
'settings.notificationsRowTitle': 'Push-сповіщення',
'settings.notificationsOnBackground':
'Увімкнено — фоновий режим тримає з’єднання, поки застосунок згорнуто.',
'settings.notificationsOn': 'Увімкнено — цей пристрій підписано.',
'settings.notificationsBlockedApp': 'Заблоковано в системних налаштуваннях застосунку.',
'settings.notificationsBlockedBrowser': 'Заблоковано в налаштуваннях сайту в браузері.',
'settings.notificationsOff': 'Вимкнено.',
// налаштування — MCP-сервери
'settings.mcpTitle': 'MCP-сервери',
'settings.mcpDescriptionAdmin':
'Усе, що підключено до ваших профілів. Сервер зі слотом особистого ключа працює під вашим ключем — не задавайте свій, і він далі використовуватиме спільний ключ, налаштований на цьому Navi.',
'settings.mcpDescription':
'Усе, що підключено до ваших профілів. Серверу зі слотом особистого ключа потрібен',
'settings.mcpDescriptionStrong': 'ваш власний ключ',
'settings.mcpDescriptionTail':
'— доки ви його не збережете, для вас він не підключений узагалі. Сервери без слота спільні й доступні завжди.',
'settings.mcpLoading': 'Завантаження MCP-серверів',
'settings.mcpEmpty': 'До цього Navi не підключено жодного MCP-сервера в жодному профілі.',
'settings.mcpKeySet':
'Особистий ключ збережено {date} — використовується замість спільного ({location}).',
'settings.mcpKeyAbsentAdmin':
'Особистого ключа немає — використовується спільний ключ із конфігурації ({location}).',
'settings.mcpKeyAbsent': 'Особистого ключа немає — цей сервер для вас не підключено.',
'settings.mcpNoSlot': 'Слота особистого ключа немає — працює на спільній конфігурації.',
'settings.mcpKeyPlaceholder': '••• збережено — введіть новий ключ, щоб замінити',
'settings.mcpKeyPlaceholderNew': 'Вставте ваш ключ',
'settings.mcpReset': 'Скинути на спільний',
// налаштування — доставки Synapse
'settings.synapseTargetsTitle': 'Доставки Synapse',
'settings.synapseTargetAdd': 'Додати ціль',
'settings.synapseTargetsDescription':
'Доставки з хаба сповіщень GNEXUS Synapse надходять на вебхук цього Navi й перевіряються за особистим секретом цілі. Створіть ціль в адмін-панелі Synapse, потім зареєструйте її тут, щоб Navi приймав її доставки.',
'settings.synapseTargetsLoading': 'Завантаження цілей',
'settings.synapseTargetsEmpty':
'Жодної цілі Synapse не зареєстровано. Додайте її, щоб почати приймати доставки.',
'settings.synapseTargetColRef': 'Ідентифікатор цілі',
'settings.synapseTargetAddTitle': 'Додавання цілі Synapse',
'settings.synapseTargetRefPlaceholder': 'наприклад, navi-main (як в адмін-панелі Synapse)',
'settings.synapseTargetSecret': 'Секрет доставки',
'settings.synapseTargetSecretPlaceholder': 's2s-секрет цілі Synapse',
'settings.synapseTargetHintBefore': 'В адмін-панелі Synapse створіть ціль, що вказує на',
'settings.synapseTargetHintAfter':
'цього Navi, і вставте її секрет тут. Navi використовує його, щоб переконатися, що доставки справді надійшли із Synapse.',
// налаштування — реакції Synapse
'settings.reactionsTitle': 'Реакції Synapse',
'settings.reactionsDescription':
'Коли надходить подія GNEXUS Synapse, Navi може відреагувати сам: диспетчер обирає профіль за вашими інструкціями, робота йде у прихованій службовій сесії, а переглянути її потім можна через перемикач «Службові сесії» в бічній панелі.',
'settings.reactionsNotConfigured':
'Інтеграцію із Synapse не налаштовано на цьому Navi: варіанти, що надсилають події в Synapse, вимкнено. Доставка лише в застосунок працює далі.',
'settings.reactionsLoading': 'Завантаження налаштувань реакцій',
'settings.reactionsEnable': 'Увімкнути реакції',
'settings.reactionsOn': 'Події, що надійшли, запускають фоновий прогін реакції.',
'settings.reactionsOff': 'Події приймаються й записуються в журнал, але Navi нічого не робить.',
'settings.reactionsNotify': 'Повідомляти про завершені реакції',
'settings.reactionsOnlyFailures': 'Лише збої',
'settings.reactionsPushAlways': 'Push після кожного завершеного прогону.',
'settings.reactionsPushFailures': 'Push лише коли прогін закінчився помилками.',
'settings.reactionsPushNever': 'Не надсилати push про завершення.',
'settings.reactionsTarget': 'Куди йдуть сповіщення',
'settings.reactionsTargetNote':
'Стосується інструмента notify у Navi та push про завершення реакцій.',
'settings.reactionsTargetApp': 'Лише в застосунок',
'settings.reactionsTargetAppSynapse': 'Застосунок + Synapse',
'settings.reactionsTargetSynapse': 'Лише Synapse',
'settings.reactionsInstructions': 'Інструкції для реакцій',
'settings.reactionsInstructionsNote':
'Вказівки, за якими диспетчер обирає профіль і будує задачу. Їх можете правити і ви, і Navi; кожна зміна потрапляє в історію нижче.',
'settings.reactionsInstructionsPlaceholder':
'наприклад, «Події todo з gntodo йдуть у профіль developer; спам-листи — нікуди».',
'settings.reactionsInstructionsSave': 'Зберегти інструкції',
'settings.reactionsHistory': 'Історія правок',
// налаштування — інструменти (лише для адміна)
'settings.adminToolsTitle': 'Інструменти',
'settings.adminToolsReloading': 'Перезавантаження…',
'settings.adminToolsReload': 'Перезавантажити інструменти',
'settings.adminToolsDescriptionBefore': 'Перечитує інструменти з',
'settings.adminToolsDescriptionAfter':
', провайдери контексту й перепідключає всі MCP-сервери — без перезапуску й простою. Нові інструменти можна викликати з наступного повідомлення в будь-якій сесії. Лише для адміна: підміняє набір інструментів, з яким працюють усі профілі.',
'settings.adminToolsLoaded': {
one: 'завантажено {n} інструмент',
few: 'завантажено {n} інструменти',
many: 'завантажено {n} інструментів',
},
'settings.adminToolsRegistry': '({n} у реєстрі)',
'settings.adminToolsMissing':
'називає {names} — такого інструменту немає, його виключено з усіх профілів.',
'settings.adminToolsMcpFailed': 'Перепідключення MCP не вдалося: {error}',
'settings.adminToolsMcpTools': {
one: '{n} MCP-інструмент',
few: '{n} MCP-інструменти',
many: '{n} MCP-інструментів',
},
'settings.adminToolsProviders': {
one: '{n} провайдер контексту',
few: '{n} провайдери контексту',
many: '{n} провайдерів контексту',
},
}