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.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:'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.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,{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.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:'});
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.'
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,{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.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,{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.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(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.'});