From 07e686d2518d4615c23ceed60924dd87308d609c Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:29:28 -0400 Subject: [PATCH 01/50] Update extensions.json Add "MasterMath/midi" --- extensions/extensions.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/extensions.json b/extensions/extensions.json index 9027c00ac9..fcd3059360 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -31,6 +31,7 @@ "Lily/LooksPlus", "Lily/MoreEvents", "Lily/ListTools", + "MasterMath/midi", "veggiecan/mobilekeyboard", "NexusKitten/moremotion", "CubesterYT/WindowControls", From c1a34591a22077d0142fb5a13b9d8c9cfe00160b Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:31:54 -0400 Subject: [PATCH 02/50] Create midi.js --- extensions/MasterMath/midi.js | 199 ++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 extensions/MasterMath/midi.js diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js new file mode 100644 index 0000000000..837a976017 --- /dev/null +++ b/extensions/MasterMath/midi.js @@ -0,0 +1,199 @@ +// Name: MIDI +// ID: midi +// Description: An extension that retrieves input from MIDI devices. +// By: -MasterMath- +// License: MPL-2.0 + +(function(Scratch) { + 'use strict'; + + if (!Scratch.extensions.unsandboxed) { + alert('This MIDI extension must run unsandboxed!'); + throw new Error('This MIDI extension must run unsandboxed!'); + } + + let midiInputDevices = []; + let midiDeviceInfo = []; + let notesOn = []; + let noteVelocities = []; + let lastNotePressed = 0; + let lastNoteReleased = 0; + + if (navigator.requestMIDIAccess) { + navigator.requestMIDIAccess().then(onSuccess, onError); + + function onSuccess(midiAccess) { + //List connected midi input devices + for (const entry of midiAccess.inputs) { + const input = entry[1]; + midiInputDevices.push([`[id: "${input.id}"` + ` name: "${input.name}"]`]); + midiDeviceInfo.push([input.id, input.name]); + } + + function onMIDIMessage(event) { + const [status, note, velocity] = event.data; + const command = status & 0xF0; + + if (command === 0x90 && velocity > 0) { + notesOn.push(note); + noteVelocities.push([note, velocity]); + + lastNotePressed = note; + + Scratch.vm.runtime.startHats('midi_whenNotePressed'); + } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { + notesOn.splice(notesOn.indexOf(note), 1); + noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); + + lastNoteReleased = note; + + Scratch.vm.runtime.startHats('midi_whenNoteReleased'); + } else { + console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); + } + } + + midiAccess.inputs.forEach((entry) => { + entry.onmidimessage = onMIDIMessage; + }); + } + + function onError(err) { + alert("MIDI Access Error:", err); + throw new Error("MIDI Access Error:", err); + } + + } else { + alert("MIDI is not supported on this browser."); + throw new Error("MIDI is not supported on this browser."); + } + + class MIDI { + getInfo() { + return { + id: 'midi', + name: 'MIDI', + blocks: [ + { + opcode: 'MIDIinputDevices', + blockType: Scratch.BlockType.REPORTER, + text: 'connected MIDI input devices', + disableMonitor: true, + }, + { + opcode: 'midiDeviceInfo', + blockType: Scratch.BlockType.REPORTER, + text: '[info] of MIDI device [number]', + arguments: { + info: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'name', + menu: 'infoMenu', + }, + number: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0, + } + } + }, + { + opcode: 'whenNotePressed', + blockType: Scratch.BlockType.EVENT, + text: 'when any note pressed', + isEdgeActivated: false, + shouldRestartExistingThreads: true, + }, + { + opcode: 'whenNoteReleased', + blockType: Scratch.BlockType.EVENT, + text: 'when any note released', + isEdgeActivated: false, + shouldRestartExistingThreads: true, + }, + { + opcode: 'noteOn', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is note [note] on?', + arguments: { + note: { + type: Scratch.ArgumentType.NOTE, + defaultValue: 60, + } + } + }, + { + opcode: 'noteVelocity', + blockType: Scratch.BlockType.REPORTER, + text: 'velocity of note [note]', + arguments: { + note: { + type: Scratch.ArgumentType.NOTE, + defaultValue: 60, + } + } + }, + { + opcode: 'activeNotes', + blockType: Scratch.BlockType.REPORTER, + text: 'all active notes', + disableMonitor: true, + }, + { + opcode: 'lastNotePressed', + blockType: Scratch.BlockType.REPORTER, + text: 'last note pressed', + disableMonitor: true, + }, + { + opcode: 'lastNoteReleased', + blockType: Scratch.BlockType.REPORTER, + text: 'last note released', + disableMonitor: true, + } + ], + menus: { + infoMenu: { + acceptReporters: false, + items: ["name", "id"] + } + } + }; + } + + MIDIinputDevices() { + return midiInputDevices; + } + + midiDeviceInfo(args) { + if (midiInputDevices[args.number] != null) { + return midiDeviceInfo[args.number][(args.info == "id") ? 0 : 1]; + } else { + return; + } + } + + noteOn(args) { + return notesOn.includes(args.note); + } + + noteVelocity(args) { + if (notesOn.includes(args.note) && noteVelocities.find(subArray => subArray[0] === args.note)[1] !== undefined) { + return noteVelocities.find(subArray => subArray[0] === args.note)[1]; + } + } + + activeNotes() { + return notesOn; + } + + lastNotePressed() { + return lastNotePressed; + } + + lastNoteReleased() { + return lastNoteReleased; + } + } + + Scratch.extensions.register(new MIDI()); +})(Scratch); From 5564b7aed05a075acf94495f2a7bcc21076e25e9 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:36:49 -0400 Subject: [PATCH 03/50] Create midi.svg --- images/MasterMath/midi.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/MasterMath/midi.svg diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/images/MasterMath/midi.svg @@ -0,0 +1 @@ + From 551301d8aca579f9f58ee5c3fce2e8679ab5074e Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:37:14 -0400 Subject: [PATCH 04/50] Add midi.svg --- images/MasterMath/midi.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg index 8b13789179..6b839de214 100644 --- a/images/MasterMath/midi.svg +++ b/images/MasterMath/midi.svg @@ -1 +1 @@ - + \ No newline at end of file From 40950182cd8115e708d0eb6bbadcb968e420f666 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:38:57 -0400 Subject: [PATCH 05/50] Delete images/MasterMath/midi.svg --- images/MasterMath/midi.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 images/MasterMath/midi.svg diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg deleted file mode 100644 index 6b839de214..0000000000 --- a/images/MasterMath/midi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 9b9ef6014983aacc99f9af3f8899f3e31ba12fc2 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:39:58 -0400 Subject: [PATCH 06/50] Create midi.png --- images/MasterMath/midi.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/MasterMath/midi.png diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/images/MasterMath/midi.png @@ -0,0 +1 @@ + From 9d67ff591fc161d7ec9d580fc7d02e89bb162b51 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:40:15 -0400 Subject: [PATCH 07/50] Add midi.png --- images/MasterMath/midi.png | Bin 1 -> 13564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..af6a75107eedf596f9c4cc327b3cffacef53e798 100644 GIT binary patch literal 13564 zcmeHNc{r4B_kU)PwP+Q>v`Qg;D`cCIA}QL*E)``@$v!iLN|w@Y{iZ0gW#45&rI51J zU`Y05jBRGj_TG=^HP`j~^Y_R52iG;1XP*0+`<(lnbAQg~ocp`9kfaa*$Xin$0yeHm1HlRWZxF@|aye z_;fJNoBcz_Z8HW3A&|TRVyL-`Jxa=|J;OPg|GfhbDX$U3IrDPe+kOB8DLwzP&VcLZ z$Sf`H`3?yPR36Ixu}N@#{y9MyD4%~p;M|Qw0R*D(mWuh7MVjz}U(PI6jaOjJMieCe z^-|atE*Xe6nLoPEF9N@bm$z%vPp5nH-~Y^sf`~j^H;&)LK^6yN6z_A%;I;APS`hCY zF)>`2L(ZX9i)G*-C(*?V!eLe-k!~xU^AB^`NDMd1wIH!2qb;`LlF_(AZz<9iW5Uw* zTnutcn8pR9ONn4{_F2lFTq%2raxCUKOO#`Yax8$w|3Pj|x1WCqb9lTKuM4B<@r>7Z zT@XD_j^RD943nH9<+M#09A-IS=gS`H3W`0E##eLb9U}@gM?kK2gYaL)S+hIks(uov zA$j^T0%?)jZn%3ZHezsUQR-03v;t&jKNHs!$hKsUSS1qC&`)W$xX;NO@e< zUcED?^t2-=T`J%4sxZ0-!qB3V75;lH=sEgTL!q6%S?&?A-Zg-f*L*ppjzIFS9w;kW zXT)SxgxI0|25opY90F?&$4m@?N)f& z;>(I)CNa}gtM}d-q!p_YfCp``_#u8fMOH0m413oe)KgK}I4IVA@_`Yql8rRn#k$1d z(KLkTECI`+TzP_>9JP#`t7dXgD5&9pcsd@qneR~mo2VsAMZwCpo1#KUbdv@W4Qc=) zP<9A}T2G&R+&nK;UXG`Gh^M%l^@EBFGYr--tayBW43lV%EUQcF*l~CttacO*(%g7B z1$cgL{PP`5Ci=<4m!|wcj3=n%G}QbKaG`Y0jx6Og;T)xff(gGDUsTX37{+0l2?Pxt z8L#qNzrj+36|EnNttuUsyPT@G64l5D0#VrVIL|y8NYq7oi0=xew~~IIIf12n4J2qu zsJLpaT~_{A|0i4Z*=2-z42b z^6*0pVS!2p!|Tz)R5r5sU=wy$KUJ8#=lv;QEQezl$R)h5P-b}GJl5IEn>3xS}Ghtw~S#O+o#V_yn% zUF~wb_#v=vbFgkt?CFJde>i}$;u|}IZ3iM7F9Ivpb)1+BSJ>;Df#ps1q@I1vEAU`D z3VPgj-ErIeyhn8ssTs02_wk)g*@CeNL?Xv|cgHOl>3A-Vj8H0OtusdPgTM(@dVOzR z-6%Z9HA?5+ku8`+2Ow-<#$0pWWpjS`v{DRLH<mhHp~s>Xf~A;mKFXqafK;jc&jJ7Q4o$z8RZ{PN$-S8i%VRo6BgwyoUcB%BCH5 zrM1!M>H5E-hF-@tRP*x(b-Gz-8eiX~y{de+IkRT91QonKa6HQ3b6%gB~h+TF;K8OLKK{xtYo8Xbo|^T_#N@7qAKS zoQIiy7l%CE1MTCzFR3-S5zkmru&PAtvC$GRlZGanCYKgC)5-CrbH+nC>#e+dA9g=W zW+i~fXG0jAES4-=D^mE4%dyd51Mf4O(?u&$n8a^jr=<{+)R4Sa*O;C=C$TJ(t^CHy zQfKp zHGd!P4cqi5U7P)`H<=n)7+TopjnV0J`7=3_xfG%H!H3_HN_WSjTXxHH!o$NUFU-rr z6I{|gnD4I-qeqxMlScIV!QO9qRMG=O$%Ft~+w7k=&bX!#XIN-IluH%uQ21BHSre@N zI&pFR$fK;D!EZZT`wG>uu46;xg|k$Ywq|K{Ljj8w`LMSCS8<=7ogTJ3Gv0A(utji! zo+%sn&^Yt-k;Ky=M84OXt0Iu6R^Qqv-x-2%Ckjs&(KdO}yhQF0bUiDwD%4&4df!TZ zm9jc1kzCgu#{L@CpT6fPr(!phaNDuC_z{Kau0@G9?HOlp?+UF!x@FD|>4+G#HlW|^ zSa&0@kLI1qshQ1(EWTWinwIrstCin2Xa0KUkQv@blu_x?Se`+`CiNt<+}+)6Y1QGw z{iFu0?Y~8j_fg37@EL6G)9)nCWep89h`=MO9mY8FN22qrki2)+n#x!zO7~@^ztHg8 zZE^dqRjDgqzSmRL08v}NYaDYwqI2o83(P(1~i!0 z7?YGuy)9CkLXE>Yd(^ird+?PCMJ70n8sudMSgz%^@yPgLV?D>5f17gE?20i1mjxKKvMY{~v~w)JF!86)lq*vyB7KyNU=<2m3J z$(4g%hu#WV?e-ZJc-Pa=Gt!Ej7{6jW{UL&UEwYaRSBeTft`ih|@a1e>P`) zWhUi?BbkNyL-^!!ezg`c$1sEogQ+?dS-V`^&5a|Cpbb%9)SMbAU>kfvD_p|RG7DuH8>YX85vAQ!8z!sIa-9$wpO|P74IyfCzTDN@7g?GKrYnquK~h-@Fa@9d`lC3^ zzetM7EW%pLg8GSc9DYE5Q`}wX{=H?y6`Jwc4!=t&QLuRgM?c&zy&d#*a{%18T zCE_u=vU-^Kom=V9xAxN;hjVbM{*#g5iwiqZkUdd7cr_P&mIhlj;*lL!Hy33NB9GW2 zA3G2Je^SQ~Ncz`vH_Q=|ztjEz9{-VV)cyAcd~sYK17#%jnl6?u_TelBs?WbJB)5>@ z<}#%^07hxW+QoSThsg&w^V3hMajE|uq?loc{eP42T;6%RRt%Tp99PAqeqsdZ1MAmi zbLkY74!D)`@EW6e-tfl=*8xdTH;VwI?!QaLJMr;$Ihm)x8EGz^&#CchGYV?`dR2i- zrzMjvne_i7N*m?z&CSh5%}MM3#9Sf~?0^DBk~;jgP2a}f-#@`#3lunW(bonT6M1S} z0(^P9vXC`HlzKf4Sk7y$27)Ns!uRMW+=HJd`!4%@Zfa`!o)Q~l=qosWFVgSAP+qm5 zjL*QoKPNS5T|s%ZFGLE5GfGZ|NX*qO(qe}h*oqZvGT>982TJ2V8Uj>eHNCH15t*Ev zB#2GWdLmondtRr+3w>LWQqX?YkoG-A`%FpxhGm-c-_aZQCCXg$kJO$W&=Ku$Z@1T; zeCjqc@P$L1c zfhQR9=gEc@>Sv>`!hpCEPb?pQc{?^`%)rWzQeCVoxu0z(%V=|pS8Aa)8SV;hz_KU1 z!>pO-X|!5&=dD^Dx!WXr=51rY=Q*C)SxQvT(?r#BO1K-zpDO*J>|RexOG}Myei(LF zJ~e-3lymeO|E}_^*$+HKnf+}YY{e9~?v)v_(T6!3AHoD@j#1spwd42hLP4soE_#3b zH17}x9YFsP9S;`c1*)+W2ep?LNpM3GT<`E*JH?H6lfc`PeV4cn!SL$gDE}FFsZZS4O*ETL}x! z?2B>r%zk6JFWjee`1U$kwHsp=VL2qfA#2uE!sWU%41xUT4;v+Xw z%LAmAzdZS01_%HKlLnAFjk%4R!zKfyPJZ!aE{p!1I2{n<^oba53jJ)A7%t|%iYQk~ z$=!j13O>1Bolhwke!gYWZww6JMdCmY4skGL0op#_$B;Xw&zVK!0j+ElP*9|N`$B(C z>=v@@45G~l45$G9`eP*R3`k;gd*D8w&v48~yXA1p?=cutx}gtxoO27qtMJa23l=W- z^jL*b_6Oz1Y|W(wX&1ICn+{w&lX)K4#qBs~P9>goA+Z>o83Y zbz6?Vt$evYkgR>`A3Pko&1?G8gv^K+t-IIXjE7>! z?7=HK;erB{;U{8lL3kCuS$m_K!r00F?ulqwAy$qYQK7mW7IG7Vy{zrjUbL!(O^a_t z7hfBA*7qwjE-m0dF5Gu4R_Llt@+{K0vKeFZ3rW_TmfOhQ&kn+h8lqXpo?uz&%2cE2 z{4%!9FOU5j!Sm`{kC!2m(bkrXS5;$|rU@A;7SCgi z=2{7Ggqon(N4Ba0gI+raTC!JfeAmNab|QlaOr_6fcc{pNIaX{_HZ{|1!{64QZiqj; z;WDi2Gf=+9xT^>wkP?DZ#=eNhCrTb10S7VocN7AroFsKjJd^FxnSC`WMGKUucq0&X zaSlP7fZ^{~_C4JJQB$p-48pN5v3fuj{ZAg2^ozW9EJ0h_?))Qgp7I8GFsJ3j@J38m zBNBLx&^KBasvWr+UbrKYVy-!xvW??k9JE@WP~+=L{&}?-z!lySw11UW!7o0cL`XHN zw@i+}?PO&;B&)Z_HY->8>zQ=4mv37k_0jG4Zy(_yaB$=$nF`trm>DF+*-wfZyFBPn zMbl=+B{NW*Xz+qY{Q>OD*|U-KkEJ4aO#)iAy*Ls3;gbS+*~YBTHaKwVRcF zaXW2$*u-rCFMo?|l{f;PxGnI0*M##~(wKW2i6})N4~5Ez1SNfAbepX{mlX}P1U>u< zBu?N%AZpLHEN|*lvDCE6$;>!W4{@c2wjqU3I1}iZ;Cm{Z%XT{EZC|D@PM8h4adTR~ zbM@>g=EtVIJ6Dxq2Z7@gS?J?NQ0ORTc@wYRs_3+1Q^g5PS*4IpjkJqFrXcg~+1!Y} zt{@Vj5YkB`hZGGNyI%JvTL za&Q(QV0&SM7D-KPuXs5tNT-=D8gM!#DaYkTm14Y5D%<4PmB()6T?L>JvqPUfpM3tv=kvry8}SP z5;82|=R&GjLdB)Lxx^XZ-LQm;OQ`rigNkg~TUU11_!wSSgutJ{A)|vC2W$fW0~%IZ AO8@`> literal 1 Icmd-A000XB3jhEB From 97d8cd539f1d54d83a7e224012d030892939d7a8 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 07:49:13 -0400 Subject: [PATCH 08/50] Update midi.png --- images/MasterMath/midi.png | Bin 13564 -> 13976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png index af6a75107eedf596f9c4cc327b3cffacef53e798..f2f610e632abdf41cd19caddfe673c3616f0bc06 100644 GIT binary patch literal 13976 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 literal 13564 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 AO8@`> From 3cddad72ef8690579b25413224e4a0c3c716b0cb Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 10:50:44 -0400 Subject: [PATCH 09/50] Update midi.js - Add event listener to detect when a MIDI device is connected or disconnected and update arrays accordingly instead of only when the extension loads - Fix "last note released" not returning the right values/not working --- extensions/MasterMath/midi.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 837a976017..cd02cfa2bf 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -23,12 +23,17 @@ navigator.requestMIDIAccess().then(onSuccess, onError); function onSuccess(midiAccess) { - //List connected midi input devices - for (const entry of midiAccess.inputs) { - const input = entry[1]; - midiInputDevices.push([`[id: "${input.id}"` + ` name: "${input.name}"]`]); - midiDeviceInfo.push([input.id, input.name]); - } + + midiAccess.onstatechange = (event) => { + if (event.port.state == "connected") { + midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); + midiDeviceInfo.push([event.port.id, event.port.name]); + } else if (event.port.state == "disconnected") { + midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); + midiDeviceInfo.splice([event.port.id, event.port.name]); + } + console.log(event.port.id, event.port.name, event.port.manufacturer, event.port.state); + }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; @@ -37,16 +42,12 @@ if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); - lastNotePressed = note; - Scratch.vm.runtime.startHats('midi_whenNotePressed'); } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { + lastNoteReleased = note; notesOn.splice(notesOn.indexOf(note), 1); noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); - - lastNoteReleased = note; - Scratch.vm.runtime.startHats('midi_whenNoteReleased'); } else { console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); @@ -96,6 +97,7 @@ } } }, + '---', { opcode: 'whenNotePressed', blockType: Scratch.BlockType.EVENT, From 5f438a938e0d478a5f3a7d266b792c9cb8b6a518 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 15:21:13 -0400 Subject: [PATCH 10/50] Update midi.js Remove unnecessary console log --- extensions/MasterMath/midi.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index cd02cfa2bf..7502bd81ce 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -21,9 +21,8 @@ if (navigator.requestMIDIAccess) { navigator.requestMIDIAccess().then(onSuccess, onError); - + function onSuccess(midiAccess) { - midiAccess.onstatechange = (event) => { if (event.port.state == "connected") { midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); @@ -32,13 +31,11 @@ midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); midiDeviceInfo.splice([event.port.id, event.port.name]); } - console.log(event.port.id, event.port.name, event.port.manufacturer, event.port.state); }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; const command = status & 0xF0; - if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); From f28a68d71ac9fda763face1721f89910dc6edf39 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:34:21 -0400 Subject: [PATCH 11/50] Update midi.js - Fix is note on block always returning false --- extensions/MasterMath/midi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 7502bd81ce..6da3f7cd5c 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -172,7 +172,7 @@ } noteOn(args) { - return notesOn.includes(args.note); + return notesOn.includes(Number(args.note)); } noteVelocity(args) { From 44ad6f2ccebe9b01272fd8248232b64ba7c3aa32 Mon Sep 17 00:00:00 2001 From: Muffin Date: Mon, 5 Aug 2024 17:27:10 -0500 Subject: [PATCH 12/50] Lily/LooksPlus: Optimize restore content block (#1638) - restore content block: do nothing if the costume wasn't changed - remove unnecessary emitTargetsUpdate - try/catch invalid SVGs --- extensions/Lily/LooksPlus.js | 48 +++++++++++++++++++++++------------- extensions/Lily/lmsutils.js | 11 ++++----- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/extensions/Lily/LooksPlus.js b/extensions/Lily/LooksPlus.js index 291c008d8b..df18e449be 100644 --- a/extensions/Lily/LooksPlus.js +++ b/extensions/Lily/LooksPlus.js @@ -33,6 +33,8 @@ return util.runtime.getSpriteTargetByName(nameString); }; + const renderer = Scratch.vm.runtime.renderer; + class LooksPlus { getInfo() { return { @@ -380,7 +382,7 @@ const drawableID = target.drawableID; const layerOrder = target.getLayerOrder(); const newLayer = args.LAYER - layerOrder; - target.renderer.setDrawableOrder(drawableID, newLayer, "sprite", true); + renderer.setDrawableOrder(drawableID, newLayer, "sprite", true); } spriteLayerNumber(args, util) { @@ -442,7 +444,7 @@ snapshotStage(args, util) { return new Promise((resolve) => { - Scratch.vm.runtime.renderer.requestSnapshot((uri) => { + renderer.requestSnapshot((uri) => { resolve(uri); }); }); @@ -467,15 +469,18 @@ const contentType = args.TYPE; const content = args.CONTENT; if (contentType === "SVG") { - Scratch.vm.runtime.renderer.updateSVGSkin( - costume.skinId, - Scratch.Cast.toString(content) - ); + try { + renderer.updateSVGSkin( + costume.skinId, + Scratch.Cast.toString(content) + ); + renderer._allSkins[costume.skinId].differsFromAsset = true; + } catch (e) { + console.error(e); + } } else { console.error("Options other than SVG are currently unavailable"); - return; } - Scratch.vm.emitTargetsUpdate(); } restoreCostumeContent(args, util) { @@ -490,21 +495,30 @@ return; } - //This is here to ensure no changes are made to bitmap costumes, as changes are irreversible - //Check will be removed when it's possible to edit bitmap skins + // This is here to ensure no changes are made to bitmap costumes, as changes are irreversible + // Check will be removed when it's possible to edit bitmap skins const format = costume.asset.assetType.runtimeFormat; if (format !== "svg") { console.error("Costume is not vector"); return; } - const content = costume.asset.decodeText(); - const rotationCenterX = costume.rotationCenterX; - const rotationCenterY = costume.rotationCenterY; - util.target.renderer.updateSVGSkin(costume.skinId, content, [ - rotationCenterX, - rotationCenterY, - ]); + if (!renderer._allSkins[costume.skinId].differsFromAsset) { + return; + } + + try { + const content = costume.asset.decodeText(); + const rotationCenterX = costume.rotationCenterX; + const rotationCenterY = costume.rotationCenterY; + renderer.updateSVGSkin(costume.skinId, content, [ + rotationCenterX, + rotationCenterY, + ]); + renderer._allSkins[costume.skinId].differsFromAsset = false; + } catch (e) { + console.error(e); + } } costumeContent(args, util) { diff --git a/extensions/Lily/lmsutils.js b/extensions/Lily/lmsutils.js index db895742fe..d99c229878 100644 --- a/extensions/Lily/lmsutils.js +++ b/extensions/Lily/lmsutils.js @@ -1356,14 +1356,13 @@ setSpriteSVG(args, util) { try { - Scratch.vm.runtime.renderer.updateSVGSkin( - util.target.sprite.costumes[args.INPUTA - 1].skinId, - args.INPUTB - ); + const skinId = util.target.sprite.costumes[args.INPUTA - 1].skinId; + const renderer = Scratch.vm.runtime.renderer; + renderer.updateSVGSkin(skinId, Scratch.Cast.toString(args.INPUTB)); + renderer._allSkins[skinId].differsFromAsset = true; } catch (error) { - return; + console.error(error); } - Scratch.vm.emitTargetsUpdate(); } alertBlock(args) { From eafceaba26891604c3eb6e29be4e917666c2cce2 Mon Sep 17 00:00:00 2001 From: Procybit Date: Tue, 6 Aug 2024 01:29:27 +0300 Subject: [PATCH 13/50] encoding: Fix unicode base64 encode/decode (#1599) --- extensions/encoding.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/extensions/encoding.js b/extensions/encoding.js index 996414ac0b..c5f0bb49d6 100644 --- a/extensions/encoding.js +++ b/extensions/encoding.js @@ -443,7 +443,7 @@ arguments: { string: { type: Scratch.ArgumentType.STRING, - defaultValue: btoa("apple"), // don't translate because btoa() will error in Chinese ... + defaultValue: this._btoa("apple"), }, code: { type: Scratch.ArgumentType.STRING, @@ -572,7 +572,7 @@ string = Scratch.Cast.toString(string); switch (code) { case "Base64": - return btoa(string); + return this._btoa(string); case "URL": return encodeURIComponent(string); } @@ -583,7 +583,7 @@ switch (code) { case "Base64": try { - return atob(string); + return this._atob(string); } catch (error) { console.error("invalid base 64", error); return ""; @@ -636,6 +636,18 @@ } return string; } + _btoa(unicode) { + let bytes = new TextEncoder().encode(unicode); + let binString = Array.from(bytes, (byte) => + String.fromCodePoint(byte) + ).join(""); + return btoa(binString); + } + _atob(base64) { + let binString = atob(base64); + let bytes = Uint8Array.from(binString, (m) => m.codePointAt(0)); + return new TextDecoder().decode(bytes); + } } Scratch.extensions.register(new Encoding()); })(Scratch); From 3ce22a648e743f450bc71f8ea8d902a55415e00c Mon Sep 17 00:00:00 2001 From: Procybit Date: Tue, 6 Aug 2024 01:32:19 +0300 Subject: [PATCH 14/50] Skyhigh173/JSON: fix json_is_valid() (#1596) --- extensions/Skyhigh173/json.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/Skyhigh173/json.js b/extensions/Skyhigh173/json.js index c529ea3fa5..22e6d8aaf0 100644 --- a/extensions/Skyhigh173/json.js +++ b/extensions/Skyhigh173/json.js @@ -599,7 +599,9 @@ json_is_valid({ json }) { if (typeof json != "string") { return false; - } else if ( + } + json = json.trim(); + if ( (json.slice(0, 1) != "[" || json.slice(-1) != "]") && (json.slice(0, 1) != "{" || json.slice(-1) != "}") ) { From ea67bd89f59f932bfc826c3bac0388155816a38b Mon Sep 17 00:00:00 2001 From: Muffin Date: Mon, 5 Aug 2024 17:41:48 -0500 Subject: [PATCH 15/50] Update translations (#1641) --- translations/extension-metadata.json | 196 +++- translations/extension-runtime.json | 1488 +++++++++++++++++++++++--- 2 files changed, 1465 insertions(+), 219 deletions(-) diff --git a/translations/extension-metadata.json b/translations/extension-metadata.json index 307886806c..a8e90d0a9e 100644 --- a/translations/extension-metadata.json +++ b/translations/extension-metadata.json @@ -129,7 +129,6 @@ "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": "Von Pen Plus V6 ersetzt.", "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", @@ -314,7 +313,6 @@ "obviousAlexC/newgroundsIO@description": "Lohkoja, joiden avulla pelit voivat olla vuorovaikutuksessa Newgrounds-ohjelmointirajapinnan kanssa. Epävirallinen.", "obviousAlexC/penPlus@description": "Edistyneet renderöintikyvyt.", "obviousAlexC/penPlus@name": "Kynä Plus V7", - "penplus@description": "Korvattu Kynä Plus V6:lla.", "penplus@name": "Kynä Plus V5 (vanha)", "pointerlock@description": "Lisää hiiren lukitsemiseen liittyviä lohkoja. Hiiren x- ja y-sijaintilohkot ilmoittavat muutoksen viimeisestä ruudusta, kun hiiren osoitin on lukittu. Korvaa hiiren osoittimen lukitus -kokeilun.", "pointerlock@name": "Hiiren osoittimen lukitus", @@ -496,7 +494,6 @@ "obviousAlexC/newgroundsIO@description": "Blocchi che permettono ai giochi di interagire con l'API Newgrounds API. Non ufficiale.", "obviousAlexC/penPlus@description": "Capacità di rendering avanzate.", "obviousAlexC/penPlus@name": "Penna+ V7", - "penplus@description": "Rimpiazzata da Penna Plus V6.", "penplus@name": "Penna Plus V5 (Vecchio)", "pointerlock@description": "Aggiunge blocchi per bloccare il mouse. I blocchi\" x/y del mouse\" restituiscono di quanto è cambiata la posizione rispetto al frame precedente mentre il puntatore è bloccato. Rimpiazza il \"blocco puntatore\" sperimentale.", "pointerlock@name": "Blocco Puntatore", @@ -542,6 +539,7 @@ "-SIPC-/time@name": "時間", "0832/rxFS2@description": "仮想メモリやファイルシステムとやりとりするブロック", "Alestore/nfcwarp@description": "NFC(NDEF)デバイスからデータを読み取ります。AndroidのChromeでのみ動作します。", + "CST1229/images@description": "画像を操作するためのブロック。", "CST1229/images@name": "画像", "CST1229/zip@description": "sb3ファイルを含むzip形式のファイルを作成および編集します。", "Clay/htmlEncode@name": "HTMLエンコード", @@ -556,6 +554,9 @@ "Lily/AllMenus@description": "Scratchと拡張機能のすべてのメニューを含む特別なカテゴリー。", "Lily/Assets@description": "さまざまな種類のアセットのデータを追加、削除、取得します。", "Lily/Assets@name": "アセットマネージャー", + "Lily/Cast@description": "値をそれぞれの型に変換する。", + "Lily/Cast@name": "型変換", + "Lily/ClonesPlus@description": "Scratch のクローン機能を拡張する。", "Lily/CommentBlocks@description": "スクリプトに注釈を付けます。", "Lily/CommentBlocks@name": "コメントブロック", "Lily/HackedBlocks@description": "Scratchで動作するが、ブロックパレットには表示されない様々な「ハックブロック」。", @@ -579,6 +580,7 @@ "NOname-awa/graphics2d@name": "グラフィック2D", "Skyhigh173/bigint@description": "どんな整数 (小数を含まない) も処理する演算ブロック。", "TheShovel/CanvasEffects@description": "ステージ全体に視覚効果を適用します。", + "TheShovel/CanvasEffects@name": "キャンバス効果", "TheShovel/ColorPicker@name": "カラーピッカー", "TheShovel/CustomStyles@name": "カスタムスタイル", "TheShovel/LZ-String@description": "lz-stringを使用してテキストを圧縮したり解凍したりします。", @@ -588,23 +590,37 @@ "ar@name": "拡張現実", "battery@description": "携帯電話やノートパソコンのバッテリーに関する情報にアクセスします。デバイスやブラウザによっては動作しない場合があります。", "battery@name": "バッテリー", + "bitwise@description": "コンピューター内の数値のバイナリ表現を操作するブロック。", + "bitwise@name": "ビット操作", "clipboard@description": "システムのクリップボードから読み込んだり書き込んだりする", "clipboard@name": "クリップボード", + "cursor@description": "カスタムカーソルを使用するか、カーソルを隠すことができます。カーソルをいずれかのコスチューム画像に変更することもできます。", "cursor@name": "マウスカーソル", "encoding@description": "文字列をunicode、base64、URLにエンコード、デコードする", "encoding@name": "エンコーディング", + "fetch@description": "より広範囲のインターネットにリクエストを送る。", + "fetch@name": "フェッチ", + "files@description": "ファイルの読み込みと書き出し。", "files@name": "ファイル", "gamejolt@description": "ゲームがGameJolt APIとやりとりできるようにするブロック。 非公式。", + "gamepad@description": "ボタンをキーに割り当てるだけでなく、ゲームパッドに直接アクセスします。", "gamepad@name": "ゲームパッド", "godslayerakp/http@description": "外部のウェブサイトとやりとりをするための総合的な拡張機能。", "iframe@name": "埋め込み", "itchio@description": "itch.ioウェブサイトと連動するブロック。非公式。", + "lab/text@description": "テキストを表示・動画化する簡単な方法です。Scratch LabのAnimated Text実験機能との互換性があります。", "lab/text@name": "アニメーションテキスト", + "local-storage@description": "持続的なデータを保存する。Cookies に似たような機能ですが、より良いです。", "local-storage@name": "ローカルストレージ", + "mbw/xml@description": "XML から値を抽出、または作成する。", + "mdwalters/notifications@description": "通知を表示する。", + "mdwalters/notifications@name": "通知", "navigator@description": "ユーザーのブラウザとOSの詳細を取得します。", + "navigator@name": "ナビゲーター", "numerical-encoding-2@description": "クラウド変数用に文字列を数値としてエンコードします。より効率的なフォーマットを使用しているため、V1とは互換性がありません。", + "obviousAlexC/newgroundsIO@description": "ゲームがNewgrounds APIとやりとりできるようにするブロック。 非公式。", "obviousAlexC/penPlus@name": "Pen Plus V7\n ", - "penplus@description": "Pen Plus V6に置き換えられました。", + "penplus@description": "Pen Plus V7に置き換えられました。", "penplus@name": "Pen Plus V5 (古いバージョン)", "pointerlock@name": "ポインターロック", "qxsck/data-analysis@name": "データ分析", @@ -617,6 +633,7 @@ "shreder95ua/resolution@name": "画面解像度", "sound@description": "URLから音声を再生します。", "sound@name": "音声", + "steamworks@description": "プロジェクトを Steamworks API に接続する。", "stretch@description": "スプライトを水平または垂直に引き伸ばします。", "stretch@name": "伸縮", "text@description": "文字やテキストを操作する。", @@ -663,6 +680,8 @@ "DNin/wake-lock@name": "화면 켜짐 고정", "DT/cameracontrols@description": "무대에서 보이는 부분의 위치를 변경합니다.", "DT/cameracontrols@name": "카메라 제어 (오류 많음)", + "JeremyGamer13/tween@description": "부드러운 애니메이션을 위한 easing 방식들을 제공합니다.", + "JeremyGamer13/tween@name": "트윈 애니메이션", "Lily/AllMenus@description": "스크래치 및 기타 확장 기능에서의 모든 선택목록 블록들의 모음입니다.", "Lily/AllMenus@name": "모든 선택목록 블록", "Lily/Assets@description": "다양한 종류의 에셋을 추가하고, 제거하거나, 관련 정보를 얻습니다.", @@ -717,7 +736,7 @@ "TheShovel/CanvasEffects@name": "Canvas 효과", "TheShovel/ColorPicker@description": "시스템의 색상 선택기에 접근합니다.", "TheShovel/ColorPicker@name": "색상 선택기", - "TheShovel/CustomStyles@description": "프로젝트의 변수 표시기와 묻기 입력란의 모습을 사용자 지정합니다.", + "TheShovel/CustomStyles@description": "프로젝트의 값 표시기와 묻기 입력란의 모습을 사용자 지정합니다.", "TheShovel/CustomStyles@name": "사용자 지정 스타일", "TheShovel/LZ-String@description": "LZ 문자열을 사용하여 텍스트를 압축 및 압축 해제 합니다.", "TheShovel/LZ-String@name": "LZ 압축", @@ -733,7 +752,7 @@ "XmerOriginals/closecontrol@name": "탭 닫기 전에 묻기", "ZXMushroom63/searchApi@description": "URL에서 물음표 이후에 위치하는 부분인 URL 검색 파라미터와 상호작용합니다.", "ZXMushroom63/searchApi@name": "검색 파라미터", - "ar@name": "증강 현실", + "ar@name": "증강 현실 (AR)", "battery@description": "스마트폰 또는 노트북의 배터리 정보에 접근합니다. 모든 기기와 브라우저에 호환되지 않을 수 있습니다.", "battery@name": "배터리", "bitwise@description": "컴퓨터 숫자의 2진법 관련 연산을 하는 블록들입니다.", @@ -761,7 +780,7 @@ "godslayerakp/ws@description": "WebSocket 서버에 직접적으로 연결합니다.", "iframe@description": "무대 위에 웹페이지 또는 HTML을 띄웁니다.", "itchio@description": "itch.io 웹사이트와 상호작용하는 블록들입니다. 비공식.", - "local-storage@description": "일시적으로 데이터를 저장합니다, 쿠키와 유사하지만, 보다 향상 되었습니다.", + "local-storage@description": "일시적으로 데이터를 저장합니다. 쿠키와 유사하지만, 보다 향상되었습니다.", "local-storage@name": "로컬 스토리지", "mbw/xml@description": "XML을 통해 값을 생성하거나 추출합니다.", "mdwalters/notifications@description": "알림을 표시합니다.", @@ -775,10 +794,11 @@ "obviousAlexC/newgroundsIO@description": "Newgrounds API와 상호작용하는 블록들입니다. 비공식.", "obviousAlexC/penPlus@description": "보다 향상된 렌더링 능력을 갖춘 펜 확장 기능입니다.", "obviousAlexC/penPlus@name": "펜 플러스 V7", - "penplus@description": "펜 플러스 V6로 대체되었습니다.", + "penplus@description": "펜 플러스 V7로 대체되었습니다.", "penplus@name": "펜 플러스 V5 (구버전)", "pointerlock@description": "마우스 포인터를 잠금하는 블록들입니다. 포인터가 잠금된 동안 이전 프레임부터의 마우스의 x좌표 및 y좌표의 변화량을 반환합니다. 포인터 잠금 실험버전을 대체합니다.", "pointerlock@name": "포인터 잠금", + "qxsck/data-analysis@description": "평균, 중앙값, 최대, 최소, 분산, 최빈값 등을 연산하는 블록들입니다.", "qxsck/data-analysis@name": "데이터 분석", "qxsck/var-and-list@description": "변수와 리스트에 관련된 추가 블록들입니다.", "qxsck/var-and-list@name": "변수 및 리스트", @@ -789,6 +809,7 @@ "shreder95ua/resolution@name": "화면 해상도", "sound@description": "URL을 통해 소리를 재생합니다.", "sound@name": "소리", + "steamworks@description": "프로젝트에서 Steamworks API와 통신합니다.", "stretch@description": "스프라이트를 수직 또는 수평으로 늘립니다.", "stretch@name": "늘리기", "text@description": "문자 및 텍스트를 다룹니다.", @@ -946,7 +967,6 @@ "obviousAlexC/SensingPlus@name": "Sensing Pluss", "obviousAlexC/newgroundsIO@description": "Blokker som tillater spill å samhandle med Newgrounds API. Uoffisiell.", "obviousAlexC/penPlus@description": "Avanserte renderingfunksjoner.", - "penplus@description": "Replasert av Pen Plus V6.", "penplus@name": "Penn Pluss V5 (Gammel)", "pointerlock@description": "Legger til blokker for muselåsing. Mus x- og y-blokker vil rapportere endringen siden forrige bilde mens pekeren er låst. Erstatter pekerlåseeksperimentet.", "pointerlock@name": "Prikkerlås", @@ -1113,7 +1133,6 @@ "obviousAlexC/newgroundsIO@description": "Maak interactie met de API van Newgrounds mogelijk. Niet officieel.", "obviousAlexC/penPlus@description": "Maak gebruik van gevorderde weergavemogelijkheden.", "obviousAlexC/penPlus@name": "Pen uitgebreid V7", - "penplus@description": "Vervangen door de extensie Pen uitgebreid V6.", "penplus@name": "Pen uitgebreid V5 (verouderd)", "pointerlock@description": "Zet de muisaanwijzer vast. De blokken muis x & muis y geven de verandering in muispositie sinds de vorige frame.", "pointerlock@name": "Muisaanwijzer-vergrendeling", @@ -1305,7 +1324,6 @@ "obviousAlexC/newgroundsIO@description": "Блоки которые позволяют играм взаимодействовать с Newgrounds API. Неофициально.", "obviousAlexC/penPlus@description": "Расширенные способности рендера.", "obviousAlexC/penPlus@name": "Ручка Плюс V7", - "penplus@description": "Заменено Ручкой Плюс V6.", "penplus@name": "Ручка Плюс V5 (Устарело) ", "pointerlock@description": "Добавляет блоки для блокировки мыши. Блоки x и y мыши будут сообщать об изменениях по сравнению с предыдущим кадром, пока указатель заблокирован. Заменяет эксперимент с блокировкой указателя.", "pointerlock@name": "Блокировка Курсора", @@ -1446,72 +1464,136 @@ "CST1229/zip@description": "Створюйте та редагуйте .zip файли, а також файли формату .sb3", "CubesterYT/KeySimulation@description": "Симулюйте натискання клавіш та кліки мишкою.", "CubesterYT/KeySimulation@name": "Симуляція Клавіш", + "CubesterYT/TurboHook@description": "Дозволяє використовувати webhook.", "CubesterYT/WindowControls@description": "Ви зможете переміщати вікно, змінювати його розмір, перейменовувати, вмикати повноекранний режим, дізнаватися розмір вікна, та інше.", "CubesterYT/WindowControls@name": "Контроль Вікна", "DNin/wake-lock@description": "Не дозволяє комп'ютеру перейти в сплячий режим.", + "DNin/wake-lock@name": "Блокування Сонного Режиму", "DT/cameracontrols@description": "Переміщайте видиму частину сцени.", "DT/cameracontrols@name": "Контроль Камери (Дуже Неточне)", "JeremyGamer13/tween@description": "Простіші методи створення плавних анімацій.", "JeremyGamer13/tween@name": "Анімування", "Lily/AllMenus@description": "Особлива категорія з усіма меню з усіх категорій Scratch та розширень.", "Lily/AllMenus@name": "Усі Меню", + "Lily/Assets@description": "Додавайте, видаляйте та отримуйте дані з різних типів ресурсів проєкту.", + "Lily/Assets@name": "Менеджер Ресурсів", + "Lily/Cast@description": "Конвертуйте значення між типами.", + "Lily/Cast@name": "Типи", "Lily/ClonesPlus@description": "Більше блоків для роботи з клонами.", + "Lily/ClonesPlus@name": "Клони Плюс", "Lily/CommentBlocks@description": "Занотуйте свої скрипти.", "Lily/CommentBlocks@name": "Блоки-Коментарі", "Lily/HackedBlocks@description": "Різні \"зламані\" блоки, що працюють у Scratch, але невидимі на панелі блоків.", "Lily/HackedBlocks@name": "Приховані Блоки", "Lily/ListTools@description": "Більший асортимент з новими можливостями для взаємодії зі списками.", + "Lily/ListTools@name": "Інструменти для Списків", "Lily/LooksPlus@description": "Розширює категорію \"вигляд\", дозволяючи показати/приховати будь який спрайт, отримати дані образу та редагувати образи спрайтів на ходу.", + "Lily/LooksPlus@name": "Вигляд Плюс", + "Lily/McUtils@description": "Корисні утиліти для будь якого співробітника фастфуду.", + "Lily/MoreEvents@description": "Запускайте скрипти новими способами.", + "Lily/MoreEvents@name": "Більше Подій", "Lily/MoreTimers@description": "Контролюйте кілька таймерів одночасно.", "Lily/MoreTimers@name": "Більше Таймерів", + "Lily/Skins@description": "Візуалізуйте спрайти як інші зображення або образи.", + "Lily/Skins@name": "Скіни", "Lily/SoundExpanded@description": "Більше блоків для роботи зі звуком.", "Lily/SoundExpanded@name": "Звук+", + "Lily/TempVariables2@description": "Створюйте тимчасові або потокові змінні.", "Lily/TempVariables2@name": "Тимчасові Змінні", + "Lily/Video@description": "Програє відео з посилань.", + "Lily/Video@name": "Відео", + "Lily/lmsutils@description": "Раніше відомі як LMS Утиліти.", + "Lily/lmsutils@name": "Інструменти Лілі", + "Longboost/color_channels@description": "Показуйте або штампуйте лише конкретні RGB канали.", + "Longboost/color_channels@name": "RGB Канали", "NOname-awa/graphics2d@description": "Блоки для вираховування довжини, кутів та площ у двох площинах.", + "NOname-awa/graphics2d@name": "2D Графіка", "NOname-awa/more-comparisons@description": "Більше блоків для порівнювання.", "NOname-awa/more-comparisons@name": "Більше Порівнянь", "NexusKitten/controlcontrols@description": "Показує або приховує кнопки контролю проєкту.", - "NexusKitten/controlcontrols@name": "Контроль Кнопок Контролю", + "NexusKitten/controlcontrols@name": "Налаштування Управління", "NexusKitten/moremotion@description": "Більше блоків для руху спрайтів.", "NexusKitten/moremotion@name": "Більше Рухів", "NexusKitten/sgrab@description": "Отримайте інформацію про проєкти або користувачів на Scratch", + "PwLDev/vibration@description": "Контролюйте вібрацію телефону. Працює тільки у Chrome на Android.", + "PwLDev/vibration@name": "Вібрація", + "SharkPool/Font-Manager@description": "Додавайте, видаляйте та керуйте шрифтами.", + "SharkPool/Font-Manager@name": "Менеджер Шрифтів", + "Skyhigh173/bigint@description": "Математичні блоки для роботи над безмежно великими цілими числами (не дробами).", + "Skyhigh173/bigint@name": "Величезні Числа", + "Skyhigh173/json@description": "Опрацьовуйте рядки та списки JSON.", + "TheShovel/CanvasEffects@description": "Додавайте візуальні ефекти до усієї сцени.", + "TheShovel/CanvasEffects@name": "Візуальні Ефекти", "TheShovel/CustomStyles@description": "Змініть вигляд змінних та вікон у своєму проєкті.", "TheShovel/CustomStyles@name": "Свій Стиль", + "Xeltalliv/clippingblending@description": "Обрізання елементів за межами вказаної зони та різні моделі змішування кольорів.", + "Xeltalliv/clippingblending@name": "Обрізання та Змішування", "Xeltalliv/simple3D@description": "Легко створюйте 3D проєкти, прискорені відеокартою.", "Xeltalliv/simple3D@name": "Легке 3D", + "XeroName/Deltatime@description": "Дізнавайтеся точний дельта час.", + "XeroName/Deltatime@name": "Дельта Час", "XmerOriginals/closecontrol@description": "Показ діалогового вікна перед закриттям вкладки.", "XmerOriginals/closecontrol@name": "Запит перед виходом", + "ZXMushroom63/searchApi@description": "Взаємодійте з параметрами URL адреси: частини URL адреси після знаку питання.", + "ZXMushroom63/searchApi@name": "Параметри Пошуку", + "ar@description": "Показує зображення з камери та відстежує рух, дозволяючи 3D проєктам правильно накладати віртуальні об'єкти на реальний світ.", "ar@name": "Доповнена Реальність", "battery@description": "Доступ до інформації про акумулятор на телефонах та ноутбуках. Може працювати не на всіх пристроях або браузерах.", "battery@name": "Батарея", + "bitwise@description": "Блоки для операцій з двійковим представленням чисел у комп'ютерах.", "box2d@description": "Двохвимірна фізика", + "box2d@name": "Фізика Box2D", "clipboard@description": "Записуйте та читайте дані з буферу обміну.", "clipboard@name": "Буфер Обміну", + "cs2627883/numericalencoding@description": "Краще використовуйте версію 2.0 оскільки вона ефективніша. 1.0 існує тільки для підтримки сумісності.", + "cs2627883/numericalencoding@name": "Числове Кодування 1.0", "cursor@description": "Змініть вигляд вказівника або взагалі приховайте його. Також дозволяє замінити вказівник на образ спрайту.", "cursor@name": "Вказівник Миші", + "encoding@description": "Закодовує та декодує символи рядків у їхні числа юні-коду, base64 та URL.", + "encoding@name": "Кодування", + "fetch@description": "Надсилайте запити у далекий інтернет.", "files@description": "Читайте та завантажуйте файли.", "files@name": "Файли", + "gamejolt@description": "Блоки для взаємодії з GameJolt API. Неофіційно.", "gamepad@description": "Прямий доступ до геймпаду замість підбирання кнопок до клавіш.", "gamepad@name": "Геймпад", + "godslayerakp/http@description": "Комплексне розширення для взаємодії із зовнішніми вебсайтами.", + "godslayerakp/ws@description": "Вручну підключіться до серверів WebSocket.", + "iframe@description": "Відображає сторінки або HTML поверх усієї сцени.", + "itchio@description": "Блоки для взаємодії із сайтом itch.io. Неофіційно.", "lab/text@description": "Простий спосіб відображення анімованого тексту. Сумісний зі Scratch Lab's Animated Text.", "lab/text@name": "Анімований Текст", + "local-storage@description": "Зберігайте постійні дані, Як куки, тільки краще.", + "local-storage@name": "Локальне Сховище", + "mbw/xml@description": "Створює та витягує дані з файлів XML.", "mdwalters/notifications@description": "Відображайте сповіщення.", "mdwalters/notifications@name": "Сповіщення", + "navigator@description": "Інформація про браузер та систему користувача.", + "navigator@name": "Навігатор", + "numerical-encoding-2@description": "Закодовує текст у числа для хмарних змінних. Не є сумісним з версією 1.0, оскільки використовує ефективніший формат.", + "numerical-encoding-2@name": "Числове Кодування 2.0", "obviousAlexC/SensingPlus@description": "Розширення до категорії датчиків.", "obviousAlexC/SensingPlus@name": "Додаткові Датчики", + "obviousAlexC/newgroundsIO@description": "Блоки, які дозволяють іграм взаємодіяти з Newgrounds API. Неофіційно.", "pointerlock@description": "Додає можливість заблокувати вказівник. Блоки \"мишка x\" та \"мишка y\" відображатимуть рух миші, поки вказівник заблокований. Заміна експерименту pointerlock.", "qxsck/var-and-list@description": "Більше блоків для роботи зі змінними та списками.", "qxsck/var-and-list@name": "Змінні та Списки", "runtime-options@description": "Змінюйте налаштування проєкту на ходу, такі як турбо режим, частота кадрів, інтерполяція, обмеження на кількість клонів, розмір сцени та інше.", "runtime-options@name": "Параметри Виконання", + "shreder95ua/resolution@description": "Дізнайтеся розширення головного екрану.", + "shreder95ua/resolution@name": "Розширення Екрану", "sound@description": "Відтворюйте звуки з URL адрес.", "sound@name": "Звуки", + "steamworks@description": "Під'єднайте свої проєкти до Steamworks APIs.", "stretch@description": "Розтягуйте спрайти горизонтально та вертикально.", + "stretch@name": "Розтяжка", + "text@description": "Маніпулюйте символами та текстом.", "text@name": "Текст", "true-fantom/math@description": "Безліч блоків-операторів, від піднесення до степеня до тригонометричних функцій.", "true-fantom/math@name": "Математика", "utilities@description": "Декілька цікавих блоків.", "veggiecan/browserfullscreen@description": "Дозволяє входити та виходити з повноекранного режиму.", + "veggiecan/browserfullscreen@name": "Повноекранний Режим", "veggiecan/mobilekeyboard@description": "Відображайте клавіатуру на телефонах та отримуйте ввід користувача без необхідності показувати вікно вводу.", "veggiecan/mobilekeyboard@name": "Екранна Клавіатура" }, @@ -1520,23 +1602,24 @@ "-SIPC-/consoles@name": "控制台", "-SIPC-/time@description": "关于时间、日期和时区的积木。", "-SIPC-/time@name": "时间", - "0832/rxFS2@description": "与虚拟内存文件系统交互的积木", - "Alestore/nfcwarp@description": "可以从 NFC(NDFF)硬件读取数据。仅支持安卓设备上的谷歌浏览器。", - "CST1229/images@description": "一些和图片处理相关的积木。", - "CST1229/images@name": "图片", + "0832/rxFS2@description": "与虚拟内存文件系统交互的积木。", + "Alestore/nfcwarp@description": "允许从 NFC (NDEF) 硬件读取数据。仅支持 Android 设备上的 Chrome 浏览器。", + "CST1229/images@description": "一些和图像处理相关的积木。", + "CST1229/images@name": "图像处理", "CST1229/zip@description": "创建和编辑 .zip 格式的文件,包括 .sb3 文件。", - "Clay/htmlEncode@description": "将不受信任的字符转义,使其能安全的包括在 HTML 中。", + "CST1229/zip@name": "压缩文件", + "Clay/htmlEncode@description": "转义不受信任的字符,使其能被安全的插入到 HTML 中。", "Clay/htmlEncode@name": "HTML 编码", - "CubesterYT/KeySimulation@description": "模拟鼠标与键盘的点击。", + "CubesterYT/KeySimulation@description": "模拟鼠标与键盘的敲击。", "CubesterYT/KeySimulation@name": "模拟按键", "CubesterYT/TurboHook@description": "使你能使用 webhook 。", "CubesterYT/WindowControls@description": "移动、调整大小、重命名窗口、进入全屏、获取屏幕大小等等。", "CubesterYT/WindowControls@name": "窗口控制", "DNin/wake-lock@description": "防止电脑进入睡眠状态。", - "DNin/wake-lock@name": "保持唤醒", + "DNin/wake-lock@name": "唤醒锁", "DT/cameracontrols@description": "移动舞台的可见部分。", - "DT/cameracontrols@name": "舞台摄像机(Bug 如山)", - "JeremyGamer13/tween@description": "简化制作平滑动画的方法", + "DT/cameracontrols@name": "舞台摄像机(很不稳定)", + "JeremyGamer13/tween@description": "简化制作平滑动画的方法。", "JeremyGamer13/tween@name": "补间", "Lily/AllMenus@description": "添加一个特殊分类,包含每个 Scratch 和扩展分类的每个“菜单”。", "Lily/AllMenus@name": "全部菜单", @@ -1544,29 +1627,30 @@ "Lily/Assets@name": "资源管理", "Lily/Cast@description": "转换 Scratch 的数据类型。", "Lily/Cast@name": "类型转换", - "Lily/ClonesPlus@description": "更多的 Scratch 的克隆功能。", + "Lily/ClonesPlus@description": "Scratch 的克隆功能的推广与延申。", "Lily/ClonesPlus@name": "克隆 +", - "Lily/CommentBlocks@description": "给代码添加注释。", - "Lily/CommentBlocks@name": "注释", - "Lily/HackedBlocks@description": "一些 “Hacked Blocks” ,在 Scratch 上能工作,但不能从代码区拖出", + "Lily/CommentBlocks@description": "给你的代码添加块型注释。", + "Lily/CommentBlocks@name": "注释积木", + "Lily/HackedBlocks@description": "一些在 Scratch 上能正常使用,但不能从代码栏拖出的,破解了才能看的积木。", "Lily/HackedBlocks@name": "隐藏积木块", "Lily/ListTools@description": "崭新的与列表交互的方式。", "Lily/ListTools@name": "列表工具", "Lily/LooksPlus@description": "拓展外观积木,实现隐藏/显示角色,获取造型信息,用 SVG 修改造型等操作。", "Lily/LooksPlus@name": "外观 +", - "Lily/McUtils@description": "为一些人提供的实用积木", + "Lily/McUtils@description": "面向任何速食店员工的实用工具套装。", "Lily/MoreEvents@description": "启动作品的更多方式。", "Lily/MoreEvents@name": "更多事件", "Lily/MoreTimers@description": "同时控制多个计时器。", "Lily/MoreTimers@name": "更多计时器", - "Lily/Skins@description": "让您的角色展示其他图片或造型。", - "Lily/SoundExpanded@description": "更多关于声音的积木。", - "Lily/SoundExpanded@name": "扩展声音积木", - "Lily/TempVariables2@description": "创建了局部变量和临时变量。", + "Lily/Skins@description": "让您的角色不只展示造型列表中的造型。", + "Lily/Skins@name": "纹理", + "Lily/SoundExpanded@description": "添加更多关于声音的积木。", + "Lily/SoundExpanded@name": "声音扩展", + "Lily/TempVariables2@description": "来创建可丢弃的线程变量和运行时变量吧。", "Lily/TempVariables2@name": "临时变量", "Lily/Video@description": "从 URL 播放视频", "Lily/Video@name": "视频", - "Lily/lmsutils@description": "以前被称为 LMS Utilities", + "Lily/lmsutils@description": "以前被称为 LMS Utilities。", "Lily/lmsutils@name": "Lily 的工具箱", "Longboost/color_channels@description": "仅展示或者标记某些 RGB 通道。", "Longboost/color_channels@name": "RGB 通道", @@ -1576,34 +1660,34 @@ "NOname-awa/more-comparisons@name": "更多比较", "NexusKitten/controlcontrols@description": "显示与隐藏页面控件按钮。", "NexusKitten/controlcontrols@name": "控件按钮控制", - "NexusKitten/moremotion@description": "更多运动积木。", + "NexusKitten/moremotion@description": "更多跟运动相关的积木。", "NexusKitten/moremotion@name": "更多运动", - "NexusKitten/sgrab@description": "获取有关于Scratch作品以及角色的信息。", - "PwLDev/vibration@description": "控制设备的振动。仅适用于 Android 版 Chrome。", + "NexusKitten/sgrab@description": "获取有关 Scratch 作品及 Scratch 用户的信息。", + "PwLDev/vibration@description": "控制设备的振动。仅适用于 Android 上的 Chrome 浏览器。", "PwLDev/vibration@name": "振动", "SharkPool/Font-Manager@description": "添加、删除与管理字体。", "SharkPool/Font-Manager@name": "字体管理", "Skyhigh173/bigint@description": "适用于无限大整数(不含小数)的数学模块。", "Skyhigh173/bigint@name": "大整数", "Skyhigh173/json@description": "处理 JSON 字符串和数组。", - "TheShovel/CanvasEffects@description": "适用于整个舞台的特效。", - "TheShovel/CanvasEffects@name": "Canvas 特效", - "TheShovel/ColorPicker@description": "使用颜色选择器。", + "TheShovel/CanvasEffects@description": "适用于整个舞台的视觉效果。", + "TheShovel/CanvasEffects@name": "Canvas 效果", + "TheShovel/ColorPicker@description": "访问系统提供的颜色选择器。", "TheShovel/ColorPicker@name": "颜色选择器", - "TheShovel/CustomStyles@description": "自定义作品中变量显示器和提示的样式。", + "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@name": "裁剪与颜色混合", - "Xeltalliv/simple3D@description": "轻松制作可 GPU 加速的 3D 项目。", + "Xeltalliv/simple3D@description": "轻松制作适用于 GPU 加速的 3D 项目。", "Xeltalliv/simple3D@name": "简单 3D", - "XeroName/Deltatime@description": "精确计算帧间隔的积木。", - "XeroName/Deltatime@name": "帧间隔", + "XeroName/Deltatime@description": "精确计算时间间隔。", + "XeroName/Deltatime@name": "∆t", "XmerOriginals/closecontrol@description": "当试图关闭页面时显示提示。", "XmerOriginals/closecontrol@name": "关闭页面前询问", - "ZXMushroom63/searchApi@description": "与 URL 的搜索参数交互:搜索参数是 URL 中问号后面的部分。", + "ZXMushroom63/searchApi@description": "与 URL 的搜索参数交互:就是 URL 中问号后面的部分。", "ZXMushroom63/searchApi@name": "搜索参数", "ar@description": "显示来自相机的图像并执行运动跟踪,使 3D 作品能够在现实世界中正确地覆盖虚拟对象。", "ar@name": "增强现实", @@ -1615,16 +1699,16 @@ "box2d@name": "Box2D 物理", "clipboard@description": "读取与写入系统剪切板。", "clipboard@name": "剪切板", - "clouddata-ping@description": "检测云变量服务器是否已启动。", + "clouddata-ping@description": "检测云变量服务器是否在线。", "clouddata-ping@name": "云变量检测", "cloudlink@description": "一个强大的 Scratch WebSocket 扩展。", - "cs2627883/numericalencoding@description": "请使用 V2 版本,他更加高效,V1 只是为了兼容而而保留。", + "cs2627883/numericalencoding@description": "请使用更加高效的 V2 版本。V1 只是因为兼容性考虑才保留的。", "cs2627883/numericalencoding@name": "数字编码 V1", "cursor@description": "使用自定义指针或者隐藏指针。又或者用造型图片替换指针。", "cursor@name": "鼠标指针", "encoding@description": "把字符串解码或编码为 Unicode,Base64,或者 URL。", "encoding@name": "编码", - "fetch@description": "向广泛的互联网进行请求。", + "fetch@description": "向广阔的互联网进行请求。", "files@description": "读取或下载文件。", "files@name": "文件", "gamejolt@description": "允许游戏与 GameJolt API 进行交互的积木,非官方制作。", @@ -1636,7 +1720,7 @@ "itchio@description": "一些与 itch.io 网站互动的积木,非官方制作。", "lab/text@description": "显示与设置动画文字的简单方式,与 Scratch Lab 的“动画文字”实验项目兼容。", "lab/text@name": "动画文字", - "local-storage@description": "持久的存储数据。像 Cookies,但更好。", + "local-storage@description": "持久地存储数据。类似于 Cookies,但这项技术更好。", "local-storage@name": "本地存储", "mbw/xml@description": "创建与获取 XML 的值。", "mdwalters/notifications@description": "显示通知。", @@ -1649,7 +1733,7 @@ "obviousAlexC/newgroundsIO@description": "一些与 Newgrounds API 交互的积木。", "obviousAlexC/penPlus@description": "更加高级的画笔渲染。", "obviousAlexC/penPlus@name": "画笔 + V7", - "penplus@description": "被画笔 + V6 所替代。", + "penplus@description": "被画笔 + V7 所替代。", "penplus@name": "画笔 + V5(旧)", "pointerlock@description": "添加鼠标锁定的功能。鼠标的 x、y 块在指针锁定时将返回上一帧到现在的变化,并取代了指针锁定的实验性功能。", "pointerlock@name": "鼠标指针锁定", @@ -1664,29 +1748,31 @@ "shreder95ua/resolution@name": "屏幕分辨率", "sound@description": "从 URL 播放声音。", "sound@name": "声音", + "steamworks@description": "将你的项目连接到 Steamworks API。", "stretch@description": "水平或竖直拉伸角色。", "stretch@name": "拉伸", "text@description": "处理字符与文本。", "text@name": "文本", "true-fantom/base@description": "将数字在不同进制间转换", "true-fantom/base@name": "进制", - "true-fantom/couplers@description": "几个适配性的积木。", - "true-fantom/math@description": "很多计算的积木,从求幂到三角函数。", + "true-fantom/couplers@description": "几个转接器积木。", + "true-fantom/couplers@name": "转接器", + "true-fantom/math@description": "添加了从求幂到三角函数计算的大量积木。", "true-fantom/math@name": "数学", "true-fantom/network@description": "一些用于网络交互的积木。", "true-fantom/network@name": "网络", - "true-fantom/regexp@description": "完美地使用正则表达式。", + "true-fantom/regexp@description": "为使用正则表达式准备的全套接口。", "true-fantom/regexp@name": "正则表达式", "utilities@description": "一些有趣的积木集合。", - "utilities@name": "工具", - "veggiecan/LongmanDictionary@description": "从朗文词典获取单词的定义。", + "utilities@name": "工具箱", + "veggiecan/LongmanDictionary@description": "从朗文辞典获取单词的定义。考虑到中国大陆的互联网环境,此扩展可能无法正常运行。", "veggiecan/LongmanDictionary@name": "朗文辞典", - "veggiecan/browserfullscreen@description": "进入和退出全屏模式。", + "veggiecan/browserfullscreen@description": "进入或退出全屏模式。", "veggiecan/browserfullscreen@name": "全屏模式", "veggiecan/mobilekeyboard@description": "在移动设备上显示键盘,并在不显示任何输入框的情况下获取用户输入。", "veggiecan/mobilekeyboard@name": "触屏键盘", - "vercte/dictionaries@description": "在你的作品使用字典。", - "vercte/dictionaries@name": "字典" + "vercte/dictionaries@description": "在你的作品使用键值对。", + "vercte/dictionaries@name": "键值对" }, "zh-tw": { "runtime-options@name": "運行選項" diff --git a/translations/extension-runtime.json b/translations/extension-runtime.json index 3ba9234d00..6aa82ad38c 100644 --- a/translations/extension-runtime.json +++ b/translations/extension-runtime.json @@ -1815,6 +1815,19 @@ "sound@_Sound": "Ääni", "sound@_play sound from url: [path] until done": "soita ääni URL-osoitteesta: [path] loppuun ", "sound@_start sound from url: [path]": "soita ääni URL-osoitteesta: [path]", + "steamworks@_IP country": "IP-osoitteen valtio", + "steamworks@_URL": "URL-osoite", + "steamworks@_[TYPE] [ID] installed?": "onko [TYPE] [ID] asennettu?", + "steamworks@_achievement [ACHIEVEMENT] unlocked?": "onko saavutus [ACHIEVEMENT] avaamaton?", + "steamworks@_false": "epätosi", + "steamworks@_get user [THING]": "käyttäjän [THING]", + "steamworks@_has steamworks?": "onko steamworksissa?", + "steamworks@_level": "taso", + "steamworks@_name": "nimi", + "steamworks@_open [TYPE] [DATA] in overlay": "avaa [TYPE] [DATA] peittokuvana", + "steamworks@_set achievement [ACHIEVEMENT] unlocked to [STATUS]": "saavutus [ACHIEVEMENT] avattu = [STATUS]", + "steamworks@_steam ID": "steam-tunniste", + "steamworks@_true": "tosi", "stretch@_Stretch": "Venytä", "stretch@_change stretch by x: [DX] y: [DY]": "muuta venytystä arvoilla x: [DX] y: [DY]", "stretch@_change stretch x by [DX]": "lisää x-venytystä arvolla [DX]", @@ -2633,6 +2646,7 @@ "sound@_Sound": "Suoni", "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", "stretch@_Stretch": "Stira", "stretch@_change stretch by x: [DX] y: [DY]": "cambia deformazione di x: [DX] y: [DY]", "stretch@_change stretch x by [DX]": "cambia deformazione x di [DX]", @@ -2661,7 +2675,17 @@ "-SIPC-/consoles@_Debug": "デバッグ", "-SIPC-/consoles@_Time": "時間", "-SIPC-/consoles@_clear console": "コンソールをクリア", + "-SIPC-/consoles@_create collapsed log group named [string]": "折りたたまれたロググループ[string]を作成する", + "-SIPC-/consoles@_create log group named [string]": "ロググループ[string]を作成する", + "-SIPC-/consoles@_end log timer named [string] and print time elapsed from start to end": "[string]という名前のついたタイマーを停止させ、開始時間と終了時間からかかった時間を出力する", + "-SIPC-/consoles@_exit current log group": "ロググループから出る", "-SIPC-/consoles@_log [string]": "ログ[string]", + "-SIPC-/consoles@_log debug [string]": "デバッグ情報[string]を出力する", + "-SIPC-/consoles@_log error [string]": "エラー[string]を出力する", + "-SIPC-/consoles@_log information [string]": "情報[string]を出力する", + "-SIPC-/consoles@_log warning [string]": "警告[string]を出力する", + "-SIPC-/consoles@_print time of log timer named [string]": "[string]という名前のついたタイマーのタイムを出力する", + "-SIPC-/consoles@_start log timer named [string]": "タイマー[string]を開始する", "-SIPC-/time@_April": "4月", "-SIPC-/time@_August": "8月", "-SIPC-/time@_December": "12月", @@ -2675,6 +2699,7 @@ "-SIPC-/time@_October": "10月", "-SIPC-/time@_September": "9月", "-SIPC-/time@_Time": "時間", + "-SIPC-/time@_[Timedata] from [timestamp]": "[timestamp]から[Timedata]を取得する", "-SIPC-/time@_convert [time] to timestamp": "[time]をタイムスタンプに変換する", "-SIPC-/time@_convert [timestamp] to YYYY-MM-DD HH:MM:SS": "[timestamp]をYYYY-MM-DD HH:MM:SSに変換する", "-SIPC-/time@_current time zone": "現在のタイムゾーン", @@ -2805,8 +2830,10 @@ "CubesterYT/KeySimulation@_without waiting": "押す", "CubesterYT/TurboHook@_icon": "アイコン", "CubesterYT/TurboHook@_name": "名前", + "CubesterYT/WindowControls@_Hello World!": "こんにちは、世界!", "CubesterYT/WindowControls@_May not work in normal browser tabs": "ブラウザでは動作しない場合があります。", "CubesterYT/WindowControls@_Refer to Documentation for details": "詳しくはドキュメントをご覧ください。", + "CubesterYT/WindowControls@_Window Controls": "ウインドウ操作", "CubesterYT/WindowControls@_bottom": "下", "CubesterYT/WindowControls@_bottom left": "左下", "CubesterYT/WindowControls@_bottom right": "右下", @@ -2845,17 +2872,41 @@ "CubesterYT/WindowControls@_window x": "ウィンドウのx座標", "CubesterYT/WindowControls@_window y": "ウィンドウのy座標", "CubesterYT/WindowControls@editorConfirmation": "このウィンドウを閉じますか?\n\n(このメッセージはプロジェクトがパッケージ化されているときには表示されません)", + "DNin/wake-lock@_is wake lock active?": "画面起動ロックは動作していますか?", "DNin/wake-lock@_off": "オフ", "DNin/wake-lock@_on": "オン", "DNin/wake-lock@_turn wake lock [enabled]": "wake lockを[enabled]にする", + "DT/cameracontrols@_Camera (Very Buggy)": "カメラ操作 (非常に動作が不安定)", "DT/cameracontrols@_camera direction": "カメラの向き", "DT/cameracontrols@_camera x": "カメラのx座標", "DT/cameracontrols@_camera y": "カメラのy座標", + "DT/cameracontrols@_change camera x by [val]": "カメラのx座標を[val]ずつ変える", + "DT/cameracontrols@_change camera y by [val]": "カメラのy座標を[val]ずつ変える", + "DT/cameracontrols@_move camera [val] steps": "カメラを[val]歩動かす", + "DT/cameracontrols@_move camera to [sprite]": "カメラを[sprite]に移動する", + "DT/cameracontrols@_point camera towards [sprite]": "カメラを[sprite]へ向ける", + "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@_turn camera [image] [val] degrees": "カメラを[image][val]度回す", + "JeremyGamer13/tween@_linear": "一次関数", + "JeremyGamer13/tween@_sine": "正弦関数", + "JeremyGamer13/tween@_size": "サイズ", "Lily/Assets@_Asset Manager": "アセットマネージャー", + "Lily/Cast@_boolean": "真理値", + "Lily/Cast@_cast [INPUT] to [TYPE]": "[INPUT]を[TYPE]に変換する", + "Lily/Cast@_default": "黙認", + "Lily/Cast@_number": "数字", "Lily/Cast@_string": "文字列", + "Lily/Cast@_type of [INPUT]": "[INPUT]の型", + "Lily/ClonesPlus@_Clones+": "クローン +", + "Lily/ClonesPlus@_size": "サイズ", "Lily/CommentBlocks@_Comment Blocks": "コメントブロック", "Lily/CommentBlocks@_comment": "コメント", + "Lily/HackedBlocks@_Hidden Blocks": "隠されたブロック集", "Lily/ListTools@_List Tools": "リストツール", + "Lily/LooksPlus@_Looks+": "見た目 +", "Lily/LooksPlus@_brightness": "明るさ", "Lily/LooksPlus@_color": "色", "Lily/LooksPlus@_fisheye": "魚眼レンズ", @@ -2865,10 +2916,32 @@ "Lily/LooksPlus@_pixelate": "ピクセル化", "Lily/LooksPlus@_whirl": "渦巻き", "Lily/LooksPlus@_width": "横幅", + "Lily/McUtils@_broken": "壊れて", + "Lily/McUtils@_if [INPUTA] is manager then [INPUTB] else [INPUTC]": "[INPUTA]はマネージャーであるなら[INPUTB]、でなげれば[INPUTC]", + "Lily/McUtils@_is ice cream machine [INPUT]": "アイスクリーム機は[INPUT]いますか?", + "Lily/McUtils@_working": "動いて", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET]": "[TARGET]に[BROADCAST_OPTION]を送る", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET] and wait": "[TARGET]に[BROADCAST_OPTION]を送って待つ", + "Lily/MoreEvents@_false": "偽", + "Lily/MoreEvents@_true": "真", + "Lily/MoreEvents@_when [CONDITION] becomes [STATE]": "[CONDITION]が[STATE]になった時", + "Lily/MoreEvents@_when [INPUT] is changed": "[INPUT]が変わった時", + "Lily/MoreEvents@_when [STOP] clicked": "[STOP]が押された時", "Lily/Skins@_Skins": "スキン", "Lily/Skins@_height": "高さ", "Lily/Skins@_width": "横幅", + "Lily/SoundExpanded@_channels": "チャンネル数", + "Lily/SoundExpanded@_length": "長さ", + "Lily/SoundExpanded@_pitch": "ピッチ", + "Lily/SoundExpanded@_project volume": "プロジェクトの音量", + "Lily/SoundExpanded@_sample rate": "サンプルレート", + "Lily/TempVariables2@_Runtime Variables": "ランタイム変数", "Lily/TempVariables2@_Temporary Variables": "一時変数", + "Lily/TempVariables2@_Thread Variables": "スレッド変数", + "Lily/TempVariables2@_change thread var [VAR] by [NUM]": "スレッド変数[VAR]を[NUM]ずつ変える", + "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": "動画", "Lily/Video@_height": "高さ", "Lily/Video@_width": "横幅", @@ -2878,18 +2951,28 @@ "Lily/lmsutils@_browser": "ブラウザ", "Lily/lmsutils@_clear console": "コンソールをクリア", "Lily/lmsutils@_color": "色", + "Lily/lmsutils@_false": "偽", "Lily/lmsutils@_fisheye": "魚眼レンズ", "Lily/lmsutils@_ghost": "幽霊", "Lily/lmsutils@_green flag": "緑の旗", "Lily/lmsutils@_height": "高さ", "Lily/lmsutils@_mosaic": "モザイク", + "Lily/lmsutils@_newline character": "改行文字", + "Lily/lmsutils@_number": "数字", + "Lily/lmsutils@_operating system": "オペレーションシステム", "Lily/lmsutils@_pixelate": "ピクセル化", "Lily/lmsutils@_text": "テキスト", + "Lily/lmsutils@_true": "真", "Lily/lmsutils@_whirl": "渦巻き", "Lily/lmsutils@_width": "横幅", + "Longboost/color_channels@_false": "偽", "Longboost/color_channels@_off": "オフ", "Longboost/color_channels@_on": "オン", + "Longboost/color_channels@_true": "真", "NOname-awa/graphics2d@name": "グラフィック2D", + "NOname-awa/graphics2d@pi": "π", + "NOname-awa/more-comparisons@_false": "偽", + "NOname-awa/more-comparisons@_true": "真", "NexusKitten/controlcontrols@_fullscreen": "フルスクリーン", "NexusKitten/controlcontrols@_green flag": "緑の旗", "NexusKitten/controlcontrols@_pause": "一時停止", @@ -2904,14 +2987,22 @@ "NexusKitten/sgrab@_love": "好き", "NexusKitten/sgrab@_view": "参照数", "NexusKitten/sgrab@_wiwo": "私が取り組んでいること", + "Skyhigh173/bigint@_Bitwise": "ビット操作", "Skyhigh173/json@_Advanced": "詳細設定", + "Skyhigh173/json@_General Utils": "汎用ユーティリティ", + "TheShovel/CanvasEffects@_Canvas Effects": "キャンバス効果", "TheShovel/CanvasEffects@_brightness": "明るさ", + "TheShovel/CanvasEffects@_default": "黙認", + "TheShovel/CanvasEffects@_saturation": "彩度", "TheShovel/CanvasEffects@_scale": "スケール", + "TheShovel/CanvasEffects@_transparency": "透明度", "TheShovel/ColorPicker@_Color Picker": "カラーピッカー", "TheShovel/CustomStyles@_Custom Styles": "カスタムスタイル", "TheShovel/CustomStyles@_disabled": "無効", "TheShovel/CustomStyles@_enabled": "有効", + "TheShovel/CustomStyles@_transparent": "透明", "TheShovel/LZ-String@_LZ Compress": "LZ圧縮", + "Xeltalliv/clippingblending@_default": "黙認", "Xeltalliv/clippingblending@_height": "高さ", "Xeltalliv/clippingblending@_off": "オフ", "Xeltalliv/clippingblending@_on": "オン", @@ -2921,6 +3012,8 @@ "ZXMushroom63/searchApi@_name": "名前", "ar@_view": "参照数", "battery@_Battery": "バッテリー", + "bitwise@_Bitwise": "ビット操作", + "box2d@griffpatch.categoryName": "物理", "clipboard@_Clipboard": "クリップボード", "cs2627883/numericalencoding@_Hello!": "こんにちは!", "cursor@_Mouse Cursor": "マウスカーソル", @@ -2930,7 +3023,9 @@ "cursor@_top left": "左上", "cursor@_top right": "右上", "encoding@_Encoding": "エンコーディング", + "fetch@_Fetch": "フェッチ", "files@_Files": "ファイル", + "files@_Hello, world!": "こんにちは、世界!", "files@_Select or drop file": "選ぶかファイルをドロップする", "files@_open a [extension] file": "[extension]ファイルを開く", "files@_open a [extension] file as [as]": "[extension]ファイルを[as]として開く", @@ -2942,6 +3037,9 @@ "gamejolt@_day": "日", "gamejolt@_guest": "ゲスト", "gamejolt@_hour": "時", + "gamejolt@_logged in user's username": "登録したユーザーの名前", + "gamejolt@_logged in?": "登録している?", + "gamejolt@_logout": "ログアウト", "gamejolt@_minute": "分", "gamejolt@_month": "月", "gamejolt@_name": "名前", @@ -3017,9 +3115,17 @@ "local-storage@_Local Storage extension: project must run the \"set storage namespace ID\" block before it can use other blocks": "ローカルストレージ拡張機能:他のブロックを実行する前に、「ストレージの名前を()にする」ブロックを実行する必要があります。", "local-storage@_get key [KEY]": "キーを取得[KEY]", "local-storage@_set storage namespace ID to [ID]": "ストレージの名前空間IDを[ID]にする", + "mdwalters/notifications@_Hello, world!": "こんにちは、世界!", + "mdwalters/notifications@_Notification from project": "プロジェクトからの通知", + "mdwalters/notifications@_Notifications": "通知", + "mdwalters/notifications@_close notification": "通知を消す", + "mdwalters/notifications@_has notification permission?": "通知権限を持っている?", + "mdwalters/notifications@_request notification permission": "通知権限を要求する", + "navigator@_Navigator Info": "ナビゲーター情報", "navigator@_browser": "ブラウザ", "navigator@_dark": "ダーク", "navigator@_light": "ライト", + "navigator@_operating system": "オペレーションシステム", "obviousAlexC/SensingPlus@_# of clones of [Sprite]": "スプライト[Sprite]のクローンの数", "obviousAlexC/SensingPlus@_# of fingers down": "タッチされている指の数", "obviousAlexC/SensingPlus@_# of simultaneous possible": "同時にタッチ可能な数", @@ -3049,6 +3155,7 @@ "obviousAlexC/SensingPlus@_rotation style": "回転方法", "obviousAlexC/SensingPlus@_set clipboard to [TEXT]": "クリップボードに[TEXT]をセットする", "obviousAlexC/SensingPlus@_sprite layer": "今いるレイヤー", + "obviousAlexC/SensingPlus@_supports touches?": "タッチ対応", "obviousAlexC/SensingPlus@_touching a clone of [Sprite]?": "クローンされたスプライト[Sprite]に指が触れているか", "obviousAlexC/SensingPlus@_touching a finger?": "指に触れているか?", "obviousAlexC/SensingPlus@_touching finger [ID]?": "[ID]本の指に触れているか", @@ -3056,12 +3163,24 @@ "obviousAlexC/SensingPlus@_whirl": "渦巻き", "obviousAlexC/newgroundsIO@_username": "ユーザー名", "obviousAlexC/penPlus@_Advanced": "詳細設定", + "obviousAlexC/penPlus@_Color": "色", + "obviousAlexC/penPlus@_Cubemaps": "キューブマップ", + "obviousAlexC/penPlus@_Custom Shaders": "カスタムシェーダー", + "obviousAlexC/penPlus@_Height": "高さ", "obviousAlexC/penPlus@_Images": "画像", + "obviousAlexC/penPlus@_Pen+ version": "ペン+ バージョン", + "obviousAlexC/penPlus@_Shader Editor": "シェーダーエディター", + "obviousAlexC/penPlus@_Shader Manager": "シェーダーマネージャー", + "obviousAlexC/penPlus@_Width": "横幅", "obviousAlexC/penPlus@_brightness": "明るさ", "obviousAlexC/penPlus@_color": "色", "obviousAlexC/penPlus@_height": "高さ", "obviousAlexC/penPlus@_off": "オフ", "obviousAlexC/penPlus@_on": "オン", + "obviousAlexC/penPlus@_saturation": "彩度", + "obviousAlexC/penPlus@_size": "サイズ", + "obviousAlexC/penPlus@_transparency": "透明度", + "obviousAlexC/penPlus@_triangles drawn": "描画された三角形の数", "obviousAlexC/penPlus@_width": "横幅", "pointerlock@_Pointerlock": "ポインターロック", "pointerlock@_disabled": "無効", @@ -3070,6 +3189,10 @@ "pointerlock@_set pointer lock [enabled]": "ポインターロックを[enabled]にする", "qxsck/data-analysis@name": "データ分析", "qxsck/var-and-list@name": "変数とリスト", + "rixxyx@_false": "偽", + "rixxyx@_if [BOOL] then [TEXT]": "もし[BOOL]なら[TEXT]", + "rixxyx@_if [BOOL] then [TEXT_1] else [TEXT_2]": "もし[BOOL]なら[TEXT_1]、でなげれば[TEXT_2]", + "rixxyx@_true": "真", "runtime-options@_Infinity": "無限", "runtime-options@_Runtime Options": "ランタイムのオプション", "runtime-options@_[thing] enabled?": "[thing]が有効", @@ -3093,16 +3216,25 @@ "runtime-options@_username": "ユーザー名", "runtime-options@_width": "横幅", "sound@_Sound": "音声", + "steamworks@_false": "偽", + "steamworks@_name": "名前", + "steamworks@_true": "真", "text@_Text": "テキスト", "true-fantom/base@_Base": "進数", "true-fantom/base@_[A] from base [B] to base [C]": "[B]進数の数[A]を[C]進数に変換する", "true-fantom/base@_is base [B] [A]?": "[A]は[B]進数で表現できる", "true-fantom/couplers@_Couplers": "カプラ", + "true-fantom/couplers@_false": "偽", + "true-fantom/couplers@_true": "真", "true-fantom/math@_Math": "数学", "true-fantom/network@_Network": "ネットワーク", "true-fantom/network@_apple": "りんご", "true-fantom/network@_browser": "ブラウザ", + "true-fantom/network@_default": "黙認", "utilities@_Utilities": "ユーティリティ", + "utilities@_false": "偽", + "utilities@_pi": "π", + "utilities@_true": "真", "veggiecan/browserfullscreen@_Browser Fullscreen": "ブラウザフルスクリーン", "veggiecan/browserfullscreen@_enter": "Enter", "veggiecan/mobilekeyboard@_Mobile Keyboard": "モバイルキーボード", @@ -3157,7 +3289,7 @@ "-SIPC-/time@_day": "일", "-SIPC-/time@_days": "일", "-SIPC-/time@_difference between [DATE] and now in [TIME_MENU]": "[DATE]부터 현재까지의 [TIME_MENU] 차이", - "-SIPC-/time@_difference between [START] and [END] in [TIME_MENU]": "[START]와(과) [END]의 [TIME_MENU] 차이", + "-SIPC-/time@_difference between [START] and [END] in [TIME_MENU]": "[START]부터 [END]까지의 [TIME_MENU] 차이", "-SIPC-/time@_exact": "정확한", "-SIPC-/time@_format [VALUE] seconds as [ROUND] time": "[VALUE]초를 [ROUND] 시간 형식으로", "-SIPC-/time@_hour": "시", @@ -3187,7 +3319,7 @@ "Alestore/nfcwarp@_NFC not supported": "NFC 지원되지 않음", "Alestore/nfcwarp@_NFC supported?": "NFC를 지원하는가?", "Alestore/nfcwarp@_NFCWarp": "NFC워프", - "Alestore/nfcwarp@_Only works in Chrome on Android": "Android 크롬 브라우저만 지원함", + "Alestore/nfcwarp@_Only works in Chrome on Android": "안드로이드의 Chrome 브라우저만 지원함", "Alestore/nfcwarp@_read NFC tag": "NFC 태그 읽기", "CST1229/images@_Images": "이미지", "CST1229/images@_[QUERY] of image [IMG]": "이미지 [IMG]의 [QUERY]", @@ -3212,8 +3344,10 @@ "CST1229/zip@_Hello, world?": "헬로 월드?", "CST1229/zip@_[META] of [FILE]": "[FILE]의 [META]", "CST1229/zip@_[OBJECT] exists?": "[OBJECT]이(가) 존재하는가?", + "CST1229/zip@_any text": "아무 텍스트", "CST1229/zip@_archive": "아카이브", "CST1229/zip@_archive comment": "아카이브 주석", + "CST1229/zip@_archive is open?": "아카이브가 열려있는가?", "CST1229/zip@_binary": "바이너리", "CST1229/zip@_comment": "주석", "CST1229/zip@_contents of directory [DIR]": "디렉토리 [DIR]의 내용", @@ -3222,20 +3356,24 @@ "CST1229/zip@_create empty archive named [NAME]": "빈 아카이브 [NAME] 만들기", "CST1229/zip@_current archive name": "현재 아카이브 이름", "CST1229/zip@_current directory path": "현재 디렉토리 경로", + "CST1229/zip@_currently open archives": "열린 아카이브 목록", "CST1229/zip@_delete [FILE]": "[FILE] 삭제하기", "CST1229/zip@_error opening archive?": "아카이브를 여는 중 오류가 발생했는가?", + "CST1229/zip@_file [FILE] as [TYPE]": "파일 [FILE]을(를) [TYPE](으)로 읽기", "CST1229/zip@_folder": "폴더", "CST1229/zip@_go to directory [DIR]": "디렉토리 [DIR](으)로 이동하기", - "CST1229/zip@_hex": "16진수", + "CST1229/zip@_hex": "Hex", "CST1229/zip@_long modification date": "상세 수정 날짜", "CST1229/zip@_modification date": "수정 날짜", "CST1229/zip@_modified days since 2000": "2000년 부터 수정일 까지의 날짜 수", "CST1229/zip@_name": "이름", - "CST1229/zip@_new file": "새 파일 만들기", - "CST1229/zip@_new folder": "새 폴더 만들기", "CST1229/zip@_no compression (fastest)": "압축 없음 (가장 빠름)", + "CST1229/zip@_open archive from zip [TYPE] [DATA] named [NAME]": "아카이브 [NAME]을(를) [TYPE][DATA](으)로 열기 ", + "CST1229/zip@_open zip from [TYPE] [DATA] named \"archive\"": "아카이브 \"아카이브\"를 [TYPE][DATA](으)로 열기", + "CST1229/zip@_other archive": "다른 아카이브", "CST1229/zip@_output zip type [TYPE] compression level [COMPRESSION]": "zip 타입[TYPE] 압축 레벨[COMPRESSION] (으)로 출력", "CST1229/zip@_path": "경로", + "CST1229/zip@_path [PATH] from [ORIGIN]": "[ORIGIN]에서 [PATH] 경로로", "CST1229/zip@_remove all archives": "모든 아카이브 삭제하기", "CST1229/zip@_remove current archive": "현재 아카이브 삭제하기", "CST1229/zip@_set [META] of [FILE] to [VALUE]": "[FILE]의 [META]을(를) [VALUE](으)로 정하기", @@ -3244,6 +3382,7 @@ "CST1229/zip@_switch to archive named [NAME]": "아카이브 [NAME](으)로 바꾸기 ", "CST1229/zip@_text": "텍스트", "CST1229/zip@_unix modified timestamp": "unix 수정 타임스탬프", + "CST1229/zip@_write file [FILE] content [CONTENT] type [TYPE]": "새 파일 [FILE]을(를) [TYPE] 타입의 [CONTENT](으)로 쓰기", "Clay/htmlEncode@_HTML Encode": "HTML 인코딩", "Clay/htmlEncode@_Hello!": "안녕!", "Clay/htmlEncode@_encode [text] as HTML-safe": "[text]을(를) HTML 안전하게 인코딩하기", @@ -3267,10 +3406,12 @@ "CubesterYT/KeySimulation@_up arrow": "위쪽 화살표", "CubesterYT/KeySimulation@_without waiting": "기다리지 않기", "CubesterYT/TurboHook@_TurboHook": "터보Hook", + "CubesterYT/TurboHook@_content": "내용", "CubesterYT/TurboHook@_icon": "아이콘", "CubesterYT/TurboHook@_name": "이름", "CubesterYT/WindowControls@_Hello World!": "헬로 월드!", - "CubesterYT/WindowControls@_Refer to Documentation for details": "상세정보 문서 보기", + "CubesterYT/WindowControls@_May not work in normal browser tabs": "일반 브라우저 탭에서 작동하지 않음", + "CubesterYT/WindowControls@_Refer to Documentation for details": "문서에서 더 알아보기", "CubesterYT/WindowControls@_Window Controls": "창 제어", "CubesterYT/WindowControls@_bottom": "아래", "CubesterYT/WindowControls@_bottom left": "왼쪽 아래", @@ -3308,6 +3449,7 @@ "CubesterYT/WindowControls@_window width": "창 넓이", "CubesterYT/WindowControls@_window x": "창 x", "CubesterYT/WindowControls@_window y": "창 y", + "CubesterYT/WindowControls@editorConfirmation": "정말 창을 닫으시겠습니까?\n\n(이 메시지는 프로젝트가 패키지되었을 때 나타나지 않습니다)", "DNin/wake-lock@_Wake Lock": "화면 켜짐 고정", "DNin/wake-lock@_is wake lock active?": "화면 켜짐 고정이 활성화 되었는가?", "DNin/wake-lock@_off": "비활성화", @@ -3324,19 +3466,25 @@ "DT/cameracontrols@_change camera zoom by [val]": "카메라의 줌을 [val]만큼 바꾸기", "DT/cameracontrols@_move camera [val] steps": "카메라를 [val] 만큼 움직이기", "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@_turn camera [image] [val] degrees": "카메라를 [image] [val]도 돌기", + "JeremyGamer13/tween@_Tweening": "트위닝", + "JeremyGamer13/tween@_[MODE] ease [DIRECTION] [START] to [END] by [AMOUNT]%": "[MODE] ease[DIRECTION] [START]에서 [END](으)로의 [AMOUNT]% 값", "JeremyGamer13/tween@_direction": "방향", "JeremyGamer13/tween@_in": "인", "JeremyGamer13/tween@_in out": "인 아웃", - "JeremyGamer13/tween@_linear": "선형", "JeremyGamer13/tween@_out": "아웃", - "JeremyGamer13/tween@_sine": "사인", "JeremyGamer13/tween@_size": "크기", + "JeremyGamer13/tween@_tween [PROPERTY] to [VALUE] over [SEC] seconds using [MODE] ease [DIRECTION]": "[PROPERTY]을(를) [VALUE](으)로 [SEC]초 동안 [MODE] ease[DIRECTION] (으)로 바꾸기", + "JeremyGamer13/tween@_tween to x: [X] y: [Y] over [SEC] seconds using [MODE] ease [DIRECTION]": "x:[X] y:[Y] (으)로 [SEC]초 동안 [MODE] ease[DIRECTION] (으)로 이동하기", + "JeremyGamer13/tween@_tween variable [VAR] to [VALUE] over [SEC] seconds using [MODE] ease [DIRECTION]": "변수 [VAR]을(를) [VALUE](으)로 [SEC]초 동안 [MODE] ease[DIRECTION](으)로 바꾸기", "JeremyGamer13/tween@_x position": "x좌표", "JeremyGamer13/tween@_y position": "y좌표", "Lily/AllMenus@_All Menus": "모든 선택목록 블록", @@ -3353,17 +3501,20 @@ "Lily/Assets@_delete costume [COSTUME]": "모양 [COSTUME] 삭제하기", "Lily/Assets@_delete sound [SOUND]": "소리 [SOUND] 삭제하기", "Lily/Assets@_delete sprite [TARGET]": "스프라이트 [TARGET] 삭제하기", + "Lily/Assets@_format": "파일 확장자", "Lily/Assets@_header": "헤더", + "Lily/Assets@_index": "번째", "Lily/Assets@_load extension from URL [URL]": "URL에서 확장 기능 불러오기 [URL]", - "Lily/Assets@_name of costume # [INDEX]": "[INDEX]번째 모양의 이름", - "Lily/Assets@_name of sound # [INDEX]": "[INDEX]번째 소리의 이름", + "Lily/Assets@_loaded extensions": "불러온 확장 기능 목록", + "Lily/Assets@_name of costume # [INDEX]": "모양 [INDEX]번째의 이름", + "Lily/Assets@_name of sound # [INDEX]": "소리 [INDEX]번째의 이름", "Lily/Assets@_open project from URL [URL]": "URL에서 프로젝트 열기 [URL]", "Lily/Assets@_project JSON": "프로젝트 JSON", "Lily/Assets@_rename costume [COSTUME] to [NAME]": "모양 [COSTUME]의 이름을 [NAME](으)로 바꾸기", "Lily/Assets@_rename sound [SOUND] to [NAME]": "소리 [SOUND]의 이름을 [NAME](으)로 바꾸기", "Lily/Assets@_rename sprite [TARGET] to [NAME]": "스프라이트 [TARGET]의 이름을 [NAME](으)로 바꾸기", - "Lily/Assets@_reorder costume # [INDEX1] to index [INDEX2]": "[INDEX1]번째 모양을 [INDEX2]번째로 바꾸기", - "Lily/Assets@_reorder sound # [INDEX1] to index [INDEX2]": "[INDEX1]번째 소리를 [INDEX2]번째로 바꾸기", + "Lily/Assets@_reorder costume # [INDEX1] to index [INDEX2]": "모양 [INDEX1]번째를 [INDEX2]번째로 바꾸기", + "Lily/Assets@_reorder sound # [INDEX1] to index [INDEX2]": "소리 [INDEX1]번째를 [INDEX2]번째로 바꾸기", "Lily/Assets@_sprite name": "스프라이트 이름", "Lily/Cast@_boolean": "불리언", "Lily/Cast@_cast [INPUT] to [TYPE]": "[INPUT]을(를) [TYPE]화 하기", @@ -3377,22 +3528,24 @@ "Lily/ClonesPlus@_clone count": "복제본 개수", "Lily/ClonesPlus@_clone count of [INPUT]": "[INPUT]의 복제본 개수", "Lily/ClonesPlus@_clone with [INPUTA] set to [INPUTB] exists?": "[INPUTA]이(가) [INPUTB]인 복제본이 존재하는가?", - "Lily/ClonesPlus@_costume #": "모양 번호", + "Lily/ClonesPlus@_costume #": "모양 번째", "Lily/ClonesPlus@_costume name": "모양 이름", "Lily/ClonesPlus@_create clone 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 clones with [INPUTC] set to [INPUTD]": "[INPUTC]이(가) [INPUTD]인 복제본의 [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]인 복제본 멈추기", "Lily/ClonesPlus@_stop scripts in main sprite": "원본 스프라이트의 스크립트 멈추기", "Lily/ClonesPlus@_touching clone with [INPUTA] set to [INPUTB]?": "[INPUTA]이(가) [INPUTB]인 복제본에 닿았는가?", "Lily/ClonesPlus@_touching main sprite?": "원본 스프라이트에 닿았는가?", - "Lily/ClonesPlus@_variable [INPUTA] of clone with [INPUTB] set to [INPUTC]": "[INPUTB]이(가) [INPUTC]인 복제본의 변수값 [INPUTA]", - "Lily/ClonesPlus@_variable [INPUT] of main sprite": "원본 스프라이트의 변수값 [INPUT]", + "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@_x position": "x좌표", @@ -3405,6 +3558,7 @@ "Lily/ListTools@_[LIST] as array": "[LIST]을(를) 배열로", "Lily/ListTools@_[LIST] is empty?": "[LIST]이(가) 비었는가?", "Lily/ListTools@_ascending": "오름차순", + "Lily/ListTools@_concatenate [LIST1] onto [LIST2]": "[LIST2]에서 [LIST1]을(를) 덛붙이기", "Lily/ListTools@_delete all [ITEM] in [LIST]": "[LIST]의 모든 [ITEM] 삭제하기", "Lily/ListTools@_delete items [NUM1] to [NUM2] of [LIST]": "[LIST]의 [NUM1]번째부터 [NUM2]번째까지 삭제하기", "Lily/ListTools@_descending": "내림차순", @@ -3415,32 +3569,37 @@ "Lily/ListTools@_order of [LIST] is [ORDER]?": "[LIST]이(가) [ORDER]인가?", "Lily/ListTools@_random": "무작위", "Lily/ListTools@_randomized": "무작위", - "Lily/ListTools@_repeat [LIST1] [NUM] times in [LIST2]": "[LIST2]에서 [LIST1]을(를) [NUM]번 반복하기", "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 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@_# of costumes in [TARGET]": "[TARGET]의 모양 번째", "Lily/LooksPlus@_Looks+": "형태 플러스", "Lily/LooksPlus@_[ATTRIBUTE] of [COSTUME]": "[COSTUME]의 [ATTRIBUTE]", - "Lily/LooksPlus@_[CONTENT] of costume # [COSTUME] of [TARGET]": "[TARGET]의 [COSTUME]번째 모양의 [CONTENT]", + "Lily/LooksPlus@_[CONTENT] of costume # [COSTUME] of [TARGET]": "[TARGET]의 모양 [COSTUME]번째의 [CONTENT]", "Lily/LooksPlus@_[EFFECT] effect of [TARGET]": "[TARGET]의 [EFFECT] 효과값", "Lily/LooksPlus@_[TARGET] visible?": "[TARGET]이(가) 보이는가?", "Lily/LooksPlus@_brightness": "밝기", "Lily/LooksPlus@_color": "색깔", + "Lily/LooksPlus@_content": "내용", "Lily/LooksPlus@_fisheye": "어안 렌즈", + "Lily/LooksPlus@_format": "파일 확장자", "Lily/LooksPlus@_ghost": "투명도", "Lily/LooksPlus@_height": "높이", + "Lily/LooksPlus@_hex of [COLOR]": "[COLOR]의 Hex코드", "Lily/LooksPlus@_hide [TARGET]": "[TARGET] 숨기기", "Lily/LooksPlus@_layer # of [TARGET]": "[TARGET]의 레이어 번째", "Lily/LooksPlus@_mosaic": "모자이크", "Lily/LooksPlus@_pixelate": "픽셀화", + "Lily/LooksPlus@_replace [COLOR1] with [COLOR2] in [SVG]": "[SVG]에서 [COLOR1](을)를 [COLOR2](으)로 대체", + "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]": "[COSTUME]의 [TYPE]을(를) [CONTENT](으)로 정하기", - "Lily/LooksPlus@_set layer # of [TARGET] to [LAYER]": "[TARGET]의 레이어 번째를 [LAYER](으)로 정하기", + "Lily/LooksPlus@_set layer # of [TARGET] to [LAYER]": "[TARGET]의 레이어를 [LAYER]번째로 정하기", "Lily/LooksPlus@_show [TARGET]": "[TARGET] 보이기", + "Lily/LooksPlus@_snapshot stage": "무대 스크린샷", "Lily/LooksPlus@_whirl": "소용돌이", "Lily/LooksPlus@_width": "넓이", "Lily/McUtils@_broken": "고장남", @@ -3485,10 +3644,13 @@ "Lily/MoreTimers@_when timer [TIMER] [OP] [NUM]": "타이머가 [TIMER][OP][NUM] 일 때", "Lily/Skins@_Skins": "스킨", "Lily/Skins@_[ATTRIBUTE] of skin [NAME]": "스킨 [NAME]의 [ATTRIBUTE]", + "Lily/Skins@_create SVG skin [SVG] as [NAME]": "SVG 스킨 [NAME] 만들기 [SVG] ", "Lily/Skins@_current skin of [TARGET]": "현재 스킨의 [TARGET]", "Lily/Skins@_delete all skins": "모든 스킨 삭제하기", "Lily/Skins@_delete skin [NAME]": "스킨 [NAME] 삭제하기", "Lily/Skins@_height": "높이", + "Lily/Skins@_load skin from URL [URL] as [NAME]": "스킨 [NAME]을(를) URL에서 불러오기 [URL]", + "Lily/Skins@_load skin from [COSTUME] as [NAME]": "스킨 [NAME]을(를) [COSTUME](으)로 불러오기", "Lily/Skins@_restore skin of [TARGET]": "[TARGET]의 스킨 복구하기", "Lily/Skins@_set skin of [TARGET] to [NAME]": "[TARGET]의 스킨을 [NAME](으)로 정하기", "Lily/Skins@_width": "넓이", @@ -3500,7 +3662,9 @@ "Lily/SoundExpanded@_effect [EFFECT] of [TARGET]": "[TARGET]의 [EFFECT]효과", "Lily/SoundExpanded@_end looping [SOUND]": "[SOUND] 반복 멈추기", "Lily/SoundExpanded@_length": "재생 길이", + "Lily/SoundExpanded@_pan": "소리 좌우 위치", "Lily/SoundExpanded@_pause all sounds": "모든 소리 일시정지 하기", + "Lily/SoundExpanded@_pitch": "음 높이", "Lily/SoundExpanded@_play sound [SOUND] from [START] seconds until done": "소리 [SOUND]을(를) [START]초부터 끝까지 재생하기", "Lily/SoundExpanded@_play sound [SOUND] from [START] to [END] seconds until done": "소리 [SOUND]을(를) [START]초부터 끝나기 [END]초 전까지 재생하기", "Lily/SoundExpanded@_project volume": "프로젝트 볼륨", @@ -3529,15 +3693,21 @@ "Lily/TempVariables2@_thread var [VAR] exists?": "스레드 변수 [VAR]이(가) 존재하는가?", "Lily/Video@_Video": "비디오", "Lily/Video@_[ATTRIBUTE] of video [NAME]": "비디오 [NAME]의 [ATTRIBUTE]", + "Lily/Video@_current time": "현재 재생 시간", + "Lily/Video@_current video on [TARGET]": "[TARGET]의 현재 비디오", "Lily/Video@_delete video [NAME]": "비디오 [NAME] 삭제하기", - "Lily/Video@_duration": "재생 시간", + "Lily/Video@_duration": "재생 길이", "Lily/Video@_height": "높이", "Lily/Video@_load video from URL [URL] as [NAME]": "비디오 [NAME]을(를) URL에서 불러오기 [URL]", + "Lily/Video@_loaded videos": "불러온 비디오 목록", "Lily/Video@_pause video [NAME]": "비디오 [NAME] 일시정지 하기", "Lily/Video@_paused": "일시정지 중", "Lily/Video@_playing": "재생 중", "Lily/Video@_resume video [NAME]": "비디오 [NAME] 재시작하기", "Lily/Video@_set volume of video [NAME] to [VALUE]": "비디오 [NAME]의 음량을 [VALUE](으)로 정하기", + "Lily/Video@_show video [NAME] on [TARGET]": "비디오 [NAME]을(를) [TARGET]에 보이기", + "Lily/Video@_start video [NAME] at [DURATION] seconds": "비디오 [NAME]을(를) [DURATION]초 부터 시작하기", + "Lily/Video@_stop showing video on [TARGET]": "[TARGET]의 비디오 숨기기", "Lily/Video@_video [NAME] is [STATE]?": "비디오 [NAME]이(가) [STATE]인가?", "Lily/Video@_volume": "음량", "Lily/Video@_width": "넓이", @@ -3615,12 +3785,15 @@ "Longboost/color_channels@_red": "Red", "Longboost/color_channels@_true": "참", "NOname-awa/graphics2d@area": "넓이", + "NOname-awa/graphics2d@circumference": "둘레", "NOname-awa/graphics2d@diameter": "지름", + "NOname-awa/graphics2d@graph": "그래프 [graph]의 [CS]", "NOname-awa/graphics2d@line_section": "([x1],[y1]) 부터 ([x2],[y2]) 까지의 거리", "NOname-awa/graphics2d@name": "그래픽 2D", "NOname-awa/graphics2d@quadrilateral": "사각형 ([x1],[y1]) ([x2],[y2]) ([x3],[y3]) ([x4],[y4]) 의 [CS]", "NOname-awa/graphics2d@radius": "반지름", - "NOname-awa/graphics2d@ray_direction": "([x1],[y1]) 에서 ([x2],[y2]) 으로의 방향", + "NOname-awa/graphics2d@ray_direction": "([x1],[y1]) 에서 ([x2],[y2]) (으)로의 방향", + "NOname-awa/graphics2d@round": "[rd]이(가) [a]인 원의 [CS]", "NOname-awa/graphics2d@triangle": "삼각형 ([x1],[y1]) ([x2],[y2]) ([x3],[y3]) 의 [CS]", "NOname-awa/graphics2d@triangle_s": "삼각형 [s1] [s2] [s3] 의 넓이", "NOname-awa/more-comparisons@_More Comparisons": "추가 비교연산", @@ -3646,6 +3819,7 @@ "NexusKitten/moremotion@_move [PERCENT]% of the way to x: [X] y: [Y]": "x:[X] y:[Y] (으)로 [PERCENT]% 만큼 이동하기", "NexusKitten/moremotion@_move [STEPS] steps towards x: [X] y: [Y]": "x:[X] y:[Y] (으)로 [STEPS]번 나눠 이동하기 ", "NexusKitten/moremotion@_point towards x: [X] y: [Y]": "x:[X] y:[Y] 쪽을 향하기", + "NexusKitten/moremotion@_rotation style": "회전 방식", "NexusKitten/moremotion@_sprite [WHAT]": "스프라이트 [WHAT]", "NexusKitten/moremotion@_touching rectangle x1: [X1] y1: [Y1] x2: [X2] y2: [Y2]?": "사각형 x1:[X1] y1:[Y1] x2:[X2] y2:[Y2] 에 닿았는가?", "NexusKitten/moremotion@_touching x: [X] y: [Y]?": "x:[X] y:[Y] 에 닿았는가?", @@ -3661,8 +3835,10 @@ "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]": "프로젝트 ID [WHO]의 이름", + "NexusKitten/sgrab@_status": "상태", "NexusKitten/sgrab@_view": "조회수", "NexusKitten/sgrab@_wiwo": "내가 하고 있는 일", "PwLDev/vibration@_Only works on Chrome for Android.": "오직 Android의 크롬 브라우저만 지원합니다", @@ -3673,9 +3849,14 @@ "SharkPool/Font-Manager@_Font Manager": "글꼴 매니저", "SharkPool/Font-Manager@_[ADDED] fonts": "[ADDED]된 글꼴", "SharkPool/Font-Manager@_[DATA] of font [NAME]": "글꼴 [NAME]의 [DATA]", + "SharkPool/Font-Manager@_add font named [NAME] with fallback [BACKUP] from URL [URL]": "시스템 폰트 [NAME] 추가하거나 URL에서 [BACKUP](으)로 대체하기 [URL]", "SharkPool/Font-Manager@_add system font named [NAME] with fallback [BACKUP]": "시스템 폰트 [NAME] 추가하거나 [BACKUP](으)로 대체하기", + "SharkPool/Font-Manager@_all custom fonts": "사용자 지정 폰트 목록", "SharkPool/Font-Manager@_data: uri": "data: URI", + "SharkPool/Font-Manager@_fallback": "대체 글꼴", "SharkPool/Font-Manager@_font [NAME] added?": "글꼴 [NAME]이(가) 추가되었는가?", + "SharkPool/Font-Manager@_format": "파일 확장자", + "SharkPool/Font-Manager@_is system": "시스템 글꼴 여부", "SharkPool/Font-Manager@_remove all fonts": "모든 글꼴 제거하기", "SharkPool/Font-Manager@_remove font [NAME]": "글꼴 [NAME]을(를) 제거하기", "SharkPool/Font-Manager@_when font is [ADDED]": "글꼴이 [ADDED]되었을 때", @@ -3691,6 +3872,7 @@ "Skyhigh173/bigint@_convert number [text] to BigInt": "숫자 [text]을(를) BigInt로", "Skyhigh173/json@_Advanced": "고급 설정", "Skyhigh173/json@_Array": "배열", + "Skyhigh173/json@_General Utils": "일반 유틸", "Skyhigh173/json@_Lists": "리스트", "Skyhigh173/json@_Object": "객체", "Skyhigh173/json@_[json] contains key [key]?": "[json]이(가) [key] 키를 포함하는가?", @@ -3698,43 +3880,69 @@ "Skyhigh173/json@_add [item] to array [json]": "배열 [json]에 [item] 추가하기", "Skyhigh173/json@_all [Stype] of [json]": "[json]의 모든 [Stype]", "Skyhigh173/json@_array concat [json] [json2]": "배열 합치기 [json] [json2]", + "Skyhigh173/json@_array from text [json]": "텍스트를 배열화 [json]", "Skyhigh173/json@_ascending": "오름차순", "Skyhigh173/json@_datas": "데이터", "Skyhigh173/json@_delete [item] in [json]": "[json]의 [item] 삭제하기", "Skyhigh173/json@_delete all [item] in array [json]": "배열 [json]의 [item]을(를) 모두 삭제하기", - "Skyhigh173/json@_delete item [item] of 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]까지 플랫화 [json]", "Skyhigh173/json@_get list [list] as array": "리스트 [list]을(를) 배열로", - "Skyhigh173/json@_insert [item] at [pos] of array [json]": "배열 [json]에 [item]을(를) [pos]번째에 삽입하기", + "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]": "배열 [json]에서 [item]의 번째", + "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@_keys": "키", "Skyhigh173/json@_length of array [json]": "배열 [json]의 길이", "Skyhigh173/json@_length of json [json]": "JSON [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@_new [json]": "새 [json]", + "Skyhigh173/json@_replace item [pos] of [json] with [item]": "배열 [json]의 [pos]번째 값을 [item](으)로 정하기", + "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]": "배열 [json]의 길이를 [len](으)로 정하기", "Skyhigh173/json@_set list [list] to [json]": "리스트 [list]을(를) [json](으)로 정하기", "Skyhigh173/json@_sort array [list] in [order] order": "배열 [list]을(를) [order]으로 정렬하기", "Skyhigh173/json@_value of [item] in [json]": "[json]에서 [item]의 값", "Skyhigh173/json@_values": "값", "TheShovel/CanvasEffects@_Canvas Effects": "Canvas 효과", + "TheShovel/CanvasEffects@_blur": "흐림", "TheShovel/CanvasEffects@_border color": "외곽선 색상", "TheShovel/CanvasEffects@_border radius": "외곽선 둥글기", "TheShovel/CanvasEffects@_border style": "외곽선 스타일", "TheShovel/CanvasEffects@_border width": "외곽선 두께", "TheShovel/CanvasEffects@_brightness": "밝기", - "TheShovel/CanvasEffects@_change canvas [EFFECT] by [NUMBER]": "캔버스 [EFFECT]을(를) [NUMBER]만큼 바꾸기", + "TheShovel/CanvasEffects@_change canvas [EFFECT] by [NUMBER]": "캔버스 [EFFECT]효과를 [NUMBER]만큼 바꾸기", + "TheShovel/CanvasEffects@_color shift": "색깔", + "TheShovel/CanvasEffects@_contrast": "대비", "TheShovel/CanvasEffects@_default": "기본", + "TheShovel/CanvasEffects@_get canvas [EFFECT]": "캔버스 [EFFECT]효과 값 ", "TheShovel/CanvasEffects@_invert": "반전", + "TheShovel/CanvasEffects@_offset X": "위치 x", + "TheShovel/CanvasEffects@_offset Y": "위치 y", + "TheShovel/CanvasEffects@_pixelated": "픽셀화", + "TheShovel/CanvasEffects@_rotation": "회전", + "TheShovel/CanvasEffects@_saturation": "채도", + "TheShovel/CanvasEffects@_scale": "크기", + "TheShovel/CanvasEffects@_scale X": "넓이", + "TheShovel/CanvasEffects@_scale Y": "높이", "TheShovel/CanvasEffects@_sepia": "세피아", - "TheShovel/CanvasEffects@_set canvas [EFFECT] to [NUMBER]": "캔버스 [EFFECT]을(를) [NUMBER](으)로 정하기", + "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@_transparency": "투명", "TheShovel/ColorPicker@_Color Picker": "색상 선택기", "TheShovel/ColorPicker@_blue": "Blue", + "TheShovel/ColorPicker@_color [TYPE] value": "선택기 색상의 [TYPE]값", "TheShovel/ColorPicker@_green": "Green", - "TheShovel/ColorPicker@_hex": "16진수", + "TheShovel/ColorPicker@_hex": "Hex코드", + "TheShovel/ColorPicker@_picker [COORD] position": "선택기 [COORD]좌표 값", "TheShovel/ColorPicker@_red": "Red", "TheShovel/ColorPicker@_set picker color to [COLOR]": "선택기 색상을 [COLOR](으)로 정하기", "TheShovel/ColorPicker@_set picker position to x: [X] y: [Y]": "선택기를 x:[X] y:[Y] (으)로 이동하기", @@ -3757,23 +3965,37 @@ "TheShovel/CustomStyles@_ask prompt question text": "묻기 입력란 질문 텍스트", "TheShovel/CustomStyles@_disabled": "비활성화", "TheShovel/CustomStyles@_enabled": "활성화", + "TheShovel/CustomStyles@_image [URL]": "이미지 [URL]", "TheShovel/CustomStyles@_list footer background": "리스트 하단 배경", "TheShovel/CustomStyles@_list header background": "리스트 상단 배경", + "TheShovel/CustomStyles@_list scroll rule": "리스트 스크롤 방식", "TheShovel/CustomStyles@_list value": "리스트 값", - "TheShovel/CustomStyles@_list value background": "리스트 가운데 배경", + "TheShovel/CustomStyles@_list value background": "리스트 값 배경", "TheShovel/CustomStyles@_list value roundness": "리스트 값 둥글기", - "TheShovel/CustomStyles@_list value text": "리스트 가운데 텍스트", + "TheShovel/CustomStyles@_list value text": "리스트 값 텍스트", + "TheShovel/CustomStyles@_make a gradient with [COLOR1] and [COLOR2] at angle [ANGLE]": "그라디언트 [COLOR1] 부터 [COLOR2] 까지 [ANGLE]도", + "TheShovel/CustomStyles@_monitor background": "값 표시기 배경", + "TheShovel/CustomStyles@_monitor background border width": "값 표시기 배경 외곽선 두께", + "TheShovel/CustomStyles@_monitor background roundness": "값 표시기 배경 둥글기", + "TheShovel/CustomStyles@_monitor border": "값 표시기 외곽선", + "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 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@_transparent": "투명색", "TheShovel/CustomStyles@_variable value": "변수 값", "TheShovel/CustomStyles@_variable value background": "변수 값 배경", "TheShovel/CustomStyles@_variable value roundness": "변수 값 둥글기", "TheShovel/CustomStyles@_variable value text": "변수 값 텍스트", "TheShovel/LZ-String@_LZ Compress": "LZ 압축", - "TheShovel/LZ-String@_compress [TEXT] to [TYPE]": "[TEXT]을(를) [TYPE](으)로 압축하기", - "TheShovel/LZ-String@_decompress [TEXT] from [TYPE]": "[TEXT]을(를) [TYPE]에서 압축 해제하기", + "TheShovel/LZ-String@_compress [TEXT] to [TYPE]": "[TEXT]을(를) [TYPE](으)로 압축", + "TheShovel/LZ-String@_decompress [TEXT] from [TYPE]": "[TEXT]을(를) [TYPE]에서 압축 해제", "TheShovel/ShovelUtils@_Link or data URI here": "링크 또는 dataURI 입력", "TheShovel/ShovelUtils@_all sprites": "모든 스프라이트", "TheShovel/ShovelUtils@_brightness of [color]": "[color]의 밝기", @@ -3782,7 +4004,7 @@ "TheShovel/ShovelUtils@_import project from [TEXT]": "프로젝트를 [TEXT]에서 불러오기", "TheShovel/ShovelUtils@_import sound from [TEXT] name [NAME]": "소리 [NAME]을(를) [TEXT]에서 불러오기 ", "TheShovel/ShovelUtils@_import sprite from [TEXT]": "스프라이트를 [TEXT]에서 불러오기", - "TheShovel/ShovelUtils@_list [TEXT] as array": "리스트 [TEXT]을(를) 배열로", + "TheShovel/ShovelUtils@_list [TEXT] as array": "리스트 [TEXT](을)를 배열로", "TheShovel/ShovelUtils@_load extension from [TEXT]": "확장 기능을 [TEXT]에서 불러오기", "TheShovel/ShovelUtils@_set list [NAME] to [TEXT]": "리스트 [NAME]을(를) [TEXT](으)로 정하기", "Xeltalliv/clippingblending@_Clipping & Blending": "클리핑 및 블렌딩", @@ -3794,10 +4016,14 @@ "Xeltalliv/clippingblending@_height": "높이", "Xeltalliv/clippingblending@_invert": "반전", "Xeltalliv/clippingblending@_is additive blending on?": "더하기 블렌딩이 켜져있는가?", + "Xeltalliv/clippingblending@_max x": "최대 x", + "Xeltalliv/clippingblending@_max y": "최대 y", + "Xeltalliv/clippingblending@_min x": "최소 x", + "Xeltalliv/clippingblending@_min y": "최소 y", "Xeltalliv/clippingblending@_multiply": "곱하기", "Xeltalliv/clippingblending@_off": "끄기", "Xeltalliv/clippingblending@_on": "켜기", - "Xeltalliv/clippingblending@_set clipping box x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]": "클리핑 영역을 x1:[X1] y1[Y1] x2:[X2] y2[Y2] (으)로 정하기", + "Xeltalliv/clippingblending@_set clipping box x1:[X1] y1:[Y1] x2:[X2] y2:[Y2]": "클리핑 영역을 x1:[X1] y1:[Y1] x2:[X2] y2:[Y2] (으)로 정하기", "Xeltalliv/clippingblending@_subtract": "빼기", "Xeltalliv/clippingblending@_turn additive blending [STATE]": "더하기 블렌딩 [STATE]", "Xeltalliv/clippingblending@_use [BLENDMODE] blending": "[BLENDMODE] 블렌딩하기", @@ -3809,37 +4035,65 @@ "XmerOriginals/closecontrol@_enabled": "활성화", "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] 삭제하기", "ZXMushroom63/searchApi@_has search parameter [ID]?": "검색 파라미터 [ID]이(가) 존재하는가?", + "ZXMushroom63/searchApi@_index [I] of search parameters [ID]": "검색 파라미터 [ID]의 [I]번째 값", + "ZXMushroom63/searchApi@_length of search parameters": "모든 검색 파라미터 개수", "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@_value": "값", "ZXMushroom63/searchApi@_value of search parameter [ID]": "검색 파라미터 [ID]의 값", + "ar@_enter AR mode": "AR 모드 진입하기", + "ar@_exit AR mode": "AR 모드 나가기", + "ar@_is [FEATURE] available?": "[FEATURE]이(가) 사용가능한가?", + "ar@_is in AR?": "AR 모드인가?", + "ar@_position [POSITION_COMPONENT]": "[POSITION_COMPONENT]좌표", + "ar@_stage height": "무대 높이", + "ar@_stage width": "무대 넓이", "battery@_Battery": "배터리", + "battery@_battery level": "배터리 레벨", "battery@_charging?": "충전중인가?", + "battery@_seconds until charged": "완충까지 걸리는 시간 초", + "battery@_seconds until empty": "방전까지 걸리는 시간 초", + "battery@_when battery level changed": "배터리 레벨이 바뀌었을 때", + "battery@_when charging changed": "충전 여부가 바뀌었을 때", + "battery@_when time until charged changed": "완충까지 걸리는 시간이 바뀌었을 때", + "battery@_when time until empty changed": "방전까지 걸리는 시간이 바뀌었을 때", "bitwise@_Bitwise": "비트 연산", "bitwise@_[CENTRAL] to binary": "[CENTRAL]을(를) 이진수로", "bitwise@_[CENTRAL] to number": "[CENTRAL]을(를) 숫자로", "bitwise@_is [CENTRAL] binary?": "[CENTRAL]이(가) 이진수인가?", "box2d@griffpatch.categoryName": "물리", + "box2d@griffpatch.changeVelocity": "속도를 x:[sx] y:[sy] 만큼 바꾸기", + "box2d@griffpatch.getFriction": "마찰", "box2d@griffpatch.getGravityX": "중력 x", "box2d@griffpatch.getGravityY": "중력 y", + "box2d@griffpatch.getRestitution": "탄성", "box2d@griffpatch.getVelocityX": "속도 x", "box2d@griffpatch.getVelocityY": "속도 y", "box2d@griffpatch.setGravity": "중력을 x:[gx] y:[gy] (으)로 정하기", + "box2d@griffpatch.setVelocity": "속도를 x:[sx] y:[sy] (으)로 정하기", "clipboard@_Clipboard": "클립보드", "clipboard@_clipboard": "클립보드", "clipboard@_copy to clipboard: [TEXT]": "클립보드에 복사하기: [TEXT]", - "clipboard@_last pasted text": "최근 붙여넣은 텍스트", + "clipboard@_last pasted text": "방금 붙여넣은 텍스트", "clipboard@_reset clipboard": "클립보드 비우기", "clipboard@_when something is copied": "복사되었을 때", "clipboard@_when something is pasted": "붙여넣기 되었을 때", "clouddata-ping@_Ping Cloud Data": "핑 클라우드 데이터", + "clouddata-ping@_is cloud data server [SERVER] up?": "클라우드 데이터 서버 [SERVER]이(가) 활성화인가?", + "cloudlink@_[PATH] of [JSON_STRING]": "[JSON_STRING]에서 [PATH]", + "cloudlink@_connected?": "연결되었는가?", + "cloudlink@_my IP address": "내 IP 주소", "cloudlink@_when connected": "연결되었을 때", + "cloudlink@_when disconnected": "연결이 끊어졌을 때", "cs2627883/numericalencoding@_Hello!": "안녕!", "cs2627883/numericalencoding@_Numerical Encoding V1": "숫자 인코딩 V1", - "cs2627883/numericalencoding@_decode [ENCODED] back to text": "[ENCODED]을(를) 텍스트로 디코딩하기", - "cs2627883/numericalencoding@_encode [DATA] to numbers": "[DATA]을(를) 숫자로 인코딩하기", + "cs2627883/numericalencoding@_decode [ENCODED] back to text": "[ENCODED]을(를) 텍스트로 디코딩", + "cs2627883/numericalencoding@_encode [DATA] to numbers": "[DATA]을(를) 숫자로 인코딩", "cs2627883/numericalencoding@_encoded": "인코딩", "cursor@_Mouse Cursor": "마우스 커서", "cursor@_bottom left": "왼쪽 아래", @@ -3851,30 +4105,130 @@ "cursor@_top left": "왼쪽 위", "cursor@_top right": "오른쪽 위", "encoding@_Encoding": "인코딩", + "encoding@_[string] corresponding to the [CodeList] character": "[string]에 대응되는 [CodeList] 문자로", + "encoding@_convert the character [string] to [CodeList]": "문자 [string]을(를) [CodeList](으)로 변환", + "encoding@_decode [string] with [code]": "[string]을(를) [code]에서 디코딩", + "encoding@_encode [string] in [code]": "[string]을(를) [code](으)로 인코딩", + "encoding@_hash [string] with [hash]": "[string]을(를) [hash](으)로 해싱", "encoding@_randomly generated [position] character string": "길이 [position]의 무작위 문자열", + "encoding@_use [wordbank] to generate a random [position] character string": "[wordbank]에서의 길이 [position]의 무작위 문자열", "files@_Accepted formats: {formats}": "허용되는 확장자: {formats}", "files@_Files": "파일", "files@_Hello, world!": "헬로 월드!", "files@_Select or drop file": "선택하거나 끌어다 놓기", "files@_any": "아무거나", + "files@_download URL [url] as [file]": "URL [url]에서 [file](으)로 다운로드하기", "files@_download [text] as [file]": "[text]을(를) [file](으)로 다운로드하기", + "files@_open a [extension] file": "[extension] 파일 열기", + "files@_open a [extension] file as [as]": "[extension] 파일을 [as](으)로 열기", "files@_open a file": "파일 열기", + "files@_open a file as [as]": "파일을 [as](으)로 열기", "files@_text": "텍스트", + "gamejolt@_1 point": "1 포인트", "gamejolt@_Close": "닫기", + "gamejolt@_Data Storage Blocks": "데이터 스토리지 블록", + "gamejolt@_Debug Blocks": "디버깅 블록", + "gamejolt@_Open": "열기", + "gamejolt@_Score Blocks": "점수 블록", + "gamejolt@_Session Blocks": "세션 블록", + "gamejolt@_Time Blocks": "시간 블록", + "gamejolt@_Trophy Blocks": "트로피 블록", + "gamejolt@_[openOrClose] session": "세션 [openOrClose]", + "gamejolt@_achieve trophy of ID [ID]": "트로피 ID [ID] 달성하기", + "gamejolt@_achievement date": "달성 날짜", + "gamejolt@_active": "활동 중", + "gamejolt@_add [username] score [value] in table of ID [ID] with text [text] and comment [extraData]": "테이블 ID [ID]에서 [username]의 점수를 텍스트 [text] 주석 [extraData](으)로 [value]만큼 더하기", + "gamejolt@_add score [value] in table of ID [ID] with text [text] and comment [extraData]": "테이블 ID [ID]에서 점수를 텍스트 [text] 주석 [extraData](으)로 [value]만큼 더하기", + "gamejolt@_adding": "더하기", + "gamejolt@_all": "모든", + "gamejolt@_all achieved": "달성한", + "gamejolt@_all unachieved": "미달성한", + "gamejolt@_auto login available?": "자동 로그인 가능한가?", + "gamejolt@_better": "높은", "gamejolt@_comment": "주석", + "gamejolt@_data": "값", "gamejolt@_day": "일", + "gamejolt@_difficulty": "난이도", + "gamejolt@_dividing by": "나누기", + "gamejolt@_fetch [amount] [globalOrPerUser] score/s [betterOrWorse] than [value] in table of ID [ID]": "테이블 ID [ID]에서 [value]보다 [betterOrWorse] [globalOrPerUser] 점수 [amount]개 불러오기", + "gamejolt@_fetch [amount] [globalOrPerUser] score/s in table of ID [ID]": "테이블 ID [ID]에서 [globalOrPerUser] 점수 [amount]개 불러오기", + "gamejolt@_fetch [amount] [username] score/s [betterOrWorse] than [value] in table of ID [ID]": "테이블 ID [ID]에서 [value]보다 [betterOrWorse] [username]의 점수 [amount]개 불러오기", + "gamejolt@_fetch [amount] [username] score/s in table of ID [ID]": "테이블 ID [ID]에서 [username]의 점수 [amount]개 불러오기", + "gamejolt@_fetch [globalOrPerUser] keys matching with [pattern]": "[pattern]에 맞는 [globalOrPerUser] 키 목록 불러오기", + "gamejolt@_fetch [trophyFetchGroup] trophies": "[trophyFetchGroup] 트로피 불러오기", + "gamejolt@_fetch all [globalOrPerUser] keys": "모든 [globalOrPerUser] 키 목록 불러오기", + "gamejolt@_fetch logged in user": "로그인된 사용자 불러오기", + "gamejolt@_fetch score tables": "점수 테이블 불러오기", + "gamejolt@_fetch server's time": "서버 시간 불러오기", + "gamejolt@_fetch trophy of ID[ID]": "트로피 ID [ID] 불러오기", + "gamejolt@_fetch user's [usernameOrID] by [fetchType]": "[fetchType]이(가) [usernameOrID]인 사용자 불러오기", + "gamejolt@_fetch user's friend IDs": "사용자의 친구 ID 목록 불러오기", + "gamejolt@_fetched [globalOrPerUser] data at [key]": "불러온 [globalOrPerUser] 데이터 [key]", + "gamejolt@_fetched key at index [index]": "불러온 키 [index]번째", + "gamejolt@_fetched keys in JSON": "불러온 키 목록 JSON", + "gamejolt@_fetched rank of [value] in table of ID [ID]": "불러온 테이블 ID [ID]에서 [value]의 순위", + "gamejolt@_fetched score [scoreDataType] at index [index]": "불러온 점수 [index]번째의 [scoreDataType]", + "gamejolt@_fetched score data in JSON": "불러온 점수 데이터 JSON", + "gamejolt@_fetched server's [timeType]": "불러온 서버의 [timeType]", + "gamejolt@_fetched server's time in JSON": "불러온 서버 시간 JSON", + "gamejolt@_fetched table [tableDataType] at index [index]": "불러온 테이블 [index]번째의 [tableDataType]", + "gamejolt@_fetched table [tableDataType] at index[index] (Deprecated)": "불러온 테이블 [index]번째의 [tableDataType] (사용되지 않음)", + "gamejolt@_fetched tables in JSON": "불러온 테이블 목록 JSON", + "gamejolt@_fetched trophies in JSON": "불러온 트로피 목록 JSON", + "gamejolt@_fetched trophy [trophyDataType] at index [index]": "불러온 [trophyDataType] 트로피 [index]번째", + "gamejolt@_fetched user's [userDataType]": "불러온 사용자의 [userDataType]", + "gamejolt@_fetched user's data in JSON": "불러온 사용자 데이터 JSON", + "gamejolt@_fetched user's friend ID at index[index]": "불러온 사용자의 친구 ID [index]번째", + "gamejolt@_fetched user's friend IDs in JSON": "불러온 사용자의 친구 ID 목록 JSON", + "gamejolt@_guest": "게스트", "gamejolt@_hour": "시", + "gamejolt@_idle": "자리 비움", + "gamejolt@_image URL": "이미지 URL", + "gamejolt@_in debug mode?": "디버그 모드인가?", + "gamejolt@_index": "번째", + "gamejolt@_key": "키", + "gamejolt@_last API error": "방금의 API 오류", + "gamejolt@_last login": "마지막 로그인", + "gamejolt@_last login timestamp": "마지막 로그인 타임스탬프", + "gamejolt@_logged in user's username": "로그인된 사용자의 이름", + "gamejolt@_logged in?": "로그인되었는가?", + "gamejolt@_login automatically": "자동 로그인하기", + "gamejolt@_login with [username] and [token]": "[username] 및 [token](으)로 로그인하기 ", + "gamejolt@_logout": "로그아웃하기", "gamejolt@_minute": "분", "gamejolt@_month": "월", + "gamejolt@_multiplying by": "곱하기", "gamejolt@_name": "이름", "gamejolt@_off": "끄기", "gamejolt@_on": "켜기", + "gamejolt@_optional": "(선택사항)", + "gamejolt@_ping session": "세션에 핑 보내기", + "gamejolt@_private key": "프라이빗 키", + "gamejolt@_private token": "프라이빗 토큰", + "gamejolt@_remove [globalOrPerUser] data at [key]": "[globalOrPerUser] 데이터 [key] 제거하기", + "gamejolt@_remove trophy of ID [ID]": "트로피 ID [ID] 제거하기", + "gamejolt@_score date": "점수 날짜", + "gamejolt@_score timestamp": "점수 타임스탬프", "gamejolt@_second": "초", + "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@_sign up date": "회원가입 날짜", + "gamejolt@_sign up timestamp": "회원가입 타임스탬프", + "gamejolt@_status": "상태", + "gamejolt@_subtracting": "빼기", "gamejolt@_text": "텍스트", "gamejolt@_timestamp": "타임스탬프", "gamejolt@_timezone": "타임존", + "gamejolt@_title": "제목", + "gamejolt@_turn debug mode [toggle]": "디버그 모드 [toggle]", + "gamejolt@_update [globalOrPerUser] data at [key] by [operationType] [value]": "[globalOrPerUser] 데이터 [key]을(를) [value]만큼 [operationType]", + "gamejolt@_user Blocks": "사용자 블록", + "gamejolt@_user ID": "사용자 ID", "gamejolt@_username": "사용자 이름", "gamejolt@_value": "값", + "gamejolt@_worse": "낮은", "gamejolt@_year": "년", "gamepad@_D-pad down (14)": "십자키 아래 (14)", "gamepad@_D-pad left (15)": "십자키 왼쪽 (15)", @@ -3912,6 +4266,7 @@ "godslayerakp/http@_set headers to json [json]": "헤더를 [json] json으로 정하기", "godslayerakp/http@_set request method to [method]": "요청 메소드를 [method](으)로 정하기", "godslayerakp/http@_site responded?": "사이트가 응답했는가?", + "godslayerakp/http@_status": "상태", "godslayerakp/http@_status text": "상태 메시지", "godslayerakp/http@_when a request fails": "요청이 실패했을 때", "godslayerakp/http@_when a site responds": "사이트가 응답했을 때", @@ -3924,6 +4279,7 @@ "iframe@_close iframe": "iframe 닫기", "iframe@_height": "높이", "iframe@_hide iframe": "iframe 숨기기", + "iframe@_scale": "크기", "iframe@_set iframe height to [HEIGHT]": "iframe 높이를 [HEIGHT](으)로 정하기", "iframe@_set iframe width to [WIDTH]": "iframe 넓이를 [WIDTH](으)로 정하기", "iframe@_set iframe x position to [X]": "iframe x좌표를 [X](으)로 정하기", @@ -3931,26 +4287,45 @@ "iframe@_show HTML [HTML]": "HTML [HTML] 보이기", "iframe@_show iframe": "iframe 보이기", "iframe@_show website [URL]": "웹사이트 [URL] 보이기", - "iframe@_url": "uri", "iframe@_width": "넓이", "itchio@_name": "이름", + "itchio@_title": "제목", "lab/text@_Hello!": "안녕!", "lab/text@_center": "가운데", "lab/text@_left": "왼쪽", "lab/text@_right": "오른쪽", "local-storage@_Local Storage": "로컬 스토리지", - "mbw/xml@_remove attribute [ATTR] of [XML]": "[XML]의 특성 [ATTR]을(를) 삭제하기", - "mbw/xml@_remove child #[NO] of [XML]": "[XML]의 [NO]번째 자식 삭제하기", + "local-storage@_score": "점수", + "mbw/xml@_add child [CHILD] to [XML]": "[XML]에 자식 [CHILD] 추가하기", + "mbw/xml@_attribute [ATTR] of [XML]": "[XML]의 [ATTR]속성", + "mbw/xml@_attributes of [XML]": "[XML] 속성", + "mbw/xml@_child #[NO] of [XML]": "[XML]의 자식 [NO]번째", + "mbw/xml@_children amount of [XML]": "[XML]의 자식 개수", + "mbw/xml@_does [XML] have attribute [ATTR]?": "[XML]이(가) [ATTR]속성이 있는가?", + "mbw/xml@_does [XML] have children?": "[XML]이(가) 자식이 있는가? ", + "mbw/xml@_is [MAYBE_XML] valid XML?": "[MAYBE_XML]이(가) 유효한 XML인가?", + "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@_tag name of [XML]": "[XML] 태그 이름", + "mbw/xml@_text of [XML]": "[XML] 텍스트", "mdwalters/notifications@_Hello, world!": "헬로 월드!", + "mdwalters/notifications@_Notification from project": "프로젝트의 알림", "mdwalters/notifications@_Notifications": "알림", "mdwalters/notifications@_close notification": "알림 닫기", + "mdwalters/notifications@_create notification with text [text]": "텍스트로 알림 생성하기 [text]", + "mdwalters/notifications@_has notification permission?": "알림 권한이 있는가?", "mdwalters/notifications@_request notification permission": "알림 권한 요청하기", + "navigator@_Navigator Info": "네비게이터 정보", "navigator@_browser": "브라우저", "navigator@_operating system": "운영 체제", "numerical-encoding-2@_Numerical Encoding V2": "숫자 인코딩 V2", - "numerical-encoding-2@_decode [TEXT] as text": "[TEXT]을(를) 텍스트로 디코딩하기", - "numerical-encoding-2@_encode [TEXT] as numbers": "[TEXT]을(를) 숫자로 인코딩하기", + "numerical-encoding-2@_decode [TEXT] as text": "[TEXT]을(를) 텍스트로 디코딩", + "numerical-encoding-2@_encode [TEXT] as numbers": "[TEXT]을(를) 숫자로 인코딩", "obviousAlexC/SensingPlus@_# of fingers down": "입력된 손가락 개수", + "obviousAlexC/SensingPlus@_No sprites exist": "(스프라이트 없음)", + "obviousAlexC/SensingPlus@_Sensing+": "감치 플러스", "obviousAlexC/SensingPlus@_Touch blocks are broken in Safari.": "터지 블록은 Safari 브라우저에서 작동하지 않습니다.", "obviousAlexC/SensingPlus@_brightness": "밝기", "obviousAlexC/SensingPlus@_color": "색깔", @@ -3960,47 +4335,112 @@ "obviousAlexC/SensingPlus@_off": "끄기", "obviousAlexC/SensingPlus@_on": "켜기", "obviousAlexC/SensingPlus@_pixelate": "픽셀화", + "obviousAlexC/SensingPlus@_rotation style": "회전 방식", "obviousAlexC/SensingPlus@_supports touches?": "터치를 지원하는가?", "obviousAlexC/SensingPlus@_whirl": "소용돌이", + "obviousAlexC/newgroundsIO@_MedalID": "메달ID", + "obviousAlexC/newgroundsIO@_change game version to [version]": "게임 버전을 [version](으)로 바꾸기", + "obviousAlexC/newgroundsIO@_currently logged in?": "로그인 되어있는가?", + "obviousAlexC/newgroundsIO@_game version": "게임 버전", + "obviousAlexC/newgroundsIO@_gameID": "게임ID", + "obviousAlexC/newgroundsIO@_is medal [medalID] unlocked?": "메달 [medalID](이)가 잠금 해제되었는가?", + "obviousAlexC/newgroundsIO@_score": "점수", + "obviousAlexC/newgroundsIO@_unlock medal [medalID]": "메달 [medalID] 잠금 해제하기", + "obviousAlexC/newgroundsIO@_user [datType]": "사용자 [datType]", "obviousAlexC/newgroundsIO@_username": "사용자 이름", + "obviousAlexC/newgroundsIO@_when login required": "로그인이 필요할 때", + "obviousAlexC/newgroundsIO@_when login success": "로그인에 성공했을 때", "obviousAlexC/penPlus@_Advanced": "고급 설정", + "obviousAlexC/penPlus@_Custom Shaders": "사용자 정의 셰이더", + "obviousAlexC/penPlus@_Extras": "그 외", + "obviousAlexC/penPlus@_Height": "높이", "obviousAlexC/penPlus@_Images": "이미지", "obviousAlexC/penPlus@_Pen Properties": "펜 속성", + "obviousAlexC/penPlus@_Pen+ V7": "펜 플러스 V7", + "obviousAlexC/penPlus@_Pen+ version": "펜 플러스 버전", + "obviousAlexC/penPlus@_Shader Editor": "셰이더 편집기", "obviousAlexC/penPlus@_Square Pen Blocks": "사각형 블록", "obviousAlexC/penPlus@_Triangle Blocks": "삼각형 블록", + "obviousAlexC/penPlus@_Width": "넓이", "obviousAlexC/penPlus@_brightness": "밝기", + "obviousAlexC/penPlus@_clock-wise": "시계 방향", "obviousAlexC/penPlus@_color": "색깔", + "obviousAlexC/penPlus@_counter clock-wise": "시계 반대 방향", "obviousAlexC/penPlus@_draw dot at [x] [y]": "점 [x] [y] 그리기", "obviousAlexC/penPlus@_draw line from [x1] [y1] to [x2] [y2]": "직선 [x1] [y1] 부터 [x2] [y2] 까지 그리기", "obviousAlexC/penPlus@_draw textured triangle between [x1] [y1], [x2] [y2] and [x3] [y3] with the texture [tex]": "텍스쳐 삼각형 그리기 [x1] [y1], [x2] [y2], [x3] [y3] 텍스쳐 [tex]", "obviousAlexC/penPlus@_draw triangle between [x1] [y1], [x2] [y2] and [x3] [y3]": "삼각형 그리기 [x1] [y1], [x2] [y2], [x3] [y3]", "obviousAlexC/penPlus@_get data uri for costume [costume]": "모양 [costume]의 dataURI", "obviousAlexC/penPlus@_get pixel [x] [y]'s color in [costume]": "모양 [costume]의 [x] [y] 픽셀의 색상 ", + "obviousAlexC/penPlus@_get value of [component] in vector 2 [uniformName] in [shader]": "[shader]의 Vector2 [uniformName]의 [component]값", + "obviousAlexC/penPlus@_get value of [component] in vector 3 [uniformName] in [shader]": "[shader]의 Vector3 [uniformName]의 [component]값", + "obviousAlexC/penPlus@_get value of [component] in vector 4 [uniformName] in [shader]": "[shader]의 Vector4 [uniformName]의 [component]값", + "obviousAlexC/penPlus@_get value of matrix [uniformName] in [shader] as an array": "[shader]의 행렬 [uniformName]의 배열로서 값", "obviousAlexC/penPlus@_height": "높이", + "obviousAlexC/penPlus@_hex code": "Hex코드", "obviousAlexC/penPlus@_hue [H] saturation [S] value [V]": "Hue[H] Saturation[S] Value[V]", "obviousAlexC/penPlus@_off": "끄기", "obviousAlexC/penPlus@_on": "켜기", "obviousAlexC/penPlus@_pen is down?": "펜을 내렸는가?", "obviousAlexC/penPlus@_red [R] green [G] blue [B]": "Red[R] Green[G] Blue[B]", + "obviousAlexC/penPlus@_saturation": "채도", + "obviousAlexC/penPlus@_set matrix [uniformName] in [shader] to [array]": "[shader]의 행렬 [uniformName]을(를) [array](으)로 정하기", + "obviousAlexC/penPlus@_set matrix [uniformName] in [shader] to [list]": "[shader]의 행렬 [uniformName]을(를) [list](으)로 정하기", "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 vector 2 [uniformName] in [shader] to [numberX] [numberY]": "[shader]의 Vector2 [uniformName]을(를) [numberX] [numberY] (으)로 정하기", + "obviousAlexC/penPlus@_set vector 3 [uniformName] in [shader] to [numberX] [numberY] [numberZ]": "[shader]의 Vector3 [uniformName]을(를) [numberX] [numberY] [numberZ] (으)로 정하기", + "obviousAlexC/penPlus@_set vector 4 [uniformName] in [shader] to [numberX] [numberY] [numberZ] [numberW]": "[shader]의 Vector4 [uniformName]을(를) [numberX] [numberY] [numberZ] [numberW] (으)로 정하기", "obviousAlexC/penPlus@_size": "크기", "obviousAlexC/penPlus@_stamp [sprite]": "[sprite] 도장찍기", "obviousAlexC/penPlus@_stamp pen square": "펜 사각형 도장찍기", + "obviousAlexC/penPlus@_transparency": "투명", "obviousAlexC/penPlus@_width": "넓이", "pointerlock@_Pointerlock": "포인터 잠금", "pointerlock@_disabled": "비활성화", "pointerlock@_enabled": "활성화", "pointerlock@_pointer locked?": "포인터가 잠겼는가?", "pointerlock@_set pointer lock [enabled]": "포인터 잠금을 [enabled]하기", + "qxsck/data-analysis@average": "평균 [NUMBERS]", + "qxsck/data-analysis@maximum": "최대값 [NUMBERS]", + "qxsck/data-analysis@median": "중앙값 [NUMBERS]", + "qxsck/data-analysis@minimum": "최소값 [NUMBERS]", + "qxsck/data-analysis@mode": "최빈값 [NUMBERS]", "qxsck/data-analysis@name": "데이터 분석", + "qxsck/data-analysis@sum": "종합 [NUMBERS]", + "qxsck/data-analysis@variance": "분산 [NUMBERS]", + "qxsck/var-and-list@addValueInList": "[LIST]에 [VALUE] 추가하기 ", "qxsck/var-and-list@clearList": "[LIST]의 모든 항목 삭제하기", - "qxsck/var-and-list@deleteOfList": "[LIST]의 [INDEX]번째 항목 삭제하기 ", + "qxsck/var-and-list@deleteOfList": "[LIST]의 [INDEX]번째 삭제하기 ", + "qxsck/var-and-list@getIndexOfList": "[LIST]에서 [VALUE]의 처음 번째", + "qxsck/var-and-list@getIndexesOfList": "[LIST]에서 [VALUE]의 번째 목록", + "qxsck/var-and-list@getList": "[LIST] 값", + "qxsck/var-and-list@getValueOfList": "[LIST]의 [INDEX]번째", + "qxsck/var-and-list@getVar": "[VAR] 값", + "qxsck/var-and-list@listContains": "[LIST]이(가) [VALUE]을(를) 포함하는가?", "qxsck/var-and-list@name": "변수 및 리스트", + "qxsck/var-and-list@replaceOfList": "[LIST]의 [INDEX]번째를 [VALUE](으)로 정하기", + "qxsck/var-and-list@setVar": "[VAR]을(를) [VALUE](으)로 정하기", + "rixxyx@_RixxyX is cool, right?": "RixxyX 참 좋죠?", + "rixxyx@_[TEXT] to lowercase": "소문자 [TEXT]", + "rixxyx@_[TEXT] to uppercase": "대문자 [TEXT]", + "rixxyx@_[TEXT_1] is the same type as [TEXT_2]?": "[TEXT_1]이(가) [TEXT_2]와(과) 같은 타입인가?", + "rixxyx@_color [COLOR] in hex": "색상 [COLOR]의 Hex코드", + "rixxyx@_counter": "카운터", "rixxyx@_false": "거짓", + "rixxyx@_if [BOOL] then [TEXT]": "만약 [BOOL](이)라면 [TEXT]", + "rixxyx@_if [BOOL] then [TEXT_1] else [TEXT_2]": "만약 [BOOL](이)라면 [TEXT_1] 아니면 [TEXT_2] ", + "rixxyx@_is javascript NaN [OBJ]": "[OBJ]이(가) javascript NaN 인가?", + "rixxyx@_repeat text [TEXT] [NUM] times": "텍스트 [TEXT](을)를 [NUM]번 반복", + "rixxyx@_reverse text [TEXT]": "역방향 텍스트 [TEXT]", + "rixxyx@_rixxyX is cool, right?": "RixxyX 참 좋죠?", + "rixxyx@_set counter to [NUM]": "카운터를 [NUM](으)로 정하기", "rixxyx@_true": "참", + "runtime-options@_Infinity": "무제한", "runtime-options@_Runtime Options": "실행 설정", "runtime-options@_[thing] enabled?": "[thing]이(가) 활성화 되었는가?", "runtime-options@_clone limit": "복제본 개수 제한", + "runtime-options@_default ({n})": "기본 ({n})", "runtime-options@_disabled": "비활성화", "runtime-options@_enabled": "활성화", "runtime-options@_framerate": "프레임률", @@ -4009,19 +4449,35 @@ "runtime-options@_high quality pen": "고품질 펜", "runtime-options@_interpolation": "보간법", "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](으)로 정하기", "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": "터보 모드", "runtime-options@_username": "사용자 이름", "runtime-options@_when [WHAT] changed": "[WHAT]이(가) 변경되었을 때", "runtime-options@_width": "넓이", + "shreder95ua/resolution@_Screen resolution": "화면 해상도", "shreder95ua/resolution@_primary screen height": "주 화면 높이", "shreder95ua/resolution@_primary screen width": "주 화면 넓이", "sound@_Sound": "소리", + "sound@_play sound from url: [path] until done": "URL에서 소리 끝까지 재생하기: [path]", + "sound@_start sound from url: [path]": "URL에서 소리 재생하기: [path]", + "steamworks@_IP country": "IP 국가", + "steamworks@_[TYPE] [ID] installed?": "[TYPE] [ID](이)가 설치되었는가?", + "steamworks@_achievement [ACHIEVEMENT] unlocked?": "업적 [ACHIEVEMENT]이(가) 달성되었는가? ", + "steamworks@_false": "거짓", + "steamworks@_get user [THING]": "사용자 [THING] 얻기 ", + "steamworks@_level": "레벨", + "steamworks@_name": "이름", + "steamworks@_set achievement [ACHIEVEMENT] unlocked to [STATUS]": "업적 [ACHIEVEMENT] 달성을 [STATUS](으)로 정하기", + "steamworks@_steam ID": "스팀 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]만큼 바꾸기", @@ -4036,18 +4492,23 @@ "text@_Text": "텍스트", "text@_Title Case": "제목 표기법 (Abc Abc)", "text@_UPPERCASE": "대문자 표기법 (ABC)", + "text@_[STRING] matches regex /[REGEX]/[FLAGS]?": "[STRING]이(가) 정규표현식 /[REGEX]/[FLAGS] 에 일치하는가?", "text@_convert [STRING] to [TEXTCASE]": "[STRING]을(를) [TEXTCASE](으)로 변환하기", "text@_count [SUBSTRING] in [STRING]": "[STRING]에서 [SUBSTRING]의 개수", + "text@_count regex /[REGEX]/[FLAGS] in [STRING]": "[STRING]에서 정규표현식 /[REGEX]/[FLAGS] 의 결과 개수", "text@_index of [SUBSTRING] in [STRING]": "[STRING]에서 [SUBSTRING]의 번째", + "text@_is [OPERAND1] identical to [OPERAND2]?": "[OPERAND1]이(가) [OPERAND2]와(과) 정확히 같지 않은가?", "text@_is [STRING] [TEXTCASE]?": "[STRING]이(가) [TEXTCASE]인가?", "text@_letters [LETTER1] to [LETTER2] of [STRING]": "[STRING]의 [START]부터 [END]까지의 글자", "text@_lowercase": "소문자 표기법 (abc)", "text@_repeat [STRING] [REPEAT] times": "[STRING] 문자열 [REPEAT]번 반복", "text@_replace [SUBSTRING] in [STRING] with [REPLACE]": "[STRING]의 [SUBSTRING]을(를) [REPLACE](으)로 바꾸기", - "text@_unicode [NUM] as letter": "글자 [NUM]의 유니코드", - "text@_unicode of [STRING]": "문자열 [STRING]의 유니코드", + "text@_replace regex /[REGEX]/[FLAGS] in [STRING] with [REPLACE]": "정규표현식 /[REGEX]/[FLAGS] (으)로 [STRING]을(를) [REPLACE](으)로 바꾸기", + "text@_unicode [NUM] as letter": "유니코드 문자 [NUM]", + "text@_unicode of [STRING]": "[STRING]의 유니코드", "true-fantom/base@_Base": "진법", "true-fantom/base@_[A] from base [B] to base [C]": "[A]을(를) [B]진법에서 [C]진법으로", + "true-fantom/base@_is base [B] [A]?": "[A](이)가 [B]진법인가?", "true-fantom/couplers@_Couplers": "커플러", "true-fantom/couplers@_angle [ANGLE]": "방향 [ANGLE]", "true-fantom/couplers@_color [COLOUR]": "색 [COLOUR]", @@ -4062,15 +4523,33 @@ "true-fantom/math@_is number [A]?": "[A](이)가 숫자인가?", "true-fantom/math@_is safe number [A]?": "[A]이(가) 안전한 숫자인가?", "true-fantom/math@_log of [A] with base [B]": "밑이 [B]인 log [A]", + "true-fantom/network@_(1) text": "(1) 텍스트", + "true-fantom/network@_(3) status ok?": "(3) 상태가 ok인지 여부", + "true-fantom/network@_(7) redirected?": "(7) 리다이렉트인지 여부", "true-fantom/network@_Network": "네트워크", "true-fantom/network@_browser": "브라우저", "true-fantom/network@_connected to internet?": "인터넷에 연결되었는가?", "true-fantom/network@_current url": "현재 URL", "true-fantom/network@_default": "기본", "true-fantom/regexp@_RegExp": "정규표현식", + "true-fantom/regexp@_[A] matches with [IMAGE] [B] ?": "[IMAGE] [B]에 [A]이(가) 일치하는가?", + "true-fantom/regexp@_[B] of [IMAGE] [A]": "[IMAGE] [A]의 [B]", + "true-fantom/regexp@_[IMAGE] [A] contains flags [B] ?": "[IMAGE] [A]이(가) 플래그 [B]을(를) 포함하는가?", + "true-fantom/regexp@_[IMAGE] add flags [B] to [IMAGE] [A]": "[IMAGE] [A]에 플래그 [B] 추가하기", + "true-fantom/regexp@_[IMAGE] delete flags [B] of [IMAGE] [A]": "[IMAGE] [A]의 플래그 [B] 삭제하기", + "true-fantom/regexp@_[IMAGE] set [B] of [IMAGE] [A] to [C]": "[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]이(가) 정규표현식 인가?", "true-fantom/regexp@_keys": "키", + "true-fantom/regexp@_map": "맵", + "true-fantom/regexp@_pairs": "쌍", + "true-fantom/regexp@_pattern": "패턴", + "true-fantom/regexp@_replace matches of [A] with [IMAGE] [B] to [C]": "[IMAGE] [B](으)로 [A]에 일치하는 요소를 [C](으)로 바꾸기", "true-fantom/regexp@_values": "값", "utilities@_Utilities": "유틸리티", + "utilities@_[PATH] of [JSON_STRING]": "[JSON_STRING]에서 [PATH]", + "utilities@_content from [URL]": "[URL]의 내용", "utilities@_current millisecond": "현재 밀리초", "utilities@_false": "거짓", "utilities@_if [A] then [B] else [C]": "[A] (이)라면 [B] 아니면 [C]", @@ -4808,6 +5287,8 @@ "sound@_Sound": "Lyd", "sound@_play sound from url: [path] until done": "spill lyd fra nettadresse: [path] til ferdig", "sound@_start sound from url: [path]": "start lyd fra url: [path]", + "steamworks@_name": "navn", + "steamworks@_true": "sann", "stretch@_Stretch": "Strekke", "stretch@_change stretch by x: [DX] y: [DY]": "endre strekk med x: [DX] y: [DY]", "stretch@_change stretch x by [DX]": "endre strekk x med [DX]", @@ -6028,6 +6509,9 @@ "sound@_Sound": "Geluid", "sound@_play sound from url: [path] until done": "start geluid van URL: [path] en wacht", "sound@_start sound from url: [path]": "start geluid van URL: [path]", + "steamworks@_false": "onwaar", + "steamworks@_name": "naam", + "steamworks@_true": "waar", "stretch@_Stretch": "Rekken", "stretch@_change stretch by x: [DX] y: [DY]": "verander uitrekking met x: [DX] y: [DY]", "stretch@_change stretch x by [DX]": "verander x-uitrekking met [DX]", @@ -6262,6 +6746,8 @@ "runtime-options@_username": "nazwa użytkownika", "runtime-options@_width": "szerokość", "sound@_Sound": "Dźwięk", + "steamworks@_false": "fałsz", + "steamworks@_name": "nazwa", "true-fantom/couplers@_color [COLOUR]": "kolor [COLOUR]", "true-fantom/couplers@_false": "fałsz", "true-fantom/network@_browser": "przeglądarka", @@ -6421,8 +6907,8 @@ "CST1229/zip@_path [PATH] from [ORIGIN]": "путь [PATH] из [ORIGIN]", "CST1229/zip@_remove all archives": "удалить все архивы", "CST1229/zip@_remove current archive": "удалить текущий архив", - "CST1229/zip@_set [META] of [FILE] to [VALUE]": "установить [META] файла [FILE] в [VALUE]", - "CST1229/zip@_set archive comment to [COMMENT]": "установить комментарий к архиву со словами [COMMENT]", + "CST1229/zip@_set [META] of [FILE] to [VALUE]": "задать [META] файла [FILE] в [VALUE]", + "CST1229/zip@_set archive comment to [COMMENT]": "задать комментарий к архиву со словами [COMMENT]", "CST1229/zip@_string": "строка", "CST1229/zip@_switch to archive named [NAME]": "сменить архиве на [NAME]", "CST1229/zip@_text": "текст", @@ -6490,11 +6976,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": "верхнем правом углу", @@ -6522,12 +7008,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@_turn camera [image] [val] degrees": "повернуть камеру [image] на [val] градусов", "JeremyGamer13/tween@_Tweening": "Плавность", "JeremyGamer13/tween@_[MODE] ease [DIRECTION] [START] to [END] by [AMOUNT]%": "[MODE] в [DIRECTION] [START] до [END] на [AMOUNT]%", @@ -6589,31 +7075,31 @@ "Lily/Cast@_string": "строка", "Lily/Cast@_type of [INPUT]": "тип переменной [INPUT]", "Lily/ClonesPlus@_Clones+": "Клоны+", - "Lily/ClonesPlus@_[INPUTA] of clone with [INPUTB] set to [INPUTC]": "[INPUTA] клона с переменной [INPUTB] установленной в [INPUTC]", + "Lily/ClonesPlus@_[INPUTA] of clone with [INPUTB] set to [INPUTC]": "[INPUTA] клона с [INPUTB] значением [INPUTC]", "Lily/ClonesPlus@_[INPUT] of main sprite": "[INPUT] основного спрайта", "Lily/ClonesPlus@_clone count": "количество клонов", "Lily/ClonesPlus@_clone count of [INPUT]": "количество клонов [INPUT]", - "Lily/ClonesPlus@_clone with [INPUTA] set to [INPUTB] exists?": "клон с переменной [INPUTA] установленной в [INPUTB] существует?", + "Lily/ClonesPlus@_clone with [INPUTA] set to [INPUTB] exists?": "клон с [INPUTA] значением [INPUTB] существует?", "Lily/ClonesPlus@_costume #": "костюм #", "Lily/ClonesPlus@_costume name": "имя костюма", - "Lily/ClonesPlus@_create clone with [INPUTA] set to [INPUTB]": "создать клон с [INPUTA] установленной в [INPUTB]", + "Lily/ClonesPlus@_create clone 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@_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]": "установить переменную [INPUTA] в [INPUTB] для клонов переменной [INPUTC] установленной в [INPUTD]", - "Lily/ClonesPlus@_set variable [INPUTA] to [INPUTB] for main sprite": "установить переменную [INPUTA] с [INPUTB] для основного спрайта", + "Lily/ClonesPlus@_set variable [INPUTA] to [INPUTB] for clones with [INPUTC] set to [INPUTD]": "задать [INPUTA] значение [INPUTB] для клонов [INPUTC] значением [INPUTD]", + "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]", + "Lily/ClonesPlus@_stop scripts in clones with [INPUTA] set to [INPUTB]": "остановить скрипты в клонах с [INPUTA] значением [INPUTB]", "Lily/ClonesPlus@_stop scripts in main sprite": "остановить скрипты в основном спрайте", - "Lily/ClonesPlus@_touching clone with [INPUTA] set to [INPUTB]?": "касается клона с [INPUTA] установленной в [INPUTB]?", + "Lily/ClonesPlus@_touching clone with [INPUTA] set to [INPUTB]?": "касается клона с [INPUTA] заданной в [INPUTB]?", "Lily/ClonesPlus@_touching main sprite?": "касается основного спрайта?", - "Lily/ClonesPlus@_variable [INPUTA] of clone with [INPUTB] set to [INPUTC]": "переменная [INPUTA] клона с переменной [INPUTB] установленной в [INPUTC]", + "Lily/ClonesPlus@_variable [INPUTA] of clone with [INPUTB] set to [INPUTC]": "переменная [INPUTA] клона с [INPUTB] значением [INPUTC]", "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": "Блоки Комментариев", @@ -6641,9 +7127,9 @@ "Lily/ListTools@_repeat [LIST1] [NUM] times in [LIST2]": "повторить [LIST1] [NUM] раз в [LIST2]", "Lily/ListTools@_replace all [ITEM1] with [ITEM2] in [LIST]": "заменить всё [ITEM1] на [ITEM2] списка [LIST]", "Lily/ListTools@_reversed": "перевёрнутый", - "Lily/ListTools@_set [LIST] to array [ARRAY]": "установить список [LIST] в [ARRAY]", + "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 order of [LIST] to [ORDER]": "задать сортировку списка [LIST] на [ORDER]", "Lily/LooksPlus@_# of costumes in [TARGET]": "количество костюмов [TARGET]", "Lily/LooksPlus@_Looks+": "Вид+", "Lily/LooksPlus@_[ATTRIBUTE] of [COSTUME]": "[ATTRIBUTE] костюма [COSTUME]", @@ -6668,7 +7154,7 @@ "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 layer # of [TARGET] to [LAYER]": "задать слой [TARGET] на [LAYER]", "Lily/LooksPlus@_show [TARGET]": "показать [TARGET]", "Lily/LooksPlus@_snapshot stage": "в разработке", "Lily/LooksPlus@_whirl": "завихрение", @@ -6708,7 +7194,7 @@ "Lily/MoreTimers@_remove all timers": "удалить все таймеры", "Lily/MoreTimers@_remove timer [TIMER]": "удалить таймер [TIMER]", "Lily/MoreTimers@_resume timer [TIMER]": "продолжить таймер [TIMER]", - "Lily/MoreTimers@_set timer [TIMER] to [NUM]": "установить таймер [TIMER] на значение [NUM]", + "Lily/MoreTimers@_set timer [TIMER] to [NUM]": "задать таймер [TIMER] на [NUM]", "Lily/MoreTimers@_start/reset timer [TIMER]": "запустить/сбросить таймер [TIMER]", "Lily/MoreTimers@_timer [TIMER]": "таймер [TIMER]", "Lily/MoreTimers@_timer [TIMER] exists?": "таймер [TIMER] существует?", @@ -6724,7 +7210,7 @@ "Lily/Skins@_load skin from [COSTUME] as [NAME]": "загрузить скин из [COSTUME] как [NAME]", "Lily/Skins@_restore skin of [TARGET]": "восстановить скин [TARGET]", "Lily/Skins@_restore targets with skin [NAME]": "восстановить цели со скином [NAME]", - "Lily/Skins@_set skin of [TARGET] to [NAME]": "установить скин [TARGET] на [NAME]", + "Lily/Skins@_set skin of [TARGET] to [NAME]": "задать скин [TARGET] на [NAME]", "Lily/Skins@_skin [NAME] is loaded?": "скин [NAME] загружен?", "Lily/Skins@_width": "ширина", "Lily/SoundExpanded@_Sound Expanded": "Расширенный Звук", @@ -6744,7 +7230,7 @@ "Lily/SoundExpanded@_project volume": "звук проекта", "Lily/SoundExpanded@_resume all sounds": "продолжить все звуки", "Lily/SoundExpanded@_sample rate": "частота дискретизации", - "Lily/SoundExpanded@_set project volume to [VALUE]%": "установить звук проекта на [VALUE]%", + "Lily/SoundExpanded@_set project volume to [VALUE]%": "задать звук проекта на [VALUE]%", "Lily/SoundExpanded@_sound [SOUND] is playing?": "звук [SOUND] играет?", "Lily/SoundExpanded@_start looping [SOUND]": "начать повторять [SOUND]", "Lily/SoundExpanded@_start looping [SOUND] loop region [START] to [END] seconds": "начать повторять [SOUND] регион повторения [START] к [END] секундам", @@ -6764,8 +7250,8 @@ "Lily/TempVariables2@_for [VAR] in [NUM]": "повторить [VAR] раз [NUM]", "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": "Видео", @@ -6781,7 +7267,7 @@ "Lily/Video@_paused": "приостановлено", "Lily/Video@_playing": "играет", "Lily/Video@_resume video [NAME]": "продолжить видео [NAME]", - "Lily/Video@_set volume of video [NAME] to [VALUE]": "установить звук видео [NAME] на [VALUE]", + "Lily/Video@_set volume of video [NAME] to [VALUE]": "задать звук видео [NAME] на [VALUE]", "Lily/Video@_show video [NAME] on [TARGET]": "показать видео [NAME] на[TARGET]", "Lily/Video@_start video [NAME] at [DURATION] seconds": "начать видео [NAME] на [DURATION] секундах", "Lily/Video@_stop showing video on [TARGET]": "остановить показывающийся видео на [TARGET]", @@ -6847,9 +7333,9 @@ "Lily/lmsutils@_replace first [INPUTA] with [INPUTB] in [STRING]": "заменить первое [INPUTA] на [INPUTB] текста [STRING]", "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 variable [INPUTA] to [INPUTB]": "установить переменную [INPUTA] в [INPUTB]", + "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": "текст", "Lily/lmsutils@_true": "да", @@ -6872,7 +7358,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": "длина", @@ -6998,9 +7484,9 @@ "Skyhigh173/json@_replace item [pos] of [json] with [item]": "заменить число [pos] матрицы [json] на [item]", "Skyhigh173/json@_reverse array [json]": "обернуть матрицу [json]", "Skyhigh173/json@_select a list": "выберите список", - "Skyhigh173/json@_set [item] in [json] to [value]": "установить [item] в [json] на [value]", - "Skyhigh173/json@_set length of array [json] to [len]": "установить длину матрицы [json] на [len]", - "Skyhigh173/json@_set list [list] to [json]": "установить список [list] в [json]", + "Skyhigh173/json@_set [item] in [json] to [value]": "задать [item] в [json] на [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": "сортировать матрицу [list] в порядке [order]", "Skyhigh173/json@_value of [item] in [json]": "значение [item] в [json]", "Skyhigh173/json@_values": "значения", @@ -7039,7 +7525,7 @@ "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 resize rendering mode [EFFECT]": "задать режим рендеринга с изменением размера холста [EFFECT]", "TheShovel/CanvasEffects@_skew X": "скос X", "TheShovel/CanvasEffects@_skew Y": "скос Y", "TheShovel/CanvasEffects@_solid": "твёрдый", @@ -7088,35 +7574,93 @@ "TheShovel/CustomStyles@_monitor text": "мониторить текст", "TheShovel/CustomStyles@_reset styles": "сбросить стили", "TheShovel/CustomStyles@_set [COLORABLE] to [COLOR]": "задать [COLORABLE] на [COLOR]", - "TheShovel/CustomStyles@_set ask prompt button image to [URL]": "установить изображение кнопки запроса запроса на [URL]", + "TheShovel/CustomStyles@_set ask prompt button image to [URL]": "задать изображение кнопки запроса запроса на [URL]", "TheShovel/CustomStyles@_set border width of [BORDER] to [SIZE]": "задать ширину границы [BORDER] на [SIZE]", - "TheShovel/CustomStyles@_set list scrolling to [SCROLLRULE]": "сетнуть для прокрутки списка на значение [SCROLLRULE]", - "TheShovel/CustomStyles@_set position of list [NAME] to x: [X] y: [Y]": "установить положение списка [NAME] на x: [X] y: [Y]", + "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": "фоновое значение переменной", "TheShovel/CustomStyles@_variable value roundness": "круглость значение переменная", "TheShovel/CustomStyles@_variable value text": "текст значения переменной", + "TheShovel/LZ-String@_EncodedURIComponent": "Закодированный URI Компонент", "TheShovel/LZ-String@_LZ Compress": "LZ Компрессор", + "TheShovel/LZ-String@_Raw": "Необработанное", + "TheShovel/LZ-String@_compress [TEXT] to [TYPE]": "компрессировать [TEXT] в [TYPE]", + "TheShovel/LZ-String@_decompress [TEXT] from [TYPE]": "разкомпрессировать [TEXT] из [TYPE]", + "TheShovel/ShovelUtils@_Link or data URI here": "Ссылка или URI данные здесь", "TheShovel/ShovelUtils@_all sprites": "все спрайты", + "TheShovel/ShovelUtils@_brightness of [color]": "яркость [color]", + "TheShovel/ShovelUtils@_delete costume [COSNAME] in [SPRITE]": "удалить костюм [COSNAME] в [SPRITE]", + "TheShovel/ShovelUtils@_delete sprite [SPRITE]": "удалить спрайт [SPRITE]", + "TheShovel/ShovelUtils@_import image from [TEXT] name [NAME]": "импортировать изображение из [TEXT] имя [NAME]", + "TheShovel/ShovelUtils@_import project from [TEXT]": "импортировать проект из [TEXT]", + "TheShovel/ShovelUtils@_import sound from [TEXT] name [NAME]": "импортировать звук из [TEXT] имя [NAME]", + "TheShovel/ShovelUtils@_import sprite from [TEXT]": "импортировать спрайт из [TEXT]", + "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]", "Xeltalliv/clippingblending@_Clipping & Blending": "Обрезка и Смешивание", + "Xeltalliv/clippingblending@_additive": "прибавление", + "Xeltalliv/clippingblending@_blending": "смешивание", + "Xeltalliv/clippingblending@_clear clipping box": "отчистить рамку отсечения", + "Xeltalliv/clippingblending@_clipping box [PROP]": "[PROP] рамки отсечения", "Xeltalliv/clippingblending@_default": "по умолчанию", "Xeltalliv/clippingblending@_height": "высота", "Xeltalliv/clippingblending@_invert": "инверт", + "Xeltalliv/clippingblending@_is additive blending on?": "включено ли смешивание прибавление?", + "Xeltalliv/clippingblending@_max x": "максимальный x", + "Xeltalliv/clippingblending@_max y": "максимальный y", + "Xeltalliv/clippingblending@_min x": "минимальный x", + "Xeltalliv/clippingblending@_min y": "минимальный y", + "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@_turn additive blending [STATE]": "включить режим смешивания прибавление [STATE]", + "Xeltalliv/clippingblending@_use [BLENDMODE] blending": "использовать режим смешивания [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]", + "ZXMushroom63/searchApi@_has search parameter [ID]?": "имеет параметр поиска [ID]?", + "ZXMushroom63/searchApi@_index [I] of search parameters [ID]": "индекс [I] параметров поиска [ID]", + "ZXMushroom63/searchApi@_length of search parameters": "длина параметров поиска", "ZXMushroom63/searchApi@_name": "имя", + "ZXMushroom63/searchApi@_occurrences of search parameter [ID]": "вхождения параметра поиска [ID]", + "ZXMushroom63/searchApi@_search parameter [PARAM] at index [I]": "параметр поиска [PARAM] по индексу [I]", + "ZXMushroom63/searchApi@_set search parameter [ID] to [VAL]": "задать для параметра поиска [ID] значение [VAL]", "ZXMushroom63/searchApi@_value": "значение", + "ZXMushroom63/searchApi@_value of search parameter [ID]": "значение параметра поиска [ID]", + "ar@_combined": "комбинированная", + "ar@_enter AR mode": "войти в AR режим", + "ar@_exit AR mode": "выйти из AR режим", + "ar@_hit position": "позиция попадания", + "ar@_hit position [POSITION_COMPONENT]": "позиция попадания [POSITION_COMPONENT]", + "ar@_inverse view": "обратный вид", + "ar@_is [FEATURE] available?": "доступно ли [FEATURE]?", + "ar@_is in AR?": "в AR режиме?", + "ar@_item [ITEM] of [MATRIX] matrix": "элемент [ITEM] матрицы [MATRIX] ", + "ar@_move everything by x:[X] y:[Y] z:[Z]": "двинуть всё на x:[X] y:[Y] z:[Z]", + "ar@_orientation [ORIENTATION_COMPONENT]": "ориентация [ORIENTATION_COMPONENT]", + "ar@_pose": "поза", + "ar@_position [POSITION_COMPONENT]": "позиция [POSITION_COMPONENT]", + "ar@_projection": "проекция", + "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]", "ar@_view": "просмотров", "battery@_Battery": "Батарея", "battery@_battery level": "заряд батареи", @@ -7155,22 +7699,22 @@ "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.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": "перейти в x:[x] y:[y] [space]", - "box2d@griffpatch.setProperties": "установить плотность [density] трение [friction] упругость [restitution]", - "box2d@griffpatch.setRestitution": "установить упругость в [restitution]", - "box2d@griffpatch.setRestitutionValue": "установить упругость в [restitution]", - "box2d@griffpatch.setScroll": "установить скролл в x:[ox] y:[oy]", + "box2d@griffpatch.setProperties": "задать плотность [density] трение [friction] упругость [restitution]", + "box2d@griffpatch.setRestitution": "задать упругость в [restitution]", + "box2d@griffpatch.setRestitutionValue": "задать упругость в [restitution]", + "box2d@griffpatch.setScroll": "задать скролл в x:[ox] y:[oy]", "box2d@griffpatch.setStage": "задать границы сцены как [stageType]", - "box2d@griffpatch.setStatic": "установить тип фиксации как [static]", - "box2d@griffpatch.setTickRate": "установить скорость симуляции в [rate]/сек", - "box2d@griffpatch.setVelocity": "установить скорость в sx:[sx]sy:[sy]", + "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]", @@ -7180,11 +7724,83 @@ "clipboard@_when something is pasted": "когда что-либо вставлено", "clouddata-ping@_Ping Cloud Data": "Пинг Облачных Данных", "clouddata-ping@_is cloud data server [SERVER] up?": "сервер облачных данных [SERVER] в сети?", + "cloudlink@_(OLD - DO NOT USE IN NEW PROJECTS) my username": "(УСТАРЕЛО - НЕ ИСПОЛЬЗУЙТЕ В НОВЫХ ПРОЕКТАХ) моё имя пользователя", + "cloudlink@_A name": "Имя", + "cloudlink@_All data": "Все данные", + "cloudlink@_Another name": "Другое имя", + "cloudlink@_Apple": "Яблоко", + "cloudlink@_Banana": "Банан", + "cloudlink@_Direct data": "Прямые данные", + "cloudlink@_Global data": "Глобальные данные", + "cloudlink@_Global variables": "Глобальные переменные", + "cloudlink@_Hide old blocks": "Скрыть старые блоки", + "cloudlink@_ID [ID] connected?": "ID [ID] подключён?", + "cloudlink@_Private data": "Частные данные", + "cloudlink@_Private variables": "Частные переменные", + "cloudlink@_Show old blocks": "Показать старые блоки", + "cloudlink@_Status code": "Код состояния", + "cloudlink@_When I receive new [TYPE] data for [VAR]": "Когда я получаю новые [TYPE] данные для [VAR]", + "cloudlink@_[NUM] from JSON array [ARRAY]": "[NUM] из JSON матрицы [ARRAY]", "cloudlink@_[PATH] of [JSON_STRING]": "[PATH] из [JSON_STRING]", + "cloudlink@_[TYPE] [VAR] data": "[TYPE] [VAR] данные ", + "cloudlink@_attach listener [ID] to next packet": "привязать прослушивателя [ID] к следующему пакету", + "cloudlink@_clear all packets for [TYPE]": "отчистить все пакеты для [TYPE]", + "cloudlink@_connect to [IP]": "подключиться к [IP]", + "cloudlink@_connect to server [ID]": "подключиться к серверу [ID]", + "cloudlink@_connected?": "подключён?", + "cloudlink@_convert [toBeJSONified] to JSON": "сконвертировать [toBeJSONified] в JSON", + "cloudlink@_direct": "прямые", + "cloudlink@_direct data": "прямые данные", + "cloudlink@_disconnect": "отключиться", + "cloudlink@_extension version": "версия расширенния", + "cloudlink@_failed to connnect?": "не удалось подключиться?", + "cloudlink@_fetch data from URL [url]": "извлечение данных из URL-адреса [url]", + "cloudlink@_global data": "глобальные данные", + "cloudlink@_got new [TYPE] data for variable [VAR]?": "получил новые [TYPE] данные для переменной [VAR]?", + "cloudlink@_got new [TYPE]?": "получил новые [TYPE]?", + "cloudlink@_got new packet with listener [ID]?": "получил новый пакет от прослушивателя [ID]?", "cloudlink@_id": "ID", + "cloudlink@_is [JSON_STRING] valid JSON?": "валиден ли JSON [JSON_STRING]?", + "cloudlink@_link status": "статус ссылки", + "cloudlink@_link to room(s) [ROOMS]": "привязать к комнате(-там) [ROOMS]", + "cloudlink@_linked to rooms?": "привязан к комнатам?", + "cloudlink@_lost connection?": "потеряно соединение?", + "cloudlink@_my IP address": "мой IP адрес", + "cloudlink@_my user object": "мой объект пользователя", + "cloudlink@_my username": "моё имя пользователя", + "cloudlink@_packet queue for [TYPE]": "очередь пакета [TYPE]", + "cloudlink@_private data": "частные данные", + "cloudlink@_reset got new [ID] listener status": "сброс получил новый статус прослушивателя [ID]", + "cloudlink@_reset got new [TYPE] [VAR] status": "сброс получил новый статус [TYPE] [VAR]", + "cloudlink@_reset got new [TYPE] status": "сброс получил новый статус [TYPE]", + "cloudlink@_response for listener [ID]": "ответ от прослушивателя [ID]", + "cloudlink@_select room(s) [ROOMS] for next packet": "выбрать комнату(-ты) [ROOMS] для следующего пакета", + "cloudlink@_send [DATA]": "отправить [DATA]", + "cloudlink@_send [DATA] to [ID]": "отправить [DATA] к [ID]", + "cloudlink@_send command [CMD] [ID] [DATA]": "отправить команду [CMD] [ID] [DATA]", + "cloudlink@_send command without ID [CMD] [DATA]": "отправить команду без |D [CMD] [DATA]", + "cloudlink@_send request with method [method] for URL [url] with data [data] and headers [headers]": "отправить запрос с помощью метода [method] для URL [url] с данными [data] и заголовками [headers]", + "cloudlink@_send variable [VAR] to [ID] with data [DATA]": "отправить переменную [VAR] к [ID] с данными [DATA]", + "cloudlink@_send variable [VAR] with data [DATA]": "отправить переменную [VAR] с данными [DATA]", + "cloudlink@_server MOTD": "MOTD сервера", + "cloudlink@_server list": "список серверов", + "cloudlink@_server version": "версия сервера", + "cloudlink@_set [NAME] as username": "задать [NAME] как имя пользователя", + "cloudlink@_size of queue for [TYPE]": "размер очереди [TYPE]", + "cloudlink@_status code": "код статуса", + "cloudlink@_unlink from all rooms": "отвязать от всех комнат", + "cloudlink@_username synced?": "имя пользователя синхронизировано?", + "cloudlink@_usernames": "имена пользователей", + "cloudlink@_val": "значение", + "cloudlink@_when I receive new [TYPE] message": "когда я получаю сообщение новые [TYPE]", + "cloudlink@_when I receive new message with listener [ID]": "когда я получаю новое сообщение от прослушивателя [ID]", + "cloudlink@_when connected": "когда подключился", + "cloudlink@_when disconnected": "когда отключился", "cs2627883/numericalencoding@_Hello!": "Привет!", "cs2627883/numericalencoding@_Numerical Encoding V1": "Численная Кодировка V1", + "cs2627883/numericalencoding@_decode [ENCODED] back to text": "раскодировать [ENCODED] обратно в текст", "cs2627883/numericalencoding@_decoded": "декодированное", + "cs2627883/numericalencoding@_encode [DATA] to numbers": "закодировать [DATA] в цифры", "cs2627883/numericalencoding@_encoded": "закодированное", "cursor@_Mouse Cursor": "Курсор Мыши", "cursor@_bottom left": "нижнем левом углу", @@ -7199,6 +7815,12 @@ "cursor@_{size} (unreliable)": "{size} (ненадежно)", "encoding@_Encoding": "Кодировка", "encoding@_[string] corresponding to the [CodeList] character": "символ соответствующий [string] в [CodeList]", + "encoding@_convert the character [string] to [CodeList]": "конвертировать символ [string] в [CodeList]", + "encoding@_decode [string] with [code]": "раскодировать [string] с [code]", + "encoding@_encode [string] in [code]": "закодировать [string] в [code]", + "encoding@_hash [string] with [hash]": "хэш [string] с [hash]", + "encoding@_randomly generated [position] character string": "случайно сгенерировано строчный символ [position]", + "encoding@_use [wordbank] to generate a random [position] character string": "использовать [wordbank] для генерации случайного строчного символа [position]", "fetch@_Fetch": "Поимка", "files@_Accepted formats: {formats}": "Разрешённые форматы: {formats}", "files@_Files": "Файлы", @@ -7217,7 +7839,9 @@ "files@_set open file selector mode to [mode]": "запрашивать открытие файлов через [mode]", "files@_show modal": "показать модал", "files@_text": "текст", + "gamejolt@GameJoltAPI_gamejoltBool": "на game jolt?", "gamejolt@_1 point": "1 балл", + "gamejolt@_Batch Blocks": "Пакетные Блоки", "gamejolt@_Close": "Закрыть", "gamejolt@_Data Storage Blocks": "Блоки Хранилища Данных", "gamejolt@_Debug Blocks": "Блоки Отладки", @@ -7227,15 +7851,22 @@ "gamejolt@_Time Blocks": "Блоки Времени", "gamejolt@_Trophy Blocks": "Блоки Трофеев", "gamejolt@_[openOrClose] session": "сессия [openOrClose]", + "gamejolt@_achieve trophy of ID [ID]": "получить трофей ID [ID]", "gamejolt@_achievement date": "дата получения", "gamejolt@_active": "активный", + "gamejolt@_add [namespace] request with [parameters] to batch": "добавить запрос [namespace] с [parameters] в пакет", + "gamejolt@_add [username] score [value] in table of ID [ID] with text [text] and comment [extraData]": "добавить [username] счёт [value] в таблице ID [ID] с текстом [text] и комментарием [extraData]", + "gamejolt@_add score [value] in table of ID [ID] with text [text] and comment [extraData]": "добавить счёт [value] в таблице ID [ID] с текстом [text] и комментарием [extraData]", "gamejolt@_adding": "прибавив", "gamejolt@_all": "все", "gamejolt@_all achieved": "все полученные", "gamejolt@_all unachieved": "все не полученные", "gamejolt@_appending": "добавив справа", + "gamejolt@_auto login available?": "автоматический вход доступен?", "gamejolt@_avatar URL": "URL аватара", + "gamejolt@_batch in JSON": "пакеты в JSON", "gamejolt@_better": "лучше", + "gamejolt@_clear batch": "отчистить пакеты", "gamejolt@_comment": "комментарий", "gamejolt@_data": "данные", "gamejolt@_day": "день", @@ -7243,16 +7874,55 @@ "gamejolt@_developer username": "имя разработчика", "gamejolt@_difficulty": "сложность", "gamejolt@_dividing by": "делением на", + "gamejolt@_fetch [amount] [globalOrPerUser] score/s [betterOrWorse] than [value] in table of ID [ID]": "взять [amount] счёт [globalOrPerUser] [betterOrWorse] чем [value] в таблице ID [ID]", + "gamejolt@_fetch [amount] [globalOrPerUser] score/s in table of ID [ID]": "взять [amount] счёт [globalOrPerUser] в таблице ID [ID]", + "gamejolt@_fetch [amount] [username] score/s [betterOrWorse] than [value] in table of ID [ID]": "взять [amount] счёт [username] [betterOrWorse] чем [value] в таблице ID [ID]", + "gamejolt@_fetch [amount] [username] score/s in table of ID [ID]": "взять [amount] счёт [username] в таблице ID [ID]", + "gamejolt@_fetch [globalOrPerUser] keys matching with [pattern]": "взять [globalOrPerUser] данные совпадающие с [pattern]", + "gamejolt@_fetch [trophyFetchGroup] trophies": "взять трофеи [trophyFetchGroup]", + "gamejolt@_fetch all [globalOrPerUser] keys": "взять все [globalOrPerUser] данные", + "gamejolt@_fetch batch [parameter]": "взять [parameter] пакеты", + "gamejolt@_fetch logged in user": "взять вход в пользователе", + "gamejolt@_fetch score tables": "взять счёт таблицы", + "gamejolt@_fetch server's time": "взять время сервера", + "gamejolt@_fetch trophy of ID[ID]": "взять трофей ID [ID]", + "gamejolt@_fetch user's [usernameOrID] by [fetchType]": "взять [usernameOrID] пользователя [fetchType]", + "gamejolt@_fetch user's friend IDs": "взять ID друзей пользователя", + "gamejolt@_fetched [globalOrPerUser] data at [key]": "взять [globalOrPerUser] данные на [key]", + "gamejolt@_fetched batch data in JSON": "взятые данные пакетов в JSON", + "gamejolt@_fetched key at index [index]": "взятые данные на [index]", + "gamejolt@_fetched keys in JSON": "взятые данные в JSON", + "gamejolt@_fetched rank of [value] in table of ID [ID]": "взятый ранг [value] в таблице ID [ID]", + "gamejolt@_fetched score [scoreDataType] at index [index]": "взятый счёт [scoreDataType] на [index]", + "gamejolt@_fetched score data in JSON": "взятые данные счёта в JSON", + "gamejolt@_fetched server's [timeType]": "взятое [timeType] сервера", + "gamejolt@_fetched server's time in JSON": "взятое время сервера в JSON", + "gamejolt@_fetched table [tableDataType] at index [index]": "взятые таблицы [tableDataType] на [index]", + "gamejolt@_fetched table [tableDataType] at index[index] (Deprecated)": "взятые таблицы [tableDataType] на [index] (Устарело)", + "gamejolt@_fetched tables in JSON": "взятые таблицы в JSON", + "gamejolt@_fetched trophies in JSON": "взятые трофей в JSON", + "gamejolt@_fetched trophy [trophyDataType] at index [index]": "взятые трофей [trophyDataType] на [index]", + "gamejolt@_fetched user's [userDataType]": "взятый пользователь [userDataType]", + "gamejolt@_fetched user's data in JSON": "взятые данные пользователя в JSON", + "gamejolt@_fetched user's friend ID at index[index]": "взятые ID друзей пользователя на [index]", + "gamejolt@_fetched user's friend IDs in JSON": "взятые ID друзей пользователя в JSON", "gamejolt@_global": "глобальный", "gamejolt@_guest": "гость", "gamejolt@_hour": "час", "gamejolt@_idle": "неактивный", "gamejolt@_image URL": "URL картинки", + "gamejolt@_in debug mode?": "в режиме отладки?", "gamejolt@_in parallel": "Параллельный", "gamejolt@_index": "индекс", "gamejolt@_key": "ключ", + "gamejolt@_last API error": "последняя ошибка API", "gamejolt@_last login": "последний вход", "gamejolt@_last login timestamp": "временной штамп последнего входа", + "gamejolt@_logged in user's username": "вошёл в имя пользователя", + "gamejolt@_logged in?": "авторизирован?", + "gamejolt@_login automatically": "войти автоматически", + "gamejolt@_login with [username] and [token]": "войти с [username] и [token]", + "gamejolt@_logout": "выйти", "gamejolt@_minute": "минута", "gamejolt@_month": "месяц", "gamejolt@_multiplying by": "умножением на", @@ -7260,15 +7930,22 @@ "gamejolt@_off": "Выключить", "gamejolt@_on": "Включить", "gamejolt@_optional": "необязательно", + "gamejolt@_ping session": "сеанс проверки связи", "gamejolt@_prepending": "добавив слева", "gamejolt@_primary": "основная", "gamejolt@_private key": "приватный ключ", "gamejolt@_private token": "приватный токен", + "gamejolt@_remove [globalOrPerUser] data at [key]": "удалить [globalOrPerUser] данные на [key]", + "gamejolt@_remove trophy of ID [ID]": "удалить трофей ID [ID]", "gamejolt@_score date": "дата получения счета", "gamejolt@_score timestamp": "временной штамп получения счета", "gamejolt@_second": "секунда", "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@_sign up date": "дата регистрации", "gamejolt@_sign up timestamp": "временной штамп регистрации", "gamejolt@_status": "статус", @@ -7277,8 +7954,11 @@ "gamejolt@_timestamp": "временной штамп", "gamejolt@_timezone": "часовой пояс", "gamejolt@_title": "название", + "gamejolt@_turn debug mode [toggle]": "включить режим отладки [toggle]", "gamejolt@_type": "тип", + "gamejolt@_update [globalOrPerUser] data at [key] by [operationType] [value]": "обновить [globalOrPerUser] данные на [key] на [operationType] [value]", "gamejolt@_user": "пользовательский", + "gamejolt@_user Blocks": "блоки Пользователя", "gamejolt@_user ID": "ID пользователя", "gamejolt@_username": "имя пользователя", "gamejolt@_value": "значение", @@ -7310,10 +7990,54 @@ "gamepad@_gamepad [pad] connected?": "геймпад [pad] подключен?", "gamepad@_magnitude of axes [axis] on pad [pad]": "величина на оси [axis] на геймпаде [pad]", "gamepad@_rumble strong [s] and weak [w] for [t] sec. on pad [i]": "грохнуть на [s] и слабо [w] в течение [t] секунд на панели [i]", - "gamepad@_set axis deadzone to [DEADZONE]": "установить ось мёртвой зоне в [DEADZONE]", + "gamepad@_set axis deadzone to [DEADZONE]": "задать ось мёртвой зоне в [DEADZONE]", "gamepad@_value of axis [b] on pad [i]": "значение на оси [b] на геймпаде [i]", "gamepad@_value of button [b] on pad [i]": "значение на триггере [b] на геймпаде [i]", + "godslayerakp/http@_Hide Extra": "Скрыть Дополнительное", + "godslayerakp/http@_Request": "Запрос", + "godslayerakp/http@_Response": "Ответ", + "godslayerakp/http@_Show Extra": "Показать Дополнительное", + "godslayerakp/http@_[name] from header": "[name] из заголовка", + "godslayerakp/http@_[name] in request form": "[name] в форме запроса", + "godslayerakp/http@_[path] in request options": "[path] в настройках запроса", + "godslayerakp/http@_clear current data": "отчистить текущие данные", + "godslayerakp/http@_delete [name] from request form": "удалить [name] из формы запроса", + "godslayerakp/http@_error": "ошибка", + "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 request form": "задать [name] на [value] в форме запроса", + "godslayerakp/http@_set [path] to [value] in request options": "задать [path] на [value] в настройках запроса", + "godslayerakp/http@_set [path] to type [type] in request options": "задать [path] на тип [type] в настройках запроса", + "godslayerakp/http@_set content type to [type]": "задать тип контента на [type]", + "godslayerakp/http@_set headers to json [json]": "задать заголовки на json [json]", + "godslayerakp/http@_set request body to [text]": "задать тело запроса на [text]", + "godslayerakp/http@_set request body to a form": "задать тело запроса на форму", + "godslayerakp/http@_set request method to [method]": "задать метод запроса на [method]", + "godslayerakp/http@_site responded?": "сайт ответил?", "godslayerakp/http@_status": "статус", + "godslayerakp/http@_status text": "текст статуса", + "godslayerakp/http@_type of [path] in request options": "тип [path] в настройках запроса", + "godslayerakp/http@_when a request fails": "когда запрос завалился", + "godslayerakp/http@_when a site responds": "когда сайт отвечает", + "godslayerakp/ws@_close connection": "закрыть подключение", + "godslayerakp/ws@_close connection with code [CODE]": "закрыть подключение с кодом [CODE]", + "godslayerakp/ws@_close connection with reason [REASON] and code [CODE]": "закрыть подключение с причиной [REASON] и кодом [CODE]", + "godslayerakp/ws@_closing code": "закрывающий код", + "godslayerakp/ws@_closing message": "закрывающее сообщение", + "godslayerakp/ws@_connect to [URL]": "подключиться к [URL]", + "godslayerakp/ws@_connection errored?": "произошла ошибка подключения?", + "godslayerakp/ws@_is connected?": "подключён?", + "godslayerakp/ws@_is connection closed?": "подключение закрыто?", + "godslayerakp/ws@_received message data": "полученные данные сообщения", + "godslayerakp/ws@_send message [PAYLOAD]": "отправить сообщение [PAYLOAD]", + "godslayerakp/ws@_when connected": "когда подключился", + "godslayerakp/ws@_when connection closes": "когда подключение закрывается", + "godslayerakp/ws@_when connection errors": "когда подключение проваливается", + "godslayerakp/ws@_when message received": "когда сообщение получено", "iframe@_It works!": "Работает!", "iframe@_close iframe": "закрыть iframe", "iframe@_height": "высота", @@ -7321,10 +8045,10 @@ "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 height to [HEIGHT]": "задать высоту iframe в [HEIGHT]", + "iframe@_set iframe interactive to [INTERACTIVE]": "задать взаимодействие с iframe на [INTERACTIVE]", + "iframe@_set iframe resize behavior to [RESIZE]": "задать поведение изменения размера iframe на [RESIZE]", + "iframe@_set iframe width to [WIDTH]": "задать ширину iframe в [WIDTH]", "iframe@_set iframe x position to [X]": "задать позицию iframe x в [X]", "iframe@_set iframe y position to [Y]": "задать позицию iframe y в [Y]", "iframe@_show HTML [HTML]": "показать HTML [HTML]", @@ -7337,25 +8061,41 @@ "itchio@_Error: Data not found.": "Ошибка: Данные не найдены", "itchio@_Rewards": "Награды", "itchio@_Sale": "Скидки", + "itchio@_Sub Products": "Субпродукты", "itchio@_Window": "Окно", "itchio@_amount": "количество", "itchio@_amount remaining": "оставшееся количество", "itchio@_available": "доступно", "itchio@_cover image URL": "URL обложки", "itchio@_end date": "дата конца", + "itchio@_fetch game data [user][game][secret]": "взять данные игры [user][game][secret]", "itchio@_game": "игра", + "itchio@_game [data]": "[data] игры", "itchio@_game argument not found": "аргумент игры не найден", + "itchio@_game data [user][game][secret] in .json": "данные игры [user][game][secret] в .json", + "itchio@_game data in .json": "данные игры в .json", + "itchio@_game data?": "данные игры?", + "itchio@_game rewards [rewards] by index:[index]": "игровые награды [rewards] на:[index]", + "itchio@_game sale [sale]": "распродажа игры [sale]", + "itchio@_game sub products [subProducts] by index:[index]": "игровые субпродукты [subProducts] на:[index]", "itchio@_id": "ID", "itchio@_name": "имя", + "itchio@_open [prefix] itch.io [page] window with [width]width and [height]height": "открыть [prefix] itch.io [page] окно с [width]шириной и [height]высотой", "itchio@_original price": "изначальная цена", "itchio@_price": "цена", "itchio@_rate": "оценка", + "itchio@_rewards list length": "длина списка наград", + "itchio@_rewards?": "награды?", + "itchio@_sale?": "продажа?", + "itchio@_sub products list length": "длина списка субпродуктов", + "itchio@_sub products?": "субпродукты?", "itchio@_title": "название", "itchio@_user": "пользователь", "itchio@_user argument not found": "аргумент пользователя не найден", "itchio@itchio_error": "Ошибка:", "itchio@itchio_errors": "Ошибки:", "lab/text@_# of lines": "кол-во строк", + "lab/text@_# of lines [WITH_WORD_WRAP]": "# [WITH_WORD_WRAP]", "lab/text@_Animated Text": "Анимированный Текст", "lab/text@_Enable Non-Scratch Lab Features": "Включить функции не из Scratch Lab", "lab/text@_Hello!": "Привет!", @@ -7390,17 +8130,19 @@ "lab/text@_text [ATTRIBUTE]": "[ATTRIBUTE] текста", "lab/text@_type": "печатающийся", "lab/text@_typing delay": "задержка печатания", + "lab/text@_with word wrap": "с переносом слов", + "lab/text@_without word wrap": "без переноса слов", "lab/text@_zoom": "вырастающий", "lab/text@disableCompatibilityMode": "Это включит новые блоки и особенности которые НЕ БУДУТ РАБОТАТЬ в официальной лаборатории Scratch.\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]": "добавить ребёнка [CHILD] файлу [XML]", "mbw/xml@_attribute [ATTR] of [XML]": "атрибут [ATTR] файла [XML]", @@ -7417,12 +8159,17 @@ "mbw/xml@_remove attribute [ATTR] of [XML]": "удалить атрибут [ATTR] файла [XML]", "mbw/xml@_remove child #[NO] of [XML]": "удалить #[NO] ребёнка файла [XML]", "mbw/xml@_replace child #[NO] of [XML] with [CHILD]": "заменить ребёнка под номером #[NO] файла [XML] на [CHILD]", - "mbw/xml@_set attribute [ATTR] of [XML] to [VALUE]": "установить атрибут [ATTR] XML файла [XML] в [VALUE]", - "mbw/xml@_set text of [XML] to [VALUE]": "установить текст [XML] на [VALUE]", + "mbw/xml@_set attribute [ATTR] of [XML] to [VALUE]": "задать атрибут [ATTR] XML файла [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!": "Привет, мир!", + "mdwalters/notifications@_Notification from project": "Уведомления из проекта", "mdwalters/notifications@_Notifications": "Уведомления", + "mdwalters/notifications@_close notification": "закрыть уведомление", + "mdwalters/notifications@_create notification with text [text]": "создать уведомление с текстом [text]", + "mdwalters/notifications@_has notification permission?": "есть разрешение на уведомления?", + "mdwalters/notifications@_request notification permission": "запрос на разрешение уведомлений", "navigator@_Navigator Info": "Информация о Навигаторе", "navigator@_browser": "браузер", "navigator@_dark": "тёмную", @@ -7446,6 +8193,7 @@ "obviousAlexC/SensingPlus@_Speech recording is unreliable": "Запись речи ненадежна", "obviousAlexC/SensingPlus@_Touch blocks are broken in Safari.": "Блоки дотрагивания сломаны в Safari.", "obviousAlexC/SensingPlus@_We will try to fix them soon.": "Мы попробуем это починить в скором времени.", + "obviousAlexC/SensingPlus@_[type] speed on the [axis] axis": "[type] скорость на оси [axis]", "obviousAlexC/SensingPlus@_accelerometer": "акселерометр", "obviousAlexC/SensingPlus@_brightness": "яркость", "obviousAlexC/SensingPlus@_color": "цвет", @@ -7460,6 +8208,7 @@ "obviousAlexC/SensingPlus@_gyroscope": "гироскоп", "obviousAlexC/SensingPlus@_has a [device]?": "имеет [device]?", "obviousAlexC/SensingPlus@_hidden?": "скрыт?", + "obviousAlexC/SensingPlus@_is finger [ID] down?": "палец [ID] опущен?", "obviousAlexC/SensingPlus@_is packaged?": "запакован?", "obviousAlexC/SensingPlus@_item # of [term] in [List]": "строка #[term] в списке [List]", "obviousAlexC/SensingPlus@_length of [List]": "длина списка [List]", @@ -7472,33 +8221,153 @@ "obviousAlexC/SensingPlus@_recording?": "запись?", "obviousAlexC/SensingPlus@_rotation style": "стиль поворота", "obviousAlexC/SensingPlus@_rotational": "поворачиваемый", - "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] этого спрайта", "obviousAlexC/SensingPlus@_touching a clone of [Sprite]?": "касается клона [Sprite]?", "obviousAlexC/SensingPlus@_touching a finger?": "дотрагивается до пальца?", "obviousAlexC/SensingPlus@_touching finger [ID]?": "дотрагивается до пальца [ID]?", "obviousAlexC/SensingPlus@_touching the original [Sprite]?": "касается оригинала [Sprite]?", "obviousAlexC/SensingPlus@_turn speech recording [toggle]": "включить запись речи [toggle]", "obviousAlexC/SensingPlus@_whirl": "завихрение", + "obviousAlexC/newgroundsIO@_API status": "статус API", + "obviousAlexC/newgroundsIO@_All Time": "Всё Время", "obviousAlexC/newgroundsIO@_Data": "Данные", + "obviousAlexC/newgroundsIO@_Encryption Code": "Код Шифрования", + "obviousAlexC/newgroundsIO@_MedalID": "ID медали", + "obviousAlexC/newgroundsIO@_Today": "Сегодня", + "obviousAlexC/newgroundsIO@_[scoreDataType] of rank [rank] from scoreboard [scoreBoardID] from the timespan of [timeSpan]": "[scoreDataType] из рейтинга [rank] на таблице счёта [scoreBoardID] за промежуток времени [timeSpan]", + "obviousAlexC/newgroundsIO@_change game version to [version]": "изменить версию игры на [version]", + "obviousAlexC/newgroundsIO@_connect to game: [gameID] with code: [code]": "подключиться к игре: [gameID] с кодом: [code]", + "obviousAlexC/newgroundsIO@_currently logged in?": "в данный момент вошёл?", + "obviousAlexC/newgroundsIO@_data from slot [Slot]": "данные из слота [Slot]", + "obviousAlexC/newgroundsIO@_does slot [Slot] have save data?": "слот [Slot] имеет данные сохранения?", + "obviousAlexC/newgroundsIO@_formatted score": "форматированный счёт", + "obviousAlexC/newgroundsIO@_game version": "версия игры", + "obviousAlexC/newgroundsIO@_gameID": "ID игры", "obviousAlexC/newgroundsIO@_id": "ID", + "obviousAlexC/newgroundsIO@_is medal [medalID] unlocked?": "медаль [medalID] разблокирована?", + "obviousAlexC/newgroundsIO@_is newgrounds?": "это newgrounds?", + "obviousAlexC/newgroundsIO@_is supporting?": "поддерживается?", + "obviousAlexC/newgroundsIO@_is user a newgrounds supporter?": "является ли пользователь newgrounds поддержкой?", + "obviousAlexC/newgroundsIO@_open author page": "открыть страницу автора", + "obviousAlexC/newgroundsIO@_open explore page": "открыть страницу исследования", + "obviousAlexC/newgroundsIO@_open newgrounds": "открыть newgrounds", + "obviousAlexC/newgroundsIO@_post score [score] to scoreboard [scoreBoardID]": "сделать счёт [score] в таблице счёта [scoreBoardID]", + "obviousAlexC/newgroundsIO@_profile picture": "аватарка", + "obviousAlexC/newgroundsIO@_prompt user login": "запрос на вход пользователя", + "obviousAlexC/newgroundsIO@_save [Data] to slot [Slot]": "сохранить [Data] на слот [Slot]", "obviousAlexC/newgroundsIO@_score": "очки", + "obviousAlexC/newgroundsIO@_skip login": "пропустить вход", + "obviousAlexC/newgroundsIO@_unlock medal [medalID]": "разблокировать медаль [medalID]", + "obviousAlexC/newgroundsIO@_user [datType]": "[datType] пользователь", "obviousAlexC/newgroundsIO@_username": "имя пользователя", + "obviousAlexC/newgroundsIO@_when login required": "когда требуется логин", + "obviousAlexC/newgroundsIO@_when login success": "когда логин успешен", + "obviousAlexC/newgroundsIO@_when save completed": "когда сохранение завершено", + "obviousAlexC/newgroundsIO@_when score posted": "когда счёт сделан", "obviousAlexC/penPlus@_Advanced": "Дополнительно", + "obviousAlexC/penPlus@_Color": "Цвет", + "obviousAlexC/penPlus@_Cubemaps": "Кубические карты", + "obviousAlexC/penPlus@_Custom Shaders": "Пользовательские Шейдеры", "obviousAlexC/penPlus@_Images": "Картинки", + "obviousAlexC/penPlus@_List Based Rendering": "Рендеринг на Основе Списка", + "obviousAlexC/penPlus@_Pen Properties": "Свойства Пера", + "obviousAlexC/penPlus@_Pen+ V7": "Перо+ V7", + "obviousAlexC/penPlus@_Render Textures": "Рендер Текстур", + "obviousAlexC/penPlus@_Shader Editor": "Редактор Шейдеров", + "obviousAlexC/penPlus@_Shader Manager": "Менеджер Шейдеров", + "obviousAlexC/penPlus@_Square Pen Blocks": "Квадратные Блоки Пера", + "obviousAlexC/penPlus@_Triangle Blocks": "Треугольные Блоки", + "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@_brightness": "яркость", "obviousAlexC/penPlus@_color": "цвет", + "obviousAlexC/penPlus@_create cubemap named [name] from left [left] right [right] back [back] front [front] bottom [bottom] top [top]": "создать кубическую карту названная [name] из лева [left] право [right] назад [back] перед [front] низ [bottom] верх [top]", + "obviousAlexC/penPlus@_create render texture named [name]": "создать рендер текстур названный [name]", + "obviousAlexC/penPlus@_create render texture named [name] of size [width] [height]": "создать рендер текстур названный [name] с размером [width] [height]", + "obviousAlexC/penPlus@_define solid tri [x1] [y1] [c1], [x2] [y2] [c2] and [x3] [y3] [c3]": "определить сплошные треугольники [x1] [y1] [c1], [x2] [y2] [c2] и [x3] [y3] [c3]", + "obviousAlexC/penPlus@_define textured tri [x1] [y1] [c1], [x2] [y2] [c2] and [x3] [y3] [c3] with the uv's [u1] [v1], [u2] [v2] and [u3] [v3]": "определить сплошные треугольники [x1] [y1] [c1], [x2] [y2] [c2] и [x3] [y3] [c3] с uv [u1] [v1],[u2] [v2] и [u3] [v3] ", + "obviousAlexC/penPlus@_does [name] exist as a cubemap": "[name] существует как кубическая карта", + "obviousAlexC/penPlus@_does [name] exist in Pen+ Library": "[name] существует в библиотеке Pen+", + "obviousAlexC/penPlus@_does render texture named [name] exist?": "рендер текстур названный [name] существует?", + "obviousAlexC/penPlus@_draw dot at [x] [y]": "нарисовать точку на [x] [y]", + "obviousAlexC/penPlus@_draw line from [x1] [y1] to [x2] [y2]": "нарисовать линию с [x1] [y1] до [x2] [y2]", + "obviousAlexC/penPlus@_draw shader triangles from list [list] using [shader]": "нарисовать шейдорированные треугольники из списка [list] используя [shader]", + "obviousAlexC/penPlus@_draw solid triangles from list [list]": "нарисовать сплошные треугольники из списка [list]", + "obviousAlexC/penPlus@_draw square using [shader]": "нарисовать квадрат используя [shader]", + "obviousAlexC/penPlus@_draw textured triangle between [x1] [y1], [x2] [y2] and [x3] [y3] with the texture [tex]": "нарисовать текстурированный треугольник между [x1] [y1], [x2] [y2] и [x3] [y3] с текстурой [tex]", + "obviousAlexC/penPlus@_draw textured triangles from list [list] using [tex]": "нарисовать текстурированные треугольниками из списка [list] используя [tex]", + "obviousAlexC/penPlus@_draw triangle between [x1] [y1], [x2] [y2] and [x3] [y3]": "нарисовать треугольник между [x1] [y1], [x2] [y2] и [x3] [y3]", + "obviousAlexC/penPlus@_draw triangle using [shader] between [x1] [y1], [x2] [y2] and [x3] [y3]": "нарисовать треугольник используя [shader] между [x1] [y1], [x2] [y2] и [x3] [y3]", + "obviousAlexC/penPlus@_get data uri for costume [costume]": "получить uri данные для костюма [costume]", + "obviousAlexC/penPlus@_get data uri of [costume] in the pen+ costume library": "получить uri данные [costume] в библиотеке костюмов pen+", + "obviousAlexC/penPlus@_get item [item]'s [component] value in vector 2 array [uniformName] in [shader]": "получить #[item] значение [component] в [uniformName] матрицы вектора 2 в [shader]", + "obviousAlexC/penPlus@_get item [item]'s [component] value in vector 3 array [uniformName] in [shader]": "получить #[item] значение [component] в [uniformName] матрицы вектора 3 в [shader]", + "obviousAlexC/penPlus@_get item [item]'s [component] value in vector 4 array [uniformName] in [shader]": "получить #[item] значение [component] в [uniformName] матрицы вектора 4 в [shader]", + "obviousAlexC/penPlus@_get item [item]'s value in number array [uniformName] in [shader]": "получить значение #[item] в числе [uniformName] матрицы в [shader]", + "obviousAlexC/penPlus@_get pen square's [target]": "получить [target] квадрат пера", + "obviousAlexC/penPlus@_get pixel [x] [y]'s color in [costume]": "получить цвет пикселя [x] [y] в [costume]", + "obviousAlexC/penPlus@_get the [dimension] of [costume] in pen+ costume library": "получить [dimension] [costume] в библиотеке костюмов pen+", + "obviousAlexC/penPlus@_get the cubemap of [uniformName] in [shader]": "получить [uniformName] кубическая карта в [shader]", + "obviousAlexC/penPlus@_get the texture of [uniformName] in [shader]": "получить [uniformName] текстуру в [shader]", + "obviousAlexC/penPlus@_get triangle point [point]'s [attribute]": "взять [point] треугольный точки [attribute]", + "obviousAlexC/penPlus@_get value of [component] in vector 2 [uniformName] in [shader]": "получить значение [component] в [uniformName] вектора 2 в [shader]", + "obviousAlexC/penPlus@_get value of [component] in vector 3 [uniformName] in [shader]": "получить значение [component] в [uniformName] вектора 3 в [shader]", + "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@_height": "высота", + "obviousAlexC/penPlus@_hue [H] saturation [S] value [V]": "оттенок [H] насыщенность [S] ценность [V]", "obviousAlexC/penPlus@_off": "выключить", "obviousAlexC/penPlus@_on": "включить", + "obviousAlexC/penPlus@_pen [HSV]": "перо [HSV]", + "obviousAlexC/penPlus@_pen is down?": "перо опущено?", + "obviousAlexC/penPlus@_red [R] green [G] blue [B]": "красный [R] зелёный [G] синий [B]", + "obviousAlexC/penPlus@_remove cubemap named [name]": "удалить кубическую карту названной [name]", + "obviousAlexC/penPlus@_remove image named [name] from Pen+ Library": "удалить изображение названное [name] из библиотеки Pen+", + "obviousAlexC/penPlus@_remove render texture named [name]": "удалить рендер текстур названный [name]", + "obviousAlexC/penPlus@_render textures": "рендер текстур", + "obviousAlexC/penPlus@_reset square Attributes": "сбросить Атрибуты квадрата", + "obviousAlexC/penPlus@_reset triangle attributes": "сбросить атрибуты треугольника", "obviousAlexC/penPlus@_saturation": "насыщенный", + "obviousAlexC/penPlus@_set cubemap [uniformName] in [shader] to [cubemap]": "задать [uniformName] кубическая карта на [кубическая карта] в [shader]", + "obviousAlexC/penPlus@_set imported image wrap mode to [clampMode]": "задать режим переноса импортированного изображения на [clampMode]", + "obviousAlexC/penPlus@_set item [item] in number array [uniformName] in [shader] to [number]": "задать #[item] в числе [uniformName] матрицы на [number] в [shader]", + "obviousAlexC/penPlus@_set item [item] in vector 2 array [uniformName] in [shader] to [numberX] [numberY]": "задать #[item] в [uniformName] вектора 2 на [numberX] [numberY] в [shader]", + "obviousAlexC/penPlus@_set item [item] in vector 3 array [uniformName] in [shader] to [numberX] [numberY] [numberZ]": "задать #[item] в [uniformName] вектора 3 на [numberX] [numberY] [numberZ] в [shader]", + "obviousAlexC/penPlus@_set item [item] in vector 4 array [uniformName] in [shader] to [numberX] [numberY] [numberZ] [numberW]": "задать #[item] в [uniformName] вектора 4 на [numberX] [numberY] [numberZ] [numberW] в [shader]", + "obviousAlexC/penPlus@_set matrix [uniformName] in [shader] to [array]": "задать [uniformName] матрикса на [array] в [shader]", + "obviousAlexC/penPlus@_set matrix [uniformName] in [shader] to [list]": "задать [uniformName] матрикса на [list] в [shader] ", + "obviousAlexC/penPlus@_set number [uniformName] in [shader] to [number]": "задать [uniformName] число на [number] в [shader]", + "obviousAlexC/penPlus@_set number attribute [attributeName] of point [pointID] in [shader] to [number]": "задать число [attributeName] атрибута точки [pointID] на [number] в [shader]", + "obviousAlexC/penPlus@_set pen square's [target] to [number]": "задать [target] на [number] квадрата пера", + "obviousAlexC/penPlus@_set pixel [x] [y]'s color to [color] in [costume]": "задать пикселю [x] [y] цвет [color] в [costume]", + "obviousAlexC/penPlus@_set texture [uniformName] in [shader] to [texture]": "задать текстуру [uniformName] на [texture] в [shader]", + "obviousAlexC/penPlus@_set the [attribute] of point [id] to [value] in [def]": "задать [attribute] точки [id] на [value] в [def]", + "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]": "задать [uniformName] вектора 2 на [numberX] [numberY] в [shader]", + "obviousAlexC/penPlus@_set vector 2 attribute [attributeName] of point [pointID] in [shader] to [numberX] [numberY]": "задать [attributeName] атрибута вектора 2 точки [pointID] на [numberX] [numberY] в [shader]", + "obviousAlexC/penPlus@_set vector 3 [uniformName] in [shader] to [numberX] [numberY] [numberZ]": "задать [uniformName] вектора 3 на [numberX] [numberY] [numberZ] в [shader]", + "obviousAlexC/penPlus@_set vector 3 attribute [attributeName] of point [pointID] in [shader] to [numberX] [numberY] [numberZ]": "задать [attributeName] атрибута вектора 3 точки [pointID] на [numberX] [numberY] [numberZ] в [shader]", + "obviousAlexC/penPlus@_set vector 4 [uniformName] in [shader] to [numberX] [numberY] [numberZ] [numberW]": "задать [uniformName] вектора 4 на [numberX] [numberY] [numberZ] [numberW] в [shader]", + "obviousAlexC/penPlus@_set vector 4 attribute [attributeName] of point [pointID] in [shader] to [numberX] [numberY] [numberZ] [numberW]": "задать [attributeName] атрибута вектора 4 точки [pointID] на [numberX] [numberY] [numberZ] [numberW] в [shader]", + "obviousAlexC/penPlus@_shaders in project": "шейдеры в проекте", "obviousAlexC/penPlus@_size": "размер", + "obviousAlexC/penPlus@_stamp [sprite]": "печать [sprite]", + "obviousAlexC/penPlus@_stamp pen square": "печать квадрата пером", + "obviousAlexC/penPlus@_stamp pen square with the texture of [tex]": "печать с текстурой [tex] квадрат пера", + "obviousAlexC/penPlus@_tint pen square to [color]": "покрасить квадрат пера в [color]", + "obviousAlexC/penPlus@_tint triangle point [point] to [color]": "покрасить треугольную точку [point] в [color]", + "obviousAlexC/penPlus@_tint triangle to [color]": "покрасить треугольную точку на [color]", "obviousAlexC/penPlus@_transparency": "прозрачность", "obviousAlexC/penPlus@_width": "ширина", "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]", @@ -7522,7 +8391,7 @@ "qxsck/var-and-list@replaceOfList": "заменить предмет [INDEX] списка [LIST] в значение [VALUE]", "qxsck/var-and-list@seriListsToJson": "преобразовать все списки, начинающиеся с [START], в JSON", "qxsck/var-and-list@seriVarsToJson": "преобразовать все переменные, начинающиеся с [START], в JSON", - "qxsck/var-and-list@setVar": "установить значение [VAR] в [VALUE]", + "qxsck/var-and-list@setVar": "задать значение [VAR] в [VALUE]", "rixxyx@_false": "нет", "rixxyx@_true": "да", "runtime-options@_Infinity": "Бесконечно", @@ -7540,7 +8409,7 @@ "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 [thing] to [enabled]": "задать [thing] в [enabled]", "runtime-options@_set clone limit to [limit]": "задать лимит клонов в [limit]", "runtime-options@_set framerate limit to [fps]": "задать лимит частоты кадров в [fps]", "runtime-options@_set stage size width: [width] height: [height]": "задать ширину: [width] высоту: [height] сцены", @@ -7554,6 +8423,10 @@ "sound@_Sound": "Звук", "sound@_play sound from url: [path] until done": "играть звук из url: [path] до конца", "sound@_start sound from url: [path]": "включить звук из url: [path]", + "steamworks@_URL": "URL-адрес", + "steamworks@_false": "нет", + "steamworks@_name": "имя", + "steamworks@_true": "да", "stretch@_Stretch": "Растяжение", "stretch@_change stretch by x: [DX] y: [DY]": "изменить растяжение на x: [DX] y: [DY]", "stretch@_change stretch x by [DX]": "изменить растяжение x на [DX]", @@ -7606,7 +8479,7 @@ "true-fantom/regexp@_[IMAGE] [A] contains flags [B] ?": "[IMAGE] [A] содержат флаг [B] ?", "true-fantom/regexp@_[IMAGE] add flags [B] to [IMAGE] [A]": "[IMAGE] добавить флаги [B] к [IMAGE] [A]", "true-fantom/regexp@_[IMAGE] delete flags [B] of [IMAGE] [A]": "[IMAGE] удалить флаги [B] картинки [IMAGE] [A]", - "true-fantom/regexp@_[IMAGE] set [B] of [IMAGE] [A] to [C]": "[IMAGE] установить [B] картинки [IMAGE] с [A] в [C]", + "true-fantom/regexp@_[IMAGE] set [B] of [IMAGE] [A] to [C]": "[IMAGE] задать [B] картинки [IMAGE] с [A] в [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]?", @@ -7644,9 +8517,9 @@ "veggiecan/mobilekeyboard@_numerical": "нумеручно", "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 textbox current value to [TEXT]": "установить текущее значение текстбокса на [TEXT]", + "veggiecan/mobilekeyboard@_set cursor position to [INDEX]": "задать позицию курсора на [INDEX]", + "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] и подождать", "veggiecan/mobilekeyboard@_typed text": "написанный текст", @@ -7714,19 +8587,37 @@ }, "uk": { "-SIPC-/consoles@_Consoles": "Консолі", + "-SIPC-/consoles@_Debug": "Відладка", "-SIPC-/consoles@_Error": "Помилка", + "-SIPC-/consoles@_Group": "Група", + "-SIPC-/consoles@_Information": "Інформація", + "-SIPC-/consoles@_Log": "Вивід", "-SIPC-/consoles@_Time": "Час", + "-SIPC-/consoles@_Warning": "Попередження", + "-SIPC-/consoles@_clear console": "очистити консоль", + "-SIPC-/consoles@_create log group named [string]": "створити групу виводів з назвою [string]", + "-SIPC-/consoles@_exit current log group": "покинути дану групу виводів", + "-SIPC-/consoles@_log [string]": "вивести [string]", + "-SIPC-/consoles@_log debug [string]": "вивести для відладки [string]", + "-SIPC-/consoles@_log error [string]": "вивести помилку [string]", + "-SIPC-/consoles@_log information [string]": "вивести інформацію [string]", + "-SIPC-/consoles@_log warning [string]": "вивести попередження [string]", "-SIPC-/time@_Time": "Час", "CST1229/images@_Images": "Зображення", + "CST1229/images@_bottom": "низ", "CST1229/images@_height": "висота", - "CST1229/images@_left": "ліву", - "CST1229/images@_right": "праву", + "CST1229/images@_right": "право", + "CST1229/images@_top": "верх", "CST1229/images@_width": "ширина", + "CST1229/zip@_binary": "бінарно", + "CST1229/zip@_name": "ім'я", "CST1229/zip@_text": "текст", + "Clay/htmlEncode@_Hello!": "Привіт!", "CubesterYT/KeySimulation@_Key Simulation": "Симуляція Клавіш", "CubesterYT/KeySimulation@_and wait": "і чекати", "CubesterYT/KeySimulation@_click [BUTTON] mouse button at x: [X] y: [Y] for [SECONDS] seconds [AND_WAIT]": "натиснути [BUTTON] кнопку миші в x: [X] y: [Y] на [SECONDS] секунд [AND_WAIT]", "CubesterYT/KeySimulation@_down arrow": "стрілку вниз", + "CubesterYT/KeySimulation@_enter": "увійти", "CubesterYT/KeySimulation@_left": "ліву", "CubesterYT/KeySimulation@_left arrow": "стрілку ліворуч", "CubesterYT/KeySimulation@_middle": "середню", @@ -7737,26 +8628,140 @@ "CubesterYT/KeySimulation@_space": "пробіл", "CubesterYT/KeySimulation@_up arrow": "стрілку вгору", "CubesterYT/KeySimulation@_without waiting": "без очікування", + "CubesterYT/TurboHook@_name": "ім'я", "CubesterYT/WindowControls@_Window Controls": "Контроль Вікна", - "CubesterYT/WindowControls@_left": "ліву", - "CubesterYT/WindowControls@_right": "праву", + "CubesterYT/WindowControls@_bottom left": "зліва знизу", + "CubesterYT/WindowControls@_bottom right": "справа знизу", + "CubesterYT/WindowControls@_center": "центр", + "CubesterYT/WindowControls@_right": "право", + "CubesterYT/WindowControls@_top left": "зліва зверху", + "CubesterYT/WindowControls@_top right": "справа зверху", + "DNin/wake-lock@_Wake Lock": "Блокування Сонного Режиму", + "DNin/wake-lock@_is wake lock active?": "блокування сонного режиму увімкнено?", + "DNin/wake-lock@_off": "вимкнути", + "DNin/wake-lock@_on": "увімкнути", + "DNin/wake-lock@_turn wake lock [enabled]": "[enabled] блокування сонного режиму", "Lily/AllMenus@_All Menus": "Усі Меню", + "Lily/Assets@_Asset Manager": "Менеджер Ресурсів", + "Lily/Cast@_number": "число", + "Lily/ClonesPlus@_clone count": "кількість клонів", + "Lily/ClonesPlus@_is clone?": "клон?", "Lily/CommentBlocks@_Comment Blocks": "Блоки-Коментарі", + "Lily/ListTools@_List Tools": "Інструменти для Списків", + "Lily/ListTools@_random": "випадкове", + "Lily/LooksPlus@_brightness": "яскравість", + "Lily/LooksPlus@_color": "колір", + "Lily/LooksPlus@_fisheye": "риб'яче око", + "Lily/LooksPlus@_ghost": "привид", "Lily/LooksPlus@_height": "висота", + "Lily/LooksPlus@_mosaic": "мозаїка", + "Lily/LooksPlus@_pixelate": "пікселями", + "Lily/LooksPlus@_whirl": "закручування", "Lily/LooksPlus@_width": "ширина", + "Lily/MoreEvents@_More Events": "Більше Подій", + "Lily/MoreEvents@_after project saves": "після збереження проєкту", + "Lily/MoreEvents@_before project saves": "перед збереженням проєкту", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET]": "відправити [BROADCAST_OPTION] до [TARGET]", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET] and wait": "відправити [BROADCAST_OPTION] до [TARGET] і чекати", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET] with data [DATA]": "відправити [BROADCAST_OPTION] до [TARGET] з даними [DATA]", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] to [TARGET] with data [DATA] and wait": "відправити [BROADCAST_OPTION] до [TARGET] з даними [DATA] і чекати", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] with data [DATA]": "оповісти [BROADCAST_OPTION] з даними [DATA]", + "Lily/MoreEvents@_broadcast [BROADCAST_OPTION] with data [DATA] and wait": "оповісти [BROADCAST_OPTION] з даними [DATA] і чекати", + "Lily/MoreEvents@_every [DURATION] frames": "кожні [DURATION] кадрів", + "Lily/MoreEvents@_forever": "завжди", + "Lily/MoreEvents@_hit": "натиснуто", + "Lily/MoreEvents@_received data": "отримані дані", + "Lily/MoreEvents@_released": "відпущено", + "Lily/MoreEvents@_when [CONDITION] becomes [STATE]": "коли [CONDITION] стає [STATE]", + "Lily/MoreEvents@_when [INPUT] is changed": "коли [INPUT] змінено", + "Lily/MoreEvents@_when [KEY_OPTION] key [ACTION]": "коли [ACTION] клавішу [KEY_OPTION]", + "Lily/MoreEvents@_when [STOP] clicked": "коли [STOP] натиснуто", + "Lily/MoreEvents@_while [CONDITION] is [STATE]": "поки [CONDITION] є [STATE]", + "Lily/MoreEvents@_while [KEY_OPTION] key pressed": "поки клавішу [KEY_OPTION] натиснуто", "Lily/MoreTimers@_More Timers": "Більше Таймерів", + "Lily/Skins@_Skins": "Скіни", "Lily/Skins@_height": "висота", "Lily/Skins@_width": "ширина", "Lily/SoundExpanded@_Sound Expanded": "Звук+", "Lily/TempVariables2@_Temporary Variables": "Тимчасові Змінні", + "Lily/Video@_Video": "Відео", "Lily/Video@_height": "висота", "Lily/Video@_width": "ширина", + "Lily/lmsutils@_Are you sure you want to show legacy blocks? \n \n These blocks were removed because they were buggy or implemented better in other extensions.": "Ви впевнені що ви хочете увімкнути старі блоки? \n \n Ці блоки були прибрані, оскільки вони працювали нестабільно або були краще зроблені в інших розширеннях.", + "Lily/lmsutils@_Hide Legacy Blocks": "Приховати Старі Блоки", + "Lily/lmsutils@_Lily's Toolbox": "Інструменти Лілі", + "Lily/lmsutils@_Show Legacy Blocks": "Показати Старі Блоки", + "Lily/lmsutils@_[DROPDOWN] of user": "[DROPDOWN] користувача", + "Lily/lmsutils@_[STRING] to lowercase": "[STRING] малими буквами", + "Lily/lmsutils@_[STRING] to uppercase": "[STRING] великими буквами", + "Lily/lmsutils@_alert [STRING]": "пепередити [STRING]", + "Lily/lmsutils@_angle [ANGLE]": "кут [ANGLE]", + "Lily/lmsutils@_binary": "бінарно", + "Lily/lmsutils@_brightness": "яскравість", + "Lily/lmsutils@_browser": "браузер", + "Lily/lmsutils@_change variable [INPUTA] by [INPUTB]": "змінити змінну [INPUTA] на [INPUTB]", + "Lily/lmsutils@_clear console": "очистити консоль", "Lily/lmsutils@_clipboard": "буфер обміну", + "Lily/lmsutils@_clone count": "кількість клонів", + "Lily/lmsutils@_color": "колір", + "Lily/lmsutils@_color [COLOUR]": "колір [COLOUR]", + "Lily/lmsutils@_confirm [STRING]": "підтвердити [STRING]", + "Lily/lmsutils@_console [DROPDOWN] [INPUT]": "консоль [DROPDOWN] [INPUT]", + "Lily/lmsutils@_decode [STRING] from [DROPDOWN]": "розкодувати [STRING] з [DROPDOWN]", + "Lily/lmsutils@_delete all variables": "видалити всі змінні", + "Lily/lmsutils@_delete variable [INPUT]": "видалити змінну [INPUT]", + "Lily/lmsutils@_effect [INPUT]": "ефект [INPUT]", + "Lily/lmsutils@_encode [STRING] to [DROPDOWN]": "закодувати [STRING] у [DROPDOWN]", + "Lily/lmsutils@_fisheye": "роздуття", + "Lily/lmsutils@_ghost": "привид", + "Lily/lmsutils@_green flag": "натиснути на зелений прапорець", "Lily/lmsutils@_height": "висота", + "Lily/lmsutils@_if [BOOLEAN] then [INPUTA]": "якщо [BOOLEAN] то [INPUTA]", + "Lily/lmsutils@_if [BOOLEAN] then [INPUTA] else [INPUTB]": "якщо [BOOLEAN] то [INPUTA] інакше [INPUTB]", + "Lily/lmsutils@_index of [INPUTA] in [INPUTB]": "індекс [INPUTA] у [INPUTB]", + "Lily/lmsutils@_is clone?": "клон?", + "Lily/lmsutils@_is mobile?": "мобільний?", + "Lily/lmsutils@_item [INPUTA] of [INPUTB] split by [INPUTC]": "елемент [INPUTA] у [INPUTB] розділовий знак [INPUTC]", + "Lily/lmsutils@_key [KEY_OPTION] pressed?": "клавішу [KEY_OPTION] натиснуто?", + "Lily/lmsutils@_letters [INPUTA] to [INPUTB] of [STRING]": "символи від [INPUTA] до [INPUTB] у [STRING]", + "Lily/lmsutils@_list active variables": "список активних змінних", + "Lily/lmsutils@_lowercase": "малими буквами", + "Lily/lmsutils@_matrix [MATRIX]": "матриця [MATRIX]", + "Lily/lmsutils@_mosaic": "мозаїка", + "Lily/lmsutils@_newline character": "символ переносу строки", + "Lily/lmsutils@_normalise [INPUT]": "нормалізувати [INPUT]", + "Lily/lmsutils@_note [NOTE]": "нота [NOTE]", + "Lily/lmsutils@_number": "число", + "Lily/lmsutils@_open link [INPUT] in new tab": "відкрити [INPUT] у новій вкладці", + "Lily/lmsutils@_operating system": "операційна система", + "Lily/lmsutils@_pixelate": "пікселями", + "Lily/lmsutils@_project URL": "URL проєкту", + "Lily/lmsutils@_prompt [STRING]": "отримати [STRING]", + "Lily/lmsutils@_random": "випадкове", + "Lily/lmsutils@_redirect to link [INPUT]": "перенаправити за адресою [INPUT]", + "Lily/lmsutils@_replace SVG data for costume [INPUTA] with [INPUTB]": "замінити SVG дані образу [INPUTA] на [INPUTB]", + "Lily/lmsutils@_replace first [INPUTA] with [INPUTB] in [STRING]": "замінити перше [INPUTA] на [INPUTB] у [STRING]", + "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 variable [INPUTA] to [INPUTB]": "надати змінній [INPUTA] значення [INPUTB]", + "Lily/lmsutils@_sprite clicked?": "спрайт натиснуто?", "Lily/lmsutils@_text": "текст", + "Lily/lmsutils@_uppercase": "великими буквами", + "Lily/lmsutils@_variable [INPUT]": "змінна [INPUT]", + "Lily/lmsutils@_when [INPUT] is true": "коли [INPUT]", + "Lily/lmsutils@_when key [KEY_OPTION] pressed": "коли клавішу [KEY_OPTION] натиснуто", + "Lily/lmsutils@_whirl": "закручування", "Lily/lmsutils@_width": "ширина", + "Lily/lmsutils@_window [DROPDOWN]": "[DROPDOWN] вікна", + "Longboost/color_channels@_RGB Channels": "RGB Канали", + "Longboost/color_channels@_off": "вимкнути", + "Longboost/color_channels@_on": "увімкнути", + "NOname-awa/graphics2d@name": "Двохвимірна Графіка", "NOname-awa/more-comparisons@_More Comparisons": "Більше Порівнянь", "NexusKitten/controlcontrols@_Control Controls": "Контроль Кнопок Контролю", + "NexusKitten/controlcontrols@_green flag": "натиснути на зелений прапорець", "NexusKitten/moremotion@_More Motion": "Більше Рухів", "NexusKitten/moremotion@_change x: [X] y: [Y]": "змінити x: [X] y: [Y]", "NexusKitten/moremotion@_costume height": "висота образу", @@ -7773,12 +8778,28 @@ "NexusKitten/moremotion@_touching rectangle x1: [X1] y1: [Y1] x2: [X2] y2: [Y2]?": "торкається прямокутника x1: [X1] y1: [Y1] x2: [X2] y2: [Y2]?", "NexusKitten/moremotion@_touching x: [X] y: [Y]?": "торкається x: [X] y: [Y]?", "NexusKitten/moremotion@_width": "ширина", + "PwLDev/vibration@_Vibration": "Вібрація", + "SharkPool/Font-Manager@_Font Manager": "Менеджер Шрифтів", + "Skyhigh173/bigint@_Arithmetic": "Арифметичні", + "Skyhigh173/bigint@_BigInt": "Величезні Числа", + "Skyhigh173/bigint@_Logic": "Логічні", + "Skyhigh173/bigint@_[a] mod [b]": "остача [a] на [b]", + "TheShovel/CanvasEffects@_Canvas Effects": "Візуальні Ефекти", + "TheShovel/CanvasEffects@_brightness": "яскравість", "TheShovel/CustomStyles@_Custom Styles": "Свій Стиль", + "TheShovel/CustomStyles@_disabled": "вимкнути", "TheShovel/CustomStyles@_enabled": "увімкнено", + "Xeltalliv/clippingblending@_Clipping & Blending": "Обрізання та Змішування", "Xeltalliv/clippingblending@_height": "висота", + "Xeltalliv/clippingblending@_off": "вимкнути", + "Xeltalliv/clippingblending@_on": "увімкнути", "Xeltalliv/clippingblending@_width": "ширина", + "XeroName/Deltatime@_Delta Time": "Дельта Час", "XmerOriginals/closecontrol@_Ask Before Closing Tab": "Запит перед виходом", + "XmerOriginals/closecontrol@_disabled": "вимкнути", "XmerOriginals/closecontrol@_enabled": "увімкнено", + "ZXMushroom63/searchApi@_Search Params": "Параметри Пошуку", + "ZXMushroom63/searchApi@_name": "ім'я", "battery@_Battery": "Батарея", "clipboard@_Clipboard": "Буфер Обміну", "clipboard@_clipboard": "буфер обміну", @@ -7787,7 +8808,20 @@ "clipboard@_reset clipboard": "очистити буфер обміну", "clipboard@_when something is copied": "коли щось скопійовано", "clipboard@_when something is pasted": "коли щось вставлено", + "cs2627883/numericalencoding@_Hello!": "Привіт!", + "cs2627883/numericalencoding@_Numerical Encoding V1": "Числове Кодування 1.0", "cursor@_Mouse Cursor": "Вказівник Миші", + "cursor@_bottom left": "зліва знизу", + "cursor@_bottom right": "справа знизу", + "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@_top left": "зліва зверху", + "cursor@_top right": "справа зверху", + "cursor@_{size} (unreliable)": "{size} (ненадійно)", + "encoding@_Encoding": "Кодування", "files@_Accepted formats: {formats}": "Підтримувані формати: {formats}", "files@_Files": "Файли", "files@_Hello, world!": "Привіт, світ!", @@ -7801,34 +8835,147 @@ "files@_text": "текст", "gamejolt@_Close": "Закрити", "gamejolt@_Open": "Відкрити", + "gamejolt@_name": "ім'я", + "gamejolt@_off": "вимкнути", + "gamejolt@_on": "увімкнути", "gamejolt@_text": "текст", + "gamejolt@_type": "набирання", + "gamejolt@_username": "ім'я користувача", "gamepad@_Gamepad": "Геймпад", "gamepad@_any": "будь які", "iframe@_height": "висота", "iframe@_width": "ширина", "itchio@_Window": "Вікно", + "itchio@_name": "ім'я", + "lab/text@_# of lines": "кількість ліній", + "lab/text@_# of lines [WITH_WORD_WRAP]": "кількість ліній [WITH_WORD_WRAP]", "lab/text@_Animated Text": "Анімований Текст", - "lab/text@_left": "ліву", - "lab/text@_right": "праву", + "lab/text@_Enable Non-Scratch Lab Features": "Увімкнути Блоки Поза Scratch Lab", + "lab/text@_Hello!": "Привіт!", + "lab/text@_Here we go!": "Починаємо!", + "lab/text@_Incompatible with Scratch Lab:": "Несумісні із Scratch Lab:", + "lab/text@_Welcome to my project!": "Вітаємо у моєму проєкті!", + "lab/text@_[ANIMATE] duration": "тривалість [ANIMATE]", + "lab/text@_[ANIMATE] text [TEXT]": "[ANIMATE] текст [TEXT]", + "lab/text@_add line [TEXT]": "додати лінію [TEXT]", + "lab/text@_animate [ANIMATE] until done": "анімувати[ANIMATE] до кінця", + "lab/text@_center": "центр", + "lab/text@_displayed text": "показаний текст", + "lab/text@_is animating?": "анімується?", + "lab/text@_is showing text?": "показує текст?", + "lab/text@_left": "ліво", + "lab/text@_rainbow": "веселка", + "lab/text@_random font": "випадковий шрифт", + "lab/text@_reset [ANIMATE] duration": "скинути тривалість [ANIMATE]", + "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]": "встановити ширину [WIDTH] по [ALIGN]", + "lab/text@_show sprite": "показати спрайт", + "lab/text@_show text [TEXT]": "показати текст [TEXT]", + "lab/text@_start [ANIMATE] animation": "почати анімацію [ANIMATE]", + "lab/text@_text [ATTRIBUTE]": "[ATTRIBUTE] тексту", + "lab/text@_type": "набирання", + "lab/text@_typing delay": "затримка набирання", + "lab/text@_with word wrap": "з переносом слів", + "lab/text@_without word wrap": "без переносу слів", + "lab/text@_zoom": "зум", + "lab/text@disableCompatibilityMode": "Це додає нові блоки які НЕ ПРАЦЮВАТИМУТЬ на офіційній Scratch Lab.\n\nБажаєте продовжити?", + "local-storage@_Local Storage": "Локальне Сховище", "mdwalters/notifications@_Hello, world!": "Привіт, світ!", + "mdwalters/notifications@_Notification from project": "Сповіщення з проєкту", "mdwalters/notifications@_Notifications": "Сповіщення", + "mdwalters/notifications@_close notification": "приховати сповіщення", + "mdwalters/notifications@_create notification with text [text]": "надіслати сповіщення з текстом [text]", + "mdwalters/notifications@_has notification permission?": "може надсилати сповіщення?", + "mdwalters/notifications@_request notification permission": "надіслати запит на надсилання сповіщень", + "navigator@_browser": "браузер", + "navigator@_operating system": "операційна система", + "numerical-encoding-2@_Numerical Encoding V2": "Числове Кодування 2.0", + "obviousAlexC/SensingPlus@_brightness": "яскравість", + "obviousAlexC/SensingPlus@_color": "колір", + "obviousAlexC/SensingPlus@_fisheye": "риб'яче око", + "obviousAlexC/SensingPlus@_ghost": "привид", + "obviousAlexC/SensingPlus@_mosaic": "мозаїка", + "obviousAlexC/SensingPlus@_off": "вимкнути", + "obviousAlexC/SensingPlus@_on": "увімкнути", + "obviousAlexC/SensingPlus@_pixelate": "пікселями", "obviousAlexC/SensingPlus@_rotation style": "стиль обертання", + "obviousAlexC/SensingPlus@_whirl": "закручування", + "obviousAlexC/newgroundsIO@_username": "ім'я користувача", "obviousAlexC/penPlus@_Images": "Зображення", + "obviousAlexC/penPlus@_brightness": "яскравість", + "obviousAlexC/penPlus@_color": "колір", "obviousAlexC/penPlus@_height": "висота", + "obviousAlexC/penPlus@_off": "вимкнути", + "obviousAlexC/penPlus@_on": "увімкнути", "obviousAlexC/penPlus@_width": "ширина", "pointerlock@_disabled": "розблокувати", "pointerlock@_enabled": "заблокувати", "pointerlock@_pointer locked?": "вказівник заблоковано?", "pointerlock@_set pointer lock [enabled]": "[enabled] вказівник миші", "qxsck/var-and-list@name": "Змінні та Списки", + "runtime-options@_Infinity": "без меж", "runtime-options@_Runtime Options": "Параметри виконання", + "runtime-options@_[thing] enabled?": "[thing] увімкнено?", + "runtime-options@_clone limit": "макс. кількість клонів", + "runtime-options@_default ({n})": "за умовчанням ({n})", + "runtime-options@_disabled": "вимкнути", + "runtime-options@_enabled": "увімкнути", + "runtime-options@_framerate": "частота кадрів", + "runtime-options@_framerate limit": "макс. частота кадрів", "runtime-options@_height": "висота", + "runtime-options@_high quality pen": "перо високої якості", + "runtime-options@_interpolation": "інтерполяція", + "runtime-options@_remove fencing": "прибрати рамку", + "runtime-options@_remove misc limits": "прибрати різні обмеження", + "runtime-options@_run green flag [flag]": "натиснути на [flag]", + "runtime-options@_set [thing] to [enabled]": "[enabled] налаштування [thing]", + "runtime-options@_set clone limit to [limit]": "встановити макс. кількість клонів до [limit]", + "runtime-options@_set framerate limit to [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": "режим турбо", + "runtime-options@_username": "ім'я користувача", + "runtime-options@_when [WHAT] changed": "коли [WHAT] змінено", "runtime-options@_width": "ширина", + "shreder95ua/resolution@_Screen resolution": "Розширення Екрану", + "shreder95ua/resolution@_primary screen height": "висота головного екрану", + "shreder95ua/resolution@_primary screen width": "ширина головного екрану", "sound@_Sound": "Звуки", "sound@_play sound from url: [path] until done": "відтворити звук з url; [path] до кінця", "sound@_start sound from url: [path]": "відтворити звук з url; [path]", + "steamworks@_[TYPE] [ID] installed?": "[TYPE] [ID] встановлено?", + "steamworks@_achievement [ACHIEVEMENT] unlocked?": "досягнення [ACHIEVEMENT] отримано?", + "steamworks@_get user [THING]": "отримати [THING] користувача", + "steamworks@_has steamworks?": "має steamworks?", + "steamworks@_level": "рівень", + "steamworks@_name": "ім'я", + "steamworks@_set achievement [ACHIEVEMENT] unlocked to [STATUS]": "встановити статус досягнення [ACHIEVEMENT] \"отримано?\" до [STATUS]", + "stretch@_Stretch": "Розтяжка", "text@_Text": "Текст", + "text@_lowercase": "малими буквами", + "true-fantom/couplers@_angle [ANGLE]": "кут [ANGLE]", + "true-fantom/couplers@_color [COLOUR]": "колір [COLOUR]", + "true-fantom/couplers@_matrix [MATRIX]": "матриця [MATRIX]", + "true-fantom/couplers@_note [NOTE]": "нота [NOTE]", "true-fantom/math@_Math": "Математика", + "true-fantom/network@_browser": "браузер", + "veggiecan/browserfullscreen@_Browser Fullscreen": "Повноекранний Режим", + "veggiecan/browserfullscreen@_[ACTION] fullscreen": "[ACTION] повноекранний режим", + "veggiecan/browserfullscreen@_enter": "увімкнути", + "veggiecan/browserfullscreen@_entered": "увімкнено", + "veggiecan/browserfullscreen@_exit": "вимкнути", + "veggiecan/browserfullscreen@_exited": "вимкнено", + "veggiecan/browserfullscreen@_in browser fullscreen?": "на весь екран?", + "veggiecan/browserfullscreen@_when browser fullscreen [ENABLED]": "коли повноекранний режим [ENABLED]", "veggiecan/mobilekeyboard@_Mobile Keyboard": "Екранна Клавіатура" }, "vi": { @@ -7868,7 +9015,7 @@ "-SIPC-/time@_September": "九月", "-SIPC-/time@_Time": "时间", "-SIPC-/time@_[Timedata] from [timestamp]": "时间戳[timestamp]代表的[Timedata]", - "-SIPC-/time@_convert [time] to timestamp": "把时间[time]转换为时间戳", + "-SIPC-/time@_convert [time] to timestamp": "[time]对应的时间戳", "-SIPC-/time@_convert [timestamp] to YYYY-MM-DD HH:MM:SS": "把时间戳[timestamp]转换为年-月-日 时:分:秒", "-SIPC-/time@_current time zone": "时区", "-SIPC-/time@_current timestamp": "时间戳", @@ -7884,7 +9031,7 @@ "-SIPC-/time@_minutes": "分", "-SIPC-/time@_month": "月", "-SIPC-/time@_months": "月", - "-SIPC-/time@_number of days in [MONTH] [YEAR]": "[YEAR]年[MONTH]月有多少天", + "-SIPC-/time@_number of days in [MONTH] [YEAR]": "[YEAR]年[MONTH]月对应的天数", "-SIPC-/time@_rounded": "粗略", "-SIPC-/time@_second": "秒", "-SIPC-/time@_seconds": "秒", @@ -7902,11 +9049,11 @@ "0832/rxFS2@start": "新建 [STR]", "0832/rxFS2@sync": "将 [STR] 的位置改为 [STR2]", "0832/rxFS2@webin": "从网络加载 [STR]", - "Alestore/nfcwarp@_NFC not supported": "不支持NFC", - "Alestore/nfcwarp@_NFC supported?": "支持NFC?", + "Alestore/nfcwarp@_NFC not supported": "不支持 NFC", + "Alestore/nfcwarp@_NFC supported?": "支持 NFC?", "Alestore/nfcwarp@_NFCWarp": "NFC", - "Alestore/nfcwarp@_Only works in Chrome on Android": "只能在安卓的Chrome运行", - "Alestore/nfcwarp@_read NFC tag": "读取NFC标签", + "Alestore/nfcwarp@_Only works in Chrome on Android": "只能在 Android 上的 Chrome 浏览器运行", + "Alestore/nfcwarp@_read NFC tag": "读取 NFC 标签", "CST1229/images@_Images": "图片", "CST1229/images@_[QUERY] of image [IMG]": "图片[IMG]的[QUERY]", "CST1229/images@_bottom": "底部", @@ -7983,14 +9130,14 @@ "CubesterYT/KeySimulation@_escape": "Esc", "CubesterYT/KeySimulation@_home": "Home", "CubesterYT/KeySimulation@_insert": "Insert", - "CubesterYT/KeySimulation@_left": "居左", + "CubesterYT/KeySimulation@_left": "左键", "CubesterYT/KeySimulation@_left arrow": "←", "CubesterYT/KeySimulation@_middle": "中键", "CubesterYT/KeySimulation@_move mouse to x: [X] y: [Y]": "将鼠标移到 x: [X] y: [Y]", "CubesterYT/KeySimulation@_page down": "PageDown", "CubesterYT/KeySimulation@_page up": "PageUp", "CubesterYT/KeySimulation@_press [KEY] for [SECONDS] seconds [AND_WAIT]": "按下[KEY]键[SECONDS]秒并[AND_WAIT]", - "CubesterYT/KeySimulation@_right": "居右", + "CubesterYT/KeySimulation@_right": "右键", "CubesterYT/KeySimulation@_right arrow": "→", "CubesterYT/KeySimulation@_scroll lock": "ScrollLock", "CubesterYT/KeySimulation@_space": "空格", @@ -8001,8 +9148,8 @@ "CubesterYT/TurboHook@_name": "名字", "CubesterYT/TurboHook@_webhook data: [hookDATA] webhook url: [hookURL]": "数据:[hookDATA] URL:[hookURL]", "CubesterYT/WindowControls@_Hello World!": "你好世界!", - "CubesterYT/WindowControls@_May not work in normal browser tabs": "可能无法正常运行", - "CubesterYT/WindowControls@_Refer to Documentation for details": "具体信息参考文档", + "CubesterYT/WindowControls@_May not work in normal browser tabs": "可能无法在一般浏览器页面中正常运行", + "CubesterYT/WindowControls@_Refer to Documentation for details": "具体信息请参考文档", "CubesterYT/WindowControls@_Window Controls": "网页控制", "CubesterYT/WindowControls@_bottom": "底部", "CubesterYT/WindowControls@_bottom left": "底部左侧", @@ -8015,9 +9162,9 @@ "CubesterYT/WindowControls@_close window": "关闭窗口", "CubesterYT/WindowControls@_enter fullscreen": "进入全屏", "CubesterYT/WindowControls@_exit fullscreen": "退出全屏", - "CubesterYT/WindowControls@_is window focused?": "页面在被使用吗?", + "CubesterYT/WindowControls@_is window focused?": "页面得到焦点吗?", "CubesterYT/WindowControls@_is window fullscreen?": "页面全屏吗?", - "CubesterYT/WindowControls@_is window touching screen edge?": "页面接触到屏幕边缘吗?", + "CubesterYT/WindowControls@_is window touching screen edge?": "窗口碰到屏幕边缘吗?", "CubesterYT/WindowControls@_left": "居左", "CubesterYT/WindowControls@_match stage size": "匹配舞台大小", "CubesterYT/WindowControls@_move window to the [PRESETS]": "移动页面到[PRESETS]", @@ -8250,20 +9397,21 @@ "Lily/MoreTimers@_timer [TIMER]": "计时器[TIMER]", "Lily/MoreTimers@_timer [TIMER] exists?": "计时器[TIMER]存在?", "Lily/MoreTimers@_when timer [TIMER] [OP] [NUM]": "当计时器[TIMER][OP][NUM]", - "Lily/Skins@_[ATTRIBUTE] of skin [NAME]": "皮肤[NAME]的[ATTRIBUTE]", - "Lily/Skins@_create SVG skin [SVG] as [NAME]": "创建SVG皮肤[SVG]并命名为[NAME]", - "Lily/Skins@_current skin of [TARGET]": "[TARGET]的当前皮肤", - "Lily/Skins@_delete all skins": "删除所有皮肤", - "Lily/Skins@_delete skin [NAME]": "删除皮肤[NAME]", + "Lily/Skins@_Skins": "纹理", + "Lily/Skins@_[ATTRIBUTE] of skin [NAME]": "纹理[NAME]的[ATTRIBUTE]", + "Lily/Skins@_create SVG skin [SVG] as [NAME]": "创建SVG纹理[SVG]并命名为[NAME]", + "Lily/Skins@_current skin of [TARGET]": "[TARGET]的当前纹理", + "Lily/Skins@_delete all skins": "删除所有纹理", + "Lily/Skins@_delete skin [NAME]": "删除纹理[NAME]", "Lily/Skins@_height": "高度", - "Lily/Skins@_load skin from URL [URL] as [NAME]": "从URL[URL]加载皮肤并命名为[NAME]", - "Lily/Skins@_load skin from [COSTUME] as [NAME]": "从[COSTUME]加载皮肤并命名为[NAME]", - "Lily/Skins@_restore skin of [TARGET]": "恢复[TARGET]的皮肤为原造型", - "Lily/Skins@_restore targets with skin [NAME]": "恢复所有皮肤为[NAME]的角色造型", - "Lily/Skins@_set skin of [TARGET] to [NAME]": "将[TARGET]的皮肤设为[NAME]", - "Lily/Skins@_skin [NAME] is loaded?": "皮肤[NAME]已加载?", + "Lily/Skins@_load skin from URL [URL] as [NAME]": "从URL[URL]加载纹理并命名为[NAME]", + "Lily/Skins@_load skin from [COSTUME] as [NAME]": "从[COSTUME]加载纹理并命名为[NAME]", + "Lily/Skins@_restore skin of [TARGET]": "恢复[TARGET]的纹理为原造型", + "Lily/Skins@_restore targets with skin [NAME]": "恢复所有纹理为[NAME]的角色造型", + "Lily/Skins@_set skin of [TARGET] to [NAME]": "将[TARGET]的纹理设为[NAME]", + "Lily/Skins@_skin [NAME] is loaded?": "纹理[NAME]已加载?", "Lily/Skins@_width": "宽度", - "Lily/SoundExpanded@_Sound Expanded": "扩展声音积木", + "Lily/SoundExpanded@_Sound Expanded": "声音积木扩展", "Lily/SoundExpanded@_[ATTRIBUTE] of [SOUND]": "[SOUND]的[ATTRIBUTE]", "Lily/SoundExpanded@_[SOUND] is looping?": "[SOUND]正在循环播放?", "Lily/SoundExpanded@_change project volume by [VALUE]": "将作品音量增加[VALUE]", @@ -8271,7 +9419,7 @@ "Lily/SoundExpanded@_dataURI": "dataURL", "Lily/SoundExpanded@_effect [EFFECT] of [TARGET]": "[TARGET]的音效[EFFECT]", "Lily/SoundExpanded@_end looping [SOUND]": "停止循环播放[SOUND]", - "Lily/SoundExpanded@_length": "长度", + "Lily/SoundExpanded@_length": "时长", "Lily/SoundExpanded@_pan": "左右平衡", "Lily/SoundExpanded@_pause all sounds": "暂停所有声音", "Lily/SoundExpanded@_pitch": "音调", @@ -8290,20 +9438,20 @@ "Lily/SoundExpanded@_stop sound [SOUND]": "停止播放[SOUND]", "Lily/TempVariables2@_Runtime Variables": "临时变量", "Lily/TempVariables2@_Temporary Variables": "临时变量", - "Lily/TempVariables2@_Thread Variables": "局部变量", + "Lily/TempVariables2@_Thread Variables": "线程变量", "Lily/TempVariables2@_active runtime variables": "所有临时变量", - "Lily/TempVariables2@_active thread variables": "所有局部变量", + "Lily/TempVariables2@_active thread variables": "所有线程变量", "Lily/TempVariables2@_change runtime var [VAR] by [NUM]": "将临时变量[VAR]增加[NUM]", - "Lily/TempVariables2@_change thread var [VAR] by [NUM]": "将局部变量[VAR]增加[NUM]", + "Lily/TempVariables2@_change thread var [VAR] by [NUM]": "将线程变量[VAR]增加[NUM]", "Lily/TempVariables2@_delete all runtime variables": "删除所有临时变量", "Lily/TempVariables2@_delete runtime var [VAR]": "删除临时变量[VAR]", - "Lily/TempVariables2@_for [VAR] in [NUM]": "对于[NUM]中的每个局部变量[VAR]", + "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@_thread var [VAR]": "局部变量[VAR]", - "Lily/TempVariables2@_thread var [VAR] exists?": "局部变量[VAR]是否存在?", + "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": "视频", "Lily/Video@_[ATTRIBUTE] of video [NAME]": "视频[NAME]的[ATTRIBUTE]", "Lily/Video@_current time": "当前时间", @@ -9545,6 +10693,18 @@ "sound@_Sound": "声音", "sound@_play sound from url: [path] until done": "播放URL[path]的声音直到结束", "sound@_start sound from url: [path]": "播放URL[path]的声音", + "steamworks@_IP country": "IP 所属地", + "steamworks@_[TYPE] [ID] installed?": "[TYPE][ID]已安装?", + "steamworks@_achievement [ACHIEVEMENT] unlocked?": "成就[ACHIEVEMENT]已解锁?", + "steamworks@_false": "假", + "steamworks@_get user [THING]": "用户[THING]", + "steamworks@_has steamworks?": "连接了 Steamworks?", + "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@_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]", From 532daff2df707a4eebced9ee9d0ea7b702c5b78e Mon Sep 17 00:00:00 2001 From: SharkPool <139097378+SharkPool-SP@users.noreply.github.com> Date: Mon, 5 Aug 2024 17:50:50 -0700 Subject: [PATCH 16/50] Lily/Video: clamp volume, add screenshot at current time (#1595) Co-authored-by: Muffin --- extensions/Lily/Video.js | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/extensions/Lily/Video.js b/extensions/Lily/Video.js index 6bf719ff3d..c68eea7930 100644 --- a/extensions/Lily/Video.js +++ b/extensions/Lily/Video.js @@ -2,6 +2,7 @@ // ID: lmsVideo // Description: Play videos from URLs. // By: LilyMakesThings +// By: SharkPool // License: MIT AND LGPL-3.0 // Attribution is not required, but greatly appreciated. @@ -239,6 +240,19 @@ }, }, }, + { + opcode: "getFrame", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate( + "screenshot of video [NAME] at current time" + ), + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "my video", + }, + }, + }, "---", { opcode: "pause", @@ -466,6 +480,24 @@ } } + getFrame(args) { + const videoName = Cast.toString(args.NAME); + const videoSkin = this.videos[videoName]; + if (!videoSkin) return ""; + + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + if (!ctx) { + console.warn("2D rendering context not available"); + return ""; + } + + canvas.width = videoSkin.videoElement.videoWidth; + canvas.height = videoSkin.videoElement.videoHeight; + ctx.drawImage(videoSkin.videoElement, 0, 0); + return canvas.toDataURL(); + } + pause(args) { const videoName = Cast.toString(args.NAME); const videoSkin = this.videos[videoName]; @@ -500,7 +532,7 @@ const videoSkin = this.videos[videoName]; if (!videoSkin) return; - videoSkin.videoElement.volume = value / 100; + videoSkin.videoElement.volume = Math.min(1, Math.max(0, value / 100)); } /** @returns {VM.Target|undefined} */ From dfb5354d2d13062ce1a6f74c7e9f914e3a0f9dee Mon Sep 17 00:00:00 2001 From: Muffin Date: Mon, 5 Aug 2024 21:22:46 -0500 Subject: [PATCH 17/50] Lily/Video: playback rate (#1642) --- extensions/Lily/Video.js | 51 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/extensions/Lily/Video.js b/extensions/Lily/Video.js index c68eea7930..8050f21346 100644 --- a/extensions/Lily/Video.js +++ b/extensions/Lily/Video.js @@ -307,6 +307,23 @@ }, }, }, + { + opcode: "setPlaybackRate", + blockType: Scratch.BlockType.COMMAND, + text: Scratch.translate( + "set playback rate of video [NAME] to [RATE]" + ), + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "my video", + }, + RATE: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "2", + }, + }, + }, ], menus: { targets: { @@ -349,6 +366,10 @@ text: Scratch.translate("height"), value: "height", }, + { + text: Scratch.translate("playback rate"), + value: "playback rate", + }, ], }, }, @@ -475,6 +496,8 @@ return videoSkin.size[0]; case "height": return videoSkin.size[1]; + case "playback rate": + return videoSkin.videoElement.playbackRate; default: return 0; } @@ -492,9 +515,14 @@ return ""; } - canvas.width = videoSkin.videoElement.videoWidth; - canvas.height = videoSkin.videoElement.videoHeight; - ctx.drawImage(videoSkin.videoElement, 0, 0); + const videoElement = videoSkin.videoElement; + if (videoElement.videoWidth === 0 || videoElement.videoHeight === 0) { + return ""; + } + + canvas.width = videoElement.videoWidth; + canvas.height = videoElement.videoHeight; + ctx.drawImage(videoElement, 0, 0); return canvas.toDataURL(); } @@ -528,13 +556,28 @@ setVolume(args) { const videoName = Cast.toString(args.NAME); - const value = Cast.toNumber(args.VALUE); const videoSkin = this.videos[videoName]; if (!videoSkin) return; + const value = Cast.toNumber(args.VALUE); videoSkin.videoElement.volume = Math.min(1, Math.max(0, value / 100)); } + setPlaybackRate(args) { + const videoName = Cast.toString(args.NAME); + const videoSkin = this.videos[videoName]; + if (!videoSkin) return; + + try { + const value = Cast.toNumber(args.RATE); + // Supposedly negative values will work in Safari but people probably shouldn't rely + // on that since others don't. + videoSkin.videoElement.playbackRate = Math.max(0, value); + } catch (e) { + console.warn(e); + } + } + /** @returns {VM.Target|undefined} */ _getTargetFromMenu(targetName, util) { if (targetName === "_myself_") return util.target; From 23e5c1a1ff01db0e827ff2fad7890ac99e5a95cd Mon Sep 17 00:00:00 2001 From: Muffin Date: Tue, 6 Aug 2024 16:44:35 -0500 Subject: [PATCH 18/50] Lily/Assets: fix addCostume corruption (#1643) --- extensions/Lily/Assets.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/Lily/Assets.js b/extensions/Lily/Assets.js index ef96fc1563..282a910fc8 100644 --- a/extensions/Lily/Assets.js +++ b/extensions/Lily/Assets.js @@ -362,8 +362,14 @@ const assetType = this._typeIsBitmap(blob.type) ? runtime.storage.AssetType.ImageBitmap : runtime.storage.AssetType.ImageVector; + + // Bitmap data format is not actually enforced, but setting it to something that isn't in scratch-parser's + // known format list will throw an error when someone tries to load the project. + // (https://github.com/scratchfoundation/scratch-parser/blob/665f05d739a202d565a4af70a201909393d456b2/lib/sb3_definitions.json#L51) const dataType = - blob.type === "image/svg+xml" ? "svg" : blob.type.split("/")[1]; + blob.type === "image/svg+xml" + ? runtime.storage.DataFormat.SVG + : runtime.storage.DataFormat.PNG; const arrayBuffer = await new Promise((resolve, reject) => { const fr = new FileReader(); From 5499be00481fe997593935247f1e28499ac17c1a Mon Sep 17 00:00:00 2001 From: SharkPool <139097378+SharkPool-SP@users.noreply.github.com> Date: Fri, 9 Aug 2024 18:36:28 -0700 Subject: [PATCH 19/50] vercte/dictionaries: Always Cast Keys to Strings (#1644) --- extensions/vercte/dictionaries.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/vercte/dictionaries.js b/extensions/vercte/dictionaries.js index ad60a2da13..83cedcd972 100644 --- a/extensions/vercte/dictionaries.js +++ b/extensions/vercte/dictionaries.js @@ -162,6 +162,7 @@ dict_get({ KEY, DICT }) { if (!dictionaries.get(DICT)) return "null"; + KEY = Scratch.Cast.toString(KEY); let dict = dictionaries.get(DICT); let value = dict.get(KEY); if ( @@ -180,6 +181,7 @@ dict_property_defined({ KEY, DICT }) { if (!dictionaries.get(DICT)) return false; let dict = dictionaries.get(DICT); + KEY = Scratch.Cast.toString(KEY); return dict.get(KEY) === undefined ? false : true; } @@ -194,6 +196,7 @@ dictionaries.set(DICT, new Map()); } let dict = dictionaries.get(DICT); + KEY = Scratch.Cast.toString(KEY); dict.set(KEY, VAL); } @@ -202,6 +205,7 @@ dictionaries.set(DICT, new Map()); } let dict = dictionaries.get(DICT); + KEY = Scratch.Cast.toString(KEY); if (isNaN(+dict.get(KEY))) dict.set(KEY, 0); dict.set(KEY, dict.get(KEY) + BY); } @@ -212,6 +216,7 @@ dict_delete_key({ KEY, DICT }) { if (dictionaries.has(DICT)) { + KEY = Scratch.Cast.toString(KEY); dictionaries.get(DICT).delete(KEY); } } From d228f608875a496b62caa480aff8aa582e01cc54 Mon Sep 17 00:00:00 2001 From: mybearworld <130385691+mybearworld@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:24:54 +0200 Subject: [PATCH 20/50] mbw/xml: fix bugs, add inner HTML blocks (#1647) Fixes type error in setTextContent Makes querySelector related blocks also be able to get their parent - e.g. querying a on will return the expected result Adds "inner elements of" and "set inner elements of" blocks for interacting with innerHTML --- extensions/mbw/xml.js | 86 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/extensions/mbw/xml.js b/extensions/mbw/xml.js index 38ca185ebc..52950eca70 100644 --- a/extensions/mbw/xml.js +++ b/extensions/mbw/xml.js @@ -28,6 +28,24 @@ xmlToString(element) { return element.outerHTML; } + /** + * @param {Element} element + * @param {string} query + */ + resolveQuery(element, query) { + return element.matches(query) ? element : element.querySelector(query); + } + /** + * @param {Element} element + * @param {string} query + */ + resolveQueryAll(element, query) { + const response = [...element.querySelectorAll(query)]; + if (element.matches(query)) { + response.unshift(element); + } + return response; + } /** @returns {Scratch.Info} */ getInfo() { @@ -100,6 +118,32 @@ }, }, }, + { + opcode: "innerHTML", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("inner elements of [XML]"), + arguments: { + XML: { + type: Scratch.ArgumentType.STRING, + defaultValue: '', + }, + }, + }, + { + opcode: "setInnerHTML", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("set inner elements of [XML] to [VALUE]"), + arguments: { + XML: { + type: Scratch.ArgumentType.STRING, + defaultValue: '', + }, + VALUE: { + type: Scratch.ArgumentType.STRING, + defaultValue: '', + }, + }, + }, "---", { opcode: "attributes", @@ -367,7 +411,41 @@ if (xml === null) { return ""; } - xml.textContent = VALUE; + xml.textContent = Scratch.Cast.toString(VALUE); + return this.xmlToString(xml); + } + + /** + * @param {object} args + * @param {unknown} args.XML + */ + innerHTML({ XML }) { + const { xml } = this.stringToXml(Scratch.Cast.toString(XML)); + if (xml === null) { + return ""; + } + return xml.innerHTML; + } + + /** + * @param {object} args + * @param {unknown} args.XML + * @param {unknown} args.VALUE + */ + setInnerHTML({ XML, VALUE }) { + const { xml } = this.stringToXml(Scratch.Cast.toString(XML)); + if (xml === null) { + return ""; + } + const value = Scratch.Cast.toString(VALUE); + // there needs to be exactly one parent element + const { xml: newXML } = this.stringToXml( + "" + value + "" + ); + if (newXML === null) { + return ""; + } + xml.innerHTML = Scratch.Cast.toString(value); return this.xmlToString(xml); } @@ -544,7 +622,7 @@ if (xml === null) { return ""; } - const child = xml.querySelector(Scratch.Cast.toString(QUERY)); + const child = this.resolveQuery(xml, Scratch.Cast.toString(QUERY)); return child !== null; } @@ -558,7 +636,7 @@ if (xml === null) { return ""; } - const child = xml.querySelector(Scratch.Cast.toString(QUERY)); + const child = this.resolveQuery(xml, Scratch.Cast.toString(QUERY)); if (child === null) { return ""; } @@ -574,7 +652,7 @@ if (xml === null) { return ""; } - const child = xml.querySelectorAll(Scratch.Cast.toString(QUERY)); + const child = this.resolveQueryAll(xml, Scratch.Cast.toString(QUERY)); if (child.length === 0) { return ""; } From ba73df3620b33d10b0b10823918a3d0902aceae4 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 16 Aug 2024 22:58:10 -0400 Subject: [PATCH 21/50] Attempt to fix prettier format --- extensions/MasterMath/midi.js | 115 +++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 6da3f7cd5c..e8424672bc 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -4,12 +4,12 @@ // By: -MasterMath- // License: MPL-2.0 -(function(Scratch) { - 'use strict'; +(function (Scratch) { + "use strict"; if (!Scratch.extensions.unsandboxed) { - alert('This MIDI extension must run unsandboxed!'); - throw new Error('This MIDI extension must run unsandboxed!'); + alert("This MIDI extension must run unsandboxed!"); + throw new Error("This MIDI extension must run unsandboxed!"); } let midiInputDevices = []; @@ -21,33 +21,43 @@ if (navigator.requestMIDIAccess) { navigator.requestMIDIAccess().then(onSuccess, onError); - + function onSuccess(midiAccess) { midiAccess.onstatechange = (event) => { if (event.port.state == "connected") { - midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); + midiInputDevices.push([ + `[id: "${event.port.id}"` + ` name: "${event.port.name}"]`, + ]); midiDeviceInfo.push([event.port.id, event.port.name]); } else if (event.port.state == "disconnected") { - midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); + midiInputDevices.splice( + [`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], + 1, + ); midiDeviceInfo.splice([event.port.id, event.port.name]); } }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; - const command = status & 0xF0; + const command = status & 0xf0; if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); lastNotePressed = note; - Scratch.vm.runtime.startHats('midi_whenNotePressed'); + Scratch.vm.runtime.startHats("midi_whenNotePressed"); } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { lastNoteReleased = note; notesOn.splice(notesOn.indexOf(note), 1); - noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); - Scratch.vm.runtime.startHats('midi_whenNoteReleased'); + noteVelocities.splice( + noteVelocities.findIndex((subArray) => subArray[0] === note), + 1, + ); + Scratch.vm.runtime.startHats("midi_whenNoteReleased"); } else { - console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); + console.log( + `Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`, + ); } } @@ -60,7 +70,6 @@ alert("MIDI Access Error:", err); throw new Error("MIDI Access Error:", err); } - } else { alert("MIDI is not supported on this browser."); throw new Error("MIDI is not supported on this browser."); @@ -69,93 +78,93 @@ class MIDI { getInfo() { return { - id: 'midi', - name: 'MIDI', + id: "midi", + name: "MIDI", blocks: [ { - opcode: 'MIDIinputDevices', + opcode: "MIDIinputDevices", blockType: Scratch.BlockType.REPORTER, - text: 'connected MIDI input devices', + text: "connected MIDI input devices", disableMonitor: true, }, { - opcode: 'midiDeviceInfo', + opcode: "midiDeviceInfo", blockType: Scratch.BlockType.REPORTER, - text: '[info] of MIDI device [number]', + text: "[info] of MIDI device [number]", arguments: { info: { type: Scratch.ArgumentType.STRING, - defaultValue: 'name', - menu: 'infoMenu', + defaultValue: "name", + menu: "infoMenu", }, number: { type: Scratch.ArgumentType.NUMBER, defaultValue: 0, - } - } + }, + }, }, - '---', + "---", { - opcode: 'whenNotePressed', + opcode: "whenNotePressed", blockType: Scratch.BlockType.EVENT, - text: 'when any note pressed', + text: "when any note pressed", isEdgeActivated: false, shouldRestartExistingThreads: true, }, { - opcode: 'whenNoteReleased', + opcode: "whenNoteReleased", blockType: Scratch.BlockType.EVENT, - text: 'when any note released', + text: "when any note released", isEdgeActivated: false, shouldRestartExistingThreads: true, }, { - opcode: 'noteOn', + opcode: "noteOn", blockType: Scratch.BlockType.BOOLEAN, - text: 'is note [note] on?', + text: "is note [note] on?", arguments: { note: { type: Scratch.ArgumentType.NOTE, defaultValue: 60, - } - } + }, + }, }, { - opcode: 'noteVelocity', + opcode: "noteVelocity", blockType: Scratch.BlockType.REPORTER, - text: 'velocity of note [note]', + text: "velocity of note [note]", arguments: { note: { type: Scratch.ArgumentType.NOTE, defaultValue: 60, - } - } + }, + }, }, { - opcode: 'activeNotes', + opcode: "activeNotes", blockType: Scratch.BlockType.REPORTER, - text: 'all active notes', + text: "all active notes", disableMonitor: true, }, { - opcode: 'lastNotePressed', + opcode: "lastNotePressed", blockType: Scratch.BlockType.REPORTER, - text: 'last note pressed', + text: "last note pressed", disableMonitor: true, }, { - opcode: 'lastNoteReleased', + opcode: "lastNoteReleased", blockType: Scratch.BlockType.REPORTER, - text: 'last note released', + text: "last note released", disableMonitor: true, - } + }, ], menus: { infoMenu: { acceptReporters: false, - items: ["name", "id"] - } - } + items: ["name", "id"], + }, + }, }; } @@ -165,7 +174,7 @@ midiDeviceInfo(args) { if (midiInputDevices[args.number] != null) { - return midiDeviceInfo[args.number][(args.info == "id") ? 0 : 1]; + return midiDeviceInfo[args.number][args.info == "id" ? 0 : 1]; } else { return; } @@ -176,8 +185,12 @@ } noteVelocity(args) { - if (notesOn.includes(args.note) && noteVelocities.find(subArray => subArray[0] === args.note)[1] !== undefined) { - return noteVelocities.find(subArray => subArray[0] === args.note)[1]; + if ( + notesOn.includes(args.note) && + noteVelocities.find((subArray) => subArray[0] === args.note)[1] !== + undefined + ) { + return noteVelocities.find((subArray) => subArray[0] === args.note)[1]; } } @@ -187,11 +200,11 @@ lastNotePressed() { return lastNotePressed; - } + } lastNoteReleased() { return lastNoteReleased; - } + } } Scratch.extensions.register(new MIDI()); From ee344833fd245788c3a08d81db316fb1c79a9869 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:51:32 -0500 Subject: [PATCH 22/50] build(deps-dev): bump eslint from 9.8.0 to 9.9.0 (#1646) --- package-lock.json | 24 ++++++++++++++++-------- package.json | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1dcae04328..f9c8629580 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.8.0", + "eslint": "^9.9.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", @@ -127,9 +127,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", - "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", + "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -668,16 +668,16 @@ } }, "node_modules/eslint": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", - "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", + "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.17.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.8.0", + "@eslint/js": "9.9.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -716,6 +716,14 @@ }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { diff --git a/package.json b/package.json index d834120e37..a8a157a933 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.8.0", + "eslint": "^9.9.0", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", From 9edfed5e340847c61521ce9e9cbe72190553fb6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:51:51 -0500 Subject: [PATCH 23/50] build(deps): bump adm-zip from 0.5.14 to 0.5.15 (#1645) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9c8629580..ee20e935f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@turbowarp/json": "^0.1.2", "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", - "adm-zip": "^0.5.14", + "adm-zip": "^0.5.15", "chokidar": "^3.6.0", "ejs": "^3.1.10", "express": "^4.19.2", @@ -255,9 +255,9 @@ } }, "node_modules/adm-zip": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", - "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.15.tgz", + "integrity": "sha512-jYPWSeOA8EFoZnucrKCNihqBjoEGQSU4HKgHYQgKNEQ0pQF9a/DYuo/+fAxY76k4qe75LUlLWpAM1QWcBMTOKw==", "engines": { "node": ">=12.0" } diff --git a/package.json b/package.json index a8a157a933..3297135c3b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@turbowarp/json": "^0.1.2", "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", - "adm-zip": "^0.5.14", + "adm-zip": "^0.5.15", "chokidar": "^3.6.0", "ejs": "^3.1.10", "express": "^4.19.2", From 263033ce389345568801e55a38018fdf42337379 Mon Sep 17 00:00:00 2001 From: Xeltalliv <90340988+Xeltalliv@users.noreply.github.com> Date: Thu, 22 Aug 2024 02:03:34 +0300 Subject: [PATCH 24/50] Xeltalliv/clippingblending: Fix compatibility with instanced pen rendering (#1653) --- extensions/Xeltalliv/clippingblending.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/Xeltalliv/clippingblending.js b/extensions/Xeltalliv/clippingblending.js index 526b2cae7e..3f740de6f8 100644 --- a/extensions/Xeltalliv/clippingblending.js +++ b/extensions/Xeltalliv/clippingblending.js @@ -220,7 +220,8 @@ clipbox.x_max != lastClipbox.x_max || clipbox.y_max != lastClipbox.y_max)) ) { - if (skin.a_lineColorIndex) { + if (skin.attribute_index || skin.a_lineColorIndex) { + // Supporting both before and after https://github.com/TurboWarp/scratch-render/pull/11 skin._flushLines(); } lastTarget = target; From f0d4e9e81cb43fcdc3c2b1488cda16dddfe59c92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 01:48:12 -0500 Subject: [PATCH 25/50] build(deps-dev): bump eslint from 9.9.0 to 9.9.1 (#1659) --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index ee20e935f5..849888a6d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.9.0", + "eslint": "^9.9.1", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", @@ -61,9 +61,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "dependencies": { "@eslint/object-schema": "^2.1.4", @@ -127,9 +127,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", - "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", + "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -668,16 +668,16 @@ } }, "node_modules/eslint": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", - "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", + "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", + "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.0", + "@eslint/js": "9.9.1", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", diff --git a/package.json b/package.json index 3297135c3b..9b4645d4b6 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "markdown-it": "^14.1.0" }, "devDependencies": { - "eslint": "^9.9.0", + "eslint": "^9.9.1", "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.3.3", From 26466076d4b1d14b6ca4aaac522beaf52dec66c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:18:48 -0500 Subject: [PATCH 26/50] build(deps): bump adm-zip from 0.5.15 to 0.5.16 (#1668) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 849888a6d9..a7af031eab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@turbowarp/json": "^0.1.2", "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", - "adm-zip": "^0.5.15", + "adm-zip": "^0.5.16", "chokidar": "^3.6.0", "ejs": "^3.1.10", "express": "^4.19.2", @@ -255,9 +255,9 @@ } }, "node_modules/adm-zip": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.15.tgz", - "integrity": "sha512-jYPWSeOA8EFoZnucrKCNihqBjoEGQSU4HKgHYQgKNEQ0pQF9a/DYuo/+fAxY76k4qe75LUlLWpAM1QWcBMTOKw==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "engines": { "node": ">=12.0" } diff --git a/package.json b/package.json index 9b4645d4b6..1aafcc0bbe 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@turbowarp/json": "^0.1.2", "@turbowarp/scratchblocks": "^3.6.5", "@turbowarp/types": "git+https://github.com/TurboWarp/types-tw.git#tw", - "adm-zip": "^0.5.15", + "adm-zip": "^0.5.16", "chokidar": "^3.6.0", "ejs": "^3.1.10", "express": "^4.19.2", From 8f81856e3d76030e24d5d47462d9b0d07e162e99 Mon Sep 17 00:00:00 2001 From: Muffin Date: Sat, 7 Sep 2024 17:55:13 -0500 Subject: [PATCH 27/50] veggiecan/LongmanDictionary: fix all defs returning array instead of string (#1677) fix https://github.com/TurboWarp/extensions/issues/1676 --- extensions/veggiecan/LongmanDictionary.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/veggiecan/LongmanDictionary.js b/extensions/veggiecan/LongmanDictionary.js index 5745a727a2..a79900d8b4 100644 --- a/extensions/veggiecan/LongmanDictionary.js +++ b/extensions/veggiecan/LongmanDictionary.js @@ -82,9 +82,9 @@ const parser = new DOMParser(); const htmlDocument = parser.parseFromString(text, "text/html"); const definitionElements = htmlDocument.querySelectorAll(".DEF"); - const definitions = Array.from(definitionElements).map( - (element) => element.textContent - ); + const definitions = Array.from(definitionElements) + .map((element) => element.textContent.trim()) + .join(", "); return definitions; }) .catch((error) => { From 2ad97a94bef7afbcb0416f046cdba5d984117dd5 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 13 Sep 2024 20:41:43 -0400 Subject: [PATCH 28/50] Fix format From f1f30a27cb951a17600f73e5424f89bfe9ab151d Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 13 Sep 2024 21:08:07 -0400 Subject: [PATCH 29/50] Fix format again? From a83405803fe28a940c6b3998992a76c916f7655c Mon Sep 17 00:00:00 2001 From: Muffin Date: Fri, 20 Sep 2024 00:35:04 -0500 Subject: [PATCH 30/50] Lily/Video: fix videos rendering as pure black (#1692) by appending them into the DOM in a place that doesn't have display: none; seems to fix https://github.com/TurboWarp/scratch-render/issues/12 --- extensions/Lily/Video.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/extensions/Lily/Video.js b/extensions/Lily/Video.js index 8050f21346..879625c06a 100644 --- a/extensions/Lily/Video.js +++ b/extensions/Lily/Video.js @@ -15,6 +15,21 @@ const renderer = vm.renderer; const Cast = Scratch.Cast; + // In some versions of Chrome, it seems that trying to render a
These extensions are not compatible with Scratch.
- Projects that use these extensions can't be uploaded to the Scratch website. - They can, however, be used in
the packager. + Projects that use these extensions can't be opened in Scratch or uploaded to the Scratch website. + They can still be used in the TurboWarp packager.
Some extensions may not work in TurboWarp Desktop.
- For compatibility, security, and offline support, each TurboWarp Desktop update contains an offline copy of these extensions from its release date, so some extensions may be outdated or missing. - Use the latest update for best results. + To make sure extensions work offline, each release of TurboWarp Desktop comes with a copy of these extensions as of its release date, so some extensions may be outdated or missing. + Update to the latest version for the best results.
From 3cc3b2c718b221e99304ed486792fd6ddc4416b0 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:29:28 -0400 Subject: [PATCH 37/50] Update extensions.json Add "MasterMath/midi" --- extensions/extensions.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/extensions.json b/extensions/extensions.json index 9027c00ac9..fcd3059360 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -31,6 +31,7 @@ "Lily/LooksPlus", "Lily/MoreEvents", "Lily/ListTools", + "MasterMath/midi", "veggiecan/mobilekeyboard", "NexusKitten/moremotion", "CubesterYT/WindowControls", From db0a95b9573533f510dc93f077e199cdcf3f83ad Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:31:54 -0400 Subject: [PATCH 38/50] Create midi.js --- extensions/MasterMath/midi.js | 199 ++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 extensions/MasterMath/midi.js diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js new file mode 100644 index 0000000000..837a976017 --- /dev/null +++ b/extensions/MasterMath/midi.js @@ -0,0 +1,199 @@ +// Name: MIDI +// ID: midi +// Description: An extension that retrieves input from MIDI devices. +// By: -MasterMath- +// License: MPL-2.0 + +(function(Scratch) { + 'use strict'; + + if (!Scratch.extensions.unsandboxed) { + alert('This MIDI extension must run unsandboxed!'); + throw new Error('This MIDI extension must run unsandboxed!'); + } + + let midiInputDevices = []; + let midiDeviceInfo = []; + let notesOn = []; + let noteVelocities = []; + let lastNotePressed = 0; + let lastNoteReleased = 0; + + if (navigator.requestMIDIAccess) { + navigator.requestMIDIAccess().then(onSuccess, onError); + + function onSuccess(midiAccess) { + //List connected midi input devices + for (const entry of midiAccess.inputs) { + const input = entry[1]; + midiInputDevices.push([`[id: "${input.id}"` + ` name: "${input.name}"]`]); + midiDeviceInfo.push([input.id, input.name]); + } + + function onMIDIMessage(event) { + const [status, note, velocity] = event.data; + const command = status & 0xF0; + + if (command === 0x90 && velocity > 0) { + notesOn.push(note); + noteVelocities.push([note, velocity]); + + lastNotePressed = note; + + Scratch.vm.runtime.startHats('midi_whenNotePressed'); + } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { + notesOn.splice(notesOn.indexOf(note), 1); + noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); + + lastNoteReleased = note; + + Scratch.vm.runtime.startHats('midi_whenNoteReleased'); + } else { + console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); + } + } + + midiAccess.inputs.forEach((entry) => { + entry.onmidimessage = onMIDIMessage; + }); + } + + function onError(err) { + alert("MIDI Access Error:", err); + throw new Error("MIDI Access Error:", err); + } + + } else { + alert("MIDI is not supported on this browser."); + throw new Error("MIDI is not supported on this browser."); + } + + class MIDI { + getInfo() { + return { + id: 'midi', + name: 'MIDI', + blocks: [ + { + opcode: 'MIDIinputDevices', + blockType: Scratch.BlockType.REPORTER, + text: 'connected MIDI input devices', + disableMonitor: true, + }, + { + opcode: 'midiDeviceInfo', + blockType: Scratch.BlockType.REPORTER, + text: '[info] of MIDI device [number]', + arguments: { + info: { + type: Scratch.ArgumentType.STRING, + defaultValue: 'name', + menu: 'infoMenu', + }, + number: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0, + } + } + }, + { + opcode: 'whenNotePressed', + blockType: Scratch.BlockType.EVENT, + text: 'when any note pressed', + isEdgeActivated: false, + shouldRestartExistingThreads: true, + }, + { + opcode: 'whenNoteReleased', + blockType: Scratch.BlockType.EVENT, + text: 'when any note released', + isEdgeActivated: false, + shouldRestartExistingThreads: true, + }, + { + opcode: 'noteOn', + blockType: Scratch.BlockType.BOOLEAN, + text: 'is note [note] on?', + arguments: { + note: { + type: Scratch.ArgumentType.NOTE, + defaultValue: 60, + } + } + }, + { + opcode: 'noteVelocity', + blockType: Scratch.BlockType.REPORTER, + text: 'velocity of note [note]', + arguments: { + note: { + type: Scratch.ArgumentType.NOTE, + defaultValue: 60, + } + } + }, + { + opcode: 'activeNotes', + blockType: Scratch.BlockType.REPORTER, + text: 'all active notes', + disableMonitor: true, + }, + { + opcode: 'lastNotePressed', + blockType: Scratch.BlockType.REPORTER, + text: 'last note pressed', + disableMonitor: true, + }, + { + opcode: 'lastNoteReleased', + blockType: Scratch.BlockType.REPORTER, + text: 'last note released', + disableMonitor: true, + } + ], + menus: { + infoMenu: { + acceptReporters: false, + items: ["name", "id"] + } + } + }; + } + + MIDIinputDevices() { + return midiInputDevices; + } + + midiDeviceInfo(args) { + if (midiInputDevices[args.number] != null) { + return midiDeviceInfo[args.number][(args.info == "id") ? 0 : 1]; + } else { + return; + } + } + + noteOn(args) { + return notesOn.includes(args.note); + } + + noteVelocity(args) { + if (notesOn.includes(args.note) && noteVelocities.find(subArray => subArray[0] === args.note)[1] !== undefined) { + return noteVelocities.find(subArray => subArray[0] === args.note)[1]; + } + } + + activeNotes() { + return notesOn; + } + + lastNotePressed() { + return lastNotePressed; + } + + lastNoteReleased() { + return lastNoteReleased; + } + } + + Scratch.extensions.register(new MIDI()); +})(Scratch); From b7a979ea0cf65879dd1846b0d33a19f635501d23 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:36:49 -0400 Subject: [PATCH 39/50] Create midi.svg --- images/MasterMath/midi.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/MasterMath/midi.svg diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/images/MasterMath/midi.svg @@ -0,0 +1 @@ + From b612c452d9073d61118d54d9bdfe9e3e44981b28 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:37:14 -0400 Subject: [PATCH 40/50] Add midi.svg --- images/MasterMath/midi.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg index 8b13789179..6b839de214 100644 --- a/images/MasterMath/midi.svg +++ b/images/MasterMath/midi.svg @@ -1 +1 @@ - + \ No newline at end of file From 70fcbd7797bf55a27a7a21f5e6837e6b48bbd7d7 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:38:57 -0400 Subject: [PATCH 41/50] Delete images/MasterMath/midi.svg --- images/MasterMath/midi.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 images/MasterMath/midi.svg diff --git a/images/MasterMath/midi.svg b/images/MasterMath/midi.svg deleted file mode 100644 index 6b839de214..0000000000 --- a/images/MasterMath/midi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 4bb421dc15f054ab278005347e454be4a293aed4 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:39:58 -0400 Subject: [PATCH 42/50] Create midi.png --- images/MasterMath/midi.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/MasterMath/midi.png diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/images/MasterMath/midi.png @@ -0,0 +1 @@ + From 73d77f829943bcadcb67c726cee4a2a3d236a387 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:40:15 -0400 Subject: [PATCH 43/50] Add midi.png --- images/MasterMath/midi.png | Bin 1 -> 13564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..af6a75107eedf596f9c4cc327b3cffacef53e798 100644 GIT binary patch literal 13564 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 AO8@`> literal 1 Icmd-A000XB3jhEB From f07a7bba540f18bf648ad3c9f0737c13b5feb666 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 07:49:13 -0400 Subject: [PATCH 44/50] Update midi.png --- images/MasterMath/midi.png | Bin 13564 -> 13976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/MasterMath/midi.png b/images/MasterMath/midi.png index af6a75107eedf596f9c4cc327b3cffacef53e798..f2f610e632abdf41cd19caddfe673c3616f0bc06 100644 GIT binary patch literal 13976 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 literal 13564 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 AO8@`> From 517f1ddfbabae3ba779fdb143abe5df48c98535c Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 10:50:44 -0400 Subject: [PATCH 45/50] Update midi.js - Add event listener to detect when a MIDI device is connected or disconnected and update arrays accordingly instead of only when the extension loads - Fix "last note released" not returning the right values/not working --- extensions/MasterMath/midi.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 837a976017..cd02cfa2bf 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -23,12 +23,17 @@ navigator.requestMIDIAccess().then(onSuccess, onError); function onSuccess(midiAccess) { - //List connected midi input devices - for (const entry of midiAccess.inputs) { - const input = entry[1]; - midiInputDevices.push([`[id: "${input.id}"` + ` name: "${input.name}"]`]); - midiDeviceInfo.push([input.id, input.name]); - } + + midiAccess.onstatechange = (event) => { + if (event.port.state == "connected") { + midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); + midiDeviceInfo.push([event.port.id, event.port.name]); + } else if (event.port.state == "disconnected") { + midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); + midiDeviceInfo.splice([event.port.id, event.port.name]); + } + console.log(event.port.id, event.port.name, event.port.manufacturer, event.port.state); + }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; @@ -37,16 +42,12 @@ if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); - lastNotePressed = note; - Scratch.vm.runtime.startHats('midi_whenNotePressed'); } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { + lastNoteReleased = note; notesOn.splice(notesOn.indexOf(note), 1); noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); - - lastNoteReleased = note; - Scratch.vm.runtime.startHats('midi_whenNoteReleased'); } else { console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); @@ -96,6 +97,7 @@ } } }, + '---', { opcode: 'whenNotePressed', blockType: Scratch.BlockType.EVENT, From 2faa7c7188479b1f6455f5d2742ebd3656f0e297 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 15:21:13 -0400 Subject: [PATCH 46/50] Update midi.js Remove unnecessary console log --- extensions/MasterMath/midi.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index cd02cfa2bf..7502bd81ce 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -21,9 +21,8 @@ if (navigator.requestMIDIAccess) { navigator.requestMIDIAccess().then(onSuccess, onError); - + function onSuccess(midiAccess) { - midiAccess.onstatechange = (event) => { if (event.port.state == "connected") { midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); @@ -32,13 +31,11 @@ midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); midiDeviceInfo.splice([event.port.id, event.port.name]); } - console.log(event.port.id, event.port.name, event.port.manufacturer, event.port.state); }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; const command = status & 0xF0; - if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); From f562dee3ddc969df7a5a23a4b0082a64154c5be9 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:34:21 -0400 Subject: [PATCH 47/50] Update midi.js - Fix is note on block always returning false --- extensions/MasterMath/midi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 7502bd81ce..6da3f7cd5c 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -172,7 +172,7 @@ } noteOn(args) { - return notesOn.includes(args.note); + return notesOn.includes(Number(args.note)); } noteVelocity(args) { From b4f91c45e84d4820a22a863283444937f2dee51c Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 16 Aug 2024 22:58:10 -0400 Subject: [PATCH 48/50] Attempt to fix prettier format --- extensions/MasterMath/midi.js | 115 +++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/extensions/MasterMath/midi.js b/extensions/MasterMath/midi.js index 6da3f7cd5c..e8424672bc 100644 --- a/extensions/MasterMath/midi.js +++ b/extensions/MasterMath/midi.js @@ -4,12 +4,12 @@ // By: -MasterMath- // License: MPL-2.0 -(function(Scratch) { - 'use strict'; +(function (Scratch) { + "use strict"; if (!Scratch.extensions.unsandboxed) { - alert('This MIDI extension must run unsandboxed!'); - throw new Error('This MIDI extension must run unsandboxed!'); + alert("This MIDI extension must run unsandboxed!"); + throw new Error("This MIDI extension must run unsandboxed!"); } let midiInputDevices = []; @@ -21,33 +21,43 @@ if (navigator.requestMIDIAccess) { navigator.requestMIDIAccess().then(onSuccess, onError); - + function onSuccess(midiAccess) { midiAccess.onstatechange = (event) => { if (event.port.state == "connected") { - midiInputDevices.push([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`]); + midiInputDevices.push([ + `[id: "${event.port.id}"` + ` name: "${event.port.name}"]`, + ]); midiDeviceInfo.push([event.port.id, event.port.name]); } else if (event.port.state == "disconnected") { - midiInputDevices.splice([`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], 1); + midiInputDevices.splice( + [`[id: "${event.port.id}"` + ` name: "${event.port.name}"]`], + 1, + ); midiDeviceInfo.splice([event.port.id, event.port.name]); } }; function onMIDIMessage(event) { const [status, note, velocity] = event.data; - const command = status & 0xF0; + const command = status & 0xf0; if (command === 0x90 && velocity > 0) { notesOn.push(note); noteVelocities.push([note, velocity]); lastNotePressed = note; - Scratch.vm.runtime.startHats('midi_whenNotePressed'); + Scratch.vm.runtime.startHats("midi_whenNotePressed"); } else if (command === 0x80 || (command === 0x90 && velocity === 0)) { lastNoteReleased = note; notesOn.splice(notesOn.indexOf(note), 1); - noteVelocities.splice(noteVelocities.findIndex(subArray => subArray[0] === note), 1); - Scratch.vm.runtime.startHats('midi_whenNoteReleased'); + noteVelocities.splice( + noteVelocities.findIndex((subArray) => subArray[0] === note), + 1, + ); + Scratch.vm.runtime.startHats("midi_whenNoteReleased"); } else { - console.log(`Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`); + console.log( + `Other MIDI Message: Status=${status}, Note=${note}, Velocity=${velocity}, Timestamp ${event.timeStamp}`, + ); } } @@ -60,7 +70,6 @@ alert("MIDI Access Error:", err); throw new Error("MIDI Access Error:", err); } - } else { alert("MIDI is not supported on this browser."); throw new Error("MIDI is not supported on this browser."); @@ -69,93 +78,93 @@ class MIDI { getInfo() { return { - id: 'midi', - name: 'MIDI', + id: "midi", + name: "MIDI", blocks: [ { - opcode: 'MIDIinputDevices', + opcode: "MIDIinputDevices", blockType: Scratch.BlockType.REPORTER, - text: 'connected MIDI input devices', + text: "connected MIDI input devices", disableMonitor: true, }, { - opcode: 'midiDeviceInfo', + opcode: "midiDeviceInfo", blockType: Scratch.BlockType.REPORTER, - text: '[info] of MIDI device [number]', + text: "[info] of MIDI device [number]", arguments: { info: { type: Scratch.ArgumentType.STRING, - defaultValue: 'name', - menu: 'infoMenu', + defaultValue: "name", + menu: "infoMenu", }, number: { type: Scratch.ArgumentType.NUMBER, defaultValue: 0, - } - } + }, + }, }, - '---', + "---", { - opcode: 'whenNotePressed', + opcode: "whenNotePressed", blockType: Scratch.BlockType.EVENT, - text: 'when any note pressed', + text: "when any note pressed", isEdgeActivated: false, shouldRestartExistingThreads: true, }, { - opcode: 'whenNoteReleased', + opcode: "whenNoteReleased", blockType: Scratch.BlockType.EVENT, - text: 'when any note released', + text: "when any note released", isEdgeActivated: false, shouldRestartExistingThreads: true, }, { - opcode: 'noteOn', + opcode: "noteOn", blockType: Scratch.BlockType.BOOLEAN, - text: 'is note [note] on?', + text: "is note [note] on?", arguments: { note: { type: Scratch.ArgumentType.NOTE, defaultValue: 60, - } - } + }, + }, }, { - opcode: 'noteVelocity', + opcode: "noteVelocity", blockType: Scratch.BlockType.REPORTER, - text: 'velocity of note [note]', + text: "velocity of note [note]", arguments: { note: { type: Scratch.ArgumentType.NOTE, defaultValue: 60, - } - } + }, + }, }, { - opcode: 'activeNotes', + opcode: "activeNotes", blockType: Scratch.BlockType.REPORTER, - text: 'all active notes', + text: "all active notes", disableMonitor: true, }, { - opcode: 'lastNotePressed', + opcode: "lastNotePressed", blockType: Scratch.BlockType.REPORTER, - text: 'last note pressed', + text: "last note pressed", disableMonitor: true, }, { - opcode: 'lastNoteReleased', + opcode: "lastNoteReleased", blockType: Scratch.BlockType.REPORTER, - text: 'last note released', + text: "last note released", disableMonitor: true, - } + }, ], menus: { infoMenu: { acceptReporters: false, - items: ["name", "id"] - } - } + items: ["name", "id"], + }, + }, }; } @@ -165,7 +174,7 @@ midiDeviceInfo(args) { if (midiInputDevices[args.number] != null) { - return midiDeviceInfo[args.number][(args.info == "id") ? 0 : 1]; + return midiDeviceInfo[args.number][args.info == "id" ? 0 : 1]; } else { return; } @@ -176,8 +185,12 @@ } noteVelocity(args) { - if (notesOn.includes(args.note) && noteVelocities.find(subArray => subArray[0] === args.note)[1] !== undefined) { - return noteVelocities.find(subArray => subArray[0] === args.note)[1]; + if ( + notesOn.includes(args.note) && + noteVelocities.find((subArray) => subArray[0] === args.note)[1] !== + undefined + ) { + return noteVelocities.find((subArray) => subArray[0] === args.note)[1]; } } @@ -187,11 +200,11 @@ lastNotePressed() { return lastNotePressed; - } + } lastNoteReleased() { return lastNoteReleased; - } + } } Scratch.extensions.register(new MIDI()); From 554ac5002d8158fe744712716bf0192b20379dea Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 13 Sep 2024 20:41:43 -0400 Subject: [PATCH 49/50] Fix format From 6b4d6c98c3ff5cb27659b677d1ef7e33c9875181 Mon Sep 17 00:00:00 2001 From: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> Date: Fri, 13 Sep 2024 21:08:07 -0400 Subject: [PATCH 50/50] Fix format again?