From fdac18c9cf434eb0a3c78f20ee620f14f2f00659 Mon Sep 17 00:00:00 2001 From: tianmo Date: Fri, 11 Sep 2026 22:36:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=9B=BD=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MAC_arm64_SpineViewer/viewer/spine.html | 6 +-- release/WIN_x64_SpineViewer/viewer/spine.html | 6 +-- tests/viewer-i18n.test.js | 39 +++++++++++++++++++ viewer/spine.html | 6 +-- 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 tests/viewer-i18n.test.js diff --git a/release/MAC_arm64_SpineViewer/viewer/spine.html b/release/MAC_arm64_SpineViewer/viewer/spine.html index c649094..f45039a 100644 --- a/release/MAC_arm64_SpineViewer/viewer/spine.html +++ b/release/MAC_arm64_SpineViewer/viewer/spine.html @@ -955,10 +955,10 @@ const maxMarkers = 200; const step = Math.max(1, Math.ceil(sorted.length / maxMarkers)); for (let i = 0; i < sorted.length; i += step) { - const t = sorted[i]; + const keyframeTime = sorted[i]; const span = document.createElement('span'); - span.style.left = (duration > 0 ? (t / duration) * 100 : 0) + '%'; - span.title = t('viewer.keyframeTitle', { time: formatSeconds(t), frame: frameOf(t) }); + span.style.left = (duration > 0 ? (keyframeTime / duration) * 100 : 0) + '%'; + span.title = t('viewer.keyframeTitle', { time: formatSeconds(keyframeTime), frame: frameOf(keyframeTime) }); span.setAttribute('aria-label', span.title); keyframesEl.appendChild(span); } diff --git a/release/WIN_x64_SpineViewer/viewer/spine.html b/release/WIN_x64_SpineViewer/viewer/spine.html index c649094..f45039a 100644 --- a/release/WIN_x64_SpineViewer/viewer/spine.html +++ b/release/WIN_x64_SpineViewer/viewer/spine.html @@ -955,10 +955,10 @@ const maxMarkers = 200; const step = Math.max(1, Math.ceil(sorted.length / maxMarkers)); for (let i = 0; i < sorted.length; i += step) { - const t = sorted[i]; + const keyframeTime = sorted[i]; const span = document.createElement('span'); - span.style.left = (duration > 0 ? (t / duration) * 100 : 0) + '%'; - span.title = t('viewer.keyframeTitle', { time: formatSeconds(t), frame: frameOf(t) }); + span.style.left = (duration > 0 ? (keyframeTime / duration) * 100 : 0) + '%'; + span.title = t('viewer.keyframeTitle', { time: formatSeconds(keyframeTime), frame: frameOf(keyframeTime) }); span.setAttribute('aria-label', span.title); keyframesEl.appendChild(span); } diff --git a/tests/viewer-i18n.test.js b/tests/viewer-i18n.test.js new file mode 100644 index 0000000..0f94208 --- /dev/null +++ b/tests/viewer-i18n.test.js @@ -0,0 +1,39 @@ +'use strict'; +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const roots = ['.', 'release/MAC_arm64_SpineViewer', 'release/WIN_x64_SpineViewer']; +for (const root of roots) { + const html = fs.readFileSync(path.join(root, 'viewer/spine.html'), 'utf8'); + const script = html.match(/