Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/l10n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "The URL did not load the expected extension ID {expected}. Loaded: {actual}.",
"plugins.customExtensionVersionManager.error.missingOpcodes": "The new version is missing blocks used by the project: {opcodes}.",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "The new version changes the type of blocks used by the project: {opcodes}.",
"plugins.customExtensionVersionManager.checkingCompatibility": "Checking...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "This version may be incompatible",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "Version {version} is missing, hides, or changes {count} blocks used by this project.",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "Select an item to jump to that block. You can cancel and fix the project, or switch anyway.",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "In {target} · Click to locate",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "This block is not available in the target version.",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "This block is hidden in the target version.",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "Block type changes from {from} to {to}.",
"plugins.customExtensionVersionManager.cancel": "Cancel",
"plugins.customExtensionVersionManager.forceSwitch": "Switch anyway",
"plugins.customExtensionVersionManager.backToVersions": "Back to versions",
"plugins.voiceCooperation.title": "Voice Cooperation",
"plugins.voiceCooperation.description": "Voice cooperate with your team members!",
"plugins.voiceCooperation.join": "Join Voice",
Expand Down Expand Up @@ -420,4 +431,4 @@
"plugins.debuggerAddon.terminalLoadMode.auto": "Load automatically with project",
"plugins.debuggerAddon.terminalLoadMode.onClick": "Load on icon click",
"plugins.debuggerAddon.terminalLoadMode.manual": "Do not load automatically"
}
}
13 changes: 12 additions & 1 deletion src/l10n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "La URL no cargó el ID de extensión esperado {expected}. Cargado: {actual}.",
"plugins.customExtensionVersionManager.error.missingOpcodes": "La nueva versión no contiene bloques usados por el proyecto: {opcodes}.",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "La nueva versión cambia el tipo de los bloques usados por el proyecto: {opcodes}.",
"plugins.customExtensionVersionManager.checkingCompatibility": "Comprobando...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "Esta versión puede ser incompatible",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "La versión {version} no incluye, oculta o cambia {count} bloques usados por este proyecto.",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "Selecciona un elemento para ir a ese bloque. Puedes cancelar y corregir el proyecto, o cambiar de todos modos.",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "En {target} · Haz clic para localizar",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "Este bloque no está disponible en la versión de destino.",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "Este bloque está oculto en la versión de destino.",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "El tipo de bloque cambia de {from} a {to}.",
"plugins.customExtensionVersionManager.cancel": "Cancelar",
"plugins.customExtensionVersionManager.forceSwitch": "Cambiar de todos modos",
"plugins.customExtensionVersionManager.backToVersions": "Volver a las versiones",
"plugins.voiceCooperation.title": "Cooperación de voz",
"plugins.voiceCooperation.description": "¡Cooperar por voz con los miembros de tu equipo!",
"plugins.voiceCooperation.join": "Unirse a voz",
Expand Down Expand Up @@ -357,4 +368,4 @@
"plugins.debuggerAddon.terminalLoadMode.auto": "Cargar automáticamente con el proyecto",
"plugins.debuggerAddon.terminalLoadMode.onClick": "Cargar al hacer clic en el icono",
"plugins.debuggerAddon.terminalLoadMode.manual": "No cargar automáticamente"
}
}
13 changes: 12 additions & 1 deletion src/l10n/ms.json
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "URL tersebut tidak memuatkan ID blok tambahan yang dijangka, {expected}. Dimuatkan: {actual}.",
"plugins.customExtensionVersionManager.error.missingOpcodes": "Versi baharu tidak mempunyai blok yang digunakan oleh projek: {opcodes}.",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "Versi baharu mengubah jenis blok yang digunakan oleh projek: {opcodes}.",
"plugins.customExtensionVersionManager.checkingCompatibility": "Menyemak...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "Versi ini mungkin tidak serasi",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "Versi {version} tiada, menyembunyikan atau mengubah {count} blok yang digunakan oleh projek ini.",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "Pilih item untuk pergi ke blok tersebut. Anda boleh batal dan membaiki projek, atau tetap menukar.",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "Dalam {target} · Klik untuk mencari",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "Blok ini tidak tersedia dalam versi sasaran.",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "Blok ini disembunyikan dalam versi sasaran.",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "Jenis blok berubah daripada {from} kepada {to}.",
"plugins.customExtensionVersionManager.cancel": "Batal",
"plugins.customExtensionVersionManager.forceSwitch": "Tetap tukar",
"plugins.customExtensionVersionManager.backToVersions": "Kembali ke senarai versi",
"plugins.voiceCooperation.title": "Kerjasama Suara",
"plugins.voiceCooperation.description": "Bekerjasama secara suara dengan ahli pasukan anda!",
"plugins.voiceCooperation.join": "Sertai Suara",
Expand Down Expand Up @@ -360,4 +371,4 @@
"plugins.debuggerAddon.terminalLoadMode.auto": "Muat secara automatik dengan projek",
"plugins.debuggerAddon.terminalLoadMode.onClick": "Muat apabila ikon diklik",
"plugins.debuggerAddon.terminalLoadMode.manual": "Jangan muat secara automatik"
}
}
13 changes: 12 additions & 1 deletion src/l10n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "URL не загрузил ожидаемое расширение с ID {expected}. Загружено: {actual}.",
"plugins.customExtensionVersionManager.error.missingOpcodes": "В новой версии отсутствуют блоки, используемые в проекте: {opcodes}.",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "В новой версии изменён тип блоков, используемых в проекте: {opcodes}.",
"plugins.customExtensionVersionManager.checkingCompatibility": "Проверка...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "Эта версия может быть несовместима",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "В версии {version} отсутствуют, скрыты или изменены {count} блоков, используемых этим проектом.",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "Нажмите на элемент, чтобы перейти к блоку. Можно отменить действие и исправить проект либо всё равно переключить версию.",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "Объект: {target} · Нажмите, чтобы перейти",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "Этот блок недоступен в целевой версии.",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "Этот блок скрыт в целевой версии.",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "Тип блока меняется с {from} на {to}.",
"plugins.customExtensionVersionManager.cancel": "Отмена",
"plugins.customExtensionVersionManager.forceSwitch": "Всё равно переключить",
"plugins.customExtensionVersionManager.backToVersions": "Вернуться к списку версий",
"plugins.voiceCooperation.title": "Голосовое взаимодействие",
"plugins.voiceCooperation.description": "Голосовое взаимодействие с членами вашей команды!",
"plugins.voiceCooperation.join": "Присоединиться к голосу",
Expand Down Expand Up @@ -357,4 +368,4 @@
"plugins.editorOptimization.enableFullscreenDesc": "Скрывает область блоков при полноэкранном режиме сцены, уменьшая ненужную нагрузку на рендеринг области блоков.",
"plugins.editorOptimization.enablePixiLabel": "[Экспериментально] Включить ускоренный рендеринг Pixi",
"plugins.editorOptimization.enablePixiDesc": "Использует PixiJS для рендеринга области блоков в виде текстуры, значительно снижая количество узлов DOM и повышая плавность перетаскивания/масштабирования. Текстура Pixi обеспечивает ограниченную интерактивность; двойной щелчок для восстановления нативного отображения DOM."
}
}
13 changes: 12 additions & 1 deletion src/l10n/uk.json
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "URL-адреса не завантажила очікуване розширення з ID {expected}. Завантажено: {actual}.",
"plugins.customExtensionVersionManager.error.missingOpcodes": "У новій версії відсутні блоки, які використовує проєкт: {opcodes}.",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "У новій версії змінено тип блоків, які використовує проєкт: {opcodes}.",
"plugins.customExtensionVersionManager.checkingCompatibility": "Перевірка...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "Ця версія може бути несумісною",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "У версії {version} відсутні, приховані або змінені {count} блоків, які використовує цей проєкт.",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "Натисніть елемент, щоб перейти до блоку. Можна скасувати дію й виправити проєкт або все одно перемкнути версію.",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "Об’єкт: {target} · Натисніть, щоб перейти",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "Цей блок недоступний у цільовій версії.",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "Цей блок приховано в цільовій версії.",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "Тип блока змінюється з {from} на {to}.",
"plugins.customExtensionVersionManager.cancel": "Скасувати",
"plugins.customExtensionVersionManager.forceSwitch": "Усе одно перемкнути",
"plugins.customExtensionVersionManager.backToVersions": "Повернутися до списку версій",
"plugins.voiceCooperation.title": "Голосова співпраця",
"plugins.voiceCooperation.description": "Співпрацюйте в голосі з членами команди!",
"plugins.voiceCooperation.join": "Приєднатися до голосу",
Expand Down Expand Up @@ -355,4 +366,4 @@
"plugins.debuggerAddon.terminalLoadMode.auto": "Завантажувати автоматично з проєктом",
"plugins.debuggerAddon.terminalLoadMode.onClick": "Завантажувати по кліку на іконку",
"plugins.debuggerAddon.terminalLoadMode.manual": "Не завантажувати автоматично"
}
}
13 changes: 12 additions & 1 deletion src/l10n/zh-cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,17 @@
"plugins.customExtensionVersionManager.error.idMismatch": "该 URL 没有加载预期扩展 ID {expected},实际加载:{actual}。",
"plugins.customExtensionVersionManager.error.missingOpcodes": "新版本缺少工程正在使用的积木:{opcodes}。",
"plugins.customExtensionVersionManager.error.blockTypeChanged": "新版本改变了工程正在使用的积木类型:{opcodes}。",
"plugins.customExtensionVersionManager.checkingCompatibility": "检查中...",
"plugins.customExtensionVersionManager.compatibilityWarningTitle": "此版本可能不兼容",
"plugins.customExtensionVersionManager.compatibilityWarningDescription": "版本 {version} 缺少、隐藏或改变了当前工程正在使用的 {count} 个积木。",
"plugins.customExtensionVersionManager.compatibilityWarningHint": "点击条目可跳转到对应积木。你可以取消并修改工程,也可以直接强制切换。",
"plugins.customExtensionVersionManager.incompatibleBlockLocation": "位于 {target} · 点击定位",
"plugins.customExtensionVersionManager.incompatibleBlockMissing": "目标版本中不存在此积木。",
"plugins.customExtensionVersionManager.incompatibleBlockHidden": "目标版本中此积木已被隐藏。",
"plugins.customExtensionVersionManager.incompatibleBlockTypeChanged": "积木类型由 {from} 变为 {to}。",
"plugins.customExtensionVersionManager.cancel": "取消",
"plugins.customExtensionVersionManager.forceSwitch": "强制切换",
"plugins.customExtensionVersionManager.backToVersions": "返回版本列表",
"plugins.voiceCooperation.title": "语音协作",
"plugins.voiceCooperation.description": "与团队成员一起语音协作!",
"plugins.voiceCooperation.join": "加入语音",
Expand Down Expand Up @@ -420,4 +431,4 @@
"plugins.editorOptimization.enableFullscreenDesc": "在舞台全屏时隐藏积木区,减少不必要的积木区渲染开销。",
"plugins.editorOptimization.enablePixiLabel": "[实验] 启用 Pixi 加速渲染",
"plugins.editorOptimization.enablePixiDesc": "使用 PixiJS 将积木区渲染为纹理,大幅降低 DOM 节点数并提升拖拽/缩放流畅度。Pixi纹理提供受限的交互功能,通过双击以恢复原生DOM显示。"
}
}
53 changes: 53 additions & 0 deletions src/plugins/custom-extension-version-manager/compatibility.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { ExtensionBlockDefinition, ExtensionMetadata, IncompatibleBlockUsage, UsedExtensionBlock } from "./types";

const DEFAULT_BLOCK_TYPE = "command";

const getBlockDefinitions = (metadata: ExtensionMetadata): Map<string, ExtensionBlockDefinition> => {
const definitions = new Map<string, ExtensionBlockDefinition>();
(metadata.blocks || []).forEach((block) => {
if (typeof block === "string" || !block.opcode) return;
definitions.set(block.opcode, block);
});
return definitions;
};

const normalizeBlockType = (blockType: string | undefined) => blockType || DEFAULT_BLOCK_TYPE;

export const compareUsedExtensionBlocks = (
usedBlocks: UsedExtensionBlock[],
targetMetadata: ExtensionMetadata,
): IncompatibleBlockUsage[] => {
const targetDefinitions = getBlockDefinitions(targetMetadata);

return usedBlocks.reduce<IncompatibleBlockUsage[]>((issues, usedBlock) => {
const targetDefinition = targetDefinitions.get(usedBlock.opcode);
if (!targetDefinition) {
issues.push({
...usedBlock,
reason: "missing",
});
return issues;
}

if (targetDefinition.hideFromPalette) {
issues.push({
...usedBlock,
reason: "hidden",
targetBlockType: normalizeBlockType(targetDefinition.blockType),
});
return issues;
}

if (
usedBlock.blockType &&
normalizeBlockType(usedBlock.blockType) !== normalizeBlockType(targetDefinition.blockType)
) {
issues.push({
...usedBlock,
reason: "blockTypeChanged",
targetBlockType: normalizeBlockType(targetDefinition.blockType),
});
}
return issues;
}, []);
};
Loading