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 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); } } diff --git a/extensions/Lily/Skins.js b/extensions/Lily/Skins.js index 9968571ce4..b08742fc60 100644 --- a/extensions/Lily/Skins.js +++ b/extensions/Lily/Skins.js @@ -17,30 +17,71 @@ 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(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; + }; + /** * @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 +272,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 +296,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 +334,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 +373,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 +387,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 +426,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 +452,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 +517,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" || 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 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; + } } } 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); 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, 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 }) { 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 877bfbf84c..55105c2c9f 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 @@ -313,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 diff --git a/package-lock.json b/package-lock.json index 792c4ed943..f18924befd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,8 +20,8 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "@transifex/api": "^7.1.3", - "eslint": "^9.27.0", + "@transifex/api": "^7.1.4", + "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": { @@ -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": { @@ -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#0cf07a4b9b5fe05bc1766db216d726c5bf373ec7", + "integrity": "sha512-cToYhdkMSckodStzJQXp9BAA2+vPNVDpX+pCcp5+DLsX6YgeZMANWPXcB1zqFD70vcxz5iODosRsepr+DFpZog==", "license": "Apache-2.0" }, "node_modules/@types/estree": { @@ -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 c16781c57b..7ef7e6c72b 100644 --- a/package.json +++ b/package.json @@ -37,8 +37,8 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "@transifex/api": "^7.1.3", - "eslint": "^9.27.0", + "@transifex/api": "^7.1.4", + "eslint": "^9.28.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index d1f48f0ae8..09be45a31e 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." }, @@ -512,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", @@ -1399,6 +1416,8 @@ "runtime-options@name": "Опции Выполнения", "shreder95ua/resolution@description": "Получает разрешение основного экрана.", "shreder95ua/resolution@name": "Разрешение Экрана", + "sound@description": "Воспроизведение звуков с URL-адресов. Ранее называлось «Звук».", + "sound@name": "Воспроизведение URL-адреса", "steamworks@description": "Подключите свой проект к Steamworks API.", "stretch@description": "Растягивает спрайты горизонтально или вертикально.", "stretch@name": "Растяжение", @@ -1704,7 +1723,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": "声音扩展", @@ -1724,7 +1743,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": "移动舞台的可见部分。", @@ -1735,15 +1755,15 @@ "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 压缩与解压文本。", "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", @@ -1766,6 +1786,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": "使用自定义指针或者隐藏指针。又或者用造型图片替换指针。", @@ -1780,7 +1801,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": "动画文字", @@ -1810,6 +1832,8 @@ "runtime-options@name": "运行时选项", "shreder95ua/resolution@description": "获取主屏幕的分辨率。", "shreder95ua/resolution@name": "屏幕分辨率", + "sound@description": "从 URL 播放声音。旧称“声音”。", + "sound@name": "URL 播放", "steamworks@description": "将你的项目连接到 Steamworks API。", "stretch@description": "水平或竖直拉伸角色。", "stretch@name": "拉伸", @@ -1827,7 +1851,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 fc6972b7e7..57f22a0aed 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", @@ -2806,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", @@ -8011,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", @@ -8025,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", @@ -8037,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", @@ -8053,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ść", @@ -8070,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", @@ -8089,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", @@ -8104,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", @@ -8130,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", @@ -8147,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]", @@ -8155,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", @@ -8501,6 +8585,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": "направление", @@ -9775,11 +9861,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": "числитель по-часам", @@ -9819,6 +9908,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", @@ -9826,11 +9916,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]", @@ -9838,6 +9931,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": "поворот", @@ -9965,6 +10059,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 страны", @@ -10739,7 +10834,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] 下的所有文件", @@ -10813,8 +10908,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": "文本", @@ -10878,11 +10973,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": "顶部右侧", @@ -10896,7 +10991,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": "摄像机的方向", @@ -10910,12 +11005,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]度", @@ -10989,13 +11084,15 @@ "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": "方向", "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]的克隆体的脚本", @@ -11005,7 +11102,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": "注释", @@ -11034,8 +11131,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]", @@ -11059,8 +11156,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": "漩涡", @@ -11156,8 +11253,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": "视频", @@ -11178,8 +11275,8 @@ "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 video [NAME] to [LOOP]": "设置视频[NAME]为[LOOP]", + "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]", "Lily/Video@_start video [NAME] at [DURATION] seconds": "从[DURATION]秒开始播放视频[NAME]", @@ -11251,8 +11348,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": "额外数据", @@ -11276,7 +11373,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": "周长", @@ -11320,21 +11417,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": "震动", @@ -11342,13 +11440,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@_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@_default": "默认类型", + "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@_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 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]", @@ -11375,46 +11506,55 @@ "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": "值", - "TheShovel/CanvasEffects@_Canvas Effects": "Canvas 特效", + "Skyhigh173/json@_variance": "方差", + "TheShovel/CanvasEffects@_Canvas Effects": "画布效果", "TheShovel/CanvasEffects@_background": "背景", "TheShovel/CanvasEffects@_blur": "模糊", "TheShovel/CanvasEffects@_border color": "边缘颜色", @@ -11423,6 +11563,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": "虚线", @@ -11446,24 +11587,24 @@ "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 render size to width: [X] height: [Y]": "设置画布渲染尺寸为宽:[X]高:[Y]", - "TheShovel/CanvasEffects@_set canvas resize rendering mode [EFFECT]": "设置画布重设尺寸渲染模式为[EFFECT]", + "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 倾斜", "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 position to x: [X] y: [Y]": "设置取色器位置为 x: [X] y: [Y]", - "TheShovel/ColorPicker@_show color picker": "显示取色器", + "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": "自定义样式", "TheShovel/CustomStyles@_ask prompt background": "提问框背景", @@ -11498,13 +11639,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 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 [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 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": "变量值背景", @@ -11527,17 +11668,22 @@ "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@_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", @@ -11545,17 +11691,19 @@ "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@_subtract": "差值", + "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 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": "关闭页面时询问", "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]", @@ -11565,7 +11713,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": "组合", @@ -11582,7 +11730,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]", @@ -11620,27 +11768,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.setGravity": "设置重力方向为x[gx] y[gy]", - "box2d@griffpatch.setPhysics": "设置[shape]的物理模式为[mode]", + "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.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.setStatic": "设置移动模式为[static]", - "box2d@griffpatch.setTickRate": "设置每秒模拟次数为[rate]", - "box2d@griffpatch.setVelocity": "设置角色重力方向为 sx[sx] sy [sy]", + "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.setTickRate": "将每秒模拟次数设为[rate]", + "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": "检测云数据", @@ -11706,7 +11854,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": "从所有房间断开连接", @@ -11728,8 +11876,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}(实验性)", @@ -11756,7 +11904,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?", @@ -11863,9 +12011,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": "封禁状态", @@ -11910,31 +12058,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] 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": "删除多部分表单中的[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": "将多部分表单中的[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 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": "当有请求失败", @@ -11956,21 +12108,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": "视点", @@ -12024,7 +12176,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": "显示的文本", @@ -12037,12 +12189,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 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 [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]": "将宽度设为[WIDTH]样式[ALIGN]", "lab/text@_show sprite": "显示角色", "lab/text@_show text [TEXT]": "显示文本[TEXT]", "lab/text@_start [ANIMATE] animation": "显示动画样式[ANIMATE]", @@ -12054,14 +12209,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]的值", @@ -12079,9 +12234,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!": "你好,世界!", @@ -12111,6 +12266,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": "颜色", @@ -12137,7 +12296,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]特效", @@ -12209,11 +12368,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": "逆时针", @@ -12253,6 +12415,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代码", @@ -12260,11 +12423,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]的立方体贴图", @@ -12272,13 +12438,14 @@ "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": "旋转", "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]", @@ -12290,11 +12457,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]", @@ -12318,7 +12485,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]里所有数字的中位数", @@ -12362,6 +12529,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 很酷,不是吗?", @@ -12385,11 +12553,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": "加速模式", @@ -12399,6 +12567,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 所属地", @@ -12410,25 +12579,30 @@ "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": "精确标题", "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] 匹配的数量", @@ -12443,6 +12617,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": "进制转换", @@ -12465,6 +12644,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) 文本", @@ -12504,7 +12685,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]是正则吗?", @@ -12537,6 +12718,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: ": "你输入的值:", @@ -12552,7 +12734,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]键盘并等待",