From 9b9118059d080457751fc24370c01adcc81492e3 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Sat, 24 May 2025 13:22:54 -0500 Subject: [PATCH 01/22] [Automated] Update translations 2025-05-24 (#2129) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 3 +++ translations/extension-runtime.json | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index d1f48f0ae8..13619a8db4 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -1766,6 +1766,7 @@ "clouddata-ping@description": "检测云变量服务器是否在线。", "clouddata-ping@name": "云变量检测", "cloudlink@description": "一个强大的 Scratch WebSocket 扩展。", + "cloudlink@name": "云联 V4", "cs2627883/numericalencoding@description": "请使用更加高效的 V2 版本。V1 只是因为兼容性考虑才保留的。", "cs2627883/numericalencoding@name": "数字编码 V1", "cursor@description": "使用自定义指针或者隐藏指针。又或者用造型图片替换指针。", @@ -1810,6 +1811,8 @@ "runtime-options@name": "运行时选项", "shreder95ua/resolution@description": "获取主屏幕的分辨率。", "shreder95ua/resolution@name": "屏幕分辨率", + "sound@description": "从 URL 播放声音。旧称“声音”。", + "sound@name": "URL 播放", "steamworks@description": "将你的项目连接到 Steamworks API。", "stretch@description": "水平或竖直拉伸角色。", "stretch@name": "拉伸", diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index fc6972b7e7..8d6be9f390 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -10989,6 +10989,8 @@ "Lily/ClonesPlus@_clone with [INPUTA] set to [INPUTB] exists?": "存在[INPUTA]为[INPUTB]的克隆体?", "Lily/ClonesPlus@_costume #": "造型编号", "Lily/ClonesPlus@_costume name": "造型名称", + "Lily/ClonesPlus@_create clone of myself with [INPUTA] set to [INPUTB]": "创建[INPUTA]为[INPUTB]的自己的克隆体", + "Lily/ClonesPlus@_create clone of original with [INPUTA] set to [INPUTB]": "创建[INPUTA]为[INPUTB]的本体的克隆体", "Lily/ClonesPlus@_delete clones in [INPUT]": "删除[INPUT]的所有克隆体", "Lily/ClonesPlus@_delete clones with [INPUTA] set to [INPUTB]": "删除[INPUTA]为[INPUTB]的克隆体", "Lily/ClonesPlus@_direction": "方向", @@ -11005,7 +11007,7 @@ "Lily/ClonesPlus@_variable [INPUTA] of clone with [INPUTB] set to [INPUTC]": "获取[INPUTB]为[INPUTC]的克隆体的变量[INPUTA]", "Lily/ClonesPlus@_variable [INPUT] of main sprite": "角色本体的变量[INPUT]", "Lily/ClonesPlus@_volume": "音量", - "Lily/ClonesPlus@_when I start as a clone with [INPUTA] set to [INPUTB]": "当我作为克隆体启动,且满足[INPUTA]为[INPUTB]", + "Lily/ClonesPlus@_when I start as a clone with [INPUTA] set to [INPUTB]": "当作为克隆体启动且[INPUTA]为[INPUTB]时", "Lily/ClonesPlus@_x position": "x坐标", "Lily/ClonesPlus@_y position": "y坐标", "Lily/CommentBlocks@_Comment Blocks": "注释", @@ -11344,11 +11346,24 @@ "SharkPool/Camera@_Add Camera": "添加摄像机", "SharkPool/Camera@_Camera V2": "摄像机 V2", "SharkPool/Camera@_New Camera name:": "新摄像机名称:", + "SharkPool/Camera@_Remove Camera": "移除摄像机", "SharkPool/Camera@_Stage": "舞台", + "SharkPool/Camera@_[CAMERA] camera x": "[CAMERA]摄像机的x坐标", + "SharkPool/Camera@_[CAMERA] camera y": "[CAMERA]摄像机的y坐标", "SharkPool/Camera@_background color": "背景颜色", + "SharkPool/Camera@_bind [TARGET] to camera [CAMERA]": "将[TARGET]绑定到摄像机[CAMERA]", + "SharkPool/Camera@_camera of [TARGET]": "[TARGET]的摄像机", + "SharkPool/Camera@_change [CAMERA] camera x by [NUM]": "将[CAMERA]摄像机的x坐标增加[NUM]", + "SharkPool/Camera@_change [CAMERA] camera y by [NUM]": "将[CAMERA]摄像机的y坐标增加[NUM]", "SharkPool/Camera@_default": "默认类型", + "SharkPool/Camera@_move [CAMERA] camera [NUM] steps": "移动[CAMERA]摄像机[NUM]步", "SharkPool/Camera@_move [CAMERA] camera to [TARGET]": "将[CAMERA]摄像机移到[TARGET]", "SharkPool/Camera@_myself": "自己", + "SharkPool/Camera@_set [CAMERA] camera to x: [X] y: [Y]": "将[CAMERA]摄像机移到 x:[X]y:[Y]", + "SharkPool/Camera@_set [CAMERA] camera x to [NUM]": "将[CAMERA]摄像机的x坐标设为[NUM]", + "SharkPool/Camera@_set [CAMERA] camera y to [NUM]": "将[CAMERA]摄像机的y坐标设为[NUM]", + "SharkPool/Camera@_set background color to [COLOR]": "将背景颜色设为[COLOR]", + "SharkPool/Camera@_unbind [TARGET] from camera [CAMERA]": "将[TARGET]从摄像机[CAMERA]解绑", "SharkPool/Font-Manager@_Font Manager": "字体管理", "SharkPool/Font-Manager@_[ADDED] fonts": "已[ADDED]的字体", "SharkPool/Font-Manager@_[DATA] of font [NAME]": "字体[NAME]的[DATA]", @@ -12399,6 +12414,7 @@ "shreder95ua/resolution@_Screen resolution": "屏幕分辨率", "shreder95ua/resolution@_primary screen height": "主屏幕高", "shreder95ua/resolution@_primary screen width": "主屏幕宽", + "sound@_URL Playback": "URL 播放", "sound@_play sound from url: [path] until done": "播放URL[path]的声音直到结束", "sound@_start sound from url: [path]": "播放URL[path]的声音", "steamworks@_IP country": "IP 所属地", From 0a48b96e4f82aa73474fd2ea01b182ddef0ff336 Mon Sep 17 00:00:00 2001 From: Scratch_Fakemon Date: Sat, 24 May 2025 22:20:10 -0500 Subject: [PATCH 02/22] sound: Update image attributions (#2130) I didn't do it in my original PR so I'm doing it now. --- images/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/images/README.md b/images/README.md index 877bfbf84c..542f52e8d6 100644 --- a/images/README.md +++ b/images/README.md @@ -60,7 +60,8 @@ All images in this folder are licensed under the [GNU General Public License ver - Created by [@BlueDome77](https://github.com/BlueDome77) in https://github.com/TurboWarp/extensions/issues/90#issuecomment-1586464191 ## sound.svg - - Created by [@softedco](https://scratch.mit.edu/users/softed/) in https://github.com/TurboWarp/extensions/issues/90#issuecomment-1369138404. + - Created by [@Scratch_Fakemon](https://scratch.mit.edu/users/Scratch_Fakemon) in https://github.com/TurboWarp/extensions/pull/2121 + - Font is Lohit Devanagari. ## encoding.svg - Created by [@BlueDome77](https://github.com/BlueDome77) in https://github.com/TurboWarp/extensions/issues/90#issuecomment-1632625905 From 8333213c53f68c59c7bf5e5b2311fc6d88414837 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Thu, 29 May 2025 10:59:36 -0500 Subject: [PATCH 03/22] [Automated] Update translations 2025-05-28 (#2133) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 15 +++++++++++++++ translations/extension-runtime.json | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index 13619a8db4..1714af0b49 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -25,6 +25,7 @@ "DNin/wake-lock@description": "Erlaube dem Computer nicht, in den Ruhemodus überzugehen", "DNin/wake-lock@name": "Bleibe wach", "DT/cameracontrols@description": "Bewege den angezeigten Teil der Bühne.", + "DT/cameracontrols@name": "Kamera V1", "JeremyGamer13/tween@description": "Methoden für sanftere Animationen", "Lily/AllMenus@description": "Besondere Kategorie mit jedem Eingabefeld von jeder Scratchkategorie und -erweiterung.", "Lily/AllMenus@name": "Alle Menüs", @@ -67,7 +68,9 @@ "NexusKitten/moremotion@description": "Mehr Blöcke über Bewegung.", "NexusKitten/moremotion@name": "Mehr Bewegung", "NexusKitten/sgrab@description": "Erhalte Informationen über Scratch Projekte und Scratch Benutzer.", + "PwLDev/vibration@description": "Steuer die Vibration des Geräts. Funktioniert nur auf Chrome für Android.", "SharkPool/Camera@description": "Bewege den angezeigten Teil der Bühne.", + "SharkPool/Camera@name": "Kamera V2", "SharkPool/Font-Manager@description": "Ergänze, entferne und verwalte Schriftarten.", "SharkPool/Font-Manager@name": "Schriftart-Verwaltung", "Skyhigh173/bigint@description": "Mathe Blöcke, die mit unendlich großen Ganzzahlen (ohne Dezimalstellen) arbeiten.", @@ -84,7 +87,10 @@ "TheShovel/ShovelUtils@name": "SchaufelUtils", "Xeltalliv/clippingblending@description": "Verändere die Ränder Figur in einer rechteckigen Fläche und nutze verschiedene Farbmischungsmodi.", "Xeltalliv/clippingblending@name": "Ränder verändern & Farben mischen", + "Xeltalliv/simple3D@description": "Erstelle einfach GPU-beschleunigte 3D-Projekte.", + "Xeltalliv/simple3D@name": "Einfaches 3D", "XeroName/Deltatime@description": "Präzise Deltatimingblöcke.", + "XeroName/Deltatime@name": "Delta-Zeit", "XmerOriginals/closecontrol@description": "Zeigt einen Bestätigungsdialog, wenn jemand versucht, den Tab zu schließen.", "XmerOriginals/closecontrol@name": "Frage vor dem Schließen", "ZXMushroom63/searchApi@description": "Interagiert mit URL-Parametern - der Teil der URL nach dem Fragezeichen.", @@ -102,6 +108,8 @@ "clouddata-ping@description": "Stelle fest, ob ein Cloudvariablenserver momentan funktioniert.", "clouddata-ping@name": "Ping Clouddaten", "cloudlink@description": "Eine mächtige WebSocket-Erweiterung für Scratch.", + "cs2627883/numericalencoding@description": "Verwende stattdessen V2, da es effizienter ist. V1 existiert nur aus Kompatibilitätsgründen.", + "cs2627883/numericalencoding@name": "Numerische Kodierung V1", "cursor@description": "Benutzt eigene Mauszeiger oder versteckt den Cursor. Erlaubt auch, den Cursor mit jedem Kostümbild zu ersetzen.", "cursor@name": "Mauszeiger", "encoding@description": "Kodiere und dekodiere Strings in ihre Unicodezahlen, Base 64, oder URLs.", @@ -125,10 +133,13 @@ "mdwalters/notifications@name": "Benachrichtigungen", "navigator@description": "Details über den Browser und das Betriebssystem des Nutzers.", "navigator@name": "Browser", + "numerical-encoding-2@description": "Codiere Zeichenfolgen als Zahlen für Cloud-Variablen. Nicht kompatibel mit V1, da ein viel effizienteres Format verwendet wird.", + "numerical-encoding-2@name": "Numerische Kodierung V2", "obviousAlexC/SensingPlus@description": "Eine Erweiterung der Fühlen Kategorie.", "obviousAlexC/SensingPlus@name": "Fühlen Plus", "obviousAlexC/newgroundsIO@description": "Blöcke, die mit der Newgrounds-API interagieren. Inoffiziell.", "obviousAlexC/penPlus@description": "Fortgeschrittene Renderingmöglichkeiten.", + "penplus@description": "Ersetzt durch Pen Plus V7.", "penplus@name": "Pen Plus V5 (Alt)", "pointerlock@description": "Fügt Blöcke zum Zeigersperren hinzu. Die Maus-X- und Maus-Y-Blöcke werden den Unterschied von der vorherigen Frame anzeigen, wenn der Zeiger gesperrt ist. Ersetzt das Pointerlock-Experiment.", "pointerlock@name": "Zeigersperren", @@ -141,6 +152,9 @@ "runtime-options@name": "Laufzeit-Optionen", "shreder95ua/resolution@description": "Erhalte die Auflösung des Hauptbildschirms.", "shreder95ua/resolution@name": "Bildschirmauflösung", + "sound@description": "Töne von URLs abspielen. Früher \"Klänge\" genannt.", + "sound@name": "URL-Wiedergabe", + "steamworks@description": "Verbinde Projekte mit Steamworks APIs.", "stretch@description": "Strecke Figuren horizontal oder vertikal.", "stretch@name": "Strecken", "text@description": "Manipuliere Zeichen und Text.", @@ -159,6 +173,7 @@ "veggiecan/LongmanDictionary@name": "Longman Wörterbuch", "veggiecan/browserfullscreen@description": "Vollbildmodus betreten und verlassen.", "veggiecan/browserfullscreen@name": "Browser Vollbildmodus", + "veggiecan/mobilekeyboard@description": "Zeige die Tastatur auf mobilen Geräten und erhalte die Eingabe der Benutzer, ohne ein Eingabemodal anzuzeigen.", "veggiecan/mobilekeyboard@name": "Mobile Tastatur", "vercte/dictionaries@description": "Nutze die Macht von Dictionaries in deinem Projekt." }, diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 8d6be9f390..0bc6b16651 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -21,12 +21,17 @@ "-SIPC-/consoles@_Time": "Zeit", "-SIPC-/time@_Time": "Zeit", "CST1229/images@_Images": "Bilder", + "CST1229/zip@_name": "Name", "Clay/htmlEncode@_HTML Encode": "HTML-Sicherung", "CubesterYT/KeySimulation@_Key Simulation": "Tastensimulation", + "CubesterYT/TurboHook@_name": "Name", "CubesterYT/WindowControls@_Window Controls": "Fensterkontrolle", "DNin/wake-lock@_Wake Lock": "Bleibe wach", + "DT/cameracontrols@_Camera V1": "Kamera V1", "Lily/AllMenus@_All Menus": "Alle Menüs", "Lily/Assets@_Asset Manager": "Ressourcenverwaltung", + "Lily/Assets@_index": "Index", + "Lily/Assets@_name": "Name", "Lily/Cast@_Cast": "Typen", "Lily/CommentBlocks@_Comment Blocks": "Kommentar Blöcke", "Lily/ListTools@_List Tools": "Listenwerkzeuge", @@ -40,6 +45,7 @@ "NOname-awa/more-comparisons@_More Comparisons": "Mehr Vergleiche", "NexusKitten/controlcontrols@_Control Controls": "Kontrolle der Kontrollleiste", "NexusKitten/moremotion@_More Motion": "Mehr Bewegung", + "SharkPool/Camera@_Camera V2": "Kamera V2", "SharkPool/Camera@_Stage": "Bühne", "SharkPool/Font-Manager@_Font Manager": "Schriftart-Verwaltung", "Skyhigh173/bigint@_Bitwise": "Bitweise", @@ -50,27 +56,38 @@ "TheShovel/LZ-String@_LZ Compress": "LZ-Kompression", "TheShovel/ShovelUtils@_ShovelUtils": "SchaufelUtils", "Xeltalliv/clippingblending@_Clipping & Blending": "Ränder verändern & Farben mischen", + "XeroName/Deltatime@_Delta Time": "Delta-Zeit", "XmerOriginals/closecontrol@_Ask Before Closing Tab": "Frage vor dem Schließen", "ZXMushroom63/searchApi@_Search Params": "URL-Parameter", + "ZXMushroom63/searchApi@_name": "Name", "battery@_Battery": "Batterie", "bitwise@_Bitwise": "Bitweise", "clipboard@_Clipboard": "Zwischenablage", "clouddata-ping@_Ping Cloud Data": "Ping Clouddaten", + "cs2627883/numericalencoding@_Numerical Encoding V1": "Numerische Kodierung V1", "cursor@_Mouse Cursor": "Mauszeiger", "encoding@_Encoding": "Kodieren", "fetch@_Fetch": "Internetquests", "files@_Files": "Dateien", "files@_Select or drop file": "Datei auswählen oder ziehen", "gamejolt@_Close": "Schließen", + "gamejolt@_Open": "Öffnen", + "gamejolt@_adding": "Hinzufügen", + "gamejolt@_index": "Index", + "gamejolt@_name": "Name", + "itchio@_name": "Name", "lab/text@_Animated Text": "Animierter Text", "local-storage@_Local Storage": "Speicherplatz", "mdwalters/notifications@_Notifications": "Benachrichtigungen", + "numerical-encoding-2@_Numerical Encoding V2": "Numerische Codierung V2", "obviousAlexC/penPlus@_Advanced": "Erweitert", "obviousAlexC/penPlus@_Images": "Bilder", "pointerlock@_Pointerlock": "Zeigersperren", "qxsck/data-analysis@name": "Datenanalyse", "qxsck/var-and-list@name": "Variablen und Listen", "runtime-options@_Runtime Options": "Laufzeit-Optionen", + "sound@_URL Playback": "URL-Wiedergabe", + "steamworks@_name": "Name", "stretch@_Stretch": "Strecken", "true-fantom/base@_Base": "Basis", "true-fantom/couplers@_Couplers": "Coupler", From f672a8dd3e9398816b2c8797be02989330a9048b Mon Sep 17 00:00:00 2001 From: yuri-kiss <135030944+yuri-kiss@users.noreply.github.com> Date: Thu, 29 May 2025 22:22:06 -0400 Subject: [PATCH 04/22] Lily/Skins: Fix some fatal loading bugs. (#2128) This causes a lot of errors if it happens repeatedly and can lead to project corruption if handled incorrectly. This fixes some of thoes loading bugs. fixes: #2127 The issue arises from the fact that you can rename / delete / cancel the loading of a costume / skin while its still loading, and the renderer throws and error if that happens at a bad time, Skins doesnt handle this, this aims to fix that issue --------- Co-authored-by: DangoCat[bot] --- extensions/Lily/Skins.js | 131 +++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 25 deletions(-) diff --git a/extensions/Lily/Skins.js b/extensions/Lily/Skins.js index 9968571ce4..b664b1c90a 100644 --- a/extensions/Lily/Skins.js +++ b/extensions/Lily/Skins.js @@ -17,30 +17,66 @@ return true; }; + const vm = Scratch.vm; + const runtime = vm.runtime; + const renderer = runtime.renderer; + const Cast = Scratch.Cast; + + const createSVGSkin = (...args) => { + const skinId = renderer.createSVGSkin(...args); + if (!skinId) return; + const svgSkin = renderer._allSkins[skinId]; + if (!svgSkin) return; + // To prevent a issue in the skin loading we will override the onload event ourself. + const _onload = svgSkin._svgImage.onload; + svgSkin._svgImage.onload = /** + * @this {RenderWebGL.SVGSkin} + */ function (ev) { + // Reimplement the begining logic of SVGSkin to fix a loading error. + if (!this._size) throw "_size race"; + if (this._size[0] === 0 || this._size[1] === 0) { + Object.getPrototypeOf( + vm.renderer.exports.SVGSkin + ).prototype.setEmptyImageData.call(this); + return; + } + const maxDimension = Math.ceil(Math.max(this._size[0], this._size[1])); + const rendererMax = this._renderer.maxTextureDimension; + let testScale = 2; + for ( + testScale; + maxDimension * testScale <= rendererMax; + testScale = testScale * 2 + ) { + this._maxTextureScale = testScale; + } + this.resetMIPs(); + const _rotationCenter = this.calculateRotationCenter(); + if (!Array.isArray(this._rotationCenter)) throw "rotationCenter race"; + return _onload.call(this, ev); + }.bind(svgSkin); + return skinId; + }; + /** * @param {RenderWebGL.SVGSkin} svgSkin - * @returns {Promise} + * @returns {Promise} */ const svgSkinFinishedLoading = (svgSkin) => new Promise((resolve) => { if (svgSkin._svgImageLoaded) { - resolve(); + resolve(true); } else { svgSkin._svgImage.addEventListener("load", () => { - resolve(); + resolve(true); }); svgSkin._svgImage.addEventListener("error", () => { - resolve(); + resolve(false); }); } }); - const vm = Scratch.vm; - const runtime = vm.runtime; - const renderer = runtime.renderer; - const Cast = Scratch.Cast; - - var createdSkins = {}; + const createdSkins = Object.create(null); class Skins { constructor() { @@ -231,6 +267,20 @@ }; } + _disposeSafe(skinId, skinName) { + if (renderer._allSkins[skinId]) renderer.destroySkin(skinId); + if (typeof skinName !== "undefined") { + if (createdSkins[skinName] !== skinId) { + throw new Error( + `Lily/Skins: skinName "${skinName}" mismatched with skinId "${skinId}". actual value of "${ + skinName + }" is "${createdSkins[skinName]}". please report this to the developers` + ); + } + delete createdSkins[skinName]; + } + } + async registerSVGSkin(args) { const skinName = `lms-${Cast.toString(args.NAME)}`; const svgData = Cast.toString(args.SVG); @@ -241,14 +291,18 @@ } // This generally takes a few frames, so yield the block - const skinId = renderer.createSVGSkin(svgData); + const skinId = createSVGSkin(svgData); createdSkins[skinName] = skinId; - await svgSkinFinishedLoading(renderer._allSkins[skinId]); + if (!(await svgSkinFinishedLoading(renderer._allSkins[skinId]))) { + this._disposeSafe(skinId, skinName); + return; + } if (oldSkinId) { - this._refreshTargetsFromID(oldSkinId, false, skinId); - renderer.destroySkin(oldSkinId); + if (renderer._allSkins[oldSkinId]) + this._refreshTargetsFromID(oldSkinId, false, skinId); + this._disposeSafe(oldSkinId); } } @@ -275,11 +329,28 @@ } const skinId = await this._createURLSkin(url, rotationCenter); + const skin = renderer._allSkins[skinId]; + if (!skin || !skin._svgImage || !skin._svgImage.onload) { + this._disposeSafe(skinId); + return; + } + const _onload = skin._svgImage.onload; + skin._svgImage.onload = (...args) => { + try { + return _onload.apply(skin, args); + } catch (err) { + // Handle a race condition. + if (err !== "rotationCenter race") throw err; + this._disposeSafe(skinId, skinName); + return; + } + }; createdSkins[skinName] = skinId; if (oldSkinId) { - this._refreshTargetsFromID(oldSkinId, false, skinId); - renderer.destroySkin(oldSkinId); + if (renderer._allSkins[oldSkinId]) + this._refreshTargetsFromID(oldSkinId, false, skinId); + this._disposeSafe(oldSkinId); } } @@ -297,8 +368,9 @@ createdSkins[skinName] = skinId; if (oldSkinId) { - this._refreshTargetsFromID(oldSkinId, false, skinId); - renderer.destroySkin(oldSkinId); + if (renderer._allSkins[oldSkinId]) + this._refreshTargetsFromID(oldSkinId, false, skinId); + this._disposeSafe(oldSkinId); } } @@ -310,13 +382,18 @@ setSkin(args, util) { const skinName = `lms-${Cast.toString(args.NAME)}`; if (!createdSkins[skinName]) return; + const skinId = createdSkins[skinName]; + // Make sure the skin we are setting still well.. exists. + if (!renderer._allSkins[skinId]) { + this._disposeSafe(skinId, skinName); + return; + } const targetName = Cast.toString(args.TARGET); const target = this._getTargetFromMenu(targetName, util); if (!target) return; const drawableID = target.drawableID; - const skinId = createdSkins[skinName]; renderer._allDrawables[drawableID].skin = renderer._allSkins[skinId]; } @@ -344,7 +421,11 @@ if (!createdSkins[skinName]) return 0; const skinId = createdSkins[skinName]; - if (!skins[skinId]) return 0; + if (!skins[skinId]) { + // If the skin doesnt exist in the renderer we should probably just delete it on our end... + this.safeDispose(skinId, skinName); + return 0; + } const size = skins[skinId].size; const attribute = Cast.toString(args.ATTRIBUTE).toLowerCase(); @@ -366,14 +447,14 @@ this._refreshTargetsFromID(skinId, true); renderer.destroySkin(skinId); - Reflect.deleteProperty(createdSkins, skinName); + delete createdSkins[skinName]; } deleteAllSkins() { this._refreshTargets(); - for (const skinName in createdSkins) - renderer.destroySkin(createdSkins[skinName]); - createdSkins = {}; + for (const skinName in createdSkins) { + this._disposeSafe(createdSkins[skinName], skinName); + } } restoreTargets(args) { @@ -431,7 +512,7 @@ const contentType = imageData.headers.get("Content-Type"); if (contentType === "image/svg+xml") { - return renderer.createSVGSkin(await imageData.text(), rotationCenter); + return createSVGSkin(await imageData.text(), rotationCenter); } else if ( contentType === "image/png" || contentType === "image/jpeg" || From a2c1aa5993409206a028472beaabad6a5c58b4fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 21:22:29 -0500 Subject: [PATCH 05/22] build(deps): bump @turbowarp/types from `b9bcd77` to `9c201e9` (#2132) Bumps [@turbowarp/types](https://github.com/TurboWarp/types-tw) from `b9bcd77` to `9c201e9`.
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 792c4ed943..7e0976c01d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,8 +279,8 @@ }, "node_modules/@turbowarp/types": { "version": "0.0.13", - "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#b9bcd7721069e5f158b5878b2d0ad7cd8c73e04a", - "integrity": "sha512-D139B4PwiRReQrDZ9cuQja/dn5nMOmvzq0wAGPACzvx+r5WRwuUJWuPmAWM2+mQRXrIMmkprDs7uQPXLELDVMQ==", + "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#9c201e96c956c2c00d15edae4ff56c351966b26c", + "integrity": "sha512-6WuQyffxV2a9cKFllOPDMkwbXMkZjG+4llC6Clmm3j4doNy+ZiQMelRLQeXBXocbmoS2b/lS7FtsztoLEv4Upg==", "license": "Apache-2.0" }, "node_modules/@types/estree": { From 7835a140674012e0a9144d3179e427aab0204844 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 21:22:35 -0500 Subject: [PATCH 06/22] build(deps-dev): bump @transifex/api from 7.1.3 to 7.1.4 (#2131) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@transifex/api](https://github.com/transifex/transifex-javascript) from 7.1.3 to 7.1.4.
Release notes

Sourced from @​transifex/api's releases.

v7.1.4

Support React 19

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@transifex/api&package-manager=npm_and_yarn&previous-version=7.1.3&new-version=7.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e0976c01d..ea37eb2d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "@transifex/api": "^7.1.3", + "@transifex/api": "^7.1.4", "eslint": "^9.27.0", "espree": "^9.6.1", "esquery": "^1.6.0", @@ -254,9 +254,9 @@ } }, "node_modules/@transifex/api": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.3.tgz", - "integrity": "sha512-oT6QXhRqduGqDNMfyRK4+u1RrAux0sCJe7rtFvEDc6oDg8h6dIr+2O2o8oSOio6E+JFS9KVrRbCIy2jFsPtRFQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.4.tgz", + "integrity": "sha512-oRWw10V+YPFl1WJuORcQHcjtvqd70lFXxpmXQ/yUn3KE7cLtBMkFeC+2kULw3Rk17hD6EEO2HQLkvpR7NY/Zsw==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index c16781c57b..fa874a9fcf 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "@transifex/api": "^7.1.3", + "@transifex/api": "^7.1.4", "eslint": "^9.27.0", "espree": "^9.6.1", "esquery": "^1.6.0", From 225c0030493f75537be2cd1da66252ad5aeca6f2 Mon Sep 17 00:00:00 2001 From: yuri-kiss <135030944+yuri-kiss@users.noreply.github.com> Date: Fri, 30 May 2025 11:57:43 -0400 Subject: [PATCH 07/22] Lily/Skins: handle the rotationCenter error differently (#2137) this fixes an oversight in the old PR where some svgs may not have the right data, causing a goofy error --- extensions/Lily/Skins.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/Skins.js b/extensions/Lily/Skins.js index b664b1c90a..b08742fc60 100644 --- a/extensions/Lily/Skins.js +++ b/extensions/Lily/Skins.js @@ -51,8 +51,13 @@ this._maxTextureScale = testScale; } this.resetMIPs(); - const _rotationCenter = this.calculateRotationCenter(); - if (!Array.isArray(this._rotationCenter)) throw "rotationCenter race"; + const rotationCenter = this.calculateRotationCenter(); + if (!Array.isArray(rotationCenter)) throw "rotationCenter race"; + if (!Array.isArray(this._rotationCenter)) { + // This can happen if the file is loaded too fast. + // We will handle creating this ourselves to prevent a swarm of errors. + this._rotationCenter = [0, 0]; + } return _onload.call(this, ev); }.bind(svgSkin); return skinId; From 59a0cbf9023e76fb837810cb2320cd9f4e00526c Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Sat, 31 May 2025 17:42:35 -0500 Subject: [PATCH 08/22] [Automated] Update translations 2025-05-31 (#2140) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 2 + translations/extension-runtime.json | 130 ++++++++++++++++++--------- 2 files changed, 90 insertions(+), 42 deletions(-) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index 1714af0b49..decd94d749 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -1414,6 +1414,8 @@ "runtime-options@name": "Опции Выполнения", "shreder95ua/resolution@description": "Получает разрешение основного экрана.", "shreder95ua/resolution@name": "Разрешение Экрана", + "sound@description": "Воспроизведение звуков с URL-адресов. Ранее называлось «Звук».", + "sound@name": "Воспроизведение URL-адреса", "steamworks@description": "Подключите свой проект к Steamworks API.", "stretch@description": "Растягивает спрайты горизонтально или вертикально.", "stretch@name": "Растяжение", diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 0bc6b16651..0b8b2d3358 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -8518,6 +8518,8 @@ "Lily/ClonesPlus@_clone with [INPUTA] set to [INPUTB] exists?": "клон с [INPUTA] значением [INPUTB] существует?", "Lily/ClonesPlus@_costume #": "костюм #", "Lily/ClonesPlus@_costume name": "имя костюма", + "Lily/ClonesPlus@_create clone of myself with [INPUTA] set to [INPUTB]": "создать клон самого себя заданным [INPUTA] значением на [INPUTB]", + "Lily/ClonesPlus@_create clone of original with [INPUTA] set to [INPUTB]": "создать клон оригинала с заданным [INPUTA] значением [INPUTB]", "Lily/ClonesPlus@_delete clones in [INPUT]": "удалить клоны [INPUT]", "Lily/ClonesPlus@_delete clones with [INPUTA] set to [INPUTB]": "удалить клоны с [INPUTA] значением [INPUTB]", "Lily/ClonesPlus@_direction": "направление", @@ -9792,11 +9794,14 @@ "obviousAlexC/penPlus@_add blank image that is [color] and the size of [width], [height] named [name] to Pen+ Library": "добавить пустое изображение с цветом [color] и размером [width], [height] названное [name] в библиотеку Pen+", "obviousAlexC/penPlus@_add image named [name] from [dataURI] to Pen+ Library": "добавить изображение названное [name] из [dataURI] в библиотеку Pen+", "obviousAlexC/penPlus@_allow 'Corner Pinch < 1'": "разрешить \"Угловой Зажим < 1\"", + "obviousAlexC/penPlus@_blue Tint": "синий Оттенок", "obviousAlexC/penPlus@_blue tint": "оттенок синего", "obviousAlexC/penPlus@_brightness": "яркость", + "obviousAlexC/penPlus@_clamp": "клемма", "obviousAlexC/penPlus@_clamp depth value": "значение глубины зажима", "obviousAlexC/penPlus@_clear pen from [name]": "отчистить ручку от [name]", "obviousAlexC/penPlus@_clock-wise": "по-часам", + "obviousAlexC/penPlus@_closest": "ближайшее", "obviousAlexC/penPlus@_color": "цвет", "obviousAlexC/penPlus@_corner pinch": "угловой зажим", "obviousAlexC/penPlus@_counter clock-wise": "числитель по-часам", @@ -9836,6 +9841,7 @@ "obviousAlexC/penPlus@_get value of [component] in vector 4 [uniformName] in [shader]": "получить значение [component] в [uniformName] вектора 4 в [shader] ", "obviousAlexC/penPlus@_get value of matrix [uniformName] in [shader] as an array": "получить значение [uniformName] матрикса в [shader] как массив", "obviousAlexC/penPlus@_get value of number [uniformName] in [shader]": "получить значение [uniformName] числа в [shader]", + "obviousAlexC/penPlus@_green Tint": "зелёный Оттенок", "obviousAlexC/penPlus@_green tint": "оттенок зелёного", "obviousAlexC/penPlus@_height": "высота", "obviousAlexC/penPlus@_hex code": "код hex", @@ -9843,11 +9849,14 @@ "obviousAlexC/penPlus@_hue [H] saturation [S] value [V]": "оттенок [H] насыщенность [S] ценность [V]", "obviousAlexC/penPlus@_linear": "линейно", "obviousAlexC/penPlus@_maximum depth value": "максимальное значение глубины", + "obviousAlexC/penPlus@_mirrored": "отзеркалено", "obviousAlexC/penPlus@_neither way": "ни в коем случае", "obviousAlexC/penPlus@_off": "выключить", "obviousAlexC/penPlus@_on": "включить", + "obviousAlexC/penPlus@_opacity": "непрозрачность", "obviousAlexC/penPlus@_pen [HSV]": "перо [HSV]", "obviousAlexC/penPlus@_pen is down?": "перо опущено?", + "obviousAlexC/penPlus@_red Tint": "красный Оттенок", "obviousAlexC/penPlus@_red [R] green [G] blue [B]": "красный [R] зелёный [G] синий [B]", "obviousAlexC/penPlus@_red tint": "оттенок красного", "obviousAlexC/penPlus@_remove cubemap named [name]": "удалить кубическую карту названной [name]", @@ -9855,6 +9864,7 @@ "obviousAlexC/penPlus@_remove render texture named [name]": "удалить рендер текстур названный [name]", "obviousAlexC/penPlus@_render textures": "рендер текстур", "obviousAlexC/penPlus@_render tris and squares to [name]": "рендер трис и квадратов на [name]", + "obviousAlexC/penPlus@_repeat": "повторять", "obviousAlexC/penPlus@_reset square Attributes": "сбросить Атрибуты квадрата", "obviousAlexC/penPlus@_reset triangle attributes": "сбросить атрибуты треугольника", "obviousAlexC/penPlus@_rotation": "поворот", @@ -9982,6 +9992,7 @@ "shreder95ua/resolution@_Screen resolution": "Разрешение экрана", "shreder95ua/resolution@_primary screen height": "основная высота экрана", "shreder95ua/resolution@_primary screen width": "основная ширина экрана", + "sound@_URL Playback": "Воспроизведение URL-адреса", "sound@_play sound from url: [path] until done": "играть звук из url: [path] до конца", "sound@_start sound from url: [path]": "включить звук из url: [path]", "steamworks@_IP country": "IP страны", @@ -11078,8 +11089,8 @@ "Lily/LooksPlus@_restore content for [COSTUME]": "恢复[COSTUME]的内容", "Lily/LooksPlus@_rotation center x": "旋转中心x", "Lily/LooksPlus@_rotation center y": "旋转中心y", - "Lily/LooksPlus@_set [TYPE] for [COSTUME] to [CONTENT]": "设置[TYPE]的[COSTUME]为[CONTENT]", - "Lily/LooksPlus@_set layer # of [TARGET] to [LAYER]": "[TARGET]的图层序号设为[LAYER]", + "Lily/LooksPlus@_set [TYPE] for [COSTUME] to [CONTENT]": "将[COSTUME]设为[TYPE][CONTENT]", + "Lily/LooksPlus@_set layer # of [TARGET] to [LAYER]": "将[TARGET]的图层序号设为[LAYER]", "Lily/LooksPlus@_show [TARGET]": "显示[TARGET]", "Lily/LooksPlus@_snapshot stage": "舞台截图", "Lily/LooksPlus@_whirl": "漩涡", @@ -11175,8 +11186,8 @@ "Lily/TempVariables2@_for [VAR] in [NUM]": "对于[NUM]中的每个线程变量[VAR]", "Lily/TempVariables2@_runtime var [VAR]": "临时变量[VAR]", "Lily/TempVariables2@_runtime var [VAR] exists?": "临时变量[VAR]是否存在?", - "Lily/TempVariables2@_set runtime var [VAR] to [STRING]": "设置临时变量[VAR]为[STRING]", - "Lily/TempVariables2@_set thread var [VAR] to [STRING]": "设置线程变量[VAR]为[STRING]", + "Lily/TempVariables2@_set runtime var [VAR] to [STRING]": "将临时变量[VAR]设为[STRING]", + "Lily/TempVariables2@_set thread var [VAR] to [STRING]": "将线程变量[VAR]设为[STRING]", "Lily/TempVariables2@_thread var [VAR]": "线程变量[VAR]", "Lily/TempVariables2@_thread var [VAR] exists?": "线程变量[VAR]是否存在?", "Lily/Video@_Video": "视频", @@ -11198,7 +11209,7 @@ "Lily/Video@_resume video [NAME]": "继续视频[NAME]", "Lily/Video@_screenshot of video [NAME] at current time": "视频[NAME]当前时间的截图", "Lily/Video@_set playback rate of video [NAME] to [RATE]": "设置视频[NAME]的播放速度为[RATE]", - "Lily/Video@_set video [NAME] to [LOOP]": "设置视频[NAME]为[LOOP]", + "Lily/Video@_set video [NAME] to [LOOP]": "将视频[NAME]设为[LOOP]", "Lily/Video@_set volume of video [NAME] to [VALUE]": "将视频[NAME]的音量设为[VALUE]", "Lily/Video@_show video [NAME] on [TARGET]": "在[TARGET]上显示视频[NAME]", "Lily/Video@_start video [NAME] at [DURATION] seconds": "从[DURATION]秒开始播放视频[NAME]", @@ -11270,8 +11281,8 @@ "Lily/lmsutils@_replace first [INPUTA] with [INPUTB] in [STRING]": "替换[STRING]中的第一个[INPUTA]为[INPUTB]", "Lily/lmsutils@_reverse [STRING]": "反转[STRING]", "Lily/lmsutils@_screen [DROPDOWN]": "屏幕[DROPDOWN]", - "Lily/lmsutils@_set [STRING] to clipboard": "将[STRING]设置到剪切板", - "Lily/lmsutils@_set username to [INPUT]": "将用户名设置为[INPUT]", + "Lily/lmsutils@_set [STRING] to clipboard": "将[STRING]复制到剪切板", + "Lily/lmsutils@_set username to [INPUT]": "将用户名设为[INPUT]", "Lily/lmsutils@_set variable [INPUTA] to [INPUTB]": "将变量[INPUTA]设为[INPUTB]", "Lily/lmsutils@_sprite clicked?": "角色被点击?", "Lily/lmsutils@_text": "额外数据", @@ -11364,6 +11375,7 @@ "SharkPool/Camera@_Camera V2": "摄像机 V2", "SharkPool/Camera@_New Camera name:": "新摄像机名称:", "SharkPool/Camera@_Remove Camera": "移除摄像机", + "SharkPool/Camera@_Remove Camera named:": "移除摄像机:", "SharkPool/Camera@_Stage": "舞台", "SharkPool/Camera@_[CAMERA] camera x": "[CAMERA]摄像机的x坐标", "SharkPool/Camera@_[CAMERA] camera y": "[CAMERA]摄像机的y坐标", @@ -11376,9 +11388,11 @@ "SharkPool/Camera@_move [CAMERA] camera [NUM] steps": "移动[CAMERA]摄像机[NUM]步", "SharkPool/Camera@_move [CAMERA] camera to [TARGET]": "将[CAMERA]摄像机移到[TARGET]", "SharkPool/Camera@_myself": "自己", + "SharkPool/Camera@_set [CAMERA] camera direction to [NUM]": "将[CAMERA]摄像机的方向设为[NUM]", "SharkPool/Camera@_set [CAMERA] camera to x: [X] y: [Y]": "将[CAMERA]摄像机移到 x:[X]y:[Y]", "SharkPool/Camera@_set [CAMERA] camera x to [NUM]": "将[CAMERA]摄像机的x坐标设为[NUM]", "SharkPool/Camera@_set [CAMERA] camera y to [NUM]": "将[CAMERA]摄像机的y坐标设为[NUM]", + "SharkPool/Camera@_set [CAMERA] camera zoom to [NUM]%": "将[CAMERA]摄像机的缩放设为[NUM]%", "SharkPool/Camera@_set background color to [COLOR]": "将背景颜色设为[COLOR]", "SharkPool/Camera@_unbind [TARGET] from camera [CAMERA]": "将[TARGET]从摄像机[CAMERA]解绑", "SharkPool/Font-Manager@_Font Manager": "字体管理", @@ -11407,45 +11421,54 @@ "Skyhigh173/bigint@_convert BigInt [text] to number": "将BigInt[text]转为数字", "Skyhigh173/bigint@_convert number [text] to BigInt": "将数字[text]转为BigInt", "Skyhigh173/json@_Advanced": "高级", + "Skyhigh173/json@_Array": "数组", "Skyhigh173/json@_General Utils": "通用", "Skyhigh173/json@_Lists": "原版列表", + "Skyhigh173/json@_[analysis] of array [list]": "数组[list]的[analysis]", "Skyhigh173/json@_[json1] [equal] [json2]": "[json1][equal][json2]", "Skyhigh173/json@_[json] contains key [key]?": "[json]包括键[key]?", "Skyhigh173/json@_[json] contains value [value]?": "[json]包括值[value]?", - "Skyhigh173/json@_add [item] to array [json]": "向Array[json]添加[item]", + "Skyhigh173/json@_add [item] to array [json]": "将[item]加入数组[json]", "Skyhigh173/json@_all [Stype] of [json]": "[json]的所有[Stype]", - "Skyhigh173/json@_array concat [json] [json2]": "合并Array[json]和[json2]", - "Skyhigh173/json@_array from text [json]": "来自字符串[json]的Array", + "Skyhigh173/json@_array concat [json] [json2]": "合并数组[json]和[json2]", + "Skyhigh173/json@_array from text [json]": "来自文本[json]的数组", "Skyhigh173/json@_ascending": "正序", - "Skyhigh173/json@_create array by [text] with delimiter [d]": "以[d]分割字符串[text]作为Array", + "Skyhigh173/json@_average": "平均值", + "Skyhigh173/json@_create array by [text] with delimiter [d]": "以[d]分割字符串[text]为数组", "Skyhigh173/json@_datas": "数据", "Skyhigh173/json@_delete [item] in [json]": "删除[json]中的[item]", - "Skyhigh173/json@_delete all [item] in array [json]": "删除Array[json]的所有[item]", - "Skyhigh173/json@_delete item [item] of array [json]": "删除Array[json]的第[item]项", + "Skyhigh173/json@_delete all [item] in array [json]": "删除数组[json]中的所有[item]", + "Skyhigh173/json@_delete item [item] of array [json]": "删除数组[json]的第[item]项", "Skyhigh173/json@_descending": "倒序", - "Skyhigh173/json@_flat array [json] by depth [depth]": "按照深度[depth]平面化Array[json]", - "Skyhigh173/json@_get all values with key [key] in array [json]": "获取Array[json]中所有[key]的值", + "Skyhigh173/json@_flat array [json] by depth [depth]": "的扁平化数组[json][depth]层", + "Skyhigh173/json@_get all values with key [key] in array [json]": "获取数组[json]中所有[key]的值", "Skyhigh173/json@_get list [list] as array": "获取原版列表[list]", - "Skyhigh173/json@_insert [item] at [pos] of array [json]": "在Array[json]的第[pos]项前插入[item]", + "Skyhigh173/json@_insert [item] at [pos] of array [json]": "在数组[json]的第[pos]项前插入[item]", "Skyhigh173/json@_is JSON [json] valid?": "[json]是合法JSON?", "Skyhigh173/json@_is [json] [types]?": "[json]是[types]?", - "Skyhigh173/json@_item # of [item] in array [json]": "Array[json]中第一个[item]的位置", - "Skyhigh173/json@_item [item] of array [json]": "Array[json]的第[item]项", - "Skyhigh173/json@_items [item] to [item2] of array [json]": "Array[json]的第[item]到第[item2]项", - "Skyhigh173/json@_join string by array [json] with delimiter [d]": "以[d]合并Array[json]", + "Skyhigh173/json@_item # of [item] in array [json]": "数组[json]中[item]的位置", + "Skyhigh173/json@_item [item] of array [json]": "数组[json]的第[item]项", + "Skyhigh173/json@_items [item] to [item2] of array [json]": "数组[json]的[item]到[item2]项", + "Skyhigh173/json@_join string by array [json] with delimiter [d]": "将数组[json]用分隔符[d]连成字符串", "Skyhigh173/json@_keys": "键", - "Skyhigh173/json@_length of array [json]": "Array[json]的长度", + "Skyhigh173/json@_length of array [json]": "数组[json]的长度", "Skyhigh173/json@_length of json [json]": "JSON[json]的长度", + "Skyhigh173/json@_maximum value": "最大值", + "Skyhigh173/json@_median": "中位数", + "Skyhigh173/json@_minimum value": "最小值", + "Skyhigh173/json@_mode": "众数", "Skyhigh173/json@_new [json]": "新[json]", "Skyhigh173/json@_replace item [pos] of [json] with [item]": "替换Array[json]的第[pos]项为[item]", - "Skyhigh173/json@_reverse array [json]": "反转Array[json]", + "Skyhigh173/json@_reverse array [json]": "反转数组[json]", "Skyhigh173/json@_select a list": "请选择一个列表", - "Skyhigh173/json@_set [item] in [json] to [value]": "设置[json]中的[item]为[value]", - "Skyhigh173/json@_set length of array [json] to [len]": "设置Array[json]的长度为[len]", - "Skyhigh173/json@_set list [list] to [json]": "设置原版列表[list]为[json]", - "Skyhigh173/json@_sort array [list] in [order] order": "以[order]排序Array[list]", + "Skyhigh173/json@_set [item] in [json] to [value]": "将[json]中的[item]设为[value]", + "Skyhigh173/json@_set length of array [json] to [len]": "将数组[json]的长度设为[len]", + "Skyhigh173/json@_set list [list] to [json]": "将列表[list]设为[json]", + "Skyhigh173/json@_sort array [list] in [order] order": "以[order]排列数组[list]", + "Skyhigh173/json@_sum": "和", "Skyhigh173/json@_value of [item] in [json]": "[json]中的[item]", "Skyhigh173/json@_values": "值", + "Skyhigh173/json@_variance": "方差", "TheShovel/CanvasEffects@_Canvas Effects": "Canvas 特效", "TheShovel/CanvasEffects@_background": "背景", "TheShovel/CanvasEffects@_blur": "模糊", @@ -11455,6 +11478,7 @@ "TheShovel/CanvasEffects@_border width": "边缘宽", "TheShovel/CanvasEffects@_brightness": "亮度", "TheShovel/CanvasEffects@_change canvas [EFFECT] by [NUMBER]": "将画布[EFFECT]增加[NUMBER]", + "TheShovel/CanvasEffects@_clear canvas effects": "清除画布效果", "TheShovel/CanvasEffects@_color shift": "颜色偏移", "TheShovel/CanvasEffects@_contrast": "对比度", "TheShovel/CanvasEffects@_dashed": "虚线", @@ -11478,8 +11502,8 @@ "TheShovel/CanvasEffects@_scale X": "X 缩放", "TheShovel/CanvasEffects@_scale Y": "Y 缩放", "TheShovel/CanvasEffects@_sepia": "深褐色", - "TheShovel/CanvasEffects@_set canvas [EFFECT] to [NUMBER]": "设置画布[EFFECT]为[NUMBER]", - "TheShovel/CanvasEffects@_set canvas border to [WIDTH] pixels [STYLE] with color [COLOR1] and background [COLOR2]": "将画布边框设置为[WIDTH]像素[STYLE]样式,颜色为[COLOR1]背景颜色为[COLOR2]", + "TheShovel/CanvasEffects@_set canvas [EFFECT] to [NUMBER]": "将画布[EFFECT]设为[NUMBER]", + "TheShovel/CanvasEffects@_set canvas border to [WIDTH] pixels [STYLE] with color [COLOR1] and background [COLOR2]": "将画布边框设为[WIDTH]像素[STYLE]样式,颜色为[COLOR1]背景颜色为[COLOR2]", "TheShovel/CanvasEffects@_set canvas render size to width: [X] height: [Y]": "设置画布渲染尺寸为宽:[X]高:[Y]", "TheShovel/CanvasEffects@_set canvas resize rendering mode [EFFECT]": "设置画布重设尺寸渲染模式为[EFFECT]", "TheShovel/CanvasEffects@_skew X": "X 倾斜", @@ -11493,8 +11517,8 @@ "TheShovel/ColorPicker@_hex": "Hex", "TheShovel/ColorPicker@_picker [COORD] position": "取色器[COORD]坐标", "TheShovel/ColorPicker@_red": "红色", - "TheShovel/ColorPicker@_set picker color to [COLOR]": "设置取色器颜色为[COLOR]", - "TheShovel/ColorPicker@_set picker position to x: [X] y: [Y]": "设置取色器位置为 x: [X] y: [Y]", + "TheShovel/ColorPicker@_set picker color to [COLOR]": "将取色器颜色设为[COLOR]", + "TheShovel/ColorPicker@_set picker position to x: [X] y: [Y]": "将取色器位置x:[X]y:[Y]", "TheShovel/ColorPicker@_show color picker": "显示取色器", "TheShovel/ColorPicker@_when color changed": "当颜色改变", "TheShovel/CustomStyles@_Custom Styles": "自定义样式", @@ -11530,13 +11554,13 @@ "TheShovel/CustomStyles@_monitor border color": "显示器边框颜色", "TheShovel/CustomStyles@_monitor text": "显示器文字", "TheShovel/CustomStyles@_reset styles": "重置样式", - "TheShovel/CustomStyles@_set [COLORABLE] to [COLOR]": "设置[COLORABLE]为[COLOR]", + "TheShovel/CustomStyles@_set [COLORABLE] to [COLOR]": "将[COLORABLE]设为[COLOR]", "TheShovel/CustomStyles@_set ask prompt button image to [URL]": "将询问按钮的图片设置为[URL]", - "TheShovel/CustomStyles@_set border width of [BORDER] to [SIZE]": "设置[BORDER]的边框宽度为[SIZE]", - "TheShovel/CustomStyles@_set list scrolling to [SCROLLRULE]": "设置列表能否滚动[SCROLLRULE]", + "TheShovel/CustomStyles@_set border width of [BORDER] to [SIZE]": "将[BORDER]的边框宽度设为[SIZE]", + "TheShovel/CustomStyles@_set list scrolling to [SCROLLRULE]": "将列表滚动设为[SCROLLRULE]", "TheShovel/CustomStyles@_set position of list [NAME] to x: [X] y: [Y]": "将列表 [NAME]的位置设为 x: [X] y: [Y]", "TheShovel/CustomStyles@_set position of variable [NAME] to x: [X] y: [Y]": "将变量 [NAME]的位置设为 x: [X] y: [Y]", - "TheShovel/CustomStyles@_set roundness of [CORNER] to [SIZE]": "设置[CORNER]的圆角为[SIZE]", + "TheShovel/CustomStyles@_set roundness of [CORNER] to [SIZE]": "将[CORNER]的圆角设为[SIZE]", "TheShovel/CustomStyles@_transparent": "透明", "TheShovel/CustomStyles@_variable value": "变量值", "TheShovel/CustomStyles@_variable value background": "变量值背景", @@ -11560,7 +11584,7 @@ "TheShovel/ShovelUtils@_load extension from [TEXT]": "从[TEXT]加载拓展", "TheShovel/ShovelUtils@_restart project": "重新运行作品", "TheShovel/ShovelUtils@_set editing target to [NAME]": "将当前编辑角色设置为[NAME]", - "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "设置原版列表[NAME]为[TEXT]", + "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "设置列表[NAME]为[TEXT]", "Xeltalliv/clippingblending@_Clipping & Blending": "裁剪与颜色混合", "Xeltalliv/clippingblending@_additive": "加法", "Xeltalliv/clippingblending@_blending": "混合模式", @@ -11577,7 +11601,7 @@ "Xeltalliv/clippingblending@_multiply": "正片叠底", "Xeltalliv/clippingblending@_off": "关闭", "Xeltalliv/clippingblending@_on": "打开", - "Xeltalliv/clippingblending@_set clipping box x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]": "设置裁剪框 x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]", + "Xeltalliv/clippingblending@_set clipping box x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]": "将裁剪框设为x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]", "Xeltalliv/clippingblending@_subtract": "差值", "Xeltalliv/clippingblending@_turn additive blending [STATE]": "加法混合 [STATE]", "Xeltalliv/clippingblending@_use [BLENDMODE] blending": "使用[BLENDMODE]混合模式", @@ -11587,7 +11611,7 @@ "XmerOriginals/closecontrol@_ask before closing tab enabled?": "关闭页面时询问已启用?", "XmerOriginals/closecontrol@_disabled": "禁用", "XmerOriginals/closecontrol@_enabled": "启用", - "XmerOriginals/closecontrol@_set ask before closing tab to [OPTION]": "设置关闭页面时询问为[OPTION]", + "XmerOriginals/closecontrol@_set ask before closing tab to [OPTION]": "将关闭页面时询问设为[OPTION]", "ZXMushroom63/searchApi@_Search Params": "搜索参数", "ZXMushroom63/searchApi@_append search parameter [ID] with value [VAL]": "添加搜索参数[ID]值为[VAL]", "ZXMushroom63/searchApi@_delete search parameter [ID]": "删除搜索参数[ID]", @@ -11597,7 +11621,7 @@ "ZXMushroom63/searchApi@_name": "名字", "ZXMushroom63/searchApi@_occurrences of search parameter [ID]": "搜索参数[ID]的出现次数", "ZXMushroom63/searchApi@_search parameter [PARAM] at index [I]": "第[I]个搜索参数的[PARAM]", - "ZXMushroom63/searchApi@_set search parameter [ID] to [VAL]": "设置搜索参数[ID]为[VAL]", + "ZXMushroom63/searchApi@_set search parameter [ID] to [VAL]": "将搜索参数[ID]设为[VAL]", "ZXMushroom63/searchApi@_value": "值", "ZXMushroom63/searchApi@_value of search parameter [ID]": "搜索参数[ID]的值", "ar@_combined": "组合", @@ -11614,7 +11638,7 @@ "ar@_pose": "姿态", "ar@_position [POSITION_COMPONENT]": "坐标[POSITION_COMPONENT]", "ar@_projection": "投影", - "ar@_set resolution [RESOLUTION]": "设置分辨率[RESOLUTION]", + "ar@_set resolution [RESOLUTION]": "将分辨率设为[RESOLUTION]", "ar@_stage height": "舞台高", "ar@_stage width": "舞台宽", "ar@_turn everything by r:[R] i:[I] j:[J] k:[K]": "将所有东西旋转 r:[R] i:[I] j:[J] k:[K]", @@ -11657,16 +11681,16 @@ "box2d@griffpatch.setDensityValue": "设置密度为[density] ", "box2d@griffpatch.setFriction": "设置摩擦力为[friction]", "box2d@griffpatch.setFrictionValue": "设置摩擦力为[friction] ", - "box2d@griffpatch.setGravity": "设置重力方向为x[gx] y[gy]", + "box2d@griffpatch.setGravity": "将重力方向设为x:[gx] y:[gy]", "box2d@griffpatch.setPhysics": "设置[shape]的物理模式为[mode]", "box2d@griffpatch.setPosition": "在[space]前往x[x] y[y]", "box2d@griffpatch.setProperties": "设置密度为[density] 摩擦力为[friction] 弹性为[restitution]", "box2d@griffpatch.setRestitution": "设置弹性为[restitution]", "box2d@griffpatch.setRestitutionValue": "设置弹性为[restitution] ", "box2d@griffpatch.setScroll": "设置边界为 x[ox] y[oy]", - "box2d@griffpatch.setStage": "设置舞台类型为[stageType]", + "box2d@griffpatch.setStage": "将舞台类型设为[stageType]", "box2d@griffpatch.setStatic": "设置移动模式为[static]", - "box2d@griffpatch.setTickRate": "设置每秒模拟次数为[rate]", + "box2d@griffpatch.setTickRate": "将每秒模拟次数设为[rate]", "box2d@griffpatch.setVelocity": "设置角色重力方向为 sx[sx] sy [sy]", "clipboard@_Clipboard": "剪切板", "clipboard@_clipboard": "最新复制的文本", @@ -11950,8 +11974,10 @@ "godslayerakp/http@_Response": "响应", "godslayerakp/http@_Show Extra": "显示更多", "godslayerakp/http@_[name] from header": "请求头的[name]", + "godslayerakp/http@_[name] in multipart form": "multipart form 中的[name]", "godslayerakp/http@_[path] in request options": "请求选项的[path]", "godslayerakp/http@_clear current data": "清空当前数据", + "godslayerakp/http@_delete [name] from multipart form": "删除 multipart form 中的[name]", "godslayerakp/http@_error": "错误", "godslayerakp/http@_headers as json": "请求头json", "godslayerakp/http@_in header set [name] to [value]": "在请求头中设置[name]为[value]", @@ -11959,11 +11985,13 @@ "godslayerakp/http@_request succeeded?": "请求成功?", "godslayerakp/http@_response": "响应", "godslayerakp/http@_send request to [url]": "发送请求给[url]", + "godslayerakp/http@_set [name] to [value] in multipart form": "将 multipart form 中的[name]设为[value]", "godslayerakp/http@_set [path] to [value] in request options": "将请求选项中的[path]设为[value]", "godslayerakp/http@_set [path] to type [type] in request options": "将请求选项的[path]设为类型[type]", "godslayerakp/http@_set content type to [type]": "设置内容类型为[type]", "godslayerakp/http@_set headers to json [json]": "设置请求头为json[json]", "godslayerakp/http@_set request body to [text]": "设置请求体为[text]", + "godslayerakp/http@_set request body to multipart form": "将请求体设为 multipart form", "godslayerakp/http@_set request method to [method]": "设置请求方法为[method]", "godslayerakp/http@_site responded?": "网站响应?", "godslayerakp/http@_status": "封禁状态", @@ -12071,6 +12099,9 @@ "lab/text@_right": "居右", "lab/text@_set [ANIMATE] duration to [NUM] seconds": "设置动画样式[ANIMATE]的完成时间是[NUM]秒", "lab/text@_set font to [FONT]": "设置文本的字体为[FONT]", + "lab/text@_set outline color to [COLOR]": "将轮廓颜色设为[COLOR]", + "lab/text@_set outline width to [WIDTH]": "将轮廓大小设为[WIDTH]", + "lab/text@_set shake intensity to [NUM]%": "将抖动强度设为[NUM]%", "lab/text@_set text color to [COLOR]": "设置文本的颜色为[COLOR]", "lab/text@_set typing delay to [NUM] seconds": "设置逐字显示速度为[NUM]秒/字", "lab/text@_set width to [WIDTH]": "设置文本的宽度为[WIDTH]", @@ -12143,6 +12174,10 @@ "obviousAlexC/SensingPlus@_No sprites exist": "没有角色", "obviousAlexC/SensingPlus@_Sensing+": "侦测 +", "obviousAlexC/SensingPlus@_Speech recording is unreliable": "语音录制是不可靠的", + "obviousAlexC/SensingPlus@_Tap to allow access to accelerometer and gyroscope.": "点击以允许访问加速度计和陀螺仪。", + "obviousAlexC/SensingPlus@_To allow accelerometer and gyroscope access, open iOS settings > Apps > Safari > Advanced > Website Data > press Edit > Clear data for {domain}, then refresh this page.": "要允许访问加速度计和陀螺仪,请打开 iOS 设置> 应用程序> Safari >高级>网站数据>编辑>清除{domain}的数据,然后刷新此页面。", + "obviousAlexC/SensingPlus@_[type] on the [axis] axis": "[axis]轴上的[type]", + "obviousAlexC/SensingPlus@_acceleration": "加速度", "obviousAlexC/SensingPlus@_accelerometer": "加速度计", "obviousAlexC/SensingPlus@_brightness": "亮度", "obviousAlexC/SensingPlus@_color": "颜色", @@ -12394,6 +12429,7 @@ "rixxyx@_if [BOOL] then [TEXT_1] else [TEXT_2]": "如果[BOOL]那么[TEXT_1]否则[TEXT_2]", "rixxyx@_increment counter by [NUM]": "将计数器增加[NUM]", "rixxyx@_is javascript NaN [OBJ]": "是 javascript NaN [OBJ]", + "rixxyx@_parse JSON [TEXT]": "解析 JSON[TEXT]", "rixxyx@_repeat text [TEXT] [NUM] times": "重复文字[TEXT][NUM]次", "rixxyx@_reverse text [TEXT]": "反转文字[TEXT]", "rixxyx@_rixxyX is cool, right?": "rixxyX 很酷,不是吗?", @@ -12457,11 +12493,16 @@ "stretch@_y stretch": "y拉伸", "text@_Exactly Title Case": "精确标题", "text@_MiXeD CaSe": "混合大小写", + "text@_RAndoMCaSe": "随机大小写", + "text@_Sentence case": "句首大写", "text@_Text": "文本", "text@_Title Case": "标题", "text@_UPPERCASE": "大写", + "text@_[STRING] [POSITION]s with [SUBSTRING]?": "[STRING]以[SUBSTRING][POSITION]?", "text@_[STRING] matches regex /[REGEX]/[FLAGS]?": "[STRING] 满足正则表达式 /[REGEX]/[FLAGS]?", "text@_apple": "苹果", + "text@_both sides": "两边", + "text@_camelCase": "驼峰式命名", "text@_convert [STRING] to [TEXTCASE]": "转换[STRING]为[TEXTCASE]", "text@_count [SUBSTRING] in [STRING]": "[STRING]中[SUBSTRING]的数量", "text@_count regex /[REGEX]/[FLAGS] in [STRING]": "使用正则表达式 /[REGEX]/[FLAGS] 在 [STRING] 匹配的数量", @@ -12476,6 +12517,11 @@ "text@_repeat [STRING] [REPEAT] times": "重复[REPEAT]个[STRING]", "text@_replace [SUBSTRING] in [STRING] with [REPLACE]": "替换[STRING]中的[SUBSTRING]为[REPLACE]", "text@_replace regex /[REGEX]/[FLAGS] in [STRING] with [REPLACE]": "使用正则表达式 /[REGEX]/[FLAGS] 在 [STRING]中替换为 [REPLACE]", + "text@_reverse text [STRING]": "反转文本[STRING]", + "text@_start": "开头", + "text@_the end": "末尾", + "text@_the start": "开头", + "text@_trim whitespace [STRING] from [METHOD]": "去除[STRING]中[METHOD]的空格", "text@_unicode [NUM] as letter": "unicode[NUM]对应的字符", "text@_unicode of [STRING]": "[STRING]的unicode", "true-fantom/base@_Base": "进制转换", From 589a09e6602f08da29706adcc20507419bce7f32 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Wed, 4 Jun 2025 10:50:44 -0500 Subject: [PATCH 09/22] [Automated] Update translations 2025-06-04 (#2143) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-runtime.json | 197 ++++++++++++++-------------- 1 file changed, 101 insertions(+), 96 deletions(-) diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 0b8b2d3358..6988d99a7c 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -10767,7 +10767,7 @@ "-SIPC-/time@_years": "年", "0832/rxFS2@clean": "清空文件系统", "0832/rxFS2@del": "删除 [STR]", - "0832/rxFS2@folder": "设置 [STR] 为 [STR2]", + "0832/rxFS2@folder": "将[STR]设为[STR2]", "0832/rxFS2@folder_default": "rxFS 好用!", "0832/rxFS2@in": "从 [STR] 导入文件系统", "0832/rxFS2@list": "列出 [STR] 下的所有文件", @@ -10841,8 +10841,8 @@ "CST1229/zip@_remove all archives": "关闭所有存档", "CST1229/zip@_remove current archive": "关闭当前存档", "CST1229/zip@_rename [FROM] to [TO]": "重命名[FROM]为[TO] ", - "CST1229/zip@_set [META] of [FILE] to [VALUE]": "设置[FILE]的[META]为[VALUE]", - "CST1229/zip@_set archive comment to [COMMENT]": "设置注释为[COMMENT]", + "CST1229/zip@_set [META] of [FILE] to [VALUE]": "将[FILE]的[META]设为[VALUE]", + "CST1229/zip@_set archive comment to [COMMENT]": "将注释设为[COMMENT]", "CST1229/zip@_string": "字符串", "CST1229/zip@_switch to archive named [NAME]": "切换存档到[NAME]", "CST1229/zip@_text": "文本", @@ -10906,11 +10906,11 @@ "CubesterYT/WindowControls@_right": "居右", "CubesterYT/WindowControls@_screen height": "屏幕高度", "CubesterYT/WindowControls@_screen width": "屏幕宽度", - "CubesterYT/WindowControls@_set window height to [H]": "设置页面的高为[H]", - "CubesterYT/WindowControls@_set window title to [TITLE]": "设置页面标题为[TITLE]", - "CubesterYT/WindowControls@_set window width to [W]": "设置页面的宽为[W]", - "CubesterYT/WindowControls@_set window x to [X]": "设置页面的x坐标为[X]", - "CubesterYT/WindowControls@_set window y to [Y]": "设置页面的y坐标为[Y]", + "CubesterYT/WindowControls@_set window height to [H]": "将窗口的高设为[H]", + "CubesterYT/WindowControls@_set window title to [TITLE]": "将窗口标题设为[TITLE]", + "CubesterYT/WindowControls@_set window width to [W]": "将窗口的宽设为[W]", + "CubesterYT/WindowControls@_set window x to [X]": "将窗口的x坐标设为[X]", + "CubesterYT/WindowControls@_set window y to [Y]": "将窗口的y坐标设为[Y]", "CubesterYT/WindowControls@_top": "顶部", "CubesterYT/WindowControls@_top left": "顶部左侧", "CubesterYT/WindowControls@_top right": "顶部右侧", @@ -10924,7 +10924,7 @@ "DNin/wake-lock@_is wake lock active?": "唤醒锁激活了?", "DNin/wake-lock@_off": "关闭", "DNin/wake-lock@_on": "打开", - "DNin/wake-lock@_turn wake lock [enabled]": "设置唤醒锁状态为[enabled]", + "DNin/wake-lock@_turn wake lock [enabled]": "将唤醒锁状态设为[enabled]", "DT/cameracontrols@_Camera V1": "摄像机 V1", "DT/cameracontrols@_background color": "背景颜色", "DT/cameracontrols@_camera direction": "摄像机的方向", @@ -10938,12 +10938,12 @@ "DT/cameracontrols@_move camera to [sprite]": "移动摄像机到角色[sprite]", "DT/cameracontrols@_no sprites exist": "没有角色", "DT/cameracontrols@_point camera towards [sprite]": "摄像机面向[sprite]", - "DT/cameracontrols@_set background color to [val]": "设置背景颜色为[val]", - "DT/cameracontrols@_set camera direction to [val]": "设置摄像机的方向为[val]", - "DT/cameracontrols@_set camera to x: [x] y: [y]": "设置摄像机的坐标为x[x] y[y]", - "DT/cameracontrols@_set camera x to [val]": "设置摄像机的x坐标为[val]", - "DT/cameracontrols@_set camera y to [val]": "设置摄像机的y坐标为[val]", - "DT/cameracontrols@_set camera zoom to [val] %": "设置摄像机视野为[val]%", + "DT/cameracontrols@_set background color to [val]": "将背景颜色设为[val]", + "DT/cameracontrols@_set camera direction to [val]": "将摄像机的方向设为[val]", + "DT/cameracontrols@_set camera to x: [x] y: [y]": "将摄像机的坐标设为x:[x] y:[y]", + "DT/cameracontrols@_set camera x to [val]": "将摄像机的x坐标设为[val]", + "DT/cameracontrols@_set camera y to [val]": "将摄像机的y坐标设为[val]", + "DT/cameracontrols@_set camera zoom to [val] %": "将摄像机视野设为[val]%", "DT/cameracontrols@_stage to world x: [x]": "舞台到世界x:[x]", "DT/cameracontrols@_stage to world y: [y]": "舞台到世界y:[y]", "DT/cameracontrols@_turn camera [image] [val] degrees": "摄像机[image][val]度", @@ -11025,7 +11025,7 @@ "Lily/ClonesPlus@_is clone?": "是克隆体?", "Lily/ClonesPlus@_myself": "自己", "Lily/ClonesPlus@_set variable [INPUTA] to [INPUTB] for clones with [INPUTC] set to [INPUTD]": "将满足[INPUTC]为[INPUTD]的克隆体的变量[INPUTA]设为[INPUTB]", - "Lily/ClonesPlus@_set variable [INPUTA] to [INPUTB] for main sprite": "设置角色本体的变量[INPUTA]为[INPUTB]", + "Lily/ClonesPlus@_set variable [INPUTA] to [INPUTB] for main sprite": "将角色本体的变量[INPUTA]设为[INPUTB]", "Lily/ClonesPlus@_size": "大小", "Lily/ClonesPlus@_stop scripts in [INPUT]": "停止[INPUT]中的脚本", "Lily/ClonesPlus@_stop scripts in clones with [INPUTA] set to [INPUTB]": "停止[INPUTA]为[INPUTB]的克隆体的脚本", @@ -11064,8 +11064,8 @@ "Lily/ListTools@_replace all [ITEM1] with [ITEM2] in [LIST]": "将[LIST]中的所有[ITEM1]替换为[ITEM2]", "Lily/ListTools@_reversed": "反转", "Lily/ListTools@_set [LIST] to array [ARRAY]": "将[LIST]设为数组[ARRAY]", - "Lily/ListTools@_set items of [LIST1] to [LIST2]": "将[LIST1]中的内容设置为[LIST2]", - "Lily/ListTools@_set order of [LIST] to [ORDER]": "将[LIST]的顺序设置为[ORDER]", + "Lily/ListTools@_set items of [LIST1] to [LIST2]": "将[LIST1]中的内容设为[LIST2]", + "Lily/ListTools@_set order of [LIST] to [ORDER]": "将[LIST]的顺序设为[ORDER]", "Lily/LooksPlus@_# of costumes in [TARGET]": "[TARGET]的造型数量", "Lily/LooksPlus@_Looks+": "外观+", "Lily/LooksPlus@_[ATTRIBUTE] of [COSTUME]": "[COSTUME]的[ATTRIBUTE]", @@ -11208,7 +11208,7 @@ "Lily/Video@_playing": "播放", "Lily/Video@_resume video [NAME]": "继续视频[NAME]", "Lily/Video@_screenshot of video [NAME] at current time": "视频[NAME]当前时间的截图", - "Lily/Video@_set playback rate of video [NAME] to [RATE]": "设置视频[NAME]的播放速度为[RATE]", + "Lily/Video@_set playback rate of video [NAME] to [RATE]": "将视频[NAME]的播放速度设为[RATE]", "Lily/Video@_set video [NAME] to [LOOP]": "将视频[NAME]设为[LOOP]", "Lily/Video@_set volume of video [NAME] to [VALUE]": "将视频[NAME]的音量设为[VALUE]", "Lily/Video@_show video [NAME] on [TARGET]": "在[TARGET]上显示视频[NAME]", @@ -11306,7 +11306,7 @@ "Longboost/color_channels@_only draw [COLOR]": "只绘制[COLOR]", "Longboost/color_channels@_only draw colors:[R] green:[G] blue:[B]": "只绘制颜色 红:[R]绿:[G]蓝:[B]", "Longboost/color_channels@_red": "红色", - "Longboost/color_channels@_set colors red:[R] green:[G] blue:[B]": "设置颜色 红:[R]绿:[G]蓝:[B]", + "Longboost/color_channels@_set colors red:[R] green:[G] blue:[B]": "将颜色设为红:[R]绿:[G]蓝:[B]", "Longboost/color_channels@_true": "真", "NOname-awa/graphics2d@area": "面积", "NOname-awa/graphics2d@circumference": "周长", @@ -11385,6 +11385,8 @@ "SharkPool/Camera@_change [CAMERA] camera x by [NUM]": "将[CAMERA]摄像机的x坐标增加[NUM]", "SharkPool/Camera@_change [CAMERA] camera y by [NUM]": "将[CAMERA]摄像机的y坐标增加[NUM]", "SharkPool/Camera@_default": "默认类型", + "SharkPool/Camera@_mouse x in camera [CAMERA]": "摄像机[CAMERA]中的鼠标x", + "SharkPool/Camera@_mouse y in camera [CAMERA]": "摄像机[CAMERA]中的鼠标y", "SharkPool/Camera@_move [CAMERA] camera [NUM] steps": "移动[CAMERA]摄像机[NUM]步", "SharkPool/Camera@_move [CAMERA] camera to [TARGET]": "将[CAMERA]摄像机移到[TARGET]", "SharkPool/Camera@_myself": "自己", @@ -11504,8 +11506,8 @@ "TheShovel/CanvasEffects@_sepia": "深褐色", "TheShovel/CanvasEffects@_set canvas [EFFECT] to [NUMBER]": "将画布[EFFECT]设为[NUMBER]", "TheShovel/CanvasEffects@_set canvas border to [WIDTH] pixels [STYLE] with color [COLOR1] and background [COLOR2]": "将画布边框设为[WIDTH]像素[STYLE]样式,颜色为[COLOR1]背景颜色为[COLOR2]", - "TheShovel/CanvasEffects@_set canvas render size to width: [X] height: [Y]": "设置画布渲染尺寸为宽:[X]高:[Y]", - "TheShovel/CanvasEffects@_set canvas resize rendering mode [EFFECT]": "设置画布重设尺寸渲染模式为[EFFECT]", + "TheShovel/CanvasEffects@_set canvas render size to width: [X] height: [Y]": "将画布渲染尺寸设为宽:[X]高:[Y]", + "TheShovel/CanvasEffects@_set canvas resize rendering mode [EFFECT]": "将画布重设尺寸渲染模式设为[EFFECT]", "TheShovel/CanvasEffects@_skew X": "X 倾斜", "TheShovel/CanvasEffects@_skew Y": "Y 倾斜", "TheShovel/CanvasEffects@_solid": "实线", @@ -11555,7 +11557,7 @@ "TheShovel/CustomStyles@_monitor text": "显示器文字", "TheShovel/CustomStyles@_reset styles": "重置样式", "TheShovel/CustomStyles@_set [COLORABLE] to [COLOR]": "将[COLORABLE]设为[COLOR]", - "TheShovel/CustomStyles@_set ask prompt button image to [URL]": "将询问按钮的图片设置为[URL]", + "TheShovel/CustomStyles@_set ask prompt button image to [URL]": "将询问按钮的图片设为[URL]", "TheShovel/CustomStyles@_set border width of [BORDER] to [SIZE]": "将[BORDER]的边框宽度设为[SIZE]", "TheShovel/CustomStyles@_set list scrolling to [SCROLLRULE]": "将列表滚动设为[SCROLLRULE]", "TheShovel/CustomStyles@_set position of list [NAME] to x: [X] y: [Y]": "将列表 [NAME]的位置设为 x: [X] y: [Y]", @@ -11583,8 +11585,8 @@ "TheShovel/ShovelUtils@_list [TEXT] as array": "原版列表[TEXT]", "TheShovel/ShovelUtils@_load extension from [TEXT]": "从[TEXT]加载拓展", "TheShovel/ShovelUtils@_restart project": "重新运行作品", - "TheShovel/ShovelUtils@_set editing target to [NAME]": "将当前编辑角色设置为[NAME]", - "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "设置列表[NAME]为[TEXT]", + "TheShovel/ShovelUtils@_set editing target to [NAME]": "将当前编辑角色设为[NAME]", + "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "将列表[NAME]设为[TEXT]", "Xeltalliv/clippingblending@_Clipping & Blending": "裁剪与颜色混合", "Xeltalliv/clippingblending@_additive": "加法", "Xeltalliv/clippingblending@_blending": "混合模式", @@ -11676,27 +11678,27 @@ "box2d@griffpatch.getTouching": "角色[where]所接触的其他角色", "box2d@griffpatch.getVelocityX": "角色重力x方向", "box2d@griffpatch.getVelocityY": "角色重力y方向", - "box2d@griffpatch.setAngVelocity": "设置角色角速度为[force]", - "box2d@griffpatch.setDensity": "设置密度为[density]", - "box2d@griffpatch.setDensityValue": "设置密度为[density] ", - "box2d@griffpatch.setFriction": "设置摩擦力为[friction]", - "box2d@griffpatch.setFrictionValue": "设置摩擦力为[friction] ", + "box2d@griffpatch.setAngVelocity": "将角色角速度设为[force]", + "box2d@griffpatch.setDensity": "将密度设为[density]", + "box2d@griffpatch.setDensityValue": "将密度设为[density] ", + "box2d@griffpatch.setFriction": "将摩擦力设为[friction]", + "box2d@griffpatch.setFrictionValue": "将摩擦力设为[friction] ", "box2d@griffpatch.setGravity": "将重力方向设为x:[gx] y:[gy]", - "box2d@griffpatch.setPhysics": "设置[shape]的物理模式为[mode]", + "box2d@griffpatch.setPhysics": "将[shape]的物理模式设为[mode]", "box2d@griffpatch.setPosition": "在[space]前往x[x] y[y]", - "box2d@griffpatch.setProperties": "设置密度为[density] 摩擦力为[friction] 弹性为[restitution]", - "box2d@griffpatch.setRestitution": "设置弹性为[restitution]", - "box2d@griffpatch.setRestitutionValue": "设置弹性为[restitution] ", - "box2d@griffpatch.setScroll": "设置边界为 x[ox] y[oy]", + "box2d@griffpatch.setProperties": "将密度设为[density] 摩擦力[friction] 弹性[restitution]", + "box2d@griffpatch.setRestitution": "将弹性设为[restitution]", + "box2d@griffpatch.setRestitutionValue": "将弹性设为[restitution] ", + "box2d@griffpatch.setScroll": "将边界设为x:[ox]y:[oy]", "box2d@griffpatch.setStage": "将舞台类型设为[stageType]", - "box2d@griffpatch.setStatic": "设置移动模式为[static]", + "box2d@griffpatch.setStatic": "将移动模式设为[static]", "box2d@griffpatch.setTickRate": "将每秒模拟次数设为[rate]", - "box2d@griffpatch.setVelocity": "设置角色重力方向为 sx[sx] sy [sy]", + "box2d@griffpatch.setVelocity": "将角色重力方向设为sx:[sx]sy: [sy]", "clipboard@_Clipboard": "剪切板", "clipboard@_clipboard": "最新复制的文本", "clipboard@_copy to clipboard: [TEXT]": "把文本[TEXT]复制到剪切板", "clipboard@_last pasted text": "最新粘贴的文本", - "clipboard@_reset clipboard": "清除最新复制的文本", + "clipboard@_reset clipboard": "重置剪贴板", "clipboard@_when something is copied": "当有文本被复制时", "clipboard@_when something is pasted": "当有文本被粘贴时", "clouddata-ping@_Ping Cloud Data": "检测云数据", @@ -11762,7 +11764,7 @@ "cloudlink@_server MOTD": "服务器MOTD", "cloudlink@_server list": "服务器列表", "cloudlink@_server version": "服务器版本", - "cloudlink@_set [NAME] as username": "设置[NAME]为用户名", + "cloudlink@_set [NAME] as username": "将用户名设为[NAME]", "cloudlink@_size of queue for [TYPE]": "[TYPE]的队列大小", "cloudlink@_status code": "状态码", "cloudlink@_unlink from all rooms": "从所有房间断开连接", @@ -11784,8 +11786,8 @@ "cursor@_center": "居中", "cursor@_cursor": "鼠标样式", "cursor@_hide cursor": "隐藏鼠标", - "cursor@_set cursor to [cur]": "设置鼠标样式为[cur]", - "cursor@_set cursor to current costume center: [position] max size: [size]": "设置鼠标中心为[position],最大尺寸为[size]", + "cursor@_set cursor to [cur]": "将鼠标样式设为[cur]", + "cursor@_set cursor to current costume center: [position] max size: [size]": "将鼠标中心设为:[position]最大尺寸:[size]", "cursor@_top left": "顶部左侧", "cursor@_top right": "顶部右侧", "cursor@_{size} (unreliable)": "{size}(实验性)", @@ -11812,7 +11814,7 @@ "files@_open a file as [as]": "打开一个文件作为[as]", "files@_open selector immediately": "显示打开页面并跳出文件选择页面", "files@_save.txt": "保存.txt", - "files@_set open file selector mode to [mode]": "设置打开方式为[mode]", + "files@_set open file selector mode to [mode]": "将打开方式设为[mode]", "files@_show modal": "显示打开页面", "files@_text": "文本", "gamejolt@GameJoltAPI_gamejoltBool": "已连接 Game Jolt?", @@ -11919,9 +11921,9 @@ "gamejolt@_sequentially": "依次", "gamejolt@_sequentially, break on error": "依次、在出错时停止", "gamejolt@_session open?": "会话打开?", - "gamejolt@_set [globalOrPerUser] data at [key] to [data]": "设置[globalOrPerUser]键[key]的值为[data]", - "gamejolt@_set game ID to [ID] and private key to [key]": "设置游戏 ID 为[ID],私钥为[key]", - "gamejolt@_set session status to [status]": "设置会话状态为[status]", + "gamejolt@_set [globalOrPerUser] data at [key] to [data]": "将[globalOrPerUser]键[key]的值设为[data]", + "gamejolt@_set game ID to [ID] and private key to [key]": "将游戏 ID 设为[ID],私钥[key]", + "gamejolt@_set session status to [status]": "将会话状态设为[status]", "gamejolt@_sign up date": "注册日期", "gamejolt@_sign up timestamp": "注册时间戳", "gamejolt@_status": "封禁状态", @@ -11966,35 +11968,35 @@ "gamepad@_gamepad [pad] connected?": "游戏手柄[pad]已连接?", "gamepad@_magnitude of axes [axis] on pad [pad]": "手柄[pad]轴[axis]的大小", "gamepad@_rumble strong [s] and weak [w] for [t] sec. on pad [i]": "手柄[i]按[s]的力度震动并唤醒[w]秒,持续[t]秒", - "gamepad@_set axis deadzone to [DEADZONE]": "设置轴死区半径为[DEADZONE]", + "gamepad@_set axis deadzone to [DEADZONE]": "将轴死区半径设为[DEADZONE]", "gamepad@_value of axis [b] on pad [i]": "手柄[i]轴[b]的值", "gamepad@_value of button [b] on pad [i]": "手柄[i]按钮[b]的值", "godslayerakp/http@_Hide Extra": "隐藏更多", "godslayerakp/http@_Request": "请求", "godslayerakp/http@_Response": "响应", "godslayerakp/http@_Show Extra": "显示更多", - "godslayerakp/http@_[name] from header": "请求头的[name]", - "godslayerakp/http@_[name] in multipart form": "multipart form 中的[name]", + "godslayerakp/http@_[name] from header": "响应头中的[name]", + "godslayerakp/http@_[name] in multipart form": "多部分表单中的[name]", "godslayerakp/http@_[path] in request options": "请求选项的[path]", "godslayerakp/http@_clear current data": "清空当前数据", - "godslayerakp/http@_delete [name] from multipart form": "删除 multipart form 中的[name]", + "godslayerakp/http@_delete [name] from multipart form": "删除多部分表单中的[name]", "godslayerakp/http@_error": "错误", - "godslayerakp/http@_headers as json": "请求头json", - "godslayerakp/http@_in header set [name] to [value]": "在请求头中设置[name]为[value]", + "godslayerakp/http@_headers as json": "响应头的json", + "godslayerakp/http@_in header set [name] to [value]": "将请求头中的[name]设为[value]", "godslayerakp/http@_request failed?": "请求失败?", "godslayerakp/http@_request succeeded?": "请求成功?", "godslayerakp/http@_response": "响应", "godslayerakp/http@_send request to [url]": "发送请求给[url]", - "godslayerakp/http@_set [name] to [value] in multipart form": "将 multipart form 中的[name]设为[value]", + "godslayerakp/http@_set [name] to [value] in multipart form": "将多部分表单中的[name]设为[value]", "godslayerakp/http@_set [path] to [value] in request options": "将请求选项中的[path]设为[value]", "godslayerakp/http@_set [path] to type [type] in request options": "将请求选项的[path]设为类型[type]", - "godslayerakp/http@_set content type to [type]": "设置内容类型为[type]", - "godslayerakp/http@_set headers to json [json]": "设置请求头为json[json]", - "godslayerakp/http@_set request body to [text]": "设置请求体为[text]", - "godslayerakp/http@_set request body to multipart form": "将请求体设为 multipart form", - "godslayerakp/http@_set request method to [method]": "设置请求方法为[method]", + "godslayerakp/http@_set content type to [type]": "将内容类型设为[type]", + "godslayerakp/http@_set headers to json [json]": "将请求头设为 json[json]", + "godslayerakp/http@_set request body to [text]": "将请求体设为[text]", + "godslayerakp/http@_set request body to multipart form": "将请求体设为多部分表单", + "godslayerakp/http@_set request method to [method]": "将请求方法设为[method]", "godslayerakp/http@_site responded?": "网站响应?", - "godslayerakp/http@_status": "封禁状态", + "godslayerakp/http@_status": "状态码", "godslayerakp/http@_status text": "状态文本", "godslayerakp/http@_type of [path] in request options": "请求选项中[path]的类型", "godslayerakp/http@_when a request fails": "当有请求失败", @@ -12023,12 +12025,12 @@ "iframe@_interactive": "可以与鼠标交互?", "iframe@_resize behavior": "调整大小行为", "iframe@_scale": "规模", - "iframe@_set iframe height to [HEIGHT]": "设置 iframe 的高度为[HEIGHT]", - "iframe@_set iframe interactive to [INTERACTIVE]": "设置 iframe 交互为[INTERACTIVE]", - "iframe@_set iframe resize behavior to [RESIZE]": "设置 iframe 调整大小行为为 [RESIZE]", - "iframe@_set iframe width to [WIDTH]": "设置 iframe 的宽度为[WIDTH]", - "iframe@_set iframe x position to [X]": "设置 iframe x坐标为[X]", - "iframe@_set iframe y position to [Y]": "设置 iframe y坐标为[Y]", + "iframe@_set iframe height to [HEIGHT]": "将 iframe 的高度设为[HEIGHT]", + "iframe@_set iframe interactive to [INTERACTIVE]": "将 iframe 交互设为[INTERACTIVE]", + "iframe@_set iframe resize behavior to [RESIZE]": "将 iframe 调整大小行为设为 [RESIZE]", + "iframe@_set iframe width to [WIDTH]": "将 iframe 的宽度设为[WIDTH]", + "iframe@_set iframe x position to [X]": "将 iframe x坐标设为[X]", + "iframe@_set iframe y position to [Y]": "将 iframe y坐标设为[Y]", "iframe@_show HTML [HTML]": "显示来自文本[HTML]的网页", "iframe@_show iframe": "显示 iframe", "iframe@_show website [URL]": "显示来自URL[URL]的网页", @@ -12084,7 +12086,7 @@ "lab/text@_[ANIMATE] duration": "动画样式[ANIMATE]的完成时间", "lab/text@_[ANIMATE] text [TEXT]": "显示动画样式是[ANIMATE]的文本[TEXT]", "lab/text@_add line [TEXT]": "增加一行文本[TEXT]", - "lab/text@_align text to [ALIGN]": "设置文本的展示样式为[ALIGN]", + "lab/text@_align text to [ALIGN]": "将文本的展示样式设为[ALIGN]", "lab/text@_animate [ANIMATE] until done": "显示动画样式[ANIMATE]并等待", "lab/text@_center": "居中", "lab/text@_displayed text": "显示的文本", @@ -12097,15 +12099,15 @@ "lab/text@_reset text width": "重置文本宽度", "lab/text@_reset typing delay": "重置逐字显示速度", "lab/text@_right": "居右", - "lab/text@_set [ANIMATE] duration to [NUM] seconds": "设置动画样式[ANIMATE]的完成时间是[NUM]秒", - "lab/text@_set font to [FONT]": "设置文本的字体为[FONT]", + "lab/text@_set [ANIMATE] duration to [NUM] seconds": "将动画样式[ANIMATE]的完成时间设为[NUM]秒", + "lab/text@_set font to [FONT]": "将字体设为[FONT]", "lab/text@_set outline color to [COLOR]": "将轮廓颜色设为[COLOR]", "lab/text@_set outline width to [WIDTH]": "将轮廓大小设为[WIDTH]", "lab/text@_set shake intensity to [NUM]%": "将抖动强度设为[NUM]%", - "lab/text@_set text color to [COLOR]": "设置文本的颜色为[COLOR]", - "lab/text@_set typing delay to [NUM] seconds": "设置逐字显示速度为[NUM]秒/字", - "lab/text@_set width to [WIDTH]": "设置文本的宽度为[WIDTH]", - "lab/text@_set width to [WIDTH] aligned [ALIGN]": "设置[ALIGN]样式的宽度为[WIDTH]", + "lab/text@_set text color to [COLOR]": "将文本颜色设为[COLOR]", + "lab/text@_set typing delay to [NUM] seconds": "将逐字显示速度设为[NUM]秒/字", + "lab/text@_set width to [WIDTH]": "将文本的宽度设为[WIDTH]", + "lab/text@_set width to [WIDTH] aligned [ALIGN]": "将宽度设为[WIDTH]样式[ALIGN]", "lab/text@_show sprite": "显示角色", "lab/text@_show text [TEXT]": "显示文本[TEXT]", "lab/text@_start [ANIMATE] animation": "显示动画样式[ANIMATE]", @@ -12117,14 +12119,14 @@ "lab/text@_zoom": "移动动画", "lab/text@disableCompatibilityMode": "这将会启用新的功能,这些积木是不兼容Scratch Lab。\n\n是否启用新功能?", "local-storage@_Local Storage": "本地存储", - "local-storage@_Local Storage extension: project must run the \"set storage namespace ID\" block before it can use other blocks": "本地存储拓展:请先运行“设置存储命名空间ID”积木才能使用下面的积木", + "local-storage@_Local Storage extension: project must run the \"set storage namespace ID\" block before it can use other blocks": "本地存储拓展:请先运行“将存储命名空间ID设为”积木才能使用下面的积木", "local-storage@_delete all keys": "删除所有本地存储变量", "local-storage@_delete key [KEY]": "删除本地存储变量[KEY]", "local-storage@_get key [KEY]": "本地存储变量[KEY]的值", "local-storage@_project title": "作品标题", "local-storage@_score": "分数", - "local-storage@_set key [KEY] to [VALUE]": "设置本地存储变量[KEY]的值为[VALUE]", - "local-storage@_set storage namespace ID to [ID]": "设置存储命名空间ID为[ID]", + "local-storage@_set key [KEY] to [VALUE]": "将本地存储变量[KEY]设为[VALUE]", + "local-storage@_set storage namespace ID to [ID]": "将存储命名空间ID设为[ID]", "local-storage@_when another window changes storage": "当其他页面修改本地存储数据", "mbw/xml@_add child [CHILD] to [XML]": "[XML]添加子元素[CHILD]", "mbw/xml@_attribute [ATTR] of [XML]": "[XML]中属性[ATTR]的值", @@ -12142,9 +12144,9 @@ "mbw/xml@_remove attribute [ATTR] of [XML]": "删除[XML]的属性[ATTR]", "mbw/xml@_remove child #[NO] of [XML]": "删除[XML]第[NO]个子元素", "mbw/xml@_replace child #[NO] of [XML] with [CHILD]": "将[XML]第[NO]子元素替换为[CHILD]", - "mbw/xml@_set attribute [ATTR] of [XML] to [VALUE]": "设置[XML]的属性[ATTR]为[VALUE]", - "mbw/xml@_set inner elements of [XML] to [VALUE]": "设置[XML]的内部元素为[VALUE]", - "mbw/xml@_set text of [XML] to [VALUE]": "设置[XML]的文字为[VALUE]", + "mbw/xml@_set attribute [ATTR] of [XML] to [VALUE]": "将[XML]的属性[ATTR]设为[VALUE]", + "mbw/xml@_set inner elements of [XML] to [VALUE]": "将[XML]的内部元素设为[VALUE]", + "mbw/xml@_set text of [XML] to [VALUE]": "将[XML]的文本设为[VALUE]", "mbw/xml@_tag name of [XML]": "[XML]的标签名称", "mbw/xml@_text of [XML]": "[XML]的文本", "mdwalters/notifications@_Hello, world!": "你好,世界!", @@ -12204,7 +12206,7 @@ "obviousAlexC/SensingPlus@_recording?": "正在识别?", "obviousAlexC/SensingPlus@_rotation": "旋转", "obviousAlexC/SensingPlus@_rotation style": "旋转模式", - "obviousAlexC/SensingPlus@_set clipboard to [TEXT]": "设置剪贴板为[TEXT]", + "obviousAlexC/SensingPlus@_set clipboard to [TEXT]": "将剪贴板设为[TEXT]", "obviousAlexC/SensingPlus@_sprite layer": "角色的图层", "obviousAlexC/SensingPlus@_supports touches?": "支持触碰?", "obviousAlexC/SensingPlus@_this sprite's [effect] effect": "角色的[effect]特效", @@ -12343,9 +12345,9 @@ "obviousAlexC/penPlus@_reset triangle attributes": "重置三角形属性", "obviousAlexC/penPlus@_rotation": "旋转", "obviousAlexC/penPlus@_saturation": "饱和度", - "obviousAlexC/penPlus@_set [setting] to [value]": "设置[setting]为[value]", + "obviousAlexC/penPlus@_set [setting] to [value]": "将[setting]设为[value]", "obviousAlexC/penPlus@_set cubemap [uniformName] in [shader] to [cubemap]": "将[shader]中的立方体贴图[uniformName]设为[cubemap]", - "obviousAlexC/penPlus@_set imported image wrap mode to [clampMode]": "设置导入图片的环绕模式为[clampMode]", + "obviousAlexC/penPlus@_set imported image wrap mode to [clampMode]": "将导入图片的环绕模式设为[clampMode]", "obviousAlexC/penPlus@_set item [item] in number array [uniformName] in [shader] to [number]": "将[shader]中的数字数组[uniformName]的第[item]项设为[number]", "obviousAlexC/penPlus@_set item [item] in vector 2 array [uniformName] in [shader] to [numberX] [numberY]": "将[shader]中的2维向量数组[uniformName]的第[item]项设为[numberX][numberY]", "obviousAlexC/penPlus@_set item [item] in vector 3 array [uniformName] in [shader] to [numberX] [numberY] [numberZ]": "将[shader]中的3维向量数组[uniformName]的第[item]项设为[numberX][numberY][numberZ]", @@ -12357,11 +12359,11 @@ "obviousAlexC/penPlus@_set pen square's [target] to [number]": "将方形画笔的[target]设为[number]", "obviousAlexC/penPlus@_set pixel [x] [y]'s color to [color] in [costume]": "将造型[costume]中像素[x][y]的颜色设为[color]", "obviousAlexC/penPlus@_set texture [uniformName] in [shader] to [texture]": "将[shader]中的纹理[uniformName]设为[texture]", - "obviousAlexC/penPlus@_set texture filter mode to [filter]": "设置纹理过滤模式为[filter]", + "obviousAlexC/penPlus@_set texture filter mode to [filter]": "将纹理过滤模式设为[filter]", "obviousAlexC/penPlus@_set the [attribute] of point [id] to [value] in [def]": "将[def]中的点[id]的[attribute]设为[value]", - "obviousAlexC/penPlus@_set the prefix for [prefix] to [value]": "设置[prefix]的前缀为[value]", - "obviousAlexC/penPlus@_set triangle point [point]'s [attribute] to [value]": "设置三角形点[point]的[attribute]为[value]", - "obviousAlexC/penPlus@_set triangle's [wholeAttribute] to [value]": "设置三角形的[wholeAttribute]为[value]", + "obviousAlexC/penPlus@_set the prefix for [prefix] to [value]": "将[prefix]的前缀设为[value]", + "obviousAlexC/penPlus@_set triangle point [point]'s [attribute] to [value]": "将三角形的点[point]的[attribute]设为[value]", + "obviousAlexC/penPlus@_set triangle's [wholeAttribute] to [value]": "将三角形的[wholeAttribute]设为[value]", "obviousAlexC/penPlus@_set vector 2 [uniformName] in [shader] to [numberX] [numberY]": "将[shader]中的2维向量[uniformName]设[numberX][numberY]", "obviousAlexC/penPlus@_set vector 2 attribute [attributeName] of point [pointID] in [shader] to [numberX] [numberY]": "将[shader]的点[pointID]的2维向量属性[attributeName]设为[numberX][numberY]", "obviousAlexC/penPlus@_set vector 3 [uniformName] in [shader] to [numberX] [numberY] [numberZ]": "将[shader]中的3维向量[uniformName]设[numberX][numberY][numberZ]", @@ -12385,7 +12387,7 @@ "pointerlock@_disabled": "禁用", "pointerlock@_enabled": "启用", "pointerlock@_pointer locked?": "指针锁定?", - "pointerlock@_set pointer lock [enabled]": "设置指针锁定为[enabled]", + "pointerlock@_set pointer lock [enabled]": "将指针锁定设为[enabled]", "qxsck/data-analysis@average": "[NUMBERS]里所有数字的平均数", "qxsck/data-analysis@maximum": "[NUMBERS]里所有数字的最大数", "qxsck/data-analysis@median": "[NUMBERS]里所有数字的中位数", @@ -12453,11 +12455,11 @@ "runtime-options@_remove fencing": "允许角色移出舞台", "runtime-options@_remove misc limits": "取消音效范围与画笔大小限制", "runtime-options@_run green flag [flag]": "运行绿旗[flag]", - "runtime-options@_set [thing] to [enabled]": "设置[thing]为[enabled]", - "runtime-options@_set clone limit to [limit]": "设置克隆体限制为[limit]", - "runtime-options@_set framerate limit to [fps]": "设置FPS上限为[fps]", - "runtime-options@_set stage size width: [width] height: [height]": "把舞台大小设置为宽[width] 高[height]", - "runtime-options@_set username to [username]": "设置用户名称为[username]", + "runtime-options@_set [thing] to [enabled]": "将[thing]设为[enabled]", + "runtime-options@_set clone limit to [limit]": "将克隆体限制设为[limit]", + "runtime-options@_set framerate limit to [fps]": "将FPS上限设为[fps]", + "runtime-options@_set stage size width: [width] height: [height]": "将舞台大小设为宽[width] 高[height]", + "runtime-options@_set username to [username]": "将用户名设为[username]", "runtime-options@_stage [dimension]": "舞台的[dimension]", "runtime-options@_stage size": "舞台尺寸", "runtime-options@_turbo mode": "加速模式", @@ -12479,16 +12481,16 @@ "steamworks@_level": "Steam 账户等级", "steamworks@_name": "名字", "steamworks@_open [TYPE] [DATA] in overlay": "在 Steam Overlay 上打开[TYPE][DATA]", - "steamworks@_set achievement [ACHIEVEMENT] unlocked to [STATUS]": "设置成就[ACHIEVEMENT]解锁状态为[STATUS]", + "steamworks@_set achievement [ACHIEVEMENT] unlocked to [STATUS]": "将成就[ACHIEVEMENT]的解锁状态设为[STATUS]", "steamworks@_steam ID": "Steam ID", "steamworks@_true": "真", "stretch@_Stretch": "角色拉伸", "stretch@_change stretch by x: [DX] y: [DY]": "增加角色拉伸x [DX] y [DY]", "stretch@_change stretch x by [DX]": "x拉伸增加[DX]", "stretch@_change stretch y by [DY]": "y拉伸增加[DY]", - "stretch@_set stretch to x: [X] y: [Y]": "设置角色拉伸x [X] y [Y]", - "stretch@_set stretch x to [X]": "设置x拉伸为[X]", - "stretch@_set stretch y to [Y]": "设置y拉伸为[Y]", + "stretch@_set stretch to x: [X] y: [Y]": "将角色拉伸设为x:[X]y:[Y]", + "stretch@_set stretch x to [X]": "将x拉伸设为[X]", + "stretch@_set stretch y to [Y]": "将y拉伸设为[Y]", "stretch@_x stretch": "x拉伸", "stretch@_y stretch": "y拉伸", "text@_Exactly Title Case": "精确标题", @@ -12544,6 +12546,8 @@ "true-fantom/math@_is safe number [A]?": "[A]可被精确表示?", "true-fantom/math@_log of [A] with base [B]": "log[A]以[B]为底", "true-fantom/math@_map [A] from range [m1] - [M1] to range [m2] - [M2]": "将[A]从范围[m1]-[M1]映射到范围[m2]-[M2]", + "true-fantom/math@_sign of [A]": "[A]的函数符号", + "true-fantom/math@_true [OPERATOR] [NUM]": "精确[OPERATOR][NUM]", "true-fantom/math@_trunc of [A]": "[A]的整数部分", "true-fantom/math@_trunc of [A] with [B] digits after dot": "[A]保留[B]位小数 ", "true-fantom/network@_(1) text": "(1) 文本", @@ -12583,7 +12587,7 @@ "true-fantom/regexp@_[IMAGE] [A] contains flags [B] ?": "[IMAGE]正则[A]有修饰符[B]吗?", "true-fantom/regexp@_[IMAGE] add flags [B] to [IMAGE] [A]": "[IMAGE]正则[IMAGE][A]添加修饰符[B]", "true-fantom/regexp@_[IMAGE] delete flags [B] of [IMAGE] [A]": "[IMAGE]正则[IMAGE][A]删除修饰符[B]", - "true-fantom/regexp@_[IMAGE] set [B] of [IMAGE] [A] to [C]": "[IMAGE]设置正则[IMAGE][A]的[B]为[C]", + "true-fantom/regexp@_[IMAGE] set [B] of [IMAGE] [A] to [C]": "[IMAGE]将[IMAGE][A]的[B]设为[C]", "true-fantom/regexp@_[IMAGE] with pattern [A] and flags [B]": "[IMAGE]合并匹配模式[A]与修饰符[B]", "true-fantom/regexp@_flags": "修饰符", "true-fantom/regexp@_is [IMAGE] [A] ?": "[IMAGE][A]是正则吗?", @@ -12616,6 +12620,7 @@ "veggiecan/browserfullscreen@_exited": "退出", "veggiecan/browserfullscreen@_in browser fullscreen?": "浏览器全屏吗?", "veggiecan/browserfullscreen@_when browser fullscreen [ENABLED]": "当[ENABLED]浏览器全屏", + "veggiecan/mobilekeyboard@_Currently only works on Android": "目前仅适用于 Android", "veggiecan/mobilekeyboard@_Mobile Keyboard": "移动键盘", "veggiecan/mobilekeyboard@_Now the text is different": "一个不同的值", "veggiecan/mobilekeyboard@_You typed: ": "你输入的值:", @@ -12631,7 +12636,7 @@ "veggiecan/mobilekeyboard@_search": "搜索", "veggiecan/mobilekeyboard@_select text starting at position in text [START] ending at position [END]": "选中从[START] 位置开始到[END]位置结束的文字", "veggiecan/mobilekeyboard@_set cursor position to [INDEX]": "将光标位置设为[INDEX]", - "veggiecan/mobilekeyboard@_set text box's default value to [VALUE]": "将文本框的默认值设置为 [VALUE]", + "veggiecan/mobilekeyboard@_set text box's default value to [VALUE]": "将文本框的默认值设为 [VALUE]", "veggiecan/mobilekeyboard@_set textbox current value to [TEXT]": "将文本框当前值设为[TEXT]", "veggiecan/mobilekeyboard@_show [TYPE] keyboard": "显示[TYPE]键盘", "veggiecan/mobilekeyboard@_show [TYPE] keyboard and wait": "显示[TYPE]键盘并等待", From 774d399412043b00937f7b777cbd0170daefe03b Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Wed, 4 Jun 2025 12:32:47 -0500 Subject: [PATCH 10/22] Use versions instead of commit hash for official GitHub Actions workflows (#2146) This might make it not take 5 minutes for CI to finish --- .github/workflows/deploy.yml | 8 ++++---- .github/workflows/download-translations.yml | 4 ++-- .github/workflows/format-pr.yml | 10 +++++----- .github/workflows/upload-translations.yml | 4 ++-- .github/workflows/validate.yml | 12 ++++++------ 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c4ed8fdc08..b7cd6fa5ac 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,11 +19,11 @@ jobs: steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 - name: Install dependencies @@ -31,7 +31,7 @@ jobs: - name: Build for production run: npm run build - name: Upload artifact - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa + uses: actions/upload-pages-artifact@v3 with: path: ./build/ @@ -47,4 +47,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/download-translations.yml b/.github/workflows/download-translations.yml index 970eab7254..4fe64ccaf3 100644 --- a/.github/workflows/download-translations.yml +++ b/.github/workflows/download-translations.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout fork - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: # Commits will be written to this fork, then pull requested to the main repository. repository: "DangoCat/extensions" @@ -35,7 +35,7 @@ jobs: env: UPSTREAM_REPO: "TurboWarp/extensions" - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 - name: Install dependencies diff --git a/.github/workflows/format-pr.yml b/.github/workflows/format-pr.yml index 9530bfc52d..271d6ae444 100644 --- a/.github/workflows/format-pr.yml +++ b/.github/workflows/format-pr.yml @@ -25,7 +25,7 @@ jobs: ) steps: - name: Checkout upstream - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: repository: TurboWarp/extensions persist-credentials: false @@ -35,7 +35,7 @@ jobs: PR_NUM: "${{ github.event.issue.number }}" GH_TOKEN: "${{ github.token }}" - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 - name: Install dependencies @@ -43,7 +43,7 @@ jobs: - name: Format run: npm run format - name: Upload formatted code - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b + uses: actions/upload-artifact@v4 with: name: comment-format-untrusted-artifact path: extensions/ @@ -60,7 +60,7 @@ jobs: pull-requests: write steps: - name: Checkout upstream - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: repository: TurboWarp/extensions # Can't use the default workflow token because commits made by it won't cause more @@ -80,7 +80,7 @@ jobs: PR_NUM: "${{ github.event.issue.number }}" GH_TOKEN: "${{ github.token }}" - name: Download formatted code - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 + uses: actions/download-artifact@v4 with: name: comment-format-untrusted-artifact path: extensions diff --git a/.github/workflows/upload-translations.yml b/.github/workflows/upload-translations.yml index 304bab98b6..9d7ef93123 100644 --- a/.github/workflows/upload-translations.yml +++ b/.github/workflows/upload-translations.yml @@ -17,11 +17,11 @@ jobs: steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 - name: Install dependencies diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index dada578a2c..eb2b41a886 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -8,11 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 cache: npm @@ -25,11 +25,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 cache: npm @@ -42,11 +42,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: node-version: 22 cache: npm From a73e6fd55ee6a502abe75e32adfd2c6def412f51 Mon Sep 17 00:00:00 2001 From: wiktorlaskowski <117634264+wiktorlaskowski@users.noreply.github.com> Date: Wed, 4 Jun 2025 19:34:12 +0200 Subject: [PATCH 11/22] CST1229/images: new image (#2144) --- images/CST1229/images.svg | 142 +------------------------------------- images/README.md | 2 +- 2 files changed, 2 insertions(+), 142 deletions(-) diff --git a/images/CST1229/images.svg b/images/CST1229/images.svg index 7cab9379b0..c946cdfdf6 100644 --- a/images/CST1229/images.svg +++ b/images/CST1229/images.svg @@ -1,141 +1 @@ - - - - + diff --git a/images/README.md b/images/README.md index 542f52e8d6..55105c2c9f 100644 --- a/images/README.md +++ b/images/README.md @@ -314,7 +314,7 @@ All images in this folder are licensed under the [GNU General Public License ver - Created by [@ClaytonTDM](https://github.com/ClaytonTDM) in https://github.com/TurboWarp/extensions/issues/90#issuecomment-1849825710 ## CST1229/images.svg - - Created by [@mcnole25](https://github.com/mcnole25) in https://github.com/TurboWarp/extensions/issues/90#issuecomment-2122654376 + - Created by [@wiktorlaskowski](https://github.com/wiktorlaskowski) in https://github.com/TurboWarp/extensions/pull/2144 ## shreder95ua/resolution.svg - Created by [@xTvii](https://github.com/xTvii) in https://github.com/TurboWarp/extensions/issues/1079#issue-1926845796 From 815dbee0995b8d626d9cf616a599efbdf1bf1e98 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Sat, 7 Jun 2025 12:26:23 -0500 Subject: [PATCH 12/22] [Automated] Update translations 2025-06-07 (#2150) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 16 +++--- translations/extension-runtime.json | 78 ++++++++++++++++++---------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index decd94d749..006f9d1977 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -1721,7 +1721,7 @@ "Lily/MoreEvents@name": "更多事件", "Lily/MoreTimers@description": "同时控制多个计时器。", "Lily/MoreTimers@name": "更多计时器", - "Lily/Skins@description": "让您的角色不只展示造型列表中的造型。", + "Lily/Skins@description": "让你的角色展现为其他图像或造型。", "Lily/Skins@name": "纹理", "Lily/SoundExpanded@description": "添加更多关于声音的积木。", "Lily/SoundExpanded@name": "声音扩展", @@ -1741,7 +1741,8 @@ "NexusKitten/controlcontrols@name": "控件按钮控制", "NexusKitten/moremotion@description": "更多跟运动相关的积木。", "NexusKitten/moremotion@name": "更多运动", - "NexusKitten/sgrab@description": "获取有关 Scratch 作品及 Scratch 用户的信息。", + "NexusKitten/sgrab@description": "获取 Scratch 作品和 Scratch 用户的信息。", + "NexusKitten/sgrab@name": "S-抓取", "PwLDev/vibration@description": "控制设备的振动。仅适用于 Android 上的 Chrome 浏览器。", "PwLDev/vibration@name": "振动", "SharkPool/Camera@description": "移动舞台的可见部分。", @@ -1752,9 +1753,9 @@ "Skyhigh173/bigint@name": "大整数", "Skyhigh173/json@description": "处理 JSON 字符串和数组。", "TheShovel/CanvasEffects@description": "适用于整个舞台的视觉效果。", - "TheShovel/CanvasEffects@name": "Canvas 效果", - "TheShovel/ColorPicker@description": "访问系统提供的颜色选择器。", - "TheShovel/ColorPicker@name": "颜色选择器", + "TheShovel/CanvasEffects@name": "画布效果", + "TheShovel/ColorPicker@description": "访问你的系统的颜色选取器。", + "TheShovel/ColorPicker@name": "颜色选取器", "TheShovel/CustomStyles@description": "自定义作品中变量监视器和询问的样式。", "TheShovel/CustomStyles@name": "自定义样式", "TheShovel/LZ-String@description": "使用 LZ-string 压缩与解压文本。", @@ -1798,7 +1799,8 @@ "gamepad@name": "游戏手柄", "godslayerakp/http@description": "一些与外部网站进行交互的积木。", "godslayerakp/ws@description": "手动连接到 WebSocket 服务器。", - "iframe@description": "在舞台嵌入网页。", + "iframe@description": "在舞台上嵌入网页或 HTML 。", + "iframe@name": "内嵌框架", "itchio@description": "一些与 itch.io 网站互动的积木,非官方制作。", "lab/text@description": "显示与设置动画文字的简单方式,与 Scratch Lab 的“动画文字”实验项目兼容。", "lab/text@name": "动画文字", @@ -1847,7 +1849,7 @@ "true-fantom/regexp@name": "正则表达式", "utilities@description": "一些有趣的积木集合。", "utilities@name": "工具箱", - "veggiecan/LongmanDictionary@description": "从朗文辞典获取单词的定义。考虑到中国大陆的互联网环境,此扩展可能无法正常运行。", + "veggiecan/LongmanDictionary@description": "在你的作品中从朗文辞典获取单词的定义。", "veggiecan/LongmanDictionary@name": "朗文辞典", "veggiecan/browserfullscreen@description": "进入或退出全屏模式。", "veggiecan/browserfullscreen@name": "全屏模式", diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 6988d99a7c..aadd0c151c 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -11350,21 +11350,22 @@ "NexusKitten/moremotion@_touching rectangle x1: [X1] y1: [Y1] x2: [X2] y2: [Y2]?": "位于从x[X1] y[Y1] 到x[X2] y[Y2]的区域内?", "NexusKitten/moremotion@_touching x: [X] y: [Y]?": "触碰坐标x[X] y[Y]?", "NexusKitten/moremotion@_width": "宽度", - "NexusKitten/sgrab@_[WHAT] of user [WHO]": "获取Scratch用户[WHO]的[WHAT]", + "NexusKitten/sgrab@_S-Grab": "S-抓取", + "NexusKitten/sgrab@_[WHAT] of user [WHO]": "用户[WHO]的[WHAT]", "NexusKitten/sgrab@_about me": "简介", - "NexusKitten/sgrab@_creator of project id [WHO]": "获取Scratch作品ID为[WHO]的制作者", + "NexusKitten/sgrab@_creator of project id [WHO]": "作品ID[WHO]的作者", "NexusKitten/sgrab@_favorite": "收藏", "NexusKitten/sgrab@_follower": "粉丝", - "NexusKitten/sgrab@_following": "关注者", - "NexusKitten/sgrab@_global [WHAT] ranking for [WHO]": "获取Scratch用户[WHO]在[WHAT]的排名", - "NexusKitten/sgrab@_global [WHAT] ranking for project id [WHO]": "获取Scratch作品ID为[WHO]在[WHAT]的屏幕", - "NexusKitten/sgrab@_grab [WHAT] count of project id [WHO]": "获取Scratch作品ID为[WHO]的[WHAT]数量", - "NexusKitten/sgrab@_grab [WHAT] count of user [WHO]": "获取Scratch用户[WHO]的[WHAT]数量", + "NexusKitten/sgrab@_following": "关注", + "NexusKitten/sgrab@_global [WHAT] ranking for [WHO]": "[WHO]的[WHAT]的排名", + "NexusKitten/sgrab@_global [WHAT] ranking for project id [WHO]": "作品ID[WHO]的[WHAT]的全球排名", + "NexusKitten/sgrab@_grab [WHAT] count of project id [WHO]": "抓取作品ID[WHO]的[WHAT]数", + "NexusKitten/sgrab@_grab [WHAT] count of user [WHO]": "抓取用户[WHO]的[WHAT]数", "NexusKitten/sgrab@_location": "居住地", "NexusKitten/sgrab@_love": "点赞", - "NexusKitten/sgrab@_name of project id [WHO]": "获取Scratch作品ID为[WHO]的名称", + "NexusKitten/sgrab@_name of project id [WHO]": "作品ID[WHO]的名称", "NexusKitten/sgrab@_status": "用户类型", - "NexusKitten/sgrab@_view": "观看数", + "NexusKitten/sgrab@_view": "浏览", "NexusKitten/sgrab@_wiwo": "工作", "PwLDev/vibration@_Only works on Chrome for Android.": "只在安卓的Chrome浏览器可用。", "PwLDev/vibration@_Vibration": "震动", @@ -11372,31 +11373,46 @@ "PwLDev/vibration@_start vibrating for [SECONDS] seconds": "震动[SECONDS]秒", "PwLDev/vibration@_stop vibrating": "停止震动", "SharkPool/Camera@_Add Camera": "添加摄像机", + "SharkPool/Camera@_Camera Controls": "摄像机控制", + "SharkPool/Camera@_Camera Manager": "摄像机管理器", "SharkPool/Camera@_Camera V2": "摄像机 V2", "SharkPool/Camera@_New Camera name:": "新摄像机名称:", "SharkPool/Camera@_Remove Camera": "移除摄像机", - "SharkPool/Camera@_Remove Camera named:": "移除摄像机:", + "SharkPool/Camera@_Remove Camera named:": "要移除的摄像机名称:", "SharkPool/Camera@_Stage": "舞台", + "SharkPool/Camera@_Utility": "实用工具", + "SharkPool/Camera@_[CAMERA] camera direction": "[CAMERA]摄像机方向", "SharkPool/Camera@_[CAMERA] camera x": "[CAMERA]摄像机的x坐标", "SharkPool/Camera@_[CAMERA] camera y": "[CAMERA]摄像机的y坐标", + "SharkPool/Camera@_[CAMERA] camera zoom": "[CAMERA]摄像机变焦", + "SharkPool/Camera@_all objects": "所有对象", "SharkPool/Camera@_background color": "背景颜色", + "SharkPool/Camera@_bind": "绑定", "SharkPool/Camera@_bind [TARGET] to camera [CAMERA]": "将[TARGET]绑定到摄像机[CAMERA]", "SharkPool/Camera@_camera of [TARGET]": "[TARGET]的摄像机", "SharkPool/Camera@_change [CAMERA] camera x by [NUM]": "将[CAMERA]摄像机的x坐标增加[NUM]", "SharkPool/Camera@_change [CAMERA] camera y by [NUM]": "将[CAMERA]摄像机的y坐标增加[NUM]", - "SharkPool/Camera@_default": "默认类型", + "SharkPool/Camera@_change [CAMERA] camera zoom by [NUM]": "将[CAMERA]摄像机的变焦增加[NUM]", + "SharkPool/Camera@_default": "默认", "SharkPool/Camera@_mouse x in camera [CAMERA]": "摄像机[CAMERA]中的鼠标x", "SharkPool/Camera@_mouse y in camera [CAMERA]": "摄像机[CAMERA]中的鼠标y", "SharkPool/Camera@_move [CAMERA] camera [NUM] steps": "移动[CAMERA]摄像机[NUM]步", "SharkPool/Camera@_move [CAMERA] camera to [TARGET]": "将[CAMERA]摄像机移到[TARGET]", "SharkPool/Camera@_myself": "自己", + "SharkPool/Camera@_pen layer": "画笔图层", + "SharkPool/Camera@_point [CAMERA] camera towards [TARGET]": "将[CAMERA]摄像机对准[TARGET]", + "SharkPool/Camera@_rendered x position of [TARGET]": "[TARGET]的渲染x坐标", + "SharkPool/Camera@_rendered y position of [TARGET]": "[TARGET]的渲染y坐标", "SharkPool/Camera@_set [CAMERA] camera direction to [NUM]": "将[CAMERA]摄像机的方向设为[NUM]", "SharkPool/Camera@_set [CAMERA] camera to x: [X] y: [Y]": "将[CAMERA]摄像机移到 x:[X]y:[Y]", "SharkPool/Camera@_set [CAMERA] camera x to [NUM]": "将[CAMERA]摄像机的x坐标设为[NUM]", "SharkPool/Camera@_set [CAMERA] camera y to [NUM]": "将[CAMERA]摄像机的y坐标设为[NUM]", - "SharkPool/Camera@_set [CAMERA] camera zoom to [NUM]%": "将[CAMERA]摄像机的缩放设为[NUM]%", + "SharkPool/Camera@_set [CAMERA] camera zoom to [NUM]%": "将[CAMERA]摄像机的变焦设为[NUM]%", "SharkPool/Camera@_set background color to [COLOR]": "将背景颜色设为[COLOR]", + "SharkPool/Camera@_turn [CAMERA] camera [IMG] [NUM] degrees": "将[CAMERA]摄像机旋转[IMG][NUM]度", + "SharkPool/Camera@_unbind": "解除绑定", "SharkPool/Camera@_unbind [TARGET] from camera [CAMERA]": "将[TARGET]从摄像机[CAMERA]解绑", + "SharkPool/Camera@_video layer": "视频图层", "SharkPool/Font-Manager@_Font Manager": "字体管理", "SharkPool/Font-Manager@_[ADDED] fonts": "已[ADDED]的字体", "SharkPool/Font-Manager@_[DATA] of font [NAME]": "字体[NAME]的[DATA]", @@ -11471,7 +11487,7 @@ "Skyhigh173/json@_value of [item] in [json]": "[json]中的[item]", "Skyhigh173/json@_values": "值", "Skyhigh173/json@_variance": "方差", - "TheShovel/CanvasEffects@_Canvas Effects": "Canvas 特效", + "TheShovel/CanvasEffects@_Canvas Effects": "画布效果", "TheShovel/CanvasEffects@_background": "背景", "TheShovel/CanvasEffects@_blur": "模糊", "TheShovel/CanvasEffects@_border color": "边缘颜色", @@ -11512,16 +11528,16 @@ "TheShovel/CanvasEffects@_skew Y": "Y 倾斜", "TheShovel/CanvasEffects@_solid": "实线", "TheShovel/CanvasEffects@_transparency": "透明度", - "TheShovel/ColorPicker@_Color Picker": "颜色选择器", + "TheShovel/ColorPicker@_Color Picker": "颜色选取器", "TheShovel/ColorPicker@_blue": "蓝色", "TheShovel/ColorPicker@_color [TYPE] value": "颜色[TYPE]值", "TheShovel/ColorPicker@_green": "绿色", "TheShovel/ColorPicker@_hex": "Hex", "TheShovel/ColorPicker@_picker [COORD] position": "取色器[COORD]坐标", "TheShovel/ColorPicker@_red": "红色", - "TheShovel/ColorPicker@_set picker color to [COLOR]": "将取色器颜色设为[COLOR]", + "TheShovel/ColorPicker@_set picker color to [COLOR]": "将取色器的颜色设为[COLOR]", "TheShovel/ColorPicker@_set picker position to x: [X] y: [Y]": "将取色器位置x:[X]y:[Y]", - "TheShovel/ColorPicker@_show color picker": "显示取色器", + "TheShovel/ColorPicker@_show color picker": "颜色选取器", "TheShovel/ColorPicker@_when color changed": "当颜色改变", "TheShovel/CustomStyles@_Custom Styles": "自定义样式", "TheShovel/CustomStyles@_ask prompt background": "提问框背景", @@ -12018,21 +12034,21 @@ "godslayerakp/ws@_when message received": "当收到信息", "iframe@_Iframe": "内嵌框架", "iframe@_It works!": "能用!", - "iframe@_close iframe": "退出 iframe", + "iframe@_close iframe": "退出内嵌框架", "iframe@_height": "高度", - "iframe@_hide iframe": "隐藏 iframe", - "iframe@_iframe [MENU]": "iframe 的[MENU]", - "iframe@_interactive": "可以与鼠标交互?", + "iframe@_hide iframe": "隐藏内嵌框架", + "iframe@_iframe [MENU]": "内嵌框架的[MENU]", + "iframe@_interactive": "交互性", "iframe@_resize behavior": "调整大小行为", "iframe@_scale": "规模", - "iframe@_set iframe height to [HEIGHT]": "将 iframe 的高度设为[HEIGHT]", - "iframe@_set iframe interactive to [INTERACTIVE]": "将 iframe 交互设为[INTERACTIVE]", - "iframe@_set iframe resize behavior to [RESIZE]": "将 iframe 调整大小行为设为 [RESIZE]", - "iframe@_set iframe width to [WIDTH]": "将 iframe 的宽度设为[WIDTH]", - "iframe@_set iframe x position to [X]": "将 iframe x坐标设为[X]", - "iframe@_set iframe y position to [Y]": "将 iframe y坐标设为[Y]", + "iframe@_set iframe height to [HEIGHT]": "将内嵌框架的高度设为[HEIGHT]", + "iframe@_set iframe interactive to [INTERACTIVE]": "将内嵌框架的交互性设为[INTERACTIVE]", + "iframe@_set iframe resize behavior to [RESIZE]": "将内嵌框架的调整大小行为设为[RESIZE]", + "iframe@_set iframe width to [WIDTH]": "将内嵌框架的宽度设为[WIDTH]", + "iframe@_set iframe x position to [X]": "将内嵌框架的x坐标设为[X]", + "iframe@_set iframe y position to [Y]": "将内嵌框架的y坐标设为[Y]", "iframe@_show HTML [HTML]": "显示来自文本[HTML]的网页", - "iframe@_show iframe": "显示 iframe", + "iframe@_show iframe": "显示内嵌框架", "iframe@_show website [URL]": "显示来自URL[URL]的网页", "iframe@_url": "URL", "iframe@_viewport": "视点", @@ -12278,11 +12294,14 @@ "obviousAlexC/penPlus@_add blank image that is [color] and the size of [width], [height] named [name] to Pen+ Library": "将大小[width],[height]颜色[color]的空图片命名为[name]加入“画笔+”库", "obviousAlexC/penPlus@_add image named [name] from [dataURI] to Pen+ Library": "将图片[dataURI]命名为[name]加入“画笔+”库", "obviousAlexC/penPlus@_allow 'Corner Pinch < 1'": "允许'Corner Pinch < 1'", + "obviousAlexC/penPlus@_blue Tint": "蓝色色调", "obviousAlexC/penPlus@_blue tint": "蓝色色调", "obviousAlexC/penPlus@_brightness": "亮度", + "obviousAlexC/penPlus@_clamp": "裁剪", "obviousAlexC/penPlus@_clamp depth value": "裁剪深度值", "obviousAlexC/penPlus@_clear pen from [name]": "从[name]清空画笔", "obviousAlexC/penPlus@_clock-wise": "顺时针", + "obviousAlexC/penPlus@_closest": "最近邻", "obviousAlexC/penPlus@_color": "颜色", "obviousAlexC/penPlus@_corner pinch": "拐角收缩", "obviousAlexC/penPlus@_counter clock-wise": "逆时针", @@ -12322,6 +12341,7 @@ "obviousAlexC/penPlus@_get value of [component] in vector 4 [uniformName] in [shader]": "[shader]中的4维向量[uniformName]的[component]", "obviousAlexC/penPlus@_get value of matrix [uniformName] in [shader] as an array": "[shader]中的矩阵[uniformName]", "obviousAlexC/penPlus@_get value of number [uniformName] in [shader]": "[shader]中的数字[uniformName]值", + "obviousAlexC/penPlus@_green Tint": "绿色色调", "obviousAlexC/penPlus@_green tint": "绿色色调", "obviousAlexC/penPlus@_height": "高度", "obviousAlexC/penPlus@_hex code": "hex代码", @@ -12329,11 +12349,14 @@ "obviousAlexC/penPlus@_hue [H] saturation [S] value [V]": "色调[H]饱和度[S]亮度[V]", "obviousAlexC/penPlus@_linear": "线性", "obviousAlexC/penPlus@_maximum depth value": "最大深度值", + "obviousAlexC/penPlus@_mirrored": "镜像", "obviousAlexC/penPlus@_neither way": "不旋转", "obviousAlexC/penPlus@_off": "关闭", "obviousAlexC/penPlus@_on": "打开", + "obviousAlexC/penPlus@_opacity": "不透明度", "obviousAlexC/penPlus@_pen [HSV]": "画笔[HSV]", "obviousAlexC/penPlus@_pen is down?": "画笔落下?", + "obviousAlexC/penPlus@_red Tint": "红色色调", "obviousAlexC/penPlus@_red [R] green [G] blue [B]": "红[R]绿[G]蓝[B]", "obviousAlexC/penPlus@_red tint": "红色色调", "obviousAlexC/penPlus@_remove cubemap named [name]": "移除名为[name]的立方体贴图", @@ -12341,6 +12364,7 @@ "obviousAlexC/penPlus@_remove render texture named [name]": "移除名为[name]的渲染纹理", "obviousAlexC/penPlus@_render textures": "所有渲染纹理", "obviousAlexC/penPlus@_render tris and squares to [name]": "渲染三角形和方块到[name]", + "obviousAlexC/penPlus@_repeat": "重复", "obviousAlexC/penPlus@_reset square Attributes": "重置方形画笔属性", "obviousAlexC/penPlus@_reset triangle attributes": "重置三角形属性", "obviousAlexC/penPlus@_rotation": "旋转", From 578acb9e163aa2f7473ac83a9291a84aaaf89328 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 17:59:32 -0500 Subject: [PATCH 13/22] build(deps-dev): bump eslint from 9.27.0 to 9.28.0 (#2141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [eslint](https://github.com/eslint/eslint) from 9.27.0 to 9.28.0.
Release notes

Sourced from eslint's releases.

v9.28.0

Features

  • b0674be feat: Customization of serialization for languageOptions (#19760) (Nicholas C. Zakas)
  • a95721f feat: Add --pass-on-unpruned-suppressions CLI option (#19773) (Milos Djermanovic)
  • bfd0e7a feat: support TypeScript syntax in no-use-before-define (#19566) (Tanuj Kanti)
  • 68c61c0 feat: support TS syntax in no-shadow (#19565) (Nitin Kumar)
  • 0f773ef feat: support TS syntax in no-magic-numbers (#19561) (Nitin Kumar)
  • c4a6b60 feat: add allowTypeAnnotation to func-style (#19754) (sethamus)
  • b03ad17 feat: add TypeScript support to prefer-arrow-callback (#19678) (Tanuj Kanti)
  • bc3c331 feat: ignore overloaded function declarations in func-style rule (#19755) (sethamus)

Bug Fixes

  • eea3e7e fix: Remove configured global variables from GlobalScope#implicit (#19779) (Milos Djermanovic)
  • a467de3 fix: update context.report types (#19751) (Nitin Kumar)
  • fd467bb fix: remove interopDefault to use jiti's default (#19697) (sethamus)
  • 72d16e3 fix: avoid false positive in no-unassigned-vars for declare module (#19746) (Azat S.)
  • 81c3c93 fix: curly types (#19750) (Eli)

Documentation

  • 3ec2082 docs: Nested arrays in files config entry (#19799) (Nicholas C. Zakas)
  • 89a65b0 docs: clarify how config arrays can apply to subsets of files (#19788) (Shais Ch)
  • 2ba8a0d docs: Add description of meta.namespace to plugin docs (#19798) (Nicholas C. Zakas)
  • 59dd7e6 docs: update func-style with examples (#19793) (Tanuj Kanti)
  • e9129e0 docs: add global scope's implicit field to Scope Manager docs (#19770) (Milos Djermanovic)
  • 52f5b7a docs: fix minor typos and add links (#19743) (루밀LuMir)
  • 00716a3 docs: upfront recommend against using the no-return-await rule (#19727) (Mike DiDomizio)

Chores

  • 175b7b8 chore: upgrade to @eslint/js@9.28.0 (#19802) (Francesco Trotta)
  • 844f5a6 chore: package.json update for @​eslint/js release (Jenkins)
  • 62b1c1b chore: update globals to v16 (#19791) (Nitin Kumar)
  • e8a1cb8 chore: ignore jiti-v2.0 & jiti-v2.1 for renovate (#19786) (Nitin Kumar)
  • 43d3975 chore: Add Copilot Instructions file (#19753) (Nicholas C. Zakas)
  • 2dfb5eb test: update SourceCodeTraverser tests (#19763) (Milos Djermanovic)
  • 5bc21f9 chore: add *.code-workspace to .gitignore (#19771) (루밀LuMir)
  • f4fa40e refactor: NodeEventGenerator -> SourceCodeTraverser (#19679) (Nicholas C. Zakas)
  • 0f49329 refactor: use a service to emit warnings (#19725) (Francesco Trotta)
  • 20a9e59 chore: update dependency shelljs to ^0.10.0 (#19740) (renovate[bot])
Changelog

Sourced from eslint's changelog.

v9.28.0 - May 30, 2025

  • 175b7b8 chore: upgrade to @eslint/js@9.28.0 (#19802) (Francesco Trotta)
  • 844f5a6 chore: package.json update for @​eslint/js release (Jenkins)
  • b0674be feat: Customization of serialization for languageOptions (#19760) (Nicholas C. Zakas)
  • 3ec2082 docs: Nested arrays in files config entry (#19799) (Nicholas C. Zakas)
  • 89a65b0 docs: clarify how config arrays can apply to subsets of files (#19788) (Shais Ch)
  • 2ba8a0d docs: Add description of meta.namespace to plugin docs (#19798) (Nicholas C. Zakas)
  • eea3e7e fix: Remove configured global variables from GlobalScope#implicit (#19779) (Milos Djermanovic)
  • a95721f feat: Add --pass-on-unpruned-suppressions CLI option (#19773) (Milos Djermanovic)
  • a467de3 fix: update context.report types (#19751) (Nitin Kumar)
  • 59dd7e6 docs: update func-style with examples (#19793) (Tanuj Kanti)
  • 62b1c1b chore: update globals to v16 (#19791) (Nitin Kumar)
  • bfd0e7a feat: support TypeScript syntax in no-use-before-define (#19566) (Tanuj Kanti)
  • 68c61c0 feat: support TS syntax in no-shadow (#19565) (Nitin Kumar)
  • e8a1cb8 chore: ignore jiti-v2.0 & jiti-v2.1 for renovate (#19786) (Nitin Kumar)
  • 0f773ef feat: support TS syntax in no-magic-numbers (#19561) (Nitin Kumar)
  • 43d3975 chore: Add Copilot Instructions file (#19753) (Nicholas C. Zakas)
  • c4a6b60 feat: add allowTypeAnnotation to func-style (#19754) (sethamus)
  • fd467bb fix: remove interopDefault to use jiti's default (#19697) (sethamus)
  • 2dfb5eb test: update SourceCodeTraverser tests (#19763) (Milos Djermanovic)
  • b03ad17 feat: add TypeScript support to prefer-arrow-callback (#19678) (Tanuj Kanti)
  • e9129e0 docs: add global scope's implicit field to Scope Manager docs (#19770) (Milos Djermanovic)
  • bc3c331 feat: ignore overloaded function declarations in func-style rule (#19755) (sethamus)
  • 5bc21f9 chore: add *.code-workspace to .gitignore (#19771) (루밀LuMir)
  • 72d16e3 fix: avoid false positive in no-unassigned-vars for declare module (#19746) (Azat S.)
  • f4fa40e refactor: NodeEventGenerator -> SourceCodeTraverser (#19679) (Nicholas C. Zakas)
  • 81c3c93 fix: curly types (#19750) (Eli)
  • 52f5b7a docs: fix minor typos and add links (#19743) (루밀LuMir)
  • 0f49329 refactor: use a service to emit warnings (#19725) (Francesco Trotta)
  • 20a9e59 chore: update dependency shelljs to ^0.10.0 (#19740) (renovate[bot])
  • 00716a3 docs: upfront recommend against using the no-return-await rule (#19727) (Mike DiDomizio)
Commits
  • f341f21 9.28.0
  • 779dda9 Build: changelog update for 9.28.0
  • 175b7b8 chore: upgrade to @eslint/js@9.28.0 (#19802)
  • 844f5a6 chore: package.json update for @​eslint/js release
  • b0674be feat: Customization of serialization for languageOptions (#19760)
  • 3ec2082 docs: Nested arrays in files config entry (#19799)
  • 89a65b0 docs: clarify how config arrays can apply to subsets of files (#19788)
  • 2ba8a0d docs: Add description of meta.namespace to plugin docs (#19798)
  • eea3e7e fix: Remove configured global variables from GlobalScope#implicit (#19779)
  • a95721f feat: Add --pass-on-unpruned-suppressions CLI option (#19773)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=9.27.0&new-version=9.28.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea37eb2d49..b685df5eb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ }, "devDependencies": { "@transifex/api": "^7.1.4", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", @@ -155,9 +155,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", - "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, "license": "MIT", "engines": { @@ -730,9 +730,9 @@ } }, "node_modules/eslint": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", - "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -742,7 +742,7 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.27.0", + "@eslint/js": "9.28.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", diff --git a/package.json b/package.json index fa874a9fcf..7ef7e6c72b 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ }, "devDependencies": { "@transifex/api": "^7.1.4", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", From 5aec3348a4e9041062189bf00b33ff1ac3114906 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 18:22:01 -0500 Subject: [PATCH 14/22] build(deps): bump @turbowarp/types from `9c201e9` to `0cf07a4` (#2151) --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b685df5eb7..f18924befd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,8 +279,8 @@ }, "node_modules/@turbowarp/types": { "version": "0.0.13", - "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#9c201e96c956c2c00d15edae4ff56c351966b26c", - "integrity": "sha512-6WuQyffxV2a9cKFllOPDMkwbXMkZjG+4llC6Clmm3j4doNy+ZiQMelRLQeXBXocbmoS2b/lS7FtsztoLEv4Upg==", + "resolved": "git+ssh://git@github.com/TurboWarp/types-tw.git#0cf07a4b9b5fe05bc1766db216d726c5bf373ec7", + "integrity": "sha512-cToYhdkMSckodStzJQXp9BAA2+vPNVDpX+pCcp5+DLsX6YgeZMANWPXcB1zqFD70vcxz5iODosRsepr+DFpZog==", "license": "Apache-2.0" }, "node_modules/@types/estree": { From ee22d923c445574e993af9432a46856f2a465c53 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sat, 7 Jun 2025 18:45:26 -0500 Subject: [PATCH 15/22] Xeltalliv/simple3D: mark drawable as non-interactive (#2152) Fixes performance issue in https://github.com/TurboWarp/scratch-gui/issues/1026 Relies on https://github.com/TurboWarp/scratch-render/commit/1ffefcf2cdff2fcbe0bc7f0f000521ae2843f3a8 --- extensions/Xeltalliv/simple3D.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/extensions/Xeltalliv/simple3D.js b/extensions/Xeltalliv/simple3D.js index 85bc3831b0..f982f47c33 100644 --- a/extensions/Xeltalliv/simple3D.js +++ b/extensions/Xeltalliv/simple3D.js @@ -1136,6 +1136,13 @@ const drawable = renderer._allDrawables[drawableId]; renderer.updateDrawableSkinId(drawableId, skinId); + // Prevent pick() from trying to read all the pixels from the 3D skin as this drawable does not + // correspond to a target, so it can't be dragged or anything like that. Fixes pick() doing an + // unnecessary GPU -> CPU transfer (very slow) for a collision test whose result doesn't matter. + if (renderer.markDrawableAsNoninteractive) { + renderer.markDrawableAsNoninteractive(drawableId); + } + // Detect resizing drawable.setHighQuality = function (...args) { Object.getPrototypeOf(this).setHighQuality(...args); From ec4d5a5caaa446e93b095d65d1c189c8e040f011 Mon Sep 17 00:00:00 2001 From: Xeltalliv <90340988+Xeltalliv@users.noreply.github.com> Date: Sun, 8 Jun 2025 03:22:51 +0300 Subject: [PATCH 16/22] Xeltalliv/clippingblending: Fix canvas alpha compatibility and other changes (#2142) This: * Fixes compatibility with canvas having alpha, without changing behavior of _any_ old projects compared to how they used to work (at least in theory). * Sorts out long standing issue of some blending modes working incorrectly, by deprecating old block and making a new one, where everything is done in a corrected and clean way. * Adds new blending modes, to provide proper solutions to what was done through bugs. * Adds API, so that [Shaded](https://pen-group.github.io/extensions/) extension can be compatible with this extension, without the need for maintaining a custom fork of it. * Adds a label explaining why there is sometimes no blocks in the palette. ![image](https://github.com/user-attachments/assets/774ba0c9-7373-4ad6-89ba-2afbde218f78) --- extensions/Xeltalliv/clippingblending.js | 182 ++++++++++++++++++----- 1 file changed, 141 insertions(+), 41 deletions(-) diff --git a/extensions/Xeltalliv/clippingblending.js b/extensions/Xeltalliv/clippingblending.js index de4f99405d..9982572cb7 100644 --- a/extensions/Xeltalliv/clippingblending.js +++ b/extensions/Xeltalliv/clippingblending.js @@ -32,13 +32,38 @@ const runtime = vm.runtime; const renderer = vm.renderer; const _drawThese = renderer._drawThese; - const gl = renderer._gl; + const gl = renderer.gl; const canvas = renderer.canvas; + let Drawable = renderer.exports.Drawable; let width = 0; let height = 0; let scratchUnitWidth = 480; let scratchUnitHeight = 360; let penDirty = false; + const publicApi = + runtime.ext_clippingblendingapi ?? (runtime.ext_clippingblendingapi = {}); + if (!publicApi.mainFramebuffer) publicApi.mainFramebuffer = null; + if (!publicApi.setActive) + publicApi.setActive = (value) => { + active = value; + }; + + // prettier-ignore + const Blendings = Object.assign(Object.create(null), { + "default": [gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.FUNC_ADD], + "default behind": [gl.ONE_MINUS_DST_ALPHA, gl.ONE, gl.ONE_MINUS_DST_ALPHA, gl.ONE, gl.FUNC_ADD], + "additive": [gl.ONE, gl.ONE, gl.ZERO, gl.ONE, gl.FUNC_ADD], + "additive with alpha": [gl.ONE, gl.ONE, gl.ONE, gl.ONE, gl.FUNC_ADD], + "additive legacy": [gl.ONE, gl.ONE, gl.ONE, gl.ONE, gl.FUNC_ADD], + "subtract": [gl.ONE, gl.ONE, gl.ZERO, gl.ONE, gl.FUNC_REVERSE_SUBTRACT], + "subtract with alpha": [gl.ONE, gl.ONE, gl.ONE, gl.ONE, gl.FUNC_REVERSE_SUBTRACT], + "subtract legacy": [gl.ONE, gl.ONE, gl.ONE, gl.ONE, gl.FUNC_REVERSE_SUBTRACT], + "multiply": [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.FUNC_ADD], + "invert": [gl.ONE_MINUS_DST_COLOR, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE, gl.FUNC_ADD], + "invert legacy": [gl.ONE_MINUS_DST_COLOR, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_DST_COLOR, gl.ONE_MINUS_SRC_COLOR, gl.FUNC_ADD], + "mask": [gl.ZERO, gl.SRC_ALPHA, gl.ZERO, gl.SRC_ALPHA, gl.FUNC_ADD], + "erase": [gl.ZERO, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE_MINUS_SRC_ALPHA, gl.FUNC_ADD], + }); renderer._drawThese = function (drawables, drawMode, projection, opts) { active = true; @@ -51,8 +76,10 @@ const bfb = gl.bindFramebuffer; gl.bindFramebuffer = function (target, framebuffer) { + let toCanvas = false; if (target == gl.FRAMEBUFFER) { - if (framebuffer == null) { + if (framebuffer == publicApi.mainFramebuffer) { + toCanvas = true; toCorrectThing = true; flipY = false; width = canvas.width; @@ -71,14 +98,18 @@ toCorrectThing = false; } } + if (toCanvas === true) { + Blendings["subtract legacy"][2] = gl.ZERO; + Blendings["invert legacy"][2] = gl.ZERO; + Blendings["invert legacy"][3] = gl.ONE; + } else { + Blendings["subtract legacy"][2] = gl.ONE; + Blendings["invert legacy"][2] = gl.ONE_MINUS_DST_COLOR; + Blendings["invert legacy"][3] = gl.ONE_MINUS_SRC_COLOR; + } bfb.call(this, target, framebuffer); }; - // Getting Drawable - const dr = renderer.createDrawable("background"); - const DrawableProto = renderer._allDrawables[dr].__proto__; - renderer.destroyDrawable(dr, "background"); - function setupModes(clipbox, blendMode, flipY) { if (clipbox) { gl.enable(gl.SCISSOR_TEST); @@ -95,41 +126,23 @@ } else { gl.disable(gl.SCISSOR_TEST); } - switch (blendMode) { - case "additive": - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE, gl.ONE); - break; - case "subtract": - gl.blendEquation(gl.FUNC_REVERSE_SUBTRACT); - gl.blendFunc(gl.ONE, gl.ONE); - break; - case "multiply": - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA); - break; - case "invert": - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE_MINUS_DST_COLOR, gl.ONE_MINUS_SRC_COLOR); - break; - default: - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } + const blend = Blendings[blendMode] ?? Blendings.default; + gl.blendEquation(blend[4]); + gl.blendFuncSeparate(blend[0], blend[1], blend[2], blend[3]); } // Modifying and expanding Drawable - const gu = DrawableProto.getUniforms; - DrawableProto.getUniforms = function () { + const gu = Drawable.prototype.getUniforms; + Drawable.prototype.getUniforms = function () { if (active && toCorrectThing) { setupModes(this.clipbox, this.blendMode, flipY); } return gu.call(this); }; - DrawableProto.updateClipBox = function (clipbox) { + Drawable.prototype.updateClipBox = function (clipbox) { this.clipbox = clipbox; }; - DrawableProto.updateBlendMode = function (blendMode) { + Drawable.prototype.updateBlendMode = function (blendMode) { this.blendMode = blendMode; }; @@ -291,6 +304,11 @@ color3: "#774DCB", menuIconURI: icon, blocks: [ + { + blockType: Scratch.BlockType.LABEL, + text: Scratch.translate("Stage selected: no blocks"), + filter: [Scratch.TargetType.STAGE], + }, { opcode: "setClipbox", blockType: Scratch.BlockType.COMMAND, @@ -341,9 +359,23 @@ }, "---", { - opcode: "setBlend", + opcode: "setBlend2", blockType: Scratch.BlockType.COMMAND, text: Scratch.translate("use [BLENDMODE] blending"), + arguments: { + BLENDMODE: { + type: Scratch.ArgumentType.STRING, + defaultValue: "default", + menu: "blends2", + }, + }, + filter: [Scratch.TargetType.SPRITE], + extensions: ["colours_looks"], + }, + { + opcode: "setBlend", + blockType: Scratch.BlockType.COMMAND, + text: Scratch.translate("use [BLENDMODE] blending (old)"), arguments: { BLENDMODE: { type: Scratch.ArgumentType.STRING, @@ -352,6 +384,7 @@ }, }, filter: [Scratch.TargetType.SPRITE], + hideFromPalette: true, extensions: ["colours_looks"], }, { @@ -400,10 +433,34 @@ acceptReporters: true, items: [ { text: Scratch.translate("default"), value: "default" }, + { text: Scratch.translate("additive"), value: "additive" }, // -> additive legacy + { text: Scratch.translate("subtract"), value: "subtract" }, // -> subtract legacy + { text: Scratch.translate("multiply"), value: "multiply" }, + { text: Scratch.translate("invert"), value: "invert" }, // -> invert legacy + ], + }, + blends2: { + acceptReporters: true, + items: [ + { text: Scratch.translate("default"), value: "default" }, + { + text: Scratch.translate("default behind"), + value: "default behind", + }, { text: Scratch.translate("additive"), value: "additive" }, + { + text: Scratch.translate("additive with alpha"), + value: "additive with alpha", + }, { text: Scratch.translate("subtract"), value: "subtract" }, + { + text: Scratch.translate("subtract with alpha"), + value: "subtract with alpha", + }, { text: Scratch.translate("multiply"), value: "multiply" }, { text: Scratch.translate("invert"), value: "invert" }, + { text: Scratch.translate("mask"), value: "mask" }, + { text: Scratch.translate("erase"), value: "erase" }, ], }, props: { @@ -479,18 +536,45 @@ } setBlend({ BLENDMODE }, { target }) { - let newValue = null; switch (BLENDMODE) { + case "additive": + this._setBlend("additive legacy", target); + return; + case "subtract": + this._setBlend("subtract legacy", target); + return; + case "invert": + this._setBlend("invert legacy", target); + return; case "default": + case "multiply": + this._setBlend(BLENDMODE, target); + return; + default: + return; + } + } + + setBlend2({ BLENDMODE }, { target }) { + switch (BLENDMODE) { + case "default": + case "default behind": case "additive": + case "additive with alpha": case "subtract": + case "subtract with alpha": case "multiply": case "invert": - newValue = BLENDMODE; - break; + case "mask": + case "erase": + this._setBlend(BLENDMODE, target); + return; default: return; } + } + + _setBlend(newValue, target) { if (target.isStage) return; penDirty = true; target.blendMode = newValue; @@ -508,16 +592,32 @@ } getBlend(args, { target }) { - return target.blendMode ?? "default"; + switch (target.blendMode) { + case "additive legacy": + return "additive"; + case "subtract legacy": + return "subtract"; + case "invert legacy": + return "invert"; + default: + return target.blendMode ?? "default"; + } } - setAdditiveBlend({ STATE }, util) { - if (STATE === "on") this.setBlend({ BLENDMODE: "additive" }, util); - if (STATE === "off") this.setBlend({ BLENDMODE: "default" }, util); + setAdditiveBlend({ STATE }, { target }) { + if (STATE === "on") this._setBlend("additive legacy", target); + if (STATE === "off") this._setBlend("default", target); } getAdditiveBlend(args, { target }) { - return target.blendMode === "additive"; + switch (target.blendMode) { + case "additive": + case "additive legacy": + case "additive with alpha": + return true; + default: + return false; + } } } From 05dae3bf2861d0eca181fac0265e69f5b7f2007a Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sun, 8 Jun 2025 13:29:41 -0500 Subject: [PATCH 17/22] SharkPool/Camera: improve performance after many drawables created and deleted (#2153) Iterating over _allDrawables causes performance problems, example in an unrelated extension: https://github.com/TurboWarp/extensions/issues/1153 Code is similar to https://github.com/TurboWarp/scratch-render/commit/2f24d177ebe39d92fcfca88d5d2c0cc01c4d2205 --- extensions/SharkPool/Camera.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/extensions/SharkPool/Camera.js b/extensions/SharkPool/Camera.js index 1acf35987f..df0bf6e469 100644 --- a/extensions/SharkPool/Camera.js +++ b/extensions/SharkPool/Camera.js @@ -120,9 +120,10 @@ } function updateCamera(camera) { - for (let i = 0; i < render._allDrawables.length; i++) { - const drawable = render._allDrawables[i]; - if (!drawable || !drawable.getVisible() || !drawable.skin) continue; + for (let i = 0; i < render._drawList.length; i++) { + const drawableId = render._drawList[i]; + const drawable = render._allDrawables[drawableId]; + if (!drawable.getVisible() || !drawable.skin) continue; if (!drawable[cameraSymbol]) setupState(drawable); const camSystem = drawable[cameraSymbol]; @@ -639,13 +640,15 @@ }); // Custom Drawable Layer (CST's 3D or Simple3D Exts for Example) - for (var i = 0; i < render._allDrawables.length; i++) { - const drawable = render._allDrawables[i]; - if (drawable !== undefined && drawable.customDrawableName !== undefined) + for (var i = 0; i < render._drawList.length; i++) { + const drawableId = render._drawList[i]; + const drawable = render._allDrawables[drawableId]; + if (drawable.customDrawableName !== undefined) { objectNames.push({ text: drawable.customDrawableName, - value: `${i}=SP-custLayer`, + value: `${drawableId}=SP-custLayer`, }); + } } // Sprites From b7b3a4881b546b482400c33443e188a945dfa9e5 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Wed, 11 Jun 2025 10:49:21 -0500 Subject: [PATCH 18/22] [Automated] Update translations 2025-06-11 (#2159) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 2 ++ translations/extension-runtime.json | 1 + 2 files changed, 3 insertions(+) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index 006f9d1977..71348c9c96 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -527,6 +527,8 @@ "runtime-options@name": "Opzioni Esecuzione", "shreder95ua/resolution@description": "Restituisce la risoluzione dello schermo principale.", "shreder95ua/resolution@name": "Risoluzione Schermo", + "sound@description": "Riproduci suoni da qualsiasi URL. Precedentemente noto come \"Suoni\".", + "sound@name": "Riproduzione da URL", "steamworks@description": "Collega il tuo progetto all'API di Steamworks.", "stretch@description": "Stira gli sprite in orizzontale e in verticale.", "stretch@name": "Stira", diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index aadd0c151c..3627cf611b 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -2823,6 +2823,7 @@ "runtime-options@_stage size": "dimensioni Stage", "runtime-options@_turbo mode": "modalità turbo", "runtime-options@_width": "larghezza", + "sound@_URL Playback": "Riproduzione da URL", "sound@_play sound from url: [path] until done": "avvia riproduzione suono da url: [path] e attendi la fine", "sound@_start sound from url: [path]": "riproduci suono da url: [path]", "steamworks@_name": "nome", From f03effd0935f278866b4531a0e1f23676fd8947e Mon Sep 17 00:00:00 2001 From: CST1229 <68464103+CST1229@users.noreply.github.com> Date: Sat, 14 Jun 2025 06:03:16 +0200 Subject: [PATCH 19/22] cloudlink: make every (non-localhost) server ID behave like 7 (#2164) this is a bit of a "PR made slightly out of anger". "use server 7" is almost memetic in the TW server, and some people think CL is broken because people try to connect to e.g server ID 1 and it doesn't work. 7 is the only server left anyways. (0 still remains as localhost though) --- extensions/cloudlink.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/cloudlink.js b/extensions/cloudlink.js index 68507f62a7..86b5b569be 100644 --- a/extensions/cloudlink.js +++ b/extensions/cloudlink.js @@ -2178,6 +2178,10 @@ console.warn("[CloudLink] Already connected to a server."); return; } + // This is the only server that's listed and works. + if (Scratch.Cast.toNumber(args.ID) >= 1) { + args.ID = 7; + } if ( !Object.prototype.hasOwnProperty.call( clVars.serverList, From 0dafa9bc0f51494135942423f0c6ac552bd874e7 Mon Sep 17 00:00:00 2001 From: Dango Cat Date: Sat, 14 Jun 2025 11:26:41 -0500 Subject: [PATCH 20/22] [Automated] Update translations 2025-06-14 (#2167) This pull request was made by a robot. Co-authored-by: DangoCat[bot] --- translations/extension-metadata.json | 2 +- translations/extension-runtime.json | 81 ++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index 71348c9c96..09be45a31e 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -1763,7 +1763,7 @@ "TheShovel/LZ-String@description": "使用 LZ-string 压缩与解压文本。", "TheShovel/LZ-String@name": "LZ 压缩", "TheShovel/ShovelUtils@description": "一些杂七杂八的积木。", - "Xeltalliv/clippingblending@description": "在指定的区域与颜色混合模式进行裁剪。", + "Xeltalliv/clippingblending@description": "在指定的矩形区域进行裁剪以及不同模式的颜色混合。", "Xeltalliv/clippingblending@name": "裁剪与颜色混合", "Xeltalliv/simple3D@description": "轻松制作适用于 GPU 加速的 3D 项目。", "Xeltalliv/simple3D@name": "简单 3D", diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 3627cf611b..57f22a0aed 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -8029,7 +8029,18 @@ "-SIPC-/consoles@_Error": "Błąd", "-SIPC-/consoles@_Group": "Grupa", "-SIPC-/consoles@_Time": "Czas", - "-SIPC-/time@_January": "styczeń", + "-SIPC-/time@_April": "kwietniu", + "-SIPC-/time@_August": "sierpniu", + "-SIPC-/time@_December": "grudniu", + "-SIPC-/time@_February": "lutym", + "-SIPC-/time@_January": "styczniu", + "-SIPC-/time@_July": "lipcu", + "-SIPC-/time@_June": "czerwcu", + "-SIPC-/time@_March": "marcu", + "-SIPC-/time@_May": "maju", + "-SIPC-/time@_November": "listopadzie", + "-SIPC-/time@_October": "październiku", + "-SIPC-/time@_September": "wrześniu", "-SIPC-/time@_Time": "Czas", "-SIPC-/time@_day": "dzień", "-SIPC-/time@_hour": "godzina", @@ -8043,10 +8054,13 @@ "0832/rxFS2@open": "otwórz [STR]", "0832/rxFS2@search": "szukaj [STR]", "CST1229/images@_Images": "Obrazy", + "CST1229/images@_bottom": "dół", "CST1229/images@_height": "wysokość", + "CST1229/images@_top": "góra", "CST1229/images@_width": "szerokość", "CST1229/zip@_[META] of [FILE]": "[META] z [FILE]", "CST1229/zip@_archive": "archiwum", + "CST1229/zip@_comment": "komentarz", "CST1229/zip@_delete [FILE]": "usuń [FILE]", "CST1229/zip@_name": "nazwa", "CST1229/zip@_new file": "nowy plik", @@ -8055,14 +8069,35 @@ "Clay/htmlEncode@_Hello!": "Cześć!", "CubesterYT/KeySimulation@_space": "spacja", "CubesterYT/TurboHook@_name": "nazwa", + "CubesterYT/WindowControls@_bottom": "dół", + "CubesterYT/WindowControls@_close window": "zamknij okno", + "CubesterYT/WindowControls@_screen height": "wysokość ekranu", + "CubesterYT/WindowControls@_screen width": "szerokość ekranu", + "CubesterYT/WindowControls@_top": "góra", + "CubesterYT/WindowControls@_window height": "wysokość okna", + "CubesterYT/WindowControls@_window title": "tytuł okna", + "CubesterYT/WindowControls@_window width": "szerokość okna", + "CubesterYT/WindowControls@_window x": "x okna", + "CubesterYT/WindowControls@_window y": "y okna", "DT/cameracontrols@_background color": "kolor tła", "JeremyGamer13/tween@_direction": "kierunek", "JeremyGamer13/tween@_size": "wielkość", "JeremyGamer13/tween@_x position": "pozycja x", "JeremyGamer13/tween@_y position": "pozycja y", + "Lily/Assets@_all costumes": "wszystkie kostiumy", + "Lily/Assets@_all sounds": "wszystkie dźwięki", + "Lily/Assets@_all sprites": "wszystkie duszki", + "Lily/Assets@_delete costume [COSTUME]": "usuń kostium [COSTUME]", + "Lily/Assets@_delete sound [SOUND]": "usuń dźwięk [SOUND]", + "Lily/Assets@_delete sprite [TARGET]": "usuń duszka [TARGET]", "Lily/Assets@_name": "nazwa", + "Lily/Assets@_rename costume [COSTUME] to [NAME]": "zmień nazwę kostiumu [COSTUME] na [NAME]", + "Lily/Assets@_rename sound [SOUND] to [NAME]": "zmień nazwę dźwięku [SOUND] na [NAME]", + "Lily/Assets@_rename sprite [TARGET] to [NAME]": "zmień nazwę duszka [TARGET] na [NAME]", + "Lily/Assets@_sprite [EXPORT]": "[EXPORT] duszka", "Lily/Assets@_sprite name": "nazwa duszka", "Lily/Cast@_number": "liczba", + "Lily/ClonesPlus@_Clones+": "Klony+", "Lily/ClonesPlus@_clone count": "liczba klonów", "Lily/ClonesPlus@_costume name": "nazwa kostiumu", "Lily/ClonesPlus@_direction": "kierunek", @@ -8071,13 +8106,22 @@ "Lily/ClonesPlus@_volume": "głośność", "Lily/ClonesPlus@_x position": "pozycja x", "Lily/ClonesPlus@_y position": "pozycja y", + "Lily/CommentBlocks@_comment": "komentarz", + "Lily/HackedBlocks@_Hidden Blocks": "Ukryte Bloki", + "Lily/LooksPlus@_Looks+": "Wygląd+", + "Lily/LooksPlus@_[TARGET] visible?": "[TARGET] widoczny?", "Lily/LooksPlus@_brightness": "jasność", "Lily/LooksPlus@_color": "kolor", + "Lily/LooksPlus@_fisheye": "rybie oko", "Lily/LooksPlus@_height": "wysokość", + "Lily/LooksPlus@_hide [TARGET]": "ukryj [TARGET]", + "Lily/LooksPlus@_show [TARGET]": "pokaż [TARGET]", "Lily/LooksPlus@_width": "szerokość", "Lily/MoreEvents@_false": "fałsz", + "Lily/MoreEvents@_true": "prawda", "Lily/Skins@_height": "wysokość", "Lily/Skins@_width": "szerokość", + "Lily/SoundExpanded@_length": "długość", "Lily/Video@_Video": "Film", "Lily/Video@_height": "wysokość", "Lily/Video@_volume": "głośność", @@ -8088,16 +8132,28 @@ "Lily/lmsutils@_color": "kolor", "Lily/lmsutils@_color [COLOUR]": "kolor [COLOUR]", "Lily/lmsutils@_false": "fałsz", + "Lily/lmsutils@_fisheye": "rybie oko", "Lily/lmsutils@_green flag": "zielona flaga", "Lily/lmsutils@_height": "wysokość", "Lily/lmsutils@_is clone?": "jest klonem?", "Lily/lmsutils@_key [KEY_OPTION] pressed?": "klawisz [KEY_OPTION] naciśnięty?", "Lily/lmsutils@_number": "liczba", "Lily/lmsutils@_text": "tekst", + "Lily/lmsutils@_true": "prawda", "Lily/lmsutils@_width": "szerokość", + "Longboost/color_channels@_blue": "niebieski", "Longboost/color_channels@_false": "fałsz", + "Longboost/color_channels@_green": "zielony", + "Longboost/color_channels@_red": "czerwony", + "Longboost/color_channels@_true": "prawda", + "NOname-awa/graphics2d@area": "powierzchnia", "NOname-awa/more-comparisons@_false": "fałsz", + "NOname-awa/more-comparisons@_true": "prawda", + "NexusKitten/controlcontrols@_[OPTION] exists?": "[OPTION] istnieje?", "NexusKitten/controlcontrols@_green flag": "zielona flaga", + "NexusKitten/controlcontrols@_hide [OPTION]": "ukryj [OPTION]", + "NexusKitten/controlcontrols@_show [OPTION]": "pokaż [OPTION]", + "NexusKitten/moremotion@_change x: [X] y: [Y]": "zmień x: [X] y: [Y]", "NexusKitten/moremotion@_height": "wysokość", "NexusKitten/moremotion@_width": "szerokość", "SharkPool/Camera@_Stage": "Scena", @@ -8107,6 +8163,10 @@ "TheShovel/CanvasEffects@_saturation": "nasycenie", "TheShovel/CanvasEffects@_scale": "skala", "TheShovel/CanvasEffects@_transparency": "przezroczystość", + "TheShovel/ColorPicker@_blue": "niebieski", + "TheShovel/ColorPicker@_green": "zielony", + "TheShovel/ColorPicker@_red": "czerwony", + "TheShovel/ShovelUtils@_all sprites": "wszystkie duszki", "Xeltalliv/clippingblending@_height": "wysokość", "Xeltalliv/clippingblending@_width": "szerokość", "ZXMushroom63/searchApi@_name": "nazwa", @@ -8122,6 +8182,7 @@ "files@_text": "tekst", "gamejolt@_Close": "Zamknij", "gamejolt@_Open": "Otwórz", + "gamejolt@_comment": "komentarz", "gamejolt@_day": "dzień", "gamejolt@_hour": "godzina", "gamejolt@_minute": "minuta", @@ -8148,6 +8209,7 @@ "numerical-encoding-2@_Hello": "Cześć", "obviousAlexC/SensingPlus@_brightness": "jasność", "obviousAlexC/SensingPlus@_color": "kolor", + "obviousAlexC/SensingPlus@_fisheye": "rybie oko", "obviousAlexC/newgroundsIO@_Today": "Dzisiaj", "obviousAlexC/newgroundsIO@_game version": "wersja gry", "obviousAlexC/newgroundsIO@_score": "wynik", @@ -8165,6 +8227,7 @@ "qxsck/var-and-list@name": "Zmienna i lista", "rixxyx@_false": "fałsz", "rixxyx@_time": "czas", + "rixxyx@_true": "prawda", "runtime-options@_Runtime Options": "Opcje Uruchamiania", "runtime-options@_height": "wysokość", "runtime-options@_set clone limit to [limit]": "ustaw limit klonów na [limit]", @@ -8173,11 +8236,14 @@ "runtime-options@_width": "szerokość", "steamworks@_false": "fałsz", "steamworks@_name": "nazwa", + "steamworks@_true": "prawda", "text@_Text": "Tekst", "true-fantom/couplers@_color [COLOUR]": "kolor [COLOUR]", "true-fantom/couplers@_false": "fałsz", + "true-fantom/couplers@_true": "prawda", "true-fantom/network@_browser": "przeglądarka", - "utilities@_false": "fałsz" + "utilities@_false": "fałsz", + "utilities@_true": "prawda" }, "pt": { "-SIPC-/consoles@_Error": "Erro", @@ -11605,14 +11671,19 @@ "TheShovel/ShovelUtils@_set editing target to [NAME]": "将当前编辑角色设为[NAME]", "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "将列表[NAME]设为[TEXT]", "Xeltalliv/clippingblending@_Clipping & Blending": "裁剪与颜色混合", + "Xeltalliv/clippingblending@_Stage selected: no blocks": "选中舞台时无可用积木", "Xeltalliv/clippingblending@_additive": "加法", + "Xeltalliv/clippingblending@_additive with alpha": "带有透明度的加法", "Xeltalliv/clippingblending@_blending": "混合模式", "Xeltalliv/clippingblending@_clear clipping box": "清除裁剪框", "Xeltalliv/clippingblending@_clipping box [PROP]": "裁剪框[PROP]", - "Xeltalliv/clippingblending@_default": "默认类型", + "Xeltalliv/clippingblending@_default": "默认", + "Xeltalliv/clippingblending@_default behind": "默认后方", + "Xeltalliv/clippingblending@_erase": "擦除", "Xeltalliv/clippingblending@_height": "高度", "Xeltalliv/clippingblending@_invert": "反色", "Xeltalliv/clippingblending@_is additive blending on?": "加法混合开启?", + "Xeltalliv/clippingblending@_mask": "遮罩", "Xeltalliv/clippingblending@_max x": "右x", "Xeltalliv/clippingblending@_max y": "上y", "Xeltalliv/clippingblending@_min x": "左x", @@ -11621,9 +11692,11 @@ "Xeltalliv/clippingblending@_off": "关闭", "Xeltalliv/clippingblending@_on": "打开", "Xeltalliv/clippingblending@_set clipping box x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]": "将裁剪框设为x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]", - "Xeltalliv/clippingblending@_subtract": "差值", + "Xeltalliv/clippingblending@_subtract": "减法", + "Xeltalliv/clippingblending@_subtract with alpha": "带有透明度的减法", "Xeltalliv/clippingblending@_turn additive blending [STATE]": "加法混合 [STATE]", "Xeltalliv/clippingblending@_use [BLENDMODE] blending": "使用[BLENDMODE]混合模式", + "Xeltalliv/clippingblending@_use [BLENDMODE] blending (old)": "使用[BLENDMODE]混合模式(旧)", "Xeltalliv/clippingblending@_width": "宽度", "XeroName/Deltatime@_Delta Time": "帧间隔", "XmerOriginals/closecontrol@_Ask Before Closing Tab": "关闭页面时询问", From 3daea524e8f7be9427b8a9160da59c40b714ec47 Mon Sep 17 00:00:00 2001 From: SharkPool <139097378+SharkPool-SP@users.noreply.github.com> Date: Wed, 18 Jun 2025 21:13:03 -0700 Subject: [PATCH 21/22] Lily/ListTools: Fix 'repeat x times in list' only adding to extractor list (#2172) Fixes: https://github.com/TurboWarp/extensions/issues/2093 --- extensions/Lily/ListTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Lily/ListTools.js b/extensions/Lily/ListTools.js index a00aabda14..01e0dc169a 100644 --- a/extensions/Lily/ListTools.js +++ b/extensions/Lily/ListTools.js @@ -477,7 +477,7 @@ if (!list2) return; const currentVal = list1.value; for (let i = 0; i < args.NUM; i++) { - list1.value = list1.value.concat(currentVal); + list2.value = list2.value.concat(currentVal); } } From 6045d7040b25018f95075981a10abe798d54397b Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Wed, 18 Jun 2025 21:55:07 -0700 Subject: [PATCH 22/22] utilities: fix letters erroring if input string is a number (#2173) --- extensions/utilities.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/utilities.js b/extensions/utilities.js index 592f71b9e5..2f470d2437 100644 --- a/extensions/utilities.js +++ b/extensions/utilities.js @@ -330,7 +330,10 @@ } letters({ STRING, START, END }) { - return STRING.slice(Math.max(1, START) - 1, Math.min(STRING.length, END)); + return Scratch.Cast.toString(STRING).slice( + Math.max(1, START) - 1, + Math.min(STRING.length, END) + ); } clamp({ INPUT, MIN, MAX }) {