export default {
  // Navigation
  nav: {
    printers: "Принтери",
    archives: "Архіви",
    queue: "Черга друку",
    stats: "Статистика",
    profiles: "Профілі",
    maintenance: "Технічне обслуговування",
    projects: "Проєкти",
    inventory: "Філамент",
    finance: "Фінанси",
    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: {
    plusNMore: 'ще {{count}}',
    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: "Праворуч",
    user: "Користувач",
    run: "Запустити",
    running: "Виконується...",
  },

  finance: {
    allTypes: "Усі типи",
    allCostCenters: "Усі центри витрат",
    title: "Фінанси",
    subtitle: "Гаманець, особисті операції та центри витрат",
    noAccess: "У вас немає дозволу на перегляд фінансових даних.",
    personalView: "Особистий режим",
    adminView: "Режим адміністратора",
    createCostCenter: "Створити центр витрат",
    adjustWallet: "Скоригувати гаманець",
    addManualPrint: "Додати ручний друк",
    manageMembers: "Керувати учасниками центру витрат",
    currentBalance: "Особистий баланс",
    transactions: "Операції",
    personalTransactions: "Особисті операції",
    costCenters: "Центри витрат",
    availableForPrinting: "Доступний для призначення друку",
    costCenterName: "Назва",
    budgetType: "Тип бюджету",
    monthlyBudget: "Місячний бюджет",
    totalBudget: "Загальний бюджет",
    noBudget: "Без бюджету",
    create: "Створити",
    selectUser: "Виберіть користувача",
    transactionType: "Тип",
    amount: "Сума",
    noCostCenter: "Без центру витрат",
    descriptionOptional: "Опис (необов’язково)",
    applyAdjustment: "Застосувати коригування",
    memberCanPrint: "Учасник може друкувати",
    addMember: "Додати учасника",
    canPrint: "Може друкувати",
    noMembers: "Учасників не призначено.",
    editCostCenter: "Редагувати центр витрат",
    myCostCenters: "Мої центри витрат",
    costCentersHint: "Переглядайте бюджетні ліміти та контролюйте витрати",
    noCostCenters: "Центрів витрат не знайдено.",
    owner: "Власник",
    balance: "Баланс рахунку",
    unlimited: "Без обмежень",
    budgetPolicyHint: "Баланс рахунку використовується для обліку витрат. Друк обмежується лише бюджетом вибраного центру витрат; без бюджету обмежень немає.",
    budget: "Бюджет",
    shared: "Спільний",
    cannotEditPrivateCostCenter: "Особисті центри витрат не можна редагувати тут",
    recentTransactions: "Останні операції",
    transactionsHint: "Фільтрувати за типом і центром витрат",
    first: "Перша",
    prev: "Попередня",
    next: "Наступна",
    last: "Остання",
    pageNumberOf: "Сторінка {{page}} з {{total}}",
    noTransactions: "Немає доступних операцій.",
    noTransactionsForFilter: "Немає операцій, що відповідають вибраним фільтрам.",
    costCenter: "Центр витрат",
    balanceAfter: "Баланс після операції",
    userWithId: "Користувач №{{id}}",
    partial: "Частково",
    editTransaction: "Редагувати операцію",
    selectCostCenter: "Виберіть центр витрат...",
    costCenterRequired: "Виберіть центр витрат",
    amountExample: "наприклад, 4,00",
    manualAdjustmentExample: "наприклад, ручне коригування",
    userRequired: "Виберіть користувача",
    amountInvalid: "Сума має бути дійсним числом",
    createdCostCenter: "Центр витрат створено",
    createCostCenterFailed: "Не вдалося створити центр витрат",
    transactionDeleted: "Операцію видалено",
    deleteTransactionFailed: "Не вдалося видалити операцію",
    transactionEdited: "Операцію оновлено, бухгалтерську книгу перераховано",
    editTransactionFailed: "Не вдалося редагувати операцію",
    manualPrintCreated: "Витрати на ручний друк додано, бухгалтерську книгу перераховано",
    manualPrintFailed: "Не вдалося додати ручний друк",
    memberSaved: "Учасника збережено",
    memberSaveFailed: "Не вдалося зберегти учасника",
    memberRemoved: "Учасника видалено",
    memberRemoveFailed: "Не вдалося видалити учасника",
    costCenterNameRequired: "Назва центру витрат є обов’язковою",
    costCenterUpdated: "Центр витрат оновлено",
    costCenterUpdateFailed: "Не вдалося оновити центр витрат",
    confirmDeleteCostCenter: "Видалити центр витрат «{{name}}»?",
    costCenterDeleted: "Центр витрат видалено",
    costCenterDeleteFailed: "Не вдалося видалити центр витрат",
    deleteTransactionConfirm: "Видалити цю операцію? Баланси буде перераховано автоматично.",
    deposit: "Поповнення",
    withdraw: "Списання",
    printCharge: "Витрати на друк",
    deleteTransaction: "Видалити операцію",
  },

  // 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}} не призначено котушки.",
      killSwitchTriggered: 'Аварійний вимикач білінгу зупинив несанкціонований друк на {{printer}}: {{filename}}',
      billingChargeFailed: 'Не вдалося нарахувати вартість {{filename}} на {{printer}}. Резерв бюджету збережено; перевірте журнали сервера.',
      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: "Філаменти",
    externalSpool: {
      hide: "Сховати зовнішню котушку",
      show: "Показати зовнішню котушку",
    },
    // 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: "Допоміжний вентилятор",
      leftAuxiliary: "Лівий допоміжний вентилятор",
      exhaust: "Витяжка",
      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 встановлення",
      docsLinkInternalStorage: 'Чому так стається',
      titleInternalStorage: 'Деякі нещодавні друки залишилися у внутрішній пам\'яті принтера',
      bodyInternalStorage: 'Принтер зберіг нарізаний файл у власній внутрішній пам\'яті, а не на картці, тож Bambuddy не мав чого читати через FTP. Прошивка серії H2 та P2S робить саме так, і «Зберігати надіслані файли на зовнішньому носії» цього не змінює. Такі друки все одно архівуються з назвою та часом, лише без мініатюри та метаданих слайсера.',
      titleNoExternalStorage: 'Деякі нещодавні друки не вдалося заархівувати — у принтері немає носія',
      bodyNoExternalStorage: 'Принтер не бачить ані картки, ані флешки у слоті, тож нарізаному файлу не було куди потрапити, а Bambuddy — що читати. Вставте носій, і наступний друк заархівується повністю.',
      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 недоступний: його не вдалося завантажити з принтера під час збереження запису про друк",
      slicerAmsMapping: "Зіставлення AMS збережено ({{printer}})",
      slicerAmsMappingTooltip: "Вибір слотів AMS, зроблений слайсером, збережено для принтера {{printer}}. Номери слотів мають сенс лише на ньому, тож повторний друк використає їх, тільки якщо знову спрямований на {{printer}}.",
      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: "Філамент",
      filamentUsed: 'Витрачено філаменту',
      cost: 'Вартість',
      energy: 'Енергія',
      energyCost: 'Вартість енергії',
      completedAt: 'Завершено',
      columns: 'Стовпці',
      sortBy: 'Сортувати за: {{column}}',
      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: "Усе одно друкувати",
    },
    slicerAmsMapping: {
      rowBadge: "Слоти AMS збережено для цього принтера",
      rowTooltip: "Цей запис містить точні слоти AMS, вибрані слайсером, збережені для принтера, на який націлено це завдання. Повторний друк на ньому може використати ті самі котушки замість повторного добору за типом і кольором.",
    },
    // 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}}",
    plateQuantityLabel: "Повтори: {{plate}}",
    plateQuantityTotal_one: "Усього запусків: {{count}}",
    plateQuantityTotal_other: "Усього запусків: {{count}}",
    batchOrders: {
      title: "Пакетні замовлення",
      emptyTitle: "Пакетних замовлень немає",
      emptyDescription: "Поставте в чергу файл із кількома столами або кілька копій одного стола — замовлення з’явиться тут разом із прогресом.",
      filter: {
        active: "Активні",
        completed: "Завершені",
        cancelled: "Скасовані",
        all: "Усі",
      },
      status: {
        active: "Активне",
        completed: "Завершене",
        cancelled: "Скасоване",
      },
      noTargets: "Лише групування",
      noTargetsHint: "Створено до появи цільових кількостей на стіл, тож відстежує поставлені в чергу запуски, а не ціль.",
      dispatchRemaining: "Поставити в чергу: {{count}}",
      dispatchPlate: "Поставити решту",
      dispatched: "Решту запусків для «{{name}}» поставлено в чергу",
      plateProgress: "Готово {{completed}} з {{target}}",
      remaining: "Залишилось: {{count}}",
      failed: "Невдалих: {{count}}",
      printing: "Друкується: {{count}}",
      wholeFile: "Увесь файл",
      due: "Термін: {{date}}",
      costSoFar: "{{amount}} витрачено",
      costRemaining: "(ще {{amount}})",
    },
    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: {
      batches: "Партії",
      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: {
      etaIfStartedNow: "Час завершення, якщо запустити це завдання зараз",
      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: {
    sliceEngine: 'Рушій нарізання',
    sliceEngineSidecar: 'Серверний sidecar',
    sliceEngineSidecarHint: 'Нарізання виконується на сервері, у контейнері sidecar слайсера.',
    sliceEngineBrowser: 'У браузері',
    sliceEngineBrowserHint: 'Нарізання виконується на цьому пристрої, без сервера.',
    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: "Цей поріг також використовується для запуску автоматичного сушіння, якщо його ввімкнено",
    fairBelowDryingFloor: "Автоматичне сушіння не може досягти цього значення: за увімкненого нагрівача AMS показує {{floor}} % або більше, тож кожен цикл завершувався б і одразу починався знову. Встановіть значення понад {{floor}} %, якщо користуєтеся автоматичним сушінням.",
    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: "Якщо ввімкнено, планувальник перед запуском наступного завдання на принтері із завершеним друком очікує підтвердження, що друкарську пластину очищено. Вимкнення також приховує індикатор стану пластини та кнопку «Позначити пластину як очищену» на картках принтерів.",
    keepBedWarm: "Тримати стіл теплим між друком",
    keepBedWarmDesc: "Поки очікується підтвердження очищення пластини, стіл підтримується при вказаній нижче температурі підігріву, щоб камера залишалася теплою, — або при температурі столу наступного друку, якщо вона вища. Застосовується лише коли наступний друк потребує нагрівання камери (ASA, ABS, PA, PC тощо). Потрібно увімкнути підтвердження очищення пластини.",
    keepWarmBedTemp: "Температура столу для підтримання тепла (°C)",
    keepWarmBedTempHelp: "Використовується, коли стіл слугує для нагрівання камери: під час підтримання тепла та під час попереднього нагріву, якщо у файлі друку немає температури столу. Вища температура з файлу друку завжди має пріоритет.",
    keepWarmMaxMinutes: "Припинити підігрів через (хвилин)",
    keepWarmMaxMinutesHelp: "Якщо пластину не звільнено за цей час, нагрівачі вимикаються, а не залишаються увімкненими нескінченно.",
    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",
    slicerStallTimeout: 'Тайм-аут простою слайсера (хвилини)',
    slicerStallTimeoutDescription: 'Перервати нарізку, якщо sidecar не повідомляє про прогрес протягом цього часу. Важкі моделі, які продовжують повідомляти про прогрес, ніколи не перериваються, скільки б часу не знадобилося. Для sidecar без звіту про прогрес це значення використовується як загальний ліміт часу.',
    slicerApiUrlDescription: "URL контейнера допоміжного сервісу slicer-API. Залиште поле порожнім, щоб використовувати типові значення зі змінних середовища SLICER_API_URL / BAMBU_STUDIO_API_URL.",
    externalCameras: "Зовнішні камери",
    costTracking: "Відстеження витрат",
    billingEnabled: "Увімкнути розрахунки",
    billingEnabledDescription: "Стягувати з користувачів вартість друку та ввімкнути фінансові функції",
    printerKillSwitch: "Автозупинка несанкціонованого друку",
    printerKillSwitchDescription: "Негайно зупиняє друк, розпочатий без дозволу.",
    financeBudgetReset: "Щомісячне скидання фінансового бюджету",
    financeBudgetResetDay: "День скидання",
    financeBudgetResetDayHelp: "У коротких місяцях скидання виконується в останній день місяця.",
    financeBudgetResetTimezone: "Часовий пояс скидання",
    financeBudgetResetTimezoneHelp: "Початок бюджетного періоду обчислюється в цьому часовому поясі.",
    rebuildLedger: "Перебудувати книгу гаманця",
    rebuildLedgerStarted: "Перебудову книги розпочато",
    rebuildLedgerConfirmTitle: "Перебудувати книгу гаманця?",
    rebuildLedgerConfirmMessage: "Книгу гаманця буде перебудовано для виправлення історичних значень балансу. Запускайте цю дію лише якщо розумієте її наслідки.",
    rebuildLedgerInProgress: "Запуск перебудови...",
    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}}",
      cameraConnectedCoalesced: "Камера підключена{{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: "Перемикайтеся між темним, світлим і системним режимами за допомогою значка на бічній панелі.",
    progressInTitle: "Прогрес у вкладці",
    progressInTitleDescription: "Показує відсоток активного друку та кільце прогресу на вкладці браузера.",
    // Archive
    autoArchivePrints: "Автоматично архівувати друки",
    autoArchiveDescription: "Автоматично зберігати файли 3MF після завершення друку",
    saveThumbnailsDescription: "Витягніть і збережіть зображення попереднього перегляду з файлів 3MF.",
    captureFinishPhotoDescription: "Зробіть фотографію з камери принтера після завершення друку. Bambuddy записує короткий проміжок часу під час друку, щоб фотографію можна було отримати з моменту, коли стіл опускається; файл уповільненої зйомки зберігається, якщо ви ввімкнули уповільнену зйомку для цього друку, інакше він автоматично видаляється після зйомки фотографії.",
    finishPhotoRestorePlate: "Піднімати стіл для фінального знімка",
    finishPhotoRestorePlateDescription: "Після завершення друку принтер опускає стіл приблизно на 100 мм, і готова модель опиняється нижче кадру камери. 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 Написати:",
    composeDirectory: "Каталог Compose",
    composeDirectoryHint: "Каталог із вашим docker-compose.yml. Залиште порожнім, щоб не додавати cd.",
    copyUpdateCommand: "Скопіювати команду оновлення",
    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",
    mqttVerifyFailedRemedy: "Увімкніть режим розробника на принтері, перезавантажте принтер і запустіть завдання знову.",
    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: "Принтер не в мережі",
    builder: {
      title: "Оформлення трансляції",
      description: "Складає адресу оформлення трансляції: повноекранне зображення камери з накладеними даними друку — для OBS, настінного екрана або будь-якого джерела-браузера. Виберіть потрібні поля та скопіюйте адресу.",
      printer: "Принтер",
      size: "Розмір тексту",
      sizeSmall: "Малий",
      sizeMedium: "Середній",
      sizeLarge: "Великий",
      fps: "Частота кадрів",
      fpsHint: "Камери A1 і P1 видають щонайбільше близько 5 кадрів за секунду, хоч би яке значення ви задали.",
      token: "Токен оформлення трансляції (необов'язково)",
      tokenHint: "Потрібен лише за увімкненого входу: OBS не має власного сеансу. Створіть його вище з областю «Оформлення трансляції».",
      tokenWarning: "Ця адреса містить токен: будь-хто, хто її прочитає, побачить трансляцію та назву файлу. Відкличте токен, щоб закрити доступ.",
      fields: "Поля для показу",
      fieldPrinter: "Назва принтера",
      fieldFilename: "Назва файлу",
      fieldStatus: "Стан",
      fieldProgress: "Смуга поступу",
      fieldLayers: "Кількість шарів",
      fieldEta: "Залишок часу та час завершення",
      fieldCamera: "Зображення камери",
      chamberHint: "Температура камери показується лише на моделях зі справжнім датчиком: P1 та A1 повідомляють беззмістовне значення, тому її пропущено.",
      urlTitle: "Адреса оформлення",
      open: "Відкрити",
      showPreview: "Показати попередній перегляд",
      hidePreview: "Сховати попередній перегляд",
      previewTitle: "Попередній перегляд оформлення",
    },
    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: "Натомість використати токен доступу",
      captchaTitle: "Bambu Cloud вимагає пройти CAPTCHA",
      captchaBody: "Bambu вимагає від вашої мережі пройти CAPTCHA, перш ніж прийняти вхід, і відповісти на цю перевірку з Bambuddy неможливо. Річ не в пошті та не в паролі. Блокування прив'язане до вашої публічної IP-адреси і зазвичай зникає саме протягом кількох годин, а повторні спроби лише подовжують його. Щоб увійти зараз, скористайтеся токеном доступу із сеансу браузера.",
      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: {
    variants: {
      badge: 'Версій: {{count}}',
      groupAction: 'Згрупувати як версії',
      groupTooltip: 'Позначити ці файли як одне завдання, нарізане для різних принтерів',
      grouped: 'Файлів згруповано як версії: {{count}}',
      printAlternatives: 'Друк (варіантів: {{count}})',
    },
    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: "Востаннє змінено",
    lastActivity: "Остання активність",
    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: "Папка створена",
      openInSlicerFailed: "Не вдалося відкрити у слайсері",
      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: {
    parentLabel: "Батьківський проєкт",
    parentNone: "Немає (проєкт верхнього рівня)",
    parentHint: "Вкладіть цей проєкт в інший, щоб його показники підсумовувалися в головному проєкті",
    partOf: "Частина проєкту {{name}}",
    subProjectCount: "Підпроєктів: {{count}}",
    subProjectsOf: "Підпроєкти проєкту {{name}}",
    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}})",
      jobs: "Завдань: {{count}}",
    },
    rollup: {
      title: "Разом із підпроєктами: {{count}}",
      progress: "Загальний прогрес",
      percentComplete: "Завершено {{percent}}%",
    },
    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)
  slicerSettings: {
    presetValuesOutdatedSidecar: 'Показано типові значення слайсера: ваш sidecar старіший за цю функцію і не може повідомити значення профілю. Оновіть образ sidecar, щоб їх побачити. Усе, чого ви не змінюєте, і далі береться з профілю.',
    presetValuesNotConfigured: 'Показано типові значення слайсера: sidecar не налаштовано, тому значення профілю прочитати не можна. Усе, чого ви не змінюєте, і далі береться з профілю.',
    presetValuesSidecarUnavailable: 'Показано типові значення слайсера: sidecar не відповів, тому значення профілю прочитати не можна. Усе, чого ви не змінюєте, і далі береться з профілю.',
    presetValuesUnavailable: 'Показано типові значення слайсера: значення вибраного профілю не вдалося прочитати. Усе, чого ви не змінюєте, і далі береться з профілю.',
    filamentDefault: 'За замовчуванням',
    fromFile: 'з файлу',
    fromFileHint: 'Автор моделі змінив цей параметр у вихідному файлі. Значення: {{value}}.',
    fromFilePrinterCoupled: 'принтер автора',
    fromFilePrinterCoupledHint: 'Підібрано під принтер, для якого створено файл, — на вашому значення може бути хибним або поза діапазоном.',
    useFromFile: 'Використовувати значення з вихідного файлу для «{{option}}»',
    otherFromFile: 'Інші параметри з цього файлу',
    loading: 'Завантаження налаштувань слайсера…',
    mode: {
      simple: 'Простий',
      advanced: 'Розширений',
      expert: 'Експерт',
    },
    searchPlaceholder: 'Пошук параметрів',
    resetAll: 'Скинути: {{count}}',
    resetOption: 'Скинути до типового значення',
    noMatches: 'Немає параметрів, що відповідають запиту.',
  },
  slice: {
    filamentSlotUnset: 'не задано',
    processSettingsEmbedded: 'Не використовується, доки увімкнено «Використовувати вбудовані параметри файлу» — нарізанням керують параметри самого файлу.',
    processSettingsInactive: 'Неактивно',
    presetsHidden: 'приховано: {{count}}',
    showAllPresets: 'Показати всі',
    showFewerPresets: 'Показати менше',
    processSettings: 'Параметри процесу',
    processSettingsHint: 'Налаштуйте вибраний профіль для цього нарізання. Усе, чого ви не змінили, лишається як визначено профілем.',
    processSettingsChanged: 'змінено: {{count}}',
    processSettingsUnchanged: 'Значення профілю',
    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: "Нарізати модель із налаштуваннями автора файлу — стінками, заповненням і філаментом — замість профілів вище. Ця можливість доступна, оскільки модель принтера відповідає файлу.",
    autoOrient: "Автоматично орієнтувати об'єкти",
    autoOrientHint: "Слайсер поверне кожен об'єкт на бік, який друкується найкраще. Орієнтацію з файлу буде замінено.",
    autoArrange: 'Автоматично розмістити на столі',
    autoArrangeHint: "Слайсер розставить об'єкти так, щоб вони не перекривалися. Розташування з файлу буде замінено.",
    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}} завершено",
    externalWriteFallbackToast: "Збережено у внутрішній бібліотеці: не вдалося записати в зовнішню теку",
    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: {
    variants: {
      editNote: 'Ці варіанти задано під час додавання в чергу. Щоб змінити, скасуйте та додайте знову.',
      title: 'Варіанти принтера',
      help: 'Одне завдання, одне місце в черзі. Перший відповідний принтер, що звільниться, надрукує свій файл.',
      unknownModel: 'Невідома модель',
      plateFor: 'Стіл для {{filename}}',
      moveUp: 'Вгору',
      moveDown: 'Вниз',
      queued: 'У черзі, варіантів: {{count}}',
    },
    selectPrinter: "Вибрати принтер",
    selectPlate: "Вибрати пластину",
    filamentMapping: "Зіставлення філаментів",
    useArchiveMapping: "Зіставлення",
    useArchiveMappingTooltip: "Вибрати всі слоти зі зіставлення AMS, збереженого з цим записом (зі слайсера), замість добору за типом/кольором.",
    clickToChangeSlot: "Натисніть, щоб змінити призначення слота",
    reRead: "Перечитати",
    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: "Праве сопло",
    rackPosition: "Позиція у стійці",
    rackPositionTooltip: "Яким соплом зі стійки друкувати цей філамент. Позиції нумеруються так само, як на принтері.",
    rackEmptyPosition: "Ця позиція у стійці порожня",
    rackWrongNozzle: "Встановлено сопло {{has}}; цьому філаменту потрібно {{needs}}",
    filamentOverride: "Перевизначення філаменту",
    filamentOverrideHint: "Необов’язково замініть філаменти для призначення на основі моделі. Планувальник зіставлятиметься з вибраними філаментами замість вихідних значень 3MF.",
    originalFilament: "Оригінал",
    overrideWith: "Перевизначити за допомогою",
    resetToOriginal: "Скинути до оригіналу",
    insufficientFilamentTitle: "Недостатньо філаменту",
    waitingForAmsStatus: "Очікування статусу AMS від {{printer}}…",
    insufficientFilamentMessage: "У деяких призначених котушках залишилося менше філаменту, ніж потрібно для друку:",
    insufficientFilamentLine: "{{printer}} - {{slot}}: потрібно {{required}}g, залишилося {{remaining}}g",
    insufficientFilamentLinePooled: "{{printer}} - {{slot}}: потрібно {{required}}g, доступно {{remaining}}g на відповідних котушках (резервне перемикання філаменту AMS)",
    printAnyway: "Усе одно друкувати",
    forceColorMatch: "Примусовий збіг кольорів",
    staggerPrinterStarts: "Запускати принтери почергово",
    staggerGroupSize: "Розмір групи",
    staggerInterval: "Інтервал (хв)",
    staggerPreview: "Принтерів: {{printers}} → груп: {{groups}}, по {{size}}; інтервал запуску — {{interval}} хв",
    staggerLastGroup: "остання група: {{count}}",
    staggerTotal: "всього: {{minutes}} хв",
    staggerToPrinters: "Розподілити запуск між {{count}} принтерами",
    gcodeInjection: "Додати G-код автоматичного друку",
    insufficientBudget: "Недостатньо бюджету",
    unlimitedNoBudget: "Без обмежень — ліміт бюджету не встановлено.",
    noPrintableCostCenters: "Немає активного центру витрат, доступного для друку. Попросіть адміністратора надати вам доступ до друку.",
  },

  // 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: "Введіть новий токен для оновлення",
    tokenHintGitHub: "Токен із деталізованими правами на читання й запис Contents або класичний токен з областю repo.",
    tokenHintGitLab: "Токен з областю api або read_repository разом із write_repository.",
    tokenHintGitea: "Токен з областю write:repository.",
    tokenHintForgejo: "Токен з областю write:repository. Достатньо токена, обмеженого лише цим репозиторієм.",
    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 і Orca Cloud",
    cloudProfilesAccounts: "Підключені акаунти — Bambu Cloud: {{bambu}}, Orca Cloud: {{orca}}",
    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}}",

    // Restore from Git backup (#2656)
    restoreFromGit: {
      button: "Відновити з Git",
      title: "Відновлення з резервної копії Git",
      subtitle: "Виберіть коміт і вкажіть, що відновити",
      commitLabel: "Коміт резервної копії",
      latestCommit: "Остання резервна копія (вершина гілки)",
      categoriesLabel: "Що відновити",
      inspecting: "Читання вмісту резервної копії...",
      itemCount: "{{count}} у резервній копії",
      overwriteLabel: "Перезаписувати наявні записи",
      overwriteOn: "Наявні записи буде оновлено з резервної копії.",
      overwriteOff: "Додаються лише відсутні записи; наявні залишаються без змін.",
      selectedCount: "Вибрано: {{count}}",
      restoring: "Відновлення...",
      confirmTitle: "Відновити з резервної копії?",
      confirmMessage: "Вибрані категорії буде відновлено з цього коміту. Відсутні записи буде додано, наявні залишаться без змін.",
      confirmMessageOverwrite: "Вибрані категорії буде відновлено з цього коміту з перезаписом записів, які вже існують локально. Цю дію не можна скасувати.",
      kprofilesOverwriteCaveat: 'K-профілі — виняток: запис у слот завжди замінює калібрування на принтері.',
      tally: "відновлено: {{restored}}, пропущено: {{skipped}}, з помилкою: {{failed}}",
      reloadHint: "Перезавантажте Bambuddy, щоб відновлені дані відобразилися всюди.",
      partialHint: 'Перелічені вище категорії завершено та збережено. Відсутні категорії не виконувалися.',
      failed: "Не вдалося виконати відновлення.",
      loadFailed: "Не вдалося прочитати репозиторій резервних копій.",
      details: {
        notPresent: "Відсутнє в цьому коміті резервної копії",
        unreadableJson: "Нечитабельний JSON: {{paths}}",
        settingsNoPayload: "У даних немає налаштувань",
        settingsCredentialsWillSkip: "Ключів, схожих на облікові дані, буде пропущено: {{count}}",
        settingsCompanionWillSkip: "Ключів, схожих на облікові дані, буде пропущено: {{count}}, а залежні від них перемикачі ({{companion}}) залишаться вимкненими",
        settingsCompanionOnlyWillSkip: 'Перемикачі ({{companion}}) залишаться вимкненими - облікові дані, потрібні кожному з них, не можна відновити з резервної копії',
        spoolsUsageCount: "включно із записами використання: {{count}}",
        archivesMetadataOnly: "Лише метадані - файли 3MF і мініатюри не входять до резервної копії Git",
        kprofilesPrinterCount: "по {{count}} принтерах",
      },
      notes: {
        noData: "У цій резервній копії немає даних такого типу",
        archivesPrinterMissing: "Деякі архіви посилалися на принтери, яких більше немає - зв'язок очищено",
        archivesProjectMissing: "Деякі архіви посилалися на проєкти, яких більше немає - зв'язок очищено",
        archivesOwnerCleared: "Деякі архіви посилалися на користувачів, яких більше немає - власника очищено, тому вони видимі лише користувачам із дозволом archives:read_all, доки адміністратор не призначить власника знову",
        archivesOwnerUnmatched: "Деякі архіви вказують власника, якого немає в цьому екземплярі - власника очищено, а не вгадано за ідентифікатором користувача з резервної копії, тому вони видимі лише користувачам із дозволом archives:read_all, доки адміністратор не призначить власника знову",
        archivesOwnerUnknown: "Деякі архіви відновлено без власника - у цій резервній копії його не записано, тому вони видимі лише користувачам із дозволом archives:read_all, доки адміністратор не призначить власника",
        archivesUndeleted: "Архіви, видалені після резервного копіювання, знову видимі - перезапис був увімкнений",
        archivesMetadataOnly: "Відновлені архіви містять лише метадані - файли 3MF і мініатюри не входять до резервної копії Git",
        spoolUsageUnresolved: "Записів використання пропущено: {{count}} - їхньої котушки немає у списку котушок цієї резервної копії, тож немає до чого їх прив'язати.",
        spoolUsageUnlinked: "Записів використання відновлено без зв'язку з історією друку: {{count}} - виберіть «Архіви друку» разом з «Інвентарем котушок», щоб зберегти зв'язок.",
        spoolTagKept: "Міток котушок залишено без змін: {{count}} - резервна копія стерла б мітку, відскановану пізніше, або перенесла б її на іншу котушку.",
        settingsCredentialsSkipped: "Ключів, схожих на облікові дані, пропущено: {{count}} - введіть секрети вручну",
        settingsAuthSkipped: "Налаштувань автентифікації пропущено: {{count}} - змінюйте їх у розділі «Налаштування > Автентифікація», щоб перевірки блокування й далі працювали",
        settingsCompanionSkipped: "{{keys}} залишено вимкненими - потрібні їм облікові дані не можна відновити з резервної копії, і в цьому екземплярі вони не збережені, тож увімкнення залишило б інтеграцію без автентифікації",
        settingsMqttRelayFailed: "Налаштування MQTT відновлено, але реле не вдалося перепідключити - перезапустіть Bambuddy",
        kprofilesAlwaysOverwrite: "K-профілі завжди перезаписують відповідний слот на принтері",
        kprofilesAckUnreliable: "Принтер, який не відповідає, усе одно вважається відновленим - перевірте профілі на принтері",
        kprofilesPrinterMissing: "Немає принтера із серійним номером {{serial}} - пропущено",
        kprofilesPrinterOffline: "{{printer}} ({{serial}}) не підключено - пропущено",
        kprofilesUnknownNozzle: "Неочікуваний діаметр сопла {{nozzle}} для {{serial}} - надіслано як є",
        kprofilesUnmatched: "Профілів для {{nozzle}} без відповідника на {{printer}}: {{count}} - додано як нові профілі",
        kprofilesSendFailed: "Не вдалося надіслати профілі {{nozzle}} на {{printer}} ({{serial}})",
        kprofilesRefused: "{{printer}} ({{serial}}) відхилив профілі {{nozzle}}: {{reason}}",
        kprofilesStepFailed: "Не вдалося завершити етап K-профілів - {{reason}}. Усе, що було відновлено до нього, збережено.",
      },
    },

    // History
    history: "історія",
    clear: "Очистити",
    date: "Дата",
    status: "Статус",
    trigger: "Тип",
    triggers: {
      manual: "Резервна копія (вручну)",
      scheduled: "Резервна копія (за розкладом)",
      restore: "Відновлення",
    },
    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: "Виберіть філамент...",
      source: {
        local: "Імпортовані",
        orcaCloud: "Orca Cloud",
        bambuCloud: "Bambu Cloud",
        builtin: "Вбудований",
      },
      noFilamentsHelp: "Немає доступних філаментів. Увійдіть у Bambu Cloud або імпортуйте пресети в розділі Профілі → Локальні профілі.",
      searchFilaments: "Пошук філаментів...",
      noFilamentMatches: "Немає філаментів, що відповідають запиту",
      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: "Виберіть принаймні один екструдер",
      selectFilament: "Спочатку виберіть філамент",
      filamentNotResolvable: "Немає ідентифікатора філаменту Bambu для {{name}} — принтер не зможе зберегти профіль",
      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: "Не надсилати завдання на принтер без філаменту точного типу й кольору. Типово вимкнено: без цього черга зіставляє лише модель і може вибрати принтер із філаментом іншого кольору.",
    },
    saveAmsMapping: {
      title: "Зберігати зіставлення AMS",
      description: "Зберігати в записі вибір слота AMS, зроблений самим слайсером (з MQTT-команди project_file), щоб пізніший повторний друк використав ту саму фізичну котушку замість повторного визначення за типом/кольором файлу. Типово вимкнено.",
    },
    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: "Відкрити у слайсері",
    openInSlicerWith: "Відкрити у {{slicer}}",
    moreSlicerOptions: "Більше варіантів слайсера",
    openInSlicerFailed: "Не вдалося відкрити у слайсері",
    tabs: {
      model: "3D-модель",
    },
    notAvailable: "недоступно",
    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
  haSensors: {
    label: "Датчики",
    unavailable: "Недоступно",
    blocksPrints: "{{entity}} — утримує друк, поки триває сповіщення",
    states: {
      open: "Відчинено",
      closed: "Зачинено",
      unlocked: "Розблоковано",
      locked: "Заблоковано",
      detected: "Виявлено",
      clear: "Чисто",
      wet: "Волого",
      dry: "Сухо",
      problem: "Проблема",
      ok: "Норма",
      running: "Працює",
      stopped: "Зупинено",
      on: "Увімк",
      off: "Вимк",
    },
    sectionTitle: "Датчики Home Assistant",
    add: "Додати датчик",
    addTitle: "Додати датчик Home Assistant",
    editTitle: "Редагувати датчик Home Assistant",
    empty: "Датчиків ще немає. Прив'яжіть дверний контакт або термометр із Home Assistant, щоб показати його на картці принтера.",
    unknownPrinter: "Невідомий принтер",
    badgeBlocks: "Утримує друк",
    badgeNotifies: "Сповіщає",
    badgeHidden: "Приховано на картці",
    printer: "Принтер",
    entity: "Сутність",
    searchPlaceholder: "Пошук сутностей...",
    noEntities: "Немає відповідних сутностей",
    name: "Відображувана назва",
    alertWhen: "Сповіщати коли",
    alertNever: "Ніколи — лише показувати",
    alertAbove: "Вище",
    alertBelow: "Нижче",
    alertHint: "Стан сповіщення підсвічує датчик на картці принтера та вмикає параметри нижче.",
    showOnCard: "Показувати на картці принтера",
    notifyOnAlert: "Надсилати сповіщення, коли спрацьовує",
    blockPrint: "Утримувати друк у черзі, поки триває сповіщення",
    blockPrintHint: "Завдання лишаються в черзі й запускаються самі, коли датчик повертається до норми. Ігнорується, поки Home Assistant недоступний.",
    toast: {
      created: "Датчик додано",
      updated: "Датчик збережено",
      deleted: "Датчик видалено",
    },
    error: {
      pickEntity: "Оберіть сутність Home Assistant",
      nameRequired: "Введіть відображувану назву",
      printerRequired: "Оберіть принтер",
      alertRequired: "Спершу задайте умову сповіщення",
    },
  },
  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 Темп",
    amsDryingSuspended: "Сушіння призупинено",
    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: "Відсутнє призначення котушки",
    billingChargeFailedLabel: 'Помилка списання',
    billingChargeFailedDescription: 'Сповіщати, якщо не вдалося облікувати вартість друку',
    missingSpoolAssignmentDescription: "Сповіщати, коли починається друк і для необхідних лотків не призначено котушку",
    printFailed: "Помилка друку",
    printStopped: "Друк зупинено",
    progressMilestones: "Віхи прогресу",
    progressMilestonesDescription: "Сповіщати на 25%, 50%, 75%",
    printerOffline: "Принтер не в мережі",
    printerError: "Помилка принтера",
    aiFailureDetection: "Виявлення помилок за допомогою ШІ",
    aiFailureDetectionDescription: "Сповіщати, коли ШІ Obico виявляє можливу помилку друку",
    lowFilamentLabel: "Закінчується філамент",
    maintenanceDue: "Настав час технічного обслуговування",
    maintenanceDueDescription: "Повідомити, коли потрібне обслуговування",
    amsHumidityHigh: "AMS Висока вологість",
    amsHumidityHighDescription: "Звичайна AMS вологість перевищує порогове значення",
    amsTemperatureHigh: "AMS Висока температура",
    amsTemperatureHighDescription: "Звичайна AMS температура перевищує порогове значення",
    amsDryingSuspendedTitle: "Автоматичне сушіння призупинено",
    amsDryingSuspendedDescription: "Автоматичне сушіння блока 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: "(після завершення друку)",
    haSensorAlert: "Сповіщення датчика",
    haSensorAlertDescription: "(пов'язаний датчик Home Assistant потребує уваги)",
    // 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: "Ідентифікатор чату",
    telegramThreadId: "ID теми форуму",
    telegramThreadIdHelp: "Необов'язково. Надсилає в конкретну тему форум-групи — останнє число у посиланні на тему (t.me/c/.../25). Залиште порожнім для теми General.",
    telegramThreadIdInvalid: "ID теми форуму має бути числом.",
    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 за замовчуванням.",
    otherKProfiles: "Інші K-профілі на цьому принтері",
    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 не заблоковано.",
        warn_no_tls: "Порт 990 відкритий, але файлова служба принтера не завершує рукостискання TLS. Файли друку, обкладинки та таймлапси отримати неможливо, тому архіви залишаються порожніми. Перезавантажте принтер — розблокування порту не допоможе.",
      },
      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 не додасть підтримку в прошивці, в архівованих друках можуть бути відсутні мініатюри та метадані слайсера.",
        fail_no_media: 'Параметр увімкнено, але принтер не бачить ані картки, ані флешки у слоті, тож надісланим файлам немає куди подітися. Вставте носій і надрукуйте ще раз — доти кожен заархівований друк буде без мініатюри та метаданих слайсера.',
        warn_internal_storage: 'Параметр увімкнено і носій на місці, але цей принтер усе одно залишив останній друк у внутрішній пам\'яті, яку Bambuddy не може прочитати. Прошивка серії H2 та P2S робить саме так, і жодне налаштування цього не змінює. Друки архівуються з назвою та часом, але без мініатюри та метаданих слайсера.',
      },
      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: "Файлова служба принтера відповіла на порту 990 без TLS. Її файловий сервер завис — це несправність самого принтера, а не брандмауера чи прошивки.",
        fix: "Перезапустіть принтер. До того часу файли друку, обкладинки та таймлапси отримати неможливо, але на сам друк це не впливає.",
      },
      'bambu-cloud-captcha': {
        name: "Bambu Cloud вимагає пройти CAPTCHA",
        cause: "Захист Bambu від зловживань перевіряє цю мережу, тож завершити вхід у Bambu Cloud неможливо. Це пов'язано з публічною IP-адресою, а не з вашим обліковим записом чи цією інсталяцією.",
        fix: "Зачекайте: зазвичай перевірка зникає за кілька годин, а повторні спроби входу її подовжують. Тим часом увійдіть за допомогою токена доступу із сеансу браузера.",
      },
      '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-адреси прив’язки немає служби, що приймає з’єднання, тому слайсер не може завершити процедуру виявлення.",
      },
      privileged_ports: {
        title: 'Прив’язка до привілейованих портів',
        fail: 'Порт {{port}} нижче 1024, і цій службі не дозволено його займати — тому вище ніщо не слухає. Додайте AmbientCapabilities=CAP_NET_BIND_SERVICE до /etc/systemd/system/bambuddy.service і перезапустіть або виконайте "sudo setcap cap_net_bind_service=+ep $(readlink -f $(which python3))". У Docker додайте cap_add: [NET_BIND_SERVICE].',
      },
      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).",
    mlToken: "Токен ML API (необов'язково)",
    mlTokenPlaceholder: "Залиште порожнім, якщо сервер працює без ML_API_TOKEN",
    mlTokenHint: "Має збігатися зі змінною середовища ML_API_TOKEN вашого контейнера Obico ml_api. Залиште порожнім, якщо контейнер працює без токена.",
    test: "Тест",
    testSuccess: "ML API доступний і працює належним чином.",
    testSuccessTokenUnknown: "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: {
    filamentSlot: 'Філамент {{n}}',
    loading: 'Читання траєкторії…',
    loadFailed: 'Не вдалося завантажити G-код цього файлу.',
    showTravel: 'Холості переміщення',
    topLayer: 'Верхній шар',
    bottomLayer: 'Нижній шар',
    noSource: 'Файл для перегляду не вказано.',
    view: {
      filament: 'Філамент',
      feature: 'Тип',
      height: 'Висота',
      width: 'Ширина',
    },
    feature: {
      wall: 'Стінки',
      sparseInfill: 'Розріджене заповнення',
      solidInfill: 'Суцільне заповнення',
      bridge: 'Міст / навис',
      support: 'Підтримка',
      skirt: 'Спідниця / облямівка',
      gapFill: 'Заповнення проміжків',
      ironing: 'Розгладжування',
      primeTower: 'Вежа очищення',
    },
    back: "Назад",
    backToArchives: "Назад до друку архівів",
    backToFiles: "Назад до файлового менеджера",
    plates: "Пластини",
    plateN: "Пластина {{n}}",
  },
  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: "Ви не маєте дозволу змінювати налаштування прогнозу.",
  },
};
