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

152 lines
46 KiB
JavaScript
Raw Normal View History

window.MESSAGES={
zh:{DISPLAY_NOT_CONFIRMED:'蝗セ迚�キイ荳贋シ��御ス�判譯�悴遑ョ隶、譏セ遉コ�帛錘扈ュ莉サ蜉。蟾イ諱「螟�',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:'諱「螟堺ク贋ク€蠑�',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 ツキ 霎灘�蟆コ蟇ク莉・逕滓�鬚�ァ井クコ蜃�',uploadNotice:'KoKonna 莠醍ォッ荳贋シ�莨夂ォ句叉蛻�困逕サ譯�€ゆサ�ソ晏ュ伜崟蠎捺慮菴ソ逕ィ譛ャ蝨ー證ょュ假シ御ク堺シ壽隼蜿倩ョセ螟�€�',selectFile:'騾画叫蝗セ迚�',previewHint:'蜈磯€画叫蝗セ迚�ケカ鬚�ァ茨シ悟�蜀ウ螳壻ソ晏ュ俶�譏セ遉コ縲Tmart 菴ソ逕ィ譫�崟蜷ッ蜿大シ擾シ御ク堺ソ晁ッ∬ッ�悪莠コ閼ク縲�',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:'蛻ー譛滓△螟堺ケ句燕蝗セ迚�',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:'蝨ィ豁、豬剰ァ
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 ツキ output dimensions are shown in the rendered preview',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 ren
};
Object.assign(window.MESSAGES.zh,{username:'雍ヲ蜿キ',password:'蟇���',connect:'逋サ蠖� Frame Flow',UNAUTHORIZED:'雍ヲ蜿キ謌門ッ���漠隸ッ�梧�逋サ蠖募キイ霑�悄',tokenHint:'菴ソ逕ィ雍ヲ蜿キ蜥悟ッ��∫匳蠖輔€ょ鏡騾芽ョー菴冗匳蠖募錘蜿ッ菫晄戟 30 螟ゥ�帛�莠ォ隶セ螟�ッキ騾€蜃コ逋サ蠖輔€�',logout:'騾€蜃コ逋サ蠖�',noToken:'隸キ逋サ蠖慕ョ。逅�判譯�',formEditor:'陦ィ蜊慕シ冶セ�',advanced:'鬮倡コァ JSON',resetTemplate:'諱「螟埼サ倩ョ、讓。譚ソ',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:'譛ェ謇セ蛻ー蜿ッ逕ィ逧�擂貅占ョー蠖包シ梧裏豕戊ソ伜次讓。譚ソ隶セ鄂ョ縲りョセ螟� 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:'諱「螟堺ク贋ク€蠑�',weatherMock:'螟ゥ豌疲シ皮、コ',weatherReal:'螳樊慮螟ゥ豌�',stale:'謨ー謐ョ霑�悄',apply:'蠎皮畑'});
Object.assign(window.MESSAGES.en,{currentContent:'Currently displayed content',currentTemplate:'Current template',sourceUnknown:'No usable source record was found, so template settings cannot be restored. The device API does not provide original 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 豈乗律隸苓ッ搾シ壼�鄂ョ蜿、蜈ク隸苓ッ搾シ梧潔荳頑オキ譌・譛滓ッ丞、ゥ謐「荳€鬥悶€ら峡遶倶コ主ョ俶婿蟆冗ィ句コ冗噪隶「髦�シ悟ョ俶婿隶「髦�ョセ鄂ョ譌�豕暮€夊ソ��蠑€ 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 螳俶婿蟆冗サ�サカ荳手ョ「髦�',officialContentDescription:'螳俶婿莠ァ蜩∬オ�侭蛻怜�逧��螳ケ邀サ蝙具シ帑ク句�蜉溯�荳� Frame Flow 閾ェ蟒コ讓。譚ソ蛻�シ€邂。逅�€�',officialCalendarWeather:'譌・蜴�ク主ス灘慍螟ゥ豌�',officialWordAlmanacTravel:'豈乗律荳€隸阪€∽シ�扈滄サ�紙縲∝�逅�羅陦梧耳闕�',officialNews:'豈乗律譁ー髣サ',officialCreative:'AI 隸ュ髻ウ / 譁�ュ� / 豸るクヲ / 辣ァ迚�スャ濶コ譛ッ�帷�迚�スョ謦ュ',officialSubscriptionUnavailable:'蜈ャ蠑€ OpenAPI 蟆壽悴蛻怜�隶「髦�岼蠖輔€∝ス灘燕隶「髦�€∝シ€騾壽�蜿匁カ郁ョ「髦�磁蜿」縲ょョ俶婿隶「髦�ッキ扈ァ扈ュ蝨ィ螳俶婿蟆冗ィ句コ丈クュ邂。逅�シ妲rame 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:'騾夊ソ� Synology Photos API 邂。逅��迚�擂貅舌€∽ココ迚ゥ蜥檎ュ幃€芽ァ��縲よオ剰ァ井ク朱「�ァ井ク堺シ壽隼蜿倡判譯�€�',addSource:'豺サ蜉�謨ー謐ョ貅�',browse:'豬剰ァ育�迚�',randomPreview:'髫乗惻騾牙崟鬚�ァ�',sourceJob:'螳壽慮髫乗惻辣ァ迚�',noSources:'證よ裏辣ァ迚�シ瑚ッキ豺サ蜉�謨ー謐ョ貅先�譽€譟・逶ョ蠖輔€�',sourceKind:'謨ー謐ョ貅千アサ蝙�',sourceLocation:'逶ョ蠖� / WebDAV URL',sourceLocationHint:'Synology Photos�壽園騾臥ゥコ髣エ蜀�噪逶ョ蠖戊キッ蠕�シ�. 陦ィ遉コ謨エ荳ェ遨コ髣エ縲よ潔髴€闔キ蜿� XL 鬚�ァ亥崟�御ク堺ク玖スス蜴溷崟縲ょ�莉紋コ醍尨菴ソ逕ィ蟇ケ蠎皮岼蠖募慍蝮€謌� ID縲�',sourceCredential:'WebDAV 蜃ュ謐ョ邇ッ蠅�序驥丞錐',sourceCredentialHint:'莉�。ォ蜀吝序驥丞錐�檎ヲ∵ュ「蝪ォ蜀吝ッ��√€らョ。逅�遭騾夊ソ�識蠅�序驥乗� Secret 驟咲スョ JSON username/password縲�',sourceRecursive:'蛹�性蟄千岼蠖�',sourceImages:'蜿ッ逕ィ辣ァ迚�',sourceBrowseHint:'謖蛾怙隸サ蜿也岼蠖包シ檎せ蜃サ譁�サカ蜷肴燕逕滓�鬚�ァ茨シ帑ク堺シ壻ク玖スス蜈ィ驛ィ蜴溷崟縲�',previousPage:'荳贋ク€鬘オ',nextPage:'荳倶ク€鬘オ',sourcePreviewHint:'霑呎弍蟾イ騾我クュ辣ァ迚�噪鬚�ァ茨シ梧仞遉コ譌カ菴ソ逕ィ蜷御ク€蠑�辣ァ迚�€�',randomPhoto:'髫乗惻辣ァ迚�',sourceJobHint:'豈乗ャ。謇ァ陦碁㍾譁ー髫乗惻騾牙崟縲るサ倩ョ、證ょ●�帛星逕ィ蜷惹シ壽潔譌カ謾ケ蜿倡判譯�仞遉コ縲�'});
Object.assign(MESSAGES.en,{photoSources:'Photo sources',sourceHint:'Manage photo sources, people and filters through the Synology Photos API. Browsing and previewing do 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',sourceLocation:'Folder / WebDAV URL',sourceLocationHint:'Synology Photos: folder path within the selected space; . means the whole space. Downloads XL previews on demand, not originals. Other drives use their folder URL or ID.',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',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:'One footer line shows date, named people, title and place after @. Subfolders inherit their nearest dated folder; unnamed people and original filenames are omitted.'});
Object.assign(MESSAGES.zh,{});Object.assign(MESSAGES.en,{});
Object.assign(MESSAGES.zh,{peopleFilter:'謖� Synology Photos 莠コ迚ゥ遲幃€�',peopleHint:'蜿ェ莉主ス灘燕逶ョ蠖穂クュ騾画叫隨ヲ蜷井ココ迚ゥ譚。莉カ逧��迚�€よ園騾臥ゥコ髣エ逧�ココ迚ゥ逶ク蜀碁怙隕∝ス灘燕 Photos 雍ヲ蜿キ譛画揀隶ソ髣ョ縲�',choosePeople:'霑樊磁 / 騾画叫莠コ迚ゥ',personMatch:'莠コ迚ゥ蛹ケ驟肴婿蠑�',personAny:'蛹�性莉サ諢乗園騾我ココ迚ゥ',personAll:'蜷梧慮蛹�性謇€譛画園騾我ココ迚ゥ',photosConfigure:'邂。逅�遭髴€驟咲スョ SYNOLOGY_PHOTOS_URL 蜥� SYNOLOGY_PHOTOS_CERT_SHA256縲ら�迚�柱莠コ迚ゥ蝮�€夊ソ� API 隸サ蜿悶€�',photosSessionHint:'莉�ソ晏ュ伜女菫晄侃逧�匳蠖穂シ夊ッ晢シ御ク堺ソ晏ュ� NAS 蟇��√€ゆシ夊ッ晏、ア謨亥錘髴€隕�㍾譁ー霑樊磁縲�',photosConnect:'霑樊磁 Synology Photos',photosDisconnect:'譁ュ蠑€霑樊磁',peopleSearch:'謳懃エ「莠コ迚ゥ蜷咲ァー謌� ID',peopleUnnamed:'譏セ遉コ譛ェ蜻ス蜷堺ココ迚ゥ蛻�サ�',peopleSelected:'蟾イ騾画叫��'});
Object.assign(MESSAGES.en,{peopleFilter:'Filter by Synology Photos people',peopleHint:'Choose matching people photos only within this folder. The Photos account needs access to People albums in the selected space.',choosePeople:'Connect / choose people',personMatch:'Person matching',personAny:'Any selected person',personAll:'All selected people together',photosConfigure:'Configure SYNOLOGY_PHOTOS_URL and SYNOLOGY_PHOTOS_CERT_SHA256. Photos and people are read through the API.',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ツー 莨壻コ、謐「螳ス鬮假シ峨€よィェ蜷�/遶門髄蜷梧慮謗ァ蛻カ騾牙崟蜥悟�蝗セ譁ケ蜷托シ帶潔 EXIF 譬。豁」蟆コ蟇ク遲幃€会シ梧ュ」譁ケ蠖「荳榊源驟阪€ゆク肴級莨ク辣ァ迚�€�'});
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:'蜈ィ騾� / 蜿匁カ亥�騾�',invertSelection:'蜿埼€�',deleteSelected:'蛻�髯、謇€騾�',selectImagesFirst:'隸キ蜈磯€画叫蝗セ迚�',deleteSelectedConfirm:'蛻�髯、謇€騾画悽蝨ー蝗セ迚�シ滉ク堺シ壼唖髯、 NAS 蜴溷ァ狗�迚�€�',batchFailed:'譛ェ謌仙粥謫堺ス懃噪蝗セ迚�焚��'});
Object.assign(window.MESSAGES.en,{cloudKeepLatest:'Each random-photo or automatic-collage job keeps its latest confirmed cloud image. Starred images are also retained. Unconfirmed replacements do not evict the previous 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',invertSelection:'Invert selection',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:'霑咎㈹郛冶セ醍噪譏ッ逕滓�蝗セ迚�ク顔噪譁�ュ怜柱辣ァ迚�シ御ク肴弍隶セ螟�ョセ鄂ョ�御ケ滉ク堺シ壻ソョ謾ケ蜴溽�迚�€りセ灘�譯��邇ー譛画枚蟄玲弍鮟倩ョ、蜀�ョケ�悟庄莉・逶エ謗・譖ソ謐「縲�',
templateGuideTitle:'霑吩クェ讓。譚ソ莨壽仞遉コ莉€荵茨シ�',
guidePhotoText:'譬�「俶仞遉コ蝨ィ鬘カ驛ィ�梧園騾臥�迚�仞遉コ蝨ィ荳ュ髣エ逧�、ァ蝗セ蛹コ�梧ュ」譁�仞遉コ蝨ィ辣ァ迚�ク区婿縲ょョ�ク守�迚�焚謐ョ貅蝉ササ蜉。逧�コ暮Κ豌エ蜊ー蟶�ア€荳榊酔縲�',
guideDashboard:'譏セ遉コ譬�「倥€∵律譛溘€∵弌譛溘€∝、ゥ豌斐€∽サ頑律莠矩。ケ縲∽ク€蜿・隸晏柱蠎暮Κ辣ァ迚�玄蝓溘€ゆコ矩。ケ逕ア菴�蝪ォ蜀呻シ帑ク堺シ夊�蜉ィ隸サ蜿也ァ∽ココ譌・蜴�€�',
guideWeather:'譏セ遉コ譬�「倥€∵律譛溘€∝ス灘燕螟ゥ豌泌柱荳牙、ゥ鬚�冠縲るサ倩ョ、莉手ョセ鄂ョ荳ュ逧�、ゥ豌疲擂貅占�蜉ィ闔キ蜿厄シ御ク埼怙隕∵焔蝪ォ豌疲クゥ縲�',
guideCalendar:'譏セ遉コ譬�「倥€∵律譛溷ッケ蠎疲怦莉ス逧�律蜴�柱菴�蝪ォ蜀咏噪莠矩。ケ縲ょョ�ク肴弍蟾イ扈剰ソ樊磁逧�、夜Κ譌・蜴�€�',
guideQuote:'譏セ遉コ譬�「倥€∽ク€蜿・隸晏柱鄂イ蜷阪€ら鴫譛牙唱蟄先弍鮟倩ョ、遉コ萓具シ悟庄謐「謌蝉ス�諠ウ螻慕、コ逧�枚蟄励€�',
guidePoetry:'譏セ遉コ譬�「倥€∬ッ怜錐縲∽ス懆€�€∬ッ苓ッ肴ュ」譁�柱譌・譛溘€ょ庄蝨ィ荳頑婿騾画叫豈乗律閾ェ蜉ィ騾芽ッ暦シ梧�騾画叫荳€鬥冶ッ暦シ帛。ォ蜀呵ッ苓ッ肴ュ」譁�錘菴ソ逕ィ閾ェ螳壻ケ牙�螳ケ縲�',
guideAlert:'譏セ遉コ蜻願ュヲ譬�「伜柱豁」譁�€りソ咎㈹謇句勘蝪ォ蜀呎カ域��御ク堺シ夊�蜉ィ譽€豬� NAS 謨�囿�幄�蜉ィ蜻願ュヲ髴€螟夜Κ譛榊苅隹�畑縲�',
helpTitle:'蝗セ迚�。カ驛ィ譬�「假シ御セ句ヲゅ€梧�莉ャ逧�捉譛ォ縲阪€ゆク肴弍譁�サカ蜷阪€�',
helpMessage:'菴�諠ウ譏セ遉コ逧�ッエ譏取枚蟄暦シ御セ句ヲゅ€檎ャャ荳€谺。荳€襍キ蜴サ豬キ霎ケ縲阪€ょ庄謐「陦後€�',
helpQuote:'蝗セ迚�クュ隕∝ア慕、コ逧�ク€蜿・隸晢シ御セ句ヲゅ€梧滑蟷ウ蜃。逧�律蟄占ソ��蝟懈ャ「逧��キ蟄舌€阪€�',
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:'豁、雍ヲ蜿キ騾夊ソ� Synology Photos API 謗域揀隸サ蜿也�迚�柱莠コ迚ゥ縲りソ樊磁謌仙粥蜷趣シ瑚ッキ豺サ蜉�辣ァ迚�擂貅仙ケカ隶セ鄂ョ遨コ髣エ蜥御ココ迚ゥ�帶峩謐「雍ヲ蜿キ莨壼スア蜩肴園譛� Photos 譚・貅舌€�',photosConnected:'蟾イ霑樊磁',photosDisconnected:'譛ェ霑樊磁',photosReconnect:'驥肴眠逋サ蠖�',photosReconnectHelp:'蟆壽悴逋サ蠖墓�莨夊ッ晏キイ螟ア謨医€ゆセ晁オ� Synology Photos 逧��蜉ィ蛹紋シ壼、ア雍・�瑚ッキ蜈育匳蠖� NAS 雍ヲ蜿キ縲よ裏髴€蝪ォ蜀咎�鄂ョ蜿倬㍼縲�',photosConnectedHelp:'霑樊磁蟾イ菫晏ュ倥€ら嶌蜈ウ閾ェ蜉ィ蛹門ー�惠荳区ャ。隶。蛻呈慮髣エ菴ソ逕ィ辣ァ迚�シ御ク堺シ夂ォ句叉蛻�困逕サ譯�€�',photosSetupHelp:'譛榊苅蟆壽悴驟咲スョ Photos 蝨ー蝮€蜥瑚ッ∽ケヲ縲りッキ邂。逅�遭螳梧�驛ィ鄂イ隶セ鄂ョ蜷主�逋サ蠖包シ幄ソ咎㈹荳埼怙隕∝。ォ蜀咏ス醍尨蜿倬㍼縲�',photosLoginHelp:'菴ソ逕ィ逋サ蠖慕セ、譎� NAS / Synology Photos 逧�エヲ蜿キ蟇���シ御ク肴弍 Frame Flow 雍ヲ蜿キ�御ケ滉ク肴弍 KoKonna Key縲�',nasUsername:'NAS 逕ィ謌キ蜷�',nasPassword:'NAS 蟇���'});
Object.assign(MESSAGES.en,{photosConnectionHelp:'This account authorizes photo and people access through the Synology Photos API. After connecting, add a photo source and choose its space and people. Changing accounts affects all Photos sources.',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:'騾夊ソ� Synology Photos API 邂。逅��迚�擂貅舌€∽ココ迚ゥ蜥檎ュ幃€芽ァ��縲よオ剰ァ井ク朱「�ァ井ク堺シ壽隼蜿倡判譯�€�'});
Object.assign(MESSAGES.en,{sourceHint:'Manage photo sources, people and filters through the Synology Photos API. Browsing and previewing do not change the frame.'});
Object.assign(MESSAGES.zh,{choosePeople:'騾画叫莠コ迚ゥ'});
Object.assign(MESSAGES.en,{choosePeople:'Choose people'});
Object.assign(MESSAGES.zh,{photosSharedConnection:'蜈ア莠ォ霑樊磁',photosConnectionHelp:'豁、雍ヲ蜿キ騾夊ソ� Synology Photos API 謗域揀隸サ蜿也�迚�柱莠コ迚ゥ縲りソ樊磁謌仙粥蜷趣シ瑚ッキ豺サ蜉�辣ァ迚�擂貅仙ケカ隶セ鄂ョ遨コ髣エ蜥御ココ迚ゥ�帶峩謐「雍ヲ蜿キ莨壼スア蜩肴園譛� Photos 譚・貅舌€�',photosLoginHelp:'菴ソ逕ィ鄒、譎� NAS / Photos 雍ヲ蜿キ�御ク肴弍 Frame Flow 雍ヲ蜿キ謌� KoKonna Key縲よ峩謐「雍ヲ蜿キ莨壼スア蜩肴園譛牙星逕ィ莠コ迚ゥ遲幃€臥噪謨ー謐ョ貅撰シ帑クェ莠コ遨コ髣エ逧�ココ迚ゥ蜿ッ閭ス荳榊酔�梧峩謐「蜷手ッキ騾蝉クェ驥肴眠譬ク蟇ケ莠コ迚ゥ騾画叫縲�',sourceIndependentHelp:'霑咎㈹蜿ェ菫晏ュ伜ス灘燕謨ー謐ョ貅千噪逶ョ蠖輔€∽ココ迚ゥ荳守ュ幃€芽ァ���御ク堺シ壻ソョ謾ケ蜈カ莉匁焚謐ョ貅撰シ御ケ滉ク堺シ壽峩謐「鬘カ驛ィ蜈ア莠ォ NAS 雍ヲ蜿キ縲ゆササ蜉。騾夊ソ�焚謐ョ貅� ID 蠑慕畑霑吩コ幄ョセ鄂ョ縲�',sourceIdLabel:'謨ー謐ョ貅� ID',sourceSharedPhotos:'蜈ウ閨費シ售ynology Photos API 蜈ア莠ォ雍ヲ蜿キ',sourceOwnCredentials:'蜈ウ閨費シ壽ュ、謨ー謐ョ貅占�蟾ア逧�ス醍尨/WebDAV 蜃ュ謐ョ�帑ク堺スソ逕ィ鬘カ驛ィ NAS 逋サ蠖�'});
Object.assign(MESSAGES.en,{photosSharedConnection:'Shared connection',photosConnectionHelp:'This account authorizes photo and people access through the Synology Photos API. After connecting, add a photo source and choose its space and people. Changing accounts affects all Photos sources.',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 API account',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?'});
Object.assign(MESSAGES.zh,{weather:'螟ゥ豌�',connected:'蟾イ霑樊磁',disconnected:'譛ェ霑樊磁',sortOrder:'謗貞コ乗婿蠑�',playbackMode:'謦ュ謾セ鬘コ蠎�',apiKeyConfigured:'API 蟇�徴蟾イ驟咲スョ',templateSourceUnavailable:'霑吝シ�蝗セ迚�イ。譛牙庄郛冶セ醍噪讓。譚ソ譚・貅舌€ょ庄郛冶セ第ィ。譚ソ莉�€ら畑莠惹ソ晉蕗莠�ィ。譚ソ驟咲スョ逧�函謌仙崟迚�€�',localDeleteConfirm:'遑ョ隶、蛻�髯、譛ャ蝨ー蝗セ蠎謎クュ逧�ソ吝シ�蝗セ迚�シ滉ク堺シ壼唖髯、 NAS 蜴溷ァ狗�迚��莠醍ォッ蜑ッ譛ャ�御ケ滉ク堺シ壼�謐「逕サ譯�€よュ、謫堺ス應ク榊庄謦、髞€縲�',cloudDeleteConfirm:'遑ョ隶、蛻�髯、霑吝シ�蝗セ迚�噪莠醍ォッ蜑ッ譛ャ�滉ク堺シ壼唖髯、 NAS 蜴溷ァ狗�迚��譛ャ蝨ー蝗セ蠎灘憶譛ャ縲よュ、謫堺ス應ク榊庄謦、髞€縲�',gallerySelectionHelp:'蜈ィ騾牙柱蜿埼€牙宵菴懃畑莠主ス灘燕鬘オ蜿ッ隗∝崟迚�シ帶音驥乗桃菴懷、�炊蠖灘燕鬘オ蜈ィ驛ィ蟾イ蜍セ騾牙崟迚�シ悟桁諡ャ謳懃エ「蜷朱嚼阯冗噪蜍セ騾蛾。ケ縲�',starHelp:'譏滓��ソ晏ュ伜惠譛榊苅遶ッ�檎畑莠朱亟豁「閾ェ蜉ィ貂�炊譛ャ蝨ー蝗セ蜿雁�譛€霑台ク€谺。謌仙粥荳贋シ�逧�コ醍ォッ蜑ッ譛ャ縲よ弌譬�悽霄ォ荳堺シ壻ク贋シ�謌門�謐「逕サ譯�シ帶焔蜉ィ蛻�髯、莉肴怏謨医€�',sourceLocationHint:'Synology Photos�壽園騾臥ゥコ髣エ蜀�噪逶ョ蠖戊キッ蠕�シ�. 陦ィ遉コ謨エ荳ェ遨コ髣エ縲よ潔髴€闔キ蜿� XL 鬚�ァ亥崟�御ク堺ク玖スス蜴溷崟縲ょ�莉紋コ醍尨菴ソ逕ィ蟇ケ蠎皮岼蠖募慍蝮€謌� ID縲�',sourceCredential:'WebDAV / 鄂醍尨蜃ュ謐ョ邇ッ蠅�序驥丞錐',sourceCredentialHint:'蝪ォ蜀吝序驥丞錐�御ク崎ヲ∝。ォ蜀吝ッ��√€らョ。逅�遭蜿ッ騾夊ソ�識蠅�序驥城�鄂ョ蜃ュ謐ョ�帛次逕溽ス醍尨荵溷庄菴ソ逕ィ荳区婿 OAuth 蜃ュ謐ョ縲�'});
Object.assign(MESSAGES.en,{weather:'Weather',connected:'Connected',disconnected:'Not connected',sortOrder:'Sort order',playbackMode:'Playback order',apiKeyConfigured:'API key configured',templateSourceUnavailable:'No editable template source is available for this image. Template editing requires a generated image with saved template settings.',localDeleteConfirm:'Delete this local gallery image? NAS originals and cloud copies remain intact, and the frame display is unchanged. This cannot be undone.',cloudDeleteConfirm:'Delete this cloud image? NAS originals and local gallery copies remain intact. This cannot be undone.',gallerySelectionHelp:'Select all and invert affect visible images on this page. Batch actions include every checked image on this page, including items hidden by search.',starHelp:'Stars are saved on the server and protect the local image and its latest successfully uploaded cloud copy from automatic cleanup. Starring does not upload or change the frame; manual deletion still applies.',sourceLocationHint:'Synology Photos: folder path within the selected space; . means the whole space. Downloads XL previews on demand, not originals. Other drives use their folder URL or ID.',sourceCredential:'WebDAV / drive credential environment variable',sourceCredentialHint:'Enter a variable name, never a password. An administrator can configure credentials through environment variables; native drives can also use the OAuth credentials below.'});
Object.assign(MESSAGES.zh,{currentImageId:'蠖灘燕蝗セ迚� ID',modelSource:'蝙句捷菫。諱ッ譚・貅�',modelVerified:'隶セ螟� API 霑泌屓',modelConfigured:'隶セ螟��鄂ョ譁�サカ',switchInterval:'蛻�困髣エ髫�',sync:'莠醍ォッ蜷梧ュ・迥カ諤�',synced:'莠醍ォッ蟾イ遑ョ隶、',syncing:'遲牙セ�コ醍ォッ遑ョ隶、'});
Object.assign(MESSAGES.en,{currentImageId:'Current image ID',modelSource:'Model information source',modelVerified:'Device API',modelConfigured:'Device configuration',switchInterval:'Switch interval',sync:'Cloud sync status',synced:'Cloud confirmed',syncing:'Awaiting cloud confirmation'});
Object.assign(MESSAGES.zh,{noSources:'蟆壽悴驟咲スョ辣ァ迚�焚謐ョ貅撰シ瑚ッキ蜈域キサ蜉�縲�',noSourcePhotos:'蠖灘燕逶ョ蠖墓�遲幃€画擅莉カ荳区イ。譛牙庄逕ィ辣ァ迚�€�',sourceLocation:'逶ョ蠖戊キッ蠕� / 蝨ー蝮€ / ID',temporaryOptionsHint:'蜍セ騾牙芦譛滓△螟肴慮�梧仞遉コ譌カ髟ソ蜥御シ伜�郤ァ逕ィ莠惹クエ譌カ譏セ遉コ�帶悴蜍セ騾画慮謖∫サュ譏セ遉コ�檎峩蛻ー蜈カ莉匁桃菴懷�謐「蝗セ迚�€�'});
Object.assign(MESSAGES.en,{noSources:'No photo sources configured. Add a source first.',noSourcePhotos:'No photos match this folder and its filters.',sourceLocation:'Folder path / URL / ID',temporaryOptionsHint:'With restore enabled, duration and priority apply to the temporary display. Otherwise, the image stays until another action changes it.'});
Object.assign(MESSAGES.zh,{synologyAPISource:'Synology Photos API',sourcePhotosAPI:'騾夊ソ��莠ォ Photos 雍ヲ蜿キ隸サ蜿� XL 鬚�ァ亥崟荳惹ココ迚ゥ�碁�蠕ェ雍ヲ蜿キ隶ソ髣ョ譚�剞縲�',sourceLocationHint:'Synology Photos�壽園騾臥ゥコ髣エ蜀�噪逶ョ蠖戊キッ蠕�シ�. 陦ィ遉コ謨エ荳ェ遨コ髣エ縲よ潔髴€闔キ蜿� XL 鬚�ァ亥崟�御ク堺ク玖スス蜴溷崟縲ょ�莉紋コ醍尨菴ソ逕ィ蟇ケ蠎皮岼蠖募慍蝮€謌� ID縲�',photosConnectionHelp:'豁、雍ヲ蜿キ騾夊ソ� Synology Photos API 謗域揀隸サ蜿也�迚�柱莠コ迚ゥ縲りソ樊磁謌仙粥蜷趣シ瑚ッキ豺サ蜉�辣ァ迚�擂貅仙ケカ隶セ鄂ョ遨コ髣エ蜥御ココ迚ゥ�帶峩謐「雍ヲ蜿キ莨壼スア蜩肴園譛� Photos 譚・貅舌€�',sourceRecursive:'蛹�性蟄千岼蠖�'});
Object.assign(MESSAGES.en,{synologyAPISource:'Synology Photos API',sourcePhotosAPI:'Reads XL previews and people through the shared Photos account, respecting its access permissions.',sourceLocationHint:'Synology Photos: folder path within the selected space; . means the whole space. Downloads XL previews on demand, not originals. Other drives use their folder URL or ID.',photosConnectionHelp:'This account authorizes photo and people access through the Synology Photos API. After connecting, add a photo source and choose its space and people. Changing accounts affects all Photos sources.',sourceRecursive:'Include subfolders'});
Object.assign(MESSAGES.zh,{photosReconnectHelp:'蟆壽悴霑樊磁謌紋シ夊ッ晏キイ螟ア謨医€1hotos API 譚・貅仙所萓晁オ紋ココ迚ゥ遲幃€臥噪莉サ蜉。髴€隕�㍾譁ー逋サ蠖募錘謇崎�隸サ蜿也�迚�€�',photosSharedDisconnectWarning:'霑吝ー�妙蠑€謇€譛� Photos API 譚・貅仙柱莠コ迚ゥ遲幃€牙�逕ィ逧�匳蠖包シ檎嶌蜈ウ莉サ蜉。蟆�裏豕戊ッサ蜿也�迚�€ら岼蠖暮�鄂ョ蜥檎峡遶狗ス醍尨霑樊磁荳堺シ壼唖髯、縲ら。ョ螳壽妙蠑€蜷暦シ�',photosConfigure:'邂。逅�遭髴€驟咲スョ SYNOLOGY_PHOTOS_URL 蜥� SYNOLOGY_PHOTOS_CERT_SHA256縲ら�迚�柱莠コ迚ゥ蝮�€夊ソ� API 隸サ蜿悶€�'});
Object.assign(MESSAGES.en,{photosReconnectHelp:'Not connected or session expired. Photos API sources and people-filtered tasks need a new sign-in before reading photos.',photosSharedDisconnectWarning:'Disconnect the shared session used by all Photos API sources and people filters? Their tasks cannot read photos until reconnected. Folder settings and separate drive connections are retained.',photosConfigure:'Configure SYNOLOGY_PHOTOS_URL and SYNOLOGY_PHOTOS_CERT_SHA256. Photos and people are read through the API.'});
Object.assign(window.MESSAGES.zh,{signIn:'逋サ蠖�',livingRoom:'螳「蜴�'});Object.assign(window.MESSAGES.en,{signIn:'Sign in',livingRoom:'Living room'});
Object.assign(MESSAGES.zh,{RESTORE_IMAGE_PROTECTED:'霑吝シ�蝗セ迚�サ咲畑莠取△螟肴仞遉コ�梧嘯譌カ荳崎�蛻�髯、縲りッキ蜈育サ捺據荳エ譌カ螻慕、コ�梧�譏セ遉コ蜿ヲ荳€蠑�蝗セ迚�サ・譖エ譁ー諱「螟咲岼譬�€�'});
Object.assign(MESSAGES.en,{RESTORE_IMAGE_PROTECTED:'This image is still needed to restore the display. End the temporary display or show another image to update the restore target before deleting it.'});