|
|
@@ -0,0 +1,6963 @@
|
|
|
+export default {
|
|
|
+ // Navigation
|
|
|
+ nav: {
|
|
|
+ printers: "Принтери",
|
|
|
+ archives: "Архіви",
|
|
|
+ queue: "Черга друку",
|
|
|
+ stats: "Статистика",
|
|
|
+ profiles: "Профілі",
|
|
|
+ maintenance: "Технічне обслуговування",
|
|
|
+ projects: "Проєкти",
|
|
|
+ inventory: "Філамент",
|
|
|
+ files: "Менеджер файлів",
|
|
|
+ makerworld: "MakerWorld",
|
|
|
+ notifications: "Сповіщення",
|
|
|
+ settings: "Налаштування",
|
|
|
+ system: "Система",
|
|
|
+ collapseSidebar: "Згорнути бічну панель",
|
|
|
+ expandSidebar: "Розгорнути бічну панель",
|
|
|
+ update: "Оновити",
|
|
|
+ updateAvailable: "Доступне оновлення: v{{version}}",
|
|
|
+ updateAvailableBanner: "Доступна версія {{version}}!",
|
|
|
+ viewUpdate: "Переглянути оновлення",
|
|
|
+ viewOnGithub: "Переглянути на GitHub",
|
|
|
+ keyboardShortcuts: "Комбінації клавіш (?)",
|
|
|
+ switchToLight: "Перейти у світлий режим",
|
|
|
+ switchToDark: "Перейти у темний режим",
|
|
|
+ switchToSystem: "Перейти в системний режим",
|
|
|
+ smartSwitches: "Розумні перемикачі",
|
|
|
+ logout: "Вийти",
|
|
|
+ installApp: "Встановити додаток",
|
|
|
+ installAppSuccess: "Bambuddy встановлено",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Common
|
|
|
+ common: {
|
|
|
+ save: "Зберегти",
|
|
|
+ saving: "Збереження...",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ edit: "Редагувати",
|
|
|
+ add: "Додати",
|
|
|
+ close: "Закрити",
|
|
|
+ confirm: "Підтвердити",
|
|
|
+ loading: "Завантаження...",
|
|
|
+ error: "Помилка",
|
|
|
+ errorLoading: "Помилка завантаження даних",
|
|
|
+ retry: "Повторити",
|
|
|
+ success: "Успіх",
|
|
|
+ warning: "Попередження",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ disabled: "Вимкнено",
|
|
|
+ yes: "Так",
|
|
|
+ no: "Ні",
|
|
|
+ on: "Увімкнено",
|
|
|
+ off: "Вимкнено",
|
|
|
+ all: "Усі",
|
|
|
+ none: "Жодного",
|
|
|
+ search: "Пошук",
|
|
|
+ filter: "Фільтр",
|
|
|
+ sort: "Сортувати",
|
|
|
+ refresh: "Оновити",
|
|
|
+ download: "Завантажити",
|
|
|
+ upload: "Вивантажити",
|
|
|
+ uploading: "Вивантаження...",
|
|
|
+ uploadFailed: "Не вдалося вивантажити",
|
|
|
+ actions: "Дії",
|
|
|
+ status: "Статус",
|
|
|
+ name: "Назва",
|
|
|
+ description: "Опис",
|
|
|
+ date: "Дата",
|
|
|
+ time: "Час",
|
|
|
+ hours: "год",
|
|
|
+ minutes: "хв",
|
|
|
+ seconds: "с",
|
|
|
+ days: "дн.",
|
|
|
+ enable: "Увімкнути",
|
|
|
+ disable: "Вимкнути",
|
|
|
+ permissions: "Дозволи",
|
|
|
+ noPrinters: "Принтери не налаштовані",
|
|
|
+ noData: "Немає даних",
|
|
|
+ linkNotFound: "Посилання не знайдено",
|
|
|
+ required: "Обов’язковий",
|
|
|
+ optional: "Необов’язково",
|
|
|
+ dismiss: "Закрити",
|
|
|
+ apply: "Застосувати",
|
|
|
+ reset: "Скинути",
|
|
|
+ export: "Експортувати",
|
|
|
+ import: "Імпортувати",
|
|
|
+ clear: "Очистити",
|
|
|
+ selectAll: "Вибрати всі",
|
|
|
+ deselectAll: "Зняти вибір із усіх",
|
|
|
+ noChange: "— Без змін —",
|
|
|
+ unchanged: "Без змін",
|
|
|
+ unassigned: "Не призначено",
|
|
|
+ unknown: "Невідомо",
|
|
|
+ unknownError: "Невідома помилка",
|
|
|
+ today: "Сьогодні",
|
|
|
+ tomorrow: "Завтра",
|
|
|
+ asap: "Якнайшвидше",
|
|
|
+ overdue: "Протерміновано",
|
|
|
+ now: "Зараз",
|
|
|
+ collapse: "Згорнути",
|
|
|
+ expand: "Розгорнути",
|
|
|
+ previous: "Попередній",
|
|
|
+ next: "Далі",
|
|
|
+ viewArchive: "Переглянути архів",
|
|
|
+ viewInFileManager: "Переглянути в менеджері файлів",
|
|
|
+ addedBy: "Додав {{username}}",
|
|
|
+ prints: "друків",
|
|
|
+ more: "+ ще {{count}}",
|
|
|
+ ascending: "За зростанням",
|
|
|
+ descending: "За спаданням",
|
|
|
+ back: "Назад",
|
|
|
+ copy: "Копіювати",
|
|
|
+ copied: "Скопійовано!",
|
|
|
+ printer: "Принтер",
|
|
|
+ remove: "Видалити",
|
|
|
+ type: "Тип",
|
|
|
+ print: "Друкувати",
|
|
|
+ rename: "Перейменувати",
|
|
|
+ move: "Перемістити",
|
|
|
+ create: "Створити",
|
|
|
+ duplicate: "Дублювати",
|
|
|
+ left: "Ліворуч",
|
|
|
+ right: "Праворуч",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Printers page
|
|
|
+ printers: {
|
|
|
+ title: "Принтери",
|
|
|
+ addPrinter: "Додати принтер",
|
|
|
+ addPreflight: {
|
|
|
+ checking: "Перевірка підключення...",
|
|
|
+ warning: "Деякі перевірки підключення завершилися невдало. Принтер може відображатися як офлайн. Перегляньте результати нижче, усуньте можливі проблеми або все одно збережіть принтер.",
|
|
|
+ back: "Назад",
|
|
|
+ saveAnyway: "Усе одно зберегти",
|
|
|
+ },
|
|
|
+ editPrinter: "Редагувати принтер",
|
|
|
+ deletePrinter: "Видалити принтер",
|
|
|
+ printerName: "Назва принтера",
|
|
|
+ serialNumber: "Серійний номер",
|
|
|
+ ipAddress: "IP-адреса / ім’я хоста",
|
|
|
+ accessCode: "Код доступу",
|
|
|
+ model: "Модель",
|
|
|
+ nozzleCount: "Кількість сопел",
|
|
|
+ autoArchive: "Автоархів",
|
|
|
+ status: {
|
|
|
+ available: "Доступний",
|
|
|
+ idle: "Неактивний",
|
|
|
+ printing: "Друк",
|
|
|
+ paused: "Призупинено",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ problem: "Проблема",
|
|
|
+ error: "Помилка",
|
|
|
+ finished: "Готово",
|
|
|
+ unknown: "Невідомий",
|
|
|
+ },
|
|
|
+ temperatures: {
|
|
|
+ nozzle: "Сопло",
|
|
|
+ bed: "Стіл",
|
|
|
+ chamber: "Камера",
|
|
|
+ },
|
|
|
+ heaterHistory: {
|
|
|
+ title: "Історія нагрівання",
|
|
|
+ openLabel: "Переглянути історію нагрівання",
|
|
|
+ nozzle: "Сопло",
|
|
|
+ nozzle2: "Сопло 2",
|
|
|
+ bed: "Стіл",
|
|
|
+ chamber: "Камера",
|
|
|
+ error: "Не вдалося завантажити історію",
|
|
|
+ empty: "Дані ще не записані",
|
|
|
+ },
|
|
|
+ progress: "{{percent}}% виконано",
|
|
|
+ timeRemaining: "Залишилося {{time}}",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"?",
|
|
|
+ maintenanceOk: "Технічне обслуговування в порядку",
|
|
|
+ maintenanceWarning: "{{count}} попередження",
|
|
|
+ maintenanceWarning_plural: "{{count}} попередження",
|
|
|
+ maintenanceDue: "Потрібне обслуговування: {{count}}",
|
|
|
+ maintenanceDue_plural: "Потрібне обслуговування: {{count}}",
|
|
|
+ // Sort options
|
|
|
+ sort: {
|
|
|
+ name: "Назва",
|
|
|
+ status: "Статус",
|
|
|
+ model: "Модель",
|
|
|
+ location: "Розташування",
|
|
|
+ eta: "Орієнтовне завершення",
|
|
|
+ ascending: "Сортувати за зростанням",
|
|
|
+ descending: "Сортувати за спаданням",
|
|
|
+ },
|
|
|
+ // Card size
|
|
|
+ cardSize: {
|
|
|
+ small: "Маленькі картки",
|
|
|
+ medium: "Середні картки",
|
|
|
+ large: "Великі картки",
|
|
|
+ extraLarge: "Дуже великі картки",
|
|
|
+ },
|
|
|
+ pageView: {
|
|
|
+ openCamWallPage: "Відкрити панель камер як окрему сторінку",
|
|
|
+ cards: "Картки",
|
|
|
+ camWall: "Панель камер",
|
|
|
+ },
|
|
|
+ camWall: {
|
|
|
+ page: {
|
|
|
+ tokenRejected:
|
|
|
+ "Це посилання на панель камер більше не дійсне. Можливо, термін дії токена минув або токен було відкликано.",
|
|
|
+ loadFailed: "Не вдалося завантажити список принтерів.",
|
|
|
+ },
|
|
|
+ noPrinters: "Немає принтерів для показу",
|
|
|
+ noSignal: "Немає сигналу",
|
|
|
+ live: "Наживо",
|
|
|
+ snap: "Знімок",
|
|
|
+ off: "Вимкнено",
|
|
|
+ summary: "{{live}} наживо, {{snap}} знімки, {{total}} всього",
|
|
|
+ layer: "Шар {{cur}}/{{total}}",
|
|
|
+ timeLeft: "Залишилося {{time}}",
|
|
|
+ statusMode: {
|
|
|
+ off: "Вимкнено",
|
|
|
+ compact: "Компактний",
|
|
|
+ full: "Повний",
|
|
|
+ },
|
|
|
+ settings: {
|
|
|
+ title: "Налаштування Cam Wall",
|
|
|
+ maxLive: "Максимальна кількість прямих трансляцій",
|
|
|
+ maxLiveHint: "Кількість плиток, що одночасно показують пряму трансляцію. Решта оновлюються як знімки.",
|
|
|
+ snapshotInterval: "Інтервал знімка (секунди)",
|
|
|
+ snapshotIntervalHint: "Як часто плитки без прямої трансляції отримують новий знімок.",
|
|
|
+ statusOverlay: "Накладення стану",
|
|
|
+ statusOverlayHint: "Компактний: лише значок стану. Повний: значок, прогрес, шар і час, що залишився.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // Controls
|
|
|
+ hideOffline: "Приховати офлайн-принтери",
|
|
|
+ nextAvailable: "Наступний доступний",
|
|
|
+ powerOn: "Увімкнути",
|
|
|
+ offlinePrintersWithPlugs: "Офлайн-принтери з розумними розетками",
|
|
|
+ noPrintersConfigured: "Принтерів ще не налаштовано",
|
|
|
+ search: "Пошук принтерів...",
|
|
|
+ noSearchResults: "Немає принтерів, які відповідають вашому пошуку або фільтрам",
|
|
|
+ filter: {
|
|
|
+ allStatuses: "Усі статуси",
|
|
|
+ allLocations: "Усі розташування",
|
|
|
+ },
|
|
|
+ toolbar: {
|
|
|
+ filters: "Фільтри",
|
|
|
+ view: "Вигляд",
|
|
|
+ actions: "Дії",
|
|
|
+ },
|
|
|
+ // Printer card
|
|
|
+ readyToPrint: "Готовий до друку",
|
|
|
+ external: "Зовнішній",
|
|
|
+ extL: "Ext-L",
|
|
|
+ extR: "Ext-R",
|
|
|
+ deleteArchives: "Видалити архіви друку",
|
|
|
+ noLabel: "Без етикетки",
|
|
|
+ printPreview: "Попередній перегляд",
|
|
|
+ width: "Ширина",
|
|
|
+ height: "Висота",
|
|
|
+ noObjectsFound: "Об’єктів не знайдено",
|
|
|
+ objectsLoadedOnPrintStart: "Об’єкти завантажуються після початку друку",
|
|
|
+ willBeSkipped: "Буде пропущено",
|
|
|
+ name: "Назва",
|
|
|
+ serialCannotBeChanged: "Серійний номер не можна змінити",
|
|
|
+ locationHelp: "Використовується для групування принтерів і фільтрації завдань у черзі",
|
|
|
+ // WiFi signal strength
|
|
|
+ wifiSignal: {
|
|
|
+ veryWeak: "Дуже слабкий",
|
|
|
+ weak: "Слабкий",
|
|
|
+ fair: "Задовільний",
|
|
|
+ good: "Добрий",
|
|
|
+ excellent: "Чудово",
|
|
|
+ },
|
|
|
+ // Maintenance
|
|
|
+ maintenanceUpToDate: "Усі роботи з технічного обслуговування виконано — натисніть, щоб переглянути",
|
|
|
+ // Maintenance Mode (#1476) — operator-flipped "out of service" state.
|
|
|
+ // Distinct from the scheduled-maintenance dashboard above; this one
|
|
|
+ // wraps the backend is_active flag and stops MQTT + queue dispatch.
|
|
|
+ maintenance: {
|
|
|
+ title: "На технічному обслуговуванні",
|
|
|
+ subtitle: "Роботу цього принтера призупинено: він не підключається, не отримує завдань із черги й не надсилає сповіщень.",
|
|
|
+ pillLabel: "Технічне обслуговування",
|
|
|
+ exitButton: "Вийти з технічного обслуговування",
|
|
|
+ menuEnter: "Увійти в режим обслуговування",
|
|
|
+ menuExit: "Вийти з режиму обслуговування",
|
|
|
+ toastEntered: "{{name}} зараз у режимі обслуговування",
|
|
|
+ toastExited: "{{name}} знову в мережі",
|
|
|
+ confirmMidPrintTitle: "Перевести принтер у режим обслуговування під час друку?",
|
|
|
+ confirmMidPrintMessage: "{{name}} зараз друкує. Перехід у режим обслуговування відключить MQTT і припинить відстеження перебігу друку та сповіщення про завершення цього завдання. Продовжити?",
|
|
|
+ editFieldLabel: "Режим обслуговування",
|
|
|
+ editFieldHelp: "Коли режим увімкнено, принтер відключається від MQTT, не отримує завдань із черги й не надсилає сповіщень. Використовуйте цей режим під час ремонту, паралельного розгортання Bambuddy або тимчасового виведення принтера з роботи.",
|
|
|
+ },
|
|
|
+ // Chamber light
|
|
|
+ chamberLightOn: "Увімкнути світло в камері",
|
|
|
+ chamberLightOff: "Вимкнути світло в камері",
|
|
|
+ // Files
|
|
|
+ files: "Файли",
|
|
|
+ browseFiles: "Переглянути файли принтера",
|
|
|
+ // Smart plug
|
|
|
+ autoOffAfterPrint: "Автоматичне вимкнення після друку",
|
|
|
+ autoOffExecuted: "Автоматичне вимкнення виконано — увімкніть принтер, щоб скинути стан",
|
|
|
+ // HMS errors
|
|
|
+ hmsErrors: "Помилки HMS",
|
|
|
+ viewHmsErrors: "Переглянути помилки HMS ({{count}})",
|
|
|
+ // Actions
|
|
|
+ resume: "Відновити",
|
|
|
+ pause: "Призупинити",
|
|
|
+ stop: "Зупинити",
|
|
|
+ camera: "Камера",
|
|
|
+ skipObject: "Пропустити об’єкт",
|
|
|
+ reconnect: "Підключитися знову",
|
|
|
+ forceRefresh: "Примусово оновити",
|
|
|
+ forceRefreshSuccess: "Оновлення запитано",
|
|
|
+ mqttDebug: "Налагодження MQTT",
|
|
|
+ printerInformation: "Інформація про принтер",
|
|
|
+ copyToClipboard: "Копіювати",
|
|
|
+ copied: "Скопійовано!",
|
|
|
+ state: "Стан",
|
|
|
+ wifiSignalLabel: "Сигнал Wi‑Fi",
|
|
|
+ developerMode: "Режим розробника",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ disabled: "Вимкнено",
|
|
|
+ addedOn: "Додано",
|
|
|
+ sdCard: "SD-картка",
|
|
|
+ inserted: "Вставлено",
|
|
|
+ notInserted: "Не вставлено",
|
|
|
+ totalPrintHours: "Загальний час друку",
|
|
|
+ activeNozzle: "Активне сопло: {{nozzle}}",
|
|
|
+ nozzleRack: "Стійка сопел",
|
|
|
+ nozzleDocked: "У док-станції",
|
|
|
+ nozzleMounted: "Установлено",
|
|
|
+ nozzleActive: "Активний",
|
|
|
+ nozzleIdle: "Неактивний",
|
|
|
+ nozzleDiameter: "Діаметр",
|
|
|
+ nozzleType: "Тип",
|
|
|
+ nozzleStatus: "Статус",
|
|
|
+ nozzleFilament: "Філамент",
|
|
|
+ nozzleWear: "Знос",
|
|
|
+ nozzleMaxTemp: "Макс. температура",
|
|
|
+ nozzleSerial: "Серійний номер",
|
|
|
+ nozzleHardenedSteel: "Загартована сталь",
|
|
|
+ nozzleStainlessSteel: "Нержавіюча сталь",
|
|
|
+ nozzleTungstenCarbide: "Карбід вольфраму",
|
|
|
+ nozzleFlow: "Потік",
|
|
|
+ nozzleHighFlow: "Високий потік",
|
|
|
+ nozzleStandardFlow: "Стандартний",
|
|
|
+ // Firmware
|
|
|
+ firmwareUpdate: "Оновлення прошивки",
|
|
|
+ firmwareInstructions: "На сенсорному екрані принтера перейдіть до",
|
|
|
+ firmwareNav: "Перейдіть до",
|
|
|
+ settings: "Налаштування",
|
|
|
+ firmware: "Прошивка",
|
|
|
+ // Discovery
|
|
|
+ discoverPrinters: "Знайти принтери",
|
|
|
+ searching: "Пошук...",
|
|
|
+ manualEntry: "Ввести вручну",
|
|
|
+ addFromCloud: "Додати з хмари",
|
|
|
+ // Toast messages
|
|
|
+ toast: {
|
|
|
+ printerDeleted: "Принтер видалено",
|
|
|
+ missingSpoolAssignment: "Друк на {{printer}} розпочато. Для слотів {{slots}} не призначено котушки.",
|
|
|
+ assignmentVerified: "Філамент завантажено в слот AMS {{slot}} принтера {{printer}}",
|
|
|
+ assignmentVerifiedNoKprofile: "Слот AMS {{slot}} на {{printer}} завантажено, але калібрування потоку (K-профіль) не застосовано",
|
|
|
+ assignmentNotConfirmed: "Не вдалося підтвердити призначення для слота {{slot}} на {{printer}} — перевірте слот AMS",
|
|
|
+ printerAdded: "Додано принтер",
|
|
|
+ printerUpdated: "Принтер оновлено",
|
|
|
+ failedToDelete: "Не вдалося видалити принтер",
|
|
|
+ failedToAdd: "Не вдалося додати принтер",
|
|
|
+ connectionFailedNotAdded: "Не вдалося підключитися до принтера. Перевірте IP, серійний номер і код доступу, а також підтвердьте, що режим лише для LAN увімкнено. Принтер не додано.",
|
|
|
+ failedToUpdate: "Не вдалося оновити принтер",
|
|
|
+ commandSent: "Команда надіслана",
|
|
|
+ failedToSendCommand: "Не вдалося надіслати команду",
|
|
|
+ turnedOn: "{{name}} увімкнено",
|
|
|
+ failedToPowerOn: "Не вдалося ввімкнути {{name}}",
|
|
|
+ scriptTriggered: "Сценарій запущено",
|
|
|
+ printStopped: "Друк зупинено",
|
|
|
+ printPaused: "Друк призупинено",
|
|
|
+ printResumed: "Друк відновлено",
|
|
|
+ referenceDeleted: "Еталонне зображення видалено",
|
|
|
+ detectionAreaSaved: "Область виявлення збережено",
|
|
|
+ failedToRunScript: "Не вдалося запустити сценарій",
|
|
|
+ failedToStopPrint: "Не вдалося зупинити друк",
|
|
|
+ failedToPausePrint: "Не вдалося призупинити друк",
|
|
|
+ failedToResumePrint: "Не вдалося відновити друк",
|
|
|
+ failedToControlChamberLight: "Не вдалося керувати світлом камери",
|
|
|
+ failedToSetSpeed: "Не вдалося встановити швидкість друку",
|
|
|
+ failedToUpdateSetting: "Не вдалося оновити налаштування",
|
|
|
+ failedToSkipObjects: "Не вдалося пропустити об’єкти",
|
|
|
+ failedToRereadRfid: "Не вдалося перечитати RFID",
|
|
|
+ failedToCheckPlate: "Не вдалося перевірити друкарську пластину",
|
|
|
+ failedToUpdateLabel: "Не вдалося оновити мітку",
|
|
|
+ failedToDeleteReference: "Не вдалося видалити еталонне зображення",
|
|
|
+ failedToSaveDetectionArea: "Не вдалося зберегти область виявлення",
|
|
|
+ plateCheckEnabled: "Перевірку друкарської пластини ввімкнено",
|
|
|
+ plateCheckDisabled: "Перевірку друкарської пластини вимкнено",
|
|
|
+ calibrationSaved: "Калібрування збережено!",
|
|
|
+ calibrationFailed: "Не вдалося виконати калібрування",
|
|
|
+ rfidRereadInitiated: "Розпочато повторне зчитування RFID",
|
|
|
+ loadInitiated: "Завантаження філаменту...",
|
|
|
+ unloadInitiated: "Вивантаження філаменту...",
|
|
|
+ failedToLoad: "Не вдалося завантажити філамент",
|
|
|
+ failedToUnload: "Не вдалося вивантажити філамент",
|
|
|
+ },
|
|
|
+ // Connection status
|
|
|
+ connection: {
|
|
|
+ connected: "Підключено",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ },
|
|
|
+ plateStatus: {
|
|
|
+ markCleared: "Позначити друкарську пластину як очищену",
|
|
|
+ cleared: "Друкарську пластину очищено",
|
|
|
+ notCleared: "Друкарську пластину не очищено",
|
|
|
+ inUse: "Друкарська пластина використовується",
|
|
|
+ },
|
|
|
+ // Queue info
|
|
|
+ queue: {
|
|
|
+ inQueue: "У черзі: {{count}}",
|
|
|
+ inQueue_plural: "У черзі: {{count}}",
|
|
|
+ },
|
|
|
+ // Controls section
|
|
|
+ controls: "Елементи керування",
|
|
|
+ // RFID
|
|
|
+ rfid: {
|
|
|
+ reread: "Перечитати RFID",
|
|
|
+ },
|
|
|
+ // AMS load/unload (#891)
|
|
|
+ ams: {
|
|
|
+ load: "Завантажити",
|
|
|
+ unload: "Вивантажити",
|
|
|
+ },
|
|
|
+ bedJog: {
|
|
|
+ limitWarning: "Під час ручного переміщення межі ходу не контролюються: через помилку прошивки Bambu віддалені команди ігнорують програмні кінцеві обмежувачі. Переміщуйте стіл обережно, щоб уникнути зіткнення.",
|
|
|
+ title: "Керування переміщенням",
|
|
|
+ bed: "Стіл",
|
|
|
+ step: "Крок (мм)",
|
|
|
+ up: "Перемістити стіл угору",
|
|
|
+ down: "Перемістити стіл униз",
|
|
|
+ disabledWhilePrinting: "Вимкнено під час друку",
|
|
|
+ notHomedTitle: "Принтер не відкалібровано за початковою позицією",
|
|
|
+ notHomedMessage: "Після останнього друку принтер не виконував пошук початкової позиції. Для безпечного позиціювання спочатку запустіть автопозиціювання: принтер припаркує друкувальну головку та визначить початкові координати X, Y і Z. Або продовжте переміщення без нього — програмні кінцеві обмежувачі буде обійдено.",
|
|
|
+ homeZ: "Запустити автопозиціювання",
|
|
|
+ moveAnyway: "Усе одно перемістити",
|
|
|
+ homingStarted: "Виконується автопозиціювання принтера…",
|
|
|
+ },
|
|
|
+ // Permissions
|
|
|
+ permission: {
|
|
|
+ noAdd: "Ви не маєте дозволу додавати принтери",
|
|
|
+ noEdit: "Ви не маєте дозволу редагувати принтери",
|
|
|
+ noDelete: "Ви не маєте дозволу на видалення принтерів",
|
|
|
+ noControl: "Ви не маєте дозволу керувати принтерами",
|
|
|
+ noFiles: "Ви не маєте дозволу на доступ до файлів принтера",
|
|
|
+ noAmsRfid: "Ви не маєте дозволу на повторне читання AMS RFID",
|
|
|
+ noSmartPlugControl: "Ви не маєте дозволу керувати розумними розетками",
|
|
|
+ noCamera: "У вас немає дозволу на перегляд камер",
|
|
|
+ },
|
|
|
+ // Add/Edit modal
|
|
|
+ modal: {
|
|
|
+ addTitle: "Додати принтер",
|
|
|
+ editTitle: "Редагувати принтер",
|
|
|
+ myPrinter: "Мій принтер",
|
|
|
+ selectModel: "Вибрати модель…",
|
|
|
+ locationGroup: "Розташування/група (необов’язково)",
|
|
|
+ locationPlaceholder: "наприклад, майстерня, офіс, підвал",
|
|
|
+ autoArchiveLabel: "Автоматичне архівування завершених роздруківок",
|
|
|
+ fromPrinterSettings: "З налаштувань принтера",
|
|
|
+ modelOptional: "Модель (необов’язково)",
|
|
|
+ saveChanges: "Зберегти зміни",
|
|
|
+ },
|
|
|
+ // Skip objects
|
|
|
+ skipObjects: {
|
|
|
+ tooltip: "Пропустити об’єкти",
|
|
|
+ onlyWhilePrinting: "Пропустити об’єкти (лише під час друку)",
|
|
|
+ requiresMultiple: "Пропустити об’єкти (потрібно щонайменше 2 об’єкти)",
|
|
|
+ title: "Пропустити об’єкти",
|
|
|
+ matchIdsInfo: "Зіставте ідентифікатори з дисплеєм принтера",
|
|
|
+ printerShowsIds: "На екрані принтера показано ідентифікатори об’єктів на друкарській пластині",
|
|
|
+ skipSelected: "Пропустити вибране",
|
|
|
+ skipping: "Пропускання…",
|
|
|
+ noObjectsSelected: "Об’єкти не вибрано",
|
|
|
+ selectObjectsToSkip: "Виберіть об’єкти, які потрібно пропустити під час поточного друку",
|
|
|
+ skipped: "пропущено",
|
|
|
+ objectsSkipped: "Об’єкти пропущено",
|
|
|
+ activeCount: "Активних: {{count}}",
|
|
|
+ waitForLayer: "Щоб пропускати об’єкти, дочекайтеся другого шару або пізніше (зараз шар {{layer}})",
|
|
|
+ skip: "Пропустити",
|
|
|
+ confirmTitle: "Пропустити об’єкт?",
|
|
|
+ confirmMessage: "Ви впевнені, що бажаєте пропустити \"{{name}}\"? Це неможливо скасувати.",
|
|
|
+ confirmAllMessage: "Вибрано всі об’єкти, що залишилися. Це зупинить завдання друку. Продовжити?",
|
|
|
+ confirmMultipleMessage: "Пропустити вибрані об’єкти ({{count}})? Цю дію неможливо скасувати.",
|
|
|
+ },
|
|
|
+ // Confirm modals
|
|
|
+ confirm: {
|
|
|
+ deleteTitle: "Видалити принтер",
|
|
|
+ deleteMessage: "Ви впевнені, що хочете видалити \"{{name}}\"? Це призведе до видалення всіх налаштувань підключення.",
|
|
|
+ deleteArchivesNote: "Усю історію друку для цього принтера буде остаточно видалено.",
|
|
|
+ keepArchivesNote: "Історія друку буде збережена, але більше не пов’язана з цим принтером.",
|
|
|
+ stopTitle: "Зупинити друк",
|
|
|
+ stopMessage: "Ви впевнені, що хочете зупинити поточний друк на \"{{name}}\"? Це призведе до скасування завдання друку.",
|
|
|
+ stopButton: "Зупинити друк",
|
|
|
+ pauseTitle: "Призупинити друк",
|
|
|
+ pauseMessage: "Ви впевнені, що хочете призупинити поточний друк на \"{{name}}\"?",
|
|
|
+ pauseButton: "Призупинити друк",
|
|
|
+ resumeTitle: "Відновити друк",
|
|
|
+ resumeMessage: "Ви впевнені, що бажаєте відновити друк на \"{{name}}\"?",
|
|
|
+ resumeButton: "Відновити друк",
|
|
|
+ powerOnTitle: "Увімкнути принтер",
|
|
|
+ powerOnMessage: "Увімкнути живлення принтера «{{name}}»?",
|
|
|
+ powerOnButton: "Увімкнути",
|
|
|
+ powerOffTitle: "Вимкнути принтер",
|
|
|
+ powerOffMessage: "Вимкнути живлення принтера «{{name}}»?",
|
|
|
+ powerOffWarning: "УВАГА: «{{name}}» зараз друкує. Вимкнення живлення перерве друк і може пошкодити принтер. Продовжити?",
|
|
|
+ powerOffButton: "Вимкнути",
|
|
|
+ haToggleTitle: "Перемкнути \"{{name}}\"",
|
|
|
+ haToggleMessage: "Перемкнути об’єкт Home Assistant {{entity}}? Це може вимкнути живлення, якщо воно зараз увімкнено.",
|
|
|
+ haToggleWarning: "УВАГА: \"{{name}}\" зараз друкується! Перемикання {{entity}} може вимкнути живлення та перервати друк. Продовжити?",
|
|
|
+ haToggleButton: "Перемкнути",
|
|
|
+ },
|
|
|
+ // Bulk actions
|
|
|
+ bulk: {
|
|
|
+ select: "Вибрати",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ selectByLocation: "Вибрати за розташуванням",
|
|
|
+ selected: "Вибрано: {{count}}",
|
|
|
+ actions: {
|
|
|
+ stop: "Зупинити",
|
|
|
+ pause: "Призупинити",
|
|
|
+ resume: "Відновити",
|
|
|
+ clearPlate: "Очистити стіл",
|
|
|
+ clearHMS: "Очистити сповіщення",
|
|
|
+ },
|
|
|
+ confirm: {
|
|
|
+ stopTitle: "Зупинити завдання друку: {{count}}",
|
|
|
+ stopMessage: "Активний друк буде скасовано на вибраних принтерах ({{count}}). Цю дію неможливо скасувати.",
|
|
|
+ stopButton: "Зупинити все",
|
|
|
+ pauseTitle: "Призупинити завдання друку: {{count}}",
|
|
|
+ pauseMessage: "Активний друк буде призупинено на вибраних принтерах ({{count}}).",
|
|
|
+ pauseButton: "Призупинити все",
|
|
|
+ clearPlateTitle: "Очистити столи ({{count}})",
|
|
|
+ clearPlateMessage: "Столи вибраних принтерів ({{count}}) буде позначено очищеними, що може запустити завдання з черги.",
|
|
|
+ clearPlateButton: "Очистити все",
|
|
|
+ },
|
|
|
+ success: "Дію «{{action}}» виконано на принтерах: {{count}}",
|
|
|
+ partial: "{{succeeded}} вдалося, {{failed}} не вдалося",
|
|
|
+ noneApplicable: "Немає вибраних принтерів у належному стані для цієї дії",
|
|
|
+ selectByState: "Вибрати за станом",
|
|
|
+ },
|
|
|
+ // Discovery
|
|
|
+ discovery: {
|
|
|
+ title: "Знайти принтери",
|
|
|
+ searching: "Пошук...",
|
|
|
+ scanning: "Сканування...",
|
|
|
+ scanProgress: "Сканування... {{scanned}}/{{total}}",
|
|
|
+ foundPrinters: "Знайдено принтерів: {{count}}",
|
|
|
+ noPrintersFound: "Принтерів не знайдено",
|
|
|
+ noPrintersFoundSubnet: "Немає принтерів у вказаній підмережі.",
|
|
|
+ noPrintersFoundNetwork: "У мережі не знайдено принтерів.",
|
|
|
+ allConfigured: "Усі знайдені принтери вже налаштовані.",
|
|
|
+ alreadyAdded: "Вже додано",
|
|
|
+ select: "Вибрати",
|
|
|
+ manualEntry: "Ввести вручну",
|
|
|
+ addFromCloud: "Додати з хмари",
|
|
|
+ subnetToScan: "Підмережа для сканування",
|
|
|
+ dockerNote: "Виявлено Docker. Введіть підмережу принтера в нотації CIDR. У docker-compose.yml потрібен параметр network_mode: host.",
|
|
|
+ scanSubnet: "Сканувати підмережу для принтерів",
|
|
|
+ discoverNetwork: "Знайти принтери в мережі",
|
|
|
+ scanningSubnet: "Сканування підмережі для принтерів Bambu...",
|
|
|
+ scanningNetwork: "Сканування мережі...",
|
|
|
+ serialRequired: "Потрібен серійний номер",
|
|
|
+ unknown: "Невідомий",
|
|
|
+ failedToStart: "Не вдалося запустити пошук",
|
|
|
+ customSubnetOption: "Спеціальна підмережа...",
|
|
|
+ customSubnetLabel: "Спеціальна підмережа (CIDR)",
|
|
|
+ customSubnetNote: "Укажіть власну підмережу, якщо принтер перебуває в іншій мережі, ніж сервер. Порти FTP (990) і MQTT (8883) мають бути доступні через маршрутизатор.",
|
|
|
+ },
|
|
|
+ // AMS Drying
|
|
|
+ drying: {
|
|
|
+ start: "Почати сушіння",
|
|
|
+ stop: "Зупинити сушіння",
|
|
|
+ temperature: "Температура",
|
|
|
+ duration: "Тривалість",
|
|
|
+ hours: "години",
|
|
|
+ timeRemaining: "Залишилося {{time}}",
|
|
|
+ active: "Сушіння",
|
|
|
+ targetSummary: "{{filament}} при {{temp}}°C",
|
|
|
+ notSupported: "Сушіння не підтримується",
|
|
|
+ powerRequired: "Підключіть адаптер живлення AMS, щоб увімкнути сушіння",
|
|
|
+ startingDrying: "Запуск сушіння…",
|
|
|
+ toastCommandSent: "Надіслано команду сушіння",
|
|
|
+ toastStopped: "Сушіння зупинено",
|
|
|
+ toastNotStarted: "Принтер прийняв команду, але AMS так і не почав сушити. Перевірте, чи підключено адаптер живлення AMS і чи принтер неактивний.",
|
|
|
+ screenOnly: "Сушінням AMS на цьому принтері можна керувати лише з екрана принтера (обмеження Bambu)",
|
|
|
+ stoppingDrying: "Припинення сушіння...",
|
|
|
+ rotateTray: "Обертати котушку під час сушіння",
|
|
|
+ rotateUnavailableReason: "Недоступно: філамент із цього слота AMS завантажено в інструментальну головку. Котушка заблокована подавальною трубкою й не може обертатися. Спочатку вивантажте філамент.",
|
|
|
+ },
|
|
|
+ // AMS Filament Backup status badge (printer-wide auto-switch to another spool)
|
|
|
+ amsBackup: {
|
|
|
+ titleOn: "Резервне перемикання філаменту AMS увімкнено. Натисніть, щоб вимкнути.",
|
|
|
+ titleOff: "Резервне перемикання філаменту AMS вимкнено. Натисніть, щоб увімкнути.",
|
|
|
+ titleUnknown: "Стан резервної котушки AMS недоступний на цьому принтері.",
|
|
|
+ toastEnabled: "Резервну котушку AMS ввімкнено",
|
|
|
+ toastDisabled: "Резервну котушку AMS вимкнено",
|
|
|
+ modalTitle: "Резервне перемикання філаменту AMS",
|
|
|
+ modalHelp: "Коли філамент в активному слоті закінчується, принтер по черзі перемикається на слоти з таким самим профілем і кольором у вказаному порядку.",
|
|
|
+ modalNoSlots: "Філамент не завантажено.",
|
|
|
+ modalNoPairs: "Немає резервних пар — немає двох слотів з однаковим профілем і кольором філаменту.",
|
|
|
+ extruderRightShort: "Р",
|
|
|
+ extruderLeftShort: "Л",
|
|
|
+ stateOn: "Увімкнено",
|
|
|
+ stateOff: "Вимкнено",
|
|
|
+ stateUnknown: "Не підтримується на цьому принтері",
|
|
|
+ },
|
|
|
+ activeJobSlot: {
|
|
|
+ title: "Цей слот відповідає філаменту {{n}} в поточному завданні друку",
|
|
|
+ ariaLabel: "Слот {{n}} поточного завдання друку",
|
|
|
+ },
|
|
|
+ expectedSlot: {
|
|
|
+ title: "Принтер очікує філамент у цьому слоті",
|
|
|
+ ariaLabel: "Очікуваний слот для філаменту {{n}}",
|
|
|
+ label: "{{ams}} · Слот {{slot}}",
|
|
|
+ external: "Зовнішня котушка",
|
|
|
+ },
|
|
|
+ // Filaments section
|
|
|
+ filaments: "Філаменти",
|
|
|
+ // Camera
|
|
|
+ openCameraOverlay: "Відкрити накладання камери",
|
|
|
+ openCameraWindow: "Відкрити камеру в новому вікні",
|
|
|
+ // Firmware
|
|
|
+ firmwareUpdateAvailable: "Доступне оновлення прошивки: {{current}} → {{latest}}",
|
|
|
+ firmwareUpToDate: "Прошивка {{version}} актуальна",
|
|
|
+ firmwareUpdateButton: "Оновити",
|
|
|
+ // Plate detection
|
|
|
+ plateDetection: {
|
|
|
+ noPermission: "Ви не маєте дозволу на оновлення принтерів",
|
|
|
+ enabledClick: "Перевірку друкарської пластини ввімкнено — натисніть, щоб вимкнути",
|
|
|
+ disabledClick: "Перевірку друкарської пластини вимкнено — натисніть, щоб увімкнути",
|
|
|
+ manageCalibration: "Керувати калібруванням перевірки пластини",
|
|
|
+ calibrationRequired: "Потрібне калібрування",
|
|
|
+ calibrationInstructions: "Переконайтеся, що робоча пластина <strong>повністю порожня</strong>, а потім натисніть «Калібрувати».",
|
|
|
+ calibrationDescription: "Під час калібрування створюється еталонне зображення порожньої пластини. Наступні перевірки порівнюватимуть з ним зображення, щоб виявляти об’єкти.",
|
|
|
+ calibrationTip: "<strong>Порада:</strong> Ви можете зберегти до 5 калібрувань для різних пластин. Під час перевірки система автоматично використовує найкращий збіг.",
|
|
|
+ plateEmpty: "Друкарська пластина виглядає порожньою",
|
|
|
+ objectsDetected: "На пластині виявлено об’єкти",
|
|
|
+ confidence: "Впевненість",
|
|
|
+ difference: "Різниця",
|
|
|
+ analysisPreview: "Попередній перегляд аналізу:",
|
|
|
+ analysisLegend: "Зелена рамка = зона виявлення, червона накладка = відмінності від калібрування",
|
|
|
+ savedReferences: "Збережені еталонні зображення ({{count}}/{{max}})",
|
|
|
+ deleteReference: "Видалити еталонне зображення",
|
|
|
+ labelPlaceholder: "Мітка...",
|
|
|
+ clickToEdit: "{{label}} - Натисніть, щоб редагувати",
|
|
|
+ clickToAddLabel: "Натисніть, щоб додати мітку",
|
|
|
+ },
|
|
|
+ // Speed
|
|
|
+ speed: {
|
|
|
+ title: "Швидкість друку",
|
|
|
+ silent: "Тихий (50%)",
|
|
|
+ standard: "Стандарт (100%)",
|
|
|
+ sport: "Sport (124%)",
|
|
|
+ ludicrous: "Ludicrous (166%)",
|
|
|
+ },
|
|
|
+ airduct: {
|
|
|
+ title: "Режим повітропроводу",
|
|
|
+ cooling: "Охолодження",
|
|
|
+ heating: "Опалення",
|
|
|
+ },
|
|
|
+ noSdCard: "Немає SD-картки",
|
|
|
+ door: {
|
|
|
+ open: "Відчинено",
|
|
|
+ closed: "Закрито",
|
|
|
+ },
|
|
|
+ // Fans
|
|
|
+ fans: {
|
|
|
+ partCooling: "Вентилятор охолодження моделі",
|
|
|
+ auxiliary: "Допоміжний вентилятор",
|
|
|
+ chamber: "Камерний вентилятор",
|
|
|
+ },
|
|
|
+ // HMS errors
|
|
|
+ clickToViewHmsErrors: "Натисніть, щоб переглянути помилки HMS",
|
|
|
+ aiDetection: {
|
|
|
+ safe: "Безпечно",
|
|
|
+ warning: "Попередження",
|
|
|
+ failure: "Помилка",
|
|
|
+ idle: "Очікування",
|
|
|
+ tooltip: "Виявлення помилок за допомогою ШІ: {{status}} (оцінка {{score}}) — натисніть, щоб переглянути деталі",
|
|
|
+ tooltipIdle: "Виявлення помилок за допомогою ШІ ввімкнено — моніторинг почнеться з наступним друком — натисніть, щоб переглянути деталі",
|
|
|
+ modalTitle: "Виявлення помилок за допомогою ШІ — {{name}}",
|
|
|
+ currentStatus: "Стан",
|
|
|
+ score: "Оцінка",
|
|
|
+ framesAnalyzed: "Проаналізовано кадрів",
|
|
|
+ idleHint: "Зараз жоден друк не відстежується. Моніторинг автоматично почнеться з наступним друком.",
|
|
|
+ lastError: "Остання помилка",
|
|
|
+ openSettings: "Відкрити налаштування",
|
|
|
+ },
|
|
|
+ estimatedCompletion: "Орієнтовний час виконання",
|
|
|
+ plateNumber: "Пластина {{number}}",
|
|
|
+ slotOptions: "Опції слота",
|
|
|
+ // AMS hover popup
|
|
|
+ amsPopup: {
|
|
|
+ friendlyName: "Назва AMS",
|
|
|
+ friendlyNamePlaceholder: "наприклад, Основна AMS",
|
|
|
+ serialNumber: "Серійний номер",
|
|
|
+ firmwareVersion: "Прошивка",
|
|
|
+ save: "Зберегти",
|
|
|
+ clear: "Очистити",
|
|
|
+ noEditPermission: "Ви не маєте дозволу на перейменування одиниць AMS.",
|
|
|
+ },
|
|
|
+ // Firmware modal
|
|
|
+ firmwareModal: {
|
|
|
+ title: "Оновлення прошивки",
|
|
|
+ titleUpToDate: "Інформація про прошивку",
|
|
|
+ currentVersion: "Поточна:",
|
|
|
+ latestVersion: "Найновіша:",
|
|
|
+ releaseNotes: "Примітки до випуску",
|
|
|
+ checkingPrereqs: "Перевірка передумов...",
|
|
|
+ sdCardReady: "SD-картка готова. Натисніть нижче, щоб вивантажити на неї прошивку.",
|
|
|
+ uploadedSuccess: "Прошивку вивантажено на картку SD!",
|
|
|
+ applyInstructions: "Щоб застосувати оновлення до свого принтера:",
|
|
|
+ step1: "На сенсорному екрані принтера перейдіть до <strong>Налаштування</strong>",
|
|
|
+ step2: "Перейдіть до розділу <strong>Прошивка</strong>",
|
|
|
+ step3: "Виберіть <strong>Оновити з SD-картки</strong>",
|
|
|
+ step4: "Оновлення займе 10-20 хвилин",
|
|
|
+ done: "Готово",
|
|
|
+ starting: "Запуск…",
|
|
|
+ uploadFirmware: "Вивантажити прошивку",
|
|
|
+ uploadFailed: "Не вдалося почати вивантаження: {{error}}",
|
|
|
+ uploadedToast: "Прошивку вивантажено! Запустіть оновлення з екрана принтера.",
|
|
|
+ availableVersions: "Доступні версії",
|
|
|
+ usable: "Можна використовувати",
|
|
|
+ unavailable: "Недоступна",
|
|
|
+ installed: "Установлена",
|
|
|
+ newerBadge: "новіший",
|
|
|
+ olderBadge: "старіша",
|
|
|
+ currentBadge: "поточна",
|
|
|
+ },
|
|
|
+ accessCodePlaceholder: "Залиште порожнім, щоб не змінювати",
|
|
|
+ // ROI editor
|
|
|
+ roi: {
|
|
|
+ title: "Область виявлення (ROI)",
|
|
|
+ xStart: "Початок X",
|
|
|
+ yStart: "Початок Y",
|
|
|
+ width: "Ширина",
|
|
|
+ height: "Висота",
|
|
|
+ instruction: "Відрегулюйте область виявлення, щоб сфокусуватися на робочій пластині. Зелене поле в попередньому перегляді показує поточну область.",
|
|
|
+ },
|
|
|
+ developerModeWarning: "Режим розробника LAN не ввімкнено на: {{names}}. Деякі функції можуть не працювати.",
|
|
|
+ howToEnable: "Як увімкнути",
|
|
|
+ incompatibleFile: "Цей файл нарізано для {{slicedFor}}, а модель цього принтера — {{printerModel}}",
|
|
|
+ dropNotPrintable: "Можна роздрукувати лише файли .gcode і .gcode.3mf.",
|
|
|
+ dropToPrint: "Відпустіть для друку",
|
|
|
+ cannotPrint: "Принтер зайнятий",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Archives page
|
|
|
+ archives: {
|
|
|
+ title: "Архіви друку",
|
|
|
+ no3mfBanner: {
|
|
|
+ title: "Деякі нещодавні роздруківки не вдалося заархівувати з мініатюрами",
|
|
|
+ body: "Слайсер не залишив файл .gcode.3mf на SD-картці принтера, тому Bambuddy не зміг отримати мініатюру або метадані слайсера. Зазвичай це стається, коли в слайсері вимкнено параметр «Зберігати надіслані файли на зовнішньому накопичувачі» (вкладка «Пристрій» у Bambu Studio або OrcaSlicer).",
|
|
|
+ docsLink: "Переглянути крок 4 встановлення",
|
|
|
+ dismissLabel: "Відхилити це повідомлення",
|
|
|
+ },
|
|
|
+ searchPlaceholder: "Пошук в архівах...",
|
|
|
+ filterByPrinter: "Фільтрувати за принтером",
|
|
|
+ filterByStatus: "Фільтрувати за статусом",
|
|
|
+ sortBy: "Сортувати за",
|
|
|
+ sortNewest: "Спочатку найновіші",
|
|
|
+ sortOldest: "Спочатку найстаріші",
|
|
|
+ sortName: "Назва",
|
|
|
+ sortDuration: "Тривалість",
|
|
|
+ sortLargest: "Спочатку найбільші",
|
|
|
+ sortSmallest: "Спочатку найменші",
|
|
|
+ sortSize: "Розмір",
|
|
|
+ noArchives: "Архіви не знайдено",
|
|
|
+ noArchivesSearch: "Жоден архів не відповідає вашому пошуку",
|
|
|
+ originalPrintNotVisible: "Оригінальний друк не відображається — спробуйте очистити фільтри",
|
|
|
+ noArchivesYet: "Архівів ще немає",
|
|
|
+ prints: "друків",
|
|
|
+ pagination: {
|
|
|
+ showing: "Показано",
|
|
|
+ to: "до",
|
|
|
+ of: "з",
|
|
|
+ show: "Показати",
|
|
|
+ page: "Сторінка",
|
|
|
+ all: "Усі",
|
|
|
+ },
|
|
|
+ loadingArchives: "Завантаження архівів...",
|
|
|
+ releaseToUpload: "Відпустіть, щоб вивантажити",
|
|
|
+ showAll: "Показати все",
|
|
|
+ showFavoritesOnly: "Показати лише вибране",
|
|
|
+ gridView: "Вигляд сітки",
|
|
|
+ listView: "Перегляд списку",
|
|
|
+ calendarView: "Перегляд календаря",
|
|
|
+ logView: "Журнал друку",
|
|
|
+ manageTags: "Керування тегами",
|
|
|
+ showFailedPrints: "Показати невдалі друки",
|
|
|
+ hideFailedPrints: "Приховати невдалі друки",
|
|
|
+ hideDuplicates: "Приховати дублікати",
|
|
|
+ viewOriginalPrint: "Клацніть, щоб переглянути оригінальний друк (#{{id}})",
|
|
|
+ printTime: "Час друку",
|
|
|
+ filamentUsed: "Використано філаменту",
|
|
|
+ cost: "Вартість",
|
|
|
+ preview: "Попередній перегляд",
|
|
|
+ deleteArchive: "Видалити архів",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити цей архів?",
|
|
|
+ favorite: "В обраному",
|
|
|
+ unfavorite: "Видалити з вибраного",
|
|
|
+ viewDetails: "Переглянути деталі",
|
|
|
+ status: {
|
|
|
+ completed: "Завершено",
|
|
|
+ failed: "Невдало",
|
|
|
+ stopped: "Зупинено",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ source3mfAttached: "Вихідний файл 3MF долучено: {{filename}}",
|
|
|
+ failedUploadSource3mf: "Не вдалося вивантажити вихідний файл 3MF",
|
|
|
+ source3mfRemoved: "Вихідний файл 3MF видалено",
|
|
|
+ failedRemoveSource3mf: "Не вдалося видалити вихідний файл 3MF",
|
|
|
+ f3dAttached: "F3D долучено: {{filename}}",
|
|
|
+ failedUploadF3d: "Не вдалося вивантажити F3D",
|
|
|
+ f3dRemoved: "F3D видалено",
|
|
|
+ failedRemoveF3d: "Не вдалося видалити F3D",
|
|
|
+ timelapseAttached: "Додано покадрову зйомку: {{filename}}",
|
|
|
+ timelapseAlreadyAttached: "Таймлапс уже долучено",
|
|
|
+ noMatchingTimelapse: "Відповідного таймлапсу не знайдено",
|
|
|
+ failedScanTimelapse: "Не вдалося відсканувати покадрову зйомку",
|
|
|
+ failedAttachTimelapse: "Не вдалося долучити таймлапс",
|
|
|
+ timelapseRemoved: "Таймлапс видалено",
|
|
|
+ failedRemoveTimelapse: "Не вдалося видалити таймлапс",
|
|
|
+ timelapseUploaded: "Таймлапс вивантажено: {{filename}}",
|
|
|
+ failedUploadTimelapse: "Не вдалося вивантажити таймлапс",
|
|
|
+ archiveDeleted: "Архів видалено",
|
|
|
+ failedDeleteArchive: "Не вдалося видалити архів",
|
|
|
+ addedToFavorites: "Додано до обраних",
|
|
|
+ removedFromFavorites: "Видалено з вибраного",
|
|
|
+ projectUpdated: "Проєкт оновлений",
|
|
|
+ failedUpdateProject: "Не вдалося оновити проєкт",
|
|
|
+ linkCopied: "Посилання скопійовано в буфер обміну",
|
|
|
+ failedCopyLink: "Не вдалося скопіювати посилання",
|
|
|
+ photoDeleted: "Фото видалено",
|
|
|
+ failedDeletePhoto: "Не вдалося видалити фото",
|
|
|
+ failedDeleteArchives: "Не вдалося видалити архіви",
|
|
|
+ failedUpdateFavorites: "Не вдалося оновити вибране",
|
|
|
+ exportDownloaded: "Експорт завантажено",
|
|
|
+ exportFailed: "Помилка експорту",
|
|
|
+ },
|
|
|
+ menu: {
|
|
|
+ print: "Друкувати",
|
|
|
+ openInBambuStudio: "Відкрити у слайсері",
|
|
|
+ slice: "Нарізати",
|
|
|
+ externalLink: "Зовнішнє посилання",
|
|
|
+ viewOnMakerWorld: "Переглянути на MakerWorld",
|
|
|
+ preview3d: "3D попередній перегляд",
|
|
|
+ viewTimelapse: "Переглянути таймлапс",
|
|
|
+ scanForTimelapse: "Знайти таймлапс",
|
|
|
+ uploadTimelapse: "Вивантажити таймлапс",
|
|
|
+ removeTimelapse: "Видалити таймлапс",
|
|
|
+ downloadSource3mf: "Завантажити вихідний файл 3MF",
|
|
|
+ uploadSource3mf: "Вивантажити вихідний файл 3MF",
|
|
|
+ replaceSource3mf: "Замінити вихідний файл 3MF",
|
|
|
+ removeSource3mf: "Видалити вихідний файл 3MF",
|
|
|
+ uploadF3d: "Вивантажити F3D",
|
|
|
+ replaceF3d: "Замінити F3D",
|
|
|
+ downloadF3d: "Завантажити F3D",
|
|
|
+ removeF3d: "Видалити F3D",
|
|
|
+ download: "Завантажити",
|
|
|
+ copyDownloadLink: "Копіювати посилання для завантаження",
|
|
|
+ qrCode: "QR-код",
|
|
|
+ viewPhotos: "Переглянути фото",
|
|
|
+ viewPhotosCount: "Переглянути фото ({{count}})",
|
|
|
+ projectPage: "Сторінка проєкту",
|
|
|
+ addToFavorites: "Додати в обране",
|
|
|
+ removeFromFavorites: "Видалити з вибраного",
|
|
|
+ edit: "Редагувати",
|
|
|
+ printLog: "Журнал друку",
|
|
|
+ goToProject: "Перейти до проєкту: {{name}}",
|
|
|
+ addToProject: "Додати до проєкту",
|
|
|
+ removeFromProject: "Видалити з проєкту",
|
|
|
+ loading: "Завантаження...",
|
|
|
+ noProjectsAvailable: "Немає доступних проєктів",
|
|
|
+ searchProjects: "Пошук проєктів…",
|
|
|
+ select: "Вибрати",
|
|
|
+ deselect: "Зняти вибір",
|
|
|
+ delete: "Видалити",
|
|
|
+ },
|
|
|
+ permission: {
|
|
|
+ noReprint: "Ви не маєте дозволу на повторний друк цього архіву",
|
|
|
+ noAddToQueue: "Ви не маєте дозволу на додавання в чергу",
|
|
|
+ noUpdateArchives: "Ви не маєте дозволу на оновлення архівів",
|
|
|
+ noUploadFiles: "Ви не маєте дозволу на вивантаження файлів",
|
|
|
+ noDownload: "У вас немає дозволу на завантаження архівів",
|
|
|
+ noCopyLink: "Ви не маєте дозволу копіювати посилання для завантаження",
|
|
|
+ noDelete: "Ви не маєте дозволу на видалення цього архіву",
|
|
|
+ noEdit: "Ви не маєте дозволу редагувати цей запис",
|
|
|
+ noCreate: "Ви не маєте дозволу на створення архівів",
|
|
|
+ },
|
|
|
+ platePicker: {
|
|
|
+ title: "Вибрати пластину для попереднього перегляду",
|
|
|
+ hint: "Цей архів містить кілька пластин. Виберіть одну, щоб відкрити її в переглядачі G-коду.",
|
|
|
+ plateLabel: "Пластина {{index}}",
|
|
|
+ objectCount: "Об’єктів: {{count}}",
|
|
|
+ objectCount_plural: "Об’єктів: {{count}}",
|
|
|
+ noGcode: "Цей архів не містить нарізаного G-коду для перегляду. Спочатку відкрийте його в Bambu Studio та виконайте нарізання.",
|
|
|
+ },
|
|
|
+ card: {
|
|
|
+ previousPlate: "Попередня друкарська пластина",
|
|
|
+ nextPlate: "Наступна пластина",
|
|
|
+ plateNumber: "Пластина {{index}}",
|
|
|
+ moreOptions: "Клацніть правою кнопкою миші, щоб отримати додаткові параметри",
|
|
|
+ addToFavorites: "Додати в обране",
|
|
|
+ removeFromFavorites: "Видалити з вибраного",
|
|
|
+ cancelled: "скасовано",
|
|
|
+ failed: "не вдалося",
|
|
|
+ duplicate: "дублікат",
|
|
|
+ duplicateTitle: "Ця модель була надрукована раніше",
|
|
|
+ openSource3mf: "Відкрити вихідний файл 3MF у Bambu Studio (клацніть правою кнопкою, щоб переглянути додаткові дії)",
|
|
|
+ downloadF3d: "Завантажити файл дизайну Fusion 360",
|
|
|
+ viewTimelapse: "Переглянути сповільнену зйомку",
|
|
|
+ viewPhoto: "Переглянути 1 фото",
|
|
|
+ viewPhotos: "Переглянути фото: {{count}}",
|
|
|
+ openFolder: "Відкрити папку: {{name}}",
|
|
|
+ slicedFile: "Нарізаний файл - готовий до друку",
|
|
|
+ sourceFile: "Лише вихідний файл – зіставлення AMS недоступне",
|
|
|
+ gcode: "G-КОД",
|
|
|
+ source: "ДЖЕРЕЛО",
|
|
|
+ project: "Проєкт: {{name}}",
|
|
|
+ runsBadge: "Друків: {{count}}",
|
|
|
+ runsBadgeTitle: "Усього друків: {{count}} — успішних: {{successful}}, невдалих: {{failed}}. Натисніть, щоб переглянути повний журнал друку.",
|
|
|
+ estimated: "Приблизно: {{time}}",
|
|
|
+ actual: "Фактично: {{time}}",
|
|
|
+ accuracy: "Точність: {{percent}}%",
|
|
|
+ filament: "{{weight}} г",
|
|
|
+ layer: "{{count}} шар",
|
|
|
+ layers: "Шарів: {{count}}",
|
|
|
+ object: "{{count}} об’єкт",
|
|
|
+ objects: "Об’єктів: {{count}}",
|
|
|
+ slicedFor: "Нарізаний для {{model}}",
|
|
|
+ uploadedBy: "Вивантажив",
|
|
|
+ noPermissionReprint: "Ви не маєте дозволу на передрук",
|
|
|
+ noFileForReprint: "Файл 3MF недоступний: його не вдалося завантажити з принтера під час збереження запису про друк",
|
|
|
+ noPermissionEdit: "Ви не маєте прав на редагування архівів",
|
|
|
+ noPermissionDelete: "Ви не маєте дозволу на видалення архівів",
|
|
|
+ openInBambuStudio: "Відкрити у слайсері",
|
|
|
+ openInBambuStudioToSlice: "Відкрити у слайсері для нарізання",
|
|
|
+ slice: "Нарізати",
|
|
|
+ externalLink: "Зовнішнє посилання",
|
|
|
+ makerWorld: "MakerWorld: {{designer}}",
|
|
|
+ viewProject: "Переглянути проєкт",
|
|
|
+ noExternalLink: "Немає зовнішнього посилання",
|
|
|
+ preview3d: "3D попередній перегляд",
|
|
|
+ download: "Завантажити",
|
|
|
+ edit: "Редагувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ },
|
|
|
+ runLog: {
|
|
|
+ title: "Журнал друку",
|
|
|
+ modalTitle: "Журнал друку — {{name}}",
|
|
|
+ modalTitleFallback: "цей архів",
|
|
|
+ empty: "Для цього архіву ще не зареєстровано жодної події друку.",
|
|
|
+ col: {
|
|
|
+ date: "Дата",
|
|
|
+ status: "Статус",
|
|
|
+ duration: "Тривалість",
|
|
|
+ filament: "Філамент",
|
|
|
+ cost: "Вартість",
|
|
|
+ },
|
|
|
+ status: {
|
|
|
+ completed: "Виконано",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ cancelled: "Скасовано",
|
|
|
+ stopped: "Зупинено",
|
|
|
+ skipped: "Пропущено",
|
|
|
+ printing: "Друк",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ modal: {
|
|
|
+ deleteArchive: "Видалити архів",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"? Цю дію не можна скасувати.",
|
|
|
+ deleteButton: "Видалити",
|
|
|
+ deletePurgeStats: "Також видалити цей друк із швидкої статистики (філамент, час, вартість, енергія)",
|
|
|
+ deleteQueueItemsWarning: "Елементи черги {{count}}, пов’язані з цим архівом, також буде видалено.",
|
|
|
+ deleteBlockedByPrinting: "Неможливо видалити — наразі друкуються елементи черги {{count}}. Спочатку зупиніть друк, а потім повторіть спробу.",
|
|
|
+ removeSource3mf: "Видалити джерело 3MF",
|
|
|
+ removeSource3mfConfirm: "Ви впевнені, що хочете видалити вихідний файл 3MF з \"{{name}}\"? Це призведе до видалення вихідного файлу проєкту слайсера.",
|
|
|
+ removeButton: "Видалити",
|
|
|
+ removeF3d: "Видалити F3D",
|
|
|
+ removeF3dConfirm: "Ви впевнені, що хочете видалити файл дизайну Fusion 360 із \"{{name}}\"?",
|
|
|
+ removeTimelapse: "Видалити Timelapse",
|
|
|
+ removeTimelapseConfirm: "Ви впевнені, що хочете видалити покадрове відео з \"{{name}}\"?",
|
|
|
+ timelapse: "{{name}} — таймлапс",
|
|
|
+ selectTimelapse: "Вибрати таймлапс",
|
|
|
+ selectTimelapseDesc: "Автоматичний збіг не знайдено. Виберіть покадрову зйомку для цього друку:",
|
|
|
+ deleteArchives: "Видалити архіви",
|
|
|
+ deleteArchivesConfirm: "Видалити вибрані архіви ({{count}})? Цю дію неможливо скасувати.",
|
|
|
+ deleteCount: "Видалити {{count}}",
|
|
|
+ },
|
|
|
+ page: {
|
|
|
+ title: "Архіви",
|
|
|
+ printsCount: "Показано друків: {{filtered}} із {{total}}",
|
|
|
+ dropFilesHere: "Перетягніть файли .3mf сюди",
|
|
|
+ releaseToUpload: "Відпустіть, щоб вивантажити",
|
|
|
+ only3mfSupported: "Підтримуються лише файли .3mf.",
|
|
|
+ close: "Закрити",
|
|
|
+ selected: "Вибрано {{count}}.",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ tags: "Теги",
|
|
|
+ project: "Проєкт",
|
|
|
+ favorite: "В обраному",
|
|
|
+ delete: "Видалити",
|
|
|
+ toggledFavorites: "Оновлено вибране для архівів: {{count}}",
|
|
|
+ failedUpdateFavorites: "Не вдалося оновити вибране",
|
|
|
+ archivesDeleted: "Видалено архівів: {{count}}",
|
|
|
+ failedDeleteArchives: "Не вдалося видалити архіви",
|
|
|
+ photoDeleted: "Фото видалено",
|
|
|
+ failedDeletePhoto: "Не вдалося видалити фото",
|
|
|
+ },
|
|
|
+ list: {
|
|
|
+ name: "Назва",
|
|
|
+ printer: "Принтер",
|
|
|
+ date: "Дата",
|
|
|
+ size: "Розмір",
|
|
|
+ actions: "Дії",
|
|
|
+ hasTimelapse: "Має таймлапс",
|
|
|
+ },
|
|
|
+ log: {
|
|
|
+ date: "Дата",
|
|
|
+ printName: "Назва друку",
|
|
|
+ printer: "Принтер",
|
|
|
+ user: "Користувач",
|
|
|
+ status: "Статус",
|
|
|
+ duration: "Тривалість",
|
|
|
+ filament: "Філамент",
|
|
|
+ allPrinters: "Усі принтери",
|
|
|
+ allUsers: "Усі користувачі",
|
|
|
+ allStatuses: "Усі статуси",
|
|
|
+ cancelled: "Скасовано",
|
|
|
+ skipped: "Пропущено",
|
|
|
+ dateFrom: "Від",
|
|
|
+ dateTo: "До",
|
|
|
+ noEntries: "Записів журналу друку не знайдено",
|
|
|
+ showing: "Показано {{count}} з {{total}} записів",
|
|
|
+ rowsPerPage: "Рядків",
|
|
|
+ page: "Сторінка",
|
|
|
+ prev: "Назад",
|
|
|
+ next: "Далі",
|
|
|
+ clearLog: "Очистити журнал",
|
|
|
+ clearLogTitle: "Очистити журнал друку",
|
|
|
+ clearLogConfirm: "Усі записи журналу друку буде остаточно видалено. Архіви та елементи черги залишаться без змін. Цю дію неможливо скасувати. Продовжити?",
|
|
|
+ clearLogButton: "Очистити все",
|
|
|
+ cleared: "Очищено записів журналу: {{count}}",
|
|
|
+ clearFailed: "Не вдалося очистити журнал друку",
|
|
|
+ deleteEntryTitle: "Видалити запис журналу друку",
|
|
|
+ deleteEntryConfirm: "Запис буде видалено з журналу, а пов’язані з ним філамент, час і вартість більше не враховуватимуться у швидкій статистиці. Відповідний архів, якщо він є, залишиться без змін. Цю дію неможливо скасувати.",
|
|
|
+ entryDeleted: "Запис журналу друку видалено",
|
|
|
+ entryDeleteFailed: "Не вдалося видалити запис журналу друку",
|
|
|
+ editEntryTitle: "Редагувати запис журналу друку",
|
|
|
+ editEntryDescription: "Класифікуйте цей запуск друку. Віджет «Аналіз невдач» групує дані за цими значеннями, тому зміни одразу відобразяться у статистиці.",
|
|
|
+ entryUpdated: "Запис журналу друку оновлено",
|
|
|
+ entryUpdateFailed: "Не вдалося оновити запис журналу друку",
|
|
|
+ statuses: {
|
|
|
+ completed: "Виконано",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ stopped: "Зупинено",
|
|
|
+ cancelled: "Скасовано",
|
|
|
+ skipped: "Пропущено",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Sticky upload-progress toast (#1625 follow-up — restored the
|
|
|
+ // legacy bg-dispatch toast UI for the scheduler-driven dispatch path).
|
|
|
+ // Strings mirror 0b43ac0d's backgroundDispatch namespace.
|
|
|
+ dispatchToast: {
|
|
|
+ untitled: "Завдання друку",
|
|
|
+ startingPrints: "Початок друку",
|
|
|
+ progressSummary: "{{complete}}/{{total}} завершено • Обробка: {{processing}}",
|
|
|
+ expandDetails: "Розгорнути подробиці надсилання",
|
|
|
+ collapseDetails: "Згорнути відомості про відправлення",
|
|
|
+ awaitingPrinter: "Очікування принтера…",
|
|
|
+ status: {
|
|
|
+ processing: "Обробка",
|
|
|
+ completed: "Виконано",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ },
|
|
|
+ failed: {
|
|
|
+ generic: "Не вдалося відправити",
|
|
|
+ upload_failed: "Не вдалося вивантажити файл на принтер",
|
|
|
+ start_command_failed: "Принтер відхилив команду запуску",
|
|
|
+ },
|
|
|
+ dismiss: "Відхилити",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Pipeline Runs dashboard (#1425 PR C). Lists every Slicer Pipeline run
|
|
|
+ // across every pipeline with status + pipeline filters and pagination.
|
|
|
+ // Each row expands to per-copy job status; partial-failure runs get a
|
|
|
+ // Retry-failed button; in-flight runs get a Cancel button.
|
|
|
+ pipelineRuns: {
|
|
|
+ title: "Запуски конвеєрів",
|
|
|
+ loading: "Завантаження…",
|
|
|
+ empty: "Запусків конвеєрів ще немає.",
|
|
|
+ filter: {
|
|
|
+ pipeline: "Конвеєр",
|
|
|
+ status: "Статус",
|
|
|
+ target: "Ціль",
|
|
|
+ all: "Усі",
|
|
|
+ allPipelines: "Усі конвеєри",
|
|
|
+ allStatus: "Усі статуси",
|
|
|
+ allTargets: "Усі цілі",
|
|
|
+ clear: "Очистити фільтри",
|
|
|
+ noMatches: "Жоден запуск не відповідає поточним фільтрам.",
|
|
|
+ },
|
|
|
+ totalCount_one: "{{n}} запуск",
|
|
|
+ totalCount_other: "Запусків: {{n}}",
|
|
|
+ copies: "Копій: {{n}}",
|
|
|
+ failedCount: "Невдалих: {{n}}",
|
|
|
+ copyN: "Копія {{n}}",
|
|
|
+ retryFailed: "Повторити невдалі",
|
|
|
+ retryOf: "повтор запуску №{{n}}",
|
|
|
+ pagination: "{{start}}–{{end}} з {{total}}",
|
|
|
+ cancelledByUser: "Скасовано користувачем",
|
|
|
+ toast: {
|
|
|
+ cancelled: "Запуск скасовано",
|
|
|
+ cancelFailed: "Не вдалося скасувати",
|
|
|
+ retryStarted: "Розпочато повторну спробу",
|
|
|
+ retryFailed: "Не вдалося розпочати повторну спробу",
|
|
|
+ cleared: "Видалено запусків: {{n}}",
|
|
|
+ clearFailed: "Не вдалося очистити",
|
|
|
+ },
|
|
|
+ clearLog: "Очистити журнал",
|
|
|
+ clearConfirmTitle: "Очистити журнал?",
|
|
|
+ clearConfirmBody: "Видалити всі завершені, невдалі, скасовані та частково невдалі запуски конвеєрів? Активні запуски буде збережено. Цю дію неможливо скасувати.",
|
|
|
+ clearConfirmAction: "Очистити",
|
|
|
+ jobStatus: {
|
|
|
+ pending: "в очікуванні",
|
|
|
+ awaiting_printer: "в очікуванні принтера",
|
|
|
+ queued: "в черзі",
|
|
|
+ printing: "друк",
|
|
|
+ completed: "завершено",
|
|
|
+ failed: "не вдалося",
|
|
|
+ cancelled: "скасовано",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Queue page
|
|
|
+ queue: {
|
|
|
+ title: "Черга друку",
|
|
|
+ subtitle: "Плануйте завдання друку та керуйте ними",
|
|
|
+ filamentShort: {
|
|
|
+ rowBadge: "Недостатньо філаменту для призначеної котушки",
|
|
|
+ rowTooltip: "Планувальник відправлення позначив цей елемент. Натисніть «Запустити», щоб переглянути нестачу для кожного слота й вирішити, чи друкувати попри неї.",
|
|
|
+ confirmTitle: "Недостатня кількість філаменту",
|
|
|
+ confirmIntro: "На призначеній котушці недостатньо філаменту принаймні для одного слота. Усе одно друкувати?",
|
|
|
+ lineItem: "Слот {{slot}}: потрібно {{required}} г, {{remaining}} г залишилося",
|
|
|
+ unknown: "невідомо",
|
|
|
+ printAnyway: "Усе одно друкувати",
|
|
|
+ },
|
|
|
+ // Print modal
|
|
|
+ editQueueItem: "Редагувати елемент черги",
|
|
|
+ selectAllPlates: "Вибрати всі пластини ({{count}})",
|
|
|
+ deselectAll: "Зняти вибір із усіх",
|
|
|
+ printQueued: "Друк у черзі",
|
|
|
+ printQueuedWillStartWhenIdle: "Розпочнеться, коли принтер звільниться",
|
|
|
+ itemsQueued: "Додано до черги: {{count}}",
|
|
|
+ sending: "Надсилання...",
|
|
|
+ sendingProgress: "Надсилання {{current}}/{{total}}...",
|
|
|
+ adding: "Додавання...",
|
|
|
+ addingProgress: "Додавання {{current}}/{{total}}...",
|
|
|
+ savingProgress: "Збереження {{current}}/{{total}}...",
|
|
|
+ clearQueue: "Очистити чергу",
|
|
|
+ clearHistory: "Очистити історію",
|
|
|
+ emptyQueue: "Черга порожня",
|
|
|
+ position: "Позиція",
|
|
|
+ scheduledTime: "Запланований час",
|
|
|
+ moveUp: "Перемістити вгору",
|
|
|
+ moveDown: "Перемістити вниз",
|
|
|
+ startNow: "Почати зараз",
|
|
|
+ printingInProgress: "Виконується друк...",
|
|
|
+ viewArchive: "Переглянути архів",
|
|
|
+ viewInFileManager: "Переглянути в менеджері файлів",
|
|
|
+ itemCount: "Елементів: {{count}}",
|
|
|
+ itemCount_plural: "Елементів: {{count}}",
|
|
|
+ dragToReorder: "Перетягніть, щоб змінити порядок (лише для завдань «Якнайшвидше»)",
|
|
|
+ reorderHint: "Позиція впливає лише на завдання «Якнайшвидше». Заплановані завдання запускаються у встановлений час.",
|
|
|
+ sjf: {
|
|
|
+ label: "SJF",
|
|
|
+ tooltip: "SJF (спочатку найкоротше завдання) — планувальник надає пріоритет коротшим завданням друку",
|
|
|
+ },
|
|
|
+ addedBy: "Додав {{name}}",
|
|
|
+ nextInQueue: "Наступний у черзі",
|
|
|
+ clearPlateSuccess: "Пластина очищена — готова до наступного друку",
|
|
|
+ plateNumber: "Пластина {{index}}",
|
|
|
+ // Batch / quantity
|
|
|
+ quantity: "Кількість",
|
|
|
+ quantityHint: "Буде створено елементів черги: {{count}}",
|
|
|
+ activeBatches: "Активні партії",
|
|
|
+ batchProgress: "{{completed}} з {{total}} завершено",
|
|
|
+ cancelBatch: "Скасувати решту",
|
|
|
+ batchCancelled: "Решту елементів партії скасовано",
|
|
|
+ cancelBatchConfirmTitle: "Скасувати партію",
|
|
|
+ cancelBatchConfirmMessage: "Скасувати всі елементи цієї партії, що ще очікують?",
|
|
|
+ batch: {
|
|
|
+ defaultName: "Партія",
|
|
|
+ label: "Елементів: {{count}}",
|
|
|
+ label_plural: "Елементів: {{count}}",
|
|
|
+ pendingCount: "Очікують: {{count}}",
|
|
|
+ pendingCount_plural: "Очікують: {{count}}",
|
|
|
+ expand: "Розгорнути партію",
|
|
|
+ collapse: "Згорнути партію",
|
|
|
+ groupAsBatch: "Згрупувати в партію…",
|
|
|
+ groupAsBatchDescription: "Об’єднати вибрані елементи ({{count}}) в одну згортану партію.",
|
|
|
+ nameLabel: "Назва партії",
|
|
|
+ namePlaceholder: "напр. П’ятничні подарунки",
|
|
|
+ create: "Створити партію",
|
|
|
+ ungroup: "Розгрупувати",
|
|
|
+ ungroupConfirmTitle: "Розгрупувати партію?",
|
|
|
+ ungroupConfirmMessage: "Елементи залишатимуться в черзі, але більше не групуватимуться разом.",
|
|
|
+ dragGroup: "Перетягнути групу",
|
|
|
+ },
|
|
|
+ // Tabs
|
|
|
+ tabs: {
|
|
|
+ queue: "Черга",
|
|
|
+ history: "Історія",
|
|
|
+ timeline: "Хронологія",
|
|
|
+ pipelines: "Запуски конвеєрів",
|
|
|
+ },
|
|
|
+ // Layout toggle on the Queue tab — distinct from the sort dropdown
|
|
|
+ // (those control order; these control whether items render as one flat
|
|
|
+ // list or grouped under per-printer section headers).
|
|
|
+ layout: {
|
|
|
+ flatList: "Список",
|
|
|
+ byPrinter: "За принтером",
|
|
|
+ groupByPrinter: "Групувати за принтером",
|
|
|
+ },
|
|
|
+ // History tab empty state
|
|
|
+ history: {
|
|
|
+ emptyTitle: "Історії ще немає",
|
|
|
+ emptyDescription: "Тут відображатимуться завершені, скасовані та невдалі роздруківки.",
|
|
|
+ showMore: "Показати більше",
|
|
|
+ showingCount: "Показано {{shown}} з {{total}}",
|
|
|
+ },
|
|
|
+ // Drag ghost label when multi-dragging
|
|
|
+ dragGhost: {
|
|
|
+ multiCount: "Елементів: {{count}}",
|
|
|
+ batch: "{{name}} (копія {{count}})",
|
|
|
+ batch_plural: "{{name}} ({{count}} копій)",
|
|
|
+ },
|
|
|
+ // Sections
|
|
|
+ sections: {
|
|
|
+ currentlyPrinting: "Наразі друкується",
|
|
|
+ queued: "У черзі",
|
|
|
+ history: "Історія",
|
|
|
+ },
|
|
|
+ // Status
|
|
|
+ status: {
|
|
|
+ pending: "В очікуванні",
|
|
|
+ waiting: "Очікування",
|
|
|
+ printing: "Друк",
|
|
|
+ paused: "Призупинено",
|
|
|
+ completed: "Виконано",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ skipped: "Пропущено",
|
|
|
+ cancelled: "Скасовано",
|
|
|
+ },
|
|
|
+ // Summary cards
|
|
|
+ summary: {
|
|
|
+ printing: "Друк",
|
|
|
+ queued: "У черзі",
|
|
|
+ totalTime: "Загальний час у черзі",
|
|
|
+ totalWeight: "Загальна вага черги",
|
|
|
+ history: "Історія",
|
|
|
+ },
|
|
|
+ // Filters
|
|
|
+ filter: {
|
|
|
+ allPrinters: "Усі принтери",
|
|
|
+ unassigned: "Не призначено",
|
|
|
+ allStatus: "Усі статуси",
|
|
|
+ allLocations: "Усі розташування",
|
|
|
+ any: "Будь-який",
|
|
|
+ },
|
|
|
+ // Sort
|
|
|
+ sort: {
|
|
|
+ byPosition: "Сортувати за позицією",
|
|
|
+ byName: "Сортувати за назвою",
|
|
|
+ byPrinter: "Сортувати за принтером",
|
|
|
+ bySchedule: "Сортувати за розкладом",
|
|
|
+ byDate: "Сортувати за датою",
|
|
|
+ ascendingOldest: "За зростанням (найстаріші спочатку)",
|
|
|
+ descendingNewest: "За спаданням (спочатку найновіші)",
|
|
|
+ },
|
|
|
+ // Badges
|
|
|
+ badges: {
|
|
|
+ staged: "Очікує ручного запуску",
|
|
|
+ requiresPrevious: "Потрібне успішне завершення попереднього завдання",
|
|
|
+ autoPowerOff: "Автоматичне вимкнення",
|
|
|
+ gcodeInjection: "G-код",
|
|
|
+ },
|
|
|
+ // Empty state
|
|
|
+ empty: {
|
|
|
+ title: "Друк не заплановано",
|
|
|
+ description: "Заплануйте друк зі сторінки «Архіви» за допомогою параметра «Розклад» у контекстному меню або перетягніть файли, щоб почати.",
|
|
|
+ },
|
|
|
+ // Time
|
|
|
+ time: {
|
|
|
+ asap: "Якнайшвидше",
|
|
|
+ overdue: "Прострочено",
|
|
|
+ now: "Зараз",
|
|
|
+ lessThanMinute: "Менше ніж за хвилину",
|
|
|
+ inMinutes: "Через {{count}} хв",
|
|
|
+ inHours: "Через {{count}} год",
|
|
|
+ },
|
|
|
+ // Actions
|
|
|
+ actions: {
|
|
|
+ startPrint: "Розпочати друк",
|
|
|
+ stopPrint: "Зупинити друк",
|
|
|
+ requeue: "Поставити в чергу знову",
|
|
|
+ },
|
|
|
+ // Bulk edit
|
|
|
+ bulkEdit: {
|
|
|
+ title: "Редагувати {{count}} елемент",
|
|
|
+ title_plural: "Редагувати елементи ({{count}})",
|
|
|
+ description: "Лише змінені параметри будуть застосовані до вибраних елементів.",
|
|
|
+ printer: "Принтер",
|
|
|
+ noChange: "— Без змін —",
|
|
|
+ queueOptions: "Параметри черги",
|
|
|
+ staged: "Очікує ручного запуску",
|
|
|
+ autoPowerOff: "Автоматичне вимкнення після друку",
|
|
|
+ requirePrevious: "Вимагати успішного завершення попереднього завдання",
|
|
|
+ printOptions: "Параметри друку",
|
|
|
+ bedLevelling: "Вирівнювання столу",
|
|
|
+ flowCalibration: "Калібрування потоку",
|
|
|
+ vibrationCalibration: "Калібрування вібрації",
|
|
|
+ layerInspection: "Перевірка першого шару",
|
|
|
+ timelapse: "Таймлапс",
|
|
|
+ useAms: "Використовувати AMS",
|
|
|
+ nozzleOffsetCali: "Калібрування зсуву сопла",
|
|
|
+ applyChanges: "Застосувати зміни",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ deselectAll: "Зняти вибір із усіх",
|
|
|
+ selected: "Вибрано: {{count}}",
|
|
|
+ editSelected: "Редагувати вибране",
|
|
|
+ cancelSelected: "Скасувати вибране",
|
|
|
+ },
|
|
|
+ // Confirmations
|
|
|
+ confirm: {
|
|
|
+ cancelTitle: "Скасувати запланований друк",
|
|
|
+ cancelMessage: "Ви впевнені, що бажаєте скасувати \"{{name}}\"?",
|
|
|
+ stopTitle: "Зупинити друк",
|
|
|
+ stopMessage: "Ви впевнені, що бажаєте зупинити поточний друк \"{{name}}\"? Це призведе до скасування завдання друку на принтері.",
|
|
|
+ removeTitle: "Видалити з історії",
|
|
|
+ removeMessage: "Ви впевнені, що бажаєте видалити \"{{name}}\" з історії черги?",
|
|
|
+ clearHistoryTitle: "Очистити історію",
|
|
|
+ clearHistoryMessage: "Видалити всі елементи з історії ({{count}})?",
|
|
|
+ cancelButton: "Скасувати друк",
|
|
|
+ stopButton: "Зупинити друк",
|
|
|
+ thisPrint: "цей друк",
|
|
|
+ thisItem: "цей елемент",
|
|
|
+ },
|
|
|
+ // Toast messages
|
|
|
+ toast: {
|
|
|
+ cancelled: "Пункт черги скасовано",
|
|
|
+ cancelFailed: "Не вдалося скасувати елемент",
|
|
|
+ removed: "Елемент черги видалено",
|
|
|
+ removeFailed: "Не вдалося видалити елемент",
|
|
|
+ stopped: "Друк зупинено",
|
|
|
+ stopFailed: "Не вдалося зупинити друк",
|
|
|
+ released: "Друк відправлено в чергу",
|
|
|
+ startFailed: "Не вдалося почати друк",
|
|
|
+ reorderFailed: "Не вдалося змінити порядок черги",
|
|
|
+ historyCleared: "Очищено елементів історії: {{count}}",
|
|
|
+ clearHistoryFailed: "Не вдалося очистити історію",
|
|
|
+ updateFailed: "Не вдалося оновити елементи",
|
|
|
+ bulkCancelled: "Скасовано елементів: {{count}}",
|
|
|
+ bulkCancelFailed: "Не вдалося скасувати елементи",
|
|
|
+ batchCreated: "Партію «{{name}}» створено",
|
|
|
+ batchCreateFailed: "Не вдалося створити партію",
|
|
|
+ batchUngrouped: "Розгруповано елементів: {{count}}",
|
|
|
+ batchUngroupFailed: "Не вдалося розгрупувати партію",
|
|
|
+ resumedAfterFailure: "Відновлено чергу — {{restored}} завдання відновлено до стану очікування",
|
|
|
+ resumeAfterFailureFailed: "Не вдалося відновити чергу",
|
|
|
+ },
|
|
|
+ resumeAfterFailure: {
|
|
|
+ banner: "{{printer}} заблоковано через помилку попереднього друку — завдання {{count}} пропущено",
|
|
|
+ bannerHint: "Усуньте проблему з принтером, а потім відновіть чергу, щоб повернути пропущені завдання й зняти блокування.",
|
|
|
+ button: "Відновити після невдачі",
|
|
|
+ confirmTitle: "Відновити чергу після помилки?",
|
|
|
+ confirmMessage: "Повернути пропущені завдання ({{count}}) для {{printer}} до стану очікування та зняти блокування після невдалого попереднього друку? Переконайтеся, що принтер готовий.",
|
|
|
+ },
|
|
|
+ // Timeline view
|
|
|
+ timeline: {
|
|
|
+ listView: "Список",
|
|
|
+ timelineView: "Хронологія",
|
|
|
+ unassigned: "Не призначено",
|
|
|
+ noData: "На цей день немає запланованих роздруківок",
|
|
|
+ nothingCommitted: "У цьому часовому проміжку немає підтверджених розкладів. Завдання з ручним запуском, завдання в очікуванні та завдання «Якнайшвидше» для вільних принтерів тут не показано. Установіть запланований час або запустіть відкладене завдання.",
|
|
|
+ allDoneBy: "Орієнтовне завершення всіх друків: {{time}}",
|
|
|
+ staged: "Очікує ручного запуску",
|
|
|
+ filterAll: "Показати все",
|
|
|
+ filterPrinting: "Друк",
|
|
|
+ filterQueued: "У черзі",
|
|
|
+ time: {
|
|
|
+ anyMoment: "будь-якої миті",
|
|
|
+ minutesLeft: "Залишилося {{minutes}} хв",
|
|
|
+ hoursLeft: "Залишилося {{hours}} год",
|
|
|
+ hoursMinutesLeft: "Залишилося {{hours}} год {{minutes}} хв",
|
|
|
+ },
|
|
|
+ day: {
|
|
|
+ previous: "Попередній день",
|
|
|
+ next: "Наступний день",
|
|
|
+ today: "Сьогодні",
|
|
|
+ },
|
|
|
+ // Rolling-24h Gantt window
|
|
|
+ window: {
|
|
|
+ back12h: "Назад 12 годин",
|
|
|
+ forward12h: "Уперед на 12 годин",
|
|
|
+ now: "Зараз",
|
|
|
+ },
|
|
|
+ printerColumnHeader: "Принтер",
|
|
|
+ },
|
|
|
+ // Permissions
|
|
|
+ permissions: {
|
|
|
+ noStopPrint: "Ви не маєте дозволу зупиняти друк",
|
|
|
+ noStartPrint: "Ви не маєте дозволу розпочинати друк",
|
|
|
+ noEdit: "Ви не маєте дозволу редагувати цей елемент черги",
|
|
|
+ noCancel: "Ви не маєте дозволу скасувати цей елемент черги",
|
|
|
+ noRequeue: "Ви не маєте дозволу повторно ставити елементи в чергу",
|
|
|
+ noRemove: "Ви не маєте дозволу на видалення цього елемента черги",
|
|
|
+ noClearHistory: "Ви не маєте дозволу очистити всю історію",
|
|
|
+ noEditItems: "Ви не маєте дозволу редагувати елементи черги",
|
|
|
+ noCancelItems: "Ви не маєте дозволу на скасування елементів черги",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Statistics page
|
|
|
+ stats: {
|
|
|
+ title: "Статистика",
|
|
|
+ subtitle: "Перетягніть віджети, щоб змінити порядок. Натисніть значок ока, щоб приховати.",
|
|
|
+ overview: "Огляд",
|
|
|
+ totalPrints: "Загальна кількість друків",
|
|
|
+ successRate: "Коефіцієнт успішності",
|
|
|
+ totalPrintTime: "Загальний час друку",
|
|
|
+ printTime: "Час друку",
|
|
|
+ totalFilament: "Загальна кількість використаного філаменту",
|
|
|
+ filamentUsed: "Використано філаменту",
|
|
|
+ filamentCost: "Вартість філаменту",
|
|
|
+ totalCost: "Загальна вартість",
|
|
|
+ energyUsed: "Використана енергія",
|
|
|
+ energyCost: "Вартість енергії",
|
|
|
+ energyWarmingUpTooltip: "Відстеження енергії все ще збирає щогодинні знімки. Підсумкові показники за діапазон дат стануть точними, коли існує принаймні один знімок до вибраного діапазону. Ранні значення можуть бути заниженими.",
|
|
|
+ averagePrintTime: "Середній час друку",
|
|
|
+ printsPerDay: "Друків на день",
|
|
|
+ byPrinter: "За принтером",
|
|
|
+ printsByPrinter: "Друки за принтерами",
|
|
|
+ byMaterial: "За матеріалом",
|
|
|
+ byMonth: "За місяцями",
|
|
|
+ last7Days: "Останні 7 днів",
|
|
|
+ last30Days: "Останні 30 днів",
|
|
|
+ last90Days: "Останні 90 днів",
|
|
|
+ allTime: "За весь час",
|
|
|
+ // Widgets
|
|
|
+ quickStats: "Швидка статистика",
|
|
|
+ printActivity: "Активність друку",
|
|
|
+ filamentTypes: "Типи філаментів",
|
|
|
+ filamentTrends: "Тенденції філаменту",
|
|
|
+ failureAnalysis: "Аналіз невдач",
|
|
|
+ timeAccuracy: "Точність оцінки часу",
|
|
|
+ successful: "Успішно:",
|
|
|
+ failed: "Невдало:",
|
|
|
+ cancelled: "Скасовано:",
|
|
|
+ perfectEstimate: "100% = ідеальна оцінка",
|
|
|
+ noTimeAccuracyData: "Даних про точність часу ще немає",
|
|
|
+ noFilamentData: "Немає даних про філамент",
|
|
|
+ noPrinterData: "Дані принтера відсутні",
|
|
|
+ noPrintData: "Немає даних про друк",
|
|
|
+ noPrintDataLast30Days: "Немає даних про друк за останні 30 днів",
|
|
|
+ failureReasons: "Причини невдач",
|
|
|
+ topFailureReasons: "Основні причини невдач",
|
|
|
+ failedPrintsCount: "Невдалих друків: {{failed}} із {{total}}",
|
|
|
+ lastWeekRate: "Минулого тижня: {{rate}}%",
|
|
|
+ // Actions
|
|
|
+ resetLayout: "Скинути макет",
|
|
|
+ recalculateCosts: "Перерахувати витрати",
|
|
|
+ recalculateCostsHint: "Перерахувати вартість усіх архівних друків за поточними цінами на філамент",
|
|
|
+ exportStats: "Експортувати статистику",
|
|
|
+ exportAsCsv: "Експортувати як CSV",
|
|
|
+ exportAsExcel: "Експортувати як Excel",
|
|
|
+ hiddenCount: "Приховано: {{count}}",
|
|
|
+ // Toast
|
|
|
+ exportDownloaded: "Експорт завантажено",
|
|
|
+ exportFailed: "Помилка експорту",
|
|
|
+ layoutReset: "Розташування віджетів скинуто",
|
|
|
+ recalculatedCosts: "Перераховано вартість архівів: {{count}}",
|
|
|
+ recalculateFailed: "Не вдалося перерахувати витрати",
|
|
|
+ // Loading
|
|
|
+ loadingStats: "Завантаження статистики...",
|
|
|
+ // Permissions
|
|
|
+ noPermissionResetLayout: "Ви не маєте дозволу на скидання макета",
|
|
|
+ noPermissionRecalculate: "Ви не маєте дозволу на перерахунок витрат",
|
|
|
+ noPrintDataInRange: "У вибраному діапазоні немає даних про друк",
|
|
|
+ periodFilament: "Філамент за період",
|
|
|
+ periodCost: "Вартість періоду",
|
|
|
+ avgPerPrint: "Середнє на друк",
|
|
|
+ usageOverTime: "Використання в часі",
|
|
|
+ energyOverTime: "Споживання енергії в часі",
|
|
|
+ filamentByWeight: "Вага",
|
|
|
+ printDuration: "Тривалість друку",
|
|
|
+ printerUtilization: "Використання принтера",
|
|
|
+ filamentSuccess: "Успіх за матеріалом",
|
|
|
+ printHabits: "Звички друку",
|
|
|
+ printTimeOfDay: "Розподіл друків за часом доби",
|
|
|
+ colorDistribution: "Розподіл кольору",
|
|
|
+ noColorData: "Немає даних про колір",
|
|
|
+ records: "Записи",
|
|
|
+ longestPrint: "Найтриваліший друк",
|
|
|
+ heaviestPrint: "Найважчий друк",
|
|
|
+ mostExpensivePrint: "Найдорожчий",
|
|
|
+ busiestDay: "Найзавантаженіший день",
|
|
|
+ successStreak: "Серія успішних друків",
|
|
|
+ streakPrint: "успішний друк поспіль",
|
|
|
+ streakPrints: "Успішних друків поспіль: {{count}}",
|
|
|
+ printerStats: "Статистика принтера",
|
|
|
+ hours: "год",
|
|
|
+ avgPrints: "Середня кількість друків",
|
|
|
+ noArchiveData: "Немає даних про друк",
|
|
|
+ filamentByTime: "Час",
|
|
|
+ avgWeight: "Середня вага",
|
|
|
+ avgTime: "Середній час",
|
|
|
+ filamentByPrints: "Друки",
|
|
|
+ timeframe: {
|
|
|
+ 'today': "Сьогодні",
|
|
|
+ 'this-week': "Цей тиждень",
|
|
|
+ 'this-month': "Цей місяць",
|
|
|
+ 'last-7': "Останні 7 днів",
|
|
|
+ 'last-30': "Останні 30 днів",
|
|
|
+ 'last-90': "Останні 90 днів",
|
|
|
+ 'this-year': "Цього року",
|
|
|
+ 'all-time': "За весь час",
|
|
|
+ 'custom': "Власний діапазон",
|
|
|
+ from: "Від",
|
|
|
+ to: "До",
|
|
|
+ },
|
|
|
+ // User filter
|
|
|
+ allUsers: "Усі користувачі",
|
|
|
+ noUser: "Немає користувача (система)",
|
|
|
+ filterByUser: "Фільтрувати за користувачем",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Maintenance page
|
|
|
+ maintenance: {
|
|
|
+ title: "Технічне обслуговування",
|
|
|
+ overview: "Огляд",
|
|
|
+ allOk: "Усі роботи з технічного обслуговування виконано",
|
|
|
+ dueCount: "Потрібне обслуговування: {{count}}",
|
|
|
+ dueCount_plural: "Потрібне обслуговування: {{count}}",
|
|
|
+ warningCount: "{{count}} попередження",
|
|
|
+ warningCount_plural: "{{count}} попередження",
|
|
|
+ totalPrintTime: "Загальний час друку",
|
|
|
+ nextMaintenance: "Наступне технічне обслуговування",
|
|
|
+ nothingDue: "Обслуговування не потрібне",
|
|
|
+ tasks: "Завдання",
|
|
|
+ lastPerformed: "Востаннє виконано",
|
|
|
+ interval: "Інтервал",
|
|
|
+ hoursRemaining: "Залишилося {{hours}} год",
|
|
|
+ hoursOverdue: "Прострочено на {{hours}} год",
|
|
|
+ markDone: "Позначити як виконане",
|
|
|
+ performMaintenance: "Виконати технічне обслуговування",
|
|
|
+ history: "Історія",
|
|
|
+ noHistory: "Історії обслуговування немає",
|
|
|
+ editPrintHours: "Змінити години друку",
|
|
|
+ currentHours: "Поточна кількість годин",
|
|
|
+ // Tabs
|
|
|
+ statusTab: "Статус",
|
|
|
+ settingsTab: "Налаштування",
|
|
|
+ // Status
|
|
|
+ overdueCount: "{{count}} прострочено",
|
|
|
+ dueSoonCount: "{{count}} незабаром",
|
|
|
+ dueSoon: "Незабаром",
|
|
|
+ allGood: "Все добре",
|
|
|
+ overdueBy: "Прострочено на {{duration}}",
|
|
|
+ dueIn: "Через {{duration}}",
|
|
|
+ timeLeft: "Залишилося {{duration}}",
|
|
|
+ // Duration formats
|
|
|
+ day: "1 день",
|
|
|
+ days: "{{count}} днів",
|
|
|
+ week: "1 тиждень",
|
|
|
+ weeks: "{{count}} тижнів",
|
|
|
+ month: "1 місяць",
|
|
|
+ months: "{{count}} місяців",
|
|
|
+ year: "1 рік",
|
|
|
+ // Settings
|
|
|
+ maintenanceTypes: "Види технічного обслуговування",
|
|
|
+ maintenanceTypesDescription: "Системні та власні завдання технічного обслуговування",
|
|
|
+ addCustomType: "Додати спеціальний тип",
|
|
|
+ restoreDefaults: "Відновити завдання за замовчуванням",
|
|
|
+ intervalType: "Тип інтервалу",
|
|
|
+ intervalValue: "Інтервал ({{type}})",
|
|
|
+ icon: "значок",
|
|
|
+ documentationLink: "Посилання на документацію (необов’язково)",
|
|
|
+ assignToPrinters: "Призначити принтерам",
|
|
|
+ selectAtLeastOnePrinter: "Вибрати принаймні один принтер",
|
|
|
+ addType: "Додати тип",
|
|
|
+ custom: "Власне",
|
|
|
+ printHours: "Години друку",
|
|
|
+ calendarDays: "Календарні дні",
|
|
|
+ exampleName: "наприклад, Замінити HEPA-фільтр",
|
|
|
+ viewDocumentation: "Переглянути документацію",
|
|
|
+ timeBasedInterval: "Часовий інтервал",
|
|
|
+ // Interval overrides
|
|
|
+ intervalOverrides: "Перевизначення інтервалів",
|
|
|
+ intervalOverridesDescription: "Налаштувати інтервали для конкретних принтерів",
|
|
|
+ // Printer assignment
|
|
|
+ assignedToPrinters: "Призначено для принтерів:",
|
|
|
+ noPrintersAssigned: "Принтерів не призначено",
|
|
|
+ addPrinterShort: "Додати:",
|
|
|
+ printersAssignedClick: "Призначено принтерів: {{count}} — натисніть, щоб керувати",
|
|
|
+ removeFromPrinter: "Видалити з цього принтера",
|
|
|
+ // Types
|
|
|
+ types: {
|
|
|
+ lubricateCarbonRods: "Змастити карбонові стрижні",
|
|
|
+ lubricateRails: "Змастити лінійні напрямні",
|
|
|
+ cleanNozzle: "Очистити сопло/хотенд",
|
|
|
+ checkBelts: "Перевірити натяг ременів",
|
|
|
+ cleanBuildPlate: "Очистити друкарську пластину",
|
|
|
+ checkExtruder: "Перевірити шестерні екструдера",
|
|
|
+ checkCooling: "Перевірити вентилятори охолодження",
|
|
|
+ generalInspection: "Загальний огляд",
|
|
|
+ cleanCarbonRods: "Очистити карбонові стрижні",
|
|
|
+ lubricateSteelRods: "Змастити сталеві стрижні",
|
|
|
+ cleanSteelRods: "Очистити сталеві стрижні",
|
|
|
+ cleanLinearRails: "Очистити лінійні напрямні",
|
|
|
+ checkPtfeTube: "Перевірити PTFE-трубку",
|
|
|
+ replaceHepaFilter: "Замінити HEPA-фільтр",
|
|
|
+ replaceCarbonFilter: "Замінити вугільний фільтр",
|
|
|
+ lubricateLeftNozzleRail: "Змастити ліву напрямну сопла",
|
|
|
+ },
|
|
|
+ // Toast
|
|
|
+ maintenanceComplete: "Технічне обслуговування позначено як завершене",
|
|
|
+ typeUpdated: "Оновлено тип обслуговування",
|
|
|
+ typeDeleted: "Тип обслуговування видалено",
|
|
|
+ defaultsRestored: "Відновлено завдання за замовчуванням {{count}}",
|
|
|
+ printHoursUpdated: "Години друку оновлено",
|
|
|
+ printerAssigned: "Принтер призначено",
|
|
|
+ printerRemoved: "Принтер видалено",
|
|
|
+ // Confirmation
|
|
|
+ deleteTypeConfirm: "Видалити \"{{name}}\"?",
|
|
|
+ deleteSystemTypeTitle: "Видалити завдання обслуговування за умовчанням?",
|
|
|
+ deleteSystemTypeMessage: "Ви впевнені, що бажаєте видалити стандартне завдання обслуговування \"{{name}}\"?",
|
|
|
+ // Permissions
|
|
|
+ noPermissionUpdate: "Ви не маєте дозволу на оновлення елементів обслуговування",
|
|
|
+ noPermissionPerform: "Ви не маєте дозволу на проведення технічного обслуговування",
|
|
|
+ noPermissionEditTypes: "Ви не маєте дозволу редагувати типи обслуговування",
|
|
|
+ noPermissionDeleteTypes: "Ви не маєте дозволу на видалення типів обслуговування",
|
|
|
+ noPermissionEditHours: "Ви не маєте дозволу редагувати години друку",
|
|
|
+ noPermissionRemovePrinter: "Ви не маєте дозволу на видалення призначень принтера",
|
|
|
+ noPermissionAssignPrinter: "Ви не маєте дозволу призначати принтери",
|
|
|
+ noPermissionEditIntervals: "Ви не маєте дозволу редагувати інтервали",
|
|
|
+ // Configure link
|
|
|
+ configureSettings: "Налаштувати типи та інтервали технічного обслуговування",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Settings page
|
|
|
+ settings: {
|
|
|
+ title: "Налаштування",
|
|
|
+ general: "Загальні",
|
|
|
+ // Tab names
|
|
|
+ tabs: {
|
|
|
+ general: "Загальні",
|
|
|
+ smartPlugs: "Розумні розетки",
|
|
|
+ notifications: "Сповіщення",
|
|
|
+ queue: "Робочий процес",
|
|
|
+ queueDispatch: "Черга та відправка",
|
|
|
+ queuePipelines: "Конвеєри",
|
|
|
+ filament: "Філамент",
|
|
|
+ network: "Мережа",
|
|
|
+ apiKeys: "Ключі API",
|
|
|
+ virtualPrinter: "Віртуальний принтер",
|
|
|
+ spoolbuddy: "SpoolBuddy",
|
|
|
+ failureDetection: "Виявлення несправностей",
|
|
|
+ users: "Автентифікація",
|
|
|
+ backup: "Резервне копіювання",
|
|
|
+ emailAuth: "Автентифікація електронної пошти",
|
|
|
+ ldap: "LDAP",
|
|
|
+ twoFa: "Двофакторна автентифікація",
|
|
|
+ oidc: "SSO / OIDC",
|
|
|
+ security: "Безпека",
|
|
|
+ },
|
|
|
+ spoolbuddy: {
|
|
|
+ infoTitle: "Пристрої SpoolBuddy",
|
|
|
+ infoBody: "Термінали SpoolBuddy автоматично реєструються за допомогою сигналів стану. Скасуйте реєстрацію пристрою, якщо він більше не використовується або після збою служби залишився застарілий дублікат.",
|
|
|
+ duplicatesTitle: "Зареєстровано пристроїв: {{count}}",
|
|
|
+ duplicatesBody: "Інтерфейс термінала використовує лише перший зареєстрований пристрій. Якщо один із записів є застарілим дублікатом після збою, скасуйте його реєстрацію. Пристрій у мережі зареєструється знову під час наступного сигналу стану.",
|
|
|
+ empty: "Ще немає зареєстрованих пристроїв SpoolBuddy.",
|
|
|
+ online: "Онлайн",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ unregister: "Скасувати реєстрацію",
|
|
|
+ unregisterSuccess: "Реєстрацію пристрою скасовано",
|
|
|
+ unregisterError: "Не вдалося скасувати реєстрацію пристрою",
|
|
|
+ confirmTitle: "Скасувати реєстрацію пристрою SpoolBuddy?",
|
|
|
+ confirmBody: "Пристрій «{{hostname}}» ({{deviceId}}) буде видалено з бази даних. Якщо він у мережі, то зареєструється знову під час наступного сигналу стану.",
|
|
|
+ ipAddress: "IP-адреса",
|
|
|
+ firmware: "Прошивка",
|
|
|
+ lastSeen: "Востаннє в мережі",
|
|
|
+ daemonUptime: "Час роботи демона",
|
|
|
+ systemUptime: "Час роботи системи",
|
|
|
+ never: "Ніколи",
|
|
|
+ nfc: "NFC",
|
|
|
+ scale: "Ваги",
|
|
|
+ cpuTemp: "Температура ЦП",
|
|
|
+ cpuLoad: "Завантаження ЦП",
|
|
|
+ memory: "Пам’ять",
|
|
|
+ disk: "Диск",
|
|
|
+ // Device actions
|
|
|
+ update: "Оновити",
|
|
|
+ updateConfirmTitle: "Оновити демон Spoolbuddy?",
|
|
|
+ updateConfirmBody: "Запустити оновлення програмного забезпечення на \"{{hostname}}\"? Щойно оновлення буде застосовано, демон перезапуститься.",
|
|
|
+ restartBrowser: "Перезапустити браузер",
|
|
|
+ restartBrowserConfirmTitle: "Перезапустити веб-переглядач термінала?",
|
|
|
+ restartBrowserConfirmBody: "Перезапустити веб-переглядач кіоску на \"{{hostname}}\"? Дисплей на короткий час згасне.",
|
|
|
+ restartDaemon: "Перезапустити службу",
|
|
|
+ restartDaemonConfirmTitle: "Перезапустити демон Spoolbuddy?",
|
|
|
+ restartDaemonConfirmBody: "Перезапустити демон Spoolbuddy на \"{{hostname}}\"? Пристрій вийде з мережі на кілька секунд.",
|
|
|
+ reboot: "Перезавантажити",
|
|
|
+ rebootConfirmTitle: "Перезавантажити пристрій?",
|
|
|
+ rebootConfirmBody: "Перезавантажити «{{hostname}}»? Пристрій буде офлайн приблизно хвилину.",
|
|
|
+ shutdown: "Вимкнути",
|
|
|
+ shutdownConfirmTitle: "Вимкнути пристрій?",
|
|
|
+ shutdownConfirmBody: "Вимкнути \"{{hostname}}\"? Щоб увімкнути його, вам знадобиться фізичний доступ.",
|
|
|
+ commandConfirm: "Підтвердити",
|
|
|
+ commandQueued: "Команда в черзі",
|
|
|
+ commandError: "Не вдалося надіслати команду",
|
|
|
+ },
|
|
|
+ // LDAP settings
|
|
|
+ ldap: {
|
|
|
+ title: "Автентифікація LDAP",
|
|
|
+ enabledDesc: "Автентифікація LDAP увімкнена",
|
|
|
+ disabledDesc: "Автентифікація LDAP вимкнена",
|
|
|
+ disabledHint: "Налаштуйте та збережіть налаштування LDAP нижче, а потім увімкніть.",
|
|
|
+ enabled: "LDAP автентифікація ввімкнена",
|
|
|
+ disabled: "LDAP автентифікація вимкнена",
|
|
|
+ feature1: "Користувачі можуть входити за допомогою облікових даних LDAP.",
|
|
|
+ feature2: "Обліковий запис локального адміністратора залишається резервним",
|
|
|
+ feature3: "Групи LDAP зіставляються з групами BamBuddy під час входу",
|
|
|
+ serverConfig: "Налаштування сервера LDAP",
|
|
|
+ serverUrl: "URL сервера",
|
|
|
+ serverUrlHint: "Використовуйте ldaps:// для SSL або ldap:// із StartTLS",
|
|
|
+ security: "Безпека",
|
|
|
+ securityHint: "StartTLS оновлює звичайне підключення до TLS. LDAPS використовує TLS із самого початку.",
|
|
|
+ bindDn: "DN прив’язки (службовий обліковий запис)",
|
|
|
+ bindPassword: "Пароль прив’язки",
|
|
|
+ searchBase: "Базовий DN пошуку",
|
|
|
+ userFilter: "Фільтр пошуку користувача",
|
|
|
+ userFilterHint: "{username} буде замінено на ім’я користувача, введене під час входу. Для OpenLDAP використовуйте (uid={username}).",
|
|
|
+ advanced: "Розширені налаштування",
|
|
|
+ autoProvision: "Автоматично створювати користувачів",
|
|
|
+ autoProvisionHint: "Автоматично створювати обліковий запис BamBuddy після першого входу LDAP.",
|
|
|
+ defaultGroup: "Група за замовчуванням",
|
|
|
+ defaultGroupNone: "— Немає (без резервної групи) —",
|
|
|
+ defaultGroupHint: "Запасна група призначається, коли користувач LDAP автентифікується, але його немає в списку жодної зіставленої групи LDAP. Залиште порожнім, щоб залишити непризначених користувачів без дозволів.",
|
|
|
+ groupMapping: "Зіставлення груп (JSON)",
|
|
|
+ groupMappingHint: "Зіставте DN груп LDAP із групами BamBuddy. Доступні групи: ",
|
|
|
+ testConnection: "Перевірити підключення",
|
|
|
+ settingsSaved: "Налаштування LDAP збережено",
|
|
|
+ errors: {
|
|
|
+ serverRequired: "Потрібна URL-адреса сервера LDAP",
|
|
|
+ searchBaseRequired: "Потрібен базовий DN пошуку",
|
|
|
+ enableAuthFirst: "Спочатку ввімкніть автентифікацію",
|
|
|
+ configureLdapFirst: "Спочатку збережіть налаштування LDAP.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // Email settings
|
|
|
+ email: {
|
|
|
+ smtpSettings: "Налаштування SMTP",
|
|
|
+ smtpHost: "Сервер SMTP",
|
|
|
+ smtpPort: "Порт SMTP",
|
|
|
+ security: "Безпека",
|
|
|
+ authentication: "Автентифікація",
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ password: "Пароль",
|
|
|
+ fromEmail: "Адреса відправника",
|
|
|
+ fromName: "Ім’я відправника",
|
|
|
+ testConnection: "Перевірити підключення SMTP",
|
|
|
+ testRecipient: "Електронна адреса тестового одержувача",
|
|
|
+ sendTest: "Надіслати тестовий електронний лист",
|
|
|
+ sending: "Надсилання...",
|
|
|
+ save: "Зберегти налаштування",
|
|
|
+ saving: "Збереження...",
|
|
|
+ advancedAuth: "Розширена автентифікація",
|
|
|
+ advancedAuthEnabled: "Розширену автентифікацію ввімкнено",
|
|
|
+ advancedAuthEnabledDesc: "Функції керування користувачами на основі електронної пошти активні. Нові користувачі отримають автоматично згенеровані паролі електронною поштою, і користувачі зможуть скинути свої паролі за допомогою функції «Забутий пароль».",
|
|
|
+ advancedAuthDisabled: "Розширену автентифікацію вимкнено",
|
|
|
+ advancedAuthDisabledDesc: "Увімкніть розширену автентифікацію, щоб активувати функції електронної пошти для керування користувачами.",
|
|
|
+ enable: "Увімкнути",
|
|
|
+ disable: "Вимкнути",
|
|
|
+ feature1: "Паролі генеруються автоматично та надсилаються новим користувачам електронною поштою",
|
|
|
+ feature2: "Користувачі можуть входити за іменем користувача або електронною адресою",
|
|
|
+ feature3: "Доступна функція «Забув пароль».",
|
|
|
+ feature4: "Адміністратори можуть скинути паролі користувачів електронною поштою",
|
|
|
+ // Error messages
|
|
|
+ errors: {
|
|
|
+ requiredFields: "Заповніть усі обов’язкові поля",
|
|
|
+ usernameRequired: "Якщо ввімкнено автентифікацію, потрібне ім’я користувача",
|
|
|
+ enterTestEmail: "Введіть тестову електронну адресу",
|
|
|
+ smtpServerAndEmail: "Перед перевіркою вкажіть SMTP-сервер і адресу відправника",
|
|
|
+ usernamePasswordRequired: "Якщо ввімкнено автентифікацію, потрібні ім’я користувача та пароль",
|
|
|
+ configureSmtpFirst: "Спочатку налаштуйте та перевірте параметри SMTP",
|
|
|
+ enableAuthFirst: "Щоб використовувати функції електронної пошти, спочатку ввімкніть автентифікацію.",
|
|
|
+ },
|
|
|
+ // Success messages
|
|
|
+ success: {
|
|
|
+ settingsSaved: "Налаштування SMTP успішно збережено",
|
|
|
+ },
|
|
|
+ // Security options
|
|
|
+ securityOptions: {
|
|
|
+ starttls: "STARTTLS (порт 587)",
|
|
|
+ ssl: "SSL/TLS (порт 465)",
|
|
|
+ none: "Без шифрування (порт 25)",
|
|
|
+ },
|
|
|
+ // Authentication options
|
|
|
+ authOptions: {
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ disabled: "Вимкнено",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ appearance: "Зовнішній вигляд",
|
|
|
+ notifications: "Сповіщення",
|
|
|
+ smartPlugs: "Розумні розетки",
|
|
|
+ spoolman: "Spoolman",
|
|
|
+ updates: "Оновлення",
|
|
|
+ language: "Мова",
|
|
|
+ languageDescription: "Виберіть бажану мову",
|
|
|
+ theme: "Тема",
|
|
|
+ themeLight: "Світла",
|
|
|
+ themeDark: "Темна",
|
|
|
+ themeSystem: "Системна",
|
|
|
+ defaultView: "Початкове подання",
|
|
|
+ defaultViewDescription: "Сторінка, яка відображатиметься під час відкриття програми",
|
|
|
+ checkForUpdates: "Перевірити наявність оновлень",
|
|
|
+ autoUpdate: "Автоматичне оновлення",
|
|
|
+ currentVersion: "Поточна версія",
|
|
|
+ latestVersion: "Остання версія",
|
|
|
+ upToDate: "У вас установлено останню версію",
|
|
|
+ updateAvailable: "Доступне оновлення",
|
|
|
+ // Notifications
|
|
|
+ notificationLanguage: "Мова сповіщень",
|
|
|
+ notificationLanguageDescription: "Мова для push-повідомлень",
|
|
|
+ bedCooledThreshold: "Поріг охолодження столу",
|
|
|
+ bedCooledThresholdDescription: "Температура, нижче якої стіл вважається охолодженим після друку",
|
|
|
+ userNotificationsEnabled: "Сповіщення користувача",
|
|
|
+ userNotificationsEnabledDescription: "Увімкніть меню сповіщень користувача та сповіщення електронною поштою про події завдань друку. Потрібна розширена автентифікація.",
|
|
|
+ userNotificationsDisabledHint: "Увімкніть розширену автентифікацію, щоб використовувати сповіщення користувачів.",
|
|
|
+ notificationProviders: "Служби сповіщень",
|
|
|
+ addProvider: "Додати службу",
|
|
|
+ editProvider: "Редагувати службу",
|
|
|
+ providerType: "Тип служби",
|
|
|
+ testNotification: "Перевірити сповіщення",
|
|
|
+ testSuccess: "Тестове сповіщення успішно надіслано",
|
|
|
+ testFailed: "Не вдалося надіслати тестове сповіщення",
|
|
|
+ quietHours: "Період тиші",
|
|
|
+ quietHoursDescription: "Не надсилати сповіщень у цей період",
|
|
|
+ quietHoursStart: "Початок",
|
|
|
+ quietHoursEnd: "Кінець",
|
|
|
+ events: {
|
|
|
+ title: "Події сповіщень",
|
|
|
+ printStart: "Друк розпочато",
|
|
|
+ printComplete: "Друк завершено",
|
|
|
+ printFailed: "Помилка друку",
|
|
|
+ printStopped: "Друк зупинено",
|
|
|
+ printProgress: "Етапи виконання",
|
|
|
+ printProgressDescription: "Сповіщати після досягнення 25%, 50% і 75%",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ printerError: "Помилка принтера",
|
|
|
+ filamentLow: "Мало філаменту",
|
|
|
+ maintenanceDue: "Потрібне технічне обслуговування",
|
|
|
+ maintenanceDueDescription: "Повідомити, коли потрібне обслуговування",
|
|
|
+ },
|
|
|
+ // Smart Plugs
|
|
|
+ smartPlug: {
|
|
|
+ title: "Розумні розетки",
|
|
|
+ add: "Додати розумну розетку",
|
|
|
+ edit: "Редагувати розумну розетку",
|
|
|
+ name: "Назва",
|
|
|
+ ipAddress: "IP-адреса",
|
|
|
+ linkedPrinter: "Пов’язаний принтер",
|
|
|
+ autoOn: "Автоматичне ввімкнення",
|
|
|
+ autoOnDescription: "Увімкнути на початку друку",
|
|
|
+ autoOff: "Автоматичне вимкнення",
|
|
|
+ autoOffDescription: "Вимкнути після завершення друку",
|
|
|
+ offDelay: "Затримка вимкнення",
|
|
|
+ offDelayMinutes: "Хвилини після завершення друку",
|
|
|
+ offDelayTemp: "Коли температура сопла нижча за задану",
|
|
|
+ currentState: "Поточний стан",
|
|
|
+ turnOn: "Увімкнути",
|
|
|
+ turnOff: "Вимкнути",
|
|
|
+ },
|
|
|
+ // Filament Tracking Mode
|
|
|
+ filamentTracking: "Облік філаменту",
|
|
|
+ filamentTrackingDesc: "Виберіть спосіб обліку котушок філаменту. Можна використовувати вбудований інвентар або підключити зовнішній сервер Spoolman.",
|
|
|
+ autoAddUnknownRfid: "Автоматично додавати невідомі RFID-котушки",
|
|
|
+ autoAddUnknownRfidDesc: "Автоматично створювати запис інвентарю, коли виявлено котушку з невідомою RFID-міткою. Вимкніть, якщо ви заздалегідь реєструєте нові котушки вручну, щоб уникнути дублікатів.",
|
|
|
+ filamentChecks: "Перевірки філаменту",
|
|
|
+ disableFilamentWarnings: "Вимкнути попередження про філамент",
|
|
|
+ disableFilamentWarningsDesc: "Не показувати попередження про недостатню кількість філаменту під час запуску друку або додавання до черги",
|
|
|
+ preferLowestFilament: "Віддавати перевагу котушці з найменшим залишком",
|
|
|
+ preferLowestFilamentDesc: "Якщо підходять кілька котушок, використовувати котушку з найменшим залишком філаменту",
|
|
|
+ preferLowestFilamentBackupNote: "Діє лише тоді, коли на принтері ввімкнено AMS Filament Backup. Інакше після вичерпання вибраної котушки принтер не зможе перейти на другу.",
|
|
|
+ trackingModeBuiltIn: "Вбудований інвентар",
|
|
|
+ trackingModeBuiltInDesc: "Автоматичне зіставлення за RFID та облік використання",
|
|
|
+ trackingModeSpoolmanDesc: "Зовнішній сервер керування філаментом",
|
|
|
+ builtInFeatureRfid: "Автоматично виявляє RFID-котушки Bambu Lab в AMS",
|
|
|
+ builtInFeatureUsage: "Обліковує витрати філаменту для кожного друку",
|
|
|
+ builtInFeatureCatalog: "Керування котушками, кольорами та профілями K-фактора",
|
|
|
+ builtInFeatureThirdParty: "Котушки сторонніх виробників можна пов’язувати з котушками інвентарю",
|
|
|
+ amsSyncButton: "Синхронізувати масу з AMS",
|
|
|
+ amsSyncTitle: "Синхронізація маси котушок з AMS",
|
|
|
+ amsSyncMessage: "Масу всіх котушок інвентарю буде перезаписано відповідно до поточних значень залишку у відсотках, отриманих з AMS підключених принтерів. Скористайтеся цим для відновлення пошкоджених даних про масу. Принтери мають бути в мережі.",
|
|
|
+ amsSyncing: "Синхронізація...",
|
|
|
+ amsSyncSuccess: "Синхронізовано: {{synced}}; пропущено: {{skipped}}",
|
|
|
+ amsSyncError: "Не вдалося синхронізувати масу з AMS",
|
|
|
+ spoolmanAmsSyncButton: "Синхронізувати масу котушок Spoolman з AMS",
|
|
|
+ spoolmanAmsSyncTitle: "Синхронізація маси котушок Spoolman з AMS",
|
|
|
+ spoolmanAmsSyncMessage: "Масу всіх котушок Spoolman буде оновлено відповідно до поточних значень залишку в AMS підключених принтерів. Принтери мають бути в мережі.",
|
|
|
+ spoolmanAmsSyncing: "Синхронізація...",
|
|
|
+ spoolmanAmsSyncSuccess: "Синхронізовано: {{synced}}; пропущено: {{skipped}}",
|
|
|
+ spoolmanAmsSyncError: "Не вдалося синхронізувати масу котушок Spoolman з AMS",
|
|
|
+ spoolmanAmsSyncErrorUnreachable: "Не вдалося синхронізувати масу котушок Spoolman: сервер Spoolman недоступний",
|
|
|
+ spoolmanAmsSyncErrorNotConfigured: "Не вдалося синхронізувати масу котушок Spoolman: сервер Spoolman не налаштовано",
|
|
|
+ spoolmanNotConfigured: "Spoolman не налаштовано",
|
|
|
+ // Spoolman filament catalog section in spool catalog settings
|
|
|
+ spoolmanFilamentCatalogTitle: "Каталог філаментів Spoolman",
|
|
|
+ spoolmanFilamentCatalogDesc: "Назви філаментів і вага тари з вашого екземпляра Spoolman. Тут можна редагувати назву та вагу котушки; усі інші властивості керуються безпосередньо в Spoolman.",
|
|
|
+ // Spoolman settings
|
|
|
+ spoolmanUrl: "Spoolman URL",
|
|
|
+ spoolmanUrlHint: "URL вашого сервера Spoolman (наприклад, http://localhost:7912)",
|
|
|
+ spoolmanConnected: "Підключено",
|
|
|
+ spoolmanDisconnected: "Відключено",
|
|
|
+ status: "Статус",
|
|
|
+ connect: "Підключитися",
|
|
|
+ disconnect: "Від’єднатися",
|
|
|
+ howSyncWorks: "Як працює синхронізація",
|
|
|
+ syncInfoRfidOnly: "Синхронізуються лише офіційні котушки Bambu Lab із RFID.",
|
|
|
+ syncInfoAutoCreate: "Нові котушки автоматично створюються в Spoolman під час першої синхронізації",
|
|
|
+ syncInfoThirdPartySkipped: "Котушки не від Bambu Lab — сторонні або повторно заправлені — пропускаються",
|
|
|
+ linkingExistingSpools: "Зв’язування існуючих котушок",
|
|
|
+ linkingExistingSpoolsDesc: "Щоб пов’язати наявні котушки Spoolman з AMS, наведіть вказівник на слот AMS і натисніть «Пов’язати зі Spoolman».",
|
|
|
+ syncMode: "Режим синхронізації",
|
|
|
+ syncModeAuto: "Автоматичний",
|
|
|
+ syncModeManual: "Тільки вручну",
|
|
|
+ syncModeAutoDesc: "Дані AMS синхронізуються автоматично після виявлення змін",
|
|
|
+ syncModeManualDesc: "Синхронізувати лише вручну",
|
|
|
+ syncAmsData: "Синхронізувати дані AMS",
|
|
|
+ syncAmsDataDesc: "Вручну синхронізувати дані AMS принтера зі Spoolman",
|
|
|
+ allPrinters: "Усі принтери",
|
|
|
+ // Default printer
|
|
|
+ noDefaultPrinter: "Немає умовчання (запитувати щоразу)",
|
|
|
+ // Sidebar
|
|
|
+ sidebarOrder: "Порядок бічної панелі",
|
|
|
+ // Camera
|
|
|
+ saveThumbnails: "Зберегти мініатюри",
|
|
|
+ captureFinishPhoto: "Зробити фото після завершення",
|
|
|
+ noPrintersConfigured: "Принтери не налаштовані",
|
|
|
+ // Archive settings
|
|
|
+ archiveMode: {
|
|
|
+ always: "Завжди створювати запис архіву",
|
|
|
+ never: "Ніколи не створювати запис архіву",
|
|
|
+ ask: "Запитувати щоразу",
|
|
|
+ },
|
|
|
+ // Updates
|
|
|
+ checkForUpdatesLabel: "Перевірити наявність оновлень",
|
|
|
+ checkPrinterFirmware: "Перевірити прошивку принтера",
|
|
|
+ includeBetaUpdates: "Включати бета-версії",
|
|
|
+ includeBetaUpdatesDesc: "Повідомляти про бета-версії та попередні версії під час перевірки оновлень",
|
|
|
+ localLogin: {
|
|
|
+ disable: "Вимкнути локальний вхід за іменем користувача й паролем",
|
|
|
+ disableHint: "Якщо ввімкнено, увійти можна буде лише через постачальників SSO. На LDAP це не впливає. Щоб зберегти резервний спосіб входу, установіть на сервері BAMBUDDY_LOCAL_LOGIN=true.",
|
|
|
+ },
|
|
|
+ // Queue
|
|
|
+ enableRetry: "Увімкнути повторну спробу",
|
|
|
+ // Home Assistant
|
|
|
+ homeAssistantDescription: "Керуйте розумними розетками через Home Assistant",
|
|
|
+ environmentManagedLabel: "(Кероване середовище)",
|
|
|
+ autoEnabledViaEnv: "Автоматично вмикається через змінні середовища",
|
|
|
+ urlFromEnvReadOnly: "Значення, встановлене змінною середовища HA_URL (лише читання)",
|
|
|
+ tokenFromEnvReadOnly: "Значення, установлене змінною середовища HA_TOKEN (лише читання)",
|
|
|
+ // MQTT
|
|
|
+ mqttConnectedTo: "Підключено до",
|
|
|
+ // Prometheus
|
|
|
+ prometheusDescription: "Надавати дані принтерів у форматі Prometheus",
|
|
|
+ // Smart plugs empty state
|
|
|
+ noSmartPlugsTitle: "Розумні розетки не налаштовано",
|
|
|
+ noSmartPlugsDescription: "Додайте розумну розетку на базі Tasmota, щоб відстежувати споживання енергії та автоматизувати керування живленням.",
|
|
|
+ // Notifications empty state
|
|
|
+ noProvidersTitle: "Постачальники не налаштовані",
|
|
|
+ noProvidersDescription: "Додайте постачальника, щоб отримувати сповіщення.",
|
|
|
+ noTemplatesAvailable: "Немає доступних шаблонів. Перезапустіть серверну частину, щоб створити стандартні шаблони.",
|
|
|
+ // API permissions
|
|
|
+ apiPermissionView: "Перегляд стану принтера та черги",
|
|
|
+ apiPermissionEdit: "Додавання та видалення елементів із черги друку",
|
|
|
+ // API keys
|
|
|
+ apiKeysEmptyTitle: "Немає ключів API",
|
|
|
+ apiKeysEmptyDescription: "Створіть ключ API для інтеграції із зовнішніми службами.",
|
|
|
+ // Users
|
|
|
+ noUsersFound: "Користувачів не знайдено",
|
|
|
+ noGroupsFound: "Групи не знайдено",
|
|
|
+ noGroupsAvailable: "Немає доступних груп",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ systemGroupWarning: "Назви системних груп не можна змінювати",
|
|
|
+ // Auth disabled
|
|
|
+ authDisabledTitle: "Автентифікація вимкнена",
|
|
|
+ authDisabledFeature1: "Вимагати входу для доступу до системи",
|
|
|
+ authDisabledFeature2: "Створювати кількох користувачів із дозволами на основі груп",
|
|
|
+ authDisabledFeature3: "Керувати доступом за допомогою понад 50 окремих дозволів",
|
|
|
+ // User deletion
|
|
|
+ userHasCreated: "Цей користувач створив:",
|
|
|
+ userItemsQuestion: "Що зробити з цими елементами?",
|
|
|
+ deleteUserConfirm: "Ви впевнені, що хочете видалити цього користувача?",
|
|
|
+ actionCannotBeUndone: "Цю дію не можна скасувати.",
|
|
|
+ // Smart plugs
|
|
|
+ addFirstSmartPlug: "Додати першу розумну розетку",
|
|
|
+ // Notifications
|
|
|
+ providers: "Постачальники",
|
|
|
+ log: "Журнал",
|
|
|
+ testAll: "Перевірити все",
|
|
|
+ testResults: "Результати тестування",
|
|
|
+ testPassedCount: "{{count}} пройдено",
|
|
|
+ testFailedCount: "{{count}} не вдалося",
|
|
|
+ messageTemplates: "Шаблони повідомлень",
|
|
|
+ messageTemplatesDescription: "Налаштуйте текст сповіщень для кожної події.",
|
|
|
+ // API Keys section
|
|
|
+ apiKeys: "Ключі API",
|
|
|
+ apiKeysDescription: "Створіть ключі API для зовнішніх інтеграцій і веб-хуків.",
|
|
|
+ createKey: "Створити ключ",
|
|
|
+ apiKeyCreated: "Ключ API створено успішно",
|
|
|
+ apiKeyCopyWarning: "Скопіюйте цей ключ зараз — його більше не буде показано!",
|
|
|
+ useInApiBrowser: "Використати в оглядачі API",
|
|
|
+ apiKeyQrButton: "QR-код",
|
|
|
+ apiKeyQrTitle: "Відскануйте для налаштування",
|
|
|
+ apiKeyQrCaption: "Скануйте за допомогою мобільного додатка, щоб додати цей сервер і ключ API.",
|
|
|
+ apiKeyQrWarning: "Містить ваш секретний ключ API. Не передавайте його іншим і не зберігайте знімки екрана там, де їх можуть побачити сторонні.",
|
|
|
+ createNewApiKey: "Створити новий ключ API",
|
|
|
+ keyName: "Назва ключа",
|
|
|
+ keyNamePlaceholder: "наприклад, Home Assistant, OctoPrint",
|
|
|
+ readStatus: "Читати статус",
|
|
|
+ readStatusDescription: "Перегляд стану принтера та черги",
|
|
|
+ manageQueue: "Керувати чергою",
|
|
|
+ manageQueueDescription: "Додавання та видалення елементів із черги друку",
|
|
|
+ controlPrinter: "Керування принтером",
|
|
|
+ controlPrinterDescription: "Призупинення, відновлення та зупинка друку",
|
|
|
+ manageLibrary: "Керувати бібліотекою",
|
|
|
+ manageLibraryDescription: "Вивантажувати, перейменовувати й видаляти файли бібліотеки; імпортувати моделі з MakerWorld",
|
|
|
+ manageInventory: "Керувати інвентарем",
|
|
|
+ manageInventoryDescription: "Створення, оновлення та видалення котушок і записів інвентарю. Потрібно для кіосків SpoolBuddy: сканування NFC, покази ваг і системні команди кіоску.",
|
|
|
+ manageMaintenance: "Керувати технічним обслуговуванням",
|
|
|
+ manageMaintenanceDescription: "Реєстрація завершеного технічного обслуговування, скидання лічильників, редагування інтервалів і керування каталогом технічного обслуговування. Підходить для автоматизації Home Assistant, яка записує «Я очистив сопло», не надаючи ширшого контролю над принтером.",
|
|
|
+ manageArchives: "Керувати архівами",
|
|
|
+ manageArchivesDescription: "Редагувати та видаляти архіви друку, у тому числі видаляти старі друки. Не включає очищення їхнього статистичного внеску. Підходить для автоматизації, яка обрізає історію друку.",
|
|
|
+ manageProjects: "Керувати проєктами",
|
|
|
+ manageProjectsDescription: "Створюйте, оновлюйте та видаляйте проєкти, додавайте до них архіви. Підходить для автоматизації, яка організовує друк у проєкти.",
|
|
|
+ libraryBadge: "Бібліотека",
|
|
|
+ inventoryBadge: "Інвентар",
|
|
|
+ maintenanceBadge: "Технічне обслуговування",
|
|
|
+ archivesBadge: "Архіви",
|
|
|
+ projectsBadge: "Проєкти",
|
|
|
+ cloudAccess: "Дозволити доступ до хмари",
|
|
|
+ cloudAccessDescription: "Дозволити читати від вашого імені профілі та філаменти Bambu Cloud. Потрібен вхід у Bambu Cloud.",
|
|
|
+ cloudBadge: "Хмара",
|
|
|
+ updateEnergyCost: "Оновлювати ціну електроенергії",
|
|
|
+ updateEnergyCostDescription: "Дозволити цьому ключу надсилати нову ціну електроенергії за кВт·год до /settings/electricity-price. Це корисно для автоматизацій Home Assistant із динамічними тарифами (Tibber, Octopus тощо). Це єдине поле налаштувань, яке можна змінювати за допомогою ключа API.",
|
|
|
+ energyCostBadge: "Енергія",
|
|
|
+ legacyKey: "Застарілий",
|
|
|
+ legacyKeyTooltip: "Створено до отримання права власності на користувача; повторно створити, щоб використовувати доступ до хмари",
|
|
|
+ unnamedKey: "Безіменний ключ",
|
|
|
+ lastUsed: "Останнє використання",
|
|
|
+ read: "Читання",
|
|
|
+ control: "Керування",
|
|
|
+ createFirstKey: "Створити перший ключ",
|
|
|
+ webhookEndpoints: "Кінцеві точки вебхуків",
|
|
|
+ webhookApiKeyHint: "Використовуйте свій ключ API у заголовку X-API-Key.",
|
|
|
+ webhook: {
|
|
|
+ getAllStatus: "Отримати весь стан принтера",
|
|
|
+ getSpecificStatus: "Отримати певний стан принтера",
|
|
|
+ addToQueue: "Додати до черги друку",
|
|
|
+ pausePrint: "Призупинити друк",
|
|
|
+ resumePrint: "Відновити друк",
|
|
|
+ stopPrint: "Зупинити друк",
|
|
|
+ },
|
|
|
+ apiBrowser: "Оглядач API",
|
|
|
+ apiBrowserDescription: "Переглядайте й перевіряйте всі доступні кінцеві точки API.",
|
|
|
+ apiKeyForTesting: "Ключ API для тестування",
|
|
|
+ apiKeyPlaceholder: "Вставте сюди свій ключ API, щоб перевірити автентифіковані кінцеві точки...",
|
|
|
+ apiKeyHint: "Цей ключ буде надіслано як заголовок X-API-Key із запитами.",
|
|
|
+ deleteApiKeyTitle: "Видалити ключ API",
|
|
|
+ deleteApiKeyMessage: "Ви впевнені, що хочете видалити цей ключ API? Будь-які інтеграції за допомогою цього ключа перестануть працювати.",
|
|
|
+ deleteKey: "Видалити ключ",
|
|
|
+ // Filament tab
|
|
|
+ amsDisplayThresholds: "Пороги індикаторів AMS",
|
|
|
+ amsThresholdsDescription: "Налаштуйте колірні пороги для індикаторів вологості та температури AMS.",
|
|
|
+ humidity: "Вологість",
|
|
|
+ goodGreen: "Добре (зелений)",
|
|
|
+ fairOrange: "Задовільний (помаранчевий)",
|
|
|
+ aboveFairBad: "Значення вище задовільного порога відображається червоним (погано)",
|
|
|
+ fairAlsoDryingThreshold: "Цей поріг також використовується для запуску автоматичного сушіння, якщо його ввімкнено",
|
|
|
+ temperature: "Температура",
|
|
|
+ goodBlue: "Добре (синій)",
|
|
|
+ aboveFairHot: "Значення вище задовільного порога відображається червоним (гаряче)",
|
|
|
+ historyRetention: "Збереження історії",
|
|
|
+ keepSensorHistory: "Зберігати історію датчиків для",
|
|
|
+ historyRetentionDescription: "Старіші дані про вологість і температуру буде автоматично видалено",
|
|
|
+ defaultPrintOptions: "Параметри друку за умовчанням",
|
|
|
+ defaultPrintOptionsDescription: "Установіть типові значення параметрів для нових завдань друку. Їх можна змінити для окремого завдання в діалоговому вікні друку.",
|
|
|
+ defaultBedLevelling: "Вирівнювання столу",
|
|
|
+ defaultBedLevellingDesc: "Автоматичне вирівнювання столу перед друком",
|
|
|
+ defaultFlowCali: "Калібрування потоку",
|
|
|
+ defaultFlowCaliDesc: "Калібрувати потік екструзії",
|
|
|
+ defaultVibrationCali: "Калібрування вібрації",
|
|
|
+ defaultVibrationCaliDesc: "Зменшувати артефакти від вібрації",
|
|
|
+ defaultLayerInspect: "Перевірка першого шару",
|
|
|
+ defaultLayerInspectDesc: "Перевірка першого шару за допомогою ШІ",
|
|
|
+ defaultTimelapse: "Таймлапс",
|
|
|
+ defaultTimelapseDesc: "Записувати таймлапс",
|
|
|
+ defaultNozzleOffsetCali: "Калібрування зсуву сопла",
|
|
|
+ defaultNozzleOffsetCaliDesc: "Калібрувати зміщення сопел між екструдерами",
|
|
|
+ tempFanPresetsTitle: "Профілі температури та вентилятора",
|
|
|
+ tempFanPresetsDescription: "Налаштуйте значення швидкого вибору в спливних панелях температури й швидкості вентилятора на картці принтера. Кнопка «Вимкнути» відображається завжди.",
|
|
|
+ tempFanPresetsNozzle: "Температура сопла",
|
|
|
+ tempFanPresetsBed: "Температура столу",
|
|
|
+ tempFanPresetsChamber: "Температура камери",
|
|
|
+ tempFanPresetsFan: "Швидкість вентилятора",
|
|
|
+ tempFanPresetsReset: "Відновити налаштування за замовчуванням",
|
|
|
+ concurrentUploadsTitle: "Паралельні вивантаження",
|
|
|
+ concurrentUploadsDescription: "Кількість принтерів, на які черга може одночасно надсилати файли. Передавання на принтери відбувається повільно — великий файл може передаватися кілька хвилин — і кожен принтер чекає своєї черги. Для великого парку збільшення цього значення скорочує очікування останнього принтера в партії. Зменште його, якщо мережа або сервер Bambuddy не справляється з паралельними передаваннями.",
|
|
|
+ concurrentUploadsLabel: "Кількість принтерів для одночасного передавання",
|
|
|
+ concurrentUploadsHelp: "1 надсилає на один принтер за раз (стара поведінка). За замовчуванням 4.",
|
|
|
+ staggeredStart: "Поетапний запуск",
|
|
|
+ staggeredStartDescription: "Типовий розмір групи та інтервал для поетапного запуску партії на кількох принтерах. Значення можна змінити для кожної партії у вікні друку.",
|
|
|
+ preheatTitle: "Попереднє нагрівання й термовитримка",
|
|
|
+ preheatDescription: "Нагрівати стіл — і камеру, якщо це підтримується — та витримувати задану температуру перед кожним друком із черги. Це корисно для інженерних філаментів, як-от PA й ABS, на принтерах без активного нагрівача камери: стіл нагріває камеру тепловим випромінюванням, доки триває термовитримка. Цільова температура столу зчитується з файлу друку; поведінка камери залежить від моделі принтера.",
|
|
|
+ preheatEnabled: "Увімкнути попереднє нагрівання й термовитримку",
|
|
|
+ preheatEnabledDesc: "Якщо вимкнено, завдання з черги надсилаються на друк негайно. Для кожного елемента черги це налаштування можна перевизначити окремо.",
|
|
|
+ preheatFilamentTargetsLabel: "Цільова температура камери за типом філаменту (°C)",
|
|
|
+ preheatFilamentTargetsHint: "Bambuddy вибирає найвищу цільову температуру серед завантажених слотів AMS. Для друку лише з PLA визначається значення 0, тому етап нагрівання камери автоматично пропускається.",
|
|
|
+ preheatFilamentTargetsReset: "Відновити налаштування за замовчуванням",
|
|
|
+ preheatFilamentTargetsDefaultRow: "Інше / не зіставлене",
|
|
|
+ preheatMaxWait: "Максимальний час очікування (секунди)",
|
|
|
+ preheatMaxWaitHelp: "Максимальна тривалість нагрівання камери перед переходом до наступного етапу.",
|
|
|
+ preheatSoak: "Термовитримка (с)",
|
|
|
+ preheatSoakHelp: "Час термовитримки після досягнення цільової температури або завершення максимального часу очікування.",
|
|
|
+ preheatHardwareTitle: "Особливості за моделями принтерів:",
|
|
|
+ preheatHardwareDetail: "H2C/H2D/H2D Pro/H2S/X2D/X1E активно нагрівають камеру командою M141. X1C/P2S зчитують температуру камери, але покладаються на нагрівання тепловим випромінюванням від столу. P1S/P1P/A1/A1 Mini не мають датчика камери — для них застосовується лише таймер термовитримки.",
|
|
|
+ preheatPerItemDesc: "Нагрівати стіл і камеру перед початком цього друку. Типове значення успадковується з перемикача «Налаштування → Робочий процес».",
|
|
|
+ preheatOverride_inherit: "Успадкувати",
|
|
|
+ preheatOverride_on: "Увімкнено",
|
|
|
+ preheatOverride_off: "Вимкнено",
|
|
|
+ calibrationMode_off: "Вимкнено",
|
|
|
+ calibrationMode_on: "Увімкнено",
|
|
|
+ calibrationMode_auto: "Авто",
|
|
|
+ preheatTargetOverride: "Інша цільова температура камери (°C; порожньо — типове значення для філаменту)",
|
|
|
+ plateClear: "Підтвердження очищення друкарської пластини",
|
|
|
+ requirePlateClear: "Вимагати підтвердження очищення друкарської пластини",
|
|
|
+ requirePlateClearDescription: "Якщо ввімкнено, планувальник перед запуском наступного завдання на принтері із завершеним друком очікує підтвердження, що друкарську пластину очищено. Вимкнення також приховує індикатор стану пластини та кнопку «Позначити пластину як очищену» на картках принтерів.",
|
|
|
+ gcodeInjection: "Вставлення G-коду",
|
|
|
+ gcodeInjectionDescription: "Налаштуйте власний G-код для вставлення на початку та/або наприкінці друку в системах автоматичного друку, як-от Farmloop, SwapMod, AutoClear і Printflow 3D. Фрагменти налаштовуються для кожної моделі принтера та застосовуються, коли для елемента черги ввімкнено «Вставляти G-код».",
|
|
|
+ gcodeInjectionNoPrinters: "Принтерів не знайдено. Додайте принтери, щоб налаштувати фрагменти G-коду.",
|
|
|
+ gcodeStartLabel: "Початковий G-код",
|
|
|
+ gcodeEndLabel: "Завершальний G-код",
|
|
|
+ gcodeStartPlaceholder: "G-код додається перед початком друку...",
|
|
|
+ gcodeEndPlaceholder: "G-код додається після завершення друку...",
|
|
|
+ staggerGroupSize: "Розмір групи",
|
|
|
+ staggerGroupSizeHelp: "Кількість принтерів, що одночасно запускаються в кожній групі",
|
|
|
+ staggerInterval: "Інтервал (хвилини)",
|
|
|
+ staggerIntervalHelp: "Затримка між стартом кожної групи",
|
|
|
+ queueDrying: "Автоматичне сушіння між завданнями черги",
|
|
|
+ queueDryingDescription: "Автоматично сушити філамент в AMS, коли принтер простоює між завданнями з черги. Сушіння запускається відповідно до заданого вище порога вологості.",
|
|
|
+ queueDryingEnabled: "Увімкнути автосушку",
|
|
|
+ queueDryingEnabledDescription: "Автоматичний запуск AMS сушіння, коли принтер неактивний і вологість перевищує порогове значення",
|
|
|
+ queueDryingBlock: "Чекати завершення сушіння",
|
|
|
+ queueDryingBlockDescription: "Не запускати завдання з черги до завершення сушіння. Якщо вимкнено, друк має пріоритет над сушінням.",
|
|
|
+ ambientDryingEnabled: "Фонове сушіння",
|
|
|
+ ambientDryingEnabledDescription: "Автоматичне сушіння філаменту на неактивних принтерах, коли вологість перевищує порогове значення, навіть без друку в черзі.",
|
|
|
+ printDryingEnabled: "Продовжувати сушіння під час друку",
|
|
|
+ printDryingEnabledDescription: "Дозволити автоматичному сушінню тривати під час друку на підтримуваному обладнанні (H2D, H2C, H2S, P2S, H2D Pro, X2D, X1C, A2L з новими версіями прошивки). Для захисту котушок температура сушіння автоматично обмежується значенням на 5 °C нижчим за профіль для режиму простою.",
|
|
|
+ dryingPresets: "Профілі сушіння",
|
|
|
+ dryingPresetsDescription: "Температура та тривалість для кожного типу філаменту. AMS 2 Pro використовує нижчі температури, AMS-HT підтримує вищі температури.",
|
|
|
+ dryingFilament: "Філамент",
|
|
|
+ humidityThresholds: "Пороги вологості",
|
|
|
+ humidityThresholdsDescription: "Пороги вологості за типом філаменту для автоматичного сушіння та попереджень. Для змішаного завантаження в одному AMS використовується найнижчий поріг.",
|
|
|
+ humidityThresholdCol: "Поріг",
|
|
|
+ humidityThresholdDefault: "За замовчуванням (невідомі типи)",
|
|
|
+ printModal: "Вікно друку",
|
|
|
+ expandCustomMapping: "Розгорнути настроюване зіставлення за умовчанням",
|
|
|
+ expandCustomMappingDescription: "Під час друку на кількох принтерах показувати розгорнуте зіставлення для кожного принтера AMS.",
|
|
|
+ // User management
|
|
|
+ authentication: "Автентифікація",
|
|
|
+ authEnabledDescription: "Ваш екземпляр захищено автентифікацією користувача",
|
|
|
+ authDisabledDescription: "Увімкніть запит входу та керування доступом користувачів",
|
|
|
+ authDisabledMessage: "Увімкніть автентифікацію, щоб створювати облікові записи користувачів, керувати дозволами та захищати свій екземпляр Bambuddy.",
|
|
|
+ enableAuthentication: "Увімкнути автентифікацію",
|
|
|
+ currentUser: "Поточний користувач",
|
|
|
+ changePassword: "Змінити пароль",
|
|
|
+ admin: "адмін",
|
|
|
+ users: "Користувачі",
|
|
|
+ addUser: "Додати користувача",
|
|
|
+ groups: "Групи",
|
|
|
+ addGroup: "Додати групу",
|
|
|
+ system: "система",
|
|
|
+ noDescription: "Без опису",
|
|
|
+ userCount: "{{count}} користувачів",
|
|
|
+ permissionCount: "Дозволи {{count}}.",
|
|
|
+ createUser: "Створити користувача",
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ enterUsername: "Введіть ім’я користувача",
|
|
|
+ password: "Пароль",
|
|
|
+ enterPassword: "Введіть пароль",
|
|
|
+ passwordRequirements: "Принаймні 8 символів, один великий, один малий, одна цифра та один спеціальний символ.",
|
|
|
+ confirmPassword: "Підтвердити пароль",
|
|
|
+ confirmPasswordPlaceholder: "Підтвердити пароль",
|
|
|
+ // Title tooltips
|
|
|
+ viewReleaseOnGitHub: "Переглянути випуск на GitHub",
|
|
|
+ turnAllPlugsOn: "Увімкнути усі розетки",
|
|
|
+ turnAllPlugsOff: "Вимкнути усі розетки",
|
|
|
+ // Modal: Clear logs
|
|
|
+ clearNotificationLogs: "Очистити журнали сповіщень",
|
|
|
+ clearLogsMessage: "Це назавжди видалить усі журнали сповіщень старше 30 днів. Цю дію не можна скасувати.",
|
|
|
+ clearLogs: "Очистити журнали",
|
|
|
+ // Modal: Reset UI
|
|
|
+ resetUiPreferences: "Скинути налаштування UI.",
|
|
|
+ resetUiPreferencesMessage: "Це скине всі параметри UI до значень за замовчуванням: порядок бічної панелі, тему, макет інформаційної панелі, режими перегляду та параметри сортування. Це НЕ вплине на ваші принтери, архіви та налаштування сервера. Після очищення сторінка перезавантажиться.",
|
|
|
+ resetPreferences: "Скинути налаштування",
|
|
|
+ // Modal: Delete group
|
|
|
+ deleteGroupTitle: "Видалити групу",
|
|
|
+ deleteGroupMessage: "Ви впевнені, що хочете видалити цю групу? Користувачі цієї групи втратять ці дозволи.",
|
|
|
+ deleteGroup: "Видалити групу",
|
|
|
+ // Modal: Disable auth
|
|
|
+ disableAuthenticationTitle: "Вимкнути автентифікацію",
|
|
|
+ disableAuthenticationMessage: "Ви впевнені, що бажаєте вимкнути автентифікацію? Це зробить ваш екземпляр Bambuddy доступним без входу. Усі користувачі залишаться в базі даних, але автентифікацію буде вимкнено.",
|
|
|
+ disableAuthentication: "Вимкнути автентифікацію",
|
|
|
+ // Additional settings
|
|
|
+ configureBambuddy: "Налаштувати Bambuddy",
|
|
|
+ systemDefault: "Системне за замовчуванням",
|
|
|
+ archiveSettings: "Налаштування архіву",
|
|
|
+ newWindow: "Нове вікно",
|
|
|
+ embeddedOverlay: "Вбудоване накладання",
|
|
|
+ preferredSlicer: "Бажаний слайсер",
|
|
|
+ preferredSlicerDescription: "Слайсер для нарізання в застосунку через допоміжний API-сервіс",
|
|
|
+ openInSlicerLabel: "Відкрити у слайсері",
|
|
|
+ openInSlicerInherit: "Такий самий, як API-слайсер",
|
|
|
+ openInSlicerDescription: "Настільний слайсер, який відкриває кнопка «Відкрити в слайсері». Залиште «Такий самий, як API-слайсер», щоб успадкувати вибір, або виберіть інший слайсер для локального використання.",
|
|
|
+ orcaslicerKnownIssuesWarning: "OrcaSlicer 2.3.2 / 2.4.0-dev має відомі помилки CLI, через які не вдається нарізати багато створених Bambu файлів 3MF. Див. проблеми upstream №12426 — аварійне завершення для розфарбованих файлів із кількома екструдерами — та №13386 — відхилення через сувору перевірку діапазонів параметрів. До появи виправлень upstream рекомендовано використовувати Bambu Studio.",
|
|
|
+ useSlicerApi: "Використовувати API слайсера",
|
|
|
+ useSlicerApiDescription: "Якщо ввімкнено, команда «Нарізати» відкриває вбудоване вікно слайсера й викликає допоміжний сервіс slicer-API. Якщо вимкнено — типове значення — файл передається настільному слайсеру через URI-схему.",
|
|
|
+ slicerCard: "Слайсер",
|
|
|
+ orcaslicerApiUrl: "URL допоміжного сервісу OrcaSlicer",
|
|
|
+ bambuStudioApiUrl: "URL допоміжного сервісу Bambu Studio",
|
|
|
+ slicerApiUrlDescription: "URL контейнера допоміжного сервісу slicer-API. Залиште поле порожнім, щоб використовувати типові значення зі змінних середовища SLICER_API_URL / BAMBU_STUDIO_API_URL.",
|
|
|
+ slicerBundlesRemoved: {
|
|
|
+ title: "Пакети профілів слайсера (вилучено)",
|
|
|
+ description: "Імпорт пакетів профілів принтера (.bbscfg) вилучено. Експорт пакетів Bambu Studio містить лише змінені користувачем профілі, тому імпорт не надавав стандартних профілів процесу й філаменту, а під час нарізання використовувалися вбудовані налаштування.",
|
|
|
+ alternatives: "Використовуйте імпорт окремого профілю для власних профілів або синхронізацію через Bambu Cloud / Orca Cloud. Стандартні профілі автоматично надходять із допоміжного сервісу слайсера.",
|
|
|
+ lookupOrder: "Порядок пошуку профілів під час нарізання: 1) імпортовані локально, 2) Orca Cloud, 3) Bambu Cloud, 4) стандартні профілі слайсера.",
|
|
|
+ },
|
|
|
+ externalCameras: "Зовнішні камери",
|
|
|
+ costTracking: "Відстеження витрат",
|
|
|
+ printsOnly: "Лише друк",
|
|
|
+ totalConsumption: "Загальне споживання",
|
|
|
+ dataManagement: "Управління даними",
|
|
|
+ storageUsage: "Використання сховища",
|
|
|
+ storageUsageDescription: "Розподіл використання даних за категоріями",
|
|
|
+ storageUsageTotal: "Всього",
|
|
|
+ storageUsageErrors: "Помилки",
|
|
|
+ storageUsageOtherBreakdown: "Інше (включає статичні ресурси, сценарії та файли конфігурації)",
|
|
|
+ storageUsageSystem: "система",
|
|
|
+ storageUsageData: "Дані",
|
|
|
+ storageUsageUnavailable: "Інформація про використання сховища недоступна",
|
|
|
+ clearNotificationLogsDescription: "Видалити журнали сповіщень старші 30 днів",
|
|
|
+ resetUiPreferencesDescription: "Скинути порядок бічної панелі, тему, режими перегляду та параметри макета. Принтери, архіви та налаштування не впливають.",
|
|
|
+ enableHomeAssistant: "Увімкнути Home Assistant",
|
|
|
+ enableMqtt: "Увімкнути MQTT",
|
|
|
+ useTls: "Використовуйте TLS",
|
|
|
+ enableMetricsEndpoint: "Увімкнути кінцеву точку показників",
|
|
|
+ availableMetrics: "Доступні показники",
|
|
|
+ editUser: "Редагувати користувача",
|
|
|
+ deleteUserTitle: "Видалити користувача",
|
|
|
+ groupName: "Назва групи",
|
|
|
+ // Placeholders
|
|
|
+ leaveEmptyForAnonymous: "Залиште порожнім для анонімного",
|
|
|
+ leaveEmptyForNoAuth: "Залиште порожнім, щоб не було автентифікації",
|
|
|
+ enterNewPassword: "Введіть новий пароль",
|
|
|
+ confirmNewPassword: "Підтвердити новий пароль",
|
|
|
+ enterGroupName: "Введіть назву групи",
|
|
|
+ enterDescriptionOptional: "Введіть опис (необов’язково)",
|
|
|
+ enterCurrentPassword: "Введіть поточний пароль",
|
|
|
+ enterNewPasswordMin6: "Введіть новий пароль (мінімум 6 символів)",
|
|
|
+ toast: {
|
|
|
+ keyCopied: "Ключ скопійовано в буфер обміну",
|
|
|
+ copyFailed: "Не вдалося скопіювати ключ",
|
|
|
+ keyAddedToBrowser: "Ключ додано в браузер API.",
|
|
|
+ clearLogsFailed: "Не вдалося очистити журнали",
|
|
|
+ uiPreferencesReset: "UI налаштування скинуто. Оновлення...",
|
|
|
+ authDisabled: "Автентифікацію успішно вимкнено",
|
|
|
+ authDisableFailed: "Не вдалося вимкнути автентифікацію",
|
|
|
+ apiKeyCreated: "Ключ API створено",
|
|
|
+ apiKeyDeleted: "Ключ API видалено",
|
|
|
+ userCreated: "Користувача створено успішно",
|
|
|
+ userUpdated: "Користувача успішно оновлено",
|
|
|
+ userDeleted: "Користувача успішно видалено",
|
|
|
+ groupCreated: "Групу створено успішно",
|
|
|
+ groupUpdated: "Групу успішно оновлено",
|
|
|
+ groupDeleted: "Групу успішно видалено",
|
|
|
+ fillRequiredFields: "Будь ласка, заповніть усі необхідні поля",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ passwordTooShort: "Пароль має бути не менше 8 символів",
|
|
|
+ passwordNeedsUppercase: "Пароль має містити принаймні одну велику літеру",
|
|
|
+ passwordNeedsLowercase: "Пароль має містити принаймні одну малу літеру",
|
|
|
+ passwordNeedsDigit: "Пароль має містити хоча б одну цифру",
|
|
|
+ passwordNeedsSpecial: "Пароль повинен містити хоча б один спеціальний символ",
|
|
|
+ enterGroupName: "Будь ласка, введіть назву групи",
|
|
|
+ settingsSaved: "Налаштування збережено",
|
|
|
+ noPermissionUpdate: "Ви не маєте дозволу змінювати налаштування",
|
|
|
+ cameraSettingsSaved: "Налаштування камери збережено",
|
|
|
+ enterCameraUrl: "Будь ласка, введіть камеру URL",
|
|
|
+ passwordChanged: "Пароль успішно змінено",
|
|
|
+ connectionFailed: "Помилка підключення",
|
|
|
+ testFailed: "Тест не вдалося",
|
|
|
+ cameraConnected: "Камера підключена{{resolution}}",
|
|
|
+ },
|
|
|
+ testConnection: "Тестове підключення",
|
|
|
+ catalog: {
|
|
|
+ spoolCatalog: "Каталог котушок",
|
|
|
+ spoolCatalogDescription: "Вага порожніх котушок за брендом і типом. Використовується для автоматичного пошуку ваги під час додавання котушок.",
|
|
|
+ searchCatalog: "Пошук у каталозі...",
|
|
|
+ addNewEntry: "Додати новий запис",
|
|
|
+ namePlaceholder: "Назва (наприклад, Bambu Lab - пластик)",
|
|
|
+ weight: "вага",
|
|
|
+ type: "Тип",
|
|
|
+ default: "За замовчуванням",
|
|
|
+ custom: "Власний",
|
|
|
+ noMatch: "Немає записів, що відповідають вашому пошуку",
|
|
|
+ empty: "Немає записів у каталозі",
|
|
|
+ deleteEntry: "Видалити запис",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"?",
|
|
|
+ resetCatalog: "Скинути каталог",
|
|
|
+ resetConfirm: "Скинути каталог до стандартних? Це видалить усі спеціальні записи.",
|
|
|
+ loadFailed: "Не вдалося завантажити каталог котушок",
|
|
|
+ nameWeightRequired: "Назва й маса обов’язкові",
|
|
|
+ entryAdded: "Запис додано",
|
|
|
+ addFailed: "Не вдалося додати запис",
|
|
|
+ entryUpdated: "Запис оновлено",
|
|
|
+ updateFailed: "Не вдалося оновити запис",
|
|
|
+ entryDeleted: "Запис видалено",
|
|
|
+ deleteFailed: "Не вдалося видалити запис",
|
|
|
+ resetSuccess: "Каталог відновлено до типових значень",
|
|
|
+ resetFailed: "Не вдалося скинути каталог",
|
|
|
+ exported: "Експортовано записів: {{count}}",
|
|
|
+ imported: "Імпортовано: {{added}}; пропущено: {{skipped}}",
|
|
|
+ importFailed: "Не вдалося імпортувати: недійсний формат JSON.",
|
|
|
+ exportTooltip: "Експортувати каталог до JSON",
|
|
|
+ importTooltip: "Імпорт каталогу з JSON",
|
|
|
+ resetTooltip: "Відновити налаштування за замовчуванням",
|
|
|
+ selectedCount: "Вибрано: {{count}}",
|
|
|
+ deleteSelected: "Видалити вибране",
|
|
|
+ bulkDeleteConfirm: "Видалити вибрані записи ({{count}})?",
|
|
|
+ bulkDeleted: "Видалено записів: {{count}}",
|
|
|
+ bulkDeleteFailed: "Не вдалося видалити записи",
|
|
|
+ material: "матеріал",
|
|
|
+ spoolWeight: "Вага котушки",
|
|
|
+ color: "Колір",
|
|
|
+ updateSpoolWeight: "Оновити вагу котушки",
|
|
|
+ filamentUpdated: "Філамент оновлено",
|
|
|
+ filamentUpdateFailed: "Не вдалося оновити філамент",
|
|
|
+ filamentUpdateInvalid: "Недійсні дані філаменту",
|
|
|
+ keepExistingSpoolWeight: "Зберегти попередню вагу для наявних котушок",
|
|
|
+ keepExistingSpoolWeightDesc: "Котушки, створені з цим типом філаменту, зберігають стару вагу тари. Нові котушки використовують оновлене значення.",
|
|
|
+ applyToAllSpools: "Застосувати до всіх котушок",
|
|
|
+ applyToAllSpoolsDesc: "Усі розрахунки ваги для цього типу філаменту одразу використовують нову вагу тари.",
|
|
|
+ },
|
|
|
+ colorCatalog: {
|
|
|
+ title: "Каталог кольорів",
|
|
|
+ description: "Кольори філаменту за виробником і матеріалом. Використовується для автоматичного пошуку кольору під час додавання котушок.",
|
|
|
+ searchColors: "Пошук кольорів...",
|
|
|
+ allManufacturers: "Усі виробники",
|
|
|
+ addNewColor: "Додати новий колір",
|
|
|
+ manufacturer: "Виробник",
|
|
|
+ colorName: "Назва кольору",
|
|
|
+ hex: "Hex-код",
|
|
|
+ materialOptional: "Матеріал (необов’язково)",
|
|
|
+ showing: "Показано {{filtered}} із {{total}} кольорів",
|
|
|
+ noMatch: "Жоден колір не відповідає вашому запиту",
|
|
|
+ empty: "Кольори в каталозі відсутні",
|
|
|
+ deleteColor: "Видалити колір",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"?",
|
|
|
+ resetCatalog: "Скинути каталог кольорів",
|
|
|
+ resetConfirm: "Скинути каталог до стандартних? Це видалить усі власні кольори.",
|
|
|
+ sync: "Синхронізувати",
|
|
|
+ starting: "Запуск…",
|
|
|
+ syncTooltip: "Синхронізація з FilamentColors.xyz (2000+ кольорів, може зайняти хвилину)",
|
|
|
+ loadFailed: "Не вдалося завантажити каталог кольорів",
|
|
|
+ fieldsRequired: "Необхідно вказати виробника, назву кольору та шістнадцятковий колір",
|
|
|
+ colorAdded: "Додано колір",
|
|
|
+ addFailed: "Не вдалося додати колір",
|
|
|
+ colorUpdated: "Колір оновлено",
|
|
|
+ updateFailed: "Не вдалося оновити колір",
|
|
|
+ colorDeleted: "Колір видалено",
|
|
|
+ deleteFailed: "Не вдалося видалити колір",
|
|
|
+ resetSuccess: "Каталог кольорів відновлено до типових значень",
|
|
|
+ resetFailed: "Не вдалося скинути каталог",
|
|
|
+ syncUpToDate: "Вже оновлено (кольори {{count}} перевірено)",
|
|
|
+ syncComplete: "Додано: {{added}}; уже існувало: {{skipped}}",
|
|
|
+ syncError: "Помилка синхронізації",
|
|
|
+ syncFailed: "Не вдалося синхронізувати з FilamentColors.xyz",
|
|
|
+ exported: "Експортовано кольорів: {{count}}",
|
|
|
+ imported: "Імпортовано: {{added}}; пропущено: {{skipped}}",
|
|
|
+ importFailed: "Не вдалося імпортувати: недійсний формат JSON.",
|
|
|
+ selectedCount: "Вибрано: {{count}}",
|
|
|
+ deleteSelected: "Видалити вибране",
|
|
|
+ bulkDeleteConfirm: "Ви впевнені, що бажаєте видалити кольори {{count}}?",
|
|
|
+ bulkDeleted: "Видалено кольорів: {{count}}",
|
|
|
+ bulkDeleteFailed: "Не вдалося видалити кольори",
|
|
|
+ },
|
|
|
+ // General tab
|
|
|
+ dateFormat: "Формат дати",
|
|
|
+ dateFormatUs: "США (MM/DD/YYYY)",
|
|
|
+ dateFormatEu: "ЄС (DD/MM/YYYY)",
|
|
|
+ dateFormatIso: "ISO (РРРР-ММ-ДД)",
|
|
|
+ timeFormat: "Формат часу",
|
|
|
+ timeFormat12: "12 годин (15:30)",
|
|
|
+ timeFormat24: "24 години (15:30)",
|
|
|
+ defaultPrinter: "Принтер за умовчанням",
|
|
|
+ defaultPrinterDescription: "Попередньо вибирати цей принтер для вивантажень, повторного друку та інших операцій.",
|
|
|
+ slicerBambuStudio: "Bambu Studio",
|
|
|
+ slicerOrcaSlicer: "OrcaSlicer",
|
|
|
+ sidebarOrderDescription: "Використовуйте бічну панель, щоб змінити порядок елементів, скинути видимість і керувати спеціальними посиланнями.",
|
|
|
+ setDefault: "Установити за замовчуванням",
|
|
|
+ sidebarOrderSetDefaultHint: "За замовчуванням застосовує поточний порядок меню до користувачів, які не налаштували свій.",
|
|
|
+ sidebarDefaultSet: "Встановлено стандартний порядок меню.",
|
|
|
+ sidebarDefaultCleared: "Порядок меню за замовчуванням видалено.",
|
|
|
+ sidebarDefaultFailed: "Не вдалося встановити порядок меню за замовчуванням.",
|
|
|
+ reset: "Скинути",
|
|
|
+ // Appearance
|
|
|
+ darkMode: "Темний режим",
|
|
|
+ lightMode: "Світловий режим",
|
|
|
+ active: "(активний)",
|
|
|
+ background: "Фон",
|
|
|
+ accent: "Акцент",
|
|
|
+ style: "Стиль",
|
|
|
+ bgNeutral: "Нейтральний",
|
|
|
+ bgWarm: "Теплий",
|
|
|
+ bgCool: "круто",
|
|
|
+ bgOled: "OLED Чорний",
|
|
|
+ bgSlate: "Шиферно-блакитний",
|
|
|
+ bgForest: "Зелений ліс",
|
|
|
+ accentGreen: "Зелений",
|
|
|
+ accentTeal: "Чирок",
|
|
|
+ accentBlue: "Синій",
|
|
|
+ accentOrange: "Помаранчевий",
|
|
|
+ accentPurple: "Фіолетовий",
|
|
|
+ accentRed: "Червоний",
|
|
|
+ styleClassic: "класичний",
|
|
|
+ styleGlow: "Світіння",
|
|
|
+ styleVibrant: "Яскравий",
|
|
|
+ themeToggleHint: "Перемикайтеся між темним, світлим і системним режимами за допомогою значка на бічній панелі.",
|
|
|
+ // Archive
|
|
|
+ autoArchivePrints: "Автоматично архівувати друки",
|
|
|
+ autoArchiveDescription: "Автоматично зберігати файли 3MF після завершення друку",
|
|
|
+ saveThumbnailsDescription: "Витягніть і збережіть зображення попереднього перегляду з файлів 3MF.",
|
|
|
+ captureFinishPhotoDescription: "Зробіть фотографію з камери принтера після завершення друку. Bambuddy записує короткий проміжок часу під час друку, щоб фотографію можна було отримати з моменту, коли стіл опускається; файл уповільненої зйомки зберігається, якщо ви ввімкнули уповільнену зйомку для цього друку, інакше він автоматично видаляється після зйомки фотографії.",
|
|
|
+ ffmpegNotInstalled: "ffmpeg не встановлено",
|
|
|
+ ffmpegRequired: "Для зйомки камерою потрібен ffmpeg. Встановіть його за допомогою <brew>brew install ffmpeg</brew> (macOS) або <apt>apt install ffmpeg</apt> (Linux).",
|
|
|
+ // Camera
|
|
|
+ camera: "Камера",
|
|
|
+ cameraViewMode: "Режим перегляду камери",
|
|
|
+ cameraOverlayDescription: "Камера відкривається в накладці зі змінним розміром на головному екрані",
|
|
|
+ cameraWindowDescription: "Камера відкривається в окремому вікні браузера",
|
|
|
+ externalCamerasDescription: "Налаштуйте зовнішні камери замість вбудованої камери принтера. Підтримує потоки MJPEG, знімки RTSP, HTTP і камери USB (V4L2). Якщо ввімкнено, зовнішня камера використовується для перегляду в реальному часі та готових фотографій.",
|
|
|
+ cameraPlaceholderUsb: "Шлях пристрою (/dev/video0)",
|
|
|
+ cameraPlaceholderUrl: "Камера URL (rtsp://... або http://...)",
|
|
|
+ cameraTypeMjpeg: "Потік MJPEG",
|
|
|
+ cameraTypeRtsp: "RTSP Потік",
|
|
|
+ cameraTypeSnapshot: "HTTP Знімок",
|
|
|
+ cameraTypeUsb: "USB Камера (V4L2)",
|
|
|
+ cameraSnapshotUrl: "URL знімка (необов’язково)",
|
|
|
+ cameraSnapshotUrlPlaceholder: "http://192.168.1.61:1984/api/frame.jpeg?src=printer",
|
|
|
+ cameraSnapshotUrlHelp: "Одиночний кадр URL використовується для ескізів сповіщень, фінішних фотографій, шарових кадрів уповільненої зйомки та виявлення пластин. Уповільнена зйомка та виявлення пластин потребують окремого перемикача для кожного принтера — це URL є лише джерелом зображення, з якого вони беруть участь, коли активні. Залиште поле порожнім для запису з прямої трансляції вище. Корисно для камер go2rtc (/api/frame.jpeg) і IP із спеціальною кінцевою точкою знімка.",
|
|
|
+ cameraRotation: "Обертання",
|
|
|
+ test: "Тест",
|
|
|
+ connected: "Підключено",
|
|
|
+ disconnected: "Відключено",
|
|
|
+ // Cost tracking
|
|
|
+ currency: "Валюта",
|
|
|
+ defaultFilamentCost: "Вартість філаменту за замовчуванням (за кг)",
|
|
|
+ electricityCost: "Вартість електроенергії за kWh",
|
|
|
+ energyDisplayMode: "Режим відображення енергії",
|
|
|
+ energyModePrintDescription: "Інформаційна панель показує суму енергії, використаної під час друку",
|
|
|
+ energyModeTotalDescription: "На приладовій панелі показано енергію від розумних розеток протягом усього терміну служби",
|
|
|
+ // File Manager
|
|
|
+ fileManager: "Менеджер файлів",
|
|
|
+ createArchiveEntry: "Створити архівний запис під час друку",
|
|
|
+ createArchiveEntryDescription: "Під час друку з диспетчера файлів можна додатково створити запис архіву",
|
|
|
+ lowDiskSpaceWarning: "Попередження про брак місця на диску",
|
|
|
+ lowDiskSpaceDescription: "Показувати попередження, коли вільний простір на диску стає нижче цього порогу",
|
|
|
+ // Updates
|
|
|
+ printerFirmware: "Прошивка принтера",
|
|
|
+ checkFirmwareDescription: "Перевірте наявність оновлень прошивки принтера від Bambu Lab",
|
|
|
+ bambuddySoftware: "Bambuddy Програмне забезпечення",
|
|
|
+ autoCheckDescription: "Автоматично перевіряти наявність нових версій під час запуску",
|
|
|
+ checkNow: "Перевір зараз",
|
|
|
+ updateAvailableVersion: "Доступне оновлення: v{{version}}",
|
|
|
+ releaseNotes: "Примітки до випуску",
|
|
|
+ updateViaDocker: "Оновити через Docker Написати:",
|
|
|
+ updateViaHomeAssistant: "Оновленнями керує супервізор Home Assistant. Відкрийте «Налаштування» → «Додатки» → Bambuddy у Home Assistant, щоб установити нову версію.",
|
|
|
+ updateViaWindowsInstaller: "Інсталяції Windows оновлюються шляхом повторного запуску інсталятора. Завантажте нову версію нижче — ваші дані, налаштування та принтери збережуться.",
|
|
|
+ downloadWindowsInstaller: "Завантажити інсталятор для v{{version}}",
|
|
|
+ installUpdate: "Встановити оновлення",
|
|
|
+ latestVersionRunning: "Ви використовуєте останню версію",
|
|
|
+ failedToCheckUpdates: "Не вдалося перевірити наявність оновлень: {{error}}",
|
|
|
+ // Data Management
|
|
|
+ backupRestore: "Резервне копіювання та відновлення",
|
|
|
+ backupRestoreDescription: "Експорт /import налаштувань і конфігурація GitHub резервного копіювання",
|
|
|
+ goToBackup: "Перейдіть до Резервного копіювання",
|
|
|
+ // Network tab
|
|
|
+ externalUrl: "Зовнішній URL",
|
|
|
+ externalUrlDescription: "Зовнішній URL, де Bambuddy доступний. Використовується для зображень сповіщень і зовнішньої інтеграції.",
|
|
|
+ bambuddyUrl: "Bambuddy URL",
|
|
|
+ externalUrlHint: "Включити протокол і порт (наприклад, http://192.168.1.100:8000)",
|
|
|
+ ftpRetry: "FTP Спробуйте ще раз",
|
|
|
+ ftpRetryDescription: "Повторювати операції FTP за ненадійного Wi-Fi принтера. Застосовується до завантаження 3MF і таймлапсів, вивантаження завдань друку та оновлення прошивки.",
|
|
|
+ autoRetryDescription: "Автоматично повторити невдалі операції FTP.",
|
|
|
+ retryAttempts: "Повторні спроби",
|
|
|
+ retryDelay: "Затримка повторної спроби",
|
|
|
+ connectionTimeout: "Час очікування підключення",
|
|
|
+ time_one: "час {{count}}.",
|
|
|
+ time_other: "{{count}} разів",
|
|
|
+ second_one: "{{count}} секунда",
|
|
|
+ second_other: "{{count}} секунд",
|
|
|
+ nSeconds: "{{count}} секунд",
|
|
|
+ increaseForWeakWifi: "Підвищення для принтерів із слабким WiFi",
|
|
|
+ // Home Assistant
|
|
|
+ homeAssistant: "Home Assistant",
|
|
|
+ homeAssistantFullDescription: "Підключіться до Home Assistant, щоб керувати розумними розетками через REST API HA. Підтримує об’єкти switch, light, input_boolean і script.",
|
|
|
+ homeAssistantUrl: "Home Assistant URL",
|
|
|
+ longLivedAccessToken: "Довгостроковий токен доступу",
|
|
|
+ haTokenHint: "Створіть токен у HA: Профіль → Довгострокові токени доступу → Створити токен",
|
|
|
+ connectionSuccessful: "Підключення успішне",
|
|
|
+ connectionFailed: "Збій підключення",
|
|
|
+ haConnectionSuccess: "Успішно підключено до Home Assistant.",
|
|
|
+ haConnectionFailed: "Не вдалося підключитися до Home Assistant.",
|
|
|
+ // MQTT
|
|
|
+ mqttPublishing: "MQTT Видавництво",
|
|
|
+ mqttDescription: "Публікуйте події BamBuddy зовнішньому брокеру MQTT для інтеграції з Node-RED, Home Assistant та іншими системами автоматизації.",
|
|
|
+ mqttEnableDescription: "Публікувати події зовнішньому MQTT брокеру",
|
|
|
+ brokerHostname: "Ім’я хоста брокера",
|
|
|
+ port: "Порт",
|
|
|
+ usernameOptional: "Ім’я користувача (необов’язково)",
|
|
|
+ passwordOptional: "Пароль (необов’язково)",
|
|
|
+ topicPrefix: "Префікс теми",
|
|
|
+ topicPrefixHint: "Теми будуть: {{prefix}}/printers/<serial>/status тощо.",
|
|
|
+ // Prometheus
|
|
|
+ prometheusMetrics: "Prometheus Метрики",
|
|
|
+ prometheusEndpointDescription: "Показати показники принтера на <code>/api/v1/metrics</code> для моніторингу Prometheus/Grafana.",
|
|
|
+ bearerTokenOptional: "Токен Bearer (необов’язково)",
|
|
|
+ bearerTokenHint: "Якщо встановлено, запити мають містити <code>Авторизація: носій <token></code>",
|
|
|
+ metricsConnectionStatus: "Статус підключення",
|
|
|
+ metricsPrinterState: "Стан принтера (неактивний /printing/etc)",
|
|
|
+ metricsPrintProgress: "Прогрес друку 0-100%",
|
|
|
+ metricsBedTemp: "Температура столу",
|
|
|
+ metricsNozzleTemp: "Температура сопла",
|
|
|
+ metricsPrintsTotal: "Загальна кількість друків за результатами",
|
|
|
+ metricsMore: "...і багато іншого (шари, вентилятори, черга, використання філаментів)",
|
|
|
+ // Smart Plugs
|
|
|
+ smartPlugsDescription: "Підключіть розумні розетки (Tasmota або Home Assistant), щоб автоматизувати керування живленням і відстежувати споживання електроенергії вашими принтерами.",
|
|
|
+ allOn: "Все включено",
|
|
|
+ allOff: "Все вимкнено",
|
|
|
+ addSmartPlug: "Додати розумну розетку",
|
|
|
+ energySummary: "Відновити енергетики",
|
|
|
+ currentPower: "Поточна потужність",
|
|
|
+ plugsOnline: "Розумні розетки в мережі: {{reachable}}/{{total}}",
|
|
|
+ today: "Сьогодні",
|
|
|
+ yesterday: "вчора",
|
|
|
+ total: "Всього",
|
|
|
+ enablePlugsForSummary: "Увімкніть розетки, щоб переглянути підсумок енергії",
|
|
|
+ addNotificationProvider: "додати",
|
|
|
+ // Users
|
|
|
+ systemBadge: "(Система)",
|
|
|
+ creating: "Створення...",
|
|
|
+ changing: "Зміна...",
|
|
|
+ deleteUserAndItems: "Видалити користувача ТА його елементи",
|
|
|
+ deleteUserKeepItems: "Видалити користувача, зберегти елементи (стати без власника)",
|
|
|
+ ok: "добре",
|
|
|
+
|
|
|
+ // 2FA settings
|
|
|
+ twoFa: {
|
|
|
+ totpTitle: "Програма Authenticator (TOTP)",
|
|
|
+ totpDesc: "Використовуйте програму автентифікації, наприклад Google Authenticator Aegis або Authy.",
|
|
|
+ emailOtpTitle: "Одноразовий код електронною поштою",
|
|
|
+ emailOtpDesc: "Надішліть одноразовий код на {{email}} під час входу.",
|
|
|
+ emailOtpNoEmail: "Щоб увімкнути цей метод, додайте адресу електронної пошти до свого облікового запису.",
|
|
|
+ addEmailFirst: "У вашому обліковому записі немає адреси електронної пошти. Попросіть адміністратора додати її, перш ніж вмикати одноразові коди електронною поштою.",
|
|
|
+ setupTotp: "Налаштувати додаток Authenticator",
|
|
|
+ setupAuthApp: "Налаштувати додаток Authenticator",
|
|
|
+ setupInstructions: "Відскануйте наведений нижче QR-код за допомогою програми автентифікації, а потім підтвердьте кодом.",
|
|
|
+ manualEntry: "Не можете сканувати? Введіть цей секрет вручну:",
|
|
|
+ scannedContinue: "Код відскановано — продовжити",
|
|
|
+ enterCodeToConfirm: "Введіть 6-значний код із програми автентифікації, щоб підтвердити налаштування.",
|
|
|
+ activate: "Активувати",
|
|
|
+ disableTotp: "Вимкнути автентифікатор",
|
|
|
+ disableConfirmHint: "Введіть дійсний код TOTP або резервний код, щоб вимкнути автентифікатор.",
|
|
|
+ totpDisabled: "Програму Authenticator вимкнено.",
|
|
|
+ emailOtpEnabled: "Одноразові коди електронною поштою ввімкнено.",
|
|
|
+ emailOtpDisabled: "Одноразові коди електронною поштою вимкнено.",
|
|
|
+ smtpRequired: "Спочатку налаштуйте та перевірте параметри SMTP.",
|
|
|
+ invalidCode: "Невірний код. Спробуйте ще раз.",
|
|
|
+ enableEmailOtp: "Увімкнути одноразові коди електронною поштою",
|
|
|
+ disableEmailOtp: "Вимкнути одноразові коди електронною поштою",
|
|
|
+ emailSetupEnterCode: "Код підтвердження надіслано на вашу адресу електронної пошти. Введіть його нижче, щоб підтвердити доступ до цієї поштової скриньки.",
|
|
|
+ verifyAndEnable: "Перевірити й увімкнути",
|
|
|
+ emailDisablePasswordHint: "Введіть пароль свого облікового запису, щоб підтвердити вимкнення OTP електронної пошти.",
|
|
|
+ passwordPlaceholder: "Введіть свій пароль",
|
|
|
+ backupCodesTitle: "Зберегти резервні коди",
|
|
|
+ backupCodesWarning: "Збережіть ці коди в безпечному місці. Кожен код можна використати лише один раз, і він більше не відображатиметься.",
|
|
|
+ backupCodesRemaining: "Залишилося резервних кодів: {{count}}",
|
|
|
+ savedCodes: "Я зберіг свої коди",
|
|
|
+ regenBackup: "Створити нові резервні коди",
|
|
|
+ regenBackupHint: "Введіть поточний код TOTP, щоб створити 10 нових резервних кодів. Усі існуючі резервні коди стануть недійсними.",
|
|
|
+ newBackupCodes: "Нові резервні коди",
|
|
|
+ linkedAccounts: "Пов’язані облікові записи SSO.",
|
|
|
+ linkedAccountsDesc: "Ці зовнішні постачальники ідентифікаційної інформації пов’язані з вашим обліковим записом.",
|
|
|
+ oidcUnlinked: "Обліковий запис від’єднано.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Session Policy (#1706) — admin-configurable session lifetime ceiling.
|
|
|
+ sessionPolicy: {
|
|
|
+ title: "Політика сеансу",
|
|
|
+ description: "Максимальна тривалість сеансу для входу нових користувачів. Уже випущені токени зберігають початковий термін дії.",
|
|
|
+ preset24h: "24 години",
|
|
|
+ preset7d: "7 днів",
|
|
|
+ preset30d: "30 днів",
|
|
|
+ customHoursLabel: "Тривалість користувацького сеансу в годинах",
|
|
|
+ hoursSuffix: "години",
|
|
|
+ warning: "Довші сеанси знижують захист від автоматичного виходу. Рекомендовано лише для надійних розгортань для одного користувача.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // OIDC provider settings
|
|
|
+ oidc: {
|
|
|
+ title: "Постачальники SSO / OIDC",
|
|
|
+ desc: "Налаштуйте постачальників OpenID Connect, щоб дозволити єдиний вхід через зовнішніх постачальників ідентифікації.",
|
|
|
+ addProvider: "Додати постачальника",
|
|
|
+ newProvider: "Новий постачальник",
|
|
|
+ empty: "Постачальників OIDC ще не налаштовано.",
|
|
|
+ created: "Постачальник створено.",
|
|
|
+ updated: "Постачальника оновлено.",
|
|
|
+ deleted: "Постачальника видалено.",
|
|
|
+ refreshIcon: "Значок оновлення",
|
|
|
+ removeIcon: "Видалити значок",
|
|
|
+ iconRefreshed: "Значок оновлено.",
|
|
|
+ iconRemoved: "Значок видалено.",
|
|
|
+ iconFetchFailed: "Не вдалося отримати значок за URL постачальника.",
|
|
|
+ deleteTitle: "Видалити постачальника",
|
|
|
+ deleteMessage: "Видалити «{{name}}»? Усі пов’язані облікові записи користувачів буде від’єднано.",
|
|
|
+ form: {
|
|
|
+ name: "Відображуване ім’я",
|
|
|
+ issuerUrl: "URL емітента",
|
|
|
+ clientId: "ID клієнта",
|
|
|
+ clientSecret: "Секрет клієнта",
|
|
|
+ scopes: "Області доступу",
|
|
|
+ iconUrl: "URL значка (необов’язково)",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ autoCreate: "Автоматичне створення користувачів",
|
|
|
+ autoCreateDesc: "Автоматично створювати локальний обліковий запис під час першого входу.",
|
|
|
+ autoLink: "Автоматичне пов’язування наявних облікових записів",
|
|
|
+ autoLinkDesc: "Автоматично пов’язувати наявні локальні облікові записи за збігом адреси електронної пошти під час першого входу.",
|
|
|
+ secretHint: "залиште порожнім, щоб зберегти поточне значення",
|
|
|
+ secretPlaceholder: "новий секрет",
|
|
|
+ emailClaim: "Поле електронної пошти",
|
|
|
+ emailClaimDesc: "Поле JWT, що використовується як адреса електронної пошти. Для Azure Entra ID, який не надсилає email_verified, використовуйте preferred_username або upn. Указуйте лише назви надійних полів.",
|
|
|
+ emailClaimPlaceholder: "email",
|
|
|
+ emailClaimCustomClaimAutoLinkWarning: "Власне поле можна безпечно використовувати для автоматичного пов’язування, лише якщо його значенням керує адміністратор організації, наприклад upn або preferred_username в Azure Entra ID. Не вмикайте автоматичне пов’язування, якщо IdP дозволяє користувачам самостійно задавати це поле.",
|
|
|
+ requireEmailVerified: "Вимагати підтвердження електронної пошти",
|
|
|
+ requireEmailVerifiedDesc: "Приймати поле електронної пошти лише тоді, коли постачальник позначив адресу як підтверджену.",
|
|
|
+ requireEmailVerifiedWarning: "Попередження: адресу електронної пошти буде прийнято навіть без підтвердження. Використовуйте це лише з надійними постачальниками.",
|
|
|
+ requireEmailVerifiedAutoLink: "Щоб змінити це налаштування, спочатку вимкніть автоматичне пов’язування.",
|
|
|
+ defaultGroup: "Група за замовчуванням",
|
|
|
+ defaultGroupDesc: "Група, яку призначають автоматично створеним користувачам. Якщо її не задано, використовується група «Глядачі».",
|
|
|
+ defaultGroupViewersFallback: "Глядачі (за замовчуванням)",
|
|
|
+ autologin: "Автовхід",
|
|
|
+ autologinDesc: "Одразу перенаправляти неавтентифікованих відвідувачів до цього постачальника. Автоматичний вхід можна ввімкнути лише для одного постачальника.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ encryption: {
|
|
|
+ title: "Стан шифрування MFA",
|
|
|
+ enabledFromEnv: "Шифрування даних у сховищі ввімкнено — ключ отримано зі змінної середовища MFA_ENCRYPTION_KEY",
|
|
|
+ enabledFromFile: "Шифрування даних у сховищі ввімкнено — ключ завантажено з каталогу даних",
|
|
|
+ enabledGenerated: "Шифрування даних у сховищі ввімкнено з автоматично створеним ключем",
|
|
|
+ notConfigured: "Шифрування даних у сховищі не налаштовано",
|
|
|
+ notConfiguredDesc: "Секрети TOTP і client_secret постачальників OIDC зберігаються як відкритий текст. Установіть MFA_ENCRYPTION_KEY або перезапустіть Bambuddy з доступним для запису каталогом даних, щоб ключ було створено автоматично.",
|
|
|
+ allEncrypted: "Усі секрети MFA зашифровано у сховищі.",
|
|
|
+ legacyRowsLabel: "Застарілі рядки відкритого тексту",
|
|
|
+ encryptedRowsLabel: "Зашифровані рядки",
|
|
|
+ legacyRowsWarning: "Виявлено незашифрованих застарілих записів: {{count}}. Повторно збережіть постачальника OIDC або заново зареєструйте застосунок автентифікації користувача, щоб перенести дані до зашифрованого сховища.",
|
|
|
+ backupHint: "Автоматично згенерований ключ зберігається в DATA_DIR/.mfa_encryption_key і включено до локальних резервних ZIP-файлів. Зберігайте свої резервні копії в безпеці або явно встановіть MFA_ENCRYPTION_KEY.",
|
|
|
+ decryptionBrokenTitle: "Відсутній ключ шифрування",
|
|
|
+ decryptionBrokenError: "Не вдається розшифрувати записів: {{count}}, оскільки ключ шифрування більше недоступний. Для відновлення поверніть попередній MFA_ENCRYPTION_KEY або DATA_DIR/.mfa_encryption_key.",
|
|
|
+ migrationErrorWarning: "{{count}} застарілих рядків не вдалося повторно зашифрувати під час запуску. Перевірте журнали сервера та перезапустіть Bambuddy, щоб повторити спробу.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Slicer Pipeline limits (#1425 PR C). Admin-tunable cap that constrains
|
|
|
+ // the copies input in the Run-with-pipeline modal. Lives on the Workflow
|
|
|
+ // tab's Queue & Dispatch sub-tab.
|
|
|
+ pipelineLimits: {
|
|
|
+ title: "Межі конвеєра слайсера",
|
|
|
+ maxCopiesLabel: "Максимальна кількість копій за один запуск",
|
|
|
+ maxCopiesDesc: "Верхня межа копій, які оператори можуть запитувати під час запуску конвеєра. Обмеження на стороні сервера становить 1000.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Slicer Pipelines (#1425): list/edit/delete preset bundles users saved
|
|
|
+ // from the Slice dialog. Lives in Settings → Workflow → Pipelines sub-tab.
|
|
|
+ pipelines: {
|
|
|
+ title: "Конвеєри слайсера",
|
|
|
+ subtitle: "Багаторазові набори профілів — принтер, процес, філаменти й тип столу. Збережіть набір у вікні нарізання та застосовуйте його до наступного файлу одним натисканням.",
|
|
|
+ loading: "Завантаження конвеєрів…",
|
|
|
+ loadError: "Не вдалося завантажити конвеєри.",
|
|
|
+ confirmDelete: "Видалити цей конвеєр? Це неможливо скасувати.",
|
|
|
+ staleWarning: "Одного або кількох пов’язаних профілів більше не існує. Щоб виправити це, повторно збережіть конвеєр у вікні нарізання.",
|
|
|
+ empty: {
|
|
|
+ title: "Конвеєрів ще немає.",
|
|
|
+ howto: "Відкрийте вікно нарізання для будь-якого файлу, виберіть принтер, процес, філаменти й тип столу, а потім натисніть «Зберегти як конвеєр». Збережені конвеєри з’являться тут.",
|
|
|
+ },
|
|
|
+ field: {
|
|
|
+ name: "Назва конвеєра",
|
|
|
+ description: "опис",
|
|
|
+ targetPrinter: "Цільовий принтер",
|
|
|
+ noTarget: "— Немає цілі —",
|
|
|
+ // PR C
|
|
|
+ targetKind: "Цільовий тип",
|
|
|
+ targetKindSpecific: "Конкретний принтер",
|
|
|
+ targetKindClass: "Клас принтера",
|
|
|
+ targetModelClass: "Модель принтера",
|
|
|
+ fanoutStrategy: "Стратегія розподілу",
|
|
|
+ fanout: {
|
|
|
+ max_parallel: "Максимально паралельно — розподіляти між усіма відповідними вільними принтерами",
|
|
|
+ round_robin: "По колу — почергово використовувати відповідні принтери",
|
|
|
+ fill_one_first: "Спочатку один принтер — призначити всі копії одному принтеру",
|
|
|
+ },
|
|
|
+ // Short labels for the inline target chip on each pipeline card.
|
|
|
+ // The verbose ones above explain the strategy in the editor; the
|
|
|
+ // card just needs a compact reminder of which one is in use.
|
|
|
+ fanoutShort: {
|
|
|
+ max_parallel: "паралельний",
|
|
|
+ round_robin: "по колу",
|
|
|
+ fill_one_first: "спочатку один",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ action: {
|
|
|
+ save: "зберегти",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ rename: "Перейменувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ },
|
|
|
+ slot: {
|
|
|
+ printer: "Принтер",
|
|
|
+ process: "процес",
|
|
|
+ filament: "Філамент",
|
|
|
+ filamentN: "Філамент {{n}}",
|
|
|
+ filamentAll: "Усі {{n}} слотів",
|
|
|
+ bed: "Стіл",
|
|
|
+ },
|
|
|
+ // PR C polish — grouped sections in the card body, plus the
|
|
|
+ // panel-level search + filter row.
|
|
|
+ group: {
|
|
|
+ profiles: "Профілі",
|
|
|
+ filaments: "філаменти",
|
|
|
+ },
|
|
|
+ searchPlaceholder: "Шукати конвеєри…",
|
|
|
+ filterTargetType: "Фільтрувати за типом цілі",
|
|
|
+ filterTarget: "Фільтрувати за ціллю",
|
|
|
+ filter: {
|
|
|
+ all: "Всі цілі",
|
|
|
+ noTarget: "Ціль не встановлена",
|
|
|
+ count: "{{shown}} / {{total}}",
|
|
|
+ noMatches: "Жоден конвеєр не відповідає поточним фільтрам.",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ saved: "Конвеєр збережено",
|
|
|
+ saveFailed: "Не вдалося зберегти",
|
|
|
+ deleted: "Конвеєр видалено",
|
|
|
+ deleteFailed: "Не вдалося видалити",
|
|
|
+ },
|
|
|
+ // PR B target binding + last-run summary
|
|
|
+ noTargetHint: "Щоб запустити конвеєр, виберіть цільовий принтер",
|
|
|
+ noTargetWarning: "Перед запуском цього конвеєра встановіть цільовий принтер.",
|
|
|
+ runs: {
|
|
|
+ lastRun: "Останній запуск",
|
|
|
+ status: {
|
|
|
+ queued: "в черзі",
|
|
|
+ slicing: "нарізка",
|
|
|
+ dispatching: "надсилання",
|
|
|
+ in_progress: "друк",
|
|
|
+ completed: "завершено",
|
|
|
+ failed: "не вдалося",
|
|
|
+ partial_failure: "частково невдало",
|
|
|
+ cancelled: "скасовано",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notifications (for push notifications)
|
|
|
+ notification: {
|
|
|
+ printStarted: {
|
|
|
+ title: "Друк розпочато",
|
|
|
+ body: "{{printer}}: розпочато друк {{filename}}",
|
|
|
+ },
|
|
|
+ printCompleted: {
|
|
|
+ title: "Друк завершено",
|
|
|
+ body: "{{printer}}: {{filename}} завершено успішно",
|
|
|
+ },
|
|
|
+ printFailed: {
|
|
|
+ title: "Помилка друку",
|
|
|
+ body: "{{printer}}: не вдалося надрукувати {{filename}}",
|
|
|
+ },
|
|
|
+ printStopped: {
|
|
|
+ title: "Друк зупинено",
|
|
|
+ body: "{{printer}}: {{filename}} було зупинено",
|
|
|
+ },
|
|
|
+ printProgress: {
|
|
|
+ title: "Перебіг друку",
|
|
|
+ body: "{{printer}}: {{filename}} виконано {{percent}}%.",
|
|
|
+ },
|
|
|
+ printerOffline: {
|
|
|
+ title: "Принтер не в мережі",
|
|
|
+ body: "{{printer}} не в мережі",
|
|
|
+ },
|
|
|
+ printerError: {
|
|
|
+ title: "Помилка принтера",
|
|
|
+ body: "{{printer}}: {{error}}",
|
|
|
+ },
|
|
|
+ filamentLow: {
|
|
|
+ title: "Закінчується філамент",
|
|
|
+ body: "{{printer}}: філамент майже закінчився",
|
|
|
+ },
|
|
|
+ maintenanceDue: {
|
|
|
+ title: "Технічне обслуговування",
|
|
|
+ body: "{{printer}}: потрібна увага — {{items}}",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Errors
|
|
|
+ errors: {
|
|
|
+ generic: "Щось пішло не так",
|
|
|
+ networkError: "Помилка мережі. Перевірте підключення.",
|
|
|
+ notFound: "Не знайдено",
|
|
|
+ unauthorized: "Доступ не авторизовано",
|
|
|
+ serverError: "Помилка сервера",
|
|
|
+ validationError: "Перевірте введені дані",
|
|
|
+ printerConnectionFailed: "Не вдалося підключитися до принтера",
|
|
|
+ saveFailed: "Не вдалося зберегти зміни",
|
|
|
+ deleteFailed: "Не вдалося видалити",
|
|
|
+ loadFailed: "Не вдалося завантажити дані",
|
|
|
+ },
|
|
|
+
|
|
|
+ // HMS Errors modal
|
|
|
+ hmsErrors: {
|
|
|
+ title: "Помилки - {{name}}",
|
|
|
+ noErrors: "Помилок немає",
|
|
|
+ viewOnWiki: "Переглянути на Bambu Lab Wiki",
|
|
|
+ unknownCode: "Невідомий код HMS — подробиці дивіться у вікі Bambu Lab.",
|
|
|
+ clearInstructions: "Усуньте помилки на принтері, щоб вони зникли тут.",
|
|
|
+ clearErrors: "Очистити помилки",
|
|
|
+ clearSuccess: "Помилки HMS видалено",
|
|
|
+ clearFailed: "Не вдалося видалити помилки HMS",
|
|
|
+ actionSuccess: "Команду надіслано принтеру",
|
|
|
+ actionFailed: "Не вдалося надіслати дію",
|
|
|
+ runoutExpectedSlot: "Філамент закінчився в {{ranOut}}. Тепер принтер очікує сумісний філамент у {{expected}}. Вставте котушку в {{expected}}, а потім виберіть «Повторити».",
|
|
|
+ runoutExpectedSlotOnly: "Принтер очікує сумісний філамент у {{expected}}. Вставте туди котушку, а потім виберіть «Повторити».",
|
|
|
+ runoutSlotUnknown: "Філамент закінчився, тому друк призупинено. Bambuddy не може визначити, якого слота тепер очікує принтер — перевірте екран принтера.",
|
|
|
+ actions: {
|
|
|
+ RESUME_PRINTING: "Відновити друк",
|
|
|
+ RESUME_PRINTING_DEFECTS: "Відновити (допустимі недоліки)",
|
|
|
+ RESUME_PRINTING_PROBELM_SOLVED: "Відновити (проблему вирішено)",
|
|
|
+ STOP_PRINTING: "Зупинити друк",
|
|
|
+ CHECK_ASSISTANT: "Перевірити помічника",
|
|
|
+ FILAMENT_EXTRUDED: "Філамент екструдовано — продовжити",
|
|
|
+ RETRY_FILAMENT_EXTRUDED: "Ще не екструдовано — повторити",
|
|
|
+ CONTINUE: "Готово, продовжити",
|
|
|
+ LOAD_VIRTUAL_TRAY: "Завантажити філамент",
|
|
|
+ OK_BUTTON: "OK",
|
|
|
+ FILAMENT_LOAD_RESUME: "Філамент завантажено, відновити",
|
|
|
+ JUMP_TO_LIVEVIEW: "Перейти до перегляду наживо",
|
|
|
+ NO_REMINDER_NEXT_TIME: "Більше не нагадувати",
|
|
|
+ REFRESH_NOZZLE: "Перевірити знову",
|
|
|
+ IGNORE_NO_REMINDER_NEXT_TIME: "Ігнорувати. Не нагадувати наступного разу",
|
|
|
+ IGNORE_RESUME: "Ігнорувати й відновити друк",
|
|
|
+ PROBLEM_SOLVED_RESUME: "Проблему вирішено — відновити друк",
|
|
|
+ TURN_OFF_FIRE_ALARM: "Зрозуміло, вимкнути пожежну сигналізацію",
|
|
|
+ RETRY_PROBLEM_SOLVED: "Повторити (проблему вирішено)",
|
|
|
+ CANCLE: "Скасувати",
|
|
|
+ STOP_DRYING: "Зупинити сушіння",
|
|
|
+ PROCEED: "Продовжити",
|
|
|
+ OK_JUMP_RACK: "OK",
|
|
|
+ ABORT: "Перервати",
|
|
|
+ DISABLE_PURIFICATION: "Вимкнути очищення для цього друку",
|
|
|
+ DONT_REMIND_NEXT_TIME: "Більше не нагадувати",
|
|
|
+ DBL_CHECK_CANCEL: "Скасувати",
|
|
|
+ DBL_CHECK_DONE: "Готово",
|
|
|
+ DBL_CHECK_RETRY: "Повторити",
|
|
|
+ DBL_CHECK_RESUME: "Відновити",
|
|
|
+ DBL_CHECK_OK: "Підтвердити",
|
|
|
+ REMOVE_CLOSE_BTN: "Закрити",
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // MQTT Debug modal
|
|
|
+ mqttDebug: {
|
|
|
+ title: "Журнал налагодження MQTT",
|
|
|
+ searchPlaceholder: "Шукати тему або корисне навантаження…",
|
|
|
+ noMessages: "Ще не зареєстровано жодного повідомлення",
|
|
|
+ startLoggingHint: "Натисніть «Почати журналювання», щоб розпочати запис MQTT повідомлень",
|
|
|
+ noMessagesMatch: "Жодне повідомлення не відповідає вашому фільтру",
|
|
|
+ adjustFilterHint: "Спробуйте змінити критерії пошуку або фільтра",
|
|
|
+ incoming: "Вхідні",
|
|
|
+ outgoing: "Вихідні",
|
|
|
+ loggingStopped: "Запис припинено",
|
|
|
+ loggingActive: "Логування активне – повідомлення автоматично оновлюватимуться",
|
|
|
+ startLogging: "Розпочати журналювання",
|
|
|
+ stopLogging: "Зупинити журналювання",
|
|
|
+ clearLog: "Очистити журнал",
|
|
|
+ topic: "Тема",
|
|
|
+ timestamp: "Мітка часу",
|
|
|
+ direction: "Напрямок",
|
|
|
+ all: "Усі",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Printer File Manager modal (printer internal storage)
|
|
|
+ printerFiles: {
|
|
|
+ title: "Менеджер файлів",
|
|
|
+ storageUsed: "Використовується:",
|
|
|
+ storageFree: "Вільно:",
|
|
|
+ filterPlaceholder: "Фільтр файлів...",
|
|
|
+ deleteButton: "Видалити",
|
|
|
+ deleteFiles: "Видалити файли {{count}}.",
|
|
|
+ deleteFileConfirm: "Видалити \"{{name}}\"? Це неможливо скасувати.",
|
|
|
+ deleteFilesConfirm: "Видалити вибрані файли {{count}}? Це неможливо скасувати.",
|
|
|
+ noFiles: "Немає файлів на принтері",
|
|
|
+ loadingFiles: "Завантаження файлів...",
|
|
|
+ failedToLoad: "Не вдалося завантажити файли",
|
|
|
+ toast: {
|
|
|
+ filesDeleted: "Видалено файлів: {{count}}",
|
|
|
+ deleteFailed: "Не вдалося видалити: {{error}}",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Confirmations
|
|
|
+ confirm: {
|
|
|
+ delete: "Ви впевнені, що хочете це видалити?",
|
|
|
+ unsavedChanges: "У вас є незбережені зміни. Ви впевнені, що хочете піти?",
|
|
|
+ clearQueue: "Ви впевнені, що бажаєте очистити чергу?",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Login page
|
|
|
+ login: {
|
|
|
+ title: "Вхід у Bambuddy",
|
|
|
+ subtitle: "Увійти у свій обліковий запис",
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ usernamePlaceholder: "Введіть своє ім’я користувача",
|
|
|
+ usernameOrEmail: "Ім’я користувача або електронна пошта",
|
|
|
+ usernameOrEmailPlaceholder: "Ім’я користувача або електронна пошта",
|
|
|
+ password: "Пароль",
|
|
|
+ passwordPlaceholder: "Введіть свій пароль",
|
|
|
+ signIn: "Увійти",
|
|
|
+ signingIn: "Вхід...",
|
|
|
+ rememberMe: "Запам’ятати мене",
|
|
|
+ forgotPassword: "Забули пароль?",
|
|
|
+ autologinFailed: "Помилка автоматичного входу SSO. Щоб продовжити, виберіть постачальника нижче.",
|
|
|
+ localDisabledNotice: "Локальний вхід вимкнено. Використовуйте одного з наведених нижче постачальників SSO.",
|
|
|
+ loginSuccess: "Успішно ввійшли",
|
|
|
+ loginFailed: "Помилка входу",
|
|
|
+ enterCredentials: "Будь ласка, введіть ім’я користувача та пароль",
|
|
|
+ enterEmail: "Будь ласка, введіть адресу електронної пошти",
|
|
|
+ oidcLoginFailed: "Не вдалося ввійти через OIDC",
|
|
|
+ oidcErrors: {
|
|
|
+ providerError: "Постачальник ідентифікації повернув помилку",
|
|
|
+ missingParameters: "У зворотному виклику OIDC відсутні необхідні параметри",
|
|
|
+ invalidState: "Стан OIDC недійсний або вже використовувався",
|
|
|
+ stateExpired: "OIDC сеанс входу закінчився — спробуйте ще раз",
|
|
|
+ providerNotFound: "OIDC постачальника не знайдено",
|
|
|
+ discoveryFailed: "Не вдалося отримати документ конфігурації OIDC",
|
|
|
+ invalidDiscovery: "Документ конфігурації OIDC недійсний",
|
|
|
+ networkError: "Помилка мережі під час обміну токена OIDC",
|
|
|
+ badResponse: "Неочікувана відповідь під час обміну токеном OIDC.",
|
|
|
+ noIdToken: "Постачальник OIDC не повернув ID-токен",
|
|
|
+ validationFailed: "Не вдалося перевірити токен OIDC",
|
|
|
+ nonceMismatch: "Не збігається nonce OIDC — можлива атака повторного використання",
|
|
|
+ missingSubClaim: "У токені OIDC відсутнє поле sub",
|
|
|
+ noLinkedAccount: "Із цим ідентифікатором OIDC не пов’язано жодного локального облікового запису",
|
|
|
+ accountInactive: "Ваш акаунт неактивний",
|
|
|
+ userResolutionFailed: "Не вдалося визначити ваш обліковий запис",
|
|
|
+ internalError: "Під час входу в систему OIDC сталася внутрішня помилка",
|
|
|
+ tokenExchangeFailed: "Помилка обміну токеном OIDC.",
|
|
|
+ },
|
|
|
+ forgotPasswordTitle: "Забули пароль",
|
|
|
+ forgotPasswordMessage: "Якщо ви забули свій пароль, зверніться до системного адміністратора, щоб скинути його.",
|
|
|
+ forgotPasswordEmailMessage: "Введіть адресу електронної пошти, і ми надішлемо вам новий пароль.",
|
|
|
+ emailAddress: "Адреса електронної пошти",
|
|
|
+ emailPlaceholder: "your.email@example.com",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ sending: "Надсилання...",
|
|
|
+ sendResetEmail: "Надіслати лист для скидання пароля",
|
|
|
+ howToReset: "Як скинути пароль:",
|
|
|
+ resetStep1: "Зверніться до адміністратора Bambuddy.",
|
|
|
+ resetStep2: "Попросіть скинути ваш пароль у розділі «Керування користувачами»",
|
|
|
+ resetStep3: "Вони можуть встановити для вас новий тимчасовий пароль",
|
|
|
+ resetStep4: "Увійдіть із новим паролем і змініть його в налаштуваннях",
|
|
|
+ gotIt: "Зрозуміло",
|
|
|
+ resetPassword: {
|
|
|
+ title: "Встановити новий пароль",
|
|
|
+ subtitle: "Введіть і підтвердьте свій новий пароль нижче.",
|
|
|
+ newPassword: "Новий пароль",
|
|
|
+ newPasswordPlaceholder: "Мінімум 8 символів",
|
|
|
+ confirmPassword: "Підтвердити пароль",
|
|
|
+ confirmPasswordPlaceholder: "Повторіть новий пароль",
|
|
|
+ saving: "Збереження…",
|
|
|
+ submit: "Встановити новий пароль",
|
|
|
+ backToLogin: "Назад до входу",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ passwordTooShort: "Пароль має бути не менше 8 символів",
|
|
|
+ resetFailed: "Помилка скидання пароля. Можливо, термін дії посилання закінчився.",
|
|
|
+ },
|
|
|
+ twoFA: {
|
|
|
+ title: "Двофакторна автентифікація",
|
|
|
+ subtitle: "Ваш обліковий запис захищено 2FA. Введіть код підтвердження нижче.",
|
|
|
+ methodAuthenticator: "Програма автентифікатора",
|
|
|
+ methodEmail: "Код електронної пошти",
|
|
|
+ methodBackup: "Резервний код",
|
|
|
+ instructionsTotp: "Відкрийте програму автентифікації та введіть 6-значний код для Bambuddy.",
|
|
|
+ instructionsEmail: "На вашу електронну адресу надіслано 6-значний код. Термін дії закінчується через 10 хвилин.",
|
|
|
+ instructionsEmailNotSent: "Натисніть кнопку нижче, щоб отримати код підтвердження електронною поштою.",
|
|
|
+ instructionsBackup: "Введіть один із ваших 8-символьних резервних кодів відновлення. Кожен код можна використати лише один раз.",
|
|
|
+ sendCodeButton: "Надіслати код електронною поштою",
|
|
|
+ sendingCode: "Надсилання...",
|
|
|
+ resendCode: "Повторно надіслати код",
|
|
|
+ codeLabel: "Код підтвердження",
|
|
|
+ backupCodeLabel: "Резервний код",
|
|
|
+ codePlaceholder: "000000",
|
|
|
+ backupCodePlaceholder: "XXXXXXXX",
|
|
|
+ verifyButton: "Підтвердити",
|
|
|
+ verifyingButton: "Перевірка...",
|
|
|
+ backToLogin: "← Назад до входу",
|
|
|
+ orContinueWith: "або продовжити",
|
|
|
+ signInWith: "Увійти за допомогою {{provider}}",
|
|
|
+ enterCode: "Будь ласка, введіть код підтвердження",
|
|
|
+ sendCodeFailed: "Не вдалося надіслати код підтвердження",
|
|
|
+ invalidCode: "Невірний код. Спробуйте ще раз.",
|
|
|
+ },
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ // Setup page
|
|
|
+ setup: {
|
|
|
+ title: "Налаштування Bambuddy",
|
|
|
+ subtitle: "Налаштуйте автентифікацію для свого екземпляра Bambuddy.",
|
|
|
+ enableAuth: "Увімкнути автентифікацію",
|
|
|
+ adminAccount: "Обліковий запис адміністратора",
|
|
|
+ adminAccountDesc: "Якщо користувачі-адміністратори вже існують, автентифікацію буде ввімкнено за допомогою наявних облікових записів адміністраторів. Залиште поля нижче порожніми, щоб використовувати наявних адміністраторів, або введіть нові облікові дані, щоб створити нового користувача адміністратора.",
|
|
|
+ adminUsername: "Ім’я користувача адміністратора",
|
|
|
+ adminPassword: "Пароль адміністратора",
|
|
|
+ optionalIfAdminExists: "(необов’язково, якщо є користувачі з правами адміністратора)",
|
|
|
+ adminUsernamePlaceholder: "Введіть ім’я користувача адміністратора (необов’язково)",
|
|
|
+ adminPasswordPlaceholder: "Введіть пароль адміністратора (необов’язково)",
|
|
|
+ confirmPassword: "Підтвердити пароль",
|
|
|
+ confirmPasswordPlaceholder: "Підтвердити пароль адміністратора",
|
|
|
+ settingUp: "Налаштування...",
|
|
|
+ completeSetup: "Завершити налаштування",
|
|
|
+ toast: {
|
|
|
+ authEnabledAdminCreated: "Увімкнено автентифікацію та створено адміністратора",
|
|
|
+ authEnabledExistingAdmins: "Увімкнено автентифікацію за допомогою наявних користувачів адміністратора",
|
|
|
+ setupCompleted: "Налаштування завершено",
|
|
|
+ enterBothCredentials: "Будь ласка, введіть ім’я користувача та пароль адміністратора або залиште обидва поля порожніми, щоб використовувати наявних користувачів адміністратора",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ passwordTooShort: "Пароль має бути не менше 6 символів",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Password change
|
|
|
+ changePassword: {
|
|
|
+ title: "Змінити пароль",
|
|
|
+ currentPassword: "Поточний пароль",
|
|
|
+ currentPasswordPlaceholder: "Введіть поточний пароль",
|
|
|
+ newPassword: "Новий пароль",
|
|
|
+ newPasswordPlaceholder: "Введіть новий пароль (мінімум 6 символів)",
|
|
|
+ confirmPassword: "Підтвердити новий пароль",
|
|
|
+ confirmPasswordPlaceholder: "Підтвердити новий пароль",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ passwordTooShort: "Пароль має бути не менше 6 символів",
|
|
|
+ changing: "Зміна...",
|
|
|
+ success: "Пароль успішно змінено",
|
|
|
+ failed: "Не вдалося змінити пароль",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Plate detection alert
|
|
|
+ plateAlert: {
|
|
|
+ title: "Друк призупинено!",
|
|
|
+ message: "Об’єкти, виявлені на будівельній пластині. Друк було автоматично призупинено. Очистіть пластину та відновіть друк.",
|
|
|
+ understand: "Я розумію",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Camera page
|
|
|
+ camera: {
|
|
|
+ title: "Вид з камери",
|
|
|
+ invalidPrinterId: "Недійсний ідентифікатор принтера",
|
|
|
+ live: "Наживо",
|
|
|
+ snapshot: "знімок",
|
|
|
+ restartStream: "Перезапустити потік",
|
|
|
+ refreshSnapshot: "Оновити знімок",
|
|
|
+ fullscreen: "Повний екран",
|
|
|
+ exitFullscreen: "Вийти з повноекранного режиму",
|
|
|
+ connectingToCamera: "Підключення до камери...",
|
|
|
+ capturingSnapshot: "Зйомка знімка...",
|
|
|
+ connectionLost: "З’єднання втрачено",
|
|
|
+ connectionFailed: "Помилка підключення камери",
|
|
|
+ reconnecting: "Повторне підключення через {{countdown}}с... (спроба {{attempt}}/{{max}})",
|
|
|
+ reconnectNow: "Повторно підключіться зараз",
|
|
|
+ cameraUnavailable: "Камера недоступна",
|
|
|
+ cameraUnavailableDesc: "Переконайтеся, що принтер увімкнено та підключено.",
|
|
|
+ noCamera: "Камера недоступна",
|
|
|
+ retry: "Повторити",
|
|
|
+ cameraStream: "Потік камери",
|
|
|
+ zoomOut: "Зменшити масштаб",
|
|
|
+ zoomIn: "Збільшити",
|
|
|
+ resetZoom: "Скинути масштаб",
|
|
|
+ recording: "Запис",
|
|
|
+ startRecording: "Почати запис",
|
|
|
+ stopRecording: "Зупинити запис",
|
|
|
+ chamberLight: "Перемкнути освітлення камери",
|
|
|
+ unavailable: "Камера недоступна",
|
|
|
+ diagnose: {
|
|
|
+ button: "Діагностувати",
|
|
|
+ modalTitle: "Діагностика камери",
|
|
|
+ running: "Виконується діагностика...",
|
|
|
+ runFailed: "Не вдалося запустити діагностику: {{error}}",
|
|
|
+ retry: "Запустити знову",
|
|
|
+ stage: {
|
|
|
+ tcp_reachable: "Доступність мережі",
|
|
|
+ first_frame: "Захоплення кадру",
|
|
|
+ live_stream_active: "Активна пряма трансляція",
|
|
|
+ },
|
|
|
+ summary: {
|
|
|
+ all_ok: "Камера працює. Діагностика пройшла всі етапи успішно.",
|
|
|
+ live_stream_active_healthy: "Камера зараз транслює з останніми кадрами — перевірка не потрібна.",
|
|
|
+ printer_unreachable: "Принтер недоступний. Перевірте адресу IP, підключення до мережі та чи принтер увімкнено.",
|
|
|
+ camera_port_closed: "Принтер доступний, але порт камери закритий. Переконайтеся, що в налаштуваннях принтера ввімкнено лише режим LAN і режим розробника.",
|
|
|
+ no_frame: "Підключено до камери, але кадри не отримано. Повторіть спробу або перевірте, чи камеру ввімкнено в налаштуваннях принтера.",
|
|
|
+ unknown_failure: "Не вдалося діагностувати камеру з невідомої причини. Подробиці перевірте в журналі підтримки.",
|
|
|
+ },
|
|
|
+ meta: {
|
|
|
+ protocol: "Протокол",
|
|
|
+ port: "Порт",
|
|
|
+ profile: "Профіль",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Groups management
|
|
|
+ groups: {
|
|
|
+ title: "Керування групами",
|
|
|
+ subtitle: "Керуйте групами дозволів для контролю доступу",
|
|
|
+ backToSettings: "Назад до налаштувань",
|
|
|
+ createGroup: "Створити групу",
|
|
|
+ noPermission: "Ви не маєте дозволу на доступ до цієї сторінки.",
|
|
|
+ system: "система",
|
|
|
+ noDescription: "Без опису",
|
|
|
+ usersCount: "{{count}} користувачів",
|
|
|
+ permissionsCount: "Дозволів: {{count}}",
|
|
|
+ edit: "Редагувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ toast: {
|
|
|
+ created: "Групу створено успішно",
|
|
|
+ updated: "Групу успішно оновлено",
|
|
|
+ deleted: "Групу успішно видалено",
|
|
|
+ enterGroupName: "Будь ласка, введіть назву групи",
|
|
|
+ },
|
|
|
+ modal: {
|
|
|
+ editGroup: "Редагувати групу",
|
|
|
+ createGroup: "Створити групу",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ saving: "Збереження...",
|
|
|
+ creating: "Створення...",
|
|
|
+ saveChanges: "Зберегти зміни",
|
|
|
+ },
|
|
|
+ form: {
|
|
|
+ groupName: "Назва групи",
|
|
|
+ groupNamePlaceholder: "Введіть назву групи",
|
|
|
+ systemGroupWarning: "Назви системних груп не можна змінювати",
|
|
|
+ description: "опис",
|
|
|
+ descriptionPlaceholder: "Введіть опис (необов’язково)",
|
|
|
+ permissions: "Дозволи (вибрано {{count}})",
|
|
|
+ },
|
|
|
+ deleteModal: {
|
|
|
+ title: "Видалити групу",
|
|
|
+ message: "Ви впевнені, що хочете видалити цю групу? Користувачі цієї групи втратять ці дозволи.",
|
|
|
+ confirm: "Видалити групу",
|
|
|
+ },
|
|
|
+ editor: {
|
|
|
+ title: "Редагувати групу",
|
|
|
+ createTitle: "Створити групу",
|
|
|
+ search: "Шукати дозволи...",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ clearAll: "Очистити все",
|
|
|
+ permissionsSelected: "Вибрано: {{count}}",
|
|
|
+ noResults: "Немає дозволів, що відповідають вашому пошуку",
|
|
|
+ websocketHint: "Необхідний для оновлень у реальному часі. Без нього інтерфейс повертається до періодичного опитування.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Users management
|
|
|
+ users: {
|
|
|
+ title: "Керування користувачами",
|
|
|
+ subtitle: "Керуйте користувачами та їхнім доступом до вашого екземпляра Bambuddy.",
|
|
|
+ backToSettings: "Назад до налаштувань",
|
|
|
+ createUser: "Створити користувача",
|
|
|
+ noPermission: "Ви не маєте дозволу на доступ до цієї сторінки.",
|
|
|
+ admin: "адмін",
|
|
|
+ noGroups: "Немає груп",
|
|
|
+ active: "Активний",
|
|
|
+ inactive: "Неактивний",
|
|
|
+ edit: "Редагувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ system: "система",
|
|
|
+ noGroupsAvailable: "Немає доступних груп",
|
|
|
+ table: {
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ groups: "Групи",
|
|
|
+ status: "Статус",
|
|
|
+ actions: "Дії",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ created: "Користувача створено успішно",
|
|
|
+ updated: "Користувача успішно оновлено",
|
|
|
+ deleted: "Користувача успішно видалено",
|
|
|
+ fillRequired: "Будь ласка, заповніть усі необхідні поля",
|
|
|
+ passwordsDoNotMatch: "Паролі не збігаються",
|
|
|
+ passwordTooShort: "Пароль має бути не менше 6 символів",
|
|
|
+ ldapProvisioned: "Користувача LDAP «{{username}}» підготовлено",
|
|
|
+ },
|
|
|
+ modal: {
|
|
|
+ createUser: "Створити користувача",
|
|
|
+ editUser: "Редагувати користувача",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ creating: "Створення...",
|
|
|
+ saving: "Збереження...",
|
|
|
+ saveChanges: "Зберегти зміни",
|
|
|
+ advancedAuthSubtitle: "з розширеною автентифікацією",
|
|
|
+ // LDAP manual provisioning (#1298)
|
|
|
+ tabsAriaLabel: "Джерело користувача",
|
|
|
+ localTab: "Локальний",
|
|
|
+ ldapTab: "LDAP",
|
|
|
+ ldapSearchLabel: "Пошук у каталозі",
|
|
|
+ ldapSearchPlaceholder: "Введіть ім’я користувача, ім’я або електронну адресу...",
|
|
|
+ ldapMinChars: "Введіть принаймні 2 символи для пошуку",
|
|
|
+ ldapTypeToSearch: "Почніть вводити текст для пошуку в каталозі LDAP.",
|
|
|
+ ldapSearching: "Пошук у каталозі...",
|
|
|
+ ldapNoResults: "У каталозі немає відповідних користувачів",
|
|
|
+ ldapSearchError: "Помилка пошуку каталогу. Перевірте стан сервера LDAP.",
|
|
|
+ ldapAlreadyProvisioned: "Уже підготовлено",
|
|
|
+ ldapSelectedLabel: "Вибране",
|
|
|
+ ldapProvision: "Підготувати користувача",
|
|
|
+ ldapProvisioning: "Підготовка...",
|
|
|
+ ldapErrorProvision: "Не вдалося підготувати користувача. Перевірте стан сервера LDAP і повторіть спробу.",
|
|
|
+ },
|
|
|
+ form: {
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ usernamePlaceholder: "Введіть ім’я користувача",
|
|
|
+ email: "Електронна пошта",
|
|
|
+ emailPlaceholder: "user@example.com",
|
|
|
+ password: "Пароль",
|
|
|
+ passwordPlaceholder: "Введіть пароль",
|
|
|
+ confirmPassword: "Підтвердити пароль",
|
|
|
+ confirmPasswordPlaceholder: "Підтвердити пароль",
|
|
|
+ newPasswordPlaceholder: "Введіть новий пароль",
|
|
|
+ confirmNewPasswordPlaceholder: "Підтвердити новий пароль",
|
|
|
+ leaveBlankToKeep: "залиште порожнім, щоб зберегти поточне значення",
|
|
|
+ groups: "Групи",
|
|
|
+ optional: "необов’язково",
|
|
|
+ autoGeneratedPassword: "Надійний пароль буде автоматично згенеровано та надіслано користувачеві електронною поштою.",
|
|
|
+ passwordManagedByAdvancedAuth: "Пароль керується розширеною автентифікацією. Використовуйте «Скинути пароль», щоб надіслати новий пароль користувачеві електронною поштою.",
|
|
|
+ resetPassword: "Скинути пароль",
|
|
|
+ resettingPassword: "Скидання пароля...",
|
|
|
+ },
|
|
|
+ deleteModal: {
|
|
|
+ title: "Видалити користувача",
|
|
|
+ message: "Ви впевнені, що хочете видалити цього користувача? Цю дію не можна скасувати.",
|
|
|
+ confirm: "Видалити користувача",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Stream overlay
|
|
|
+ streamOverlay: {
|
|
|
+ title: "Накладання потоку",
|
|
|
+ invalidPrinterId: "Недійсний ідентифікатор принтера",
|
|
|
+ cameraStream: "Потік камери",
|
|
|
+ progress: "Прогрес",
|
|
|
+ eta: "ETA",
|
|
|
+ printerIdle: "Принтер неактивний",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ status: {
|
|
|
+ printing: "Друк",
|
|
|
+ paused: "Призупинено",
|
|
|
+ finished: "Готово",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ idle: "Неактивний",
|
|
|
+ unknown: "Невідомий",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Profiles
|
|
|
+ profiles: {
|
|
|
+ title: "Профілі",
|
|
|
+ subtitle: "Керуйте профілями слайсера та калібруваннями Pressure Advance",
|
|
|
+ tabs: {
|
|
|
+ bambuCloud: "Bambu Cloud",
|
|
|
+ orcaCloud: "Orca Cloud",
|
|
|
+ local: "Локальні профілі",
|
|
|
+ kprofiles: "K-профілі",
|
|
|
+ },
|
|
|
+ orcaCloud: {
|
|
|
+ connectedAs: "Підключено як",
|
|
|
+ connectedShort: "Підключено до Orca Cloud",
|
|
|
+ logout: "Відключити",
|
|
|
+ noLogoutPermission: "Ви не маєте дозволу на відключення",
|
|
|
+ noConnectPermission: "Ви не маєте дозволу на підключення до Orca Cloud",
|
|
|
+ retry: "Повторити",
|
|
|
+ connectButton: "Підключити Orca Cloud",
|
|
|
+ connect: {
|
|
|
+ title: "Підключитися до Orca Cloud",
|
|
|
+ description: "Увійти у свій обліковий запис Orca Cloud, щоб синхронізувати свої профілі слайсера в Bambuddy.",
|
|
|
+ },
|
|
|
+ device: {
|
|
|
+ title: "Підтвердити Bambuddy в Orca Cloud",
|
|
|
+ instruction: "Відкрийте Orca Cloud і підтвердьте цей код. Bambuddy підключається автоматично, коли ви підтверджуєте.",
|
|
|
+ codeLabel: "Ваш код сполучення",
|
|
|
+ openButton: "Відкрити сторінку підтвердження Orca Cloud",
|
|
|
+ manualHint: "Або перейдіть до {{url}} і введіть код вище.",
|
|
|
+ waiting: "Чекаємо на ваше схвалення…",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ },
|
|
|
+ profiles: {
|
|
|
+ title: "Ваші профілі Orca Cloud ({{count}})",
|
|
|
+ refresh: "Оновити",
|
|
|
+ empty: "У вашому обліковому записі Orca Cloud ще не знайдено профілів.",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ disconnected: "Відключено від Orca Cloud",
|
|
|
+ },
|
|
|
+ errors: {
|
|
|
+ startFailed: "Не вдалося розпочати підключення Orca Cloud.",
|
|
|
+ denied: "Сполучення було відхилено в Orca Cloud.",
|
|
|
+ expired: "Термін дії коду сполучення минув. Натисніть Підключитися, щоб повторити спробу.",
|
|
|
+ pollFailed: "Втрачено з’єднання під час очікування підтвердження. Спробуйте ще раз.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ localProfiles: {
|
|
|
+ title: "Локальні профілі",
|
|
|
+ subtitle: "Імпорт і керування профілями слайсера з OrcaSlicer",
|
|
|
+ import: "Імпортувати профілі",
|
|
|
+ importDesc: "Перетягніть сюди файли .bbscfg, .bbsflmt, .orca_filament, .zip або .json",
|
|
|
+ importing: "Імпортування…",
|
|
|
+ search: "Шукати локальні профілі…",
|
|
|
+ noPresets: "Локальних профілів ще немає",
|
|
|
+ noSearchResults: "Профілів за вашим запитом не знайдено",
|
|
|
+ badge: "Локальний",
|
|
|
+ edit: "Редагувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ deleteConfirmTitle: "Видалити профіль",
|
|
|
+ deleteConfirm: "Видалити цей профіль? Цю дію неможливо скасувати.",
|
|
|
+ source: "Джерело",
|
|
|
+ inheritsFrom: "Успадковує",
|
|
|
+ filamentType: "Тип",
|
|
|
+ vendor: "Виробник",
|
|
|
+ compatiblePrinters: "Принтери",
|
|
|
+ nozzleTemp: "Температура сопла",
|
|
|
+ cost: "Вартість",
|
|
|
+ density: "Щільність",
|
|
|
+ pressureAdvance: "Випередження тиску",
|
|
|
+ filament: "Філамент",
|
|
|
+ process: "Процес",
|
|
|
+ printer: "Принтер",
|
|
|
+ toast: {
|
|
|
+ importSuccess: "Імпортовано профілів: {{count}}",
|
|
|
+ importSkipped: "Пропущено профілів-дублікатів: {{count}}",
|
|
|
+ importError: "Помилок під час імпорту: {{count}}",
|
|
|
+ deleted: "Профіль видалено",
|
|
|
+ updated: "Профіль оновлено",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ connectedAs: "Підключено як",
|
|
|
+ signInExpiredTitle: "Термін входу в Bambu Cloud минув",
|
|
|
+ signInExpiredBody: "Bambu Lab більше не приймає збережений токен. Увійдіть ще раз, щоб відновити хмарні профілі, імпорт MakerWorld і перевірку прошивки.",
|
|
|
+ logout: "Вийти",
|
|
|
+ noLogoutPermission: "Ви не маєте дозволу на вихід",
|
|
|
+ failedToLoad: "Не вдалося завантажити профілі",
|
|
|
+ retry: "Повторити",
|
|
|
+ time: {
|
|
|
+ justNow: "Щойно",
|
|
|
+ minsAgo: "{{count}}хв тому",
|
|
|
+ hoursAgo: "{{count}} год тому",
|
|
|
+ daysAgo: "{{count}} дн. тому",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ loggedOut: "Вихід виконано",
|
|
|
+ },
|
|
|
+ login: {
|
|
|
+ title: "Підключитися до Bambu Cloud",
|
|
|
+ subtitle: "Синхронізуйте профілі слайсера між пристроями",
|
|
|
+ email: "Електронна пошта",
|
|
|
+ password: "Пароль",
|
|
|
+ region: "Регіон",
|
|
|
+ regionGlobal: "Глобальний",
|
|
|
+ regionChina: "Китай",
|
|
|
+ verificationCode: "Код підтвердження",
|
|
|
+ totpCode: "Код автентифікатора",
|
|
|
+ checkEmail: "Перевірте свою електронну пошту ({{email}}), щоб отримати 6-значний код",
|
|
|
+ enterTotpHint: "Введіть 6-значний код із програми автентифікації",
|
|
|
+ accessToken: "Токен доступу",
|
|
|
+ accessTokenHint: "Вставте токен доступу Bambu Cloud. Облікові записи в китайському регіоні мають використовувати цей спосіб, оскільки вони прив’язані до телефона й вхід електронною поштою недоступний. У вікі описано, як отримати токен із файлів cookie MakerWorld.",
|
|
|
+ back: "Назад",
|
|
|
+ loginButton: "Увійти",
|
|
|
+ verifyButton: "Підтвердити",
|
|
|
+ setTokenButton: "Установити токен",
|
|
|
+ useToken: "Натомість використати токен доступу",
|
|
|
+ useEmail: "Увійти за допомогою електронної пошти",
|
|
|
+ toast: {
|
|
|
+ loggedIn: "Успішно ввійшли",
|
|
|
+ codeSent: "Код підтвердження надіслано на вашу електронну адресу",
|
|
|
+ enterTotp: "Введіть код із програми автентифікації",
|
|
|
+ tokenSet: "Токен успішно встановлено",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ presets: {
|
|
|
+ myPreset: "Мій профіль (можна редагувати)",
|
|
|
+ duplicate: "Дублювати",
|
|
|
+ editable: "Можна редагувати",
|
|
|
+ failedToLoadDetails: "Не вдалося завантажити відомості про профіль",
|
|
|
+ deleteConfirm: "Видалити цей профіль?",
|
|
|
+ deleteWarning: "Це назавжди видалить \"{{name}}\" із Bambu Cloud. Це неможливо скасувати.",
|
|
|
+ noDuplicatePermission: "Ви не маєте дозволу на дублювання стилів",
|
|
|
+ noEditPermission: "Ви не маєте дозволу редагувати стилі",
|
|
|
+ noDeletePermission: "Ви не маєте дозволу на видалення стилів",
|
|
|
+ types: {
|
|
|
+ filament: "Попереднє налаштування філаменту",
|
|
|
+ printer: "Попереднє налаштування принтера",
|
|
|
+ process: "Попереднє налаштування процесу",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ deleted: "Попереднє налаштування видалено",
|
|
|
+ created: "Попереднє налаштування створено",
|
|
|
+ updated: "Попереднє налаштування оновлено",
|
|
|
+ duplicated: "Профіль продубльовано",
|
|
|
+ fieldAdded: "Додано поле \"{{key}}\".",
|
|
|
+ exported: "Попереднє налаштування експортовано",
|
|
|
+ },
|
|
|
+ baseLabel: "База: {{name}}",
|
|
|
+ currentLabel: "Поточний профіль: {{name}}",
|
|
|
+ newPreset: "Нове налаштування",
|
|
|
+ editPreset: "Редагувати профіль",
|
|
|
+ duplicatePreset: "Дублювати профіль",
|
|
|
+ createNewPreset: "Створити новий профіль",
|
|
|
+ customizeSettings: "Налаштуйте параметри для нового стилю",
|
|
|
+ compareWithBase: "Порівняти з базовим профілем",
|
|
|
+ compare: "Порівняйте",
|
|
|
+ // CreatePresetModal - Basic Info
|
|
|
+ basePreset: "Базове передналаштування",
|
|
|
+ selectBasePreset: "Виберіть базове налаштування...",
|
|
|
+ presetName: "Назва профілю",
|
|
|
+ myCustomPreset: "Мій власний профіль",
|
|
|
+ inheritsFrom: "Успадковує від",
|
|
|
+ dropJsonToImport: "Відпустіть JSON, щоб імпортувати",
|
|
|
+ // CreatePresetModal - Tabs
|
|
|
+ tabs: {
|
|
|
+ common: "Основні",
|
|
|
+ allFields: "Всі поля",
|
|
|
+ },
|
|
|
+ // CreatePresetModal - All Fields Tab
|
|
|
+ availableFields: "Доступні поля",
|
|
|
+ searchFieldsPlaceholder: "Шукати поля...",
|
|
|
+ noMatchingFields: "Немає відповідних полів",
|
|
|
+ allFieldsAdded: "Всі поля додано",
|
|
|
+ addCustomField: "Додати спеціальне поле",
|
|
|
+ yourOverrides: "Ваші перевизначення",
|
|
|
+ noOverridesYet: "Перевизначення ще немає",
|
|
|
+ clickFieldsToAdd: "Натисніть поля ліворуч, щоб додати їх",
|
|
|
+ saveAsTemplate: "Зберегти як шаблон",
|
|
|
+ jsonTip: "Порада: перетягніть файл .json у будь-яке місце на цьому модалі, щоб імпортувати налаштування",
|
|
|
+ },
|
|
|
+ cloudView: {
|
|
|
+ searchPlaceholder: "Шукати профілі...",
|
|
|
+ templates: "Шаблони",
|
|
|
+ refresh: "Оновити",
|
|
|
+ newPreset: "Нове налаштування",
|
|
|
+ clearFilters: "Очистити фільтри",
|
|
|
+ // Compare mode
|
|
|
+ compareMode: "Режим порівняння",
|
|
|
+ selectAnotherPreset: "Вибрати інший попередній набір {{type}}.",
|
|
|
+ clickTwoPresets: "Клацніть два стилі одного типу, щоб порівняти",
|
|
|
+ selectFirst: "1. Виберіть перший",
|
|
|
+ selectSecond: "2. Виберіть другий",
|
|
|
+ compareNow: "Порівняти зараз",
|
|
|
+ // Status row
|
|
|
+ lastSynced: "Остання синхронізація:",
|
|
|
+ showingCount: "Показано профілів: {{showing}} із {{total}}",
|
|
|
+ noPresetsFound: "Попередніх налаштувань не знайдено",
|
|
|
+ // Column headers
|
|
|
+ columns: {
|
|
|
+ filament: "Філамент",
|
|
|
+ process: "процес",
|
|
|
+ printer: "Принтер",
|
|
|
+ },
|
|
|
+ noFilamentPresets: "Немає профілів філаменту",
|
|
|
+ noProcessPresets: "Немає профілів процесу",
|
|
|
+ noPrinterPresets: "Немає профілів принтера",
|
|
|
+ // Filters
|
|
|
+ filters: {
|
|
|
+ type: "Тип",
|
|
|
+ owner: "Власник",
|
|
|
+ printer: "Принтер",
|
|
|
+ nozzle: "Сопло",
|
|
|
+ filament: "Філамент",
|
|
|
+ layer: "Шар",
|
|
|
+ all: "Усі",
|
|
|
+ myPresets: "Мої профілі",
|
|
|
+ builtIn: "Вбудований",
|
|
|
+ process: "процес",
|
|
|
+ },
|
|
|
+ // Permissions
|
|
|
+ noTemplatesPermission: "Ви не маєте дозволу на керування шаблонами",
|
|
|
+ noRefreshPermission: "Ви не маєте дозволу оновлювати профілі",
|
|
|
+ noCreatePermission: "Ви не маєте дозволу створювати профілі",
|
|
|
+ },
|
|
|
+ templates: {
|
|
|
+ title: "Швидкі шаблони",
|
|
|
+ noTemplates: "Шаблонів ще немає",
|
|
|
+ createFirst: "Створіть шаблони в редакторі профілів",
|
|
|
+ typeFilter: "тип:",
|
|
|
+ deleteTitle: "Видалити шаблон",
|
|
|
+ deleteWarning: "Цю дію не можна скасувати",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"?",
|
|
|
+ namePlaceholder: "Назва шаблону",
|
|
|
+ descriptionPlaceholder: "опис",
|
|
|
+ settingsJson: "Налаштування (JSON)",
|
|
|
+ fieldsCount: "Полів: {{count}}",
|
|
|
+ shownInModals: "Показано в модальних формах",
|
|
|
+ hiddenInModals: "Приховано в модальних формах",
|
|
|
+ apply: "Застосувати",
|
|
|
+ toast: {
|
|
|
+ deleted: "Шаблон видалено",
|
|
|
+ updated: "Шаблон оновлено",
|
|
|
+ created: "Шаблон створено",
|
|
|
+ applied: "Шаблон застосовано",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Support/Debug
|
|
|
+ support: {
|
|
|
+ debugLoggingActive: "Журнал налагодження активний",
|
|
|
+ manageLogs: "Керувати",
|
|
|
+ collectItem7: "Підключення принтерів і версії прошивок",
|
|
|
+ collectItem8: "Статус інтеграції (Spoolman, MQTT, HA)",
|
|
|
+ collectItem9: "Мережеві інтерфейси (лише підмережі)",
|
|
|
+ collectItem10: "Версії пакетів Python",
|
|
|
+ collectItem11: "Перевірки справності бази даних",
|
|
|
+ collectItem12: "Відомості про середовище Docker",
|
|
|
+ bundleGenerating: "Створення пакета...",
|
|
|
+ bundleStepConnection: "Запуск перевірки підключення принтера",
|
|
|
+ bundleStepVirtualPrinters: "Виконання перевірок налаштування віртуального принтера",
|
|
|
+ bundleStepLogScan: "Сканування останніх журналів на наявність відомих проблем",
|
|
|
+ bundleStepBuild: "Створення ZIP-пакета підтримки",
|
|
|
+ },
|
|
|
+
|
|
|
+ // File manager
|
|
|
+ fileManager: {
|
|
|
+ title: "Менеджер файлів",
|
|
|
+ subtitle: "Упорядковуйте файли друку та керуйте ними",
|
|
|
+ uploadFiles: "Вивантажити файли",
|
|
|
+ newFolder: "Нова папка",
|
|
|
+ folderName: "Назва папки",
|
|
|
+ folderNamePlaceholder: "наприклад, функціональні частини",
|
|
|
+ renameFile: "Перейменувати файл",
|
|
|
+ renameFolder: "Перейменувати папку",
|
|
|
+ invalidFilenameChar: "Символ «{{char}}» не можна використовувати в назвах файлів для друку. SD-картка принтера не приймає такі символи: < > : \" / \\ | ? *",
|
|
|
+ moveFiles: "Перемістити файли: {{count}}",
|
|
|
+ rootNoFolder: "Корінь (без папки)",
|
|
|
+ current: "поточний",
|
|
|
+ linkFolder: "Пов’язати папку",
|
|
|
+ linkFolderDescription: "Пов’язати «{{name}}» із проєктом або архівом для швидкого доступу.",
|
|
|
+ project: "Проєкт",
|
|
|
+ archive: "Архів",
|
|
|
+ noProjectsFound: "Проєкти не знайдено",
|
|
|
+ noArchivesFound: "Архіви не знайдено",
|
|
|
+ unlink: "Від’єднати",
|
|
|
+ link: "Пов’язати",
|
|
|
+ dragDropFiles: "Перетягніть файли сюди",
|
|
|
+ dropFilesHere: "Перетягніть файли сюди",
|
|
|
+ releaseToUpload: "Відпустіть, щоб вивантажити",
|
|
|
+ orClickToBrowse: "або натисніть, щоб переглянути",
|
|
|
+ allFileTypesSupported: "Підтримуються всі типи файлів. Файли ZIP будуть розпаковані.",
|
|
|
+ zipFilesDetected: "Виявлено файли ZIP.",
|
|
|
+ zipExtractOptions: "Файли ZIP будуть розпаковані. Виберіть спосіб обробки структури папок:",
|
|
|
+ preserveZipStructure: "Зберегти структуру папок із ZIP",
|
|
|
+ createFolderFromZip: "Створити папку з назви ZIP-файлу",
|
|
|
+ stlThumbnailGeneration: "Створення мініатюр STL",
|
|
|
+ zipMayContainStl: "Файли ZIP можуть містити файли STL. Мініатюри можна генерувати під час вилучення.",
|
|
|
+ thumbnailsCanBeGenerated: "Ескізи можна створити для файлів STL. Обробка великих моделей може зайняти більше часу.",
|
|
|
+ generateThumbnailsForStl: "Створювати мініатюри для файлів STL",
|
|
|
+ threemfDetected: "Виявлено файли 3MF.",
|
|
|
+ threemfExtractionInfo: "Модель принтера, матеріал, колір і параметри друку будуть автоматично витягнуті з файлів 3MF.",
|
|
|
+ willBeExtracted: "Буде розпаковано",
|
|
|
+ filesExtracted: "Розпаковано файлів: {{count}}",
|
|
|
+ uploadComplete: "Вивантаження завершено. Успішно: {{succeeded}}",
|
|
|
+ uploadFailed: "Не вдалося вивантажити",
|
|
|
+ zipFilesFailed: "Не вдалося обробити файлів: {{count}}",
|
|
|
+ uploading: "Вивантаження...",
|
|
|
+ changeLink: "Змінити посилання...",
|
|
|
+ linkTo: "Посилання на...",
|
|
|
+ linkToProjectOrArchive: "Посилання на проєкт або архів",
|
|
|
+ generateThumbnail: "Створити мініатюру",
|
|
|
+ generateThumbnails: "Створити мініатюри",
|
|
|
+ generateThumbnailsForMissing: "Створити відсутні мініатюри файлів STL",
|
|
|
+ gridView: "Вигляд сітки",
|
|
|
+ listView: "Перегляд списку",
|
|
|
+ lowDiskSpaceWarning: "Попередження про брак місця на диску",
|
|
|
+ lowDiskSpaceDetails: "Вільно лише {{free}} із {{total}}. У налаштуваннях задано поріг {{threshold}} ГБ.",
|
|
|
+ files: "Файли",
|
|
|
+ folders: "Папки",
|
|
|
+ size: "Розмір",
|
|
|
+ free: "Вільно",
|
|
|
+ allFiles: "Усі файли",
|
|
|
+ allExternal: "Зовнішні",
|
|
|
+ externalIsEmpty: "Немає зовнішніх файлів",
|
|
|
+ externalEmptyDescription: "Тут відображатимуться файли у ваших пов’язаних зовнішніх папках.",
|
|
|
+ wrap: "Перенесення",
|
|
|
+ enableTextWrapping: "Увімкнути перенесення тексту",
|
|
|
+ disableTextWrapping: "Вимкнути перенесення тексту",
|
|
|
+ collapse: "Згорнути",
|
|
|
+ collapseFoldersByDefault: "За замовчуванням згорнути папки",
|
|
|
+ expandFoldersByDefault: "Розгорнути папки за замовчуванням",
|
|
|
+ folderSort: "Сортування папок",
|
|
|
+ folderSortByName: "За назвою",
|
|
|
+ folderSortByActivity: "За останніми діями",
|
|
|
+ dragToResizeTooltip: "Перетягніть, щоб змінити розмір, двічі клацніть, щоб скинути",
|
|
|
+ searchFiles: "Пошук файлів...",
|
|
|
+ searchSubfoldersHint: "Включаючи вкладені папки",
|
|
|
+ readme: {
|
|
|
+ truncated: "Усічений",
|
|
|
+ show: "Показати README",
|
|
|
+ hide: "Приховати README",
|
|
|
+ label: "README",
|
|
|
+ },
|
|
|
+ tags: {
|
|
|
+ title: "Теги",
|
|
|
+ subtitle: "Файли міток для наскрізної фільтрації — іграшки, безпечні для дітей, лише PETG, будь-що.",
|
|
|
+ manage: "Теги",
|
|
|
+ manageTitle: "Керувати каталогом тегів",
|
|
|
+ add: "Новий тег",
|
|
|
+ edit: "Перейменувати тег",
|
|
|
+ name: "Назва",
|
|
|
+ fileCount: "Файли",
|
|
|
+ empty: "Тегів ще немає. Створіть його, щоб розпочати маркування файлів.",
|
|
|
+ noMatches: "Немає відповідних тегів.",
|
|
|
+ createPlaceholder: "напр. іграшки, безпечні для дітей, petg",
|
|
|
+ createButton: "Створити",
|
|
|
+ nameRequired: "Потрібно вказати назву.",
|
|
|
+ searchPlaceholder: "Фільтр тегів...",
|
|
|
+ created: "Тег створено.",
|
|
|
+ updated: "Тег перейменовано.",
|
|
|
+ deleted: "Тег видалено.",
|
|
|
+ saveFailed: "Не вдалося зберегти тег.",
|
|
|
+ deleteFailed: "Не вдалося видалити тег.",
|
|
|
+ applyFailed: "Не вдалося застосувати теги.",
|
|
|
+ applyAdd: "Додати теги",
|
|
|
+ applyRemove: "Видалити теги",
|
|
|
+ applyAddSuccess: "Додано теги {{count}} до файлів {{files}}.",
|
|
|
+ applyRemoveSuccess: "Видалено теги {{count}} у файлах {{files}}.",
|
|
|
+ actionAdd: "Додати до вибраних файлів",
|
|
|
+ actionRemove: "Видалити з вибраних файлів",
|
|
|
+ tagAction: "Тег",
|
|
|
+ bulkTitle: "Позначити вибрані файли ({{count}})",
|
|
|
+ bulkTooltip: "Додати або видалити теги для кожного вибраного файлу.",
|
|
|
+ noPermission: "Ви не маєте дозволу позначати файли тегами.",
|
|
|
+ filterLabel: "Фільтрування за:",
|
|
|
+ clearAll: "Очистити все",
|
|
|
+ confirmDelete: "Видалити тег \"{{name}}\"?",
|
|
|
+ confirmDeleteMessage: "Це видалить тег з каталогу. Файли зберігають інші теги.",
|
|
|
+ confirmDeleteInUseMessage: "Цей тег призначено файлам ({{count}}). Його буде видалено з усіх файлів, але самі файли залишаться без змін.",
|
|
|
+ editAria: "Редагувати {{name}}",
|
|
|
+ deleteAria: "Видалити {{name}}",
|
|
|
+ },
|
|
|
+ allTypes: "Усі типи",
|
|
|
+ prints: "Друки",
|
|
|
+ ascending: "За зростанням",
|
|
|
+ descending: "За спаданням",
|
|
|
+ showModified: "Показати змінені дати",
|
|
|
+ hideModified: "Приховати змінені дати",
|
|
|
+ lastModified: "Востаннє змінено",
|
|
|
+ resultsCount: "{{showing}} з {{total}} файлів",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ deselectAll: "Зняти вибір із усіх",
|
|
|
+ selected: "Вибрано: {{count}}",
|
|
|
+ adding: "Додавання...",
|
|
|
+ loadingFiles: "Завантаження файлів...",
|
|
|
+ folderIsEmpty: "Папка порожня",
|
|
|
+ noFilesYet: "Файлів ще немає",
|
|
|
+ folderEmptyDescription: "Щоб почати, вивантажте файли або перемістіть їх до цієї папки.",
|
|
|
+ noFilesDescription: "Вивантажте файли, щоб упорядковувати матеріали для друку.",
|
|
|
+ noMatchingFiles: "Немає відповідних файлів",
|
|
|
+ noMatchingFilesDescription: "Жоден файл не відповідає вашим поточним критеріям пошуку чи фільтру.",
|
|
|
+ clearFilters: "Очистити фільтри",
|
|
|
+ printedCount: "Надруковано {{count}}x",
|
|
|
+ uploadedBy: "Вивантажено",
|
|
|
+ deleteFolder: "Видалити папку",
|
|
|
+ deleteFile: "Видалити файл",
|
|
|
+ deleteFilesCount: "Видалити файли {{count}}.",
|
|
|
+ deleteFolderConfirm: "Ви впевнені, що хочете видалити цю папку? Усі файли всередині також буде видалено.",
|
|
|
+ deleteFileConfirm: "Ви впевнені, що хочете видалити цей файл?",
|
|
|
+ deleteFilesConfirm: "Ви впевнені, що бажаєте видалити вибрані файли {{count}}? Цю дію не можна скасувати.",
|
|
|
+ deleting: "Видалення...",
|
|
|
+ noPermissionRenameFolder: "Ви не маєте дозволу на перейменування папок",
|
|
|
+ noPermissionLinkFolder: "Ви не маєте дозволу на пов’язування папок",
|
|
|
+ noPermissionDeleteFolder: "Ви не маєте дозволу на видалення папок",
|
|
|
+ onlyEmptyFoldersDeletable: "Можна видаляти лише порожні папки",
|
|
|
+ noPermissionPrint: "Ви не маєте дозволу на друк",
|
|
|
+ noPermissionAddToQueue: "Ви не маєте дозволу на додавання в чергу",
|
|
|
+ noPermissionSlice: "Ви не маєте дозволу нарізати файли",
|
|
|
+ noPermissionDownload: "У вас немає дозволу на завантаження файлів",
|
|
|
+ noPermissionRenameFile: "Ви не маєте дозволу на перейменування цього файлу",
|
|
|
+ noPermissionGenerateThumbnail: "Ви не маєте дозволу створювати мініатюри",
|
|
|
+ noPermissionDeleteFile: "Ви не маєте дозволу на видалення цього файлу",
|
|
|
+ noPermissionCreateFolder: "Ви не маєте дозволу на створення папок",
|
|
|
+ noPermissionUpload: "Ви не маєте дозволу на вивантаження файлів",
|
|
|
+ noPermissionMoveFiles: "Ви не маєте дозволу на переміщення файлів",
|
|
|
+ noPermissionDeleteFiles: "Ви не маєте дозволу на видалення файлів",
|
|
|
+ // External folder
|
|
|
+ linkExternal: "Зовнішнє посилання",
|
|
|
+ linkExternalFolder: "Посилання на зовнішню папку",
|
|
|
+ linkExternalFolderDescription: "Змонтуйте каталог хоста (NAS, USB, спільний мережевий ресурс) у файловому менеджері. Файли не копіюються — доступ до них здійснюється безпосередньо з початкового шляху.",
|
|
|
+ externalFolderNamePlaceholder: "наприклад, NAS Друкує",
|
|
|
+ externalPath: "Шлях хоста",
|
|
|
+ externalPathHelp: "Абсолютний шлях до каталогу на хості Docker. Має бути прив’язано до контейнера.",
|
|
|
+ readOnly: "Тільки для читання",
|
|
|
+ readOnlyHelp: "забороняє вивантаження й видалення",
|
|
|
+ showHiddenFiles: "Показати приховані файли (dotfiles)",
|
|
|
+ externalFolder: "Зовнішня папка",
|
|
|
+ scanFolder: "Сканувати",
|
|
|
+ toast: {
|
|
|
+ folderCreated: "Папка створена",
|
|
|
+ folderDeleted: "Папку видалено",
|
|
|
+ fileDeleted: "Файл видалено",
|
|
|
+ filesDeleted: "Видалені файли {{count}}.",
|
|
|
+ filesMoved: "Файли переміщено",
|
|
|
+ folderLinked: "Папку пов’язано",
|
|
|
+ folderUnlinked: "Папку від’єднано",
|
|
|
+ externalFolderLinked: "Зовнішня папка пов’язана та просканована",
|
|
|
+ folderScanned: "Сканування завершено: {{added}} додано, {{removed}} видалено",
|
|
|
+ addedToQueue: "Додано до черги файлів: {{count}}",
|
|
|
+ addedToQueuePartial: "Додано: {{added}}; не вдалося додати: {{failed}}",
|
|
|
+ failedToAddToQueue: "Не вдалося додати файли: {{error}}",
|
|
|
+ fileRenamed: "Файл перейменовано",
|
|
|
+ folderRenamed: "Папку перейменовано",
|
|
|
+ thumbnailsGenerated: "Створено мініатюри {{count}}",
|
|
|
+ thumbnailsGeneratedPartial: "Створено мініатюри {{succeeded}}, {{failed}} не вдалося",
|
|
|
+ noStlMissingThumbnails: "Немає файлів STL без мініатюр",
|
|
|
+ failedToGenerateThumbnails: "Не вдалося створити мініатюри: {{error}}",
|
|
|
+ thumbnailGenerated: "Створено мініатюру",
|
|
|
+ failedToGenerateThumbnail: "Не вдалося створити мініатюру: {{error}}",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Projects
|
|
|
+ projects: {
|
|
|
+ title: "Проєкти",
|
|
|
+ subtitle: "Організовуйте та відстежуйте свої проєкти 3D-друку",
|
|
|
+ newProject: "Новий проєкт",
|
|
|
+ editProject: "Редагувати проєкт",
|
|
|
+ deleteProject: "Видалити проєкт",
|
|
|
+ projectName: "Назва проєкту",
|
|
|
+ description: "опис",
|
|
|
+ noProjects: "Проєктів ще немає",
|
|
|
+ noProjectsFiltered: "Немає проєктів {{status}}.",
|
|
|
+ noProjectsFilteredHelp: "У вас немає {{status}} проєктів. Проєкти з’являться тут, коли їхній статус зміниться.",
|
|
|
+ createFirst: "Створіть свій перший проєкт, щоб почати впорядковувати пов’язані роздруківки, відстежувати прогрес і керувати збірками.",
|
|
|
+ createFirstButton: "Створіть свій перший проєкт",
|
|
|
+ create: "Створити",
|
|
|
+ files: "Файли",
|
|
|
+ prints: "Принти",
|
|
|
+ plates: "пластини",
|
|
|
+ parts: "частин",
|
|
|
+ lastModified: "Остання зміна",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити цей проєкт? Архіви та елементи черги буде від’єднано, але не видалено.",
|
|
|
+ addFiles: "Додати файли",
|
|
|
+ removeFile: "Видалити файл",
|
|
|
+ viewDetails: "Переглянути деталі",
|
|
|
+ // Modal fields
|
|
|
+ namePlaceholder: "наприклад, Voron 2.4 Build",
|
|
|
+ descriptionPlaceholder: "Додатковий опис...",
|
|
|
+ urlLabel: "URL",
|
|
|
+ urlPlaceholder: "https://makerworld.com/...",
|
|
|
+ urlInvalid: "URL має починатися з http:// або https://",
|
|
|
+ openExternalUrl: "Відкритий проєкт URL",
|
|
|
+ coverImageLabel: "Фото обкладинки",
|
|
|
+ coverImageAlt: "Обкладинка проєкту",
|
|
|
+ coverImageUpload: "Вивантажити",
|
|
|
+ coverImageReplace: "Замінити",
|
|
|
+ coverImageRemove: "видалити",
|
|
|
+ color: "Колір",
|
|
|
+ targetPlates: "Цільові пластини",
|
|
|
+ targetPlatesPlaceholder: "наприклад, 25",
|
|
|
+ targetPlatesHelp: "Кількість завдань друку",
|
|
|
+ targetParts: "Цільові частини",
|
|
|
+ targetPartsPlaceholder: "наприклад, 150",
|
|
|
+ targetPartsHelp: "Загальна кількість необхідних об’єктів",
|
|
|
+ targetSets: "Копій кожного файлу",
|
|
|
+ targetSetsPlaceholder: "наприклад, 10",
|
|
|
+ targetSetsHelp: "Кількість друків кожного придатного до друку файлу",
|
|
|
+ tagsLabel: "Теги (розділені комами)",
|
|
|
+ tagsPlaceholder: "напр., ворон, функціональний, подарунок",
|
|
|
+ dueDate: "Термін виконання",
|
|
|
+ priority: "Пріоритет",
|
|
|
+ priorityLow: "Низький",
|
|
|
+ priorityNormal: "нормальний",
|
|
|
+ priorityHigh: "Високий",
|
|
|
+ priorityUrgent: "Терміново",
|
|
|
+ // Status
|
|
|
+ statusActive: "Активний",
|
|
|
+ statusCompleted: "Виконано",
|
|
|
+ statusArchived: "Архівовано",
|
|
|
+ done: "Готово",
|
|
|
+ completed: "завершено",
|
|
|
+ failed: "не вдалося",
|
|
|
+ inQueue: "в черзі",
|
|
|
+ noPrintsYet: "Ще немає відбитків",
|
|
|
+ // Footer stats
|
|
|
+ printJobs: "Завдання друку (пластини)",
|
|
|
+ partsPrinted: "Надруковані частини",
|
|
|
+ failedParts: "Вийшли з ладу деталі",
|
|
|
+ // Actions
|
|
|
+ import: "Імпорт",
|
|
|
+ export: "Експорт",
|
|
|
+ importProject: "Імпорт проєкту",
|
|
|
+ exportAll: "Експортуйте всі проєкти",
|
|
|
+ loading: "Завантаження проєктів...",
|
|
|
+ // Permissions
|
|
|
+ noEditPermission: "Ви не маєте дозволу на редагування проєктів",
|
|
|
+ noDeletePermission: "Ви не маєте дозволу на видалення проєктів",
|
|
|
+ noCreatePermission: "Ви не маєте дозволу на створення проєктів",
|
|
|
+ noImportPermission: "Ви не маєте дозволу на імпорт проєктів",
|
|
|
+ noExportPermission: "Ви не маєте дозволу на експорт проєктів",
|
|
|
+ // Toast
|
|
|
+ toast: {
|
|
|
+ created: "Проєкт створено",
|
|
|
+ updated: "Проєкт оновлений",
|
|
|
+ deleted: "Проєкт видалено",
|
|
|
+ imported: "Проєкт імпортовано",
|
|
|
+ multipleImported: "{{count}} проєкти імпортовані",
|
|
|
+ importFailed: "Помилка імпорту",
|
|
|
+ exported: "Експортовані проєкти (лише метадані)",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Project detail page
|
|
|
+ projectDetail: {
|
|
|
+ notFound: "Проєкт не знайдено",
|
|
|
+ backToProjects: "Назад до проєктів",
|
|
|
+ export: "Експорт",
|
|
|
+ exportProject: "Експортний проєкт",
|
|
|
+ noExportPermission: "Ви не маєте дозволу на експорт проєктів",
|
|
|
+ noEditPermission: "Ви не маєте дозволу на редагування проєктів",
|
|
|
+ partOf: "частина:",
|
|
|
+ priorityLabel: "Пріоритет:",
|
|
|
+ noPrints: "У цьому проєкті ще немає роздруківок",
|
|
|
+ status: {
|
|
|
+ active: "Активний",
|
|
|
+ completed: "Виконано",
|
|
|
+ archived: "Архівовано",
|
|
|
+ },
|
|
|
+ priority: {
|
|
|
+ low: "Низький",
|
|
|
+ normal: "нормальний",
|
|
|
+ high: "Високий",
|
|
|
+ urgent: "Терміново",
|
|
|
+ },
|
|
|
+ dueDate: {
|
|
|
+ overdue: "Прострочена",
|
|
|
+ today: "Термін виконання сьогодні",
|
|
|
+ daysLeft: "Залишилося {{count}} днів",
|
|
|
+ },
|
|
|
+ progress: {
|
|
|
+ platesProgress: "Пластини Прогрес",
|
|
|
+ partsProgress: "Прогрес запчастин",
|
|
|
+ setsProgress: "Завершені комплекти",
|
|
|
+ sets: "комплектів",
|
|
|
+ setsHint: "Комплект вважається завершеним, коли кожен придатний до друку файл надруковано стільки разів",
|
|
|
+ printJobs: "завдання друку",
|
|
|
+ parts: "частин",
|
|
|
+ percentComplete: "{{percent}}% виконано",
|
|
|
+ remaining: "Залишилося {{count}}.",
|
|
|
+ },
|
|
|
+ stats: {
|
|
|
+ printJobs: "Завдання друку",
|
|
|
+ total: "всього",
|
|
|
+ failed: "{{count}} не вдалося",
|
|
|
+ partsPrinted: "Надруковані частини {{count}}.",
|
|
|
+ printTime: "Час друку",
|
|
|
+ filamentUsed: "Філамент, що використовується",
|
|
|
+ },
|
|
|
+ cost: {
|
|
|
+ title: "Відстеження витрат",
|
|
|
+ filamentCost: "Вартість філаменту",
|
|
|
+ energy: "Енергія",
|
|
|
+ totalCost: "Загальна вартість",
|
|
|
+ total: "Всього",
|
|
|
+ includesBom: "в т.ч. BOM",
|
|
|
+ budget: "Бюджет",
|
|
|
+ remaining: "Залишилося",
|
|
|
+ },
|
|
|
+ subProjects: {
|
|
|
+ title: "Підпроєкти ({{count}})",
|
|
|
+ },
|
|
|
+ notes: {
|
|
|
+ title: "Примітки",
|
|
|
+ noEditPermission: "Ви не маєте дозволу редагувати нотатки",
|
|
|
+ placeholder: "Додайте примітки щодо цього проєкту...",
|
|
|
+ empty: "Приміток ще немає. Натисніть Редагувати, щоб додати примітки.",
|
|
|
+ },
|
|
|
+ files: {
|
|
|
+ title: "Файли",
|
|
|
+ linkFolders: "Зв’язувати папки з файлового менеджера",
|
|
|
+ forQuickAccess: "до цього проєкту для швидкого доступу.",
|
|
|
+ fileCount: "Файлів: {{count}}",
|
|
|
+ empty: "Немає пов’язаних папок. Перейдіть до файлового менеджера та зв’яжіть папку з цим проєктом.",
|
|
|
+ printedCount: "Надруковано разів: {{count}}",
|
|
|
+ progressTooltip: "Завершено друків: {{done}} із {{target}}",
|
|
|
+ noFiles: "У цій папці немає файлів.",
|
|
|
+ },
|
|
|
+ bom: {
|
|
|
+ title: "Перелік матеріалів",
|
|
|
+ acquired: "{{completed}}/{{total}} придбано",
|
|
|
+ showAll: "Показати все",
|
|
|
+ hideDone: "Сховати готове",
|
|
|
+ addPart: "Додати частину",
|
|
|
+ noAddPermission: "Ви не маєте дозволу додавати частини",
|
|
|
+ partNamePlaceholder: "Назва деталі (наприклад, гвинти M3x8)",
|
|
|
+ partName: "Назва частини",
|
|
|
+ qty: "кількість",
|
|
|
+ price: "Ціна ({{currency}})",
|
|
|
+ sourcingUrlPlaceholder: "URL джерела (необов’язково)",
|
|
|
+ remarksPlaceholder: "Примітки (необов’язково)",
|
|
|
+ deletePart: "Видалити частину",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"?",
|
|
|
+ noUpdatePermission: "Ви не маєте дозволу на оновлення частин",
|
|
|
+ noEditPermission: "Ви не маєте дозволу редагувати частини",
|
|
|
+ noDeletePermission: "Ви не маєте дозволу на видалення частин",
|
|
|
+ totalCost: "Загальна вартість:",
|
|
|
+ empty: "Немає частин у описі матеріалів. Додайте обладнання, електроніку чи інші компоненти, щоб відстежувати, що потрібно отримати.",
|
|
|
+ },
|
|
|
+ timeline: {
|
|
|
+ title: "Хронологія діяльності",
|
|
|
+ empty: "Активності ще немає.",
|
|
|
+ },
|
|
|
+ template: {
|
|
|
+ saveAsTemplate: "Зберегти як шаблон",
|
|
|
+ noCreatePermission: "Ви не маєте дозволу на створення шаблонів",
|
|
|
+ },
|
|
|
+ queue: {
|
|
|
+ title: "Черга",
|
|
|
+ viewAll: "Переглянути всі",
|
|
|
+ printing: "Друкується: {{count}}",
|
|
|
+ queued: "{{count}} у черзі",
|
|
|
+ },
|
|
|
+ prints: {
|
|
|
+ title: "Друки ({{count}})",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ projectUpdated: "Проєкт оновлений",
|
|
|
+ partAdded: "Частина додана",
|
|
|
+ partRemoved: "Частину видалено",
|
|
|
+ exportFailed: "Помилка експорту",
|
|
|
+ projectExported: "Проєкт експортовано",
|
|
|
+ templateCreated: "Шаблон створено",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // System info
|
|
|
+ system: {
|
|
|
+ title: "Інформація про систему",
|
|
|
+ version: "Версія",
|
|
|
+ uptime: "Час роботи",
|
|
|
+ cpuUsage: "CPU Використання",
|
|
|
+ memoryUsage: "Використання пам’яті",
|
|
|
+ diskUsage: "Використання диска",
|
|
|
+ networkInfo: "Інформація про мережу",
|
|
|
+ logs: "Журнали",
|
|
|
+ debugMode: "Режим налагодження",
|
|
|
+ enableDebug: "Увімкнути журнал налагодження",
|
|
|
+ disableDebug: "Вимкнути ведення журналу налагодження",
|
|
|
+ downloadLogs: "Завантажити журнали",
|
|
|
+ clearLogs: "Очистити журнали",
|
|
|
+ dockerInfo: "Docker Інформація",
|
|
|
+ containerName: "Назва контейнера",
|
|
|
+ imageName: "Назва зображення",
|
|
|
+ platform: "Платформа",
|
|
|
+ architecture: "Архітектура",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Sponsor surface (System page)
|
|
|
+ sponsors: {
|
|
|
+ sectionTitle: "Незалежний і фінансований громадою",
|
|
|
+ tagline: "Bambuddy є безкоштовним і залишається таким, тому що люди вирішили його підтримати. Ні VC, ні блокування в хмарі.",
|
|
|
+ viewSupporters: "Переглянути прихильників",
|
|
|
+ toastPrints: "Завершено друків із Bambuddy: {{count}}. Bambuddy залишається безкоштовним завдяки своїм прихильникам.",
|
|
|
+ toastCost: "За допомогою Bambuddy обліковано філаменту на {{total}}. Дізнайтеся, хто допомагає проєкту залишатися незалежним.",
|
|
|
+ toastArchives: "Заархівовано друків із Bambuddy: {{count}}. Дізнайтеся, хто допомагає проєкту залишатися незалежним.",
|
|
|
+ toastAnniversary: "Рік з Bambuddy! Подивіться, хто зберігає незалежність проєкту.",
|
|
|
+ toastVersionUpdate: "Оновлено до v{{version}}. Bambuddy залишається безкоштовним завдяки своїм прихильникам.",
|
|
|
+ toastBusiness: "Використовуєте Bambuddy на принтерах ({{count}})? Для команд доступний план підтримки: пріоритетні виправлення, виставлення рахунків і прямий зв’язок із супровідником.",
|
|
|
+ businessCta: "Bambuddy для бізнесу",
|
|
|
+ businessTitle: "Bambuddy для бізнесу",
|
|
|
+ businessTagline: "Ви використовуєте принтери {{count}}. Пріоритетна підтримка, комерційне ліцензування та виставлення рахунків доступні для команд і друкарень.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Library (K Profiles)
|
|
|
+ library: {
|
|
|
+ title: "Бібліотека філаментів",
|
|
|
+ addFilament: "Додати філамент",
|
|
|
+ editFilament: "Редагувати філамент",
|
|
|
+ deleteFilament: "Видалити філамент",
|
|
|
+ vendor: "Продавець",
|
|
|
+ material: "матеріал",
|
|
|
+ color: "Колір",
|
|
|
+ kFactor: "Фактор K",
|
|
|
+ temperature: "температура",
|
|
|
+ noFilaments: "У бібліотеці немає філаментів",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити цю філамент?",
|
|
|
+ importFromPrinter: "Імпорт із принтера",
|
|
|
+ exportToFile: "Експорт у файл",
|
|
|
+ // Slicer Pipelines run from the File Manager (#1425 PR B). The Run-with-pipeline
|
|
|
+ // modal is a two-step dialog: pick a pipeline, then either fire (eligibility ok)
|
|
|
+ // or confirm-and-fire (eligibility report shown). Lives in components/RunWithPipelineModal.tsx.
|
|
|
+ runWithPipeline: {
|
|
|
+ actionLabel: "Запустити з конвеєром",
|
|
|
+ noPermission: "Ви не маєте дозволу на запуск конвеєрів",
|
|
|
+ modalTitle: "Запустити з конвеєром",
|
|
|
+ confirmTitle: "Підтвердити запуск",
|
|
|
+ confirmIntro: "Під час попередньої перевірки виявлено проблеми з цим запуском",
|
|
|
+ sourceHint: "Джерело",
|
|
|
+ pipelineHint: "Конвеєр",
|
|
|
+ targetHint: "Ціль",
|
|
|
+ pipelineListAria: "Наявні конвеєри",
|
|
|
+ runAnyway: "Усе одно запустити",
|
|
|
+ loading: "Завантаження…",
|
|
|
+ empty: "Збережених конвеєрів ще немає. Відкрийте вікно нарізання й натисніть «Зберегти як конвеєр», щоб створити його.",
|
|
|
+ noTarget: "Цільовий принтер не встановлено",
|
|
|
+ noTargetMessage: "Для цього конвеєра не задано цільовий принтер. Відкрийте конвеєр у налаштуваннях і виберіть принтер.",
|
|
|
+ // PR C — copies input + class-targeted pipelines.
|
|
|
+ copies: "Копії",
|
|
|
+ copiesHint: "максимум {{n}}",
|
|
|
+ classTarget: "Будь-який {{model}}",
|
|
|
+ toast: {
|
|
|
+ started: "Пуск конвеєра розпочато",
|
|
|
+ failed: "Не вдалося розпочати запуск",
|
|
|
+ },
|
|
|
+ issue: {
|
|
|
+ printerNotSet: "У цьому конвеєрі не встановлено цільовий принтер.",
|
|
|
+ printerNotFound: "Цільовий принтер більше не існує.",
|
|
|
+ printerDisabled: "Цільовий принтер вимкнено.",
|
|
|
+ printerOffline: "Цільовий принтер не в мережі.",
|
|
|
+ filamentType: "Слот філаменту {{slot}}: очікується {{expected}}, в AMS — {{actual}}",
|
|
|
+ filamentColor: "Слот філаменту {{slot}}: колір не збігається (очікується {{expected}}, в AMS — {{actual}})",
|
|
|
+ amsSlotMissing: "Слот AMS {{slot}} недоступний на цьому принтері",
|
|
|
+ filamentUnverified: "Філамент для слота {{slot}} походить із хмарного або стандартного профілю, тому його неможливо перевірити заздалегідь.",
|
|
|
+ // PR C — class targeting
|
|
|
+ noClassMatches: "Жоден принтер у цій інсталяції не належить до цільового класу моделей конвеєра ({{expected}}).",
|
|
|
+ classNotSet: "Ціллю конвеєра вибрано клас принтерів, але модель не задано.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Slice (slicer-API integration via SliceModal)
|
|
|
+ slice: {
|
|
|
+ title: "Нарізання моделі",
|
|
|
+ action: "Нарізати",
|
|
|
+ actionAll: "Нарізати всі пластини ({{count}})",
|
|
|
+ actionAllTitle: "Нарізати всі пластини в один багатопластинний результат (один архів). Вибір філаменту охоплює всі слоти, визначені проєктом.",
|
|
|
+ allPlatesToggle: "Нарізати всі пластини ({{count}})",
|
|
|
+ slicing: "Нарізання…",
|
|
|
+ printer: "Профіль принтера",
|
|
|
+ process: "Профіль процесу",
|
|
|
+ filament: "Профіль філаменту",
|
|
|
+ filamentSlot: "Філамент {{index}} ({{type}})",
|
|
|
+ selectPreset: "— Виберіть профіль —",
|
|
|
+ loadingPresets: "Завантаження профілів…",
|
|
|
+ analyzingPlateFilaments: "Аналіз філаментів пластини…",
|
|
|
+ analyzingPlateFilamentsHint: "Виконується попереднє нарізання, щоб визначити, які слоти AMS використовує ця пластина. Результат кешується, тому повторне відкриття відбувається миттєво.",
|
|
|
+ previewToast: "Аналіз {{name}} — {{elapsed}}",
|
|
|
+ previewWithProgress: "Аналіз {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
|
|
|
+ notUsedByPlate: "— не використовується на цій пластині",
|
|
|
+ noPresetsForSlot: "Немає профілів",
|
|
|
+ otherPrinters: "Інші принтери",
|
|
|
+ presetsLoadFailed: "Не вдалося завантажити профілі. Спочатку імпортуйте їх у розділі Налаштування → Профілі.",
|
|
|
+ refreshPresets: "Оновити",
|
|
|
+ refreshPresetsTitle: "Оновити профілі — отримати найновіші хмарні та вбудовані списки (скористайтеся після видалення профілю в Bambu Studio або Bambu Handy)",
|
|
|
+ allPresetsRequired: "Потрібно вибрати всі профілі",
|
|
|
+ useEmbedded: "Використати вбудовані налаштування файлу",
|
|
|
+ useEmbeddedHint: "Нарізати модель із налаштуваннями автора файлу — стінками, заповненням і філаментом — замість профілів вище. Ця можливість доступна, оскільки модель принтера відповідає файлу.",
|
|
|
+ designSettings: "Зберегти налаштування автора",
|
|
|
+ designSettingsHint: "Цей файл змінює {{count}} налаштувань друку порівняно зі стандартним профілем.",
|
|
|
+ designSettingsSelected: "Вибрано {{selected}} із {{total}}",
|
|
|
+ designSettingsPrinterCoupled: "залежить від принтера",
|
|
|
+ designSettingsPrinterCoupledHint: "Значення підібрано для принтера, під який створено файл, — на вашому воно може бути неправильним або поза допустимим діапазоном.",
|
|
|
+ enqueuing: "Надсилання завдання нарізання…",
|
|
|
+ queued: "У черзі…",
|
|
|
+ failed: "Не вдалося виконати нарізання. Перевірте журнали слайсера.",
|
|
|
+ startedToast: "Нарізання {{name}} у фоновому режимі…",
|
|
|
+ queuedToast: "У черзі: {{name}} — {{elapsed}}",
|
|
|
+ runningToast: "Нарізання {{name}} — {{elapsed}}",
|
|
|
+ runningWithProgress: "{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
|
|
|
+ runningWithProgressMultiPlate: "Пластина {{plateIndex}} з {{plateCount}} • {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
|
|
|
+ completedToast: "Нарізання {{name}} завершено",
|
|
|
+ failedTitle: "Помилка нарізання",
|
|
|
+ failedToast: "Помилка нарізання {{name}}: {{detail}}",
|
|
|
+ tier: {
|
|
|
+ local: "Імпортовані",
|
|
|
+ cloud: "Bambu Cloud",
|
|
|
+ orcaCloud: "Orca Cloud",
|
|
|
+ standard: "Стандартний",
|
|
|
+ },
|
|
|
+ cloud: {
|
|
|
+ notAuthenticated: "Увійдіть у Bambu Cloud (Налаштування → Профілі → Bambu Cloud), щоб переглянути хмарні профілі.",
|
|
|
+ expired: "Сеанс Bambu Cloud завершився — увійдіть знову, щоб оновити хмарні профілі.",
|
|
|
+ unreachable: "Bambu Cloud зараз недоступний. Локальні та стандартні профілі й надалі працюють.",
|
|
|
+ },
|
|
|
+ orcaCloud: {
|
|
|
+ notAuthenticated: "Увійдіть до Orca Cloud (Профілі → Orca Cloud), щоб переглянути профілі Orca.",
|
|
|
+ expired: "Сеанс Orca Cloud завершився — увійдіть ще раз, щоб оновити профілі Orca.",
|
|
|
+ unreachable: "Orca Cloud зараз недоступний. Інші профілі й надалі працюють.",
|
|
|
+ },
|
|
|
+ bedType: {
|
|
|
+ label: "Друкарська пластина",
|
|
|
+ auto: "Авто (використовувати профіль процесу)",
|
|
|
+ coolPlate: "Холодна друкарська пластина",
|
|
|
+ coolPlateSuperTack: "Cool Plate SuperTack",
|
|
|
+ engineering: "Інженерна пластина",
|
|
|
+ highTemp: "Високотемпературна пластина",
|
|
|
+ texturedPEI: "Текстурована PEI-пластина",
|
|
|
+ smoothPEI: "Гладка PEI-пластина",
|
|
|
+ },
|
|
|
+ // Slicer Pipelines (#1425) — apply a saved bundle or save the current pick.
|
|
|
+ pipelines: {
|
|
|
+ label: "Конвеєр",
|
|
|
+ applyAria: "Застосувати конвеєр",
|
|
|
+ applyPrompt: "Застосувати конвеєр…",
|
|
|
+ empty: "Немає збережених конвеєрів",
|
|
|
+ saveButton: "Зберегти як конвеєр",
|
|
|
+ saveTitle: "Зберегти поточний вибір чотирьох слотів як конвеєр для повторного використання",
|
|
|
+ namePlaceholder: "Назва конвеєра",
|
|
|
+ nameAria: "Нова назва конвеєра",
|
|
|
+ toast: {
|
|
|
+ applied: "Застосовано \"{{name}}\"",
|
|
|
+ saved: "Конвеєр збережено",
|
|
|
+ saveFailed: "Не вдалося зберегти",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Spoolman
|
|
|
+ spoolman: {
|
|
|
+ title: "Spoolman Інтеграція",
|
|
|
+ enabled: "Spoolman Увімкнено",
|
|
|
+ url: "Spoolman URL",
|
|
|
+ connected: "Підключено",
|
|
|
+ disconnected: "Не підключено",
|
|
|
+ testConnection: "Тестове підключення",
|
|
|
+ sync: "Синхронізувати",
|
|
|
+ syncing: "Синхронізація...",
|
|
|
+ lastSync: "Остання синхронізація",
|
|
|
+ linkToSpoolman: "Посилання на Spoolman",
|
|
|
+ openInSpoolman: "Відкрити в Spoolman",
|
|
|
+ unlinkSpool: "Від’єднати котушка",
|
|
|
+ unlinkConfirmTitle: "Скасувати призначення котушки?",
|
|
|
+ unlinkConfirmMessage: "Це призведе до видалення котушки з цього слота. Самі дані котушки залишаться незмінними.",
|
|
|
+ selectSpool: "Вибрати Spool",
|
|
|
+ noUnlinkedSpools: "Немає непризначених котушок",
|
|
|
+ linkSuccess: "Котушку успішно призначено",
|
|
|
+ linkFailed: "Не вдалося призначити котушку",
|
|
|
+ unlinkSuccess: "Призначення котушки успішно скасовано",
|
|
|
+ unlinkFailed: "Не вдалося скасувати призначення котушки",
|
|
|
+ linkedSpool: "Призначена котушка",
|
|
|
+ spoolId: "Ідентифікатор котушки",
|
|
|
+ fillSourceLabel: "(Spoolman)",
|
|
|
+ weight: "вага",
|
|
|
+ remaining: "Залишилося",
|
|
|
+ disableWeightSync: "Вимкнути синхронізацію приблизної ваги AMS.",
|
|
|
+ disableWeightSyncDesc: "Не оновлюйте залишкову ємність із оцінок AMS. Використовуйте це, якщо ви віддаєте перевагу відстеженню використання Spoolman, а не оцінкам на основі відсотка AMS. Нові котушки все ще використовуватимуть оцінку AMS як початкову вагу.",
|
|
|
+ reportPartialUsage: "Повідомити про часткове використання для невдалого друку",
|
|
|
+ reportPartialUsageDesc: "Якщо друк не вдається або скасовується, повідомте приблизну кількість філаменту, використаної до цього моменту, на основі виконання шару.",
|
|
|
+ },
|
|
|
+
|
|
|
+ locations: {
|
|
|
+ title: "Місця зберігання",
|
|
|
+ subtitle: "Керуйте полицями, шухлядами та іншими фізичними місцями для зберігання своїх котушок",
|
|
|
+ add: "Додати місцезнаходження",
|
|
|
+ addShort: "додати",
|
|
|
+ edit: "Редагувати місцезнаходження",
|
|
|
+ name: "Назва",
|
|
|
+ spools: "Котушки",
|
|
|
+ empty: "Місць зберігання ще немає. Створіть свою першу полицю або ящик.",
|
|
|
+ manage: "Розташування",
|
|
|
+ createPlaceholder: "напр. Полиця А, ящик 1",
|
|
|
+ nameRequired: "Потрібно вказати назву місця",
|
|
|
+ created: "Розташування створено",
|
|
|
+ updated: "Розташування оновлено",
|
|
|
+ deleted: "Розташування видалено",
|
|
|
+ saveFailed: "Не вдалося зберегти місцезнаходження",
|
|
|
+ deleteFailed: "Не вдалося видалити місцезнаходження",
|
|
|
+ deleteBlocked: "Видаліть усі котушки з цього місця перед видаленням",
|
|
|
+ confirmDelete: "Видалити \"{{name}}\"?",
|
|
|
+ confirmDeleteMessage: "Це місце буде видалено з каталогу. Котушки спочатку потрібно перемістити.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Inventory
|
|
|
+ inventory: {
|
|
|
+ title: "Облік котушок",
|
|
|
+ subtitle: "Керуйте своїми котушками",
|
|
|
+ addToInventory: "Додати до обліку",
|
|
|
+ addToInventoryPending: "Додавання...",
|
|
|
+ addToInventorySuccess: "Котушку додано до обліку",
|
|
|
+ addToInventoryFailed: "Не вдалося додати котушку до обліку",
|
|
|
+ unknownSpoolTitle: "Виявлено нову котушку філаменту",
|
|
|
+ unknownSpoolMessage: "У {{location}} виявлено котушку з невідомою RFID-міткою. Додати її до обліку?",
|
|
|
+ unknownSpoolSlot: "Слот",
|
|
|
+ bulk: {
|
|
|
+ selectAllVisible: "Вибрати усі видимі",
|
|
|
+ selectRow: "Вибрати рядок",
|
|
|
+ selectGroup: "Вибрати групу",
|
|
|
+ selectionCount: "Вибрано {{count}}.",
|
|
|
+ edit: "Редагувати",
|
|
|
+ printLabels: "Друк етикеток",
|
|
|
+ resetUsage: "Скинути використання",
|
|
|
+ restore: "Відновити",
|
|
|
+ archive: "Архівувати",
|
|
|
+ delete: "Видалити",
|
|
|
+ clearSelection: "Очистити вибір",
|
|
|
+ editTitle: "Масове редагування котушок",
|
|
|
+ editSubtitle: "Застосовується до вибраних котушок {{count}}. Оновлюються лише ті поля, які ви позначите.",
|
|
|
+ editHint: "Введіть значення в поле, щоб позначити його для оновлення: буде надіслано лише позначені поля. Порожнє поле не змінює котушки; очистити поле можна лише під час редагування окремої котушки.",
|
|
|
+ useCustom: "Використати «{{value}}»",
|
|
|
+ toggleField: "Перемкнути оновлення для цього поля",
|
|
|
+ changeCount: "Буде оновлено полів: {{count}}",
|
|
|
+ applyPending: "Застосування...",
|
|
|
+ applyButton: "Застосувати до котушок ({{count}})",
|
|
|
+ deleteTitle: "Видалити вибрані котушки",
|
|
|
+ archiveTitle: "Архівувати вибрані котушки",
|
|
|
+ restoreTitle: "Відновити вибрані котушки",
|
|
|
+ resetUsageTitle: "Скинути використання на вибраних котушках",
|
|
|
+ deleteMessage: "Назавжди видалити котушки {{count}}? Це неможливо скасувати.",
|
|
|
+ archiveMessage: "Архівувати котушки {{count}}? Пізніше їх можна відновити.",
|
|
|
+ restoreMessage: "Відновити заархівовані котушки {{count}}?",
|
|
|
+ resetUsageMessage: "Скинути лічильник «Всього спожито» на котушках {{count}}? Залишок ваги зберігається.",
|
|
|
+ updateSuccess: "Котушок оновлено: {{count}}",
|
|
|
+ updateFailed: "Помилка масового оновлення",
|
|
|
+ updatePartial: "Оновлено: {{ok}}; не вдалося оновити: {{failed}}",
|
|
|
+ updateAllFailed: "Не вдалося оновити жодну з вибраних котушок ({{count}}). Вибір збережено для повторної спроби.",
|
|
|
+ deleteSuccess: "Котушок видалено: {{count}}",
|
|
|
+ deleteFailed: "Не вдалося масово видалити",
|
|
|
+ deletePartial: "Видалено: {{ok}}; не вдалося видалити: {{failed}}",
|
|
|
+ deleteAllFailed: "Не вдалося видалити жодну з вибраних котушок ({{count}}). Вибір збережено для повторної спроби.",
|
|
|
+ archiveSuccess: "Котушок заархівовано: {{count}}",
|
|
|
+ archiveFailed: "Помилка масового архівування",
|
|
|
+ archivePartial: "Заархівовано: {{ok}}; не вдалося заархівувати: {{failed}}",
|
|
|
+ archiveAllFailed: "Не вдалося заархівувати жодну з вибраних котушок ({{count}}). Вибір збережено для повторної спроби.",
|
|
|
+ restoreSuccess: "Котушок відновлено: {{count}}",
|
|
|
+ restoreFailed: "Помилка масового відновлення",
|
|
|
+ restorePartial: "Відновлено: {{ok}}; не вдалося відновити: {{failed}}",
|
|
|
+ restoreAllFailed: "Не вдалося відновити жодну з вибраних котушок ({{count}}). Вибір збережено для повторної спроби.",
|
|
|
+ invalidHex: "Введіть 6 шістнадцяткових символів (RRGGBB) або 8 (RRGGBBAA). Інакше поле не застосовуватиметься.",
|
|
|
+ },
|
|
|
+ spoolmanMixedContentTitle: "Spoolman не може Завантажити через HTTPS — змішаний вміст заблоковано вашим браузером",
|
|
|
+ spoolmanMixedContentBody: "Bambuddy обслуговується через HTTPS (через ваш зворотний проксі), але ваш Spoolman URL усе ще звичайний HTTP. Браузери блокують змішаний вміст для безпеки, тому вбудований Spoolman UI не може відтворюватися. Щоб це працювало, Spoolman має бути доступним через HTTPS.",
|
|
|
+ spoolmanMixedContentFixReverseProxy: "Розмістіть Spoolman за тим самим зворотним проксі, що й Bambuddy (Traefik / Nginx / Caddy) з HTTPS, а потім оновіть Spoolman URL у налаштуваннях до нової адреси HTTPS.",
|
|
|
+ spoolmanMixedContentFixOpenNewTab: "Як обхідний шлях, відкрийте Spoolman у новій вкладці браузера поверх HTTP — правила змішаного вмісту застосовуються лише до вбудованих фреймів, тому окрема вкладка все ще працює.",
|
|
|
+ spoolmanOpenInNewTab: "Відкрийте Spoolman у новій вкладці",
|
|
|
+ labels: {
|
|
|
+ title: "Друк етикеток на котушках",
|
|
|
+ selectedCount: "Вибрано {{count}}.",
|
|
|
+ pickSpools: "Виберіть котушки для друку етикеток:",
|
|
|
+ monochrome: "Монохромний (чорно-білий принтер)",
|
|
|
+ monochromeHint: "Прибирає зразок кольору та розширює область тексту",
|
|
|
+ searchPlaceholder: "Шукайте назву, бренд або #ID",
|
|
|
+ filterByMaterial: "матеріал:",
|
|
|
+ allMaterials: "все",
|
|
|
+ selectVisible: "Вибрати все видиме ({{count}})",
|
|
|
+ deselectVisible: "Скасувати вибір видимого",
|
|
|
+ clearAll: "Очистити все",
|
|
|
+ noSpoolsToShow: "Немає котушок для показу. Налаштуйте фільтр і повторіть спробу.",
|
|
|
+ noMatches: "Жодна котушка не відповідає поточному пошуку чи фільтру.",
|
|
|
+ printOne: "Друк етикетки для цієї котушки",
|
|
|
+ printLabels: "Друк етикеток…",
|
|
|
+ bulkTitle: "Виберіть котушки для друку етикеток серед показаних ({{count}})",
|
|
|
+ noSpoolsTitle: "Немає котушок для маркування",
|
|
|
+ error: "Не вдалося створити мітки: {{msg}}",
|
|
|
+ sortBy: {
|
|
|
+ label: "Сортувати:",
|
|
|
+ id: "За ідентифікатором",
|
|
|
+ color: "За кольором",
|
|
|
+ },
|
|
|
+ templates: {
|
|
|
+ amsHolderSmall: {
|
|
|
+ label: "Тримач AMS — малий (74 × 33 мм)",
|
|
|
+ hint: "Одна етикетка на сторінці; відповідає етикетці для друку від MakerWorld моделі 752566 (AMS Filament Label Holder).",
|
|
|
+ },
|
|
|
+ amsHolderLarge: {
|
|
|
+ label: "Тримач AMS — великий (75 × 55 мм)",
|
|
|
+ hint: "Одна етикетка на сторінці; підходить для варіанту тримача етикеток із філаментом AMS із вкладенням картону. Досить місткий для зразка, бренду, матеріалу, ідентифікатора та QR-коду.",
|
|
|
+ },
|
|
|
+ box40x30: {
|
|
|
+ label: "Етикетка коробки (40 × 30 мм)",
|
|
|
+ hint: "Одна етикетка на сторінці; звичайний розмір рулону DK/Brother, підходить для етикеток у пакетах із філаментом та контейнерах для зберігання.",
|
|
|
+ },
|
|
|
+ box: {
|
|
|
+ label: "Етикетка коробки (62 × 29 мм)",
|
|
|
+ hint: "Одна етикетка на сторінці; розміром для маленьких етикеток Brother PT/QL і Dymo.",
|
|
|
+ },
|
|
|
+ averyL7160: {
|
|
|
+ label: "Avery L7160 — аркуш А4 (38,1 × 63,5 мм × 21)",
|
|
|
+ hint: "Європейський аркуш; 21 етикетка на сторінці A4.",
|
|
|
+ },
|
|
|
+ avery5160: {
|
|
|
+ label: "Avery 5160 — аркуш US Letter (25,4 × 66,7 мм × 30)",
|
|
|
+ hint: "Аркуш американського формату; 30 етикеток на сторінці Letter.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ csv: {
|
|
|
+ importButton: "Імпорт CSV",
|
|
|
+ exportButton: "Експорт CSV",
|
|
|
+ modalTitle: "Імпорт котушок з CSV",
|
|
|
+ selectFile: "Виберіть файл CSV або перетягніть його сюди",
|
|
|
+ dragHint: "Заголовок: material (обов’язково), brand, subtype, color_name, rgba, …",
|
|
|
+ parsing: "Читання файлу…",
|
|
|
+ previewError: "Не вдалося прочитати файл CSV.",
|
|
|
+ validCount: "{{count}} дійсний",
|
|
|
+ errorCount: "{{count}} помилка",
|
|
|
+ skippedCount: "{{count}} пропущено",
|
|
|
+ colRow: "Рядок",
|
|
|
+ colStatus: "Статус",
|
|
|
+ colColor: "Колір",
|
|
|
+ colorResolved: "Кольорове заповнення з каталогу",
|
|
|
+ colorCrossMaterial: "Колір узятий з іншого матеріалу — точної відповідності в каталозі немає",
|
|
|
+ duplicateExisting: "Котушка з таким матеріалом, брендом і кольором вже є — вона ще буде імпортована як нова котушка",
|
|
|
+ spoolmanHint: "У режимі Spoolman використовуйте вбудовані засоби імпорту й експорту Spoolman.",
|
|
|
+ importValidRows: "Імпорт {{count}} дійсних рядків",
|
|
|
+ noValidRows: "Немає дійсних рядків",
|
|
|
+ importing: "Імпорт…",
|
|
|
+ importSuccess: "Імпортовано котушок: {{count}}",
|
|
|
+ importError: "Помилка імпорту",
|
|
|
+ exportError: "Помилка експорту",
|
|
|
+ },
|
|
|
+ addSpool: "Додати котушку",
|
|
|
+ editSpool: "Редагувати котушку",
|
|
|
+ copySpool: "Копіювати котушку",
|
|
|
+ material: "матеріал",
|
|
|
+ selectMaterial: "Виберіть матеріал...",
|
|
|
+ subtype: "Підтип",
|
|
|
+ brand: "Бренд",
|
|
|
+ searchBrand: "Шукати бренд...",
|
|
|
+ useCustomBrand: "Використовуйте \"{{brand}}\"",
|
|
|
+ useCustomMaterial: "Використовуйте спеціальний матеріал: {{material}}",
|
|
|
+ suggestedOptions: "Рекомендовані",
|
|
|
+ allOptions: "Усі",
|
|
|
+ colorName: "Назва кольору",
|
|
|
+ colorNamePlaceholder: "Нефритовий білий, вогненно-червоний...",
|
|
|
+ color: "Колір",
|
|
|
+ hexColor: "Шістнадцятковий колір",
|
|
|
+ pickColor: "Вибрати індивідуальний колір",
|
|
|
+ labelWeight: "Номінальна вага філаменту",
|
|
|
+ coreWeight: "Вага порожньої котушки",
|
|
|
+ searchSpoolWeight: "Шукати вагу котушки...",
|
|
|
+ weightUsed: "Використано",
|
|
|
+ currentWeight: "Вага, що залишилася",
|
|
|
+ measuredWeight: "Виміряна вага",
|
|
|
+ spoolName: "Котушка",
|
|
|
+ costPerKg: "Вартість за кг",
|
|
|
+ storageLocation: "Місце зберігання",
|
|
|
+ storageLocationPlaceholder: "напр. Полиця А, ящик 1",
|
|
|
+ openInInventory: "Відкрити в інвентарі",
|
|
|
+ measuredWeightError: "Виміряна вага має бути між {{min}}g і {{max}}g.",
|
|
|
+ slicerFilament: "Філамент для нарізки",
|
|
|
+ slicerFilamentName: "Назва профілю слайсера",
|
|
|
+ slicerPreset: "Попереднє налаштування слайсера",
|
|
|
+ searchPresets: "Шукати профілі філаменту...",
|
|
|
+ selectedPreset: "Вибране",
|
|
|
+ noPresetsFound: "Попередніх налаштувань не знайдено",
|
|
|
+ tempOverrides: "Перевизначення температури",
|
|
|
+ note: "Примітка",
|
|
|
+ notePlaceholder: "Будь-які додаткові зауваження щодо цієї котушки...",
|
|
|
+ // Per-spool category + low-stock threshold override (#729)
|
|
|
+ category: "Категорія",
|
|
|
+ categoryPlaceholder: "напр. Виробництво, прототип, клієнт А",
|
|
|
+ categoryNone: "Без категорії",
|
|
|
+ // #1400: storage-location filter chip — `storageLocation` label is
|
|
|
+ // already defined above for the spool-edit field, reused here for the
|
|
|
+ // dropdown header. `storageLocationNone` is new (the "no location set"
|
|
|
+ // group, mirrors `categoryNone`).
|
|
|
+ storageLocationNone: "Місцезнаходження не встановлено",
|
|
|
+ lowStockThresholdOverride: "Поріг низького запасу (ця котушка)",
|
|
|
+ lowStockThresholdOverrideHelp: "Залиште поле порожнім, щоб використовувати глобальне порогове значення ({{global}}%).",
|
|
|
+ // RFID button rename (was "Delete Tag" — confusing because it sounds like a
|
|
|
+ // taxonomy delete; this clears the RFID tag/UUID off the spool record)
|
|
|
+ clearRfid: "Очистити тег RFID.",
|
|
|
+ rfidCleared: "Тег RFID видалено",
|
|
|
+ archive: "Архівувати",
|
|
|
+ restore: "Відновити",
|
|
|
+ noSpools: "Ще немає котушок. Щоб почати, додайте свою першу котушку.",
|
|
|
+ noAvailableSpools: "Немає котушок. Додайте котушку до свого інвентарю або спершу скасуйте призначення іншого слота.",
|
|
|
+ kProfiles: "K-профілі",
|
|
|
+ addKProfile: "Додати K-профіль",
|
|
|
+ assignSpool: "Призначити котушку",
|
|
|
+ unassignSpool: "Скасувати призначення",
|
|
|
+ assignSuccess: "Котушку призначено, слот AMS налаштовано",
|
|
|
+ assignPendingInsert: "Котушку призначено. Слот буде налаштовано після її встановлення.",
|
|
|
+ assignFailed: "Не вдалося призначити котушку",
|
|
|
+ selectSpool: "Виберіть котушку, щоб призначити цьому слоту",
|
|
|
+ assigned: "Призначено",
|
|
|
+ assigning: "Призначення...",
|
|
|
+ searchSpools: "Пошук котушок...",
|
|
|
+ showAllSpools: "Показати всі котушки",
|
|
|
+ spoolmanSpools: "Котушки Spoolman",
|
|
|
+ allMaterials: "Усі матеріали",
|
|
|
+ filterByBrand: "Фільтрувати за брендом...",
|
|
|
+ showArchived: "Показати архівні",
|
|
|
+ quickAdd: "Швидке додавання (запас)",
|
|
|
+ quantity: "Кількість",
|
|
|
+ stock: "Запас",
|
|
|
+ configured: "Налаштовано",
|
|
|
+ spoolsCreated: "Створено котушок: {{count}}",
|
|
|
+ spoolsPartiallyCreated: "{{created}} з {{total}} котушок створено (деякі не вдалося)",
|
|
|
+ spoolCreated: "Котушку створено",
|
|
|
+ spoolUpdated: "Котушку оновлено",
|
|
|
+ spoolDeleted: "Котушку видалено",
|
|
|
+ deepLinkSpoolNotFound: "Котушку не знайдено",
|
|
|
+ deepLinkFetchFailed: "Не вдалося завантажити котушку — спробуйте ще раз",
|
|
|
+ spoolArchived: "Котушку заархівовано",
|
|
|
+ spoolRestored: "Котушку відновлено",
|
|
|
+ kProfileSaveFailed: "Не вдалося зберегти налаштування K-профілю",
|
|
|
+ syncWeightSpoolNotFound: "Котушку не знайдено — можливо, її видалено",
|
|
|
+ syncWeightSpoolmanUnreachable: "Spoolman недоступний — спробуйте пізніше",
|
|
|
+ syncWeightFailed: "Не вдалося синхронізувати вагу",
|
|
|
+ spoolmanUnreachable: "Spoolman недоступний — спробуйте пізніше",
|
|
|
+ deleteSpoolNotFound: "Котушку не знайдено — можливо, її вже видалено",
|
|
|
+ deleteFailed: "Не вдалося видалити котушку",
|
|
|
+ archiveSpoolNotFound: "Котушку не знайдено — можливо, її вже видалено",
|
|
|
+ archiveFailed: "Не вдалося заархівувати котушку",
|
|
|
+ restoreSpoolNotFound: "Котушку не знайдено — можливо, її вже видалено",
|
|
|
+ restoreFailed: "Не вдалося відновити котушку",
|
|
|
+ saveFailed: "Не вдалося зберегти зміни",
|
|
|
+ tagClearFailed: "Не вдалося очистити тег",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити цю котушку? Це неможливо скасувати.",
|
|
|
+ archiveConfirm: "Ви впевнені, що хочете заархівувати цю котушку?",
|
|
|
+ advancedSettings: "Розширені налаштування",
|
|
|
+ // Tabs
|
|
|
+ filamentInfoTab: "Інформація про філамент",
|
|
|
+ paProfileTab: "Профіль PA",
|
|
|
+ filamentInfo: "Філамент",
|
|
|
+ additional: "Додатково",
|
|
|
+ // Cloud
|
|
|
+ loadingPresets: "Завантаження хмарних профілів...",
|
|
|
+ cloudConnected: "Хмара підключена",
|
|
|
+ cloudNotConnected: "Хмара не підключена (за умовчанням)",
|
|
|
+ // Colors
|
|
|
+ recentColors: "Останні",
|
|
|
+ searchColors: "Пошук кольорів...",
|
|
|
+ searchResults: "Результати пошуку",
|
|
|
+ allColors: "Всі кольори",
|
|
|
+ commonColors: "Поширені кольори",
|
|
|
+ showLess: "Показувати менше",
|
|
|
+ showAll: "Показати все",
|
|
|
+ noColorsFound: "Жоден колір не відповідає вашому запиту",
|
|
|
+ noResults: "Збігів не знайдено",
|
|
|
+ // Multi-color gradient + visual effect (#1154)
|
|
|
+ extraColorsLabel: "Додаткові кольори",
|
|
|
+ extraColorsPlaceholder: "EC984C,#6CD4BC,A66EB9,D87694",
|
|
|
+ extraColorsHint: "Вставте від 2 до 8 шістнадцяткових знаків, розділених комами. Візуалізація як градієнт.",
|
|
|
+ extraColorsInvalid: "Проігнорований недійсний шістнадцятковий код: {{tokens}}",
|
|
|
+ colorEffectLabel: "Ефект",
|
|
|
+ colorEffect: {
|
|
|
+ none: "Жодного",
|
|
|
+ // Surface effects
|
|
|
+ sparkle: "Блиск",
|
|
|
+ wood: "Деревина",
|
|
|
+ marble: "Мармур",
|
|
|
+ glow: "Світіння",
|
|
|
+ matte: "Матовий",
|
|
|
+ // Sheen / finish variants
|
|
|
+ silk: "Шовк",
|
|
|
+ galaxy: "Галактика",
|
|
|
+ rainbow: "Веселка",
|
|
|
+ metal: "метал",
|
|
|
+ translucent: "Напівпрозорий",
|
|
|
+ // Multi-color structural variants
|
|
|
+ gradient: "Градієнт",
|
|
|
+ dualColor: "Подвійний колір",
|
|
|
+ triColor: "Три кольори",
|
|
|
+ multicolor: "Багатобарвність",
|
|
|
+ },
|
|
|
+ // PA Profiles
|
|
|
+ selectMaterialFirst: "Спочатку виберіть матеріал на вкладці «Інформація про філамент».",
|
|
|
+ noPrintersConfigured: "Принтери не налаштовані. Додайте принтери для використання профілів PA.",
|
|
|
+ matchingFilter: "Зіставлення",
|
|
|
+ anyBrand: "Будь-який бренд",
|
|
|
+ anyVariant: "Будь-який варіант",
|
|
|
+ autoSelect: "Автоматичний вибір",
|
|
|
+ matches: "збіги",
|
|
|
+ match: "збіг",
|
|
|
+ noMatches: "Немає збігів",
|
|
|
+ connected: "Підключено",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ printerOffline: "Принтер не в мережі. Підключіться, щоб переглянути профілі калібрування.",
|
|
|
+ noKProfilesMatch: "Немає K-профілів, що відповідають вибраному філаменту.",
|
|
|
+ leftNozzle: "Ліве сопло",
|
|
|
+ rightNozzle: "Праве сопло",
|
|
|
+ profilesSelected: "вибрані профілі калібрування",
|
|
|
+ // Stats & enhanced table
|
|
|
+ totalInventory: "Загальний запас",
|
|
|
+ totalConsumed: "Всього спожито",
|
|
|
+ byMaterial: "За матеріалом",
|
|
|
+ inPrinter: "У принтері",
|
|
|
+ lowStock: "Низький запас",
|
|
|
+ sinceTracking: "З початку відстеження",
|
|
|
+ resetConsumedCounter: "Скинути лічильник",
|
|
|
+ resetConsumedCounterTooltip: "Обнулити лічильник спожитих грамів для цієї котушки. Залишкова вага не зміниться.",
|
|
|
+ resetConsumedCounterConfirm: "Скинути лічильник спожитих грамів на 0? Майбутні роздруківки знову відстежуватимуться з нуля. Сама котушка, розрахунок її залишкової ваги та ваші налаштування не змінюються.",
|
|
|
+ resetAllConsumedCounters: "Обнулити всі лічильники",
|
|
|
+ resetAllConsumedCountersTooltip: "Обнулити лічильник спожитих грамів для кожної котушки. Залишкова вага не зміниться.",
|
|
|
+ resetAllConsumedCountersConfirm: "Скинути лічильники спожитих грамів до 0 для всіх котушок ({{count}}, включно з архівними)? Статистику «Всього спожито» буде очищено, а облік майбутніх друків почнеться з нуля. Самі котушки та їхня залишкова вага не зміняться.",
|
|
|
+ consumedCounterReset: "Скидання лічильника",
|
|
|
+ allConsumedCountersReset: "Скинуто лічильники котушок: {{count}}",
|
|
|
+ resetConsumedCounterFailed: "Не вдалося скинути лічильник",
|
|
|
+ loadedInAms: "Завантажено в AMS/Ext",
|
|
|
+ remaining: "Залишилося",
|
|
|
+ weightCheck: "Перевірка ваги",
|
|
|
+ lastWeighed: "Останнє зважування",
|
|
|
+ neverWeighed: "Ще не зважувалася",
|
|
|
+ search: "Пошук котушок...",
|
|
|
+ showing: "Показ",
|
|
|
+ to: "до",
|
|
|
+ of: "з",
|
|
|
+ show: "Показати",
|
|
|
+ spools: "котушки",
|
|
|
+ spool: "котушка",
|
|
|
+ page: "Сторінка",
|
|
|
+ noSpoolsMatch: "Результатів не знайдено",
|
|
|
+ noSpoolsMatchDesc: "Спробуйте налаштувати пошук або фільтри, щоб знайти те, що ви шукаєте.",
|
|
|
+ active: "Активний",
|
|
|
+ archived: "Архівовано",
|
|
|
+ all: "все",
|
|
|
+ used: "Використані",
|
|
|
+ new: "Нові",
|
|
|
+ clearFilters: "Очистити фільтри",
|
|
|
+ table: "Таблиця",
|
|
|
+ cards: "картки",
|
|
|
+ net: "Нетто",
|
|
|
+ // Grouping
|
|
|
+ groupSimilar: "Групувати",
|
|
|
+ groupedSpools: "Однакових котушок: {{count}}",
|
|
|
+ groupedRows: "рядки",
|
|
|
+ // Column config
|
|
|
+ columns: "Стовпці",
|
|
|
+ configureColumns: "Налаштувати стовпці",
|
|
|
+ configureColumnsDesc: "Перетягніть, щоб змінити порядок стовпців, або використовуйте стрілки. Перемкніть видимість за допомогою значка ока.",
|
|
|
+ visible: "видно",
|
|
|
+ reset: "Скинути",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ applyChanges: "Застосувати зміни",
|
|
|
+ moveUp: "Перемістити вгору",
|
|
|
+ moveDown: "Перемістити вниз",
|
|
|
+ hideColumn: "Сховати стовпець",
|
|
|
+ showColumn: "Показати стовпець",
|
|
|
+ // Tag linking
|
|
|
+ linkToSpool: "Прив’язати до котушки",
|
|
|
+ tagLinked: "Тег пов’язано з котушкою",
|
|
|
+ tagLinkFailed: "Не вдалося зв’язати тег",
|
|
|
+ tagAlreadyLinked: "Тег уже пов’язано з іншою котушкою",
|
|
|
+ unknownTag: "Виявлено невідомий тег RFID.",
|
|
|
+ // Usage history
|
|
|
+ usageHistory: "Історія використання",
|
|
|
+ noUsageHistory: "Використання ще не зареєстровано",
|
|
|
+ printName: "Назва друку",
|
|
|
+ weightConsumed: "Витрачена вага",
|
|
|
+ clearHistory: "Очистити",
|
|
|
+ historyCleared: "Історію використання очищено",
|
|
|
+ fillSourceLabel: "(Інвентар)",
|
|
|
+ lowStockThresholdError: "Порогове значення має бути від 0,1 до 99,9",
|
|
|
+ assignMismatchTitle: "Невідповідність матеріалу",
|
|
|
+ assignMismatchMessage: "Вибраний матеріал котушки \"{{spoolMaterial}}\" не відповідає матеріалу лотка \"{{trayMaterial}}\" для {{location}}. Все одно призначити?",
|
|
|
+ assignMismatchConfirm: "Все одно призначити",
|
|
|
+ assignPartialMismatchMessage: "Матеріал котушки \"{{spoolMaterial}}\" схожий на \"{{trayMaterial}}\" у {{location}}, але не зовсім відповідає. Ви бажаєте продовжити?",
|
|
|
+ assignProfileMismatchMessage: "Профіль котушки «{{spoolProfile}}» не відповідає профілю лотка «{{trayProfile}}» у {{location}}. Ви бажаєте продовжити?",
|
|
|
+ assignReconfigureNote: "Слот AMS буде переналаштовано для використання профілю котушки.",
|
|
|
+ // Spoolman filament catalog picker
|
|
|
+ spoolmanFilamentCatalog: "Каталог філаментів Spoolman",
|
|
|
+ pickFromSpoolmanCatalog: "Вибрати з каталогу Spoolman…",
|
|
|
+ spoolmanFilamentSelected: "Філамент вибрано з каталогу Spoolman",
|
|
|
+ spoolmanFilamentUnlinked: "Посилання на каталог філаментів видалено",
|
|
|
+ noSpoolmanFilaments: "У каталозі Spoolman не знайдено філаментів",
|
|
|
+ spoolmanFilamentColorSwatch: "Колір філаменту",
|
|
|
+ spoolWeightManagedBySpoolman: "Вага порожньої котушки керується залежно від типу філаменту в Spoolman",
|
|
|
+ spoolmanCatalogLoadFailed: "Не вдалося завантажити каталог філаментів Spoolman",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Timelapse
|
|
|
+ timelapse: {
|
|
|
+ title: "Таймлапс",
|
|
|
+ create: "Створити Timelapse",
|
|
|
+ download: "Завантажити",
|
|
|
+ delete: "Видалити",
|
|
|
+ preview: "Попередній перегляд",
|
|
|
+ frameRate: "Частота кадрів",
|
|
|
+ quality: "якість",
|
|
|
+ processing: "Обробка...",
|
|
|
+ noTimelapses: "Немає таймлапсів",
|
|
|
+ },
|
|
|
+
|
|
|
+ // AMS
|
|
|
+ ams: {
|
|
|
+ title: "AMS",
|
|
|
+ slot: "Слот",
|
|
|
+ empty: "Порожній",
|
|
|
+ emptySlot: "Порожній слот",
|
|
|
+ slotEmpty: "Порожній",
|
|
|
+ slotUnconfigured: "?",
|
|
|
+ emptySlotReset: "Філамент не призначено",
|
|
|
+ unknown: "Невідомий",
|
|
|
+ humidity: "Вологість",
|
|
|
+ temperature: "температура",
|
|
|
+ filamentType: "Тип філаменту",
|
|
|
+ filamentColor: "Колір",
|
|
|
+ remaining: "Залишилося",
|
|
|
+ history: "AMS Історія",
|
|
|
+ noHistory: "Історія недоступна",
|
|
|
+ configureSlot: "Налаштувати слот",
|
|
|
+ externalSpool: "Зовнішня котушка",
|
|
|
+ profile: "Профіль",
|
|
|
+ kFactor: "Фактор K",
|
|
|
+ fill: "Рівень заповнення",
|
|
|
+ configure: "Налаштувати",
|
|
|
+ used: "використовується",
|
|
|
+ remainingUnit: "залишилося",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Print modal
|
|
|
+ printModal: {
|
|
|
+ selectPrinter: "Вибрати принтер",
|
|
|
+ selectPlate: "Вибрати пластину",
|
|
|
+ filamentMapping: "Зіставлення філаментів",
|
|
|
+ plateN: "Пластина {{n}}",
|
|
|
+ plateFilamentsUnreadable: "Не вдалося прочитати філаменти вибраної пластини, тому їх неможливо зіставити. Зніміть вибір із цієї пластини, щоб додати решту до черги.",
|
|
|
+ totalCost: "Загальна вартість:",
|
|
|
+ slotRemainingShort: " — залишилося {{grams}} г",
|
|
|
+ printSettings: "Налаштування друку",
|
|
|
+ bedLeveling: "Вирівнювання столу",
|
|
|
+ flowCalibration: "Калібрування потоку",
|
|
|
+ vibrationCalibration: "Калібрування вібрації",
|
|
|
+ layerInspection: "Перевірка першого шару",
|
|
|
+ timelapse: "Таймлапс",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ noPrintersAvailable: "Немає доступних принтерів",
|
|
|
+ printerBusy: "Принтер зайнятий",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ sameTypeDifferentColor: "Одного типу, іншого кольору",
|
|
|
+ filamentTypeNotLoaded: "Тип філаменту не завантажено",
|
|
|
+ whenToPrint: "Коли друкувати",
|
|
|
+ asap: "Якнайшвидше",
|
|
|
+ queue: "Черга",
|
|
|
+ schedule: "За розкладом",
|
|
|
+ dateTime: "Дата й час",
|
|
|
+ invalidDateTime: "Введіть дійсну дату й час",
|
|
|
+ openCalendar: "Відкрити календар",
|
|
|
+ requireManualStart: "Потрібен ручний запуск",
|
|
|
+ requirePreviousSuccess: "Починати, лише якщо попередній друк вдався",
|
|
|
+ autoOffAfter: "Вимкнути принтер після завершення",
|
|
|
+ helpAsap: "Завдання буде додано на початок черги й розпочнеться, щойно відповідний принтер звільниться.",
|
|
|
+ helpSchedule: "Друк розпочнеться в запланований час, якщо принтер буде вільний. Якщо принтер зайнятий, завдання чекатиме, доки він звільниться.",
|
|
|
+ helpQueue: "Завдання буде додано в кінець черги.",
|
|
|
+ leftNozzle: "Л",
|
|
|
+ rightNozzle: "Р",
|
|
|
+ leftNozzleTooltip: "Ліве сопло",
|
|
|
+ rightNozzleTooltip: "Праве сопло",
|
|
|
+ filamentOverride: "Перевизначення філаменту",
|
|
|
+ filamentOverrideHint: "Необов’язково замініть філаменти для призначення на основі моделі. Планувальник зіставлятиметься з вибраними філаментами замість вихідних значень 3MF.",
|
|
|
+ originalFilament: "Оригінал",
|
|
|
+ overrideWith: "Перевизначити за допомогою",
|
|
|
+ resetToOriginal: "Скинути до оригіналу",
|
|
|
+ insufficientFilamentTitle: "Недостатньо філаменту",
|
|
|
+ waitingForAmsStatus: "Очікування статусу AMS від {{printer}}…",
|
|
|
+ insufficientFilamentMessage: "У деяких призначених котушках залишилося менше філаменту, ніж потрібно для друку:",
|
|
|
+ insufficientFilamentLine: "{{printer}} - {{slot}}: потрібно {{required}}g, залишилося {{remaining}}g",
|
|
|
+ printAnyway: "Усе одно друкувати",
|
|
|
+ forceColorMatch: "Примусовий збіг кольорів",
|
|
|
+ staggerPrinterStarts: "Запускати принтери почергово",
|
|
|
+ staggerGroupSize: "Розмір групи",
|
|
|
+ staggerInterval: "Інтервал (хв)",
|
|
|
+ staggerPreview: "Принтерів: {{printers}} → груп: {{groups}}, по {{size}}; інтервал запуску — {{interval}} хв",
|
|
|
+ staggerLastGroup: "остання група: {{count}}",
|
|
|
+ staggerTotal: "всього: {{minutes}} хв",
|
|
|
+ staggerToPrinters: "Розподілити запуск між {{count}} принтерами",
|
|
|
+ gcodeInjection: "Додати G-код автоматичного друку",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Backup
|
|
|
+ backup: {
|
|
|
+ includesEncryptionKey: "Локальні резервні копії включають файл ключа шифрування MFA (DATA_DIR/.mfa_encryption_key), тому резервна копія ZIP є автономною. Вважайте ZIP конфіденційним — кожен, хто має файл, може розшифрувати секрети клієнта OIDC і секрети TOTP, що зберігаються в ньому.",
|
|
|
+ title: "Резервне копіювання та відновлення",
|
|
|
+ createBackup: "Створити резервну копію",
|
|
|
+ restoreBackup: "Відновити резервну копію",
|
|
|
+ restoreDescription: "Замінити всі дані даними з файлу резервної копії",
|
|
|
+ downloadBackup: "Завантажити резервну копію",
|
|
|
+ uploadBackup: "Вивантажити резервну копію",
|
|
|
+ lastBackup: "Остання резервна копія",
|
|
|
+ autoBackup: "Автоматичне резервне копіювання",
|
|
|
+ backupNow: "Створити резервну копію зараз",
|
|
|
+ restoreWarning: "Увага: відновлення резервної копії перезапише всі поточні дані.",
|
|
|
+ includeArchives: "Включати архіви",
|
|
|
+ includeSettings: "Включити налаштування",
|
|
|
+ includeProfiles: "Включити профілі",
|
|
|
+ backupSuccess: "Резервну копію створено успішно",
|
|
|
+ restoreSuccess: "Резервну копію успішно відновлено",
|
|
|
+ backupFailed: "Помилка резервного копіювання",
|
|
|
+ restoreFailed: "Не вдалося відновити",
|
|
|
+ restoreNote: "Віртуальний принтер буде зупинено під час відновлення",
|
|
|
+
|
|
|
+ // GitHub Backup
|
|
|
+ githubBackup: "Резервне копіювання Git",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ cloudLoginRequired: "Потрібно ввійти в Bambu Cloud. Перейдіть до Профілі → Хмарні профілі, щоб увімкнути резервне копіювання до GitHub.",
|
|
|
+ cloudLoginRequiredShort: "Потрібен вхід у хмару",
|
|
|
+ githubDescription: "Автоматично синхронізуйте свої профілі з приватним репозиторієм GitHub для резервного копіювання та історії версій.",
|
|
|
+ repoIsPrivate: "Репозиторій приватний — безпечно створювати резервні копії.",
|
|
|
+ repoIsPublicWarning: "Репозиторій є ПУБЛІЧНИМ. Резервні копії Bambuddy містять облікові дані MQTT, токени Home Assistant, токени Prometheus, вашу електронну пошту Bambu Cloud і коди доступу до принтера через K-профілі. Збереження блокується, доки ви не зробите репозиторій приватним у налаштуваннях постачальника.",
|
|
|
+ repoVisibilityUnknown: "Не вдалося визначити видимість репозиторію. Bambuddy створює резервні копії лише в підтверджено приватних репозиторіях, тому збереження буде заблоковано.",
|
|
|
+ repositoryUrl: "URL репозиторію",
|
|
|
+ repoUrlPlaceholderGitHub: "https://github.com/username/repo-name",
|
|
|
+ repoUrlPlaceholderGitea: "https://gitea.example.com/username/repo-name",
|
|
|
+ repoUrlPlaceholderForgejo: "https://forgejo.example.com/username/repo-name",
|
|
|
+ repoUrlPlaceholderGitLab: "https://gitlab.com/username/repo-name",
|
|
|
+ allowInsecureHttp: "Дозволити незахищений HTTP",
|
|
|
+ allowInsecureHttpHint: "Увімкнути для саморозміщених екземплярів у приватних мережах без TLS",
|
|
|
+ personalAccessToken: "Персональний токен доступу",
|
|
|
+ tokenSaved: "(збережено)",
|
|
|
+ enterNewToken: "Введіть новий токен для оновлення",
|
|
|
+ tokenHint: "Токен із деталізованими правами та дозволом на читання й запис вмісту",
|
|
|
+ branch: "Гілка",
|
|
|
+ provider: "Постачальник Git",
|
|
|
+ providerGitHub: "GitHub",
|
|
|
+ providerGitLab: "GitLab",
|
|
|
+ providerGitea: "Gitea",
|
|
|
+ providerForgejo: "Forgejo",
|
|
|
+ manualOnly: "Тільки вручну",
|
|
|
+ hourly: "щогодини",
|
|
|
+ daily: "Щодня",
|
|
|
+ weekly: "Щотижня",
|
|
|
+ includeInBackup: "Включити в резервну копію",
|
|
|
+ kProfiles: "K-профілі",
|
|
|
+ kProfilesDescription: "Калібрування Pressure Advance (PA) від підключених принтерів",
|
|
|
+ noPrintersConnected: "Немає підключених принтерів",
|
|
|
+ printersConnected: "{{connected}}/{{total}} підключено",
|
|
|
+ cloudProfiles: "Хмарні профілі",
|
|
|
+ cloudProfilesDescription: "Попередні налаштування філаменту, принтера та процесу від Bambu Cloud",
|
|
|
+ appSettings: "Налаштування програми",
|
|
|
+ appSettingsDescription: "Конфігурація Bambuddy (повна база даних)",
|
|
|
+ spoolInventory: "Облік котушок",
|
|
|
+ spoolInventoryDescription: "Котушки з філаментом, історія використання та відстеження витрат",
|
|
|
+ printArchives: "Архіви друку",
|
|
|
+ printArchivesDescription: "Метадані історії друку (без файлів gcode/3MF)",
|
|
|
+ lastBackupAt: "Остання резервна копія:",
|
|
|
+ noBackupsYet: "Резервних копій ще немає",
|
|
|
+ next: "Наступне виконання:",
|
|
|
+ startingBackup: "Початок резервного копіювання...",
|
|
|
+ test: "Тест",
|
|
|
+ enableBackup: "Увімкнути резервне копіювання",
|
|
|
+ testConnection: "Тестове підключення",
|
|
|
+ enterRepoUrl: "Введіть URL репозиторію",
|
|
|
+ enterRepoAndToken: "Введіть URL репозиторію та токен доступу",
|
|
|
+ repoRequired: "Потрібно вказати URL репозиторію",
|
|
|
+ tokenRequired: "Потрібен токен доступу",
|
|
|
+ githubBackupEnabled: "GitHub резервне копіювання ввімкнено",
|
|
|
+ tokenUpdated: "Токен оновлено",
|
|
|
+ settingsSaved: "Налаштування збережено",
|
|
|
+ failedToSave: "Не вдалося зберегти: {{message}}",
|
|
|
+ backupCompleteFiles: "Резервне копіювання завершено – файли {{count}} оновлено",
|
|
|
+ backupSkippedNoChanges: "Резервне копіювання пропущено – без змін",
|
|
|
+ backupFailed2: "Помилка резервного копіювання: {{message}}",
|
|
|
+ clearedLogs: "Очищено журнали {{count}}.",
|
|
|
+ failedToClearLogs: "Не вдалося очистити журнали: {{message}}",
|
|
|
+
|
|
|
+ // History
|
|
|
+ history: "історія",
|
|
|
+ clear: "Очистити",
|
|
|
+ date: "Дата",
|
|
|
+ status: "Статус",
|
|
|
+ commit: "Коміт",
|
|
|
+
|
|
|
+ // Local Backup
|
|
|
+ localBackup: "Локальна резервна копія",
|
|
|
+ localBackupDescription: "Створити повну резервну копію даних Bambuddy, включно з базою даних, архівами, вивантаженнями та всіма файлами.",
|
|
|
+ downloadBackupLabel: "Завантажити резервну копію",
|
|
|
+ completeBackupZip: "Повне резервне копіювання: база даних + усі файли (ZIP)",
|
|
|
+ download: "Завантажити",
|
|
|
+ preparingBackup: "Підготовка резервної копії...",
|
|
|
+ creatingArchive: "Створення резервного архіву... Для великих архівів це може зайняти деякий час.",
|
|
|
+ downloadingFile: "Завантаження файлу резервної копії...",
|
|
|
+ backupDownloaded: "Резервну копію успішно завантажено",
|
|
|
+ failedToCreateBackup: "Не вдалося створити резервну копію: {{message}}",
|
|
|
+ restore: "Відновити",
|
|
|
+ restoreReplacesAll: "Відновлення замінює всі дані.",
|
|
|
+ restoreReplacesAllDetail: "Вашу поточну базу даних і файли буде повністю замінено. Після відновлення потрібен перезапуск.",
|
|
|
+ restoreConfirmTitle: "Відновити резервну копію",
|
|
|
+ restoreConfirmMessage: "Ви впевнені, що бажаєте відновити з \"{{filename}}\"? Це повністю замінить вашу поточну базу даних і всі файли. Після відновлення програму потрібно буде перезапустити.",
|
|
|
+ restoreConfirmButton: "Відновити резервну копію",
|
|
|
+ uploadingFile: "Вивантаження файлу резервної копії...",
|
|
|
+ backupRestoredRestart: "Резервну копію відновлено. Перезапустіть Bambuddy.",
|
|
|
+ failedToRestore: "Не вдалося відновити резервну копію. Будь ласка, перевірте формат файлу.",
|
|
|
+ reloadNow: "Перезавантажити зараз",
|
|
|
+ creatingBackup: "Створення резервної копії",
|
|
|
+ restoringBackup: "Відновлення з резервної копії",
|
|
|
+ preparing: "Підготовка...",
|
|
|
+ processing: "Обробка...",
|
|
|
+ doNotClosePage: "Будь ласка, не закривайте цю сторінку та не виходьте з неї. Для великих резервних копій ця операція може зайняти кілька хвилин.",
|
|
|
+
|
|
|
+ // RestoreModal
|
|
|
+ restoring: "Відновлення...",
|
|
|
+ restoreComplete: "Відновлення завершено",
|
|
|
+ restoreFailed2: "Не вдалося відновити",
|
|
|
+ importSettings: "Імпорт налаштувань із файлу резервної копії",
|
|
|
+ pleaseWaitRestoring: "Зачекайте, поки ваші дані відновляться",
|
|
|
+ selectBackupFile: "Натисніть, щоб вибрати файл резервної копії (.json або .zip)",
|
|
|
+ duplicateHandling: "Як працює обробка дублікатів:",
|
|
|
+ matchPrinters: "Принтери",
|
|
|
+ matchPrintersBy: "відповідає серійному номеру",
|
|
|
+ matchSmartPlugs: "Розумні розетки",
|
|
|
+ matchSmartPlugsBy: "зіставляються за IP-адресою",
|
|
|
+ matchNotificationProviders: "Постачальники сповіщень",
|
|
|
+ matchNotificationProvidersBy: "відповідність за назвою",
|
|
|
+ matchFilaments: "філаменти",
|
|
|
+ matchFilamentsBy: "відповідність за назвою + типом + брендом",
|
|
|
+ matchArchives: "Архіви",
|
|
|
+ matchArchivesBy: "відповідає хешу вмісту (завжди пропускається)",
|
|
|
+ matchPendingUploads: "Вивантаження, що очікують",
|
|
|
+ matchPendingUploadsBy: "зіставляються за назвою файлу",
|
|
|
+ matchSettingsTemplates: "Налаштування та шаблони",
|
|
|
+ matchSettingsTemplatesBy: "завжди перезаписується",
|
|
|
+ replaceExisting: "Замінити існуючі дані",
|
|
|
+ keepExisting: "Зберегти наявні дані",
|
|
|
+ overwriteDescription: "Замінити наявні елементи даними з резервної копії",
|
|
|
+ keepDescription: "Відновлюйте лише елементи, яких ще не існує",
|
|
|
+ overwriteCaution: "Увага:",
|
|
|
+ overwriteWarning: "Перезапис замінить ваші поточні конфігурації даними з резервної копії. Коди доступу до принтера ніколи не перезаписуються з міркувань безпеки.",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ processingBackup: "Обробка файлу резервної копії...",
|
|
|
+ itemsRestored: "Елементів відновлено",
|
|
|
+ itemsSkipped: "Пропущено елементів",
|
|
|
+ restored: "Відновлено",
|
|
|
+ skippedAlreadyExist: "Пропущено (вже існує)",
|
|
|
+ filesCategory: "Файли (3MF, мініатюри тощо)",
|
|
|
+ andMore: "…і ще {{count}}",
|
|
|
+ newApiKeysGenerated: "Створено нові API ключі",
|
|
|
+ keysShownOnce: "Ці ключі відображаються лише один раз. Скопіюйте їх зараз!",
|
|
|
+ copy: "Копіювати",
|
|
|
+ noDataFound: "У файлі резервної копії не знайдено даних для відновлення.",
|
|
|
+ close: "Закрити",
|
|
|
+
|
|
|
+ // Scheduled local backups (#884)
|
|
|
+ scheduledBackup: "Резервне копіювання за розкладом",
|
|
|
+ scheduledBackupDescription: "Автоматично створюйте резервні знімки за розкладом. Вихідний каталог можна підключити до NAS або зовнішнього накопичувача.",
|
|
|
+ frequency: "Частота",
|
|
|
+ backupTime: "час",
|
|
|
+ retention: "Термін зберігання",
|
|
|
+ retentionDescription: "Кількість резервних копій, які потрібно зберегти",
|
|
|
+ outputPath: "Вихідний шлях",
|
|
|
+ outputPathPlaceholder: "За замовчуванням: {{path}}",
|
|
|
+ outputPathDescription: "Залиште порожнім для розташування за умовчанням",
|
|
|
+ runNow: "Запустити зараз",
|
|
|
+ backupFiles: "Файли резервних копій",
|
|
|
+ noScheduledBackups: "Резервних копій ще немає",
|
|
|
+ deleteBackup: "Видалити",
|
|
|
+ deleteBackupConfirm: "Видалити цей файл резервної копії?",
|
|
|
+ backupRunning: "Виконується резервне копіювання...",
|
|
|
+ scheduledBackupComplete: "Резервне копіювання успішно завершено",
|
|
|
+ scheduledBackupFailed: "Помилка резервного копіювання",
|
|
|
+ nextBackup: "Наступна резервна копія",
|
|
|
+ backupSize: "Розмір",
|
|
|
+ localTimeHint: "Місцевий час ({{tz}})",
|
|
|
+ defaultPathLabel: "За замовчуванням:",
|
|
|
+ // Backup output-path probe (#2544)
|
|
|
+ pathCheck: {
|
|
|
+ title: "Bambuddy не може писати в цей каталог",
|
|
|
+ howToFix: "Як виправити:",
|
|
|
+ sandboxed: "Служба Bambuddy не може писати в {{path}}. Його модуль systemd працює з ProtectSystem=strict, що робить кожен каталог за межами каталогів встановлення, даних і журналу доступними лише для читання для служби — навіть той, у який ви можете писати з власної оболонки.",
|
|
|
+ read_only: "{{path}} знаходиться у файловій системі лише для читання.",
|
|
|
+ permission_denied: "Bambuddy не має права записувати в {{path}}. Перевірте власника каталогу та дозволи.",
|
|
|
+ no_space: "У файловій системі, де розташовано {{path}}, закінчилося місце.",
|
|
|
+ not_a_directory: "{{path}} існує, але не є каталогом.",
|
|
|
+ missing: "{{path}} не існує і не може бути створений.",
|
|
|
+ error: "Bambuddy не може писати в {{path}}.",
|
|
|
+ ephemeralTitle: "Ці резервні копії не збережуться після перезапуску контейнера",
|
|
|
+ container_ephemeral: "{{path}} розташовано всередині контейнера Bambuddy, а не на хості. Резервні копії в цьому каталозі буде втрачено після повторного створення контейнера. Змонтуйте каталог із хоста:",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Category labels
|
|
|
+ categories: {
|
|
|
+ settings: "Налаштування",
|
|
|
+ notification_providers: "Постачальники сповіщень",
|
|
|
+ notification_templates: "Шаблони сповіщень",
|
|
|
+ smart_plugs: "Розумні розетки",
|
|
|
+ printers: "Принтери",
|
|
|
+ filaments: "філаменти",
|
|
|
+ maintenance_types: "Види технічного обслуговування",
|
|
|
+ archives: "Архіви",
|
|
|
+ projects: "Проєкти",
|
|
|
+ pending_uploads: "Вивантаження, що очікують",
|
|
|
+ external_links: "Зовнішні посилання",
|
|
|
+ api_keys: "Ключі API",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Tags
|
|
|
+ tags: {
|
|
|
+ title: "Теги",
|
|
|
+ addTag: "Додати тег",
|
|
|
+ editTag: "Редагувати тег",
|
|
|
+ deleteTag: "Видалити тег",
|
|
|
+ tagName: "Назва тегу",
|
|
|
+ tagColor: "Колір мітки",
|
|
|
+ noTags: "Без тегів",
|
|
|
+ deleteConfirm: "Ви впевнені, що бажаєте видалити цей тег?",
|
|
|
+ manageTags: "Керування тегами",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Upload modal (archives)
|
|
|
+ uploadModal: {
|
|
|
+ title: "Вивантажити файли 3MF",
|
|
|
+ dragDrop: "Перетягніть файли .3mf сюди",
|
|
|
+ or: "або",
|
|
|
+ browseFiles: "Огляд файлів",
|
|
|
+ extractionInfo: "Модель принтера буде автоматично витягнуто з метаданих файлу 3MF.",
|
|
|
+ uploaded: "вивантажено",
|
|
|
+ failed: "не вдалося",
|
|
|
+ uploading: "Вивантаження...",
|
|
|
+ upload: "Вивантажити",
|
|
|
+ uploadFailed: "Не вдалося вивантажити",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Edit archive modal
|
|
|
+ // Edit Archive Modal
|
|
|
+ editArchive: {
|
|
|
+ title: "Редагувати архів",
|
|
|
+ name: "Назва",
|
|
|
+ namePlaceholder: "Друкування імені",
|
|
|
+ printer: "Принтер",
|
|
|
+ noPrinter: "Немає принтера",
|
|
|
+ project: "Проєкт",
|
|
|
+ noProject: "Жодного проєкту",
|
|
|
+ itemsPrinted: "Надруковано об’єктів",
|
|
|
+ itemsPrintedHelp: "Кількість елементів, виготовлених у цьому завданні друку",
|
|
|
+ notes: "Примітки",
|
|
|
+ notesPlaceholder: "Додайте примітки щодо цього друку...",
|
|
|
+ externalLink: "Зовнішнє посилання",
|
|
|
+ externalLinkPlaceholder: "https://printables.com/model/...",
|
|
|
+ externalLinkHelp: "Посилання на Printables, Thingiverse або інше джерело",
|
|
|
+ tags: "Теги",
|
|
|
+ tagsPlaceholder: "Додати теги...",
|
|
|
+ addMoreTags: "Додати більше тегів...",
|
|
|
+ matchingTags: "Відповідає \"{{query}}\"",
|
|
|
+ existingTags: "Існуючі теги",
|
|
|
+ clickToAdd: "(натисніть, щоб додати)",
|
|
|
+ status: "Статус",
|
|
|
+ failureReason: "Причина невдачі",
|
|
|
+ selectReason: "Виберіть причину...",
|
|
|
+ photos: "Фотографії надрукованих результатів",
|
|
|
+ photosHelp: "Натисніть +, щоб додати фотографії результату друку",
|
|
|
+ printResult: "Роздрукувати результат",
|
|
|
+ saving: "Збереження...",
|
|
|
+ // Failure reasons
|
|
|
+ failureReasons: {
|
|
|
+ adhesionFailure: "Порушення адгезії",
|
|
|
+ spaghettiDetached: "Спагетті / Відр",
|
|
|
+ layerShift: "Зсув шару",
|
|
|
+ cloggedNozzle: "Засмічене сопло",
|
|
|
+ filamentRunout: "Биття філаменту",
|
|
|
+ warping: "Викривлення",
|
|
|
+ stringing: "Нанизування",
|
|
|
+ underExtrusion: "Підвидавлювання",
|
|
|
+ powerFailure: "Збій живлення",
|
|
|
+ userCancelled: "Користувач скасовано",
|
|
|
+ other: "інше",
|
|
|
+ },
|
|
|
+ // Archive statuses
|
|
|
+ statuses: {
|
|
|
+ completed: "Виконано",
|
|
|
+ failed: "Не вдалося",
|
|
|
+ aborted: "Скасовано",
|
|
|
+ printing: "Друк",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // K-Profiles
|
|
|
+ kProfiles: {
|
|
|
+ title: "K-профілі",
|
|
|
+ noPrintersConfigured: "Принтери не налаштовані",
|
|
|
+ addPrinterInSettings: "Додайте принтер у налаштуваннях, щоб керувати K-профілями",
|
|
|
+ noActivePrinters: "Немає активних принтерів",
|
|
|
+ enablePrinterConnection: "Увімкніть підключення до принтера, щоб переглянути його K-профілі",
|
|
|
+ loadingProfiles: "Завантаження K-профілів...",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ printerOfflineDesc: "Вибраний принтер не підключено. Увімкніть його, щоб переглянути K-профілі.",
|
|
|
+ noMatchingProfiles: "Немає відповідних профілів",
|
|
|
+ noMatchingProfilesDesc: "Немає профілів, які відповідають вашим критеріям пошуку",
|
|
|
+ noKProfiles: "Без K-профілів",
|
|
|
+ noKProfilesDesc: "Не знайдено профілів підвищення тиску для сопла {{diameter}} мм",
|
|
|
+ createFirstProfile: "Створити перший профіль",
|
|
|
+ // Controls
|
|
|
+ printer: "Принтер",
|
|
|
+ nozzle: "Сопло",
|
|
|
+ refresh: "Оновити",
|
|
|
+ addProfile: "Додати профіль",
|
|
|
+ export: "Експорт",
|
|
|
+ import: "Імпорт",
|
|
|
+ select: "Вибрати",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ delete: "Видалити",
|
|
|
+ // Filters
|
|
|
+ searchPlaceholder: "Пошук за назвою або філаментом...",
|
|
|
+ allExtruders: "Всі екструдери",
|
|
|
+ leftOnly: "Тільки зліва",
|
|
|
+ rightOnly: "Тільки право",
|
|
|
+ allFlow: "Весь потік",
|
|
|
+ hfOnly: "Тільки HF",
|
|
|
+ sOnly: "Тільки S",
|
|
|
+ sortName: "Сортувати за назвою",
|
|
|
+ sortKValue: "Сортувати: К-значення",
|
|
|
+ sortFilament: "Сорт: філамент",
|
|
|
+ // Dual extruder labels
|
|
|
+ leftExtruder: "Лівий екструдер",
|
|
|
+ rightExtruder: "Правий екструдер",
|
|
|
+ // Modal
|
|
|
+ modal: {
|
|
|
+ addTitle: "Додати K-профіль",
|
|
|
+ editTitle: "Редагувати K-профіль",
|
|
|
+ profileName: "Назва профілю",
|
|
|
+ profileNamePlaceholder: "Мій профіль PLA.",
|
|
|
+ kValue: "К-значення",
|
|
|
+ kValuePlaceholder: "0,020",
|
|
|
+ kValueHelp: "Типовий діапазон: 0,01–0,06 для PLA, 0,02–0,10 для PETG",
|
|
|
+ filament: "Філамент",
|
|
|
+ selectFilament: "Виберіть філамент...",
|
|
|
+ noFilamentsHelp: "Філаменти не знайдено. Спочатку створіть K-профіль у Bambu Studio.",
|
|
|
+ flowType: "Тип потоку",
|
|
|
+ highFlow: "Сопло з високим потоком",
|
|
|
+ standard: "Стандартний",
|
|
|
+ nozzleSize: "Розмір сопла",
|
|
|
+ extruder: "Екструдер",
|
|
|
+ extruders: "Екструдери",
|
|
|
+ left: "Ліворуч",
|
|
|
+ right: "правильно",
|
|
|
+ notes: "Примітки (зберігаються локально)",
|
|
|
+ notesPlaceholder: "Додайте примітки щодо цього профілю...",
|
|
|
+ notesHelp: "Примітки зберігаються в Bambuddy, а не на принтері",
|
|
|
+ syncing: "Синхронізація з принтером...",
|
|
|
+ savingExtruder: "Збереження в екструдер {{current}}/{{total}}...",
|
|
|
+ pleaseWait: "Будь ласка, зачекайте",
|
|
|
+ },
|
|
|
+ // Delete confirmation
|
|
|
+ deleteConfirm: {
|
|
|
+ title: "Видалити профіль",
|
|
|
+ cannotUndo: "Це неможливо скасувати",
|
|
|
+ message: "Ви впевнені, що хочете видалити \"{{name}}\" із принтера?",
|
|
|
+ },
|
|
|
+ // Bulk delete
|
|
|
+ bulkDelete: {
|
|
|
+ title: "Видалити профілі",
|
|
|
+ cannotUndo: "Це неможливо скасувати",
|
|
|
+ message: "Ви впевнені, що бажаєте видалити {{count}} вибрані профілі з принтера?",
|
|
|
+ },
|
|
|
+ // Toast
|
|
|
+ toast: {
|
|
|
+ profileSaved: "K-профіль збережено",
|
|
|
+ profilesSaved: "K-профіль збережено в екструдери {{count}}.",
|
|
|
+ selectAtLeastOneExtruder: "Виберіть принаймні один екструдер",
|
|
|
+ profileDeleted: "K-профіль видалено",
|
|
|
+ profilesDeleted: "Видалені профілі {{count}}.",
|
|
|
+ exportedProfiles: "Експортовані профілі {{count}}.",
|
|
|
+ importedProfiles: "Імпортовано {{count}} з {{total}} профілів",
|
|
|
+ noProfilesToExport: "Немає профілів для експорту",
|
|
|
+ invalidFileFormat: "Недійсний формат файлу",
|
|
|
+ failedToParseImport: "Не вдалося проаналізувати імпортований файл",
|
|
|
+ failedToSaveBatch: "Не вдалося зберегти K-профілі",
|
|
|
+ noteSaved: "Нотатку збережено",
|
|
|
+ failedToSaveNote: "Не вдалося зберегти нотатку",
|
|
|
+ },
|
|
|
+ // Permissions
|
|
|
+ permission: {
|
|
|
+ noRead: "Ви не маєте дозволу оновлювати профілі",
|
|
|
+ noCreate: "Ви не маєте дозволу додавати профілі",
|
|
|
+ noUpdate: "Ви не маєте дозволу на оновлення K-профілів",
|
|
|
+ noDelete: "Ви не маєте дозволу на видалення K-профілів",
|
|
|
+ noExport: "Ви не маєте дозволу на експорт профілів",
|
|
|
+ noImport: "Ви не маєте дозволу на імпорт профілів",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Virtual Printer
|
|
|
+ virtualPrinter: {
|
|
|
+ title: "Віртуальний принтер",
|
|
|
+ running: "Працює",
|
|
|
+ stopped: "Зупинено",
|
|
|
+ description: {
|
|
|
+ default: "Увімкніть віртуальний принтер, який відображатиметься в Bambu Studio та OrcaSlicer. Надіслані на нього файли буде одразу заархівовано без друку.",
|
|
|
+ proxy: "Увімкніть проксі, який передає трафік слайсера на реальний принтер і дає змогу друкувати віддалено через будь-яку мережу.",
|
|
|
+ },
|
|
|
+ enable: {
|
|
|
+ title: "Увімкнути віртуальний принтер",
|
|
|
+ visibleInSlicer: "Відображається як \"Bambuddy\" у виявленні слайсера",
|
|
|
+ proxyingTo: "Проксування до {{name}}",
|
|
|
+ notActive: "Неактивний",
|
|
|
+ },
|
|
|
+ model: {
|
|
|
+ title: "Модель принтера",
|
|
|
+ description: "Виберіть модель принтера для емуляції.",
|
|
|
+ restartWarning: "Зміна моделі перезапустить віртуальний принтер",
|
|
|
+ },
|
|
|
+ accessCode: {
|
|
|
+ title: "Код доступу",
|
|
|
+ isSet: "Код доступу встановлено",
|
|
|
+ notSet: "Немає встановленого коду доступу – потрібно для ввімкнення",
|
|
|
+ placeholder: "Введіть 8-символьний код",
|
|
|
+ placeholderChange: "Введіть новий код для зміни",
|
|
|
+ hint: "Має бути рівно 8 символів. Використовується слайсерами для автентифікації.",
|
|
|
+ charCount: "({{count}}/8)",
|
|
|
+ inheritedFromTarget: "Успадковано від цільового принтера",
|
|
|
+ derivedFromTargetHint: "Використовує код доступу цільового принтера. Міст пересилає автентифікацію слайсера на справжній принтер, тому коди мають збігатися — відредагуйте код доступу принтера, щоб змінити це значення.",
|
|
|
+ reveal: "Показати код доступу",
|
|
|
+ hide: "Приховати код доступу",
|
|
|
+ },
|
|
|
+ targetPrinter: {
|
|
|
+ title: "Цільовий принтер",
|
|
|
+ configured: "Ціль проксі налаштовано",
|
|
|
+ notConfigured: "Цільовий принтер не вибрано – потрібен для режиму проксі",
|
|
|
+ placeholder: "Виберіть принтер...",
|
|
|
+ hint: "Виберіть принтер, на який проксі передаватиме трафік слайсера. Принтер має працювати в режимі LAN.",
|
|
|
+ noPrinters: "Принтери не налаштовані. Щоб використовувати режим проксі, спочатку додайте принтер.",
|
|
|
+ },
|
|
|
+ remoteInterface: {
|
|
|
+ title: "Перевизначення мережевого інтерфейсу",
|
|
|
+ configured: "Перевизначення інтерфейсу активне",
|
|
|
+ optional: "Необов’язково – використовуйте, якщо автоматичне визначення IP є неправильним (наприклад, кілька мережевих карток, Docker, VPN)",
|
|
|
+ placeholder: "Автоматичне визначення (за замовчуванням)...",
|
|
|
+ hint: "Заміна адреси IP, яка оголошується через SSDP і використовується в сертифікаті TLS. Корисно, коли Bambuddy має кілька мережевих інтерфейсів.",
|
|
|
+ },
|
|
|
+ mode: {
|
|
|
+ title: "Режим",
|
|
|
+ archive: "Архів",
|
|
|
+ archiveDesc: "Одразу архівувати файли",
|
|
|
+ review: "Перевірка",
|
|
|
+ reviewDesc: "Перевіряти перед архівуванням",
|
|
|
+ queue: "Черга",
|
|
|
+ queueDesc: "Архівувати та додати в чергу",
|
|
|
+ proxy: "Проксі",
|
|
|
+ proxyDesc: "Пересилати на фізичний принтер",
|
|
|
+ },
|
|
|
+ autoDispatch: {
|
|
|
+ title: "Автоматичний запуск",
|
|
|
+ description: "Автоматично запускати завдання після додавання до черги. Якщо вимкнено, завдання чекатимуть ручного запуску.",
|
|
|
+ },
|
|
|
+ queueForceColorMatch: {
|
|
|
+ title: "Примусовий збіг кольорів",
|
|
|
+ description: "Не надсилати завдання на принтер без філаменту точного типу й кольору. Типово вимкнено: без цього черга зіставляє лише модель і може вибрати принтер із філаментом іншого кольору.",
|
|
|
+ },
|
|
|
+ gcodeInjection: {
|
|
|
+ title: "Вставлення G-коду",
|
|
|
+ description: "Застосовувати до завдань цього віртуального принтера фрагменти G-коду, налаштовані для кожної моделі. Типово вимкнено.",
|
|
|
+ },
|
|
|
+ tailscaleDisabled: {
|
|
|
+ title: "Інтеграція з Tailscale",
|
|
|
+ description: "Увімкніть, щоб позначити цей віртуальний принтер як доступний через Tailscale. Буде показано Tailscale-адресу хоста, яку потрібно ввести в слайсері. Імпорт сертифіката ЦС залишається обов’язковим; цей перемикач не впливає на сертифікати.",
|
|
|
+ },
|
|
|
+ setupRequired: {
|
|
|
+ title: "Потрібне налаштування",
|
|
|
+ description: "Для роботи функції віртуального принтера потрібна додаткова конфігурація системи. Це включає переадресацію портів, правила брандмауера та параметри, що стосуються платформи.",
|
|
|
+ readGuide: "Перед увімкненням прочитайте посібник із налаштування",
|
|
|
+ },
|
|
|
+ archiveNameSource: {
|
|
|
+ title: "Джерело назви архіву",
|
|
|
+ description: "Виберіть, як називати нові архіви, що надходять через віртуальний принтер. «Метадані» використовують вбудоване слайсером поле Title з 3MF (типовий варіант). «Назва файлу» використовує назву, яку Bambu Studio надіслала через FTP. За наявності поля Title Bambu Studio замінює ним назву, введену у вікні «Надіслати на принтер», тому обидва режими часто дають однаковий результат.",
|
|
|
+ metadata: "Метадані",
|
|
|
+ filename: "Назва файлу",
|
|
|
+ },
|
|
|
+ caCert: {
|
|
|
+ title: "Сертифікат слайсера",
|
|
|
+ description: "Віртуальні принтери використовують сертифікат TLS, підписаний ЦС Bambuddy. Імпортуйте цей сертифікат ЦС у довірче сховище вашого слайсера, щоб він прийняв з’єднання — не потрібно копіювати його з командного рядка.",
|
|
|
+ copy: "Копіювати",
|
|
|
+ copied: "Скопійовано",
|
|
|
+ download: "Завантажити",
|
|
|
+ fingerprint: "SHA-256",
|
|
|
+ },
|
|
|
+ howItWorks: {
|
|
|
+ title: "Як це працює",
|
|
|
+ step1: "У тій самій локальній мережі віртуальні принтери автоматично з’являються в слайсері (Bambu Studio або OrcaSlicer). З інших мереж додайте їх вручну за IP-адресою та кодом доступу.",
|
|
|
+ step2: "У режимах архівування, перевірки та черги натисніть «Надіслати» у слайсері, щоб вивантажити файли 3MF до Bambuddy. Слайсер покаже повідомлення про успішний друк, але файл буде лише збережено, а не надруковано.",
|
|
|
+ step3: "У режимі проксі-сервера віртуальний принтер передає весь трафік на справжній принтер — друк починається негайно, ніби підключений безпосередньо.",
|
|
|
+ },
|
|
|
+ status: {
|
|
|
+ title: "Деталі статусу",
|
|
|
+ printerName: "Назва принтера",
|
|
|
+ model: "Модель",
|
|
|
+ serialNumber: "Серійний номер",
|
|
|
+ mode: "Режим",
|
|
|
+ pendingFiles: "Файли, що очікують на розгляд",
|
|
|
+ targetPrinter: "Цільовий принтер",
|
|
|
+ ftpPort: "Порт FTP",
|
|
|
+ mqttPort: "Порт MQTT",
|
|
|
+ ftpConnections: "Підключення FTP",
|
|
|
+ mqttConnections: "Підключення MQTT",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ updated: "Налаштування віртуального принтера оновлено",
|
|
|
+ failedToUpdate: "Не вдалося оновити налаштування",
|
|
|
+ copyFailed: "Не вдалося скопіювати — спробуйте вибрати текст вручну",
|
|
|
+ accessCodeRequired: "Спочатку встановіть код доступу",
|
|
|
+ targetPrinterRequired: "Спочатку виберіть цільовий принтер",
|
|
|
+ bindIpRequired: "Спочатку встановіть прив’язку IP.",
|
|
|
+ accessCodeEmpty: "Код доступу не може бути порожнім",
|
|
|
+ accessCodeLength: "Код доступу має містити рівно 8 символів",
|
|
|
+ targetCodeChangedRebind: "Код доступу тепер відповідає новому цільовому принтеру. Повторно додайте цей пристрій у свій слайсер, щоб отримати новий код.",
|
|
|
+ created: "Створено віртуальний принтер",
|
|
|
+ failedToCreate: "Не вдалося створити віртуальний принтер",
|
|
|
+ deleted: "Віртуальний принтер видалено",
|
|
|
+ failedToDelete: "Не вдалося видалити віртуальний принтер",
|
|
|
+ },
|
|
|
+ list: {
|
|
|
+ title: "Віртуальні принтери",
|
|
|
+ add: "додати",
|
|
|
+ addFirst: "Додати віртуальний принтер",
|
|
|
+ empty: "Віртуальні принтери не налаштовані. Додайте один, щоб почати.",
|
|
|
+ },
|
|
|
+ bindIp: {
|
|
|
+ title: "Інтерфейс прив’язки",
|
|
|
+ placeholder: "Виберіть інтерфейс...",
|
|
|
+ hint: "Мережевий інтерфейс, до якого прив’язуватиметься цей віртуальний принтер. Для кожного принтера він має бути унікальним.",
|
|
|
+ },
|
|
|
+ proxy: {
|
|
|
+ accessCodeHint: "У режимі проксі використовуйте код доступу цільового принтера в слайсері. З’єднання прозоро пересилається на справжній принтер.",
|
|
|
+ },
|
|
|
+ addDialog: {
|
|
|
+ title: "Додати віртуальний принтер",
|
|
|
+ name: "Назва",
|
|
|
+ hint: "Ви можете налаштувати код доступу, цільовий принтер та інші параметри після створення.",
|
|
|
+ create: "Створити",
|
|
|
+ },
|
|
|
+ deleteConfirm: {
|
|
|
+ title: "Видалити віртуальний принтер",
|
|
|
+ message: "Ви впевнені, що хочете видалити «{{name}}»? Усі служби цього принтера буде зупинено.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Model Viewer
|
|
|
+ modelViewer: {
|
|
|
+ openInSlicer: "Відкрити у слайсері",
|
|
|
+ tabs: {
|
|
|
+ model: "3D-модель",
|
|
|
+ gcode: "Попередній перегляд G-коду",
|
|
|
+ },
|
|
|
+ notAvailable: "недоступно",
|
|
|
+ notSliced: "не нарізано",
|
|
|
+ plates: "Пластини",
|
|
|
+ allPlates: "Усі пластини",
|
|
|
+ plateNumber: "Пластина {{number}}",
|
|
|
+ plateCount: "Пластин: {{count}}",
|
|
|
+ plateCount_other: "Пластин: {{count}}",
|
|
|
+ objectCount: "Об’єктів: {{count}}",
|
|
|
+ objectCount_other: "Об’єктів: {{count}}",
|
|
|
+ filamentCount: "Філаментів: {{count}}",
|
|
|
+ filamentCount_other: "Філаментів: {{count}}",
|
|
|
+ eta: "ETA {{minutes}} хв",
|
|
|
+ noPreview: "Попередній перегляд цього файлу недоступний",
|
|
|
+ pagination: {
|
|
|
+ pageOf: "Сторінка {{current}} з {{total}}",
|
|
|
+ prev: "Назад",
|
|
|
+ next: "Далі",
|
|
|
+ },
|
|
|
+ errors: {
|
|
|
+ failedToLoad: "Не вдалося завантажити файл",
|
|
|
+ noMeshes: "У файлі 3MF не знайдено жодної сітки",
|
|
|
+ unsupportedFormat: "Непідтримуваний формат файлу",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Maintenance type descriptions (built-in)
|
|
|
+ maintenanceDescriptions: {
|
|
|
+ lubricateCarbonRods: "Нанесіть мастило на карбонові стрижні для плавного руху",
|
|
|
+ lubricateRails: "Нанесіть мастило на лінійні рейки для плавного руху",
|
|
|
+ cleanNozzle: "Очистіть нагрівач і сопло, щоб запобігти засміченню",
|
|
|
+ checkBelts: "Перевірте натяг ременя для точного друку",
|
|
|
+ cleanBuildPlate: "Очистіть будівельну пластину для кращого зчеплення",
|
|
|
+ checkExtruder: "Перевірте шестерні екструдера на знос",
|
|
|
+ checkCooling: "Переконайтеся, що вентилятори охолодження працюють належним чином",
|
|
|
+ generalInspection: "Загальний огляд принтера",
|
|
|
+ cleanCarbonRods: "Очистіть карбонові стрижні, щоб зменшити тертя",
|
|
|
+ lubricateSteelRods: "Нанесіть мастило на сталеві стрижні для плавного руху",
|
|
|
+ cleanSteelRods: "Очистіть сталеві стрижні, щоб зменшити тертя",
|
|
|
+ cleanLinearRails: "Протріть лінійні рейки, щоб видалити пил і сміття",
|
|
|
+ checkPtfeTube: "Перевірте трубку PTFE на знос або пошкодження",
|
|
|
+ replaceHepaFilter: "Замініть фільтр HEPA для забезпечення якості повітря",
|
|
|
+ replaceCarbonFilter: "Замініть фільтр з активованим вугіллям",
|
|
|
+ lubricateLeftNozzleRail: "Змастіть ліву рейку сопла (серія H2)",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Smart Plugs
|
|
|
+ smartPlugs: {
|
|
|
+ offline: "Не в мережі",
|
|
|
+ admin: "Адміністрування",
|
|
|
+ openPlugAdminPage: "Відкрити сторінку адміністратора розетки",
|
|
|
+ deleteSmartPlug: "Видалити розумну розетку",
|
|
|
+ turnOnSmartPlug: "Увімкнути розумну розетку",
|
|
|
+ turnOffSmartPlug: "Вимкнути розумну розетку",
|
|
|
+ turnOn: "Увімкнути",
|
|
|
+ turnOff: "Вимкнути",
|
|
|
+ addSmartPlug: {
|
|
|
+ scanningNetwork: "Сканування мережі...",
|
|
|
+ chooseEntity: "Виберіть сутність…",
|
|
|
+ connectionFailed: "Помилка підключення",
|
|
|
+ searchEntities: "Пошук сутностей...",
|
|
|
+ searchPowerSensors: "Пошук датчиків потужності...",
|
|
|
+ searchEnergySensors: "Пошук датчиків енергії...",
|
|
|
+ placeholders: {
|
|
|
+ plugName: "Розетка у вітальні",
|
|
|
+ mqttStateOnValue: "ON, true, 1",
|
|
|
+ mqttSameAsPower: "Та сама тема, що й для потужності, або інша",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // SmartPlugCard
|
|
|
+ linkedTo: "Пов’язано з:",
|
|
|
+ monitorOnly: "Лише моніторинг",
|
|
|
+ alerts: "Оповіщення",
|
|
|
+ scheduleOn: "Увімкнення: {{time}}",
|
|
|
+ scheduleOff: "Вимкнення: {{time}}",
|
|
|
+ on: "Увімкнено",
|
|
|
+ off: "Вимкнено",
|
|
|
+ power: "Потужність",
|
|
|
+ kwhToday: "кВт·год сьогодні",
|
|
|
+ settings: "Налаштування",
|
|
|
+ automationSettings: "Налаштування автоматизації",
|
|
|
+ showInSwitchbar: "Показати на панелі перемикачів",
|
|
|
+ quickAccessSidebar: "Швидкий доступ із бічної панелі",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ enableAutomation: "Увімкнути автоматизацію для цієї розетки",
|
|
|
+ autoOn: "Автоматичне ввімкнення",
|
|
|
+ autoOnDescription: "Увімкнути на початку друку",
|
|
|
+ autoOff: "Автоматичне вимкнення",
|
|
|
+ autoOffDescription: "Вимкнути після завершення друку (одноразово)",
|
|
|
+ autoOffPersistent: "Залишити ввімкненим",
|
|
|
+ autoOffPersistentDescription: "Залишати ввімкненою між друками, а не лише після одного завдання",
|
|
|
+ controlsPrinterPower: "Живить принтер",
|
|
|
+ controlsPrinterPowerDescription: "Вимкніть цей параметр, якщо розетка живить лише аксесуар — наприклад, вентилятор фільтра або освітлення. Інакше вимкнення розетки позначатиме принтер як недоступний.",
|
|
|
+ autoOffAfterDrying: "Автоматичне вимкнення після сушіння",
|
|
|
+ autoOffAfterDryingDescription: "Вимкнути після завершення сушіння AMS",
|
|
|
+ delayAfterDryingMinutes: "Затримка після сушіння (хв)",
|
|
|
+ turnOffDelayMode: "Режим затримки вимкнення",
|
|
|
+ time: "Час",
|
|
|
+ temp: "Температура",
|
|
|
+ delayMinutes: "Затримка (хвилин)",
|
|
|
+ tempThreshold: "Температурний поріг (°C)",
|
|
|
+ tempThresholdDescription: "Вимикається, коли сопло охолоне нижче цієї температури",
|
|
|
+ edit: "Редагувати",
|
|
|
+ deleteConfirm: "Ви впевнені, що хочете видалити \"{{name}}\"? Це неможливо скасувати.",
|
|
|
+ turnOnConfirm: "Ви впевнені, що бажаєте ввімкнути \"{{name}}\"?",
|
|
|
+ turnOffConfirm: "Ви впевнені, що бажаєте вимкнути \"{{name}}\"? Це призведе до відключення живлення підключеного пристрою.",
|
|
|
+ failedToTurn: "Не вдалося змінити стан «{{name}}» ({{action}})",
|
|
|
+ unknown: "Невідомий",
|
|
|
+ // AddSmartPlugModal
|
|
|
+ addTitle: "Додати розумну розетку",
|
|
|
+ editTitle: "Редагувати розумну розетку",
|
|
|
+ stopScanning: "Зупинити сканування",
|
|
|
+ discoverTasmota: "Виявити пристрої Tasmota",
|
|
|
+ foundDevices: "Знайдено {{count}} пристроїв - натисніть, щоб вибрати:",
|
|
|
+ noDevicesFound: "У вашій мережі не знайдено пристроїв Tasmota.",
|
|
|
+ haNotConfigured: "Home Assistant не налаштовано. Налаштуйте його в",
|
|
|
+ haSettingsPath: "Налаштування → Мережа → Home Assistant",
|
|
|
+ selectEntity: "Вибрати сутність *",
|
|
|
+ ipAddress: "IP Адреса *",
|
|
|
+ nameLabel: "Назва *",
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ password: "Пароль",
|
|
|
+ authHint: "Залиште поле пустим, якщо ваш пристрій Tasmota не вимагає автентифікації",
|
|
|
+ linkToPrinter: "Прив’язати до принтера",
|
|
|
+ noPrinter: "Без принтера (лише ручне керування)",
|
|
|
+ linkingDescription: "Прив’язування дає змогу автоматично вмикати й вимикати розетку на початку та після завершення друку",
|
|
|
+ powerAlerts: "Сповіщення про живлення",
|
|
|
+ alertAbove: "Сповіщати, якщо вище (Вт)",
|
|
|
+ alertBelow: "Сповіщати, якщо нижче (Вт)",
|
|
|
+ alertDescription: "Сповіщати, коли споживана потужність перетинає ці пороги. Залиште відповідне поле порожнім, щоб вимкнути сповіщення для цього напрямку.",
|
|
|
+ dailySchedule: "Щоденний розклад",
|
|
|
+ turnOnAt: "Увімкнути о",
|
|
|
+ turnOffAt: "Вимкнути о",
|
|
|
+ scheduleDescription: "Щодня автоматично вмикати й вимикати розетку в зазначений час. Залиште поле порожнім, щоб пропустити відповідну дію.",
|
|
|
+ showOnPrinterCard: "Показати на картці принтера",
|
|
|
+ displayOnPrinterCard: "Показувати кнопку на картці принтера",
|
|
|
+ connectedResult: "Підключено!",
|
|
|
+ deviceLabel: "Пристрій: {{name}} - ",
|
|
|
+ stateLabel: "Стан: {{state}}",
|
|
|
+ test: "Тест",
|
|
|
+ delete: "Видалити",
|
|
|
+ save: "Зберегти",
|
|
|
+ add: "Додати",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ failedToStartScan: "Не вдалося почати сканування",
|
|
|
+ nameRequired: "Необхідно вказати ім’я",
|
|
|
+ entityRequired: "Сутність необхідна для розеток Home Assistant.",
|
|
|
+ mqttTopicRequired: "Для моніторингу потужності, енергії або стану потрібно налаштувати принаймні одну тему MQTT",
|
|
|
+ loadingEntities: "Завантаження об’єктів...",
|
|
|
+ loading: "Завантаження...",
|
|
|
+ failedToLoadEntities: "Не вдалося завантажити сутності: {{error}}",
|
|
|
+ noEntitiesMatching: "Не знайдено об’єктів, що відповідають \"{{search}}\"",
|
|
|
+ noEntitiesAvailable: "Немає доступних сутностей",
|
|
|
+ searchingEntities: "Пошук у всіх об’єктах ({{count}} знайдено)",
|
|
|
+ showingEntities: "Показано сутності switch, light та input_boolean (доступно: {{count}})",
|
|
|
+ energyMonitoringOptional: "Моніторинг енергії (необов’язково)",
|
|
|
+ energyMonitoringHint: "Знайдіть і виберіть датчики, що надають дані про потужність або споживання енергії.",
|
|
|
+ powerSensorW: "Датчик потужності (Вт)",
|
|
|
+ energyTodayKwh: "Споживання за сьогодні (кВт·год)",
|
|
|
+ totalEnergyKwh: "Загальне споживання енергії (кВт·год)",
|
|
|
+ noMatchingSensors: "Немає відповідних датчиків",
|
|
|
+ none: "Жодного",
|
|
|
+ mqttNotConfigured: "MQTT-брокер не налаштований. Укажіть адресу брокера в розділі",
|
|
|
+ mqttSettingsPath: "Налаштування → Мережа → Публікація MQTT",
|
|
|
+ mqttNotConfiguredSuffix: "(вмикати публікацію не потрібно — достатньо вказати параметри брокера).",
|
|
|
+ mqttMonitorOnlyDescription: "MQTT-розетки отримують дані про потужність і споживання енергії через підписку MQTT. Керування ввімкненням і вимкненням недоступне — використовуйте MQTT-брокер або систему домашньої автоматизації.",
|
|
|
+ powerMonitoring: "Моніторинг потужності",
|
|
|
+ energyMonitoring: "Моніторинг споживання енергії",
|
|
|
+ stateMonitoring: "Моніторинг стану",
|
|
|
+ optional: "необов’язково",
|
|
|
+ topic: "Тема",
|
|
|
+ jsonPath: "Шлях JSON",
|
|
|
+ multiplier: "Множник",
|
|
|
+ onValue: "Значення «увімкнено»",
|
|
|
+ mqttPowerHint: "Шлях JSON витягує значення з корисного навантаження JSON (наприклад, \"power_l1\"). Залиште поле порожнім, якщо тема публікує безпосередньо числові значення.\nДля перетворення mW→W використовуйте множник 0.001, а для kW→W — 1000.",
|
|
|
+ mqttEnergyHint: "Шлях JSON витягує значення з корисного навантаження JSON. Залиште поле порожнім для безпосередньо переданих значень.\nДля перетворення Wh→kWh використовуйте множник 0.001, а для MWh→kWh — 1000.",
|
|
|
+ mqttStateHint: "Шлях JSON витягує значення з корисного навантаження JSON. Залиште поле порожнім для безпосередньо переданих значень.\nЗначення «увімкнено»: точний рядок, що означає стан «увімкнено». Залиште поле порожнім для автоматичного визначення (ON, true, 1).",
|
|
|
+ // REST smart plug
|
|
|
+ restControl: "Керування",
|
|
|
+ restOnUrl: "Увімкнути URL",
|
|
|
+ restOffUrl: "Вимкнути URL",
|
|
|
+ restOnBody: "Тіло запиту ввімкнення",
|
|
|
+ restOffBody: "Тіло запиту вимкнення",
|
|
|
+ restMethod: "Метод HTTP",
|
|
|
+ restHeaders: "Спеціальні заголовки (JSON)",
|
|
|
+ restStatusUrl: "URL стану",
|
|
|
+ restStatusPath: "Шлях JSON до стану",
|
|
|
+ restStatusOnValue: "Значення «увімкнено»",
|
|
|
+ restPowerUrl: "URL даних про потужність",
|
|
|
+ restPowerPath: "Шлях JSON до потужності",
|
|
|
+ restPowerMultiplier: "Множник потужності",
|
|
|
+ restEnergyUrl: "URL даних про енергію",
|
|
|
+ restEnergyPath: "Шлях JSON до споживання за сьогодні",
|
|
|
+ restEnergyTotalPath: "Шлях JSON до загального споживання",
|
|
|
+ restEnergyTotalMultiplier: "Множник загального споживання",
|
|
|
+ restEnergyTotalPathHint: "наприклад, aenergy.total",
|
|
|
+ restEnergyTotalHint:
|
|
|
+ "Багато розеток, зокрема всі моделі Shelly, повідомляють лише загальний лічильник споживання, який ніколи не скидається. Його слід указувати саме тут, а не в полі вище: якщо трактувати це значення як споживання за сьогодні, воно не скинеться опівночі, а показники «Учора» та «Усього» залишатимуться порожніми. Bambuddy сам обчислює показники за сьогодні й учора на основі цього лічильника; для їх появи потрібні один-два дні даних. Shelly передає значення у ват-годинах, тому використовуйте множник 0.001.",
|
|
|
+ restEnergyMultiplier: "Множник енергії",
|
|
|
+ restUrlRequired: "Для REST-розетки потрібно вказати принаймні один URL — для ввімкнення або вимкнення.",
|
|
|
+ restHeadersHint: "наприклад, {\"Authorization\": \"Bearer your-token\"}",
|
|
|
+ restBodyHint: "напр. ON, {\"state\": \"on\"}",
|
|
|
+ restStatusHint: "URL для опитування поточного стану",
|
|
|
+ restPathHint: "наприклад, state або data.power.status",
|
|
|
+ restPowerUrlHint: "Окремий URL для даних про потужність; якщо поле порожнє, використовується URL стану",
|
|
|
+ restEnergyUrlHint: "Окремий URL для даних про енергію; якщо поле порожнє, використовується URL стану",
|
|
|
+ restEnergyHint: "Для кожного значення можна використовувати окремий URL або URL стану як резервний. Для перетворення одиниць використовуйте множники, наприклад 0.001 для перетворення Wh у kWh.",
|
|
|
+ testConnection: "Тестове підключення",
|
|
|
+ connectionSuccess: "Підключення успішне",
|
|
|
+ noSwitchesInSwitchbar: "На панелі перемикачів немає розеток",
|
|
|
+ enableSwitchbarHint: "Увімкніть «Показувати на панелі перемикачів» у розділі «Налаштування → Розумні розетки».",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notifications
|
|
|
+ notifications: {
|
|
|
+ // Provider types
|
|
|
+ providerTypes: {
|
|
|
+ callmebot: "CallMeBot/WhatsApp",
|
|
|
+ ntfy: "ntfy",
|
|
|
+ pushover: "Pushover",
|
|
|
+ telegram: "Telegram",
|
|
|
+ email: "Електронна пошта",
|
|
|
+ discord: "Discord",
|
|
|
+ webhook: "Webhook",
|
|
|
+ homeassistant: "Home Assistant",
|
|
|
+ bark: "Bark",
|
|
|
+ },
|
|
|
+ // Provider descriptions
|
|
|
+ providerDescriptions: {
|
|
|
+ email: "Сповіщення електронною поштою SMTP",
|
|
|
+ telegram: "Сповіщення через бота Telegram.",
|
|
|
+ discord: "Надіслати на канал Discord через webhook",
|
|
|
+ ntfy: "Безкоштовні push-сповіщення з можливістю самостійного розгортання",
|
|
|
+ pushover: "Прості та надійні push-повідомлення",
|
|
|
+ callmebot: "Безкоштовні сповіщення WhatsApp через CallMeBot",
|
|
|
+ webhook: "Універсальний HTTP POST-запит на будь-який URL",
|
|
|
+ homeassistant: "Постійні сповіщення на інформаційній панелі Home Assistant.",
|
|
|
+ bark: "Push-сповіщення iOS через Bark із можливістю самостійного розгортання",
|
|
|
+ },
|
|
|
+ // NotificationProviderCard
|
|
|
+ lastSuccess: "Останнє успішне надсилання: {{date}}",
|
|
|
+ error: "Помилка",
|
|
|
+ printer: "Принтер:",
|
|
|
+ allPrinters: "Всі принтери",
|
|
|
+ sendTestNotification: "Надіслати тестове сповіщення",
|
|
|
+ eventSettings: "Налаштування події",
|
|
|
+ enabled: "Увімкнено",
|
|
|
+ sendFromProvider: "Надсилати сповіщення від цього постачальника",
|
|
|
+ // Event categories
|
|
|
+ printEvents: "Події друку",
|
|
|
+ printerStatus: "Стан принтера",
|
|
|
+ amsAlarms: "Попередження AMS",
|
|
|
+ amsHtAlarms: "Попередження AMS-HT",
|
|
|
+ printQueue: "Черга друку",
|
|
|
+ // Event tags (badges)
|
|
|
+ start: "Початок",
|
|
|
+ plateCheck: "Перевірка пластини",
|
|
|
+ complete: "Завершено",
|
|
|
+ failed: "Помилка",
|
|
|
+ stopped: "Зупинено",
|
|
|
+ progress: "Прогрес",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ lowFilament: "Закінчується філамент",
|
|
|
+ maintenance: "Технічне обслуговування",
|
|
|
+ amsHumidity: "AMS Вологість",
|
|
|
+ amsTemp: "AMS Темп",
|
|
|
+ amsHtHumidity: "AMS-HT Вологість",
|
|
|
+ amsHtTemp: "Температура AMS-HT",
|
|
|
+ bedCooled: "Стіл охолов",
|
|
|
+ firstLayer: "Перший шар",
|
|
|
+ quiet: "Тихо",
|
|
|
+ digest: "Дайджест {{time}}",
|
|
|
+ // Event labels (expanded settings)
|
|
|
+ printStarted: "Друк розпочато",
|
|
|
+ plateNotEmpty: "Друкарська пластина не порожня",
|
|
|
+ plateNotEmptyDescription: "Перед друком виявлено об’єкти",
|
|
|
+ plateClearRequired: "Потрібно очистити пластину",
|
|
|
+ plateClearRequiredDescription: "Друк завершено, черга очікує підтвердження очищення пластини",
|
|
|
+ plateClear: "Очищення пластини",
|
|
|
+ printCompleted: "Друк завершено",
|
|
|
+ bedCooledLabel: "Стіл охолов",
|
|
|
+ bedCooledDescription: "Після друку стіл охолов нижче заданого порога",
|
|
|
+ firstLayerCompleteLabel: "Перший шар завершено",
|
|
|
+ firstLayerCompleteDescription: "Сповістити зі знімком після завершення першого шару",
|
|
|
+ missingSpoolAssignmentLabel: "Відсутнє призначення котушки",
|
|
|
+ missingSpoolAssignmentDescription: "Сповіщати, коли починається друк і для необхідних лотків не призначено котушку",
|
|
|
+ printFailed: "Помилка друку",
|
|
|
+ printStopped: "Друк зупинено",
|
|
|
+ progressMilestones: "Віхи прогресу",
|
|
|
+ progressMilestonesDescription: "Сповіщати на 25%, 50%, 75%",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ printerError: "Помилка принтера",
|
|
|
+ aiFailureDetection: "Виявлення помилок за допомогою ШІ",
|
|
|
+ aiFailureDetectionDescription: "Сповіщати, коли ШІ Obico виявляє можливу помилку друку",
|
|
|
+ lowFilamentLabel: "Закінчується філамент",
|
|
|
+ maintenanceDue: "Настав час технічного обслуговування",
|
|
|
+ maintenanceDueDescription: "Повідомити, коли потрібне обслуговування",
|
|
|
+ amsHumidityHigh: "AMS Висока вологість",
|
|
|
+ amsHumidityHighDescription: "Звичайна AMS вологість перевищує порогове значення",
|
|
|
+ amsTemperatureHigh: "AMS Висока температура",
|
|
|
+ amsTemperatureHighDescription: "Звичайна AMS температура перевищує порогове значення",
|
|
|
+ amsHtHumidityHigh: "AMS-HT Висока вологість",
|
|
|
+ amsHtHumidityHighDescription: "AMS-HT вологість перевищує порогове значення",
|
|
|
+ amsHtTemperatureHigh: "Висока температура AMS-HT",
|
|
|
+ amsHtTemperatureHighDescription: "Температура AMS-HT перевищує порогове значення",
|
|
|
+ // Inventory stock alert events
|
|
|
+ inventoryAlerts: "Сповіщення про запаси",
|
|
|
+ stockReorderAlert: "Сповіщення про необхідність поповнення",
|
|
|
+ stockReorderAlertDescription: "Запас SKU досяг точки повторного замовлення",
|
|
|
+ stockBreakAlert: "Сповіщення про ризик вичерпання запасу",
|
|
|
+ stockBreakAlertDescription: "Запас закінчиться до того, як надійде поповнення",
|
|
|
+ // Queue events
|
|
|
+ jobAdded: "Завдання додано",
|
|
|
+ jobAddedDescription: "Завдання додано до черги",
|
|
|
+ jobAssigned: "Завдання призначено",
|
|
|
+ jobAssignedDescription: "Завдання на основі моделі, призначене принтеру",
|
|
|
+ jobStarted: "Завдання розпочато",
|
|
|
+ jobStartedDescription: "Розпочато друк завдання черги",
|
|
|
+ jobWaiting: "Завдання очікує",
|
|
|
+ jobWaitingDescription: "Завдання очікує на філамент або принтер",
|
|
|
+ jobSkipped: "Завдання пропущено",
|
|
|
+ jobSkippedDescription: "Завдання пропущено (попереднє не вдалося)",
|
|
|
+ jobFailed: "Помилка завдання",
|
|
|
+ jobFailedDescription: "Не вдалося розпочати завдання",
|
|
|
+ queueComplete: "Черга завершена",
|
|
|
+ queueCompleteDescription: "Усі завдання черги завершено",
|
|
|
+ // Quiet hours
|
|
|
+ quietHours: "Тихі години",
|
|
|
+ noNotificationsDuring: "Жодних сповіщень у ці години",
|
|
|
+ editProviderToChangeQuietHours: "Змініть постачальника, щоб змінити години тиші",
|
|
|
+ // Daily digest
|
|
|
+ dailyDigest: "Щоденний дайджест",
|
|
|
+ batchNotifications: "Групуйте сповіщення в єдиний щоденний підсумок",
|
|
|
+ sendAt: "Надсилати о {{time}}",
|
|
|
+ editProviderToChangeDigestTime: "Відредагуйте постачальника, щоб змінити час дайджесту",
|
|
|
+ // Actions
|
|
|
+ edit: "Редагувати",
|
|
|
+ deleteProvider: "Видалити постачальника сповіщень",
|
|
|
+ deleteConfirm: "Видалити «{{name}}»? Цю дію неможливо скасувати.",
|
|
|
+ delete: "Видалити",
|
|
|
+ // AddNotificationModal
|
|
|
+ addTitle: "Додати постачальника сповіщень",
|
|
|
+ editTitle: "Редагувати постачальника сповіщень",
|
|
|
+ nameLabel: "Назва *",
|
|
|
+ namePlaceholder: "Мої сповіщення",
|
|
|
+ providerTypeLabel: "Тип постачальника *",
|
|
|
+ configuration: "Конфігурація",
|
|
|
+ testConfiguration: "Перевірити конфігурацію",
|
|
|
+ printerFilter: "Фільтр принтера",
|
|
|
+ onlyFromPrinter: "Надсилати лише сповіщення про події з цього принтера",
|
|
|
+ quietHoursDnd: "Тихі години (не турбувати)",
|
|
|
+ quietStart: "Початок",
|
|
|
+ quietEnd: "Кінець",
|
|
|
+ dailyDigestLabel: "Щоденний дайджест",
|
|
|
+ sendDigestAt: "Надсилати дайджест о",
|
|
|
+ digestCollected: "Події буде зібрано й надіслано в цей час одним зведенням",
|
|
|
+ notificationEvents: "Події сповіщень",
|
|
|
+ progressPercent: "(25%, 50%, 75%)",
|
|
|
+ bedCooledAfterPrint: "(після завершення друку)",
|
|
|
+ // Per-event ntfy priority (#990)
|
|
|
+ eventPriority: {
|
|
|
+ sectionTitle: "Пріоритет ntfy",
|
|
|
+ helpNtfy: "Виберіть пріоритет для кожної ввімкненої події. ntfy використовує їх для ескалації сповіщень (звук, видимість, поведінка push). Для рівнів, які тут не встановлено, використовується сервер ntfy за замовчуванням.",
|
|
|
+ min: "Мін",
|
|
|
+ low: "Низький",
|
|
|
+ default: "За замовчуванням",
|
|
|
+ high: "Високий",
|
|
|
+ urgent: "Терміново",
|
|
|
+ },
|
|
|
+ cancel: "Скасувати",
|
|
|
+ save: "зберегти",
|
|
|
+ add: "додати",
|
|
|
+ nameRequired: "Необхідно вказати ім’я",
|
|
|
+ fieldRequired: "{{field}} — обов’язкове поле.",
|
|
|
+ haDataInvalid: "Поле «Дані» має містити дійсний об’єкт JSON, наприклад {\"priority\": \"high\", \"ttl\": 0}",
|
|
|
+ // Config field labels
|
|
|
+ phoneNumber: "Номер телефону",
|
|
|
+ apiKey: "Ключ API",
|
|
|
+ serverUrl: "Сервер URL",
|
|
|
+ topic: "Тема",
|
|
|
+ authToken: "Токен авторизації",
|
|
|
+ userKey: "Ключ користувача",
|
|
|
+ appToken: "Токен застосунку",
|
|
|
+ priority: "Пріоритет",
|
|
|
+ pushoverRetry: "Інтервал повторення екстреного сповіщення (с)",
|
|
|
+ pushoverExpire: "Термін дії екстреного сповіщення (с)",
|
|
|
+ botToken: "Токен бота",
|
|
|
+ chatId: "Ідентифікатор чату",
|
|
|
+ smtpServer: "Сервер SMTP",
|
|
|
+ smtpPort: "Порт SMTP",
|
|
|
+ security: "Безпека",
|
|
|
+ authentication: "Автентифікація",
|
|
|
+ username: "Ім’я користувача",
|
|
|
+ password: "Пароль",
|
|
|
+ fromEmail: "Адреса відправника",
|
|
|
+ toEmail: "Адреса одержувача",
|
|
|
+ webhookUrl: "Webhook URL",
|
|
|
+ payloadFormat: "Формат корисного навантаження",
|
|
|
+ authorization: "Авторизація",
|
|
|
+ titleFieldName: "Назва поля заголовка",
|
|
|
+ messageFieldName: "Назва поля повідомлення",
|
|
|
+ // NotificationTemplateEditor
|
|
|
+ editTemplate: "Редагувати шаблон: {{name}}",
|
|
|
+ titleLabel: "Заголовок",
|
|
|
+ bodyLabel: "Текст",
|
|
|
+ titlePlaceholder: "Назва сповіщення...",
|
|
|
+ bodyPlaceholder: "Текст сповіщення...",
|
|
|
+ availableVariables: "Доступні змінні",
|
|
|
+ clickToInsert: "Натисніть, щоб вставити в текст у позиції курсора",
|
|
|
+ livePreview: "Попередній перегляд",
|
|
|
+ hide: "Сховати",
|
|
|
+ show: "Показати",
|
|
|
+ loadingPreview: "Завантаження попереднього перегляду...",
|
|
|
+ enterTemplateContent: "Введіть вміст шаблону, щоб побачити попередній перегляд",
|
|
|
+ titlePreview: "Назва:",
|
|
|
+ bodyPreview: "Текст:",
|
|
|
+ resetToDefault: "Відновити типові значення",
|
|
|
+ titleRequired: "Необхідно вказати назву",
|
|
|
+ bodyRequired: "Текст є обов’язковим",
|
|
|
+ // NotificationLogViewer
|
|
|
+ notificationLog: "Журнал повідомлень",
|
|
|
+ showFailedOnly: "Лише невдалі",
|
|
|
+ last24Hours: "Останні 24 години",
|
|
|
+ last7Days: "Останні 7 днів",
|
|
|
+ last30Days: "Останні 30 днів",
|
|
|
+ last90Days: "Останні 90 днів",
|
|
|
+ justNow: "Щойно",
|
|
|
+ noFailedNotifications: "Немає невдалих сповіщень",
|
|
|
+ noNotificationsLogged: "Сповіщення не зареєстровано",
|
|
|
+ unknownProvider: "Невідомий постачальник",
|
|
|
+ logTitle: "Назва",
|
|
|
+ logMessage: "повідомлення",
|
|
|
+ logError: "Помилка",
|
|
|
+ logProvider: "Постачальник: {{type}}",
|
|
|
+ logTime: "Час: {{time}}",
|
|
|
+ refresh: "Оновити",
|
|
|
+ clearOld: "Очистити старі",
|
|
|
+ statsSummary: "За останні {{days}} дн.:",
|
|
|
+ statsNotifications: "сповіщення",
|
|
|
+ statsSent: "{{count}} надіслано",
|
|
|
+ statsFailed: "не вдалося надіслати: {{count}}",
|
|
|
+ // Event type labels (for log viewer)
|
|
|
+ eventTypes: {
|
|
|
+ print_start: "Друк розпочато",
|
|
|
+ print_complete: "Друк завершено",
|
|
|
+ print_failed: "Помилка друку",
|
|
|
+ print_stopped: "Друк зупинено",
|
|
|
+ print_progress: "Прогрес",
|
|
|
+ printer_offline: "Принтер не в мережі",
|
|
|
+ printer_error: "Помилка принтера",
|
|
|
+ filament_low: "Закінчується філамент",
|
|
|
+ maintenance_due: "Технічне обслуговування",
|
|
|
+ test: "Тест",
|
|
|
+ },
|
|
|
+ // User email notification preferences
|
|
|
+ userEmail: {
|
|
|
+ title: "Сповіщення",
|
|
|
+ emailNotifications: "Сповіщення електронною поштою",
|
|
|
+ emailNotificationsDesc: "Отримуйте сповіщення електронною поштою про власні завдання друку. Електронні листи надсилаються за допомогою системних параметрів SMTP, налаштованих у розширеній автентифікації.",
|
|
|
+ sendingTo: "Сповіщення будуть надіслані на адресу",
|
|
|
+ noEmailWarning: "У вашому обліковому записі немає адреси електронної пошти. Зверніться до адміністратора, щоб її додати.",
|
|
|
+ printJobNotifications: "Повідомлення про завдання друку",
|
|
|
+ printJobNotificationsDesc: "Виберіть, які події викликають сповіщення електронною поштою про завдання друку, які ви надсилаєте.",
|
|
|
+ printJobStarts: "Початок завдання друку",
|
|
|
+ printJobStartsDesc: "Отримуйте сповіщення, коли розпочнеться ваше завдання друку.",
|
|
|
+ printJobFinishes: "Завершення завдання друку",
|
|
|
+ printJobFinishesDesc: "Отримуйте сповіщення, коли ваше завдання друку буде успішно завершено.",
|
|
|
+ printErrors: "Помилки друку",
|
|
|
+ printErrorsDesc: "Отримуйте сповіщення, якщо завдання друку завершується невдало або під час нього виникає помилка.",
|
|
|
+ printJobStops: "Зупинення завдання друку",
|
|
|
+ printJobStopsDesc: "Отримуйте сповіщення, коли ваше завдання друку скасовано або зупинено.",
|
|
|
+ saveSuccess: "Параметри сповіщень збережено.",
|
|
|
+ saveError: "Не вдалося зберегти налаштування сповіщень.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Rich Text Editor
|
|
|
+ richTextEditor: {
|
|
|
+ bold: "жирний",
|
|
|
+ italic: "Курсив",
|
|
|
+ underline: "Підкреслити",
|
|
|
+ bulletList: "Список маркерів",
|
|
|
+ numberedList: "Нумерований список",
|
|
|
+ alignLeft: "Вирівняти по лівому краю",
|
|
|
+ alignCenter: "Вирівняти по центру",
|
|
|
+ alignRight: "Вирівняти праворуч",
|
|
|
+ addLink: "Додати посилання",
|
|
|
+ removeLink: "Видалити посилання",
|
|
|
+ },
|
|
|
+
|
|
|
+ // External Links
|
|
|
+ externalLinks: {
|
|
|
+ title: "Посилання на бічній панелі",
|
|
|
+ sidebarLayout: "Бічна панель",
|
|
|
+ sidebarLayoutDescription: "Показуйте або приховуйте вбудовані сторінки, додавайте зовнішні посилання та перетягуйте елементи, щоб змінити порядок навігації на бічній панелі.",
|
|
|
+ systemPages: "Bambuddy сторінок",
|
|
|
+ externalLinks: "Зовнішні посилання",
|
|
|
+ visibleInSidebar: "Видно на бічній панелі",
|
|
|
+ hiddenFromSidebar: "Приховано від бічної панелі",
|
|
|
+ requiredInSidebar: "Обов’язково на бічній панелі",
|
|
|
+ hidePage: "Приховати сторінку",
|
|
|
+ showPage: "Показати сторінку",
|
|
|
+ settingsCannotBeHidden: "Налаштування не можна приховати",
|
|
|
+ noLinksConfigured: "Зовнішні посилання не налаштовано",
|
|
|
+ deleteLink: "Видалити посилання",
|
|
|
+ removeCustomIcon: "Видалити спеціальний значок",
|
|
|
+ openInNewTab: "Відкрити в новій вкладці",
|
|
|
+ placeholders: {
|
|
|
+ linkName: "Моє посилання",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Keyboard Shortcuts Modal
|
|
|
+ keyboardShortcuts: {
|
|
|
+ title: "Комбінації клавіш",
|
|
|
+ navigation: "Навігація",
|
|
|
+ archivesSection: "Архіви",
|
|
|
+ kProfilesSection: "K-профілі",
|
|
|
+ generalSection: "Загальний",
|
|
|
+ shortcuts: {
|
|
|
+ goToPrinters: "Перейдіть до Принтери",
|
|
|
+ goToArchives: "Перейдіть до архіву",
|
|
|
+ goToQueue: "Перейдіть до черги",
|
|
|
+ goToStats: "Перейти до статистики",
|
|
|
+ goToProfiles: "Перейдіть до Cloud Profiles",
|
|
|
+ goToSettings: "Перейдіть до Налаштувань",
|
|
|
+ focusSearch: "Пошук по фокусу",
|
|
|
+ openUploadModal: "Відкрити вікно вивантаження",
|
|
|
+ clearSelection: "Очистити виділення / розмити введення",
|
|
|
+ contextMenu: "Контекстне меню на картках",
|
|
|
+ refreshProfiles: "Оновити профілі",
|
|
|
+ newProfile: "Новий профіль",
|
|
|
+ exitSelectionMode: "Вийти з режиму вибору",
|
|
|
+ showHelp: "Покажіть цю довідку",
|
|
|
+ },
|
|
|
+ footer: "Натисніть Esc або клацніть зовні, щоб закрити",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notification Log
|
|
|
+ notificationLog: {
|
|
|
+ title: "Журнал повідомлень",
|
|
|
+ events: {
|
|
|
+ printStarted: "Друк розпочато",
|
|
|
+ printComplete: "Друк завершено",
|
|
|
+ printFailed: "Помилка друку",
|
|
|
+ printStopped: "Друк зупинено",
|
|
|
+ progress: "Прогрес",
|
|
|
+ printerOffline: "Принтер не в мережі",
|
|
|
+ printerError: "Помилка принтера",
|
|
|
+ lowFilament: "Закінчується філамент",
|
|
|
+ maintenanceDue: "Технічне обслуговування",
|
|
|
+ test: "Тест",
|
|
|
+ },
|
|
|
+ timeAgo: {
|
|
|
+ justNow: "Просто зараз",
|
|
|
+ minutesAgo: "{{minutes}}хв тому",
|
|
|
+ hoursAgo: "{{hours}} год тому",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Restore/Backup Modal
|
|
|
+ restoreBackup: {
|
|
|
+ title: "Відновити резервну копію",
|
|
|
+ restoring: "Відновлення...",
|
|
|
+ restoreComplete: "Відновлення завершено",
|
|
|
+ restoreFailed: "Не вдалося відновити",
|
|
|
+ importSettings: "Імпорт налаштувань із файлу резервної копії",
|
|
|
+ pleaseWait: "Зачекайте, поки ваші дані відновляться",
|
|
|
+ clickToSelect: "Натисніть, щоб вибрати файл резервної копії (.json або .zip)",
|
|
|
+ howDuplicateHandling: "Як працює обробка дублікатів:",
|
|
|
+ categories: {
|
|
|
+ printers: "Принтери",
|
|
|
+ smartPlugs: "Розумні розетки",
|
|
|
+ notificationProviders: "Постачальники сповіщень",
|
|
|
+ filaments: "філаменти",
|
|
|
+ archives: "Архіви",
|
|
|
+ pendingUploads: "Вивантаження, що очікують",
|
|
|
+ settingsTemplates: "Налаштування та шаблони",
|
|
|
+ },
|
|
|
+ matchingInfo: {
|
|
|
+ printers: "відповідає серійному номеру",
|
|
|
+ smartPlugs: "збігається з адресою IP.",
|
|
|
+ notificationProviders: "відповідність за назвою",
|
|
|
+ filaments: "відповідність за назвою + типом + брендом",
|
|
|
+ archives: "відповідає хешу вмісту",
|
|
|
+ pendingUploads: "відповідає імені файлу",
|
|
|
+ settingsTemplates: "завжди перезаписується",
|
|
|
+ },
|
|
|
+ replaceExisting: "Замінити існуючі дані",
|
|
|
+ keepExisting: "Зберегти наявні дані",
|
|
|
+ replaceDescription: "Замінити елементи, які вже існують, резервними копіями",
|
|
|
+ keepDescription: "Відновлюйте лише елементи, яких ще не існує",
|
|
|
+ caution: "Увага:",
|
|
|
+ cautionText: "Під час перезапису поточні конфігурації буде замінено даними з резервної копії. З міркувань безпеки коди доступу до принтерів ніколи не перезаписуються.",
|
|
|
+ itemsRestored: "Елементів відновлено",
|
|
|
+ itemsSkipped: "Елементи пропущені",
|
|
|
+ restored: "Відновлено",
|
|
|
+ skipped: "Пропущено (вже існує)",
|
|
|
+ filesLabel: "Файли (3MF, мініатюри тощо)",
|
|
|
+ newApiKeysGenerated: "Створено нові API ключі",
|
|
|
+ newApiKeysWarning: "Ці ключі буде показано лише один раз. Скопіюйте їх зараз!",
|
|
|
+ processingBackup: "Обробка файлу резервної копії...",
|
|
|
+ noDataFound: "У файлі резервної копії не знайдено даних для відновлення.",
|
|
|
+ failedToRestore: "Не вдалося відновити резервну копію. Будь ласка, перевірте формат файлу.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Backup Export Modal
|
|
|
+ backupExport: {
|
|
|
+ title: "Експорт резервної копії",
|
|
|
+ selectData: "Вибрати дані для включення",
|
|
|
+ selectAll: "Вибрати усі",
|
|
|
+ selectNone: "Вибрати Немає",
|
|
|
+ categoryDescriptions: {
|
|
|
+ settings: "Мова, тема, параметри оновлення",
|
|
|
+ notifications: "ntfy, Pushover, Discord тощо.",
|
|
|
+ templates: "Користувацькі шаблони повідомлень",
|
|
|
+ smartPlugs: "Конфігурації розетки Tasmota.",
|
|
|
+ externalLinks: "Посилання на бічній панелі на зовнішні служби",
|
|
|
+ printers: "Інформація про принтер (без кодів доступу)",
|
|
|
+ plateDetection: "Еталонні зображення порожньої пластини",
|
|
|
+ filaments: "Види та вартість філаменти",
|
|
|
+ maintenance: "Спеціальні графіки технічного обслуговування",
|
|
|
+ archives: "Усі дані для друку + файли (3MF, мініатюри, фотографії)",
|
|
|
+ projects: "Проєкти, елементи специфікації та вкладення",
|
|
|
+ pendingUploads: "Вивантаження на віртуальний принтер очікують на розгляд",
|
|
|
+ apiKeys: "Ключі Webhook API (нові ключі створюються під час імпорту)",
|
|
|
+ },
|
|
|
+ requiresPrinters: "Необхідно вибрати принтери",
|
|
|
+ zipFileWarning: "Буде створено файл ZIP.",
|
|
|
+ zipFileDescription: "До архіву ввійдуть усі файли 3MF, мініатюри, таймлапси та фотографії. Створення може тривати певний час, а отриманий файл може мати великий розмір.",
|
|
|
+ includeAccessCodes: "Додати коди доступу",
|
|
|
+ includeAccessCodesDescription: "Для перенесення на іншу машину",
|
|
|
+ includeAccessCodesWarning: "Коди доступу буде збережено у відкритому вигляді. Надійно захистіть файл резервної копії!",
|
|
|
+ categoriesSelected: "Вибрано категорії {{selectedCount}}.",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Pending Uploads Panel
|
|
|
+ pendingUploads: {
|
|
|
+ placeholders: {
|
|
|
+ notes: "Додайте примітки щодо цього друку...",
|
|
|
+ },
|
|
|
+ discardUpload: "Відхилити вивантаження",
|
|
|
+ archiveAllUploads: "Архівувати всі вивантаження",
|
|
|
+ discardAllUploads: "Відхилити всі вивантаження",
|
|
|
+ archive: "Архів",
|
|
|
+ timeAgo: {
|
|
|
+ justNow: "Просто зараз",
|
|
|
+ minutesAgo: "{{minutes}}хв тому",
|
|
|
+ hoursAgo: "{{hours}} год тому",
|
|
|
+ daysAgo: "{{days}} дн. тому",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // API Browser
|
|
|
+ apiBrowser: {
|
|
|
+ placeholders: {
|
|
|
+ requestBody: "JSON тіло запиту...",
|
|
|
+ searchEndpoints: "Пошук кінцевих точок...",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Configure AMS Slot Modal
|
|
|
+ configureAmsSlot: {
|
|
|
+ title: "Налаштувати слот AMS.",
|
|
|
+ slotConfigured: "Слот налаштовано!",
|
|
|
+ configuringSlot: "Налаштування слота:",
|
|
|
+ slotLabel: "{{ams}} Слот {{slot}}",
|
|
|
+ searchPresets: "Шукати профілі...",
|
|
|
+ colorPlaceholder: "Назва або шістнадцяткова назва кольору (наприклад, коричневий, FF8800)",
|
|
|
+ clearCustomColor: "Очистити спеціальний колір",
|
|
|
+ noCloudPresets: "Хмарних профілів немає. Увійдіть у Bambu Cloud для синхронізації.",
|
|
|
+ noPresetsAvailable: "Профілів немає. Увійдіть у Bambu Cloud або імпортуйте локальні профілі.",
|
|
|
+ noMatchingPresets: "Відповідних стилів не знайдено.",
|
|
|
+ custom: "Власний",
|
|
|
+ builtin: "Вбудований",
|
|
|
+ orcaCloud: "Orca Cloud",
|
|
|
+ bambuCloud: "Бамбукова хмара",
|
|
|
+ settingsSentToPrinter: "Налаштування надіслано на принтер",
|
|
|
+ filamentProfile: "Профіль філаменту",
|
|
|
+ kProfileLabel: "Профіль K (випередження тиску)",
|
|
|
+ filteringFor: "Фільтрування за: {{material}}",
|
|
|
+ noKProfile: "Немає профілю K (використовуйте значення за замовчуванням 0,020)",
|
|
|
+ noMatchingKProfiles: "Не знайдено відповідних K профілів. Використовуватиметься K=0,020 за замовчуванням.",
|
|
|
+ selectFilamentFirst: "Спочатку виберіть профіль філаменту",
|
|
|
+ kFromCalibration: "K={{value}} від калібрування принтера",
|
|
|
+ customColorLabel: "Власний колір (необов’язково)",
|
|
|
+ presetColors: "{{name}} кольори:",
|
|
|
+ showLessColors: "Показувати менше кольорів",
|
|
|
+ showMoreColors: "Показати більше кольорів",
|
|
|
+ clear: "Очистити",
|
|
|
+ hexLabel: "Шістнадцятковий: #{{hex}}",
|
|
|
+ resetting: "Скидання...",
|
|
|
+ resetSlot: "Скинути слот",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ configuring: "Налаштування...",
|
|
|
+ configureSlot: "Налаштувати слот",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Git Backup Settings
|
|
|
+ githubBackup: {
|
|
|
+ title: "Резервне копіювання Git",
|
|
|
+ history: "історія",
|
|
|
+ downloadBackup: "Завантажити резервну копію",
|
|
|
+ restoreBackup: "Відновити резервну копію",
|
|
|
+ noBackupsYet: "Резервних копій ще немає",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Email Settings
|
|
|
+ emailSettings: {
|
|
|
+ placeholders: {
|
|
|
+ fromName: "BamBuddy",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Tag Management Modal
|
|
|
+ tagManagement: {
|
|
|
+ searchTags: "Пошук тегів...",
|
|
|
+ renameTag: "Перейменувати тег",
|
|
|
+ deleteTag: "Видалити тег",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notification Template Editor
|
|
|
+ notificationTemplates: {
|
|
|
+ placeholders: {
|
|
|
+ title: "Назва сповіщення...",
|
|
|
+ body: "Текст сповіщення...",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Batch Tag Modal
|
|
|
+ batchTag: {
|
|
|
+ placeholders: {
|
|
|
+ newTag: "Введіть новий тег...",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Photo Gallery Modal
|
|
|
+ photoGallery: {
|
|
|
+ deletePhoto: "Видалити фото",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Filament Hover Card
|
|
|
+ filamentHoverCard: {
|
|
|
+ copySpoolUuid: "Копіювати UUID буфера",
|
|
|
+ },
|
|
|
+
|
|
|
+ // K Profiles View
|
|
|
+ kProfilesView: {
|
|
|
+ hasNote: "Має примітку",
|
|
|
+ copyProfile: "Копіювати профіль",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Layout/Navigation
|
|
|
+ layout: {
|
|
|
+ openMenu: "Відкрити меню",
|
|
|
+ noPermissionSystemInfo: "У вас немає дозволу на перегляд системної інформації",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Dashboard
|
|
|
+ dashboard: {
|
|
|
+ dragToReorder: "Перетягніть, щоб змінити порядок",
|
|
|
+ hideWidget: "Сховати віджет",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notification Provider Card
|
|
|
+ notificationProviderCard: {
|
|
|
+ deleteNotificationProvider: "Видалити постачальника сповіщень",
|
|
|
+ },
|
|
|
+
|
|
|
+ // File Manager Modal
|
|
|
+ fileManagerModal: {
|
|
|
+ closeFileManager: "Закрити файловий менеджер",
|
|
|
+ sortFiles: "Сортування файлів",
|
|
|
+ goToParentFolder: "Перейти до батьківської папки",
|
|
|
+ threeView: "3D перегляд",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Embedded Camera Viewer
|
|
|
+ embeddedCameraViewer: {
|
|
|
+ refreshStream: "Оновити потік",
|
|
|
+ close: "Закрити",
|
|
|
+ zoomOut: "Зменшити масштаб",
|
|
|
+ resetZoom: "Скинути масштаб",
|
|
|
+ zoomIn: "Збільшити",
|
|
|
+ dragToResize: "Перетягніть, щоб змінити розмір",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Timelapse Viewer
|
|
|
+ timelapseViewer: {
|
|
|
+ skipBack5s: "Перейти на 5 секунд назад",
|
|
|
+ skipForward5s: "Перейти вперед на 5 с",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Notification Providers
|
|
|
+ notificationProviders: {
|
|
|
+ descriptions: {
|
|
|
+ email: "Сповіщення електронною поштою SMTP",
|
|
|
+ telegram: "Сповіщення через бота Telegram.",
|
|
|
+ discord: "Надіслати на канал Discord через webhook",
|
|
|
+ ntfy: "Безкоштовні push-сповіщення з можливістю самостійного розгортання",
|
|
|
+ pushover: "Прості та надійні push-повідомлення",
|
|
|
+ callmebot: "Безкоштовні сповіщення WhatsApp через CallMeBot",
|
|
|
+ webhook: "Універсальний HTTP POST-запит на будь-який URL",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Log Viewer
|
|
|
+ logViewer: {
|
|
|
+ searchPlaceholder: "Шукати повідомлення або назву реєстратора...",
|
|
|
+ noLogEntries: "Записів у журналі не знайдено",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Switchbar Popover
|
|
|
+ switchbarPopover: {
|
|
|
+ noSwitchesInSwitchbar: "На панелі перемикачів немає",
|
|
|
+ },
|
|
|
+
|
|
|
+ // Project Page Modal
|
|
|
+ projectPageModal: {
|
|
|
+ placeholders: {
|
|
|
+ title: "Назва",
|
|
|
+ designer: "Дизайнер",
|
|
|
+ license: "Ліцензія",
|
|
|
+ description: "Введіть опис...",
|
|
|
+ profileTitle: "Назва профілю",
|
|
|
+ profileDescription: "Опис профілю...",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ // Spoolman Settings
|
|
|
+ spoolmanSettings: {},
|
|
|
+
|
|
|
+ // Time
|
|
|
+ time: {
|
|
|
+ unknown: "-",
|
|
|
+ waiting: "Очікування",
|
|
|
+ justNow: "Просто зараз",
|
|
|
+ now: "Зараз",
|
|
|
+ minsAgo: "{{count}}хв тому",
|
|
|
+ inMins: "в {{count}}м",
|
|
|
+ hoursAgo: "{{count}} год тому",
|
|
|
+ inHours: "в {{count}} год",
|
|
|
+ daysAgo: "{{count}} дн. тому",
|
|
|
+ inDays: "в {{count}}d",
|
|
|
+ },
|
|
|
+
|
|
|
+ // SpoolBuddy Kiosk
|
|
|
+ spoolbuddy: {
|
|
|
+ nav: {
|
|
|
+ dashboard: "Приладова панель",
|
|
|
+ ams: "AMS",
|
|
|
+ inventory: "Інвентар",
|
|
|
+ writeTag: "Записати",
|
|
|
+ settings: "Налаштування",
|
|
|
+ },
|
|
|
+ status: {
|
|
|
+ nfcReady: "NFC Готовий",
|
|
|
+ nfcOff: "NFC Вимк",
|
|
|
+ offline: "Не в мережі",
|
|
|
+ online: "Онлайн",
|
|
|
+ noPrinters: "Немає принтерів",
|
|
|
+ deviceOffline: "Пристрій не в мережі",
|
|
|
+ waitingConnection: "Очікування підключення пристрою...",
|
|
|
+ systemReady: "Система готова",
|
|
|
+ status: "Статус",
|
|
|
+ },
|
|
|
+ dashboard: {
|
|
|
+ readyToScan: "Готовий до сканування",
|
|
|
+ idleMessage: "Покладіть котушку на ваги, щоб ідентифікувати її",
|
|
|
+ nfcHint: "Тег NFC буде прочитано автоматично",
|
|
|
+ device: "пристрій",
|
|
|
+ syncWeight: "Синхронізувати вагу",
|
|
|
+ weightSynced: "Синхронізовано!",
|
|
|
+ unknownTag: "Невідомий тег",
|
|
|
+ newTag: "Виявлено новий тег",
|
|
|
+ onScale: "на вагах",
|
|
|
+ linkSpool: "Прив’язати до котушки",
|
|
|
+ linkTagTitle: "Прив’язати тег до котушки",
|
|
|
+ linkTag: "Прив’язати тег",
|
|
|
+ selectSpool: "Виберіть котушку, до якої потрібно прив’язати цей тег:",
|
|
|
+ noUntagged: "Не знайдено котушок без тегів",
|
|
|
+ tagDetected: "Тег виявлено",
|
|
|
+ noTag: "Без тегу",
|
|
|
+ tagId: "Тег",
|
|
|
+ grossWeight: "Вага брутто",
|
|
|
+ spoolSize: "Розмір котушки",
|
|
|
+ close: "Закрити",
|
|
|
+ currentSpool: "Поточна котушка",
|
|
|
+ plateReady: "Пластина готова: {{name}}",
|
|
|
+ plateReadyLabel: "Пластини готові до очищення",
|
|
|
+ plateClearAction: "Очистити",
|
|
|
+ plateClearedToast: "Друкарська пластина позначена як очищена",
|
|
|
+ plateClearFailed: "Не вдалося позначити пластину як очищену",
|
|
|
+ },
|
|
|
+ modal: {
|
|
|
+ spoolDetected: "Виявлено котушку",
|
|
|
+ assignToAms: "Призначити AMS",
|
|
|
+ syncWeight: "Синхронізувати вагу",
|
|
|
+ weightSynced: "Синхронізовано!",
|
|
|
+ syncing: "Синхронізація...",
|
|
|
+ newTagDetected: "Виявлено новий тег",
|
|
|
+ addToInventory: "Додати в інвентар",
|
|
|
+ assignToAmsTitle: "Призначити AMS",
|
|
|
+ selectSlot: "Вибрати слот",
|
|
|
+ assign: "Призначити",
|
|
|
+ assigning: "Призначення...",
|
|
|
+ assignSuccess: "Призначено!",
|
|
|
+ assignPendingInsert: "Призначений. Слот буде налаштовано, коли ви вставите котушку.",
|
|
|
+ assignError: "Не вдалося призначити котушку. Спробуйте ще раз.",
|
|
|
+ noPrinterSelected: "Виберіть принтер...",
|
|
|
+ noAmsDetected: "AMS не виявлено на цьому принтері",
|
|
|
+ slot: "Слот",
|
|
|
+ },
|
|
|
+ weight: {
|
|
|
+ noReading: "Немає показань",
|
|
|
+ stable: "Стабільно",
|
|
|
+ measuring: "Вимірювання…",
|
|
|
+ tare: "Тарувати",
|
|
|
+ calibrate: "Відкалібрувати",
|
|
|
+ },
|
|
|
+ spool: {
|
|
|
+ remaining: "Залишилося",
|
|
|
+ material: "матеріал",
|
|
|
+ brand: "Бренд",
|
|
|
+ color: "Колір",
|
|
|
+ coreWeight: "Сердечник",
|
|
|
+ labelWeight: "Етикетка",
|
|
|
+ scaleWeight: "Показання ваг",
|
|
|
+ netWeight: "Нетто",
|
|
|
+ lastUsed: "Останнє використання",
|
|
|
+ },
|
|
|
+ ams: {
|
|
|
+ noData: "AMS не виявлено",
|
|
|
+ connectAms: "Підключіть AMS, щоб побачити слоти для філаментів",
|
|
|
+ noPrinter: "Принтер не вибрано",
|
|
|
+ selectPrinter: "Виберіть принтер у верхній панелі",
|
|
|
+ printerDisconnected: "Принтер відключений",
|
|
|
+ humidity: "Вологість",
|
|
|
+ level: "Рівень",
|
|
|
+ active: "Активний",
|
|
|
+ slot: "Слот",
|
|
|
+ empty: "Порожній",
|
|
|
+ },
|
|
|
+ inventory: {
|
|
|
+ search: "Пошук котушок...",
|
|
|
+ empty: "Немає котушок в інвентарі",
|
|
|
+ noResults: "Немає відповідних котушок",
|
|
|
+ spools: "котушки",
|
|
|
+ addSpool: "Додати котушку",
|
|
|
+ },
|
|
|
+ settings: {
|
|
|
+ // Tabs
|
|
|
+ tabDevice: "пристрій",
|
|
|
+ tabDisplay: "Дисплей",
|
|
|
+ tabScale: "Ваги",
|
|
|
+ tabUpdates: "Оновлення",
|
|
|
+ // Device tab
|
|
|
+ nfcReader: "NFC Читач",
|
|
|
+ type: "Тип",
|
|
|
+ connection: "Підключення",
|
|
|
+ notConnected: "Н/Д",
|
|
|
+ deviceInfo: "Інформація про пристрій",
|
|
|
+ hostname: "Хост",
|
|
|
+ uptime: "Час роботи",
|
|
|
+ systemConfig: "Серверна частина та автентифікація",
|
|
|
+ backendUrl: "Bambuddy Сервер URL",
|
|
|
+ apiToken: "API Токен",
|
|
|
+ apiTokenPlaceholder: "Введіть API-токен.",
|
|
|
+ saveConfig: "Зберегти конфігурацію",
|
|
|
+ systemQueued: "Конфігурацію в черзі.",
|
|
|
+ nfcDiagnostic: "NFC Діагностика",
|
|
|
+ scaleDiagnostic: "Діагностика ваг",
|
|
|
+ readTagDiagnostic: "Прочитайте діагностику тегів",
|
|
|
+ testNfc: "Тестовий читач",
|
|
|
+ testScale: "Перевірити точність",
|
|
|
+ testReadTag: "Прочитати тег",
|
|
|
+ systemFieldsRequired: "Потрібен бекенд URL.",
|
|
|
+ // Display tab
|
|
|
+ brightness: "Яскравість",
|
|
|
+ saved: "Збережено",
|
|
|
+ noBacklight: "Підсвічування DSI не виявлено. Для керування яскравістю потрібен дисплей DSI.",
|
|
|
+ screenBlank: "Час очікування порожнього екрана",
|
|
|
+ screenBlankDesc: "Екран вимикається після бездіяльності. Торкніться, щоб розбудити.",
|
|
|
+ displayNote: "Яскравість використовується як програмний фільтр.",
|
|
|
+ // Scale tab
|
|
|
+ scaleCalibration: "Калібрування ваг",
|
|
|
+ currentWeight: "Поточна вага",
|
|
|
+ tareOffset: "Зміщення тари",
|
|
|
+ calFactor: "Коефіцієнт калібрування",
|
|
|
+ knownWeight: "Відома маса",
|
|
|
+ calStep1: "Приберіть усі предмети з ваг і натисніть «Установити нуль».",
|
|
|
+ calStep2: "Покладіть на ваги предмет відомої маси.",
|
|
|
+ setZero: "Встановити нуль",
|
|
|
+ calibrateNow: "Відкалібрувати",
|
|
|
+ calibrated: "Відкалібровано",
|
|
|
+ tareSet: "Надіслано команду тарування. Очікування пристрою...",
|
|
|
+ tareComplete: "Тарування завершено!",
|
|
|
+ tareTimedOut: "Час очікування тарування минув — чи запущено демон SpoolBuddy?",
|
|
|
+ tareFailed: "Не вдалося надіслати команду тарування",
|
|
|
+ zeroSet: "Нульову точку встановлено. Покладіть на ваги предмет відомої маси.",
|
|
|
+ calibrationDone: "Калібрування завершено!",
|
|
|
+ calibrationFailed: "Помилка калібрування",
|
|
|
+ lastCalibrated: "Останнє калібрування",
|
|
|
+ stable: "Стабільно",
|
|
|
+ settling: "Стабілізація…",
|
|
|
+ firmware: "Прошивка",
|
|
|
+ scale: "Ваги",
|
|
|
+ noDevice: "Пристрій SpoolBuddy не знайдено",
|
|
|
+ // Updates tab
|
|
|
+ daemonVersion: "Демон версія",
|
|
|
+ currentVersion: "поточний",
|
|
|
+ versionPending: "В очікуванні демона...",
|
|
|
+ checking: "Перевірка...",
|
|
|
+ checkUpdates: "Перевірте наявність оновлень",
|
|
|
+ updateAvailable: "Доступне оновлення",
|
|
|
+ updateInstructions: "Оновлення через SSH: запустіть сценарій встановлення SpoolBuddy для оновлення.",
|
|
|
+ upToDate: "В актуальному стані",
|
|
|
+ includeBeta: "Включати бета-версії",
|
|
|
+ },
|
|
|
+ writeTag: {
|
|
|
+ tabExisting: "Наявна котушка",
|
|
|
+ tabNew: "Нова котушка",
|
|
|
+ tabReplace: "Замінити тег",
|
|
|
+ searchPlaceholder: "Пошук за матеріалом, кольором, брендом...",
|
|
|
+ noUntaggedSpools: "Немає котушок без тегів",
|
|
|
+ noTaggedSpools: "Немає котушок із тегами",
|
|
|
+ selectSpool: "Виберіть котушку, а потім помістіть порожній NTAG на зчитувач",
|
|
|
+ placeTag: "Помістіть NTAG на зчитувач",
|
|
|
+ tagReady: "Тег виявлено — готовий до запису",
|
|
|
+ writeTag: "Записати тег",
|
|
|
+ replaceTag: "Замінити тег",
|
|
|
+ writing: "Записування тегу…",
|
|
|
+ waiting: "Очікування SpoolBuddy...",
|
|
|
+ writeSuccess: "Тег успішно записано!",
|
|
|
+ writeFailed: "Помилка запису",
|
|
|
+ queueFailed: "Не вдалося поставити команду запису в чергу",
|
|
|
+ tryAgain: "Спробуйте знову",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ replaceWarning: "Старий тег буде від’єднано від котушки, а замість нього буде прив’язано новий.",
|
|
|
+ deviceOffline: "SpoolBuddy не в мережі",
|
|
|
+ material: "матеріал",
|
|
|
+ colorName: "Назва кольору",
|
|
|
+ color: "Колір",
|
|
|
+ brand: "Бренд",
|
|
|
+ weight: "Вага (г)",
|
|
|
+ createSpool: "Створити котушку",
|
|
|
+ creating: "Створення...",
|
|
|
+ spoolCreated: "Котушку створено! Можна записувати тег.",
|
|
|
+ createFailed: "Не вдалося створити котушку",
|
|
|
+ incompleteDataWarning: "Тег записано з неповними даними Spoolman.",
|
|
|
+ },
|
|
|
+ quickMenu: {
|
|
|
+ printerPower: "Живлення принтера",
|
|
|
+ systemControls: "система",
|
|
|
+ restartDaemon: "Перезапустити демон",
|
|
|
+ restartBrowser: "Перезапустити браузер",
|
|
|
+ reboot: "Перезавантажити",
|
|
|
+ shutdown: "Вимкнути",
|
|
|
+ swipeToClose: "Проведіть пальцем вниз, щоб закрити",
|
|
|
+ confirmTitle: "Підтвердити",
|
|
|
+ confirmShutdown: "Вимкнути SpoolBuddy? Щоб увімкнути його знову, знадобиться фізичний доступ до пристрою.",
|
|
|
+ confirmReboot: "Перезавантажити SpoolBuddy?",
|
|
|
+ confirmRestartDaemon: "Перезапустити демон SpoolBuddy? NFC і ваги будуть тимчасово недоступні.",
|
|
|
+ confirmRestartBrowser: "Перезапустити веб-переглядач кіоску? Дисплей на короткий час погасне.",
|
|
|
+ confirm: "Підтвердити",
|
|
|
+ confirmPlugOn: "Увімкнути {{name}}?",
|
|
|
+ confirmPlugOff: "Вимкнути {{name}}?",
|
|
|
+ turnOn: "Увімкнути",
|
|
|
+ turnOff: "Вимкнути",
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ diagnostic: {
|
|
|
+ modalTitle: "Діагностика підключення — {{name}}",
|
|
|
+ running: "Виконується діагностика...",
|
|
|
+ runningElapsed: "Виконується діагностика… ({{elapsed}} с)",
|
|
|
+ waitingForReportHint: "Очікуємо, доки принтер опублікує звіт про стан — це може тривати до {{max}} с.",
|
|
|
+ runFailed: "Не вдалося запустити діагностику: {{error}}",
|
|
|
+ retry: "Запустити знову",
|
|
|
+ runButton: "Запустити діагностику",
|
|
|
+ sectionTitle: "Діагностика підключення",
|
|
|
+ sectionDescription: "Перевірте, чому принтер не підключається або не друкує — доступність порту, режим розробника LAN, режим мережі Docker та облікові дані.",
|
|
|
+ noPrinters: "Принтери не налаштовані.",
|
|
|
+ overall: {
|
|
|
+ ok: "Проблем не виявлено — з’єднання принтера справне.",
|
|
|
+ warnings: "Принтер має працювати, але деякі параметри потребують уваги.",
|
|
|
+ problems: "Знайдено проблеми, які пояснюють, чому принтер не підключається або не друкує.",
|
|
|
+ },
|
|
|
+ check: {
|
|
|
+ port_mqtt: {
|
|
|
+ title: "Порт керування (MQTT 8883)",
|
|
|
+ pass: "Доступний — принтер приймає керівні з’єднання.",
|
|
|
+ fail: "Порт 8883 недоступний. Принтер може бути вимкнений, мати іншу IP-адресу або бути заблокований брандмауером. Перевірте IP-адресу принтера й переконайтеся, що порт 8883 не заблоковано.",
|
|
|
+ },
|
|
|
+ port_ftps: {
|
|
|
+ title: "Порт передачі файлів (FTPS 990)",
|
|
|
+ pass: "Доступний — файли друку можна буде надсилати.",
|
|
|
+ warn: "Порт 990 недоступний. Моніторинг може й надалі працювати, але надсилання завдань друку на принтер завершуватиметься помилкою. Переконайтеся, що порт 990 не заблоковано.",
|
|
|
+ },
|
|
|
+ external_storage: {
|
|
|
+ title: "Зберігання надісланих файлів у зовнішньому сховищі (крок установлення 4)",
|
|
|
+ pass: "Принтер повідомляє, що цю опцію ввімкнено — надіслані файли зберігатимуться на картці SD, а архіви матимуть мініатюри та метадані слайсера.",
|
|
|
+ fail: "Принтер повідомляє, що цей параметр вимкнено. Увімкніть «Зберігати надіслані файли в зовнішньому сховищі». У новіших версіях прошивки (P2S 01.02 / Bambu Studio 2.6+) перемикач розташований у налаштуваннях друку на принтері; у старіших — на вкладці «Пристрій» у Bambu Studio або OrcaSlicer. Без цього параметра в кожному архівованому друці будуть відсутні мініатюра та метадані слайсера.",
|
|
|
+ skip: "Не перевірено — потрібне активне MQTT-з’єднання. У старіших слайсерах, де цей параметр існує лише в самому слайсері, принтер його не повідомляє. Тому перевірка може бути успішною навіть за вимкненого параметра — перевірте крок установлення 4 вручну.",
|
|
|
+ skip_unsupported_model: "Ця модель має слот для SD-картки, але не дає змоги ввімкнути цей параметр: поточна прошивка принтерів серії P1 не показує перемикач у Bambu Studio, а сам принтер не має екрана. Виправляти нічого не потрібно; доки Bambu Lab не додасть підтримку в прошивці, в архівованих друках можуть бути відсутні мініатюри та метадані слайсера.",
|
|
|
+ },
|
|
|
+ port_rtsps: {
|
|
|
+ title: "Порт камери ({{protocol}} {{port}})",
|
|
|
+ pass: "Доступно — потік камери працюватиме.",
|
|
|
+ warn: "Порт {{port}} недоступний. Перегляд з камери в реальному часі не працюватиме. Це не впливає на друк.",
|
|
|
+ },
|
|
|
+ network_mode: {
|
|
|
+ title: "Мережевий режим Docker",
|
|
|
+ pass: "Працює в режимі хост-мережі.",
|
|
|
+ warn: "Bambuddy працює в мостовому мережевому режимі Docker. Для виявлення принтерів і роботи віртуального принтера потрібен режим мережі хоста — повторно створіть контейнер із параметром \"network_mode: host\".",
|
|
|
+ skip: "Не працює в Docker — не застосовується.",
|
|
|
+ },
|
|
|
+ subnet: {
|
|
|
+ title: "Мережева підмережа",
|
|
|
+ pass: "Принтер і Bambuddy знаходяться в одній підмережі.",
|
|
|
+ warn: "Принтер ({{printer_ip}}) і Bambuddy ({{host_ip}}) перебувають у різних підмережах. Вони можуть не мати зв’язку між собою, якщо маршрутизацію між підмережами не налаштовано.",
|
|
|
+ skip: "Не вдалося визначити підмережу — пропущено.",
|
|
|
+ },
|
|
|
+ mqtt_auth: {
|
|
|
+ title: "Облікові дані принтера",
|
|
|
+ pass: "Принтер прийняв підключення.",
|
|
|
+ fail: "Принтер доступний, але Bambuddy до нього не під’єднано. Найімовірніше, указано неправильний код доступу або серійний номер — код доступу змінюється після кожного перемикання режиму «Лише LAN» або режиму розробника, тож знову скопіюйте його з екрана принтера. Так само виглядає принтер, який перезавантажується або вже вичерпав ліміт одночасних з’єднань.",
|
|
|
+ fail_auth_rejected: "Принтер відхилив облікові дані Bambuddy. Код доступу або серійний номер неправильний — код доступу змінюється після кожного перемикання режиму «Лише LAN» або режиму розробника. Знову скопіюйте його з екрана принтера та збережіть у налаштуваннях принтера.",
|
|
|
+ skip: "Не позначено — принтер недоступний.",
|
|
|
+ },
|
|
|
+ developer_mode: {
|
|
|
+ title: "Режим розробника LAN",
|
|
|
+ pass: "Режим розробника ввімкнено.",
|
|
|
+ fail: "Режим розробника на принтері ВИМКНЕНО. Увімкніть його в налаштуваннях LAN принтера й підтвердьте вибір кнопкою OK. Без цього друк не запускатиметься.",
|
|
|
+ skip: "Неможливо перевірити — потрібне живе підключення до принтера.",
|
|
|
+ },
|
|
|
+ printer_publishing: {
|
|
|
+ title: "Принтер публікує дані про стан",
|
|
|
+ pass: "Принтер публікує оновлення статусу — AMS, філаменти та K-профілі правильно відображатимуться на слайсері.",
|
|
|
+ fail: "MQTT-брокер прийняв з’єднання, але принтер не опублікував жодного звіту про стан. Майже завжди причиною є неправильний серійний номер або неправильний регістр символів: тема device/<serial>/report чутлива до регістру. Звірте серійний номер у налаштуваннях Bambuddy із номером на екрані принтера.",
|
|
|
+ skip: "Неможливо перевірити — потрібне живе підключення до принтера.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ systemHealth: {
|
|
|
+ sectionTitle: "Стан системи",
|
|
|
+ sectionDescription: "Сканує останні журнали на наявність відомих проблем, які зазвичай можна вирішити самостійно, перш ніж вони перетворяться на запит у службу підтримки.",
|
|
|
+ rescan: "Пересканувати",
|
|
|
+ clean: "В останніх записах журналу {{times}} не знайдено відомих проблем.",
|
|
|
+ logUnavailable: "Журналування файлів вимкнено, тому журнали неможливо сканувати. Увімкніть журналювання файлів, щоб використовувати цю перевірку.",
|
|
|
+ learnMore: "Як виправити",
|
|
|
+ fixLabel: "Виправити:",
|
|
|
+ occurrences: "Виявлено {{times}} разів — востаннє о {{lastSeen}}",
|
|
|
+ category: {
|
|
|
+ layer8: "Ви можете це виправити",
|
|
|
+ environment: "Середовище виконання",
|
|
|
+ bug: "Будь ласка, повідомте про це",
|
|
|
+ },
|
|
|
+ signature: {
|
|
|
+ 'ftp-auth-rejected': {
|
|
|
+ name: "Принтер відхилив код доступу",
|
|
|
+ cause: "Принтер відмовився від входу для передавання файлів. Код доступу неправильний або він змінився після перемикання режиму розробника.",
|
|
|
+ fix: "Повторно скопіюйте код доступу з екрана принтера (налаштування LAN) і оновіть його в налаштуваннях принтера в Bambuddy.",
|
|
|
+ },
|
|
|
+ 'ftp-connection-timeout': {
|
|
|
+ name: "Час очікування з’єднання для передачі файлів минув",
|
|
|
+ cause: "Bambuddy не вдалося отримати доступ до порту передачі файлів принтера (FTPS 990). Порт заблоковано, або принтер вимкнено або знаходиться в іншій підмережі.",
|
|
|
+ fix: "Переконайтеся, що ніщо не блокує порт 990 між Bambuddy і принтером, і що обидва знаходяться в одній мережі.",
|
|
|
+ },
|
|
|
+ 'ftp-ssl-error': {
|
|
|
+ name: "Помилка захищеного з’єднання для передавання файлів",
|
|
|
+ cause: "Не вдалося виконати TLS-узгодження із сервером передавання файлів принтера. Частою причиною є брандмауер або застаріла прошивка принтера.",
|
|
|
+ fix: "Оновіть прошивку принтера та переконайтеся, що брандмауер або проксі-сервер не перехоплюють з’єднання через порт 990.",
|
|
|
+ },
|
|
|
+ 'mqtt-connection-flapping': {
|
|
|
+ name: "Підключення до принтера постійно падає",
|
|
|
+ cause: "Керуюче з’єднання (MQTT 8883) неодноразово роз’єднується та знову під’єднується — зазвичай через слабкий мережевий шлях або частково заблокований порт.",
|
|
|
+ fix: "Перевірте сигнал Wi-Fi на принтері, віддайте перевагу дротовому підключенню та переконайтеся, що порт 8883 надійно доступний.",
|
|
|
+ },
|
|
|
+ 'camera-connection-refused': {
|
|
|
+ name: "Потік з камери недоступний",
|
|
|
+ cause: "Не вдається отримати доступ до камери в прямому ефірі через порт RTSPS 322. Порт заблоковано, або на принтері вимкнено камеру або LAN liveview.",
|
|
|
+ fix: "Увімкніть камеру та LAN liveview на принтері та переконайтеся, що порт 322 не заблоковано. Це не впливає на друк.",
|
|
|
+ },
|
|
|
+ 'database-locked': {
|
|
|
+ name: "Конфлікт запису до бази даних",
|
|
|
+ cause: "Під навантаженням SQLite повертає помилки \"database is locked\". Це часто трапляється, коли одночасно працюють кілька принтерів.",
|
|
|
+ fix: "Переключіть Bambuddy на зовнішню базу даних PostgreSQL. Див. посібник PostgreSQL у документації.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ vpDiagnostic: {
|
|
|
+ title: "Перевірка налаштувань — {{name}}",
|
|
|
+ runButton: "Запустити перевірку налаштувань",
|
|
|
+ running: "Виконується перевірка налаштувань...",
|
|
|
+ runFailed: "Не вдалося виконати перевірку налаштувань: {{error}}",
|
|
|
+ retry: "Запустити знову",
|
|
|
+ overall: {
|
|
|
+ ok: "Усі перевірки пройшли — цей віртуальний принтер налаштовано правильно.",
|
|
|
+ warnings: "Віртуальний принтер має працювати, але деякі параметри потребують уваги.",
|
|
|
+ problems: "Знайдено проблеми, які пояснюють, чому слайсер не бачить або не використовує цей віртуальний принтер.",
|
|
|
+ },
|
|
|
+ check: {
|
|
|
+ enabled: {
|
|
|
+ title: "Віртуальний принтер увімкнено",
|
|
|
+ fail: "Цей віртуальний принтер вимкнено. Увімкніть його, щоб зробити його видимим.",
|
|
|
+ },
|
|
|
+ running: {
|
|
|
+ title: "Служби запущені",
|
|
|
+ fail: "Віртуальний принтер увімкнено, але його служби не працюють. Перевірте журнал Bambuddy — зазвичай запуску заважає конфлікт IP-адреси прив’язки або помилка дозволів.",
|
|
|
+ },
|
|
|
+ bind_interface: {
|
|
|
+ title: "Прив’язка мережевого інтерфейсу",
|
|
|
+ fail: "Інтерфейс прив’язки не встановлено або більше не існує на цьому хості. Виберіть поточний інтерфейс у спадному списку «Інтерфейс прив’язки».",
|
|
|
+ },
|
|
|
+ access_code: {
|
|
|
+ title: "Код доступу встановлено",
|
|
|
+ fail: "Код доступу не встановлено. У слайсері потрібно вказати той самий 8-символьний код доступу, який задано тут.",
|
|
|
+ },
|
|
|
+ target_printer: {
|
|
|
+ title: "Цільовий принтер",
|
|
|
+ fail: "Цільовий принтер не вибрано. У режимі проксі потрібен фізичний принтер, якому пересилатимуться завдання.",
|
|
|
+ warn: "Цільовий принтер наразі не в мережі — проксі-сервер відновиться після повторного підключення.",
|
|
|
+ },
|
|
|
+ port_ftps: {
|
|
|
+ title: "Служба вивантаження файлів (порт {{port}})",
|
|
|
+ fail: "На порту {{port}} IP-адреси прив’язки немає служби, що приймає з’єднання, тому слайсер не може вивантажити файли. Зазвичай причиною є конфлікт порту на цьому інтерфейсі.",
|
|
|
+ },
|
|
|
+ port_mqtt: {
|
|
|
+ title: "Служба керування (порт {{port}})",
|
|
|
+ fail: "На порту {{port}} IP-адреси прив’язки немає служби, що приймає з’єднання, тому слайсер не може підключитися або показати стан.",
|
|
|
+ },
|
|
|
+ port_bind: {
|
|
|
+ title: "Служба виявлення (порт {{port}})",
|
|
|
+ fail: "На порту {{port}} IP-адреси прив’язки немає служби, що приймає з’єднання, тому слайсер не може завершити процедуру виявлення.",
|
|
|
+ },
|
|
|
+ certificate: {
|
|
|
+ title: "Сертифікат TLS",
|
|
|
+ pass: "Сертифікат готовий. Переконайтеся, що наведений вище сертифікат центру сертифікації Bambuddy імпортовано до сховища довірених сертифікатів слайсера.",
|
|
|
+ fail: "Сертифікат TLS для цього віртуального принтера відсутній. Перевірте, чи доступний для запису каталог даних Bambuddy.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ bugReport: {
|
|
|
+ title: "Повідомити про помилку",
|
|
|
+ description: "опис",
|
|
|
+ descriptionPlaceholder: "Що пішло не так? Будь ласка, опишіть проблему...",
|
|
|
+ email: "Електронна адреса (необов’язково)",
|
|
|
+ emailPlaceholder: "your@email.com",
|
|
|
+ emailPrivacy: "Якщо надано, вашу електронну адресу буде включено до згорнутого розділу проблеми GitHub, щоб спеціаліст із супроводу міг відслідковувати.",
|
|
|
+ screenshot: "Скріншот",
|
|
|
+ uploadOrPaste: "Вивантажити, вставити або перетягнути зображення",
|
|
|
+ dataCollectedSummary: "Які дані містяться у звіті?",
|
|
|
+ dataIncluded: "У комплекті:",
|
|
|
+ dataIncludedList: "Версія додатка, OS, архітектура, версія Python, статистика бази даних (лише для підрахунку), моделі принтерів, кількість сопел, версії прошивки, статус підключення, статус інтеграції (Spoolman, MQTT, HA), неконфіденційні налаштування, кількість мережевих інтерфейсів, Docker деталі, версії залежностей.",
|
|
|
+ dataNeverIncluded: "Ніколи не додаються:",
|
|
|
+ dataNeverIncludedList: "Назви принтерів, серійні номери, коди доступу, паролі, IP-адреси, адреси електронної пошти, ключі API, токени, URL вебхуків, імена хостів або користувачів.",
|
|
|
+ submit: "Надіслати",
|
|
|
+ startLogging: "Розпочати журнал налагодження",
|
|
|
+ stepEnableLogging: "Журнал налагодження ввімкнено",
|
|
|
+ stepReproduce: "Відтворіть проблему зараз",
|
|
|
+ stepStopLogging: "Зупинити та подати звіт",
|
|
|
+ stopAndSubmit: "Зупинити та надіслати",
|
|
|
+ maxDuration: "Автоматична зупинка через {{minutes}} хв",
|
|
|
+ stoppingLogs: "Збір журналів і надсилання...",
|
|
|
+ submitting: "Надсилання звіту про помилку...",
|
|
|
+ submittingStepConnection: "Запуск перевірки підключення принтера",
|
|
|
+ submittingStepVirtualPrinters: "Виконання перевірок налаштування віртуального принтера",
|
|
|
+ submittingStepLogScan: "Сканування останніх журналів на наявність відомих проблем",
|
|
|
+ submittingStepSubmit: "Надсилання звіту GitHub",
|
|
|
+ submitSuccess: "Звіт про помилку успішно надіслано!",
|
|
|
+ submitFailed: "Не вдалося надіслати звіт про помилку",
|
|
|
+ diagnosticChecking: "Перевірка підключень принтера...",
|
|
|
+ diagnosticHealthy: "Перевірку підключення пройдено — проблем із принтерами не виявлено.",
|
|
|
+ diagnosticSummary: "Проблеми з підключенням мають {{problems}} із {{total}} принтерів",
|
|
|
+ diagnosticIntro: "Один або кілька принтерів мають проблему з підключенням, яка може спричиняти описану несправність. Розгорніть запис принтера нижче, щоб переглянути спосіб виправлення. Усунення цієї проблеми може допомогти без створення звіту про помилку, але за потреби звіт усе одно можна надіслати нижче.",
|
|
|
+ logHealthSummary: "У ваших журналах знайдено відомі проблеми",
|
|
|
+ logHealthIntro: "Останні журнали відповідають відомим проблемам. Перегляньте наведені нижче виправлення — їх вирішення може вирішити вашу проблему без повідомлення про помилку. Ви все ще можете надіслати звіт нижче.",
|
|
|
+ thankYou: "дякую!",
|
|
|
+ submitted: "Ваш звіт про помилку надіслано.",
|
|
|
+ viewIssue: "Переглянути випуск",
|
|
|
+ unexpectedError: "Сталася неочікувана помилка",
|
|
|
+ },
|
|
|
+ failureDetection: {
|
|
|
+ title: "Виявлення помилок за допомогою ШІ",
|
|
|
+ description: "Відстежуйте друк за допомогою самостійно розгорнутого Obico ML API та автоматично реагуйте на виявлені помилки.",
|
|
|
+ mlUrl: "URL Obico ML API",
|
|
|
+ mlUrlHint: "База URL вашого контейнера ml_api, розміщеного на власному хості Obico (наприклад, http://192.168.1.10:3333).",
|
|
|
+ test: "Тест",
|
|
|
+ testSuccess: "ML API доступний і працює належним чином.",
|
|
|
+ testFailed: "Не вдалося підключитися до ML API.",
|
|
|
+ sensitivity: "Чутливість",
|
|
|
+ sensitivityLow: "Низький (менше помилкових спрацьовувань)",
|
|
|
+ sensitivityMedium: "Середній (збалансований)",
|
|
|
+ sensitivityHigh: "Високий (виявляти рано, більше помилкових спрацьовувань)",
|
|
|
+ sensitivityHint: "Налаштовує пороги впевненості, за яких формуються попередження та фіксуються помилки.",
|
|
|
+ action: "Дія в разі виявлення помилки",
|
|
|
+ actionNotify: "Лише сповіщати",
|
|
|
+ actionPause: "Призупинити друк",
|
|
|
+ actionPauseOff: "Призупинити друк і вимкнути живлення",
|
|
|
+ pollInterval: "Інтервал опитування (секунди)",
|
|
|
+ pollIntervalHint: "Як часто перевіряти кожен принтер під час друку. Мінімум 5 с, максимум 120 с.",
|
|
|
+ externalUrlMissing: "Зовнішній URL не встановлено.",
|
|
|
+ externalUrlHint: "ML API отримує знімок із камери за URL. Укажіть зовнішній URL у загальних налаштуваннях, щоб контейнер ML API міг підключитися до Bambuddy.",
|
|
|
+ perPrinterTitle: "Принтери під спостереженням",
|
|
|
+ perPrinterHint: "Виберіть, які принтери перевіряє служба виявлення.",
|
|
|
+ monitorAll: "Відстежувати всі підключені принтери",
|
|
|
+ statusTitle: "Статус",
|
|
|
+ serviceRunning: "Служба працює",
|
|
|
+ thresholds: "Нижній / верхній поріг",
|
|
|
+ activePrinters: "Активні завдання друку",
|
|
|
+ noActivePrints: "Зараз немає роздруківок.",
|
|
|
+ historyTitle: "Останні виявлення",
|
|
|
+ noHistory: "Виявлень ще немає.",
|
|
|
+ },
|
|
|
+
|
|
|
+ makerworld: {
|
|
|
+ title: "MakerWorld",
|
|
|
+ description: "Вставте модель MakerWorld URL, щоб імпортувати та роздрукувати її безпосередньо з Bambuddy — не виходячи з програми Bambu Handy.",
|
|
|
+ pasteUrlHeader: "Імпортувати з MakerWorld",
|
|
|
+ pasteUrlPlaceholder: "https://makerworld.com/en/models/… або вставте будь-яке посилання MakerWorld.",
|
|
|
+ resolveButton: "Розв’язати",
|
|
|
+ signInRequiredTitle: "Для завантаження потрібно увійти в Bambu Cloud",
|
|
|
+ signInRequiredBody: "Ви можете переглядати деталі моделі анонімно, але для MakerWorld потрібен обліковий запис Bambu Cloud для завантаження файлів 3MF.",
|
|
|
+ signInExpiredTitle: "Термін входу в Bambu Cloud минув",
|
|
|
+ signInExpiredBody: "Ви все ще ввійшли в Bambuddy, але Bambu Lab більше не приймає збережений токен, тому завантаження не вдасться. Знову ввійдіть у Bambu Cloud.",
|
|
|
+ openCloudSettings: "Відкрити налаштування Cloud",
|
|
|
+ untitledModel: "Модель без назви",
|
|
|
+ byCreator: "від {{name}}",
|
|
|
+ downloadsCount: "{{count}} завантажень",
|
|
|
+ licensePrefix: "Ліцензія",
|
|
|
+ alreadyImported: "Вже в бібліотеці",
|
|
|
+ openOnMakerworld: "Відкрити MakerWorld",
|
|
|
+ alreadyInLibrary: "Ця модель уже є у вашій бібліотеці — знайдіть її в Менеджері файлів → MakerWorld",
|
|
|
+ importSuccess: "Імпортовано {{filename}} — збережено в менеджері файлів → MakerWorld",
|
|
|
+ platesHeader: "Пластини ({{count}})",
|
|
|
+ plateDefaultName: "Пластина {{n}}",
|
|
|
+ materialCount: "Філаментів: {{count}}",
|
|
|
+ amsRequired: "Потрібен AMS",
|
|
|
+ slicedFor: "Нарізано для {{printer}}",
|
|
|
+ alsoCompatible: "Також позначено як сумісний: {{printers}}",
|
|
|
+ importToLibrary: "Зберегти",
|
|
|
+ sliceIn: "Зберегти й нарізати в {{slicer}}",
|
|
|
+ disclaimer: "Інтеграція MakerWorld використовує кінцеві точки API, задокументовані спільнотою. Bambuddy не є філією та не підтримується MakerWorld або Bambu Lab.",
|
|
|
+ lastImportSuccess: "Імпортовано до вашої бібліотеки",
|
|
|
+ lastImportAlreadyInLibrary: "Уже у вашій бібліотеці",
|
|
|
+ viewInLibrary: "Переглянути в менеджері файлів",
|
|
|
+ openInBambuStudio: "Відкрити в Bambu Studio",
|
|
|
+ openInOrcaSlicer: "Відкрити в OrcaSlicer",
|
|
|
+ importTo: "Імпорт до файлового менеджера",
|
|
|
+ recentImportsHeader: "Недавній імпорт",
|
|
|
+ phaseResolving: "Розв’язування",
|
|
|
+ phaseDownloading: "Завантаження",
|
|
|
+ folderAuto: "MakerWorld (за замовчуванням)",
|
|
|
+ importAll: "Імпортувати все",
|
|
|
+ importAllProgress: "Імпорт {{current}}/{{total}}",
|
|
|
+ openGallery: "Відкрити галерею зображень",
|
|
|
+ galleryPrev: "Попереднє зображення",
|
|
|
+ galleryNext: "Наступне зображення",
|
|
|
+ deleteImport: "Видалити з бібліотеки",
|
|
|
+ importDeleting: "Видалення…",
|
|
|
+ importDeleted: "Видалено з бібліотеки",
|
|
|
+ confirmDelete: "Видалити {{filename}} з бібліотеки? Локальний файл буде видалено, але цю друкарську пластину можна буде повторно імпортувати з MakerWorld.",
|
|
|
+ errors: {
|
|
|
+ resolveFailed: "Не вдалося вирішити MakerWorld URL.",
|
|
|
+ downloadFailed: "Помилка завантаження. Спробуйте ще раз.",
|
|
|
+ deleteFailed: "Не вдалося видалити файл із бібліотеки.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ gcodeViewer: {
|
|
|
+ back: "Назад",
|
|
|
+ backToArchives: "Назад до друку архівів",
|
|
|
+ backToFiles: "Назад до файлового менеджера",
|
|
|
+ },
|
|
|
+ libraryTrash: {
|
|
|
+ title: "Кошик",
|
|
|
+ headerButton: "Кошик",
|
|
|
+ headerTooltip: "Переглянути файли, переміщені в кошик",
|
|
|
+ backToFiles: "Назад до файлового менеджера",
|
|
|
+ subtitleAdmin: "Видалені файли залишаються тут протягом {{days}} днів, а потім автоматично видаляються. У цьому режимі перегляду відображаються файли, видалені в кошик для всіх користувачів.",
|
|
|
+ subtitleUser: "Видалені файли залишаються тут протягом {{days}} днів, а потім автоматично видаляються.",
|
|
|
+ loading: "Завантаження кошика…",
|
|
|
+ loadError: "Не вдалося завантажити кошик.",
|
|
|
+ empty: "Кошик порожній.",
|
|
|
+ summary: "Файлів: {{count}} · {{size}}",
|
|
|
+ emptyTrash: "Очистити кошик",
|
|
|
+ restore: "Відновити",
|
|
|
+ purgeNow: "Видалити зараз",
|
|
|
+ autoPurgeIn: "Автоматичне видалення через {{when}}",
|
|
|
+ days: "днів",
|
|
|
+ retentionLabel: "Автоматичне видалення після",
|
|
|
+ selectAll: "Вибрати все",
|
|
|
+ selectOne: "Вибрати {{filename}}",
|
|
|
+ selectionCount: "Вибрано {{count}}.",
|
|
|
+ bulkRestore: "Відновити вибране",
|
|
|
+ bulkPurge: "Видалити вибране",
|
|
|
+ col: {
|
|
|
+ filename: "Файл",
|
|
|
+ folder: "Папка",
|
|
|
+ size: "Розмір",
|
|
|
+ deleted: "Переміщено в кошик",
|
|
|
+ autoPurge: "Автоматичне видалення",
|
|
|
+ owner: "Власник",
|
|
|
+ actions: "Дії",
|
|
|
+ },
|
|
|
+ confirm: {
|
|
|
+ purgeTitle: "Видалити остаточно?",
|
|
|
+ purgeBody: "{{filename}} буде видалено з диска та не підлягає відновленню.",
|
|
|
+ emptyTitle: "Очистити кошик?",
|
|
|
+ emptyBody: "З диска буде остаточно видалено всі файли ({{count}}). Цю дію неможливо скасувати.",
|
|
|
+ bulkPurgeTitle: "Видалити вибрані файли назавжди?",
|
|
|
+ bulkPurgeBody: "Вибрані файли ({{count}}) буде видалено з диска без можливості відновлення.",
|
|
|
+ cta: "Видалити остаточно",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ restored: "Файл відновлено.",
|
|
|
+ restoreFailed: "Не вдалося відновити файл.",
|
|
|
+ purged: "Файл видалено остаточно.",
|
|
|
+ purgeFailed: "Не вдалося видалити файл.",
|
|
|
+ emptied: "Файлів остаточно видалено з кошика: {{count}}.",
|
|
|
+ emptyFailed: "Не вдалося очистити кошик.",
|
|
|
+ retentionSaved: "Для автоматичного видалення встановлено {{days}} днів.",
|
|
|
+ retentionFailed: "Не вдалося зберегти налаштування збереження.",
|
|
|
+ bulkRestored: "Відновлено файлів: {{count}}",
|
|
|
+ bulkPurged: "Файлів остаточно видалено: {{count}}.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ libraryPurge: {
|
|
|
+ title: "Очистити старі файли",
|
|
|
+ headerButton: "Очищення старого",
|
|
|
+ headerTooltip: "Масове переміщення старих файлів у кошик",
|
|
|
+ description: "Однією дією перемістіть старі файли з бібліотеки до кошика. Вік файлів з історією друку визначається за датою останнього друку, а файлів, які ще не друкувалися, — за датою вивантаження.",
|
|
|
+ ageLabel: "Перемістити файли, старші за",
|
|
|
+ days: "днів",
|
|
|
+ includeNeverPrinted: "Включати файли, які ніколи не друкувались",
|
|
|
+ effectsTitle: "Що відбудеться після натискання «Очистити»",
|
|
|
+ effect1: "Відповідні файли переміщуються в кошик — вони ще не видалені з диска.",
|
|
|
+ effect2: "Ви можете будь-коли відновити їх із кошика, доки не закінчиться період зберігання.",
|
|
|
+ effect3: "Після завершення строку зберігання служба очищення кошика остаточно видалить файли з диска.",
|
|
|
+ effect4: "Файли у зовнішніх (зв’язаних) папках пропускаються — Bambuddy ніколи не видаляє байти, які йому не належать.",
|
|
|
+ previewLoading: "Перевірка кількості файлів…",
|
|
|
+ previewFailed: "Не вдалося попередньо переглянути очищення.",
|
|
|
+ previewSummary: "Файли {{count}} · {{size}} буде переміщено до кошика",
|
|
|
+ andMore: "…і {{count}} більше",
|
|
|
+ warning: "Файли в кошику й надалі займають місце, доки не завершиться строк зберігання. Щоб звільнити місце на диску негайно, після цього очистьте кошик.",
|
|
|
+ confirmCta: "Перемістити до кошика ({{count}})",
|
|
|
+ purging: "Переміщення в кошик…",
|
|
|
+ toast: {
|
|
|
+ success: "Переміщено до кошика файлів: {{count}}",
|
|
|
+ failed: "Не вдалося очистити файли.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ libraryAutoPurge: {
|
|
|
+ enableLabel: "Автоматичне очищення старих файлів",
|
|
|
+ enableDescription: "Запускає очищення адміністратора один раз на день. Файли спочатку потрапляють у кошик — вони не видаляються одразу.",
|
|
|
+ ageLabel: "Автоматичне очищення файлів, старших за",
|
|
|
+ ageDescription: "Мінімум 7 днів, максимум 10 років. Використовує те саме вікове правило, що й ручна кнопка очищення.",
|
|
|
+ days: "днів",
|
|
|
+ includeNeverPrinted: "Включати файли, які ніколи не друкувались",
|
|
|
+ saveFailed: "Не вдалося зберегти налаштування автоматичного очищення.",
|
|
|
+ },
|
|
|
+ archivePurge: {
|
|
|
+ headerButton: "Очищення старого",
|
|
|
+ headerTooltip: "Масове видалення старих архівів",
|
|
|
+ title: "Очистити старі архіви",
|
|
|
+ description: "Очистити стару історію друку. Кожен архів старіє відповідно до останнього завершення друку — повторний друк архіву оновлює його вік, тому активна робота ніколи не очищається.",
|
|
|
+ ageLabel: "Видалити архіви, не надруковані в останньому",
|
|
|
+ days: "днів",
|
|
|
+ effectsTitle: "Що відбудеться після натискання «Очистити»",
|
|
|
+ effect1: "Кожен відповідний архів приховано зі списків, а його файли видалено з диска (3MF, ескіз, покадрова зйомка, вихідний 3MF, F3D файл дизайну, фотографії).",
|
|
|
+ effect2: "Запис архіву залишиться в базі даних, тому «Швидка статистика» й надалі враховуватиме філамент, час, вартість та енергію — як і за типового видалення окремого архіву.",
|
|
|
+ effect3: "Позначте нижче «Також видалити зі статистики», щоб вилучити внесок цих архівів зі «Швидкої статистики» — так само, як у відповідній опції видалення окремого архіву. Цю дію неможливо скасувати.",
|
|
|
+ effect4: "Повторний друк архіву оновлює його віковий годинник, тому архіви, якими ви все ще користуєтеся, залишаються в безпеці.",
|
|
|
+ purgeStatsLabel: "Також видалити зі статистики",
|
|
|
+ purgeStatsHint: "Вилучає внесок відповідних архівів зі «Швидкої статистики» — філамент, час, вартість та енергію. Якщо параметр вимкнено, статистичні дані зберігаються, а з диска видаляються лише файли.",
|
|
|
+ previewLoading: "Перевірка кількості архівів, що збігаються…",
|
|
|
+ previewFailed: "Не вдалося попередньо переглянути очищення.",
|
|
|
+ previewSummary: "Архіви {{count}} · {{size}} буде видалено",
|
|
|
+ andMore: "…і {{count}} більше",
|
|
|
+ warning: "Файли видаляються з диска і не можуть бути відновлені. Перш ніж продовжити, завантажте або додайте до вибраного все, що хочете зберегти.",
|
|
|
+ confirmCta: "Видалити архіви ({{count}})",
|
|
|
+ purging: "Видалення…",
|
|
|
+ toast: {
|
|
|
+ success: "Видалено архівів: {{count}}",
|
|
|
+ failed: "Не вдалося очистити архіви.",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ archiveAutoPurge: {
|
|
|
+ enableLabel: "Автоматичне очищення старих архівів",
|
|
|
+ enableDescription: "Один раз на день приховує архіви зі списків і видаляє їх файли з диска, якщо вони не були надруковані в межах порогу. Повторний друк архіву скидає годинник.",
|
|
|
+ ageLabel: "Автоматичне видалення архівів, не надрукованих в останньому",
|
|
|
+ ageDescription: "Мінімум 7 днів, максимум 10 років. На основі останнього завершення друку — повторний друк архіву оновлює його вік. Видаляє 3MF, мініатюру, покадрову зйомку, джерело 3MF, F3D і фотографії.",
|
|
|
+ days: "днів",
|
|
|
+ purgeStatsLabel: "Також видалити зі статистики",
|
|
|
+ purgeStatsDescription: "Якщо параметр увімкнено, щоденне очищення також вилучатиме внесок кожного видаленого архіву зі «Швидкої статистики» — філамент, час, вартість та енергію. Типово параметр вимкнено: статистичні дані зберігаються, а з диска видаляються лише файли.",
|
|
|
+ runNow: "Очистити архіви зараз",
|
|
|
+ saveFailed: "Не вдалося зберегти налаштування автоматичного очищення.",
|
|
|
+ },
|
|
|
+ cameraTokens: {
|
|
|
+ scope: {
|
|
|
+ camera_stream: "Потік камери",
|
|
|
+ camwall: "Панель камер",
|
|
|
+ overlay: "Потокове накладання",
|
|
|
+ },
|
|
|
+ title: "API-токени камери",
|
|
|
+ navTitle: "API-токени камери",
|
|
|
+ description:
|
|
|
+ "Довгострокові токени для вбудовування потоку камери в Home Assistant, Frigate, кіоски або інші засоби, яким потрібен постійний URL. Під час створення виберіть область доступу; токен можна відкликати будь-коли.",
|
|
|
+ loading: "Завантаження…",
|
|
|
+ confirmRevoke: {
|
|
|
+ title: "Відкликати цей токен?",
|
|
|
+ body: "Усі пристрої, що використовують «{{name}}», негайно втратять доступ. Цю дію неможливо скасувати.",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ confirm: "Відкликати",
|
|
|
+ },
|
|
|
+ create: {
|
|
|
+ scopeLabel: "Область застосування",
|
|
|
+ hintCameraStream:
|
|
|
+ "Токен потоку камери дає змогу отримувати лише потоки з камер і знімки. Використовуйте його для Home Assistant, Frigate або іншого засобу, що вбудовує одну камеру.",
|
|
|
+ hintCamWall:
|
|
|
+ "Токен Cam Wall відкриває /camwall на екрані без входу. Він може бачити назву та стан кожного принтера, а також потоки з камери. Він не може бачити імена файлів, адреси чи коди доступу.",
|
|
|
+ hintOverlay:
|
|
|
+ "Токен потокового накладання відкриває /overlay/{printerId} на екрані без входу — для OBS або будь-якої прямої трансляції. Він дає змогу переглядати потік із камери одного принтера та стан друку в реальному часі, зокрема назву файлу, показану на екрані. Він не надає доступу до адрес чи кодів доступу.",
|
|
|
+ title: "Створити новий токен",
|
|
|
+ nameLabel: "Назва токена",
|
|
|
+ namePlaceholder: "напр. Home Assistant",
|
|
|
+ daysLabel: "Днів до закінчення терміну дії",
|
|
|
+ submit: "Створити",
|
|
|
+ hint:
|
|
|
+ "Максимальний строк дії — 365 днів. Значення токена буде показано лише один раз під час створення — скопіюйте його зараз.",
|
|
|
+ },
|
|
|
+ created: {
|
|
|
+ camWallUrlTitle: "Cam Wall URL для цього дисплея",
|
|
|
+ camWallUrlHint:
|
|
|
+ "Відкрийте цей URL на потрібному екрані. Будь-хто, хто отримає URL, зможе переглядати панель камер, тому захищайте його як ключ доступу. Щоб негайно припинити доступ із цього екрана, відкличте токен.",
|
|
|
+ overlayUrlTitle: "Накладання URL для OBS",
|
|
|
+ overlayUrlHint:
|
|
|
+ "Додайте цей URL в OBS як джерело браузера. Замініть число в /overlay/1 номером принтера з його URL на сторінці «Принтери». Будь-хто, хто отримає URL, зможе переглядати трансляцію, тому захищайте його як ключ доступу. Щоб негайно припинити доступ, відкличте токен.",
|
|
|
+ title: "Токен створено — скопіюйте його зараз",
|
|
|
+ warning:
|
|
|
+ "Це єдиний раз, коли токен буде показано. Після закриття цього діалогового вікна переглянути його знову буде неможливо.",
|
|
|
+ copy: "Копіювати",
|
|
|
+ dismiss: "Я зберіг токен",
|
|
|
+ },
|
|
|
+ list: {
|
|
|
+ scope: "Область застосування",
|
|
|
+ myTitle: "Мої токени",
|
|
|
+ allTitle: "Усі користувачі (перегляд адміністратора)",
|
|
|
+ empty: "Токенів ще немає.",
|
|
|
+ name: "Назва",
|
|
|
+ owner: "Власник",
|
|
|
+ prefix: "Префікс",
|
|
|
+ created: "Створено",
|
|
|
+ expires: "Термін дії закінчується",
|
|
|
+ lastUsed: "Останнє використання",
|
|
|
+ revoke: "Відкликати",
|
|
|
+ expired: "Термін дії минув",
|
|
|
+ },
|
|
|
+ toast: {
|
|
|
+ created: "Токен створено",
|
|
|
+ createFailed: "Не вдалося створити токен",
|
|
|
+ revoked: "Токен відкликано",
|
|
|
+ revokeFailed: "Не вдалося відкликати токен",
|
|
|
+ loadFailed: "Не вдалося завантажити токени",
|
|
|
+ copied: "Скопійовано в буфер обміну",
|
|
|
+ copyFailed: "Не вдалося копіювати — виберіть і скопіюйте вручну",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // Forecast & Inventory Intelligence
|
|
|
+ forecast: {
|
|
|
+ title: "Прогноз",
|
|
|
+ noSpools: "Не знайдено активних котушок. Додайте котушки до свого інвентарю, щоб переглянути прогнозні дані.",
|
|
|
+ noUsageData: "Немає даних про використання — неможливо спроєктувати хронологію запасів.",
|
|
|
+ // Table headers
|
|
|
+ sku: "SKU",
|
|
|
+ material: "матеріал",
|
|
|
+ stock: "Запас",
|
|
|
+ dailyRate: "Добове споживання",
|
|
|
+ daysLeft: "Залишилося днів",
|
|
|
+ emptyBy: "Вичерпається до",
|
|
|
+ reorderBy: "Замовити до",
|
|
|
+ actions: "Дії",
|
|
|
+ // Rate tier badges
|
|
|
+ trend: "Тренд",
|
|
|
+ estimated: "Приблизно",
|
|
|
+ noData: "Немає даних",
|
|
|
+ // Timeframe
|
|
|
+ timeframe: "Період",
|
|
|
+ // Chart
|
|
|
+ chartTitle: "Прогнозований запас — топ-5 матеріалів",
|
|
|
+ dashedLinesROP: "Пунктирні лінії — точки повторного замовлення",
|
|
|
+ stockLevel: "Рівень запасів",
|
|
|
+ reorderPoint: "Точка повторного замовлення",
|
|
|
+ safetyMargin: "Запас безпеки",
|
|
|
+ // Legend labels
|
|
|
+ trendLegend: "Тенденція (на основі історії, рівень обслуговування 95%)",
|
|
|
+ estimatedLegend: "Розрахункова (дельта ваги)",
|
|
|
+ noDataLegend: "Немає даних",
|
|
|
+ ropLabel: "ROP",
|
|
|
+ ssLabel: "SS",
|
|
|
+ safetyStockLegend: "Страховий запас",
|
|
|
+ stockArrivalLegend: "Надходження запасів",
|
|
|
+ stockoutLegend: "Дефіцит",
|
|
|
+ // Alerts toolbar
|
|
|
+ alertCount_one: "Сповіщень: {{count}}",
|
|
|
+ alertCount_other: "Сповіщень: {{count}}",
|
|
|
+ order: "Замовлення",
|
|
|
+ // Settings
|
|
|
+ save: "Зберегти",
|
|
|
+ cancel: "Скасувати",
|
|
|
+ settingsSaved: "Налаштування збережено",
|
|
|
+ failedSaveSettings: "Не вдалося зберегти налаштування",
|
|
|
+ globalLeadTimeSaved: "Загальний строк постачання збережено",
|
|
|
+ globalLeadTime: "Загальний строк постачання",
|
|
|
+ globalLeadTimeHint: "Мінімальний строк постачання для розрахунку точки повторного замовлення всіх SKU",
|
|
|
+ skuLeadTimeOverride: "Інший строк постачання",
|
|
|
+ skuLeadTimeHint: "0 — використовувати загальний строк. Установіть значення понад 0, щоб перевизначити його для цього SKU.",
|
|
|
+ safetyMarginLabel: "Запас безпеки",
|
|
|
+ effectiveLeadTime: "Розрахунковий строк постачання",
|
|
|
+ effectiveLeadTimeHint: "max(глобальний {{global}}d, SKU {{sku}}d)",
|
|
|
+ reorderPointHint: "d̄ × LT + страховий запас — замовляйте, коли запас досягне цього рівня",
|
|
|
+ safetyMarginHint: "Статистичний страховий запас (z=1,65 × σ × √LT) + визначений користувачем буфер",
|
|
|
+ safetyMarginHintDays: "Буфер додано поверх статистичного страхового запасу.{{approx}}",
|
|
|
+ safetyMarginHintDaysApprox: " ≈ {{g}} г за поточного рівня споживання.",
|
|
|
+ safetyMarginHintG: "Буфер фіксованої ваги, доданий поверх статистичного страхового запасу.{{approx}}",
|
|
|
+ safetyMarginHintGApprox: " ≈ {{days}} дн. за поточного рівня споживання.",
|
|
|
+ individualSpools: "Окремі котушки",
|
|
|
+ labelWeight: "Вага за етикеткою",
|
|
|
+ spoolCount_one: "Котушок: {{count}}",
|
|
|
+ spoolCount_other: "Котушок: {{count}}",
|
|
|
+ // Alerts
|
|
|
+ stockBreakRisk: "Ризик вичерпання запасу",
|
|
|
+ stockBreakDetail: "Залишилося {{days}} дн.; строк постачання — {{lt}} дн.",
|
|
|
+ stockBreakBefore: "Запас вичерпається до поповнення",
|
|
|
+ reorderNow: "Замовити зараз",
|
|
|
+ reorderTriggerPassed: "Дата замовлення {{date}} минула.",
|
|
|
+ // Shopping list
|
|
|
+ shoppingList: "Список покупок",
|
|
|
+ shoppingListItems_one: "(позицій: {{count}})",
|
|
|
+ shoppingListItems_other: "(позицій: {{count}})",
|
|
|
+ shoppingListEmpty: "Список покупок порожній. Натисніть значок кошика в будь-якому рядку, щоб додати позиції.",
|
|
|
+ addToCart: "Додати до списку покупок",
|
|
|
+ alertsSnoozed: "Вимкнути сповіщення для цього SKU",
|
|
|
+ alertsEnabled: "Увімкнути сповіщення для цього SKU",
|
|
|
+ addedToCart: "Додано до списку покупок",
|
|
|
+ failedAddItem: "Не вдалося додати елемент",
|
|
|
+ listView: "Список",
|
|
|
+ logisticsView: "Логістика",
|
|
|
+ qty: "Кількість",
|
|
|
+ weight: "Вага",
|
|
|
+ leadTime: "Строк постачання",
|
|
|
+ expectedRestock: "Очікуване поповнення запасів",
|
|
|
+ status: "Статус",
|
|
|
+ note: "Примітка",
|
|
|
+ pending: "В очікуванні",
|
|
|
+ purchased: "Придбано",
|
|
|
+ received: "Отримано",
|
|
|
+ markPurchased: "Позначити як придбане",
|
|
|
+ markReceived: "Позначити як отримане — додає котушки до запасу",
|
|
|
+ resetToPending: "Скинути до очікування",
|
|
|
+ remove: "Видалити",
|
|
|
+ clearAll: "Очистити все",
|
|
|
+ downloadCsv: "CSV",
|
|
|
+ // Add to cart modal
|
|
|
+ addToCartTitle: "Додати до списку покупок",
|
|
|
+ byQuantity: "За кількістю",
|
|
|
+ byDuration: "За тривалістю",
|
|
|
+ numberOfSpools: "Кількість котушок",
|
|
|
+ lastHowManyDays: "Скільки днів має тривати?",
|
|
|
+ noUsageQty: "Немає даних про використання — кількість встановлено на 1.",
|
|
|
+ noteOptional: "Примітка (необов’язково)",
|
|
|
+ notePlaceholder: "напр. для проєкту X, терміново…",
|
|
|
+ addNSpools_one: "Додати котушки ({{count}})",
|
|
|
+ addNSpools_other: "Додати котушки ({{count}})",
|
|
|
+ // Cart logistics
|
|
|
+ onArrival: "Після прибуття",
|
|
|
+ stockBreakIn: "Запас вичерпається через {{days}} дн.",
|
|
|
+ stockRunsOutBefore: "Запас закінчиться раніше, ніж мине строк постачання {{lt}} дн.",
|
|
|
+ atRate: "За споживання {{rate}} г/день потрібно",
|
|
|
+ moreSpools_one: "Додаткових котушок: {{count}}",
|
|
|
+ moreSpools_other: "Додаткових котушок: {{count}}",
|
|
|
+ bridgeGap: "щоб покрити нестачу.",
|
|
|
+ // Permissions
|
|
|
+ noReadAccess: "Ви не маєте дозволу переглядати прогнози запасів.",
|
|
|
+ noWriteAccess: "Ви не маєте дозволу змінювати налаштування прогнозу.",
|
|
|
+ },
|
|
|
+};
|