| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544 |
- 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',
- 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',
- 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',
- },
- // 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',
- 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',
- 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',
- queueAllPlates: 'Queue All {{count}} Plates',
- 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}}',
- // 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',
- },
- // 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',
- },
- },
- // 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',
- 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',
- 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',
- 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.',
- 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',
- toast: {
- folderCreated: 'Folder created',
- folderDeleted: 'Folder deleted',
- fileDeleted: 'File deleted',
- filesDeleted: 'Deleted {{count}} files',
- filesMoved: 'Files moved',
- folderLinked: 'Folder linked',
- folderUnlinked: 'Folder unlinked',
- 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',
- },
- // 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)',
- 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)',
- 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).',
- 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',
- 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',
- // 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',
- collectingLogs: 'Collecting diagnostic logs...',
- collectingLogsHint: 'Debug logging enabled, querying printers for fresh data.',
- 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',
- countdownSeconds: '{{seconds}}s',
- },
- };
|