| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726 |
- export default {
- // Navigation
- nav: {
- printers: 'Printers',
- archives: 'Archives',
- queue: 'Queue',
- stats: 'Statistics',
- profiles: 'Profiles',
- maintenance: 'Maintenance',
- projects: 'Projects',
- inventory: 'Filament',
- files: 'File Manager',
- notifications: 'Notifications',
- settings: 'Settings',
- system: 'System',
- collapseSidebar: 'Collapse sidebar',
- expandSidebar: 'Expand sidebar',
- update: 'Update',
- updateAvailable: 'Update available: v{{version}}',
- updateAvailableBanner: 'Version {{version}} is available!',
- viewUpdate: 'View update',
- viewOnGithub: 'View on GitHub',
- keyboardShortcuts: 'Keyboard shortcuts (?)',
- switchToLight: 'Switch to light mode',
- switchToDark: 'Switch to dark mode',
- smartSwitches: 'Smart Switches',
- logout: 'Logout',
- },
- // Common
- common: {
- save: 'Save',
- saving: 'Saving...',
- cancel: 'Cancel',
- delete: 'Delete',
- edit: 'Edit',
- add: 'Add',
- close: 'Close',
- confirm: 'Confirm',
- loading: 'Loading...',
- error: 'Error',
- success: 'Success',
- warning: 'Warning',
- enabled: 'Enabled',
- disabled: 'Disabled',
- yes: 'Yes',
- no: 'No',
- on: 'On',
- off: 'Off',
- all: 'All',
- none: 'None',
- search: 'Search',
- filter: 'Filter',
- sort: 'Sort',
- refresh: 'Refresh',
- download: 'Download',
- upload: 'Upload',
- uploading: 'Uploading...',
- uploadFailed: 'Upload failed',
- actions: 'Actions',
- status: 'Status',
- name: 'Name',
- description: 'Description',
- date: 'Date',
- time: 'Time',
- hours: 'hours',
- minutes: 'minutes',
- seconds: 'seconds',
- days: 'days',
- enable: 'Enable',
- disable: 'Disable',
- permissions: 'Permissions',
- noPrinters: 'No printers configured',
- noData: 'No data available',
- linkNotFound: 'Link not found',
- required: 'Required',
- optional: 'Optional',
- dismiss: 'Dismiss',
- apply: 'Apply',
- reset: 'Reset',
- export: 'Export',
- import: 'Import',
- clear: 'Clear',
- selectAll: 'Select All',
- deselectAll: 'Deselect All',
- noChange: '— No change —',
- unchanged: 'Unchanged',
- unassigned: 'Unassigned',
- unknown: 'Unknown',
- unknownError: 'Unknown error',
- today: 'Today',
- tomorrow: 'Tomorrow',
- asap: 'ASAP',
- overdue: 'Overdue',
- now: 'Now',
- collapse: 'Collapse',
- expand: 'Expand',
- viewArchive: 'View archive',
- viewInFileManager: 'View in File Manager',
- addedBy: 'Added by {{username}}',
- prints: 'prints',
- more: '+{{count}} more',
- ascending: 'Ascending',
- descending: 'Descending',
- printer: 'Printer',
- remove: 'Remove',
- type: 'Type',
- print: 'Print',
- rename: 'Rename',
- move: 'Move',
- create: 'Create',
- duplicate: 'Duplicate',
- left: 'Left',
- right: 'Right',
- },
- // Printers page
- printers: {
- title: 'Printers',
- addPrinter: 'Add Printer',
- editPrinter: 'Edit Printer',
- deletePrinter: 'Delete Printer',
- printerName: 'Printer Name',
- serialNumber: 'Serial Number',
- ipAddress: 'IP Address / Hostname',
- accessCode: 'Access Code',
- model: 'Model',
- nozzleCount: 'Nozzle Count',
- autoArchive: 'Auto Archive',
- status: {
- available: 'Available',
- idle: 'Idle',
- printing: 'Printing',
- paused: 'Paused',
- offline: 'Offline',
- problem: 'Problem',
- error: 'Error',
- finished: 'Finished',
- unknown: 'Unknown',
- },
- temperatures: {
- nozzle: 'Nozzle',
- bed: 'Bed',
- chamber: 'Chamber',
- },
- progress: '{{percent}}% complete',
- timeRemaining: '{{time}} remaining',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
- maintenanceOk: 'Maintenance OK',
- maintenanceWarning: '{{count}} warning',
- maintenanceWarning_plural: '{{count}} warnings',
- maintenanceDue: '{{count}} due',
- maintenanceDue_plural: '{{count}} due',
- // Sort options
- sort: {
- name: 'Name',
- status: 'Status',
- model: 'Model',
- location: 'Location',
- ascending: 'Sort ascending',
- descending: 'Sort descending',
- },
- // Card size
- cardSize: {
- small: 'Small cards',
- medium: 'Medium cards',
- large: 'Large cards',
- extraLarge: 'Extra large cards',
- },
- // Controls
- hideOffline: 'Hide offline',
- nextAvailable: 'Next available',
- powerOn: 'Power On',
- offlinePrintersWithPlugs: 'Offline printers with smart plugs',
- noPrintersConfigured: 'No printers configured yet',
- // Printer card
- readyToPrint: 'Ready to print',
- external: 'External',
- extL: 'Ext-L',
- extR: 'Ext-R',
- deleteArchives: 'Delete print archives',
- noLabel: 'No label',
- printPreview: 'Print preview',
- width: 'Width',
- height: 'Height',
- noObjectsFound: 'No objects found',
- objectsLoadedOnPrintStart: 'Objects are loaded when a print starts',
- willBeSkipped: 'Will be skipped',
- name: 'Name',
- serialCannotBeChanged: 'Serial number cannot be changed',
- locationHelp: 'Used to group printers and filter queue jobs',
- // WiFi signal strength
- wifiSignal: {
- veryWeak: 'Very weak',
- weak: 'Weak',
- fair: 'Fair',
- good: 'Good',
- excellent: 'Excellent',
- },
- // Maintenance
- maintenanceUpToDate: 'All maintenance up to date - Click to view',
- // Chamber light
- chamberLightOn: 'Turn on chamber light',
- chamberLightOff: 'Turn off chamber light',
- // Files
- files: 'Files',
- browseFiles: 'Browse printer files',
- // Smart plug
- autoOffAfterPrint: 'Auto power-off after print',
- autoOffExecuted: 'Auto-off was executed - turn printer on to reset',
- // HMS errors
- hmsErrors: 'HMS Errors',
- viewHmsErrors: 'View {{count}} HMS error(s)',
- // Actions
- resume: 'Resume',
- pause: 'Pause',
- stop: 'Stop',
- camera: 'Camera',
- skipObject: 'Skip Object',
- reconnect: 'Reconnect',
- mqttDebug: 'MQTT Debug',
- printerInformation: 'Printer Information',
- copyToClipboard: 'Copy',
- copied: 'Copied!',
- state: 'State',
- wifiSignalLabel: 'WiFi Signal',
- developerMode: 'Developer Mode',
- enabled: 'Enabled',
- disabled: 'Disabled',
- addedOn: 'Added',
- sdCard: 'SD Card',
- inserted: 'Inserted',
- notInserted: 'Not inserted',
- totalPrintHours: 'Print Hours',
- activeNozzle: 'Active: {{nozzle}} nozzle',
- nozzleRack: 'Nozzle Rack',
- nozzleDocked: 'Docked',
- nozzleMounted: 'Mounted',
- nozzleActive: 'Active',
- nozzleIdle: 'Idle',
- nozzleDiameter: 'Diameter',
- nozzleType: 'Type',
- nozzleStatus: 'Status',
- nozzleFilament: 'Filament',
- nozzleWear: 'Wear',
- nozzleMaxTemp: 'Max Temp',
- nozzleSerial: 'Serial',
- nozzleHardenedSteel: 'Hardened Steel',
- nozzleStainlessSteel: 'Stainless Steel',
- nozzleTungstenCarbide: 'Tungsten Carbide',
- nozzleFlow: 'Flow',
- nozzleHighFlow: 'High Flow',
- nozzleStandardFlow: 'Standard',
- // Firmware
- firmwareUpdate: 'Firmware Update',
- firmwareInstructions: 'On the printer\'s touchscreen, go to',
- firmwareNav: 'Navigate to',
- settings: 'Settings',
- firmware: 'Firmware',
- // Discovery
- discoverPrinters: 'Discover Printers',
- searching: 'Searching...',
- manualEntry: 'Manual Entry',
- addFromCloud: 'Add from Cloud',
- // Toast messages
- toast: {
- printerDeleted: 'Printer deleted',
- missingSpoolAssignment: 'Print started on {{printer}}. Missing spool assignment for: {{slots}}',
- printerAdded: 'Printer added',
- printerUpdated: 'Printer updated',
- failedToDelete: 'Failed to delete printer',
- failedToAdd: 'Failed to add printer',
- failedToUpdate: 'Failed to update printer',
- commandSent: 'Command sent',
- failedToSendCommand: 'Failed to send command',
- turnedOn: '{{name}} turned on',
- failedToPowerOn: 'Failed to power on {{name}}',
- scriptTriggered: 'Script triggered',
- printStopped: 'Print stopped',
- printPaused: 'Print paused',
- printResumed: 'Print resumed',
- referenceDeleted: 'Reference deleted',
- detectionAreaSaved: 'Detection area saved',
- failedToRunScript: 'Failed to run script',
- failedToStopPrint: 'Failed to stop print',
- failedToPausePrint: 'Failed to pause print',
- failedToResumePrint: 'Failed to resume print',
- failedToControlChamberLight: 'Failed to control chamber light',
- failedToSetSpeed: 'Failed to set print speed',
- failedToUpdateSetting: 'Failed to update setting',
- failedToSkipObjects: 'Failed to skip objects',
- failedToRereadRfid: 'Failed to re-read RFID',
- failedToCheckPlate: 'Failed to check plate',
- failedToUpdateLabel: 'Failed to update label',
- failedToDeleteReference: 'Failed to delete reference',
- failedToSaveDetectionArea: 'Failed to save detection area',
- plateCheckEnabled: 'Plate check enabled',
- plateCheckDisabled: 'Plate check disabled',
- calibrationSaved: 'Calibration saved!',
- calibrationFailed: 'Calibration failed',
- rfidRereadInitiated: 'RFID re-read initiated',
- },
- // Connection status
- connection: {
- connected: 'Connected',
- offline: 'Offline',
- },
- // Queue info
- queue: {
- inQueue: '{{count}} print in queue',
- inQueue_plural: '{{count}} prints in queue',
- },
- // Controls section
- controls: 'Controls',
- // RFID
- rfid: {
- reread: 'Re-read RFID',
- },
- // Permissions
- permission: {
- noAdd: 'You do not have permission to add printers',
- noEdit: 'You do not have permission to edit printers',
- noDelete: 'You do not have permission to delete printers',
- noControl: 'You do not have permission to control printers',
- noFiles: 'You do not have permission to access printer files',
- noAmsRfid: 'You do not have permission to re-read AMS RFID',
- noSmartPlugControl: 'You do not have permission to control smart plugs',
- noCamera: 'You do not have permission to view cameras',
- },
- // Add/Edit modal
- modal: {
- addTitle: 'Add Printer',
- editTitle: 'Edit Printer',
- myPrinter: 'My Printer',
- selectModel: 'Select model...',
- locationGroup: 'Location / Group (optional)',
- locationPlaceholder: 'e.g., Workshop, Office, Basement',
- autoArchiveLabel: 'Auto-archive completed prints',
- fromPrinterSettings: 'From printer settings',
- modelOptional: 'Model (optional)',
- saveChanges: 'Save Changes',
- },
- // Skip objects
- skipObjects: {
- tooltip: 'Skip objects',
- onlyWhilePrinting: 'Skip objects (only while printing)',
- requiresMultiple: 'Skip objects (requires 2+ objects)',
- title: 'Skip Objects',
- matchIdsInfo: 'Match IDs with your printer display',
- printerShowsIds: 'The printer screen shows object IDs on the build plate',
- skipSelected: 'Skip Selected',
- skipping: 'Skipping...',
- noObjectsSelected: 'No objects selected',
- selectObjectsToSkip: 'Select objects you want to skip from the current print',
- skipped: 'skipped',
- objectsSkipped: 'Objects skipped',
- activeCount: '{{count}} active',
- waitForLayer: 'Wait for layer 2+ to skip objects (currently layer {{layer}})',
- skip: 'Skip',
- confirmTitle: 'Skip Object?',
- confirmMessage: 'Are you sure you want to skip "{{name}}"? This cannot be undone.',
- },
- // Confirm modals
- confirm: {
- deleteTitle: 'Delete Printer',
- deleteMessage: 'Are you sure you want to delete "{{name}}"? This will remove all connection settings.',
- deleteArchivesNote: 'All print history for this printer will be permanently deleted.',
- keepArchivesNote: 'Print history will be kept but no longer associated with this printer.',
- stopTitle: 'Stop Print',
- stopMessage: 'Are you sure you want to stop the current print on "{{name}}"? This will cancel the print job.',
- stopButton: 'Stop Print',
- pauseTitle: 'Pause Print',
- pauseMessage: 'Are you sure you want to pause the current print on "{{name}}"?',
- pauseButton: 'Pause Print',
- resumeTitle: 'Resume Print',
- resumeMessage: 'Are you sure you want to resume the print on "{{name}}"?',
- resumeButton: 'Resume Print',
- powerOnTitle: 'Power On Printer',
- powerOnMessage: 'Are you sure you want to turn ON the power for "{{name}}"?',
- powerOnButton: 'Power On',
- powerOffTitle: 'Power Off Printer',
- powerOffMessage: 'Are you sure you want to turn OFF the power for "{{name}}"?',
- powerOffWarning: 'WARNING: "{{name}}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.',
- powerOffButton: 'Power Off',
- },
- // Bulk actions
- bulk: {
- select: 'Select',
- selectAll: 'Select All',
- selectByLocation: 'Select by Location',
- selected: '{{count}} selected',
- actions: {
- stop: 'Stop',
- pause: 'Pause',
- resume: 'Resume',
- clearPlate: 'Clear Bed',
- clearHMS: 'Clear Notifications',
- },
- confirm: {
- stopTitle: 'Stop {{count}} Prints',
- stopMessage: 'This will cancel active prints on {{count}} printer(s). This action cannot be undone.',
- stopButton: 'Stop All',
- pauseTitle: 'Pause {{count}} Prints',
- pauseMessage: 'This will pause active prints on {{count}} printer(s).',
- pauseButton: 'Pause All',
- clearPlateTitle: 'Clear {{count}} Print Beds',
- clearPlateMessage: 'This will clear the print bed on {{count}} printer(s) and may trigger queued jobs.',
- clearPlateButton: 'Clear All',
- },
- success: '{{action}} completed on {{count}} printer(s)',
- partial: '{{succeeded}} succeeded, {{failed}} failed',
- noneApplicable: 'No selected printers are in the right state for this action',
- selectByState: 'Select by State',
- },
- // Discovery
- discovery: {
- title: 'Discover Printers',
- searching: 'Searching...',
- scanning: 'Scanning...',
- scanProgress: 'Scanning... {{scanned}}/{{total}}',
- foundPrinters: 'Found {{count}} printer(s)',
- noPrintersFound: 'No printers found',
- noPrintersFoundSubnet: 'No printers found in the specified subnet.',
- noPrintersFoundNetwork: 'No printers found on the network.',
- allConfigured: 'All discovered printers are already configured.',
- alreadyAdded: 'Already added',
- select: 'Select',
- manualEntry: 'Manual Entry',
- addFromCloud: 'Add from Cloud',
- subnetToScan: 'Subnet to scan',
- dockerNote: 'Docker detected. Enter your printer\'s subnet in CIDR notation. Requires network_mode: host in docker-compose.yml.',
- scanSubnet: 'Scan Subnet for Printers',
- discoverNetwork: 'Discover Printers on Network',
- scanningSubnet: 'Scanning subnet for Bambu printers...',
- scanningNetwork: 'Scanning network...',
- serialRequired: 'Serial required',
- unknown: 'Unknown',
- failedToStart: 'Failed to start discovery',
- },
- // AMS Drying
- drying: {
- start: 'Start Drying',
- stop: 'Stop Drying',
- temperature: 'Temperature',
- duration: 'Duration',
- hours: 'hours',
- timeRemaining: '{{time}} left',
- active: 'Drying',
- notSupported: 'Drying not supported',
- powerRequired: 'Connect AMS power adapter to enable drying',
- startingDrying: 'Starting drying...',
- stoppingDrying: 'Stopping drying...',
- rotateTray: 'Rotate spool during drying',
- },
- // Filaments section
- filaments: 'Filaments',
- // Camera
- openCameraOverlay: 'Open camera overlay',
- openCameraWindow: 'Open camera in new window',
- // Firmware
- firmwareUpdateAvailable: 'Firmware update available: {{current}} → {{latest}}',
- firmwareUpToDate: 'Firmware {{version}} — Up to date',
- firmwareUpdateButton: 'Update',
- // Plate detection
- plateDetection: {
- noPermission: 'You do not have permission to update printers',
- enabledClick: 'Plate check enabled - Click to disable',
- disabledClick: 'Plate check disabled - Click to enable',
- manageCalibration: 'Manage plate detection calibration',
- calibrationRequired: 'Calibration Required',
- calibrationInstructions: 'Please ensure the build plate is <strong>completely empty</strong>, then click Calibrate.',
- calibrationDescription: 'Calibration captures a reference image of the empty plate. Future checks will compare against this reference to detect objects.',
- calibrationTip: '<strong>Tip:</strong> You can store up to 5 calibrations for different plates. The system automatically uses the best match when checking.',
- plateEmpty: 'Plate appears empty',
- objectsDetected: 'Objects detected on plate',
- confidence: 'Confidence',
- difference: 'Difference',
- analysisPreview: 'Analysis preview:',
- analysisLegend: 'Green box = detection area, Red overlay = differences from calibration',
- savedReferences: 'Saved References ({{count}}/{{max}})',
- deleteReference: 'Delete reference',
- labelPlaceholder: 'Label...',
- clickToEdit: '{{label}} - Click to edit',
- clickToAddLabel: 'Click to add label',
- },
- // Speed
- speed: {
- title: 'Print Speed',
- silent: 'Silent (50%)',
- standard: 'Standard (100%)',
- sport: 'Sport (124%)',
- ludicrous: 'Ludicrous (166%)',
- },
- // Fans
- fans: {
- partCooling: 'Part Cooling Fan',
- auxiliary: 'Auxiliary Fan',
- chamber: 'Chamber Fan',
- },
- // HMS errors
- clickToViewHmsErrors: 'Click to view HMS errors',
- estimatedCompletion: 'Estimated completion time',
- plateNumber: 'Plate {{number}}',
- slotOptions: 'Slot options',
- // AMS hover popup
- amsPopup: {
- friendlyName: 'AMS Name',
- friendlyNamePlaceholder: 'e.g. AMS Friendly Name',
- serialNumber: 'Serial Number',
- firmwareVersion: 'Firmware',
- save: 'Save',
- clear: 'Clear',
- noEditPermission: 'You do not have permission to rename AMS units',
- },
- // Firmware modal
- firmwareModal: {
- title: 'Firmware Update',
- titleUpToDate: 'Firmware Info',
- currentVersion: 'Current:',
- latestVersion: 'Latest:',
- releaseNotes: 'Release Notes',
- checkingPrereqs: 'Checking prerequisites...',
- sdCardReady: 'SD card ready. Click below to upload firmware.',
- uploadedSuccess: 'Firmware uploaded to SD card!',
- applyInstructions: 'To apply the update on your printer:',
- step1: 'On the printer\'s touchscreen, go to <strong>Settings</strong>',
- step2: 'Navigate to <strong>Firmware</strong>',
- step3: 'Select <strong>Update from SD card</strong>',
- step4: 'The update will take 10-20 minutes',
- done: 'Done',
- starting: 'Starting...',
- uploadFirmware: 'Upload Firmware',
- uploadFailed: 'Failed to start upload: {{error}}',
- uploadedToast: 'Firmware uploaded! Trigger update from printer screen.',
- },
- accessCodePlaceholder: 'Leave empty to keep current',
- // ROI editor
- roi: {
- title: 'Detection Area (ROI)',
- xStart: 'X Start',
- yStart: 'Y Start',
- width: 'Width',
- height: 'Height',
- instruction: 'Adjust the detection area to focus on the build plate. The green box in the preview shows the current area.',
- },
- developerModeWarning: 'Developer LAN mode is not enabled on: {{names}}. Some features may not work.',
- howToEnable: 'How to enable',
- incompatibleFile: 'This file was sliced for {{slicedFor}}, but this printer is a {{printerModel}}',
- dropNotPrintable: 'Only .gcode and .gcode.3mf files can be printed',
- dropToPrint: 'Drop to print',
- cannotPrint: 'Printer busy',
- },
- // Archives page
- archives: {
- title: 'Print Archives',
- searchPlaceholder: 'Search archives...',
- filterByPrinter: 'Filter by printer',
- filterByStatus: 'Filter by status',
- sortBy: 'Sort by',
- sortNewest: 'Newest first',
- sortOldest: 'Oldest first',
- sortName: 'Name',
- sortDuration: 'Duration',
- sortLargest: 'Largest first',
- sortSmallest: 'Smallest first',
- sortSize: 'Size',
- noArchives: 'No archives found',
- noArchivesSearch: 'No archives match your search',
- originalPrintNotVisible: 'Original print not visible - try clearing filters',
- noArchivesYet: 'No archives yet',
- prints: 'prints',
- pagination: {
- showing: 'Showing',
- to: 'to',
- of: 'of',
- show: 'Show',
- page: 'Page',
- all: 'All',
- },
- loadingArchives: 'Loading archives...',
- releaseToUpload: 'Release to upload',
- showAll: 'Show all',
- showFavoritesOnly: 'Show favorites only',
- gridView: 'Grid view',
- listView: 'List view',
- calendarView: 'Calendar view',
- logView: 'Print Log',
- manageTags: 'Manage Tags',
- showFailedPrints: 'Show failed prints',
- hideFailedPrints: 'Hide failed prints',
- hideDuplicates: 'Hide Duplicates',
- viewOriginalPrint: 'Click to view original print (#{{id}})',
- printTime: 'Print Time',
- filamentUsed: 'Filament Used',
- cost: 'Cost',
- reprint: 'Reprint',
- preview: 'Preview',
- deleteArchive: 'Delete Archive',
- deleteConfirm: 'Are you sure you want to delete this archive?',
- favorite: 'Favorite',
- unfavorite: 'Remove from favorites',
- viewDetails: 'View Details',
- status: {
- completed: 'Completed',
- failed: 'Failed',
- stopped: 'Stopped',
- },
- toast: {
- source3mfAttached: 'Source 3MF attached: {{filename}}',
- failedUploadSource3mf: 'Failed to upload source 3MF',
- source3mfRemoved: 'Source 3MF removed',
- failedRemoveSource3mf: 'Failed to remove source 3MF',
- f3dAttached: 'F3D attached: {{filename}}',
- failedUploadF3d: 'Failed to upload F3D',
- f3dRemoved: 'F3D removed',
- failedRemoveF3d: 'Failed to remove F3D',
- timelapseAttached: 'Timelapse attached: {{filename}}',
- timelapseAlreadyAttached: 'Timelapse already attached',
- noMatchingTimelapse: 'No matching timelapse found',
- failedScanTimelapse: 'Failed to scan for timelapse',
- failedAttachTimelapse: 'Failed to attach timelapse',
- timelapseRemoved: 'Timelapse removed',
- failedRemoveTimelapse: 'Failed to remove timelapse',
- timelapseUploaded: 'Timelapse uploaded: {{filename}}',
- failedUploadTimelapse: 'Failed to upload timelapse',
- archiveDeleted: 'Archive deleted',
- failedDeleteArchive: 'Failed to delete archive',
- addedToFavorites: 'Added to favorites',
- removedFromFavorites: 'Removed from favorites',
- projectUpdated: 'Project updated',
- failedUpdateProject: 'Failed to update project',
- linkCopied: 'Link copied to clipboard',
- failedCopyLink: 'Failed to copy link',
- photoDeleted: 'Photo deleted',
- failedDeletePhoto: 'Failed to delete photo',
- failedDeleteArchives: 'Failed to delete archives',
- failedUpdateFavorites: 'Failed to update favorites',
- exportDownloaded: 'Export downloaded',
- exportFailed: 'Export failed',
- },
- menu: {
- print: 'Print',
- schedule: 'Schedule',
- openInBambuStudio: 'Open in Slicer',
- slice: 'Slice',
- externalLink: 'External Link',
- viewOnMakerWorld: 'View on MakerWorld',
- preview3d: '3D Preview',
- viewTimelapse: 'View Timelapse',
- scanForTimelapse: 'Scan for Timelapse',
- uploadTimelapse: 'Upload Timelapse',
- removeTimelapse: 'Remove Timelapse',
- downloadSource3mf: 'Download Source 3MF',
- uploadSource3mf: 'Upload Source 3MF',
- replaceSource3mf: 'Replace Source 3MF',
- removeSource3mf: 'Remove Source 3MF',
- uploadF3d: 'Upload F3D',
- replaceF3d: 'Replace F3D',
- downloadF3d: 'Download F3D',
- removeF3d: 'Remove F3D',
- download: 'Download',
- copyDownloadLink: 'Copy Download Link',
- qrCode: 'QR Code',
- viewPhotos: 'View Photos',
- viewPhotosCount: 'View Photos ({{count}})',
- projectPage: 'Project Page',
- addToFavorites: 'Add to Favorites',
- removeFromFavorites: 'Remove from Favorites',
- edit: 'Edit',
- goToProject: 'Go to Project: {{name}}',
- addToProject: 'Add to Project',
- removeFromProject: 'Remove from Project',
- loading: 'Loading...',
- noProjectsAvailable: 'No projects available',
- select: 'Select',
- deselect: 'Deselect',
- delete: 'Delete',
- },
- permission: {
- noReprint: 'You do not have permission to reprint this archive',
- noAddToQueue: 'You do not have permission to add to queue',
- noUpdateArchives: 'You do not have permission to update archives',
- noUploadFiles: 'You do not have permission to upload files',
- noDownload: 'You do not have permission to download archives',
- noCopyLink: 'You do not have permission to copy download links',
- noDelete: 'You do not have permission to delete this archive',
- noCreate: 'You do not have permission to create archives',
- },
- card: {
- previousPlate: 'Previous plate',
- nextPlate: 'Next plate',
- plateNumber: 'Plate {{index}}',
- moreOptions: 'Right-click for more options',
- addToFavorites: 'Add to favorites',
- removeFromFavorites: 'Remove from favorites',
- cancelled: 'cancelled',
- failed: 'failed',
- duplicate: 'duplicate',
- duplicateTitle: 'This model has been printed before',
- openSource3mf: 'Open source 3MF in Bambu Studio (right-click for more options)',
- downloadF3d: 'Download Fusion 360 design file',
- viewTimelapse: 'View timelapse',
- viewPhoto: 'View 1 photo',
- viewPhotos: 'View {{count}} photos',
- openFolder: 'Open folder: {{name}}',
- slicedFile: 'Sliced file - ready to print',
- sourceFile: 'Source file only - no AMS mapping available',
- gcode: 'GCODE',
- source: 'SOURCE',
- project: 'Project: {{name}}',
- estimated: 'Estimated: {{time}}',
- actual: 'Actual: {{time}}',
- accuracy: 'Accuracy: {{percent}}%',
- filament: '{{weight}}g',
- layer: '{{count}} layer',
- layers: '{{count}} layers',
- object: '{{count}} object',
- objects: '{{count}} objects',
- slicedFor: 'Sliced for {{model}}',
- uploadedBy: 'Uploaded By',
- noPermissionReprint: 'You do not have permission to reprint',
- noFileForReprint: 'No 3MF file available — the file could not be downloaded from the printer when the print was recorded',
- noPermissionEdit: 'You do not have permission to edit archives',
- noPermissionDelete: 'You do not have permission to delete archives',
- reprint: 'Reprint',
- schedulePrint: 'Schedule Print',
- schedule: 'Schedule',
- openInBambuStudio: 'Open in Slicer',
- openInBambuStudioToSlice: 'Open in Slicer to slice',
- slice: 'Slice',
- externalLink: 'External Link',
- makerWorld: 'MakerWorld: {{designer}}',
- viewProject: 'View project',
- noExternalLink: 'No external link',
- preview3d: '3D Preview',
- download: 'Download',
- edit: 'Edit',
- delete: 'Delete',
- },
- modal: {
- deleteArchive: 'Delete Archive',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"? This action cannot be undone.',
- deleteButton: 'Delete',
- removeSource3mf: 'Remove Source 3MF',
- removeSource3mfConfirm: 'Are you sure you want to remove the source 3MF file from "{{name}}"? This will delete the original slicer project file.',
- removeButton: 'Remove',
- removeF3d: 'Remove F3D',
- removeF3dConfirm: 'Are you sure you want to remove the Fusion 360 design file from "{{name}}"?',
- removeTimelapse: 'Remove Timelapse',
- removeTimelapseConfirm: 'Are you sure you want to remove the timelapse video from "{{name}}"?',
- timelapse: '{{name}} - Timelapse',
- selectTimelapse: 'Select Timelapse',
- selectTimelapseDesc: 'No auto-match found. Select the timelapse for this print:',
- deleteArchives: 'Delete Archives',
- deleteArchivesConfirm: 'Are you sure you want to delete {{count}} archive(s)? This action cannot be undone.',
- deleteCount: 'Delete {{count}}',
- },
- page: {
- title: 'Archives',
- printsCount: '{{filtered}} of {{total}} prints',
- dropFilesHere: 'Drop .3mf files here',
- releaseToUpload: 'Release to upload',
- only3mfSupported: 'Only .3mf files are supported',
- close: 'Close',
- selected: '{{count}} selected',
- selectAll: 'Select All',
- tags: 'Tags',
- project: 'Project',
- favorite: 'Favorite',
- delete: 'Delete',
- toggledFavorites: 'Toggled favorites for {{count}} archive(s)',
- failedUpdateFavorites: 'Failed to update favorites',
- archivesDeleted: '{{count}} archive(s) deleted',
- failedDeleteArchives: 'Failed to delete archives',
- photoDeleted: 'Photo deleted',
- failedDeletePhoto: 'Failed to delete photo',
- },
- list: {
- name: 'Name',
- printer: 'Printer',
- date: 'Date',
- size: 'Size',
- actions: 'Actions',
- hasTimelapse: 'Has timelapse',
- },
- log: {
- date: 'Date',
- printName: 'Print Name',
- printer: 'Printer',
- user: 'User',
- status: 'Status',
- duration: 'Duration',
- filament: 'Filament',
- allPrinters: 'All Printers',
- allUsers: 'All Users',
- allStatuses: 'All Statuses',
- cancelled: 'Cancelled',
- skipped: 'Skipped',
- dateFrom: 'From',
- dateTo: 'To',
- noEntries: 'No print log entries found',
- showing: 'Showing {{count}} of {{total}} entries',
- rowsPerPage: 'Rows',
- page: 'Page',
- prev: 'Prev',
- next: 'Next',
- clearLog: 'Clear Log',
- clearLogTitle: 'Clear Print Log',
- clearLogConfirm: 'All print log entries will be permanently deleted. Archives and queue items are not affected. This action cannot be undone. Are you sure?',
- clearLogButton: 'Clear All',
- cleared: '{{count}} log entries cleared',
- clearFailed: 'Failed to clear print log',
- },
- },
- // Queue page
- queue: {
- title: 'Print Queue',
- subtitle: 'Schedule and manage your print jobs',
- addToQueue: 'Add to Queue',
- // Print modal
- print: 'Print',
- reprint: 'Re-print',
- schedulePrint: 'Schedule Print',
- editQueueItem: 'Edit Queue Item',
- printToPrinters: 'Print to {{count}} Printers',
- queueToPrinters: 'Queue to {{count}} Printers',
- queueSelectedPlates: 'Queue {{count}} Plates',
- selectAllPlates: 'Select All {{count}} Plates',
- deselectAll: 'Deselect All',
- printQueued: 'Print queued',
- itemsQueued: '{{count}} items queued',
- sending: 'Sending...',
- sendingProgress: 'Sending {{current}}/{{total}}...',
- adding: 'Adding...',
- addingProgress: 'Adding {{current}}/{{total}}...',
- savingProgress: 'Saving {{current}}/{{total}}...',
- clearQueue: 'Clear Queue',
- clearHistory: 'Clear History',
- emptyQueue: 'Queue is empty',
- position: 'Position',
- scheduledTime: 'Scheduled Time',
- moveUp: 'Move Up',
- moveDown: 'Move Down',
- startNow: 'Start Now',
- printingInProgress: 'Printing in progress...',
- viewArchive: 'View archive',
- viewInFileManager: 'View in File Manager',
- itemCount: '{{count}} item',
- itemCount_plural: '{{count}} items',
- dragToReorder: 'Drag to reorder (ASAP only)',
- reorderHint: 'Position only affects ASAP items. Scheduled items run at their set time.',
- addedBy: 'Added by {{name}}',
- nextInQueue: 'Next in queue',
- clearPlate: 'Clear Plate & Start Next',
- clearPlateSuccess: 'Plate cleared — ready for next print',
- plateReady: 'Plate cleared — ready for next print',
- plateNumber: 'Plate {{index}}',
- // Batch / quantity
- quantity: 'Quantity',
- quantityHint: 'Creates {{count}} queue items',
- activeBatches: 'Active Batches',
- batchProgress: '{{completed}} of {{total}} completed',
- cancelBatch: 'Cancel Remaining',
- batchCancelled: 'Remaining batch items cancelled',
- cancelBatchConfirmTitle: 'Cancel Batch',
- cancelBatchConfirmMessage: 'Cancel all remaining pending items in this batch?',
- batch: 'Batch',
- // Sections
- sections: {
- currentlyPrinting: 'Currently Printing',
- queued: 'Queued',
- history: 'History',
- },
- // Status
- status: {
- pending: 'Pending',
- waiting: 'Waiting',
- printing: 'Printing',
- paused: 'Paused',
- completed: 'Completed',
- failed: 'Failed',
- skipped: 'Skipped',
- cancelled: 'Cancelled',
- },
- // Summary cards
- summary: {
- printing: 'Printing',
- queued: 'Queued',
- totalTime: 'Total Queue Time',
- totalWeight: 'Total Queue Weight',
- history: 'History',
- },
- // Filters
- filter: {
- allPrinters: 'All Printers',
- unassigned: 'Unassigned',
- allStatus: 'All Status',
- allLocations: 'All Locations',
- any: 'Any',
- },
- // Sort
- sort: {
- byPosition: 'Sort by Position',
- byName: 'Sort by Name',
- byPrinter: 'Sort by Printer',
- bySchedule: 'Sort by Schedule',
- byDate: 'Sort by Date',
- ascendingOldest: 'Ascending (oldest first)',
- descendingNewest: 'Descending (newest first)',
- },
- // Badges
- badges: {
- staged: 'Staged',
- requiresPrevious: 'Requires previous success',
- autoPowerOff: 'Auto power off',
- },
- // Empty state
- empty: {
- title: 'No prints scheduled',
- description: 'Schedule a print from the Archives page using the "Schedule" option in the context menu, or drag and drop files to get started.',
- },
- // Time
- time: {
- asap: 'ASAP',
- overdue: 'Overdue',
- now: 'Now',
- lessThanMinute: 'In less than a minute',
- inMinutes: 'In {{count}} min',
- inHours: 'In {{count}} hours',
- },
- // Actions
- actions: {
- stopPrint: 'Stop Print',
- startPrint: 'Start Print',
- requeue: 'Re-queue',
- },
- // Bulk edit
- bulkEdit: {
- title: 'Edit {{count}} Item',
- title_plural: 'Edit {{count}} Items',
- description: 'Only changed settings will be applied to selected items.',
- printer: 'Printer',
- noChange: '— No change —',
- queueOptions: 'Queue Options',
- staged: 'Staged (manual start)',
- autoPowerOff: 'Auto power off after print',
- requirePrevious: 'Require previous success',
- printOptions: 'Print Options',
- bedLevelling: 'Bed levelling',
- flowCalibration: 'Flow calibration',
- vibrationCalibration: 'Vibration calibration',
- layerInspection: 'First layer inspection',
- timelapse: 'Timelapse',
- useAms: 'Use AMS',
- applyChanges: 'Apply Changes',
- selectAll: 'Select All',
- deselectAll: 'Deselect All',
- selected: '{{count}} selected',
- editSelected: 'Edit Selected',
- cancelSelected: 'Cancel Selected',
- },
- // Confirmations
- confirm: {
- cancelTitle: 'Cancel Scheduled Print',
- cancelMessage: 'Are you sure you want to cancel "{{name}}"?',
- stopTitle: 'Stop Print',
- stopMessage: 'Are you sure you want to stop the current print "{{name}}"? This will cancel the print job on the printer.',
- removeTitle: 'Remove from History',
- removeMessage: 'Are you sure you want to remove "{{name}}" from the queue history?',
- clearHistoryTitle: 'Clear History',
- clearHistoryMessage: 'Are you sure you want to remove all {{count}} item(s) from the history?',
- cancelButton: 'Cancel Print',
- stopButton: 'Stop Print',
- thisPrint: 'this print',
- thisItem: 'this item',
- },
- // Toast messages
- toast: {
- cancelled: 'Queue item cancelled',
- cancelFailed: 'Failed to cancel item',
- removed: 'Queue item removed',
- removeFailed: 'Failed to remove item',
- stopped: 'Print stopped',
- stopFailed: 'Failed to stop print',
- released: 'Print released to queue',
- startFailed: 'Failed to start print',
- reorderFailed: 'Failed to reorder queue',
- historyCleared: 'Cleared {{count}} history item(s)',
- clearHistoryFailed: 'Failed to clear history',
- updateFailed: 'Failed to update items',
- bulkCancelled: 'Cancelled {{count}} item(s)',
- bulkCancelFailed: 'Failed to cancel items',
- },
- // Timeline view
- timeline: {
- listView: 'List',
- timelineView: 'Timeline',
- unassigned: 'Unassigned',
- noData: 'No scheduled prints for this day',
- allDoneBy: 'All prints estimated done by {{time}}',
- staged: 'Staged',
- filterAll: 'Show All',
- filterPrinting: 'Printing',
- filterQueued: 'Queued',
- time: {
- anyMoment: 'any moment',
- minutesLeft: '{{minutes}}m left',
- hoursLeft: '{{hours}}h left',
- hoursMinutesLeft: '{{hours}}h {{minutes}}m left',
- },
- day: {
- previous: 'Previous day',
- next: 'Next day',
- today: 'Today',
- },
- },
- // Permissions
- permissions: {
- noStopPrint: 'You do not have permission to stop prints',
- noStartPrint: 'You do not have permission to start prints',
- noEdit: 'You do not have permission to edit this queue item',
- noCancel: 'You do not have permission to cancel this queue item',
- noRequeue: 'You do not have permission to re-queue items',
- noRemove: 'You do not have permission to remove this queue item',
- noClearHistory: 'You do not have permission to clear all history',
- noEditItems: 'You do not have permission to edit queue items',
- noCancelItems: 'You do not have permission to cancel queue items',
- },
- },
- backgroundDispatch: {
- unknownFile: 'Unknown file',
- unknownPrinter: 'Unknown printer',
- startingPrints: 'Starting prints',
- progressSummary: '{{complete}}/{{total}} complete • Dispatched: {{dispatched}} • Processing: {{processing}}',
- expandDetails: 'Expand dispatch details',
- collapseDetails: 'Collapse dispatch details',
- dismissToast: 'Dismiss dispatch toast',
- cancelDispatchJob: 'Cancel dispatch job',
- cancel: 'Cancel',
- cancelling: 'Cancelling…',
- status: {
- dispatched: 'Dispatched',
- processing: 'Processing',
- completed: 'Completed',
- failed: 'Failed',
- cancelled: 'Cancelled',
- },
- toast: {
- cancellingUpload: 'Cancelling upload...',
- cancelled: 'Dispatch cancelled',
- cancelFailed: 'Failed to cancel dispatch',
- completeWithFailures: 'Background dispatch complete: {{completed}} succeeded, {{failed}} failed',
- completeSuccess: 'Background dispatch complete: {{completed}} succeeded',
- printStartedRemaining: '{{completed}} print(s) started, {{remaining}} more sending...',
- },
- },
- // Statistics page
- stats: {
- title: 'Dashboard',
- subtitle: 'Drag widgets to rearrange. Click the eye icon to hide.',
- overview: 'Overview',
- totalPrints: 'Total Prints',
- successRate: 'Success Rate',
- totalPrintTime: 'Total Print Time',
- printTime: 'Print Time',
- totalFilament: 'Total Filament Used',
- filamentUsed: 'Filament Used',
- filamentCost: 'Filament Cost',
- totalCost: 'Total Cost',
- energyUsed: 'Energy Used',
- energyCost: 'Energy Cost',
- averagePrintTime: 'Average Print Time',
- printsPerDay: 'Prints per Day',
- byPrinter: 'By Printer',
- printsByPrinter: 'Prints by Printer',
- byMaterial: 'By Material',
- byMonth: 'By Month',
- last7Days: 'Last 7 Days',
- last30Days: 'Last 30 Days',
- last90Days: 'Last 90 Days',
- allTime: 'All Time',
- // Widgets
- quickStats: 'Quick Stats',
- printActivity: 'Print Activity',
- filamentTypes: 'Filament Types',
- filamentTrends: 'Filament Trends',
- failureAnalysis: 'Failure Analysis',
- timeAccuracy: 'Time Accuracy',
- successful: 'Successful:',
- failed: 'Failed:',
- perfectEstimate: '100% = perfect estimate',
- noTimeAccuracyData: 'No time accuracy data yet',
- noFilamentData: 'No filament data available',
- noPrinterData: 'No printer data available',
- noPrintData: 'No print data available',
- noPrintDataLast30Days: 'No print data in the last 30 days',
- failureReasons: 'Failure Reasons',
- topFailureReasons: 'Top Failure Reasons',
- failedPrintsCount: '{{failed}} / {{total}} prints failed',
- lastWeekRate: 'Last week: {{rate}}%',
- // Actions
- resetLayout: 'Reset Layout',
- recalculateCosts: 'Recalculate Costs',
- recalculateCostsHint: 'Recalculate all archive costs using current filament prices',
- exportStats: 'Export Stats',
- exportAsCsv: 'Export as CSV',
- exportAsExcel: 'Export as Excel',
- hiddenCount: '{{count}} Hidden',
- // Toast
- exportDownloaded: 'Export downloaded',
- exportFailed: 'Export failed',
- layoutReset: 'Layout reset',
- recalculatedCosts: 'Recalculated costs for {{count}} archives',
- recalculateFailed: 'Failed to recalculate costs',
- // Loading
- loadingStats: 'Loading statistics...',
- // Permissions
- noPermissionResetLayout: 'You do not have permission to reset layout',
- noPermissionRecalculate: 'You do not have permission to recalculate costs',
- noPrintDataInRange: 'No print data in selected range',
- periodFilament: 'Period Filament',
- periodCost: 'Period Cost',
- avgPerPrint: 'Avg per Print',
- usageOverTime: 'Usage Over Time',
- filamentByWeight: 'Weight',
- printDuration: 'Print Duration',
- printerUtilization: 'Printer Utilization',
- filamentSuccess: 'Success by Material',
- printHabits: 'Print Habits',
- printTimeOfDay: 'Print Time of Day',
- colorDistribution: 'Color Distribution',
- noColorData: 'No color data available',
- records: 'Records',
- longestPrint: 'Longest Print',
- heaviestPrint: 'Heaviest Print',
- mostExpensivePrint: 'Most Expensive',
- busiestDay: 'Busiest Day',
- successStreak: 'Success Streak',
- streakPrint: 'consecutive print',
- streakPrints: '{{count}} consecutive prints',
- printerStats: 'Printer Stats',
- hours: 'hours',
- avgPrints: 'Avg. prints',
- noArchiveData: 'No print data available',
- filamentByTime: 'Time',
- avgWeight: 'Avg. weight',
- avgTime: 'Avg. time',
- filamentByPrints: 'Prints',
- timeframe: {
- 'today': 'Today',
- 'this-week': 'This Week',
- 'this-month': 'This Month',
- 'last-7': 'Last 7 Days',
- 'last-30': 'Last 30 Days',
- 'last-90': 'Last 90 Days',
- 'this-year': 'This Year',
- 'all-time': 'All Time',
- 'custom': 'Custom Range',
- from: 'From',
- to: 'To',
- },
- // User filter
- allUsers: 'All Users',
- noUser: 'No User (System)',
- filterByUser: 'Filter by User',
- },
- // Maintenance page
- maintenance: {
- title: 'Maintenance',
- overview: 'Overview',
- allOk: 'All maintenance up to date',
- dueCount: '{{count}} item due',
- dueCount_plural: '{{count}} items due',
- warningCount: '{{count}} warning',
- warningCount_plural: '{{count}} warnings',
- totalPrintTime: 'Total Print Time',
- nextMaintenance: 'Next Maintenance',
- nothingDue: 'Nothing due',
- tasks: 'Tasks',
- lastPerformed: 'Last performed',
- interval: 'Interval',
- hoursRemaining: '{{hours}}h remaining',
- hoursOverdue: '{{hours}}h overdue',
- markDone: 'Mark as Done',
- performMaintenance: 'Perform Maintenance',
- history: 'History',
- noHistory: 'No maintenance history',
- editPrintHours: 'Edit Print Hours',
- currentHours: 'Current Hours',
- // Tabs
- statusTab: 'Status',
- settingsTab: 'Settings',
- // Status
- overdueCount: '{{count}} overdue',
- dueSoonCount: '{{count}} due soon',
- dueSoon: 'Due soon',
- allGood: 'All good',
- overdueBy: 'Overdue by {{duration}}',
- dueIn: 'Due in {{duration}}',
- timeLeft: '{{duration}} left',
- // Duration formats
- day: '1 day',
- days: '{{count}} days',
- week: '1 week',
- weeks: '{{count}} weeks',
- month: '1 month',
- months: '{{count}} months',
- year: '1 year',
- // Settings
- maintenanceTypes: 'Maintenance Types',
- maintenanceTypesDescription: 'System types and your custom maintenance tasks',
- addCustomType: 'Add Custom Type',
- restoreDefaults: 'Restore Default Tasks',
- intervalType: 'Interval Type',
- intervalValue: 'Interval ({{type}})',
- icon: 'Icon',
- documentationLink: 'Documentation Link (optional)',
- assignToPrinters: 'Assign to Printers',
- selectAtLeastOnePrinter: 'Select at least one printer',
- addType: 'Add Type',
- custom: 'Custom',
- printHours: 'Print Hours',
- calendarDays: 'Calendar Days',
- exampleName: 'e.g., Replace HEPA Filter',
- viewDocumentation: 'View documentation',
- timeBasedInterval: 'Time-based interval',
- // Interval overrides
- intervalOverrides: 'Interval Overrides',
- intervalOverridesDescription: 'Customize intervals for specific printers',
- // Printer assignment
- assignedToPrinters: 'Assigned to printers:',
- noPrintersAssigned: 'No printers assigned',
- addPrinterShort: 'Add:',
- printersAssignedClick: '{{count}} printer(s) assigned - click to manage',
- removeFromPrinter: 'Remove from this printer',
- // Types
- types: {
- lubricateCarbonRods: 'Lubricate Carbon Rods',
- lubricateRails: 'Lubricate Linear Rails',
- cleanNozzle: 'Clean Nozzle/Hotend',
- checkBelts: 'Check Belt Tension',
- cleanBuildPlate: 'Clean Build Plate',
- checkExtruder: 'Check Extruder Gears',
- checkCooling: 'Check Cooling Fans',
- generalInspection: 'General Inspection',
- cleanCarbonRods: 'Clean Carbon Rods',
- lubricateSteelRods: 'Lubricate Steel Rods',
- cleanSteelRods: 'Clean Steel Rods',
- cleanLinearRails: 'Clean Linear Rails',
- checkPtfeTube: 'Check PTFE Tube',
- replaceHepaFilter: 'Replace HEPA Filter',
- replaceCarbonFilter: 'Replace Carbon Filter',
- lubricateLeftNozzleRail: 'Lubricate Left Nozzle Rail',
- },
- // Toast
- maintenanceComplete: 'Maintenance marked as complete',
- typeUpdated: 'Maintenance type updated',
- typeDeleted: 'Maintenance type deleted',
- defaultsRestored: 'Restored {{count}} default task(s)',
- printHoursUpdated: 'Print hours updated',
- printerAssigned: 'Printer assigned',
- printerRemoved: 'Printer removed',
- // Confirmation
- deleteTypeConfirm: 'Delete "{{name}}"?',
- deleteSystemTypeTitle: 'Delete default maintenance task?',
- deleteSystemTypeMessage: 'Are you sure you want to delete the default maintenance task "{{name}}"?',
- // Permissions
- noPermissionUpdate: 'You do not have permission to update maintenance items',
- noPermissionPerform: 'You do not have permission to perform maintenance',
- noPermissionEditTypes: 'You do not have permission to edit maintenance types',
- noPermissionDeleteTypes: 'You do not have permission to delete maintenance types',
- noPermissionEditHours: 'You do not have permission to edit print hours',
- noPermissionRemovePrinter: 'You do not have permission to remove printer assignments',
- noPermissionAssignPrinter: 'You do not have permission to assign printers',
- noPermissionEditIntervals: 'You do not have permission to edit intervals',
- // Configure link
- configureSettings: 'Configure maintenance types and intervals',
- },
- // Settings page
- settings: {
- title: 'Settings',
- general: 'General',
- // Tab names
- tabs: {
- general: 'General',
- smartPlugs: 'Smart Plugs',
- notifications: 'Notifications',
- queue: 'Workflow',
- filament: 'Filament',
- network: 'Network',
- apiKeys: 'API Keys',
- virtualPrinter: 'Virtual Printer',
- users: 'Authentication',
- backup: 'Backup',
- emailAuth: 'Email Authentication',
- },
- // Email settings
- email: {
- smtpSettings: 'SMTP Configuration',
- smtpHost: 'SMTP Server',
- smtpPort: 'SMTP Port',
- security: 'Security',
- authentication: 'Authentication',
- username: 'Username',
- password: 'Password',
- fromEmail: 'From Email',
- fromName: 'From Name',
- testConnection: 'Test SMTP Connection',
- testRecipient: 'Test Recipient Email',
- sendTest: 'Send Test Email',
- sending: 'Sending...',
- save: 'Save Settings',
- saving: 'Saving...',
- advancedAuth: 'Advanced Authentication',
- advancedAuthEnabled: 'Advanced Authentication is enabled',
- advancedAuthEnabledDesc: 'Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature.',
- advancedAuthDisabled: 'Advanced Authentication is disabled',
- advancedAuthDisabledDesc: 'Enable advanced authentication to activate email-based features for user management.',
- enable: 'Enable',
- disable: 'Disable',
- feature1: 'Passwords are auto-generated and emailed to new users',
- feature2: 'Users can login with username or email',
- feature3: 'Forgot password feature is available',
- feature4: 'Admins can reset user passwords via email',
- // Error messages
- errors: {
- requiredFields: 'Please fill in all required fields',
- usernameRequired: 'Username is required when authentication is enabled',
- enterTestEmail: 'Please enter a test email address',
- smtpServerAndEmail: 'Please fill in SMTP Server and From Email before testing',
- usernamePasswordRequired: 'Username and Password are required when authentication is enabled',
- configureSmtpFirst: 'Please configure and test SMTP settings first',
- enableAuthFirst: 'Please enable authentication first to use email-based features.',
- },
- // Success messages
- success: {
- settingsSaved: 'SMTP settings saved successfully',
- },
- // Security options
- securityOptions: {
- starttls: 'STARTTLS (Port 587)',
- ssl: 'SSL/TLS (Port 465)',
- none: 'None (Port 25)',
- },
- // Authentication options
- authOptions: {
- enabled: 'Enabled',
- disabled: 'Disabled',
- },
- },
- appearance: 'Appearance',
- notifications: 'Notifications',
- smartPlugs: 'Smart Plugs',
- spoolman: 'Spoolman',
- updates: 'Updates',
- language: 'Language',
- languageDescription: 'Select your preferred language',
- theme: 'Theme',
- themeLight: 'Light',
- themeDark: 'Dark',
- themeSystem: 'System',
- defaultView: 'Default View',
- defaultViewDescription: 'Page to show when opening the app',
- checkForUpdates: 'Check for Updates',
- autoUpdate: 'Auto Update',
- currentVersion: 'Current Version',
- latestVersion: 'Latest Version',
- upToDate: 'You are up to date',
- updateAvailable: 'Update available',
- // Notifications
- notificationLanguage: 'Notification Language',
- notificationLanguageDescription: 'Language for push notifications',
- bedCooledThreshold: 'Bed Cooled Threshold',
- bedCooledThresholdDescription: 'Temperature below which the bed is considered cooled after a print',
- userNotificationsEnabled: 'User Notifications',
- userNotificationsEnabledDescription: 'Enable the user notifications menu and email notifications for print job events. Requires Advanced Authentication.',
- userNotificationsDisabledHint: 'Enable Advanced Authentication to use user notifications.',
- notificationProviders: 'Notification Providers',
- addProvider: 'Add Provider',
- editProvider: 'Edit Provider',
- providerType: 'Provider Type',
- testNotification: 'Test Notification',
- testSuccess: 'Test notification sent successfully',
- testFailed: 'Failed to send test notification',
- quietHours: 'Quiet Hours',
- quietHoursDescription: 'Do not disturb during these hours',
- quietHoursStart: 'Start',
- quietHoursEnd: 'End',
- events: {
- title: 'Notification Events',
- printStart: 'Print Started',
- printComplete: 'Print Completed',
- printFailed: 'Print Failed',
- printStopped: 'Print Stopped',
- printProgress: 'Progress Milestones',
- printProgressDescription: 'Notify at 25%, 50%, 75%',
- printerOffline: 'Printer Offline',
- printerError: 'Printer Error',
- filamentLow: 'Low Filament',
- maintenanceDue: 'Maintenance Due',
- maintenanceDueDescription: 'Notify when maintenance is needed',
- },
- // Smart Plugs
- smartPlug: {
- title: 'Smart Plugs',
- add: 'Add Smart Plug',
- edit: 'Edit Smart Plug',
- name: 'Name',
- ipAddress: 'IP Address',
- linkedPrinter: 'Linked Printer',
- autoOn: 'Auto Power On',
- autoOnDescription: 'Turn on when print starts',
- autoOff: 'Auto Power Off',
- autoOffDescription: 'Turn off after print completes',
- offDelay: 'Off Delay',
- offDelayMinutes: 'Minutes after print',
- offDelayTemp: 'When nozzle below temperature',
- currentState: 'Current State',
- turnOn: 'Turn On',
- turnOff: 'Turn Off',
- },
- // Filament Tracking Mode
- filamentTracking: 'Filament Tracking',
- filamentTrackingDesc: 'Choose how to track your filament spools. You can use the built-in inventory or connect an external Spoolman server.',
- filamentChecks: 'Filament checks',
- disableFilamentWarnings: 'Disable filament warnings',
- disableFilamentWarningsDesc: 'Don\'t show warnings about insufficient filament when printing or queueing',
- preferLowestFilament: 'Prefer lowest remaining filament',
- preferLowestFilamentDesc: 'When multiple spools match, use the one with the least filament remaining',
- trackingModeBuiltIn: 'Built-in Inventory',
- trackingModeBuiltInDesc: 'RFID auto-matching and usage tracking included',
- trackingModeSpoolmanDesc: 'External filament management server',
- builtInFeatureRfid: 'Automatically detects Bambu Lab RFID spools in AMS',
- builtInFeatureUsage: 'Tracks filament consumption per print',
- builtInFeatureCatalog: 'Manage spools, colors, and K-factor profiles',
- builtInFeatureThirdParty: 'Third-party spools can be assigned to inventory spools',
- amsSyncButton: 'Sync Weights from AMS',
- amsSyncTitle: 'Sync Spool Weights from AMS',
- amsSyncMessage: 'This will overwrite all inventory spool weights with the current AMS remain% values from connected printers. Use this to recover from corrupted weight data. Printers must be online.',
- amsSyncing: 'Syncing...',
- amsSyncSuccess: '{{synced}} spool(s) synced, {{skipped}} skipped',
- amsSyncError: 'Failed to sync weights from AMS',
- // Spoolman settings
- spoolmanUrl: 'Spoolman URL',
- spoolmanUrlHint: 'URL of your Spoolman server (e.g., http://localhost:7912)',
- spoolmanConnected: 'Connected',
- spoolmanDisconnected: 'Disconnected',
- status: 'Status',
- connect: 'Connect',
- disconnect: 'Disconnect',
- howSyncWorks: 'How Sync Works',
- syncInfoRfidOnly: 'Only official Bambu Lab spools with RFID are synced',
- syncInfoAutoCreate: 'New spools are auto-created in Spoolman on first sync',
- syncInfoThirdPartySkipped: 'Non-Bambu Lab spools (third-party, refilled) are skipped',
- linkingExistingSpools: 'Linking Existing Spools',
- linkingExistingSpoolsDesc: 'To link existing Spoolman spools to your AMS, hover over an AMS slot and click "Link to Spoolman".',
- syncMode: 'Sync Mode',
- syncModeAuto: 'Automatic',
- syncModeManual: 'Manual Only',
- syncModeAutoDesc: 'AMS data syncs automatically when changes are detected',
- syncModeManualDesc: 'Only sync when manually triggered',
- syncAmsData: 'Sync AMS Data',
- syncAmsDataDesc: 'Manually sync printer AMS data to Spoolman',
- allPrinters: 'All Printers',
- // Default printer
- noDefaultPrinter: 'No default (ask each time)',
- // Sidebar
- sidebarOrder: 'Sidebar order',
- // Camera
- saveThumbnails: 'Save thumbnails',
- captureFinishPhoto: 'Capture finish photo',
- noPrintersConfigured: 'No printers configured',
- // Archive settings
- archiveMode: {
- always: 'Always create archive entry',
- never: 'Never create archive entry',
- ask: 'Ask each time',
- },
- // Updates
- checkForUpdatesLabel: 'Check for updates',
- checkPrinterFirmware: 'Check printer firmware',
- includeBetaUpdates: 'Include beta versions',
- includeBetaUpdatesDesc: 'Notify about beta and prerelease versions when checking for updates',
- // Queue
- enableRetry: 'Enable retry',
- // Home Assistant
- homeAssistantDescription: 'Control smart plugs via Home Assistant',
- environmentManagedLabel: '(Environment Managed)',
- autoEnabledViaEnv: 'Automatically enabled via environment variables',
- urlFromEnvReadOnly: 'Value set by HA_URL environment variable (read-only)',
- tokenFromEnvReadOnly: 'Value set by HA_TOKEN environment variable (read-only)',
- // MQTT
- mqttConnectedTo: 'Connected to',
- // Prometheus
- prometheusDescription: 'Expose printer data in Prometheus format',
- // Smart plugs empty state
- noSmartPlugsTitle: 'No smart plugs configured',
- noSmartPlugsDescription: 'Add a Tasmota-based smart plug to track energy usage and automate power control.',
- // Notifications empty state
- noProvidersTitle: 'No providers configured',
- noProvidersDescription: 'Add a provider to receive alerts.',
- noTemplatesAvailable: 'No templates available. Restart the backend to seed default templates.',
- // API permissions
- apiPermissionView: 'View printer status and queue',
- apiPermissionEdit: 'Add and remove items from print queue',
- // API keys
- apiKeysEmptyTitle: 'No API keys',
- apiKeysEmptyDescription: 'Create an API key to integrate with external services.',
- // Users
- noUsersFound: 'No users found',
- noGroupsFound: 'No groups found',
- noGroupsAvailable: 'No groups available',
- passwordsDoNotMatch: 'Passwords do not match',
- systemGroupWarning: 'System group names cannot be changed',
- // Auth disabled
- authDisabledTitle: 'Authentication is Disabled',
- authDisabledFeature1: 'Require login to access the system',
- authDisabledFeature2: 'Create multiple users with group-based permissions',
- authDisabledFeature3: 'Control access with 50+ granular permissions',
- // User deletion
- userHasCreated: 'This user has created:',
- userItemsQuestion: 'What would you like to do with these items?',
- deleteUserConfirm: 'Are you sure you want to delete this user?',
- actionCannotBeUndone: 'This action cannot be undone.',
- // Smart plugs
- addFirstSmartPlug: 'Add Your First Smart Plug',
- // Notifications
- providers: 'Providers',
- log: 'Log',
- testAll: 'Test All',
- testResults: 'Test Results',
- testPassedCount: '{{count}} passed',
- testFailedCount: '{{count}} failed',
- messageTemplates: 'Message Templates',
- messageTemplatesDescription: 'Customize notification messages for each event.',
- // API Keys section
- apiKeys: 'API Keys',
- apiKeysDescription: 'Create API keys for external integrations and webhooks.',
- createKey: 'Create Key',
- apiKeyCreated: 'API Key Created Successfully',
- apiKeyCopyWarning: "Copy this key now - it won't be shown again!",
- useInApiBrowser: 'Use in API Browser',
- createNewApiKey: 'Create New API Key',
- keyName: 'Key Name',
- keyNamePlaceholder: 'e.g., Home Assistant, OctoPrint',
- readStatus: 'Read Status',
- readStatusDescription: 'View printer status and queue',
- manageQueue: 'Manage Queue',
- manageQueueDescription: 'Add and remove items from print queue',
- controlPrinter: 'Control Printer',
- controlPrinterDescription: 'Pause, resume, and stop prints',
- unnamedKey: 'Unnamed Key',
- lastUsed: 'Last used',
- read: 'Read',
- control: 'Control',
- createFirstKey: 'Create Your First Key',
- webhookEndpoints: 'Webhook Endpoints',
- webhookApiKeyHint: 'Use your API key in the X-API-Key header.',
- webhook: {
- getAllStatus: 'Get all printer status',
- getSpecificStatus: 'Get specific printer status',
- addToQueue: 'Add to print queue',
- pausePrint: 'Pause print',
- resumePrint: 'Resume print',
- stopPrint: 'Stop print',
- },
- apiBrowser: 'API Browser',
- apiBrowserDescription: 'Explore and test all available API endpoints.',
- apiKeyForTesting: 'API Key for Testing',
- apiKeyPlaceholder: 'Paste your API key here to test authenticated endpoints...',
- apiKeyHint: 'This key will be sent as X-API-Key header with requests.',
- deleteApiKeyTitle: 'Delete API Key',
- deleteApiKeyMessage: 'Are you sure you want to delete this API key? Any integrations using this key will stop working.',
- deleteKey: 'Delete Key',
- // Filament tab
- amsDisplayThresholds: 'AMS Display Thresholds',
- amsThresholdsDescription: 'Configure color thresholds for AMS humidity and temperature indicators.',
- humidity: 'Humidity',
- goodGreen: 'Good (green)',
- fairOrange: 'Fair (orange)',
- aboveFairBad: 'Above fair threshold shows as red (bad)',
- fairAlsoDryingThreshold: 'This threshold is also used to trigger auto-drying when enabled',
- temperature: 'Temperature',
- goodBlue: 'Good (blue)',
- aboveFairHot: 'Above fair threshold shows as red (hot)',
- historyRetention: 'History Retention',
- keepSensorHistory: 'Keep sensor history for',
- historyRetentionDescription: 'Older humidity and temperature data will be automatically deleted',
- defaultPrintOptions: 'Default Print Options',
- defaultPrintOptionsDescription: 'Set default values for print options when starting new prints. These can be overridden per print in the print dialog.',
- defaultBedLevelling: 'Bed Levelling',
- defaultBedLevellingDesc: 'Auto-level bed before print',
- defaultFlowCali: 'Flow Calibration',
- defaultFlowCaliDesc: 'Calibrate extrusion flow',
- defaultVibrationCali: 'Vibration Calibration',
- defaultVibrationCaliDesc: 'Reduce ringing artifacts',
- defaultLayerInspect: 'First Layer Inspection',
- defaultLayerInspectDesc: 'AI inspection of first layer',
- defaultTimelapse: 'Timelapse',
- defaultTimelapseDesc: 'Record timelapse video',
- staggeredStart: 'Staggered Start',
- staggeredStartDescription: 'Default group size and interval when staggering multi-printer batch starts. Can be overridden per batch in the print modal.',
- plateClear: 'Plate-Clear Confirmation',
- requirePlateClear: 'Require plate-clear confirmation',
- requirePlateClearDescription: 'When enabled, the scheduler waits for per-printer plate-clear confirmation before starting queued prints on printers with finished jobs. Disable for farm workflows where plates are verified physically.',
- staggerGroupSize: 'Group size',
- staggerGroupSizeHelp: 'Printers to start simultaneously per group',
- staggerInterval: 'Interval (minutes)',
- staggerIntervalHelp: 'Delay between each group starting',
- queueDrying: 'Queue Auto-Drying',
- queueDryingDescription: 'Automatically dry AMS filament when printer is idle between queued prints. Uses humidity threshold above to trigger drying.',
- queueDryingEnabled: 'Enable auto-drying',
- queueDryingEnabledDescription: 'Start AMS drying automatically when printer is idle and humidity is above threshold',
- queueDryingBlock: 'Wait for drying to complete',
- queueDryingBlockDescription: 'Block the print queue until drying finishes. When off, prints take priority over drying.',
- ambientDryingEnabled: 'Ambient drying',
- ambientDryingEnabledDescription: 'Automatically dry filament on idle printers when humidity exceeds threshold, even without queued prints.',
- dryingPresets: 'Drying Presets',
- dryingPresetsDescription: 'Temperature and duration per filament type. AMS 2 Pro uses lower temps, AMS-HT supports higher temps.',
- dryingFilament: 'Filament',
- printModal: 'Print Modal',
- expandCustomMapping: 'Expand custom mapping by default',
- expandCustomMappingDescription: 'When printing to multiple printers, show per-printer AMS mapping expanded',
- // User management
- authentication: 'Authentication',
- authEnabledDescription: 'Your instance is secured with user authentication',
- authDisabledDescription: 'Enable to require login and manage user access',
- authDisabledMessage: 'Enable authentication to create user accounts, manage permissions, and secure your Bambuddy instance.',
- enableAuthentication: 'Enable Authentication',
- currentUser: 'Current User',
- changePassword: 'Change Password',
- admin: 'Admin',
- users: 'Users',
- addUser: 'Add User',
- groups: 'Groups',
- addGroup: 'Add Group',
- system: 'System',
- noDescription: 'No description',
- userCount: '{{count}} users',
- permissionCount: '{{count}} permissions',
- createUser: 'Create User',
- username: 'Username',
- enterUsername: 'Enter username',
- password: 'Password',
- enterPassword: 'Enter password (min 6 characters)',
- confirmPassword: 'Confirm Password',
- confirmPasswordPlaceholder: 'Confirm password',
- // Title tooltips
- viewReleaseOnGitHub: 'View release on GitHub',
- turnAllPlugsOn: 'Turn all plugs on',
- turnAllPlugsOff: 'Turn all plugs off',
- // Modal: Clear logs
- clearNotificationLogs: 'Clear Notification Logs',
- clearLogsMessage: 'This will permanently delete all notification logs older than 30 days. This action cannot be undone.',
- clearLogs: 'Clear Logs',
- // Modal: Reset UI
- resetUiPreferences: 'Reset UI Preferences',
- resetUiPreferencesMessage: 'This will reset all UI preferences to defaults: sidebar order, theme, dashboard layout, view modes, and sorting preferences. Your printers, archives, and server settings will NOT be affected. The page will reload after clearing.',
- resetPreferences: 'Reset Preferences',
- // Modal: Delete group
- deleteGroupTitle: 'Delete Group',
- deleteGroupMessage: 'Are you sure you want to delete this group? Users in this group will lose these permissions.',
- deleteGroup: 'Delete Group',
- // Modal: Disable auth
- disableAuthenticationTitle: 'Disable Authentication',
- disableAuthenticationMessage: 'Are you sure you want to disable authentication? This will make your Bambuddy instance accessible without login. All users will remain in the database but authentication will be disabled.',
- disableAuthentication: 'Disable Authentication',
- // Additional settings
- configureBambuddy: 'Configure Bambuddy',
- systemDefault: 'System Default',
- archiveSettings: 'Archive Settings',
- newWindow: 'New Window',
- embeddedOverlay: 'Embedded Overlay',
- preferredSlicer: 'Preferred Slicer',
- preferredSlicerDescription: 'Choose which slicer application to open files with',
- externalCameras: 'External Cameras',
- costTracking: 'Cost Tracking',
- printsOnly: 'Prints Only',
- totalConsumption: 'Total Consumption',
- dataManagement: 'Data Management',
- storageUsage: 'Storage Usage',
- storageUsageDescription: 'Breakdown of data usage by category',
- storageUsageTotal: 'Total',
- storageUsageErrors: 'Errors',
- storageUsageOtherBreakdown: 'Other (includes static assets, scripts, and configuration files)',
- storageUsageSystem: 'System',
- storageUsageData: 'Data',
- storageUsageUnavailable: 'Storage usage information unavailable',
- clearNotificationLogsDescription: 'Delete notification logs older than 30 days',
- resetUiPreferencesDescription: 'Reset sidebar order, theme, view modes, and layout preferences. Printers, archives, and settings are not affected.',
- enableHomeAssistant: 'Enable Home Assistant',
- enableMqtt: 'Enable MQTT',
- useTls: 'Use TLS',
- enableMetricsEndpoint: 'Enable Metrics Endpoint',
- availableMetrics: 'Available Metrics',
- editUser: 'Edit User',
- deleteUserTitle: 'Delete User',
- groupName: 'Group Name',
- // Placeholders
- leaveEmptyForAnonymous: 'Leave empty for anonymous',
- leaveEmptyForNoAuth: 'Leave empty for no authentication',
- enterNewPassword: 'Enter new password',
- confirmNewPassword: 'Confirm new password',
- enterGroupName: 'Enter group name',
- enterDescriptionOptional: 'Enter description (optional)',
- enterCurrentPassword: 'Enter current password',
- enterNewPasswordMin6: 'Enter new password (min 6 characters)',
- toast: {
- keyCopied: 'Key copied to clipboard',
- copyFailed: 'Failed to copy key',
- keyAddedToBrowser: 'Key added to API Browser',
- clearLogsFailed: 'Failed to clear logs',
- uiPreferencesReset: 'UI preferences reset. Refreshing...',
- authDisabled: 'Authentication disabled successfully',
- authDisableFailed: 'Failed to disable authentication',
- apiKeyCreated: 'API key created',
- apiKeyDeleted: 'API key deleted',
- userCreated: 'User created successfully',
- userUpdated: 'User updated successfully',
- userDeleted: 'User deleted successfully',
- groupCreated: 'Group created successfully',
- groupUpdated: 'Group updated successfully',
- groupDeleted: 'Group deleted successfully',
- fillRequiredFields: 'Please fill in all required fields',
- passwordsDoNotMatch: 'Passwords do not match',
- passwordTooShort: 'Password must be at least 6 characters',
- enterGroupName: 'Please enter a group name',
- settingsSaved: 'Settings saved',
- cameraSettingsSaved: 'Camera settings saved',
- enterCameraUrl: 'Please enter a camera URL',
- passwordChanged: 'Password changed successfully',
- connectionFailed: 'Connection failed',
- testFailed: 'Test failed',
- cameraConnected: 'Camera connected{{resolution}}',
- },
- testConnection: 'Test Connection',
- catalog: {
- spoolCatalog: 'Spool Catalog',
- spoolCatalogDescription: 'Empty spool weights by brand/type. Used for automatic weight lookup when adding spools.',
- searchCatalog: 'Search catalog...',
- addNewEntry: 'Add New Entry',
- namePlaceholder: 'Name (e.g., Bambu Lab - Plastic)',
- weight: 'Weight',
- type: 'Type',
- default: 'Default',
- custom: 'Custom',
- noMatch: 'No entries match your search',
- empty: 'No entries in catalog',
- deleteEntry: 'Delete Entry',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
- resetCatalog: 'Reset Catalog',
- resetConfirm: 'Reset catalog to defaults? This will remove all custom entries.',
- loadFailed: 'Failed to load spool catalog',
- nameWeightRequired: 'Name and weight are required',
- entryAdded: 'Entry added',
- addFailed: 'Failed to add entry',
- entryUpdated: 'Entry updated',
- updateFailed: 'Failed to update entry',
- entryDeleted: 'Entry deleted',
- deleteFailed: 'Failed to delete entry',
- resetSuccess: 'Catalog reset to defaults',
- resetFailed: 'Failed to reset catalog',
- exported: 'Exported {{count}} entries',
- imported: 'Imported {{added}} entries ({{skipped}} skipped)',
- importFailed: 'Failed to import: invalid JSON format',
- exportTooltip: 'Export catalog to JSON',
- importTooltip: 'Import catalog from JSON',
- resetTooltip: 'Reset to defaults',
- selectedCount: '{{count}} selected',
- deleteSelected: 'Delete Selected',
- bulkDeleteConfirm: 'Are you sure you want to delete {{count}} entries?',
- bulkDeleted: 'Deleted {{count}} entries',
- bulkDeleteFailed: 'Failed to delete entries',
- },
- colorCatalog: {
- title: 'Color Catalog',
- description: 'Filament colors by manufacturer/material. Used for automatic color lookup when adding spools.',
- searchColors: 'Search colors...',
- allManufacturers: 'All manufacturers',
- addNewColor: 'Add New Color',
- manufacturer: 'Manufacturer',
- colorName: 'Color Name',
- hex: 'Hex',
- materialOptional: 'Material (optional)',
- showing: 'Showing {{filtered}} of {{total}} colors',
- noMatch: 'No colors match your search',
- empty: 'No colors in catalog',
- deleteColor: 'Delete Color',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
- resetCatalog: 'Reset Color Catalog',
- resetConfirm: 'Reset catalog to defaults? This will remove all custom colors.',
- sync: 'Sync',
- starting: 'Starting...',
- syncTooltip: 'Sync from FilamentColors.xyz (2000+ colors, may take a minute)',
- loadFailed: 'Failed to load color catalog',
- fieldsRequired: 'Manufacturer, color name, and hex color are required',
- colorAdded: 'Color added',
- addFailed: 'Failed to add color',
- colorUpdated: 'Color updated',
- updateFailed: 'Failed to update color',
- colorDeleted: 'Color deleted',
- deleteFailed: 'Failed to delete color',
- resetSuccess: 'Color catalog reset to defaults',
- resetFailed: 'Failed to reset catalog',
- syncUpToDate: 'Already up to date ({{count}} colors checked)',
- syncComplete: 'Added {{added}} new colors ({{skipped}} already existed)',
- syncError: 'Sync error',
- syncFailed: 'Failed to sync from FilamentColors.xyz',
- exported: 'Exported {{count}} colors',
- imported: 'Imported {{added}} colors ({{skipped}} skipped)',
- importFailed: 'Failed to import: invalid JSON format',
- selectedCount: '{{count}} selected',
- deleteSelected: 'Delete Selected',
- bulkDeleteConfirm: 'Are you sure you want to delete {{count}} colors?',
- bulkDeleted: 'Deleted {{count}} colors',
- bulkDeleteFailed: 'Failed to delete colors',
- },
- // General tab
- dateFormat: 'Date Format',
- dateFormatUs: 'US (MM/DD/YYYY)',
- dateFormatEu: 'EU (DD/MM/YYYY)',
- dateFormatIso: 'ISO (YYYY-MM-DD)',
- timeFormat: 'Time Format',
- timeFormat12: '12-hour (3:30 PM)',
- timeFormat24: '24-hour (15:30)',
- defaultPrinter: 'Default Printer',
- defaultPrinterDescription: 'Pre-select this printer for uploads, reprints, and other operations.',
- slicerBambuStudio: 'Bambu Studio',
- slicerOrcaSlicer: 'OrcaSlicer',
- sidebarOrderDescription: 'Drag items in the sidebar to reorder. Reset to default order here.',
- setDefault: 'Set Default',
- sidebarOrderSetDefaultHint: 'Set default applies the current menu order to users who haven\'t customized theirs.',
- sidebarDefaultSet: 'Default menu order has been set.',
- sidebarDefaultCleared: 'Default menu order cleared.',
- sidebarDefaultFailed: 'Failed to set default menu order.',
- reset: 'Reset',
- // Appearance
- darkMode: 'Dark Mode',
- lightMode: 'Light Mode',
- active: '(active)',
- background: 'Background',
- accent: 'Accent',
- style: 'Style',
- bgNeutral: 'Neutral',
- bgWarm: 'Warm',
- bgCool: 'Cool',
- bgOled: 'OLED Black',
- bgSlate: 'Slate Blue',
- bgForest: 'Forest Green',
- accentGreen: 'Green',
- accentTeal: 'Teal',
- accentBlue: 'Blue',
- accentOrange: 'Orange',
- accentPurple: 'Purple',
- accentRed: 'Red',
- styleClassic: 'Classic',
- styleGlow: 'Glow',
- styleVibrant: 'Vibrant',
- themeToggleHint: 'Toggle between dark and light mode using the sun/moon icon in the sidebar.',
- // Archive
- autoArchivePrints: 'Auto-archive prints',
- autoArchiveDescription: 'Automatically save 3MF files when prints complete',
- saveThumbnailsDescription: 'Extract and save preview images from 3MF files',
- captureFinishPhotoDescription: 'Take a photo from printer camera when print completes',
- ffmpegNotInstalled: 'ffmpeg not installed',
- ffmpegRequired: 'Camera capture requires ffmpeg. Install it via <brew>brew install ffmpeg</brew> (macOS) or <apt>apt install ffmpeg</apt> (Linux).',
- // Camera
- camera: 'Camera',
- cameraViewMode: 'Camera View Mode',
- cameraOverlayDescription: 'Camera opens in a resizable overlay on the main screen',
- cameraWindowDescription: 'Camera opens in a separate browser window',
- externalCamerasDescription: 'Configure external cameras to replace the built-in printer camera. Supports MJPEG streams, RTSP, HTTP snapshots, and USB cameras (V4L2). When enabled, the external camera is used for live view and finish photos.',
- cameraPlaceholderUsb: 'Device path (/dev/video0)',
- cameraPlaceholderUrl: 'Camera URL (rtsp://... or http://...)',
- cameraTypeMjpeg: 'MJPEG Stream',
- cameraTypeRtsp: 'RTSP Stream',
- cameraTypeSnapshot: 'HTTP Snapshot',
- cameraTypeUsb: 'USB Camera (V4L2)',
- cameraRotation: 'Rotation',
- test: 'Test',
- connected: 'Connected',
- disconnected: 'Disconnected',
- // Cost tracking
- currency: 'Currency',
- defaultFilamentCost: 'Default filament cost (per kg)',
- electricityCost: 'Electricity cost per kWh',
- energyDisplayMode: 'Energy display mode',
- energyModePrintDescription: 'Dashboard shows sum of energy used during prints',
- energyModeTotalDescription: 'Dashboard shows lifetime energy from smart plugs',
- // File Manager
- fileManager: 'File Manager',
- createArchiveEntry: 'Create Archive Entry When Printing',
- createArchiveEntryDescription: 'When printing from File Manager, optionally create an archive entry',
- lowDiskSpaceWarning: 'Low Disk Space Warning',
- lowDiskSpaceDescription: 'Show warning when free disk space falls below this threshold',
- // Updates
- printerFirmware: 'Printer Firmware',
- checkFirmwareDescription: 'Check for printer firmware updates from Bambu Lab',
- bambuddySoftware: 'Bambuddy Software',
- autoCheckDescription: 'Automatically check for new versions on startup',
- checkNow: 'Check now',
- updateAvailableVersion: 'Update available: v{{version}}',
- releaseNotes: 'Release Notes',
- updateViaDocker: 'Update via Docker Compose:',
- installUpdate: 'Install Update',
- latestVersionRunning: "You're running the latest version",
- failedToCheckUpdates: 'Failed to check for updates: {{error}}',
- // Data Management
- backupRestore: 'Backup & Restore',
- backupRestoreDescription: 'Export/import settings and configure GitHub backup',
- goToBackup: 'Go to Backup',
- // Network tab
- externalUrl: 'External URL',
- externalUrlDescription: 'The external URL where Bambuddy is accessible. Used for notification images and external integrations.',
- bambuddyUrl: 'Bambuddy URL',
- externalUrlHint: 'Include protocol and port (e.g., http://192.168.1.100:8000)',
- ftpRetry: 'FTP Retry',
- ftpRetryDescription: 'Retry FTP operations when printer WiFi is unreliable. Applies to 3MF downloads, print uploads, timelapse downloads, and firmware updates.',
- autoRetryDescription: 'Automatically retry failed FTP operations',
- retryAttempts: 'Retry attempts',
- retryDelay: 'Retry delay',
- connectionTimeout: 'Connection timeout',
- time_one: '{{count}} time',
- time_other: '{{count}} times',
- second_one: '{{count}} second',
- second_other: '{{count}} seconds',
- nSeconds: '{{count}} seconds',
- increaseForWeakWifi: 'Increase for printers with weak WiFi',
- // Home Assistant
- homeAssistant: 'Home Assistant',
- homeAssistantFullDescription: 'Connect to Home Assistant to control smart plugs via HA\'s REST API. Supports switch, light, input_boolean, and script entities.',
- homeAssistantUrl: 'Home Assistant URL',
- longLivedAccessToken: 'Long-Lived Access Token',
- haTokenHint: 'Create a token in HA: Profile → Long-Lived Access Tokens → Create Token',
- connectionSuccessful: 'Connection Successful',
- connectionFailed: 'Connection Failed',
- haConnectionSuccess: 'Successfully connected to Home Assistant.',
- haConnectionFailed: 'Failed to connect to Home Assistant.',
- // MQTT
- mqttPublishing: 'MQTT Publishing',
- mqttDescription: 'Publish BamBuddy events to an external MQTT broker for integration with Node-RED, Home Assistant, and other automation systems.',
- mqttEnableDescription: 'Publish events to external MQTT broker',
- brokerHostname: 'Broker hostname',
- port: 'Port',
- usernameOptional: 'Username (optional)',
- passwordOptional: 'Password (optional)',
- topicPrefix: 'Topic prefix',
- topicPrefixHint: 'Topics will be: {{prefix}}/printers/<serial>/status, etc.',
- // Prometheus
- prometheusMetrics: 'Prometheus Metrics',
- prometheusEndpointDescription: 'Expose printer metrics at <code>/api/v1/metrics</code> for Prometheus/Grafana monitoring.',
- bearerTokenOptional: 'Bearer Token (optional)',
- bearerTokenHint: 'If set, requests must include <code>Authorization: Bearer <token></code>',
- metricsConnectionStatus: 'Connection status',
- metricsPrinterState: 'Printer state (idle/printing/etc)',
- metricsPrintProgress: 'Print progress 0-100%',
- metricsBedTemp: 'Bed temperature',
- metricsNozzleTemp: 'Nozzle temperature',
- metricsPrintsTotal: 'Total prints by result',
- metricsMore: '...and more (layers, fans, queue, filament usage)',
- // Smart Plugs
- smartPlugsDescription: 'Connect smart plugs (Tasmota or Home Assistant) to automate power control and track energy usage for your printers.',
- allOn: 'All On',
- allOff: 'All Off',
- addSmartPlug: 'Add Smart Plug',
- energySummary: 'Energy Summary',
- currentPower: 'Current Power',
- plugsOnline: '{{reachable}}/{{total}} plugs online',
- today: 'Today',
- yesterday: 'Yesterday',
- total: 'Total',
- enablePlugsForSummary: 'Enable plugs to see energy summary',
- addNotificationProvider: 'Add',
- // Users
- systemBadge: '(System)',
- creating: 'Creating...',
- changing: 'Changing...',
- deleteUserAndItems: 'Delete user AND their items',
- deleteUserKeepItems: 'Delete user, keep items (become ownerless)',
- ok: 'OK',
- },
- // Notifications (for push notifications)
- notification: {
- printStarted: {
- title: 'Print Started',
- body: '{{printer}}: {{filename}} has started printing',
- },
- printCompleted: {
- title: 'Print Completed',
- body: '{{printer}}: {{filename}} completed successfully',
- },
- printFailed: {
- title: 'Print Failed',
- body: '{{printer}}: {{filename}} has failed',
- },
- printStopped: {
- title: 'Print Stopped',
- body: '{{printer}}: {{filename}} was stopped',
- },
- printProgress: {
- title: 'Print Progress',
- body: '{{printer}}: {{filename}} is {{percent}}% complete',
- },
- printerOffline: {
- title: 'Printer Offline',
- body: '{{printer}} is offline',
- },
- printerError: {
- title: 'Printer Error',
- body: '{{printer}}: {{error}}',
- },
- filamentLow: {
- title: 'Low Filament',
- body: '{{printer}}: Filament is running low',
- },
- maintenanceDue: {
- title: 'Maintenance Due',
- body: '{{printer}}: {{items}} need attention',
- },
- },
- // Errors
- errors: {
- generic: 'Something went wrong',
- networkError: 'Network error. Please check your connection.',
- notFound: 'Not found',
- unauthorized: 'Unauthorized',
- serverError: 'Server error',
- validationError: 'Please check your input',
- printerConnectionFailed: 'Failed to connect to printer',
- saveFailed: 'Failed to save changes',
- deleteFailed: 'Failed to delete',
- loadFailed: 'Failed to load data',
- },
- // HMS Errors modal
- hmsErrors: {
- title: 'Errors - {{name}}',
- noErrors: 'No errors',
- viewOnWiki: 'View on Bambu Lab Wiki',
- clearInstructions: 'Clear errors on the printer to dismiss them here.',
- clearErrors: 'Clear Errors',
- clearSuccess: 'HMS errors cleared',
- clearFailed: 'Failed to clear HMS errors',
- },
- // MQTT Debug modal
- mqttDebug: {
- title: 'MQTT Debug Log',
- searchPlaceholder: 'Search topic or payload...',
- noMessages: 'No messages logged yet',
- startLoggingHint: 'Click "Start Logging" to begin capturing MQTT messages',
- noMessagesMatch: 'No messages match your filter',
- adjustFilterHint: 'Try adjusting your search or filter criteria',
- incoming: 'Incoming',
- outgoing: 'Outgoing',
- loggingStopped: 'Logging stopped',
- loggingActive: 'Logging active - messages will auto-refresh',
- startLogging: 'Start Logging',
- stopLogging: 'Stop Logging',
- clearLog: 'Clear Log',
- topic: 'Topic',
- timestamp: 'Timestamp',
- direction: 'Direction',
- all: 'All',
- },
- // Printer File Manager modal (printer internal storage)
- printerFiles: {
- title: 'File Manager',
- storageUsed: 'Used:',
- storageFree: 'Free:',
- filterPlaceholder: 'Filter files...',
- deleteButton: 'Delete',
- deleteFiles: 'Delete {{count}} Files',
- deleteFileConfirm: 'Delete "{{name}}"? This cannot be undone.',
- deleteFilesConfirm: 'Delete {{count}} selected files? This cannot be undone.',
- noFiles: 'No files on printer',
- loadingFiles: 'Loading files...',
- failedToLoad: 'Failed to load files',
- toast: {
- filesDeleted: 'Deleted {{count}} file(s)',
- deleteFailed: 'Delete failed: {{error}}',
- },
- },
- // Confirmations
- confirm: {
- delete: 'Are you sure you want to delete this?',
- unsavedChanges: 'You have unsaved changes. Are you sure you want to leave?',
- clearQueue: 'Are you sure you want to clear the queue?',
- },
- // Login page
- login: {
- title: 'Bambuddy Login',
- subtitle: 'Sign in to your account',
- username: 'Username',
- usernamePlaceholder: 'Enter your username',
- usernameOrEmail: 'Username or Email',
- usernameOrEmailPlaceholder: 'Username or @ Email',
- password: 'Password',
- passwordPlaceholder: 'Enter your password',
- signIn: 'Sign in',
- signingIn: 'Logging in...',
- forgotPassword: 'Forgot your password?',
- loginSuccess: 'Logged in successfully',
- loginFailed: 'Login failed',
- enterCredentials: 'Please enter username and password',
- forgotPasswordTitle: 'Forgot Password',
- forgotPasswordMessage: "If you've forgotten your password, please contact your system administrator to reset it.",
- forgotPasswordEmailMessage: "Enter your email address and we'll send you a new password.",
- emailAddress: 'Email Address',
- emailPlaceholder: 'your.email@example.com',
- cancel: 'Cancel',
- sending: 'Sending...',
- sendResetEmail: 'Send Reset Email',
- howToReset: 'How to reset your password:',
- resetStep1: 'Contact your Bambuddy administrator',
- resetStep2: 'Ask them to reset your password in User Management',
- resetStep3: 'They can set a new temporary password for you',
- resetStep4: 'Log in with the new password and change it in Settings',
- gotIt: 'Got it',
- },
- // Setup page
- setup: {
- title: 'Bambuddy Setup',
- subtitle: 'Configure authentication for your Bambuddy instance',
- enableAuth: 'Enable Authentication',
- adminAccount: 'Admin Account',
- adminAccountDesc: 'If admin users already exist, authentication will be enabled using the existing admin accounts. Leave the fields below empty to use existing admins, or enter new credentials to create a new admin user.',
- adminUsername: 'Admin Username',
- adminPassword: 'Admin Password',
- optionalIfAdminExists: '(optional if admin users exist)',
- adminUsernamePlaceholder: 'Enter admin username (optional)',
- adminPasswordPlaceholder: 'Enter admin password (optional)',
- confirmPassword: 'Confirm Password',
- confirmPasswordPlaceholder: 'Confirm admin password',
- settingUp: 'Setting up...',
- completeSetup: 'Complete Setup',
- toast: {
- authEnabledAdminCreated: 'Authentication enabled and admin user created',
- authEnabledExistingAdmins: 'Authentication enabled using existing admin users',
- setupCompleted: 'Setup completed',
- enterBothCredentials: 'Please enter both admin username and password, or leave both empty to use existing admin users',
- passwordsDoNotMatch: 'Passwords do not match',
- passwordTooShort: 'Password must be at least 6 characters',
- },
- },
- // Password change
- changePassword: {
- title: 'Change Password',
- currentPassword: 'Current Password',
- currentPasswordPlaceholder: 'Enter current password',
- newPassword: 'New Password',
- newPasswordPlaceholder: 'Enter new password (min 6 characters)',
- confirmPassword: 'Confirm New Password',
- confirmPasswordPlaceholder: 'Confirm new password',
- passwordsDoNotMatch: 'Passwords do not match',
- passwordTooShort: 'Password must be at least 6 characters',
- changing: 'Changing...',
- success: 'Password changed successfully',
- failed: 'Failed to change password',
- },
- // Plate detection alert
- plateAlert: {
- title: 'Print Paused!',
- message: 'Objects detected on build plate. The print has been automatically paused. Please clear the plate and resume the print.',
- understand: 'I Understand',
- },
- // Camera page
- camera: {
- title: 'Camera View',
- invalidPrinterId: 'Invalid printer ID',
- live: 'Live',
- snapshot: 'Snapshot',
- restartStream: 'Restart stream',
- refreshSnapshot: 'Refresh snapshot',
- fullscreen: 'Fullscreen',
- exitFullscreen: 'Exit fullscreen',
- connectingToCamera: 'Connecting to camera...',
- capturingSnapshot: 'Capturing snapshot...',
- connectionLost: 'Connection lost',
- connectionFailed: 'Camera connection failed',
- reconnecting: 'Reconnecting in {{countdown}}s... (attempt {{attempt}}/{{max}})',
- reconnectNow: 'Reconnect now',
- cameraUnavailable: 'Camera unavailable',
- cameraUnavailableDesc: 'Make sure the printer is powered on and connected.',
- noCamera: 'No camera available',
- retry: 'Retry',
- cameraStream: 'Camera stream',
- zoomOut: 'Zoom out',
- zoomIn: 'Zoom in',
- resetZoom: 'Reset zoom',
- recording: 'Recording',
- startRecording: 'Start Recording',
- stopRecording: 'Stop Recording',
- chamberLight: 'Toggle chamber light',
- },
- // Groups management
- groups: {
- title: 'Group Management',
- subtitle: 'Manage permission groups for access control',
- backToSettings: 'Back to Settings',
- createGroup: 'Create Group',
- noPermission: 'You do not have permission to access this page.',
- system: 'System',
- noDescription: 'No description',
- usersCount: '{{count}} users',
- permissionsCount: '{{count}} permissions',
- edit: 'Edit',
- delete: 'Delete',
- toast: {
- created: 'Group created successfully',
- updated: 'Group updated successfully',
- deleted: 'Group deleted successfully',
- enterGroupName: 'Please enter a group name',
- },
- modal: {
- editGroup: 'Edit Group',
- createGroup: 'Create Group',
- cancel: 'Cancel',
- saving: 'Saving...',
- creating: 'Creating...',
- saveChanges: 'Save Changes',
- },
- form: {
- groupName: 'Group Name',
- groupNamePlaceholder: 'Enter group name',
- systemGroupWarning: 'System group names cannot be changed',
- description: 'Description',
- descriptionPlaceholder: 'Enter description (optional)',
- permissions: 'Permissions ({{count}} selected)',
- },
- deleteModal: {
- title: 'Delete Group',
- message: 'Are you sure you want to delete this group? Users in this group will lose these permissions.',
- confirm: 'Delete Group',
- },
- editor: {
- title: 'Edit Group',
- createTitle: 'Create Group',
- search: 'Search permissions...',
- selectAll: 'Select All',
- clearAll: 'Clear All',
- permissionsSelected: '{{count}} selected',
- noResults: 'No permissions match your search',
- },
- },
- // Users management
- users: {
- title: 'User Management',
- subtitle: 'Manage users and their access to your Bambuddy instance',
- backToSettings: 'Back to Settings',
- createUser: 'Create User',
- noPermission: 'You do not have permission to access this page.',
- admin: 'Admin',
- noGroups: 'No groups',
- active: 'Active',
- inactive: 'Inactive',
- edit: 'Edit',
- delete: 'Delete',
- system: 'System',
- noGroupsAvailable: 'No groups available',
- table: {
- username: 'Username',
- groups: 'Groups',
- status: 'Status',
- actions: 'Actions',
- },
- toast: {
- created: 'User created successfully',
- updated: 'User updated successfully',
- deleted: 'User deleted successfully',
- fillRequired: 'Please fill in all required fields',
- passwordsDoNotMatch: 'Passwords do not match',
- passwordTooShort: 'Password must be at least 6 characters',
- },
- modal: {
- createUser: 'Create User',
- editUser: 'Edit User',
- cancel: 'Cancel',
- creating: 'Creating...',
- saving: 'Saving...',
- saveChanges: 'Save Changes',
- advancedAuthSubtitle: 'with Advanced Authentication',
- },
- form: {
- username: 'Username',
- usernamePlaceholder: 'Enter username',
- email: 'Email',
- emailPlaceholder: 'user@example.com',
- password: 'Password',
- passwordPlaceholder: 'Enter password',
- confirmPassword: 'Confirm Password',
- confirmPasswordPlaceholder: 'Confirm password',
- newPasswordPlaceholder: 'Enter new password',
- confirmNewPasswordPlaceholder: 'Confirm new password',
- leaveBlankToKeep: 'leave blank to keep current',
- groups: 'Groups',
- optional: 'optional',
- autoGeneratedPassword: 'A secure password will be automatically generated and emailed to the user.',
- passwordManagedByAdvancedAuth: 'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.',
- resetPassword: 'Reset Password',
- resettingPassword: 'Resetting Password...',
- },
- deleteModal: {
- title: 'Delete User',
- message: 'Are you sure you want to delete this user? This action cannot be undone.',
- confirm: 'Delete User',
- },
- },
- // Stream overlay
- streamOverlay: {
- title: 'Stream Overlay',
- invalidPrinterId: 'Invalid printer ID',
- cameraStream: 'Camera stream',
- progress: 'Progress',
- eta: 'ETA',
- printerIdle: 'Printer is idle',
- printerOffline: 'Printer offline',
- status: {
- printing: 'Printing',
- paused: 'Paused',
- finished: 'Finished',
- failed: 'Failed',
- idle: 'Idle',
- unknown: 'Unknown',
- },
- },
- // Profiles
- profiles: {
- title: 'Profiles',
- subtitle: 'Manage your slicer presets and pressure advance calibrations',
- tabs: {
- cloud: 'Cloud Profiles',
- local: 'Local Profiles',
- kprofiles: 'K-Profiles',
- },
- localProfiles: {
- title: 'Local Profiles',
- subtitle: 'Import and manage slicer presets from OrcaSlicer',
- import: 'Import Profiles',
- importDesc: 'Drop .bbscfg, .bbsflmt, .orca_filament, .zip, or .json files here',
- importing: 'Importing...',
- search: 'Search local presets...',
- noPresets: 'No local presets yet',
- badge: 'Local',
- edit: 'Edit',
- delete: 'Delete',
- cancel: 'Cancel',
- deleteConfirmTitle: 'Delete Preset',
- deleteConfirm: 'Are you sure you want to delete this preset? This cannot be undone.',
- source: 'Source',
- inheritsFrom: 'Inherits',
- filamentType: 'Type',
- vendor: 'Vendor',
- compatiblePrinters: 'Printers',
- nozzleTemp: 'Nozzle Temp',
- cost: 'Cost',
- density: 'Density',
- pressureAdvance: 'Pressure Advance',
- filament: 'Filament',
- process: 'Process',
- printer: 'Printer',
- toast: {
- importSuccess: '{{count}} preset(s) imported',
- importSkipped: '{{count}} preset(s) skipped (duplicates)',
- importError: '{{count}} error(s) during import',
- deleted: 'Preset deleted',
- updated: 'Preset updated',
- },
- },
- connectedAs: 'Connected as',
- logout: 'Logout',
- noLogoutPermission: 'You do not have permission to logout',
- failedToLoad: 'Failed to load profiles',
- retry: 'Retry',
- time: {
- justNow: 'Just now',
- minsAgo: '{{count}}m ago',
- hoursAgo: '{{count}}h ago',
- daysAgo: '{{count}}d ago',
- },
- toast: {
- loggedOut: 'Logged out',
- },
- login: {
- title: 'Connect to Bambu Cloud',
- subtitle: 'Sync your slicer presets across devices',
- email: 'Email',
- password: 'Password',
- region: 'Region',
- regionGlobal: 'Global',
- regionChina: 'China',
- verificationCode: 'Verification Code',
- totpCode: 'Authenticator Code',
- checkEmail: 'Check your email ({{email}}) for a 6-digit code',
- enterTotpHint: 'Enter the 6-digit code from your authenticator app',
- accessToken: 'Access Token',
- accessTokenHint: 'Paste your Bambu Lab access token (from Bambu Studio)',
- back: 'Back',
- loginButton: 'Login',
- verifyButton: 'Verify',
- setTokenButton: 'Set Token',
- useToken: 'Use access token instead',
- useEmail: 'Login with email instead',
- toast: {
- loggedIn: 'Logged in successfully',
- codeSent: 'Verification code sent to your email',
- enterTotp: 'Enter code from your authenticator app',
- tokenSet: 'Token set successfully',
- },
- },
- presets: {
- myPreset: 'My preset (editable)',
- duplicate: 'Duplicate',
- editable: 'Editable',
- failedToLoadDetails: 'Failed to load preset details',
- deleteConfirm: 'Delete this preset?',
- deleteWarning: 'This will permanently delete "{{name}}" from Bambu Cloud. This cannot be undone.',
- noDuplicatePermission: 'You do not have permission to duplicate presets',
- noEditPermission: 'You do not have permission to edit presets',
- noDeletePermission: 'You do not have permission to delete presets',
- types: {
- filament: 'Filament preset',
- printer: 'Printer preset',
- process: 'Process preset',
- },
- toast: {
- deleted: 'Preset deleted',
- created: 'Preset created',
- updated: 'Preset updated',
- duplicated: 'Preset duplicated',
- fieldAdded: 'Field "{{key}}" added',
- exported: 'Preset exported',
- },
- baseLabel: 'Base: {{name}}',
- currentLabel: 'Current: {{name}}',
- newPreset: 'New Preset',
- editPreset: 'Edit Preset',
- duplicatePreset: 'Duplicate Preset',
- createNewPreset: 'Create New Preset',
- customizeSettings: 'Customize settings for your new preset',
- compareWithBase: 'Compare with base preset',
- compare: 'Compare',
- // CreatePresetModal - Basic Info
- basePreset: 'Base Preset',
- selectBasePreset: 'Select base preset...',
- presetName: 'Preset Name',
- myCustomPreset: 'My custom preset',
- inheritsFrom: 'Inherits from',
- dropJsonToImport: 'Drop JSON to import',
- // CreatePresetModal - Tabs
- tabs: {
- common: 'Common',
- allFields: 'All Fields',
- },
- // CreatePresetModal - All Fields Tab
- availableFields: 'Available Fields',
- searchFieldsPlaceholder: 'Search fields...',
- noMatchingFields: 'No matching fields',
- allFieldsAdded: 'All fields added',
- addCustomField: 'Add custom field',
- yourOverrides: 'Your Overrides',
- noOverridesYet: 'No overrides yet',
- clickFieldsToAdd: 'Click fields on the left to add them',
- saveAsTemplate: 'Save as template',
- jsonTip: 'Tip: Drag & drop a .json file anywhere on this modal to import settings',
- },
- cloudView: {
- searchPlaceholder: 'Search presets...',
- templates: 'Templates',
- refresh: 'Refresh',
- newPreset: 'New Preset',
- clearFilters: 'Clear filters',
- // Compare mode
- compareMode: 'Compare Mode',
- selectAnotherPreset: 'Select another {{type}} preset',
- clickTwoPresets: 'Click two presets of the same type to compare',
- selectFirst: '1. Select first',
- selectSecond: '2. Select second',
- compareNow: 'Compare Now',
- // Status row
- lastSynced: 'Last synced:',
- showingCount: 'Showing {{showing}} of {{total}} presets',
- noPresetsFound: 'No presets found',
- // Column headers
- columns: {
- filament: 'Filament',
- process: 'Process',
- printer: 'Printer',
- },
- noFilamentPresets: 'No filament presets',
- noProcessPresets: 'No process presets',
- noPrinterPresets: 'No printer presets',
- // Filters
- filters: {
- type: 'Type',
- owner: 'Owner',
- printer: 'Printer',
- nozzle: 'Nozzle',
- filament: 'Filament',
- layer: 'Layer',
- all: 'All',
- myPresets: 'My Presets',
- builtIn: 'Built-in',
- process: 'Process',
- },
- // Permissions
- noTemplatesPermission: 'You do not have permission to manage templates',
- noRefreshPermission: 'You do not have permission to refresh profiles',
- noCreatePermission: 'You do not have permission to create presets',
- },
- templates: {
- title: 'Quick Templates',
- noTemplates: 'No templates yet',
- createFirst: 'Create templates from the preset editor',
- typeFilter: 'Type:',
- deleteTitle: 'Delete Template',
- deleteWarning: 'This action cannot be undone',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
- namePlaceholder: 'Template name',
- descriptionPlaceholder: 'Description',
- settingsJson: 'Settings (JSON)',
- fieldsCount: '{{count}} fields',
- shownInModals: 'Shown in modals',
- hiddenInModals: 'Hidden in modals',
- apply: 'Apply',
- toast: {
- deleted: 'Template deleted',
- updated: 'Template updated',
- created: 'Template created',
- applied: 'Template applied',
- },
- },
- },
- // Support/Debug
- support: {
- debugLoggingActive: 'Debug logging is active',
- manageLogs: 'Manage',
- collectItem7: 'Printer connectivity and firmware versions',
- collectItem8: 'Integration status (Spoolman, MQTT, HA)',
- collectItem9: 'Network interfaces (subnets only)',
- collectItem10: 'Python package versions',
- collectItem11: 'Database health checks',
- collectItem12: 'Docker environment details',
- },
- // File manager
- fileManager: {
- title: 'File Manager',
- subtitle: 'Organize and manage your print files',
- uploadFiles: 'Upload Files',
- newFolder: 'New Folder',
- folderName: 'Folder Name',
- folderNamePlaceholder: 'e.g., Functional Parts',
- renameFile: 'Rename File',
- renameFolder: 'Rename Folder',
- moveFiles: 'Move {{count}} File(s)',
- rootNoFolder: 'Root (No Folder)',
- current: 'current',
- linkFolder: 'Link Folder',
- linkFolderDescription: 'Link "{{name}}" to a project or archive for quick access.',
- project: 'Project',
- archive: 'Archive',
- noProjectsFound: 'No projects found',
- noArchivesFound: 'No archives found',
- unlink: 'Unlink',
- link: 'Link',
- dragDropFiles: 'Drag & drop files here',
- dropFilesHere: 'Drop files here',
- orClickToBrowse: 'or click to browse',
- allFileTypesSupported: 'All file types supported. ZIP files will be extracted.',
- zipFilesDetected: 'ZIP files detected',
- zipExtractOptions: 'ZIP files will be extracted. Choose how to handle folder structure:',
- preserveZipStructure: 'Preserve folder structure from ZIP',
- createFolderFromZip: 'Create folder from ZIP filename',
- stlThumbnailGeneration: 'STL thumbnail generation',
- zipMayContainStl: 'ZIP files may contain STL files. Thumbnails can be generated during extraction.',
- thumbnailsCanBeGenerated: 'Thumbnails can be generated for STL files. Large models may take longer to process.',
- generateThumbnailsForStl: 'Generate thumbnails for STL files',
- threemfDetected: '3MF files detected',
- threemfExtractionInfo: 'Printer model, material, color, and print settings will be automatically extracted from 3MF files.',
- willBeExtracted: 'Will be extracted',
- filesExtracted: '{{count}} files extracted',
- uploadComplete: 'Upload complete: {{succeeded}} succeeded',
- uploadFailed: 'Upload failed',
- zipFilesFailed: '{{count}} files failed',
- uploading: 'Uploading...',
- changeLink: 'Change Link...',
- linkTo: 'Link to...',
- linkToProjectOrArchive: 'Link to project or archive',
- addToQueue: 'Add to Queue',
- schedulePrint: 'Schedule',
- generateThumbnail: 'Generate Thumbnail',
- generateThumbnails: 'Generate Thumbnails',
- generateThumbnailsForMissing: 'Generate thumbnails for STL files missing them',
- gridView: 'Grid view',
- listView: 'List view',
- lowDiskSpaceWarning: 'Low disk space warning',
- lowDiskSpaceDetails: 'Only {{free}} free of {{total}} total. Threshold is set to {{threshold}} GB in settings.',
- files: 'Files',
- folders: 'Folders',
- size: 'Size',
- free: 'Free',
- allFiles: 'All Files',
- wrap: 'Wrap',
- enableTextWrapping: 'Enable text wrapping',
- disableTextWrapping: 'Disable text wrapping',
- dragToResizeTooltip: 'Drag to resize, double-click to reset',
- searchFiles: 'Search files...',
- allTypes: 'All types',
- prints: 'Prints',
- ascending: 'Ascending',
- descending: 'Descending',
- resultsCount: '{{showing}} of {{total}} files',
- selectAll: 'Select All',
- deselectAll: 'Deselect All',
- selected: '{{count}} selected',
- adding: 'Adding...',
- loadingFiles: 'Loading files...',
- folderIsEmpty: 'Folder is empty',
- noFilesYet: 'No files yet',
- folderEmptyDescription: 'Upload files or move files into this folder to get started.',
- noFilesDescription: 'Upload files to start organizing your print-related files.',
- noMatchingFiles: 'No matching files',
- noMatchingFilesDescription: 'No files match your current search or filter criteria.',
- clearFilters: 'Clear filters',
- printedCount: 'Printed {{count}}x',
- uploadedBy: 'Uploaded By',
- deleteFolder: 'Delete Folder',
- deleteFile: 'Delete File',
- deleteFilesCount: 'Delete {{count}} Files',
- deleteFolderConfirm: 'Are you sure you want to delete this folder? All files inside will also be deleted.',
- deleteFileConfirm: 'Are you sure you want to delete this file?',
- deleteFilesConfirm: 'Are you sure you want to delete {{count}} selected files? This action cannot be undone.',
- deleting: 'Deleting...',
- noPermissionRenameFolder: 'You do not have permission to rename folders',
- noPermissionLinkFolder: 'You do not have permission to link folders',
- noPermissionDeleteFolder: 'You do not have permission to delete folders',
- noPermissionPrint: 'You do not have permission to print',
- noPermissionAddToQueue: 'You do not have permission to add to queue',
- noPermissionDownload: 'You do not have permission to download files',
- noPermissionRenameFile: 'You do not have permission to rename this file',
- noPermissionGenerateThumbnail: 'You do not have permission to generate thumbnails',
- noPermissionDeleteFile: 'You do not have permission to delete this file',
- noPermissionCreateFolder: 'You do not have permission to create folders',
- noPermissionUpload: 'You do not have permission to upload files',
- noPermissionMoveFiles: 'You do not have permission to move files',
- noPermissionDeleteFiles: 'You do not have permission to delete files',
- // External folder
- linkExternal: 'Link External',
- linkExternalFolder: 'Link External Folder',
- linkExternalFolderDescription: 'Mount a host directory (NAS, USB, network share) into the File Manager. Files are not copied — they are accessed directly from the original path.',
- externalFolderNamePlaceholder: 'e.g., NAS Prints',
- externalPath: 'Host Path',
- externalPathHelp: 'Absolute path to the directory on the Docker host. Must be bind-mounted into the container.',
- readOnly: 'Read Only',
- readOnlyHelp: 'prevents uploads and deletions',
- showHiddenFiles: 'Show hidden files (dotfiles)',
- externalFolder: 'External Folder',
- scanFolder: 'Scan',
- toast: {
- folderCreated: 'Folder created',
- folderDeleted: 'Folder deleted',
- fileDeleted: 'File deleted',
- filesDeleted: 'Deleted {{count}} files',
- filesMoved: 'Files moved',
- folderLinked: 'Folder linked',
- folderUnlinked: 'Folder unlinked',
- externalFolderLinked: 'External folder linked and scanned',
- folderScanned: 'Scan complete: {{added}} added, {{removed}} removed',
- addedToQueue: 'Added {{count}} file(s) to queue',
- addedToQueuePartial: 'Added {{added}} file(s), {{failed}} failed',
- failedToAddToQueue: 'Failed to add files: {{error}}',
- fileRenamed: 'File renamed',
- folderRenamed: 'Folder renamed',
- thumbnailsGenerated: 'Generated {{count}} thumbnail(s)',
- thumbnailsGeneratedPartial: 'Generated {{succeeded}} thumbnail(s), {{failed}} failed',
- noStlMissingThumbnails: 'No STL files missing thumbnails',
- failedToGenerateThumbnails: 'Failed to generate thumbnails: {{error}}',
- thumbnailGenerated: 'Thumbnail generated',
- failedToGenerateThumbnail: 'Failed to generate thumbnail: {{error}}',
- },
- },
- // Projects
- projects: {
- title: 'Projects',
- subtitle: 'Organize and track your 3D printing projects',
- newProject: 'New Project',
- editProject: 'Edit Project',
- deleteProject: 'Delete Project',
- projectName: 'Project Name',
- description: 'Description',
- noProjects: 'No projects yet',
- noProjectsFiltered: 'No {{status}} projects',
- noProjectsFilteredHelp: "You don't have any {{status}} projects. Projects will appear here when their status changes.",
- createFirst: 'Create your first project to start organizing related prints, tracking progress, and managing your builds.',
- createFirstButton: 'Create Your First Project',
- create: 'Create',
- files: 'Files',
- prints: 'Prints',
- plates: 'plates',
- parts: 'parts',
- lastModified: 'Last Modified',
- deleteConfirm: 'Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.',
- addFiles: 'Add Files',
- removeFile: 'Remove File',
- viewDetails: 'View Details',
- // Modal fields
- namePlaceholder: 'e.g., Voron 2.4 Build',
- descriptionPlaceholder: 'Optional description...',
- color: 'Color',
- targetPlates: 'Target Plates',
- targetPlatesPlaceholder: 'e.g., 25',
- targetPlatesHelp: 'Number of print jobs',
- targetParts: 'Target Parts',
- targetPartsPlaceholder: 'e.g., 150',
- targetPartsHelp: 'Total objects needed',
- tagsLabel: 'Tags (comma-separated)',
- tagsPlaceholder: 'e.g., voron, functional, gift',
- dueDate: 'Due Date',
- priority: 'Priority',
- priorityLow: 'Low',
- priorityNormal: 'Normal',
- priorityHigh: 'High',
- priorityUrgent: 'Urgent',
- // Status
- statusActive: 'Active',
- statusCompleted: 'Completed',
- statusArchived: 'Archived',
- done: 'Done',
- completed: 'completed',
- failed: 'failed',
- inQueue: 'in queue',
- noPrintsYet: 'No prints yet',
- // Footer stats
- printJobs: 'Print jobs (plates)',
- partsPrinted: 'Parts printed',
- failedParts: 'Failed parts',
- // Actions
- import: 'Import',
- export: 'Export',
- importProject: 'Import project',
- exportAll: 'Export all projects',
- loading: 'Loading projects...',
- // Permissions
- noEditPermission: 'You do not have permission to edit projects',
- noDeletePermission: 'You do not have permission to delete projects',
- noCreatePermission: 'You do not have permission to create projects',
- noImportPermission: 'You do not have permission to import projects',
- noExportPermission: 'You do not have permission to export projects',
- // Toast
- toast: {
- created: 'Project created',
- updated: 'Project updated',
- deleted: 'Project deleted',
- imported: 'Project imported',
- multipleImported: '{{count}} projects imported',
- importFailed: 'Import failed',
- exported: 'Projects exported (metadata only)',
- },
- },
- // Project detail page
- projectDetail: {
- notFound: 'Project not found',
- backToProjects: 'Back to Projects',
- export: 'Export',
- exportProject: 'Export project',
- noExportPermission: 'You do not have permission to export projects',
- noEditPermission: 'You do not have permission to edit projects',
- partOf: 'Part of:',
- priorityLabel: 'Priority:',
- noPrints: 'No prints in this project yet',
- status: {
- active: 'Active',
- completed: 'Completed',
- archived: 'Archived',
- },
- priority: {
- low: 'Low',
- normal: 'Normal',
- high: 'High',
- urgent: 'Urgent',
- },
- dueDate: {
- overdue: 'Overdue',
- today: 'Due today',
- daysLeft: '{{count}} days left',
- },
- progress: {
- platesProgress: 'Plates Progress',
- partsProgress: 'Parts Progress',
- printJobs: 'print jobs',
- parts: 'parts',
- percentComplete: '{{percent}}% complete',
- remaining: '{{count}} remaining',
- },
- stats: {
- printJobs: 'Print Jobs',
- total: 'total',
- failed: '{{count}} failed',
- partsPrinted: '{{count}} parts printed',
- printTime: 'Print Time',
- filamentUsed: 'Filament Used',
- },
- cost: {
- title: 'Cost Tracking',
- filamentCost: 'Filament Cost',
- energy: 'Energy',
- totalCost: 'Total Cost',
- total: 'Total',
- includesBom: 'incl. BOM',
- budget: 'Budget',
- remaining: 'Remaining',
- },
- subProjects: {
- title: 'Sub-projects ({{count}})',
- },
- notes: {
- title: 'Notes',
- noEditPermission: 'You do not have permission to edit notes',
- placeholder: 'Add notes about this project...',
- empty: 'No notes yet. Click Edit to add notes.',
- },
- files: {
- title: 'Files',
- linkFolders: 'Link folders from the File Manager',
- forQuickAccess: 'to this project for quick access.',
- fileCount: '{{count}} file(s)',
- empty: 'No folders linked. Go to File Manager and link a folder to this project.',
- },
- bom: {
- title: 'Bill of Materials',
- acquired: '{{completed}}/{{total}} acquired',
- showAll: 'Show all',
- hideDone: 'Hide done',
- addPart: 'Add Part',
- noAddPermission: 'You do not have permission to add parts',
- partNamePlaceholder: 'Part name (e.g., M3x8 screws)',
- partName: 'Part name',
- qty: 'Qty',
- price: 'Price ({{currency}})',
- sourcingUrlPlaceholder: 'Sourcing URL (optional)',
- remarksPlaceholder: 'Remarks (optional)',
- deletePart: 'Delete Part',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
- noUpdatePermission: 'You do not have permission to update parts',
- noEditPermission: 'You do not have permission to edit parts',
- noDeletePermission: 'You do not have permission to delete parts',
- totalCost: 'Total cost:',
- empty: 'No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced.',
- },
- timeline: {
- title: 'Activity Timeline',
- empty: 'No activity yet.',
- },
- template: {
- saveAsTemplate: 'Save as Template',
- noCreatePermission: 'You do not have permission to create templates',
- },
- queue: {
- title: 'Queue',
- viewAll: 'View all',
- printing: '{{count}} printing',
- queued: '{{count}} queued',
- },
- prints: {
- title: 'Prints ({{count}})',
- },
- toast: {
- projectUpdated: 'Project updated',
- partAdded: 'Part added',
- partRemoved: 'Part removed',
- exportFailed: 'Export failed',
- projectExported: 'Project exported',
- templateCreated: 'Template created',
- },
- },
- // System info
- system: {
- title: 'System Information',
- version: 'Version',
- uptime: 'Uptime',
- cpuUsage: 'CPU Usage',
- memoryUsage: 'Memory Usage',
- diskUsage: 'Disk Usage',
- networkInfo: 'Network Info',
- logs: 'Logs',
- debugMode: 'Debug Mode',
- enableDebug: 'Enable Debug Logging',
- disableDebug: 'Disable Debug Logging',
- downloadLogs: 'Download Logs',
- clearLogs: 'Clear Logs',
- dockerInfo: 'Docker Info',
- containerName: 'Container Name',
- imageName: 'Image Name',
- platform: 'Platform',
- architecture: 'Architecture',
- },
- // Library (K Profiles)
- library: {
- title: 'Filament Library',
- addFilament: 'Add Filament',
- editFilament: 'Edit Filament',
- deleteFilament: 'Delete Filament',
- vendor: 'Vendor',
- material: 'Material',
- color: 'Color',
- kFactor: 'K Factor',
- temperature: 'Temperature',
- noFilaments: 'No filaments in library',
- deleteConfirm: 'Are you sure you want to delete this filament?',
- importFromPrinter: 'Import from Printer',
- exportToFile: 'Export to File',
- },
- // Spoolman
- spoolman: {
- title: 'Spoolman Integration',
- enabled: 'Spoolman Enabled',
- url: 'Spoolman URL',
- connected: 'Connected',
- disconnected: 'Not Connected',
- testConnection: 'Test Connection',
- sync: 'Sync',
- syncing: 'Syncing...',
- lastSync: 'Last Sync',
- linkToSpoolman: 'Link to Spoolman',
- openInSpoolman: 'Open in Spoolman',
- unlinkSpool: 'Unlink Spool',
- unlinkConfirmTitle: 'Unlink Spool?',
- unlinkConfirmMessage: 'This will disconnect the spool from Spoolman. The spool data in Spoolman will remain unchanged.',
- selectSpool: 'Select Spool',
- noUnlinkedSpools: 'No unlinked spools available',
- linkSuccess: 'Spool linked to Spoolman successfully',
- linkFailed: 'Failed to link spool',
- unlinkSuccess: 'Spool unlinked from Spoolman successfully',
- unlinkFailed: 'Failed to unlink spool',
- spoolId: 'Spool ID',
- fillSourceLabel: '(Spoolman)',
- weight: 'Weight',
- remaining: 'Remaining',
- disableWeightSync: 'Disable AMS Estimated Weight Sync',
- disableWeightSyncDesc: "Don't update remaining capacity from AMS estimates. Use this if you prefer Spoolman's usage tracking over AMS percentage-based estimates. New spools will still use the AMS estimate as their initial weight.",
- reportPartialUsage: 'Report Partial Usage for Failed Prints',
- reportPartialUsageDesc: 'When a print fails or is cancelled, report the estimated filament used up to that point based on layer progress.',
- },
- // Inventory
- inventory: {
- title: 'Spool Inventory',
- addSpool: 'Add Spool',
- editSpool: 'Edit Spool',
- material: 'Material',
- selectMaterial: 'Select material...',
- subtype: 'Subtype',
- brand: 'Brand',
- searchBrand: 'Search brand...',
- useCustomBrand: 'Use "{{brand}}"',
- useCustomMaterial: 'Use custom material: {{material}}',
- colorName: 'Color Name',
- colorNamePlaceholder: 'Jade White, Fire Red...',
- color: 'Color',
- hexColor: 'Hex Color',
- pickColor: 'Pick custom color',
- labelWeight: 'Label Weight',
- coreWeight: 'Empty Spool Weight',
- searchSpoolWeight: 'Search spool weight...',
- weightUsed: 'Used',
- currentWeight: 'Remaining Weight',
- measuredWeight: 'Measured Weight',
- spoolName: 'Spool',
- costPerKg: 'Cost per kg',
- measuredWeightError: 'Measured weight must be between {{min}}g and {{max}}g.',
- slicerFilament: 'Slicer Filament',
- slicerFilamentName: 'Slicer Preset Name',
- slicerPreset: 'Slicer Preset',
- searchPresets: 'Search filament presets...',
- selectedPreset: 'Selected',
- noPresetsFound: 'No presets found',
- tempOverrides: 'Temperature Overrides',
- note: 'Note',
- notePlaceholder: 'Any additional notes about this spool...',
- archive: 'Archive',
- restore: 'Restore',
- noSpools: 'No spools yet. Add your first spool to get started.',
- noManualSpools: 'No manually added spools available. Add a spool to your inventory first.',
- kProfiles: 'K-Profiles',
- addKProfile: 'Add K-Profile',
- assignSpool: 'Assign Spool',
- unassignSpool: 'Unassign',
- assignSuccess: 'Spool assigned and AMS slot configured',
- assignFailed: 'Failed to assign spool',
- selectSpool: 'Select a spool to assign to this slot',
- assigned: 'Assigned',
- assigning: 'Assigning...',
- searchSpools: 'Search spools...',
- allMaterials: 'All Materials',
- filterByBrand: 'Filter by brand...',
- showArchived: 'Show archived',
- quickAdd: 'Quick Add (Stock)',
- quantity: 'Quantity',
- stock: 'Stock',
- configured: 'Configured',
- spoolsCreated: '{{count}} spools created',
- spoolCreated: 'Spool created',
- spoolUpdated: 'Spool updated',
- spoolDeleted: 'Spool deleted',
- spoolArchived: 'Spool archived',
- spoolRestored: 'Spool restored',
- deleteConfirm: 'Are you sure you want to delete this spool? This cannot be undone.',
- archiveConfirm: 'Are you sure you want to archive this spool?',
- advancedSettings: 'Advanced Settings',
- // Tabs
- filamentInfoTab: 'Filament Info',
- paProfileTab: 'PA Profile',
- filamentInfo: 'Filament',
- additional: 'Additional',
- // Cloud
- loadingPresets: 'Loading cloud presets...',
- cloudConnected: 'Cloud connected',
- cloudNotConnected: 'Cloud not connected (using defaults)',
- // Colors
- recentColors: 'Recent',
- searchColors: 'Search colors...',
- searchResults: 'Search results',
- allColors: 'All colors',
- commonColors: 'Common colors',
- showLess: 'Show less',
- showAll: 'Show all',
- noColorsFound: 'No colors match your search',
- noResults: 'No matches found',
- // PA Profiles
- selectMaterialFirst: 'Please select a material first in the Filament Info tab.',
- noPrintersConfigured: 'No printers configured. Add printers to use PA profiles.',
- matchingFilter: 'Matching',
- anyBrand: 'Any brand',
- anyVariant: 'Any variant',
- autoSelect: 'Auto-select',
- matches: 'matches',
- match: 'match',
- noMatches: 'No matches',
- connected: 'Connected',
- offline: 'Offline',
- printerOffline: 'Printer is offline. Connect to view calibration profiles.',
- noKProfilesMatch: 'No K-profiles match the selected filament.',
- leftNozzle: 'Left Nozzle',
- rightNozzle: 'Right Nozzle',
- profilesSelected: 'calibration profile(s) selected',
- // Stats & enhanced table
- totalInventory: 'Total Inventory',
- totalConsumed: 'Total Consumed',
- byMaterial: 'By Material',
- inPrinter: 'In Printer',
- lowStock: 'Low Stock',
- sinceTracking: 'Since tracking started',
- loadedInAms: 'Loaded in AMS/Ext',
- remaining: 'Remaining',
- weightCheck: 'Weight Check',
- lastWeighed: 'Last weighed',
- neverWeighed: 'Never weighed',
- search: 'Search spools...',
- showing: 'Showing',
- to: 'to',
- of: 'of',
- show: 'Show',
- spools: 'spools',
- spool: 'spool',
- page: 'Page',
- noSpoolsMatch: 'No results found',
- noSpoolsMatchDesc: 'Try adjusting your search or filters to find what you\'re looking for.',
- active: 'Active',
- archived: 'Archived',
- all: 'All',
- used: 'Used',
- new: 'New',
- clearFilters: 'Clear filters',
- table: 'Table',
- cards: 'Cards',
- net: 'Net',
- // Grouping
- groupSimilar: 'Group',
- groupedSpools: '{{count}} identical spools',
- groupedRows: 'rows',
- // Column config
- columns: 'Columns',
- configureColumns: 'Configure Columns',
- configureColumnsDesc: 'Drag to reorder columns or use arrows. Toggle visibility with the eye icon.',
- visible: 'visible',
- reset: 'Reset',
- cancel: 'Cancel',
- applyChanges: 'Apply Changes',
- moveUp: 'Move up',
- moveDown: 'Move down',
- hideColumn: 'Hide column',
- showColumn: 'Show column',
- // Tag linking
- linkToSpool: 'Link to Spool',
- tagLinked: 'Tag linked to spool',
- tagLinkFailed: 'Failed to link tag',
- tagAlreadyLinked: 'Tag already linked to another spool',
- unknownTag: 'Unknown RFID tag detected',
- // Usage history
- usageHistory: 'Usage History',
- noUsageHistory: 'No usage recorded yet',
- printName: 'Print Name',
- weightConsumed: 'Weight Consumed',
- clearHistory: 'Clear',
- historyCleared: 'Usage history cleared',
- fillSourceLabel: '(Inv)',
- lowStockThresholdError: 'Threshold must be between 0.1 and 99.9',
- assignMismatchTitle: 'Material mismatch',
- assignMismatchMessage: 'The selected spool material "{{spoolMaterial}}" does not match the tray material "{{trayMaterial}}" for {{location}}. Assign anyway?',
- assignMismatchConfirm: 'Assign Anyway',
- assignPartialMismatchMessage: 'The spool material "{{spoolMaterial}}" is similar to but not exactly matching "{{trayMaterial}}" in {{location}}. Do you want to proceed?',
- assignProfileMismatchMessage: 'The spool profile "{{spoolProfile}}" does not match the tray profile "{{trayProfile}}" in {{location}}. Do you want to proceed?',
- },
- // Timelapse
- timelapse: {
- title: 'Timelapse',
- create: 'Create Timelapse',
- download: 'Download',
- delete: 'Delete',
- preview: 'Preview',
- frameRate: 'Frame Rate',
- quality: 'Quality',
- processing: 'Processing...',
- noTimelapses: 'No timelapses available',
- },
- // AMS
- ams: {
- title: 'AMS',
- slot: 'Slot',
- empty: 'Empty',
- emptySlot: 'Empty slot',
- unknown: 'Unknown',
- humidity: 'Humidity',
- temperature: 'Temperature',
- filamentType: 'Filament Type',
- filamentColor: 'Color',
- remaining: 'Remaining',
- history: 'AMS History',
- noHistory: 'No history available',
- configureSlot: 'Configure Slot',
- externalSpool: 'External Spool',
- profile: 'Profile',
- kFactor: 'K Factor',
- fill: 'Fill',
- configure: 'Configure',
- used: 'used',
- remainingUnit: 'remaining',
- },
- // Print modal
- printModal: {
- title: 'Start Print',
- selectPrinter: 'Select Printer',
- selectPlate: 'Select Plate',
- filamentMapping: 'Filament Mapping',
- totalCost: 'Total cost:',
- slotRemainingShort: ' - {{grams}}g left',
- printSettings: 'Print Settings',
- bedLeveling: 'Bed Leveling',
- flowCalibration: 'Flow Calibration',
- vibrationCalibration: 'Vibration Calibration',
- layerInspection: 'First Layer Inspection',
- timelapse: 'Timelapse',
- startPrint: 'Start Print',
- addToQueue: 'Add to Queue',
- cancel: 'Cancel',
- noPrintersAvailable: 'No printers available',
- printerBusy: 'Printer is busy',
- printerOffline: 'Printer is offline',
- sameTypeDifferentColor: 'Same type, different color',
- filamentTypeNotLoaded: 'Filament type not loaded',
- openCalendar: 'Open calendar',
- leftNozzle: 'L',
- rightNozzle: 'R',
- leftNozzleTooltip: 'Left nozzle',
- rightNozzleTooltip: 'Right nozzle',
- filamentOverride: 'Filament Override',
- filamentOverrideHint: 'Optionally override filaments for model-based assignment. The scheduler will match against your selected filaments instead of the original 3MF values.',
- originalFilament: 'Original',
- overrideWith: 'Override with',
- resetToOriginal: 'Reset to original',
- insufficientFilamentTitle: 'Not enough filament',
- insufficientFilamentMessage: 'Some assigned spools have less filament remaining than this print needs:',
- insufficientFilamentLine: '{{printer}} - {{slot}}: needs {{required}}g, remaining {{remaining}}g',
- printAnyway: 'Print anyway',
- forceColorMatch: 'Force color match',
- staggerPrinterStarts: 'Stagger printer starts',
- staggerGroupSize: 'Group size',
- staggerInterval: 'Interval (min)',
- staggerPreview: '{{printers}} printers → {{groups}} groups of {{size}}, starting every {{interval}} min',
- staggerLastGroup: 'last group: {{count}}',
- staggerTotal: 'total: {{minutes}} min',
- staggerToPrinters: 'Stagger to {{count}} printers',
- },
- // Backup
- backup: {
- title: 'Backup & Restore',
- createBackup: 'Create Backup',
- restoreBackup: 'Restore Backup',
- restoreDescription: 'Replace all data from a backup file',
- downloadBackup: 'Download Backup',
- uploadBackup: 'Upload Backup',
- lastBackup: 'Last Backup',
- autoBackup: 'Auto Backup',
- backupNow: 'Backup Now',
- restoreWarning: 'Warning: Restoring a backup will overwrite all current data.',
- includeArchives: 'Include Archives',
- includeSettings: 'Include Settings',
- includeProfiles: 'Include Profiles',
- backupSuccess: 'Backup created successfully',
- restoreSuccess: 'Backup restored successfully',
- backupFailed: 'Backup failed',
- restoreFailed: 'Restore failed',
- restoreNote: 'Virtual Printer will be stopped during restore',
- // GitHub Backup
- githubBackup: 'GitHub Backup',
- enabled: 'Enabled',
- cloudLoginRequired: 'Bambu Cloud login required. Sign in under Profiles → Cloud Profiles to enable GitHub backup.',
- cloudLoginRequiredShort: 'Cloud login required',
- githubDescription: 'Automatically sync your profiles to a private GitHub repository for backup and version history.',
- repositoryUrl: 'Repository URL',
- personalAccessToken: 'Personal Access Token',
- tokenSaved: '(saved)',
- enterNewToken: 'Enter new token to update',
- tokenHint: 'Fine-grained token with Contents read/write permission',
- branch: 'Branch',
- manualOnly: 'Manual only',
- hourly: 'Hourly',
- daily: 'Daily',
- weekly: 'Weekly',
- includeInBackup: 'Include in backup',
- kProfiles: 'K-Profiles',
- kProfilesDescription: 'Pressure advance calibration from connected printers',
- noPrintersConnected: 'No printers connected',
- printersConnected: '{{connected}}/{{total}} connected',
- cloudProfiles: 'Cloud Profiles',
- cloudProfilesDescription: 'Filament, printer, and process presets from Bambu Cloud',
- appSettings: 'App Settings',
- appSettingsDescription: 'Bambuddy configuration (complete database)',
- spoolInventory: 'Spool Inventory',
- spoolInventoryDescription: 'Filament spools, usage history, and cost tracking',
- printArchives: 'Print Archives',
- printArchivesDescription: 'Print history metadata (no gcode/3MF files)',
- lastBackupAt: 'Last backup:',
- noBackupsYet: 'No backups yet',
- next: 'Next:',
- startingBackup: 'Starting backup...',
- test: 'Test',
- enableBackup: 'Enable Backup',
- testConnection: 'Test Connection',
- enterRepoUrl: 'Enter repository URL',
- enterRepoAndToken: 'Enter repository URL and access token',
- repoRequired: 'Repository URL is required',
- tokenRequired: 'Access token is required',
- githubBackupEnabled: 'GitHub backup enabled',
- tokenUpdated: 'Token updated',
- settingsSaved: 'Settings saved',
- failedToSave: 'Failed to save: {{message}}',
- backupCompleteFiles: 'Backup complete - {{count}} files updated',
- backupSkippedNoChanges: 'Backup skipped - no changes',
- backupFailed2: 'Backup failed: {{message}}',
- clearedLogs: 'Cleared {{count}} logs',
- failedToClearLogs: 'Failed to clear logs: {{message}}',
- // History
- history: 'History',
- clear: 'Clear',
- date: 'Date',
- status: 'Status',
- commit: 'Commit',
- // Local Backup
- localBackup: 'Local Backup',
- localBackupDescription: 'Create a complete backup of your Bambuddy data including the database, archives, uploads, and all files.',
- downloadBackupLabel: 'Download Backup',
- completeBackupZip: 'Complete backup: database + all files (ZIP)',
- download: 'Download',
- preparingBackup: 'Preparing backup...',
- creatingArchive: 'Creating backup archive... This may take a while for large archives.',
- downloadingFile: 'Downloading backup file...',
- backupDownloaded: 'Backup downloaded successfully',
- failedToCreateBackup: 'Failed to create backup: {{message}}',
- restore: 'Restore',
- restoreReplacesAll: 'Restore replaces all data.',
- restoreReplacesAllDetail: 'Your current database and files will be completely replaced. A restart is required after restore.',
- restoreConfirmTitle: 'Restore Backup',
- restoreConfirmMessage: 'Are you sure you want to restore from "{{filename}}"? This will completely replace your current database and all files. The application will need to be restarted after restore.',
- restoreConfirmButton: 'Restore Backup',
- uploadingFile: 'Uploading backup file...',
- backupRestoredRestart: 'Backup restored. Please restart Bambuddy.',
- failedToRestore: 'Failed to restore backup. Please check the file format.',
- reloadNow: 'Reload Now',
- creatingBackup: 'Creating Backup',
- restoringBackup: 'Restoring Backup',
- preparing: 'Preparing...',
- processing: 'Processing...',
- doNotClosePage: 'Please do not close this page or navigate away. This operation may take several minutes for large backups.',
- // RestoreModal
- restoring: 'Restoring...',
- restoreComplete: 'Restore Complete',
- restoreFailed2: 'Restore Failed',
- importSettings: 'Import settings from a backup file',
- pleaseWaitRestoring: 'Please wait while your data is being restored',
- selectBackupFile: 'Click to select backup file (.json or .zip)',
- duplicateHandling: 'How duplicate handling works:',
- matchPrinters: 'Printers',
- matchPrintersBy: 'matched by serial number',
- matchSmartPlugs: 'Smart Plugs',
- matchSmartPlugsBy: 'matched by IP address',
- matchNotificationProviders: 'Notification Providers',
- matchNotificationProvidersBy: 'matched by name',
- matchFilaments: 'Filaments',
- matchFilamentsBy: 'matched by name + type + brand',
- matchArchives: 'Archives',
- matchArchivesBy: 'matched by content hash (always skipped)',
- matchPendingUploads: 'Pending Uploads',
- matchPendingUploadsBy: 'matched by filename',
- matchSettingsTemplates: 'Settings & Templates',
- matchSettingsTemplatesBy: 'always overwritten',
- replaceExisting: 'Replace existing data',
- keepExisting: 'Keep existing data',
- overwriteDescription: 'Overwrite items that already exist with backup data',
- keepDescription: "Only restore items that don't already exist",
- overwriteCaution: 'Caution:',
- overwriteWarning: 'Overwriting will replace your current configurations with data from the backup. Printer access codes are never overwritten for security.',
- cancel: 'Cancel',
- processingBackup: 'Processing backup file...',
- itemsRestored: 'Items Restored',
- itemsSkipped: 'Items Skipped',
- restored: 'Restored',
- skippedAlreadyExist: 'Skipped (already exist)',
- filesCategory: 'Files (3MF, thumbnails, etc.)',
- andMore: '...and {{count}} more',
- newApiKeysGenerated: 'New API Keys Generated',
- keysShownOnce: 'These keys are only shown once. Copy them now!',
- copy: 'Copy',
- noDataFound: 'No data was found to restore in the backup file.',
- close: 'Close',
- // Category labels
- categories: {
- settings: 'Settings',
- notification_providers: 'Notification Providers',
- notification_templates: 'Notification Templates',
- smart_plugs: 'Smart Plugs',
- printers: 'Printers',
- filaments: 'Filaments',
- maintenance_types: 'Maintenance Types',
- archives: 'Archives',
- projects: 'Projects',
- pending_uploads: 'Pending Uploads',
- external_links: 'External Links',
- api_keys: 'API Keys',
- },
- },
- // Tags
- tags: {
- title: 'Tags',
- addTag: 'Add Tag',
- editTag: 'Edit Tag',
- deleteTag: 'Delete Tag',
- tagName: 'Tag Name',
- tagColor: 'Tag Color',
- noTags: 'No tags',
- deleteConfirm: 'Are you sure you want to delete this tag?',
- manageTags: 'Manage Tags',
- },
- // Upload modal (archives)
- uploadModal: {
- title: 'Upload 3MF Files',
- dragDrop: 'Drag & drop .3mf files here',
- or: 'or',
- browseFiles: 'Browse Files',
- extractionInfo: 'The printer model will be automatically extracted from the 3MF file metadata.',
- uploaded: 'uploaded',
- failed: 'failed',
- uploading: 'Uploading...',
- upload: 'Upload',
- uploadFailed: 'Upload failed',
- },
- // Edit archive modal
- // Edit Archive Modal
- editArchive: {
- title: 'Edit Archive',
- name: 'Name',
- namePlaceholder: 'Print name',
- printer: 'Printer',
- noPrinter: 'No printer',
- project: 'Project',
- noProject: 'No project',
- itemsPrinted: 'Items Printed',
- itemsPrintedHelp: 'Number of items produced in this print job',
- notes: 'Notes',
- notesPlaceholder: 'Add notes about this print...',
- externalLink: 'External Link',
- externalLinkPlaceholder: 'https://printables.com/model/...',
- externalLinkHelp: 'Link to Printables, Thingiverse, or other source',
- tags: 'Tags',
- tagsPlaceholder: 'Add tags...',
- addMoreTags: 'Add more tags...',
- matchingTags: 'Matching "{{query}}"',
- existingTags: 'Existing tags',
- clickToAdd: '(click to add)',
- status: 'Status',
- failureReason: 'Failure Reason',
- selectReason: 'Select reason...',
- photos: 'Photos of Printed Result',
- photosHelp: 'Click + to add photos of your printed result',
- printResult: 'Print result',
- saving: 'Saving...',
- // Failure reasons
- failureReasons: {
- adhesionFailure: 'Adhesion failure',
- spaghettiDetached: 'Spaghetti / Detached',
- layerShift: 'Layer shift',
- cloggedNozzle: 'Clogged nozzle',
- filamentRunout: 'Filament runout',
- warping: 'Warping',
- stringing: 'Stringing',
- underExtrusion: 'Under-extrusion',
- powerFailure: 'Power failure',
- userCancelled: 'User cancelled',
- other: 'Other',
- },
- // Archive statuses
- statuses: {
- completed: 'Completed',
- failed: 'Failed',
- aborted: 'Cancelled',
- printing: 'Printing',
- },
- },
- // K-Profiles
- kProfiles: {
- title: 'K-Profiles',
- noPrintersConfigured: 'No Printers Configured',
- addPrinterInSettings: 'Add a printer in Settings to manage K-profiles',
- noActivePrinters: 'No Active Printers',
- enablePrinterConnection: 'Enable a printer connection to view its K-profiles',
- loadingProfiles: 'Loading K-Profiles...',
- printerOffline: 'Printer Offline',
- printerOfflineDesc: 'The selected printer is not connected. Power it on to view K-profiles.',
- noMatchingProfiles: 'No Matching Profiles',
- noMatchingProfilesDesc: 'No profiles match your search criteria',
- noKProfiles: 'No K-Profiles',
- noKProfilesDesc: 'No pressure advance profiles found for {{diameter}}mm nozzle',
- createFirstProfile: 'Create First Profile',
- // Controls
- printer: 'Printer',
- nozzle: 'Nozzle',
- refresh: 'Refresh',
- addProfile: 'Add Profile',
- export: 'Export',
- import: 'Import',
- select: 'Select',
- selectAll: 'Select All',
- delete: 'Delete',
- // Filters
- searchPlaceholder: 'Search by name or filament...',
- allExtruders: 'All Extruders',
- leftOnly: 'Left Only',
- rightOnly: 'Right Only',
- allFlow: 'All Flow',
- hfOnly: 'HF Only',
- sOnly: 'S Only',
- sortName: 'Sort: Name',
- sortKValue: 'Sort: K-Value',
- sortFilament: 'Sort: Filament',
- // Dual extruder labels
- leftExtruder: 'Left Extruder',
- rightExtruder: 'Right Extruder',
- // Modal
- modal: {
- addTitle: 'Add K-Profile',
- editTitle: 'Edit K-Profile',
- profileName: 'Profile Name',
- profileNamePlaceholder: 'My PLA Profile',
- kValue: 'K-Value',
- kValuePlaceholder: '0.020',
- kValueHelp: 'Typical range: 0.01 - 0.06 for PLA, 0.02 - 0.10 for PETG',
- filament: 'Filament',
- selectFilament: 'Select filament...',
- noFilamentsHelp: 'No filaments found. Create a K-profile in Bambu Studio first.',
- flowType: 'Flow Type',
- highFlow: 'High Flow',
- standard: 'Standard',
- nozzleSize: 'Nozzle Size',
- extruder: 'Extruder',
- extruders: 'Extruders',
- left: 'Left',
- right: 'Right',
- notes: 'Notes (stored locally)',
- notesPlaceholder: 'Add notes about this profile...',
- notesHelp: 'Notes are saved in Bambuddy, not on the printer',
- syncing: 'Syncing with printer...',
- savingExtruder: 'Saving to extruder {{current}}/{{total}}...',
- pleaseWait: 'Please wait',
- },
- // Delete confirmation
- deleteConfirm: {
- title: 'Delete Profile',
- cannotUndo: 'This cannot be undone',
- message: 'Are you sure you want to delete "{{name}}" from the printer?',
- },
- // Bulk delete
- bulkDelete: {
- title: 'Delete Profiles',
- cannotUndo: 'This cannot be undone',
- message: 'Are you sure you want to delete {{count}} selected profiles from the printer?',
- },
- // Toast
- toast: {
- profileSaved: 'K-profile saved',
- profilesSaved: 'K-profile saved to {{count}} extruders',
- selectAtLeastOneExtruder: 'Please select at least one extruder',
- profileDeleted: 'K-profile deleted',
- profilesDeleted: 'Deleted {{count}} profiles',
- exportedProfiles: 'Exported {{count}} profiles',
- importedProfiles: 'Imported {{count}} of {{total}} profiles',
- noProfilesToExport: 'No profiles to export',
- invalidFileFormat: 'Invalid file format',
- failedToParseImport: 'Failed to parse import file',
- failedToSaveBatch: 'Failed to save K-profiles',
- noteSaved: 'Note saved',
- failedToSaveNote: 'Failed to save note',
- },
- // Permissions
- permission: {
- noRead: 'You do not have permission to refresh profiles',
- noCreate: 'You do not have permission to add profiles',
- noUpdate: 'You do not have permission to update K-profiles',
- noDelete: 'You do not have permission to delete K-profiles',
- noExport: 'You do not have permission to export profiles',
- noImport: 'You do not have permission to import profiles',
- },
- },
- // Virtual Printer
- virtualPrinter: {
- title: 'Virtual Printer',
- running: 'Running',
- stopped: 'Stopped',
- description: {
- default: 'Enable a virtual printer that appears in Bambu Studio and OrcaSlicer. Files sent to this printer will be archived directly without printing.',
- proxy: 'Enable a proxy that relays slicer traffic to a real printer, allowing remote printing over any network.',
- },
- enable: {
- title: 'Enable Virtual Printer',
- visibleInSlicer: 'Visible as "Bambuddy" in slicer discovery',
- proxyingTo: 'Proxying to {{name}}',
- notActive: 'Not active',
- },
- model: {
- title: 'Printer Model',
- description: 'Select which printer model to emulate.',
- restartWarning: 'Changing the model will restart the virtual printer',
- },
- accessCode: {
- title: 'Access Code',
- isSet: 'Access code is set',
- notSet: 'No access code set - required to enable',
- placeholder: 'Enter 8-char code',
- placeholderChange: 'Enter new code to change',
- hint: 'Must be exactly 8 characters. Used by slicers to authenticate.',
- charCount: '({{count}}/8)',
- },
- targetPrinter: {
- title: 'Target Printer',
- configured: 'Proxy target configured',
- notConfigured: 'No target printer selected - required for proxy mode',
- placeholder: 'Select a printer...',
- hint: 'Select the printer to proxy slicer traffic to. The printer must be in LAN mode.',
- noPrinters: 'No printers configured. Add a printer first to use proxy mode.',
- },
- remoteInterface: {
- title: 'Network Interface Override',
- configured: 'Interface override active',
- optional: 'Optional - use if auto-detected IP is wrong (e.g. multiple NICs, Docker, VPN)',
- placeholder: 'Auto-detect (default)...',
- hint: 'Override the IP address advertised via SSDP and used in the TLS certificate. Useful when Bambuddy has multiple network interfaces.',
- },
- mode: {
- title: 'Mode',
- archive: 'Archive',
- archiveDesc: 'Archive files immediately',
- review: 'Review',
- reviewDesc: 'Review before archiving',
- queue: 'Queue',
- queueDesc: 'Archive and add to queue',
- proxy: 'Proxy',
- proxyDesc: 'Relay to real printer',
- },
- autoDispatch: {
- title: 'Auto-dispatch',
- description: 'Automatically start prints when added to queue. When off, prints wait for manual dispatch.',
- },
- setupRequired: {
- title: 'Setup Required',
- description: 'The virtual printer feature requires additional system configuration before it will work. This includes port forwarding, firewall rules, and platform-specific settings.',
- readGuide: 'Read the setup guide before enabling',
- },
- howItWorks: {
- title: 'How it works',
- step1: 'On the same LAN, virtual printers appear in your slicer (Bambu Studio / OrcaSlicer) automatically via discovery. From other networks, add them manually by IP address and access code.',
- step2: 'In Archive, Review, and Queue modes, use the "Send" button in your slicer to upload 3MF files to Bambuddy. The slicer will show "Print success" — the file is stored, not printed.',
- step3: 'In Proxy mode, the virtual printer relays all traffic to a real printer — prints start immediately as if connected directly.',
- },
- status: {
- title: 'Status Details',
- printerName: 'Printer Name',
- model: 'Model',
- serialNumber: 'Serial Number',
- mode: 'Mode',
- pendingFiles: 'Pending Files',
- targetPrinter: 'Target Printer',
- ftpPort: 'FTP Port',
- mqttPort: 'MQTT Port',
- ftpConnections: 'FTP Connections',
- mqttConnections: 'MQTT Connections',
- },
- toast: {
- updated: 'Virtual printer settings updated',
- failedToUpdate: 'Failed to update settings',
- accessCodeRequired: 'Please set an access code first',
- targetPrinterRequired: 'Please select a target printer first',
- bindIpRequired: 'Please set a bind IP first',
- accessCodeEmpty: 'Access code cannot be empty',
- accessCodeLength: 'Access code must be exactly 8 characters',
- created: 'Virtual printer created',
- failedToCreate: 'Failed to create virtual printer',
- deleted: 'Virtual printer deleted',
- failedToDelete: 'Failed to delete virtual printer',
- },
- list: {
- title: 'Virtual Printers',
- add: 'Add',
- addFirst: 'Add Virtual Printer',
- empty: 'No virtual printers configured. Add one to get started.',
- },
- bindIp: {
- title: 'Bind Interface',
- placeholder: 'Select interface...',
- hint: 'Network interface for this virtual printer to bind to. Must be unique per printer.',
- },
- proxy: {
- accessCodeHint: 'In proxy mode, use your target printer\'s access code in the slicer. The connection is forwarded transparently to the real printer.',
- },
- addDialog: {
- title: 'Add Virtual Printer',
- name: 'Name',
- hint: 'You can configure access code, target printer, and other settings after creating.',
- create: 'Create',
- },
- deleteConfirm: {
- title: 'Delete Virtual Printer',
- message: 'Are you sure you want to delete "{{name}}"? This will stop all services for this printer.',
- },
- },
- // Model Viewer
- modelViewer: {
- openInSlicer: 'Open in Slicer',
- tabs: {
- model: '3D Model',
- gcode: 'G-code Preview',
- },
- notAvailable: 'not available',
- notSliced: 'not sliced',
- plates: 'Plates',
- allPlates: 'All Plates',
- plateNumber: 'Plate {{number}}',
- plateCount: '{{count}} plate',
- plateCount_other: '{{count}} plates',
- objectCount: '{{count}} object',
- objectCount_other: '{{count}} objects',
- filamentCount: '{{count}} filament',
- filamentCount_other: '{{count}} filaments',
- eta: 'ETA {{minutes}} min',
- noPreview: 'No preview available for this file',
- pagination: {
- pageOf: 'Page {{current}} of {{total}}',
- prev: 'Prev',
- next: 'Next',
- },
- errors: {
- failedToLoad: 'Failed to load file',
- noMeshes: 'No meshes found in 3MF file',
- unsupportedFormat: 'Unsupported file format',
- },
- },
- // Maintenance type descriptions (built-in)
- maintenanceDescriptions: {
- lubricateCarbonRods: 'Apply lubricant to carbon rods for smooth motion',
- lubricateRails: 'Apply lubricant to linear rails for smooth motion',
- cleanNozzle: 'Clean hotend and nozzle to prevent clogs',
- checkBelts: 'Verify belt tension for accurate prints',
- cleanBuildPlate: 'Clean build plate for better adhesion',
- checkExtruder: 'Inspect extruder gears for wear',
- checkCooling: 'Ensure cooling fans are working properly',
- generalInspection: 'General printer inspection',
- cleanCarbonRods: 'Clean carbon rods to reduce friction',
- lubricateSteelRods: 'Apply lubricant to steel rods for smooth motion',
- cleanSteelRods: 'Clean steel rods to reduce friction',
- cleanLinearRails: 'Wipe linear rails to remove dust and debris',
- checkPtfeTube: 'Inspect PTFE tube for wear or damage',
- replaceHepaFilter: 'Replace HEPA filter for air quality',
- replaceCarbonFilter: 'Replace activated carbon filter',
- lubricateLeftNozzleRail: 'Lubricate left nozzle rail (H2 series)',
- },
- // Smart Plugs
- smartPlugs: {
- offline: 'Offline',
- admin: 'Admin',
- openPlugAdminPage: 'Open plug admin page',
- deleteSmartPlug: 'Delete Smart Plug',
- turnOnSmartPlug: 'Turn On Smart Plug',
- turnOffSmartPlug: 'Turn Off Smart Plug',
- turnOn: 'Turn On',
- turnOff: 'Turn Off',
- addSmartPlug: {
- scanningNetwork: 'Scanning network...',
- chooseEntity: 'Choose an entity...',
- connectionFailed: 'Connection failed',
- searchEntities: 'Search entities...',
- searchPowerSensors: 'Search power sensors...',
- searchEnergySensors: 'Search energy sensors...',
- placeholders: {
- plugName: 'Living Room Plug',
- mqttStateOnValue: 'ON, true, 1',
- mqttSameAsPower: 'Same as power topic, or different',
- },
- },
- // SmartPlugCard
- linkedTo: 'Linked to:',
- monitorOnly: 'Monitor Only',
- alerts: 'Alerts',
- scheduleOn: 'On {{time}}',
- scheduleOff: 'Off {{time}}',
- on: 'On',
- off: 'Off',
- power: 'Power',
- kwhToday: 'kWh Today',
- settings: 'Settings',
- automationSettings: 'Automation Settings',
- showInSwitchbar: 'Show in Switchbar',
- quickAccessSidebar: 'Quick access from sidebar',
- enabled: 'Enabled',
- enableAutomation: 'Enable automation for this plug',
- autoOn: 'Auto On',
- autoOnDescription: 'Turn on when print starts',
- autoOff: 'Auto Off',
- autoOffDescription: 'Turn off when print completes (one-shot)',
- autoOffPersistent: 'Keep Enabled',
- autoOffPersistentDescription: 'Stay enabled between prints instead of one-shot',
- turnOffDelayMode: 'Turn Off Delay Mode',
- time: 'Time',
- temp: 'Temp',
- delayMinutes: 'Delay (minutes)',
- tempThreshold: 'Temperature threshold (°C)',
- tempThresholdDescription: 'Turns off when nozzle cools below this temperature',
- edit: 'Edit',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"? This cannot be undone.',
- turnOnConfirm: 'Are you sure you want to turn on "{{name}}"?',
- turnOffConfirm: 'Are you sure you want to turn off "{{name}}"? This will cut power to the connected device.',
- failedToTurn: 'Failed to turn {{action}} "{{name}}"',
- unknown: 'Unknown',
- // AddSmartPlugModal
- addTitle: 'Add Smart Plug',
- editTitle: 'Edit Smart Plug',
- stopScanning: 'Stop Scanning',
- discoverTasmota: 'Discover Tasmota Devices',
- foundDevices: 'Found {{count}} device(s) - click to select:',
- noDevicesFound: 'No Tasmota devices found on your network',
- haNotConfigured: 'Home Assistant is not configured. Set it up in',
- haSettingsPath: 'Settings → Network → Home Assistant',
- selectEntity: 'Select Entity *',
- ipAddress: 'IP Address *',
- nameLabel: 'Name *',
- username: 'Username',
- password: 'Password',
- authHint: "Leave empty if your Tasmota device doesn't require authentication",
- linkToPrinter: 'Link to Printer',
- noPrinter: 'No printer (manual control only)',
- linkingDescription: 'Linking enables automatic on/off when prints start/complete',
- powerAlerts: 'Power Alerts',
- alertAbove: 'Alert if above (W)',
- alertBelow: 'Alert if below (W)',
- alertDescription: 'Get notified when power consumption crosses these thresholds. Leave empty to disable that direction.',
- dailySchedule: 'Daily Schedule',
- turnOnAt: 'Turn On at',
- turnOffAt: 'Turn Off at',
- scheduleDescription: 'Automatically turn the plug on/off at these times daily. Leave empty to skip that action.',
- showOnPrinterCard: 'Show on Printer Card',
- displayOnPrinterCard: 'Display button on printer card',
- connectedResult: 'Connected!',
- deviceLabel: 'Device: {{name}} - ',
- stateLabel: 'State: {{state}}',
- test: 'Test',
- delete: 'Delete',
- save: 'Save',
- add: 'Add',
- cancel: 'Cancel',
- failedToStartScan: 'Failed to start scan',
- nameRequired: 'Name is required',
- entityRequired: 'Entity is required for Home Assistant plugs',
- mqttTopicRequired: 'At least one MQTT topic must be configured for power, energy, or state monitoring',
- loadingEntities: 'Loading entities...',
- loading: 'Loading...',
- failedToLoadEntities: 'Failed to load entities: {{error}}',
- noEntitiesMatching: 'No entities found matching "{{search}}"',
- noEntitiesAvailable: 'No entities available',
- searchingEntities: 'Searching all entities ({{count}} found)',
- showingEntities: 'Showing switch, light, input_boolean ({{count}} available)',
- energyMonitoringOptional: 'Energy Monitoring (Optional)',
- energyMonitoringHint: 'Search and select sensors that provide power/energy data.',
- powerSensorW: 'Power Sensor (W)',
- energyTodayKwh: 'Energy Today (kWh)',
- totalEnergyKwh: 'Total Energy (kWh)',
- noMatchingSensors: 'No matching sensors',
- none: 'None',
- mqttNotConfigured: 'MQTT broker not configured. Set broker address in',
- mqttSettingsPath: 'Settings → Network → MQTT Publishing',
- mqttNotConfiguredSuffix: "(you don't need to enable publishing, just fill in the broker details).",
- mqttMonitorOnlyDescription: 'MQTT plugs receive power/energy data via MQTT subscription. On/off control is not available - use your MQTT broker or home automation system.',
- powerMonitoring: 'Power Monitoring',
- energyMonitoring: 'Energy Monitoring',
- stateMonitoring: 'State Monitoring',
- optional: 'optional',
- topic: 'Topic',
- jsonPath: 'JSON Path',
- multiplier: 'Multiplier',
- onValue: 'ON Value',
- mqttPowerHint: 'JSON path extracts value from JSON payload (e.g., "power_l1"). Leave empty if topic publishes raw numeric values.\nUse multiplier 0.001 for mW→W, 1000 for kW→W.',
- mqttEnergyHint: 'JSON path extracts value from JSON payload. Leave empty for raw values.\nUse multiplier 0.001 for Wh→kWh, 1000 for MWh→kWh.',
- mqttStateHint: 'JSON path extracts value from JSON payload. Leave empty for raw values.\nON value: the exact string that means "ON". Leave empty for auto-detect (ON, true, 1).',
- // REST smart plug
- restControl: 'Control',
- restOnUrl: 'Turn ON URL',
- restOffUrl: 'Turn OFF URL',
- restOnBody: 'ON Request Body',
- restOffBody: 'OFF Request Body',
- restMethod: 'HTTP Method',
- restHeaders: 'Custom Headers (JSON)',
- restStatusUrl: 'Status URL',
- restStatusPath: 'State JSON Path',
- restStatusOnValue: 'ON Value',
- restPowerUrl: 'Power URL',
- restPowerPath: 'Power JSON Path',
- restPowerMultiplier: 'Power Multiplier',
- restEnergyUrl: 'Energy URL',
- restEnergyPath: 'Energy JSON Path',
- restEnergyMultiplier: 'Energy Multiplier',
- restUrlRequired: 'At least one URL (ON or OFF) is required for REST plugs',
- restHeadersHint: 'e.g. {"Authorization": "Bearer your-token"}',
- restBodyHint: 'e.g. ON, {"state": "on"}',
- restStatusHint: 'URL to poll for current state',
- restPathHint: 'e.g. state or data.power.status',
- restPowerUrlHint: 'Separate URL for power data (uses Status URL if empty)',
- restEnergyUrlHint: 'Separate URL for energy data (uses Status URL if empty)',
- restEnergyHint: 'Each value can use its own URL or fall back to the Status URL. Use multipliers for unit conversion (e.g. 0.001 to convert Wh to kWh).',
- testConnection: 'Test Connection',
- connectionSuccess: 'Connection successful',
- noSwitchesInSwitchbar: 'No switches in switchbar',
- enableSwitchbarHint: 'Enable "Show in Switchbar" in Settings > Smart Plugs',
- },
- // Notifications
- notifications: {
- // Provider types
- providerTypes: {
- callmebot: 'CallMeBot/WhatsApp',
- ntfy: 'ntfy',
- pushover: 'Pushover',
- telegram: 'Telegram',
- email: 'Email',
- discord: 'Discord',
- webhook: 'Webhook',
- homeassistant: 'Home Assistant',
- },
- // Provider descriptions
- providerDescriptions: {
- email: 'SMTP email notifications',
- telegram: 'Notifications via Telegram bot',
- discord: 'Send to Discord channel via webhook',
- ntfy: 'Free, self-hostable push notifications',
- pushover: 'Simple, reliable push notifications',
- callmebot: 'Free WhatsApp notifications via CallMeBot',
- webhook: 'Generic HTTP POST to any URL',
- homeassistant: 'Persistent notifications in Home Assistant dashboard',
- },
- // NotificationProviderCard
- lastSuccess: 'Last: {{date}}',
- error: 'Error',
- printer: 'Printer:',
- allPrinters: 'All printers',
- sendTestNotification: 'Send Test Notification',
- eventSettings: 'Event Settings',
- enabled: 'Enabled',
- sendFromProvider: 'Send notifications from this provider',
- // Event categories
- printEvents: 'Print Events',
- printerStatus: 'Printer Status',
- amsAlarms: 'AMS Alarms',
- amsHtAlarms: 'AMS-HT Alarms',
- printQueue: 'Print Queue',
- // Event tags (badges)
- start: 'Start',
- plateCheck: 'Plate Check',
- complete: 'Complete',
- failed: 'Failed',
- stopped: 'Stopped',
- progress: 'Progress',
- offline: 'Offline',
- lowFilament: 'Low Filament',
- maintenance: 'Maintenance',
- amsHumidity: 'AMS Humidity',
- amsTemp: 'AMS Temp',
- amsHtHumidity: 'AMS-HT Humidity',
- amsHtTemp: 'AMS-HT Temp',
- bedCooled: 'Bed Cooled',
- firstLayer: 'First Layer',
- quiet: 'Quiet',
- digest: 'Digest {{time}}',
- // Event labels (expanded settings)
- printStarted: 'Print Started',
- plateNotEmpty: 'Plate Not Empty',
- plateNotEmptyDescription: 'Objects detected before print',
- printCompleted: 'Print Completed',
- bedCooledLabel: 'Bed Cooled',
- bedCooledDescription: 'Bed cooled below threshold after print',
- firstLayerCompleteLabel: 'First Layer Complete',
- firstLayerCompleteDescription: 'Notify with snapshot when first layer finishes',
- missingSpoolAssignmentLabel: 'Missing Spool Assignment',
- missingSpoolAssignmentDescription: 'Notify when print starts and required trays have no assigned spool',
- printFailed: 'Print Failed',
- printStopped: 'Print Stopped',
- progressMilestones: 'Progress Milestones',
- progressMilestonesDescription: 'Notify at 25%, 50%, 75%',
- printerOffline: 'Printer Offline',
- printerError: 'Printer Error',
- lowFilamentLabel: 'Low Filament',
- maintenanceDue: 'Maintenance Due',
- maintenanceDueDescription: 'Notify when maintenance is needed',
- amsHumidityHigh: 'AMS Humidity High',
- amsHumidityHighDescription: 'Regular AMS humidity exceeds threshold',
- amsTemperatureHigh: 'AMS Temperature High',
- amsTemperatureHighDescription: 'Regular AMS temperature exceeds threshold',
- amsHtHumidityHigh: 'AMS-HT Humidity High',
- amsHtHumidityHighDescription: 'AMS-HT humidity exceeds threshold',
- amsHtTemperatureHigh: 'AMS-HT Temperature High',
- amsHtTemperatureHighDescription: 'AMS-HT temperature exceeds threshold',
- // Queue events
- jobAdded: 'Job Added',
- jobAddedDescription: 'Job added to queue',
- jobAssigned: 'Job Assigned',
- jobAssignedDescription: 'Model-based job assigned to printer',
- jobStarted: 'Job Started',
- jobStartedDescription: 'Queue job started printing',
- jobWaiting: 'Job Waiting',
- jobWaitingDescription: 'Job waiting for filament or printer',
- jobSkipped: 'Job Skipped',
- jobSkippedDescription: 'Job skipped (previous failed)',
- jobFailed: 'Job Failed',
- jobFailedDescription: 'Job failed to start',
- queueComplete: 'Queue Complete',
- queueCompleteDescription: 'All queue jobs finished',
- // Quiet hours
- quietHours: 'Quiet Hours',
- noNotificationsDuring: 'No notifications during these hours',
- editProviderToChangeQuietHours: 'Edit provider to change quiet hours',
- // Daily digest
- dailyDigest: 'Daily Digest',
- batchNotifications: 'Batch notifications into a single daily summary',
- sendAt: 'Send at {{time}}',
- editProviderToChangeDigestTime: 'Edit provider to change digest time',
- // Actions
- edit: 'Edit',
- deleteProvider: 'Delete Notification Provider',
- deleteConfirm: 'Are you sure you want to delete "{{name}}"? This cannot be undone.',
- delete: 'Delete',
- // AddNotificationModal
- addTitle: 'Add Notification Provider',
- editTitle: 'Edit Notification Provider',
- nameLabel: 'Name *',
- namePlaceholder: 'My Notifications',
- providerTypeLabel: 'Provider Type *',
- configuration: 'Configuration',
- testConfiguration: 'Test Configuration',
- printerFilter: 'Printer Filter',
- onlyFromPrinter: 'Only send notifications for events from this printer',
- quietHoursDnd: 'Quiet Hours (Do Not Disturb)',
- quietStart: 'Start',
- quietEnd: 'End',
- dailyDigestLabel: 'Daily Digest',
- sendDigestAt: 'Send digest at',
- digestCollected: 'Events will be collected and sent as a single summary at this time',
- notificationEvents: 'Notification Events',
- progressPercent: '(25%, 50%, 75%)',
- bedCooledAfterPrint: '(after print completes)',
- cancel: 'Cancel',
- save: 'Save',
- add: 'Add',
- nameRequired: 'Name is required',
- fieldRequired: '{{field}} is required',
- // Config field labels
- phoneNumber: 'Phone Number',
- apiKey: 'API Key',
- serverUrl: 'Server URL',
- topic: 'Topic',
- authToken: 'Auth Token',
- userKey: 'User Key',
- appToken: 'App Token',
- priority: 'Priority',
- botToken: 'Bot Token',
- chatId: 'Chat ID',
- smtpServer: 'SMTP Server',
- smtpPort: 'SMTP Port',
- security: 'Security',
- authentication: 'Authentication',
- username: 'Username',
- password: 'Password',
- fromEmail: 'From Email',
- toEmail: 'To Email',
- webhookUrl: 'Webhook URL',
- payloadFormat: 'Payload Format',
- authorization: 'Authorization',
- titleFieldName: 'Title Field Name',
- messageFieldName: 'Message Field Name',
- // NotificationTemplateEditor
- editTemplate: 'Edit Template: {{name}}',
- titleLabel: 'Title',
- bodyLabel: 'Body',
- titlePlaceholder: 'Notification title...',
- bodyPlaceholder: 'Notification body...',
- availableVariables: 'Available Variables',
- clickToInsert: 'Click to insert at cursor position in body',
- livePreview: 'Live Preview',
- hide: 'Hide',
- show: 'Show',
- loadingPreview: 'Loading preview...',
- enterTemplateContent: 'Enter template content to see preview',
- titlePreview: 'Title:',
- bodyPreview: 'Body:',
- resetToDefault: 'Reset to Default',
- titleRequired: 'Title is required',
- bodyRequired: 'Body is required',
- // NotificationLogViewer
- notificationLog: 'Notification Log',
- showFailedOnly: 'Failed only',
- last24Hours: 'Last 24 hours',
- last7Days: 'Last 7 days',
- last30Days: 'Last 30 days',
- last90Days: 'Last 90 days',
- justNow: 'Just now',
- noFailedNotifications: 'No failed notifications',
- noNotificationsLogged: 'No notifications logged',
- unknownProvider: 'Unknown Provider',
- logTitle: 'Title',
- logMessage: 'Message',
- logError: 'Error',
- logProvider: 'Provider: {{type}}',
- logTime: 'Time: {{time}}',
- refresh: 'Refresh',
- clearOld: 'Clear Old',
- statsSummary: 'Last {{days}} days:',
- statsNotifications: 'notifications',
- statsSent: '{{count}} sent',
- statsFailed: '{{count}} failed',
- // Event type labels (for log viewer)
- eventTypes: {
- print_start: 'Print Started',
- print_complete: 'Print Complete',
- print_failed: 'Print Failed',
- print_stopped: 'Print Stopped',
- print_progress: 'Progress',
- printer_offline: 'Printer Offline',
- printer_error: 'Printer Error',
- filament_low: 'Low Filament',
- maintenance_due: 'Maintenance Due',
- test: 'Test',
- },
- // User email notification preferences
- userEmail: {
- title: 'Notifications',
- emailNotifications: 'Email Notifications',
- emailNotificationsDesc: 'Receive email notifications for your own print jobs. Emails are sent using the system SMTP settings configured in Advanced Authentication.',
- sendingTo: 'Notifications will be sent to',
- noEmailWarning: 'Your account does not have an email address. Contact an administrator to add one.',
- printJobNotifications: 'Print Job Notifications',
- printJobNotificationsDesc: 'Choose which events trigger email notifications for print jobs you submit.',
- printJobStarts: 'Print Job Starts',
- printJobStartsDesc: 'Get notified when your print job begins.',
- printJobFinishes: 'Print Job Finishes',
- printJobFinishesDesc: 'Get notified when your print job completes successfully.',
- printErrors: 'Print Errors',
- printErrorsDesc: 'Get notified when your print job fails or encounters an error.',
- printJobStops: 'Print Job Stops',
- printJobStopsDesc: 'Get notified when your print job is cancelled or stopped.',
- saveSuccess: 'Notification preferences saved.',
- saveError: 'Failed to save notification preferences.',
- },
- },
- // Rich Text Editor
- richTextEditor: {
- bold: 'Bold',
- italic: 'Italic',
- underline: 'Underline',
- bulletList: 'Bullet List',
- numberedList: 'Numbered List',
- alignLeft: 'Align Left',
- alignCenter: 'Align Center',
- alignRight: 'Align Right',
- addLink: 'Add Link',
- removeLink: 'Remove Link',
- },
- // External Links
- externalLinks: {
- noLinksConfigured: 'No external links configured',
- deleteLink: 'Delete Link',
- removeCustomIcon: 'Remove custom icon',
- openInNewTab: 'Open in new tab',
- placeholders: {
- linkName: 'My Link',
- },
- },
- // Keyboard Shortcuts Modal
- keyboardShortcuts: {
- title: 'Keyboard Shortcuts',
- navigation: 'Navigation',
- archivesSection: 'Archives',
- kProfilesSection: 'K-Profiles',
- generalSection: 'General',
- shortcuts: {
- goToPrinters: 'Go to Printers',
- goToArchives: 'Go to Archives',
- goToQueue: 'Go to Queue',
- goToStats: 'Go to Statistics',
- goToProfiles: 'Go to Cloud Profiles',
- goToSettings: 'Go to Settings',
- focusSearch: 'Focus search',
- openUploadModal: 'Open upload modal',
- clearSelection: 'Clear selection / blur input',
- contextMenu: 'Context menu on cards',
- refreshProfiles: 'Refresh profiles',
- newProfile: 'New profile',
- exitSelectionMode: 'Exit selection mode',
- showHelp: 'Show this help',
- },
- footer: 'Press Esc or click outside to close',
- },
- // Notification Log
- notificationLog: {
- title: 'Notification Log',
- events: {
- printStarted: 'Print Started',
- printComplete: 'Print Complete',
- printFailed: 'Print Failed',
- printStopped: 'Print Stopped',
- progress: 'Progress',
- printerOffline: 'Printer Offline',
- printerError: 'Printer Error',
- lowFilament: 'Low Filament',
- maintenanceDue: 'Maintenance Due',
- test: 'Test',
- },
- timeAgo: {
- justNow: 'Just now',
- minutesAgo: '{{minutes}}m ago',
- hoursAgo: '{{hours}}h ago',
- },
- },
- // Restore/Backup Modal
- restoreBackup: {
- title: 'Restore Backup',
- restoring: 'Restoring...',
- restoreComplete: 'Restore Complete',
- restoreFailed: 'Restore Failed',
- importSettings: 'Import settings from a backup file',
- pleaseWait: 'Please wait while your data is being restored',
- clickToSelect: 'Click to select backup file (.json or .zip)',
- howDuplicateHandling: 'How duplicate handling works:',
- categories: {
- printers: 'Printers',
- smartPlugs: 'Smart Plugs',
- notificationProviders: 'Notification Providers',
- filaments: 'Filaments',
- archives: 'Archives',
- pendingUploads: 'Pending Uploads',
- settingsTemplates: 'Settings & Templates',
- },
- matchingInfo: {
- printers: 'matched by serial number',
- smartPlugs: 'matched by IP address',
- notificationProviders: 'matched by name',
- filaments: 'matched by name + type + brand',
- archives: 'matched by content hash',
- pendingUploads: 'matched by filename',
- settingsTemplates: 'always overwritten',
- },
- replaceExisting: 'Replace existing data',
- keepExisting: 'Keep existing data',
- replaceDescription: 'Overwrite items that already exist with backup data',
- keepDescription: 'Only restore items that don\'t already exist',
- caution: 'Caution:',
- cautionText: 'Overwriting will replace your current configurations with backup data. Printer access codes are never overwritten for security.',
- itemsRestored: 'Items Restored',
- itemsSkipped: 'Items Skipped',
- restored: 'Restored',
- skipped: 'Skipped (already exist)',
- filesLabel: 'Files (3MF, thumbnails, etc.)',
- newApiKeysGenerated: 'New API Keys Generated',
- newApiKeysWarning: 'These keys are only shown once. Copy them now!',
- processingBackup: 'Processing backup file...',
- noDataFound: 'No data was found to restore in the backup file.',
- failedToRestore: 'Failed to restore backup. Please check the file format.',
- },
- // Backup Export Modal
- backupExport: {
- title: 'Export Backup',
- selectData: 'Select data to include',
- selectAll: 'Select All',
- selectNone: 'Select None',
- categoryDescriptions: {
- settings: 'Language, theme, update preferences',
- notifications: 'ntfy, Pushover, Discord, etc.',
- templates: 'Custom message templates',
- smartPlugs: 'Tasmota plug configurations',
- externalLinks: 'Sidebar links to external services',
- printers: 'Printer info (access codes excluded)',
- plateDetection: 'Empty plate reference images',
- filaments: 'Filament types and costs',
- maintenance: 'Custom maintenance schedules',
- archives: 'All print data + files (3MF, thumbnails, photos)',
- projects: 'Projects, BOM items, and attachments',
- pendingUploads: 'Virtual printer uploads awaiting review',
- apiKeys: 'Webhook API keys (new keys generated on import)',
- },
- requiresPrinters: 'Requires Printers to be selected',
- zipFileWarning: 'ZIP file will be created.',
- zipFileDescription: 'Includes all 3MF files, thumbnails, timelapses, and photos. This may take a while and result in a large file.',
- includeAccessCodes: 'Include Access Codes',
- includeAccessCodesDescription: 'For transferring to another machine',
- includeAccessCodesWarning: 'Access codes will be included in plain text. Keep this backup file secure!',
- categoriesSelected: '{{selectedCount}} categories selected',
- },
- // Pending Uploads Panel
- pendingUploads: {
- placeholders: {
- notes: 'Add notes about this print...',
- },
- discardUpload: 'Discard Upload',
- archiveAllUploads: 'Archive All Uploads',
- discardAllUploads: 'Discard All Uploads',
- archive: 'Archive',
- timeAgo: {
- justNow: 'Just now',
- minutesAgo: '{{minutes}}m ago',
- hoursAgo: '{{hours}}h ago',
- daysAgo: '{{days}}d ago',
- },
- },
- // API Browser
- apiBrowser: {
- placeholders: {
- requestBody: 'JSON request body...',
- searchEndpoints: 'Search endpoints...',
- },
- },
- // Configure AMS Slot Modal
- configureAmsSlot: {
- title: 'Configure AMS Slot',
- slotConfigured: 'Slot Configured!',
- configuringSlot: 'Configuring slot:',
- slotLabel: '{{ams}} Slot {{slot}}',
- searchPresets: 'Search presets...',
- colorPlaceholder: 'Color name or hex (e.g., brown, FF8800)',
- clearCustomColor: 'Clear custom color',
- noCloudPresets: 'No cloud presets. Login to Bambu Cloud to sync.',
- noPresetsAvailable: 'No presets available. Login to Bambu Cloud or import local profiles.',
- noMatchingPresets: 'No matching presets found.',
- custom: 'Custom',
- builtin: 'Built-in',
- settingsSentToPrinter: 'Settings sent to printer',
- filamentProfile: 'Filament Profile',
- kProfileLabel: 'K Profile (Pressure Advance)',
- filteringFor: 'Filtering for: {{material}}',
- noKProfile: 'No K profile (use default 0.020)',
- noMatchingKProfiles: 'No matching K profiles found. Default K=0.020 will be used.',
- selectFilamentFirst: 'Select a filament profile first',
- kFromCalibration: 'K={{value}} from printer calibration',
- customColorLabel: 'Custom Color (optional)',
- presetColors: '{{name}} colors:',
- showLessColors: 'Show less colors',
- showMoreColors: 'Show more colors',
- clear: 'Clear',
- hexLabel: 'Hex: #{{hex}}',
- resetting: 'Resetting...',
- resetSlot: 'Reset Slot',
- cancel: 'Cancel',
- configuring: 'Configuring...',
- configureSlot: 'Configure Slot',
- },
- // GitHub Backup Settings
- githubBackup: {
- title: 'GitHub Backup',
- history: 'History',
- downloadBackup: 'Download Backup',
- restoreBackup: 'Restore Backup',
- noBackupsYet: 'No backups yet',
- },
- // Email Settings
- emailSettings: {
- placeholders: {
- fromName: 'BamBuddy',
- },
- },
- // Tag Management Modal
- tagManagement: {
- searchTags: 'Search tags...',
- renameTag: 'Rename tag',
- deleteTag: 'Delete tag',
- },
- // Notification Template Editor
- notificationTemplates: {
- placeholders: {
- title: 'Notification title...',
- body: 'Notification body...',
- },
- },
- // Batch Tag Modal
- batchTag: {
- placeholders: {
- newTag: 'Enter new tag...',
- },
- },
- // Photo Gallery Modal
- photoGallery: {
- deletePhoto: 'Delete Photo',
- },
- // Filament Hover Card
- filamentHoverCard: {
- copySpoolUuid: 'Copy spool UUID',
- },
- // K Profiles View
- kProfilesView: {
- hasNote: 'Has note',
- copyProfile: 'Copy profile',
- },
- // Layout/Navigation
- layout: {
- openMenu: 'Open menu',
- noPermissionSystemInfo: 'You do not have permission to view system information',
- },
- // Dashboard
- dashboard: {
- dragToReorder: 'Drag to reorder',
- hideWidget: 'Hide widget',
- },
- // Notification Provider Card
- notificationProviderCard: {
- deleteNotificationProvider: 'Delete Notification Provider',
- },
- // File Manager Modal
- fileManagerModal: {
- closeFileManager: 'Close file manager',
- sortFiles: 'Sort files',
- goToParentFolder: 'Go to parent folder',
- threeView: '3D View',
- },
- // Embedded Camera Viewer
- embeddedCameraViewer: {
- refreshStream: 'Refresh stream',
- close: 'Close',
- zoomOut: 'Zoom out',
- resetZoom: 'Reset zoom',
- zoomIn: 'Zoom in',
- dragToResize: 'Drag to resize',
- },
- // Timelapse Viewer
- timelapseViewer: {
- skipBack5s: 'Skip back 5s',
- skipForward5s: 'Skip forward 5s',
- },
- // Notification Providers
- notificationProviders: {
- descriptions: {
- email: 'SMTP email notifications',
- telegram: 'Notifications via Telegram bot',
- discord: 'Send to Discord channel via webhook',
- ntfy: 'Free, self-hostable push notifications',
- pushover: 'Simple, reliable push notifications',
- callmebot: 'Free WhatsApp notifications via CallMeBot',
- webhook: 'Generic HTTP POST to any URL',
- },
- },
- // Log Viewer
- logViewer: {
- searchPlaceholder: 'Search message or logger name...',
- noLogEntries: 'No log entries found',
- },
- // Switchbar Popover
- switchbarPopover: {
- noSwitchesInSwitchbar: 'No switches in switchbar',
- },
- // Project Page Modal
- projectPageModal: {
- placeholders: {
- title: 'Title',
- designer: 'Designer',
- license: 'License',
- description: 'Enter description...',
- profileTitle: 'Profile Title',
- profileDescription: 'Profile description...',
- },
- },
- // Spoolman Settings
- spoolmanSettings: {},
- // Time
- time: {
- unknown: '-',
- waiting: 'Waiting',
- justNow: 'Just now',
- now: 'Now',
- minsAgo: '{{count}}m ago',
- inMins: 'in {{count}}m',
- hoursAgo: '{{count}}h ago',
- inHours: 'in {{count}}h',
- daysAgo: '{{count}}d ago',
- inDays: 'in {{count}}d',
- },
- // SpoolBuddy Kiosk
- spoolbuddy: {
- nav: {
- dashboard: 'Dashboard',
- ams: 'AMS',
- inventory: 'Inventory',
- writeTag: 'Write',
- settings: 'Settings',
- },
- status: {
- nfcReady: 'NFC Ready',
- nfcOff: 'NFC Off',
- offline: 'Offline',
- online: 'Online',
- noPrinters: 'No printers',
- deviceOffline: 'Device Offline',
- waitingConnection: 'Waiting for device connection...',
- systemReady: 'System Ready',
- status: 'Status',
- },
- dashboard: {
- readyToScan: 'Ready to scan',
- idleMessage: 'Place a spool on the scale to identify it',
- nfcHint: 'NFC tag will be read automatically',
- device: 'Device',
- syncWeight: 'Sync Weight',
- weightSynced: 'Synced!',
- unknownTag: 'Unknown Tag',
- newTag: 'New Tag Detected',
- onScale: 'on scale',
- linkSpool: 'Link to Spool',
- linkTagTitle: 'Link Tag to Spool',
- linkTag: 'Link Tag',
- selectSpool: 'Select a spool to link this tag to:',
- noUntagged: 'No spools without tags found',
- tagDetected: 'Tag detected',
- noTag: 'No tag',
- tagId: 'Tag',
- grossWeight: 'Gross weight',
- spoolSize: 'Spool size',
- close: 'Close',
- currentSpool: 'Current Spool',
- },
- modal: {
- spoolDetected: 'Spool Detected',
- assignToAms: 'Assign to AMS',
- syncWeight: 'Sync Weight',
- weightSynced: 'Synced!',
- syncing: 'Syncing...',
- newTagDetected: 'New Tag Detected',
- addToInventory: 'Add to Inventory',
- assignToAmsTitle: 'Assign to AMS',
- selectSlot: 'Select a slot',
- assign: 'Assign',
- assigning: 'Assigning...',
- assignSuccess: 'Assigned!',
- assignError: 'Failed to assign spool. Please try again.',
- noPrinterSelected: 'Select a printer...',
- noAmsDetected: 'No AMS detected on this printer',
- slot: 'Slot',
- },
- weight: {
- noReading: 'No reading',
- stable: 'Stable',
- measuring: 'Measuring...',
- tare: 'Tare',
- calibrate: 'Calibrate',
- },
- spool: {
- remaining: 'Remaining',
- material: 'Material',
- brand: 'Brand',
- color: 'Color',
- coreWeight: 'Core',
- labelWeight: 'Label',
- scaleWeight: 'Scale',
- netWeight: 'Net',
- lastUsed: 'Last used',
- },
- ams: {
- noData: 'No AMS detected',
- connectAms: 'Connect an AMS to see filament slots',
- noPrinter: 'No printer selected',
- selectPrinter: 'Select a printer from the top bar',
- printerDisconnected: 'Printer disconnected',
- humidity: 'Humidity',
- level: 'Level',
- active: 'Active',
- slot: 'Slot',
- empty: 'Empty',
- },
- inventory: {
- search: 'Search spools...',
- empty: 'No spools in inventory',
- noResults: 'No matching spools',
- spools: 'spools',
- addSpool: 'Add Spool',
- },
- settings: {
- // Tabs
- tabDevice: 'Device',
- tabDisplay: 'Display',
- tabScale: 'Scale',
- tabUpdates: 'Updates',
- // Device tab
- nfcReader: 'NFC Reader',
- type: 'Type',
- connection: 'Connection',
- notConnected: 'N/A',
- deviceInfo: 'Device Info',
- hostname: 'Host',
- uptime: 'Uptime',
- systemConfig: 'Backend & Auth',
- backendUrl: 'Bambuddy Backend URL',
- apiToken: 'API Token',
- apiTokenPlaceholder: 'Enter API token',
- saveConfig: 'Save Config',
- systemQueued: 'Config queued.',
- nfcDiagnostic: 'NFC Diagnostic',
- scaleDiagnostic: 'Scale Diagnostic',
- readTagDiagnostic: 'Read Tag Diagnostic',
- testNfc: 'Test reader',
- testScale: 'Test accuracy',
- testReadTag: 'Read tag',
- systemFieldsRequired: 'Backend URL is required.',
- // Display tab
- brightness: 'Brightness',
- saved: 'Saved',
- noBacklight: 'No DSI backlight detected. Brightness control requires a DSI display.',
- screenBlank: 'Screen Blank Timeout',
- screenBlankDesc: 'Screen turns off after inactivity. Touch to wake.',
- displayNote: 'Brightness is applied as a software filter.',
- // Scale tab
- scaleCalibration: 'Scale Calibration',
- currentWeight: 'Current weight',
- tareOffset: 'Tare',
- calFactor: 'Factor',
- knownWeight: 'Known weight',
- calStep1: 'Remove all items from the scale and press Set Zero.',
- calStep2: 'Place known weight on scale.',
- setZero: 'Set Zero',
- calibrateNow: 'Calibrate',
- calibrated: 'Calibrated',
- tareSet: 'Tare command sent. Waiting for device...',
- tareFailed: 'Failed to send tare command',
- zeroSet: 'Zero point set. Place known weight on scale.',
- calibrationDone: 'Calibration complete!',
- calibrationFailed: 'Calibration failed',
- lastCalibrated: 'Last calibrated',
- stable: 'Stable',
- settling: 'Settling...',
- firmware: 'Firmware',
- scale: 'Scale',
- noDevice: 'No SpoolBuddy device found',
- // Updates tab
- daemonVersion: 'Daemon Version',
- currentVersion: 'Current',
- versionPending: 'Waiting for daemon...',
- checking: 'Checking...',
- checkUpdates: 'Check for Updates',
- updateAvailable: 'Update available',
- updateInstructions: 'Update via SSH: run the SpoolBuddy install script to upgrade.',
- upToDate: 'Up to date',
- includeBeta: 'Include beta versions',
- },
- writeTag: {
- tabExisting: 'Existing Spool',
- tabNew: 'New Spool',
- tabReplace: 'Replace Tag',
- searchPlaceholder: 'Search by material, color, brand...',
- noUntaggedSpools: 'No spools without tags',
- noTaggedSpools: 'No spools with tags',
- selectSpool: 'Select a spool, then place a blank NTAG on the reader',
- placeTag: 'Place an NTAG on the reader',
- tagReady: 'Tag detected — ready to write',
- writeTag: 'Write Tag',
- replaceTag: 'Replace Tag',
- writing: 'Writing tag...',
- waiting: 'Waiting for SpoolBuddy...',
- writeSuccess: 'Tag written successfully!',
- writeFailed: 'Write failed',
- queueFailed: 'Failed to queue write command',
- tryAgain: 'Try Again',
- cancel: 'Cancel',
- replaceWarning: 'Old tag will be unlinked. New tag will replace it.',
- deviceOffline: 'SpoolBuddy is offline',
- material: 'Material',
- colorName: 'Color Name',
- color: 'Color',
- brand: 'Brand',
- weight: 'Weight (g)',
- createSpool: 'Create Spool',
- creating: 'Creating...',
- spoolCreated: 'Spool created! Ready to write.',
- createFailed: 'Failed to create spool',
- },
- },
- bugReport: {
- title: 'Report a Bug',
- description: 'Description',
- descriptionPlaceholder: 'What went wrong? Please describe the issue...',
- email: 'Email (optional)',
- emailPlaceholder: 'your@email.com',
- emailPrivacy: 'If provided, your email will be included in a collapsed section of the GitHub issue so the maintainer can follow up.',
- screenshot: 'Screenshot',
- uploadOrPaste: 'Upload, paste, or drag an image',
- dataCollectedSummary: 'What data is included in the report?',
- dataIncluded: 'Included:',
- dataIncludedList: 'App version, OS, architecture, Python version, database stats (counts only), printer models, nozzle counts, firmware versions, connectivity status, integration status (Spoolman, MQTT, HA), non-sensitive settings, network interface count, Docker details, dependency versions.',
- dataNeverIncluded: 'Never included:',
- dataNeverIncludedList: 'Printer names, serial numbers, access codes, passwords, IP addresses, email addresses, API keys, tokens, webhook URLs, hostnames, or usernames.',
- submit: 'Submit',
- startLogging: 'Start Debug Logging',
- stepEnableLogging: 'Debug logging enabled',
- stepReproduce: 'Reproduce the issue now',
- stepStopLogging: 'Stop & submit report',
- stopAndSubmit: 'Stop & Submit',
- maxDuration: 'Auto-stops after {{minutes}} min',
- stoppingLogs: 'Collecting logs & submitting...',
- submitting: 'Submitting bug report...',
- submitSuccess: 'Bug report submitted successfully!',
- submitFailed: 'Failed to submit bug report',
- thankYou: 'Thank you!',
- submitted: 'Your bug report has been submitted.',
- viewIssue: 'View Issue',
- unexpectedError: 'An unexpected error occurred',
- },
- };
|