{{ tr('Sort') }}
{{ tr('Click again to reverse') }}
{{ mk.n }}
{{ tr(hb.t) }}
{{ tr('+ Add Project') }}
{{ tr('Delete') }}
{{ tr(currentTourStep.title) }}
{{ tr(tourModeTitle) }} · {{ tourStep + 1 }} / {{ tourSteps.length }}
{{ currentTourGroupProgress }} {{ tr('Keyboard: ← / → — previous / next, Esc — close') }}
{{ tr(currentTourPrimaryText) }}
{{ tr(currentTourStep.more) }}
{{ tr('Files') }}— {{ tr('read only') }}✕
^ ↻ C: › Users › USER › Downloads − 100% +
{{ tr('Quick access') }}
📁 {{ tr('Desktop') }}
📁 {{ tr('Downloads') }}
📁 {{ tr('Documents') }}
{{ tr('This PC') }}
💽 C:
{{ tr('File name') }} ▲{{ tr('Modified') }}{{ tr('Type') }}{{ tr('Size') }}
🧩demo_panel.gcode14.06.26, 06:44.gcode2.1 MB
{{ tr('Select a file to preview') }}
1 {{ tr('items') }}
{{ tr(sceneActionLabel) }}
{{ tr('Select AMS slot:') }}
{{ lang==='ru'?'Авто (как в файле)':'Auto (as in file)' }}
AMS 1·1
AMS 1·2 · PETG
AMS 1·3
AMS 1·4
{{ tr('Close') }}
{{ tr('Diagnostics') }} 24
✕
12:03:58INFOserver started on 0.0.0.0:8787
12:03:58INFOconfig loaded, 4 printers in fleet
12:03:59INFOHX01 connected — MQTT/TLS :8883
12:03:59INFOHS01 connected — MQTT/TLS :8883
12:04:00INFOFlashForge 5M polling http :8898
12:04:01WARNINGHX01 reports no microSD card
12:04:03INFOAMS unit 1 — 4 trays detected
12:04:03INFOtray 2 mapped: PETG (#3b82f6)
12:04:05INFOupload demo_panel.gcode → HS01
12:04:06INFOFTPS storbinary 2.1 MB transferred
12:04:07INFOprint started on HS01 (AMS 1·2)
12:04:09INFOHS01 nozzle 230°C / bed 65°C
12:04:12WARNING5M flow calibration skipped by user
12:04:15INFOstate matrix synced — 38 routes
12:04:18INFOHS01 progress 12% layer 24/210
12:04:21ERRORP2S start failed 0500-4002
12:04:21INFOretry with ftp:///sdcard/ scheme
12:04:22INFOP2S print start accepted
12:04:25INFOwebsocket clients: 2 connected
12:04:28INFOHS01 progress 18% layer 38/210
12:04:31INFOelapsed stopwatch broadcast ok
12:04:34INFOHS01 progress 23% layer 49/210
12:04:37INFOheartbeat — all 4 nodes alive
12:04:40INFOHS01 nozzle 231°C / bed 65°C
{{ tr('Opening in slicer…') }}
{{ lang==='ru'?'Проблемы принтеров':'Printer problems' }} {{ alertBadgeCount }}
{{ a.printer_name }} · {{ a.title }} {{ a.telemetry_fresh ? a.message : (lang==='ru'?'Нет свежих данных':'No fresh data') }} {{ alertTimeLabel(a.active_since) }}
{{ importProg.label }} {{ importProg.done }} / {{ importProg.total }}
{{ importProg.name }}
{{ lang==='ru'?'Очередь печати была прервана':'Print queue was interrupted' }}
{{ (lang==='ru'?'Очередь печати была прервана перезапуском. Ожидают запуска: ':'The print queue was interrupted by a restart. Waiting to start: ') + ((recoveryNotice&&recoveryNotice.held)||0) + '.' }}
{{ (lang==='ru'?'Требуют внимания (могли прерваться во время старта): ':'Need attention (possibly interrupted mid-launch): ') + recoveryNotice.attention }}
{{ lang==='ru'?'Ничего не запущено. Выберите действие — запуск пойдёт только на свободных (IDLE) принтерах, по очереди с паузой.':'Nothing has been launched. Choose an action — launches happen only on idle (IDLE) printers, one by one with a pause.' }}
{{ lang==='ru'?'Параметры запуска печати':'Print start options' }}
{{ printStartTypeLabel(printStart.ptype) }} · {{ printStart.model }}
{{ lang==='ru'?'Принтер':'Printer' }}{{ printStart.printerName }}
{{ lang==='ru'?'Файл':'File' }}{{ printStart.label }}
{{ lang==='ru'?'Источник филамента':'Filament source' }}{{ lang==='ru'?'Внешняя катушка':'External spool' }}
{{ lang==='ru'?'Слоты назначатся автоматически по нарезанному файлу (как в Bambu Studio).':'Slots are assigned automatically from the sliced file (as in Bambu Studio).' }}
{{ lang==='ru'?'Только для однофиламентного файла. Для многофиламентного выберите «Авто» или слот AMS.':'Single-filament files only. For multi-filament, choose Auto or an AMS slot.' }}
{{ lang==='ru'?'Ячейка CFS':'CFS slot' }}
{{ lang==='ru'?'Файл уйдёт как есть — ячейку выбирает он сам.':'The file is sent as is — it selects the slot itself.' }}
{{ lang==='ru'?'Программа поставит эту ячейку в файл перед отправкой. Многоцветный файл не изменяется: для него оставьте «Как в файле».':'The app will set this slot in the file before sending. A multi-colour file is never modified — leave “As in file” for it.' }}
{{ lang==='ru'?'Чтение возможностей принтера…':'Reading printer capabilities…' }}
{{ lang==='ru'?'Для этого принтера нет дополнительных параметров запуска.':'No extra start options for this printer.' }}
{{ lang==='ru'?'Диагностика принтера':'Printer diagnostics' }}
{{ klDiag.printerName }} · {{ klDiag.model }}
{{ lang==='ru'?'Диагностика подготовки печати':'Print preparation diagnostics' }}{{ lang==='ru'?'Farm Manager безопасно прочитает поддерживаемые команды и макросы принтера. Команды движения, калибровки и печати отправлены не будут.':'Farm Manager will safely read the printer\u2019s supported commands and macros. No movement, calibration or printing commands will be sent.' }}{{ klRepPhaseText() }}
{{ lang==='ru'?'Обучение Farm Manager':'Farm Manager tour' }}
{{ lang==='ru'?'Пройдите короткое знакомство или полный тур по интерфейсу. Обучение использует только демонстрационные данные и не меняет реальные принтеры, проекты и задачи.':'Take a quick introduction or the full interface tour. The tour uses only demo data and does not change real printers, projects or tasks.' }}
{{ lang==='ru'?'Что входит в полное обучение':'Full tour outline' }}
{{ section.label }}{{ lang==='ru'?'есть в коротком':'quick' }}{{ section.fullCount }}
3DIWELL
{{ tr('Data Broker') }}
{{ tr('Editing...') }}{{ tr('Saving...') }}{{ tr('Synchronized') }}{{ tr('Idle') }}
{{ helpTip.title }}
{{ helpTip.text }}
{{ lang==='ru'?'Перепечатка детали':'Reprint part' }}
{{ partDisplayName(reworkPart.part_name) }}
{{ lang==='ru'?'Не хватает':'Missing' }}: {{ reworkPart.rework_qty - reworkPart.rework_done }} ({{ lang==='ru'?'перепечатано':'reprinted' }} {{ reworkPart.rework_done }}/{{ reworkPart.rework_qty }})
{{ lang==='ru'?'Запросить ещё:':'Request more:' }}
{{ restartMessage }}
{{ lang==='ru'?'Открытые окна временно потеряют соединение, но текущие печати на принтерах продолжатся.':'Open windows will lose connection for a moment; prints already running on the printers continue.' }}
{{ (lang==='ru'?'Код причины: ':'Reason code: ') + restartReasonCode }}
3DIWELL Farm Manager
{{ lang==='ru'?'Версия программы: ':'Version: ' }}{{ appVersion || '\u2014' }}
{{ lang==='ru' ? 'Система управления фермой 3D-принтеров с одного экрана: проекты, детали, печать и мониторинг принтеров (Bambu Lab, FlashForge, Klipper/Moonraker и другие).' : 'Run your whole 3D printer farm from one screen: projects, parts, printing and live monitoring of printers (Bambu Lab, FlashForge, Klipper/Moonraker and more).' }}
{{ lang==='ru'?'Редакция':'Edition' }}{{ appEdition==='pro' ? (lang==='ru'?'Корпоративный':'Business') : (appEdition==='advanced' ? (lang==='ru'?'Коллективный':'Team') : (lang==='ru'?'Индивидуальный':'Personal')) }}
{{ lang==='ru'?'Сайт':'Website' }}www.3diwell.com
{{ lang==='ru'?'Техподдержка':'Support' }}TelegramMAX
© 2025–2026 3DIWELL. {{ lang==='ru'?'Все права защищены.':'All rights reserved.' }}
{{ lang==='ru'?'Что нового':"What's new" }}
{{ e.v }}
  • {{ it }}
{{ lang==='ru'?'Список изменений недоступен.':'Changelog unavailable.' }}
{{ lang==='ru'?'Сменить папку данных':'Change data folder' }}
{{ lang==='ru'?'Чтобы применить новую папку, программу нужно перезагрузить. Данные перенесутся автоматически.':'To apply the new folder the app needs to restart. Your data will be moved automatically.' }}
{{ restartPendingPath }}
{{ lang==='ru'?'Перезагрузка…':'Restarting…' }}

{{ tr('Suggestions') }}

{{ suggestActiveCount }} {{ suggestCollapsed ? '▸' : '▾' }}
{{ tr('Update available') }}: {{ updateInfo.latest }}
{{ updateInfo.notes }}
{{ lang==='ru' ? 'Пока нет сообщений и дел' : 'No messages or tasks yet' }}
{{ lang==='ru'?'Сообщения':'Messages' }}{{ toasts.length }}
{{ t.msg }} {{ t.at }}
{{ lang==='ru'?'Отправки':'Sends' }}{{ sendActiveCount }}
{{ j.printer_name }}{{ j.file_name }}
{{ sendStateLabel(j.state) }}
{{ sendErrLabel(j) }}
{{ lang==='ru'?'Очередь на запуск':'Launch queue' }}{{ printQueue.length }}
{{ (lang==='ru'?'Отправка на ':'Sending to ') + printSendingNow.printer_name }}
{{ lang==='ru'?'Очередь ожидания':'Waiting queue' }}{{ queueWait.length }}
{{ row.gcode_file }} {{ row.match_printer_name }}{{ queueReasonText(row.match_reason) }}

{{ ui3PpP.name }}

{{ ui3PpP.model || (lang==='ru'?'модель не указана':'model not set') }}
{{ ui3PpStateText }} {{ lang==='ru'?'Очередь':'Queue' }}
{{ cardTopAlert(ui3Printer).top.title }}+{{ cardTopAlert(ui3Printer).more }}
{{ lang==='ru' ? 'Сообщения принтера' : 'Printer messages' }} · {{ hmsCount(ui3Printer) }}
{{ hmsText(h) }} {{ lang==='ru' ? 'Уведомление принтера' : 'Printer notification' }} {{ hmsModuleText(h.module) }} · {{ hmsSevText(h.severity) }}
{{ lang==='ru' ? 'Незнакомые коды программа не расшифровывает: полный текст — на экране принтера или по QR-коду на нём' : 'Unknown codes are not translated: the full text is on the printer screen, or behind its QR code' }}
{{ lang==='ru'?'Печать':'Print' }}
{{ lang==='ru'?'Температуры':'Temperatures' }}
{{ lang==='ru'?'Сопло':'Nozzle' }}{{ ui3PpDeg(ui3PpS.nozzle_temp) }}→{{ ui3PpTgt(ui3PpS.nozzle_target) }}
{{ lang==='ru'?'Стол':'Bed' }}{{ ui3PpDeg(ui3PpS.bed_temp) }}→{{ ui3PpTgt(ui3PpS.bed_target) }}
{{ lang==='ru'?'Камера':'Chamber' }}{{ ui3PpDeg(ui3PpS.chamber_temp) }}→{{ ui3PpTgt(ui3PpS.chamber_target) }}
{{ lang==='ru'?'Пресеты прогрева':'Preheat presets' }}{{ lang==='ru'?'одни на всю ферму':'shared by the whole farm' }}
{{ lang==='ru'?'Имя':'Name' }}{{ lang==='ru'?'Сопло':'Nozzle' }}{{ lang==='ru'?'Стол':'Bed' }}{{ lang==='ru'?'Камера':'Chamber' }}
{{ ui3PresetError }}
{{ lang==='ru'?'Материал':'Material' }}{{ ui3PpNowLabel }}
{{ ui3PpP.type === 'bambu' ? 'AMS' : 'CFS' }}{{ t.short }}
{{ lang==='ru' ? 'Катушка со склада не привязана' : 'No stock spool bound' }}
{{ lang==='ru'?'Служебное':'Service' }}
{{ lang==='ru'?'Для этого принтера служебных действий сейчас нет.':'No service actions for this printer right now.' }}
{{ lang==='ru'?'Деталь':'Part' }} {{ lang==='ru'?'ЭФИР':'LIVE' }}
{{ lang==='ru'?'Камера':'Camera' }}
{{ ui3PpBusy ? (lang==='ru'?'Предпросмотра для этого файла нет':'No preview for this file') : (lang==='ru'?'Стол пуст':'The plate is empty') }}{{ lang==='ru'?'У этого принтера камеры нет.':'This printer has no camera.' }}
{{ ui3PpS.file_name || (ui3PpBusy ? '…' : (lang==='ru'?'Ничего не печатается':'Nothing is printing')) }}
{{ partDisplayName(pt.name) }} ×{{ pt.qty }}
{{ ui3PpIdleText }}
{{ ui3FilTotals.printers }}{{ lang==='ru'?' принтеров':' printers' }} {{ ui3FilTotals.slots }}{{ lang==='ru'?' слотов':' slots' }} {{ ui3FilTotals.grams }}{{ lang==='ru'?' г на ферме':' g on the farm' }} {{ ui3FilTotals.low }}{{ lang==='ru'?' скоро кончится':' running low' }} {{ ui3FilTotals.empty }}{{ lang==='ru'?' пустых':' empty' }}
{{ lang==='ru'?'Пока нечего показать: программа не получила от принтеров ни одного слота. Проверьте, что принтеры на связи, а модуль «Складской учёт» установлен — тогда здесь появятся и граммы.':'Nothing to show yet: no slots reported by the printers. Check that the printers are online and the Inventory module is installed — then grams appear here too.' }}
{{ pr.name }} {{ pr.model }}
{{ s.label }} {{ s.material || (lang==='ru'?'пусто':'empty') }} {{ s.colorName }} — {{ lang==='ru'?'остаток неизвестен':'amount unknown' }}
{{ lang==='ru'?'Граммы приходят от модуля «Складской учёт» и есть только у привязанных катушек. Слот, к которому катушка не привязана, показывает материал от самого принтера, а остаток у него неизвестен.':'Grams come from the Inventory module and exist only for bound spools. A slot without a bound spool shows the material reported by the printer, and its remaining amount is unknown.' }}
{{ lang==='ru'?'Программа сама подбирает принтер: свободный, с нужным материалом и с вашим разрешением запускать из очереди. Печать начинается по вашему подтверждению — так вы видите, куда она уйдёт.':'The program picks a printer itself: free, with the right material and allowed by you to start from the queue. Printing starts on your confirmation.' }}
{{ lang==='ru'?'Очередь пуста. Нажмите правой кнопкой на файле в «Задачах» и выберите «Добавить в очередь».':'The queue is empty. Right-click a file in Tasks and choose “Add to queue”.' }}
{{ row.gcode_file }}{{ row.material || (lang==='ru'?'материал не указан':'material unknown') }}{{ row.match_printer_name }}{{ queueReasonText(row.match_reason) }}
{{ lang==='ru'?'Кому разрешён запуск из очереди':'Allowed to start from the queue' }}
{{ queueAllowed.length }}{{ lang==='ru'?'из':'of' }} {{ printers.length }}
{{ lang==='ru'?'Отмечать можно и в списке принтеров — кнопкой рядом с «Добавить».':'You can also mark them in the printers list, next to “Add”.' }}

{{ tr('Projects') }}{{ projSort === 'name' ? '▲' : '▼' }}

{{ p2NameMsg(project2NameErr) }}
{{ tr('Nothing found') }}
{{ tr('No projects yet. Use the + New Project button to create your first one.') }}

{{ tr('Tasks') }}

{{ stagingFiles.length }} {{ tr('files') }} {{ tr('Req') }} {{ stagingTotals.req }} · {{ tr('Prnt') }} {{ stagingTotals.prnt }}
{{ pickingFiles ? tr('Selecting files…') : tr('Open') }}
{{ tr('Group') }}
{{ tr('Nothing found') }}
{{ tr('File name') }}{{ stSortDir===1 ? '▲' : '▼' }}
{{ tr('Prnt') }}{{ stSortDir===1 ? '▲' : '▼' }}{{ lang==='ru' ? 'из' : 'of' }}{{ tr('Req') }}{{ stSortDir===1 ? '▲' : '▼' }}
{{ tr('Req') }}{{ stSortDir===1 ? '▲' : '▼' }}
{{ tr('Prnt') }}{{ stSortDir===1 ? '▲' : '▼' }}
{{ tr('Status') }}{{ stSortDir===1 ? '▲' : '▼' }}
{{ tr('Printing') }}
{{ tr('No files yet. Drag a .gcode / .3mf file here or click Open.') }}
{{ f.filename }} {{ stagingStatusLabel(f) }}
{{ partDisplayName(pt.name) }} ×{{ pt.count }}
{{ tr('Total') }} {{ f.part_total || 0 }}
{{ tr('Req') }}: {{ f.required_qty }} {{ tr('Prnt') }}: {{ f.printed_qty }} .{{ f.filename.split('.').pop().toLowerCase() }}
{{ tr('No files yet. Drag a .gcode / .3mf file here or click Open.') }}
{{ tr('Settings') }}
{{ lang==='ru'?'Общие':'General' }}
{{ tourEnabled ? (lang==='ru'?'Внешний вид, обучение и отображение сроков.':'Appearance, tours and how dates are shown.') : (lang==='ru'?'Внешний вид, справка и отображение сроков.':'Appearance, help and how dates are shown.') }}
{{ lang==='ru'?'Программа':'Program' }}
{{ lang==='ru'?'Набор возможностей и сведения о версии.':'Feature set and version information.' }}
{{ lang==='ru'?'Версия программы':'Edition' }}{{ lang==='ru'?'Определяет, какие разделы доступны.':'Controls which sections are available.' }}
{{ tourEnabled ? (lang==='ru'?'Обучение':'Help') : (lang==='ru'?'Справка':'Help') }}
{{ tourEnabled ? (lang==='ru'?'Подсказки в интерфейсе и обучающие туры.':'Interface hints and guided tours.') : (lang==='ru'?'Пояснения к кнопкам и полям при наведении курсора.':'Explanations for buttons and fields when you hover them.') }}
{{ tr('Appearance') }}
{{ lang==='ru'?'Тема, шрифт и вспомогательные панели.':'Theme, font and helper panels.' }}
{{ tr('Theme') }}{{ lang==='ru'?'Выбор из двух режимов — это не «включено/выключено».':'A choice between two modes, not on/off.' }}
{{ lang==='ru'?'Шрифт':'Font' }}
{{ lang==='ru'?'Сроки':'Dates' }}
{{ lang==='ru'?'Как показываются даты и близость срока.':'How dates and approaching deadlines are shown.' }}
{{ lang==='ru'?'Предупреждать о близком сроке':'Warn about an approaching deadline' }}{{ lang==='ru'?'Жёлтая отметка, когда до срока осталось не больше указанного.':'A yellow mark when the deadline is within this many days.' }}
{{ lang==='ru'?'дней':'days' }}
{{ lang==='ru'?'Печать':'Printing' }}
{{ lang==='ru'?'Слайсер, порядок запуска и приём файлов из слайсера.':'Slicer, start order and accepting files from the slicer.' }}
{{ tr('Slicer') }}
{{ lang==='ru'?'Какая программа открывает модели для нарезки.':'Which program opens models for slicing.' }}
{{ lang==='ru'?'Программа нарезки':'Slicing program' }}{{ lang==='ru'?'«Авто» — первый найденный в системе.':'Auto picks the first one found.' }}
{{ lang==='ru'?'Поэтапный запуск печати':'Staggered print start' }}
{{ lang==='ru'?'Чтобы принтеры не стартовали одновременно.':'So the printers do not all start at once.' }}
{{ lang==='ru'?'Интервал между запусками':'Interval between starts' }}
{{ lang==='ru'?'сек':'sec' }}
i{{ lang==='ru'?'Принтеры стартуют по очереди с этим интервалом — так не перегружается электросеть. Очередь работает и при закрытой вкладке.':'Printers start one by one with this interval, so the power grid is not overloaded. The queue keeps running even with the tab closed.' }}
{{ lang==='ru'?'Интеграция со слайсером':'Slicer integration' }}
{{ lang==='ru'?'Ключ доступа':'Access key' }}{{ lang==='ru'?'В слайсере: тип хоста OctoPrint или Klipper/Moonraker, поле API Key.':'In the slicer: host type OctoPrint or Klipper/Moonraker, API Key field.' }}
!{{ lang==='ru'?'Сохраните ключ сейчас — показать его повторно нельзя.':'Save the key now — it cannot be shown again.' }}{{ sliCbToken }}{{ lang==='ru'?'После замены ключа настройку в слайсере нужно обновить.':'After replacing the key, update the slicer settings.' }}
{{ lang==='ru'?'Система':'System' }}
{{ lang==='ru'?'Инструменты, файлы принтеров, сеть, хранение данных, копии и модули.':'Tools, printer files, network, data storage, backups and modules.' }}
{{ lang==='ru'?'Быстрые инструменты':'Quick tools' }}
{{ lang==='ru'?'Отдельные экраны для проверки фермы и файлов на принтерах.':'Separate screens for checking the farm and printer files.' }}
{{ lang==='ru'?'Файлы принтеров':'Printer files' }}{{ lang==='ru'?'Эксперимент':'Experimental' }}
{{ lang==='ru'?'Доступ Farm Manager к файлам, которые хранятся на принтерах.':'Farm Manager access to files stored on the printers.' }}
!{{ lang==='ru'?'Удаление необратимо и зависит от возможностей принтера. Файл активной печати и служебные файлы защищены всегда.':'Deletion is irreversible and depends on the printer. The active print file and system files are always protected.' }}
i{{ a.name }}: {{ a.text }}
{{ lang==='ru'?'Сеть и доступ':'Network & access' }}{{ lang==='ru'?'Этот компьютер':'This computer' }}
{{ lang==='ru'?'Кто может открыть Farm Manager и на каком порту он слушает.':'Who can open Farm Manager and which port it listens on.' }}
i{{ lanBlockedText }}
!{{ lanError }}
i{{ lang==='ru'?'Связь с принтерами, камеры и печать от этой настройки не зависят.':'Printer connections, cameras and printing do not depend on this setting.' }}
{{ lang==='ru'?'Если из сети не открывается — разрешите входящий порт в брандмауэре Windows вручную: программа этого не гарантирует.':'If it does not open from the network, allow the incoming port in Windows Firewall manually: the program does not guarantee this.' }}
!{{ lang==='ru'?'Требуется перезапуск':'Restart required' }} {{ lang==='ru'?'Изменение вступит в силу после перезапуска программы.':'The change takes effect after you restart the program.' }}
{{ lang==='ru'?'Порт сервера':'Server port' }}{{ lang==='ru'?'Требуется перезапуск':'Restart required' }}{{ lang==='ru'?'Через него подключаются браузер, окно программы и клиенты.':'The browser, the app window and clients connect through it.' }}{{ netPort || '—' }}
{{ lang==='ru'?'Только чтение':'Read only' }}
i{{ lang==='ru'?'Порт меняется только на компьютере-сервере.':'The port can only be changed on the server computer.' }}
{{ lang==='ru'?'Хранение данных':'Data storage' }}{{ lang==='ru'?'Этот компьютер':'This computer' }}
{{ lang==='ru'?'Где программа держит базу, файлы и архивы на этой машине.':'Where the app keeps its database, files and archives on this machine.' }}
{{ lang==='ru'?'Папка данных':'Data folder' }}{{ storageInfo.data_dir }}
i{{ (lang==='ru'?'После перезапуска: ':'After restart: ') + dataDirPending }}
{{ lang==='ru'?'Смена папки данных применяется при следующем запуске программы.':'The new data folder takes effect on the next app start.' }}
{{ lang==='ru'?'Папка архивов':'Archive folder' }}{{ storageInfo.archive_dir }}
{{ lang==='ru'?'Доступ и аудит':'Access & audit' }}{{ authEnabled ? (lang==='ru'?'Включён':'Enabled') : (lang==='ru'?'Выключен':'Disabled') }}
{{ lang==='ru'?'Пароли, роли и журнал действий на этом сервере.':'Passwords, roles and the action log on this server.' }}
{{ lang==='ru'?'Резервная копия настроек':'Settings backup' }}{{ lang==='ru'?'Требуется перезапуск':'Restart required' }}
{{ lang==='ru'?'Что входит в копию, создание, защита паролем и восстановление.':'What the backup covers, creating it, password protection and restoring.' }}
{{ lang==='ru'?'Резервная копия сохраняет настройки Farm Manager, принтеры, данные подключения и всю пользовательскую информацию установленных модулей. Проекты и задачи в копию не входят и при восстановлении не изменяются.':'The backup saves Farm Manager settings, printers, connection data and all user information of the installed modules. Projects and tasks are not included and are never changed by a restore.' }}
• {{ lang==='ru'?'Настройки Farm Manager':'Farm Manager settings' }}
• {{ lang==='ru'?'Принтеры и данные подключения':'Printers and connection data' }}
• {{ lang==='ru'?'Складской учёт':'Inventory' }}
• {{ lang==='ru'?'Расчёт заказа — сохранённые заказы в копию пока не входят':'Order calculation — saved orders are not in the backup yet' }}
• {{ lang==='ru'?'Аналитика качества — в модуле нет пользовательских данных для сохранения':'Quality analytics — the module has no user data to save' }}
• {{ lang==='ru'?'Оформление и темы — темы хранятся в браузере этого компьютера и в копию не входят':'Appearance and themes — themes live in this browser and are not in the backup' }}
{{ lang==='ru'?'Резервная копия будет создана без пароля и содержит настройки подключения принтеров. Храните файл в защищённом месте.':'The backup will be created without a password and contains printer connection settings. Keep the file in a safe place.' }}
{{ lang==='ru'?'Потерянный пароль восстановить невозможно — копию без него не открыть.':'A lost password cannot be recovered — the backup cannot be opened without it.' }}
{{ lang==='ru'?'Папка данных, папка архивов и порт сервера относятся к этому компьютеру. При восстановлении они останутся без изменений.':'The data folder, archive folder and server port belong to this computer. They remain unchanged during a restore.' }}
{{ lang==='ru'?'Восстановление из резервной копии':'Restore from backup' }}
{{ cbPhase==='checking' ? (lang==='ru'?'Проверка резервной копии…':'Checking the backup…') : (lang==='ru'?'Подготовка плана…':'Preparing the plan…') }}
{{ lang==='ru'?'Требуется пароль':'Password required' }}
{{ lang==='ru'?'План восстановления':'Restore plan' }}
{{ (lang==='ru'?'Принтеров добавить: ':'Printers to add: ') + (cbPlan.counts ? cbPlan.counts.printers_added : 0) + (lang==='ru'?', обновить: ':', update: ') + (cbPlan.counts ? cbPlan.counts.printers_updated : 0) }}
{{ (lang==='ru'?'Настроек изменится: ':'Settings changed: ') + (cbPlan.counts ? cbPlan.counts.core_changed : 0) }}
{{ lang==='ru'?'Настройки этого компьютера':'This computer settings' }}
{{ cbMbLabel(mb.key) + ' — ' + (mb.applied ? (lang==='ru'?'требует отдельного подтверждения':'requires separate confirmation') : (lang==='ru'?'не будет изменено':'will not be changed')) }}
{{ lang==='ru'?'Данные модулей':'Module data' }}
{{ lang==='ru'?'Данные модулей отсутствуют в этой версии резервной копии и не будут изменены':'Module data is absent in this backup version and will not be changed' }}
{{ cbModLabel(m.module_id) + ' — ' + (m.data_class==='no_persistent_user_data' ? (lang==='ru'?'нет пользовательских данных':'no user data') : ((lang==='ru'?'добавить: ':'add: ') + (m.counts ? m.counts.added : 0) + (lang==='ru'?', обновить: ':', update: ') + (m.counts ? m.counts.updated : 0) + (lang==='ru'?', останется своих: ':', kept current: ') + (m.counts ? m.counts.current_only : 0))) }}
{{ w.text }}
{{ lang==='ru'?'Потребуется перезапуск программы.':'A restart will be required.' }}
{{ lang==='ru'?'Конфигурация восстановлена':'Configuration restored' }}
!{{ lang==='ru'?'Чтобы применить все восстановленные настройки, перезапустите Farm Manager.':'To apply all restored settings, restart Farm Manager.' }}
{{ lang==='ru'?'Не удалось перезапустить. Завершите Farm Manager через значок в трее и запустите снова.':'Restart failed. Close Farm Manager via the tray icon and start it again.' }}
!
{{ cbMsg.text }}
{{ lang==='ru'?'Модули':'Modules' }}
{{ lang==='ru'?'Расширения программы: что установлено, что включено и откуда ставить новое.':'Program extensions: what is installed, what is enabled and where to install from.' }}
{{ lang==='ru'?'Установленные модули':'Installed modules' }}
{{ lang==='ru'?'Нажмите на модуль, чтобы открыть его. У модуля без своего окна настройки стоят ячейкой ниже.':'Click a module to open it. A module without its own window has its settings as a cell below.' }}
{{ lang==='ru' ? l.ru : l.en }}{{ l.version ? ('v'+l.version) : (lang==='ru'?'плагин':'plugin') }}{{ lang==='ru'?'настройки ниже':'settings below' }}
{{ lang==='ru' ? m.ru : m.en }}{{ lang==='ru'?'отключён':'disabled' }}
{{ lang==='ru' ? m.ru : m.en }}{{ moduleStateText(m) }}{{ moduleVersionHint(m) }}
{{ lang==='ru'?'Установленные модули отсутствуют.':'No modules installed.' }}
{{ lang==='ru'?'Недостаточно прав для управления модулями.':'Not enough permissions to manage modules.' }}
{{ lang==='ru'?'Не удалось получить состояние модулей.':'Could not load module state.' }}
{{ lang==='ru'?'Загрузка списка модулей…':'Loading modules…' }}
{{ lang==='ru'?'Модули с пометкой ниже не загрузились. Поставьте актуальный файл — секция «Установка и обновление».':'The modules marked below did not load. Install the current file — see “Install and update”.' }}
{{ lang==='ru'?'Кнопки модулей на панели':'Module buttons on the bar' }}
{{ lang==='ru'?'Выберите, какие модули показывать кнопками справа на панели «Проекты · Задачи · Очередь · Филамент». Выбор общий для всех компьютеров фермы.':'Choose which modules appear as buttons on the right of the “Projects · Tasks · Queue · Filament” bar. The choice is shared across the farm.' }}
{{ lang==='ru'?'Выбор сохранён только на этом компьютере: сервер программы его не принял. Чаще всего помогает перезапуск Farm Manager — после него выбор станет общим для фермы.':'Saved on this computer only: the program server did not accept it. Restarting Farm Manager usually helps — after that the choice is shared across the farm.' }}
{{ lang==='ru'?'Модулей с собственным окном пока нет — показывать на панели нечего.':'No modules with their own window yet — nothing to show on the bar.' }}
{{ lang==='ru'?'Установка и обновление':'Install and update' }}
{{ moduleInstallMsg.text }}
i{{ lang==='ru'?'Новый модуль появится после перезапуска программы.':'The new module appears after the program restarts.' }}
{{ restartMessage }}
{{ lang==='ru' ? m.ru : m.en }}v{{ m.version }}
{{ lang==='ru'?'Файлы принтеров':'Printer files' }} {{ lang==='ru'?'Экспериментально':'Experimental' }}
{{ pfSummary.count }} {{ lang==='ru'?'файлов':'files' }} · {{ pfFmtSize(pfSummary.size) }} · {{ lang==='ru'?'выбрано':'selected' }} {{ pfSummary.sel }} ({{ pfFmtSize(pfSummary.selSize) }}) · {{ lang==='ru'?'свободно':'free' }} {{ pfFmtSize(pfStorage.free_bytes) }} {{ lang==='ru'?'из':'of' }} {{ pfFmtSize(pfStorage.total_bytes) }} · {{ lang==='ru'?'Удаление выключено (Настройки → Система → Файлы принтеров)':'Deletion is off (Settings → System → Printer files)' }} · {{ lang==='ru'?'Печать доступна':'Printing available' }} · {{ lang==='ru'?'Удаление не поддерживается принтером':'Deletion is not supported by the printer' }}
{{ lang==='ru'?'Этот принтер передаёт только имена файлов — размер и дата недоступны через текущий протокол.':'This printer reports file names only — size and date are unavailable via the current protocol.' }}
{{ lang==='ru'?'Загрузка списка файлов…':'Loading file list…' }}
{{ lang==='ru'?'Выберите принтер':'Select a printer' }}
{{ pfReasonText('read_disabled') }}
{{ lang==='ru'?'Не поддерживается':'Not supported' }}{{ pfReasonText(pfReason) }}
{{ lang==='ru'?'Принтер недоступен':'Printer is unreachable' }}
{{ lang==='ru'?'Накопитель не найден или извлечён':'Storage not found or removed' }}
{{ lang==='ru'?'Ошибка чтения: ':'Read error: ' }}{{ pfReasonText(pfReason) }}
{{ lang==='ru'?'На накопителе нет файлов':'No files on this storage' }}
{{ lang==='ru'?'Имя':'Name' }}{{ pfSortDir===1?'▲':'▼' }} {{ lang==='ru'?'Категория':'Category' }} {{ lang==='ru'?'Размер':'Size' }}{{ pfSortDir===1?'▲':'▼' }} {{ lang==='ru'?'Дата':'Date' }}{{ pfSortDir===1?'▲':'▼' }} {{ lang==='ru'?'Состояние':'State' }}
{{ e.name }} {{ pfCatText(e) }}{{ lang==='ru'?'Таймлапс':'Timelapse' }} {{ pfFmtSize(e.size_bytes) }} {{ e.is_directory ? '—' : pfFmtDate(e.modified_at) }} {{ lang==='ru'?'Активная печать':'Active print' }} {{ pfStatusText(e) }} {{ pfReasonText(e.protected_reason) }} —
{{ lang==='ru'?'Выбрано':'Selected' }}: {{ pfSummary.sel }}
{{ pfRowMenu.entry.name }} · {{ pfCatText(pfRowMenu.entry) }}
{{ lang==='ru'?'Отчёты и статистика':'Reports and statistics' }}
{{ lang==='ru'?'Считаем…':'Counting…' }}
{{ lang==='ru'?'Отчёты считаются по журналу печатей, а его ведёт модуль «Качество печати». Модуль не установлен — считать не из чего. Поставить: Настройки → Модули.':'Reports are built from the print log kept by the Print quality module. The module is not installed, so there is nothing to count. Install it in Settings → Modules.' }}
{{ lang==='ru'?'Модуль «Качество печати» установлен, но не работает: он выключен или не запустился. Пока он не работает, журнал печатей не ведётся и считать нечего. Включить: Настройки → Система → Модули.':'The Print quality module is installed but not running: it is switched off or failed to start. While it is not running the print log is not kept and there is nothing to count. Enable it in Settings → System → Modules.' }}
{{ lang==='ru'?'Не удалось получить список модулей, поэтому неизвестно, ведётся ли журнал печатей. Это не значит, что данных нет — проверьте связь с сервером и обновите.':'The module list could not be fetched, so it is unknown whether the print log is being kept. It does not mean there is no data — check the server connection and refresh.' }}
{{ lang==='ru'?'Не удалось прочитать журнал печатей. Проверьте, что сервер запущен, и обновите.':'The print log could not be read. Check that the server is running and refresh.' }}
{{ lang==='ru'?'За выбранный срок печатей не было.':'No prints in the selected period.' }}
{{ diagFiltered.length }}
✕
{{ diagFiltered.length }} {{ diagStateText }}
{{ tr('No records yet') }}
{{ tr('Checking connection…') }}
{{ tr('No printers') }}
{{ tr('Printer') }} {{ tr('Status') }} {{ tr('Network') }} {{ tr('Issues') }}
{{ lang==='ru'?'Сохранённая очередь запуска печати':'Durable print launch queue' }} {{ dpqActionErr }}
{{ lang==='ru'?'Не удалось загрузить очередь':'Failed to load the queue' }}
{{ lang==='ru'?'Загрузка…':'Loading…' }}
{{ lang==='ru'?'Очередь пуста':'The queue is empty' }}
{{ lang==='ru'?'Статус':'Status' }} {{ lang==='ru'?'Принтер':'Printer' }} {{ lang==='ru'?'Задание':'Job' }} {{ lang==='ru'?'Старт':'Due' }} {{ lang==='ru'?'Попыток':'Attempts' }} {{ lang==='ru'?'Ошибка':'Error' }} {{ lang==='ru'?'Действие':'Action' }}
{{ dpqStatusLabel(q.status) }} {{ q.printer_name || q.printer_id }}{{ q.flow }} {{ q.job_ref || '—' }} {{ dpqTime(q.due_ts) }} {{ q.attempts || 0 }} {{ q.last_error || '—' }} —
{{ lang==='ru'?'Перехват команды Bambu Studio':'Bambu Studio command capture' }}
{{ lang==='ru'?'Временный диагностический инструмент. Открывает ОТДЕЛЬНОЕ read-only подключение к принтеру (только подписка на команды, без отправки чего-либо) и показывает, что именно шлёт Bambu Studio при нажатии Send. Порядок: выберите Bambu-принтер → «Начать перехват» → в Bambu Studio запустите печать на ЭТОТ принтер. Останавливается сам через 120 секунд или по кнопке. Коды доступа/пароли не показываются. На печать, очередь и восстановление не влияет.':'Temporary diagnostic tool. Opens a SEPARATE read-only connection to the printer (subscribe only, never sends anything) and shows exactly what Bambu Studio sends on Send. Steps: pick a Bambu printer → Start capture → in Bambu Studio start a print to THIS printer. Auto-stops after 120 seconds or via the button. Access codes/passwords are never shown. Does not affect printing, queue or recovery.' }}
{{ sniffStatusLabel }} {{ (lang==='ru'?'осталось ':'time left ') + sniffState.remaining_s + (lang==='ru'?' c':'s') }} {{ (lang==='ru'?'перехвачено: ':'captured: ') + (sniffState.received||0) + ' · ' + (lang==='ru'?'показано ':'shown ') + (sniffState.stored||0) + '/' + (sniffState.max||20) }}
{{ lang==='ru'?'В ферме нет зарегистрированных Bambu-принтеров.':'No registered Bambu printers in the farm.' }}
{{ sniffState.active ? (lang==='ru'?'Слушаем команды. Теперь нажмите Send в Bambu Studio для выбранного принтера…':'Listening. Now press Send in Bambu Studio for the selected printer…') : (lang==='ru'?'Нажмите «Начать перехват», затем отправьте печать из Bambu Studio.':'Click Start capture, then send a print from Bambu Studio.') }}
{{ m.topic }} project_file {{ m.command }} {{ sniffTime(m.ts) }}
{{ sniffFmt(m) }}
{{ (lang==='ru'?'Сообщение не в формате JSON (длина ':'Non-JSON message (length ') + (m.raw_len||0) + (lang==='ru'?' байт), содержимое не показано.':' bytes), content not shown.') }}
{{ namePop.text }}
{{ tr('Select AMS slot:') }}
{{ getPrinterName(cameraPrinterId) }} — {{ tr('Live') }}
{{ lang==='ru' ? 'Нет связи с камерой' : 'No connection to the camera' }}
{{ tr('Files') }} — {{ tr('read only') }}
✕
{{ Math.round(exFs*100) }}%
{{ tr('Quick access') }}
{{ tr(q.name) }}
{{ tr('This PC') }}
{{ exDriveName(d) }}
{{ tr('File name') }} {{ exSortDir>0?'▲':'▼' }}{{ tr('Modified') }} {{ exSortDir>0?'▲':'▼' }}{{ tr('Type') }} {{ exSortDir>0?'▲':'▼' }}{{ tr('Size') }} {{ exSortDir>0?'▲':'▼' }}
{{ tr('Loading…') }}
{{ tr(exError) }}
{{ tr('This folder is empty') }}
{{ it.is_dir ? '📁' : exIcon(it) }}{{ it.name }} {{ fmDate(it.mtime) }} {{ it.is_dir ? tr('Folder') : (it.ext || '—') }} {{ it.is_dir ? '' : fmSize(it.size) }}
{{ tr('Select a file to preview') }}
{{ exSelected.length > 1 ? (exSelected.length + ' ' + tr('selected')) : (exSelItem ? exSelItem.name : (exItems.length + ' ' + tr('items'))) }}
{{ tr('Select AMS slot:') }}
{{ lang==='ru' ? 'Материал закончился' : 'Filament has run out' }}
{{ lang==='ru' ? 'Остальные принтеры уже поставлены в очередь. По этим нужно ваше решение — на складе такой катушки нет.' : 'The other printers are already queued. These need your decision — there is no such spool in stock.' }}
{{ r.printer_name }}
{{ ((r.material || '') + ' ' + (r.color_name || '')).trim() || tr('the spool') }}
{{ lang==='ru' ? 'нужно' : 'needed' }} {{ r.needed }} {{ lang==='ru' ? 'г' : 'g' }} · {{ lang==='ru' ? 'по учёту' : 'in stock' }} {{ r.available }} {{ lang==='ru' ? 'г' : 'g' }}
{{ r.state==='queued' ? (lang==='ru' ? 'В очереди' : 'Queued') : (r.state==='skipped' ? (lang==='ru' ? 'Пропущен' : 'Skipped') : (lang==='ru' ? 'Не удалось' : 'Failed')) }}
{{ lang==='ru' ? '«Поставил новую катушку» оприходует её и поставит в слот. «Печатать всё равно» запустит печать и спишет остаток в ноль — с записью в журнале склада.' : '“I mounted a new spool” receives it into stock and binds it to the slot. “Print anyway” starts the print and writes the leftover down to zero, with a stock-ledger entry.' }}

{{ tr('Select model') }}

{{ tr('No model covers found — put the cover PNGs into a printer_covers folder next to server.py.') }}