This commit is contained in:
tianmo committed 2026-11-06 14:11:49 +08:00
1 parent e7f800aa8d
commit d0112e0016
36 files changed
+79 -115

No files matched your search

@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spine-Vorschaubilder",
"noticeIntro": "Nach dem Import von Spine-Assets (.skel / .json + .atlas + Texturen) erstellt dieses Plugin eine Skelettvorschau für Elemente ohne eigenes Vorschaubild.",
"noticeSafety": "Nur neu importierte Elemente werden verarbeitet. Vorhandene Elemente werden weder durchsucht noch geändert, und eigene Vorschaubilder werden nie überschrieben.",
"noticeCompound": "Bei Elementen mit zusammengesetzter Endung werden die Felder Name und Typ in Eagle erst nach Bestätigung der aktuellen und neuen Werte geändert. Die Originalwerte werden gespeichert und können wiederhergestellt werden.",
"noticeModes": "Animiert verwendet die erste Animation und exportiert WebP. Statisch verwendet immer die Setup-Pose.",
"noticeDefault": "Die automatische Erstellung ist standardmäßig ausgeschaltet. Aktiviere sie bei Bedarf unten.",
"noticeIntro": "Funktion: Nach dem Import von Spine-Assets (.skel / .json + .atlas + Texturen) erstellt dieses Plugin eine Skelettvorschau für Elemente, die noch kein Vorschaubild haben.",
"noticeSafety": "1. Die automatische Erstellung ist standardmäßig ausgeschaltet und muss unten manuell aktiviert werden. Nur in diesem Lauf neu importierte Elemente werden verarbeitet; bereits festgelegte eigene Vorschaubilder werden nie überschrieben.",
"noticeCompound": "2. Bei Elementen mit zusammengesetzter Endung werden die Felder Name und Typ in Eagle erst nach Bestätigung der aktuellen und neuen Werte geändert. Die Originalwerte werden gespeichert und können wiederhergestellt werden.",
"autoToggle": "Beim Import Vorschaubilder erstellen",
"clear": "Protokoll leeren",
"restoreNames": "Namen/Typen wiederherstellen",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spine Thumbnails",
"noticeIntro": "After importing Spine assets (.skel / .json + .atlas + textures), this plugin creates a skeleton preview for items that do not yet have a custom thumbnail.",
"noticeSafety": "Only newly imported items are processed. Existing items are not scanned or changed, and custom thumbnails are never overwritten.",
"noticeCompound": "Items with compound suffixes have Eagle name/type fields adjusted only after the current and new values are confirmed. Original values are saved and can be restored.",
"noticeModes": "Animated uses the first animation and exports WebP. Still always uses the setup pose.",
"noticeDefault": "Automatic generation is off by default. Enable it below when needed.",
"noticeIntro": "Feature: After importing Spine assets (.skel / .json + .atlas + textures), this plugin generates a skeleton preview for items that do not yet have a thumbnail.",
"noticeSafety": "1. Automatic generation is off by default and must be enabled below. It only processes items newly imported in this run and never overwrites custom thumbnails that are already set.",
"noticeCompound": "2. For items with compound suffixes, Eagle name/type fields are adjusted only after the current and new values are confirmed. Original values are saved and can be restored.",
"autoToggle": "Generate thumbnails on import",
"clear": "Clear log",
"restoreNames": "Restore names/types",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Miniaturas de Spine",
"noticeIntro": "Después de importar recursos de Spine (.skel / .json + .atlas + texturas), este complemento crea una vista previa del esqueleto para los elementos que aún no tienen una miniatura personalizada.",
"noticeSafety": "Solo se procesan los elementos recién importados. No se buscan ni modifican elementos existentes y nunca se sobrescriben las miniaturas personalizadas.",
"noticeCompound": "Los campos de nombre y tipo de Eagle solo se ajustan después de confirmar los valores actuales y nuevos de los elementos con extensión compuesta. Los valores originales se guardan y pueden restaurarse.",
"noticeModes": "Animado usa la primera animación y exporta WebP. Estático siempre usa la pose de configuración.",
"noticeDefault": "La generación automática está desactivada de forma predeterminada. Actívala abajo cuando la necesites.",
"noticeIntro": "Función: después de importar recursos de Spine (.skel / .json + .atlas + texturas), este complemento genera una vista previa del esqueleto para los elementos que aún no tienen una miniatura.",
"noticeSafety": "1. La generación automática está desactivada de forma predeterminada y debe activarse abajo manualmente. Solo procesa los elementos recién importados en esta ejecución y nunca sobrescribe miniaturas personalizadas ya configuradas.",
"noticeCompound": "2. En los elementos con extensión compuesta, los campos de nombre y tipo de Eagle solo se ajustan después de confirmar los valores actuales y nuevos. Los valores originales se guardan y pueden restaurarse.",
"autoToggle": "Generar miniaturas al importar",
"clear": "Borrar registro",
"restoreNames": "Restaurar nombres/tipos",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spineサムネイル",
"noticeIntro": "Spine アセット(.skel / .json + .atlas + テクスチャ)を読み込んだ後、カスタムサムネイルがないアイテムにスケルトンプレビューを生成します。",
"noticeSafety": "今回新しく読み込んだアイテムだけを処理し、既存アイテムの走査や変更、カスタムサムネイルの上書きは行いません。",
"noticeCompound": "複合拡張子の項目は、現在値と新しい値を確認した場合にのみ Eagle の名前/種類フィールドを変更します。元の値は保存され、復元できます。",
"noticeModes": "アニメーションは最初のアニメーションを WebP に変換します。静止画は常に setup pose を使用します。",
"noticeDefault": "自動生成は既定でオフです。必要なときに下で有効にしてください。",
"noticeIntro": "機能:Spine アセット(.skel / .json + .atlas + テクスチャ)を読み込むと、サムネイル未設定のアイテムにスケルトンプレビューを生成します。",
"noticeSafety": "1. 自動生成は既定でオフで、下で手動で有効にする必要があります。今回新しく読み込んだアイテムだけを処理し、既に設定されたカスタムサムネイルは上書きしません。",
"noticeCompound": "2. 複合拡張子の項目は、現在値と新しい値を確認した場合にのみ Eagle の名前/種類フィールドを変更します。元の値は保存され、復元できます。",
"autoToggle": "読み込み時にサムネイルを自動生成",
"clear": "ログを消去",
"restoreNames": "名前/種類を復元",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spine 썸네일",
"noticeIntro": "Spine 에셋(.skel / .json + .atlas + 텍스처)을 가져온 뒤 사용자 지정 썸네일이 없는 항목에 스켈레톤 미리보기를 생성합니다.",
"noticeSafety": "이번에 새로 가져온 항목만 처리합니다. 기존 항목을 검색하거나 수정하지 않으며 사용자 지정 썸네일을 덮어쓰지 않습니다.",
"noticeCompound": "복합 확장자 항목은 현재 값과 새 값을 확인한 경우에만 Eagle 이름/유형 필드를 변경합니다. 원래 값은 저장되며 복원할 수 있습니다.",
"noticeModes": "애니메이션은 첫 번째 애니메이션을 WebP로 만듭니다. 정지 이미지는 항상 setup pose를 사용합니다.",
"noticeDefault": "자동 생성은 기본적으로 꺼져 있습니다. 필요할 때 아래에서 켜세요.",
"noticeIntro": "기능: Spine 에셋(.skel / .json + .atlas + 텍스처)을 가져오면 썸네일이 아직 설정되지 않은 항목에 스켈레톤 미리보기를 생성합니다.",
"noticeSafety": "1. 자동 생성은 기본적으로 꺼져 있으며 아래에서 직접 켜야 합니다. 이번에 새로 가져온 항목만 처리하고 이미 설정된 사용자 지정 썸네일은 덮어쓰지 않습니다.",
"noticeCompound": "2. 복합 확장자 항목은 현재 값과 새 값을 확인한 경우에만 Eagle 이름/유형 필드를 변경합니다. 원래 값은 저장되며 복원할 수 있습니다.",
"autoToggle": "가져올 때 썸네일 자동 생성",
"clear": "로그 지우기",
"restoreNames": "이름/유형 복원",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Миниатюры Spine",
"noticeIntro": "После импорта ресурсов Spine (.skel / .json + .atlas + текстуры) плагин создаёт предпросмотр скелета для элементов без пользовательской миниатюры.",
"noticeSafety": "Обрабатываются только новые элементы. Существующие элементы не сканируются и не изменяются, пользовательские миниатюры никогда не перезаписываются.",
"noticeCompound": "Поля имени и типа Eagle для элементов с составными расширениями изменяются только после подтверждения текущих и новых значений. Исходные значения сохраняются и могут быть восстановлены.",
"noticeModes": "Анимированный режим использует первую анимацию и экспортирует WebP. Статический всегда использует setup pose.",
"noticeDefault": "Автоматическое создание по умолчанию отключено. Включите его ниже при необходимости.",
"noticeIntro": "Функция: после импорта ресурсов Spine (.skel / .json + .atlas + текстуры) плагин создаёт предпросмотр скелета для элементов, у которых ещё нет миниатюры.",
"noticeSafety": "1. Автоматическое создание по умолчанию отключено и должно быть включено вручную ниже. Обрабатываются только элементы, импортированные в текущем запуске; уже заданные пользовательские миниатюры не перезаписываются.",
"noticeCompound": "2. Поля имени и типа Eagle для элементов с составными расширениями изменяются только после подтверждения текущих и новых значений. Исходные значения сохраняются и могут быть восстановлены.",
"autoToggle": "Создавать миниатюры при импорте",
"clear": "Очистить журнал",
"restoreNames": "Восстановить имена/типы",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spine缩略图",
"noticeIntro": "导入 Spine 资产(.skel / .json + .atlas + 贴图)后,本插件会为还没设置缩略图的素材生成一张骨骼预览图。",
"noticeSafety": "它只处理本次新导入的素材,不扫描、不修改历史素材,也不会覆盖你已经设置过的自定义缩略图。",
"noticeCompound": "复合后缀素材只有在确认原值和新值后,才会调整 Eagle 的名称/类型字段;原值会保存并可恢复。",
"noticeModes": "动态取骨骼里的第一个动画压成 WebP;静帧始终使用 setup pose。",
"noticeDefault": "自动生成默认关闭,需要你在下面手动启用。",
"noticeIntro": "功能:导入 Spine 资产(.skel / .json + .atlas + 贴图)后,本插件会为还没设置缩略图的素材生成一张骨骼预览图。",
"noticeSafety": "1. 自动生成默认关闭,需要你在下面手动启用。它只处理本次新导入的素材,不会覆盖已经设置过的自定义缩略图。",
"noticeCompound": "2. 复合后缀素材只有在确认原值和新值后,才会调整 Eagle 的名称/类型字段;原值会保存并可恢复。",
"autoToggle": "导入时自动生成缩略图",
"clear": "清空日志",
"restoreNames": "恢复名称/类型",
@@ -6,11 +6,9 @@
},
"thumb": {
"title": "Spine縮圖",
"noticeIntro": "匯入 Spine 資產(.skel / .json + .atlas + 貼圖)後,此外掛會為尚未設定縮圖的素材產生骨骼預覽圖。",
"noticeSafety": "只處理本次新匯入的素材,不掃描或修改歷史素材,也不會覆寫你已設定的自訂縮圖。",
"noticeCompound": "複合副檔名素材只有在確認原始值和新值後,才會調整 Eagle 的名稱/類型欄位;原始值會保存並可還原。",
"noticeModes": "動態會取第一個動畫並壓成 WebP;靜態一律使用 setup pose。",
"noticeDefault": "自動產生預設為關閉,需要時請在下方手動啟用。",
"noticeIntro": "功能:匯入 Spine 資產(.skel / .json + .atlas + 貼圖)後,此外掛會為尚未設定縮圖的素材產生一張骨骼預覽圖。",
"noticeSafety": "1. 自動產生預設為關閉,需要時請在下方手動啟用。只處理本次新匯入的素材,不會覆寫已設定的自訂縮圖。",
"noticeCompound": "2. 複合副檔名素材只有在確認原始值和新值後,才會調整 Eagle 的名稱/類型欄位;原始值會保存並可還原。",
"autoToggle": "匯入時自動產生縮圖",
"clear": "清除記錄",
"restoreNames": "還原名稱/類型",
@@ -8,7 +8,6 @@
html, body { margin: 0; height: 100%; background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", sans-serif; font-size: 13px; }
body { display: flex; flex-direction: column; gap: 9px; padding: 14px; box-sizing: border-box; }
h1 { font-size: 15px; margin: 0; font-weight: 600; text-align: center; }
.notice { color: var(--dim); line-height: 1.6; background: var(--panel);
border: 1px solid var(--border); border-radius: 6px; padding: 9px 11px; }
.notice p { margin: 0 0 6px; }
@@ -22,6 +21,9 @@
/* 窗口窄的时候整组换行,而不是把标签压成一列一个字符。 */
.toolbar { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-start; }
.toolbar-group { display: flex; flex-wrap: wrap; gap: 8px; flex: 0 0 auto; }
.toolbar-group.primary { flex: 1 1 auto; flex-wrap: nowrap; min-width: 0; }
.toolbar-actions { display: flex; flex: 0 0 auto; gap: 8px; }
.toolbar-group.primary .toggle-row { min-width: 220px; }
#clear, #restoreNames { background: var(--panel); color: var(--text); border: 1px solid var(--border);
border-radius: 6px; padding: 9px 12px; font: inherit; cursor: pointer; white-space: nowrap; }
#clear:hover, #restoreNames:hover { border-color: var(--accent); color: var(--accent); }
@@ -89,19 +91,18 @@
</style>
</head>
<body>
<h1 data-i18n="thumb.title">Spine缩略图</h1>
<div class="notice">
<p data-i18n="thumb.noticeIntro">导入 Spine 资产(.skel / .json + .atlas + 贴图)后,本插件会为还没设置缩略图的素材生成一张骨骼预览图。</p>
<p data-i18n="thumb.noticeSafety">它只处理本次新导入的素材,不扫描、不修改历史素材,也不会覆盖你已经设置过的自定义缩略图。</p>
<p data-i18n="thumb.noticeCompound">复合后缀素材只有在确认原值和新值后,才会调整 Eagle 的名称/类型字段;原值会保存并可恢复。</p>
<p data-i18n="thumb.noticeModes">动态取骨骼里的第一个动画压成 WebP;静帧始终使用 setup pose。</p>
<p data-i18n="thumb.noticeDefault">自动生成默认关闭,需要你在下面手动启用。</p>
<p data-i18n="thumb.noticeIntro">功能:导入 Spine 资产(.skel / .json + .atlas + 贴图)后,本插件会为还没设置缩略图的素材生成一张骨骼预览图。</p>
<p data-i18n="thumb.noticeSafety">1. 自动生成默认关闭,需要你在下面手动启用。它只处理本次新导入的素材,不会覆盖已经设置过的自定义缩略图。</p>
<p data-i18n="thumb.noticeCompound">2. 复合后缀素材只有在确认原值和新值后,才会调整 Eagle 的名称/类型字段;原值会保存并可恢复。</p>
</div>
<div class="toolbar">
<div class="toolbar-group">
<div class="toolbar-group primary">
<label class="toggle-row"><input type="checkbox" id="toggle"><span data-i18n="thumb.autoToggle">导入时自动生成缩略图</span></label>
<button id="clear" type="button" data-i18n="thumb.clear">清空日志</button>
<div class="toolbar-actions">
<button id="clear" type="button" data-i18n="thumb.clear">清空日志</button>
<button id="restoreNames" type="button" data-i18n="thumb.restoreNames">恢复名称/类型</button>
</div>
</div>
<div class="toolbar-group">
<label class="mode-row"><span data-i18n="thumb.modeLabel">生成方式</span>
@@ -87,7 +87,6 @@ function createLibraryWatcher(options) {
return false;
}
known = listItemDirs();
onLog(t('thumb.watching', { path: imagesDir, count: known.size }));
try {
watcher = fs.watch(imagesDir, { persistent: true }, () => scheduleFlush());
} catch (error) {
@@ -2,7 +2,7 @@
// 每次改动递增。Eagle 里的 service 插件是启动时加载并常驻的,改完代码必须重新加载插件
// 才会生效;状态栏会显示这个版本号,方便确认加载的到底是不是最新代码。
const VERSION = 'v73';
const VERSION = 'v79';
const SHOW_DEV_VERSION = false;
const path = require('path');
@@ -736,7 +736,7 @@ async function start() {
libraryPath = resolved;
imagesDir = path.join(resolved, 'images');
folderPaths = null; // 换库了,文件夹树重新读
libraryEl.textContent = resolved;
libraryEl.textContent = path.basename(resolved);
setStatus(libraryWatcher.start(resolved) ? t('thumb.statusListening') : t('thumb.statusListenFailed'));
}
@@ -906,9 +906,6 @@ if (typeof eagle === 'undefined') {
window.SpinePluginPath = (plugin && plugin.path) || window.SpinePluginRoot;
if (i18n) i18n.setLocale(eagle.app && eagle.app.locale);
logVersion();
log(t('thumb.pluginCreated', {
name: (plugin && plugin.manifest && plugin.manifest.name) || t('thumb.title'),
}));
await initializeCompatStore();
try {
await loadSettings();
@@ -1,6 +1,6 @@
{
"id": "8f3a2c14-7d5e-4b91-a4c8-2e6f0b7d1935",
"version": "1.0.0",
"version": "1.0.1",
"platform": "all",
"arch": "all",
"name": "{{manifest.app.name}}",