Files
pigway-frame-flow/pigway_frame_flow/web/i18n.js
T

133 lines
40 KiB
JavaScript
Raw Normal View History

window.MESSAGES={
zh:{DISPLAY_NOT_CONFIRMED:'�曄�撌脖�隡𩤃�雿�𤫇獢�𧊋蝖株恕�曄內嚗𥕦�蝏凋遙�∪歇�W�',OFFICIAL_AUTH_REQUIRED:'摰䀹䲮韐血噡�餃�撌脣仃���霂琿��啗���',INVALID_REQUEST:'霂瑟��䭾�嚗諹窈璉��亥���',UNAUTHORIZED:'API Token �䭾��𡝗𧊋憛怠�',FORBIDDEN:'瘝⊥��扯�甇斗�雿𦦵����',DEVICE_NOT_FOUND:'�曆��啁𤌍��挽憭�',DEVICE_OFFLINE:'�餅�蝳餌瑪',UNSUPPORTED_CAPABILITY:'霈曉��硋�摰寧掩�衤��舀�甇文���',WRITE_RESULT_UNKNOWN:'�坔�蝏𤘪��芰䰻嚗諹窈��瓲撖寡挽憭�𠶖��',RATE_LIMITED:'霂瑟�餈��憸𤑳�嚗諹窈蝔滚��滩�',WRITE_DISABLED:'霈曉��坔�撌脣���',CONFIG_REQUIRED:'霂瑕��滨蔭霈曉�',CLOUD_UNAVAILABLE:'霈曉�鈭𤑳垢��𧒄銝滚虾��',NOT_FOUND:'�曆��啗窈瘙����捆',CONFLICT:'�滨蔭�脩��硋�摰嫣�鋡急�憭滢遙�∪��剁�霂瑕�璉��亦𠶖��',INTERNAL_ERROR:'�滚𦛚����躰秤',lastScheduled:'銝𦠜活靚�漲',displayByName:'�㗇�隞嗅��曄內',QUEUED:'�㘾�銝�',RENDERING:'���銝�',UPLOADING:'�煾��葉',SYNCING:'蝑匧��峕郊',COMPLETED:'撌脣���',FAILED:'憭梯揖',UNKNOWN:'蝏𤘪��芰䰻',modelVerified:'API 撌脤�霂�',modelConfigured:'霈曉��滨蔭��',dashboard:'�餉�',gallery:'�曉�',upload:'銝𠹺��曄�',templates:'璅⊥踎',automation:'�芸𢆡��',playlists:'�剜𦆮�𡑒”',history:'��蟮霈啣�',settings:'霈曄蔭',refresh:'�瑟鰵',restore:'�W�銝𠹺�撘�',online:'�函瑪',offline:'蝳餌瑪',battery:'�菟�',firmware:'�箔辣',current:'敶枏��曄�',heartbeat:'��餈穃�頝�',device:'霈曉�靽⊥�',rotation:'�贝蓮閫鍦漲',timezone:'�嗅躹',sync:'�峕郊�嗆��',synced:'撌脣�甇�',syncing:'蝑匧��峕郊',cloud:'KoKonna 鈭𤑳垢�曉�',cloudGallery:'鈭𤑳垢�曉�',galleryListLoading:'甇�銁霂餃��曄��𡑒”��',local:'�砍𧑐�曉�',preview:'憸��',display:'�曄內�啁𤫇獢�',delete:'�𣳇膄',original:'�亦��曄�',name:'�滨妍',created:'�𥕦遣�園𡢿',save:'靽嘥�',cancel:'�𡝗�',confirm:'蝖株恕',loading:'甇�銁�㰘蝸��',imageLoadError:'�曄��㰘蝸憭梯揖嚗諹窈�瑟鰵�滩�',mode:'����孵�',profile:'皜脫�璅∪�',contain:'摰峕㟲�曄內 繚 �嗵蒾',cover:'�箸說撅誩� 繚 銝剖�鋆��',smart:'�箄�鋆�� 繚 璉��仿�閫�',color:'敶抵𠧧',grayscale:'�啣漲',staging:'隞��摮睃��砍𧑐�曉�',uploadHint:'JPG��NG��ebP 繚 ��憭� 20 MiB 繚 1200 � 1600',uploadNotice:'KoKonna 鈭𤑳垢銝𠹺�隡𡁶��喳��Y𤫇獢����靽嘥��曉��嗡蝙�冽𧋦�唳�摮矋�銝滢��孵�霈曉���',selectFile:'�㗇𥋘�曄�',previewHint:'���㗇𥋘�曄�撟園�閫���滚�摰帋�摮䀹��曄內��mart 雿輻鍂��㦛�臬�撘𧶏�銝滢�霂���思犖�詻��',mock:'瞍𠉛內璅∪�',readOnly:'�芾粉',writable:'��捂�坔�',cloudRotation:'霈曉�頧格偘',queue:'憿箏�',random:'�𤩺㦤',minutes:'���',rotationNotice:'�航粉�𤥁挽憭�蔭�剜芋撘譍��湧�嚗𥕦��寞𦻖����𣂷��瑚�頧格偘�𣂼�嚗䔶�銝齿𣈲��耨�寡��踺���蝡臬㦛摨㮖��臬歇蝖株恕��蔭�剝��𨰜��',playlistNotice:'隞乩��� Frame Flow 蝞∠���偘�曉�銵剁�銝� KoKonna ��蔭頧格偘�祉���葩�嗅�霅行��湔��頣�蝏𤘪��𡒊誧蝏准��遣霈桀銁��� App 銝剖��剖�蝵株䌊�刻蔭�凋誑�踹�蝡硺���',newPlaylist:'�啣遣�剜𦆮�𡑒”',newJob:'�啣遣隞餃𦛚',interval:'��揢�湧�嚗�����',imageIds:'�曄� ID嚗��堒噡���嚗�',enabled:'�舐鍂',disabled:'���',edit:'蝻𤥁�',remove:'蝘駁膄',schedule:'�園𡢿摰㗇�',source:'��捆�交�',duration:'�曄內�園鵭嚗��嚗�',restoreAfter:'�唳��W�銋见��曄�',priority:'隡睃�蝥改�0��100嚗�',cron:'Cron',daily:'瘥誩予',weekdays:'撌乩���',weekends:'�冽錰',date:'����交�',temporary:'銝湔𧒄隞餃𦛚',time:'�園𡢿嚗��瘚瑟𧒄�綽�',at:'�扯��交�',lastRun:'銝𦠜活餈鞱�',nextRun:'銝𧢲活餈鞱�',result:'蝏𤘪�',templateData:'璅⊥踎�唳旿嚗㇇SON嚗�',render:'���憸��',templateHint:'璅⊥踎銝擧㺭�柴��挽憭�店�典�蝳颯���閫���笔��齿綫����予瘞𥪯蛹�𡒊&��扇�� Mock��',template:'璅⊥踎',operation:'�滢�',action:'�其�',requestId:'霂瑟� ID',client:'靚�鍂��',noImages:'�曉�銝箇征',emptyHint:'銝𠹺��曄��𣇉��鞉芋�選�撘�憪见�蝵桐���𤫇獢���',noTasks:'餈䀹瓷�劐遙��',noHistory:'�����蟮霈啣�',connect:'餈墧𦻖 Frame Flow',token:'Frame Flow API Token',rememberLogin:'�冽迨瘚讛��刻扇雿讐蒈敶� 30 �
en:{DISPLAY_NOT_CONFIRMED:'Image uploaded but display was not confirmed; future jobs unblocked',OFFICIAL_AUTH_REQUIRED:'Official account authorization expired; reconnect',INVALID_REQUEST:'Invalid request; check your input',UNAUTHORIZED:'Missing or invalid API Token',FORBIDDEN:'This token does not allow this action',DEVICE_NOT_FOUND:'Device not found',DEVICE_OFFLINE:'Target frame is offline',UNSUPPORTED_CAPABILITY:'Unsupported device capability or content type',WRITE_RESULT_UNKNOWN:'Write outcome unknown; reconcile device state',RATE_LIMITED:'Request budget exceeded; try later',WRITE_DISABLED:'Real device writes are disabled',CONFIG_REQUIRED:'Device configuration required',CLOUD_UNAVAILABLE:'Device cloud is unavailable',NOT_FOUND:'Requested content not found',CONFLICT:'Conflicting configuration or restore reference; check current state',INTERNAL_ERROR:'Internal service error',lastScheduled:'Last scheduled',displayByName:'Display by filename',QUEUED:'Queued',RENDERING:'Rendering',UPLOADING:'Sending',SYNCING:'Awaiting sync',COMPLETED:'Completed',FAILED:'Failed',UNKNOWN:'Unknown outcome',modelVerified:'API verified',modelConfigured:'Configured model',dashboard:'Dashboard',gallery:'Gallery',upload:'Upload',templates:'Templates',automation:'Automation',playlists:'Playlists',history:'History',settings:'Settings',refresh:'Refresh',restore:'Restore previous',online:'Online',offline:'Offline',battery:'Battery',firmware:'Firmware',current:'Current image',heartbeat:'Last heartbeat',device:'Device details',rotation:'Rotation',timezone:'Timezone',sync:'Sync state',synced:'Synced',syncing:'Awaiting sync',cloud:'KoKonna cloud gallery',cloudGallery:'cloud gallery',galleryListLoading:'Reading image list��',local:'Local gallery',preview:'Preview',display:'Display on frame',delete:'Delete',original:'View image',name:'Name',created:'Created',save:'Save',cancel:'Cancel',confirm:'Confirm',loading:'Loading��',imageLoadError:'Image failed to load. Refresh to try again.',mode:'Image fit',profile:'Renderer profile',contain:'Contain 繚 white margins',cover:'Cover 繚 center crop',smart:'Smart crop 繚 inspect preview',color:'Color',grayscale:'Grayscale',staging:'Save to local gallery only',uploadHint:'JPG, PNG, WebP 繚 up to 20 MiB 繚 1200 � 1600',uploadNotice:'KoKonna cloud uploads immediately activate the image. Gallery-only uploads are staged locally without changing the device.',selectFile:'Choose an image',previewHint:'Preview your image before saving or displaying it. Smart crop uses saliency heuristics and does not guarantee face detection.',mock:'Demo mode',readOnly:'Live device 繚 read only',writable:'Live device 繚 writes authorized',cloudRotation:'Device slideshow',queue:'Sequential',random:'Random',minutes:'minutes',rotationNotice:'Device slideshow mode and interval are readable. The official API does not expose slideshow membership or rule editing. Cloud gallery is not a verified playback queue.',playlistNotice:'These playlists are managed by Frame Flow independently of KoKonna�䏭 slideshow. Playback pauses during temporary overrides. Disable native slideshow in the vendor app to avoid competing switches.',newPlaylist:'New playlist',newJob:'New job',interval:'Interval (minutes)',imageIds:'Image IDs (comma-separated)',enabled:'Enabled',disabled:'Paused',edit:'Edit',remove:'Remove',schedule:'Schedule',source:'Content source',duration:'Display duration (seconds)',restoreAfter:'Restore previous when expired',priority:'Priority (0��100)',cron:'Cron',daily:'Daily',weekdays:'Weekdays',weekends:'Weekends',date:'Specific date',temporary:'One-time task',time:'Time (Shanghai)',at:'Run at',lastRun:'Last run',nextRun:'Next run',result:'Result',templateData:'Template data (JSON)',render:'Generate preview',templateHint:'Templates are independent of providers and device drivers. Preview before displaying. Weather uses explicitly labeled mock data.',template:'Template',operation:'Operation',action:'Action',requestId:'Request ID',client:'Client',noImages:'Your gallery is empty',emptyHint:'Upload an image or render a template to make this frame yours
};
Object.assign(window.MESSAGES.zh,{username:'韐血噡',password:'撖��',connect:'�餃� Frame Flow',UNAUTHORIZED:'韐血噡�硋����霂荔��𣇉蒈敶訫歇餈��',tokenHint:'雿輻鍂韐血噡�����蒈敶𨰻��㗲�㕑扇雿讐蒈敶訫��臭��� 30 憭抬��曹澈霈曉�霂琿���箇蒈敶𨰻��',logout:'���箇蒈敶�',noToken:'霂瑞蒈敶閧恣��𤫇獢�',formEditor:'銵典�蝻𤥁�',advanced:'擃条漣 JSON',resetTemplate:'�W�暺䁅恕璅⊥踎',resetConfirm:'皜�膄撌脖�摮条�璅⊥踎�滨蔭嚗峕�憭滚�蝵桅�霈文�潘�',eventsHelp:'瘥讛�銝�銝芯�憿�',photo:'摰嗅滬�抒�',noPhoto:'雿輻鍂�抒��牐��箏�',changePassword:'靽格㺿撖��',currentPassword:'敶枏�撖��',newPassword:'�啣�����喳� 8 雿㵪�',passwordChanged:'撖��撌脖耨�對�霂琿��啁蒈敶�',saveTemplate:'靽嘥�璅⊥踎霈曄蔭'});
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.zh,{officialContentTitle:'KoKonna 摰䀹䲮撠讐�隞嗡�霈a�',officialContentDescription:'摰䀹䲮鈭批�韏���堒枂���摰寧掩�页�銝见��蠘�銝� Frame Flow �芸遣璅⊥踎���蝞∠���',officialCalendarWeather:'�亙�銝𤾸��啣予瘞�',officialWordAlmanacTravel:'瘥𤩺𠯫銝�霂溻���蝏罸���������銵峕綫��',officialNews:'瘥𤩺𠯫�圈鉟',officialCreative:'AI 霂剝𨺗 / ��� / 瘨�蒂 / �抒�頧祈䰾�荔��抒�頧格偘',officialSubscriptionUnavailable:'�砍� OpenAPI 撠𡁏𧊋�堒枂霈a��桀�����滩恥������𡁏��𡝗�霈a��亙藁����寡恥��窈蝏抒賒�典��孵�蝔见�銝剔恣���Frame Flow 銝滢�霂餃��碶耨�寡�鈭𥡝挽蝵柴���雿輻鍂����亥�霂滚�鈭𤾸��孵�蝔见���捆嚗���齿�瘜閖�朞��砍� API 蝖株恕摰峕㟲蝐餃��𡑒”��',officialProductDocs:'摰䀹䲮��捆隞讠� ��',officialAPIDocs:'摰䀹䲮 OpenAPI ��'});
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.zh,{photoSources:'�抒��唳旿皞�',sourceHint:'隞𤾸蘨霂� NAS �桀��� WebDAV �匧㦛嚗偦�閫��隡𡁏㺿�条𤫇獢���',addSource:'瘛餃��唳旿皞�',browse:'瘚讛��抒�',randomPreview:'�𤩺㦤�匧㦛憸��',sourceJob:'摰𡁏𧒄�𤩺㦤�抒�',noSources:'����抒�嚗諹窈瘛餃��唳旿皞鞉�璉��亦𤌍敶𨰻��',sourceKind:'�唳旿皞鞟掩��',nasDirectory:'NAS �砍𧑐�桀�',sourceLocation:'�桀� / WebDAV URL',sourceLocationHint:'�砍𧑐憛怠���蝸�抒��寧𤌍敶蓥���㮾撖寡楝敺��憒� . �� family��ebDAV 憛怠� HTTPS �桀� URL嚗�僎��銁霈曄蔭銝剖�霈貉砲�笔���',sourceCredential:'WebDAV �剜旿�臬��㗛���',sourceCredentialHint:'隞�‵�坔��誩�嚗𣬚�甇W‵�坔�����恣����朞��臬��㗛��� Secret �滨蔭 JSON username/password��',sourceRecursive:'��鉄摮鞟𤌍敶𤏪��砍𧑐�桀�嚗�',sourceImages:'�舐鍂�抒�',sourceBrowseHint:'�厰�霂餃��桀�嚗𣬚��餅�隞嗅��滨��鞾�閫��銝滢�銝贝蝸�券��笔㦛��',previousPage:'銝𠹺�憿�',nextPage:'銝衤�憿�',sourcePreviewHint:'餈蹱糓撌脤�劐葉�抒����閫���曄內�嗡蝙�典�銝�撘删�����',randomPhoto:'�𤩺㦤�抒�',sourceJobHint:'瘥𤩺活�扯��齿鰵�𤩺㦤�匧㦛���霈斗��頣��舐鍂�𦒘��㗇𧒄�孵��餅��曄內��'});
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.zh,{organizedPhotos:'隞�𠯫�笔�憭湔�隞嗅允銝剔��抒�',folderCaption:'�抒�銝𧢲䲮�曄內��辣憭寞�摮�',folderCaptionHint:'蝚砌�銵䕘��餅��交���𧑐�孵���蜓憸矋�蝚砌�銵䕘��交�嚗𤤿洵銝㕑�嚗鋣 �𡒊��啁�嚗�瓷�匧𧑐�孵���裦嚗剹����桀�瘝輻鍂銝羓漣�交���辣憭嫘��'});
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.zh,{synologyPreviews:'頞�之�曄�雿輻鍂 Synology Photos ��緵�厰�閫�㦛'});Object.assign(MESSAGES.en,{synologyPreviews:'Use existing Synology Photos previews for oversized images'});
Object.assign(MESSAGES.zh,{peopleFilter:'�� Synology Photos 鈭箇�蝑偦��',peopleHint:'�芸銁敶枏��桀��峕��劐犖�拍�鈭日�銝剝�匧㦛嚗𥕢�隡𡁻���𧼮��曉����閬��鈭怎征�港犖�拍㮾�峕�����',choosePeople:'餈墧𦻖 / �㗇𥋘鈭箇�',personMatch:'鈭箇��寥��孵�',personAny:'��鉄隞餅����劐犖��',personAll:'�峕𧒄��鉄���㗇��劐犖��',photosConfigure:'蝞∠��㗛��滨蔭 SYNOLOGY_PHOTOS_URL �� SYNOLOGY_PHOTOS_CERT_SHA256嚗�僎撠��鈭� photo �桀���蝸銝箇���覔�桀���',photosSessionHint:'隞��摮睃�靽脲擪��蒈敶蓥�霂嘅�銝滢�摮� NAS 撖�����霂嘥仃�����閬���啗��乓��',photosConnect:'餈墧𦻖 Synology Photos',photosDisconnect:'�剖�餈墧𦻖',peopleSearch:'�𦦵揣鈭箇��滨妍�� ID',peopleUnnamed:'�曄內�芸𦶢�滢犖�拙�蝏�',peopleSelected:'撌脤�㗇𥋘嚗�'});
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.zh,{'photo-sources':'�抒��唳旿皞�'});
Object.assign(MESSAGES.en,{'photo-sources':'Photo sources'});
Object.assign(MESSAGES.zh,{photoOrientation:'�抒��孵�',orientationAuto:'�芸𢆡霂�� 繚 �寥��餃��孵�',orientationLandscape:'璅芸��抒�',orientationPortrait:'蝡硋��抒�',orientationLegacy:'銝滨��孵�嚗���㕑挽蝵殷�',orientationHint:'�芸𢆡�㕑挽憭�偕撖詨��贝蓮�孵��㗇𥋘�抒�撟嗥��鞟𤫇撣��90簞/270簞 隡帋漱�W捐擃矋���赤��/蝡硋��峕𧒄�批��匧㦛��枂�暹䲮�𡢅��� EXIF �⊥迤撠箏站蝑偦�㚁�甇�䲮敶V��寥�����劐撓�抒���'});
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:'});
Object.assign(window.MESSAGES.zh,{previousPage:'銝𠹺�憿�',nextPage:'銝衤�憿�'});Object.assign(window.MESSAGES.en,{previousPage:'Previous page',nextPage:'Next page'});
Object.assign(window.MESSAGES.zh,{fitScreen:'���撅誩�',actualSize:'�笔�撠箏站嚗�1:1嚗�'});
Object.assign(window.MESSAGES.en,{fitScreen:'Fit to screen',actualSize:'Actual size (1:1)'});
Object.assign(window.MESSAGES.zh,{
templateHint:'璅⊥踎隡𡁏������予瘞𥪜����厩�������銝�撘惩㦛����𤫇獢�遬蝷箇��航�撘惩㦛���銝齿糓�臬��嗆凒�啁�蝵煾△��',
templateSteps:'�� 蝻𤥁���捆 �� �� ���憸��嚗���冽𧋦�啁��琜��� �� �曄內�啁𤫇獢����摮㗛�霈斗㺭�桀蘨靽嘥�霈曄蔭嚗䔶��孵��餅����閬���嗆凒�唳𧒄嚗諹窈�刻䌊�典�銝剜鰵撱箸芋�蹂遙�~��',
templatePhotoHelp:'甇斗芋�踵𣈲�������㗇𥋘銝𠹺��抒��碶�隡䭾鰵�抒����������銝�韏瑞��琜�銝漤�㗇𥋘�抒��嗡蝙�典�雿滚躹�麄��',
templateContentHelp:'甇斗芋�踵遬蝷箸������縑�臬�摰對�銝滢��芸𢆡�匧��曉��抒���予瘞𥪯��交��冽�甈∠��鞉𧒄�湔鰵嚗峕遬蝷箏�靽脲��蹱����游��齿活���撟嗆遬蝷箝��',
templateWeatherHelp:'憭拇��嗵征�嗉䌊�刻粉�硔�諹挽蝵� �� 憭拇��交��溻����券�閬���刻��𡝗𧒄憛怠� JSON��'
});
Object.assign(window.MESSAGES.en,{
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.'
});
Object.assign(window.MESSAGES.zh,{
templateData:'�駁𢒰��捆',formEditor:'憛怠�閬�枂�啣銁�曄�銝羓���捆',
templateEditHelp:'餈䠷�蝻𤥁���糓����曄�銝羓�����𣬚����銝齿糓霈曉�霈曄蔭嚗䔶�銝滢�靽格㺿�毺�������交���緵�㗇�摮埈糓暺䁅恕��捆嚗�虾隞亦凒�交𤜯�U��',
templateGuideTitle:'餈嗘葵璅⊥踎隡𡁏遬蝷箔�銋��',
guidePhotoText:'����曄內�券▲�剁����厩���遬蝷箏銁銝剝𡢿��之�曉躹嚗峕迤��遬蝷箏銁�抒�銝𧢲䲮���銝𡒊���㺭�格�隞餃𦛚����冽偌�啣�撅�銝滚���',
guideDashboard:'�曄內�����𠯫�麄����麄��予瘞𢛵����乩�憿嫘����亥�����函���躹�麄���憿寧眏雿惩‵�辷�銝滢��芸𢆡霂餃�蝘�犖�亙���',
guideWeather:'�曄內�����𠯫�麄����滚予瘞𥪜�銝匧予憸�𥁒���霈支�霈曄蔭銝剔�憭拇��交��芸𢆡�瑕�嚗䔶���閬��憛急�皜押��',
guideCalendar:'�曄內�����𠯫�笔笆摨娍�隞賜��亙��䔶�憛怠����憿嫘���銝齿糓撌脩�餈墧𦻖����冽𠯫����',
guideQuote:'�曄內�������亥��𣬚蔡�溻��緵�匧蘂摮鞉糓暺䁅恕蝷箔�嚗�虾�X�雿䭾�撅閧內���摮𨰜��',
guidePoetry:'�曄內�������溻��������霂齿迤����交���虾�其��寥�㗇𥋘瘥𤩺𠯫�芸𢆡�㕑�嚗峕��㗇𥋘銝�擐𤥁�嚗𥕦‵�躰�霂齿迤���雿輻鍂�芸�銋匧�摰嫘��',
guideAlert:'�曄內�𡃏郎����峕迤������峕��典‵�蹱��荔�銝滢��芸𢆡璉�瘚� NAS ���嚗𥡝䌊�典�霅阡�憭㚚��滚𦛚靚�鍂��',
helpTitle:'�曄�憿園����嚗䔶�憒��峕�隞祉��冽錰�溻����舀�隞嗅���',
helpMessage:'雿䭾��曄內��秩�擧�摮梹�靘见��𣬚洵銝�甈∩�韏瑕縧瘚瑁器�溻��虾�Z���',
helpQuote:'�曄�銝剛�撅閧內����亥�嚗䔶�憒��峕�撟喳𥣞��𠯫摮鞱��𣂼�甈Y��瑕��溻��',
helpAuthor:'餈坔蘂霂萘�雿𡏭���蝵脣�嚗䔶�憒��𣬚��詻�溻��',
helpEvents:'瘥讛�銝�隞嗡�嚗䔶�憒���09:00 �讠��颯�溻����舀��典�摰對�銝滢��芸𢆡�峕郊�亙���',
helpDate:'�嗵征�芸𢆡雿輻鍂����嗥�銝𦠜絲�交�嚗𥟇�摰𡁏𠯫�蠘窈憛� YYYY-MM-DD嚗䔶�憒� 2026-10-08��',
helpWeekday:'�嗵征雿輻鍂����嗥�銝𦠜絲���嚗𥕦蘨�厰�閬�䌊摰帋�����嗆�憛怠���',
helpWeather:'�嗵征�芸𢆡�瑕�撌脤�蝵桃�憭拇�����祆���蝻𤥁�嚗桕SON 隞��擃条漣�冽�閬���唳旿��',
helpPoemTitle:'�芸�銋㕑�霂滨�霂堒�嚗𥟇𧊋憛怠�甇���塚�隡𡁶眏���㕑�霂滩䌊�冽�靘䜘��',
helpPoemAuthor:'�芸�銋㕑�霂滨�雿𡏭����芸‵�蹱迤��𧒄嚗䔶��望��㕑�霂滩䌊�冽�靘䜘��',
helpPoemLines:'�芸�銋㕑�霂齿迤���瘥讛�銝��乓���蝛箸𧒄�芸𢆡霂餃�銝𦠜䲮���㕑�霂溻��',
poem_title:'霂堒�',poem_author:'霂𦯀犖',poem_lines:'霂𡑒�甇��',
templateActionHelp:'���憸��嚗帋�����砍𧑐�曄����摮㗛�霈斗㺭�殷�銝𧢲活�枏�瘝輻鍂餈嗘���捆嚗䔶�隡𡁏凒�啁𤫇獢��撌脫�隞餃𦛚��遬蝷箏��餅�嚗帋�隡惩歇憸����㦛��僎��揢�曄內��',
templateAutomationHelp:'��閬��憭拇凒�堆��颯�諹䌊�典��齿鰵撱箔遙�∴���捆蝐餃��剹�峕芋�踴�㵪��㗇𥋘�䔶�璅⊥踎��遙�⊥��芸楛���摰寥�蝵殷��芸𢆡�交���予瘞𥪯��冽�甈∟�銵峕𧒄霂餃���',
templatePreviewHint:'憛怠�撌虫儒��捆�𡒊��颯�𣬚��鞾�閫��溻����䔶�撅閧內��蝏�㦛���蝖株恕�𤾸��孵稬�峕遬蝷箏��餅��溻��',
helpProfile:'敶抵𠧧靽萘�憸𡏭𠧧嚗𤤿�摨衣��鞾��賜��曄����隡𡁏㺿�䁅挽憭�′隞嗆芋撘譌��'
});
Object.assign(window.MESSAGES.en,{
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.',
poem_title:'Poem title',poem_author:'Poet',poem_lines:'Verses',
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.'
});
Object.assign(window.MESSAGES.zh,{studio:'�潛�銝擧絲��',connections:'餈墧𦻖銝剖�'});
Object.assign(window.MESSAGES.en,{studio:'Layout Studio',connections:'Connections'});
Object.assign(MESSAGES.zh,{photosConnectionHelp:'NAS �抒��餃�銝擧�隞嗅允霈曄蔭���蝞∠���犖�拍��匧� Photos 憸����閬������乓��',photosConnected:'撌脰���',photosDisconnected:'�芾���',photosReconnect:'�齿鰵�餃�',photosReconnectHelp:'撠𡁏𧊋�餃��碶�霂嘥歇憭望����韏� Synology Photos ��䌊�典�隡𡁜仃韐伐�霂瑕��餃� NAS 韐血噡�����憛怠��滨蔭�㗛���',photosConnectedHelp:'餈墧𦻖撌脖�摮塩��㮾�唾䌊�典�撠�銁銝𧢲活霈∪��園𡢿雿輻鍂�抒�嚗䔶�隡𡁶��喳��Y𤫇獢���',photosSetupHelp:'�滚𦛚撠𡁏𧊋�滨蔭 Photos �啣��諹�銋艾��窈蝞∠��睃��鞾�蝵脰挽蝵桀��滨蒈敶𤏪�餈䠷�銝漤�閬�‵�嗵��睃��譌��',photosLoginHelp:'雿輻鍂�餃�蝢斗� NAS / Synology Photos ��揭�瑕����銝齿糓 Frame Flow 韐血噡嚗䔶�銝齿糓 KoKonna Key��',nasUsername:'NAS �冽���',nasPassword:'NAS 撖��'});
Object.assign(MESSAGES.en,{photosConnectionHelp:'Manage NAS sign-in separately from photo folders. People filtering and Photos previews require a connection.',photosConnected:'Connected',photosDisconnected:'Not connected',photosReconnect:'Sign in again',photosReconnectHelp:'Not signed in or the session expired. Automation using Synology Photos will fail until you sign in. No configuration variable is required here.',photosConnectedHelp:'Connection saved. Automation will use photos at its next scheduled time; the frame is not changed now.',photosSetupHelp:'The Photos address and certificate are not configured. Ask the administrator to finish deployment setup. Drive variables are not needed here.',photosLoginHelp:'Use your Synology NAS / Photos account, not your Frame Flow account or KoKonna key.',nasUsername:'NAS username',nasPassword:'NAS password'});
Object.assign(MESSAGES.zh,{sourceHint:'蝞∠� NAS �抒��桀���ebDAV �𣬚��䀹䔉皞僐���閫�����憸��銝滢��孵��餅���'});
Object.assign(MESSAGES.en,{sourceHint:'Manage NAS folders, WebDAV and cloud drives. Browsing and generating previews do not change the frame.'});
Object.assign(MESSAGES.zh,{choosePeople:'�㗇𥋘鈭箇�'});
Object.assign(MESSAGES.en,{choosePeople:'Choose people'});
Object.assign(MESSAGES.zh,{photosSharedConnection:'�曹澈餈墧𦻖',photosConnectionHelp:'敶枏�隞�𣈲����� NAS���銝� Photos �餃�韐血噡����寞�隞嗅允���靽嘥�霈曄蔭嚗𥟇迨�餃�銝齿糓隞颱�銝�撘䭾㺭�格��∠����撅噼��乓��犖�拍��劐蝙�冽迨�曹澈餈墧𦻖嚗峕芦�𡁶𤌍敶閗粉�硋��砍𧑐蝻拍裦�曆�靘肽�甇方揭�瑯��',photosLoginHelp:'雿輻鍂蝢斗� NAS / Photos 韐血噡嚗䔶��� Frame Flow 韐血噡�� KoKonna Key��凒�Z揭�瑚�敶勗����匧鍳�其犖�拍��厩��唳旿皞琜�銝芯犖蝛粹𡢿��犖�拙虾�賭��䕘��湔揢�舘窈�𣂷葵�齿鰵�詨笆鈭箇��㗇𥋘��',sourceIndependentHelp:'餈䠷��芯�摮睃��齿㺭�格���𤌍敶𨰻��犖�拐�蝑偦�㕑��辷�銝滢�靽格㺿�嗡��唳旿皞琜�銋煺�隡𡁏凒�a▲�典�鈭� NAS 韐血噡��遙�⊿�朞��唳旿皞� ID 撘閧鍂餈嗘�霈曄蔭��',sourceIdLabel:'�唳旿皞� ID',sourceSharedPhotos:'�唾�嚗𡁻▲�� Synology Photos �曹澈餈墧𦻖嚗�犖�拍��㚁�',sourceLocalOnly:'�唾�嚗鐭AS ��蝸�桀�嚗𥡝粉�𡝗�隞嗆���憿園� Photos �餃�',sourceOwnCredentials:'�唾�嚗𡁏迨�唳旿皞鞱䌊撌梁�蝵𤑳�/WebDAV �剜旿嚗𥕢�雿輻鍂憿園� NAS �餃�'});
Object.assign(MESSAGES.en,{photosSharedConnection:'Shared connection',photosConnectionHelp:'Currently one NAS and one Photos account are supported. Each folder stores its own settings; this sign-in is not owned by any source card. People filtering uses this shared session. Ordinary folder reads and local thumbnails do not use this account.',photosLoginHelp:'Use a Synology NAS / Photos account, not a Frame Flow account or KoKonna key. Changing accounts affects all people-filtered sources. Personal-space people may differ; recheck each source after switching accounts.',sourceIndependentHelp:'These folder, people and filter settings apply only to this source. Other sources and the shared NAS account are unchanged. Jobs refer to these settings by source ID.',sourceIdLabel:'Source ID',sourceSharedPhotos:'Connection: shared Synology Photos session above (people filtering)',sourceLocalOnly:'Connection: mounted NAS folder; file reads do not require Photos sign-in',sourceOwnCredentials:'Connection: this source�䏭 drive/WebDAV credentials; independent of NAS sign-in'});
Object.assign(MESSAGES.zh,{photosDisconnect:'�剖��曹澈餈墧𦻖',photosSharedDisconnectWarning:'餈坔��剖����劐犖�拍��㗇㺭�格��梁鍂�� Photos �餃�嚗𣬚㮾�喃遙�∩��䭾�霂餃�鈭箇��抒����隞嗅允霈曄蔭�𣬚��䁅��乩��塩��&摰𡁏鱏撘��梹�'});
Object.assign(MESSAGES.en,{photosDisconnect:'Disconnect shared session',photosSharedDisconnectWarning:'This disconnects the Photos session used by all people-filtered sources. Their tasks will fail to read people photos. Folder settings and drive connections remain unchanged. Disconnect?'});