From f0f292d2d886fd5fe895ec2e6f3d0714c775edf4 Mon Sep 17 00:00:00 2001 From: tianmo Date: Fri, 11 Sep 2026 22:48:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=AD=E8=A8=80=E8=B7=AF=E5=BE=84=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release/MAC_arm64_SpineViewer/viewer/spine.html | 4 +++- release/WIN_x64_SpineViewer/viewer/spine.html | 4 +++- tests/viewer-i18n.test.js | 6 +++++- viewer/spine.html | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/release/MAC_arm64_SpineViewer/viewer/spine.html b/release/MAC_arm64_SpineViewer/viewer/spine.html index f45039a..95c44d5 100644 --- a/release/MAC_arm64_SpineViewer/viewer/spine.html +++ b/release/MAC_arm64_SpineViewer/viewer/spine.html @@ -323,7 +323,9 @@ function readLocaleFile(code) { try { - const file = path.join(__dirname, '..', '_locales', code + '.json'); + // Eagle 页面中的 __dirname 不一定等于 viewer 目录,使用实际模块路径定位。 + const pluginRoot = path.dirname(path.dirname(require.resolve('../js/spine-utils.js'))); + const file = path.join(pluginRoot, '_locales', code + '.json'); const data = JSON.parse(fs.readFileSync(file, 'utf8')); return (data && typeof data === 'object') ? data : {}; } catch (e) { diff --git a/release/WIN_x64_SpineViewer/viewer/spine.html b/release/WIN_x64_SpineViewer/viewer/spine.html index f45039a..95c44d5 100644 --- a/release/WIN_x64_SpineViewer/viewer/spine.html +++ b/release/WIN_x64_SpineViewer/viewer/spine.html @@ -323,7 +323,9 @@ function readLocaleFile(code) { try { - const file = path.join(__dirname, '..', '_locales', code + '.json'); + // Eagle 页面中的 __dirname 不一定等于 viewer 目录,使用实际模块路径定位。 + const pluginRoot = path.dirname(path.dirname(require.resolve('../js/spine-utils.js'))); + const file = path.join(pluginRoot, '_locales', code + '.json'); const data = JSON.parse(fs.readFileSync(file, 'utf8')); return (data && typeof data === 'object') ? data : {}; } catch (e) { diff --git a/tests/viewer-i18n.test.js b/tests/viewer-i18n.test.js index 0f94208..8fd3d32 100644 --- a/tests/viewer-i18n.test.js +++ b/tests/viewer-i18n.test.js @@ -3,6 +3,7 @@ const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const vm = require('node:vm'); +const { createRequire } = require('node:module'); 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'); @@ -18,7 +19,9 @@ for (const root of roots) { } const children = []; const context = vm.createContext({ - require, path, fs, __dirname: path.resolve(root, 'viewer'), lang, log() {}, + require: createRequire(path.resolve(root, 'viewer/spine.html')), path, fs, + // Simulate Eagle supplying a different directory than the HTML page. + __dirname: path.resolve(root, 'viewer/runtime'), lang, log() {}, document: { documentElement: {}, createElement: () => ({ style: {}, setAttribute(key, value) { this[key] = value; } }) }, keyframesEl: { innerHTML: '', appendChild: el => children.push(el) }, isStaticAnimation: false, duration: 2, @@ -26,6 +29,7 @@ for (const root of roots) { formatSeconds: value => `${value}s`, frameOf: value => value * 30 }); vm.runInContext(i18n + '\n' + markers + '\nrenderKeyframeMarkers({});', context); + assert.equal(vm.runInContext("t('viewer.skin')", context), table.viewer.skin); assert.equal(children.length, 3); assert.equal(children[1].style.left, '50%'); assert.equal(children[1].title, table.viewer.keyframeTitle.replace('{time}', '1s').replace('{frame}', '30')); diff --git a/viewer/spine.html b/viewer/spine.html index f45039a..95c44d5 100644 --- a/viewer/spine.html +++ b/viewer/spine.html @@ -323,7 +323,9 @@ function readLocaleFile(code) { try { - const file = path.join(__dirname, '..', '_locales', code + '.json'); + // Eagle 页面中的 __dirname 不一定等于 viewer 目录,使用实际模块路径定位。 + const pluginRoot = path.dirname(path.dirname(require.resolve('../js/spine-utils.js'))); + const file = path.join(pluginRoot, '_locales', code + '.json'); const data = JSON.parse(fs.readFileSync(file, 'utf8')); return (data && typeof data === 'object') ? data : {}; } catch (e) {