diff --git a/README.md b/README.md index 5de76cb2e..fd626a49a 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,4 @@ blocks together to build programs. All code is free and open source. **The project page is https://developers.google.com/blockly/** -![](https://developers.google.com/blockly/sample.png) +![](https://developers.google.com/blockly/images/sample.png) diff --git a/blocks/procedures.js b/blocks/procedures.js index d43130141..82b383b51 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -110,8 +110,11 @@ Blockly.Blocks['procedures_defnoreturn'] = { // The params field is deterministic based on the mutation, // no need to fire a change event. Blockly.Events.disable(); - this.setFieldValue(paramString, 'PARAMS'); - Blockly.Events.enable(); + try { + this.setFieldValue(paramString, 'PARAMS'); + } finally { + Blockly.Events.enable(); + } }, /** * Create XML to represent the argument inputs. @@ -567,8 +570,11 @@ Blockly.Blocks['procedures_callnoreturn'] = { // The argument name field is deterministic based on the mutation, // no need to fire a change event. Blockly.Events.disable(); - field.setValue(this.arguments_[i]); - Blockly.Events.enable(); + try { + field.setValue(this.arguments_[i]); + } finally { + Blockly.Events.enable(); + } } else { // Add new input. field = new Blockly.FieldLabel(this.arguments_[i]); diff --git a/core/block.js b/core/block.js index 92b533be8..d4640f275 100644 --- a/core/block.js +++ b/core/block.js @@ -204,39 +204,42 @@ Blockly.Block.prototype.dispose = function(healStack) { } Blockly.Events.disable(); - // This block is now at the top of the workspace. - // Remove this block from the workspace's list of top-most blocks. - if (this.workspace) { - this.workspace.removeTopBlock(this); - // Remove from block database. - delete this.workspace.blockDB_[this.id]; - this.workspace = null; - } - - // Just deleting this block from the DOM would result in a memory leak as - // well as corruption of the connection database. Therefore we must - // methodically step through the blocks and carefully disassemble them. - - // First, dispose of all my children. - for (var i = this.childBlocks_.length - 1; i >= 0; i--) { - this.childBlocks_[i].dispose(false); - } - // Then dispose of myself. - // Dispose of all inputs and their fields. - for (var i = 0, input; input = this.inputList[i]; i++) { - input.dispose(); - } - this.inputList.length = 0; - // Dispose of any remaining connections (next/previous/output). - var connections = this.getConnections_(true); - for (var i = 0; i < connections.length; i++) { - var connection = connections[i]; - if (connection.isConnected()) { - connection.disconnect(); + try { + // This block is now at the top of the workspace. + // Remove this block from the workspace's list of top-most blocks. + if (this.workspace) { + this.workspace.removeTopBlock(this); + // Remove from block database. + delete this.workspace.blockDB_[this.id]; + this.workspace = null; } - connections[i].dispose(); + + // Just deleting this block from the DOM would result in a memory leak as + // well as corruption of the connection database. Therefore we must + // methodically step through the blocks and carefully disassemble them. + + // First, dispose of all my children. + for (var i = this.childBlocks_.length - 1; i >= 0; i--) { + this.childBlocks_[i].dispose(false); + } + // Then dispose of myself. + // Dispose of all inputs and their fields. + for (var i = 0, input; input = this.inputList[i]; i++) { + input.dispose(); + } + this.inputList.length = 0; + // Dispose of any remaining connections (next/previous/output). + var connections = this.getConnections_(true); + for (var i = 0; i < connections.length; i++) { + var connection = connections[i]; + if (connection.isConnected()) { + connection.disconnect(); + } + connections[i].dispose(); + } + } finally { + Blockly.Events.enable(); } - Blockly.Events.enable(); }; /** diff --git a/core/block_svg.js b/core/block_svg.js index 036de42f6..cfae29027 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -156,8 +156,11 @@ Blockly.BlockSvg.prototype.select = function() { oldId = Blockly.selected.id; // Unselect any previously selected block. Blockly.Events.disable(); - Blockly.selected.unselect(); - Blockly.Events.enable(); + try { + Blockly.selected.unselect(); + } finally { + Blockly.Events.enable(); + } } var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id); event.workspaceId = this.workspace.id; @@ -998,11 +1001,14 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { this.rendered = false; Blockly.Events.disable(); - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].dispose(); + try { + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].dispose(); + } + } finally { + Blockly.Events.enable(); } - Blockly.Events.enable(); Blockly.BlockSvg.superClass_.dispose.call(this, healStack); goog.dom.removeNode(this.svgGroup_); diff --git a/core/contextmenu.js b/core/contextmenu.js index af92cf6e2..462ad0b2c 100644 --- a/core/contextmenu.js +++ b/core/contextmenu.js @@ -126,17 +126,20 @@ Blockly.ContextMenu.hide = function() { Blockly.ContextMenu.callbackFactory = function(block, xml) { return function() { Blockly.Events.disable(); - var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); - // Move the new block next to the old block. - var xy = block.getRelativeToSurfaceXY(); - if (block.RTL) { - xy.x -= Blockly.SNAP_RADIUS; - } else { - xy.x += Blockly.SNAP_RADIUS; + try { + var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); + // Move the new block next to the old block. + var xy = block.getRelativeToSurfaceXY(); + if (block.RTL) { + xy.x -= Blockly.SNAP_RADIUS; + } else { + xy.x += Blockly.SNAP_RADIUS; + } + xy.y += Blockly.SNAP_RADIUS * 2; + newBlock.moveBy(xy.x, xy.y); + } finally { + Blockly.Events.enable(); } - xy.y += Blockly.SNAP_RADIUS * 2; - newBlock.moveBy(xy.x, xy.y); - Blockly.Events.enable(); if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { Blockly.Events.fire(new Blockly.Events.Create(newBlock)); } diff --git a/core/flyout.js b/core/flyout.js index c93d26ee6..94434ea2e 100644 --- a/core/flyout.js +++ b/core/flyout.js @@ -956,8 +956,11 @@ Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { return; } Blockly.Events.disable(); - var block = flyout.placeNewBlock_(originBlock); - Blockly.Events.enable(); + try { + var block = flyout.placeNewBlock_(originBlock); + } finally { + Blockly.Events.enable(); + } if (Blockly.Events.isEnabled()) { Blockly.Events.setGroup(true); Blockly.Events.fire(new Blockly.Events.Create(block)); diff --git a/core/toolbox.js b/core/toolbox.js index b5b27f869..ac15ed128 100644 --- a/core/toolbox.js +++ b/core/toolbox.js @@ -265,85 +265,12 @@ Blockly.Toolbox.prototype.position = function() { * @private */ Blockly.Toolbox.prototype.populate_ = function(newTree) { - var rootOut = this.tree_; - var that = this; - rootOut.removeChildren(); // Delete any existing content. - rootOut.blocks = []; - var hasColours = false; - function syncTrees(treeIn, treeOut, pathToMedia) { - var lastElement = null; - for (var i = 0, childIn; childIn = treeIn.childNodes[i]; i++) { - if (!childIn.tagName) { - // Skip over text. - continue; - } - switch (childIn.tagName.toUpperCase()) { - case 'CATEGORY': - var childOut = rootOut.createNode(childIn.getAttribute('name')); - childOut.blocks = []; - treeOut.add(childOut); - var custom = childIn.getAttribute('custom'); - if (custom) { - // Variables and procedures are special dynamic categories. - childOut.blocks = custom; - } else { - syncTrees(childIn, childOut, pathToMedia); - } - var colour = childIn.getAttribute('colour'); - if (goog.isString(colour)) { - if (colour.match(/^#[0-9a-fA-F]{6}$/)) { - childOut.hexColour = colour; - } else { - childOut.hexColour = Blockly.hueToRgb(colour); - } - hasColours = true; - } else { - childOut.hexColour = ''; - } - if (childIn.getAttribute('expanded') == 'true') { - if (childOut.blocks.length) { - rootOut.setSelectedItem(childOut); - } - childOut.setExpanded(true); - } else { - childOut.setExpanded(false); - } - lastElement = childIn; - break; - case 'SEP': - if (lastElement) { - if (lastElement.tagName.toUpperCase() == 'CATEGORY') { - // Separator between two categories. - // - treeOut.add(new Blockly.Toolbox.TreeSeparator( - that.treeSeparatorConfig_)); - } else { - // Change the gap between two blocks. - // - // The default gap is 24, can be set larger or smaller. - // Note that a deprecated method is to add a gap to a block. - // - var newGap = parseFloat(childIn.getAttribute('gap')); - if (!isNaN(newGap)) { - var oldGap = parseFloat(lastElement.getAttribute('gap')); - var gap = isNaN(oldGap) ? newGap : oldGap + newGap; - lastElement.setAttribute('gap', gap); - } - } - } - break; - case 'BLOCK': - case 'SHADOW': - treeOut.blocks.push(childIn); - lastElement = childIn; - break; - } - } - } - syncTrees(newTree, this.tree_, this.workspace_.options.pathToMedia); - this.hasColours_ = hasColours; + this.tree_.removeChildren(); // Delete any existing content. + this.tree_.blocks = []; + this.hasColours_ = false; + this.syncTrees_(newTree, this.tree_, this.workspace_.options.pathToMedia); - if (rootOut.blocks.length) { + if (this.tree_.blocks.length) { throw 'Toolbox cannot have both blocks and categories in the root level.'; } @@ -351,6 +278,84 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { Blockly.resizeSvgContents(this.workspace_); }; +/** + * Sync trees of the toolbox. + * @param {Node} treeIn DOM tree of blocks, or null. + * @param {Blockly.Toolbox.TreeControl} treeOut + * @param {string} pathToMedia + * @private + */ +Blockly.Toolbox.prototype.syncTrees_ = function(treeIn, treeOut, pathToMedia) { + var lastElement = null; + for (var i = 0, childIn; childIn = treeIn.childNodes[i]; i++) { + if (!childIn.tagName) { + // Skip over text. + continue; + } + switch (childIn.tagName.toUpperCase()) { + case 'CATEGORY': + var childOut = this.tree_.createNode(childIn.getAttribute('name')); + childOut.blocks = []; + treeOut.add(childOut); + var custom = childIn.getAttribute('custom'); + if (custom) { + // Variables and procedures are special dynamic categories. + childOut.blocks = custom; + } else { + this.syncTrees_(childIn, childOut, pathToMedia); + } + var colour = childIn.getAttribute('colour'); + if (goog.isString(colour)) { + if (colour.match(/^#[0-9a-fA-F]{6}$/)) { + childOut.hexColour = colour; + } else { + childOut.hexColour = Blockly.hueToRgb(colour); + } + this.hasColours_ = true; + } else { + childOut.hexColour = ''; + } + if (childIn.getAttribute('expanded') == 'true') { + if (childOut.blocks.length) { + this.tree_.setSelectedItem(childOut); + } + childOut.setExpanded(true); + } else { + childOut.setExpanded(false); + } + lastElement = childIn; + break; + case 'SEP': + if (lastElement) { + if (lastElement.tagName.toUpperCase() == 'CATEGORY') { + // Separator between two categories. + // + treeOut.add(new Blockly.Toolbox.TreeSeparator( + this.treeSeparatorConfig_)); + } else { + // Change the gap between two blocks. + // + // The default gap is 24, can be set larger or smaller. + // Note that a deprecated method is to add a gap to a block. + // + var newGap = parseFloat(childIn.getAttribute('gap')); + if (!isNaN(newGap)) { + var oldGap = parseFloat(lastElement.getAttribute('gap')); + var gap = isNaN(oldGap) ? newGap : oldGap + newGap; + lastElement.setAttribute('gap', gap); + } + } + } + break; + case 'BLOCK': + case 'SHADOW': + treeOut.blocks.push(childIn); + lastElement = childIn; + break; + } + } +}; + /** * Recursively add colours to this toolbox. * @param {Blockly.Toolbox.TreeNode} opt_tree Starting point of tree. @@ -450,6 +455,7 @@ Blockly.Toolbox.TreeControl.prototype.enterDocument = function() { this.handleTouchEvent_); } }; + /** * Handles touch events. * @param {!goog.events.BrowserEvent} e The browser event. diff --git a/core/workspace_svg.js b/core/workspace_svg.js index 7d137f9b8..4c2d85661 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -535,51 +535,54 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { } Blockly.terminateDrag_(); // Dragging while pasting? No. Blockly.Events.disable(); - var block = Blockly.Xml.domToBlock(xmlBlock, this); - // Move the duplicate to original position. - var blockX = parseInt(xmlBlock.getAttribute('x'), 10); - var blockY = parseInt(xmlBlock.getAttribute('y'), 10); - if (!isNaN(blockX) && !isNaN(blockY)) { - if (this.RTL) { - blockX = -blockX; - } - // Offset block until not clobbering another block and not in connection - // distance with neighbouring blocks. - do { - var collide = false; - var allBlocks = this.getAllBlocks(); - for (var i = 0, otherBlock; otherBlock = allBlocks[i]; i++) { - var otherXY = otherBlock.getRelativeToSurfaceXY(); - if (Math.abs(blockX - otherXY.x) <= 1 && - Math.abs(blockY - otherXY.y) <= 1) { - collide = true; - break; - } + try { + var block = Blockly.Xml.domToBlock(xmlBlock, this); + // Move the duplicate to original position. + var blockX = parseInt(xmlBlock.getAttribute('x'), 10); + var blockY = parseInt(xmlBlock.getAttribute('y'), 10); + if (!isNaN(blockX) && !isNaN(blockY)) { + if (this.RTL) { + blockX = -blockX; } - if (!collide) { - // Check for blocks in snap range to any of its connections. - var connections = block.getConnections_(false); - for (var i = 0, connection; connection = connections[i]; i++) { - var neighbour = connection.closest(Blockly.SNAP_RADIUS, - new goog.math.Coordinate(blockX, blockY)); - if (neighbour.connection) { + // Offset block until not clobbering another block and not in connection + // distance with neighbouring blocks. + do { + var collide = false; + var allBlocks = this.getAllBlocks(); + for (var i = 0, otherBlock; otherBlock = allBlocks[i]; i++) { + var otherXY = otherBlock.getRelativeToSurfaceXY(); + if (Math.abs(blockX - otherXY.x) <= 1 && + Math.abs(blockY - otherXY.y) <= 1) { collide = true; break; } } - } - if (collide) { - if (this.RTL) { - blockX -= Blockly.SNAP_RADIUS; - } else { - blockX += Blockly.SNAP_RADIUS; + if (!collide) { + // Check for blocks in snap range to any of its connections. + var connections = block.getConnections_(false); + for (var i = 0, connection; connection = connections[i]; i++) { + var neighbour = connection.closest(Blockly.SNAP_RADIUS, + new goog.math.Coordinate(blockX, blockY)); + if (neighbour.connection) { + collide = true; + break; + } + } } - blockY += Blockly.SNAP_RADIUS * 2; - } - } while (collide); - block.moveBy(blockX, blockY); + if (collide) { + if (this.RTL) { + blockX -= Blockly.SNAP_RADIUS; + } else { + blockX += Blockly.SNAP_RADIUS; + } + blockY += Blockly.SNAP_RADIUS * 2; + } + } while (collide); + block.moveBy(blockX, blockY); + } + } finally { + Blockly.Events.enable(); } - Blockly.Events.enable(); if (Blockly.Events.isEnabled() && !block.isShadow()) { Blockly.Events.fire(new Blockly.Events.Create(block)); } diff --git a/core/xml.js b/core/xml.js index efdd45811..95e6471c2 100644 --- a/core/xml.js +++ b/core/xml.js @@ -332,32 +332,35 @@ Blockly.Xml.domToBlock = function(xmlBlock, workspace) { } // Create top-level block. Blockly.Events.disable(); - var topBlock = Blockly.Xml.domToBlockHeadless_(xmlBlock, workspace); - if (workspace.rendered) { - // Hide connections to speed up assembly. - topBlock.setConnectionsHidden(true); - // Generate list of all blocks. - var blocks = topBlock.getDescendants(); - // Render each block. - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].initSvg(); - } - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].render(false); - } - // Populating the connection database may be defered until after the blocks - // have renderend. - setTimeout(function() { - if (topBlock.workspace) { // Check that the block hasn't been deleted. - topBlock.setConnectionsHidden(false); + try { + var topBlock = Blockly.Xml.domToBlockHeadless_(xmlBlock, workspace); + if (workspace.rendered) { + // Hide connections to speed up assembly. + topBlock.setConnectionsHidden(true); + // Generate list of all blocks. + var blocks = topBlock.getDescendants(); + // Render each block. + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].initSvg(); } - }, 1); - topBlock.updateDisabled(); - // Allow the scrollbars to resize and move based on the new contents. - // TODO(@picklesrus): #387. Remove when domToBlock avoids resizing. - Blockly.resizeSvgContents(workspace); + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].render(false); + } + // Populating the connection database may be defered until after the + // blocks have rendered. + setTimeout(function() { + if (topBlock.workspace) { // Check that the block hasn't been deleted. + topBlock.setConnectionsHidden(false); + } + }, 1); + topBlock.updateDisabled(); + // Allow the scrollbars to resize and move based on the new contents. + // TODO(@picklesrus): #387. Remove when domToBlock avoids resizing. + Blockly.resizeSvgContents(workspace); + } + } finally { + Blockly.Events.enable(); } - Blockly.Events.enable(); if (Blockly.Events.isEnabled()) { Blockly.Events.fire(new Blockly.Events.Create(topBlock)); } diff --git a/generators/javascript.js b/generators/javascript.js index a81b62b0c..db0952532 100644 --- a/generators/javascript.js +++ b/generators/javascript.js @@ -229,7 +229,7 @@ Blockly.JavaScript.scrub_ = function(block, code) { if (!block.outputConnection || !block.outputConnection.targetConnection) { // Collect comment for this block. var comment = block.getCommentText(); - comment = Blockly.utils.wrap(comment, this.COMMENT_WRAP - 3); + comment = Blockly.utils.wrap(comment, Blockly.JavaScript.COMMENT_WRAP - 3); if (comment) { if (block.getProcedureDef) { // Use a comment block for function comments. diff --git a/generators/lua.js b/generators/lua.js index 3f7df6b1c..225489641 100644 --- a/generators/lua.js +++ b/generators/lua.js @@ -170,7 +170,7 @@ Blockly.Lua.scrub_ = function(block, code) { if (!block.outputConnection || !block.outputConnection.targetConnection) { // Collect comment for this block. var comment = block.getCommentText(); - comment = Blockly.utils.wrap(comment, this.COMMENT_WRAP - 3); + comment = Blockly.utils.wrap(comment, Blockly.Lua.COMMENT_WRAP - 3); if (comment) { commentCode += Blockly.Lua.prefixLines(comment, '-- ') + '\n'; } diff --git a/generators/php.js b/generators/php.js index 02e89e809..0543a439a 100644 --- a/generators/php.js +++ b/generators/php.js @@ -221,7 +221,7 @@ Blockly.PHP.scrub_ = function(block, code) { if (!block.outputConnection || !block.outputConnection.targetConnection) { // Collect comment for this block. var comment = block.getCommentText(); - comment = Blockly.utils.wrap(comment, this.COMMENT_WRAP - 3); + comment = Blockly.utils.wrap(comment, Blockly.PHP.COMMENT_WRAP - 3); if (comment) { commentCode += Blockly.PHP.prefixLines(comment, '// ') + '\n'; } diff --git a/generators/python.js b/generators/python.js index 679093db1..3534aec27 100644 --- a/generators/python.js +++ b/generators/python.js @@ -219,7 +219,7 @@ Blockly.Python.scrub_ = function(block, code) { if (!block.outputConnection || !block.outputConnection.targetConnection) { // Collect comment for this block. var comment = block.getCommentText(); - comment = Blockly.utils.wrap(comment, this.COMMENT_WRAP - 3); + comment = Blockly.utils.wrap(comment, Blockly.Python.COMMENT_WRAP - 3); if (comment) { if (block.getProcedureDef) { // Use a comment block for function comments. diff --git a/msg/json/ko.json b/msg/json/ko.json index 3af02a7ab..327721f83 100644 --- a/msg/json/ko.json +++ b/msg/json/ko.json @@ -101,7 +101,7 @@ "LOGIC_OPERATION_TOOLTIP_OR": "적어도 하나의 값이 참일 경우 참을 반환합니다.", "LOGIC_OPERATION_OR": "또는", "LOGIC_NEGATE_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95", - "LOGIC_NEGATE_TITLE": "%1 의 반대", + "LOGIC_NEGATE_TITLE": "%1가 아닙니다", "LOGIC_NEGATE_TOOLTIP": "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다.", "LOGIC_BOOLEAN_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92", "LOGIC_BOOLEAN_TRUE": "참", @@ -114,7 +114,7 @@ "LOGIC_TERNARY_CONDITION": "테스트", "LOGIC_TERNARY_IF_TRUE": "만약 참이라면", "LOGIC_TERNARY_IF_FALSE": "만약 거짓이라면", - "LOGIC_TERNARY_TOOLTIP": "'검사' 를 진행해, 결과가 참(true)이면 '참이면' 부분의 값을 돌려줍니다. ; 결과가 참이 아니면, '거짓이면' 부분의 값을 돌려줍니다.", + "LOGIC_TERNARY_TOOLTIP": "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다.", "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "수", "MATH_ADDITION_SYMBOL": "+", @@ -142,12 +142,12 @@ "MATH_SINGLE_TOOLTIP_NEG": "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다.", "MATH_SINGLE_TOOLTIP_LN": "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)", "MATH_SINGLE_TOOLTIP_LOG10": "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)", - "MATH_SINGLE_TOOLTIP_EXP": "e 의, 거듭제곱(power) 값을 돌려줍니다.", - "MATH_SINGLE_TOOLTIP_POW10": "10 의, 거듭제곱(power) 값을 돌려줍니다.", + "MATH_SINGLE_TOOLTIP_EXP": "e의 거듭제곱 값을 반환합니다.", + "MATH_SINGLE_TOOLTIP_POW10": "10의 거듭제곱 값을 반환합니다.", "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "어떤 각도(degree, radian 아님)의, sin(sine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_COS": "어떤 각도(degree, radian 아님)의, cos(cosine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_TAN": "어떤 각도(degree, radian 아님)의, tan(tangent) 값을 계산해 돌려줍니다.", + "MATH_TRIG_TOOLTIP_SIN": "각도의 사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_COS": "각도의 코사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_TAN": "각도의 탄젠트를 반환합니다. (라디안 아님)", "MATH_TRIG_TOOLTIP_ASIN": "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다.", "MATH_TRIG_TOOLTIP_ACOS": "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다.", "MATH_TRIG_TOOLTIP_ATAN": "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다.", @@ -183,14 +183,14 @@ "MATH_ONLIST_OPERATOR_MODE": "가장 여러 개 있는 값", "MATH_ONLIST_TOOLTIP_MODE": "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)", "MATH_ONLIST_OPERATOR_STD_DEV": "표준 편차", - "MATH_ONLIST_TOOLTIP_STD_DEV": "리스트에 들어있는 수(값)들에 대해, 표준 편차(standard deviation) 를 구해 돌려줍니다.", + "MATH_ONLIST_TOOLTIP_STD_DEV": "이 리스트의 표준 편차를 반환합니다.", "MATH_ONLIST_OPERATOR_RANDOM": "목록의 임의 항목", "MATH_ONLIST_TOOLTIP_RANDOM": "목록에서 임의의 아이템을 돌려줍니다.", "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 를 %2 로 나눈 나머지", + "MATH_MODULO_TITLE": "%1 ÷ %2의 나머지", "MATH_MODULO_TOOLTIP": "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다.", "MATH_CONSTRAIN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%A8%ED%95%91_(%EA%B7%B8%EB%9E%98%ED%94%BD)", - "MATH_CONSTRAIN_TITLE": "%1 의 값을, 최소 %2 최대 %3 으로 조정", + "MATH_CONSTRAIN_TITLE": "%1의 값을, 최소 %2 최대 %3으로 조정", "MATH_CONSTRAIN_TOOLTIP": "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다.", "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "랜덤정수(%1<= n <=%2)", @@ -209,7 +209,7 @@ "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TO": "다음", "TEXT_APPEND_APPENDTEXT": "내용 덧붙이기", - "TEXT_APPEND_TOOLTIP": "'%1' 의 마지막에 문장을 덧붙입니다.", + "TEXT_APPEND_TOOLTIP": "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다.", "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "다음 문장의 문자 개수 %1", "TEXT_LENGTH_TOOLTIP": "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)", @@ -261,7 +261,7 @@ "TEXT_PROMPT_TOOLTIP_TEXT": "문장 입력 받음.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "빈 리스트 생성", - "LISTS_CREATE_EMPTY_TOOLTIP": "아이템이 없는, 빈 리스트를 만들어 돌려줍니다.", + "LISTS_CREATE_EMPTY_TOOLTIP": "데이터 레코드가 없는, 길이가 0인 목록을 반환합니다.", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "원하는 수의 항목들로 목록을 생성합니다.", "LISTS_CREATE_WITH_INPUT_WITH": "리스트 만들기", @@ -269,8 +269,8 @@ "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "아이템을 리스트에 추가합니다.", "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "원하는 값을, 원하는 갯수 만큼 넣어, 새로운 리스트를 생성합니다.", - "LISTS_REPEAT_TITLE": "%1 을 %2 번 넣어, 리스트 생성", + "LISTS_REPEAT_TOOLTIP": "원하는 값을, 원하는 갯수 만큼 넣어, 목록을 생성합니다.", + "LISTS_REPEAT_TITLE": "%1을 %2번 넣어, 리스트 생성", "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "%1의 길이", "LISTS_LENGTH_TOOLTIP": "목록의 길이를 반환합니다.", @@ -328,7 +328,7 @@ "LISTS_GET_SUBLIST_END_FROM_END": "끝에서부터 # 번째로", "LISTS_GET_SUBLIST_END_LAST": "마지막으로", "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "특정 부분을 복사해 새로운 리스트로 생성합니다.", + "LISTS_GET_SUBLIST_TOOLTIP": "목록의 특정 부분에 대한 복사본을 만듭니다.", "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "정렬 %1 %2 %3", "LISTS_SORT_TOOLTIP": "목록의 사본을 정렬합니다.", @@ -342,13 +342,13 @@ "LISTS_SPLIT_TEXT_FROM_LIST": "목록에서 텍스트 만들기", "LISTS_SPLIT_WITH_DELIMITER": "분리와", "LISTS_SPLIT_TOOLTIP_SPLIT": "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다.", - "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 분리 된 하나의 텍스트에 텍스트 의 목록을 넣으세요.", + "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", "VARIABLES_GET_TOOLTIP": "변수에 저장 되어있는 값을 돌려줍니다.", "VARIABLES_GET_CREATE_SET": "'집합 %1' 생성", "VARIABLES_SET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", - "VARIABLES_SET": "바꾸기 %1 를 다음 값으로 바꾸기 %2", + "VARIABLES_SET": "%1를 %2로 설정", "VARIABLES_SET_TOOLTIP": "변수의 값을 입력한 값으로 변경해 줍니다.", "VARIABLES_SET_CREATE_GET": "'%1 값 읽기' 블럭 생성", "PROCEDURES_DEFNORETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", diff --git a/msg/json/pl.json b/msg/json/pl.json index 3c4319840..218b2442d 100644 --- a/msg/json/pl.json +++ b/msg/json/pl.json @@ -10,7 +10,8 @@ "Mateon1", "Expert3222", "Cirasean", - "Fringoo" + "Fringoo", + "Chrumps" ] }, "VARIABLES_DEFAULT_NAME": "element", @@ -79,12 +80,12 @@ "CONTROLS_IF_TOOLTIP_3": "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji.", "CONTROLS_IF_TOOLTIP_4": "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji.", "CONTROLS_IF_MSG_IF": "jeśli", - "CONTROLS_IF_MSG_ELSEIF": "w przeciwnym razie jeśli", + "CONTROLS_IF_MSG_ELSEIF": "w przeciwnym razie, jeśli", "CONTROLS_IF_MSG_ELSE": "w przeciwnym razie", "CONTROLS_IF_IF_TOOLTIP": "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować ten blok „jeśli”.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj warunek do bloku „jeśli”.", "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_HELPURL": "https://pl.wikipedia.org/wiki/Nierówność", "LOGIC_COMPARE_TOOLTIP_EQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie równe.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie nierówne.", "LOGIC_COMPARE_TOOLTIP_LT": "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", @@ -127,7 +128,7 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Zwróć iloczyn dwóch liczb.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Zwróć iloraz dwóch liczb.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_HELPURL": "https://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy", "MATH_SINGLE_OP_ROOT": "pierwiastek kwadratowy", "MATH_SINGLE_TOOLTIP_ROOT": "Zwróć pierwiastek kwadratowy danej liczby.", "MATH_SINGLE_OP_ABSOLUTE": "wartość bezwzględna", @@ -137,14 +138,14 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Zwraca logarytm dziesiętny danej liczby.", "MATH_SINGLE_TOOLTIP_EXP": "Zwróć e do potęgi danej liczby.", "MATH_SINGLE_TOOLTIP_POW10": "Zwróć 10 do potęgi danej liczby.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_HELPURL": "https://pl.wikipedia.org/wiki/Funkcje_trygonometryczne", "MATH_TRIG_TOOLTIP_SIN": "Zwróć wartość sinusa o stopniu (nie w radianach).", "MATH_TRIG_TOOLTIP_COS": "Zwróć wartość cosinusa o stopniu (nie w radianach).", "MATH_TRIG_TOOLTIP_TAN": "Zwróć tangens o stopniu (nie w radianach).", "MATH_TRIG_TOOLTIP_ASIN": "Zwróć arcus sinus danej liczby.", "MATH_TRIG_TOOLTIP_ACOS": "Zwróć arcus cosinus danej liczby.", "MATH_TRIG_TOOLTIP_ATAN": "Zwróć arcus tangens danej liczby.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_HELPURL": "https://pl.wikipedia.org/wiki/Stała_(matematyka)", "MATH_CONSTANT_TOOLTIP": "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność).", "MATH_IS_EVEN": "jest parzysta", "MATH_IS_ODD": "jest nieparzysta", @@ -157,7 +158,7 @@ "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "zmień %1 o %2", "MATH_CHANGE_TOOLTIP": "Dodaj liczbę do zmiennej '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_HELPURL": "https://pl.wikipedia.org/wiki/Zaokrąglanie", "MATH_ROUND_TOOLTIP": "Zaokrąglij w górę lub w dół.", "MATH_ROUND_OPERATOR_ROUND": "zaokrąglij", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglij w górę", @@ -179,7 +180,7 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Zwróć odchylenie standardowe listy.", "MATH_ONLIST_OPERATOR_RANDOM": "losowy element z listy", "MATH_ONLIST_TOOLTIP_RANDOM": "Zwróć losowy element z listy.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_HELPURL": "https://pl.wikipedia.org/wiki/Modulo", "MATH_MODULO_TITLE": "reszta z dzielenia %1 przez %2", "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", @@ -190,7 +191,7 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "losowy ułamek", "MATH_RANDOM_FLOAT_TOOLTIP": "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_HELPURL": "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych", "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", "TEXT_JOIN_TITLE_CREATEWITH": "utwórz tekst z", "TEXT_JOIN_TOOLTIP": "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów.", @@ -303,6 +304,14 @@ "LISTS_GET_SUBLIST_END_LAST": "do ostatniego", "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Tworzy kopię z określoną część listy.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortuj %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortuj kopię listy.", + "LISTS_SORT_ORDER_ASCENDING": "rosnąco", + "LISTS_SORT_ORDER_DESCENDING": "malejąco", + "LISTS_SORT_TYPE_NUMERIC": "numerycznie", + "LISTS_SORT_TYPE_TEXT": "alfabetycznie", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetycznie, bez uwzględniania wielkości liter", "LISTS_SPLIT_LIST_FROM_TEXT": "stwórz listę z tekstu", "LISTS_SPLIT_TEXT_FROM_LIST": "stwórz tekst z listy", "LISTS_SPLIT_WITH_DELIMITER": "z separatorem", @@ -327,9 +336,9 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję z wynikiem.", "PROCEDURES_ALLOW_STATEMENTS": "zezwól na instrukcje", "PROCEDURES_DEF_DUPLICATE_WARNING": "Uwaga: Ta funkcja ma powtórzone parametry.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", "PROCEDURES_CALLNORETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", "PROCEDURES_CALLRETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku.", "PROCEDURES_MUTATORCONTAINER_TITLE": "wejścia", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji.", diff --git a/msg/json/pt.json b/msg/json/pt.json index 58b5d43ad..47f40cba4 100644 --- a/msg/json/pt.json +++ b/msg/json/pt.json @@ -7,7 +7,8 @@ "아라", "Nicola Nascimento", "Önni", - "Diniscoelho" + "Diniscoelho", + "Fúlvio" ] }, "VARIABLES_DEFAULT_NAME": "item", @@ -29,6 +30,7 @@ "ENABLE_BLOCK": "Habilitar Bloco", "HELP": "Ajuda", "UNDO": "Desfazer", + "REDO": "Refazer", "CHAT": "Converse com o seu colaborador, ao digitar nesta caixa!", "AUTH": "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar.", "ME": "Eu", diff --git a/msg/json/ru.json b/msg/json/ru.json index 0fe1eab96..7c3653a1d 100644 --- a/msg/json/ru.json +++ b/msg/json/ru.json @@ -4,7 +4,8 @@ "Espertus", "MS", "Okras", - "RedFox" + "RedFox", + "Mailman" ] }, "VARIABLES_DEFAULT_NAME": "элемент", @@ -76,10 +77,10 @@ "CONTROLS_IF_IF_TOOLTIP": "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\".", "CONTROLS_IF_ELSEIF_TOOLTIP": "Добавляет условие к блоку \"если\"", "CONTROLS_IF_ELSE_TOOLTIP": "Добавить заключительный подблок для случая, когда все условия ложны.", - "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE", - "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает значение истина, если вставки равны.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает значение истина, если вставки не равны.", - "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает значение истина, если первая вставка меньше второй.", + "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/Неравенство", + "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает положительное значение, если вводы равны.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает положительное значение, если вводы не равны.", + "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает положительное значение, если первый ввод меньше второго.", "LOGIC_COMPARE_TOOLTIP_LTE": "Возвращает значение истина, если первая вставка меньше или равна второй.", "LOGIC_COMPARE_TOOLTIP_GT": "Возвращает значение истина, если первая вставка больше второй.", "LOGIC_COMPARE_TOOLTIP_GTE": "Возвращает значение истина, если первая вставка больше или равна второй.",