Object.assign(window.MESSAGES.en,{username:'Username',password:'Password',connect:'Sign in to Frame Flow',UNAUTHORIZED:'Invalid credentials or expired session',tokenHint:'Sign in with your account. Remember me keeps the session for 30 days; sign out on shared devices.',logout:'Sign out',noToken:'Sign in to manage frames',formEditor:'Form editor',advanced:'Advanced JSON',resetTemplate:'Reset template',resetConfirm:'Remove saved settings and restore built-in defaults?',eventsHelp:'One event per line',photo:'Family photo',noPhoto:'Use photo placeholder',changePassword:'Change password',currentPassword:'Current password',newPassword:'New password (at least 8 characters)',passwordChanged:'Password changed. Sign in again.',saveTemplate:'Save template settings'});
Object.assign(window.MESSAGES.zh,{currentContent:'敶枏��曄內��捆',currentTemplate:'敶枏�璅⊥踎',sourceUnknown:'�交��芰䰻嚗朞�撘惩㦛��𧊋�朞� Frame Flow ���嚗諹挽憭� API 銝齿�靘𥟇芋�踵㺭�柴��',editCurrent:'霂餃�敶枏�璅⊥踎撟嗥�颲�',sourceKnown:'Frame Flow 撌脰扇敶閙䔉皞�',weatherSettings:'憭拇��交�',location:'雿滨蔭�滨妍',latitude:'蝥砍漲',longitude:'蝏誩漲',weatherPreview:'霂餃�憭拇�',forecast:'�芣䔉銝匧予憭拇�',weatherUnavailable:'憭拇�����舐鍂',weatherAttribution:'憭拇��交�嚗鐾pen-Meteo嚗㇃C BY 4.0嚗�',searchImages:'�𦦵揣��辣�齿��曄� ID',sortNewest:'���唬���',sortOldest:'���拐���',sortName:'�匧�蝘�',download:'銝贝蝸�曄�',continueEdit:'蝏抒賒蝻𤥁�璅⊥踎',details:'�亦�霂行�',runNow:'蝡见朖�扯�',runConfirm:'�啣銁�扯�甇支遙�∪��孵��餅��曄內嚗峕糓�衣誧蝏哨�',jobPreview:'憸��隞餃𦛚',temporaryDisplay:'銝湔𧒄�曄內',displayOptions:'�曄內�厰★',sourceType:'��捆蝐餃�',templateFields:'璅⊥踎�唳旿',imageChoice:'�㗇𥋘�曄�',imageURL:'�曄� URL',restoreSource:'�W�銝𠹺�撘�',weatherMock:'憭拇�瞍𠉛內',weatherReal:'摰墧𧒄憭拇�',stale:'�唳旿餈��',apply:'摨𠉛鍂'});
Object.assign(window.MESSAGES.en,{currentContent:'Currently displayed content',currentTemplate:'Current template',sourceUnknown:'Unknown source: this image was not generated by Frame Flow. The device API provides no template data.',editCurrent:'Load current template for editing',sourceKnown:'Source recorded by Frame Flow',weatherSettings:'Weather provider',location:'Location name',latitude:'Latitude',longitude:'Longitude',weatherPreview:'Read weather',forecast:'Three-day forecast',weatherUnavailable:'Weather unavailable',weatherAttribution:'Weather: Open-Meteo (CC BY 4.0)',searchImages:'Search filename or image ID',sortNewest:'Newest first',sortOldest:'Oldest first',sortName:'By name',download:'Download image',continueEdit:'Edit this template',details:'Details',runNow:'Run now',runConfirm:'Running this task will change the frame display. Continue?',jobPreview:'Preview task',temporaryDisplay:'Temporary display',displayOptions:'Display options',sourceType:'Content type',templateFields:'Template data',imageChoice:'Select image',imageURL:'Image URL',restoreSource:'Restore previous image',weatherMock:'Mock weather',weatherReal:'Live weather',stale:'Stale data',apply:'Apply'});
window.MESSAGES.zh.templateHint='����鞾�閫���漤�㗇𥋘�曄內�孵���予瘞娍䔉皞𣂼虾�刻挽蝵桐葉�滨蔭��';window.MESSAGES.en.templateHint='Render a preview, then choose display options. Configure weather in Settings.';
Object.assign(window.MESSAGES.zh,{allowedHosts:'��捂銝贝蝸�曄�����㵪�瘥讛�銝�銝迎�',urlHint:'�芸�霈� HTTPS �諹挽蝵桐葉�𡒊&��捂����㵪�����啣�憪讠�蝳�迫��',uploadURL:'隞𡡞曎�亙紡��',urlSettings:'�曄� URL 摰匧�霈曄蔭'});Object.assign(window.MESSAGES.en,{allowedHosts:'Allowed image hostnames (one per line)',urlHint:'HTTPS and explicitly allowed hosts only. Private network addresses are blocked.',uploadURL:'Import URL',urlSettings:'Image URL security'});
Object.assign(window.MESSAGES.zh,{poetryNotice:'Frame Flow 瘥𤩺𠯫霂𡑒�嚗𡁜�蝵桀𧂈�貉�霂㵪��劐�瘚瑟𠯫���憭拇揢銝�擐硔��𡠺蝡衤�摰䀹䲮撠讐�摨讐�霈a�嚗���寡恥��挽蝵格�瘜閖�朞��砍� API 霂餃��碶耨�嫘��',poemChoice:'�㗇𥋘霂𡑒�',dailyAutomatic:'瘥𤩺𠯫�芸𢆡�㕑�',poetryCatalog:'��蔭蝭�㺭嚗�',dailyPoetryJob:'瘥𤩺𠯫銝�擐𤥁�霂�',poetryScheduleHint:'瘥誩予�劐�瘚瑟𧒄�箇��𣂼�憭抵�霂滚僎�曄內����臭遙�∪�隡𡁏��嗆㺿�条𤫇獢�遬蝷箝��',poem_title:'霂堒�',poem_author:'雿𡏭��',poem_lines:'霂𡑒�甇��'});Object.assign(window.MESSAGES.en,{poetryNotice:'Frame Flow Daily Poetry selects a classical poem by Shanghai date. It is independent of the official mini-app subscription, whose settings are not exposed by the public API.',poemChoice:'Choose poem',dailyAutomatic:'Automatic daily selection',poetryCatalog:'Catalog size: ',dailyPoetryJob:'A poem every day',poetryScheduleHint:'Generate and display the daily poem in Shanghai time. Enabling this job will change the frame on schedule.',poem_title:'Poem title',poem_author:'Poet',poem_lines:'Poem text'});
Object.assign(MESSAGES.en,{officialContentTitle:'KoKonna official widgets and subscriptions',officialContentDescription:'Content types listed in official product materials; managed separately from Frame Flow templates.',officialCalendarWeather:'Calendar and local weather',officialWordAlmanacTravel:'Word of the day, traditional almanac and global travel recommendations',officialNews:'Daily news',officialCreative:'AI voice / text / sketch / photo-to-art; photo rotation',officialSubscriptionUnavailable:'Public OpenAPI does not list subscription discovery, current subscription, subscribe or unsubscribe endpoints. Manage official subscriptions in the official mini-program. Frame Flow cannot read or modify these settings. Your daily-poetry subscription is mini-program content; its complete catalog cannot currently be verified through public API.',officialProductDocs:'Official content overview ��',officialAPIDocs:'Official OpenAPI ��'});
Object.assign(MESSAGES.en,{photoSources:'Photo sources',sourceHint:'Choose photos from a read-only NAS folder or WebDAV. Preview does not change the frame.',addSource:'Add source',browse:'Browse photos',randomPreview:'Preview random photo',sourceJob:'Schedule random photos',noSources:'No photos yet. Add a source or check the folder.',sourceKind:'Source type',nasDirectory:'NAS local folder',sourceLocation:'Folder / WebDAV URL',sourceLocationHint:'Local: relative folder under the mounted photo root, e.g. . or family. WebDAV: HTTPS directory URL; allow its hostname in Settings first.',sourceCredential:'WebDAV credential environment name',sourceCredentialHint:'Enter a variable name, never a password. Admin configures JSON username/password via environment or Secret.',sourceRecursive:'Include subfolders (local)',sourceImages:'Available photos',sourceBrowseHint:'Catalog loaded on demand. Click a filename to preview; originals are not downloaded in bulk.',previousPage:'Previous page',nextPage:'Next page',sourcePreviewHint:'Display uses this exact previewed photo.',randomPhoto:'Random photo',sourceJobHint:'Choose a fresh random photo each run. Paused by default; enabling changes the frame on schedule.'});
Object.assign(MESSAGES.en,{organizedPhotos:'Only photos in date-prefixed folders',folderCaption:'Show folder caption below the photo',folderCaptionHint:'Line 1: title without date/place. Line 2: date. Line 3: place after @, omitted when absent. Subfolders inherit their nearest dated folder.'});
Object.assign(MESSAGES.en,{peopleFilter:'Filter by Synology Photos people',peopleHint:'Choose only from the intersection of this folder and selected people. Requires shared-space People access; never falls back to the full catalog.',choosePeople:'Connect / choose people',personMatch:'Person matching',personAny:'Any selected person',personAll:'All selected people together',photosConfigure:'Admin must configure SYNOLOGY_PHOTOS_URL and SYNOLOGY_PHOTOS_CERT_SHA256, and mount the shared photo folder as the photo root.',photosSessionHint:'Only a protected login session is stored, never your NAS password. Reconnect when the session expires.',photosConnect:'Connect Synology Photos',photosDisconnect:'Disconnect',peopleSearch:'Search person name or ID',peopleUnnamed:'Show unnamed person groups',peopleSelected:'Selected: '});
Object.assign(MESSAGES.en,{photoOrientation:'Photo orientation',orientationAuto:'Auto 繚 match canvas orientation',orientationLandscape:'Landscape photos',orientationPortrait:'Portrait photos',orientationLegacy:'Any orientation (existing setting)',orientationHint:'Auto follows device dimensions and rotation, swapping width/height at 90簞/270簞. Landscape/portrait control both photo selection and output canvas. EXIF-aware; square photos do not match. Photos are not stretched.'});
Object.assign(window.MESSAGES.zh,{cleanupUnstarred:'�芣�����箇����隡� 7 憭拙�皜��',retentionHint:'隞���鍂鈭𡡞��箇���遙�∠��唬�隡𨬭�������辷�敶枏��曄����憭滚㦛����剜𦆮�𡑒”撘閧鍂銝滢��芸𢆡�𣳇膄���敶勗� NAS �笔㦛��',star:'�����靽萘�',unstar:'���𡝗����',starredKeep:'撌脫��� 繚 靽萘�',expiresAt:'�芣������𧒄�湛�'});
Object.assign(window.MESSAGES.en,{cleanupUnstarred:'Clean unstarred random uploads after 7 days',retentionHint:'New random photo uploads only. Starred, current, restore and playlist images are protected. NAS originals remain untouched.',star:'�� Keep',unstar:'�� Unstar',starredKeep:'Starred 繚 kept',expiresAt:'Cleanup due:'});
Object.assign(window.MESSAGES.zh,{cloudKeepLatest:'�𤩺㦤隞餃𦛚鈭𤑳垢隞���蹱��唳��笔㦛嚗𥟇𧋦�唳����隡惩�靽萘�鈭𤑳垢�舀𧋦��鰵�曉仃韐乩�隡𡁏�瘙唳唂�整��',taskOrigin:'隞餃𦛚���',originFilter:'�交�蝑偦��',origin_all:'�券��交�',origin_manual:'�见𢆡銝𠹺�',origin_task:'隞餃𦛚���',origin_external:'憭㚚��券��',origin_template:'璅⊥踎���',origin_unknown:'�交��芰䰻',allTasks:'�券�隞餃𦛚',selectImage:'�㗇𥋘�曄�',selectAll:'�券�� / �𡝗��券��',deleteSelected:'�𣳇膄����',selectImagesFirst:'霂瑕��㗇𥋘�曄�',deleteSelectedConfirm:'�𣳇膄���㗇𧋦�啣㦛���銝滢��𣳇膄 NAS �笔��抒���',batchFailed:'�芣����雿𦦵��曄��堆�'});
Object.assign(window.MESSAGES.en,{cloudKeepLatest:'Each random task keeps its latest confirmed cloud image. Uploaded local favorites stay. Failed replacements never evict the last good image.',taskOrigin:'Task generated',originFilter:'Filter by origin',origin_all:'All origins',origin_manual:'Manual upload',origin_task:'Task generated',origin_external:'External push',origin_template:'Template generated',origin_unknown:'Unknown origin',allTasks:'All tasks',selectImage:'Select image',selectAll:'Select / deselect all',deleteSelected:'Delete selected',selectImagesFirst:'Select images first',deleteSelectedConfirm:'Delete selected local images? NAS originals remain untouched.',batchFailed:'Failed items:'});
templateHint:'Templates arrange text, weather and selected photos into one image. The frame displays that image, rather than a live webpage.',
templateSteps:'1. Edit content �� 2. Generate preview (local only) �� 3. Display on frame. Saving defaults only saves settings. Create a template job in Automation for scheduled updates.',
templatePhotoHelp:'This template supports photos: choose an uploaded photo or upload a new one. The photo and text render together; without a photo, a placeholder is shown.',
templateContentHelp:'This template displays formatted information and does not automatically choose gallery photos. Weather and dates update when rendering; the displayed image stays static until rendered and displayed again.',
templateWeatherHelp:'Leave weather blank to use Settings �� Weather source automatically. Enter JSON only to override it manually.'
templateData:'Image content',formEditor:'Content that appears in the generated image',
templateEditHelp:'Edit the text and photo used to create the image, rather than device settings. The original photo stays intact. Existing text is a default you can replace.',
templateGuideTitle:'What does this template display?',
guidePhotoText:'A title at the top, a large photo in the middle, and your message below. This differs from the bottom watermark used by photo-source jobs.',
guideDashboard:'Title, date, weekday, weather, your events, a quote and a lower photo area. Events are entered manually; private calendars are not connected automatically.',
guideWeather:'Title, date, current weather and a three-day forecast. Weather comes from the source configured in Settings; no manual temperature entry is needed.',
guideCalendar:'Title, a month grid for the selected date, and your events. This is not an already-connected external calendar.',
guideQuote:'Title, a quote and its author. Replace the default example with your own text.',
guidePoetry:'Title, poem title, author, verses and date. Choose daily automatic selection or a poem above. Enter verses to use custom content.',
guideAlert:'An alert title and message you enter. This does not automatically monitor NAS faults; automated alerts require an external caller.',
helpTitle:'The heading at the top of the image, such as Our weekend. This is not a filename.',
helpMessage:'Your message, such as Our first trip to the seaside. Line breaks are supported.',
helpQuote:'The sentence you want to display.',helpAuthor:'The author or signature, such as Dad.',
helpEvents:'One event per line, such as 09:00 Dentist. These are manual entries, not synchronized calendar events.',
helpDate:'Leave blank for the Shanghai date at render time, or use YYYY-MM-DD, such as 2026-10-08.',
helpWeekday:'Leave blank for the Shanghai weekday at render time; enter text only for a custom label.',
helpWeather:'Leave blank for configured weather. Usually no editing is needed; JSON is an advanced override.',
helpPoemTitle:'Custom poem title. The selected poem supplies this when verses are blank.',
helpPoemAuthor:'Custom poem author. The selected poem supplies this when verses are blank.',
helpPoemLines:'Custom verses, one per line. Leave blank to use the poem selected above.',
templateActionHelp:'Generate preview: create a local image only. Save defaults: reuse this content next time, without updating the frame or existing jobs. Display on frame: upload and activate the previewed image.',
templateAutomationHelp:'For daily updates, create an Automation job with content type Template and select this template. Jobs have their own content settings; automatic dates and weather resolve on each run.',
templatePreviewHint:'Enter content on the left and select Generate preview. Inspect the final image here before selecting Display on frame.',
helpProfile:'Color preserves colors; grayscale creates a grayscale image. This does not change device hardware settings.'