From b466f7d64b0d9b16fbf13faf51891d53d19b9407 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 01:45:42 +0000 Subject: [PATCH 1/5] Initial plan From d547ba6cff5bded05831cf237761b1b91e931e27 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 01:53:13 +0000 Subject: [PATCH 2/5] feat: centralize JS translate object and common translated strings in skin.js.php refs #4290 Agent-Logs-Url: https://github.com/ZoneMinder/zoneminder/sessions/f8ffacbf-358b-47f5-a732-afdd9e5854a8 Co-authored-by: connortechnology <925519+connortechnology@users.noreply.github.com> --- web/skins/classic/js/skin.js.php | 23 +++++++++++++++++++++ web/skins/classic/views/js/event.js.php | 13 ------------ web/skins/classic/views/js/events.js.php | 6 ------ web/skins/classic/views/js/snapshot.js.php | 1 - web/skins/classic/views/js/snapshots.js.php | 5 ----- web/skins/classic/views/js/timeline.js.php | 2 -- web/skins/classic/views/js/watch.js.php | 9 -------- web/skins/classic/views/js/zone.js.php | 6 ------ 8 files changed, 23 insertions(+), 42 deletions(-) diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 926aafea72c..8b73ed16b88 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -38,6 +38,29 @@ const exportSucceededString = ''; const cancelString = ''; const playerDisabledInMonitorSettings = ''; + +const deleteString = ""; +const archivedString = ""; +const unarchivedString = ""; +const emailedString = ""; +const yesString = ""; +const noString = ""; +const confirmDeleteEventsString = ""; + +const translate = { + "seconds": "", + "Fullscreen": "", + "Exit Fullscreen": "", + "Showing Analysis": "", + "Show Analysis": "", + "Not Showing Analysis": "", + "Live": "", + "Edit": "", + "All Events": "", + "Info": "", + "Archived": "", + "Emailed": "", +}; "; var causeString = ""; var showZonesString = ""; var hideZonesString = ""; @@ -110,15 +109,3 @@ var WEB_LIST_THUMB_HEIGHT = ''; var popup = ''; -var translate = { - "seconds": "", - "Fullscreen": "", - "Exit Fullscreen": "", - "Live": "", - "Edit": "", - "All Events": "", - "Info": "", - "Archived": "", - "Emailed": "", -}; - diff --git a/web/skins/classic/views/js/events.js.php b/web/skins/classic/views/js/events.js.php index 52a39ca41a3..1b0b6ad1c99 100644 --- a/web/skins/classic/views/js/events.js.php +++ b/web/skins/classic/views/js/events.js.php @@ -6,12 +6,6 @@ var filterQuery = ''; var sortQuery = ''; -const confirmDeleteEventsString = ""; -const archivedString = ""; -const unarchivedString = ""; const archiveString = ""; const unarchiveString = ""; -const emailedString = ""; -const yesString = ""; -const noString = ""; var WEB_LIST_THUMBS = ; diff --git a/web/skins/classic/views/js/snapshot.js.php b/web/skins/classic/views/js/snapshot.js.php index a04f4cb951e..8534993bc6b 100644 --- a/web/skins/classic/views/js/snapshot.js.php +++ b/web/skins/classic/views/js/snapshot.js.php @@ -24,7 +24,6 @@ // Strings // -var deleteString = ""; var causeString = ""; var downloadProgressString = ""; var downloadFailedString = ''; diff --git a/web/skins/classic/views/js/snapshots.js.php b/web/skins/classic/views/js/snapshots.js.php index 487d9cd5df1..7d8d459eb85 100644 --- a/web/skins/classic/views/js/snapshots.js.php +++ b/web/skins/classic/views/js/snapshots.js.php @@ -1,6 +1 @@ -var confirmDeleteEventsString = ""; -var archivedString = ""; -var emailedString = ""; -var yesString = ""; -var noString = ""; var WEB_LIST_THUMBS = ; diff --git a/web/skins/classic/views/js/timeline.js.php b/web/skins/classic/views/js/timeline.js.php index aa9d7398674..e0d5c3bb620 100644 --- a/web/skins/classic/views/js/timeline.js.php +++ b/web/skins/classic/views/js/timeline.js.php @@ -33,8 +33,6 @@ ?> var monitors = ; -var archivedString = ""; - var minTime = ''; var midTime = ''; var maxTime = ''; diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index 9b5c47a98ff..51a722d78ec 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -102,16 +102,7 @@ global $players; echo 'players = '.json_encode($players).PHP_EOL; ?> -var deleteString = ""; var enableAlarmsStr = ""; var disableAlarmsStr = ""; var forceAlarmStr = ""; var cancelForcedAlarmStr = ""; -var translate = { - "seconds": "", - "Fullscreen": "", - "Exit Fullscreen": "", - "Showing Analysis": "", - "Show Analysis": "", - "Not Showing Analysis": "", -}; diff --git a/web/skins/classic/views/js/zone.js.php b/web/skins/classic/views/js/zone.js.php index 2cb8ebcc10e..d74024e2262 100644 --- a/web/skins/classic/views/js/zone.js.php +++ b/web/skins/classic/views/js/zone.js.php @@ -101,7 +101,6 @@ var minBlobsUnsetString = ''; var minBlobsLtMaxString = ''; -var deleteString = ""; // // Imported from watch.js.php and modified for new zone edit view // @@ -120,8 +119,3 @@ var imageRefreshTimeout = ; var canStream = ; - -var translate = { - "Showing Analysis": '', - "Not Showing Analysis": '' -}; From 970ae86a246e31643521bc8172dce5c20fd079e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 01:54:15 +0000 Subject: [PATCH 3/5] fix: use validJsStr() consistently for JS string escaping in skin.js.php Agent-Logs-Url: https://github.com/ZoneMinder/zoneminder/sessions/f8ffacbf-358b-47f5-a732-afdd9e5854a8 Co-authored-by: connortechnology <925519+connortechnology@users.noreply.github.com> --- web/skins/classic/js/skin.js.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 8b73ed16b88..4939df6e703 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -39,13 +39,13 @@ const cancelString = ''; const playerDisabledInMonitorSettings = ''; -const deleteString = ""; -const archivedString = ""; -const unarchivedString = ""; -const emailedString = ""; -const yesString = ""; -const noString = ""; -const confirmDeleteEventsString = ""; +const deleteString = ""; +const archivedString = ""; +const unarchivedString = ""; +const emailedString = ""; +const yesString = ""; +const noString = ""; +const confirmDeleteEventsString = ""; const translate = { "seconds": "", From 6aeaba54ff10e4a470675fc5821cee3f2d6f289f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 02:43:33 +0000 Subject: [PATCH 4/5] feat: add zmPrimeTranslations() for lazy-priming of JS translations per view refs #4290 Agent-Logs-Url: https://github.com/ZoneMinder/zoneminder/sessions/3607efe7-9a75-41ed-82f3-e4975e4c3654 Co-authored-by: connortechnology <925519+connortechnology@users.noreply.github.com> --- web/js/MonitorStream.js | 16 ++++++++-------- web/skins/classic/js/skin.js.php | 10 ++++++++-- web/skins/classic/views/js/event.js | 4 ++-- web/skins/classic/views/js/event.js.php | 6 ++++-- web/skins/classic/views/js/watch.js.php | 6 ++---- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/web/js/MonitorStream.js b/web/js/MonitorStream.js index baed627444a..2ab2ac49797 100644 --- a/web/js/MonitorStream.js +++ b/web/js/MonitorStream.js @@ -1337,11 +1337,11 @@ function MonitorStream(monitorData) { if (!this.buttons.enableAlarmButton.hasClass('disabled')) { this.buttons.enableAlarmButton.addClass('disabled'); - this.buttons.enableAlarmButton.prop('title', disableAlarmsStr); + this.buttons.enableAlarmButton.prop('title', translate["DisableAlarms"]); } } else { this.buttons.enableAlarmButton.removeClass('disabled'); - this.buttons.enableAlarmButton.prop('title', enableAlarmsStr); + this.buttons.enableAlarmButton.prop('title', translate["EnableAlarms"]); } // end if doing analysis this.buttons.enableAlarmButton.prop('disabled', false); } // end if have enableAlarmButton @@ -1352,13 +1352,13 @@ function MonitorStream(monitorData) { // and the disabled state should be to force an alarm if (this.buttons.forceAlarmButton.hasClass('disabled')) { this.buttons.forceAlarmButton.removeClass('disabled'); - this.buttons.forceAlarmButton.prop('title', cancelForcedAlarmStr); + this.buttons.forceAlarmButton.prop('title', translate["CancelForcedAlarm"]); } } else { if (!this.buttons.forceAlarmButton.hasClass('disabled')) { // Looks disabled this.buttons.forceAlarmButton.addClass('disabled'); - this.buttons.forceAlarmButton.prop('title', forceAlarmStr); + this.buttons.forceAlarmButton.prop('title', translate["ForceAlarm"]); } } this.buttons.forceAlarmButton.prop('disabled', false); @@ -1468,11 +1468,11 @@ function MonitorStream(monitorData) { if (!this.buttons.enableAlarmButton.hasClass('disabled')) { this.buttons.enableAlarmButton.addClass('disabled'); - this.buttons.enableAlarmButton.prop('title', disableAlarmsStr); + this.buttons.enableAlarmButton.prop('title', translate["DisableAlarms"]); } } else { this.buttons.enableAlarmButton.removeClass('disabled'); - this.buttons.enableAlarmButton.prop('title', enableAlarmsStr); + this.buttons.enableAlarmButton.prop('title', translate["EnableAlarms"]); } // end if doing analysis this.buttons.enableAlarmButton.prop('disabled', false); } // end if have enableAlarmButton @@ -1483,13 +1483,13 @@ function MonitorStream(monitorData) { // and the disabled state should be to force an alarm if (this.buttons.forceAlarmButton.hasClass('disabled')) { this.buttons.forceAlarmButton.removeClass('disabled'); - this.buttons.forceAlarmButton.prop('title', cancelForcedAlarmStr); + this.buttons.forceAlarmButton.prop('title', translate["CancelForcedAlarm"]); } } else { if (!this.buttons.forceAlarmButton.hasClass('disabled')) { // Looks disabled this.buttons.forceAlarmButton.addClass('disabled'); - this.buttons.forceAlarmButton.prop('title', forceAlarmStr); + this.buttons.forceAlarmButton.prop('title', translate["ForceAlarm"]); } } this.buttons.forceAlarmButton.prop('disabled', false); diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 4939df6e703..119c4c32eba 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -47,7 +47,9 @@ const noString = ""; const confirmDeleteEventsString = ""; -const translate = { +const translate = {}; +function zmPrimeTranslations(t) { Object.assign(translate, t); } +zmPrimeTranslations({ "seconds": "", "Fullscreen": "", "Exit Fullscreen": "", @@ -60,7 +62,11 @@ "Info": "", "Archived": "", "Emailed": "", -}; + "EnableAlarms": "", + "DisableAlarms": "", + "ForceAlarm": "", + "CancelForcedAlarm": "", +}); "; -var showZonesString = ""; -var hideZonesString = ""; +zmPrimeTranslations({ + "Show Zones": "", + "Hide Zones": "", +}); var WEB_LIST_THUMB_WIDTH = ''; var WEB_LIST_THUMB_HEIGHT = ''; var popup = ''; diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index 51a722d78ec..e065fb70009 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -102,7 +102,5 @@ global $players; echo 'players = '.json_encode($players).PHP_EOL; ?> -var enableAlarmsStr = ""; -var disableAlarmsStr = ""; -var forceAlarmStr = ""; -var cancelForcedAlarmStr = ""; + + From a50fd97eaa589b6a6b0b33fb617ce3f6080f8f5b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 02:44:15 +0000 Subject: [PATCH 5/5] style: remove extra blank line in watch.js.php Agent-Logs-Url: https://github.com/ZoneMinder/zoneminder/sessions/3607efe7-9a75-41ed-82f3-e4975e4c3654 Co-authored-by: connortechnology <925519+connortechnology@users.noreply.github.com> --- web/skins/classic/views/js/watch.js.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index e065fb70009..e70db16a92d 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -102,5 +102,3 @@ global $players; echo 'players = '.json_encode($players).PHP_EOL; ?> - -