From fdc9e2ba3b1afbdbe5039bdaac35b60347495977 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Tue, 28 Jun 2016 14:36:54 -0700
Subject: [PATCH 01/25] Fix 'this' warning on aggressive compile.
---
generators/javascript.js | 2 +-
generators/lua.js | 2 +-
generators/php.js | 2 +-
generators/python.js | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/generators/javascript.js b/generators/javascript.js
index dcd1f146d..f14671899 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 60a6c0e14..6dbecb666 100644
--- a/generators/lua.js
+++ b/generators/lua.js
@@ -164,7 +164,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 d935cda1b..b836c7bc1 100644
--- a/generators/php.js
+++ b/generators/php.js
@@ -167,7 +167,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 2e77c0753..082480685 100644
--- a/generators/python.js
+++ b/generators/python.js
@@ -202,7 +202,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.
From 03250c9c5d664f7e71dcddd842b09aa5c0491443 Mon Sep 17 00:00:00 2001
From: Markus Bordihn
Date: Wed, 29 Jun 2016 12:09:44 +0200
Subject: [PATCH 02/25] Rewrite anonymouse function "syncTree" for compiler and
debugging reasons. See #448 for more details.
---
core/toolbox.js | 163 +++++++++++++++++++++++++-----------------------
1 file changed, 85 insertions(+), 78 deletions(-)
diff --git a/core/toolbox.js b/core/toolbox.js
index b5b27f869..1e8c84af8 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,86 @@ 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.
From 589f6ae13f35708282a2ac40d3495c02bb65812c Mon Sep 17 00:00:00 2001
From: Rodrigo Queiro
Date: Wed, 27 Apr 2016 14:21:22 +0200
Subject: [PATCH 03/25] Re-enable events even when an exception is thrown
This prevents a recoverable exception permanently disabling events. This
could be caused by calling domToWorkspace() to load a corrupt program.
---
blocks/procedures.js | 14 +++++---
core/block.js | 65 ++++++++++++++++++-----------------
core/block_svg.js | 18 ++++++----
core/contextmenu.js | 23 +++++++------
core/flyout.js | 7 ++--
core/workspace_svg.js | 79 ++++++++++++++++++++++---------------------
core/xml.js | 51 +++++++++++++++-------------
7 files changed, 142 insertions(+), 115 deletions(-)
diff --git a/blocks/procedures.js b/blocks/procedures.js
index f6b25bcd6..7eb785509 100644
--- a/blocks/procedures.js
+++ b/blocks/procedures.js
@@ -120,8 +120,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.
@@ -589,8 +592,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 ee70a93d1..1e3024a50 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;
@@ -999,11 +1002,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 e8aa2f872..52eebc7c1 100644
--- a/core/flyout.js
+++ b/core/flyout.js
@@ -844,8 +844,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/workspace_svg.js b/core/workspace_svg.js
index d857bdf21..251d5ef10 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 70fd915a5..7f096956a 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));
}
From c5246fc8e2aacd5bc666528db069cb36d09f10fa Mon Sep 17 00:00:00 2001
From: Markus Bordihn
Date: Wed, 29 Jun 2016 23:38:32 +0200
Subject: [PATCH 04/25] Update toolbox.js
---
core/toolbox.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/core/toolbox.js b/core/toolbox.js
index 1e8c84af8..ac15ed128 100644
--- a/core/toolbox.js
+++ b/core/toolbox.js
@@ -278,7 +278,6 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) {
Blockly.resizeSvgContents(this.workspace_);
};
-
/**
* Sync trees of the toolbox.
* @param {Node} treeIn DOM tree of blocks, or null.
@@ -357,7 +356,6 @@ Blockly.Toolbox.prototype.syncTrees_ = function(treeIn, treeOut, pathToMedia) {
}
};
-
/**
* Recursively add colours to this toolbox.
* @param {Blockly.Toolbox.TreeNode} opt_tree Starting point of tree.
@@ -457,6 +455,7 @@ Blockly.Toolbox.TreeControl.prototype.enterDocument = function() {
this.handleTouchEvent_);
}
};
+
/**
* Handles touch events.
* @param {!goog.events.BrowserEvent} e The browser event.
From 9af3c6c73d15c4b9b21cea7f3da21b510eddb701 Mon Sep 17 00:00:00 2001
From: Andrew n marshall
Date: Sat, 2 Jul 2016 23:29:20 -0700
Subject: [PATCH 05/25] Updating image link in readme. (#470)
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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/**
-
+
From 8fa98030ff718867890d2d13a9c18031e20c3a1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niklas=20Laxstr=C3=B6m?=
Date: Thu, 7 Jul 2016 07:42:16 +0200
Subject: [PATCH 06/25] Localisation updates from https://translatewiki.net.
---
msg/json/ko.json | 34 +++++++++++++++++-----------------
msg/json/pl.json | 31 ++++++++++++++++++++-----------
msg/json/pt.json | 4 +++-
msg/json/ru.json | 11 ++++++-----
4 files changed, 46 insertions(+), 34 deletions(-)
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": "Возвращает значение истина, если первая вставка больше или равна второй.",
From 2b191e897e1b6f09133c03a4fd2bd7febd677ee6 Mon Sep 17 00:00:00 2001
From: Monica Kozbial
Date: Fri, 8 Jul 2016 11:43:48 -0700
Subject: [PATCH 07/25] Adding indexing settings, tests and fixing bugs (#464)
* Add indexing setting for JavaScript Generation
Adding setting to allow for switching between zero and one based indexing for Blockly Blocks such that the generated code will use this flag to determine whether one based or zero based indexing should be used. One based indexing is enabled by default.
* Updating js lists to do zero and one based index
Updated generated JavaScript to change depending on whether one based indexing is enabled or not.
* Updating js text to do zero and one based index
Change so that JavaScript generated for text blocks either assumes blocks use zero or one based index based on setting.
* Start of python indexing
Start of work on allowing one and zero indexing for generated python for lists.
* Fixing bug and lint fixed
Fixing bug caused by not setting the return of concat when concatenating lines for sublist and substring functions. Also renamed these functions to be getSubsequece. Fixed lint errors with spacing
* Converting from if to switch statements
Comverting if statements to switch statements when appropriate and adding spacing.
* Modified sublist JavaScript generation
Added case so that helper function is not generated if not necessary. Helper function is not generated if list length is not needed or if list is a simple block (such as a variable, as oppossed to a function call or list create).
* Stripping unecessary ids
Removing ids from xml file.
* Localisation updates from https://translatewiki.net.
* Fix typo in flyout.js (#403)
* Fix typo in flyout.js (#402)
* Localisation updates from https://translatewiki.net.
* Add indexing setting for JavaScript Generation
Adding setting to allow for switching between zero and one based indexing for Blockly Blocks such that the generated code will use this flag to determine whether one based or zero based indexing should be used. One based indexing is enabled by default.
* Updating js lists to do zero and one based index
Updated generated JavaScript to change depending on whether one based indexing is enabled or not.
* Updating js text to do zero and one based index
Change so that JavaScript generated for text blocks either assumes blocks use zero or one based index based on setting.
* Fixing bug and lint fixed
Fixing bug caused by not setting the return of concat when concatenating lines for sublist and substring functions. Also renamed these functions to be getSubsequece. Fixed lint errors with spacing
* Converting from if to switch statements
Comverting if statements to switch statements when appropriate and adding spacing.
* Modified sublist JavaScript generation
Added case so that helper function is not generated if not necessary. Helper function is not generated if list length is not needed or if list is a simple block (such as a variable, as oppossed to a function call or list create).
* Stripping unecessary ids
Removing ids from xml file.
* Updating generator test
Modifying sublist test and re-formatting spacing between blocks.
* Updating js lists to do zero and one based index
Updated generated JavaScript to change depending on whether one based indexing is enabled or not.
* Updating js text to do zero and one based index
Change so that JavaScript generated for text blocks either assumes blocks use zero or one based index based on setting.
* Fixing bug and lint fixed
Fixing bug caused by not setting the return of concat when concatenating lines for sublist and substring functions. Also renamed these functions to be getSubsequece. Fixed lint errors with spacing
* Converting from if to switch statements
Comverting if statements to switch statements when appropriate and adding spacing.
* Modified sublist JavaScript generation
Added case so that helper function is not generated if not necessary. Helper function is not generated if list length is not needed or if list is a simple block (such as a variable, as oppossed to a function call or list create).
* Stripping unecessary ids
Removing ids from xml file.
* Localisation updates from https://translatewiki.net.
* Localisation updates from https://translatewiki.net.
* Updating js lists to do zero and one based index
Updated generated JavaScript to change depending on whether one based indexing is enabled or not.
* Fixing bug and lint fixed
Fixing bug caused by not setting the return of concat when concatenating lines for sublist and substring functions. Also renamed these functions to be getSubsequece. Fixed lint errors with spacing
* Modified sublist JavaScript generation
Added case so that helper function is not generated if not necessary. Helper function is not generated if list length is not needed or if list is a simple block (such as a variable, as oppossed to a function call or list create).
* Stripping unecessary ids
Removing ids from xml file.
* Updating generator test
Modifying sublist test and re-formatting spacing between blocks.
* Adding tests for indexing and extra cases
Adding tests for indexing with custom block to adjust number based on what indexing is being generated.
* Adding tests and renaming tests
Adding tests for sublist and renaming tests.
* Fixes for order for sublists
Fixes so that parenthesis are generated properly for index for sublist
* Cleaning up test generated code
Changing order returned for unit test adjust index function to generate less unecessary parenthesis.
* Adding tests for order
Adding tests for order, relevant for methods that use index from start (because 1 is added)
* Fixing JS order for getIndex and setIndex
Changing to the correct order type when calling valueToCode in JS generation for getIndex and setIndex.
* Fixed unittest adjustIndex
Fixed uninttest adjustindex to also check whether the ONE_BASED_INDEXING variable has been defined to ensure proper behaviour.
* Fixing lint and formatting for JS/lists
Making line fixes and changing an if/elseif to case statement.
* Tests added to include case for bug found
Added tests with sublist combinations of different where's for the two indices after bug for this found in python.
* Adding and renaming tests
Adding test case for creating a sublist that encompasses the whole list but uses # and #-end instead of first last (applicable for python). Also, renaming tests.
* Adding contant and fixing python lists bugs
Adding contant for ONE_BASED_INDEXING and fixing bugs in python for lists.
* Fixing test get random
Fixing test get random to take into account indexing for return value.
* Adding indexing checkbox to test page
Adding checkbos on test page so that code can be generated for one and zero based indexing. Languages that are generated with zero based indexing that do not have it implemented will fail tests as expected.
* Fixing unittest getremove random
Fixing unittest getremove random to take into account the return value based on indexing.
* Change comparison for getremove random test
Fixed comparison to equal for the return value for getremove random.
* Fixing bugs with lists zero-indexing
Fixing getIndex and getSublist methods to pass for zero-indexed tests.
* Adding test cases and formatting
Adding test cases to text tests, reordering a couple list test, and formatting block spacing.
* Fixing unittest expected value
Fixing expected value fore unit tests for sublist.
* Cleanup
Removing obvious comments, formatting fixes, and naming in generated code in JS.
* Helper function for Python lists
Adding helper function for casting to int for indices.
* Expanding helper to reduce duplicated code
Expanding helper method to also get the property with the correct order and check indexing to reduce duplicated code.
* Cleaning up JS indexing with helper function
Adding helper function for indexing and used it in lists and text.
* Moving helper function and formatting fixes
Moving helper function, formatting fixes, and changing some generated code variable names.
* Fixing python generation for text
Fixing all failinng tests for python and using new helper method.
* Lint fixes and order in indexOf
Making lint fixes and correcting returned order in indexOf.
* Python variable renaming
Renaming a few generated variables.
* Fixing comment and order
Fixing comment to list Blockly.Block type and fixing order because it could be higher.
* Switching back to if
Switching switch back to if statements because there weren't enough cases to warrant for a switch.
* Adding order and fixing lists for Dart
Adding if null operator to operator precedence for Dart. Also, fixing lists implementation to pass unit tests and adding zero-indexing functionality.
* Formatting and lint fixes
Formatting and lint fixes
* Dart text fixed
Fixing Dart text generation to pass unit tests.
* Changing back to variable
Changing switch condition back to variable.
* Fixing ORDER_OVERRIDES
Inner and outer order was switched .
* Adding bug with order caused by generator change
Flooring order before comparision because of how the order constants were modified.
* Adding list tests
Adding tests for additional cases for lists/
* Adding comment for dart order
Adding comment for Dart ORDER_IF_NULL operator.
* Formatting fixes
Formatting fixes for line indentation.
* Fixing PHP order and lists generation
Fixing PHP order constants and fixing lists so that they pass unit tests.
* Fixing tests
Removing duplicate unit test
* Adding text tests
Adding tests for text.
* Renaming variable and removing unused variable
Renaming variables from exceptionIndex to errorIndex and removing unused at variable.
* Adding missing function call to test
Adding missing funciton call to test that was causing tests to fail when they shouldn't.
* Fixing PHP text generation
Fixing PHP text code generation so it passes unit tests.
* Formatting fixes
Cleaning up code, renamiing a variable.
* Fixing failing subsequence tests
Fixing JS code that failed for sublist/substring tests.
* Fixing intentation
Fixing indentation.
* Fixing Dart sublist/substring
Fixing sublist/substring to include condiiton where FROM_START (and not throw error by mistake) when zero-indexed.
* Adding order subtraction test
Adding test for checking order for subtraction x- (y - z) x - (y + z).
* Updating to new PHP power operator
Updating from pow function to ** operator to clean up code.
* Updating to new removeWhere
Updating removeMatching to removeWhere because new version of Dart now use removeWhere.
* Fix for lua rounding assertequals
Adding check for number in equlity check for comparing number for floats.
* Adding test for copy of list
Adding test that checks the list is copied when a sublist is made first-last.
* Formatting and order fixes
Fixing formatting such as indentation and order fixes.
* Adding comment for clarity
Adding comment about how Lua code generation is not supporting zero indexing.
* Changed variable names in code
Changed variable names to follow style guide and changed for loop variable from n to i as is typical.
* Reducing unecessarily generated functions and renaming variables
Reducing number of generated functions using gensym_ by adding parameters to provided function. Renaming variables to make functions more readble.
* Fixing sublist order and sort variable
Fixing order used for valueToCode for sublist and renaming list variable in sort to match rest of code..
* Fixing order constant order
Removing operator () that was incorrect and addiung ~,
* Fixing order and indentation
Fixing order return fro create lists blocks and fixing indentationn for string array.
* Fixing order and renaming variables
Fixing order to be the correct strength and renaming variables to be more readable/
* Changing assert blocks for unit tests
Changing assert blocks to have a value input instead of a field so there is more flexibility in writing tests.
* Cleaning up and adding missing order tests
Adding tests for order for paramters for list blocks that weren't being tested to uncover bugs. Test were also cleaned up/reorganized/renamed to be more readable and shorter vertically (but lines wider horizontally).
* Compile error fix and order in Dart generation.
Fixing compile error in generated code and incorrect order in get sublist for Dart.
* Fixing typo in getIndex and invalid parameter name
Fixing type in getIndex where list code should have been appended but instead an undefined variable was added. The parameter in lists_sort was changed to my_list because list is a reserved word in python.
* Fixing order, parenthesis bug, and variable declaration in Lua
Fixing incorrect order in Lua. Fixing bug caused by missing parenthesis around ternary operator in code. Variable code was declared with JavaScript syntax, this was fixed to be valid in Lua.
* Adding tests and formatting tests
Adding missing test for order in text/lists. Changing spacing/order of tests and updating comments.
* Fixing error in code
Changing to correct function call in empy tests and changing test name that was duplicated to be more clear.
* Renamed test helper function
* Fixing order and renaming variable in JS generator
Fixing order for charAt and renaming variable in code list_sort from listCode to list to be consistent with rest of code.
* Fixing order for dart text
Fixing roder for dart charAt
* Cleaning up generated code for Dart getIndex
Cleaning up generated code for Dart getIndex so that helper functions aren't generated unecessarily and adding comments.
* Fixing Dart remove random error
Fixing error caused by remove random implementation in Dart. index should have been x but instead was length - x.
* Fixing unit test blocks
Fixing Lua unit test block that should have just returned the number and removing unecessary checks in other blocks because the constant was defined.
* Fixing Lua assert equals block
string.format was throwing an error if one of the values happened to be a boolean.
* Adding tests for create text with number
Adding test for create text with numbers as parameters
* Fixing lua unit test block
Lua unit test block should have added 1
* Removing indexing setting for Lua tests
Removing setting index setting for Lua generation because it is always one-indexed.
* Fixing order and create text
Fixing failing test caused by improper order and fixed create text to properly convert to string when there is one element.
* Running linter on generator code
Running linter on generator code and fixing spacing/indentation problems.
* Editing comments and removing uneeded parenthesis
Editing and adding comments and removing uneeded parenthesis around ternary operator condition.
* Fixing order and changing variable names
Fixing orders that were incorrect and changing variable names to be more descriptive and consistent across code.
* Adding comment about list support and fixes for PHP
Adding comment about how lists are not fully supported for PHP. Adding missing order to PHP and fixing order errors throughout. Fixing regex for variable matching in lists. Cleaning up variable names to be more readable and consistent with other parts of code.
* Reducing complexity for getremove/remove in JS
Reducing complexity in generated code for getremove/remove in JavaScript by replacing unecessary helper function.
* Fixing spacing before inline comments
Ensuring there are two spaces before inline comments.
* Changing JS list copy for clarity
Changing JavaScript list copy to use slice(0) instead of concat for clarity and to use the same pattern as the other sublist methods.
* Changing generated variable name tmp_x
Changing tmp_x to tmpX to follow closer to the correct style for JavaScript.
* Prefixing empy lines between comment text
Prior to this change, comments with an empty line between text did not have a comment prefix before it, resulting in comment blocks that seemed disjoined although they were for the same block. This change affects how the prefix line function works so that those lines will have the prefix (if applicable) while still taking into account the trailing newline character.
* Changing for loops variable names
Changing most for loops to use i as the variable name (or j if applicable) or changing name to be more readable.
* Simplifying provided subsequence function
Simplifying subsequence function to generate a simpler function depending on where combination instead of a larger complex function that works for all where combinations.
* Style fixes
Fixing indentation, comments, and other formatting-type changes based on pull request comments.
* Fixing indentation
Fixing indentation and removing an extra newline.
* Fixing PHP mode implementation
Fixing PHP mode implementation to properlyu return multiple modes if applicable.
* Fixing line too long
Wrapping lines in php/math.js with lines longer than 80 characters.
* Wrapping long lines
Wrapping lines that are too long.
* Changing boolean casing
Changing boolean casing to be lowercase.
---
core/field_angle.js | 6 +-
core/field_dropdown.js | 20 +-
core/field_variable.js | 4 +-
core/generator.js | 6 +-
core/input.js | 4 +-
core/procedures.js | 4 +-
core/rendered_connection.js | 16 +-
core/variables.js | 8 +-
demos/blockfactory/blocks.js | 10 +-
demos/blockfactory/factory.js | 4 +-
generators/dart.js | 97 +-
generators/dart/colour.js | 88 +-
generators/dart/lists.js | 514 +-
generators/dart/math.js | 228 +-
generators/dart/procedures.js | 12 +-
generators/dart/text.js | 211 +-
generators/javascript.js | 67 +-
generators/javascript/colour.js | 52 +-
generators/javascript/lists.js | 446 +-
generators/javascript/math.js | 64 +-
generators/javascript/text.js | 238 +-
generators/lua.js | 14 +-
generators/lua/lists.js | 251 +-
generators/lua/procedures.js | 12 +-
generators/lua/text.js | 73 +-
generators/php.js | 187 +-
generators/php/colour.js | 62 +-
generators/php/lists.js | 588 +-
generators/php/math.js | 115 +-
generators/php/procedures.js | 12 +-
generators/php/text.js | 177 +-
generators/php/variables.js | 2 +-
generators/python.js | 71 +-
generators/python/colour.js | 10 +-
generators/python/lists.js | 372 +-
generators/python/procedures.js | 12 +-
generators/python/text.js | 185 +-
tests/generators/colour.xml | 36 +-
tests/generators/functions.xml | 60 +-
tests/generators/index.html | 29 +-
tests/generators/lists.xml | 8185 +++++++++++++++++++----
tests/generators/logic.xml | 192 +-
tests/generators/loops1.xml | 28 +-
tests/generators/loops2.xml | 60 +-
tests/generators/loops3.xml | 48 +-
tests/generators/math.xml | 947 ++-
tests/generators/text.xml | 4057 ++++++++++-
tests/generators/unittest.js | 37 +-
tests/generators/unittest_dart.js | 27 +-
tests/generators/unittest_javascript.js | 35 +-
tests/generators/unittest_lua.js | 26 +-
tests/generators/unittest_php.js | 97 +-
tests/generators/unittest_python.js | 27 +-
tests/generators/variables.xml | 12 +-
tests/jsunit/connection_db_test.js | 4 +-
55 files changed, 14237 insertions(+), 3912 deletions(-)
diff --git a/core/field_angle.js b/core/field_angle.js
index 00b0c16a4..9cb5675f4 100644
--- a/core/field_angle.js
+++ b/core/field_angle.js
@@ -154,15 +154,15 @@ Blockly.FieldAngle.prototype.showEditor_ = function() {
'y1': Blockly.FieldAngle.HALF,
'class': 'blocklyAngleLine'}, svg);
// Draw markers around the edge.
- for (var a = 0; a < 360; a += 15) {
+ for (var angle = 0; angle < 360; angle += 15) {
Blockly.createSvgElement('line', {
'x1': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS,
'y1': Blockly.FieldAngle.HALF,
'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS -
- (a % 45 == 0 ? 10 : 5),
+ (angle % 45 == 0 ? 10 : 5),
'y2': Blockly.FieldAngle.HALF,
'class': 'blocklyAngleMarks',
- 'transform': 'rotate(' + a + ',' +
+ 'transform': 'rotate(' + angle + ',' +
Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + ')'
}, svg);
}
diff --git a/core/field_dropdown.js b/core/field_dropdown.js
index 1e62cf50c..ec3dd4f5a 100644
--- a/core/field_dropdown.js
+++ b/core/field_dropdown.js
@@ -122,9 +122,9 @@ Blockly.FieldDropdown.prototype.showEditor_ = function() {
var menu = new goog.ui.Menu();
menu.setRightToLeft(this.sourceBlock_.RTL);
var options = this.getOptions_();
- for (var x = 0; x < options.length; x++) {
- var text = options[x][0]; // Human-readable text.
- var value = options[x][1]; // Language-neutral value.
+ for (var i = 0; i < options.length; i++) {
+ var text = options[i][0]; // Human-readable text.
+ var value = options[i][1]; // Language-neutral value.
var menuItem = new goog.ui.MenuItem(text);
menuItem.setRightToLeft(this.sourceBlock_.RTL);
menuItem.setValue(value);
@@ -223,11 +223,11 @@ Blockly.FieldDropdown.prototype.trimOptions_ = function() {
}
// Remove the prefix and suffix from the options.
var newOptions = [];
- for (var x = 0; x < options.length; x++) {
- var text = options[x][0];
- var value = options[x][1];
+ for (var i = 0; i < options.length; i++) {
+ var text = options[i][0];
+ var value = options[i][1];
text = text.substring(prefixLength, text.length - suffixLength);
- newOptions[x] = [text, value];
+ newOptions[i] = [text, value];
}
this.menuGenerator_ = newOptions;
};
@@ -268,10 +268,10 @@ Blockly.FieldDropdown.prototype.setValue = function(newValue) {
this.value_ = newValue;
// Look up and display the human-readable text.
var options = this.getOptions_();
- for (var x = 0; x < options.length; x++) {
+ for (var i = 0; i < options.length; i++) {
// Options are tuples of human-readable text and language-neutral values.
- if (options[x][1] == newValue) {
- this.setText(options[x][0]);
+ if (options[i][1] == newValue) {
+ this.setText(options[i][0]);
return;
}
}
diff --git a/core/field_variable.js b/core/field_variable.js
index cf903c04c..3c6491794 100644
--- a/core/field_variable.js
+++ b/core/field_variable.js
@@ -113,8 +113,8 @@ Blockly.FieldVariable.dropdownCreate = function() {
// Variables are not language-specific, use the name as both the user-facing
// text and the internal representation.
var options = [];
- for (var x = 0; x < variableList.length; x++) {
- options[x] = [variableList[x], variableList[x]];
+ for (var i = 0; i < variableList.length; i++) {
+ options[i] = [variableList[i], variableList[i]];
}
return options;
};
diff --git a/core/generator.js b/core/generator.js
index 8ee110f86..fecc35531 100644
--- a/core/generator.js
+++ b/core/generator.js
@@ -132,7 +132,7 @@ Blockly.Generator.prototype.workspaceToCode = function(workspace) {
* @return {string} The prefixed lines of code.
*/
Blockly.Generator.prototype.prefixLines = function(text, prefix) {
- return prefix + text.replace(/\n(.)/g, '\n' + prefix + '$1');
+ return prefix + text.replace(/(?!\n$)\n/g, '\n' + prefix);
};
/**
@@ -143,8 +143,8 @@ Blockly.Generator.prototype.prefixLines = function(text, prefix) {
Blockly.Generator.prototype.allNestedComments = function(block) {
var comments = [];
var blocks = block.getDescendants();
- for (var x = 0; x < blocks.length; x++) {
- var comment = blocks[x].getCommentText();
+ for (var i = 0; i < blocks.length; i++) {
+ var comment = blocks[i].getCommentText();
if (comment) {
comments.push(comment);
}
diff --git a/core/input.js b/core/input.js
index 346b053cb..4b4eb1df9 100644
--- a/core/input.js
+++ b/core/input.js
@@ -222,8 +222,8 @@ Blockly.Input.prototype.init = function() {
if (!this.sourceBlock_.workspace.rendered) {
return; // Headless blocks don't need fields initialized.
}
- for (var x = 0; x < this.fieldRow.length; x++) {
- this.fieldRow[x].init();
+ for (var i = 0; i < this.fieldRow.length; i++) {
+ this.fieldRow[i].init();
}
};
diff --git a/core/procedures.js b/core/procedures.js
index f98fbd92a..34419fb54 100644
--- a/core/procedures.js
+++ b/core/procedures.js
@@ -197,9 +197,9 @@ Blockly.Procedures.flyoutCategory = function(workspace) {
var mutation = goog.dom.createDom('mutation');
mutation.setAttribute('name', name);
block.appendChild(mutation);
- for (var t = 0; t < args.length; t++) {
+ for (var j = 0; j < args.length; j++) {
var arg = goog.dom.createDom('arg');
- arg.setAttribute('name', args[t]);
+ arg.setAttribute('name', args[j]);
mutation.appendChild(arg);
}
xmlList.push(block);
diff --git a/core/rendered_connection.js b/core/rendered_connection.js
index ef7130dc6..552248526 100644
--- a/core/rendered_connection.js
+++ b/core/rendered_connection.js
@@ -234,8 +234,8 @@ Blockly.RenderedConnection.prototype.unhideAll = function() {
// Show all connections of this block.
connections = block.getConnections_(true);
}
- for (var c = 0; c < connections.length; c++) {
- renderList.push.apply(renderList, connections[c].unhideAll());
+ for (var i = 0; i < connections.length; i++) {
+ renderList.push.apply(renderList, connections[i].unhideAll());
}
if (!renderList.length) {
// Leaf block.
@@ -275,17 +275,17 @@ Blockly.RenderedConnection.prototype.hideAll = function() {
this.setHidden(true);
if (this.targetConnection) {
var blocks = this.targetBlock().getDescendants();
- for (var b = 0; b < blocks.length; b++) {
- var block = blocks[b];
+ for (var i = 0; i < blocks.length; i++) {
+ var block = blocks[i];
// Hide all connections of all children.
var connections = block.getConnections_(true);
- for (var c = 0; c < connections.length; c++) {
- connections[c].setHidden(true);
+ for (var j = 0; j < connections.length; j++) {
+ connections[j].setHidden(true);
}
// Close all bubbles of all children.
var icons = block.getIcons();
- for (var i = 0; i < icons.length; i++) {
- icons[i].setVisible(false);
+ for (var j = 0; j < icons.length; j++) {
+ icons[j].setVisible(false);
}
}
}
diff --git a/core/variables.js b/core/variables.js
index 9399177fe..450d33fcf 100644
--- a/core/variables.js
+++ b/core/variables.js
@@ -54,10 +54,10 @@ Blockly.Variables.allVariables = function(root) {
}
var variableHash = Object.create(null);
// Iterate through every block and add each variable to the hash.
- for (var x = 0; x < blocks.length; x++) {
- var blockVariables = blocks[x].getVars();
- for (var y = 0; y < blockVariables.length; y++) {
- var varName = blockVariables[y];
+ for (var i = 0; i < blocks.length; i++) {
+ var blockVariables = blocks[i].getVars();
+ for (var j = 0; j < blockVariables.length; j++) {
+ var varName = blockVariables[j];
// Variable name may be null if the block is only half-built.
if (varName) {
variableHash[varName.toLowerCase()] = varName;
diff --git a/demos/blockfactory/blocks.js b/demos/blockfactory/blocks.js
index 5008e6a20..012c76fe0 100644
--- a/demos/blockfactory/blocks.js
+++ b/demos/blockfactory/blocks.js
@@ -505,13 +505,13 @@ Blockly.Blocks['type_group'] = {
// Parse XML to restore the group of types.
this.typeCount_ = parseInt(container.getAttribute('types'), 10);
this.updateShape_();
- for (var x = 0; x < this.typeCount_; x++) {
- this.removeInput('TYPE' + x);
+ for (var i = 0; i < this.typeCount_; i++) {
+ this.removeInput('TYPE' + i);
}
- for (var x = 0; x < this.typeCount_; x++) {
- var input = this.appendValueInput('TYPE' + x)
+ for (var i = 0; i < this.typeCount_; i++) {
+ var input = this.appendValueInput('TYPE' + i)
.setCheck('Type');
- if (x == 0) {
+ if (i == 0) {
input.appendField('any of');
}
}
diff --git a/demos/blockfactory/factory.js b/demos/blockfactory/factory.js
index 3e1cf16a0..1bfdf6ce9 100644
--- a/demos/blockfactory/factory.js
+++ b/demos/blockfactory/factory.js
@@ -501,8 +501,8 @@ function getTypesFrom_(block, name) {
types = [escapeString(typeBlock.getFieldValue('TYPE'))];
} else if (typeBlock.type == 'type_group') {
types = [];
- for (var n = 0; n < typeBlock.typeCount_; n++) {
- types = types.concat(getTypesFrom_(typeBlock, 'TYPE' + n));
+ for (var i = 0; i < typeBlock.typeCount_; i++) {
+ types = types.concat(getTypesFrom_(typeBlock, 'TYPE' + i));
}
// Remove duplicates.
var hash = Object.create(null);
diff --git a/generators/dart.js b/generators/dart.js
index f0d7715ea..6fb1236d4 100644
--- a/generators/dart.js
+++ b/generators/dart.js
@@ -45,16 +45,28 @@ Blockly.Dart = new Blockly.Generator('Dart');
Blockly.Dart.addReservedWords(
// https://www.dartlang.org/docs/spec/latest/dart-language-specification.pdf
// Section 16.1.1
- 'assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,' +
+ 'assert,break,case,catch,class,const,continue,default,do,else,enum,' +
+ 'extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,' +
+ 'switch,this,throw,true,try,var,void,while,with,' +
// https://api.dartlang.org/dart_core.html
- 'print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError');
+ 'print,identityHashCode,identical,BidirectionalIterator,Comparable,' +
+ 'double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,' +
+ 'Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,' +
+ 'Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,' +
+ 'StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,' +
+ 'ArgumentError,AssertionError,CastError,ConcurrentModificationError,' +
+ 'CyclicInitializationError,Error,Exception,FallThroughError,' +
+ 'FormatException,IntegerDivisionByZeroException,NoSuchMethodError,' +
+ 'NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,' +
+ 'StateError,TypeError,UnimplementedError,UnsupportedError'
+);
/**
* Order of operation ENUMs.
* https://www.dartlang.org/docs/dart-up-and-running/ch02.html#operator_table
*/
Blockly.Dart.ORDER_ATOMIC = 0; // 0 "" ...
-Blockly.Dart.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .
+Blockly.Dart.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . ?.
Blockly.Dart.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr
Blockly.Dart.ORDER_MULTIPLICATIVE = 3; // * / % ~/
Blockly.Dart.ORDER_ADDITIVE = 4; // + -
@@ -66,11 +78,18 @@ Blockly.Dart.ORDER_RELATIONAL = 9; // >= > <= < as is is!
Blockly.Dart.ORDER_EQUALITY = 10; // == !=
Blockly.Dart.ORDER_LOGICAL_AND = 11; // &&
Blockly.Dart.ORDER_LOGICAL_OR = 12; // ||
-Blockly.Dart.ORDER_CONDITIONAL = 13; // expr ? expr : expr
-Blockly.Dart.ORDER_CASCADE = 14; // ..
-Blockly.Dart.ORDER_ASSIGNMENT = 15; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
+Blockly.Dart.ORDER_IF_NULL = 13; // ??
+Blockly.Dart.ORDER_CONDITIONAL = 14; // expr ? expr : expr
+Blockly.Dart.ORDER_CASCADE = 15; // ..
+Blockly.Dart.ORDER_ASSIGNMENT = 16; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
Blockly.Dart.ORDER_NONE = 99; // (...)
+/**
+ * Allow for switching between one and zero based indexing for lists and text,
+ * one based by default.
+ */
+Blockly.Dart.ONE_BASED_INDEXING = true;
+
/**
* Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
@@ -182,9 +201,9 @@ Blockly.Dart.scrub_ = function(block, code) {
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
- for (var x = 0; x < block.inputList.length; x++) {
- if (block.inputList[x].type == Blockly.INPUT_VALUE) {
- var childBlock = block.inputList[x].connection.targetBlock();
+ for (var i = 0; i < block.inputList.length; i++) {
+ if (block.inputList[i].type == Blockly.INPUT_VALUE) {
+ var childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
var comment = Blockly.Dart.allNestedComments(childBlock);
if (comment) {
@@ -198,3 +217,63 @@ Blockly.Dart.scrub_ = function(block, code) {
var nextCode = Blockly.Dart.blockToCode(nextBlock);
return commentCode + code + nextCode;
};
+
+/**
+ * Gets a property and adjusts the value while taking into account indexing.
+ * @param {!Blockly.Block} block The block.
+ * @param {string} atId The property ID of the element to get.
+ * @param {number=} opt_delta Value to add.
+ * @param {boolean=} opt_negate Whether to negate the value.
+ * @param {number=} opt_order The highest order acting on this value.
+ * @return {string|number}
+ */
+Blockly.Dart.getAdjusted = function(block, atId, opt_delta, opt_negate,
+ opt_order) {
+ var delta = opt_delta || 0;
+ var order = opt_order || Blockly.Dart.ORDER_NONE;
+ if (Blockly.Dart.ONE_BASED_INDEXING) {
+ delta--;
+ }
+ var defaultAtIndex = Blockly.Dart.ONE_BASED_INDEXING ? '1' : '0';
+ if (delta) {
+ var at = Blockly.Dart.valueToCode(block, atId,
+ Blockly.Dart.ORDER_ADDITIVE) || defaultAtIndex;
+ } else if (opt_negate) {
+ var at = Blockly.Dart.valueToCode(block, atId,
+ Blockly.Dart.ORDER_UNARY_PREFIX) || defaultAtIndex;
+ } else {
+ var at = Blockly.Dart.valueToCode(block, atId, order) ||
+ defaultAtIndex;
+ }
+
+ if (Blockly.isNumber(at)) {
+ // If the index is a naked number, adjust it right now.
+ at = parseInt(at, 10) + delta;
+ if (opt_negate) {
+ at = -at;
+ }
+ } else {
+ // If the index is dynamic, adjust it in code.
+ if (delta > 0) {
+ at = at + ' + ' + delta;
+ var innerOrder = Blockly.Dart.ORDER_ADDITIVE;
+ } else if (delta < 0) {
+ at = at + ' - ' + -delta;
+ var innerOrder = Blockly.Dart.ORDER_ADDITIVE;
+ }
+ if (opt_negate) {
+ if (delta) {
+ at = '-(' + at + ')';
+ } else {
+ at = '-' + at;
+ }
+ var innerOrder = Blockly.Dart.ORDER_UNARY_PREFIX;
+ }
+ innerOrder = Math.floor(innerOrder);
+ order = Math.floor(order);
+ if (innerOrder && order >= innerOrder) {
+ at = '(' + at + ')';
+ }
+ }
+ return at;
+};
diff --git a/generators/dart/colour.js b/generators/dart/colour.js
index d73415522..7ded91419 100644
--- a/generators/dart/colour.js
+++ b/generators/dart/colour.js
@@ -43,13 +43,13 @@ Blockly.Dart['colour_random'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'colour_random',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {',
- ' String hex = \'0123456789abcdef\';',
- ' var rnd = new Math.Random();',
- ' return \'#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'',
- ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'',
- ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\';',
- '}']);
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {',
+ ' String hex = \'0123456789abcdef\';',
+ ' var rnd = new Math.Random();',
+ ' return \'#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'',
+ ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'',
+ ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\';',
+ '}']);
var code = functionName + '()';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
@@ -67,22 +67,22 @@ Blockly.Dart['colour_rgb'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'colour_rgb',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(num r, num g, num b) {',
- ' num rn = (Math.max(Math.min(r, 1), 0) * 255).round();',
- ' String rs = rn.toInt().toRadixString(16);',
- ' rs = \'0$rs\';',
- ' rs = rs.substring(rs.length - 2);',
- ' num gn = (Math.max(Math.min(g, 1), 0) * 255).round();',
- ' String gs = gn.toInt().toRadixString(16);',
- ' gs = \'0$gs\';',
- ' gs = gs.substring(gs.length - 2);',
- ' num bn = (Math.max(Math.min(b, 1), 0) * 255).round();',
- ' String bs = bn.toInt().toRadixString(16);',
- ' bs = \'0$bs\';',
- ' bs = bs.substring(bs.length - 2);',
- ' return \'#$rs$gs$bs\';',
- '}']);
+ ' num rn = (Math.max(Math.min(r, 1), 0) * 255).round();',
+ ' String rs = rn.toInt().toRadixString(16);',
+ ' rs = \'0$rs\';',
+ ' rs = rs.substring(rs.length - 2);',
+ ' num gn = (Math.max(Math.min(g, 1), 0) * 255).round();',
+ ' String gs = gn.toInt().toRadixString(16);',
+ ' gs = \'0$gs\';',
+ ' gs = gs.substring(gs.length - 2);',
+ ' num bn = (Math.max(Math.min(b, 1), 0) * 255).round();',
+ ' String bs = bn.toInt().toRadixString(16);',
+ ' bs = \'0$bs\';',
+ ' bs = bs.substring(bs.length - 2);',
+ ' return \'#$rs$gs$bs\';',
+ '}']);
var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
@@ -100,29 +100,29 @@ Blockly.Dart['colour_blend'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'colour_blend',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(String c1, String c2, num ratio) {',
- ' ratio = Math.max(Math.min(ratio, 1), 0);',
- ' int r1 = int.parse(\'0x${c1.substring(1, 3)}\');',
- ' int g1 = int.parse(\'0x${c1.substring(3, 5)}\');',
- ' int b1 = int.parse(\'0x${c1.substring(5, 7)}\');',
- ' int r2 = int.parse(\'0x${c2.substring(1, 3)}\');',
- ' int g2 = int.parse(\'0x${c2.substring(3, 5)}\');',
- ' int b2 = int.parse(\'0x${c2.substring(5, 7)}\');',
- ' num rn = (r1 * (1 - ratio) + r2 * ratio).round();',
- ' String rs = rn.toInt().toRadixString(16);',
- ' num gn = (g1 * (1 - ratio) + g2 * ratio).round();',
- ' String gs = gn.toInt().toRadixString(16);',
- ' num bn = (b1 * (1 - ratio) + b2 * ratio).round();',
- ' String bs = bn.toInt().toRadixString(16);',
- ' rs = \'0$rs\';',
- ' rs = rs.substring(rs.length - 2);',
- ' gs = \'0$gs\';',
- ' gs = gs.substring(gs.length - 2);',
- ' bs = \'0$bs\';',
- ' bs = bs.substring(bs.length - 2);',
- ' return \'#$rs$gs$bs\';',
- '}']);
+ ' ratio = Math.max(Math.min(ratio, 1), 0);',
+ ' int r1 = int.parse(\'0x${c1.substring(1, 3)}\');',
+ ' int g1 = int.parse(\'0x${c1.substring(3, 5)}\');',
+ ' int b1 = int.parse(\'0x${c1.substring(5, 7)}\');',
+ ' int r2 = int.parse(\'0x${c2.substring(1, 3)}\');',
+ ' int g2 = int.parse(\'0x${c2.substring(3, 5)}\');',
+ ' int b2 = int.parse(\'0x${c2.substring(5, 7)}\');',
+ ' num rn = (r1 * (1 - ratio) + r2 * ratio).round();',
+ ' String rs = rn.toInt().toRadixString(16);',
+ ' num gn = (g1 * (1 - ratio) + g2 * ratio).round();',
+ ' String gs = gn.toInt().toRadixString(16);',
+ ' num bn = (b1 * (1 - ratio) + b2 * ratio).round();',
+ ' String bs = bn.toInt().toRadixString(16);',
+ ' rs = \'0$rs\';',
+ ' rs = rs.substring(rs.length - 2);',
+ ' gs = \'0$gs\';',
+ ' gs = gs.substring(gs.length - 2);',
+ ' bs = \'0$bs\';',
+ ' bs = bs.substring(bs.length - 2);',
+ ' return \'#$rs$gs$bs\';',
+ '}']);
var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
diff --git a/generators/dart/lists.js b/generators/dart/lists.js
index 24fcd2243..ae5ecc20e 100644
--- a/generators/dart/lists.js
+++ b/generators/dart/lists.js
@@ -38,49 +38,52 @@ Blockly.Dart['lists_create_empty'] = function(block) {
Blockly.Dart['lists_create_with'] = function(block) {
// Create a list with any number of elements of any type.
- var code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n,
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i,
Blockly.Dart.ORDER_NONE) || 'null';
}
- code = '[' + code.join(', ') + ']';
+ var code = '[' + elements.join(', ') + ']';
return [code, Blockly.Dart.ORDER_ATOMIC];
};
Blockly.Dart['lists_repeat'] = function(block) {
// Create a list with one element repeated.
- var argument0 = Blockly.Dart.valueToCode(block, 'ITEM',
- Blockly.Dart.ORDER_NONE) || 'null';
- var argument1 = Blockly.Dart.valueToCode(block, 'NUM',
- Blockly.Dart.ORDER_NONE) || '0';
- var code = 'new List.filled(' + argument1 + ', ' + argument0 + ')';
+ var element = Blockly.Dart.valueToCode(block, 'ITEM',
+ Blockly.Dart.ORDER_NONE) || 'null';
+ var repeatCount = Blockly.Dart.valueToCode(block, 'NUM',
+ Blockly.Dart.ORDER_NONE) || '0';
+ var code = 'new List.filled(' + repeatCount + ', ' + element + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['lists_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var list = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
- return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX];
+ return [list + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['lists_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var list = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
- return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX];
+ return [list + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['lists_indexOf'] = function(block) {
// Find an item in the list.
var operator = block.getFieldValue('END') == 'FIRST' ?
'indexOf' : 'lastIndexOf';
- var argument0 = Blockly.Dart.valueToCode(block, 'FIND',
+ var item = Blockly.Dart.valueToCode(block, 'FIND',
Blockly.Dart.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var list = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
- var code = argument1 + '.' + operator + '(' + argument0 + ') + 1';
- return [code, Blockly.Dart.ORDER_ADDITIVE];
+ var code = list + '.' + operator + '(' + item + ')';
+ if (Blockly.Dart.ONE_BASED_INDEXING) {
+ return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE];
+ }
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['lists_getIndex'] = function(block) {
@@ -88,94 +91,156 @@ Blockly.Dart['lists_getIndex'] = function(block) {
// Note: Until January 2013 this block did not have MODE or WHERE inputs.
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Dart.valueToCode(block, 'AT',
- Blockly.Dart.ORDER_UNARY_PREFIX) || '1';
- var list = Blockly.Dart.valueToCode(block, 'VALUE',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
+ var listOrder = (where == 'RANDOM' || where == 'FROM_END') ?
+ Blockly.Dart.ORDER_NONE : Blockly.Dart.ORDER_UNARY_POSTFIX;
+ var list = Blockly.Dart.valueToCode(block, 'VALUE', listOrder) || '[]';
+ // Cache non-trivial values to variables to prevent repeated look-ups.
+ // Closure, which accesses and modifies 'list'.
+ function cacheList() {
+ var listVar = Blockly.Dart.variableDB_.getDistinctName(
+ 'tmp_list', Blockly.Variables.NAME_TYPE);
+ var code = 'List ' + listVar + ' = ' + list + ';\n';
+ list = listVar;
+ return code;
+ }
+ // If `list` would be evaluated more than once (which is the case for
+ // RANDOM REMOVE and FROM_END) and is non-trivial, make sure to access it
+ // only once.
+ if (((where == 'RANDOM' && mode == 'REMOVE') || where == 'FROM_END') &&
+ !list.match(/^\w+$/)) {
+ // `list` is an expression, so we may not evaluate it more than once.
+ if (where == 'RANDOM') {
+ Blockly.Dart.definitions_['import_dart_math'] =
+ 'import \'dart:math\' as Math;';
+ // We can use multiple statements.
+ var code = cacheList();
+ var xVar = Blockly.Dart.variableDB_.getDistinctName(
+ 'tmp_x', Blockly.Variables.NAME_TYPE);
+ code += 'int ' + xVar + ' = new Math.Random().nextInt(' + list +
+ '.length);\n';
+ code += list + '.removeAt(' + xVar + ');\n';
+ return code;
+ } else { // where == 'FROM_END'
+ if (mode == 'REMOVE') {
+ // We can use multiple statements.
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ var code = cacheList();
+ code += list + '.removeAt(' + list + '.length' + ' - ' + at + ');\n';
+ return code;
- if (where == 'FIRST') {
- if (mode == 'GET') {
- var code = list + '.first';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.removeAt(0)';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'REMOVE') {
- return list + '.removeAt(0);\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'GET') {
- var code = list + '.last';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.removeLast()';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'REMOVE') {
- return list + '.removeLast();\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'GET') {
- var code = list + '[' + at + ']';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.removeAt(' + at + ')';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'REMOVE') {
- return list + '.removeAt(' + at + ');\n';
- }
- } else if (where == 'FROM_END') {
- if (mode == 'GET') {
- var functionName = Blockly.Dart.provideFunction_(
- 'lists_get_from_end',
- [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
- '(List myList, num x) {',
- ' x = myList.length - x;',
- ' return myList.removeAt(x);',
- '}']);
- code = functionName + '(' + list + ', ' + at + ')';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') {
- var functionName = Blockly.Dart.provideFunction_(
- 'lists_remove_from_end',
- [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
- '(List myList, num x) {',
- ' x = myList.length - x;',
- ' return myList.removeAt(x);',
- '}']);
- code = functionName + '(' + list + ', ' + at + ')';
- if (mode == 'GET_REMOVE') {
+ } else if (mode == 'GET') {
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1);
+ // We need to create a procedure to avoid reevaluating values.
+ var functionName = Blockly.Dart.provideFunction_(
+ 'lists_get_from_end',
+ ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ '(List my_list, num x) {',
+ ' x = my_list.length - x;',
+ ' return my_list[x];',
+ '}']);
+ var code = functionName + '(' + list + ', ' + at + ')';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE') {
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1);
+ // We need to create a procedure to avoid reevaluating values.
+ var functionName = Blockly.Dart.provideFunction_(
+ 'lists_remove_from_end',
+ ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ '(List my_list, num x) {',
+ ' x = my_list.length - x;',
+ ' return my_list.removeAt(x);',
+ '}']);
+ var code = functionName + '(' + list + ', ' + at + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'REMOVE') {
- return code + ';\n';
}
}
- } else if (where == 'RANDOM') {
- Blockly.Dart.definitions_['import_dart_math'] =
- 'import \'dart:math\' as Math;';
- var functionName = Blockly.Dart.provideFunction_(
- 'lists_get_random_item',
- [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
- '(List myList, bool remove) {',
- ' int x = new Math.Random().nextInt(myList.length);',
- ' if (remove) {',
- ' return myList.removeAt(x);',
- ' } else {',
- ' return myList[x];',
- ' }',
- '}']);
- code = functionName + '(' + list + ', ' + (mode != 'GET') + ')';
- if (mode == 'GET' || mode == 'GET_REMOVE') {
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else if (mode == 'REMOVE') {
- return code + ';\n';
+ } else {
+ // Either `list` is a simple variable, or we only need to refer to `list`
+ // once.
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'GET') {
+ var code = list + '.first';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.removeAt(0)';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'REMOVE') {
+ return list + '.removeAt(0);\n';
+ }
+ break;
+ case 'LAST':
+ if (mode == 'GET') {
+ var code = list + '.last';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.removeLast()';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'REMOVE') {
+ return list + '.removeLast();\n';
+ }
+ break;
+ case 'FROM_START':
+ var at = Blockly.Dart.getAdjusted(block, 'AT');
+ if (mode == 'GET') {
+ var code = list + '[' + at + ']';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.removeAt(' + at + ')';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'REMOVE') {
+ return list + '.removeAt(' + at + ');\n';
+ }
+ break;
+ case 'FROM_END':
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ if (mode == 'GET') {
+ var code = list + '[' + list + '.length - ' + at + ']';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') {
+ var code = list + '.removeAt(' + list + '.length - ' + at + ')';
+ if (mode == 'GET_REMOVE') {
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'REMOVE') {
+ return code + ';\n';
+ }
+ }
+ break;
+ case 'RANDOM':
+ Blockly.Dart.definitions_['import_dart_math'] =
+ 'import \'dart:math\' as Math;';
+ if (mode == 'REMOVE') {
+ // We can use multiple statements.
+ var xVar = Blockly.Dart.variableDB_.getDistinctName(
+ 'tmp_x', Blockly.Variables.NAME_TYPE);
+ var code = 'int ' + xVar + ' = new Math.Random().nextInt(' + list +
+ '.length);\n';
+ code += list + '.removeAt(' + xVar + ');\n';
+ return code;
+ } else if (mode == 'GET') {
+ var functionName = Blockly.Dart.provideFunction_(
+ 'lists_get_random_item',
+ ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ '(List my_list) {',
+ ' int x = new Math.Random().nextInt(my_list.length);',
+ ' return my_list[x];',
+ '}']);
+ var code = functionName + '(' + list + ')';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ } else if (mode == 'GET_REMOVE') {
+ var functionName = Blockly.Dart.provideFunction_(
+ 'lists_remove_random_item',
+ ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ '(List my_list) {',
+ ' int x = new Math.Random().nextInt(my_list.length);',
+ ' return my_list.removeAt(x);',
+ '}']);
+ var code = functionName + '(' + list + ')';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ }
+ break;
}
}
throw 'Unhandled combination (lists_getIndex).';
@@ -184,12 +249,10 @@ Blockly.Dart['lists_getIndex'] = function(block) {
Blockly.Dart['lists_setIndex'] = function(block) {
// Set element at index.
// Note: Until February 2013 this block did not have MODE or WHERE inputs.
- var list = Blockly.Dart.valueToCode(block, 'LIST',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Dart.valueToCode(block, 'AT',
- Blockly.Dart.ORDER_ADDITIVE) || '1';
+ var list = Blockly.Dart.valueToCode(block, 'LIST',
+ Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
var value = Blockly.Dart.valueToCode(block, 'TO',
Blockly.Dart.ORDER_ASSIGNMENT) || 'null';
// Cache non-trivial values to variables to prevent repeated look-ups.
@@ -204,59 +267,61 @@ Blockly.Dart['lists_setIndex'] = function(block) {
list = listVar;
return code;
}
- if (where == 'FIRST') {
- if (mode == 'SET') {
- return list + '[0] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return list + '.insert(0, ' + value + ');\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'SET') {
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'SET') {
+ return list + '[0] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ return list + '.insert(0, ' + value + ');\n';
+ }
+ break;
+ case 'LAST':
+ if (mode == 'SET') {
+ var code = cacheList();
+ code += list + '[' + list + '.length - 1] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ return list + '.add(' + value + ');\n';
+ }
+ break;
+ case 'FROM_START':
+ var at = Blockly.Dart.getAdjusted(block, 'AT');
+ if (mode == 'SET') {
+ return list + '[' + at + '] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ return list + '.insert(' + at + ', ' + value + ');\n';
+ }
+ break;
+ case 'FROM_END':
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false,
+ Blockly.Dart.ORDER_ADDITIVE);
var code = cacheList();
- code += list + '[' + list + '.length - 1] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- return list + '.add(' + value + ');\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'SET') {
- return list + '[' + at + '] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return list + '.insert(' + at + ', ' + value + ');\n';
- }
- } else if (where == 'FROM_END') {
- var code = cacheList();
- if (mode == 'SET') {
- code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- code += list + '.insert(' + list + '.length - ' + at + ', ' +
- value + ');\n';
- return code;
- }
- } else if (where == 'RANDOM') {
- Blockly.Dart.definitions_['import_dart_math'] =
- 'import \'dart:math\' as Math;';
- var code = cacheList();
- var xVar = Blockly.Dart.variableDB_.getDistinctName(
- 'tmp_x', Blockly.Variables.NAME_TYPE);
- code += 'int ' + xVar +
- ' = new Math.Random().nextInt(' + list + '.length);';
- if (mode == 'SET') {
- code += list + '[' + xVar + '] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- code += list + '.insert(' + xVar + ', ' + value + ');\n';
- return code;
- }
+ if (mode == 'SET') {
+ code += list + '[' + list + '.length - ' + at + '] = ' + value +
+ ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += list + '.insert(' + list + '.length - ' + at + ', ' +
+ value + ');\n';
+ return code;
+ }
+ break;
+ case 'RANDOM':
+ Blockly.Dart.definitions_['import_dart_math'] =
+ 'import \'dart:math\' as Math;';
+ var code = cacheList();
+ var xVar = Blockly.Dart.variableDB_.getDistinctName(
+ 'tmp_x', Blockly.Variables.NAME_TYPE);
+ code += 'int ' + xVar +
+ ' = new Math.Random().nextInt(' + list + '.length);\n';
+ if (mode == 'SET') {
+ code += list + '[' + xVar + '] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += list + '.insert(' + xVar + ', ' + value + ');\n';
+ return code;
+ }
+ break;
}
throw 'Unhandled combination (lists_setIndex).';
};
@@ -267,43 +332,67 @@ Blockly.Dart['lists_getSublist'] = function(block) {
Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.Dart.valueToCode(block, 'AT1',
- Blockly.Dart.ORDER_NONE) || '1';
- var at2 = Blockly.Dart.valueToCode(block, 'AT2',
- Blockly.Dart.ORDER_NONE) || '1';
- if ((where1 == 'FIRST' || where1 == 'FROM_START' && Blockly.isNumber(at1)) &&
- (where2 == 'LAST' || where2 == 'FROM_START' && Blockly.isNumber(at2))) {
- // Simple case that can be done inline.
- at1 = where1 == 'FIRST' ? 0 : parseInt(at1, 10) - 1;
+ if (list.match(/^\w+$/) || (where1 != 'FROM_END' && where2 == 'FROM_START')) {
+ // If the list is a is a variable or doesn't require a call for length,
+ // don't generate a helper function.
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1');
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ at1 = list + '.length - ' + at1;
+ break;
+ case 'FIRST':
+ var at1 = '0';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ at2 = list + '.length - ' + at2;
+ break;
+ case 'LAST':
+ // There is no second index if LAST option is chosen.
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
if (where2 == 'LAST') {
- code = list + '.sublist(' + at1 + ')';
+ var code = list + '.sublist(' + at1 + ')';
} else {
- at2 = parseInt(at2, 10);
- code = list + '.sublist(' + at1 + ', ' + at2 + ')';
+ var code = list + '.sublist(' + at1 + ', ' + at2 + ')';
}
} else {
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1');
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2');
var functionName = Blockly.Dart.provideFunction_(
'lists_get_sublist',
- [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(list, where1, at1, where2, at2) {',
- ' int getAt(where, at) {',
- ' if (where == \'FROM_START\') {',
- ' at--;',
- ' } else if (where == \'FROM_END\') {',
- ' at = list.length - at;',
- ' } else if (where == \'FIRST\') {',
- ' at = 0;',
- ' } else if (where == \'LAST\') {',
- ' at = list.length - 1;',
- ' } else {',
- ' throw \'Unhandled option (lists_getSublist).\';',
- ' }',
- ' return at;',
- ' }',
- ' at1 = getAt(where1, at1);',
- ' at2 = getAt(where2, at2) + 1;',
- ' return list.sublist(at1, at2);',
- '}']);
+ ' int getAt(where, at) {',
+ ' if (where == \'FROM_END\') {',
+ ' at = list.length - 1 - at;',
+ ' } else if (where == \'FIRST\') {',
+ ' at = 0;',
+ ' } else if (where == \'LAST\') {',
+ ' at = list.length - 1;',
+ ' } else if (where != \'FROM_START\') {',
+ ' throw \'Unhandled option (lists_getSublist).\';',
+ ' }',
+ ' return at;',
+ ' }',
+ ' at1 = getAt(where1, at1);',
+ ' at2 = getAt(where2, at2) + 1;',
+ ' return list.sublist(at1, at2);',
+ '}']);
var code = functionName + '(' + list + ', \'' +
where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
}
@@ -312,51 +401,52 @@ Blockly.Dart['lists_getSublist'] = function(block) {
Blockly.Dart['lists_sort'] = function(block) {
// Block for sorting a list.
- var listCode = Blockly.Dart.valueToCode(block, 'LIST',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
+ var list = Blockly.Dart.valueToCode(block, 'LIST',
+ Blockly.Dart.ORDER_NONE) || '[]';
var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;
var type = block.getFieldValue('TYPE');
var sortFunctionName = Blockly.Dart.provideFunction_(
- 'lists_sort',
- ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
- '(list, type, direction) {',
- ' var compareFuncs = {',
- ' "NUMERIC": (a, b) => direction * a.compareTo(b),',
- ' "TEXT": (a, b) => direction * a.toString().compareTo(b.toString()),',
- ' "IGNORE_CASE": ',
- ' (a, b) => direction * ',
- ' a.toString().toLowerCase().compareTo(b.toString().toLowerCase())',
- ' };',
- ' list = new List.from(list);', // Clone the list.
- ' var compare = compareFuncs[type];',
- ' list.sort(compare);',
- ' return list;',
- '}']);
- return [sortFunctionName + '(' + listCode + ', ' +
+ 'lists_sort',
+ ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ '(list, type, direction) {',
+ ' var compareFuncs = {',
+ ' "NUMERIC": (a, b) => direction * a.compareTo(b),',
+ ' "TEXT": (a, b) => direction * ' +
+ 'a.toString().compareTo(b.toString()),',
+ ' "IGNORE_CASE": ',
+ ' (a, b) => direction * ',
+ ' a.toString().toLowerCase().compareTo(b.toString().toLowerCase())',
+ ' };',
+ ' list = new List.from(list);', // Clone the list.
+ ' var compare = compareFuncs[type];',
+ ' list.sort(compare);',
+ ' return list;',
+ '}']);
+ return [sortFunctionName + '(' + list + ', ' +
'"' + type + '", ' + direction + ')',
Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['lists_split'] = function(block) {
// Block for splitting text into a list, or joining a list into text.
- var value_input = Blockly.Dart.valueToCode(block, 'INPUT',
+ var input = Blockly.Dart.valueToCode(block, 'INPUT',
Blockly.Dart.ORDER_UNARY_POSTFIX);
- var value_delim = Blockly.Dart.valueToCode(block, 'DELIM',
+ var delimiter = Blockly.Dart.valueToCode(block, 'DELIM',
Blockly.Dart.ORDER_NONE) || '\'\'';
var mode = block.getFieldValue('MODE');
if (mode == 'SPLIT') {
- if (!value_input) {
- value_input = '\'\'';
+ if (!input) {
+ input = '\'\'';
}
var functionName = 'split';
} else if (mode == 'JOIN') {
- if (!value_input) {
- value_input = '[]';
+ if (!input) {
+ input = '[]';
}
var functionName = 'join';
} else {
throw 'Unknown mode: ' + mode;
}
- var code = value_input + '.' + functionName + '(' + value_delim + ')';
+ var code = input + '.' + functionName + '(' + delimiter + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
diff --git a/generators/dart/math.js b/generators/dart/math.js
index 2f7c8027a..867822beb 100644
--- a/generators/dart/math.js
+++ b/generators/dart/math.js
@@ -200,25 +200,25 @@ Blockly.Dart['math_number_property'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'math_isPrime',
- [ 'bool ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(n) {',
- ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
- ' if (n == 2 || n == 3) {',
- ' return true;',
- ' }',
- ' // False if n is null, negative, is 1, or not whole.',
- ' // And false if n is divisible by 2 or 3.',
- ' if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' +
+ ['bool ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(n) {',
+ ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
+ ' if (n == 2 || n == 3) {',
+ ' return true;',
+ ' }',
+ ' // False if n is null, negative, is 1, or not whole.',
+ ' // And false if n is divisible by 2 or 3.',
+ ' if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' +
' n % 3 == 0) {',
- ' return false;',
- ' }',
- ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
- ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {',
- ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {',
- ' return false;',
- ' }',
- ' }',
- ' return true;',
- '}']);
+ ' return false;',
+ ' }',
+ ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
+ ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {',
+ ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {',
+ ' return false;',
+ ' }',
+ ' }',
+ ' return true;',
+ '}']);
code = functionName + '(' + number_to_check + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
}
@@ -275,12 +275,12 @@ Blockly.Dart['math_on_list'] = function(block) {
case 'SUM':
var functionName = Blockly.Dart.provideFunction_(
'math_sum',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' num sumVal = 0;',
- ' myList.forEach((num entry) {sumVal += entry;});',
- ' return sumVal;',
- '}']);
+ ' num sumVal = 0;',
+ ' myList.forEach((num entry) {sumVal += entry;});',
+ ' return sumVal;',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'MIN':
@@ -288,14 +288,14 @@ Blockly.Dart['math_on_list'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'math_min',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' if (myList.isEmpty) return null;',
- ' num minVal = myList[0];',
- ' myList.forEach((num entry) ' +
+ ' if (myList.isEmpty) return null;',
+ ' num minVal = myList[0];',
+ ' myList.forEach((num entry) ' +
'{minVal = Math.min(minVal, entry);});',
- ' return minVal;',
- '}']);
+ ' return minVal;',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'MAX':
@@ -303,14 +303,14 @@ Blockly.Dart['math_on_list'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'math_max',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' if (myList.isEmpty) return null;',
- ' num maxVal = myList[0];',
- ' myList.forEach((num entry) ' +
- '{maxVal = Math.max(maxVal, entry);});',
- ' return maxVal;',
- '}']);
+ ' if (myList.isEmpty) return null;',
+ ' num maxVal = myList[0];',
+ ' myList.forEach((num entry) ' +
+ '{maxVal = Math.max(maxVal, entry);});',
+ ' return maxVal;',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'AVERAGE':
@@ -318,38 +318,38 @@ Blockly.Dart['math_on_list'] = function(block) {
// math_mean([null,null,"aString",1,9]) == 5.0.
var functionName = Blockly.Dart.provideFunction_(
'math_mean',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' // First filter list for numbers only.',
- ' List localList = new List.from(myList);',
- ' localList.removeMatching((a) => a is! num);',
- ' if (localList.isEmpty) return null;',
- ' num sumVal = 0;',
- ' localList.forEach((num entry) {sumVal += entry;});',
- ' return sumVal / localList.length;',
- '}']);
+ ' // First filter list for numbers only.',
+ ' List localList = new List.from(myList);',
+ ' localList.removeWhere((a) => a is! num);',
+ ' if (localList.isEmpty) return null;',
+ ' num sumVal = 0;',
+ ' localList.forEach((num entry) {sumVal += entry;});',
+ ' return sumVal / localList.length;',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'MEDIAN':
var functionName = Blockly.Dart.provideFunction_(
'math_median',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' // First filter list for numbers only, then sort, ' +
+ ' // First filter list for numbers only, then sort, ' +
'then return middle value',
- ' // or the average of two middle values if list has an ' +
+ ' // or the average of two middle values if list has an ' +
'even number of elements.',
- ' List localList = new List.from(myList);',
- ' localList.removeMatching((a) => a is! num);',
- ' if (localList.isEmpty) return null;',
- ' localList.sort((a, b) => (a - b));',
- ' int index = localList.length ~/ 2;',
- ' if (localList.length % 2 == 1) {',
- ' return localList[index];',
- ' } else {',
- ' return (localList[index - 1] + localList[index]) / 2;',
- ' }',
- '}']);
+ ' List localList = new List.from(myList);',
+ ' localList.removeWhere((a) => a is! num);',
+ ' if (localList.isEmpty) return null;',
+ ' localList.sort((a, b) => (a - b));',
+ ' int index = localList.length ~/ 2;',
+ ' if (localList.length % 2 == 1) {',
+ ' return localList[index];',
+ ' } else {',
+ ' return (localList[index - 1] + localList[index]) / 2;',
+ ' }',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'MODE':
@@ -360,35 +360,35 @@ Blockly.Dart['math_on_list'] = function(block) {
// Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].
var functionName = Blockly.Dart.provideFunction_(
'math_modes',
- [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List values) {',
- ' List modes = [];',
- ' List counts = [];',
- ' int maxCount = 0;',
- ' for (int i = 0; i < values.length; i++) {',
- ' var value = values[i];',
- ' bool found = false;',
- ' int thisCount;',
- ' for (int j = 0; j < counts.length; j++) {',
- ' if (counts[j][0] == value) {',
- ' thisCount = ++counts[j][1];',
- ' found = true;',
- ' break;',
- ' }',
- ' }',
- ' if (!found) {',
- ' counts.add([value, 1]);',
- ' thisCount = 1;',
- ' }',
- ' maxCount = Math.max(thisCount, maxCount);',
- ' }',
- ' for (int j = 0; j < counts.length; j++) {',
- ' if (counts[j][1] == maxCount) {',
- ' modes.add(counts[j][0]);',
- ' }',
- ' }',
- ' return modes;',
- '}']);
+ ' List modes = [];',
+ ' List counts = [];',
+ ' int maxCount = 0;',
+ ' for (int i = 0; i < values.length; i++) {',
+ ' var value = values[i];',
+ ' bool found = false;',
+ ' int thisCount;',
+ ' for (int j = 0; j < counts.length; j++) {',
+ ' if (counts[j][0] == value) {',
+ ' thisCount = ++counts[j][1];',
+ ' found = true;',
+ ' break;',
+ ' }',
+ ' }',
+ ' if (!found) {',
+ ' counts.add([value, 1]);',
+ ' thisCount = 1;',
+ ' }',
+ ' maxCount = Math.max(thisCount, maxCount);',
+ ' }',
+ ' for (int j = 0; j < counts.length; j++) {',
+ ' if (counts[j][1] == maxCount) {',
+ ' modes.add(counts[j][0]);',
+ ' }',
+ ' }',
+ ' return modes;',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'STD_DEV':
@@ -396,21 +396,21 @@ Blockly.Dart['math_on_list'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'math_standard_deviation',
- [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' // First filter list for numbers only.',
- ' List numbers = new List.from(myList);',
- ' numbers.removeMatching((a) => a is! num);',
- ' if (numbers.isEmpty) return null;',
- ' num n = numbers.length;',
- ' num sum = 0;',
- ' numbers.forEach((x) => sum += x);',
- ' num mean = sum / n;',
- ' num sumSquare = 0;',
- ' numbers.forEach((x) => sumSquare += ' +
- 'Math.pow(x - mean, 2));',
- ' return Math.sqrt(sumSquare / n);',
- '}']);
+ ' // First filter list for numbers only.',
+ ' List numbers = new List.from(myList);',
+ ' numbers.removeWhere((a) => a is! num);',
+ ' if (numbers.isEmpty) return null;',
+ ' num n = numbers.length;',
+ ' num sum = 0;',
+ ' numbers.forEach((x) => sum += x);',
+ ' num mean = sum / n;',
+ ' num sumSquare = 0;',
+ ' numbers.forEach((x) => sumSquare += ' +
+ 'Math.pow(x - mean, 2));',
+ ' return Math.sqrt(sumSquare / n);',
+ '}']);
code = functionName + '(' + list + ')';
break;
case 'RANDOM':
@@ -418,11 +418,11 @@ Blockly.Dart['math_on_list'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'math_random_item',
- [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(List myList) {',
- ' int x = new Math.Random().nextInt(myList.length);',
- ' return myList[x];',
- '}']);
+ ' int x = new Math.Random().nextInt(myList.length);',
+ ' return myList[x];',
+ '}']);
code = functionName + '(' + list + ')';
break;
default:
@@ -466,15 +466,15 @@ Blockly.Dart['math_random_int'] = function(block) {
Blockly.Dart.ORDER_NONE) || '0';
var functionName = Blockly.Dart.provideFunction_(
'math_random_int',
- [ 'int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(num a, num b) {',
- ' if (a > b) {',
- ' // Swap a and b to ensure a is smaller.',
- ' num c = a;',
- ' a = b;',
- ' b = c;',
- ' }',
- ' return new Math.Random().nextInt(b - a + 1) + a;',
- '}']);
+ ['int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(num a, num b) {',
+ ' if (a > b) {',
+ ' // Swap a and b to ensure a is smaller.',
+ ' num c = a;',
+ ' a = b;',
+ ' b = c;',
+ ' }',
+ ' return new Math.Random().nextInt(b - a + 1) + a;',
+ '}']);
var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js
index 0085c6bf6..ad2550cc7 100644
--- a/generators/dart/procedures.js
+++ b/generators/dart/procedures.js
@@ -50,8 +50,8 @@ Blockly.Dart['procedures_defreturn'] = function(block) {
}
var returnType = returnValue ? 'dynamic' : 'void';
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Dart.variableDB_.getName(block.arguments_[x],
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Dart.variableDB_.getName(block.arguments_[i],
Blockly.Variables.NAME_TYPE);
}
var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' +
@@ -71,8 +71,8 @@ Blockly.Dart['procedures_callreturn'] = function(block) {
var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'),
Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i,
Blockly.Dart.ORDER_NONE) || 'null';
}
var code = funcName + '(' + args.join(', ') + ')';
@@ -84,8 +84,8 @@ Blockly.Dart['procedures_callnoreturn'] = function(block) {
var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'),
Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i,
Blockly.Dart.ORDER_NONE) || 'null';
}
var code = funcName + '(' + args.join(', ') + ');\n';
diff --git a/generators/dart/text.js b/generators/dart/text.js
index ba5a75cb0..5cdbb03ec 100644
--- a/generators/dart/text.js
+++ b/generators/dart/text.js
@@ -39,22 +39,22 @@ Blockly.Dart['text'] = function(block) {
Blockly.Dart['text_join'] = function(block) {
// Create a string made up of any number of elements of any type.
- var code;
- if (block.itemCount_ == 0) {
- return ['\'\'', Blockly.Dart.ORDER_ATOMIC];
- } else if (block.itemCount_ == 1) {
- var argument0 = Blockly.Dart.valueToCode(block, 'ADD0',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- code = argument0 + '.toString()';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
- } else {
- code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n,
- Blockly.Dart.ORDER_NONE) || '\'\'';
- }
- code = '[' + code.join(',') + '].join()';
- return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ switch (block.itemCount_) {
+ case 0:
+ return ['\'\'', Blockly.Dart.ORDER_ATOMIC];
+ case 1:
+ var element = Blockly.Dart.valueToCode(block, 'ADD0',
+ Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
+ var code = element + '.toString()';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ default:
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i,
+ Blockly.Dart.ORDER_NONE) || '\'\'';
+ }
+ var code = '[' + elements.join(',') + '].join()';
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
}
};
@@ -62,43 +62,44 @@ Blockly.Dart['text_append'] = function(block) {
// Append to a variable in place.
var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'),
Blockly.Variables.NAME_TYPE);
- var argument0 = Blockly.Dart.valueToCode(block, 'TEXT',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- return varName + ' = [' + varName + ', ' + argument0 + '].join();\n';
+ var value = Blockly.Dart.valueToCode(block, 'TEXT',
+ Blockly.Dart.ORDER_NONE) || '\'\'';
+ return varName + ' = [' + varName + ', ' + value + '].join();\n';
};
Blockly.Dart['text_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var text = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX];
+ return [text + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['text_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var text = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX];
+ return [text + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['text_indexOf'] = function(block) {
// Search the text for a substring.
var operator = block.getFieldValue('END') == 'FIRST' ?
'indexOf' : 'lastIndexOf';
- var argument0 = Blockly.Dart.valueToCode(block, 'FIND',
+ var substring = Blockly.Dart.valueToCode(block, 'FIND',
Blockly.Dart.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Dart.valueToCode(block, 'VALUE',
+ var text = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- var code = argument1 + '.' + operator + '(' + argument0 + ') + 1';
- return [code, Blockly.Dart.ORDER_ADDITIVE];
+ var code = text + '.' + operator + '(' + substring + ')';
+ if (Blockly.Dart.ONE_BASED_INDEXING) {
+ return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE];
+ }
+ return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['text_charAt'] = function(block) {
// Get letter at index.
// Note: Until January 2013 this block did not have the WHERE input.
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Dart.valueToCode(block, 'AT',
- Blockly.Dart.ORDER_NONE) || '1';
var text = Blockly.Dart.valueToCode(block, 'VALUE',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
switch (where) {
@@ -106,26 +107,20 @@ Blockly.Dart['text_charAt'] = function(block) {
var code = text + '[0]';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
case 'FROM_START':
- // Blockly uses one-based indicies.
- if (at.match(/^-?\d+$/)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
+ var at = Blockly.Dart.getAdjusted(block, 'AT');
var code = text + '[' + at + ']';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
case 'LAST':
at = 1;
// Fall through.
case 'FROM_END':
+ var at = Blockly.Dart.getAdjusted(block, 'AT', 1);
var functionName = Blockly.Dart.provideFunction_(
'text_get_from_end',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(String text, num x) {',
- ' return text[text.length - x];',
- '}']);
+ ' return text[text.length - x];',
+ '}']);
code = functionName + '(' + text + ', ' + at + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
case 'RANDOM':
@@ -133,11 +128,11 @@ Blockly.Dart['text_charAt'] = function(block) {
'import \'dart:math\' as Math;';
var functionName = Blockly.Dart.provideFunction_(
'text_random_letter',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(String text) {',
- ' int x = new Math.Random().nextInt(text.length);',
- ' return text[x];',
- '}']);
+ ' int x = new Math.Random().nextInt(text.length);',
+ ' return text[x];',
+ '}']);
code = functionName + '(' + text + ')';
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
}
@@ -150,35 +145,69 @@ Blockly.Dart['text_getSubstring'] = function(block) {
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.Dart.valueToCode(block, 'AT1',
- Blockly.Dart.ORDER_NONE) || '1';
- var at2 = Blockly.Dart.valueToCode(block, 'AT2',
- Blockly.Dart.ORDER_NONE) || '1';
if (where1 == 'FIRST' && where2 == 'LAST') {
var code = text;
+ } else if (text.match(/^'?\w+'?$/) ||
+ (where1 != 'FROM_END' && where2 == 'FROM_START')) {
+ // If the text is a variable or literal or doesn't require a call for
+ // length, don't generate a helper function.
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1');
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ at1 = text + '.length - ' + at1;
+ break;
+ case 'FIRST':
+ var at1 = '0';
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring).';
+ }
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false,
+ Blockly.Dart.ORDER_ADDITIVE);
+ at2 = text + '.length - ' + at2;
+ break;
+ case 'LAST':
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring).';
+ }
+ if (where2 == 'LAST') {
+ var code = text + '.substring(' + at1 + ')';
+ } else {
+ var code = text + '.substring(' + at1 + ', ' + at2 + ')';
+ }
} else {
+ var at1 = Blockly.Dart.getAdjusted(block, 'AT1');
+ var at2 = Blockly.Dart.getAdjusted(block, 'AT2');
var functionName = Blockly.Dart.provideFunction_(
'text_get_substring',
- [ 'function ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(text, where1, at1, where2, at2) {',
- ' function getAt(where, at) {',
- ' if (where == \'FROM_START\') {',
- ' at--;',
- ' } else if (where == \'FROM_END\') {',
- ' at = text.length - at;',
- ' } else if (where == \'FIRST\') {',
- ' at = 0;',
- ' } else if (where == \'LAST\') {',
- ' at = text.length - 1;',
- ' } else {',
- ' throw \'Unhandled option (text_getSubstring).\';',
- ' }',
- ' return at;',
- ' }',
- ' at1 = getAt(where1, at1);',
- ' at2 = getAt(where2, at2) + 1;',
- ' return text.substring(at1, at2);',
- '}']);
+ ' int getAt(where, at) {',
+ ' if (where == \'FROM_END\') {',
+ ' at = text.length - 1 - at;',
+ ' } else if (where == \'FIRST\') {',
+ ' at = 0;',
+ ' } else if (where == \'LAST\') {',
+ ' at = text.length - 1;',
+ ' } else if (where != \'FROM_START\') {',
+ ' throw \'Unhandled option (text_getSubstring).\';',
+ ' }',
+ ' return at;',
+ ' }',
+ ' at1 = getAt(where1, at1);',
+ ' at2 = getAt(where2, at2) + 1;',
+ ' return text.substring(at1, at2);',
+ '}']);
var code = functionName + '(' + text + ', \'' +
where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
}
@@ -193,34 +222,32 @@ Blockly.Dart['text_changeCase'] = function(block) {
'TITLECASE': null
};
var operator = OPERATORS[block.getFieldValue('CASE')];
- var code;
+ var textOrder = operator ? Blockly.Dart.ORDER_UNARY_POSTFIX :
+ Blockly.Dart.ORDER_NONE;
+ var text = Blockly.Dart.valueToCode(block, 'TEXT', textOrder) || '\'\'';
if (operator) {
// Upper and lower case are functions built into Dart.
- var argument0 = Blockly.Dart.valueToCode(block, 'TEXT',
- Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- code = argument0 + operator;
+ var code = text + operator;
} else {
// Title case is not a native Dart function. Define one.
var functionName = Blockly.Dart.provideFunction_(
'text_toTitleCase',
- [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
+ ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
'(String str) {',
- ' RegExp exp = new RegExp(r\'\\b\');',
- ' List list = str.split(exp);',
- ' final title = new StringBuffer();',
- ' for (String part in list) {',
- ' if (part.length > 0) {',
- ' title.write(part[0].toUpperCase());',
- ' if (part.length > 0) {',
- ' title.write(part.substring(1).toLowerCase());',
- ' }',
- ' }',
- ' }',
- ' return title.toString();',
- '}']);
- var argument0 = Blockly.Dart.valueToCode(block, 'TEXT',
- Blockly.Dart.ORDER_NONE) || '\'\'';
- code = functionName + '(' + argument0 + ')';
+ ' RegExp exp = new RegExp(r\'\\b\');',
+ ' List list = str.split(exp);',
+ ' final title = new StringBuffer();',
+ ' for (String part in list) {',
+ ' if (part.length > 0) {',
+ ' title.write(part[0].toUpperCase());',
+ ' if (part.length > 0) {',
+ ' title.write(part.substring(1).toLowerCase());',
+ ' }',
+ ' }',
+ ' }',
+ ' return title.toString();',
+ '}']);
+ var code = functionName + '(' + text + ')';
}
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
@@ -233,16 +260,16 @@ Blockly.Dart['text_trim'] = function(block) {
'BOTH': '.trim()'
};
var operator = OPERATORS[block.getFieldValue('MODE')];
- var argument0 = Blockly.Dart.valueToCode(block, 'TEXT',
+ var text = Blockly.Dart.valueToCode(block, 'TEXT',
Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\'';
- return [argument0 + operator, Blockly.Dart.ORDER_UNARY_POSTFIX];
+ return [text + operator, Blockly.Dart.ORDER_UNARY_POSTFIX];
};
Blockly.Dart['text_print'] = function(block) {
// Print statement.
- var argument0 = Blockly.Dart.valueToCode(block, 'TEXT',
+ var msg = Blockly.Dart.valueToCode(block, 'TEXT',
Blockly.Dart.ORDER_NONE) || '\'\'';
- return 'print(' + argument0 + ');\n';
+ return 'print(' + msg + ');\n';
};
Blockly.Dart['text_prompt_ext'] = function(block) {
diff --git a/generators/javascript.js b/generators/javascript.js
index dcd1f146d..a81b62b0c 100644
--- a/generators/javascript.js
+++ b/generators/javascript.js
@@ -135,8 +135,8 @@ Blockly.JavaScript.ORDER_OVERRIDES = [
];
/**
- * Allow for switching between one and zero based indexing, one based by
- * default.
+ * Allow for switching between one and zero based indexing for lists and text,
+ * one based by default.
*/
Blockly.JavaScript.ONE_BASED_INDEXING = true;
@@ -258,3 +258,66 @@ Blockly.JavaScript.scrub_ = function(block, code) {
var nextCode = Blockly.JavaScript.blockToCode(nextBlock);
return commentCode + code + nextCode;
};
+
+/**
+ * Gets a property and adjusts the value while taking into account indexing.
+ * @param {!Blockly.Block} block The block.
+ * @param {string} atId The property ID of the element to get.
+ * @param {number=} opt_delta Value to add.
+ * @param {boolean=} opt_negate Whether to negate the value.
+ * @param {number=} opt_order The highest order acting on this value.
+ * @return {string|number}
+ */
+Blockly.JavaScript.getAdjusted = function(block, atId, opt_delta, opt_negate,
+ opt_order) {
+ var delta = opt_delta || 0;
+ var order = opt_order || Blockly.JavaScript.ORDER_NONE;
+ if (Blockly.JavaScript.ONE_BASED_INDEXING) {
+ delta--;
+ }
+ var defaultAtIndex = Blockly.JavaScript.ONE_BASED_INDEXING ? '1' : '0';
+ if (delta > 0) {
+ var at = Blockly.JavaScript.valueToCode(block, atId,
+ Blockly.JavaScript.ORDER_ADDITION) || defaultAtIndex;
+ } else if (delta < 0) {
+ var at = Blockly.JavaScript.valueToCode(block, atId,
+ Blockly.JavaScript.ORDER_SUBTRACTION) || defaultAtIndex;
+ } else if (opt_negate) {
+ var at = Blockly.JavaScript.valueToCode(block, atId,
+ Blockly.JavaScript.ORDER_UNARY_NEGATION) || defaultAtIndex;
+ } else {
+ var at = Blockly.JavaScript.valueToCode(block, atId, order) ||
+ defaultAtIndex;
+ }
+
+ if (Blockly.isNumber(at)) {
+ // If the index is a naked number, adjust it right now.
+ at = parseFloat(at) + delta;
+ if (opt_negate) {
+ at = -at;
+ }
+ } else {
+ // If the index is dynamic, adjust it in code.
+ if (delta > 0) {
+ at = at + ' + ' + delta;
+ var innerOrder = Blockly.JavaScript.ORDER_ADDITION;
+ } else if (delta < 0) {
+ at = at + ' - ' + -delta;
+ var innerOrder = Blockly.JavaScript.ORDER_SUBTRACTION;
+ }
+ if (opt_negate) {
+ if (delta) {
+ at = '-(' + at + ')';
+ } else {
+ at = '-' + at;
+ }
+ var innerOrder = Blockly.JavaScript.ORDER_UNARY_NEGATION;
+ }
+ innerOrder = Math.floor(innerOrder);
+ order = Math.floor(order);
+ if (innerOrder && order >= innerOrder) {
+ at = '(' + at + ')';
+ }
+ }
+ return at;
+};
diff --git a/generators/javascript/colour.js b/generators/javascript/colour.js
index b8e290360..21b372e9c 100644
--- a/generators/javascript/colour.js
+++ b/generators/javascript/colour.js
@@ -39,7 +39,7 @@ Blockly.JavaScript['colour_random'] = function(block) {
// Generate a random colour.
var functionName = Blockly.JavaScript.provideFunction_(
'colourRandom',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {',
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {',
' var num = Math.floor(Math.random() * Math.pow(2, 24));',
' return \'#\' + (\'00000\' + num.toString(16)).substr(-6);',
'}']);
@@ -57,16 +57,16 @@ Blockly.JavaScript['colour_rgb'] = function(block) {
Blockly.JavaScript.ORDER_COMMA) || 0;
var functionName = Blockly.JavaScript.provideFunction_(
'colourRgb',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(r, g, b) {',
- ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;',
- ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;',
- ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;',
- ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);',
- ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);',
- ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);',
- ' return \'#\' + r + g + b;',
- '}']);
+ ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;',
+ ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;',
+ ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;',
+ ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);',
+ ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);',
+ ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);',
+ ' return \'#\' + r + g + b;',
+ '}']);
var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
@@ -81,23 +81,23 @@ Blockly.JavaScript['colour_blend'] = function(block) {
Blockly.JavaScript.ORDER_COMMA) || 0.5;
var functionName = Blockly.JavaScript.provideFunction_(
'colourBlend',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(c1, c2, ratio) {',
- ' ratio = Math.max(Math.min(Number(ratio), 1), 0);',
- ' var r1 = parseInt(c1.substring(1, 3), 16);',
- ' var g1 = parseInt(c1.substring(3, 5), 16);',
- ' var b1 = parseInt(c1.substring(5, 7), 16);',
- ' var r2 = parseInt(c2.substring(1, 3), 16);',
- ' var g2 = parseInt(c2.substring(3, 5), 16);',
- ' var b2 = parseInt(c2.substring(5, 7), 16);',
- ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);',
- ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);',
- ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);',
- ' r = (\'0\' + (r || 0).toString(16)).slice(-2);',
- ' g = (\'0\' + (g || 0).toString(16)).slice(-2);',
- ' b = (\'0\' + (b || 0).toString(16)).slice(-2);',
- ' return \'#\' + r + g + b;',
- '}']);
+ ' ratio = Math.max(Math.min(Number(ratio), 1), 0);',
+ ' var r1 = parseInt(c1.substring(1, 3), 16);',
+ ' var g1 = parseInt(c1.substring(3, 5), 16);',
+ ' var b1 = parseInt(c1.substring(5, 7), 16);',
+ ' var r2 = parseInt(c2.substring(1, 3), 16);',
+ ' var g2 = parseInt(c2.substring(3, 5), 16);',
+ ' var b2 = parseInt(c2.substring(5, 7), 16);',
+ ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);',
+ ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);',
+ ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);',
+ ' r = (\'0\' + (r || 0).toString(16)).slice(-2);',
+ ' g = (\'0\' + (g || 0).toString(16)).slice(-2);',
+ ' b = (\'0\' + (b || 0).toString(16)).slice(-2);',
+ ' return \'#\' + r + g + b;',
+ '}']);
var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
diff --git a/generators/javascript/lists.js b/generators/javascript/lists.js
index 4bb6aac20..d1e66a0ed 100644
--- a/generators/javascript/lists.js
+++ b/generators/javascript/lists.js
@@ -36,12 +36,12 @@ Blockly.JavaScript['lists_create_empty'] = function(block) {
Blockly.JavaScript['lists_create_with'] = function(block) {
// Create a list with any number of elements of any type.
- var code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n,
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i,
Blockly.JavaScript.ORDER_COMMA) || 'null';
}
- code = '[' + code.join(', ') + ']';
+ var code = '[' + elements.join(', ') + ']';
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
@@ -49,46 +49,49 @@ Blockly.JavaScript['lists_repeat'] = function(block) {
// Create a list with one element repeated.
var functionName = Blockly.JavaScript.provideFunction_(
'listsRepeat',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(value, n) {',
- ' var array = [];',
- ' for (var i = 0; i < n; i++) {',
- ' array[i] = value;',
- ' }',
- ' return array;',
- '}']);
- var argument0 = Blockly.JavaScript.valueToCode(block, 'ITEM',
+ ' var array = [];',
+ ' for (var i = 0; i < n; i++) {',
+ ' array[i] = value;',
+ ' }',
+ ' return array;',
+ '}']);
+ var element = Blockly.JavaScript.valueToCode(block, 'ITEM',
Blockly.JavaScript.ORDER_COMMA) || 'null';
- var argument1 = Blockly.JavaScript.valueToCode(block, 'NUM',
+ var repeatCount = Blockly.JavaScript.valueToCode(block, 'NUM',
Blockly.JavaScript.ORDER_COMMA) || '0';
- var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
+ var code = functionName + '(' + element + ', ' + repeatCount + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['lists_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
- Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]';
- return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER];
+ var list = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ Blockly.JavaScript.ORDER_MEMBER) || '[]';
+ return [list + '.length', Blockly.JavaScript.ORDER_MEMBER];
};
Blockly.JavaScript['lists_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ var list = Blockly.JavaScript.valueToCode(block, 'VALUE',
Blockly.JavaScript.ORDER_MEMBER) || '[]';
- return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT];
+ return ['!' + list + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT];
};
Blockly.JavaScript['lists_indexOf'] = function(block) {
// Find an item in the list.
var operator = block.getFieldValue('END') == 'FIRST' ?
'indexOf' : 'lastIndexOf';
- var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND',
+ var item = Blockly.JavaScript.valueToCode(block, 'FIND',
Blockly.JavaScript.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ var list = Blockly.JavaScript.valueToCode(block, 'VALUE',
Blockly.JavaScript.ORDER_MEMBER) || '[]';
- var code = argument1 + '.' + operator + '(' + argument0 + ') + 1';
- return [code, Blockly.JavaScript.ORDER_ADDITION];
+ var code = list + '.' + operator + '(' + item + ')';
+ if (Blockly.JavaScript.ONE_BASED_INDEXING) {
+ return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION];
+ }
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['lists_getIndex'] = function(block) {
@@ -96,86 +99,76 @@ Blockly.JavaScript['lists_getIndex'] = function(block) {
// Note: Until January 2013 this block did not have MODE or WHERE inputs.
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.JavaScript.valueToCode(block, 'AT',
- Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1';
- var list = Blockly.JavaScript.valueToCode(block, 'VALUE',
- Blockly.JavaScript.ORDER_MEMBER) || '[]';
+ var listOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_COMMA :
+ Blockly.JavaScript.ORDER_MEMBER;
+ var list = Blockly.JavaScript.valueToCode(block, 'VALUE', listOrder) || '[]';
- if (where == 'FIRST') {
- if (mode == 'GET') {
- var code = list + '[0]';
- return [code, Blockly.JavaScript.ORDER_MEMBER];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.shift()';
- return [code, Blockly.JavaScript.ORDER_MEMBER];
- } else if (mode == 'REMOVE') {
- return list + '.shift();\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'GET') {
- var code = list + '.slice(-1)[0]';
- return [code, Blockly.JavaScript.ORDER_MEMBER];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.pop()';
- return [code, Blockly.JavaScript.ORDER_MEMBER];
- } else if (mode == 'REMOVE') {
- return list + '.pop();\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'GET') {
- var code = list + '[' + at + ']';
- return [code, Blockly.JavaScript.ORDER_MEMBER];
- } else if (mode == 'GET_REMOVE') {
- var code = list + '.splice(' + at + ', 1)[0]';
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return list + '.splice(' + at + ', 1);\n';
- }
- } else if (where == 'FROM_END') {
- if (mode == 'GET') {
- var code = list + '.slice(-' + at + ')[0]';
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') {
+ switch (where) {
+ case ('FIRST'):
+ if (mode == 'GET') {
+ var code = list + '[0]';
+ return [code, Blockly.JavaScript.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.shift()';
+ return [code, Blockly.JavaScript.ORDER_MEMBER];
+ } else if (mode == 'REMOVE') {
+ return list + '.shift();\n';
+ }
+ break;
+ case ('LAST'):
+ if (mode == 'GET') {
+ var code = list + '.slice(-1)[0]';
+ return [code, Blockly.JavaScript.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.pop()';
+ return [code, Blockly.JavaScript.ORDER_MEMBER];
+ } else if (mode == 'REMOVE') {
+ return list + '.pop();\n';
+ }
+ break;
+ case ('FROM_START'):
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT');
+ if (mode == 'GET') {
+ var code = list + '[' + at + ']';
+ return [code, Blockly.JavaScript.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.splice(' + at + ', 1)[0]';
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ return list + '.splice(' + at + ', 1);\n';
+ }
+ break;
+ case ('FROM_END'):
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true);
+ if (mode == 'GET') {
+ var code = list + '.slice(' + at + ')[0]';
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.splice(' + at + ', 1)[0]';
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ return list + '.splice(' + at + ', 1);';
+ }
+ break;
+ case ('RANDOM'):
var functionName = Blockly.JavaScript.provideFunction_(
- 'listsRemoveFromEnd',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
- '(list, x) {',
- ' x = list.length - x;',
- ' return list.splice(x, 1)[0];',
- '}']);
- code = functionName + '(' + list + ', ' + at + ')';
- if (mode == 'GET_REMOVE') {
+ 'listsGetRandomItem',
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ '(list, remove) {',
+ ' var x = Math.floor(Math.random() * list.length);',
+ ' if (remove) {',
+ ' return list.splice(x, 1)[0];',
+ ' } else {',
+ ' return list[x];',
+ ' }',
+ '}']);
+ code = functionName + '(' + list + ', ' + (mode != 'GET') + ')';
+ if (mode == 'GET' || mode == 'GET_REMOVE') {
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
return code + ';\n';
}
- }
- } else if (where == 'RANDOM') {
- var functionName = Blockly.JavaScript.provideFunction_(
- 'listsGetRandomItem',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
- '(list, remove) {',
- ' var x = Math.floor(Math.random() * list.length);',
- ' if (remove) {',
- ' return list.splice(x, 1)[0];',
- ' } else {',
- ' return list[x];',
- ' }',
- '}']);
- code = functionName + '(' + list + ', ' + (mode != 'GET') + ')';
- if (mode == 'GET' || mode == 'GET_REMOVE') {
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return code + ';\n';
- }
+ break;
}
throw 'Unhandled combination (lists_getIndex).';
};
@@ -187,8 +180,6 @@ Blockly.JavaScript['lists_setIndex'] = function(block) {
Blockly.JavaScript.ORDER_MEMBER) || '[]';
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.JavaScript.valueToCode(block, 'AT',
- Blockly.JavaScript.ORDER_NONE) || '1';
var value = Blockly.JavaScript.valueToCode(block, 'TO',
Blockly.JavaScript.ORDER_ASSIGNMENT) || 'null';
// Cache non-trivial values to variables to prevent repeated look-ups.
@@ -198,155 +189,206 @@ Blockly.JavaScript['lists_setIndex'] = function(block) {
return '';
}
var listVar = Blockly.JavaScript.variableDB_.getDistinctName(
- 'tmp_list', Blockly.Variables.NAME_TYPE);
+ 'tmpList', Blockly.Variables.NAME_TYPE);
var code = 'var ' + listVar + ' = ' + list + ';\n';
list = listVar;
return code;
}
- if (where == 'FIRST') {
- if (mode == 'SET') {
- return list + '[0] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return list + '.unshift(' + value + ');\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'SET') {
+ switch (where) {
+ case ('FIRST'):
+ if (mode == 'SET') {
+ return list + '[0] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ return list + '.unshift(' + value + ');\n';
+ }
+ break;
+ case ('LAST'):
+ if (mode == 'SET') {
+ var code = cacheList();
+ code += list + '[' + list + '.length - 1] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ return list + '.push(' + value + ');\n';
+ }
+ break;
+ case ('FROM_START'):
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT');
+ if (mode == 'SET') {
+ return list + '[' + at + '] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ return list + '.splice(' + at + ', 0, ' + value + ');\n';
+ }
+ break;
+ case ('FROM_END'):
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, false,
+ Blockly.JavaScript.ORDER_SUBTRACTION);
var code = cacheList();
- code += list + '[' + list + '.length - 1] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- return list + '.push(' + value + ');\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'SET') {
- return list + '[' + at + '] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return list + '.splice(' + at + ', 0, ' + value + ');\n';
- }
- } else if (where == 'FROM_END') {
- var code = cacheList();
- if (mode == 'SET') {
- code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value +
- ');\n';
- return code;
- }
- } else if (where == 'RANDOM') {
- var code = cacheList();
- var xVar = Blockly.JavaScript.variableDB_.getDistinctName(
- 'tmp_x', Blockly.Variables.NAME_TYPE);
- code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list +
- '.length);\n';
- if (mode == 'SET') {
- code += list + '[' + xVar + '] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- code += list + '.splice(' + xVar + ', 0, ' + value + ');\n';
- return code;
- }
+ if (mode == 'SET') {
+ code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value +
+ ');\n';
+ return code;
+ }
+ break;
+ case ('RANDOM'):
+ var code = cacheList();
+ var xVar = Blockly.JavaScript.variableDB_.getDistinctName(
+ 'tmpX', Blockly.Variables.NAME_TYPE);
+ code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list +
+ '.length);\n';
+ if (mode == 'SET') {
+ code += list + '[' + xVar + '] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += list + '.splice(' + xVar + ', 0, ' + value + ');\n';
+ return code;
+ }
+ break;
}
throw 'Unhandled combination (lists_setIndex).';
};
+/**
+ * Returns an expression calculating the index into a list.
+ * @private
+ * @param {string} listName Name of the list, used to calculate length.
+ * @param {string} where The method of indexing, selected by dropdown in Blockly
+ * @param {string=} opt_at The optional offset when indexing from start/end.
+ * @return {string} Index expression.
+ */
+Blockly.JavaScript.lists.getIndex_ = function(listName, where, opt_at) {
+ if (where == 'FIRST') {
+ return '0';
+ } else if (where == 'FROM_END') {
+ return listName + '.length - 1 - ' + opt_at;
+ } else if (where == 'LAST') {
+ return listName + '.length - 1';
+ } else {
+ return opt_at;
+ }
+};
+
Blockly.JavaScript['lists_getSublist'] = function(block) {
// Get sublist.
var list = Blockly.JavaScript.valueToCode(block, 'LIST',
Blockly.JavaScript.ORDER_MEMBER) || '[]';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.JavaScript.valueToCode(block, 'AT1',
- Blockly.JavaScript.ORDER_NONE) || '1';
- var at2 = Blockly.JavaScript.valueToCode(block, 'AT2',
- Blockly.JavaScript.ORDER_NONE) || '1';
if (where1 == 'FIRST' && where2 == 'LAST') {
- var code = list + '.concat()';
+ var code = list + '.slice(0)';
+ } else if (list.match(/^\w+$/) ||
+ (where1 != 'FROM_END' && where2 == 'FROM_START')) {
+ // If the list is a variable or doesn't require a call for length, don't
+ // generate a helper function.
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1');
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false,
+ Blockly.JavaScript.ORDER_SUBTRACTION);
+ at1 = list + '.length - ' + at1;
+ break;
+ case 'FIRST':
+ var at1 = '0';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false,
+ Blockly.JavaScript.ORDER_SUBTRACTION);
+ at2 = list + '.length - ' + at2;
+ break;
+ case 'LAST':
+ var at2 = list + '.length';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
+ code = list + '.slice(' + at1 + ', ' + at2 + ')';
} else {
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1');
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2');
+ var getIndex_ = Blockly.JavaScript.lists.getIndex_;
+ var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last',
+ 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'};
var functionName = Blockly.JavaScript.provideFunction_(
- 'listsGetSublist',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
- '(list, where1, at1, where2, at2) {',
- ' function getAt(where, at) {',
- ' if (where == \'FROM_START\') {',
- ' at--;',
- ' } else if (where == \'FROM_END\') {',
- ' at = list.length - at;',
- ' } else if (where == \'FIRST\') {',
- ' at = 0;',
- ' } else if (where == \'LAST\') {',
- ' at = list.length - 1;',
- ' } else {',
- ' throw \'Unhandled option (lists_getSublist).\';',
- ' }',
- ' return at;',
- ' }',
- ' at1 = getAt(where1, at1);',
- ' at2 = getAt(where2, at2) + 1;',
- ' return list.slice(at1, at2);',
+ 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2],
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ '(sequence' +
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
+ // we add it as a parameter.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') +
+ ') {',
+ ' var start = ' + getIndex_('sequence', where1, 'at1') + ';',
+ ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;',
+ ' return sequence.slice(start, end);',
'}']);
- var code = functionName + '(' + list + ', \'' +
- where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
+ var code = functionName + '(' + list +
+ // The value for 'FROM_END' and 'FROM_START' depends on `at` so we
+ // pass it.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') +
+ ')';
}
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['lists_sort'] = function(block) {
// Block for sorting a list.
- var listCode = Blockly.JavaScript.valueToCode(
- block, 'LIST',
+ var list = Blockly.JavaScript.valueToCode(block, 'LIST',
Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]';
var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;
var type = block.getFieldValue('TYPE');
var getCompareFunctionName = Blockly.JavaScript.provideFunction_(
- 'listsGetSortCompare',
- ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
- '(type, direction) {',
- ' var compareFuncs = {',
- ' "NUMERIC": function(a, b) {',
- ' return parseFloat(a) - parseFloat(b); },',
- ' "TEXT": function(a, b) {',
- ' return a.toString() > b.toString() ? 1 : -1; },',
- ' "IGNORE_CASE": function(a, b) {',
- ' return a.toString().toLowerCase() > ' +
- 'b.toString().toLowerCase() ? 1 : -1; },',
- ' };',
- ' var compare = compareFuncs[type];',
- ' return function(a, b) { return compare(a, b) * direction; }',
- '}']);
- return ['(' + listCode + ').slice().sort(' +
+ 'listsGetSortCompare',
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ '(type, direction) {',
+ ' var compareFuncs = {',
+ ' "NUMERIC": function(a, b) {',
+ ' return parseFloat(a) - parseFloat(b); },',
+ ' "TEXT": function(a, b) {',
+ ' return a.toString() > b.toString() ? 1 : -1; },',
+ ' "IGNORE_CASE": function(a, b) {',
+ ' return a.toString().toLowerCase() > ' +
+ 'b.toString().toLowerCase() ? 1 : -1; },',
+ ' };',
+ ' var compare = compareFuncs[type];',
+ ' return function(a, b) { return compare(a, b) * direction; }',
+ '}']);
+ return [list + '.slice().sort(' +
getCompareFunctionName + '("' + type + '", ' + direction + '))',
Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['lists_split'] = function(block) {
// Block for splitting text into a list, or joining a list into text.
- var value_input = Blockly.JavaScript.valueToCode(block, 'INPUT',
+ var input = Blockly.JavaScript.valueToCode(block, 'INPUT',
Blockly.JavaScript.ORDER_MEMBER);
- var value_delim = Blockly.JavaScript.valueToCode(block, 'DELIM',
+ var delimiter = Blockly.JavaScript.valueToCode(block, 'DELIM',
Blockly.JavaScript.ORDER_NONE) || '\'\'';
var mode = block.getFieldValue('MODE');
if (mode == 'SPLIT') {
- if (!value_input) {
- value_input = '\'\'';
+ if (!input) {
+ input = '\'\'';
}
var functionName = 'split';
} else if (mode == 'JOIN') {
- if (!value_input) {
- value_input = '[]';
+ if (!input) {
+ input = '[]';
}
var functionName = 'join';
} else {
throw 'Unknown mode: ' + mode;
}
- var code = value_input + '.' + functionName + '(' + value_delim + ')';
+ var code = input + '.' + functionName + '(' + delimiter + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
diff --git a/generators/javascript/math.js b/generators/javascript/math.js
index 0a7d14621..a31b94392 100644
--- a/generators/javascript/math.js
+++ b/generators/javascript/math.js
@@ -168,25 +168,25 @@ Blockly.JavaScript['math_number_property'] = function(block) {
// Prime is a special case as it is not a one-liner test.
var functionName = Blockly.JavaScript.provideFunction_(
'mathIsPrime',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {',
- ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
- ' if (n == 2 || n == 3) {',
- ' return true;',
- ' }',
- ' // False if n is NaN, negative, is 1, or not whole.',
- ' // And false if n is divisible by 2 or 3.',
- ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {',
+ ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
+ ' if (n == 2 || n == 3) {',
+ ' return true;',
+ ' }',
+ ' // False if n is NaN, negative, is 1, or not whole.',
+ ' // And false if n is divisible by 2 or 3.',
+ ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' +
' n % 3 == 0) {',
- ' return false;',
- ' }',
- ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
- ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {',
- ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {',
- ' return false;',
- ' }',
- ' }',
- ' return true;',
- '}']);
+ ' return false;',
+ ' }',
+ ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
+ ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {',
+ ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {',
+ ' return false;',
+ ' }',
+ ' }',
+ ' return true;',
+ '}']);
code = functionName + '(' + number_to_check + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
}
@@ -254,7 +254,7 @@ Blockly.JavaScript['math_on_list'] = function(block) {
// mathMean([null,null,1,3]) == 2.0.
var functionName = Blockly.JavaScript.provideFunction_(
'mathMean',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(myList) {',
' return myList.reduce(function(x, y) {return x + y;}) / ' +
'myList.length;',
@@ -267,7 +267,7 @@ Blockly.JavaScript['math_on_list'] = function(block) {
// mathMedian([null,null,1,3]) == 2.0.
var functionName = Blockly.JavaScript.provideFunction_(
'mathMedian',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(myList) {',
' var localList = myList.filter(function (x) ' +
'{return typeof x == \'number\';});',
@@ -290,7 +290,7 @@ Blockly.JavaScript['math_on_list'] = function(block) {
// Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].
var functionName = Blockly.JavaScript.provideFunction_(
'mathModes',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(values) {',
' var modes = [];',
' var counts = [];',
@@ -326,7 +326,7 @@ Blockly.JavaScript['math_on_list'] = function(block) {
case 'STD_DEV':
var functionName = Blockly.JavaScript.provideFunction_(
'mathStandardDeviation',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(numbers) {',
' var n = numbers.length;',
' if (!n) return null;',
@@ -345,7 +345,7 @@ Blockly.JavaScript['math_on_list'] = function(block) {
case 'RANDOM':
var functionName = Blockly.JavaScript.provideFunction_(
'mathRandomList',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(list) {',
' var x = Math.floor(Math.random() * list.length);',
' return list[x];',
@@ -391,16 +391,16 @@ Blockly.JavaScript['math_random_int'] = function(block) {
Blockly.JavaScript.ORDER_COMMA) || '0';
var functionName = Blockly.JavaScript.provideFunction_(
'mathRandomInt',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(a, b) {',
- ' if (a > b) {',
- ' // Swap a and b to ensure a is smaller.',
- ' var c = a;',
- ' a = b;',
- ' b = c;',
- ' }',
- ' return Math.floor(Math.random() * (b - a + 1) + a);',
- '}']);
+ ' if (a > b) {',
+ ' // Swap a and b to ensure a is smaller.',
+ ' var c = a;',
+ ' a = b;',
+ ' b = c;',
+ ' }',
+ ' return Math.floor(Math.random() * (b - a + 1) + a);',
+ '}']);
var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
diff --git a/generators/javascript/text.js b/generators/javascript/text.js
index 86befb9ef..9ecfdc387 100644
--- a/generators/javascript/text.js
+++ b/generators/javascript/text.js
@@ -37,29 +37,29 @@ Blockly.JavaScript['text'] = function(block) {
Blockly.JavaScript['text_join'] = function(block) {
// Create a string made up of any number of elements of any type.
- var code;
- if (block.itemCount_ == 0) {
- return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC];
- } else if (block.itemCount_ == 1) {
- var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0',
- Blockly.JavaScript.ORDER_NONE) || '\'\'';
- code = 'String(' + argument0 + ')';
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
- } else if (block.itemCount_ == 2) {
- var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0',
- Blockly.JavaScript.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.JavaScript.valueToCode(block, 'ADD1',
- Blockly.JavaScript.ORDER_NONE) || '\'\'';
- code = 'String(' + argument0 + ') + String(' + argument1 + ')';
- return [code, Blockly.JavaScript.ORDER_ADDITION];
- } else {
- code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n,
- Blockly.JavaScript.ORDER_COMMA) || '\'\'';
- }
- code = '[' + code.join(',') + '].join(\'\')';
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ switch (block.itemCount_) {
+ case 0:
+ return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC];
+ case 1:
+ var element = Blockly.JavaScript.valueToCode(block, 'ADD0',
+ Blockly.JavaScript.ORDER_NONE) || '\'\'';
+ var code = 'String(' + element + ')';
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ case 2:
+ var element0 = Blockly.JavaScript.valueToCode(block, 'ADD0',
+ Blockly.JavaScript.ORDER_NONE) || '\'\'';
+ var element1 = Blockly.JavaScript.valueToCode(block, 'ADD1',
+ Blockly.JavaScript.ORDER_NONE) || '\'\'';
+ var code = 'String(' + element0 + ') + String(' + element1 + ')';
+ return [code, Blockly.JavaScript.ORDER_ADDITION];
+ default:
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i,
+ Blockly.JavaScript.ORDER_COMMA) || '\'\'';
+ }
+ var code = '[' + elements.join(',') + '].join(\'\')';
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
}
};
@@ -67,45 +67,49 @@ Blockly.JavaScript['text_append'] = function(block) {
// Append to a variable in place.
var varName = Blockly.JavaScript.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
- var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT',
+ var value = Blockly.JavaScript.valueToCode(block, 'TEXT',
Blockly.JavaScript.ORDER_NONE) || '\'\'';
- return varName + ' = String(' + varName + ') + String(' + argument0 + ');\n';
+ return varName + ' = String(' + varName + ') + String(' + value + ');\n';
};
Blockly.JavaScript['text_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ var text = Blockly.JavaScript.valueToCode(block, 'VALUE',
Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\'';
- return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER];
+ return [text + '.length', Blockly.JavaScript.ORDER_MEMBER];
};
Blockly.JavaScript['text_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ var text = Blockly.JavaScript.valueToCode(block, 'VALUE',
Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
- return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT];
+ return ['!' + text + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT];
};
Blockly.JavaScript['text_indexOf'] = function(block) {
// Search the text for a substring.
var operator = block.getFieldValue('END') == 'FIRST' ?
'indexOf' : 'lastIndexOf';
- var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND',
+ var substring = Blockly.JavaScript.valueToCode(block, 'FIND',
Blockly.JavaScript.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE',
+ var text = Blockly.JavaScript.valueToCode(block, 'VALUE',
Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
- var code = argument1 + '.' + operator + '(' + argument0 + ') + 1';
- return [code, Blockly.JavaScript.ORDER_ADDITION];
+ var code = text + '.' + operator + '(' + substring + ')';
+ // Adjust index if using one-based indices.
+ if (Blockly.JavaScript.ONE_BASED_INDEXING) {
+ return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION];
+ }
+ return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['text_charAt'] = function(block) {
// Get letter at index.
// Note: Until January 2013 this block did not have the WHERE input.
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.JavaScript.valueToCode(block, 'AT',
- Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1';
+ var textOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_NONE :
+ Blockly.JavaScript.ORDER_MEMBER;
var text = Blockly.JavaScript.valueToCode(block, 'VALUE',
- Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
+ textOrder) || '\'\'';
switch (where) {
case 'FIRST':
var code = text + '.charAt(0)';
@@ -114,70 +118,117 @@ Blockly.JavaScript['text_charAt'] = function(block) {
var code = text + '.slice(-1)';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
case 'FROM_START':
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT');
+ // Adjust index if using one-based indices.
var code = text + '.charAt(' + at + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
case 'FROM_END':
- var code = text + '.slice(-' + at + ').charAt(0)';
+ var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true);
+ var code = text + '.slice(' + at + ').charAt(0)';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
case 'RANDOM':
var functionName = Blockly.JavaScript.provideFunction_(
'textRandomLetter',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
'(text) {',
- ' var x = Math.floor(Math.random() * text.length);',
- ' return text[x];',
- '}']);
- code = functionName + '(' + text + ')';
+ ' var x = Math.floor(Math.random() * text.length);',
+ ' return text[x];',
+ '}']);
+ var code = functionName + '(' + text + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
}
throw 'Unhandled option (text_charAt).';
};
+/**
+ * Returns an expression calculating the index into a string.
+ * @private
+ * @param {string} stringName Name of the string, used to calculate length.
+ * @param {string} where The method of indexing, selected by dropdown in Blockly
+ * @param {string=} opt_at The optional offset when indexing from start/end.
+ * @return {string} Index expression.
+ */
+Blockly.JavaScript.text.getIndex_ = function(stringName, where, opt_at) {
+ if (where == 'FIRST') {
+ return '0';
+ } else if (where == 'FROM_END') {
+ return stringName + '.length - 1 - ' + opt_at;
+ } else if (where == 'LAST') {
+ return stringName + '.length - 1';
+ } else {
+ return opt_at;
+ }
+};
+
Blockly.JavaScript['text_getSubstring'] = function(block) {
// Get substring.
var text = Blockly.JavaScript.valueToCode(block, 'STRING',
- Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
+ Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\'';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.JavaScript.valueToCode(block, 'AT1',
- Blockly.JavaScript.ORDER_NONE) || '1';
- var at2 = Blockly.JavaScript.valueToCode(block, 'AT2',
- Blockly.JavaScript.ORDER_NONE) || '1';
if (where1 == 'FIRST' && where2 == 'LAST') {
var code = text;
+ } else if (text.match(/^'?\w+'?$/) ||
+ (where1 != 'FROM_END' && where1 != 'LAST' &&
+ where2 != 'FROM_END' && where2 != 'LAST')) {
+ // If the text is a variable or literal or doesn't require a call for
+ // length, don't generate a helper function.
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1');
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false,
+ Blockly.JavaScript.ORDER_SUBTRACTION);
+ at1 = text + '.length - ' + at1;
+ break;
+ case 'FIRST':
+ var at1 = '0';
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring).';
+ }
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false,
+ Blockly.JavaScript.ORDER_SUBTRACTION);
+ at2 = text + '.length - ' + at2;
+ break;
+ case 'LAST':
+ var at2 = text + '.length';
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring).';
+ }
+ code = text + '.slice(' + at1 + ', ' + at2 + ')';
} else {
+ var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1');
+ var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2');
+ var getIndex_ = Blockly.JavaScript.text.getIndex_;
+ var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last',
+ 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'};
var functionName = Blockly.JavaScript.provideFunction_(
- 'textGetSubstring',
- [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
- '(text, where1, at1, where2, at2) {',
- ' function getAt(where, at) {',
- ' if (where == \'FROM_START\') {',
- ' at--;',
- ' } else if (where == \'FROM_END\') {',
- ' at = text.length - at;',
- ' } else if (where == \'FIRST\') {',
- ' at = 0;',
- ' } else if (where == \'LAST\') {',
- ' at = text.length - 1;',
- ' } else {',
- ' throw \'Unhandled option (text_getSubstring).\';',
- ' }',
- ' return at;',
- ' }',
- ' at1 = getAt(where1, at1);',
- ' at2 = getAt(where2, at2) + 1;',
- ' return text.slice(at1, at2);',
+ 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2],
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ '(sequence' +
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
+ // we add it as a parameter.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') +
+ ') {',
+ ' var start = ' + getIndex_('sequence', where1, 'at1') + ';',
+ ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;',
+ ' return sequence.slice(start, end);',
'}']);
- var code = functionName + '(' + text + ', \'' +
- where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
+ var code = functionName + '(' + text +
+ // The value for 'FROM_END' and 'FROM_START' depends on `at` so we
+ // pass it.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') +
+ ')';
}
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
@@ -190,25 +241,24 @@ Blockly.JavaScript['text_changeCase'] = function(block) {
'TITLECASE': null
};
var operator = OPERATORS[block.getFieldValue('CASE')];
- var code;
+ var textOrder = operator ? Blockly.JavaScript.ORDER_MEMBER :
+ Blockly.JavaScript.ORDER_NONE;
+ var text = Blockly.JavaScript.valueToCode(block, 'TEXT',
+ textOrder) || '\'\'';
if (operator) {
// Upper and lower case are functions built into JavaScript.
- var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT',
- Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
- code = argument0 + operator;
+ var code = text + operator;
} else {
// Title case is not a native JavaScript function. Define one.
var functionName = Blockly.JavaScript.provideFunction_(
'textToTitleCase',
- [ 'function ' +
- Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(str) {',
- ' return str.replace(/\\S+/g,',
- ' function(txt) {return txt[0].toUpperCase() + ' +
- 'txt.substring(1).toLowerCase();});',
- '}']);
- var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT',
- Blockly.JavaScript.ORDER_NONE) || '\'\'';
- code = functionName + '(' + argument0 + ')';
+ ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
+ '(str) {',
+ ' return str.replace(/\\S+/g,',
+ ' function(txt) {return txt[0].toUpperCase() + ' +
+ 'txt.substring(1).toLowerCase();});',
+ '}']);
+ var code = functionName + '(' + text + ')';
}
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
@@ -221,16 +271,16 @@ Blockly.JavaScript['text_trim'] = function(block) {
'BOTH': '.trim()'
};
var operator = OPERATORS[block.getFieldValue('MODE')];
- var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT',
+ var text = Blockly.JavaScript.valueToCode(block, 'TEXT',
Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
- return [argument0 + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL];
+ return [text + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL];
};
Blockly.JavaScript['text_print'] = function(block) {
// Print statement.
- var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT',
+ var msg = Blockly.JavaScript.valueToCode(block, 'TEXT',
Blockly.JavaScript.ORDER_NONE) || '\'\'';
- return 'window.alert(' + argument0 + ');\n';
+ return 'window.alert(' + msg + ');\n';
};
Blockly.JavaScript['text_prompt_ext'] = function(block) {
diff --git a/generators/lua.js b/generators/lua.js
index 60a6c0e14..3f7df6b1c 100644
--- a/generators/lua.js
+++ b/generators/lua.js
@@ -77,7 +77,7 @@ Blockly.Lua.ORDER_ATOMIC = 0; // literals
// The next level was not explicit in documentation and inferred by Ellen.
Blockly.Lua.ORDER_HIGH = 1; // Function calls, tables[]
Blockly.Lua.ORDER_EXPONENTIATION = 2; // ^
-Blockly.Lua.ORDER_UNARY = 3; // not # - ()
+Blockly.Lua.ORDER_UNARY = 3; // not # - ~
Blockly.Lua.ORDER_MULTIPLICATIVE = 4; // * / %
Blockly.Lua.ORDER_ADDITIVE = 5; // + -
Blockly.Lua.ORDER_CONCATENATION = 6; // ..
@@ -86,6 +86,12 @@ Blockly.Lua.ORDER_AND = 8; // and
Blockly.Lua.ORDER_OR = 9; // or
Blockly.Lua.ORDER_NONE = 99;
+/**
+ * Lua is not supporting zero-indexing since the language itself is one-indexed,
+ * so there is not flag for ONE_BASED_INDEXING to indicate which indexing is
+ * used for lists and text.
+ */
+
/**
* Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
@@ -170,9 +176,9 @@ Blockly.Lua.scrub_ = function(block, code) {
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
- for (var x = 0; x < block.inputList.length; x++) {
- if (block.inputList[x].type == Blockly.INPUT_VALUE) {
- var childBlock = block.inputList[x].connection.targetBlock();
+ for (var i = 0; i < block.inputList.length; i++) {
+ if (block.inputList[i].type == Blockly.INPUT_VALUE) {
+ var childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
comment = Blockly.Lua.allNestedComments(childBlock);
if (comment) {
diff --git a/generators/lua/lists.js b/generators/lua/lists.js
index 8c89a1bd3..5b7711dbb 100644
--- a/generators/lua/lists.js
+++ b/generators/lua/lists.js
@@ -31,18 +31,17 @@ goog.require('Blockly.Lua');
Blockly.Lua['lists_create_empty'] = function(block) {
// Create an empty list.
- // List literals must be parenthesized before indexing into.
- return ['({})', Blockly.Lua.ORDER_ATOMIC];
+ return ['{}', Blockly.Lua.ORDER_ATOMIC];
};
Blockly.Lua['lists_create_with'] = function(block) {
// Create a list with any number of elements of any type.
- var code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Lua.valueToCode(block, 'ADD' + n,
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i,
Blockly.Lua.ORDER_NONE) || 'None';
}
- code = '({' + code.join(', ') + '})';
+ var code = '{' + elements.join(', ') + '}';
return [code, Blockly.Lua.ORDER_ATOMIC];
};
@@ -57,38 +56,37 @@ Blockly.Lua['lists_repeat'] = function(block) {
' end',
' return t',
'end']);
- var argument0 = Blockly.Lua.valueToCode(block, 'ITEM',
+ var element = Blockly.Lua.valueToCode(block, 'ITEM',
Blockly.Lua.ORDER_NONE) || 'None';
- var argument1 = Blockly.Lua.valueToCode(block, 'NUM',
+ var repeatCount = Blockly.Lua.valueToCode(block, 'NUM',
Blockly.Lua.ORDER_NONE) || '0';
- var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
+ var code = functionName + '(' + element + ', ' + repeatCount + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
Blockly.Lua['lists_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.Lua.valueToCode(block, 'VALUE',
- Blockly.Lua.ORDER_HIGH) || '({})';
- return ['#' + argument0, Blockly.Lua.ORDER_HIGH];
+ var list = Blockly.Lua.valueToCode(block, 'VALUE',
+ Blockly.Lua.ORDER_UNARY) || '{}';
+ return ['#' + list, Blockly.Lua.ORDER_UNARY];
};
Blockly.Lua['lists_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Lua.valueToCode(block, 'VALUE',
- Blockly.Lua.ORDER_HIGH) || '({})';
- var code = '#' + argument0 + ' == 0';
+ var list = Blockly.Lua.valueToCode(block, 'VALUE',
+ Blockly.Lua.ORDER_UNARY) || '{}';
+ var code = '#' + list + ' == 0';
return [code, Blockly.Lua.ORDER_RELATIONAL];
};
Blockly.Lua['lists_indexOf'] = function(block) {
// Find an item in the list.
- var argument0 = Blockly.Lua.valueToCode(block, 'FIND',
+ var item = Blockly.Lua.valueToCode(block, 'FIND',
Blockly.Lua.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Lua.valueToCode(block, 'VALUE',
- Blockly.Lua.ORDER_NONE) || '({})';
- var functionName;
+ var list = Blockly.Lua.valueToCode(block, 'VALUE',
+ Blockly.Lua.ORDER_NONE) || '{}';
if (block.getFieldValue('END') == 'FIRST') {
- functionName = Blockly.Lua.provideFunction_(
+ var functionName = Blockly.Lua.provideFunction_(
'first_index',
['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)',
' for k, v in ipairs(t) do',
@@ -99,7 +97,7 @@ Blockly.Lua['lists_indexOf'] = function(block) {
' return 0',
'end']);
} else {
- functionName = Blockly.Lua.provideFunction_(
+ var functionName = Blockly.Lua.provideFunction_(
'last_index',
['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)',
' for i = #t, 1, -1 do',
@@ -110,64 +108,40 @@ Blockly.Lua['lists_indexOf'] = function(block) {
' return 0',
'end']);
}
- var code = functionName + '(' + argument1 + ', ' + argument0 + ')';
+ var code = functionName + '(' + list + ', ' + item + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
/**
* Returns an expression calculating the index into a list.
* @private
- * @param {string} listname Name of the list, used to calculate length.
+ * @param {string} listName Name of the list, used to calculate length.
* @param {string} where The method of indexing, selected by dropdown in Blockly
* @param {string=} opt_at The optional offset when indexing from start/end.
* @return {string} Index expression.
*/
-Blockly.Lua.lists.getIndex_ = function(listname, where, opt_at) {
+Blockly.Lua.lists.getIndex_ = function(listName, where, opt_at) {
if (where == 'FIRST') {
return '1';
} else if (where == 'FROM_END') {
- return '#' + listname + ' + 1 - ' + opt_at;
+ return '#' + listName + ' + 1 - ' + opt_at;
} else if (where == 'LAST') {
- return '#' + listname;
+ return '#' + listName;
} else if (where == 'RANDOM') {
- return 'math.random(#' + listname + ')';
+ return 'math.random(#' + listName + ')';
} else {
return opt_at;
}
};
-/**
- * Counter for generating unique symbols.
- * @private
- * @type {number}
- */
-Blockly.Lua.lists.gensym_counter_ = 0;
-
-/**
- * Generate a unique symbol.
- * @private
- * @return {string} unique symbol, eg 'G123'
- */
-Blockly.Lua.lists.gensym_ = function() {
- return 'G' + Blockly.Lua.lists.gensym_counter_++;
-};
-
Blockly.Lua['lists_getIndex'] = function(block) {
// Get element at index.
// Note: Until January 2013 this block did not have MODE or WHERE inputs.
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Lua.valueToCode(block, 'AT',
- Blockly.Lua.ORDER_ADDITIVE) || '1';
- if (mode == 'GET') {
- var order = Blockly.Lua.ORDER_HIGH;
- } else {
- // List will be an argument in a function call.
- var order = Blockly.Lua.ORDER_NONE;
- }
- var list = Blockly.Lua.valueToCode(block, 'VALUE', order) || '({})';
+ var list = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.Lua.ORDER_HIGH) ||
+ '{}';
var getIndex_ = Blockly.Lua.lists.getIndex_;
- var gensym_ = Blockly.Lua.lists.gensym_;
// If `list` would be evaluated more than once (which is the case for LAST,
// FROM_END, and RANDOM) and is non-trivial, make sure to access it only once.
@@ -176,46 +150,59 @@ Blockly.Lua['lists_getIndex'] = function(block) {
// `list` is an expression, so we may not evaluate it more than once.
if (mode == 'REMOVE') {
// We can use multiple statements.
+ var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_ADDITIVE :
+ Blockly.Lua.ORDER_NONE;
+ var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1';
var listVar = Blockly.Lua.variableDB_.getDistinctName(
'tmp_list', Blockly.Variables.NAME_TYPE);
+ at = getIndex_(listVar, where, at);
var code = listVar + ' = ' + list + '\n' +
- 'table.remove(' + listVar + ', ' + getIndex_(listVar, where, at) +
- ')\n';
+ 'table.remove(' + listVar + ', ' + at + ')\n';
return code;
} else {
// We need to create a procedure to avoid reevaluating values.
+ var at = Blockly.Lua.valueToCode(block, 'AT', Blockly.Lua.ORDER_NONE) ||
+ '1';
if (mode == 'GET') {
- // Note that getIndex_() ignores `at` when `where` == 'LAST' or
- // 'RANDOM', so we only need one procedure for each of those 'where'
- // values. The value for 'FROM_END' depends on `at`, so we will
- // generate a unique procedure (name) each time.
var functionName = Blockly.Lua.provideFunction_(
- 'list_get_' + where.toLowerCase() +
- (where == 'FROM_END' ? '_' + gensym_() : ''),
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
- ' return t[' + getIndex_('t', where, at) + ']',
+ 'list_get_' + where.toLowerCase(),
+ ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' +
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
+ // we add it as a parameter.
+ ((where == 'FROM_END' || where == 'FROM_START') ?
+ ', at)' : ')'),
+ ' return t[' + getIndex_('t', where, 'at') + ']',
'end']);
- } else { // mode == 'GET_REMOVE'
- // We need to create a procedure.
+ } else { // mode == 'GET_REMOVE'
var functionName = Blockly.Lua.provideFunction_(
- 'list_remove_' + where.toLowerCase() +
- (where == 'FROM_END' ? '_' + gensym_() : ''),
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
- ' return table.remove(t, ' + getIndex_('t', where, at) + ')',
+ 'list_remove_' + where.toLowerCase(),
+ ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' +
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
+ // we add it as a parameter.
+ ((where == 'FROM_END' || where == 'FROM_START') ?
+ ', at)' : ')'),
+ ' return table.remove(t, ' + getIndex_('t', where, 'at') + ')',
'end']);
}
- var code = functionName + '(' + list + ')';
+ var code = functionName + '(' + list +
+ // The value for 'FROM_END' and 'FROM_START' depends on `at` so we
+ // pass it.
+ ((where == 'FROM_END' || where == 'FROM_START') ? ', ' + at : '') +
+ ')';
return [code, Blockly.Lua.ORDER_HIGH];
}
} else {
// Either `list` is a simple variable, or we only need to refer to `list`
// once.
+ var atOrder = (mode == 'GET' && where == 'FROM_END') ?
+ Blockly.Lua.ORDER_ADDITIVE : Blockly.Lua.ORDER_NONE;
+ var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1';
+ at = getIndex_(list, where, at);
if (mode == 'GET') {
- var code = list + '[' + getIndex_(list, where, at) + ']';
+ var code = list + '[' + at + ']';
return [code, Blockly.Lua.ORDER_HIGH];
} else {
- var code = 'table.remove(' + list + ', ' + getIndex_(list, where, at) +
- ')';
+ var code = 'table.remove(' + list + ', ' + at + ')';
if (mode == 'GET_REMOVE') {
return [code, Blockly.Lua.ORDER_HIGH];
} else { // `mode` == 'REMOVE'
@@ -229,7 +216,7 @@ Blockly.Lua['lists_setIndex'] = function(block) {
// Set element at index.
// Note: Until February 2013 this block did not have MODE or WHERE inputs.
var list = Blockly.Lua.valueToCode(block, 'LIST',
- Blockly.Lua.ORDER_HIGH) || '({})';
+ Blockly.Lua.ORDER_HIGH) || '{}';
var mode = block.getFieldValue('MODE') || 'SET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
var at = Blockly.Lua.valueToCode(block, 'AT',
@@ -238,97 +225,71 @@ Blockly.Lua['lists_setIndex'] = function(block) {
Blockly.Lua.ORDER_NONE) || 'None';
var getIndex_ = Blockly.Lua.lists.getIndex_;
+ var code = '';
// If `list` would be evaluated more than once (which is the case for LAST,
// FROM_END, and RANDOM) and is non-trivial, make sure to access it only once.
if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') &&
!list.match(/^\w+$/)) {
// `list` is an expression, so we may not evaluate it more than once.
- if (where == 'RANDOM' || where == 'LAST') {
- // In these cases, `at` is implicit. getIndex_() ignores its value.
- if (mode == 'SET') {
- var functionName = Blockly.Lua.provideFunction_(
- 'list_set_' + where.toLowerCase(),
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, val)',
- ' t[' + getIndex_('t', where, at) + '] = val',
- 'end']);
- } else { // `mode` == 'INSERT'
- var functionName = Blockly.Lua.provideFunction_(
- 'list_insert_' + where.toLowerCase(),
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, val)',
- ' table.insert(t, ' +
- // LAST is a special case, because we want to insert
- // *after* not *before*, the existing last element.
- getIndex_('t', where, at) + (where == 'LAST' ? ' + 1' : '') +
- ', val)',
- 'end']);
- }
- var code = functionName + '(' + list + ', ' + value + ')\n';
- return code;
- } else { // `where` = 'FROM_END'
- if (mode == 'SET') {
- var functionName = Blockly.Lua.provideFunction_(
- 'list_set_from_end',
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ +
- '(t, index, val)',
- ' t[#t + 1 - index] = val',
- 'end']);
- } else { // `mode` == 'INSERT'
- var functionName = Blockly.Lua.provideFunction_(
- 'list_insert_from_end',
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ +
- '(t, index, val)',
- ' table.insert(t, #t + 1 - index, val)',
- 'end']);
- }
- var code = functionName + '(' + list + ', ' + at + ', ' + value + ')\n';
- return code;
- }
- } else {
- // It's okay to have multiple references to the list.
- if (mode == 'SET') {
- var code = list + '[' + getIndex_(list, where, at) + '] = ' + value;
- } else { // `mode` == 'INSERT'
- // LAST is a special case, because we want to insert
- // *after* not *before*, the existing last element.
- var code = 'table.insert(' + list + ', ' +
- (getIndex_(list, where, at) + (where == 'LAST' ? ' + 1' : '')) +
- ', ' + value + ')';
- }
- return code + '\n';
+ // We can use multiple statements.
+ var listVar = Blockly.Lua.variableDB_.getDistinctName(
+ 'tmp_list', Blockly.Variables.NAME_TYPE);
+ code = listVar + ' = ' + list + '\n';
+ list = listVar;
}
+ if (mode == 'SET') {
+ code += list + '[' + getIndex_(list, where, at) + '] = ' + value;
+ } else { // `mode` == 'INSERT'
+ // LAST is a special case, because we want to insert
+ // *after* not *before*, the existing last element.
+ code += 'table.insert(' + list + ', ' +
+ (getIndex_(list, where, at) + (where == 'LAST' ? ' + 1' : '')) +
+ ', ' + value + ')';
+ }
+ return code + '\n';
};
Blockly.Lua['lists_getSublist'] = function(block) {
// Get sublist.
var list = Blockly.Lua.valueToCode(block, 'LIST',
- Blockly.Lua.ORDER_HIGH) || '({})';
+ Blockly.Lua.ORDER_NONE) || '{}';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
var at1 = Blockly.Lua.valueToCode(block, 'AT1',
- Blockly.Lua.ORDER_ADDITIVE) || '1';
+ Blockly.Lua.ORDER_NONE) || '1';
var at2 = Blockly.Lua.valueToCode(block, 'AT2',
- Blockly.Lua.ORDER_ADDITIVE) || '1';
+ Blockly.Lua.ORDER_NONE) || '1';
var getIndex_ = Blockly.Lua.lists.getIndex_;
var functionName = Blockly.Lua.provideFunction_(
- 'list_sublist_' + Blockly.Lua.lists.gensym_(),
- ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source)',
+ 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(),
+ ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source' +
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
+ // we add it as a parameter.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') +
+ ')',
' local t = {}',
- ' local start = ' + getIndex_('source', where1, at1),
- ' local finish = ' + getIndex_('source', where2, at2),
+ ' local start = ' + getIndex_('source', where1, 'at1'),
+ ' local finish = ' + getIndex_('source', where2, 'at2'),
' for i = start, finish do',
' table.insert(t, source[i])',
' end',
' return t',
'end']);
- var code = functionName + '(' + list + ')';
+ var code = functionName + '(' + list +
+ // The value for 'FROM_END' and 'FROM_START' depends on `at` so we
+ // pass it.
+ ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') +
+ ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') +
+ ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
Blockly.Lua['lists_sort'] = function(block) {
// Block for sorting a list.
- var listCode = Blockly.Lua.valueToCode(
- block, 'LIST', Blockly.Lua.ORDER_HIGH) || '({})';
+ var list = Blockly.Lua.valueToCode(
+ block, 'LIST', Blockly.Lua.ORDER_NONE) || '{}';
var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;
var type = block.getFieldValue('TYPE');
@@ -357,26 +318,26 @@ Blockly.Lua['lists_sort'] = function(block) {
'end']);
var code = functionName +
- '(' + listCode + ',"' + type + '", ' + direction + ')';
+ '(' + list + ',"' + type + '", ' + direction + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
Blockly.Lua['lists_split'] = function(block) {
// Block for splitting text into a list, or joining a list into text.
- var value_input = Blockly.Lua.valueToCode(block, 'INPUT',
+ var input = Blockly.Lua.valueToCode(block, 'INPUT',
Blockly.Lua.ORDER_NONE);
- var value_delim = Blockly.Lua.valueToCode(block, 'DELIM',
+ var delimiter = Blockly.Lua.valueToCode(block, 'DELIM',
Blockly.Lua.ORDER_NONE) || '\'\'';
var mode = block.getFieldValue('MODE');
var functionName;
if (mode == 'SPLIT') {
- if (!value_input) {
- value_input = '\'\'';
+ if (!input) {
+ input = '\'\'';
}
functionName = Blockly.Lua.provideFunction_(
'list_string_split',
['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ +
- '(input, delim)',
+ '(input, delim)',
' local t = {}',
' local pos = 1',
' while true do',
@@ -392,13 +353,13 @@ Blockly.Lua['lists_split'] = function(block) {
' return t',
'end']);
} else if (mode == 'JOIN') {
- if (!value_input) {
- value_input = '({})';
+ if (!input) {
+ input = '{}';
}
functionName = 'table.concat';
} else {
throw 'Unknown mode: ' + mode;
}
- var code = functionName + '(' + value_input + ', ' + value_delim + ')';
+ var code = functionName + '(' + input + ', ' + delimiter + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
diff --git a/generators/lua/procedures.js b/generators/lua/procedures.js
index 9bdcc416b..b6d6cdda1 100644
--- a/generators/lua/procedures.js
+++ b/generators/lua/procedures.js
@@ -51,8 +51,8 @@ Blockly.Lua['procedures_defreturn'] = function(block) {
branch = '';
}
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Lua.variableDB_.getName(block.arguments_[x],
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Lua.variableDB_.getName(block.arguments_[i],
Blockly.Variables.NAME_TYPE);
}
var code = 'function ' + funcName + '(' + args.join(', ') + ')\n' +
@@ -73,8 +73,8 @@ Blockly.Lua['procedures_callreturn'] = function(block) {
var funcName = Blockly.Lua.variableDB_.getName(
block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Lua.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i,
Blockly.Lua.ORDER_NONE) || 'nil';
}
var code = funcName + '(' + args.join(', ') + ')';
@@ -86,8 +86,8 @@ Blockly.Lua['procedures_callnoreturn'] = function(block) {
var funcName = Blockly.Lua.variableDB_.getName(
block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Lua.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i,
Blockly.Lua.ORDER_NONE) || 'nil';
}
var code = funcName + '(' + args.join(', ') + ')\n';
diff --git a/generators/lua/text.js b/generators/lua/text.js
index 8a6a02702..74efba4a2 100644
--- a/generators/lua/text.js
+++ b/generators/lua/text.js
@@ -40,24 +40,24 @@ Blockly.Lua['text_join'] = function(block) {
if (block.itemCount_ == 0) {
return ['\'\'', Blockly.Lua.ORDER_ATOMIC];
} else if (block.itemCount_ == 1) {
- var argument0 = Blockly.Lua.valueToCode(block, 'ADD0',
+ var element = Blockly.Lua.valueToCode(block, 'ADD0',
Blockly.Lua.ORDER_NONE) || '\'\'';
- var code = argument0;
+ var code = 'tostring(' + element + ')';
return [code, Blockly.Lua.ORDER_HIGH];
} else if (block.itemCount_ == 2) {
- var argument0 = Blockly.Lua.valueToCode(block, 'ADD0',
- Blockly.Lua.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Lua.valueToCode(block, 'ADD1',
- Blockly.Lua.ORDER_NONE) || '\'\'';
- var code = argument0 + ' .. ' + argument1;
- return [code, Blockly.Lua.ORDER_UNARY];
+ var element0 = Blockly.Lua.valueToCode(block, 'ADD0',
+ Blockly.Lua.ORDER_CONCATENATION) || '\'\'';
+ var element1 = Blockly.Lua.valueToCode(block, 'ADD1',
+ Blockly.Lua.ORDER_CONCATENATION) || '\'\'';
+ var code = element0 + ' .. ' + element1;
+ return [code, Blockly.Lua.ORDER_CONCATENATION];
} else {
- var code = [];
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Lua.valueToCode(block, 'ADD' + n,
+ var elements = [];
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i,
Blockly.Lua.ORDER_NONE) || '\'\'';
}
- code = 'table.concat({' + code.join(', ') + '})';
+ var code = 'table.concat({' + elements.join(', ') + '})';
return [code, Blockly.Lua.ORDER_HIGH];
}
};
@@ -66,32 +66,30 @@ Blockly.Lua['text_append'] = function(block) {
// Append to a variable in place.
var varName = Blockly.Lua.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
- var argument0 = Blockly.Lua.valueToCode(block, 'TEXT',
- Blockly.Lua.ORDER_NONE) || '\'\'';
- return varName + ' = ' + varName + ' .. ' + argument0 + '\n';
+ var value = Blockly.Lua.valueToCode(block, 'TEXT',
+ Blockly.Lua.ORDER_CONCATENATION) || '\'\'';
+ return varName + ' = ' + varName + ' .. ' + value + '\n';
};
Blockly.Lua['text_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.Lua.valueToCode(block, 'VALUE',
- Blockly.Lua.ORDER_HIGH) || '\'\'';
- return ['#' + argument0, Blockly.Lua.ORDER_HIGH];
+ var text = Blockly.Lua.valueToCode(block, 'VALUE',
+ Blockly.Lua.ORDER_UNARY) || '\'\'';
+ return ['#' + text, Blockly.Lua.ORDER_UNARY];
};
Blockly.Lua['text_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Lua.valueToCode(block, 'VALUE',
- Blockly.Lua.ORDER_HIGH) || '\'\'';
- return ['#' + argument0 + ' == 0', Blockly.Lua.ORDER_RELATIONAL];
+ var text = Blockly.Lua.valueToCode(block, 'VALUE',
+ Blockly.Lua.ORDER_UNARY) || '\'\'';
+ return ['#' + text + ' == 0', Blockly.Lua.ORDER_RELATIONAL];
};
Blockly.Lua['text_indexOf'] = function(block) {
// Search the text for a substring.
- var operator = block.getFieldValue('END') == 'FIRST' ?
- 'indexOf' : 'lastIndexOf';
- var substr = Blockly.Lua.valueToCode(block, 'FIND',
+ var substring = Blockly.Lua.valueToCode(block, 'FIND',
Blockly.Lua.ORDER_NONE) || '\'\'';
- var str = Blockly.Lua.valueToCode(block, 'VALUE',
+ var text = Blockly.Lua.valueToCode(block, 'VALUE',
Blockly.Lua.ORDER_NONE) || '\'\'';
if (block.getFieldValue('END') == 'FIRST') {
var functionName = Blockly.Lua.provideFunction_(
@@ -118,7 +116,7 @@ Blockly.Lua['text_indexOf'] = function(block) {
' return 0',
'end']);
}
- var code = functionName + '(' + str + ', ' + substr + ')';
+ var code = functionName + '(' + text + ', ' + substring + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
@@ -126,8 +124,9 @@ Blockly.Lua['text_charAt'] = function(block) {
// Get letter at index.
// Note: Until January 2013 this block did not have the WHERE input.
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Lua.valueToCode(block, 'AT',
- Blockly.Lua.ORDER_UNARY) || '1';
+ var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_UNARY :
+ Blockly.Lua.ORDER_NONE;
+ var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1';
var text = Blockly.Lua.valueToCode(block, 'VALUE',
Blockly.Lua.ORDER_NONE) || '\'\'';
var code;
@@ -176,8 +175,9 @@ Blockly.Lua['text_getSubstring'] = function(block) {
// Get start index.
var where1 = block.getFieldValue('WHERE1');
- var at1 = Blockly.Lua.valueToCode(block, 'AT1',
- Blockly.Lua.ORDER_UNARY) || '1';
+ var at1Order = (where1 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY :
+ Blockly.Lua.ORDER_NONE;
+ var at1 = Blockly.Lua.valueToCode(block, 'AT1', at1Order) || '1';
if (where1 == 'FIRST') {
var start = 1;
} else if (where1 == 'FROM_START') {
@@ -190,8 +190,9 @@ Blockly.Lua['text_getSubstring'] = function(block) {
// Get end index.
var where2 = block.getFieldValue('WHERE2');
- var at2 = Blockly.Lua.valueToCode(block, 'AT2',
- Blockly.Lua.ORDER_UNARY) || '1';
+ var at2Order = (where2 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY :
+ Blockly.Lua.ORDER_NONE;
+ var at2 = Blockly.Lua.valueToCode(block, 'AT2', at2Order) || '1';
if (where2 == 'LAST') {
var end = -1;
} else if (where2 == 'FROM_START') {
@@ -208,7 +209,7 @@ Blockly.Lua['text_getSubstring'] = function(block) {
Blockly.Lua['text_changeCase'] = function(block) {
// Change capitalization.
var operator = block.getFieldValue('CASE');
- var argument0 = Blockly.Lua.valueToCode(block, 'TEXT',
+ var text = Blockly.Lua.valueToCode(block, 'TEXT',
Blockly.Lua.ORDER_NONE) || '\'\'';
if (operator == 'UPPERCASE') {
var functionName = 'string.upper';
@@ -238,7 +239,7 @@ Blockly.Lua['text_changeCase'] = function(block) {
' return table.concat(buf)',
'end']);
}
- var code = functionName + '(' + argument0 + ')';
+ var code = functionName + '(' + text + ')';
return [code, Blockly.Lua.ORDER_HIGH];
};
@@ -258,9 +259,9 @@ Blockly.Lua['text_trim'] = function(block) {
Blockly.Lua['text_print'] = function(block) {
// Print statement.
- var argument0 = Blockly.Lua.valueToCode(block, 'TEXT',
+ var msg = Blockly.Lua.valueToCode(block, 'TEXT',
Blockly.Lua.ORDER_NONE) || '\'\'';
- return 'print(' + argument0 + ')\n';
+ return 'print(' + msg + ')\n';
};
Blockly.Lua['text_prompt_ext'] = function(block) {
diff --git a/generators/php.js b/generators/php.js
index d935cda1b..02e89e809 100644
--- a/generators/php.js
+++ b/generators/php.js
@@ -44,44 +44,98 @@ Blockly.PHP = new Blockly.Generator('PHP');
*/
Blockly.PHP.addReservedWords(
// http://php.net/manual/en/reserved.keywords.php
- '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,' +
+ '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,' +
+ 'clone,const,continue,declare,default,die,do,echo,else,elseif,empty,' +
+ 'enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,' +
+ 'final,for,foreach,function,global,goto,if,implements,include,' +
+ 'include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,' +
+ 'print,private,protected,public,require,require_once,return,static,' +
+ 'switch,throw,trait,try,unset,use,var,while,xor,' +
// http://php.net/manual/en/reserved.constants.php
- 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__');
+ 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,' +
+ 'PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,' +
+ 'PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,' +
+ 'PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,' +
+ 'PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,' +
+ 'PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,' +
+ 'PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,' +
+ 'E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,' +
+ 'E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,' +
+ 'E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,' +
+ '__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__'
+);
/**
* Order of operation ENUMs.
* http://php.net/manual/en/language.operators.precedence.php
*/
-Blockly.PHP.ORDER_ATOMIC = 0; // 0 "" ...
-Blockly.PHP.ORDER_CLONE = 1; // clone
-Blockly.PHP.ORDER_NEW = 1; // new
-Blockly.PHP.ORDER_MEMBER = 2; // ()
-Blockly.PHP.ORDER_FUNCTION_CALL = 2; // ()
-Blockly.PHP.ORDER_INCREMENT = 3; // ++
-Blockly.PHP.ORDER_DECREMENT = 3; // --
-Blockly.PHP.ORDER_LOGICAL_NOT = 4; // !
-Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~
-Blockly.PHP.ORDER_UNARY_PLUS = 4; // +
-Blockly.PHP.ORDER_UNARY_NEGATION = 4; // -
-Blockly.PHP.ORDER_MULTIPLICATION = 5; // *
-Blockly.PHP.ORDER_DIVISION = 5; // /
-Blockly.PHP.ORDER_MODULUS = 5; // %
-Blockly.PHP.ORDER_ADDITION = 6; // +
-Blockly.PHP.ORDER_SUBTRACTION = 6; // -
-Blockly.PHP.ORDER_BITWISE_SHIFT = 7; // << >> >>>
-Blockly.PHP.ORDER_RELATIONAL = 8; // < <= > >=
-Blockly.PHP.ORDER_IN = 8; // in
-Blockly.PHP.ORDER_INSTANCEOF = 8; // instanceof
-Blockly.PHP.ORDER_EQUALITY = 9; // == != === !==
-Blockly.PHP.ORDER_BITWISE_AND = 10; // &
-Blockly.PHP.ORDER_BITWISE_XOR = 11; // ^
-Blockly.PHP.ORDER_BITWISE_OR = 12; // |
-Blockly.PHP.ORDER_CONDITIONAL = 13; // ?:
-Blockly.PHP.ORDER_ASSIGNMENT = 14; // = += -= *= /= %= <<= >>= ...
-Blockly.PHP.ORDER_LOGICAL_AND = 15; // &&
-Blockly.PHP.ORDER_LOGICAL_OR = 16; // ||
-Blockly.PHP.ORDER_COMMA = 17; // ,
-Blockly.PHP.ORDER_NONE = 99; // (...)
+Blockly.PHP.ORDER_ATOMIC = 0; // 0 "" ...
+Blockly.PHP.ORDER_CLONE = 1; // clone
+Blockly.PHP.ORDER_NEW = 1; // new
+Blockly.PHP.ORDER_MEMBER = 2.1; // []
+Blockly.PHP.ORDER_FUNCTION_CALL = 2.2; // ()
+Blockly.PHP.ORDER_POWER = 3; // **
+Blockly.PHP.ORDER_INCREMENT = 4; // ++
+Blockly.PHP.ORDER_DECREMENT = 4; // --
+Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~
+Blockly.PHP.ORDER_CAST = 4; // (int) (float) (string) (array) ...
+Blockly.PHP.ORDER_SUPPRESS_ERROR = 4; // @
+Blockly.PHP.ORDER_INSTANCEOF = 5; // instanceof
+Blockly.PHP.ORDER_LOGICAL_NOT = 6; // !
+Blockly.PHP.ORDER_UNARY_PLUS = 7.1; // +
+Blockly.PHP.ORDER_UNARY_NEGATION = 7.2; // -
+Blockly.PHP.ORDER_MULTIPLICATION = 8.1; // *
+Blockly.PHP.ORDER_DIVISION = 8.2; // /
+Blockly.PHP.ORDER_MODULUS = 8.3; // %
+Blockly.PHP.ORDER_ADDITION = 9.1; // +
+Blockly.PHP.ORDER_SUBTRACTION = 9.2; // -
+Blockly.PHP.ORDER_STRING_CONCAT = 9.3; // .
+Blockly.PHP.ORDER_BITWISE_SHIFT = 10; // << >>
+Blockly.PHP.ORDER_RELATIONAL = 11; // < <= > >=
+Blockly.PHP.ORDER_EQUALITY = 12; // == != === !== <> <=>
+Blockly.PHP.ORDER_REFERENCE = 13; // &
+Blockly.PHP.ORDER_BITWISE_AND = 13; // &
+Blockly.PHP.ORDER_BITWISE_XOR = 14; // ^
+Blockly.PHP.ORDER_BITWISE_OR = 15; // |
+Blockly.PHP.ORDER_LOGICAL_AND = 16; // &&
+Blockly.PHP.ORDER_LOGICAL_OR = 17; // ||
+Blockly.PHP.ORDER_IF_NULL = 18; // ??
+Blockly.PHP.ORDER_CONDITIONAL = 19; // ?:
+Blockly.PHP.ORDER_ASSIGNMENT = 20; // = += -= *= /= %= <<= >>= ...
+Blockly.PHP.ORDER_LOGICAL_AND_WEAK = 21; // and
+Blockly.PHP.ORDER_LOGICAL_XOR = 22; // xor
+Blockly.PHP.ORDER_LOGICAL_OR_WEAK = 23; // or
+Blockly.PHP.ORDER_COMMA = 24; // ,
+Blockly.PHP.ORDER_NONE = 99; // (...)
+
+/**
+ * List of outer-inner pairings that do NOT require parentheses.
+ * @type {!Array.>}
+ */
+Blockly.PHP.ORDER_OVERRIDES = [
+ // (foo()).bar() -> foo().bar()
+ // (foo())[0] -> foo()[0]
+ [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_FUNCTION_CALL],
+ // (foo[0])[1] -> foo[0][1]
+ // (foo.bar).baz -> foo.bar.baz
+ [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_MEMBER],
+ // !(!foo) -> !!foo
+ [Blockly.PHP.ORDER_LOGICAL_NOT, Blockly.PHP.ORDER_LOGICAL_NOT],
+ // a * (b * c) -> a * b * c
+ [Blockly.PHP.ORDER_MULTIPLICATION, Blockly.PHP.ORDER_MULTIPLICATION],
+ // a + (b + c) -> a + b + c
+ [Blockly.PHP.ORDER_ADDITION, Blockly.PHP.ORDER_ADDITION],
+ // a && (b && c) -> a && b && c
+ [Blockly.PHP.ORDER_LOGICAL_AND, Blockly.PHP.ORDER_LOGICAL_AND],
+ // a || (b || c) -> a || b || c
+ [Blockly.PHP.ORDER_LOGICAL_OR, Blockly.PHP.ORDER_LOGICAL_OR]
+];
+
+/**
+ * Allow for switching between one and zero based indexing for lists and text,
+ * one based by default.
+ */
+Blockly.PHP.ONE_BASED_INDEXING = true;
/**
* Initialise the database of variable names.
@@ -173,9 +227,9 @@ Blockly.PHP.scrub_ = function(block, code) {
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
- for (var x = 0; x < block.inputList.length; x++) {
- if (block.inputList[x].type == Blockly.INPUT_VALUE) {
- var childBlock = block.inputList[x].connection.targetBlock();
+ for (var i = 0; i < block.inputList.length; i++) {
+ if (block.inputList[i].type == Blockly.INPUT_VALUE) {
+ var childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
var comment = Blockly.PHP.allNestedComments(childBlock);
if (comment) {
@@ -189,3 +243,66 @@ Blockly.PHP.scrub_ = function(block, code) {
var nextCode = Blockly.PHP.blockToCode(nextBlock);
return commentCode + code + nextCode;
};
+
+/**
+ * Gets a property and adjusts the value while taking into account indexing.
+ * @param {!Blockly.Block} block The block.
+ * @param {string} atId The property ID of the element to get.
+ * @param {number=} opt_delta Value to add.
+ * @param {boolean=} opt_negate Whether to negate the value.
+ * @param {number=} opt_order The highest order acting on this value.
+ * @return {string|number}
+ */
+Blockly.PHP.getAdjusted = function(block, atId, opt_delta, opt_negate,
+ opt_order) {
+ var delta = opt_delta || 0;
+ var order = opt_order || Blockly.PHP.ORDER_NONE;
+ if (Blockly.PHP.ONE_BASED_INDEXING) {
+ delta--;
+ }
+ var defaultAtIndex = Blockly.PHP.ONE_BASED_INDEXING ? '1' : '0';
+ if (delta > 0) {
+ var at = Blockly.PHP.valueToCode(block, atId,
+ Blockly.PHP.ORDER_ADDITION) || defaultAtIndex;
+ } else if (delta < 0) {
+ var at = Blockly.PHP.valueToCode(block, atId,
+ Blockly.PHP.ORDER_SUBTRACTION) || defaultAtIndex;
+ } else if (opt_negate) {
+ var at = Blockly.PHP.valueToCode(block, atId,
+ Blockly.PHP.ORDER_UNARY_NEGATION) || defaultAtIndex;
+ } else {
+ var at = Blockly.PHP.valueToCode(block, atId, order) ||
+ defaultAtIndex;
+ }
+
+ if (Blockly.isNumber(at)) {
+ // If the index is a naked number, adjust it right now.
+ at = parseFloat(at) + delta;
+ if (opt_negate) {
+ at = -at;
+ }
+ } else {
+ // If the index is dynamic, adjust it in code.
+ if (delta > 0) {
+ at = at + ' + ' + delta;
+ var innerOrder = Blockly.PHP.ORDER_ADDITION;
+ } else if (delta < 0) {
+ at = at + ' - ' + -delta;
+ var innerOrder = Blockly.PHP.ORDER_SUBTRACTION;
+ }
+ if (opt_negate) {
+ if (delta) {
+ at = '-(' + at + ')';
+ } else {
+ at = '-' + at;
+ }
+ var innerOrder = Blockly.PHP.ORDER_UNARY_NEGATION;
+ }
+ innerOrder = Math.floor(innerOrder);
+ order = Math.floor(order);
+ if (innerOrder && order >= innerOrder) {
+ at = '(' + at + ')';
+ }
+ }
+ return at;
+};
diff --git a/generators/php/colour.js b/generators/php/colour.js
index bc1789c35..e73c17a95 100644
--- a/generators/php/colour.js
+++ b/generators/php/colour.js
@@ -39,10 +39,10 @@ Blockly.PHP['colour_random'] = function(block) {
// Generate a random colour.
var functionName = Blockly.PHP.provideFunction_(
'colour_random',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {',
- ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' +
- '6, \'0\', STR_PAD_LEFT);',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {',
+ ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' +
+ '6, \'0\', STR_PAD_LEFT);',
+ '}']);
var code = functionName + '()';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
@@ -57,17 +57,17 @@ Blockly.PHP['colour_rgb'] = function(block) {
Blockly.PHP.ORDER_COMMA) || 0;
var functionName = Blockly.PHP.provideFunction_(
'colour_rgb',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($r, $g, $b) {',
- ' $r = round(max(min($r, 100), 0) * 2.55);',
- ' $g = round(max(min($g, 100), 0) * 2.55);',
- ' $b = round(max(min($b, 100), 0) * 2.55);',
- ' $hex = "#";',
- ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);',
- ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);',
- ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);',
- ' return $hex;',
- '}']);
+ ' $r = round(max(min($r, 100), 0) * 2.55);',
+ ' $g = round(max(min($g, 100), 0) * 2.55);',
+ ' $b = round(max(min($b, 100), 0) * 2.55);',
+ ' $hex = \'#\';',
+ ' $hex .= str_pad(dechex($r), 2, \'0\', STR_PAD_LEFT);',
+ ' $hex .= str_pad(dechex($g), 2, \'0\', STR_PAD_LEFT);',
+ ' $hex .= str_pad(dechex($b), 2, \'0\', STR_PAD_LEFT);',
+ ' return $hex;',
+ '}']);
var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
@@ -82,24 +82,24 @@ Blockly.PHP['colour_blend'] = function(block) {
Blockly.PHP.ORDER_COMMA) || 0.5;
var functionName = Blockly.PHP.provideFunction_(
'colour_blend',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($c1, $c2, $ratio) {',
- ' $ratio = max(min($ratio, 1), 0);',
- ' $r1 = hexdec(substr($c1, 1, 2));',
- ' $g1 = hexdec(substr($c1, 3, 2));',
- ' $b1 = hexdec(substr($c1, 5, 2));',
- ' $r2 = hexdec(substr($c2, 1, 2));',
- ' $g2 = hexdec(substr($c2, 3, 2));',
- ' $b2 = hexdec(substr($c2, 5, 2));',
- ' $r = round($r1 * (1 - $ratio) + $r2 * $ratio);',
- ' $g = round($g1 * (1 - $ratio) + $g2 * $ratio);',
- ' $b = round($b1 * (1 - $ratio) + $b2 * $ratio);',
- ' $hex = "#";',
- ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);',
- ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);',
- ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);',
- ' return $hex;',
- '}']);
+ ' $ratio = max(min($ratio, 1), 0);',
+ ' $r1 = hexdec(substr($c1, 1, 2));',
+ ' $g1 = hexdec(substr($c1, 3, 2));',
+ ' $b1 = hexdec(substr($c1, 5, 2));',
+ ' $r2 = hexdec(substr($c2, 1, 2));',
+ ' $g2 = hexdec(substr($c2, 3, 2));',
+ ' $b2 = hexdec(substr($c2, 5, 2));',
+ ' $r = round($r1 * (1 - $ratio) + $r2 * $ratio);',
+ ' $g = round($g1 * (1 - $ratio) + $g2 * $ratio);',
+ ' $b = round($b1 * (1 - $ratio) + $b2 * $ratio);',
+ ' $hex = \'#\';',
+ ' $hex .= str_pad(dechex($r), 2, \'0\', STR_PAD_LEFT);',
+ ' $hex .= str_pad(dechex($g), 2, \'0\', STR_PAD_LEFT);',
+ ' $hex .= str_pad(dechex($b), 2, \'0\', STR_PAD_LEFT);',
+ ' return $hex;',
+ '}']);
var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
diff --git a/generators/php/lists.js b/generators/php/lists.js
index a406aa6d2..449c31a5e 100644
--- a/generators/php/lists.js
+++ b/generators/php/lists.js
@@ -22,6 +22,17 @@
* @fileoverview Generating PHP for list blocks.
* @author daarond@gmail.com (Daaron Dwyer)
*/
+
+/*
+ * Lists in PHP are known to break when non-variables are passed into blocks
+ * that require a list. PHP, unlike other languages, passes arrays as reference
+ * value instead of value so we are unable to support it to the extent we can
+ * for the other languages.
+ * For example, a ternary operator with two arrays will return the array by
+ * value and that cannot be passed into any of the built-in array functions for
+ * PHP (because only variables can be passed by reference).
+ * ex: end(true ? list1 : list2)
+ */
'use strict';
goog.provide('Blockly.PHP.lists');
@@ -31,37 +42,37 @@ goog.require('Blockly.PHP');
Blockly.PHP['lists_create_empty'] = function(block) {
// Create an empty list.
- return ['array()', Blockly.PHP.ORDER_ATOMIC];
+ return ['array()', Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['lists_create_with'] = function(block) {
// Create a list with any number of elements of any type.
var code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n,
+ for (var i = 0; i < block.itemCount_; i++) {
+ code[i] = Blockly.PHP.valueToCode(block, 'ADD' + i,
Blockly.PHP.ORDER_COMMA) || 'null';
}
code = 'array(' + code.join(', ') + ')';
- return [code, Blockly.PHP.ORDER_ATOMIC];
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['lists_repeat'] = function(block) {
// Create a list with one element repeated.
var functionName = Blockly.PHP.provideFunction_(
'lists_repeat',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($value, $count) {',
- ' $array = array();',
- ' for ($index = 0; $index < $count; $index++) {',
- ' $array[] = $value;',
- ' }',
- ' return $array;',
- '}']);
- var argument0 = Blockly.PHP.valueToCode(block, 'ITEM',
+ ' $array = array();',
+ ' for ($index = 0; $index < $count; $index++) {',
+ ' $array[] = $value;',
+ ' }',
+ ' return $array;',
+ '}']);
+ var element = Blockly.PHP.valueToCode(block, 'ITEM',
Blockly.PHP.ORDER_COMMA) || 'null';
- var argument1 = Blockly.PHP.valueToCode(block, 'NUM',
+ var repeatCount = Blockly.PHP.valueToCode(block, 'NUM',
Blockly.PHP.ORDER_COMMA) || '0';
- var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
+ var code = functionName + '(' + element + ', ' + repeatCount + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
@@ -69,16 +80,16 @@ Blockly.PHP['lists_length'] = function(block) {
// String or array length.
var functionName = Blockly.PHP.provideFunction_(
'length',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {',
- ' if (is_string($value)) {',
- ' return strlen($value);',
- ' } else {',
- ' return count($value);',
- ' }',
- '}']);
- var argument0 = Blockly.PHP.valueToCode(block, 'VALUE',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {',
+ ' if (is_string($value)) {',
+ ' return strlen($value);',
+ ' } else {',
+ ' return count($value);',
+ ' }',
+ '}']);
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
+ return [functionName + '(' + list + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['lists_isEmpty'] = function(block) {
@@ -90,36 +101,42 @@ Blockly.PHP['lists_isEmpty'] = function(block) {
Blockly.PHP['lists_indexOf'] = function(block) {
// Find an item in the list.
- var operator = block.getFieldValue('END') == 'FIRST' ?
- 'indexOf' : 'lastIndexOf';
var argument0 = Blockly.PHP.valueToCode(block, 'FIND',
Blockly.PHP.ORDER_NONE) || '\'\'';
var argument1 = Blockly.PHP.valueToCode(block, 'VALUE',
Blockly.PHP.ORDER_MEMBER) || '[]';
- var functionName;
- if (block.getFieldValue('END') == 'FIRST'){
+ if (Blockly.PHP.ONE_BASED_INDEXING) {
+ var errorIndex = ' 0';
+ var indexAdjustment = ' + 1';
+ } else {
+ var errorIndex = ' -1';
+ var indexAdjustment = '';
+ }
+ if (block.getFieldValue('END') == 'FIRST') {
// indexOf
- functionName = Blockly.PHP.provideFunction_(
+ var functionName = Blockly.PHP.provideFunction_(
'indexOf',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($haystack, $needle) {',
- ' for ($index = 0; $index < count($haystack); $index++) {',
- ' if ($haystack[$index] == $needle) return $index + 1;',
- ' }',
- ' return 0;',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($haystack, $needle) {',
+ ' for ($index = 0; $index < count($haystack); $index++) {',
+ ' if ($haystack[$index] == $needle) return $index' +
+ indexAdjustment + ';',
+ ' }',
+ ' return ' + errorIndex + ';',
+ '}']);
} else {
// lastIndexOf
- functionName = Blockly.PHP.provideFunction_(
+ var functionName = Blockly.PHP.provideFunction_(
'lastIndexOf',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($haystack, $needle) {',
- ' $last = 0;',
- ' for ($index = 0; $index < count($haystack); $index++) {',
- ' if ($haystack[$index] == $needle) $last = $index + 1;',
- ' }',
- ' return $last;',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($haystack, $needle) {',
+ ' $last = ' + errorIndex + ';',
+ ' for ($index = 0; $index < count($haystack); $index++) {',
+ ' if ($haystack[$index] == $needle) $last = $index' +
+ indexAdjustment + ';',
+ ' }',
+ ' return $last;',
+ '}']);
}
var code = functionName + '(' + argument1 + ', ' + argument0 + ')';
@@ -130,97 +147,113 @@ Blockly.PHP['lists_getIndex'] = function(block) {
// Get element at index.
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.PHP.valueToCode(block, 'AT',
- Blockly.PHP.ORDER_UNARY_NEGATION) || '1';
- if (mode == 'GET') {
- var order = Blockly.PHP.ORDER_FUNCTION_CALL;
- } else {
- // List will be an argument in a function call.
- var order = Blockly.PHP.ORDER_COMMA;
- }
- var list = Blockly.PHP.valueToCode(block, 'VALUE', order) || 'array()';
-
- if (where == 'FIRST') {
- if (mode == 'GET') {
- var code = list + '[0]';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE') {
- var code = 'array_shift(' + list + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return 'array_shift(' + list + ');\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'GET') {
- var code = 'end(' + list + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE') {
- var code = 'array_pop(' + list + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return 'array_pop(' + list + ');\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'GET') {
- var code = list + '[' + at + ']';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE') {
- var code = 'array_splice(' + list + ', ' + at + ', 1)[0]';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return 'array_splice(' + list + ', ' + at + ', 1);\n';
- }
- } else if (where == 'FROM_END') {
- if (mode == 'GET') {
- var code = 'array_slice(' + list + ', -' + at + ', 1)[0]';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') {
- code = 'array_splice(' + list +
- ', count(' + list + ') - ' + at + ', 1)[0]';
- if (mode == 'GET_REMOVE') {
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'GET') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_MEMBER) || 'array()';
+ var code = list + '[0]';
+ return [code, Blockly.PHP.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ var code = 'array_shift(' + list + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
- return code + ';\n';
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ return 'array_shift(' + list + ');\n';
}
- }
- } else if (where == 'RANDOM') {
- if (mode == 'GET'){
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_get_random_item',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($list) {',
- ' return $list[rand(0,count($list)-1)];',
- '}']);
- code = functionName + '(' + list + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'GET_REMOVE'){
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_get_remove_random_item',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '(&$list) {',
- ' $x = rand(0,count($list)-1);',
- ' unset($list[$x]);',
- ' return array_values($list);',
- '}']);
- code = functionName + '(' + list + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_remove_random_item',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '(&$list) {',
- ' unset($list[rand(0,count($list)-1)]);',
- '}']);
- return functionName + '(' + list + ');\n';
- }
+ break;
+ case 'LAST':
+ if (mode == 'GET') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ var code = 'end(' + list + ')';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'GET_REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ var code = 'array_pop(' + list + ')';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ return 'array_pop(' + list + ');\n';
+ }
+ break;
+ case 'FROM_START':
+ var at = Blockly.PHP.getAdjusted(block, 'AT');
+ if (mode == 'GET') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_MEMBER) || 'array()';
+ var code = list + '[' + at + ']';
+ return [code, Blockly.PHP.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ var code = 'array_splice(' + list + ', ' + at + ', 1)[0]';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ return 'array_splice(' + list + ', ' + at + ', 1);\n';
+ }
+ break;
+ case 'FROM_END':
+ if (mode == 'GET') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true);
+ var code = 'array_slice(' + list + ', ' + at + ', 1)[0]';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') {
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ var at = Blockly.PHP.getAdjusted(block, 'AT', 1, false,
+ Blockly.PHP.ORDER_SUBTRACTION);
+ code = 'array_splice(' + list +
+ ', count(' + list + ') - ' + at + ', 1)[0]';
+ if (mode == 'GET_REMOVE') {
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ return code + ';\n';
+ }
+ }
+ break;
+ case 'RANDOM':
+ var list = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || 'array()';
+ if (mode == 'GET') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_get_random_item',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($list) {',
+ ' return $list[rand(0,count($list)-1)];',
+ '}']);
+ code = functionName + '(' + list + ')';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'GET_REMOVE') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_get_remove_random_item',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '(&$list) {',
+ ' $x = rand(0,count($list)-1);',
+ ' unset($list[$x]);',
+ ' return array_values($list);',
+ '}']);
+ code = functionName + '(' + list + ')';
+ return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_remove_random_item',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '(&$list) {',
+ ' unset($list[rand(0,count($list)-1)]);',
+ '}']);
+ return functionName + '(' + list + ');\n';
+ }
+ break;
}
throw 'Unhandled combination (lists_getIndex).';
};
@@ -228,18 +261,14 @@ Blockly.PHP['lists_getIndex'] = function(block) {
Blockly.PHP['lists_setIndex'] = function(block) {
// Set element at index.
// Note: Until February 2013 this block did not have MODE or WHERE inputs.
- var list = Blockly.PHP.valueToCode(block, 'LIST',
- Blockly.PHP.ORDER_MEMBER) || 'array()';
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.PHP.valueToCode(block, 'AT',
- Blockly.PHP.ORDER_NONE) || '1';
var value = Blockly.PHP.valueToCode(block, 'TO',
Blockly.PHP.ORDER_ASSIGNMENT) || 'null';
// Cache non-trivial values to variables to prevent repeated look-ups.
// Closure, which accesses and modifies 'list'.
function cacheList() {
- if (list.match(/^\w+$/)) {
+ if (list.match(/^\$\w+$/)) {
return '';
}
var listVar = Blockly.PHP.variableDB_.getDistinctName(
@@ -248,68 +277,83 @@ Blockly.PHP['lists_setIndex'] = function(block) {
list = listVar;
return code;
}
- if (where == 'FIRST') {
- if (mode == 'SET') {
- return list + '[0] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return 'array_unshift(' + list + ', ' + value + ');\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'SET') {
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_set_last_item',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '(&$list, $value) {',
- ' $list[count($list) - 1] = $value;',
- '}']);
- return functionName + '(' + list + ', ' + value + ');\n';
- } else if (mode == 'INSERT') {
- return 'array_push(' + list + ', ' + value + ');\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
- if (mode == 'SET') {
- return list + '[' + at + '] = ' + value + ';\n';
- } else if (mode == 'INSERT') {
- return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n';
- }
- } else if (where == 'FROM_END') {
- if (mode == 'SET') {
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_set_from_end',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '(&$list, $at, $value) {',
- ' $list[count($list) - $at] = $value;',
- '}']);
- return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
- } else if (mode == 'INSERT') {
- var functionName = Blockly.PHP.provideFunction_(
- 'lists_insert_from_end',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '(&$list, $at, $value) {',
- ' return array_splice($list, count($list) - $at, 0, $value);',
- '}']);
- return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
- }
- } else if (where == 'RANDOM') {
- var code = cacheList();
- var xVar = Blockly.PHP.variableDB_.getDistinctName(
- 'tmp_x', Blockly.Variables.NAME_TYPE);
- code += xVar + ' = rand(0, count(' + list + ')-1);\n';
- if (mode == 'SET') {
- code += list + '[' + xVar + '] = ' + value + ';\n';
- return code;
- } else if (mode == 'INSERT') {
- code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + ');\n';
- return code;
- }
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'SET') {
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_MEMBER) || 'array()';
+ return list + '[0] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ return 'array_unshift(' + list + ', ' + value + ');\n';
+ }
+ break;
+ case 'LAST':
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ if (mode == 'SET') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_set_last_item',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '(&$list, $value) {',
+ ' $list[count($list) - 1] = $value;',
+ '}']);
+ return functionName + '(' + list + ', ' + value + ');\n';
+ } else if (mode == 'INSERT') {
+ return 'array_push(' + list + ', ' + value + ');\n';
+ }
+ break;
+ case 'FROM_START':
+ var at = Blockly.PHP.getAdjusted(block, 'AT');
+ if (mode == 'SET') {
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_MEMBER) || 'array()';
+ return list + '[' + at + '] = ' + value + ';\n';
+ } else if (mode == 'INSERT') {
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n';
+ }
+ break;
+ case 'FROM_END':
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_COMMA) || 'array()';
+ var at = Blockly.PHP.getAdjusted(block, 'AT', 1);
+ if (mode == 'SET') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_set_from_end',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '(&$list, $at, $value) {',
+ ' $list[count($list) - $at] = $value;',
+ '}']);
+ return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
+ } else if (mode == 'INSERT') {
+ var functionName = Blockly.PHP.provideFunction_(
+ 'lists_insert_from_end',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '(&$list, $at, $value) {',
+ ' return array_splice($list, count($list) - $at, 0, $value);',
+ '}']);
+ return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
+ }
+ break;
+ case 'RANDOM':
+ var list = Blockly.PHP.valueToCode(block, 'LIST',
+ Blockly.PHP.ORDER_REFERENCE) || 'array()';
+ var code = cacheList();
+ var xVar = Blockly.PHP.variableDB_.getDistinctName(
+ 'tmp_x', Blockly.Variables.NAME_TYPE);
+ code += xVar + ' = rand(0, count(' + list + ')-1);\n';
+ if (mode == 'SET') {
+ code += list + '[' + xVar + '] = ' + value + ';\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value +
+ ');\n';
+ return code;
+ }
+ break;
}
throw 'Unhandled combination (lists_setIndex).';
};
@@ -317,44 +361,90 @@ Blockly.PHP['lists_setIndex'] = function(block) {
Blockly.PHP['lists_getSublist'] = function(block) {
// Get sublist.
var list = Blockly.PHP.valueToCode(block, 'LIST',
- Blockly.PHP.ORDER_MEMBER) || 'array()';
+ Blockly.PHP.ORDER_COMMA) || 'array()';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.PHP.valueToCode(block, 'AT1',
- Blockly.PHP.ORDER_NONE) || '1';
- var at2 = Blockly.PHP.valueToCode(block, 'AT2',
- Blockly.PHP.ORDER_NONE) || '1';
if (where1 == 'FIRST' && where2 == 'LAST') {
var code = list;
+ } else if (list.match(/^\$\w+$/) ||
+ (where1 != 'FROM_END' && where2 == 'FROM_START')) {
+ // If the list is a simple value or doesn't require a call for length, don't
+ // generate a helper function.
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.PHP.getAdjusted(block, 'AT1');
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.PHP.getAdjusted(block, 'AT1', 1, false,
+ Blockly.PHP.ORDER_SUBTRACTION);
+ at1 = 'count(' + list + ') - ' + at1;
+ break;
+ case 'FIRST':
+ var at1 = '0';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false,
+ Blockly.PHP.ORDER_SUBTRACTION);
+ var length = at2 + ' - ';
+ if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) {
+ length += at1;
+ } else {
+ length += '(' + at1 + ')';
+ }
+ length += ' + 1';
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false,
+ Blockly.PHP.ORDER_SUBTRACTION);
+ var length = 'count(' + list + ') - ' + at2 + ' - ';
+ if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) {
+ length += at1;
+ } else {
+ length += '(' + at1 + ')';
+ }
+ break;
+ case 'LAST':
+ var length = 'count(' + list + ') - ';
+ if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) {
+ length += at1;
+ } else {
+ length += '(' + at1 + ')';
+ }
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist).';
+ }
+ code = 'array_slice(' + list + ', ' + at1 + ', ' + length + ')';
} else {
+ var at1 = Blockly.PHP.getAdjusted(block, 'AT1');
+ var at2 = Blockly.PHP.getAdjusted(block, 'AT2');
var functionName = Blockly.PHP.provideFunction_(
'lists_get_sublist',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($list, $where1, $at1, $where2, $at2) {',
- ' if ($where2 == \'FROM_START\') {',
- ' $at2--;',
- ' } else if ($where2 == \'FROM_END\') {',
- ' $at2 = $at2 - $at1;',
- ' } else if ($where2 == \'FIRST\') {',
- ' $at2 = 0;',
- ' } else if ($where2 == \'LAST\') {',
- ' $at2 = count($list);',
- ' } else {',
- ' throw \'Unhandled option (lists_getSublist).\';',
- ' }',
- ' if ($where1 == \'FROM_START\') {',
- ' $at1--;',
- ' } else if ($where1 == \'FROM_END\') {',
- ' $at1 = count($list) - $at1;',
- ' } else if ($where1 == \'FIRST\') {',
- ' $at1 = 0;',
- ' } else if ($where1 == \'LAST\') {',
- ' $at1 = count($list) - 1;',
- ' } else {',
- ' throw \'Unhandled option (lists_getSublist).\';',
- ' }',
- ' return array_slice($list, $at1, $at2);',
- '}']);
+ ' if ($where1 == \'FROM_END\') {',
+ ' $at1 = count($list) - 1 - $at1;',
+ ' } else if ($where1 == \'FIRST\') {',
+ ' $at1 = 0;',
+ ' } else if ($where1 != \'FROM_START\'){',
+ ' throw new Exception(\'Unhandled option (lists_get_sublist).\');',
+ ' }',
+ ' $length = 0;',
+ ' if ($where2 == \'FROM_START\') {',
+ ' $length = $at2 - $at1 + 1;',
+ ' } else if ($where2 == \'FROM_END\') {',
+ ' $length = count($list) - $at1 - $at2;',
+ ' } else if ($where2 == \'LAST\') {',
+ ' $length = count($list) - $at1;',
+ ' } else {',
+ ' throw new Exception(\'Unhandled option (lists_get_sublist).\');',
+ ' }',
+ ' return array_slice($list, $at1, $length);',
+ '}']);
var code = functionName + '(' + list + ', \'' +
where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
}
@@ -364,26 +454,26 @@ Blockly.PHP['lists_getSublist'] = function(block) {
Blockly.PHP['lists_sort'] = function(block) {
// Block for sorting a list.
var listCode = Blockly.PHP.valueToCode(block, 'LIST',
- Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()';
+ Blockly.PHP.ORDER_COMMA) || 'array()';
var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;
var type = block.getFieldValue('TYPE');
var functionName = Blockly.PHP.provideFunction_(
- 'lists_sort', [
- 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($list, $type, $direction) {',
- ' $sortCmpFuncs = array(',
- ' "NUMERIC" => "strnatcasecmp",',
- ' "TEXT" => "strcmp",',
- ' "IGNORE_CASE" => "strcasecmp"',
- ' );',
- ' $sortCmp = $sortCmpFuncs[$type];',
- ' $list2 = $list;', // Clone list.
- ' usort($list2, $sortCmp);',
- ' if ($direction == -1) {',
- ' $list2 = array_reverse($list2);',
- ' }',
- ' return $list2;',
- '}']);
+ 'lists_sort',
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($list, $type, $direction) {',
+ ' $sortCmpFuncs = array(',
+ ' "NUMERIC" => "strnatcasecmp",',
+ ' "TEXT" => "strcmp",',
+ ' "IGNORE_CASE" => "strcasecmp"',
+ ' );',
+ ' $sortCmp = $sortCmpFuncs[$type];',
+ ' $list2 = $list;', // Clone list.
+ ' usort($list2, $sortCmp);',
+ ' if ($direction == -1) {',
+ ' $list2 = array_reverse($list2);',
+ ' }',
+ ' return $list2;',
+ '}']);
var sortCode = functionName +
'(' + listCode + ', "' + type + '", ' + direction + ')';
return [sortCode, Blockly.PHP.ORDER_FUNCTION_CALL];
@@ -392,9 +482,9 @@ Blockly.PHP['lists_sort'] = function(block) {
Blockly.PHP['lists_split'] = function(block) {
// Block for splitting text into a list, or joining a list into text.
var value_input = Blockly.PHP.valueToCode(block, 'INPUT',
- Blockly.PHP.ORDER_MEMBER);
+ Blockly.PHP.ORDER_COMMA);
var value_delim = Blockly.PHP.valueToCode(block, 'DELIM',
- Blockly.PHP.ORDER_NONE) || '\'\'';
+ Blockly.PHP.ORDER_COMMA) || '\'\'';
var mode = block.getFieldValue('MODE');
if (mode == 'SPLIT') {
if (!value_input) {
diff --git a/generators/php/math.js b/generators/php/math.js
index f0bb9fa79..7789ba8fe 100644
--- a/generators/php/math.js
+++ b/generators/php/math.js
@@ -47,20 +47,14 @@ Blockly.PHP['math_arithmetic'] = function(block) {
'MINUS': [' - ', Blockly.PHP.ORDER_SUBTRACTION],
'MULTIPLY': [' * ', Blockly.PHP.ORDER_MULTIPLICATION],
'DIVIDE': [' / ', Blockly.PHP.ORDER_DIVISION],
- 'POWER': [null, Blockly.PHP.ORDER_COMMA] // Handle power separately.
+ 'POWER': [' ** ', Blockly.PHP.ORDER_POWER]
};
var tuple = OPERATORS[block.getFieldValue('OP')];
var operator = tuple[0];
var order = tuple[1];
var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0';
var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0';
- var code;
- // Power in PHP requires a special case since it has no operator.
- if (!operator) {
- code = 'pow(' + argument0 + ', ' + argument1 + ')';
- return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
- }
- code = argument0 + operator + argument1;
+ var code = argument0 + operator + argument1;
return [code, order];
};
@@ -172,25 +166,25 @@ Blockly.PHP['math_number_property'] = function(block) {
// Prime is a special case as it is not a one-liner test.
var functionName = Blockly.PHP.provideFunction_(
'math_isPrime',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($n) {',
- ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
- ' if ($n == 2 || $n == 3) {',
- ' return true;',
- ' }',
- ' // False if n is NaN, negative, is 1, or not whole.',
- ' // And false if n is divisible by 2 or 3.',
- ' if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 ||' +
- ' $n % 3 == 0) {',
- ' return false;',
- ' }',
- ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
- ' for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {',
- ' if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {',
- ' return false;',
- ' }',
- ' }',
- ' return true;',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($n) {',
+ ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
+ ' if ($n == 2 || $n == 3) {',
+ ' return true;',
+ ' }',
+ ' // False if n is NaN, negative, is 1, or not whole.',
+ ' // And false if n is divisible by 2 or 3.',
+ ' if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 ||' +
+ ' $n % 3 == 0) {',
+ ' return false;',
+ ' }',
+ ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
+ ' for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {',
+ ' if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {',
+ ' return false;',
+ ' }',
+ ' }',
+ ' return true;',
+ '}']);
code = functionName + '(' + number_to_check + ')';
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
}
@@ -256,10 +250,10 @@ Blockly.PHP['math_on_list'] = function(block) {
case 'AVERAGE':
var functionName = Blockly.PHP.provideFunction_(
'math_mean',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($myList) {',
- ' return array_sum($myList) / count($myList);',
- '}']);
+ ' return array_sum($myList) / count($myList);',
+ '}']);
list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || 'array()';
code = functionName + '(' + list + ')';
@@ -267,12 +261,13 @@ Blockly.PHP['math_on_list'] = function(block) {
case 'MEDIAN':
var functionName = Blockly.PHP.provideFunction_(
'math_median',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($arr) {',
- ' sort($arr,SORT_NUMERIC);',
- ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ',
- ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;',
- '}']);
+ ' sort($arr,SORT_NUMERIC);',
+ ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ',
+ ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2)' +
+ ' - 1]) / 2;',
+ '}']);
list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || '[]';
code = functionName + '(' + list + ')';
@@ -283,13 +278,14 @@ Blockly.PHP['math_on_list'] = function(block) {
// Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].
var functionName = Blockly.PHP.provideFunction_(
'math_modes',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($values) {',
- ' $v = array_count_values($values);',
- ' arsort($v);',
- ' foreach($v as $k => $v){$total = $k; break;}',
- ' return array($total);',
- '}']);
+ ' if (empty($values)) return array();',
+ ' $counts = array_count_values($values);',
+ ' arsort($counts); // Sort counts in descending order',
+ ' $modes = array_keys($counts, current($counts), true);',
+ ' return $modes;',
+ '}']);
list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || '[]';
code = functionName + '(' + list + ')';
@@ -297,14 +293,15 @@ Blockly.PHP['math_on_list'] = function(block) {
case 'STD_DEV':
var functionName = Blockly.PHP.provideFunction_(
'math_standard_deviation',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($numbers) {',
- ' $n = count($numbers);',
- ' if (!$n) return null;',
- ' $mean = array_sum($numbers) / count($numbers);',
- ' foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);',
- ' return sqrt(array_sum($devs) / (count($devs) - 1));',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($numbers) {',
+ ' $n = count($numbers);',
+ ' if (!$n) return null;',
+ ' $mean = array_sum($numbers) / count($numbers);',
+ ' foreach($numbers as $key => $num) $devs[$key] = ' +
+ 'pow($num - $mean, 2);',
+ ' return sqrt(array_sum($devs) / (count($devs) - 1));',
+ '}']);
list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || '[]';
code = functionName + '(' + list + ')';
@@ -312,11 +309,11 @@ Blockly.PHP['math_on_list'] = function(block) {
case 'RANDOM':
var functionName = Blockly.PHP.provideFunction_(
'math_random_list',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($list) {',
- ' $x = rand(0, count($list)-1);',
- ' return $list[$x];',
- '}']);
+ ' $x = rand(0, count($list)-1);',
+ ' return $list[$x];',
+ '}']);
list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || '[]';
code = functionName + '(' + list + ')';
@@ -358,13 +355,13 @@ Blockly.PHP['math_random_int'] = function(block) {
Blockly.PHP.ORDER_COMMA) || '0';
var functionName = Blockly.PHP.provideFunction_(
'math_random_int',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($a, $b) {',
- ' if ($a > $b) {',
- ' return rand($b, $a);',
- ' }',
- ' return rand($a, $b);',
- '}']);
+ ' if ($a > $b) {',
+ ' return rand($b, $a);',
+ ' }',
+ ' return rand($a, $b);',
+ '}']);
var code = functionName + '(' + argument0 + ', ' + argument1 + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
diff --git a/generators/php/procedures.js b/generators/php/procedures.js
index 1fd4cc872..0dc56d7cb 100644
--- a/generators/php/procedures.js
+++ b/generators/php/procedures.js
@@ -63,8 +63,8 @@ Blockly.PHP['procedures_defreturn'] = function(block) {
returnValue = ' return ' + returnValue + ';\n';
}
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.PHP.variableDB_.getName(block.arguments_[x],
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.PHP.variableDB_.getName(block.arguments_[i],
Blockly.Variables.NAME_TYPE);
}
var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' +
@@ -85,8 +85,8 @@ Blockly.PHP['procedures_callreturn'] = function(block) {
var funcName = Blockly.PHP.variableDB_.getName(
block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i,
Blockly.PHP.ORDER_COMMA) || 'null';
}
var code = funcName + '(' + args.join(', ') + ')';
@@ -98,8 +98,8 @@ Blockly.PHP['procedures_callnoreturn'] = function(block) {
var funcName = Blockly.PHP.variableDB_.getName(
block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i,
Blockly.PHP.ORDER_COMMA) || 'null';
}
var code = funcName + '(' + args.join(', ') + ');\n';
diff --git a/generators/php/text.js b/generators/php/text.js
index 3960ab011..efc0f2de3 100644
--- a/generators/php/text.js
+++ b/generators/php/text.js
@@ -37,28 +37,27 @@ Blockly.PHP['text'] = function(block) {
Blockly.PHP['text_join'] = function(block) {
// Create a string made up of any number of elements of any type.
- var code;
if (block.itemCount_ == 0) {
return ['\'\'', Blockly.PHP.ORDER_ATOMIC];
} else if (block.itemCount_ == 1) {
- var argument0 = Blockly.PHP.valueToCode(block, 'ADD0',
+ var element = Blockly.PHP.valueToCode(block, 'ADD0',
Blockly.PHP.ORDER_NONE) || '\'\'';
- code = argument0;
+ var code = element;
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
} else if (block.itemCount_ == 2) {
- var argument0 = Blockly.PHP.valueToCode(block, 'ADD0',
+ var element0 = Blockly.PHP.valueToCode(block, 'ADD0',
Blockly.PHP.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.PHP.valueToCode(block, 'ADD1',
+ var element1 = Blockly.PHP.valueToCode(block, 'ADD1',
Blockly.PHP.ORDER_NONE) || '\'\'';
- code = argument0 + ' . ' + argument1;
+ var code = element0 + ' . ' + element1;
return [code, Blockly.PHP.ORDER_ADDITION];
} else {
- code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n,
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.PHP.valueToCode(block, 'ADD' + i,
Blockly.PHP.ORDER_COMMA) || '\'\'';
}
- code = 'implode(\'\', array(' + code.join(',') + '))';
+ var code = 'implode(\'\', array(' + elements.join(',') + '))';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
}
};
@@ -67,89 +66,89 @@ Blockly.PHP['text_append'] = function(block) {
// Append to a variable in place.
var varName = Blockly.PHP.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
- Blockly.PHP.ORDER_NONE) || '\'\'';
- return varName + ' .= ' + argument0 + ';\n';
+ var value = Blockly.PHP.valueToCode(block, 'TEXT',
+ Blockly.PHP.ORDER_ASSIGNMENT) || '\'\'';
+ return varName + ' .= ' + value + ';\n';
};
Blockly.PHP['text_length'] = function(block) {
// String or array length.
var functionName = Blockly.PHP.provideFunction_(
'length',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {',
- ' if (is_string($value)) {',
- ' return strlen($value);',
- ' } else {',
- ' return count($value);',
- ' }',
- '}']);
- var argument0 = Blockly.PHP.valueToCode(block, 'VALUE',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {',
+ ' if (is_string($value)) {',
+ ' return strlen($value);',
+ ' } else {',
+ ' return count($value);',
+ ' }',
+ '}']);
+ var text = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
+ return [functionName + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['text_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.PHP.valueToCode(block, 'VALUE',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
+ var text = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
+ return ['empty(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['text_indexOf'] = function(block) {
// Search the text for a substring.
var operator = block.getFieldValue('END') == 'FIRST' ?
'strpos' : 'strrpos';
- var argument0 = Blockly.PHP.valueToCode(block, 'FIND',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- var argument1 = Blockly.PHP.valueToCode(block, 'VALUE',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
-
+ var substring = Blockly.PHP.valueToCode(block, 'FIND',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
+ var text = Blockly.PHP.valueToCode(block, 'VALUE',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
+ if (Blockly.PHP.ONE_BASED_INDEXING) {
+ var errorIndex = ' 0';
+ var indexAdjustment = ' + 1';
+ } else {
+ var errorIndex = ' -1';
+ var indexAdjustment = '';
+ }
var functionName = Blockly.PHP.provideFunction_(
block.getFieldValue('END') == 'FIRST' ?
'text_indexOf' : 'text_lastIndexOf',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($text, $search) {',
- ' $pos = ' + operator + '($text, $search);',
- ' return $pos === false ? 0 : $pos + 1;',
- '}']);
- var code = functionName + '(' + argument1 + ', ' + argument0 + ')';
+ ' $pos = ' + operator + '($text, $search);',
+ ' return $pos === false ? ' + errorIndex + ' : $pos' +
+ indexAdjustment + ';',
+ '}']);
+ var code = functionName + '(' + text + ', ' + substring + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['text_charAt'] = function(block) {
// Get letter at index.
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.PHP.valueToCode(block, 'AT',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '0';
- var text = Blockly.PHP.valueToCode(block, 'VALUE',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
+ var textOrder = (where == 'RANDOM') ? Blockly.PHP.ORDER_NONE :
+ Blockly.PHP.ORDER_COMMA;
+ var text = Blockly.PHP.valueToCode(block, 'VALUE', textOrder) || '\'\'';
switch (where) {
case 'FIRST':
- var code = text + '[0]';
+ var code = 'substr(' + text + ', 0, 1)';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
case 'LAST':
- var code = 'substr(' + text + ', -1, 1)';
+ var code = 'substr(' + text + ', -1)';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
case 'FROM_START':
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseFloat(at) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at += ' - 1';
- }
+ var at = Blockly.PHP.getAdjusted(block, 'AT');
var code = 'substr(' + text + ', ' + at + ', 1)';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
case 'FROM_END':
- var code = 'substr(' + text + ', -' + at + ', 1)';
+ var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true);
+ var code = 'substr(' + text + ', ' + at + ', 1)';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
case 'RANDOM':
var functionName = Blockly.PHP.provideFunction_(
'text_random_letter',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {',
- ' return $text[rand(0, strlen($text) - 1)];',
- '}']);
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {',
+ ' return $text[rand(0, strlen($text) - 1)];',
+ '}']);
code = functionName + '(' + text + ')';
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
}
@@ -162,37 +161,34 @@ Blockly.PHP['text_getSubstring'] = function(block) {
Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.PHP.valueToCode(block, 'AT1',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '0';
- var at2 = Blockly.PHP.valueToCode(block, 'AT2',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '0';
if (where1 == 'FIRST' && where2 == 'LAST') {
var code = text;
} else {
+ var at1 = Blockly.PHP.getAdjusted(block, 'AT1');
+ var at2 = Blockly.PHP.getAdjusted(block, 'AT2');
var functionName = Blockly.PHP.provideFunction_(
'text_get_substring',
- [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'($text, $where1, $at1, $where2, $at2) {',
- ' if ($where2 == \'FROM_START\') {',
- ' $at2--;',
- ' } else if ($where2 == \'FROM_END\') {',
- ' $at2 = $at2 - $at1;',
- ' } else if ($where2 == \'FIRST\') {',
- ' $at2 = 0;',
- ' } else if ($where2 == \'LAST\') {',
- ' $at2 = strlen($text);',
- ' } else { $at2 = 0; }',
- ' if ($where1 == \'FROM_START\') {',
- ' $at1--;',
- ' } else if ($where1 == \'FROM_END\') {',
- ' $at1 = strlen($text) - $at1;',
- ' } else if ($where1 == \'FIRST\') {',
- ' $at1 = 0;',
- ' } else if ($where1 == \'LAST\') {',
- ' $at1 = strlen($text) - 1;',
- ' } else { $at1 = 0; }',
- ' return substr($text, $at1, $at2);',
- '}']);
+ ' if ($where1 == \'FROM_END\') {',
+ ' $at1 = strlen($text) - 1 - $at1;',
+ ' } else if ($where1 == \'FIRST\') {',
+ ' $at1 = 0;',
+ ' } else if ($where1 != \'FROM_START\'){',
+ ' throw new Exception(\'Unhandled option (text_get_substring).\');',
+ ' }',
+ ' $length = 0;',
+ ' if ($where2 == \'FROM_START\') {',
+ ' $length = $at2 - $at1 + 1;',
+ ' } else if ($where2 == \'FROM_END\') {',
+ ' $length = strlen($text) - $at1 - $at2;',
+ ' } else if ($where2 == \'LAST\') {',
+ ' $length = strlen($text) - $at1;',
+ ' } else {',
+ ' throw new Exception(\'Unhandled option (text_get_substring).\');',
+ ' }',
+ ' return substr($text, $at1, $length);',
+ '}']);
var code = functionName + '(' + text + ', \'' +
where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')';
}
@@ -201,19 +197,14 @@ Blockly.PHP['text_getSubstring'] = function(block) {
Blockly.PHP['text_changeCase'] = function(block) {
// Change capitalization.
- var code;
+ var text = Blockly.PHP.valueToCode(block, 'TEXT',
+ Blockly.PHP.ORDER_NONE) || '\'\'';
if (block.getFieldValue('CASE') == 'UPPERCASE') {
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- code = 'strtoupper(' + argument0 + ')';
+ var code = 'strtoupper(' + text + ')';
} else if (block.getFieldValue('CASE') == 'LOWERCASE') {
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- code = 'strtolower(' + argument0 + ')';
+ var code = 'strtolower(' + text + ')';
} else if (block.getFieldValue('CASE') == 'TITLECASE') {
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
- Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\'';
- code = 'ucwords(strtolower(' + argument0 + '))';
+ var code = 'ucwords(strtolower(' + text + '))';
}
return [code, Blockly.PHP.ORDER_FUNCTION_CALL];
};
@@ -226,16 +217,16 @@ Blockly.PHP['text_trim'] = function(block) {
'BOTH': 'trim'
};
var operator = OPERATORS[block.getFieldValue('MODE')];
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
+ var text = Blockly.PHP.valueToCode(block, 'TEXT',
Blockly.PHP.ORDER_NONE) || '\'\'';
- return [ operator + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
+ return [operator + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL];
};
Blockly.PHP['text_print'] = function(block) {
// Print statement.
- var argument0 = Blockly.PHP.valueToCode(block, 'TEXT',
+ var msg = Blockly.PHP.valueToCode(block, 'TEXT',
Blockly.PHP.ORDER_NONE) || '\'\'';
- return 'print(' + argument0 + ');\n';
+ return 'print(' + msg + ');\n';
};
Blockly.PHP['text_prompt_ext'] = function(block) {
diff --git a/generators/php/variables.js b/generators/php/variables.js
index dd68f4ead..466774b3f 100644
--- a/generators/php/variables.js
+++ b/generators/php/variables.js
@@ -43,4 +43,4 @@ Blockly.PHP['variables_set'] = function(block) {
var varName = Blockly.PHP.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
return varName + ' = ' + argument0 + ';\n';
-};
\ No newline at end of file
+};
diff --git a/generators/python.js b/generators/python.js
index 2e77c0753..679093db1 100644
--- a/generators/python.js
+++ b/generators/python.js
@@ -46,11 +46,22 @@ Blockly.Python.addReservedWords(
// import keyword
// print ','.join(keyword.kwlist)
// http://docs.python.org/reference/lexical_analysis.html#keywords
- 'and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,return,try,while,with,yield,' +
+ 'and,as,assert,break,class,continue,def,del,elif,else,except,exec,' +
+ 'finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,' +
+ 'return,try,while,with,yield,' +
//http://docs.python.org/library/constants.html
- 'True,False,None,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' +
+ 'True,False,None,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,' +
+ 'license,credits,' +
// http://docs.python.org/library/functions.html
- 'abs,divmod,input,open,staticmethod,all,enumerate,int,ord,str,any,eval,isinstance,pow,sum,basestring,execfile,issubclass,print,super,bin,file,iter,property,tuple,bool,filter,len,range,type,bytearray,float,list,raw_input,unichr,callable,format,locals,reduce,unicode,chr,frozenset,long,reload,vars,classmethod,getattr,map,repr,xrange,cmp,globals,max,reversed,zip,compile,hasattr,memoryview,round,__import__,complex,hash,min,set,apply,delattr,help,next,setattr,buffer,dict,hex,object,slice,coerce,dir,id,oct,sorted,intern');
+ 'abs,divmod,input,open,staticmethod,all,enumerate,int,ord,str,any,eval,' +
+ 'isinstance,pow,sum,basestring,execfile,issubclass,print,super,bin,file,' +
+ 'iter,property,tuple,bool,filter,len,range,type,bytearray,float,list,' +
+ 'raw_input,unichr,callable,format,locals,reduce,unicode,chr,frozenset,' +
+ 'long,reload,vars,classmethod,getattr,map,repr,xrange,cmp,globals,max,' +
+ 'reversed,zip,compile,hasattr,memoryview,round,__import__,complex,hash,' +
+ 'min,set,apply,delattr,help,next,setattr,buffer,dict,hex,object,slice,' +
+ 'coerce,dir,id,oct,sorted,intern'
+);
/**
* Order of operation ENUMs.
@@ -79,6 +90,12 @@ Blockly.Python.ORDER_CONDITIONAL = 15; // if else
Blockly.Python.ORDER_LAMBDA = 16; // lambda
Blockly.Python.ORDER_NONE = 99; // (...)
+/**
+ * Allow for switching between one and zero based indexing for lists and text,
+ * one based by default.
+ */
+Blockly.Python.ONE_BASED_INDEXING = true;
+
/**
* List of outer-inner pairings that do NOT require parentheses.
* @type {!Array.>}
@@ -213,9 +230,9 @@ Blockly.Python.scrub_ = function(block, code) {
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
- for (var x = 0; x < block.inputList.length; x++) {
- if (block.inputList[x].type == Blockly.INPUT_VALUE) {
- var childBlock = block.inputList[x].connection.targetBlock();
+ for (var i = 0; i < block.inputList.length; i++) {
+ if (block.inputList[i].type == Blockly.INPUT_VALUE) {
+ var childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
var comment = Blockly.Python.allNestedComments(childBlock);
if (comment) {
@@ -229,3 +246,45 @@ Blockly.Python.scrub_ = function(block, code) {
var nextCode = Blockly.Python.blockToCode(nextBlock);
return commentCode + code + nextCode;
};
+
+/**
+ * Gets a property and adjusts the value, taking into account indexing, and
+ * casts to an integer.
+ * @param {!Blockly.Block} block The block.
+ * @param {string} atId The property ID of the element to get.
+ * @param {number=} opt_delta Value to add.
+ * @param {boolean=} opt_negate Whether to negate the value.
+ * @return {string|number}
+ */
+Blockly.Python.getAdjustedInt = function(block, atId, opt_delta, opt_negate) {
+ var delta = opt_delta || 0;
+ if (Blockly.Python.ONE_BASED_INDEXING) {
+ delta--;
+ }
+ var defaultAtIndex = Blockly.Python.ONE_BASED_INDEXING ? '1' : '0';
+ var atOrder = delta ? Blockly.Python.ORDER_ADDITIVE :
+ Blockly.Python.ORDER_NONE;
+ var at = Blockly.Python.valueToCode(block, atId, atOrder) || defaultAtIndex;
+
+ if (Blockly.isNumber(at)) {
+ // If the index is a naked number, adjust it right now.
+ at = parseInt(at, 10) + delta;
+ if (opt_negate) {
+ at = -at;
+ }
+ } else {
+ // If the index is dynamic, adjust it in code.
+ if (delta > 0) {
+ at = 'int(' + at + ' + ' + delta + ')';
+ } else if (delta < 0) {
+ at = 'int(' + at + ' - ' + -delta + ')';
+ } else {
+ at = 'int(' + at + ')';
+ }
+ if (opt_negate) {
+ at = '-' + at;
+ }
+ }
+ return at;
+};
+
diff --git a/generators/python/colour.js b/generators/python/colour.js
index 49505ac86..68666a89b 100644
--- a/generators/python/colour.js
+++ b/generators/python/colour.js
@@ -46,11 +46,11 @@ Blockly.Python['colour_rgb'] = function(block) {
// Compose a colour from RGB components expressed as percentages.
var functionName = Blockly.Python.provideFunction_(
'colour_rgb',
- [ 'def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b):',
- ' r = round(min(100, max(0, r)) * 2.55)',
- ' g = round(min(100, max(0, g)) * 2.55)',
- ' b = round(min(100, max(0, b)) * 2.55)',
- ' return \'#%02x%02x%02x\' % (r, g, b)']);
+ ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b):',
+ ' r = round(min(100, max(0, r)) * 2.55)',
+ ' g = round(min(100, max(0, g)) * 2.55)',
+ ' b = round(min(100, max(0, b)) * 2.55)',
+ ' return \'#%02x%02x%02x\' % (r, g, b)']);
var r = Blockly.Python.valueToCode(block, 'RED',
Blockly.Python.ORDER_NONE) || 0;
var g = Blockly.Python.valueToCode(block, 'GREEN',
diff --git a/generators/python/lists.js b/generators/python/lists.js
index e43e31d5e..b831d4d2f 100644
--- a/generators/python/lists.js
+++ b/generators/python/lists.js
@@ -36,66 +36,75 @@ Blockly.Python['lists_create_empty'] = function(block) {
Blockly.Python['lists_create_with'] = function(block) {
// Create a list with any number of elements of any type.
- var code = new Array(block.itemCount_);
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Python.valueToCode(block, 'ADD' + n,
+ var elements = new Array(block.itemCount_);
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i,
Blockly.Python.ORDER_NONE) || 'None';
}
- code = '[' + code.join(', ') + ']';
+ var code = '[' + elements.join(', ') + ']';
return [code, Blockly.Python.ORDER_ATOMIC];
};
Blockly.Python['lists_repeat'] = function(block) {
// Create a list with one element repeated.
- var argument0 = Blockly.Python.valueToCode(block, 'ITEM',
+ var item = Blockly.Python.valueToCode(block, 'ITEM',
Blockly.Python.ORDER_NONE) || 'None';
- var argument1 = Blockly.Python.valueToCode(block, 'NUM',
+ var times = Blockly.Python.valueToCode(block, 'NUM',
Blockly.Python.ORDER_MULTIPLICATIVE) || '0';
- var code = '[' + argument0 + '] * ' + argument1;
+ var code = '[' + item + '] * ' + times;
return [code, Blockly.Python.ORDER_MULTIPLICATIVE];
};
Blockly.Python['lists_length'] = function(block) {
// String or array length.
- var argument0 = Blockly.Python.valueToCode(block, 'VALUE',
+ var list = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_NONE) || '[]';
- return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL];
+ return ['len(' + list + ')', Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['lists_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Python.valueToCode(block, 'VALUE',
+ var list = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_NONE) || '[]';
- var code = 'not len(' + argument0 + ')';
+ var code = 'not len(' + list + ')';
return [code, Blockly.Python.ORDER_LOGICAL_NOT];
};
Blockly.Python['lists_indexOf'] = function(block) {
// Find an item in the list.
- var argument0 = Blockly.Python.valueToCode(block, 'FIND',
+ var item = Blockly.Python.valueToCode(block, 'FIND',
Blockly.Python.ORDER_NONE) || '[]';
- var argument1 = Blockly.Python.valueToCode(block, 'VALUE',
- Blockly.Python.ORDER_MEMBER) || '\'\'';
- var code;
+ var list = Blockly.Python.valueToCode(block, 'VALUE',
+ Blockly.Python.ORDER_NONE) || '\'\'';
+ if (Blockly.Python.ONE_BASED_INDEXING) {
+ var errorIndex = ' 0';
+ var firstIndexAdjustment = ' + 1';
+ var lastIndexAdjustment = '';
+ } else {
+ var errorIndex = ' -1';
+ var firstIndexAdjustment = '';
+ var lastIndexAdjustment = ' - 1';
+ }
if (block.getFieldValue('END') == 'FIRST') {
var functionName = Blockly.Python.provideFunction_(
'first_index',
- ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):',
- ' try: theIndex = myList.index(elem) + 1',
- ' except: theIndex = 0',
- ' return theIndex']);
- code = functionName + '(' + argument1 + ', ' + argument0 + ')';
- return [code, Blockly.Python.ORDER_FUNCTION_CALL];
- } else {
- var functionName = Blockly.Python.provideFunction_(
- 'last_index',
- ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):',
- ' try: theIndex = len(myList) - myList[::-1].index(elem)',
- ' except: theIndex = 0',
- ' return theIndex']);
- code = functionName + '(' + argument1 + ', ' + argument0 + ')';
+ ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ +
+ '(my_list, elem):',
+ ' try: index = my_list.index(elem)' + firstIndexAdjustment,
+ ' except: index =' + errorIndex,
+ ' return index']);
+ var code = functionName + '(' + list + ', ' + item + ')';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
}
+ var functionName = Blockly.Python.provideFunction_(
+ 'last_index',
+ ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(my_list, elem):',
+ ' try: index = len(my_list) - my_list[::-1].index(elem)' +
+ lastIndexAdjustment,
+ ' except: index =' + errorIndex,
+ ' return index']);
+ var code = functionName + '(' + list + ', ' + item + ')';
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['lists_getIndex'] = function(block) {
@@ -103,85 +112,76 @@ Blockly.Python['lists_getIndex'] = function(block) {
// Note: Until January 2013 this block did not have MODE or WHERE inputs.
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Python.valueToCode(block, 'AT',
- Blockly.Python.ORDER_UNARY_SIGN) || '1';
- var list = Blockly.Python.valueToCode(block, 'VALUE',
- Blockly.Python.ORDER_MEMBER) || '[]';
+ var listOrder = (where == 'RANDOM') ? Blockly.Python.ORDER_NONE :
+ Blockly.Python.ORDER_MEMBER;
+ var list = Blockly.Python.valueToCode(block, 'VALUE', listOrder) || '[]';
- if (where == 'FIRST') {
- if (mode == 'GET') {
- var code = list + '[0]';
- return [code, Blockly.Python.ORDER_MEMBER];
- } else {
- var code = list + '.pop(0)';
- if (mode == 'GET_REMOVE') {
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'GET') {
+ var code = list + '[0]';
+ return [code, Blockly.Python.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.pop(0)';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
- return code + '\n';
+ return list + '.pop(0)\n';
}
- }
- } else if (where == 'LAST') {
- if (mode == 'GET') {
- var code = list + '[-1]';
- return [code, Blockly.Python.ORDER_MEMBER];
- } else {
- var code = list + '.pop()';
- if (mode == 'GET_REMOVE') {
+ break;
+ case 'LAST':
+ if (mode == 'GET') {
+ var code = list + '[-1]';
+ return [code, Blockly.Python.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.pop()';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
- return code + '\n';
+ return list + '.pop()\n';
}
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at = 'int(' + at + ' - 1)';
- }
- if (mode == 'GET') {
- var code = list + '[' + at + ']';
- return [code, Blockly.Python.ORDER_MEMBER];
- } else {
- var code = list + '.pop(' + at + ')';
- if (mode == 'GET_REMOVE') {
+ break;
+ case 'FROM_START':
+ var at = Blockly.Python.getAdjustedInt(block, 'AT');
+ if (mode == 'GET') {
+ var code = list + '[' + at + ']';
+ return [code, Blockly.Python.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.pop(' + at + ')';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
- return code + '\n';
+ return list + '.pop(' + at + ')\n';
}
- }
- } else if (where == 'FROM_END') {
- if (mode == 'GET') {
- var code = list + '[-' + at + ']';
- return [code, Blockly.Python.ORDER_MEMBER];
- } else {
- var code = list + '.pop(-' + at + ')';
- if (mode == 'GET_REMOVE') {
+ break;
+ case'FROM_END':
+ var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true);
+ if (mode == 'GET') {
+ var code = list + '[' + at + ']';
+ return [code, Blockly.Python.ORDER_MEMBER];
+ } else if (mode == 'GET_REMOVE') {
+ var code = list + '.pop(' + at + ')';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
} else if (mode == 'REMOVE') {
- return code + '\n';
+ return list + '.pop(' + at + ')\n';
}
- }
- } else if (where == 'RANDOM') {
- Blockly.Python.definitions_['import_random'] = 'import random';
- if (mode == 'GET') {
- code = 'random.choice(' + list + ')';
- return [code, Blockly.Python.ORDER_FUNCTION_CALL];
- } else {
- var functionName = Blockly.Python.provideFunction_(
- 'lists_remove_random_item',
- ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):',
- ' x = int(random.random() * len(myList))',
- ' return myList.pop(x)']);
- code = functionName + '(' + list + ')';
- if (mode == 'GET_REMOVE') {
+ break;
+ case 'RANDOM':
+ Blockly.Python.definitions_['import_random'] = 'import random';
+ if (mode == 'GET') {
+ code = 'random.choice(' + list + ')';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
- } else if (mode == 'REMOVE') {
- return code + '\n';
+ } else {
+ var functionName = Blockly.Python.provideFunction_(
+ 'lists_remove_random_item',
+ ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):',
+ ' x = int(random.random() * len(myList))',
+ ' return myList.pop(x)']);
+ code = functionName + '(' + list + ')';
+ if (mode == 'GET_REMOVE') {
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
+ } else if (mode == 'REMOVE') {
+ return code + '\n';
+ }
}
- }
+ break;
}
throw 'Unhandled combination (lists_getIndex).';
};
@@ -193,8 +193,6 @@ Blockly.Python['lists_setIndex'] = function(block) {
Blockly.Python.ORDER_MEMBER) || '[]';
var mode = block.getFieldValue('MODE') || 'GET';
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Python.valueToCode(block, 'AT',
- Blockly.Python.ORDER_NONE) || '1';
var value = Blockly.Python.valueToCode(block, 'TO',
Blockly.Python.ORDER_NONE) || 'None';
// Cache non-trivial values to variables to prevent repeated look-ups.
@@ -209,51 +207,52 @@ Blockly.Python['lists_setIndex'] = function(block) {
list = listVar;
return code;
}
- if (where == 'FIRST') {
- if (mode == 'SET') {
- return list + '[0] = ' + value + '\n';
- } else if (mode == 'INSERT') {
- return list + '.insert(0, ' + value + ')\n';
- }
- } else if (where == 'LAST') {
- if (mode == 'SET') {
- return list + '[-1] = ' + value + '\n';
- } else if (mode == 'INSERT') {
- return list + '.append(' + value + ')\n';
- }
- } else if (where == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at = 'int(' + at + ' - 1)';
- }
- if (mode == 'SET') {
- return list + '[' + at + '] = ' + value + '\n';
- } else if (mode == 'INSERT') {
- return list + '.insert(' + at + ', ' + value + ')\n';
- }
- } else if (where == 'FROM_END') {
- if (mode == 'SET') {
- return list + '[-' + at + '] = ' + value + '\n';
- } else if (mode == 'INSERT') {
- return list + '.insert(-' + at + ', ' + value + ')\n';
- }
- } else if (where == 'RANDOM') {
- Blockly.Python.definitions_['import_random'] = 'import random';
- var code = cacheList();
- var xVar = Blockly.Python.variableDB_.getDistinctName(
- 'tmp_x', Blockly.Variables.NAME_TYPE);
- code += xVar + ' = int(random.random() * len(' + list + '))\n';
- if (mode == 'SET') {
- code += list + '[' + xVar + '] = ' + value + '\n';
- return code;
- } else if (mode == 'INSERT') {
- code += list + '.insert(' + xVar + ', ' + value + ')\n';
- return code;
- }
+
+ switch (where) {
+ case 'FIRST':
+ if (mode == 'SET') {
+ return list + '[0] = ' + value + '\n';
+ } else if (mode == 'INSERT') {
+ return list + '.insert(0, ' + value + ')\n';
+ }
+ break;
+ case 'LAST':
+ if (mode == 'SET') {
+ return list + '[-1] = ' + value + '\n';
+ } else if (mode == 'INSERT') {
+ return list + '.append(' + value + ')\n';
+ }
+ break;
+ case 'FROM_START':
+ var at = Blockly.Python.getAdjustedInt(block, 'AT');
+ if (mode == 'SET') {
+ return list + '[' + at + '] = ' + value + '\n';
+ } else if (mode == 'INSERT') {
+ return list + '.insert(' + at + ', ' + value + ')\n';
+ }
+ break;
+ case 'FROM_END':
+ var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true);
+ if (mode == 'SET') {
+ return list + '[' + at + '] = ' + value + '\n';
+ } else if (mode == 'INSERT') {
+ return list + '.insert(' + at + ', ' + value + ')\n';
+ }
+ break;
+ case 'RANDOM':
+ Blockly.Python.definitions_['import_random'] = 'import random';
+ var code = cacheList();
+ var xVar = Blockly.Python.variableDB_.getDistinctName(
+ 'tmp_x', Blockly.Variables.NAME_TYPE);
+ code += xVar + ' = int(random.random() * len(' + list + '))\n';
+ if (mode == 'SET') {
+ code += list + '[' + xVar + '] = ' + value + '\n';
+ return code;
+ } else if (mode == 'INSERT') {
+ code += list + '.insert(' + xVar + ', ' + value + ')\n';
+ return code;
+ }
+ break;
}
throw 'Unhandled combination (lists_setIndex).';
};
@@ -264,49 +263,42 @@ Blockly.Python['lists_getSublist'] = function(block) {
Blockly.Python.ORDER_MEMBER) || '[]';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.Python.valueToCode(block, 'AT1',
- Blockly.Python.ORDER_ADDITIVE) || '1';
- var at2 = Blockly.Python.valueToCode(block, 'AT2',
- Blockly.Python.ORDER_ADDITIVE) || '1';
- if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) {
- at1 = '';
- } else if (where1 == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at1)) {
- // If the index is a naked number, decrement it right now.
- at1 = parseInt(at1, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at1 = 'int(' + at1 + ' - 1)';
- }
- } else if (where1 == 'FROM_END') {
- if (Blockly.isNumber(at1)) {
- at1 = -parseInt(at1, 10);
- } else {
- at1 = '-int(' + at1 + ')';
- }
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.Python.getAdjustedInt(block, 'AT1');
+ if (at1 == '0') {
+ at1 = '';
+ }
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true);
+ break;
+ case 'FIRST':
+ var at1 = '';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist)';
}
- if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) {
- at2 = '';
- } else if (where1 == 'FROM_START') {
- if (Blockly.isNumber(at2)) {
- at2 = parseInt(at2, 10);
- } else {
- at2 = 'int(' + at2 + ')';
- }
- } else if (where1 == 'FROM_END') {
- if (Blockly.isNumber(at2)) {
- // If the index is a naked number, increment it right now.
- // Add special case for -0.
- at2 = 1 - parseInt(at2, 10);
- if (at2 == 0) {
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true);
+ // Ensure that if the result calculated is 0 that sub-sequence will
+ // include all elements as expected.
+ if (!Blockly.isNumber(String(at2))) {
+ Blockly.Python.definitions_['import_sys'] = 'import sys';
+ at2 += ' or sys.maxsize';
+ } else if (at2 == '0') {
at2 = '';
}
- } else {
- // If the index is dynamic, increment it in code.
- Blockly.Python.definitions_['import_sys'] = 'import sys';
- at2 = 'int(1 - ' + at2 + ') or sys.maxsize';
- }
+ break;
+ case 'LAST':
+ var at2 = '';
+ break;
+ default:
+ throw 'Unhandled option (lists_getSublist)';
}
var code = list + '[' + at1 + ' : ' + at2 + ']';
return [code, Blockly.Python.ORDER_MEMBER];
@@ -314,30 +306,30 @@ Blockly.Python['lists_getSublist'] = function(block) {
Blockly.Python['lists_sort'] = function(block) {
// Block for sorting a list.
- var listCode = (Blockly.Python.valueToCode(block, 'LIST',
- Blockly.Python.ORDER_MEMBER) || '[]');
+ var list = (Blockly.Python.valueToCode(block, 'LIST',
+ Blockly.Python.ORDER_NONE) || '[]');
var type = block.getFieldValue('TYPE');
var reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True';
var sortFunctionName = Blockly.Python.provideFunction_('lists_sort',
['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ +
- '(listv, type, reversev):',
- ' def tryfloat(s):',
+ '(my_list, type, reverse):',
+ ' def try_float(s):',
' try:',
' return float(s)',
' except:',
' return 0',
- ' keyFuncts = {',
- ' "NUMERIC": tryfloat,',
+ ' key_funcs = {',
+ ' "NUMERIC": try_float,',
' "TEXT": str,',
' "IGNORE_CASE": lambda s: str(s).lower()',
' }',
- ' keyv = keyFuncts[type]',
- ' tmp_list = list(listv)', // Clone the list.
- ' return sorted(tmp_list, key=keyv, reverse=reversev)'
+ ' key_func = key_funcs[type]',
+ ' list_cpy = list(my_list)', // Clone the list.
+ ' return sorted(list_cpy, key=key_func, reverse=reverse)'
]);
var code = sortFunctionName +
- '(' + listCode + ', "' + type + '", ' + reverse + ')';
+ '(' + list + ', "' + type + '", ' + reverse + ')';
return [code, Blockly.Python.ORDER_FUNCTION_CALL];
};
diff --git a/generators/python/procedures.js b/generators/python/procedures.js
index daa7386aa..b90f38d5b 100644
--- a/generators/python/procedures.js
+++ b/generators/python/procedures.js
@@ -65,8 +65,8 @@ Blockly.Python['procedures_defreturn'] = function(block) {
branch = Blockly.Python.PASS;
}
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Python.variableDB_.getName(block.arguments_[x],
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Python.variableDB_.getName(block.arguments_[i],
Blockly.Variables.NAME_TYPE);
}
var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' +
@@ -87,8 +87,8 @@ Blockly.Python['procedures_callreturn'] = function(block) {
var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'),
Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Python.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Python.valueToCode(block, 'ARG' + i,
Blockly.Python.ORDER_NONE) || 'None';
}
var code = funcName + '(' + args.join(', ') + ')';
@@ -100,8 +100,8 @@ Blockly.Python['procedures_callnoreturn'] = function(block) {
var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'),
Blockly.Procedures.NAME_TYPE);
var args = [];
- for (var x = 0; x < block.arguments_.length; x++) {
- args[x] = Blockly.Python.valueToCode(block, 'ARG' + x,
+ for (var i = 0; i < block.arguments_.length; i++) {
+ args[i] = Blockly.Python.valueToCode(block, 'ARG' + i,
Blockly.Python.ORDER_NONE) || 'None';
}
var code = funcName + '(' + args.join(', ') + ')\n';
diff --git a/generators/python/text.js b/generators/python/text.js
index 3ae0ffc8e..84e19872a 100644
--- a/generators/python/text.js
+++ b/generators/python/text.js
@@ -38,32 +38,35 @@ Blockly.Python['text'] = function(block) {
Blockly.Python['text_join'] = function(block) {
// Create a string made up of any number of elements of any type.
//Should we allow joining by '-' or ',' or any other characters?
- var code;
- if (block.itemCount_ == 0) {
- return ['\'\'', Blockly.Python.ORDER_ATOMIC];
- } else if (block.itemCount_ == 1) {
- var argument0 = Blockly.Python.valueToCode(block, 'ADD0',
- Blockly.Python.ORDER_NONE) || '\'\'';
- code = 'str(' + argument0 + ')';
- return [code, Blockly.Python.ORDER_FUNCTION_CALL];
- } else if (block.itemCount_ == 2) {
- var argument0 = Blockly.Python.valueToCode(block, 'ADD0',
- Blockly.Python.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Python.valueToCode(block, 'ADD1',
- Blockly.Python.ORDER_NONE) || '\'\'';
- var code = 'str(' + argument0 + ') + str(' + argument1 + ')';
- return [code, Blockly.Python.ORDER_UNARY_SIGN];
- } else {
- var code = [];
- for (var n = 0; n < block.itemCount_; n++) {
- code[n] = Blockly.Python.valueToCode(block, 'ADD' + n,
- Blockly.Python.ORDER_NONE) || '\'\'';
- }
- var tempVar = Blockly.Python.variableDB_.getDistinctName('temp_value',
- Blockly.Variables.NAME_TYPE);
- code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' +
- code.join(', ') + ']])';
- return [code, Blockly.Python.ORDER_FUNCTION_CALL];
+ switch (block.itemCount_) {
+ case 0:
+ return ['\'\'', Blockly.Python.ORDER_ATOMIC];
+ break;
+ case 1:
+ var element = Blockly.Python.valueToCode(block, 'ADD0',
+ Blockly.Python.ORDER_NONE) || '\'\'';
+ var code = 'str(' + element + ')';
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
+ break;
+ case 2:
+ var element0 = Blockly.Python.valueToCode(block, 'ADD0',
+ Blockly.Python.ORDER_NONE) || '\'\'';
+ var element1 = Blockly.Python.valueToCode(block, 'ADD1',
+ Blockly.Python.ORDER_NONE) || '\'\'';
+ var code = 'str(' + element0 + ') + str(' + element1 + ')';
+ return [code, Blockly.Python.ORDER_ADDITIVE];
+ break;
+ default:
+ var elements = [];
+ for (var i = 0; i < block.itemCount_; i++) {
+ elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i,
+ Blockly.Python.ORDER_NONE) || '\'\'';
+ }
+ var tempVar = Blockly.Python.variableDB_.getDistinctName('x',
+ Blockly.Variables.NAME_TYPE);
+ var code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' +
+ elements.join(', ') + ']])';
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
}
};
@@ -71,23 +74,23 @@ Blockly.Python['text_append'] = function(block) {
// Append to a variable in place.
var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'),
Blockly.Variables.NAME_TYPE);
- var argument0 = Blockly.Python.valueToCode(block, 'TEXT',
+ var value = Blockly.Python.valueToCode(block, 'TEXT',
Blockly.Python.ORDER_NONE) || '\'\'';
- return varName + ' = str(' + varName + ') + str(' + argument0 + ')\n';
+ return varName + ' = str(' + varName + ') + str(' + value + ')\n';
};
Blockly.Python['text_length'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Python.valueToCode(block, 'VALUE',
+ var text = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_NONE) || '\'\'';
- return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL];
+ return ['len(' + text + ')', Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['text_isEmpty'] = function(block) {
// Is the string null or array empty?
- var argument0 = Blockly.Python.valueToCode(block, 'VALUE',
+ var text = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_NONE) || '\'\'';
- var code = 'not len(' + argument0 + ')';
+ var code = 'not len(' + text + ')';
return [code, Blockly.Python.ORDER_LOGICAL_NOT];
};
@@ -95,20 +98,21 @@ Blockly.Python['text_indexOf'] = function(block) {
// Search the text for a substring.
// Should we allow for non-case sensitive???
var operator = block.getFieldValue('END') == 'FIRST' ? 'find' : 'rfind';
- var argument0 = Blockly.Python.valueToCode(block, 'FIND',
+ var substring = Blockly.Python.valueToCode(block, 'FIND',
Blockly.Python.ORDER_NONE) || '\'\'';
- var argument1 = Blockly.Python.valueToCode(block, 'VALUE',
+ var text = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_MEMBER) || '\'\'';
- var code = argument1 + '.' + operator + '(' + argument0 + ') + 1';
- return [code, Blockly.Python.ORDER_ADDITIVE];
+ var code = text + '.' + operator + '(' + substring + ')';
+ if (Blockly.Python.ONE_BASED_INDEXING) {
+ return [code + ' + 1', Blockly.Python.ORDER_ADDITIVE];
+ }
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['text_charAt'] = function(block) {
// Get letter at index.
// Note: Until January 2013 this block did not have the WHERE input.
var where = block.getFieldValue('WHERE') || 'FROM_START';
- var at = Blockly.Python.valueToCode(block, 'AT',
- Blockly.Python.ORDER_UNARY_SIGN) || '1';
var text = Blockly.Python.valueToCode(block, 'VALUE',
Blockly.Python.ORDER_MEMBER) || '\'\'';
switch (where) {
@@ -119,18 +123,12 @@ Blockly.Python['text_charAt'] = function(block) {
var code = text + '[-1]';
return [code, Blockly.Python.ORDER_MEMBER];
case 'FROM_START':
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at)) {
- // If the index is a naked number, decrement it right now.
- at = parseInt(at, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at = 'int(' + at + ' - 1)';
- }
+ var at = Blockly.Python.getAdjustedInt(block, 'AT');
var code = text + '[' + at + ']';
return [code, Blockly.Python.ORDER_MEMBER];
case 'FROM_END':
- var code = text + '[-' + at + ']';
+ var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true);
+ var code = text + '[' + at + ']';
return [code, Blockly.Python.ORDER_MEMBER];
case 'RANDOM':
Blockly.Python.definitions_['import_random'] = 'import random';
@@ -147,53 +145,46 @@ Blockly.Python['text_charAt'] = function(block) {
Blockly.Python['text_getSubstring'] = function(block) {
// Get substring.
- var text = Blockly.Python.valueToCode(block, 'STRING',
- Blockly.Python.ORDER_MEMBER) || '\'\'';
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
- var at1 = Blockly.Python.valueToCode(block, 'AT1',
- Blockly.Python.ORDER_ADDITIVE) || '1';
- var at2 = Blockly.Python.valueToCode(block, 'AT2',
- Blockly.Python.ORDER_ADDITIVE) || '1';
- if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) {
- at1 = '';
- } else if (where1 == 'FROM_START') {
- // Blockly uses one-based indicies.
- if (Blockly.isNumber(at1)) {
- // If the index is a naked number, decrement it right now.
- at1 = parseInt(at1, 10) - 1;
- } else {
- // If the index is dynamic, decrement it in code.
- at1 = 'int(' + at1 + ' - 1)';
- }
- } else if (where1 == 'FROM_END') {
- if (Blockly.isNumber(at1)) {
- at1 = -parseInt(at1, 10);
- } else {
- at1 = '-int(' + at1 + ')';
- }
+ var text = Blockly.Python.valueToCode(block, 'STRING',
+ Blockly.Python.ORDER_MEMBER) || '\'\'';
+ switch (where1) {
+ case 'FROM_START':
+ var at1 = Blockly.Python.getAdjustedInt(block, 'AT1');
+ if (at1 == '0') {
+ at1 = '';
+ }
+ break;
+ case 'FROM_END':
+ var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true);
+ break;
+ case 'FIRST':
+ var at1 = '';
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring)';
}
- if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) {
- at2 = '';
- } else if (where1 == 'FROM_START') {
- if (Blockly.isNumber(at2)) {
- at2 = parseInt(at2, 10);
- } else {
- at2 = 'int(' + at2 + ')';
- }
- } else if (where1 == 'FROM_END') {
- if (Blockly.isNumber(at2)) {
- // If the index is a naked number, increment it right now.
- at2 = 1 - parseInt(at2, 10);
- if (at2 == 0) {
+ switch (where2) {
+ case 'FROM_START':
+ var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1);
+ break;
+ case 'FROM_END':
+ var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true);
+ // Ensure that if the result calculated is 0 that sub-sequence will
+ // include all elements as expected.
+ if (!Blockly.isNumber(String(at2))) {
+ Blockly.Python.definitions_['import_sys'] = 'import sys';
+ at2 += ' or sys.maxsize';
+ } else if (at2 == '0') {
at2 = '';
}
- } else {
- // If the index is dynamic, increment it in code.
- // Add special case for -0.
- Blockly.Python.definitions_['import_sys'] = 'import sys';
- at2 = 'int(1 - ' + at2 + ') or sys.maxsize';
- }
+ break;
+ case 'LAST':
+ var at2 = '';
+ break;
+ default:
+ throw 'Unhandled option (text_getSubstring)';
}
var code = text + '[' + at1 + ' : ' + at2 + ']';
return [code, Blockly.Python.ORDER_MEMBER];
@@ -207,10 +198,10 @@ Blockly.Python['text_changeCase'] = function(block) {
'TITLECASE': '.title()'
};
var operator = OPERATORS[block.getFieldValue('CASE')];
- var argument0 = Blockly.Python.valueToCode(block, 'TEXT',
+ var text = Blockly.Python.valueToCode(block, 'TEXT',
Blockly.Python.ORDER_MEMBER) || '\'\'';
- var code = argument0 + operator;
- return [code, Blockly.Python.ORDER_MEMBER];
+ var code = text + operator;
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['text_trim'] = function(block) {
@@ -221,17 +212,17 @@ Blockly.Python['text_trim'] = function(block) {
'BOTH': '.strip()'
};
var operator = OPERATORS[block.getFieldValue('MODE')];
- var argument0 = Blockly.Python.valueToCode(block, 'TEXT',
+ var text = Blockly.Python.valueToCode(block, 'TEXT',
Blockly.Python.ORDER_MEMBER) || '\'\'';
- var code = argument0 + operator;
- return [code, Blockly.Python.ORDER_MEMBER];
+ var code = text + operator;
+ return [code, Blockly.Python.ORDER_FUNCTION_CALL];
};
Blockly.Python['text_print'] = function(block) {
// Print statement.
- var argument0 = Blockly.Python.valueToCode(block, 'TEXT',
+ var msg = Blockly.Python.valueToCode(block, 'TEXT',
Blockly.Python.ORDER_NONE) || '\'\'';
- return 'print(' + argument0 + ')\n';
+ return 'print(' + msg + ')\n';
};
Blockly.Python['text_prompt_ext'] = function(block) {
diff --git a/tests/generators/colour.xml b/tests/generators/colour.xml
index 78ac58516..bae853d4d 100644
--- a/tests/generators/colour.xml
+++ b/tests/generators/colour.xml
@@ -3,7 +3,11 @@
test colour picker
- static colour
+
+
+ static colour
+
+
#ff6600
@@ -21,7 +25,11 @@
test rgb
- from rgb
+
+
+ from rgb
+
+
@@ -88,7 +96,11 @@
- test name
+
+
+ test name
+
+
@@ -105,7 +117,11 @@
- test name
+
+
+ test name
+
+
@@ -137,7 +153,11 @@
- test name
+
+
+ test name
+
+
TRUE
@@ -192,7 +212,11 @@
test blend
- blend
+
+
+ blend
+
+
diff --git a/tests/generators/functions.xml b/tests/generators/functions.xml
index ce450b11a..b189ed355 100644
--- a/tests/generators/functions.xml
+++ b/tests/generators/functions.xml
@@ -8,7 +8,11 @@
- test recurse
+
+
+ test recurse
+
+
@@ -53,7 +57,11 @@
- procedure with global
+
+
+ procedure with global
+
+
proc z
@@ -84,7 +92,11 @@
- procedure no return
+
+
+ procedure no return
+
+
TRUE
@@ -111,7 +123,11 @@
- procedure return
+
+
+ procedure return
+
+
FALSE
@@ -192,7 +208,11 @@
test function
- function with arguments
+
+
+ function with arguments
+
+
@@ -218,7 +238,11 @@
- function with side effect
+
+
+ function with side effect
+
+
func z
@@ -247,7 +271,11 @@
- function with global
+
+
+ function with global
+
+
@@ -267,7 +295,11 @@
- function with scope
+
+
+ function with scope
+
+
func a
@@ -280,7 +312,11 @@
- function return
+
+
+ function return
+
+
TRUE
@@ -296,7 +332,11 @@
- function no return
+
+
+ function no return
+
+
FALSE
diff --git a/tests/generators/index.html b/tests/generators/index.html
index 5ae75e553..a5003ca51 100644
--- a/tests/generators/index.html
+++ b/tests/generators/index.html
@@ -153,17 +153,23 @@ function toXml() {
}
function toJavaScript() {
+ var oneBasedIndexing = document.getElementById('indexing').checked;
+ Blockly.JavaScript.ONE_BASED_INDEXING = oneBasedIndexing;
var code = '\'use strict\';\n\n'
code += Blockly.JavaScript.workspaceToCode(workspace);
setOutput(code);
}
function toPython() {
+ var oneBasedIndexing = document.getElementById('indexing').checked;
+ Blockly.Python.ONE_BASED_INDEXING = oneBasedIndexing;
var code = Blockly.Python.workspaceToCode(workspace);
setOutput(code);
}
function toPhp() {
+ var oneBasedIndexing = document.getElementById('indexing').checked;
+ Blockly.PHP.ONE_BASED_INDEXING = oneBasedIndexing;
var code = Blockly.PHP.workspaceToCode(workspace);
setOutput(code);
}
@@ -174,6 +180,8 @@ function toLua() {
}
function toDart() {
+ var oneBasedIndexing = document.getElementById('indexing').checked;
+ Blockly.Dart.ONE_BASED_INDEXING = oneBasedIndexing;
var code = Blockly.Dart.workspaceToCode(workspace);
setOutput(code);
}
@@ -212,9 +220,22 @@ h1 {
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -305,6 +326,10 @@ h1 {
+
+ Generate with one-based indexing
+
+
Generate:
diff --git a/tests/generators/lists.xml b/tests/generators/lists.xml
index d803a14ad..88e4946b5 100644
--- a/tests/generators/lists.xml
+++ b/tests/generators/lists.xml
@@ -1,934 +1,65 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- test create
- Describe this function...
-
-
- test create empty
-
-
-
-
-
-
-
-
-
-
- test create items
-
-
-
-
-
- TRUE
-
-
-
-
- love
-
-
-
-
-
-
-
-
-
- TRUE
-
-
-
-
- love
-
-
-
-
-
-
- test create repeated
-
-
-
-
- Eject
-
-
-
-
- 3
-
-
-
-
-
-
-
-
-
- Eject
-
-
-
-
- Eject
-
-
-
-
- Eject
-
-
-
-
-
-
-
-
-
-
-
-
- test empty
- Describe this function...
-
-
- not empty
- FALSE
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
- empty
- TRUE
-
-
-
-
-
-
-
-
-
-
-
-
-
- test length
- Describe this function...
-
-
- zero length
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
- one length
-
-
-
-
-
-
-
- cat
-
-
-
-
-
-
-
-
- 1
-
-
-
-
- three length
-
-
-
-
-
-
-
- cat
-
-
-
-
- TRUE
-
-
-
-
-
-
-
-
-
-
-
- 3
-
-
-
-
-
-
-
-
-
-
- test find
- Describe this function...
-
-
- find first
-
-
- FIRST
-
-
-
-
-
- Alice
-
-
-
-
- Eve
-
-
-
-
- Bob
-
-
-
-
- Eve
-
-
-
-
-
-
- Eve
-
-
-
-
-
-
- 2
-
-
-
-
- find last
-
-
- LAST
-
-
-
-
-
- Alice
-
-
-
-
- Eve
-
-
-
-
- Bob
-
-
-
-
- Eve
-
-
-
-
-
-
- Eve
-
-
-
-
-
-
- 4
-
-
-
-
- find none
-
-
- FIRST
-
-
-
-
-
- Alice
-
-
-
-
- Bob
-
-
-
-
- Carol
-
-
-
-
- Dave
-
-
-
-
-
-
- Eve
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
- test get
- Describe this function...
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- get first
-
-
-
- GET
- FIRST
-
-
- list
-
-
-
-
-
-
- Kirk
-
-
-
-
- get last
-
-
-
- GET
- LAST
-
-
- list
-
-
-
-
-
-
- McCoy
-
-
-
-
- get random
- TRUE
-
-
-
- POSITIVE
-
-
- FIRST
-
-
- list
-
-
-
-
-
- GET
- RANDOM
-
-
- list
-
-
-
-
-
-
-
-
-
-
- get #
-
-
-
- GET
- FROM_START
-
-
- list
-
-
-
-
- 2
-
-
-
-
-
-
- Spock
-
-
-
-
- get #-end
-
-
-
- GET
- FROM_END
-
-
- list
-
-
-
-
- 3
-
-
-
-
-
-
- Kirk
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- test get remove
- Describe this function...
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- getremove first
-
-
-
- GET_REMOVE
- FIRST
-
-
- list
-
-
-
-
-
-
- Kirk
-
-
-
-
- getremove first list
-
-
- list
-
-
-
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- getremove last
-
-
-
- GET_REMOVE
- LAST
-
-
- list
-
-
-
-
-
-
- McCoy
-
-
-
-
- getremove last list
-
-
- list
-
-
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- getremove random
- TRUE
-
-
- EQ
-
-
- FIRST
-
-
- list
-
-
-
-
-
- GET_REMOVE
- RANDOM
-
-
- list
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
- getremove random list
-
-
-
-
- list
-
-
-
-
-
-
- 2
-
-
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- getremove #
-
-
-
- GET_REMOVE
- FROM_START
-
-
- list
-
-
-
-
- 2
-
-
-
-
-
-
- Spock
-
-
-
-
- getremove # list
-
-
- list
-
-
-
-
-
-
-
- Kirk
-
-
-
-
- McCoy
-
-
-
-
-
-
- list
-
-
-
-
-
- Kirk
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
-
-
-
-
- getremove #-end
-
-
-
- GET_REMOVE
- FROM_END
-
-
- list
-
-
-
-
- 3
-
-
-
-
-
-
- Kirk
-
-
+
-
- getremove #-end list
-
-
- list
-
-
-
-
-
-
-
- Spock
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- McCoy
-
-
+
-
+
@@ -960,14 +91,2926 @@
-
- test remove
- Describe this function...
+
+
+
+
+ check number of calls
+ Checks that the number of calls is one in order to confirm that a function was only called once.
+
+
+ test name
+
+
+ number of calls
+
+
+
+
+
+
+ test name
+
+
+
+
+ number of calls
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ test create
+ Tests the "create list with" and "create empty list" blocks.
+
+
+
+
+ create empty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ create items
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+ love
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+ love
+
+
+
+
+
+
+
+
+ create repeated
+
+
+
+
+
+
+ Eject
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ Eject
+
+
+
+
+ Eject
+
+
+
+
+ Eject
+
+
+
+
+
+
+
+
+ create repeated order
+
+
+
+
+
+
+ Eject
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Eject
+
+
+
+
+ Eject
+
+
+
+
+ Eject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get empty list
+ Creates an empty list for use with the empty test.
+
+
+
+
+
+ test empty
+ Tests the "is empty" block.
+
+
+ FALSE
+
+
+ not empty
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ TRUE
+
+
+ empty
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+ empty complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+ empty order
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test length
+ Tests the "length" block.
+
+
+
+
+ zero length
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ one length
+
+
+
+
+
+
+
+
+
+ cat
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+ three length
+
+
+
+
+
+
+
+
+
+ cat
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ two length order
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+ cat
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ test find simple
+ Tests the "find" block with a variable.
+
+
+ list
+
+
+
+
+
+ Alice
+
+
+
+
+ Eve
+
+
+
+
+ Bob
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ find first simple
+
+
+
+
+ FIRST
+
+
+ list
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ find last simple
+
+
+
+
+ LAST
+
+
+ list
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ find none simple
+
+
+
+
+ FIRST
+
+
+ list
+
+
+
+
+ Dave
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get names
+ Creates a list for use with the find test.
+
+
+ number of calls
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ Alice
+
+
+
+
+ Eve
+
+
+
+
+ Bob
+
+
+
+
+ Eve
+
+
+
+
+
+
+ test find complex
+ Tests the "find" block with a function call.
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find first complex
+
+
+
+
+ FIRST
+
+
+
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ find first complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find first order complex
+
+
+
+
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ find first order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find last complex
+
+
+
+
+ LAST
+
+
+
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ find last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find last order complex
+
+
+
+
+ LAST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Eve
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ find last order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find none complex
+
+
+
+
+ FIRST
+
+
+
+
+
+
+
+ Dave
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+ find none complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find none order complex
+
+
+
+
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dave
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+ find none order complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test get simple
+ Tests the "get" block with a variable.
list
-
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ get first simple
+
+
+
+
+
+ GET
+ FIRST
+
+
+ list
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ get last simple
+
+
+
+
+
+ GET
+ LAST
+
+
+ list
+
+
+
+
+
+
+ McCoy
+
+
+
+
+ TRUE
+
+
+ get random simple
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ list
+
+
+
+
+
+ GET
+ RANDOM
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+ get # simple
+
+
+
+
+
+ GET
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+ get # order simple
+
+
+
+
+
+ GET
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+ get #-end simple
+
+
+
+
+
+ GET
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ get #-end order simple
+
+
+
+
+
+ GET
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+ list
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get star wars
+ Creates a list for use with the get test.
+
+
+ number of calls
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ test get complex
+ Tests the "get" block with a function call.
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get first complex
+
+
+
+
+
+ GET
+ FIRST
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+
+
+
+ get first complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get first order complex
+
+
+
+
+
+ GET
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+
+
+
+ get first order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get last complex
+
+
+
+
+
+ GET
+ LAST
+
+
+
+
+
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+
+ get last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get last order complex
+
+
+
+
+
+ GET
+ LAST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+
+ get last order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+ TRUE
+
+
+ get random complex
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ list
+
+
+
+
+
+ GET
+ RANDOM
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get random complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+ TRUE
+
+
+ get random order complex
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ list
+
+
+
+
+
+ GET
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get random order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get # complex
+
+
+
+
+
+ GET
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+
+
+
+ get # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get # order complex
+
+
+
+
+
+ GET
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+
+
+
+ get # order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get #-end complex
+
+
+
+
+
+ GET
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+
+
+
+ get #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get #-end order complex
+
+
+
+
+
+ GET
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+
+
+
+ get #-end order complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test getRemove
+ Tests the "get and remove" block.
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove first
+
+
+
+
+
+ GET_REMOVE
+ FIRST
+
+
+ list
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ getremove first list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove first order
+
+
+
+
+
+ GET_REMOVE
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ getremove first order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove last
+
+
+
+
+
+ GET_REMOVE
+ LAST
+
+
+ list
+
+
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ getremove last list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove last order
+
+
+
+
+
+ GET_REMOVE
+ LAST
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ getremove last order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ TRUE
+
+
+ getremove random
+
+
+
+
+ EQ
+
+
+ FIRST
+
+
+ list
+
+
+
+
+
+ GET_REMOVE
+ RANDOM
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+ getremove random list
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ TRUE
+
+
+ getremove random order
+
+
+
+
+ EQ
+
+
+ FIRST
+
+
+ list
+
+
+
+
+
+ GET_REMOVE
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+ getremove random order list
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove #
+
+
+
+
+
+ GET_REMOVE
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+ getremove # list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove # order
+
+
+
+
+
+ GET_REMOVE
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+
+
+ getremove # order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove #-end
+
+
+
+
+
+ GET_REMOVE
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ getremove #-end list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+ getremove #-end order
+
+
+
+
+
+ GET_REMOVE
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+
+
+ getremove #-end order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test remove
+ Tests the "remove" block.
+
+
+ list
+
+
@@ -998,14 +3041,18 @@
- remove first list
+
+
+ remove first list
+
+
list
-
+
@@ -1023,7 +3070,7 @@
list
-
+
@@ -1046,31 +3093,47 @@
REMOVE
- LAST
+ FIRST
-
- list
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
- remove last list
+
+
+ remove first order list
+
+
list
-
+
- Kirk
+ Spock
- Spock
+ McCoy
@@ -1079,7 +3142,7 @@
list
-
+
@@ -1102,7 +3165,7 @@
REMOVE
- RANDOM
+ LAST
list
@@ -1110,26 +3173,36 @@
- remove random list
+
+
+ remove last list
+
+
-
-
-
- list
-
-
+
+ list
-
- 2
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
list
-
+
@@ -1150,29 +3223,40 @@
-
+
REMOVE
- FROM_START
+ LAST
-
- list
-
-
-
-
- 2
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
- remove # list
+
+
+ remove last order list
+
+
list
-
+
@@ -1181,7 +3265,7 @@
- McCoy
+ Spock
@@ -1190,7 +3274,7 @@
list
-
+
@@ -1211,42 +3295,454 @@
-
+
REMOVE
- FROM_END
+ RANDOM
list
-
-
- 3
-
-
- remove #-end list
+
+
+ remove random list
+
+
-
- list
+
+
+
+ list
+
+
-
-
-
-
- Spock
-
-
-
-
- McCoy
-
-
+
+ 2
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+ REMOVE
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ remove random order list
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+ REMOVE
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ remove # list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+ REMOVE
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ remove # order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Kirk
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+ REMOVE
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ remove #-end list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Kirk
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+ REMOVE
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ remove #-end order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Spock
+
+
+
+
+ McCoy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1278,14 +3774,14 @@
-
+
test set
- Describe this function...
+ Tests the "set" block.
- x
+ list
-
+
@@ -1311,7 +3807,7 @@
FIRST
- x
+ list
@@ -1321,14 +3817,18 @@
- set first list
+
+
+ set first list
+
+
- x
+ list
-
+
@@ -1349,9 +3849,9 @@
- x
+ list
-
+
@@ -1374,31 +3874,47 @@
SET
- LAST
+ FIRST
-
- x
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
- Beverly
+ Jean-Luc
- set last list
+
+
+ set first order list
+
+
- x
+ list
-
+
- Picard
+ Jean-Luc
@@ -1408,16 +3924,16 @@
- Beverly
+ Crusher
- x
+ list
-
+
@@ -1440,39 +3956,54 @@
SET
- RANDOM
+ LAST
- x
+ list
- Data
+ Beverly
- set random list
+
+
+ set last list
+
+
-
-
-
- x
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Beverly
-
-
- 3
-
-
- x
+ list
-
+
@@ -1493,34 +4024,45 @@
-
+
SET
- FROM_START
+ LAST
-
- x
-
-
-
-
- 3
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
- Pulaski
+ Beverly
- set # list
+
+
+ set last order list
+
+
- x
+ list
-
+
@@ -1534,16 +4076,16 @@
- Pulaski
+ Beverly
- x
+ list
-
+
@@ -1564,52 +4106,504 @@
-
+
SET
- FROM_END
+ RANDOM
- x
-
-
-
-
- 1
+ list
- Pulaski
+ Data
- set #-end list
+
+
+ set random list
+
+
-
- x
+
+
+
+ list
+
+
-
-
-
-
- Picard
-
-
-
-
- Riker
-
-
-
-
- Pulaski
-
-
+
+ 3
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ SET
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ set random order list
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ 3
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ SET
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ set # list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ SET
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ set # order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ SET
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ set #-end list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ SET
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ Pulaski
+
+
+
+
+
+
+ set #-end order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Pulaski
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1641,14 +4635,14 @@
-
+
test insert
- Describe this function...
+ Tests the "insert" block.
- x
+ list
-
+
@@ -1674,7 +4668,7 @@
FIRST
- x
+ list
@@ -1684,14 +4678,18 @@
- insert first list
+
+
+ insert first list
+
+
- x
+ list
-
+
@@ -1717,9 +4715,9 @@
- x
+ list
-
+
@@ -1742,10 +4740,22 @@
INSERT
- LAST
+ FIRST
-
- x
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
@@ -1755,42 +4765,46 @@
- insert last list
+
+
+ insert first order list
+
+
- x
+ list
-
+
- Picard
+ Data
- Riker
+ Picard
- Crusher
+ Riker
- Data
+ Crusher
- x
+ list
-
+
@@ -1813,10 +4827,10 @@
INSERT
- RANDOM
+ LAST
- x
+ list
@@ -1826,26 +4840,46 @@
- insert random list
+
+
+ insert last list
+
+
-
-
-
- x
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+ Data
-
-
- 4
-
-
- x
+ list
-
+
@@ -1866,17 +4900,24 @@
-
+
INSERT
- FROM_START
+ LAST
-
- x
-
-
-
-
- 3
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
@@ -1886,14 +4927,18 @@
- insert # list
+
+
+ insert last order list
+
+
- x
+ list
-
+
@@ -1907,21 +4952,21 @@
- Data
+ Crusher
- Crusher
+ Data
- x
+ list
-
+
@@ -1942,17 +4987,12 @@
-
+
INSERT
- FROM_END
+ RANDOM
- x
-
-
-
-
- 1
+ list
@@ -1962,37 +5002,509 @@
- insert #-end list
+
+
+ insert random list
+
+
-
- x
+
+
+
+ list
+
+
-
-
-
-
- Picard
-
-
-
-
- Riker
-
-
-
-
- Data
-
-
-
-
- Crusher
-
-
+
+ 4
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ INSERT
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ insert random order list
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ 4
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ INSERT
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ insert # list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Data
+
+
+
+
+ Crusher
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ INSERT
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ insert # order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Data
+
+
+
+
+ Crusher
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ INSERT
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ insert #-end list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Data
+
+
+
+
+ Crusher
+
+
+
+
+
+
+ list
+
+
+
+
+
+ Picard
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+ INSERT
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+ insert #-end order list
+
+
+
+
+ list
+
+
+
+
+
+
+
+ Picard
+
+
+
+
+ Data
+
+
+
+
+ Riker
+
+
+
+
+ Crusher
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2024,14 +5536,14 @@
-
- test sublist
- Describe this function...
+
+ test sublist simple
+ Tests the "get sub-list" block with a variable.
list
-
+
@@ -2062,7 +5574,11 @@
- sublist # start
+
+
+ sublist # simple
+
+
@@ -2074,19 +5590,27 @@
-
- 2
+
+
+
+ 1
+
+
-
- 3
+
+
+
+ 2
+
+
-
+
@@ -2102,64 +5626,782 @@
- sublist # end
+
+
+ sublist # simple order
+
+
- FROM_END
- FROM_END
+ FROM_START
+ FROM_START
list
-
- 3
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
-
- 2
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
-
+
- Discovery
+ Challenger
- Atlantis
+ Discovery
- sublist first-last
+
+
+ sublist #-end simple
+
+
-
- FIRST
- LAST
+
+ FROM_END
+ FROM_END
list
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
-
- list
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+ sublist #-end simple order
+
+
+
+
+
+ FROM_END
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+ list
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+ sublist first-last simple
+
+
+
+
+
+ FIRST
+ LAST
+
+
+ list
+
+
+
+
+
+
+ list
+
+
+
+
+ changing list
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+ list copy
+
+
+
+ FIRST
+ LAST
+
+
+ changing list
+
+
+
+
+
+
+
+ REMOVE
+ RANDOM
+
+
+ changing list
+
+
+
+
+
+
+ sublist first-last simple copy check
+
+
+
+
+ list copy
+
+
+
+
+ list
+
+
+
+
+
+
+ sublist # #-end simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+ sublist #-end # simple
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+ sublist first # simple
+
+
+
+
+
+ FIRST
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+ sublist first #-end simple
+
+
+
+
+
+ FIRST
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+
+
+
+
+ sublist # last simple
+
+
+
+
+
+ FROM_START
+ LAST
+
+
+ list
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+
+
+ sublist #-end last simple
+
+
+
+
+
+ FROM_END
+ LAST
+
+
+ list
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+
+
+ sublist all with # #-end simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+ list
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ sublist all with #-end # simple
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+ list
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+ sublist all with # #-end math simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+ Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end.
+
+
+ list
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2169,14 +6411,1154 @@
-
- test join
- Describe this function...
+
+ get space shuttles
+ Creates a list for use with the sublist test.
-
+
+ number of calls
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+ test sublist complex
+ Tests the "get sub-list" block with a function call.
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # start complex
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+
+
+
+
+
+
+
+ sublist # start complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # start order complex
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+
+
+
+
+
+
+
+ sublist # start order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # end complex
+
+
+
+
+
+ FROM_END
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+ sublist # end complex number of calls
+
+
+
+
+ number of calls
+
+
+
+
+ 1
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # end order complex
+
+
+
+
+
+ FROM_END
+ FROM_END
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+
+
+
+ sublist # end order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist first-last complex
+
+
+
+
+
+ FIRST
+ LAST
+
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ sublist first-last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # #-end complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+
+
+
+ sublist # #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist #-end # complex
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+
+
+
+ sublist #-end # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist first # complex
+
+
+
+
+
+ FIRST
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+
+
+
+
+
+
+
+ sublist first # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist first #-end complex
+
+
+
+
+
+ FIRST
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Columbia
+
+
+
+
+ Challenger
+
+
+
+
+
+
+
+
+
+
+
+ sublist first #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist # last complex
+
+
+
+
+
+ FROM_START
+ LAST
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+
+
+
+
+
+ sublist # last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist #-end last simple
+
+
+
+
+
+ FROM_END
+ LAST
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ Challenger
+
+
+
+
+ Discovery
+
+
+
+
+ Atlantis
+
+
+
+
+ Endeavour
+
+
+
+
+
+
+
+
+
+
+
+ sublist #-end last simple
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist all with # #-end complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ sublist all with # #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist all with #-end # complex
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ sublist all with #-end # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ sublist all with # #-end math complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+ Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end.
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ sublist all with # #-end math complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test join
+ Tests the "join" block.
+
+
list
-
+
@@ -2197,7 +7579,11 @@
- join
+
+
+ join
+
+
@@ -2219,43 +7605,89 @@
Vulcan,Klingon,Borg
+
+
+
+
+ join order
+
+
+
+
+
+ JOIN
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+
+
+ Vulcan,Klingon,Borg
+
+
+
+
-
+
test split
- Describe this function...
+ Tests the "split" block.
-
- list
+
+ text
-
-
- SPLIT
-
-
- Vulcan,Klingon,Borg
-
-
-
-
- ,
-
-
+
+ Vulcan,Klingon,Borg
- split
+
+
+ split
+
+
-
- list
+
+
+ SPLIT
+
+
+ text
+
+
+
+
+ ,
+
+
-
+
@@ -2274,53 +7706,114 @@
+
+
+
+
+ split order
+
+
+
+
+
+ SPLIT
+
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+
+
+
+
+
+ Vulcan
+
+
+
+
+ Klingon
+
+
+
+
+ Borg
+
+
+
+
+
+
-
+
test sort alphabetic
- Describe this function...
+ Tests the "alphabetic sort" block.
-
+
list
-
- TEXT
- 1
-
-
-
-
-
- Vulcan
-
-
-
-
- klingon
-
-
-
-
- Borg
-
-
+
+
+
+
+ Vulcan
+
+
+
+
+ klingon
+
+
+
+
+ Borg
- sort alphabetic ascending
+
+
+ sort alphabetic ascending
+
+
-
- list
+
+ TEXT
+ 1
+
+
+ list
+
+
-
+
@@ -2339,53 +7832,109 @@
+
+
+
+
+ sort alphabetic ascending order
+
+
+
+
+ TEXT
+ 1
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Borg
+
+
+
+
+ Vulcan
+
+
+
+
+ klingon
+
+
+
+
+
+
-
+
test sort ignoreCase
- Describe this function...
+ Tests the "alphabetic sort ignore case" block.
-
+
list
-
- IGNORE_CASE
- 1
-
-
-
-
-
- Vulcan
-
-
-
-
- klingon
-
-
-
-
- Borg
-
-
+
+
+
+
+ Vulcan
+
+
+
+
+ klingon
+
+
+
+
+ Borg
- sort ignore case ascending
+
+
+ sort ignore case ascending
+
+
-
- list
+
+ IGNORE_CASE
+ 1
+
+
+ list
+
+
-
+
@@ -2404,53 +7953,109 @@
+
+
+
+
+ sort ignore case ascending order
+
+
+
+
+ IGNORE_CASE
+ 1
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Borg
+
+
+
+
+ klingon
+
+
+
+
+ Vulcan
+
+
+
+
+
+
-
+
test sort numeric
- Describe this function...
+ Tests the "numeric sort" block.
-
+
list
-
- NUMERIC
- -1
-
-
-
-
-
- 8
-
-
-
-
- 18
-
-
-
-
- -1
-
-
+
+
+
+
+ 8
+
+
+
+
+ 18
+
+
+
+
+ -1
- sort numeric descending
+
+
+ sort numeric descending
+
+
-
- list
+
+ NUMERIC
+ -1
+
+
+ list
+
+
-
+
@@ -2469,9 +8074,61 @@
+
+
+
+
+ sort numeric descending order
+
+
+
+
+ NUMERIC
+ -1
+
+
+
+
+ TRUE
+
+
+
+
+ list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+ 8
+
+
+
+
+ -1
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/tests/generators/logic.xml b/tests/generators/logic.xml
index b702b5ee3..acea1c752 100644
--- a/tests/generators/logic.xml
+++ b/tests/generators/logic.xml
@@ -2,7 +2,11 @@
- True
+
+
+ True
+
+
TRUE
@@ -11,7 +15,11 @@
- False
+
+
+ False
+
+
FALSE
@@ -20,7 +28,11 @@
- Not true
+
+
+ Not true
+
+
TRUE
@@ -33,7 +45,11 @@
- Not false
+
+
+ Not false
+
+
FALSE
@@ -89,7 +105,7 @@
- if false
+ if false
@@ -119,7 +135,11 @@
- if true
+
+
+ if true
+
+
TRUE
@@ -144,7 +164,7 @@
- if/else false
+ if/else false
@@ -159,7 +179,11 @@
- if/else false
+
+
+ if/else false
+
+
TRUE
@@ -194,12 +218,16 @@
- if/else true
+ if/else true
- if/else true
+
+
+ if/else true
+
+
TRUE
@@ -224,7 +252,7 @@
- elseif 1
+ elseif 1
@@ -249,17 +277,21 @@
- elseif 2
+ elseif 2
- elseif 3
+ elseif 3
- elseif 4
+
+
+ elseif 4
+
+
TRUE
@@ -297,7 +329,11 @@
test equalities
- Equal yes
+
+
+ Equal yes
+
+
TRUE
@@ -316,7 +352,11 @@
- Equal no
+
+
+ Equal no
+
+
FALSE
@@ -335,7 +375,11 @@
- Not equal yes
+
+
+ Not equal yes
+
+
TRUE
@@ -354,7 +398,11 @@
- Not equal no
+
+
+ Not equal no
+
+
FALSE
@@ -373,7 +421,11 @@
- Smaller yes
+
+
+ Smaller yes
+
+
TRUE
@@ -392,7 +444,11 @@
- Smaller no
+
+
+ Smaller no
+
+
FALSE
@@ -411,7 +467,11 @@
- Greater yes
+
+
+ Greater yes
+
+
TRUE
@@ -430,7 +490,11 @@
- Greater no
+
+
+ Greater no
+
+
FALSE
@@ -449,7 +513,11 @@
- Smaller-equal yes
+
+
+ Smaller-equal yes
+
+
TRUE
@@ -468,7 +536,11 @@
- Smaller-equal no
+
+
+ Smaller-equal no
+
+
FALSE
@@ -487,7 +559,11 @@
- Greater-equal yes
+
+
+ Greater-equal yes
+
+
TRUE
@@ -506,7 +582,11 @@
- Greater-equal no
+
+
+ Greater-equal no
+
+
FALSE
@@ -552,7 +632,11 @@
test or
- Or true/true
+
+
+ Or true/true
+
+
TRUE
@@ -571,7 +655,11 @@
- Or false/true
+
+
+ Or false/true
+
+
TRUE
@@ -590,7 +678,11 @@
- Or true/false
+
+
+ Or true/false
+
+
TRUE
@@ -609,7 +701,11 @@
- Or false/false
+
+
+ Or false/false
+
+
FALSE
@@ -639,7 +735,11 @@
test and
- And true/true
+
+
+ And true/true
+
+
TRUE
@@ -658,7 +758,11 @@
- And false/true
+
+
+ And false/true
+
+
FALSE
@@ -677,7 +781,11 @@
- And true/false
+
+
+ And true/false
+
+
FALSE
@@ -696,7 +804,11 @@
- And false/false
+
+
+ And false/false
+
+
FALSE
@@ -726,7 +838,11 @@
test ternary
- if true
+
+
+ if true
+
+
@@ -753,7 +869,11 @@
- if true
+
+
+ if true
+
+
diff --git a/tests/generators/loops1.xml b/tests/generators/loops1.xml
index 70fb34c1c..7cdff0786 100644
--- a/tests/generators/loops1.xml
+++ b/tests/generators/loops1.xml
@@ -62,7 +62,11 @@
- for loop
+
+
+ for loop
+
+
log
@@ -93,7 +97,7 @@
- while 0
+ while 0
@@ -106,7 +110,7 @@
- until 0
+ until 0
@@ -147,7 +151,11 @@
- while 10
+
+
+ while 10
+
+
count
@@ -196,7 +204,11 @@
- until 10
+
+
+ until 10
+
+
count
@@ -254,7 +266,11 @@
- repeat 10
+
+
+ repeat 10
+
+
count
diff --git a/tests/generators/loops2.xml b/tests/generators/loops2.xml
index 4307f6d10..c35623a5d 100644
--- a/tests/generators/loops2.xml
+++ b/tests/generators/loops2.xml
@@ -51,7 +51,11 @@
- count up ints
+
+
+ count up ints
+
+
log
@@ -100,7 +104,11 @@
- count down ints
+
+
+ count down ints
+
+
log
@@ -154,7 +162,11 @@
- count with floats
+
+
+ count with floats
+
+
loglist
@@ -263,7 +275,11 @@
- count up non-trivial ints
+
+
+ count up non-trivial ints
+
+
loglist
@@ -377,7 +393,11 @@
- count down non-trivial ints
+
+
+ count down non-trivial ints
+
+
loglist
@@ -481,7 +501,11 @@
- count with floats
+
+
+ count with floats
+
+
loglist
@@ -589,7 +613,11 @@
- count up
+
+
+ count up
+
+
log
@@ -633,7 +661,11 @@
- count down
+
+
+ count down
+
+
log
@@ -702,7 +734,11 @@
- count up non-trivial
+
+
+ count up non-trivial
+
+
loglist
@@ -791,7 +827,11 @@
- count down non-trivial
+
+
+ count down non-trivial
+
+
loglist
diff --git a/tests/generators/loops3.xml b/tests/generators/loops3.xml
index 6cd5e0c75..508b88729 100644
--- a/tests/generators/loops3.xml
+++ b/tests/generators/loops3.xml
@@ -93,7 +93,11 @@
- while continue
+
+
+ while continue
+
+
log
@@ -184,7 +188,11 @@
- until continue
+
+
+ until continue
+
+
log
@@ -252,7 +260,11 @@
- count continue
+
+
+ count continue
+
+
log
@@ -335,7 +347,11 @@
- for continue
+
+
+ for continue
+
+
log
@@ -439,7 +455,11 @@
- while break
+
+
+ while break
+
+
count
@@ -512,7 +532,11 @@
- until break
+
+
+ until break
+
+
count
@@ -580,7 +604,11 @@
- count break
+
+
+ count break
+
+
log
@@ -663,7 +691,11 @@
- for break
+
+
+ for break
+
+
log
diff --git a/tests/generators/math.xml b/tests/generators/math.xml
index 38b28c3b5..9c1f644f8 100644
--- a/tests/generators/math.xml
+++ b/tests/generators/math.xml
@@ -1,11 +1,11 @@
-
+
-
+
@@ -61,11 +61,16 @@
-
- test operations on single
+
+ test single
+ Tests the "single" block.
- sqrt
+
+
+ sqrt
+
+
ROOT
@@ -83,7 +88,11 @@
- abs
+
+
+ abs
+
+
ABS
@@ -101,7 +110,11 @@
- negate
+
+
+ negate
+
+
NEG
@@ -119,7 +132,11 @@
- ln
+
+
+ ln
+
+
LN
@@ -137,7 +154,11 @@
- log10
+
+
+ log10
+
+
LOG10
@@ -155,7 +176,11 @@
- exp
+
+
+ exp
+
+
EXP
@@ -173,7 +198,11 @@
- power10
+
+
+ power10
+
+
POW10
@@ -204,11 +233,16 @@
-
+
test arithmetic
+ Tests the "arithmetic" block for all operations and checks parenthesis are properly generated for different orders.
- add
+
+
+ add
+
+
ADD
@@ -231,7 +265,11 @@
- subtract
+
+
+ subtract
+
+
MINUS
@@ -254,73 +292,280 @@
- multiply
+
+
+ subtract order with add
+
+
- MULTIPLY
+ MINUS
- 4
+ 1
-
- 2.5
+
+ ADD
+
+
+ 0
+
+
+
+
+ 2
+
+
- 10
+ -1
- divide
+
+
+ subtract order with subtract
+
+
- DIVIDE
+ MINUS
- 8.2
+ 1
-
- -5
+
+ MINUS
+
+
+ 0
+
+
+
+
+ 2
+
+
- -1.64
+ 3
- power
+
+
+ multiply
+
+
- POWER
+ MULTIPLY
- 10
+ 4
- 4
+ 2.5
- 10000
+ 10
+
+
+
+
+ multiply order
+
+
+
+
+ MULTIPLY
+
+
+ 4
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+ 2.5
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ divide
+
+
+
+
+ DIVIDE
+
+
+ 8.2
+
+
+
+
+ -5
+
+
+
+
+
+
+ -1.64
+
+
+
+
+
+
+ divide order
+
+
+
+
+ DIVIDE
+
+
+ 8.2
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+ -5
+
+
+
+
+
+
+
+
+ -1.64
+
+
+
+
+
+
+ power
+
+
+
+
+ POWER
+
+
+ 10
+
+
+
+
+ 4
+
+
+
+
+
+
+ 10000
+
+
+
+
+
+
+ power order
+
+
+
+
+ POWER
+
+
+ 10
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 10000
+
+
+
+
+
+
+
+
+
+
+
+
@@ -332,11 +577,16 @@
-
+
test trig
+ Tests the "trig" block.
- sin
+
+
+ sin
+
+
SIN
@@ -354,7 +604,11 @@
- cos
+
+
+ cos
+
+
COS
@@ -372,7 +626,11 @@
- tan
+
+
+ tan
+
+
TAN
@@ -390,7 +648,11 @@
- asin
+
+
+ asin
+
+
ASIN
@@ -408,7 +670,11 @@
- acos
+
+
+ acos
+
+
ACOS
@@ -426,7 +692,11 @@
- atan
+
+
+ atan
+
+
ATAN
@@ -455,11 +725,16 @@
-
+
test constant
+ Tests the "constant" blocks.
- const pi
+
+
+ const pi
+
+
ROUNDDOWN
@@ -487,7 +762,11 @@
- const e
+
+
+ const e
+
+
ROUNDDOWN
@@ -515,7 +794,11 @@
- const golden
+
+
+ const golden
+
+
ROUNDDOWN
@@ -543,7 +826,11 @@
- const sqrt 2
+
+
+ const sqrt 2
+
+
ROUNDDOWN
@@ -571,7 +858,11 @@
- const sqrt 0.5
+
+
+ const sqrt 0.5
+
+
ROUNDDOWN
@@ -599,8 +890,12 @@
- const infinity
TRUE
+
+
+ const infinity
+
+
LT
@@ -629,12 +924,17 @@
-
+
test number properties
+ Tests the "number property" blocks.
- even
TRUE
+
+
+ even
+
+
@@ -648,8 +948,12 @@
- odd
FALSE
+
+
+ odd
+
+
@@ -663,8 +967,12 @@
- prime 5
TRUE
+
+
+ prime 5
+
+
@@ -678,8 +986,12 @@
- prime 25
FALSE
+
+
+ prime 25
+
+
@@ -693,8 +1005,12 @@
- prime negative
FALSE
+
+
+ prime negative
+
+
@@ -708,8 +1024,12 @@
- whole
FALSE
+
+
+ whole
+
+
@@ -723,8 +1043,12 @@
- positive
TRUE
+
+
+ positive
+
+
@@ -738,8 +1062,12 @@
- negative
TRUE
+
+
+ negative
+
+
@@ -753,8 +1081,12 @@
- divisible
TRUE
+
+
+ divisible
+
+
@@ -790,11 +1122,16 @@
-
+
test round
+ Tests the "round" block.
- round
+
+
+ round
+
+
ROUND
@@ -812,7 +1149,11 @@
- round up
+
+
+ round up
+
+
ROUNDUP
@@ -830,7 +1171,11 @@
- round down
+
+
+ round down
+
+
ROUNDDOWN
@@ -853,8 +1198,9 @@
-
+
test change
+ Tests the "change" block.
varToChange
@@ -873,7 +1219,11 @@
- change
+
+
+ change
+
+
varToChange
@@ -891,176 +1241,16 @@
-
-
-
-
-
- assert list equal
-
-
- equal
-
-
- TRUE
-
-
-
-
-
-
-
- NEQ
-
-
-
-
- a
-
-
-
-
-
-
-
-
- b
-
-
-
-
-
-
-
-
- equal
-
-
- FALSE
-
-
-
-
-
-
- x
-
-
- 1
-
-
-
-
-
-
- a
-
-
-
-
-
-
-
-
- NEQ
-
-
-
- GET
- FROM_START
-
-
- a
-
-
-
-
- x
-
-
-
-
-
-
-
- GET
- FROM_START
-
-
- b
-
-
-
-
- x
-
-
-
-
-
-
-
-
- equal
-
-
- FALSE
-
-
-
-
- BREAK
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- equal
-
-
-
-
-
-
- list equality
-
-
- a
-
-
-
-
- b
-
-
-
-
-
-
-
-
-
-
-
-
- equal
-
-
-
-
+
test operations on list
+ Tests the "list operation" blocks.
- sum
+
+
+ sum
+
+
@@ -1094,7 +1284,11 @@
- min
+
+
+ min
+
+
@@ -1128,7 +1322,11 @@
- max
+
+
+ max
+
+
@@ -1162,7 +1360,11 @@
- average
+
+
+ average
+
+
@@ -1196,7 +1398,11 @@
- median
+
+
+ median
+
+
@@ -1234,22 +1440,62 @@
-
- modes
- TRUE
+
+
+
+ modes
+
+
-
-
-
-
-
-
+
+
+ MODE
+
+
+
+
+
+ 3
+
+
+
+
+ 4
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ modes multiple
+
+
+
MODE
-
+
3
@@ -1265,45 +1511,14 @@
3
-
-
-
-
-
-
-
-
-
- 3
-
-
-
-
-
-
-
-
- standard dev
-
-
-
- STD_DEV
-
-
-
-
+
- 3
+ 1
-
+
- 3
-
-
-
-
- 3
+ 4
@@ -1311,46 +1526,74 @@
-
- 0
+
+
+
+
+ 3
+
+
+
+
+ 4
+
+
-
- random
- TRUE
+
+
+
+ standard dev
+
+
-
- GT
-
-
- FIRST
-
-
-
-
-
- 3
-
-
-
-
- 4
-
-
-
-
- 5
-
-
+
+
+ STD_DEV
+
+
+
+
+
+ 3
-
-
-
- RANDOM
-
-
+
+
+ 3
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ TRUE
+
+
+ random
+
+
+
+
+ GT
+
+
+ FIRST
+
+
@@ -1369,17 +1612,43 @@
+
+
+
+ RANDOM
+
+
+
+
+
+ 3
+
+
+
+
+ 4
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 0
-
-
- 0
-
-
-
+
@@ -1397,11 +1666,16 @@
-
+
test mod
+ Tests the "mod" block.
- mod
+
+
+ mod
+
+
@@ -1424,11 +1698,16 @@
-
+
test constraint
+ Tests the "constrain" block.
- constraint
+
+
+ constraint
+
+
@@ -1456,8 +1735,9 @@
-
+
test random integer
+ Tests the "random integer" block.
rand
@@ -1477,8 +1757,12 @@
- randRange
TRUE
+
+
+ randRange
+
+
AND
@@ -1516,8 +1800,12 @@
- randInteger
TRUE
+
+
+ randInteger
+
+
@@ -1536,8 +1824,9 @@
-
+
test random fraction
+ Tests the "random fraction" block.
rand
@@ -1546,8 +1835,12 @@
- randFloat
TRUE
+
+
+ randFloat
+
+
AND
@@ -1588,4 +1881,4 @@
-
+
\ No newline at end of file
diff --git a/tests/generators/text.xml b/tests/generators/text.xml
index 39a5879a9..baf62d80f 100644
--- a/tests/generators/text.xml
+++ b/tests/generators/text.xml
@@ -1,32 +1,47 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -46,40 +61,35 @@
-
- test length
+
+
+
+
+ check number of calls
+ Checks that the number of calls is one in order to confirm that a function was only called once.
-
- length
-
-
-
-
- Google
-
-
-
-
-
-
- 6
+
+ test name
+
+
+ number of calls
-
- length
+
+
+
+ test name
+
+
-
-
-
-
-
-
+
+ number of calls
- 0
+ 1
@@ -87,14 +97,238 @@
-
+
+ test create
+ Tests the "create text with" block with varying number of inputs.
+
+
+
+
+ no text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ create single
+
+
+
+
+
+
+
+ Hello
+
+
+
+
+
+
+ Hello
+
+
+
+
+
+
+ create single number
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+ create double text
+
+
+
+
+
+
+
+ K
+
+
+
+
+ 9
+
+
+
+
+
+
+ K9
+
+
+
+
+
+
+ create double text numbers
+
+
+
+
+
+
+
+ 4
+
+
+
+
+ 2
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+ create triple
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 2
+
+
+
+
+ 3
+
+
+
+
+
+
+ 123
+
+
+
+
+
+
+ create order
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+ TRUE
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ M
+
+
+
+
+
+
+ 10M
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get empty
+ Creates an empty string for use with the empty test.
+
+
+
+
+
+
+
test empty
+ Tests the "is empty" block".
- not empty
FALSE
+
+
+ not empty
+
+
-
+
Google
@@ -104,10 +338,14 @@
- empty
TRUE
+
+
+ empty
+
+
-
+
@@ -115,80 +353,137 @@
+
+
+ TRUE
+
+
+ empty complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+ empty order
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- test create text
+
+ test length
+ Tests the "length" block.
- single text
+
+
+ zero length
+
+
-
-
-
+
+
- Hello
+
-
- Hello
+
+ 0
- double text
+
+
+ non-zero length
+
+
-
-
-
+
+
- K
-
-
-
-
- 9
+ Google
-
- K9
+
+ 6
- triple text
+
+
+ length order
+
+
-
-
-
-
- 1
-
-
-
-
- 2
-
-
-
-
- 3
+
+
+
+
+
+ TRUE
+
+
+
+
+ car
+
+
+
+
+
-
- 123
+
+ 3
@@ -198,8 +493,9 @@
-
- test append item
+
+ test append
+ Tests the "append text" block with different types of parameters.
item
@@ -218,7 +514,11 @@
- append text
+
+
+ append text
+
+
item
@@ -247,7 +547,11 @@
- append number
+
+
+ append number
+
+
item
@@ -258,6 +562,57 @@
1234
+
+
+ item
+
+
+ Something
+
+
+
+
+ item
+
+
+
+
+ TRUE
+
+
+
+
+ Positive
+
+
+
+
+
+
+
+
+
+
+
+ append order
+
+
+
+
+ item
+
+
+
+
+ Something Positive
+
+
+
+
+
+
+
+
@@ -271,94 +626,108 @@
-
- test substring
+
+ test find simple
+ Tests the "find" block with a variable.
text
- 123456789
+ Banana
- substring # start
+
+
+ find first simple
+
+
-
-
- FROM_START
- FROM_START
-
+
+ FIRST
+
text
-
-
- 2
-
-
-
-
- 3
+
+
+ an
-
- 23
+
+
+
+ 1
+
+
- substring # end
+
+
+ find last simple
+
+
-
-
- FROM_END
- FROM_END
-
+
+ LAST
+
text
-
-
- 3
-
-
-
-
- 2
+
+
+ an
-
- 78
+
+
+
+ 3
+
+
- substring first-last
+
+
+ find none simple
+
+
-
-
- FIRST
- LAST
-
+
+ FIRST
+
text
+
+
+ Peel
+
+
-
- text
+
+
+
+ -1
+
+
@@ -370,40 +739,49 @@
-
- test find
+
+ get fruit
+ Creates a string for use with the find test.
-
- first find
-
-
- FIRST
-
-
- Banana
-
-
-
-
- an
-
-
+
+ number of calls
+
+
+ 1
-
+
+
+
+
+ Banana
+
+
+
+
+ test find complex
+ Tests the "find" block with a function call.
+
+
+ number of calls
+
- 2
+ 0
- last find
+
+
+ find first complex
+
+
- LAST
+ FIRST
-
- Banana
+
+
@@ -414,159 +792,331 @@
-
- 4
+
+
+
+ 1
+
+
-
- no find
-
-
- FIRST
-
-
- Banana
-
-
-
-
- Peel
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
- test letter
-
-
- letter #
-
-
-
- FROM_START
-
-
- Blockly
-
-
-
-
- 3
-
-
-
-
-
-
- o
-
-
-
-
- letter # from end
-
-
-
- FROM_END
-
+
+
+
+
+
- Blockly
-
-
-
-
- 3
-
-
-
-
-
-
- k
-
-
-
-
- first letter
-
-
-
- FIRST
-
-
- Blockly
-
-
-
-
-
-
- B
+ find first complex
-
- last letter
-
-
-
- LAST
-
-
- Blockly
-
-
-
-
-
-
- y
+
+ number of calls
+
+
+ 0
-
- random letter
- TRUE
+
+
+
+ find first order complex
+
+
-
-
- POSITIVE
-
-
- FIRST
-
-
- Blockly
+
+ FIRST
+
+
+
+
+ TRUE
-
-
-
- RANDOM
-
-
- Blockly
-
-
+
+
+
+
+
+
+
+
+
+
+ an
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+ find first order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find last complex
+
+
+
+
+ LAST
+
+
+
+
+
+
+
+ an
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ find last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find last order complex
+
+
+
+
+ LAST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ an
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ find last order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find none complex
+
+
+
+
+ FIRST
+
+
+
+
+
+
+
+ Peel
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+ find none complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ find none order complex
+
+
+
+
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Peel
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+ find none order complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -578,62 +1128,2768 @@
-
- test case
+
+ test get simple
+ Tests the "get letter" block with a variable.
-
- uppercase
-
-
- UPPERCASE
-
-
- Hello World
-
-
-
-
-
+
+ text
+
- HELLO WORLD
+ Blockly
- lowercase
+
+
+ get first simple
+
+
+
+
+
+ FIRST
+
+
+ text
+
+
+
+
+
+
+ B
+
+
+
+
+
+
+ get last simple
+
+
+
+
+
+ LAST
+
+
+ text
+
+
+
+
+
+
+ y
+
+
+
+
+ TRUE
+
+
+ get random simple
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ text
+
+
+
+
+
+ RANDOM
+
+
+ text
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+ get # simple
+
+
+
+
+
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ o
+
+
+
+
+
+
+ get # order simple
+
+
+
+
+
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ o
+
+
+
+
+
+
+ get #-end simple
+
+
+
+
+
+ FROM_END
+
+
+ text
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ k
+
+
+
+
+
+
+ get #-end order simple
+
+
+
+
+
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+ text
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ k
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get Blockly
+ Creates a string for use with the get test.
+
+
+ number of calls
+
+
+ 1
+
+
+
+
+
+
+ Blockly
+
+
+
+
+ test get complex
+ Tests the "get letter" block with a function call.
+
+
+ text
+
+
+ Blockly
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get first complex
+
+
+
+
+
+ FIRST
+
+
+
+
+
+
+
+
+
+ B
+
+
+
+
+
+
+
+
+
+ get first complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get first order complex
+
+
+
+
+
+ FIRST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ B
+
+
+
+
+
+
+
+
+
+ get first order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get last complex
+
+
+
+
+
+ LAST
+
+
+
+
+
+
+
+
+
+ y
+
+
+
+
+
+
+
+
+
+ get last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get last order complex
+
+
+
+
+
+ LAST
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ y
+
+
+
+
+
+
+
+
+
+ get last order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+ TRUE
+
+
+ get random complex
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ text
+
+
+
+
+
+ RANDOM
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get random complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+ TRUE
+
+
+ get random order complex
+
+
+
+
+ GT
+
+
+ FIRST
+
+
+ text
+
+
+
+
+
+ RANDOM
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get random order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get # complex
+
+
+
+
+
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ o
+
+
+
+
+
+
+
+
+
+ get # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get # order complex
+
+
+
+
+
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ o
+
+
+
+
+
+
+
+
+
+ get # order complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get #-end complex
+
+
+
+
+
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ k
+
+
+
+
+
+
+
+
+
+ get #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ get #-end order complex
+
+
+
+
+
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ k
+
+
+
+
+
+
+
+
+
+ get #-end order complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ get numbers
+ Creates a string for use with the substring test.
+
+
+ number of calls
+
+
+ 1
+
+
+
+
+
+
+ 123456789
+
+
+
+
+ test substring simple
+ Tests the "get substring" block with a variable.
+
+
+ text
+
+
+ 123456789
+
+
+
+
+
+
+ substring # simple
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+ substring # simple order
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+ substring #-end simple
+
+
+
+
+
+ FROM_END
+ FROM_END
+
+
+ text
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 78
+
+
+
+
+
+
+ substring #-end simple order
+
+
+
+
+
+ FROM_END
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+ text
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ 78
+
+
+
+
+
+
+ substring first-last simple
+
+
+
+
+
+ FIRST
+ LAST
+
+
+ text
+
+
+
+
+
+
+ text
+
+
+
+
+
+
+ substring # #-end simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+ text
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2345678
+
+
+
+
+
+
+ substring #-end # simple
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+ substring first # simple
+
+
+
+
+
+ FIRST
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1234
+
+
+
+
+
+
+ substring first #-end simple
+
+
+
+
+
+ FIRST
+ FROM_END
+
+
+ text
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 12345678
+
+
+
+
+
+
+ substring # last simple
+
+
+
+
+
+ FROM_START
+ LAST
+
+
+ text
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 789
+
+
+
+
+
+
+ substring #-end last simple
+
+
+
+
+
+ FROM_END
+ LAST
+
+
+ text
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 789
+
+
+
+
+
+
+ substring all with # #-end simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+ text
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+ substring all with #-end # simple
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+ text
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+ substring all with # #-end math simple
+
+
+
+
+
+ FROM_START
+ FROM_END
+ Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end.
+
+
+ text
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test substring complex
+ Tests the "get substring" block with a function call.
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring # complex
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ substring # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring # complex order
+
+
+
+
+
+ FROM_START
+ FROM_START
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRUE
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ substring # complex order
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring #-end complex
+
+
+
+
+
+ FROM_END
+ FROM_END
+ The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index.
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 78
+
+
+
+
+
+
+
+
+
+ substring #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring #-end order order
+
+
+
+
+
+ FROM_END
+ FROM_END
+
+
+
+
+ TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ 78
+
+
+
+
+
+
+
+
+
+ substring #-end order order
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring first-last
+
+
+
+
+
+ FIRST
+ LAST
+
+
+
+
+
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+ substring first-last
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring # #-end complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2345678
+
+
+
+
+
+
+
+
+
+ substring # #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring #-end # complex
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+ substring #-end # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring first # complex
+
+
+
+
+
+ FIRST
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1234
+
+
+
+
+
+
+
+
+
+ substring first # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring first #-end complex
+
+
+
+
+
+ FIRST
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 12345678
+
+
+
+
+
+
+
+
+
+ substring first #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring # last complex
+
+
+
+
+
+ FROM_START
+ LAST
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 789
+
+
+
+
+
+
+
+
+
+ substring # last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring #-end last complex
+
+
+
+
+
+ FROM_END
+ LAST
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 789
+
+
+
+
+
+
+
+
+
+ substring #-end last complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring all with # #-end complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+
+
+
+ substring all with # #-end complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring all with #-end # complex
+
+
+
+
+
+ FROM_END
+ FROM_START
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+
+
+
+ substring all with #-end # complex
+
+
+
+
+ number of calls
+
+
+ 0
+
+
+
+
+
+
+ substring all with # #-end math complex
+
+
+
+
+
+ FROM_START
+ FROM_END
+ Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end.
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ ADD
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 123456789
+
+
+
+
+
+
+
+
+
+ substring all with # #-end math complex
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test case
+ Tests the "change casing" block.
+
+
+ text
+
+
+ Hello World
+
+
+
+
+
+
+ uppercase
+
+
- LOWERCASE
+ UPPERCASE
-
- Hello World
+
+ text
- hello world
+ HELLO WORLD
- titlecase
+
+
+ uppercase order
+
+
- TITLECASE
+ UPPERCASE
-
- heLLo WorlD
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
- Hello World
+ HELLO WORLD
+
+
+ text
+
+
+ Hello World
+
+
+
+
+
+
+ lowercase
+
+
+
+
+ LOWERCASE
+
+
+ text
+
+
+
+
+
+
+ hello world
+
+
+
+
+
+
+ lowercase order
+
+
+
+
+ LOWERCASE
+
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+
+
+ hello world
+
+
+
+
+ text
+
+
+ heLLo WorlD
+
+
+
+
+
+
+ titlecase
+
+
+
+
+ TITLECASE
+
+
+ text
+
+
+
+
+
+
+ Hello World
+
+
+
+
+
+
+ titlecase order
+
+
+
+
+ TITLECASE
+
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+
+
+ Hello World
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -641,62 +3897,193 @@
-
+
test trim
+ Tests the "trim" block.
-
- trim both
-
-
- BOTH
-
-
- abc def
-
-
-
-
-
+
+ text
+
- abc def
+ abc def
- trim left
+
+
+ trim both
+
+
- LEFT
+ BOTH
-
- abc def
+
+ text
- abc def
+ abc def
- trim right
+
+
+ trim both order
+
+
- RIGHT
+ BOTH
-
- abc def
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
- abc def
+ abc def
+
+
+
+
+ trim left
+
+
+
+
+ LEFT
+
+
+ text
+
+
+
+
+
+
+ abc def
+
+
+
+
+
+
+ trim left order
+
+
+
+
+ LEFT
+
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+
+
+ abc def
+
+
+
+
+
+
+ trim right
+
+
+
+
+ RIGHT
+
+
+ text
+
+
+
+
+
+
+ abc def
+
+
+
+
+
+
+ trim right order
+
+
+
+
+ RIGHT
+
+
+
+
+ TRUE
+
+
+
+
+ text
+
+
+
+
+
+
+
+
+
+
+
+ abc def
+
+
+
+
+
+
+
+
+
+
@@ -704,4 +4091,4 @@
-
+
\ No newline at end of file
diff --git a/tests/generators/unittest.js b/tests/generators/unittest.js
index 560e6b91f..d2b94e66d 100644
--- a/tests/generators/unittest.js
+++ b/tests/generators/unittest.js
@@ -45,11 +45,12 @@ Blockly.Blocks['unittest_assertequals'] = {
this.setColour(65);
this.setPreviousStatement(true);
this.setNextStatement(true);
- this.appendDummyInput()
- .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE');
- this.appendValueInput('ACTUAL', null)
+ this.appendValueInput('MESSAGE')
+ .appendField('name')
+ .setCheck('String');
+ this.appendValueInput('ACTUAL')
.appendField('actual');
- this.appendValueInput('EXPECTED', null)
+ this.appendValueInput('EXPECTED')
.appendField('expected');
this.setTooltip('Tests that "actual == expected".');
},
@@ -64,9 +65,10 @@ Blockly.Blocks['unittest_assertvalue'] = {
this.setColour(65);
this.setPreviousStatement(true);
this.setNextStatement(true);
- this.appendDummyInput()
- .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE');
- this.appendValueInput('ACTUAL', Boolean)
+ this.appendValueInput('MESSAGE', 'test name')
+ .appendField('name')
+ .setCheck('String');
+ this.appendValueInput('ACTUAL')
.appendField('assert')
.appendField(new Blockly.FieldDropdown(
[['true', 'TRUE'], ['false', 'FALSE'], ['null', 'NULL']]), 'EXPECTED');
@@ -92,3 +94,24 @@ Blockly.Blocks['unittest_fail'] = {
return ['unittestResults'];
}
};
+
+Blockly.Blocks['unittest_adjustindex'] = {
+ // Adjusts the indexing based on current setting.
+ init: function() {
+ this.jsonInit({
+ "message0": "adjusted %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "INDEX",
+ "check": "Number"
+ }
+ ],
+ "inputsInline": true,
+ "output": "Number",
+ "colour": 65,
+ "tooltip": "Adjusts the value based on whether generated code is using " +
+ "zero or one based indexing"
+ });
+ }
+};
diff --git a/tests/generators/unittest_dart.js b/tests/generators/unittest_dart.js
index 280595fc3..f1334c993 100644
--- a/tests/generators/unittest_dart.js
+++ b/tests/generators/unittest_dart.js
@@ -111,7 +111,8 @@ Blockly.Dart['unittest_main'].defineAssert_ = function() {
Blockly.Dart['unittest_assertequals'] = function(block) {
// Asserts that a value equals another value.
- var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Dart.valueToCode(block, 'MESSAGE',
+ Blockly.Dart.ORDER_NONE) || '';
var actual = Blockly.Dart.valueToCode(block, 'ACTUAL',
Blockly.Dart.ORDER_NONE) || 'null';
var expected = Blockly.Dart.valueToCode(block, 'EXPECTED',
@@ -122,7 +123,8 @@ Blockly.Dart['unittest_assertequals'] = function(block) {
Blockly.Dart['unittest_assertvalue'] = function(block) {
// Asserts that a value is true, false, or null.
- var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Dart.valueToCode(block, 'MESSAGE',
+ Blockly.Dart.ORDER_NONE) || '';
var actual = Blockly.Dart.valueToCode(block, 'ACTUAL',
Blockly.Dart.ORDER_NONE) || 'null';
var expected = block.getFieldValue('EXPECTED');
@@ -141,7 +143,8 @@ Blockly.Dart['unittest_fail'] = function(block) {
// Always assert an error.
var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults',
Blockly.Variables.NAME_TYPE);
- var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Dart.valueToCode(block, 'MESSAGE',
+ Blockly.Dart.ORDER_NONE) || '';
var functionName = Blockly.Dart.provideFunction_(
'unittest_fail',
[ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ +
@@ -154,3 +157,21 @@ Blockly.Dart['unittest_fail'] = function(block) {
'}']);
return functionName + '(' + message + ');\n';
};
+
+Blockly.Dart['unittest_adjustindex'] = function(block) {
+ var index = Blockly.Dart.valueToCode(block, 'INDEX',
+ Blockly.Dart.ORDER_ADDITIVE) || '0';
+ // Adjust index if using one-based indexing.
+ if (Blockly.Dart.ONE_BASED_INDEXING) {
+ if (Blockly.isNumber(index)) {
+ // If the index is a naked number, adjust it right now.
+ return [parseFloat(index) + 1, Blockly.Dart.ORDER_ATOMIC];
+ } else {
+ // If the index is dynamic, adjust it in code.
+ index = index + ' + 1';
+ }
+ } else if (Blockly.isNumber(index)) {
+ return [index, Blockly.Dart.ORDER_ATOMIC];
+ }
+ return [index, Blockly.Dart.ORDER_ADDITIVE];
+};
diff --git a/tests/generators/unittest_javascript.js b/tests/generators/unittest_javascript.js
index ed5415c0b..991568614 100644
--- a/tests/generators/unittest_javascript.js
+++ b/tests/generators/unittest_javascript.js
@@ -35,15 +35,15 @@ Blockly.JavaScript['unittest_main'] = function(block) {
' var report = [];',
' var summary = [];',
' var fails = 0;',
- ' for (var x = 0; x < ' + resultsVar + '.length; x++) {',
- ' if (' + resultsVar + '[x][0]) {',
+ ' for (var i = 0; i < ' + resultsVar + '.length; i++) {',
+ ' if (' + resultsVar + '[i][0]) {',
' summary.push(".");',
' } else {',
' summary.push("F");',
' fails++;',
' report.push("");',
- ' report.push("FAIL: " + ' + resultsVar + '[x][2]);',
- ' report.push(' + resultsVar + '[x][1]);',
+ ' report.push("FAIL: " + ' + resultsVar + '[i][2]);',
+ ' report.push(' + resultsVar + '[i][1]);',
' }',
' }',
' report.unshift(summary.join(""));',
@@ -115,7 +115,8 @@ Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) {
Blockly.JavaScript['unittest_assertequals'] = function(block) {
// Asserts that a value equals another value.
- var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.JavaScript.valueToCode(block, 'MESSAGE',
+ Blockly.JavaScript.ORDER_NONE) || '';
var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL',
Blockly.JavaScript.ORDER_COMMA) || 'null';
var expected = Blockly.JavaScript.valueToCode(block, 'EXPECTED',
@@ -126,7 +127,8 @@ Blockly.JavaScript['unittest_assertequals'] = function(block) {
Blockly.JavaScript['unittest_assertvalue'] = function(block) {
// Asserts that a value is true, false, or null.
- var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.JavaScript.valueToCode(block, 'MESSAGE',
+ Blockly.JavaScript.ORDER_NONE) || '';
var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL',
Blockly.JavaScript.ORDER_COMMA) || 'null';
var expected = block.getFieldValue('EXPECTED');
@@ -145,7 +147,8 @@ Blockly.JavaScript['unittest_fail'] = function(block) {
// Always assert an error.
var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults',
Blockly.Variables.NAME_TYPE);
- var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.JavaScript.valueToCode(block, 'MESSAGE',
+ Blockly.JavaScript.ORDER_NONE) || '';
var functionName = Blockly.JavaScript.provideFunction_(
'unittest_fail',
[ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ +
@@ -158,3 +161,21 @@ Blockly.JavaScript['unittest_fail'] = function(block) {
'}']);
return functionName + '(' + message + ');\n';
};
+
+Blockly.JavaScript['unittest_adjustindex'] = function(block) {
+ var index = Blockly.JavaScript.valueToCode(block, 'INDEX',
+ Blockly.JavaScript.ORDER_ADDITION) || '0';
+ // Adjust index if using one-based indexing.
+ if (Blockly.JavaScript.ONE_BASED_INDEXING) {
+ if (Blockly.isNumber(index)) {
+ // If the index is a naked number, adjust it right now.
+ return [parseFloat(index) + 1, Blockly.JavaScript.ORDER_ATOMIC];
+ } else {
+ // If the index is dynamic, adjust it in code.
+ index = index + ' + 1';
+ }
+ } else if (Blockly.isNumber(index)) {
+ return [index, Blockly.JavaScript.ORDER_ATOMIC];
+ }
+ return [index, Blockly.JavaScript.ORDER_ADDITION];
+};
diff --git a/tests/generators/unittest_lua.js b/tests/generators/unittest_lua.js
index 75261f0a2..d687b091b 100644
--- a/tests/generators/unittest_lua.js
+++ b/tests/generators/unittest_lua.js
@@ -105,13 +105,15 @@ Blockly.Lua['unittest_main'].defineAssert_ = function(block) {
' actual = "{" .. table.concat(actual, ", ") .. "}"',
' end',
' end',
- ' if actual == expected then',
+ ' if actual == expected or (type(actual) == "number" and ' +
+ 'type(expected) == "number" and math.abs(actual - expected) < ' +
+ '1e-9) then ',
' table.insert(' + resultsVar +
', {success=true, log="OK", title=message})',
' else',
' table.insert(' + resultsVar + ', {success=false, ' +
'log=string.format("Expected: %s\\nActual: %s"' +
- ', expected, actual), title=message})',
+ ', tostring(expected), tostring(actual)), title=message})',
' end',
'end']);
return functionName;
@@ -119,7 +121,8 @@ Blockly.Lua['unittest_main'].defineAssert_ = function(block) {
Blockly.Lua['unittest_assertequals'] = function(block) {
// Asserts that a value equals another value.
- var message = Blockly.Lua.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Lua.valueToCode(block, 'MESSAGE',
+ Blockly.Lua.ORDER_NONE) || '';
var actual = Blockly.Lua.valueToCode(block, 'ACTUAL',
Blockly.Lua.ORDER_NONE) || 'nil';
var expected = Blockly.Lua.valueToCode(block, 'EXPECTED',
@@ -130,7 +133,8 @@ Blockly.Lua['unittest_assertequals'] = function(block) {
Blockly.Lua['unittest_assertvalue'] = function(block) {
// Asserts that a value is true, false, or null.
- var message = Blockly.Lua.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Lua.valueToCode(block, 'MESSAGE',
+ Blockly.Lua.ORDER_NONE) || '';
var actual = Blockly.Lua.valueToCode(block, 'ACTUAL',
Blockly.Lua.ORDER_NONE) || 'nil';
var expected = block.getFieldValue('EXPECTED');
@@ -149,7 +153,8 @@ Blockly.Lua['unittest_fail'] = function(block) {
// Always assert an error.
var resultsVar = Blockly.Lua.variableDB_.getName('unittestResults',
Blockly.Variables.NAME_TYPE);
- var message = Blockly.Lua.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Lua.valueToCode(block, 'MESSAGE',
+ Blockly.Lua.ORDER_NONE) || '';
var functionName = Blockly.Lua.provideFunction_(
'unittest_fail',
['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(message)',
@@ -161,3 +166,14 @@ Blockly.Lua['unittest_fail'] = function(block) {
'end']);
return functionName + '(' + message + ')\n';
};
+
+Blockly.Lua['unittest_adjustindex'] = function(block) {
+ var index = Blockly.Lua.valueToCode(block, 'INDEX',
+ Blockly.Lua.ORDER_ADDITIVE) || '0';
+ if (Blockly.isNumber(index)) {
+ // If the index is a naked number, adjust it right now.
+ return [parseFloat(index) + 1, Blockly.Lua.ORDER_ATOMIC];
+ }
+ // If the index is dynamic, adjust it in code.
+ return [index + ' + 1', Blockly.Lua.ORDER_ATOMIC];
+};
diff --git a/tests/generators/unittest_php.js b/tests/generators/unittest_php.js
index 429831ae9..3a80502ba 100644
--- a/tests/generators/unittest_php.js
+++ b/tests/generators/unittest_php.js
@@ -78,45 +78,50 @@ Blockly.PHP['unittest_main'].defineAssert_ = function(block) {
Blockly.Variables.NAME_TYPE);
var functionName = Blockly.PHP.provideFunction_(
'assertEquals',
- [ ' function equals($a, $b) {',
- ' if ($a === $b) {',
- ' return true;',
- ' } else if ((is_numeric($a)) && (is_numeric($b)) &&',
- ' (round($a,15) == round($b,15))) {',
- ' return true;',
- ' } else if (is_array($a) && is_array($b)) {',
- ' if (count($a) != count($b)) {',
- ' return false;',
- ' }',
- ' for ($i = 0; $i < count($a); $i++) {',
- ' if (!equals($a[$i], $b[$i])) {',
- ' return false;',
- ' }',
- ' }',
- ' return true;',
- ' }',
- ' return false;',
- ' }',
- 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
- '($actual, $expected, $message) {',
- 'global ' + resultsVar + ';',
- ' // Asserts that a value equals another value.',
- ' if (!is_array(' + resultsVar + ')) {',
- ' throw new Exception("Orphaned assert: " . $message);',
- ' }',
- ' if (equals($actual, $expected)) {',
- ' array_push(' + resultsVar + ', [true, "OK", $message]);',
- ' } else {',
- ' array_push(' + resultsVar + ', [false, ' +
- '"Expected: " . $expected . "\\nActual: " . $actual, $message]);',
- ' }',
- '}']);
+ [' function equals($a, $b) {',
+ ' if ($a === $b) {',
+ ' return true;',
+ ' } else if ((is_numeric($a)) && (is_numeric($b)) &&',
+ ' (round($a,15) == round($b,15))) {',
+ ' return true;',
+ ' } else if (is_array($a) && is_array($b)) {',
+ ' if (count($a) != count($b)) {',
+ ' return false;',
+ ' }',
+ ' for ($i = 0; $i < count($a); $i++) {',
+ ' if (!equals($a[$i], $b[$i])) {',
+ ' return false;',
+ ' }',
+ ' }',
+ ' return true;',
+ ' }',
+ ' return false;',
+ ' }',
+ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
+ '($actual, $expected, $message) {',
+ 'global ' + resultsVar + ';',
+ ' // Asserts that a value equals another value.',
+ ' if (!is_array(' + resultsVar + ')) {',
+ ' throw new Exception("Orphaned assert: " . $message);',
+ ' }',
+ ' if (equals($actual, $expected)) {',
+ ' array_push(' + resultsVar + ', [true, "OK", $message]);',
+ ' } else {',
+ ' $expected = is_array($expected) ? implode(" ", $expected) : ' +
+ '$expected;',
+ ' $actual = is_array($actual) ? implode(" ", $actual) : ' +
+ '$actual;',
+ ' array_push(' + resultsVar + ', [false, ' +
+ '"Expected: " . $expected . "\\nActual: " . $actual, $message]);',
+ ' }',
+ '}']);
return functionName;
};
Blockly.PHP['unittest_assertequals'] = function(block) {
// Asserts that a value equals another value.
- var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.PHP.valueToCode(block, 'MESSAGE',
+ Blockly.PHP.ORDER_NONE) || '';
var actual = Blockly.PHP.valueToCode(block, 'ACTUAL',
Blockly.PHP.ORDER_COMMA) || 'null';
var expected = Blockly.PHP.valueToCode(block, 'EXPECTED',
@@ -127,7 +132,8 @@ Blockly.PHP['unittest_assertequals'] = function(block) {
Blockly.PHP['unittest_assertvalue'] = function(block) {
// Asserts that a value is true, false, or null.
- var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.PHP.valueToCode(block, 'MESSAGE',
+ Blockly.PHP.ORDER_NONE) || '';
var actual = Blockly.PHP.valueToCode(block, 'ACTUAL',
Blockly.PHP.ORDER_COMMA) || 'null';
var expected = block.getFieldValue('EXPECTED');
@@ -146,7 +152,8 @@ Blockly.PHP['unittest_fail'] = function(block) {
// Always assert an error.
var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults',
Blockly.Variables.NAME_TYPE);
- var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.PHP.valueToCode(block, 'MESSAGE',
+ Blockly.PHP.ORDER_NONE) || '';
var functionName = Blockly.PHP.provideFunction_(
'unittest_fail',
[ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
@@ -160,3 +167,21 @@ Blockly.PHP['unittest_fail'] = function(block) {
'}']);
return functionName + '(' + message + ');\n';
};
+
+Blockly.PHP['unittest_adjustindex'] = function(block) {
+ var index = Blockly.PHP.valueToCode(block, 'INDEX',
+ Blockly.PHP.ORDER_ADDITION) || '0';
+ // Adjust index if using one-based indexing.
+ if (Blockly.PHP.ONE_BASED_INDEXING) {
+ if (Blockly.isNumber(index)) {
+ // If the index is a naked number, adjust it right now.
+ return [parseFloat(index) + 1, Blockly.PHP.ORDER_ATOMIC];
+ } else {
+ // If the index is dynamic, adjust it in code.
+ index = index + ' + 1';
+ }
+ } else if (Blockly.isNumber(index)) {
+ return [index, Blockly.PHP.ORDER_ATOMIC];
+ }
+ return [index, Blockly.PHP.ORDER_ADDITION];
+};
diff --git a/tests/generators/unittest_python.js b/tests/generators/unittest_python.js
index fc64d6efc..2b459aa30 100644
--- a/tests/generators/unittest_python.js
+++ b/tests/generators/unittest_python.js
@@ -89,7 +89,8 @@ Blockly.Python['unittest_main'].defineAssert_ = function() {
Blockly.Python['unittest_assertequals'] = function(block) {
// Asserts that a value equals another value.
- var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Python.valueToCode(block, 'MESSAGE',
+ Blockly.Python.ORDER_NONE) || '';
var actual = Blockly.Python.valueToCode(block, 'ACTUAL',
Blockly.Python.ORDER_NONE) || 'None';
var expected = Blockly.Python.valueToCode(block, 'EXPECTED',
@@ -100,7 +101,8 @@ Blockly.Python['unittest_assertequals'] = function(block) {
Blockly.Python['unittest_assertvalue'] = function(block) {
// Asserts that a value is true, false, or null.
- var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Python.valueToCode(block, 'MESSAGE',
+ Blockly.Python.ORDER_NONE) || '';
var actual = Blockly.Python.valueToCode(block, 'ACTUAL',
Blockly.Python.ORDER_NONE) || 'None';
var expected = block.getFieldValue('EXPECTED');
@@ -119,7 +121,8 @@ Blockly.Python['unittest_fail'] = function(block) {
// Always assert an error.
var resultsVar = Blockly.Python.variableDB_.getName('unittestResults',
Blockly.Variables.NAME_TYPE);
- var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE'));
+ var message = Blockly.Python.valueToCode(block, 'MESSAGE',
+ Blockly.Python.ORDER_NONE) || '';
var functionName = Blockly.Python.provideFunction_(
'fail',
['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(message):',
@@ -129,3 +132,21 @@ Blockly.Python['unittest_fail'] = function(block) {
' ' + resultsVar + '.append((False, "Fail.", message))']);
return functionName + '(' + message + ')\n';
};
+
+Blockly.Python['unittest_adjustindex'] = function(block) {
+ var index = Blockly.Python.valueToCode(block, 'INDEX',
+ Blockly.Python.ORDER_ADDITIVE) || '0';
+ // Adjust index if using one-based indexing.
+ if (Blockly.Python.ONE_BASED_INDEXING) {
+ if (Blockly.isNumber(index)) {
+ // If the index is a naked number, adjust it right now.
+ return [parseFloat(index) + 1, Blockly.Python.ORDER_ATOMIC];
+ } else {
+ // If the index is dynamic, adjust it in code.
+ index = index + ' + 1';
+ }
+ } else if (Blockly.isNumber(index)) {
+ return [index, Blockly.Python.ORDER_ATOMIC];
+ }
+ return [index, Blockly.Python.ORDER_ADDITIVE];
+};
diff --git a/tests/generators/variables.xml b/tests/generators/variables.xml
index 544d897d0..a11d0a01a 100644
--- a/tests/generators/variables.xml
+++ b/tests/generators/variables.xml
@@ -10,7 +10,11 @@
- variable
+
+
+ variable
+
+
item
@@ -31,7 +35,11 @@
- reserved variable
+
+
+ reserved variable
+
+
if
diff --git a/tests/jsunit/connection_db_test.js b/tests/jsunit/connection_db_test.js
index 269d2d123..558edf100 100644
--- a/tests/jsunit/connection_db_test.js
+++ b/tests/jsunit/connection_db_test.js
@@ -22,8 +22,8 @@
function verify_DB_(msg, expected, db) {
var equal = (expected.length == db.length);
if (equal) {
- for (var x = 0; x < expected.length; x++) {
- if (expected[x] != db[x]) {
+ for (var i = 0; i < expected.length; i++) {
+ if (expected[i] != db[i]) {
equal = false;
break;
}
From 2dab19c015279d8d9bd665ac68f5b8e7ce8f8113 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Fri, 8 Jul 2016 15:50:09 -0700
Subject: [PATCH 08/25] Ensure that if a procedure call exists, so does its
definition.
Specifically, if a call is copied, then the def is deleted, then the
call is pasted, the def should be created.
---
blocks/procedures.js | 96 ++++++++++++++++++++++++++++++++-----------
core/blockly.js | 2 +
core/procedures.js | 16 +-------
core/workspace_svg.js | 2 +-
core/xml.js | 4 --
5 files changed, 77 insertions(+), 43 deletions(-)
diff --git a/blocks/procedures.js b/blocks/procedures.js
index f6b25bcd6..d43130141 100644
--- a/blocks/procedures.js
+++ b/blocks/procedures.js
@@ -59,16 +59,6 @@ Blockly.Blocks['procedures_defnoreturn'] = {
this.setStatements_(true);
this.statementConnection_ = null;
},
- /**
- * Initialization of the block has completed, clean up anything that may be
- * inconsistent as a result of the XML loading.
- * @this Blockly.Block
- */
- validate: function() {
- var name = Blockly.Procedures.findLegalName(
- this.getFieldValue('NAME'), this);
- this.setFieldValue(name, 'NAME');
- },
/**
* Add or remove the statement block from this function definition.
* @param {boolean} hasStatements True if a statement block is needed.
@@ -244,16 +234,6 @@ Blockly.Blocks['procedures_defnoreturn'] = {
}
}
},
- /**
- * Dispose of any callers.
- * @this Blockly.Block
- */
- dispose: function() {
- var name = this.getFieldValue('NAME');
- Blockly.Procedures.disposeCallers(name, this.workspace);
- // Call parent's destructor.
- this.constructor.prototype.dispose.apply(this, arguments);
- },
/**
* Return the signature of this procedure definition.
* @return {!Array} Tuple containing three elements:
@@ -371,13 +351,11 @@ Blockly.Blocks['procedures_defreturn'] = {
this.statementConnection_ = null;
},
setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_,
- validate: Blockly.Blocks['procedures_defnoreturn'].validate,
updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_,
mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation,
decompose: Blockly.Blocks['procedures_defnoreturn'].decompose,
compose: Blockly.Blocks['procedures_defnoreturn'].compose,
- dispose: Blockly.Blocks['procedures_defnoreturn'].dispose,
/**
* Return the signature of this procedure definition.
* @return {!Array} Tuple containing three elements:
@@ -668,6 +646,72 @@ Blockly.Blocks['procedures_callnoreturn'] = {
}
}
},
+ /**
+ * Procedure calls cannot exist without the corresponding procedure
+ * definition. Enforce this link whenever an event is fired.
+ * @this Blockly.Block
+ */
+ onchange: function(event) {
+ if (!this.workspace || this.workspace.isFlyout) {
+ // Block is deleted or is in a flyout.
+ return;
+ }
+ if (event.type == Blockly.Events.CREATE &&
+ event.ids.indexOf(this.id) != -1) {
+ // Look for the case where a procedure call was created (usually through
+ // paste) and there is no matching definition. In this case, create
+ // an empty definition block with the correct signature.
+ var name = this.getProcedureCall();
+ var def = Blockly.Procedures.getDefinition(name, this.workspace);
+ if (def && (def.type != this.defType_ ||
+ JSON.stringify(def.arguments_) != JSON.stringify(this.arguments_))) {
+ // The signatures don't match.
+ def = null;
+ }
+ if (!def) {
+ Blockly.Events.setGroup(event.group);
+ /**
+ * Create matching definition block.
+ *
+ *
+ *
+ *
+ *
+ * test
+ *
+ *
+ */
+ var xml = goog.dom.createDom('xml');
+ var block = goog.dom.createDom('block');
+ block.setAttribute('type', this.defType_);
+ var xy = this.getRelativeToSurfaceXY();
+ var x = xy.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1);
+ var y = xy.y + Blockly.SNAP_RADIUS * 2;
+ block.setAttribute('x', x);
+ block.setAttribute('y', y);
+ var mutation = this.mutationToDom();
+ block.appendChild(mutation);
+ var field = goog.dom.createDom('field');
+ field.setAttribute('name', 'NAME');
+ field.appendChild(document.createTextNode(this.getProcedureCall()));
+ block.appendChild(field);
+ xml.appendChild(block);
+ Blockly.Xml.domToWorkspace(xml, this.workspace);
+ Blockly.Events.setGroup(false);
+ }
+ } else if (event.type == Blockly.Events.DELETE) {
+ // Look for the case where a procedure definition has been deleted,
+ // leaving this block (a procedure call) orphaned. In this case, delete
+ // the orphan.
+ var name = this.getProcedureCall();
+ var def = Blockly.Procedures.getDefinition(name, this.workspace);
+ if (!def) {
+ Blockly.Events.setGroup(event.group);
+ this.dispose(true, false);
+ Blockly.Events.setGroup(false);
+ }
+ }
+ },
/**
* Add menu option to find the definition block for this call.
* @param {!Array} options List of menu options to add to.
@@ -683,7 +727,8 @@ Blockly.Blocks['procedures_callnoreturn'] = {
def && def.select();
};
options.push(option);
- }
+ },
+ defType_: 'procedures_defnoreturn'
};
Blockly.Blocks['procedures_callreturn'] = {
@@ -710,7 +755,10 @@ Blockly.Blocks['procedures_callreturn'] = {
mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation,
renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar,
- customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu
+ onchange: Blockly.Blocks['procedures_callnoreturn'].onchange,
+ customContextMenu:
+ Blockly.Blocks['procedures_callnoreturn'].customContextMenu,
+ defType_: 'procedures_defreturn'
};
Blockly.Blocks['procedures_ifreturn'] = {
diff --git a/core/blockly.js b/core/blockly.js
index cda45992e..029f83d2e 100644
--- a/core/blockly.js
+++ b/core/blockly.js
@@ -277,7 +277,9 @@ Blockly.onKeyDown_ = function(e) {
if (e.keyCode == 86) {
// 'v' for paste.
if (Blockly.clipboardXml_) {
+ Blockly.Events.setGroup(true);
Blockly.clipboardSource_.paste(Blockly.clipboardXml_);
+ Blockly.Events.setGroup(false);
}
} else if (e.keyCode == 90) {
// 'z' for undo 'Z' is for redo.
diff --git a/core/procedures.js b/core/procedures.js
index 34419fb54..4bef0cf31 100644
--- a/core/procedures.js
+++ b/core/procedures.js
@@ -234,19 +234,6 @@ Blockly.Procedures.getCallers = function(name, workspace) {
return callers;
};
-/**
- * When a procedure definition is disposed of, find and dispose of all its
- * callers.
- * @param {string} name Name of deleted procedure definition.
- * @param {!Blockly.Workspace} workspace The workspace to delete callers from.
- */
-Blockly.Procedures.disposeCallers = function(name, workspace) {
- var callers = Blockly.Procedures.getCallers(name, workspace);
- for (var i = 0; i < callers.length; i++) {
- callers[i].dispose(true, false);
- }
-};
-
/**
* When a procedure definition changes its parameters, find and edit all its
* callers.
@@ -282,7 +269,8 @@ Blockly.Procedures.mutateCallers = function(defBlock) {
* @return {Blockly.Block} The procedure definition block, or null not found.
*/
Blockly.Procedures.getDefinition = function(name, workspace) {
- var blocks = workspace.getAllBlocks();
+ // Assume that a procedure definition is a top block.
+ var blocks = workspace.getTopBlocks(false);
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].getProcedureDef) {
var tuple = blocks[i].getProcedureDef();
diff --git a/core/workspace_svg.js b/core/workspace_svg.js
index 07e43a22d..7d137f9b8 100644
--- a/core/workspace_svg.js
+++ b/core/workspace_svg.js
@@ -740,7 +740,7 @@ Blockly.WorkspaceSvg.prototype.onMouseWheel_ = function(e) {
* containing the blocks on the workspace.
*/
Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox = function() {
- var topBlocks = this.getTopBlocks();
+ var topBlocks = this.getTopBlocks(false);
// There are no blocks, return empty rectangle.
if (!topBlocks.length) {
return {x: 0, y: 0, width: 0, height: 0};
diff --git a/core/xml.js b/core/xml.js
index 70fd915a5..efdd45811 100644
--- a/core/xml.js
+++ b/core/xml.js
@@ -532,10 +532,6 @@ Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) {
}
block.setShadow(true);
}
- // Give the block a chance to clean up any initial inputs.
- if (block.validate) {
- block.validate();
- }
return block;
};
From 57390fd744495ea07826402ba0bfd743f9f716b6 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Fri, 8 Jul 2016 16:41:06 -0700
Subject: [PATCH 09/25] Stop new 'do procedure' defs from renaming existing
callers.
---
core/procedures.js | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/core/procedures.js b/core/procedures.js
index 4bef0cf31..2cc6a4041 100644
--- a/core/procedures.js
+++ b/core/procedures.js
@@ -89,7 +89,7 @@ Blockly.Procedures.findLegalName = function(name, block) {
// Flyouts can have multiple procedures called 'do something'.
return name;
}
- while (!Blockly.Procedures.isLegalName(name, block.workspace, block)) {
+ while (!Blockly.Procedures.isLegalName_(name, block.workspace, block)) {
// Collision with another procedure.
var r = name.match(/^(.*?)(\d+)$/);
if (!r) {
@@ -109,8 +109,9 @@ Blockly.Procedures.findLegalName = function(name, block) {
* @param {Blockly.Block=} opt_exclude Optional block to exclude from
* comparisons (one doesn't want to collide with oneself).
* @return {boolean} True if the name is legal.
+ * @private
*/
-Blockly.Procedures.isLegalName = function(name, workspace, opt_exclude) {
+Blockly.Procedures.isLegalName_ = function(name, workspace, opt_exclude) {
var blocks = workspace.getAllBlocks();
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
@@ -129,24 +130,28 @@ Blockly.Procedures.isLegalName = function(name, workspace, opt_exclude) {
/**
* Rename a procedure. Called by the editable field.
- * @param {string} text The proposed new name.
+ * @param {string} name The proposed new name.
* @return {string} The accepted name.
* @this {!Blockly.Field}
*/
-Blockly.Procedures.rename = function(text) {
+Blockly.Procedures.rename = function(name) {
// Strip leading and trailing whitespace. Beyond this, all names are legal.
- text = text.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
+ name = name.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
// Ensure two identically-named procedures don't exist.
- text = Blockly.Procedures.findLegalName(text, this.sourceBlock_);
- // Rename any callers.
- var blocks = this.sourceBlock_.workspace.getAllBlocks();
- for (var i = 0; i < blocks.length; i++) {
- if (blocks[i].renameProcedure) {
- blocks[i].renameProcedure(this.text_, text);
+ var legalName = Blockly.Procedures.findLegalName(name, this.sourceBlock_);
+ var oldName = this.text_;
+ console.log(oldName + ' ' + name + ' ' + legalName)
+ if (oldName != name && oldName != legalName) {
+ // Rename any callers.
+ var blocks = this.sourceBlock_.workspace.getAllBlocks();
+ for (var i = 0; i < blocks.length; i++) {
+ if (blocks[i].renameProcedure) {
+ blocks[i].renameProcedure(oldName, legalName);
+ }
}
}
- return text;
+ return legalName;
};
/**
From 471f620c29517b1f5aa044bf81b78cc3fccd34de Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Fri, 8 Jul 2016 16:53:42 -0700
Subject: [PATCH 10/25] Routine recompile.
---
blockly_compressed.js | 132 +++++++++++++++++++--------------------
blocks_compressed.js | 33 +++++-----
core/procedures.js | 1 -
dart_compressed.js | 67 +++++++++++---------
javascript_compressed.js | 61 +++++++++---------
lua_compressed.js | 49 +++++++--------
msg/js/ko.js | 34 +++++-----
msg/js/pl.js | 36 +++++------
msg/js/pt.js | 2 +-
msg/js/ru.js | 8 +--
php_compressed.js | 90 +++++++++++++-------------
python_compressed.js | 60 +++++++++---------
12 files changed, 294 insertions(+), 279 deletions(-)
diff --git a/blockly_compressed.js b/blockly_compressed.js
index c8154fd65..8337ed485 100644
--- a/blockly_compressed.js
+++ b/blockly_compressed.js
@@ -889,7 +889,7 @@ Blockly.Bubble.prototype.renderArrow_=function(){var a=[],b=this.width_/2,c=this
p*d,e=c+p*e,p=b+h*m,l=c+h*k,b=b-h*m,c=c-h*k,k=g+this.arrow_radians_;k>2*Math.PI&&(k-=2*Math.PI);g=Math.sin(k)*f/Blockly.Bubble.ARROW_BEND;f=Math.cos(k)*f/Blockly.Bubble.ARROW_BEND;a.push("M"+p+","+l);a.push("C"+(p+f)+","+(l+g)+" "+d+","+e+" "+d+","+e);a.push("C"+d+","+e+" "+(b+f)+","+(c+g)+" "+b+","+c)}a.push("z");this.bubbleArrow_.setAttribute("d",a.join(" "))};Blockly.Bubble.prototype.setColour=function(a){this.bubbleBack_.setAttribute("fill",a);this.bubbleArrow_.setAttribute("fill",a)};
Blockly.Bubble.prototype.dispose=function(){Blockly.Bubble.unbindDragEvents_();goog.dom.removeNode(this.bubbleGroup_);this.shape_=this.content_=this.workspace_=this.resizeGroup_=this.bubbleBack_=this.bubbleArrow_=this.bubbleGroup_=null};Blockly.Icon=function(a){this.block_=a};Blockly.Icon.prototype.collapseHidden=!0;Blockly.Icon.prototype.SIZE=17;Blockly.Icon.prototype.bubble_=null;Blockly.Icon.prototype.iconXY_=null;Blockly.Icon.prototype.createIcon=function(){this.iconGroup_||(this.iconGroup_=Blockly.createSvgElement("g",{"class":"blocklyIconGroup"},null),this.drawIcon_(this.iconGroup_),this.block_.getSvgRoot().appendChild(this.iconGroup_),Blockly.bindEvent_(this.iconGroup_,"mouseup",this,this.iconClick_),this.updateEditable())};
Blockly.Icon.prototype.dispose=function(){goog.dom.removeNode(this.iconGroup_);this.iconGroup_=null;this.setVisible(!1);this.block_=null};Blockly.Icon.prototype.updateEditable=function(){this.block_.isInFlyout||!this.block_.isEditable()?Blockly.addClass_(this.iconGroup_,"blocklyIconGroupReadonly"):Blockly.removeClass_(this.iconGroup_,"blocklyIconGroupReadonly")};Blockly.Icon.prototype.isVisible=function(){return!!this.bubble_};
-Blockly.Icon.prototype.iconClick_=function(a){Blockly.dragMode_!=Blockly.DRAG_FREE&&(this.block_.isInFlyout||Blockly.isRightButton(a)||this.setVisible(!this.isVisible()))};Blockly.Icon.prototype.updateColour=function(){this.isVisible()&&this.bubble_.setColour(this.block_.getColour())};
+Blockly.Icon.prototype.iconClick_=function(a){this.block_.workspace.isDragging()||this.block_.isInFlyout||Blockly.isRightButton(a)||this.setVisible(!this.isVisible())};Blockly.Icon.prototype.updateColour=function(){this.isVisible()&&this.bubble_.setColour(this.block_.getColour())};
Blockly.Icon.prototype.renderIcon=function(a){if(this.collapseHidden&&this.block_.isCollapsed())return this.iconGroup_.setAttribute("display","none"),a;this.iconGroup_.setAttribute("display","block");var b=this.SIZE;this.block_.RTL&&(a-=b);this.iconGroup_.setAttribute("transform","translate("+a+",5)");this.computeIconLocation();return a=this.block_.RTL?a-Blockly.BlockSvg.SEP_SPACE_X:a+(b+Blockly.BlockSvg.SEP_SPACE_X)};
Blockly.Icon.prototype.setIconLocation=function(a){this.iconXY_=a;this.isVisible()&&this.bubble_.setAnchorLocation(a)};Blockly.Icon.prototype.computeIconLocation=function(){var a=this.block_.getRelativeToSurfaceXY(),b=Blockly.getRelativeXY_(this.iconGroup_),a=new goog.math.Coordinate(a.x+b.x+this.SIZE/2,a.y+b.y+this.SIZE/2);goog.math.Coordinate.equals(this.getIconLocation(),a)||this.setIconLocation(a)};Blockly.Icon.prototype.getIconLocation=function(){return this.iconXY_};
// Copyright 2011 Google Inc. Apache License 2.0
@@ -924,13 +924,14 @@ Blockly.Field.prototype.setSourceBlock=function(a){goog.asserts.assert(!this.sou
Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.createSvgElement("g",{},null),this.visible_||(this.fieldGroup_.style.display="none"),this.borderRect_=Blockly.createSvgElement("rect",{rx:4,ry:4,x:-Blockly.BlockSvg.SEP_SPACE_X/2,y:0,height:16},this.fieldGroup_,this.sourceBlock_.workspace),this.textElement_=Blockly.createSvgElement("text",{"class":"blocklyText",y:this.size_.height-12.5},this.fieldGroup_),this.updateEditable(),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),
this.mouseUpWrapper_=Blockly.bindEvent_(this.fieldGroup_,"mouseup",this,this.onMouseUp_),this.updateTextNode_())};Blockly.Field.prototype.dispose=function(){this.mouseUpWrapper_&&(Blockly.unbindEvent_(this.mouseUpWrapper_),this.mouseUpWrapper_=null);this.sourceBlock_=null;goog.dom.removeNode(this.fieldGroup_);this.validator_=this.borderRect_=this.textElement_=this.fieldGroup_=null};
Blockly.Field.prototype.updateEditable=function(){this.EDITABLE&&this.sourceBlock_&&(this.sourceBlock_.isEditable()?(Blockly.addClass_(this.fieldGroup_,"blocklyEditableText"),Blockly.removeClass_(this.fieldGroup_,"blocklyNoNEditableText"),this.fieldGroup_.style.cursor=this.CURSOR):(Blockly.addClass_(this.fieldGroup_,"blocklyNonEditableText"),Blockly.removeClass_(this.fieldGroup_,"blocklyEditableText"),this.fieldGroup_.style.cursor=""))};Blockly.Field.prototype.isVisible=function(){return this.visible_};
-Blockly.Field.prototype.setVisible=function(a){if(this.visible_!=a){this.visible_=a;var b=this.getSvgRoot();b&&(b.style.display=a?"block":"none",this.render_())}};Blockly.Field.prototype.setValidator=function(a){this.validator_=a};Blockly.Field.prototype.getValidator=function(){return this.validator_};Blockly.Field.prototype.getSvgRoot=function(){return this.fieldGroup_};
+Blockly.Field.prototype.setVisible=function(a){if(this.visible_!=a){this.visible_=a;var b=this.getSvgRoot();b&&(b.style.display=a?"block":"none",this.render_())}};Blockly.Field.prototype.setValidator=function(a){this.validator_=a};Blockly.Field.prototype.getValidator=function(){return this.validator_};
+Blockly.Field.prototype.callValidator=function(a){for(var b=[this.getValidator()],c=this.constructor;c;)b.unshift(c.classValidator),c=c.superClass_;for(c=0;cthis.maxDisplayLength&&(a=a.substring(0,this.maxDisplayLength-2)+"\u2026");goog.dom.removeChildren(this.textElement_);a=a.replace(/\s/g,Blockly.Field.NBSP);this.sourceBlock_.RTL&&a&&(a+="\u200f");a||(a=Blockly.Field.NBSP);a=document.createTextNode(a);this.textElement_.appendChild(a);this.size_.width=0}};Blockly.Field.prototype.getValue=function(){return this.getText()};
Blockly.Field.prototype.setValue=function(a){if(null!==a){var b=this.getValue();b!=a&&(this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.Change(this.sourceBlock_,"field",this.name,b,a)),this.setText(a))}};
-Blockly.Field.prototype.onMouseUp_=function(a){if(!goog.userAgent.IPHONE&&!goog.userAgent.IPAD||goog.userAgent.isVersionOrHigher("537.51.2")||0===a.layerX||0===a.layerY)Blockly.isRightButton(a)||Blockly.dragMode_!=Blockly.DRAG_FREE&&this.sourceBlock_.isEditable()&&this.showEditor_()};Blockly.Field.prototype.setTooltip=function(a){};Blockly.Field.prototype.getAbsoluteXY_=function(){return goog.style.getPageOffset(this.borderRect_)};Blockly.Tooltip={};Blockly.Tooltip.visible=!1;Blockly.Tooltip.LIMIT=50;Blockly.Tooltip.mouseOutPid_=0;Blockly.Tooltip.showPid_=0;Blockly.Tooltip.lastX_=0;Blockly.Tooltip.lastY_=0;Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.OFFSET_X=0;Blockly.Tooltip.OFFSET_Y=10;Blockly.Tooltip.RADIUS_OK=10;Blockly.Tooltip.HOVER_MS=750;Blockly.Tooltip.MARGINS=5;Blockly.Tooltip.DIV=null;
+Blockly.Field.prototype.onMouseUp_=function(a){if(!goog.userAgent.IPHONE&&!goog.userAgent.IPAD||goog.userAgent.isVersionOrHigher("537.51.2")||0===a.layerX||0===a.layerY)Blockly.isRightButton(a)||this.sourceBlock_.workspace.isDragging()||this.sourceBlock_.isEditable()&&this.showEditor_()};Blockly.Field.prototype.setTooltip=function(a){};Blockly.Field.prototype.getAbsoluteXY_=function(){return goog.style.getPageOffset(this.borderRect_)};Blockly.Tooltip={};Blockly.Tooltip.visible=!1;Blockly.Tooltip.LIMIT=50;Blockly.Tooltip.mouseOutPid_=0;Blockly.Tooltip.showPid_=0;Blockly.Tooltip.lastX_=0;Blockly.Tooltip.lastY_=0;Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.OFFSET_X=0;Blockly.Tooltip.OFFSET_Y=10;Blockly.Tooltip.RADIUS_OK=10;Blockly.Tooltip.HOVER_MS=750;Blockly.Tooltip.MARGINS=5;Blockly.Tooltip.DIV=null;
Blockly.Tooltip.createDom=function(){Blockly.Tooltip.DIV||(Blockly.Tooltip.DIV=goog.dom.createDom("div","blocklyTooltipDiv"),document.body.appendChild(Blockly.Tooltip.DIV))};Blockly.Tooltip.bindMouseEvents=function(a){Blockly.bindEvent_(a,"mouseover",null,Blockly.Tooltip.onMouseOver_);Blockly.bindEvent_(a,"mouseout",null,Blockly.Tooltip.onMouseOut_);Blockly.bindEvent_(a,"mousemove",null,Blockly.Tooltip.onMouseMove_)};
Blockly.Tooltip.onMouseOver_=function(a){for(a=a.target;!goog.isString(a.tooltip)&&!goog.isFunction(a.tooltip);)a=a.tooltip;Blockly.Tooltip.element_!=a&&(Blockly.Tooltip.hide(),Blockly.Tooltip.poisonedElement_=null,Blockly.Tooltip.element_=a);clearTimeout(Blockly.Tooltip.mouseOutPid_)};Blockly.Tooltip.onMouseOut_=function(a){Blockly.Tooltip.mouseOutPid_=setTimeout(function(){Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.hide()},1);clearTimeout(Blockly.Tooltip.showPid_)};
Blockly.Tooltip.onMouseMove_=function(a){if(Blockly.Tooltip.element_&&Blockly.Tooltip.element_.tooltip&&Blockly.dragMode_==Blockly.DRAG_NONE&&!Blockly.WidgetDiv.isVisible())if(Blockly.Tooltip.visible){var b=Blockly.Tooltip.lastX_-a.pageX;a=Blockly.Tooltip.lastY_-a.pageY;Math.sqrt(b*b+a*a)>Blockly.Tooltip.RADIUS_OK&&Blockly.Tooltip.hide()}else Blockly.Tooltip.poisonedElement_!=Blockly.Tooltip.element_&&(clearTimeout(Blockly.Tooltip.showPid_),Blockly.Tooltip.lastX_=a.pageX,Blockly.Tooltip.lastY_=a.pageY,
@@ -997,13 +998,13 @@ Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");fo
Blockly.Xml.textToDom=function(a){(a=(new DOMParser).parseFromString(a,"text/xml"))&&a.firstChild&&"xml"==a.firstChild.nodeName.toLowerCase()&&a.firstChild===a.lastChild||goog.asserts.fail("Blockly.Xml.textToDom did not obtain a valid XML tree.");return a.firstChild};
Blockly.Xml.domToWorkspace=function(a,b){if(a instanceof Blockly.Workspace){var c=a;a=b;b=c;console.warn("Deprecated call to Blockly.Xml.domToWorkspace, swap the arguments.")}var d;b.RTL&&(d=b.getWidth());Blockly.Field.startCache();var c=a.childNodes.length,e=Blockly.Events.getGroup();e||Blockly.Events.setGroup(!0);for(var f=0;f=this.remainingCapacity())){Blockly.terminateDrag_();Blockly.Events.disable();var b=Blockly.Xml.domToBlock(a,this),c=parseInt(a.getAttribute("x"),10);a=parseInt(a.getAttribute("y"),10);if(!isNaN(c)&&!isNaN(a)){this.RTL&&(c=-c);do{for(var d=!1,e=this.getAllBlocks(),f=0,g;g=e[f];f++)if(g=g.getRelativeToSurfaceXY(),1>=Math.abs(c-g.x)&&1>=Math.abs(a-g.y)){d=!0;break}if(!d)for(e=b.getConnections_(!1),
-f=0;g=e[f];f++)if(g.closest(Blockly.SNAP_RADIUS,new goog.math.Coordinate(c,a)).connection){d=!0;break}d&&(c=this.RTL?c-Blockly.SNAP_RADIUS:c+Blockly.SNAP_RADIUS,a+=2*Blockly.SNAP_RADIUS)}while(d);b.moveBy(c,a)}Blockly.Events.enable();Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new Blockly.Events.Create(b));b.select()}};
+Blockly.WorkspaceSvg.prototype.paste=function(a){if(this.rendered&&!(a.getElementsByTagName("block").length>=this.remainingCapacity())){Blockly.terminateDrag_();Blockly.Events.disable();try{var b=Blockly.Xml.domToBlock(a,this),c=parseInt(a.getAttribute("x"),10),d=parseInt(a.getAttribute("y"),10);if(!isNaN(c)&&!isNaN(d)){this.RTL&&(c=-c);do{a=!1;for(var e=this.getAllBlocks(),f=0,g;g=e[f];f++){var h=g.getRelativeToSurfaceXY();if(1>=Math.abs(c-h.x)&&1>=Math.abs(d-h.y)){a=!0;break}}if(!a)for(var k=b.getConnections_(!1),
+f=0,m;m=k[f];f++)if(m.closest(Blockly.SNAP_RADIUS,new goog.math.Coordinate(c,d)).connection){a=!0;break}a&&(c=this.RTL?c-Blockly.SNAP_RADIUS:c+Blockly.SNAP_RADIUS,d+=2*Blockly.SNAP_RADIUS)}while(a);b.moveBy(c,d)}}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new Blockly.Events.Create(b));b.select()}};
Blockly.WorkspaceSvg.prototype.recordDeleteAreas=function(){this.deleteAreaTrash_=this.trashcan?this.trashcan.getClientRect():null;this.deleteAreaToolbox_=this.flyout_?this.flyout_.getClientRect():this.toolbox_?this.toolbox_.getClientRect():null};
Blockly.WorkspaceSvg.prototype.isDeleteArea=function(a){a=new goog.math.Coordinate(a.clientX,a.clientY);if(this.deleteAreaTrash_){if(this.deleteAreaTrash_.contains(a))return this.trashcan.setOpen_(!0),Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;this.trashcan.setOpen_(!1)}if(this.deleteAreaToolbox_&&this.deleteAreaToolbox_.contains(a))return Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED);return!1};
Blockly.WorkspaceSvg.prototype.onMouseDown_=function(a){this.markFocused();Blockly.isTargetInput_(a)||(Blockly.terminateDrag_(),Blockly.hideChaff(),a.target&&a.target.nodeName&&("svg"==a.target.nodeName.toLowerCase()||a.target==this.svgBackground_)&&Blockly.selected&&!this.options.readOnly&&Blockly.selected.unselect(),Blockly.isRightButton(a)?this.showContextMenu_(a):this.scrollbar&&(this.isScrolling=!0,this.startDragMouseX=a.clientX,this.startDragMouseY=a.clientY,this.startDragMetrics=this.getMetrics(),
this.startScrollX=this.scrollX,this.startScrollY=this.scrollY,"mouseup"in Blockly.bindEvent_.TOUCH_MAP&&(Blockly.onTouchUpWrapper_=Blockly.onTouchUpWrapper_||[],Blockly.onTouchUpWrapper_=Blockly.onTouchUpWrapper_.concat(Blockly.bindEvent_(document,"mouseup",null,Blockly.onMouseUp_))),Blockly.onMouseMoveWrapper_=Blockly.onMouseMoveWrapper_||[],Blockly.onMouseMoveWrapper_=Blockly.onMouseMoveWrapper_.concat(Blockly.bindEvent_(document,"mousemove",null,Blockly.onMouseMove_))),a.stopPropagation(),a.preventDefault())};
Blockly.WorkspaceSvg.prototype.startDrag=function(a,b){var c=Blockly.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());c.x/=this.scale;c.y/=this.scale;this.dragDeltaXY_=goog.math.Coordinate.difference(b,c)};Blockly.WorkspaceSvg.prototype.moveDrag=function(a){a=Blockly.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return goog.math.Coordinate.sum(this.dragDeltaXY_,a)};
-Blockly.WorkspaceSvg.prototype.onMouseWheel_=function(a){Blockly.terminateDrag_();var b=0b.bottomRight.x&&(b.bottomRight.x=d.bottomRight.x);d.topLeft.yb.bottomRight.y&&(b.bottomRight.y=d.bottomRight.y)}return{x:b.topLeft.x,y:b.topLeft.y,width:b.bottomRight.x-
+Blockly.WorkspaceSvg.prototype.isDragging=function(){return Blockly.dragMode_==Blockly.DRAG_FREE||this.isScrolling};Blockly.WorkspaceSvg.prototype.onMouseWheel_=function(a){Blockly.terminateDrag_();var b=0b.bottomRight.x&&(b.bottomRight.x=d.bottomRight.x);d.topLeft.yb.bottomRight.y&&(b.bottomRight.y=d.bottomRight.y)}return{x:b.topLeft.x,y:b.topLeft.y,width:b.bottomRight.x-
b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp_=function(){Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);Blockly.resizeSvgContents(this)};
Blockly.WorkspaceSvg.prototype.showContextMenu_=function(a){function b(a){if(a.isDeletable())l=l.concat(a.getDescendants());else{a=a.getChildren();for(var c=0;c=b.height&&(k-=f.height);c?f.width>=a.clientX&&(g+=f.width):a.clientX+f.width>=b.width&&(g-=f.width);Blockly.WidgetDiv.position(g,k,b,e,c);d.setAllowAutoFocus(!0);setTimeout(function(){h.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()};
Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null};
-Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y);Blockly.Events.enable();Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.Create(c));c.select()}};Blockly.RenderedConnection=function(a,b){Blockly.RenderedConnection.superClass_.constructor.call(this,a,b);this.offsetInBlock_=new goog.math.Coordinate(0,0)};goog.inherits(Blockly.RenderedConnection,Blockly.Connection);Blockly.RenderedConnection.prototype.distanceFrom=function(a){var b=this.x_-a.x_;a=this.y_-a.y_;return Math.sqrt(b*b+a*a)};
+Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.Create(c));c.select()}};Blockly.RenderedConnection=function(a,b){Blockly.RenderedConnection.superClass_.constructor.call(this,a,b);this.offsetInBlock_=new goog.math.Coordinate(0,0)};goog.inherits(Blockly.RenderedConnection,Blockly.Connection);Blockly.RenderedConnection.prototype.distanceFrom=function(a){var b=this.x_-a.x_;a=this.y_-a.y_;return Math.sqrt(b*b+a*a)};
Blockly.RenderedConnection.prototype.bumpAwayFrom_=function(a){if(Blockly.dragMode_==Blockly.DRAG_NONE){var b=this.sourceBlock_.getRootBlock();if(!b.isInFlyout){var c=!1;if(!b.isMovable()){b=a.getSourceBlock().getRootBlock();if(!b.isMovable())return;a=this;c=!0}var d=Blockly.selected==b;d||b.select();var e=a.x_+Blockly.SNAP_RADIUS-this.x_;a=a.y_+Blockly.SNAP_RADIUS-this.y_;c&&(a=-a);b.RTL&&(e=-e);b.moveBy(e,a);d||b.unselect()}}};
Blockly.RenderedConnection.prototype.moveTo=function(a,b){this.inDB_&&this.db_.removeConnection_(this);this.x_=a;this.y_=b;this.hidden_||this.db_.addConnection(this)};Blockly.RenderedConnection.prototype.moveBy=function(a,b){this.moveTo(this.x_+a,this.y_+b)};Blockly.RenderedConnection.prototype.moveToOffset=function(a){this.moveTo(a.x+this.offsetInBlock_.x,a.y+this.offsetInBlock_.y)};
Blockly.RenderedConnection.prototype.setOffsetInBlock=function(a,b){this.offsetInBlock_.x=a;this.offsetInBlock_.y=b};Blockly.RenderedConnection.prototype.tighten_=function(){var a=this.targetConnection.x_-this.x_,b=this.targetConnection.y_-this.y_;if(0!=a||0!=b){var c=this.targetBlock(),d=c.getSvgRoot();if(!d)throw"block is not rendered.";d=Blockly.getRelativeXY_(d);c.getSvgRoot().setAttribute("transform","translate("+(d.x-a)+","+(d.y-b)+")");c.moveConnections_(-a,-b)}};
@@ -1120,13 +1121,14 @@ Blockly.RenderedConnection.prototype.closest=function(a,b,c){return this.dbOppos
Blockly.RenderedConnection.prototype.highlight=function(){var a;a=this.type==Blockly.INPUT_VALUE||this.type==Blockly.OUTPUT_VALUE?"m 0,0 "+Blockly.BlockSvg.TAB_PATH_DOWN+" v 5":"m -20,0 h 5 "+Blockly.BlockSvg.NOTCH_PATH_LEFT+" h 5";var b=this.sourceBlock_.getRelativeToSurfaceXY();Blockly.Connection.highlightedPath_=Blockly.createSvgElement("path",{"class":"blocklyHighlightedConnectionPath",d:a,transform:"translate("+(this.x_-b.x)+","+(this.y_-b.y)+")"+(this.sourceBlock_.RTL?" scale(-1 1)":"")},this.sourceBlock_.getSvgRoot())};
Blockly.RenderedConnection.prototype.unhideAll=function(){this.setHidden(!1);var a=[];if(this.type!=Blockly.INPUT_VALUE&&this.type!=Blockly.NEXT_STATEMENT)return a;var b=this.targetBlock();if(b){var c;b.isCollapsed()?(c=[],b.outputConnection&&c.push(b.outputConnection),b.nextConnection&&c.push(b.nextConnection),b.previousConnection&&c.push(b.previousConnection)):c=b.getConnections_(!0);for(var d=0;db?!1:Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this,a)};
+Blockly.RenderedConnection.prototype.hideAll=function(){this.setHidden(!0);if(this.targetConnection)for(var a=this.targetBlock().getDescendants(),b=0;bb?!1:Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this,a)};
Blockly.RenderedConnection.prototype.disconnectInternal_=function(a,b){Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this,a,b);a.rendered&&a.render();b.rendered&&(b.updateDisabled(),b.render())};
Blockly.RenderedConnection.prototype.respawnShadow_=function(){var a=this.getSourceBlock(),b=this.getShadowDom();if(a.workspace&&b&&Blockly.Events.recordUndo){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);b=this.targetBlock();if(!b)throw"Couldn't respawn the shadow block that should exist here.";b.initSvg();b.render(!1);a.rendered&&a.render()}};Blockly.RenderedConnection.prototype.neighbours_=function(a){return this.dbOpposite_.getNeighbours(this,a)};
Blockly.RenderedConnection.prototype.connect_=function(a){Blockly.RenderedConnection.superClass_.connect_.call(this,a);var b=this.getSourceBlock();a=a.getSourceBlock();b.rendered&&b.updateDisabled();a.rendered&&a.updateDisabled();b.rendered&&a.rendered&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render())};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.createSvgElement("g",{},null);this.svgPathDark_=Blockly.createSvgElement("path",{"class":"blocklyPathDark",transform:"translate(1,1)"},this.svgGroup_);this.svgPath_=Blockly.createSvgElement("path",{"class":"blocklyPath"},this.svgGroup_);this.svgPathLight_=Blockly.createSvgElement("path",{"class":"blocklyPathLight"},this.svgGroup_);this.svgPath_.tooltip=this;this.rendered=!1;Blockly.Tooltip.bindMouseEvents(this.svgPath_);Blockly.BlockSvg.superClass_.constructor.call(this,
a,b,c)};goog.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;Blockly.BlockSvg.prototype.dragStartXY_=null;Blockly.BlockSvg.INLINE=-1;
Blockly.BlockSvg.prototype.initSvg=function(){goog.asserts.assert(this.workspace.rendered,"Workspace is headless.");for(var a=0,b;b=this.inputList[a];a++)b.init();b=this.getIcons();for(a=0;ac;c+=15)Blockly.createSvgElement("line",{x1:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS,y1:Blockly.FieldAngle.HALF,x2:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS-
(0==c%45?10:5),y2:Blockly.FieldAngle.HALF,"class":"blocklyAngleMarks",transform:"rotate("+c+","+Blockly.FieldAngle.HALF+","+Blockly.FieldAngle.HALF+")"},a);a.style.marginLeft=15-Blockly.FieldAngle.RADIUS+"px";this.clickWrapper_=Blockly.bindEvent_(a,"click",this,Blockly.WidgetDiv.hide);this.moveWrapper1_=Blockly.bindEvent_(b,"mousemove",this,this.onMouseMove);this.moveWrapper2_=Blockly.bindEvent_(this.gauge_,"mousemove",this,this.onMouseMove);this.updateGraph_()}};
@@ -1253,40 +1253,37 @@ Blockly.FieldAngle.prototype.onMouseMove=function(a){var b=this.gauge_.ownerSVGE
b,this.setValue(b),this.validate_(),this.resizeEditor_())};Blockly.FieldAngle.prototype.setText=function(a){Blockly.FieldAngle.superClass_.setText.call(this,a);this.textElement_&&(this.updateGraph_(),this.sourceBlock_.RTL?this.textElement_.insertBefore(this.symbol_,this.textElement_.firstChild):this.textElement_.appendChild(this.symbol_),this.size_.width=0)};
Blockly.FieldAngle.prototype.updateGraph_=function(){if(this.gauge_){var a=Number(this.getText())+Blockly.FieldAngle.OFFSET,b=goog.math.toRadians(a),a=["M ",Blockly.FieldAngle.HALF,",",Blockly.FieldAngle.HALF],c=Blockly.FieldAngle.HALF,d=Blockly.FieldAngle.HALF;if(!isNaN(b)){var e=goog.math.toRadians(Blockly.FieldAngle.OFFSET),f=Math.cos(e)*Blockly.FieldAngle.RADIUS,g=Math.sin(e)*-Blockly.FieldAngle.RADIUS;Blockly.FieldAngle.CLOCKWISE&&(b=2*e-b);c+=Math.cos(b)*Blockly.FieldAngle.RADIUS;d-=Math.sin(b)*
Blockly.FieldAngle.RADIUS;b=Math.abs(Math.floor((b-e)/Math.PI)%2);Blockly.FieldAngle.CLOCKWISE&&(b=1-b);a.push(" l ",f,",",g," A ",Blockly.FieldAngle.RADIUS,",",Blockly.FieldAngle.RADIUS," 0 ",b," ",Number(Blockly.FieldAngle.CLOCKWISE)," ",c,",",d," z")}this.gauge_.setAttribute("d",a.join(""));this.line_.setAttribute("x2",c);this.line_.setAttribute("y2",d)}};
-Blockly.FieldAngle.angleValidator=function(a){if(null===a)return null;a=parseFloat(a||0);if(isNaN(a))return null;a%=360;0>a&&(a+=360);a>Blockly.FieldAngle.WRAP&&(a-=360);return String(a)};Blockly.FieldCheckbox=function(a,b){Blockly.FieldCheckbox.superClass_.constructor.call(this,"",b);this.setValue(a)};goog.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.CHECK_CHAR="\u2713";Blockly.FieldCheckbox.prototype.CURSOR="default";
+Blockly.FieldAngle.classValidator=function(a){if(null===a)return null;a=parseFloat(a||0);if(isNaN(a))return null;a%=360;0>a&&(a+=360);a>Blockly.FieldAngle.WRAP&&(a-=360);return String(a)};Blockly.FieldCheckbox=function(a,b){Blockly.FieldCheckbox.superClass_.constructor.call(this,"",b);this.setValue(a)};goog.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.CHECK_CHAR="\u2713";Blockly.FieldCheckbox.prototype.CURSOR="default";
Blockly.FieldCheckbox.prototype.init=function(){if(!this.fieldGroup_){Blockly.FieldCheckbox.superClass_.init.call(this);this.checkElement_=Blockly.createSvgElement("text",{"class":"blocklyText blocklyCheckbox",x:-3,y:14},this.fieldGroup_);var a=document.createTextNode(Blockly.FieldCheckbox.CHECK_CHAR);this.checkElement_.appendChild(a);this.checkElement_.style.display=this.state_?"block":"none"}};Blockly.FieldCheckbox.prototype.getValue=function(){return String(this.state_).toUpperCase()};
-Blockly.FieldCheckbox.prototype.setValue=function(a){a="TRUE"==a;this.state_!==a&&(this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.Change(this.sourceBlock_,"field",this.name,this.state_,a)),this.state_=a,this.checkElement_&&(this.checkElement_.style.display=a?"block":"none"))};Blockly.FieldCheckbox.prototype.showEditor_=function(){var a=!this.state_;if(this.sourceBlock_&&this.validator_){var b=this.validator_(a);void 0!==b&&(a=b)}null!==a&&this.setValue(String(a).toUpperCase())};Blockly.FieldColour=function(a,b){Blockly.FieldColour.superClass_.constructor.call(this,a,b);this.setText(Blockly.Field.NBSP+Blockly.Field.NBSP+Blockly.Field.NBSP)};goog.inherits(Blockly.FieldColour,Blockly.Field);Blockly.FieldColour.prototype.colours_=null;Blockly.FieldColour.prototype.columns_=0;Blockly.FieldColour.prototype.init=function(){Blockly.FieldColour.superClass_.init.call(this);this.borderRect_.style.fillOpacity=1;this.setValue(this.getValue())};Blockly.FieldColour.prototype.CURSOR="default";
+Blockly.FieldCheckbox.prototype.setValue=function(a){a="TRUE"==a;this.state_!==a&&(this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.Change(this.sourceBlock_,"field",this.name,this.state_,a)),this.state_=a,this.checkElement_&&(this.checkElement_.style.display=a?"block":"none"))};Blockly.FieldCheckbox.prototype.showEditor_=function(){var a=!this.state_;this.sourceBlock_&&(a=this.callValidator(a));null!==a&&this.setValue(String(a).toUpperCase())};Blockly.FieldColour=function(a,b){Blockly.FieldColour.superClass_.constructor.call(this,a,b);this.setText(Blockly.Field.NBSP+Blockly.Field.NBSP+Blockly.Field.NBSP)};goog.inherits(Blockly.FieldColour,Blockly.Field);Blockly.FieldColour.prototype.colours_=null;Blockly.FieldColour.prototype.columns_=0;Blockly.FieldColour.prototype.init=function(){Blockly.FieldColour.superClass_.init.call(this);this.borderRect_.style.fillOpacity=1;this.setValue(this.getValue())};Blockly.FieldColour.prototype.CURSOR="default";
Blockly.FieldColour.prototype.dispose=function(){Blockly.WidgetDiv.hideIfOwner(this);Blockly.FieldColour.superClass_.dispose.call(this)};Blockly.FieldColour.prototype.getValue=function(){return this.colour_};Blockly.FieldColour.prototype.setValue=function(a){this.sourceBlock_&&Blockly.Events.isEnabled()&&this.colour_!=a&&Blockly.Events.fire(new Blockly.Events.Change(this.sourceBlock_,"field",this.name,this.colour_,a));this.colour_=a;this.borderRect_&&(this.borderRect_.style.fill=a)};
Blockly.FieldColour.prototype.getText=function(){var a=this.colour_,b=a.match(/^#(.)\1(.)\2(.)\3$/);b&&(a="#"+b[1]+b[2]+b[3]);return a};Blockly.FieldColour.COLOURS=goog.ui.ColorPicker.SIMPLE_GRID_COLORS;Blockly.FieldColour.COLUMNS=7;Blockly.FieldColour.prototype.setColours=function(a){this.colours_=a;return this};Blockly.FieldColour.prototype.setColumns=function(a){this.columns_=a;return this};
Blockly.FieldColour.prototype.showEditor_=function(){Blockly.WidgetDiv.show(this,this.sourceBlock_.RTL,Blockly.FieldColour.widgetDispose_);var a=new goog.ui.ColorPicker;a.setSize(this.columns_||Blockly.FieldColour.COLUMNS);a.setColors(this.colours_||Blockly.FieldColour.COLOURS);var b=goog.dom.getViewportSize(),c=goog.style.getViewportPageOffset(document),d=this.getAbsoluteXY_(),e=this.getScaledBBox_();a.render(Blockly.WidgetDiv.DIV);a.setSelectedColor(this.getValue());var f=goog.style.getSize(a.getElement());
-d.y=d.y+f.height+e.height>=b.height+c.y?d.y-(f.height-1):d.y+(e.height-1);this.sourceBlock_.RTL?(d.x+=e.width,d.x-=f.width,d.xb.width+c.x-f.width&&(d.x=b.width+c.x-f.width);Blockly.WidgetDiv.position(d.x,d.y,b,c,this.sourceBlock_.RTL);var g=this;Blockly.FieldColour.changeEventKey_=goog.events.listen(a,goog.ui.ColorPicker.EventType.CHANGE,function(a){a=a.target.getSelectedColor()||"#000000";Blockly.WidgetDiv.hide();if(g.sourceBlock_&&g.validator_){var b=g.validator_(a);void 0!==
-b&&(a=b)}null!==a&&g.setValue(a)})};Blockly.FieldColour.widgetDispose_=function(){Blockly.FieldColour.changeEventKey_&&goog.events.unlistenByKey(Blockly.FieldColour.changeEventKey_)};Blockly.FieldDropdown=function(a,b){this.menuGenerator_=a;this.trimOptions_();var c=this.getOptions_()[0];Blockly.FieldDropdown.superClass_.constructor.call(this,c[1],b)};goog.inherits(Blockly.FieldDropdown,Blockly.Field);Blockly.FieldDropdown.CHECKMARK_OVERHANG=25;Blockly.FieldDropdown.ARROW_CHAR=goog.userAgent.ANDROID?"\u25bc":"\u25be";Blockly.FieldDropdown.prototype.CURSOR="default";
+d.y=d.y+f.height+e.height>=b.height+c.y?d.y-(f.height-1):d.y+(e.height-1);this.sourceBlock_.RTL?(d.x+=e.width,d.x-=f.width,d.xb.width+c.x-f.width&&(d.x=b.width+c.x-f.width);Blockly.WidgetDiv.position(d.x,d.y,b,c,this.sourceBlock_.RTL);var g=this;Blockly.FieldColour.changeEventKey_=goog.events.listen(a,goog.ui.ColorPicker.EventType.CHANGE,function(a){a=a.target.getSelectedColor()||"#000000";Blockly.WidgetDiv.hide();g.sourceBlock_&&(a=g.callValidator(a));null!==a&&g.setValue(a)})};
+Blockly.FieldColour.widgetDispose_=function(){Blockly.FieldColour.changeEventKey_&&goog.events.unlistenByKey(Blockly.FieldColour.changeEventKey_)};Blockly.FieldDropdown=function(a,b){this.menuGenerator_=a;this.trimOptions_();var c=this.getOptions_()[0];Blockly.FieldDropdown.superClass_.constructor.call(this,c[1],b)};goog.inherits(Blockly.FieldDropdown,Blockly.Field);Blockly.FieldDropdown.CHECKMARK_OVERHANG=25;Blockly.FieldDropdown.ARROW_CHAR=goog.userAgent.ANDROID?"\u25bc":"\u25be";Blockly.FieldDropdown.prototype.CURSOR="default";
Blockly.FieldDropdown.prototype.init=function(){if(!this.fieldGroup_){this.arrow_=Blockly.createSvgElement("tspan",{},null);this.arrow_.appendChild(document.createTextNode(this.sourceBlock_.RTL?Blockly.FieldDropdown.ARROW_CHAR+" ":" "+Blockly.FieldDropdown.ARROW_CHAR));Blockly.FieldDropdown.superClass_.init.call(this);var a=this.text_;this.text_=null;this.setText(a)}};
-Blockly.FieldDropdown.prototype.showEditor_=function(){Blockly.WidgetDiv.show(this,this.sourceBlock_.RTL,null);var a=this,b=new goog.ui.Menu;b.setRightToLeft(this.sourceBlock_.RTL);for(var c=this.getOptions_(),d=0;d=c.height+d.y?e.y-(h.height+2):e.y+f.height;this.sourceBlock_.RTL?(e.x+=f.width,e.x+=Blockly.FieldDropdown.CHECKMARK_OVERHANG,e.xc.width+d.x-h.width&&(e.x=c.width+d.x-h.width));Blockly.WidgetDiv.position(e.x,e.y,c,d,this.sourceBlock_.RTL);b.setAllowAutoFocus(!0);
-g.focus()};
-Blockly.FieldDropdown.prototype.trimOptions_=function(){this.suffixField=this.prefixField=null;var a=this.menuGenerator_;if(goog.isArray(a)&&!(2>a.length)){var b=a.map(function(a){return a[0]}),c=Blockly.shortestStringLength(b),d=Blockly.commonWordPrefix(b,c),e=Blockly.commonWordSuffix(b,c);if((d||e)&&!(c<=d+e)){d&&(this.prefixField=b[0].substring(0,d-1));e&&(this.suffixField=b[0].substr(1-e));b=[];for(c=0;c=c.height+d.y?e.y-(h.height+2):e.y+f.height;this.sourceBlock_.RTL?(e.x+=f.width,e.x+=Blockly.FieldDropdown.CHECKMARK_OVERHANG,e.xc.width+d.x-h.width&&(e.x=c.width+d.x-h.width));Blockly.WidgetDiv.position(e.x,e.y,c,d,this.sourceBlock_.RTL);b.setAllowAutoFocus(!0);g.focus()};
+Blockly.FieldDropdown.prototype.trimOptions_=function(){this.suffixField=this.prefixField=null;var a=this.menuGenerator_;if(goog.isArray(a)&&!(2>a.length)){var b=a.map(function(a){return a[0]}),c=Blockly.shortestStringLength(b),d=Blockly.commonWordPrefix(b,c),e=Blockly.commonWordSuffix(b,c);if((d||e)&&!(c<=d+e)){d&&(this.prefixField=b[0].substring(0,d-1));e&&(this.suffixField=b[0].substr(1-e));b=[];for(c=0;cb.contentWidth-b.viewWidth)){var c=a.clientX-this.startDragMouseX_;this.startDragMouseX_=a.clientX;a=b.viewLeft-c;a=goog.math.clamp(a,0,b.contentWidth-b.viewWidth);this.scrollbar_.set(a)}}else 0>b.contentHeight-b.viewHeight||(c=a.clientY-this.startDragMouseY_,this.startDragMouseY_=a.clientY,a=b.viewTop-c,a=goog.math.clamp(a,0,b.contentHeight-b.viewHeight),this.scrollbar_.set(a))};
-Blockly.Flyout.prototype.onMouseMoveBlock_=function(a){if("mousemove"==a.type&&1>=a.clientX&&0==a.clientY&&0==a.button)a.stopPropagation();else{var b=a.clientX-Blockly.Flyout.startDownEvent_.clientX;a=a.clientY-Blockly.Flyout.startDownEvent_.clientY;Math.sqrt(b*b+a*a)>Blockly.DRAG_RADIUS&&Blockly.Flyout.startFlyout_.createBlockFunc_(Blockly.Flyout.startBlock_)(Blockly.Flyout.startDownEvent_)}};
-Blockly.Flyout.prototype.createBlockFunc_=function(a){var b=this;return function(c){if(!Blockly.isRightButton(c)&&!a.disabled){Blockly.Events.disable();var d=b.placeNewBlock_(a);Blockly.Events.enable();Blockly.Events.isEnabled()&&(Blockly.Events.setGroup(!0),Blockly.Events.fire(new Blockly.Events.Create(d)));b.autoClose?b.hide():b.filterForCapacity_();d.onMouseDown_(c);Blockly.dragMode_=Blockly.DRAG_FREE;d.setDragging_(!0)}}};
+Blockly.Flyout.prototype.onMouseMoveBlock_=function(a){if(!("mousemove"==a.type&&1>=a.clientX&&0==a.clientY&&0==a.button))if(this.determineDragIntention_(a.clientX-Blockly.Flyout.startDownEvent_.clientX,a.clientY-Blockly.Flyout.startDownEvent_.clientY))this.createBlockFunc_(Blockly.Flyout.startBlock_)(Blockly.Flyout.startDownEvent_);else if(this.dragMode_==Blockly.DRAG_FREE)this.onMouseMove_(a);a.stopPropagation()};
+Blockly.Flyout.prototype.determineDragIntention_=function(a,b){if(this.dragMode_==Blockly.DRAG_FREE)return!1;if(Math.sqrt(a*a+b*b)90-e&&(d=!0):c>-90-e&&c<-90+e&&(d=!0);else if(this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT)c-e&&(d=!0);else if(c<-180+e||c>180-e)d=!0;return d};
+Blockly.Flyout.prototype.createBlockFunc_=function(a){var b=this;return function(c){if(!Blockly.isRightButton(c)&&!a.disabled){Blockly.Events.disable();try{var d=b.placeNewBlock_(a)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&(Blockly.Events.setGroup(!0),Blockly.Events.fire(new Blockly.Events.Create(d)));b.autoClose?b.hide():b.filterForCapacity_();d.onMouseDown_(c);Blockly.dragMode_=Blockly.DRAG_FREE;d.setDragging_(!0)}}};
Blockly.Flyout.prototype.placeNewBlock_=function(a){var b=this.targetWorkspace_,c=a.getSvgRoot();if(!c)throw"originBlock is not rendered.";var c=Blockly.getSvgXY_(c,b),d=this.workspace_.scrollX,e=this.workspace_.scale;c.x+=d/e-d;this.toolboxPosition_==Blockly.TOOLBOX_AT_RIGHT&&(d=b.getMetrics().viewWidth-this.width_,e=b.scale,c.x+=d/e-d);d=this.workspace_.scrollY;e=this.workspace_.scale;c.y+=d/e-d;this.toolboxPosition_==Blockly.TOOLBOX_AT_BOTTOM&&(d=b.getMetrics().viewHeight-this.height_,e=b.scale,
c.y+=d/e-d);a=Blockly.Xml.blockToDom(a);a=Blockly.Xml.domToBlock(a,b);e=a.getSvgRoot();if(!e)throw"block is not rendered.";e=Blockly.getSvgXY_(e,b);e.x+=b.scrollX/b.scale-b.scrollX;e.y+=b.scrollY/b.scale-b.scrollY;b.toolbox_&&!b.scrollbar&&(e.x+=b.toolbox_.getWidth()/b.scale,e.y+=b.toolbox_.getHeight()/b.scale);a.moveBy(c.x-e.x,c.y-e.y);return a};
Blockly.Flyout.prototype.filterForCapacity_=function(){for(var a=this.targetWorkspace_.remainingCapacity(),b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++)if(-1==this.permanentlyDisabled_.indexOf(d)){var e=d.getDescendants();d.setDisabled(e.length>a)}};
Blockly.Flyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.left,c=a.top,d=a.width,a=a.height;return this.toolboxPosition_==Blockly.TOOLBOX_AT_TOP?new goog.math.Rect(-1E9,c-1E9,2E9,1E9+a):this.toolboxPosition_==Blockly.TOOLBOX_AT_BOTTOM?new goog.math.Rect(-1E9,c,2E9,1E9+a):this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?new goog.math.Rect(b-1E9,-1E9,1E9+d,2E9):new goog.math.Rect(b,-1E9,1E9+d,2E9)};
-Blockly.Flyout.terminateDrag_=function(){Blockly.Flyout.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_),Blockly.Flyout.onMouseUpWrapper_=null);Blockly.Flyout.onMouseMoveBlockWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveBlockWrapper_),Blockly.Flyout.onMouseMoveBlockWrapper_=null);Blockly.Flyout.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveWrapper_),Blockly.Flyout.onMouseMoveWrapper_=null);Blockly.Flyout.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_),
-Blockly.Flyout.onMouseUpWrapper_=null);Blockly.Flyout.startDownEvent_=null;Blockly.Flyout.startBlock_=null;Blockly.Flyout.startFlyout_=null};
+Blockly.Flyout.terminateDrag_=function(){Blockly.Flyout.startFlyout_&&(Blockly.Flyout.startFlyout_.dragMode_=Blockly.DRAG_NONE);Blockly.Flyout.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_),Blockly.Flyout.onMouseUpWrapper_=null);Blockly.Flyout.onMouseMoveBlockWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveBlockWrapper_),Blockly.Flyout.onMouseMoveBlockWrapper_=null);Blockly.Flyout.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveWrapper_),
+Blockly.Flyout.onMouseMoveWrapper_=null);Blockly.Flyout.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_),Blockly.Flyout.onMouseUpWrapper_=null);Blockly.Flyout.startDownEvent_=null;Blockly.Flyout.startBlock_=null;Blockly.Flyout.startFlyout_=null};
Blockly.Flyout.prototype.reflowHorizontal=function(a){this.workspace_.scale=this.targetWorkspace_.scale;for(var b=0,c=0,d;d=a[c];c++)b=Math.max(b,d.getHeightWidth().height);b+=1.5*this.MARGIN;b*=this.workspace_.scale;b+=Blockly.Scrollbar.scrollbarThickness;if(this.height_!=b){for(c=0;d=a[c];c++){var e=d.getHeightWidth();if(d.flyoutRect_){d.flyoutRect_.setAttribute("width",e.width);d.flyoutRect_.setAttribute("height",e.height);var f=d.outputConnection?Blockly.BlockSvg.TAB_WIDTH:0,g=d.getRelativeToSurfaceXY();
d.flyoutRect_.setAttribute("y",g.y);d.flyoutRect_.setAttribute("x",this.RTL?g.x-e.width+f:g.x-f);(e=d.startHat_?Blockly.BlockSvg.START_HAT_HEIGHT:0)&&d.moveBy(0,e);d.flyoutRect_.setAttribute("y",g.y)}}this.height_=b;this.targetWorkspace_.resize()}};
Blockly.Flyout.prototype.reflowVertical=function(a){this.workspace_.scale=this.targetWorkspace_.scale;for(var b=0,c=0,d;d=a[c];c++){var e=d.getHeightWidth().width;d.outputConnection&&(e-=Blockly.BlockSvg.TAB_WIDTH);b=Math.max(b,e)}b+=1.5*this.MARGIN+Blockly.BlockSvg.TAB_WIDTH;b*=this.workspace_.scale;b+=Blockly.Scrollbar.scrollbarThickness;if(this.width_!=b){for(c=0;d=a[c];c++){e=d.getHeightWidth();if(this.RTL){var f=d.getRelativeToSurfaceXY().x,g=b/this.workspace_.scale-this.MARGIN,g=g-Blockly.BlockSvg.TAB_WIDTH;
@@ -1346,10 +1346,10 @@ Blockly.Toolbox.prototype.init=function(){var a=this.workspace_;this.HtmlDiv=goo
toolboxPosition:a.options.toolboxPosition});goog.dom.insertSiblingAfter(this.flyout_.createDom(),a.svgGroup_);this.flyout_.init(a);this.config_.cleardotPath=a.options.pathToMedia+"1x1.gif";this.config_.cssCollapsedFolderIcon="blocklyTreeIconClosed"+(a.RTL?"Rtl":"Ltr");var b=new Blockly.Toolbox.TreeControl(this,this.config_);this.tree_=b;b.setShowRootNode(!1);b.setShowLines(!1);b.setShowExpandIcons(!1);b.setSelectedItem(null);this.populate_(a.options.languageTree);b.render(this.HtmlDiv);this.addColour_();
this.position()};Blockly.Toolbox.prototype.dispose=function(){this.flyout_.dispose();this.tree_.dispose();goog.dom.removeNode(this.HtmlDiv);this.lastCategory_=this.workspace_=null};Blockly.Toolbox.prototype.getWidth=function(){return this.width};Blockly.Toolbox.prototype.getHeight=function(){return this.height};
Blockly.Toolbox.prototype.position=function(){var a=this.HtmlDiv;if(a){var b=this.workspace_.getParentSvg(),c=goog.style.getPageOffset(b),b=Blockly.svgSize(b);this.horizontalLayout_?(a.style.left=c.x+"px",a.style.height="auto",a.style.width=b.width+"px",this.height=a.offsetHeight,a.style.top=this.toolboxPosition==Blockly.TOOLBOX_AT_TOP?c.y+"px":c.y+b.height-a.offsetHeight+"px"):(a.style.left=this.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT?c.x+b.width-a.offsetWidth+"px":c.x+"px",a.style.height=b.height+
-"px",a.style.top=c.y+"px",this.width=a.offsetWidth,this.toolboxPosition==Blockly.TOOLBOX_AT_LEFT&&--this.width);this.flyout_.position()}};
-Blockly.Toolbox.prototype.populate_=function(a){function b(a,g,h){for(var k=null,m=0,p;p=a.childNodes[m];m++)if(p.tagName)switch(p.tagName.toUpperCase()){case "CATEGORY":k=c.createNode(p.getAttribute("name"));k.blocks=[];g.add(k);var l=p.getAttribute("custom");l?k.blocks=l:b(p,k,h);l=p.getAttribute("colour");goog.isString(l)?(l.match(/^#[0-9a-fA-F]{6}$/)?k.hexColour=l:k.hexColour=Blockly.hueToRgb(l),e=!0):k.hexColour="";"true"==p.getAttribute("expanded")?(k.blocks.length&&c.setSelectedItem(k),k.setExpanded(!0)):
-k.setExpanded(!1);k=p;break;case "SEP":k&&("CATEGORY"==k.tagName.toUpperCase()?g.add(new Blockly.Toolbox.TreeSeparator(d.treeSeparatorConfig_)):(p=parseFloat(p.getAttribute("gap")),isNaN(p)||(l=parseFloat(k.getAttribute("gap")),p=isNaN(l)?p:l+p,k.setAttribute("gap",p))));break;case "BLOCK":case "SHADOW":g.blocks.push(p),k=p}}var c=this.tree_,d=this;c.removeChildren();c.blocks=[];var e=!1;b(a,this.tree_,this.workspace_.options.pathToMedia);this.hasColours_=e;if(c.blocks.length)throw"Toolbox cannot have both blocks and categories in the root level.";
-Blockly.resizeSvgContents(this.workspace_)};Blockly.Toolbox.prototype.addColour_=function(a){a=(a||this.tree_).getChildren();for(var b=0,c;c=a[b];b++){var d=c.getRowElement();if(d){var e=this.hasColours_?"8px solid "+(c.hexColour||"#ddd"):"none";this.workspace_.RTL?d.style.borderRight=e:d.style.borderLeft=e}this.addColour_(c)}};Blockly.Toolbox.prototype.clearSelection=function(){this.tree_.setSelectedItem(null)};
+"px",a.style.top=c.y+"px",this.width=a.offsetWidth,this.toolboxPosition==Blockly.TOOLBOX_AT_LEFT&&--this.width);this.flyout_.position()}};Blockly.Toolbox.prototype.populate_=function(a){this.tree_.removeChildren();this.tree_.blocks=[];this.hasColours_=!1;this.syncTrees_(a,this.tree_,this.workspace_.options.pathToMedia);if(this.tree_.blocks.length)throw"Toolbox cannot have both blocks and categories in the root level.";Blockly.resizeSvgContents(this.workspace_)};
+Blockly.Toolbox.prototype.syncTrees_=function(a,b,c){for(var d=null,e=0,f;f=a.childNodes[e];e++)if(f.tagName)switch(f.tagName.toUpperCase()){case "CATEGORY":d=this.tree_.createNode(f.getAttribute("name"));d.blocks=[];b.add(d);var g=f.getAttribute("custom");g?d.blocks=g:this.syncTrees_(f,d,c);g=f.getAttribute("colour");goog.isString(g)?(g.match(/^#[0-9a-fA-F]{6}$/)?d.hexColour=g:d.hexColour=Blockly.hueToRgb(g),this.hasColours_=!0):d.hexColour="";"true"==f.getAttribute("expanded")?(d.blocks.length&&
+this.tree_.setSelectedItem(d),d.setExpanded(!0)):d.setExpanded(!1);d=f;break;case "SEP":d&&("CATEGORY"==d.tagName.toUpperCase()?b.add(new Blockly.Toolbox.TreeSeparator(this.treeSeparatorConfig_)):(f=parseFloat(f.getAttribute("gap")),isNaN(f)||(g=parseFloat(d.getAttribute("gap")),f=isNaN(g)?f:g+f,d.setAttribute("gap",f))));break;case "BLOCK":case "SHADOW":b.blocks.push(f),d=f}};
+Blockly.Toolbox.prototype.addColour_=function(a){a=(a||this.tree_).getChildren();for(var b=0,c;c=a[b];b++){var d=c.getRowElement();if(d){var e=this.hasColours_?"8px solid "+(c.hexColour||"#ddd"):"none";this.workspace_.RTL?d.style.borderRight=e:d.style.borderLeft=e}this.addColour_(c)}};Blockly.Toolbox.prototype.clearSelection=function(){this.tree_.setSelectedItem(null)};
Blockly.Toolbox.prototype.getClientRect=function(){if(!this.HtmlDiv)return null;var a=this.HtmlDiv.getBoundingClientRect(),b=a.left,c=a.top,d=a.width,a=a.height;return this.toolboxPosition==Blockly.TOOLBOX_AT_LEFT?new goog.math.Rect(-1E7,-1E7,1E7+b+d,2E7):this.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT?new goog.math.Rect(b,-1E7,1E7+d,2E7):this.toolboxPosition==Blockly.TOOLBOX_AT_TOP?new goog.math.Rect(-1E7,-1E7,2E7,1E7+c+a):new goog.math.Rect(0,c,2E7,1E7+d)};
Blockly.Toolbox.TreeControl=function(a,b){this.toolbox_=a;goog.ui.tree.TreeControl.call(this,goog.html.SafeHtml.EMPTY,b)};goog.inherits(Blockly.Toolbox.TreeControl,goog.ui.tree.TreeControl);Blockly.Toolbox.TreeControl.prototype.enterDocument=function(){Blockly.Toolbox.TreeControl.superClass_.enterDocument.call(this);if(goog.events.BrowserFeature.TOUCH_ENABLED){var a=this.getElement();Blockly.bindEvent_(a,goog.events.EventType.TOUCHSTART,this,this.handleTouchEvent_)}};
Blockly.Toolbox.TreeControl.prototype.handleTouchEvent_=function(a){a.preventDefault();var b=this.getNodeFromEvent_(a);b&&a.type===goog.events.EventType.TOUCHSTART&&setTimeout(function(){b.onMouseDown(a)},1)};Blockly.Toolbox.TreeControl.prototype.createNode=function(a){return new Blockly.Toolbox.TreeNode(this.toolbox_,a?goog.html.SafeHtml.htmlEscape(a):goog.html.SafeHtml.EMPTY,this.getConfig(),this.getDomHelper())};
@@ -1412,8 +1412,8 @@ Blockly.onMouseUp_=function(a){a=Blockly.getMainWorkspace();Blockly.Css.setCurso
Blockly.onMouseMove_=function(a){if(!(a.touches&&2<=a.touches.length)){var b=Blockly.getMainWorkspace();if(b.isScrolling){var c=a.clientX-b.startDragMouseX,d=a.clientY-b.startDragMouseY,e=b.startDragMetrics,f=b.startScrollX+c,g=b.startScrollY+d,f=Math.min(f,-e.contentLeft),g=Math.min(g,-e.contentTop),f=Math.max(f,e.viewWidth-e.contentLeft-e.contentWidth),g=Math.max(g,e.viewHeight-e.contentTop-e.contentHeight);b.scrollbar.set(-f-e.contentLeft,-g-e.contentTop);Math.sqrt(c*c+d*d)>Blockly.DRAG_RADIUS&&
Blockly.longStop_();a.stopPropagation();a.preventDefault()}}};
Blockly.onKeyDown_=function(a){if(!Blockly.mainWorkspace.options.readOnly&&!Blockly.isTargetInput_(a)){var b=!1;if(27==a.keyCode)Blockly.hideChaff();else if(8==a.keyCode||46==a.keyCode)a.preventDefault(),Blockly.selected&&Blockly.selected.isDeletable()&&(b=!0);else if(a.altKey||a.ctrlKey||a.metaKey)Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&(67==a.keyCode?(Blockly.hideChaff(),Blockly.copy_(Blockly.selected)):88==a.keyCode&&(Blockly.copy_(Blockly.selected),b=!0)),
-86==a.keyCode?Blockly.clipboardXml_&&Blockly.clipboardSource_.paste(Blockly.clipboardXml_):90==a.keyCode&&(Blockly.hideChaff(),Blockly.mainWorkspace.undo(a.shiftKey));b&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(Blockly.dragMode_!=Blockly.DRAG_FREE,!0),Blockly.highlightedConnection_&&(Blockly.highlightedConnection_.unhighlight(),Blockly.highlightedConnection_=null),Blockly.Events.setGroup(!1))}};Blockly.terminateDrag_=function(){Blockly.BlockSvg.terminateDrag();Blockly.Flyout.terminateDrag_()};
-Blockly.longPid_=0;Blockly.longStart_=function(a,b){Blockly.longStop_();Blockly.longPid_=setTimeout(function(){a.button=2;b.onMouseDown_(a)},Blockly.LONGPRESS)};Blockly.longStop_=function(){Blockly.longPid_&&(clearTimeout(Blockly.longPid_),Blockly.longPid_=0)};
+86==a.keyCode?Blockly.clipboardXml_&&(Blockly.Events.setGroup(!0),Blockly.clipboardSource_.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1)):90==a.keyCode&&(Blockly.hideChaff(),Blockly.mainWorkspace.undo(a.shiftKey));b&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(Blockly.dragMode_!=Blockly.DRAG_FREE,!0),Blockly.highlightedConnection_&&(Blockly.highlightedConnection_.unhighlight(),Blockly.highlightedConnection_=null),Blockly.Events.setGroup(!1))}};
+Blockly.terminateDrag_=function(){Blockly.BlockSvg.terminateDrag();Blockly.Flyout.terminateDrag_()};Blockly.longPid_=0;Blockly.longStart_=function(a,b){Blockly.longStop_();Blockly.longPid_=setTimeout(function(){a.button=2;b.onMouseDown_(a)},Blockly.LONGPRESS)};Blockly.longStop_=function(){Blockly.longPid_&&(clearTimeout(Blockly.longPid_),Blockly.longPid_=0)};
Blockly.copy_=function(a){var b=Blockly.Xml.blockToDom(a);Blockly.dragMode_!=Blockly.DRAG_FREE&&Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y);Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace};Blockly.duplicate_=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c};
Blockly.onContextMenu_=function(a){Blockly.isTargetInput_(a)||a.preventDefault()};Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();a||(a=Blockly.getMainWorkspace(),a.toolbox_&&a.toolbox_.flyout_&&a.toolbox_.flyout_.autoClose&&a.toolbox_.clearSelection())};
Blockly.getMainWorkspaceMetrics_=function(){var a=Blockly.svgSize(this.getParentSvg());if(this.toolbox_)if(this.toolboxPosition==Blockly.TOOLBOX_AT_TOP||this.toolboxPosition==Blockly.TOOLBOX_AT_BOTTOM)a.height-=this.toolbox_.getHeight();else if(this.toolboxPosition==Blockly.TOOLBOX_AT_LEFT||this.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT)a.width-=this.toolbox_.getWidth();var b=Blockly.Flyout.prototype.CORNER_RADIUS-1,c=a.width-b,d=a.height-b,e=this.getBlocksBoundingBox(),f=e.width*this.scale,g=e.height*
diff --git a/blocks_compressed.js b/blocks_compressed.js
index 042a84ad0..7c9504022 100644
--- a/blocks_compressed.js
+++ b/blocks_compressed.js
@@ -83,29 +83,30 @@ Blockly.Blocks.math_constrain={init:function(){this.jsonInit({message0:Blockly.M
Blockly.Blocks.math_random_int={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_RANDOM_INT_TITLE,args0:[{type:"input_value",name:"FROM",check:"Number"},{type:"input_value",name:"TO",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_RANDOM_INT_TOOLTIP,helpUrl:Blockly.Msg.MATH_RANDOM_INT_HELPURL})}};
Blockly.Blocks.math_random_float={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP,helpUrl:Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL})}};Blockly.Blocks.procedures={};Blockly.Blocks.procedures.HUE=290;
Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);this.setColour(Blockly.Blocks.procedures.HUE);
-this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},validate:function(){var a=Blockly.Procedures.findLegalName(this.getFieldValue("NAME"),this);this.setFieldValue(a,"NAME")},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK",
-"RETURN")):this.removeInput("STACK",!0),this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c=0;cc&&(a=a+" - "+-c,g=Blockly.Dart.ORDER_ADDITIVE);d&&(a=
+c?"-("+a+")":"-"+a,g=Blockly.Dart.ORDER_UNARY_PREFIX);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.Dart.colour={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Dart.ORDER_ATOMIC]};
Blockly.Dart.colour_random=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_random",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"() {"," String hex = '0123456789abcdef';"," var rnd = new Math.Random();"," return '#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}';","}"])+"()",Blockly.Dart.ORDER_UNARY_POSTFIX]};
Blockly.Dart.colour_rgb=function(a){var b=Blockly.Dart.valueToCode(a,"RED",Blockly.Dart.ORDER_NONE)||0,c=Blockly.Dart.valueToCode(a,"GREEN",Blockly.Dart.ORDER_NONE)||0;a=Blockly.Dart.valueToCode(a,"BLUE",Blockly.Dart.ORDER_NONE)||0;Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_rgb",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(num r, num g, num b) {"," num rn = (Math.max(Math.min(r, 1), 0) * 255).round();"," String rs = rn.toInt().toRadixString(16);",
" rs = '0$rs';"," rs = rs.substring(rs.length - 2);"," num gn = (Math.max(Math.min(g, 1), 0) * 255).round();"," String gs = gn.toInt().toRadixString(16);"," gs = '0$gs';"," gs = gs.substring(gs.length - 2);"," num bn = (Math.max(Math.min(b, 1), 0) * 255).round();"," String bs = bn.toInt().toRadixString(16);"," bs = '0$bs';"," bs = bs.substring(bs.length - 2);"," return '#$rs$gs$bs';","}"])+"("+b+", "+c+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};
Blockly.Dart.colour_blend=function(a){var b=Blockly.Dart.valueToCode(a,"COLOUR1",Blockly.Dart.ORDER_NONE)||"'#000000'",c=Blockly.Dart.valueToCode(a,"COLOUR2",Blockly.Dart.ORDER_NONE)||"'#000000'";a=Blockly.Dart.valueToCode(a,"RATIO",Blockly.Dart.ORDER_NONE)||.5;Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_blend",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(String c1, String c2, num ratio) {"," ratio = Math.max(Math.min(ratio, 1), 0);",
" int r1 = int.parse('0x${c1.substring(1, 3)}');"," int g1 = int.parse('0x${c1.substring(3, 5)}');"," int b1 = int.parse('0x${c1.substring(5, 7)}');"," int r2 = int.parse('0x${c2.substring(1, 3)}');"," int g2 = int.parse('0x${c2.substring(3, 5)}');"," int b2 = int.parse('0x${c2.substring(5, 7)}');"," num rn = (r1 * (1 - ratio) + r2 * ratio).round();"," String rs = rn.toInt().toRadixString(16);"," num gn = (g1 * (1 - ratio) + g2 * ratio).round();"," String gs = gn.toInt().toRadixString(16);",
-" num bn = (b1 * (1 - ratio) + b2 * ratio).round();"," String bs = bn.toInt().toRadixString(16);"," rs = '0$rs';"," rs = rs.substring(rs.length - 2);"," gs = '0$gs';"," gs = gs.substring(gs.length - 2);"," bs = '0$bs';"," bs = bs.substring(bs.length - 2);"," return '#$rs$gs$bs';","}"])+"("+b+", "+c+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.lists={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.lists_create_empty=function(a){return["[]",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c direction * a.compareTo(b),',' "TEXT": (a, b) => direction * a.toString().compareTo(b.toString()),',' "IGNORE_CASE": '," (a, b) => direction * ",
+Blockly.Dart.lists_isEmpty=function(a){return[(Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_UNARY_POSTFIX)||"[]")+".isEmpty",Blockly.Dart.ORDER_UNARY_POSTFIX]};
+Blockly.Dart.lists_indexOf=function(a){var b="FIRST"==a.getFieldValue("END")?"indexOf":"lastIndexOf",c=Blockly.Dart.valueToCode(a,"FIND",Blockly.Dart.ORDER_NONE)||"''";a=(Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_UNARY_POSTFIX)||"[]")+"."+b+"("+c+")";return Blockly.Dart.ONE_BASED_INDEXING?[a+" + 1",Blockly.Dart.ORDER_ADDITIVE]:[a,Blockly.Dart.ORDER_UNARY_POSTFIX]};
+Blockly.Dart.lists_getIndex=function(a){function b(){var a=Blockly.Dart.variableDB_.getDistinctName("tmp_list",Blockly.Variables.NAME_TYPE),b="List "+a+" = "+e+";\n";e=a;return b}var c=a.getFieldValue("MODE")||"GET",d=a.getFieldValue("WHERE")||"FROM_START",e=Blockly.Dart.valueToCode(a,"VALUE","RANDOM"==d||"FROM_END"==d?Blockly.Dart.ORDER_NONE:Blockly.Dart.ORDER_UNARY_POSTFIX)||"[]";if(("RANDOM"!=d||"REMOVE"!=c)&&"FROM_END"!=d||e.match(/^\w+$/))switch(d){case "FIRST":if("GET"==c)return[e+".first",
+Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c)return[e+".removeAt(0)",Blockly.Dart.ORDER_UNARY_POSTFIX];if("REMOVE"==c)return e+".removeAt(0);\n";break;case "LAST":if("GET"==c)return[e+".last",Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c)return[e+".removeLast()",Blockly.Dart.ORDER_UNARY_POSTFIX];if("REMOVE"==c)return e+".removeLast();\n";break;case "FROM_START":d=Blockly.Dart.getAdjusted(a,"AT");if("GET"==c)return[e+"["+d+"]",Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c)return[e+
+".removeAt("+d+")",Blockly.Dart.ORDER_UNARY_POSTFIX];if("REMOVE"==c)return e+".removeAt("+d+");\n";break;case "FROM_END":d=Blockly.Dart.getAdjusted(a,"AT",1,!1,Blockly.Dart.ORDER_ADDITIVE);if("GET"==c)return[e+"["+e+".length - "+d+"]",Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c||"REMOVE"==c){a=e+".removeAt("+e+".length - "+d+")";if("GET_REMOVE"==c)return[a,Blockly.Dart.ORDER_UNARY_POSTFIX];if("REMOVE"==c)return a+";\n"}break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";
+if("REMOVE"==c)return c=Blockly.Dart.variableDB_.getDistinctName("tmp_x",Blockly.Variables.NAME_TYPE),"int "+c+" = new Math.Random().nextInt("+e+".length);\n"+(e+".removeAt("+c+");\n");if("GET"==c)return c=Blockly.Dart.provideFunction_("lists_get_random_item",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List my_list) {"," int x = new Math.Random().nextInt(my_list.length);"," return my_list[x];","}"]),[c+"("+e+")",Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c)return c=Blockly.Dart.provideFunction_("lists_remove_random_item",
+["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List my_list) {"," int x = new Math.Random().nextInt(my_list.length);"," return my_list.removeAt(x);","}"]),[c+"("+e+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}else{if("RANDOM"==d)return Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",a=b(),c=Blockly.Dart.variableDB_.getDistinctName("tmp_x",Blockly.Variables.NAME_TYPE),a+("int "+c+" = new Math.Random().nextInt("+e+".length);\n")+(e+".removeAt("+c+");\n");if("REMOVE"==c)return d=
+Blockly.Dart.getAdjusted(a,"AT",1,!1,Blockly.Dart.ORDER_ADDITIVE),a=b(),a+=e+".removeAt("+e+".length - "+d+");\n";if("GET"==c)return d=Blockly.Dart.getAdjusted(a,"AT",1),c=Blockly.Dart.provideFunction_("lists_get_from_end",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List my_list, num x) {"," x = my_list.length - x;"," return my_list[x];","}"]),[c+"("+e+", "+d+")",Blockly.Dart.ORDER_UNARY_POSTFIX];if("GET_REMOVE"==c)return d=Blockly.Dart.getAdjusted(a,"AT",1),c=Blockly.Dart.provideFunction_("lists_remove_from_end",
+["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List my_list, num x) {"," x = my_list.length - x;"," return my_list.removeAt(x);","}"]),[c+"("+e+", "+d+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}throw"Unhandled combination (lists_getIndex).";};
+Blockly.Dart.lists_setIndex=function(a){function b(){if(e.match(/^\w+$/))return"";var a=Blockly.Dart.variableDB_.getDistinctName("tmp_list",Blockly.Variables.NAME_TYPE),b="List "+a+" = "+e+";\n";e=a;return b}var c=a.getFieldValue("MODE")||"GET",d=a.getFieldValue("WHERE")||"FROM_START",e=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_UNARY_POSTFIX)||"[]",f=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_ASSIGNMENT)||"null";switch(d){case "FIRST":if("SET"==c)return e+"[0] = "+f+";\n";if("INSERT"==
+c)return e+".insert(0, "+f+");\n";break;case "LAST":if("SET"==c)return a=b(),a+(e+"["+e+".length - 1] = "+f+";\n");if("INSERT"==c)return e+".add("+f+");\n";break;case "FROM_START":d=Blockly.Dart.getAdjusted(a,"AT");if("SET"==c)return e+"["+d+"] = "+f+";\n";if("INSERT"==c)return e+".insert("+d+", "+f+");\n";break;case "FROM_END":d=Blockly.Dart.getAdjusted(a,"AT",1,!1,Blockly.Dart.ORDER_ADDITIVE);a=b();if("SET"==c)return a+(e+"["+e+".length - "+d+"] = "+f+";\n");if("INSERT"==c)return a+(e+".insert("+
+e+".length - "+d+", "+f+");\n");break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";a=b();d=Blockly.Dart.variableDB_.getDistinctName("tmp_x",Blockly.Variables.NAME_TYPE);a+="int "+d+" = new Math.Random().nextInt("+e+".length);\n";if("SET"==c)return a+(e+"["+d+"] = "+f+";\n");if("INSERT"==c)return a+(e+".insert("+d+", "+f+");\n")}throw"Unhandled combination (lists_setIndex).";};
+Blockly.Dart.lists_getSublist=function(a){var b=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_UNARY_POSTFIX)||"[]",c=a.getFieldValue("WHERE1"),d=a.getFieldValue("WHERE2");if(b.match(/^\w+$/)||"FROM_END"!=c&&"FROM_START"==d){switch(c){case "FROM_START":var e=Blockly.Dart.getAdjusted(a,"AT1");break;case "FROM_END":e=Blockly.Dart.getAdjusted(a,"AT1",1,!1,Blockly.Dart.ORDER_ADDITIVE);e=b+".length - "+e;break;case "FIRST":e="0";break;default:throw"Unhandled option (lists_getSublist).";}switch(d){case "FROM_START":var f=
+Blockly.Dart.getAdjusted(a,"AT2",1);break;case "FROM_END":f=Blockly.Dart.getAdjusted(a,"AT2",0,!1,Blockly.Dart.ORDER_ADDITIVE);f=b+".length - "+f;break;case "LAST":break;default:throw"Unhandled option (lists_getSublist).";}a="LAST"==d?b+".sublist("+e+")":b+".sublist("+e+", "+f+")"}else e=Blockly.Dart.getAdjusted(a,"AT1"),f=Blockly.Dart.getAdjusted(a,"AT2"),a=Blockly.Dart.provideFunction_("lists_get_sublist",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(list, where1, at1, where2, at2) {"," int getAt(where, at) {",
+" if (where == 'FROM_END') {"," at = list.length - 1 - at;"," } else if (where == 'FIRST') {"," at = 0;"," } else if (where == 'LAST') {"," at = list.length - 1;"," } else if (where != 'FROM_START') {"," throw 'Unhandled option (lists_getSublist).';"," }"," return at;"," }"," at1 = getAt(where1, at1);"," at2 = getAt(where2, at2) + 1;"," return list.sublist(at1, at2);","}"])+"("+b+", '"+c+"', "+e+", '"+d+"', "+f+")";return[a,Blockly.Dart.ORDER_UNARY_POSTFIX]};
+Blockly.Dart.lists_sort=function(a){var b=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]",c="1"===a.getFieldValue("DIRECTION")?1:-1;a=a.getFieldValue("TYPE");return[Blockly.Dart.provideFunction_("lists_sort",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(list, type, direction) {"," var compareFuncs = {",' "NUMERIC": (a, b) => direction * a.compareTo(b),',' "TEXT": (a, b) => direction * a.toString().compareTo(b.toString()),',' "IGNORE_CASE": '," (a, b) => direction * ",
" a.toString().toLowerCase().compareTo(b.toString().toLowerCase())"," };"," list = new List.from(list);"," var compare = compareFuncs[type];"," list.sort(compare);"," return list;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};
Blockly.Dart.lists_split=function(a){var b=Blockly.Dart.valueToCode(a,"INPUT",Blockly.Dart.ORDER_UNARY_POSTFIX),c=Blockly.Dart.valueToCode(a,"DELIM",Blockly.Dart.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="split";else if("JOIN"==a)b||(b="[]"),a="join";else throw"Unknown mode: "+a;return[b+"."+a+"("+c+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.logic={};Blockly.Dart.controls_if=function(a){for(var b=0,c=Blockly.Dart.valueToCode(a,"IF"+b,Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"+b),e="if ("+c+") {\n"+d+"}",b=1;b<=a.elseifCount_;b++)c=Blockly.Dart.valueToCode(a,"IF"+b,Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"+b),e+=" else if ("+c+") {\n"+d+"}";a.elseCount_&&(d=Blockly.Dart.statementToCode(a,"ELSE"),e+=" else {\n"+d+"}");return e+"\n"};
Blockly.Dart.logic_compare=function(a){var b={EQ:"==",NEQ:"!=",LT:"<",LTE:"<=",GT:">",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.Dart.ORDER_EQUALITY:Blockly.Dart.ORDER_RELATIONAL,d=Blockly.Dart.valueToCode(a,"A",c)||"0";a=Blockly.Dart.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]};
@@ -56,11 +61,11 @@ Blockly.Dart.math_number_property=function(a){var b=Blockly.Dart.valueToCode(a,"
Blockly.Dart.math_change=function(a){var b=Blockly.Dart.valueToCode(a,"DELTA",Blockly.Dart.ORDER_ADDITIVE)||"0";a=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" is num ? "+a+" : 0) + "+b+";\n"};Blockly.Dart.math_round=Blockly.Dart.math_single;Blockly.Dart.math_trig=Blockly.Dart.math_single;
Blockly.Dart.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]";switch(b){case "SUM":b=Blockly.Dart.provideFunction_("math_sum",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," num sumVal = 0;"," myList.forEach((num entry) {sumVal += entry;});"," return sumVal;","}"]);b=b+"("+a+")";break;case "MIN":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_min",
["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num minVal = myList[0];"," myList.forEach((num entry) {minVal = Math.min(minVal, entry);});"," return minVal;","}"]);b=b+"("+a+")";break;case "MAX":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_max",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num maxVal = myList[0];",
-" myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);});"," return maxVal;","}"]);b=b+"("+a+")";break;case "AVERAGE":b=Blockly.Dart.provideFunction_("math_mean",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," num sumVal = 0;"," localList.forEach((num entry) {sumVal += entry;});"," return sumVal / localList.length;",
-"}"]);b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Dart.provideFunction_("math_median",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only, then sort, then return middle value"," // or the average of two middle values if list has an even number of elements."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," localList.sort((a, b) => (a - b));"," int index = localList.length ~/ 2;",
+" myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);});"," return maxVal;","}"]);b=b+"("+a+")";break;case "AVERAGE":b=Blockly.Dart.provideFunction_("math_mean",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List localList = new List.from(myList);"," localList.removeWhere((a) => a is! num);"," if (localList.isEmpty) return null;"," num sumVal = 0;"," localList.forEach((num entry) {sumVal += entry;});"," return sumVal / localList.length;",
+"}"]);b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Dart.provideFunction_("math_median",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only, then sort, then return middle value"," // or the average of two middle values if list has an even number of elements."," List localList = new List.from(myList);"," localList.removeWhere((a) => a is! num);"," if (localList.isEmpty) return null;"," localList.sort((a, b) => (a - b));"," int index = localList.length ~/ 2;",
" if (localList.length % 2 == 1) {"," return localList[index];"," } else {"," return (localList[index - 1] + localList[index]) / 2;"," }","}"]);b=b+"("+a+")";break;case "MODE":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_modes",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List values) {"," List modes = [];"," List counts = [];"," int maxCount = 0;"," for (int i = 0; i < values.length; i++) {"," var value = values[i];",
" bool found = false;"," int thisCount;"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][0] == value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.add([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][1] == maxCount) {"," modes.add(counts[j][0]);"," }"," }"," return modes;",
-"}"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_standard_deviation",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List numbers = new List.from(myList);"," numbers.removeMatching((a) => a is! num);"," if (numbers.isEmpty) return null;"," num n = numbers.length;"," num sum = 0;"," numbers.forEach((x) => sum += x);"," num mean = sum / n;",
+"}"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_standard_deviation",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List numbers = new List.from(myList);"," numbers.removeWhere((a) => a is! num);"," if (numbers.isEmpty) return null;"," num n = numbers.length;"," num sum = 0;"," numbers.forEach((x) => sum += x);"," num mean = sum / n;",
" num sumSquare = 0;"," numbers.forEach((x) => sumSquare += Math.pow(x - mean, 2));"," return Math.sqrt(sumSquare / n);","}"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_random_item",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," int x = new Math.Random().nextInt(myList.length);"," return myList[x];","}"]);b=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[b,
Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_modulo=function(a){var b=Blockly.Dart.valueToCode(a,"DIVIDEND",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Dart.ORDER_MULTIPLICATIVE]};
Blockly.Dart.math_constrain=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_NONE)||"0",c=Blockly.Dart.valueToCode(a,"LOW",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"HIGH",Blockly.Dart.ORDER_NONE)||"double.INFINITY";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};
@@ -71,15 +76,17 @@ d+";\n");for(var e=d?"dynamic":"void",f=[],g=0;g list = str.split(exp);"," final title = new StringBuffer();"," for (String part in list) {"," if (part.length > 0) {",
-" title.write(part[0].toUpperCase());"," if (part.length > 0) {"," title.write(part.substring(1).toLowerCase());"," }"," }"," }"," return title.toString();","}"]),a=Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''",a=b+"("+a+")");return[a,Blockly.Dart.ORDER_UNARY_POSTFIX]};
+Blockly.Dart.text_join=function(a){switch(a.itemCount_){case 0:return["''",Blockly.Dart.ORDER_ATOMIC];case 1:return[(Blockly.Dart.valueToCode(a,"ADD0",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+".toString()",Blockly.Dart.ORDER_UNARY_POSTFIX];default:for(var b=Array(a.itemCount_),c=0;c list = str.split(exp);"," final title = new StringBuffer();"," for (String part in list) {",
+" if (part.length > 0) {"," title.write(part[0].toUpperCase());"," if (part.length > 0) {"," title.write(part.substring(1).toLowerCase());"," }"," }"," }"," return title.toString();","}"])+"("+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};
Blockly.Dart.text_trim=function(a){var b={LEFT:".replaceFirst(new RegExp(r'^\\s+'), '')",RIGHT:".replaceFirst(new RegExp(r'\\s+$'), '')",BOTH:".trim()"}[a.getFieldValue("MODE")];return[(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_print=function(a){return"print("+(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+");\n"};
Blockly.Dart.text_prompt_ext=function(a){Blockly.Dart.definitions_.import_dart_html="import 'dart:html' as Html;";var b="Html.window.prompt("+(a.getField("TEXT")?Blockly.Dart.quote_(a.getFieldValue("TEXT")):Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+", '')";"NUMBER"==a.getFieldValue("TYPE")&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",b="Math.parseDouble("+b+")");return[b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_prompt=Blockly.Dart.text_prompt_ext;Blockly.Dart.variables={};Blockly.Dart.variables_get=function(a){return[Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.variables_set=function(a){var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_ASSIGNMENT)||"0";return Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"};
\ No newline at end of file
diff --git a/javascript_compressed.js b/javascript_compressed.js
index ad00ad4be..aaf4a1560 100644
--- a/javascript_compressed.js
+++ b/javascript_compressed.js
@@ -11,28 +11,32 @@ Blockly.JavaScript.ORDER_OVERRIDES=[[Blockly.JavaScript.ORDER_FUNCTION_CALL,Bloc
Blockly.JavaScript.ORDER_ADDITION],[Blockly.JavaScript.ORDER_LOGICAL_AND,Blockly.JavaScript.ORDER_LOGICAL_AND],[Blockly.JavaScript.ORDER_LOGICAL_OR,Blockly.JavaScript.ORDER_LOGICAL_OR]];Blockly.JavaScript.ONE_BASED_INDEXING=!0;
Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.create(null);Blockly.JavaScript.functionNames_=Object.create(null);Blockly.JavaScript.variableDB_?Blockly.JavaScript.variableDB_.reset():Blockly.JavaScript.variableDB_=new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_);var b=[];a=Blockly.Variables.allVariables(a);if(a.length){for(var c=0;cc?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_SUBTRACTION)||f:d?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_UNARY_NEGATION)||f:Blockly.JavaScript.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=parseFloat(a)+
+c,d&&(a=-a);else{if(0c&&(a=a+" - "+-c,g=Blockly.JavaScript.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.JavaScript.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.JavaScript.colour={};Blockly.JavaScript.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.colour_random=function(a){return[Blockly.JavaScript.provideFunction_("colourRandom",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {"," var num = Math.floor(Math.random() * Math.pow(2, 24));"," return '#' + ('00000' + num.toString(16)).substr(-6);","}"])+"()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};
Blockly.JavaScript.colour_rgb=function(a){var b=Blockly.JavaScript.valueToCode(a,"RED",Blockly.JavaScript.ORDER_COMMA)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_COMMA)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_COMMA)||0;return[Blockly.JavaScript.provideFunction_("colourRgb",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b) {"," r = Math.max(Math.min(Number(r), 100), 0) * 2.55;"," g = Math.max(Math.min(Number(g), 100), 0) * 2.55;",
" b = Math.max(Math.min(Number(b), 100), 0) * 2.55;"," r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);"," g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);"," b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);"," return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};
Blockly.JavaScript.colour_blend=function(a){var b=Blockly.JavaScript.valueToCode(a,"COLOUR1",Blockly.JavaScript.ORDER_COMMA)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_COMMA)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_COMMA)||.5;return[Blockly.JavaScript.provideFunction_("colourBlend",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(c1, c2, ratio) {"," ratio = Math.max(Math.min(Number(ratio), 1), 0);"," var r1 = parseInt(c1.substring(1, 3), 16);",
" var g1 = parseInt(c1.substring(3, 5), 16);"," var b1 = parseInt(c1.substring(5, 7), 16);"," var r2 = parseInt(c2.substring(1, 3), 16);"," var g2 = parseInt(c2.substring(3, 5), 16);"," var b2 = parseInt(c2.substring(5, 7), 16);"," var r = Math.round(r1 * (1 - ratio) + r2 * ratio);"," var g = Math.round(g1 * (1 - ratio) + g2 * ratio);"," var b = Math.round(b1 * (1 - ratio) + b2 * ratio);"," r = ('0' + (r || 0).toString(16)).slice(-2);"," g = ('0' + (g || 0).toString(16)).slice(-2);"," b = ('0' + (b || 0).toString(16)).slice(-2);",
-" return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.lists={};Blockly.JavaScript.lists_create_empty=function(a){return["[]",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c b.toString() ? 1 : -1; },",
-' "IGNORE_CASE": function(a, b) {'," return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },"," };"," var compare = compareFuncs[type];"," return function(a, b) { return compare(a, b) * direction; }","}"]);return["("+b+").slice().sort("+d+'("'+a+'", '+c+"))",Blockly.JavaScript.ORDER_FUNCTION_CALL]};
+' "IGNORE_CASE": function(a, b) {'," return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },"," };"," var compare = compareFuncs[type];"," return function(a, b) { return compare(a, b) * direction; }","}"]);return[b+".slice().sort("+d+'("'+a+'", '+c+"))",Blockly.JavaScript.ORDER_FUNCTION_CALL]};
Blockly.JavaScript.lists_split=function(a){var b=Blockly.JavaScript.valueToCode(a,"INPUT",Blockly.JavaScript.ORDER_MEMBER),c=Blockly.JavaScript.valueToCode(a,"DELIM",Blockly.JavaScript.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="split";else if("JOIN"==a)b||(b="[]"),a="join";else throw"Unknown mode: "+a;return[b+"."+a+"("+c+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.logic={};
Blockly.JavaScript.controls_if=function(a){for(var b=0,c=Blockly.JavaScript.valueToCode(a,"IF"+b,Blockly.JavaScript.ORDER_NONE)||"false",d=Blockly.JavaScript.statementToCode(a,"DO"+b),e="if ("+c+") {\n"+d+"}",b=1;b<=a.elseifCount_;b++)c=Blockly.JavaScript.valueToCode(a,"IF"+b,Blockly.JavaScript.ORDER_NONE)||"false",d=Blockly.JavaScript.statementToCode(a,"DO"+b),e+=" else if ("+c+") {\n"+d+"}";a.elseCount_&&(d=Blockly.JavaScript.statementToCode(a,"ELSE"),e+=" else {\n"+d+"}");return e+"\n"};
Blockly.JavaScript.logic_compare=function(a){var b={EQ:"==",NEQ:"!=",LT:"<",LTE:"<=",GT:">",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.JavaScript.ORDER_EQUALITY:Blockly.JavaScript.ORDER_RELATIONAL,d=Blockly.JavaScript.valueToCode(a,"A",c)||"0";a=Blockly.JavaScript.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]};
@@ -71,16 +75,17 @@ Blockly.JavaScript.procedures_defreturn=function(a){var b=Blockly.JavaScript.var
Blockly.JavaScript.procedures_callreturn=function(a){for(var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=[],d=0;d",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Lua.valueToCode(a,"A",Blockly.Lua.ORDER_RELATIONAL)||"0";a=Blockly.Lua.valueToCode(a,"B",Blockly.Lua.ORDER_RELATIONAL)||"0";return[c+" "+b+" "+a,Blockly.Lua.ORDER_RELATIONAL]};
Blockly.Lua.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Lua.ORDER_AND:Blockly.Lua.ORDER_OR,d=Blockly.Lua.valueToCode(a,"A",c);a=Blockly.Lua.valueToCode(a,"B",c);if(d||a){var e="and"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Lua.logic_negate=function(a){return["not "+(Blockly.Lua.valueToCode(a,"BOOL",Blockly.Lua.ORDER_UNARY)||"true"),Blockly.Lua.ORDER_UNARY]};
Blockly.Lua.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_null=function(a){return["nil",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_ternary=function(a){var b=Blockly.Lua.valueToCode(a,"IF",Blockly.Lua.ORDER_AND)||"false",c=Blockly.Lua.valueToCode(a,"THEN",Blockly.Lua.ORDER_AND)||"nil";a=Blockly.Lua.valueToCode(a,"ELSE",Blockly.Lua.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,Blockly.Lua.ORDER_OR]};Blockly.Lua.loops={};Blockly.Lua.CONTINUE_STATEMENT="goto continue\n";Blockly.Lua.addContinueLabel=function(a){return-1c?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_SUBTRACTION)||g:d?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_UNARY_NEGATION)||g:Blockly.PHP.valueToCode(a,b,e)||g;if(Blockly.isNumber(a))a=parseFloat(a)+c,d&&(a=-a);else{if(0c&&
+(a=a+" - "+-c,f=Blockly.PHP.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,f=Blockly.PHP.ORDER_UNARY_NEGATION);f=Math.floor(f);e=Math.floor(e);f&&e>=f&&(a="("+a+")")}return a};Blockly.PHP.colour={};Blockly.PHP.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.colour_random=function(a){return[Blockly.PHP.provideFunction_("colour_random",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {"," return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);","}"])+"()",Blockly.PHP.ORDER_FUNCTION_CALL]};
+Blockly.PHP.colour_rgb=function(a){var b=Blockly.PHP.valueToCode(a,"RED",Blockly.PHP.ORDER_COMMA)||0,c=Blockly.PHP.valueToCode(a,"GREEN",Blockly.PHP.ORDER_COMMA)||0;a=Blockly.PHP.valueToCode(a,"BLUE",Blockly.PHP.ORDER_COMMA)||0;return[Blockly.PHP.provideFunction_("colour_rgb",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($r, $g, $b) {"," $r = round(max(min($r, 100), 0) * 2.55);"," $g = round(max(min($g, 100), 0) * 2.55);"," $b = round(max(min($b, 100), 0) * 2.55);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);",
+" $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);"," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
Blockly.PHP.colour_blend=function(a){var b=Blockly.PHP.valueToCode(a,"COLOUR1",Blockly.PHP.ORDER_COMMA)||"'#000000'",c=Blockly.PHP.valueToCode(a,"COLOUR2",Blockly.PHP.ORDER_COMMA)||"'#000000'";a=Blockly.PHP.valueToCode(a,"RATIO",Blockly.PHP.ORDER_COMMA)||.5;return[Blockly.PHP.provideFunction_("colour_blend",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($c1, $c2, $ratio) {"," $ratio = max(min($ratio, 1), 0);"," $r1 = hexdec(substr($c1, 1, 2));"," $g1 = hexdec(substr($c1, 3, 2));"," $b1 = hexdec(substr($c1, 5, 2));",
-" $r2 = hexdec(substr($c2, 1, 2));"," $g2 = hexdec(substr($c2, 3, 2));"," $b2 = hexdec(substr($c2, 5, 2));"," $r = round($r1 * (1 - $ratio) + $r2 * $ratio);"," $g = round($g1 * (1 - $ratio) + $g2 * $ratio);"," $b = round($b1 * (1 - $ratio) + $b2 * $ratio);",' $hex = "#";',' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);',' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);',' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);'," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists={};Blockly.PHP.lists_create_empty=function(a){return["array()",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c "strnatcasecmp",',' "TEXT" => "strcmp",',' "IGNORE_CASE" => "strcasecmp"'," );"," $sortCmp = $sortCmpFuncs[$type];"," $list2 = $list;",
-" usort($list2, $sortCmp);"," if ($direction == -1) {"," $list2 = array_reverse($list2);"," }"," return $list2;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
-Blockly.PHP.lists_split=function(a){var b=Blockly.PHP.valueToCode(a,"INPUT",Blockly.PHP.ORDER_MEMBER),c=Blockly.PHP.valueToCode(a,"DELIM",Blockly.PHP.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="explode";else if("JOIN"==a)b||(b="array()"),a="implode";else throw"Unknown mode: "+a;return[a+"("+c+", "+b+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.logic={};Blockly.PHP.controls_if=function(a){for(var b=0,c=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"+b),e="if ("+c+") {\n"+d+"}",b=1;b<=a.elseifCount_;b++)c=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"+b),e+=" else if ("+c+") {\n"+d+"}";a.elseCount_&&(d=Blockly.PHP.statementToCode(a,"ELSE"),e+=" else {\n"+d+"}");return e+"\n"};
+Blockly.PHP.lists_indexOf=function(a){var b=Blockly.PHP.valueToCode(a,"FIND",Blockly.PHP.ORDER_NONE)||"''",c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_MEMBER)||"[]";if(Blockly.PHP.ONE_BASED_INDEXING)var d=" 0",e=" + 1";else d=" -1",e="";return[("FIRST"==a.getFieldValue("END")?Blockly.PHP.provideFunction_("indexOf",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($haystack, $needle) {"," for ($index = 0; $index < count($haystack); $index++) {"," if ($haystack[$index] == $needle) return $index"+
+e+";"," }"," return "+d+";","}"]):Blockly.PHP.provideFunction_("lastIndexOf",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($haystack, $needle) {"," $last = "+d+";"," for ($index = 0; $index < count($haystack); $index++) {"," if ($haystack[$index] == $needle) $last = $index"+e+";"," }"," return $last;","}"]))+"("+c+", "+b+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
+Blockly.PHP.lists_getIndex=function(a){var b=a.getFieldValue("MODE")||"GET";switch(a.getFieldValue("WHERE")||"FROM_START"){case "FIRST":if("GET"==b){var c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_MEMBER)||"array()";return[c+"[0]",Blockly.PHP.ORDER_MEMBER]}if("GET_REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||"array()",["array_shift("+c+")",Blockly.PHP.ORDER_FUNCTION_CALL];if("REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||
+"array()","array_shift("+c+");\n";break;case "LAST":if("GET"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||"array()",["end("+c+")",Blockly.PHP.ORDER_FUNCTION_CALL];if("GET_REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||"array()",["array_pop("+c+")",Blockly.PHP.ORDER_FUNCTION_CALL];if("REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||"array()","array_pop("+c+");\n";break;case "FROM_START":var d=Blockly.PHP.getAdjusted(a,
+"AT");if("GET"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_MEMBER)||"array()",[c+"["+d+"]",Blockly.PHP.ORDER_MEMBER];if("GET_REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"array()",["array_splice("+c+", "+d+", 1)[0]",Blockly.PHP.ORDER_FUNCTION_CALL];if("REMOVE"==b)return c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"array()","array_splice("+c+", "+d+", 1);\n";break;case "FROM_END":if("GET"==b)return c=Blockly.PHP.valueToCode(a,
+"VALUE",Blockly.PHP.ORDER_COMMA)||"array()",d=Blockly.PHP.getAdjusted(a,"AT",1,!0),["array_slice("+c+", "+d+", 1)[0]",Blockly.PHP.ORDER_FUNCTION_CALL];if("GET_REMOVE"==b||"REMOVE"==b){c=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_NONE)||"array()";d=Blockly.PHP.getAdjusted(a,"AT",1,!1,Blockly.PHP.ORDER_SUBTRACTION);c="array_splice("+c+", count("+c+") - "+d+", 1)[0]";if("GET_REMOVE"==b)return[c,Blockly.PHP.ORDER_FUNCTION_CALL];if("REMOVE"==b)return c+";\n"}break;case "RANDOM":c=Blockly.PHP.valueToCode(a,
+"VALUE",Blockly.PHP.ORDER_NONE)||"array()";if("GET"==b)return b=Blockly.PHP.provideFunction_("lists_get_random_item",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list) {"," return $list[rand(0,count($list)-1)];","}"]),[b+"("+c+")",Blockly.PHP.ORDER_FUNCTION_CALL];if("GET_REMOVE"==b)return b=Blockly.PHP.provideFunction_("lists_get_remove_random_item",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"(&$list) {"," $x = rand(0,count($list)-1);"," unset($list[$x]);"," return array_values($list);",
+"}"]),[b+"("+c+")",Blockly.PHP.ORDER_FUNCTION_CALL];if("REMOVE"==b)return b=Blockly.PHP.provideFunction_("lists_remove_random_item",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"(&$list) {"," unset($list[rand(0,count($list)-1)]);","}"]),b+"("+c+");\n"}throw"Unhandled combination (lists_getIndex).";};
+Blockly.PHP.lists_setIndex=function(a){var b=a.getFieldValue("MODE")||"GET",c=a.getFieldValue("WHERE")||"FROM_START",d=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_ASSIGNMENT)||"null";switch(c){case "FIRST":if("SET"==b)return c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_MEMBER)||"array()",c+"[0] = "+d+";\n";if("INSERT"==b)return c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"array()","array_unshift("+c+", "+d+");\n";break;case "LAST":c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||
+"array()";if("SET"==b)return b=Blockly.PHP.provideFunction_("lists_set_last_item",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"(&$list, $value) {"," $list[count($list) - 1] = $value;","}"]),b+"("+c+", "+d+");\n";if("INSERT"==b)return"array_push("+c+", "+d+");\n";break;case "FROM_START":var e=Blockly.PHP.getAdjusted(a,"AT");if("SET"==b)return c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_MEMBER)||"array()",c+"["+e+"] = "+d+";\n";if("INSERT"==b)return c=Blockly.PHP.valueToCode(a,"LIST",
+Blockly.PHP.ORDER_COMMA)||"array()","array_splice("+c+", "+e+", 0, "+d+");\n";break;case "FROM_END":c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"array()";e=Blockly.PHP.getAdjusted(a,"AT",1);if("SET"==b)return b=Blockly.PHP.provideFunction_("lists_set_from_end",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"(&$list, $at, $value) {"," $list[count($list) - $at] = $value;","}"]),b+"("+c+", "+e+", "+d+");\n";if("INSERT"==b)return b=Blockly.PHP.provideFunction_("lists_insert_from_end",
+["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"(&$list, $at, $value) {"," return array_splice($list, count($list) - $at, 0, $value);","}"]),b+"("+c+", "+e+", "+d+");\n";break;case "RANDOM":c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_REFERENCE)||"array()";c.match(/^\$\w+$/)?a="":(a=Blockly.PHP.variableDB_.getDistinctName("tmp_list",Blockly.Variables.NAME_TYPE),e=a+" = &"+c+";\n",c=a,a=e);e=Blockly.PHP.variableDB_.getDistinctName("tmp_x",Blockly.Variables.NAME_TYPE);a+=e+" = rand(0, count("+
+c+")-1);\n";if("SET"==b)return a+(c+"["+e+"] = "+d+";\n");if("INSERT"==b)return a+("array_splice("+c+", "+e+", 0, "+d+");\n")}throw"Unhandled combination (lists_setIndex).";};
+Blockly.PHP.lists_getSublist=function(a){var b=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"array()",c=a.getFieldValue("WHERE1"),d=a.getFieldValue("WHERE2");if("FIRST"!=c||"LAST"!=d)if(b.match(/^\$\w+$/)||"FROM_END"!=c&&"FROM_START"==d){switch(c){case "FROM_START":var e=Blockly.PHP.getAdjusted(a,"AT1");break;case "FROM_END":e=Blockly.PHP.getAdjusted(a,"AT1",1,!1,Blockly.PHP.ORDER_SUBTRACTION);e="count("+b+") - "+e;break;case "FIRST":e="0";break;default:throw"Unhandled option (lists_getSublist).";
+}switch(d){case "FROM_START":a=Blockly.PHP.getAdjusted(a,"AT2",0,!1,Blockly.PHP.ORDER_SUBTRACTION);c=a+" - ";c=Blockly.isNumber(String(e))||String(e).match(/^\(.+\)$/)?c+e:c+("("+e+")");c+=" + 1";break;case "FROM_END":a=Blockly.PHP.getAdjusted(a,"AT2",0,!1,Blockly.PHP.ORDER_SUBTRACTION);c="count("+b+") - "+a+" - ";c=Blockly.isNumber(String(e))||String(e).match(/^\(.+\)$/)?c+e:c+("("+e+")");break;case "LAST":c="count("+b+") - ";c=Blockly.isNumber(String(e))||String(e).match(/^\(.+\)$/)?c+e:c+("("+
+e+")");break;default:throw"Unhandled option (lists_getSublist).";}b="array_slice("+b+", "+e+", "+c+")"}else e=Blockly.PHP.getAdjusted(a,"AT1"),a=Blockly.PHP.getAdjusted(a,"AT2"),b=Blockly.PHP.provideFunction_("lists_get_sublist",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list, $where1, $at1, $where2, $at2) {"," if ($where1 == 'FROM_END') {"," $at1 = count($list) - 1 - $at1;"," } else if ($where1 == 'FIRST') {"," $at1 = 0;"," } else if ($where1 != 'FROM_START'){"," throw new Exception('Unhandled option (lists_get_sublist).');",
+" }"," $length = 0;"," if ($where2 == 'FROM_START') {"," $length = $at2 - $at1 + 1;"," } else if ($where2 == 'FROM_END') {"," $length = count($list) - $at1 - $at2;"," } else if ($where2 == 'LAST') {"," $length = count($list) - $at1;"," } else {"," throw new Exception('Unhandled option (lists_get_sublist).');"," }"," return array_slice($list, $at1, $length);","}"])+"("+b+", '"+c+"', "+e+", '"+d+"', "+a+")";return[b,Blockly.PHP.ORDER_FUNCTION_CALL]};
+Blockly.PHP.lists_sort=function(a){var b=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"array()",c="1"===a.getFieldValue("DIRECTION")?1:-1;a=a.getFieldValue("TYPE");return[Blockly.PHP.provideFunction_("lists_sort",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list, $type, $direction) {"," $sortCmpFuncs = array(",' "NUMERIC" => "strnatcasecmp",',' "TEXT" => "strcmp",',' "IGNORE_CASE" => "strcasecmp"'," );"," $sortCmp = $sortCmpFuncs[$type];"," $list2 = $list;"," usort($list2, $sortCmp);",
+" if ($direction == -1) {"," $list2 = array_reverse($list2);"," }"," return $list2;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists_split=function(a){var b=Blockly.PHP.valueToCode(a,"INPUT",Blockly.PHP.ORDER_COMMA),c=Blockly.PHP.valueToCode(a,"DELIM",Blockly.PHP.ORDER_COMMA)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="explode";else if("JOIN"==a)b||(b="array()"),a="implode";else throw"Unknown mode: "+a;return[a+"("+c+", "+b+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.logic={};Blockly.PHP.controls_if=function(a){for(var b=0,c=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"+b),e="if ("+c+") {\n"+d+"}",b=1;b<=a.elseifCount_;b++)c=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"+b),e+=" else if ("+c+") {\n"+d+"}";a.elseCount_&&(d=Blockly.PHP.statementToCode(a,"ELSE"),e+=" else {\n"+d+"}");return e+"\n"};
Blockly.PHP.logic_compare=function(a){var b={EQ:"==",NEQ:"!=",LT:"<",LTE:"<=",GT:">",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.PHP.ORDER_EQUALITY:Blockly.PHP.ORDER_RELATIONAL,d=Blockly.PHP.valueToCode(a,"A",c)||"0";a=Blockly.PHP.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]};
Blockly.PHP.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.PHP.ORDER_LOGICAL_AND:Blockly.PHP.ORDER_LOGICAL_OR,d=Blockly.PHP.valueToCode(a,"A",c);a=Blockly.PHP.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.PHP.logic_negate=function(a){var b=Blockly.PHP.ORDER_LOGICAL_NOT;return["!"+(Blockly.PHP.valueToCode(a,"BOOL",b)||"true"),b]};
Blockly.PHP.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_null=function(a){return["null",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_ternary=function(a){var b=Blockly.PHP.valueToCode(a,"IF",Blockly.PHP.ORDER_CONDITIONAL)||"false",c=Blockly.PHP.valueToCode(a,"THEN",Blockly.PHP.ORDER_CONDITIONAL)||"null";a=Blockly.PHP.valueToCode(a,"ELSE",Blockly.PHP.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.PHP.ORDER_CONDITIONAL]};Blockly.PHP.loops={};
@@ -44,7 +50,7 @@ a="for ("+b+" = "+c+"; "+b+(f?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));
a+=d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a=a+("if ("+f+" > "+c+") {\n")+(Blockly.PHP.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+f+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+g+"}\n";return a};
Blockly.PHP.controls_forEach=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);return""+("foreach ("+c+" as "+b+") {\n"+d+"}\n")};
Blockly.PHP.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.PHP.math={};Blockly.PHP.math_number=function(a){a=parseFloat(a.getFieldValue("NUM"));Infinity==a?a="INF":-Infinity==a&&(a="-INF");return[a,Blockly.PHP.ORDER_ATOMIC]};
-Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[null,Blockly.PHP.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["pow("+d+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
+Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[" ** ",Blockly.PHP.ORDER_POWER]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return[d+c+a,b]};
Blockly.PHP.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.PHP.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_DIVISION)||"0":Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_NONE)||"0";switch(b){case "ABS":c="abs("+a+")";break;case "ROOT":c="sqrt("+a+")";break;case "LN":c="log("+a+")";break;case "EXP":c="exp("+
a+")";break;case "POW10":c="pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="ceil("+a+")";break;case "ROUNDDOWN":c="floor("+a+")";break;case "SIN":c="sin("+a+" / 180 * pi())";break;case "COS":c="cos("+a+" / 180 * pi())";break;case "TAN":c="tan("+a+" / 180 * pi())"}if(c)return[c,Blockly.PHP.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="log("+a+") / log(10)";break;case "ASIN":c="asin("+a+") / pi() * 180";break;case "ACOS":c="acos("+a+") / pi() * 180";break;case "ATAN":c="atan("+
a+") / pi() * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.PHP.ORDER_DIVISION]};Blockly.PHP.math_constant=function(a){return{PI:["M_PI",Blockly.PHP.ORDER_ATOMIC],E:["M_E",Blockly.PHP.ORDER_ATOMIC],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.PHP.ORDER_DIVISION],SQRT2:["M_SQRT2",Blockly.PHP.ORDER_ATOMIC],SQRT1_2:["M_SQRT1_2",Blockly.PHP.ORDER_ATOMIC],INFINITY:["INF",Blockly.PHP.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]};
@@ -53,28 +59,26 @@ Blockly.PHP.math_number_property=function(a){var b=Blockly.PHP.valueToCode(a,"NU
b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.PHP.ORDER_EQUALITY]};Blockly.PHP.math_change=function(a){var b=Blockly.PHP.valueToCode(a,"DELTA",Blockly.PHP.ORDER_ADDITION)||"0";return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" += "+b+";\n"};Blockly.PHP.math_round=Blockly.PHP.math_single;Blockly.PHP.math_trig=Blockly.PHP.math_single;
Blockly.PHP.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=Blockly.PHP.provideFunction_("math_mean",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+
"($myList) {"," return array_sum($myList) / count($myList);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.PHP.provideFunction_("math_median",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($arr) {"," sort($arr,SORT_NUMERIC);"," return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : "," ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||
-"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.PHP.provideFunction_("math_modes",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {"," $v = array_count_values($values);"," arsort($v);"," foreach($v as $k => $v){$total = $k; break;}"," return array($total);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {",
-" $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];",
-"}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math_modulo=function(a){var b=Blockly.PHP.valueToCode(a,"DIVIDEND",Blockly.PHP.ORDER_MODULUS)||"0";a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.PHP.ORDER_MODULUS]};
+"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.PHP.provideFunction_("math_modes",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {"," if (empty($values)) return array();"," $counts = array_count_values($values);"," arsort($counts); // Sort counts in descending order"," $modes = array_keys($counts, current($counts), true);"," return $modes;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation",
+["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {"," $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+
+"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math_modulo=function(a){var b=Blockly.PHP.valueToCode(a,"DIVIDEND",Blockly.PHP.ORDER_MODULUS)||"0";a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.PHP.ORDER_MODULUS]};
Blockly.PHP.math_constrain=function(a){var b=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"0",c=Blockly.PHP.valueToCode(a,"LOW",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"HIGH",Blockly.PHP.ORDER_COMMA)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
Blockly.PHP.math_random_int=function(a){var b=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_COMMA)||"0";return[Blockly.PHP.provideFunction_("math_random_int",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($a, $b) {"," if ($a > $b) {"," return rand($b, $a);"," }"," return rand($a, $b);","}"])+"("+b+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};
Blockly.PHP.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.procedures={};
-Blockly.PHP.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.PHP.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+";\n":"";c=Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.PHP.statementToCode(a,"STACK");Blockly.PHP.STATEMENT_PREFIX&&(d=Blockly.PHP.prefixLines(Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g,"'"+
-a.id+"'"),Blockly.PHP.INDENT)+d);Blockly.PHP.INFINITE_LOOP_TRAP&&(d=Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+d);var e=Blockly.PHP.valueToCode(a,"RETURN",Blockly.PHP.ORDER_NONE)||"";e&&(e=" return "+e+";\n");for(var g=[],f=0;fc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]};
Blockly.Python.colour_rgb=function(a){var b=Blockly.Python.provideFunction_("colour_rgb",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b):"," r = round(min(100, max(0, r)) * 2.55)"," g = round(min(100, max(0, g)) * 2.55)"," b = round(min(100, max(0, b)) * 2.55)"," return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"RED",Blockly.Python.ORDER_NONE)||0,d=Blockly.Python.valueToCode(a,"GREEN",Blockly.Python.ORDER_NONE)||0;a=Blockly.Python.valueToCode(a,"BLUE",Blockly.Python.ORDER_NONE)||
0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};
Blockly.Python.colour_blend=function(a){var b=Blockly.Python.provideFunction_("colour_blend",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio):"," r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)"," g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)"," b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)"," ratio = min(1, max(0, ratio))"," r = round(r1 * (1 - ratio) + r2 * ratio)"," g = round(g1 * (1 - ratio) + g2 * ratio)"," b = round(b1 * (1 - ratio) + b2 * ratio)",
-" return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"COLOUR1",Blockly.Python.ORDER_NONE)||"'#000000'",d=Blockly.Python.valueToCode(a,"COLOUR2",Blockly.Python.ORDER_NONE)||"'#000000'";a=Blockly.Python.valueToCode(a,"RATIO",Blockly.Python.ORDER_NONE)||0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.lists={};Blockly.Python.lists_create_empty=function(a){return["[]",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Python.ORDER_RELATIONAL,d=Blockly.Python.valueToCode(a,"A",c)||"0";a=Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]};
@@ -38,10 +38,10 @@ Blockly.Python.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"a
Blockly.Python.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"True":"False",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.logic_null=function(a){return["None",Blockly.Python.ORDER_ATOMIC]};
Blockly.Python.logic_ternary=function(a){var b=Blockly.Python.valueToCode(a,"IF",Blockly.Python.ORDER_CONDITIONAL)||"False",c=Blockly.Python.valueToCode(a,"THEN",Blockly.Python.ORDER_CONDITIONAL)||"None";a=Blockly.Python.valueToCode(a,"ELSE",Blockly.Python.ORDER_CONDITIONAL)||"None";return[c+" if "+b+" else "+a,Blockly.Python.ORDER_CONDITIONAL]};Blockly.Python.loops={};Blockly.Python.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(parseInt(a.getFieldValue("TIMES"),10)):Blockly.Python.valueToCode(a,"TIMES",Blockly.Python.ORDER_NONE)||"0",b=Blockly.isNumber(b)?parseInt(b,10):"int("+b+")",c=Blockly.Python.statementToCode(a,"DO"),c=Blockly.Python.addLoopTrap(c,a.id)||Blockly.Python.PASS;return"for "+Blockly.Python.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE)+" in range("+b+"):\n"+c};
Blockly.Python.controls_repeat=Blockly.Python.controls_repeat_ext;Blockly.Python.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Python.valueToCode(a,"BOOL",b?Blockly.Python.ORDER_LOGICAL_NOT:Blockly.Python.ORDER_NONE)||"False",d=Blockly.Python.statementToCode(a,"DO"),d=Blockly.Python.addLoopTrap(d,a.id)||Blockly.Python.PASS;b&&(c="not "+c);return"while "+c+":\n"+d};
-Blockly.Python.controls_for=function(a){var b=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0",d=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0",e=Blockly.Python.valueToCode(a,"BY",Blockly.Python.ORDER_NONE)||"1",g=Blockly.Python.statementToCode(a,"DO"),g=Blockly.Python.addLoopTrap(g,a.id)||Blockly.Python.PASS,f="",h=function(){return Blockly.Python.provideFunction_("upRange",
+Blockly.Python.controls_for=function(a){var b=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0",d=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0",e=Blockly.Python.valueToCode(a,"BY",Blockly.Python.ORDER_NONE)||"1",f=Blockly.Python.statementToCode(a,"DO"),f=Blockly.Python.addLoopTrap(f,a.id)||Blockly.Python.PASS,g="",h=function(){return Blockly.Python.provideFunction_("upRange",
["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start <= stop:"," yield start"," start += abs(step)"])},k=function(){return Blockly.Python.provideFunction_("downRange",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start >= stop:"," yield start"," start -= abs(step)"])};a=function(a,b,c){return"("+a+" <= "+b+") and "+h()+"("+a+", "+b+", "+c+") or "+k()+"("+a+", "+b+", "+c+")"};if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&
-Blockly.isNumber(e))c=parseFloat(c),d=parseFloat(d),e=Math.abs(parseFloat(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0==c&&1==e?d:c+", "+d,1!=e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=ca?Blockly.Python.ORDER_UNARY_SIGN:Blockly.Python.ORDER_ATOMIC;return[a,b]};
Blockly.Python.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Python.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Python.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Python.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Python.ORDER_MULTIPLICATIVE],POWER:[" ** ",Blockly.Python.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Python.valueToCode(a,"A",b)||"0";a=Blockly.Python.valueToCode(a,"B",b)||"0";return[d+c+a,b]};
Blockly.Python.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return c=Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_UNARY_SIGN)||"0",["-"+c,Blockly.Python.ORDER_UNARY_SIGN];Blockly.Python.definitions_.import_math="import math";a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_MULTIPLICATIVE)||"0":Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break;case "ROOT":c="math.sqrt("+
@@ -60,20 +60,20 @@ Blockly.Python.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Py
Blockly.Python.math_modulo=function(a){var b=Blockly.Python.valueToCode(a,"DIVIDEND",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Python.ORDER_MULTIPLICATIVE]};
Blockly.Python.math_constrain=function(a){var b=Blockly.Python.valueToCode(a,"VALUE",Blockly.Python.ORDER_NONE)||"0",c=Blockly.Python.valueToCode(a,"LOW",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"HIGH",Blockly.Python.ORDER_NONE)||"float('inf')";return["min(max("+b+", "+c+"), "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};
Blockly.Python.math_random_int=function(a){Blockly.Python.definitions_.import_random="import random";var b=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.math_random_float=function(a){Blockly.Python.definitions_.import_random="import random";return["random.random()",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.procedures={};
-Blockly.Python.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.Python.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+"\n":"";c=Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.Python.statementToCode(a,"STACK");Blockly.Python.STATEMENT_PREFIX&&(d=Blockly.Python.prefixLines(Blockly.Python.STATEMENT_PREFIX.replace(/%1/g,"'"+
-a.id+"'"),Blockly.Python.INDENT)+d);Blockly.Python.INFINITE_LOOP_TRAP&&(d=Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g,'"'+a.id+'"')+d);var e=Blockly.Python.valueToCode(a,"RETURN",Blockly.Python.ORDER_NONE)||"";e?e=" return "+e+"\n":d||(d=Blockly.Python.PASS);for(var g=[],f=0;f
Date: Sat, 9 Jul 2016 02:00:37 +0200
Subject: [PATCH 11/25] Complete revision of German translation (#421)
* Provide sensible and consistent German translation
* Decapitalise beginning of blocks in German, according to https://developers.google.com/blockly/guides/modify-blockly/contributing
* Rename German variable default name
* Remove 'true' and 'false' in German translation
* Replace 'Wert' with 'Zahl' for 'number' in German translation
* Make tooltips consistent in German translation
* More fine-tuning on tooltips in German translation
* Small details in German translation
* Changes from https://github.com/google/blockly/pull/421#issuecomment-226649183 / https://reviewable.io/reviews/google/blockly/421#- , rename Block as Baustein everywhere in German translation
* German translation: Change "wenn" to "falls" for do-conditions
* German translation: Change "wenn" to "falls" for value-conditions
* German translation: Update de.js from de.json
---
msg/js/de.js | 310 +++++++++++++++++++++++------------------------
msg/json/de.json | 310 +++++++++++++++++++++++------------------------
2 files changed, 310 insertions(+), 310 deletions(-)
diff --git a/msg/js/de.js b/msg/js/de.js
index 1067f08e3..ce7f95227 100644
--- a/msg/js/de.js
+++ b/msg/js/de.js
@@ -7,81 +7,81 @@ goog.provide('Blockly.Msg.de');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Kommentar hinzufügen";
-Blockly.Msg.AUTH = "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.";
+Blockly.Msg.AUTH = "Bitte autorisiere diese App um deine Arbeit speichern und teilen zu können.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Wert ändern:";
Blockly.Msg.CHAT = "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!";
-Blockly.Msg.CLEAN_UP = "Blöcke aufräumen";
-Blockly.Msg.COLLAPSE_ALL = "Alle Blöcke zusammenfalten";
-Blockly.Msg.COLLAPSE_BLOCK = "Block zusammenfalten";
+Blockly.Msg.CLEAN_UP = "Bausteine aufräumen";
+Blockly.Msg.COLLAPSE_ALL = "Alle Bausteine zusammenfalten";
+Blockly.Msg.COLLAPSE_BLOCK = "Baustein zusammenfalten";
Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farbe 1";
-Blockly.Msg.COLOUR_BLEND_COLOUR2 = "mit Farbe 2";
+Blockly.Msg.COLOUR_BLEND_COLOUR2 = "und Farbe 2";
Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältnis";
Blockly.Msg.COLOUR_BLEND_TITLE = "mische";
-Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).";
+Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).";
Blockly.Msg.COLOUR_PICKER_HELPURL = "https://de.wikipedia.org/wiki/Farbe";
-Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wähle eine Farbe aus der Palette.";
+Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Erzeugt eine Farbe aus der Palette.";
Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
Blockly.Msg.COLOUR_RANDOM_TITLE = "zufällige Farbe";
-Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wähle eine Farbe nach dem Zufallsprinzip.";
+Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Erzeugt eine Farbe nach dem Zufallsprinzip.";
Blockly.Msg.COLOUR_RGB_BLUE = "blau";
Blockly.Msg.COLOUR_RGB_GREEN = "grün";
Blockly.Msg.COLOUR_RGB_HELPURL = "https://de.wikipedia.org/wiki/RGB-Farbraum";
Blockly.Msg.COLOUR_RGB_RED = "rot";
-Blockly.Msg.COLOUR_RGB_TITLE = "Farbe mit";
-Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kreiere eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.";
+Blockly.Msg.COLOUR_RGB_TITLE = "Farbe aus";
+Blockly.Msg.COLOUR_RGB_TOOLTIP = "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://de.wikipedia.org/wiki/Kontrollstruktur";
-Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Die Schleife abbrechen";
-Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "mit der nächsten Iteration der Schleife fortfahren";
+Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "die Schleife abbrechen";
+Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sofort mit nächstem Schleifendurchlauf fortfahren";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebende Schleife beenden.";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.";
-Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden.";
+Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.";
Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
-Blockly.Msg.CONTROLS_FOREACH_TITLE = "Für Wert %1 aus der Liste %2";
-Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert.";
+Blockly.Msg.CONTROLS_FOREACH_TITLE = "für jeden Wert %1 aus der Liste %2";
+Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert.";
Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
-Blockly.Msg.CONTROLS_FOR_TITLE = "Zähle %1 von %2 bis %3 mit %4";
-Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus.";
+Blockly.Msg.CONTROLS_FOR_TITLE = "zähle %1 von %2 bis %3 in Schritten von %4:";
+Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.";
Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Eine weitere Bedingung hinzufügen.";
-Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.";
+Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft.";
Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated
Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufügen, entfernen oder sortieren von Sektionen";
Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sonst";
-Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sonst wenn";
-Blockly.Msg.CONTROLS_IF_MSG_IF = "wenn";
-Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.";
-Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.";
-Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.";
-Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.";
+Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sonst falls";
+Blockly.Msg.CONTROLS_IF_MSG_IF = "falls";
+Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Führt eine Anweisung aus, falls eine Bedingung wahr ist.";
+Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.";
+Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.";
+Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist";
Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mache";
-Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhole %1 mal";
+Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhole %1 mal:";
Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eine Anweisung mehrfach ausführen.";
Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29";
-Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Wiederhole bis";
-Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Wiederhole solange";
-Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Führe die Anweisung solange aus wie die Bedingung falsch (false) ist.";
-Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Führe die Anweisung solange aus wie die Bedingung wahr (true) ist.";
+Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "wiederhole bis";
+Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "wiederhole solange";
+Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Führt Anweisungen aus solange die Bedingung unwahr ist.";
+Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Führt Anweisungen aus solange die Bedingung wahr ist.";
Blockly.Msg.DELETE_ALL_BLOCKS = "Alle %1 Bausteine löschen?";
-Blockly.Msg.DELETE_BLOCK = "Block löschen";
-Blockly.Msg.DELETE_X_BLOCKS = "Block %1 löschen";
-Blockly.Msg.DISABLE_BLOCK = "Block deaktivieren";
+Blockly.Msg.DELETE_BLOCK = "Baustein löschen";
+Blockly.Msg.DELETE_X_BLOCKS = "Baustein %1 löschen";
+Blockly.Msg.DISABLE_BLOCK = "Baustein deaktivieren";
Blockly.Msg.DUPLICATE_BLOCK = "Kopieren";
-Blockly.Msg.ENABLE_BLOCK = "Block aktivieren";
-Blockly.Msg.EXPAND_ALL = "Alle Blöcke entfalten";
-Blockly.Msg.EXPAND_BLOCK = "Block entfalten";
+Blockly.Msg.ENABLE_BLOCK = "Baustein aktivieren";
+Blockly.Msg.EXPAND_ALL = "Alle Bausteine entfalten";
+Blockly.Msg.EXPAND_BLOCK = "Baustein entfalten";
Blockly.Msg.EXTERNAL_INPUTS = "externe Eingänge";
Blockly.Msg.HELP = "Hilfe";
Blockly.Msg.INLINE_INPUTS = "interne Eingänge";
Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list";
-Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Erzeuge eine leere Liste";
+Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "erzeuge eine leere Liste";
Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Erzeugt eine leere Liste ohne Inhalt.";
Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "Liste";
Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen.";
Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with";
-Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Erzeuge Liste mit";
+Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "erzeuge Liste mit";
Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ein Element zur Liste hinzufügen.";
-Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine List mit konfigurierten Elementen.";
+Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine Liste aus den angegebenen Elementen.";
Blockly.Msg.LISTS_GET_INDEX_FIRST = "erstes";
Blockly.Msg.LISTS_GET_INDEX_FROM_END = "#tes von hinten";
Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#tes";
@@ -91,21 +91,21 @@ Blockly.Msg.LISTS_GET_INDEX_LAST = "letztes";
Blockly.Msg.LISTS_GET_INDEX_RANDOM = "zufälliges";
Blockly.Msg.LISTS_GET_INDEX_REMOVE = "entferne";
Blockly.Msg.LISTS_GET_INDEX_TAIL = "";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiere das erste Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Extrahiere das #1te Element aus Ende der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Extrahiere das #1te Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiere das letzte Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiere ein zufälliges Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiere und entfernt das erste Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Extrahiere und entfernt das #1te Element aus Ende der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Extrahiere und entfernt das #1te Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiere und entfernt das letzte Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiere und entfernt ein zufälliges Element aus der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das erste Element von der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Entfernt das #1te Element von Ende der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Entfernt das #1te Element von der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element von der Liste.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt ein zufälliges Element von der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiert das erste Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Extrahiert das #1te Element aus Ende der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Extrahiert das #1te Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiert das letzte Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiert ein zufälliges Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiert und entfernt das erste Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Extrahiert und entfernt das #1te Element aus Ende der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Extrahiert und entfernt das #1te Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiert und entfernt das letzte Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiert und entfernt ein zufälliges Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das erste Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Entfernt das #1te Element vom Ende der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Entfernt das #1te Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element aus der Liste.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt ein zufälliges Element aus der Liste.";
Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "bis zu # von hinten";
Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "bis zu #";
Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "bis zum Ende";
@@ -118,37 +118,37 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen
Blockly.Msg.LISTS_INDEX_OF_FIRST = "suche erstes Auftreten von";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.LISTS_INDEX_OF_LAST = "suche letztes Auftreten von";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.";
-Blockly.Msg.LISTS_INLIST = "von der Liste";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (Index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.";
+Blockly.Msg.LISTS_INLIST = "in der Liste";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
-Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer?";
-Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist wahr (true), wenn die Liste leer ist.";
+Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer";
+Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist wahr, falls die Liste leer ist.";
Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated
Blockly.Msg.LISTS_LENGTH_TITLE = "Länge von %1";
Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Anzahl von Elementen in der Liste.";
Blockly.Msg.LISTS_REPEAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
-Blockly.Msg.LISTS_REPEAT_TITLE = "Erzeuge Liste mit Element %1 wiederhole es %2 mal";
+Blockly.Msg.LISTS_REPEAT_TITLE = "erzeuge Liste mit %2 mal dem Element %1";
Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen";
Blockly.Msg.LISTS_SET_INDEX_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ein";
-Blockly.Msg.LISTS_SET_INDEX_INSERT = "füge";
-Blockly.Msg.LISTS_SET_INDEX_SET = "setze";
+Blockly.Msg.LISTS_SET_INDEX_INSERT = "füge als";
+Blockly.Msg.LISTS_SET_INDEX_SET = "setze für";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Fügt das Element an den Anfang der Liste an.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Fügt das Element an der angegebenen Position in die Liste ein. #1 ist das letzte Element.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Fügt das Element an der angegebenen Position in die Liste ein. #1 ist das erste Element.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Fügt das Element ans Ende der Liste an.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Fügt das Element zufällig in die Liste ein.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setzt das erste Element in der Liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in der Liste.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzt das Element an der angegebenen Position in der Liste. #1 ist das erste Element.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in die Liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt ein zufälliges Element in der Liste.";
Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list";
Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "aufsteigend";
Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "absteigend";
Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 %3 sortieren";
Blockly.Msg.LISTS_SORT_TOOLTIP = "Eine Kopie einer Liste sortieren.";
-Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetisch, Schreibung ignorieren";
+Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetisch, Großschreibung ignorieren";
Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerisch";
Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetisch";
Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
@@ -157,48 +157,48 @@ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Text aus Liste erstellen";
Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.";
Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.";
Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "mit Trennzeichen";
-Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsch";
+Blockly.Msg.LOGIC_BOOLEAN_FALSE = "unwahr";
Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated
-Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr (true) oder falsch (false)";
+Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr oder unwahr";
Blockly.Msg.LOGIC_BOOLEAN_TRUE = "wahr";
Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr (true), wenn beide Werte gleich sind.";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.";
-Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr (true), wenn beide Werte unterschiedlich sind.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr, falls beide Werte gleich sind.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr, falls der erste Wert größer als der zweite Wert ist.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.";
+Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr, falls beide Werte unterschiedlich sind.";
Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated
Blockly.Msg.LOGIC_NEGATE_TITLE = "nicht %1";
-Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.";
+Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.";
Blockly.Msg.LOGIC_NULL = "null";
Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert";
-Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist NULL.";
+Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist \"null\".";
Blockly.Msg.LOGIC_OPERATION_AND = "und";
Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated
Blockly.Msg.LOGIC_OPERATION_OR = "oder";
-Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr (true), wenn beide Werte wahr (true) sind.";
-Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.";
-Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste";
+Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr, falls beide Werte wahr sind.";
+Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr, falls einer der beiden Werte wahr ist.";
+Blockly.Msg.LOGIC_TERNARY_CONDITION = "prüfe";
Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator";
-Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wenn falsch";
-Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wenn wahr";
-Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist, wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert";
+Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "falls unwahr";
+Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "falls wahr";
+Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert";
Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://de.wikipedia.org/wiki/Grundrechenart";
-Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Werte.";
-Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zweier Werte.";
-Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zweier Werte.";
-Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zweier Werte.";
-Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist der erste Wert potenziert mit dem zweiten Wert.";
+Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Zahlen.";
+Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zweier Zahlen.";
+Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zweier Zahlen.";
+Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zweier Zahlen.";
+Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist die erste Zahl potenziert mit der zweiten Zahl.";
Blockly.Msg.MATH_CHANGE_HELPURL = "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement";
Blockly.Msg.MATH_CHANGE_TITLE = "erhöhe %1 um %2";
-Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert einen Wert zur Variable \"%1\" hinzu.";
+Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert eine Zahl zu \"%1\".";
Blockly.Msg.MATH_CONSTANT_HELPURL = "https://de.wikipedia.org/wiki/Mathematische_Konstante";
Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).";
Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated
-Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 von %2 bis %3";
-Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt den Wertebereich auf den \"von\"-Wert bis einschließlich zum \"bis\"-Wert. (inklusiv)";
+Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 zwischen %2 und %3";
+Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv).";
Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist teilbar durch";
Blockly.Msg.MATH_IS_EVEN = "ist gerade";
@@ -206,7 +206,7 @@ Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ";
Blockly.Msg.MATH_IS_ODD = "ist ungerade";
Blockly.Msg.MATH_IS_POSITIVE = "ist positiv";
Blockly.Msg.MATH_IS_PRIME = "ist eine Primzahl";
-Blockly.Msg.MATH_IS_TOOLTIP = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr (true) oder falsch (false) zurück.";
+Blockly.Msg.MATH_IS_TOOLTIP = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder unwahr zurück.";
Blockly.Msg.MATH_IS_WHOLE = "ist eine ganze Zahl";
Blockly.Msg.MATH_MODULO_HELPURL = "https://de.wikipedia.org/wiki/Modulo";
Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2";
@@ -215,44 +215,44 @@ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
Blockly.Msg.MATH_NUMBER_HELPURL = "https://de.wikipedia.org/wiki/Zahl";
Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eine Zahl.";
Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel";
-Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelwert einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalwert einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalwert einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "am häufigsten in Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallswert einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standardabweichung einer Liste";
-Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe einer Liste";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Durchschnittswert aller Werte in einer Liste.";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist der größte Wert in einer Liste.";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Median aller Werte in einer Liste.";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist der kleinste Wert in einer Liste.";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findet den am häufigsten vorkommenden Wert in einer Liste. Falls kein Wert öfter vorkommt als alle anderen, wird die originale Liste zurückgeben";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Gebe einen zufälligen Wert aus der Liste zurück.";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die standardisierte Standardabweichung aller Werte in der Liste";
-Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summe aller Werte in einer Liste.";
+Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelwert der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalwert der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalwert der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "am häufigsten in der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallswert aus der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standardabweichung der Liste";
+Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe über die Liste";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Durchschnittswert aller Zahlen in einer Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist die größte Zahl in einer Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Median aller Zahlen in einer Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist die kleinste Zahl in einer Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findet die Werte mit dem häufigstem Vorkommen in der Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Gibt einen zufälligen Wert aus der Liste zurück.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die Standardabweichung aller Werte in der Liste.";
+Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summe aller Zahlen in einer Liste.";
Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen";
-Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszahl (0.0 -1.0)";
-Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Erzeuge eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).";
+Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszahl (0.0 - 1.0)";
+Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).";
Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen";
-Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzzahliger Zufallswert zwischen %1 bis %2";
-Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Erzeuge einen ganzzahligen Zufallswert zwischen zwei Werten (inklusiv).";
+Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzzahlige Zufallszahl zwischen %1 und %2";
+Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv).";
Blockly.Msg.MATH_ROUND_HELPURL = "https://de.wikipedia.org/wiki/Runden";
-Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runden";
-Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "abrunden";
-Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "aufrunden";
+Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runde";
+Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "runde ab";
+Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "runde auf";
Blockly.Msg.MATH_ROUND_TOOLTIP = "Eine Zahl auf- oder abrunden.";
Blockly.Msg.MATH_SINGLE_HELPURL = "https://de.wikipedia.org/wiki/Quadratwurzel";
-Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Absolutwert";
+Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Betrag";
Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwurzel";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Absolutwert eines Wertes.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Wert der Exponentialfunktion eines Wertes.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natürliche Logarithmus eines Wertes.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekadische Logarithmus eines Wertes.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert einen Wert.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch Eingabewert.";
-Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Quadratwurzel eines Wertes.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Betrag einer Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Wert der Exponentialfunktion einer Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natürliche Logarithmus einer Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekadische Logarithmus einer Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert eine Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch eine Zahl.";
+Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Quadratwurzel einer Zahl.";
Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
@@ -268,7 +268,7 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Kosinus des Winkels.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus des Winkels.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens des Winkels.";
Blockly.Msg.ME = "Ich";
-Blockly.Msg.NEW_VARIABLE = "Neue Variable...";
+Blockly.Msg.NEW_VARIABLE = "Neue Variable …";
Blockly.Msg.NEW_VARIABLE_TITLE = "Name der neuen Variable:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Aussagen erlauben";
@@ -282,8 +282,8 @@ Blockly.Msg.PROCEDURES_CREATE_DO = "Erzeuge \"Aufruf %1\"";
Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beschreibe diese Funktion …";
Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
-Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Funktionsblock";
-Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "zu";
+Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "etwas tun";
+Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "";
Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ein Funktionsblock ohne Rückgabewert.";
Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "gebe zurück";
@@ -291,34 +291,34 @@ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ein Funktionsblock mit Rückgabewert
Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter.";
Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiere Funktionsblock";
Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
-Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.";
-Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden.";
+Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.";
+Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden.";
Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Variable:";
Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Eine Eingabe zur Funktion hinzufügen.";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.";
Blockly.Msg.REDO = "Wiederholen";
Blockly.Msg.REMOVE_COMMENT = "Kommentar entfernen";
-Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen...";
+Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen …";
Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle \"%1\" Variablen umbenennen in:";
Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text anhängen";
Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated
-Blockly.Msg.TEXT_APPEND_TO = "An";
+Blockly.Msg.TEXT_APPEND_TO = "an";
Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" anhängen.";
Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
-Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "umwandeln in kleinbuchstaben";
-Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "umwandeln in Substantive";
-Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "umwandeln in GROSSBUCHSTABEN";
+Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "wandel um in kleinbuchstaben";
+Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "wandel um in Substantive";
+Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "wandel um in GROSSBUCHSTABEN";
Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein.";
-Blockly.Msg.TEXT_CHARAT_FIRST = "Nehme ersten Buchstaben";
-Blockly.Msg.TEXT_CHARAT_FROM_END = "Nehme #ten Buchstaben von hinten";
-Blockly.Msg.TEXT_CHARAT_FROM_START = "Nehme #ten Buchstaben";
+Blockly.Msg.TEXT_CHARAT_FIRST = "nehme ersten Buchstaben";
+Blockly.Msg.TEXT_CHARAT_FROM_END = "nehme #ten Buchstaben von hinten";
+Blockly.Msg.TEXT_CHARAT_FROM_START = "nehme #ten Buchstaben";
Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "vom Text";
-Blockly.Msg.TEXT_CHARAT_LAST = "Nehme letzten Buchstaben";
-Blockly.Msg.TEXT_CHARAT_RANDOM = "Nehme zufälligen Buchstaben";
+Blockly.Msg.TEXT_CHARAT_LAST = "nehme letzten Buchstaben";
+Blockly.Msg.TEXT_CHARAT_RANDOM = "nehme zufälligen Buchstaben";
Blockly.Msg.TEXT_CHARAT_TAIL = "";
-Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiere einen Buchstaben von einer spezifizierten Position.";
+Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiert einen Buchstaben von einer bestimmten Position.";
Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ein Element zum Text hinzufügen.";
Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinden";
Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen.";
@@ -326,35 +326,35 @@ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis zum #ten Buchstaben von hinte
Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis zum #ten Buchstaben";
Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis zum letzten Buchstaben";
Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
-Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in Text";
-Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vom ersten Buchstaben";
-Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vom #ten Buchstaben von hinten";
-Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vom #ten Buchstaben";
+Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "im Text";
+Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "nehme Teil ab erstem Buchstaben";
+Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "nehme Teil ab #tem Buchstaben von hinten";
+Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "nehme Teil ab #tem Buchstaben";
Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "";
Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt den angegebenen Textabschnitt zurück.";
Blockly.Msg.TEXT_INDEXOF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text";
-Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Suche erstes Auftreten des Begriffs";
-Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Suche letztes Auftreten des Begriffs";
+Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "suche erstes Auftreten des Begriffs";
+Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "suche letztes Auftreten des Begriffs";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs oder 0 zurück.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder 0 falls der Suchbegriff nicht gefunden wurde.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
-Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer?";
-Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr (true), wenn der Text keine Zeichen enthält ist.";
+Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer";
+Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr, falls der Text keine Zeichen enthält ist.";
Blockly.Msg.TEXT_JOIN_HELPURL = "";
-Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Erstelle Text aus";
+Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "erstelle Text aus";
Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt einen Text durch das Verbinden von mehreren Textelementen.";
Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated
-Blockly.Msg.TEXT_LENGTH_TITLE = "Länge %1";
-Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Anzahl von Zeichen in einem Text. (inkl. Leerzeichen)";
+Blockly.Msg.TEXT_LENGTH_TITLE = "Länge von %1";
+Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).";
Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated
-Blockly.Msg.TEXT_PRINT_TITLE = "Ausgabe %1";
-Blockly.Msg.TEXT_PRINT_TOOLTIP = "Gib den Inhalt einer Variable aus.";
+Blockly.Msg.TEXT_PRINT_TITLE = "gib aus %1";
+Blockly.Msg.TEXT_PRINT_TOOLTIP = "Gibt den Text aus.";
Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fragt den Benutzer nach einer Zahl.";
Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fragt den Benutzer nach einem Text.";
-Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Fragt nach Zahl mit Hinweis";
-Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Fragt nach Text mit Hinweis";
+Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "frage nach Zahl mit Hinweis";
+Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "frage nach Text mit Hinweis";
Blockly.Msg.TEXT_TEXT_HELPURL = "https://de.wikipedia.org/wiki/Zeichenkette";
Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ein Buchstabe, Text oder Satz.";
Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
@@ -364,11 +364,11 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeichen vom Ende (rechts)";
Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.";
Blockly.Msg.TODAY = "Heute";
Blockly.Msg.UNDO = "Rückgängig";
-Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element";
+Blockly.Msg.VARIABLES_DEFAULT_NAME = "etwas";
Blockly.Msg.VARIABLES_GET_CREATE_SET = "Erzeuge \"Schreibe %1\"";
Blockly.Msg.VARIABLES_GET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29";
Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gibt den Wert der Variable zurück.";
-Blockly.Msg.VARIABLES_SET = "Schreibe %1 %2";
+Blockly.Msg.VARIABLES_SET = "setze %1 auf %2";
Blockly.Msg.VARIABLES_SET_CREATE_GET = "Erzeuge \"Lese %1\"";
Blockly.Msg.VARIABLES_SET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29";
Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt den Wert einer Variable.";
diff --git a/msg/json/de.json b/msg/json/de.json
index da15c983a..366661825 100644
--- a/msg/json/de.json
+++ b/msg/json/de.json
@@ -10,123 +10,123 @@
"THINK"
]
},
- "VARIABLES_DEFAULT_NAME": "Element",
+ "VARIABLES_DEFAULT_NAME": "etwas",
"TODAY": "Heute",
"DUPLICATE_BLOCK": "Kopieren",
"ADD_COMMENT": "Kommentar hinzufügen",
"REMOVE_COMMENT": "Kommentar entfernen",
"EXTERNAL_INPUTS": "externe Eingänge",
"INLINE_INPUTS": "interne Eingänge",
- "DELETE_BLOCK": "Block löschen",
- "DELETE_X_BLOCKS": "Block %1 löschen",
+ "DELETE_BLOCK": "Baustein löschen",
+ "DELETE_X_BLOCKS": "Baustein %1 löschen",
"DELETE_ALL_BLOCKS": "Alle %1 Bausteine löschen?",
- "CLEAN_UP": "Blöcke aufräumen",
- "COLLAPSE_BLOCK": "Block zusammenfalten",
- "COLLAPSE_ALL": "Alle Blöcke zusammenfalten",
- "EXPAND_BLOCK": "Block entfalten",
- "EXPAND_ALL": "Alle Blöcke entfalten",
- "DISABLE_BLOCK": "Block deaktivieren",
- "ENABLE_BLOCK": "Block aktivieren",
+ "CLEAN_UP": "Bausteine aufräumen",
+ "COLLAPSE_BLOCK": "Baustein zusammenfalten",
+ "COLLAPSE_ALL": "Alle Bausteine zusammenfalten",
+ "EXPAND_BLOCK": "Baustein entfalten",
+ "EXPAND_ALL": "Alle Bausteine entfalten",
+ "DISABLE_BLOCK": "Baustein deaktivieren",
+ "ENABLE_BLOCK": "Baustein aktivieren",
"HELP": "Hilfe",
"UNDO": "Rückgängig",
"REDO": "Wiederholen",
"CHAT": "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!",
- "AUTH": "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.",
+ "AUTH": "Bitte autorisiere diese App um deine Arbeit speichern und teilen zu können.",
"ME": "Ich",
"CHANGE_VALUE_TITLE": "Wert ändern:",
- "NEW_VARIABLE": "Neue Variable...",
+ "NEW_VARIABLE": "Neue Variable …",
"NEW_VARIABLE_TITLE": "Name der neuen Variable:",
- "RENAME_VARIABLE": "Variable umbenennen...",
+ "RENAME_VARIABLE": "Variable umbenennen …",
"RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:",
"COLOUR_PICKER_HELPURL": "https://de.wikipedia.org/wiki/Farbe",
- "COLOUR_PICKER_TOOLTIP": "Wähle eine Farbe aus der Palette.",
+ "COLOUR_PICKER_TOOLTIP": "Erzeugt eine Farbe aus der Palette.",
"COLOUR_RANDOM_TITLE": "zufällige Farbe",
- "COLOUR_RANDOM_TOOLTIP": "Wähle eine Farbe nach dem Zufallsprinzip.",
+ "COLOUR_RANDOM_TOOLTIP": "Erzeugt eine Farbe nach dem Zufallsprinzip.",
"COLOUR_RGB_HELPURL": "https://de.wikipedia.org/wiki/RGB-Farbraum",
- "COLOUR_RGB_TITLE": "Farbe mit",
+ "COLOUR_RGB_TITLE": "Farbe aus",
"COLOUR_RGB_RED": "rot",
"COLOUR_RGB_GREEN": "grün",
"COLOUR_RGB_BLUE": "blau",
- "COLOUR_RGB_TOOLTIP": "Kreiere eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.",
+ "COLOUR_RGB_TOOLTIP": "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.",
"COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/",
"COLOUR_BLEND_TITLE": "mische",
"COLOUR_BLEND_COLOUR1": "Farbe 1",
- "COLOUR_BLEND_COLOUR2": "mit Farbe 2",
+ "COLOUR_BLEND_COLOUR2": "und Farbe 2",
"COLOUR_BLEND_RATIO": "im Verhältnis",
- "COLOUR_BLEND_TOOLTIP": "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).",
+ "COLOUR_BLEND_TOOLTIP": "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).",
"CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife",
- "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal",
+ "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal:",
"CONTROLS_REPEAT_INPUT_DO": "mache",
"CONTROLS_REPEAT_TOOLTIP": "Eine Anweisung mehrfach ausführen.",
"CONTROLS_WHILEUNTIL_HELPURL": "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29",
- "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Wiederhole solange",
- "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Wiederhole bis",
- "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führe die Anweisung solange aus wie die Bedingung wahr (true) ist.",
- "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führe die Anweisung solange aus wie die Bedingung falsch (false) ist.",
+ "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "wiederhole solange",
+ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "wiederhole bis",
+ "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führt Anweisungen aus solange die Bedingung wahr ist.",
+ "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führt Anweisungen aus solange die Bedingung unwahr ist.",
"CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife",
- "CONTROLS_FOR_TOOLTIP": "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus.",
- "CONTROLS_FOR_TITLE": "Zähle %1 von %2 bis %3 mit %4",
+ "CONTROLS_FOR_TOOLTIP": "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.",
+ "CONTROLS_FOR_TITLE": "zähle %1 von %2 bis %3 in Schritten von %4:",
"CONTROLS_FOREACH_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife",
- "CONTROLS_FOREACH_TITLE": "Für Wert %1 aus der Liste %2",
- "CONTROLS_FOREACH_TOOLTIP": "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert.",
+ "CONTROLS_FOREACH_TITLE": "für jeden Wert %1 aus der Liste %2",
+ "CONTROLS_FOREACH_TOOLTIP": "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert.",
"CONTROLS_FLOW_STATEMENTS_HELPURL": "https://de.wikipedia.org/wiki/Kontrollstruktur",
- "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Die Schleife abbrechen",
- "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "mit der nächsten Iteration der Schleife fortfahren",
+ "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "die Schleife abbrechen",
+ "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "sofort mit nächstem Schleifendurchlauf fortfahren",
"CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebende Schleife beenden.",
"CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.",
- "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden.",
- "CONTROLS_IF_TOOLTIP_1": "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.",
- "CONTROLS_IF_TOOLTIP_2": "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.",
- "CONTROLS_IF_TOOLTIP_3": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.",
- "CONTROLS_IF_TOOLTIP_4": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.",
- "CONTROLS_IF_MSG_IF": "wenn",
- "CONTROLS_IF_MSG_ELSEIF": "sonst wenn",
+ "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.",
+ "CONTROLS_IF_TOOLTIP_1": "Führt eine Anweisung aus, falls eine Bedingung wahr ist.",
+ "CONTROLS_IF_TOOLTIP_2": "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.",
+ "CONTROLS_IF_TOOLTIP_3": "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.",
+ "CONTROLS_IF_TOOLTIP_4": "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist",
+ "CONTROLS_IF_MSG_IF": "falls",
+ "CONTROLS_IF_MSG_ELSEIF": "sonst falls",
"CONTROLS_IF_MSG_ELSE": "sonst",
"CONTROLS_IF_IF_TOOLTIP": "Hinzufügen, entfernen oder sortieren von Sektionen",
"CONTROLS_IF_ELSEIF_TOOLTIP": "Eine weitere Bedingung hinzufügen.",
- "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.",
+ "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft.",
"LOGIC_COMPARE_HELPURL": "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29",
- "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr (true), wenn beide Werte gleich sind.",
- "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr (true), wenn beide Werte unterschiedlich sind.",
- "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.",
- "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.",
- "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.",
- "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.",
- "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr (true), wenn beide Werte wahr (true) sind.",
+ "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr, falls beide Werte gleich sind.",
+ "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr, falls beide Werte unterschiedlich sind.",
+ "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist.",
+ "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.",
+ "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr, falls der erste Wert größer als der zweite Wert ist.",
+ "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist.",
+ "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr, falls beide Werte wahr sind.",
"LOGIC_OPERATION_AND": "und",
- "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.",
+ "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr, falls einer der beiden Werte wahr ist.",
"LOGIC_OPERATION_OR": "oder",
"LOGIC_NEGATE_TITLE": "nicht %1",
- "LOGIC_NEGATE_TOOLTIP": "Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.",
+ "LOGIC_NEGATE_TOOLTIP": "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.",
"LOGIC_BOOLEAN_TRUE": "wahr",
- "LOGIC_BOOLEAN_FALSE": "falsch",
- "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr (true) oder falsch (false)",
+ "LOGIC_BOOLEAN_FALSE": "unwahr",
+ "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr oder unwahr",
"LOGIC_NULL_HELPURL": "https://de.wikipedia.org/wiki/Nullwert",
"LOGIC_NULL": "null",
- "LOGIC_NULL_TOOLTIP": "Ist NULL.",
+ "LOGIC_NULL_TOOLTIP": "Ist \"null\".",
"LOGIC_TERNARY_HELPURL": "https://de.wikipedia.org/wiki/%3F:#Auswahloperator",
- "LOGIC_TERNARY_CONDITION": "teste",
- "LOGIC_TERNARY_IF_TRUE": "wenn wahr",
- "LOGIC_TERNARY_IF_FALSE": "wenn falsch",
- "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist, wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert",
+ "LOGIC_TERNARY_CONDITION": "prüfe",
+ "LOGIC_TERNARY_IF_TRUE": "falls wahr",
+ "LOGIC_TERNARY_IF_FALSE": "falls unwahr",
+ "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert",
"MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl",
"MATH_NUMBER_TOOLTIP": "Eine Zahl.",
"MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart",
- "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Werte.",
- "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Werte.",
- "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Werte.",
- "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Werte.",
- "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist der erste Wert potenziert mit dem zweiten Wert.",
+ "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Zahlen.",
+ "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Zahlen.",
+ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Zahlen.",
+ "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Zahlen.",
+ "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist die erste Zahl potenziert mit der zweiten Zahl.",
"MATH_SINGLE_HELPURL": "https://de.wikipedia.org/wiki/Quadratwurzel",
"MATH_SINGLE_OP_ROOT": "Quadratwurzel",
- "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel eines Wertes.",
- "MATH_SINGLE_OP_ABSOLUTE": "Absolutwert",
- "MATH_SINGLE_TOOLTIP_ABS": "Ist der Absolutwert eines Wertes.",
- "MATH_SINGLE_TOOLTIP_NEG": "Negiert einen Wert.",
- "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus eines Wertes.",
- "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus eines Wertes.",
- "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion eines Wertes.",
- "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch Eingabewert.",
+ "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel einer Zahl.",
+ "MATH_SINGLE_OP_ABSOLUTE": "Betrag",
+ "MATH_SINGLE_TOOLTIP_ABS": "Ist der Betrag einer Zahl.",
+ "MATH_SINGLE_TOOLTIP_NEG": "Negiert eine Zahl.",
+ "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus einer Zahl.",
+ "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus einer Zahl.",
+ "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion einer Zahl.",
+ "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch eine Zahl.",
"MATH_TRIG_HELPURL": "https://de.wikipedia.org/wiki/Trigonometrie",
"MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus des Winkels.",
"MATH_TRIG_TOOLTIP_COS": "Ist der Kosinus des Winkels.",
@@ -143,118 +143,118 @@
"MATH_IS_POSITIVE": "ist positiv",
"MATH_IS_NEGATIVE": "ist negativ",
"MATH_IS_DIVISIBLE_BY": "ist teilbar durch",
- "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr (true) oder falsch (false) zurück.",
+ "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder unwahr zurück.",
"MATH_CHANGE_HELPURL": "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement",
"MATH_CHANGE_TITLE": "erhöhe %1 um %2",
- "MATH_CHANGE_TOOLTIP": "Addiert einen Wert zur Variable \"%1\" hinzu.",
+ "MATH_CHANGE_TOOLTIP": "Addiert eine Zahl zu \"%1\".",
"MATH_ROUND_HELPURL": "https://de.wikipedia.org/wiki/Runden",
"MATH_ROUND_TOOLTIP": "Eine Zahl auf- oder abrunden.",
- "MATH_ROUND_OPERATOR_ROUND": "runden",
- "MATH_ROUND_OPERATOR_ROUNDUP": "aufrunden",
- "MATH_ROUND_OPERATOR_ROUNDDOWN": "abrunden",
+ "MATH_ROUND_OPERATOR_ROUND": "runde",
+ "MATH_ROUND_OPERATOR_ROUNDUP": "runde auf",
+ "MATH_ROUND_OPERATOR_ROUNDDOWN": "runde ab",
"MATH_ONLIST_HELPURL": "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel",
- "MATH_ONLIST_OPERATOR_SUM": "Summe einer Liste",
- "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Werte in einer Liste.",
- "MATH_ONLIST_OPERATOR_MIN": "Minimalwert einer Liste",
- "MATH_ONLIST_TOOLTIP_MIN": "Ist der kleinste Wert in einer Liste.",
- "MATH_ONLIST_OPERATOR_MAX": "Maximalwert einer Liste",
- "MATH_ONLIST_TOOLTIP_MAX": "Ist der größte Wert in einer Liste.",
- "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert einer Liste",
- "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Werte in einer Liste.",
- "MATH_ONLIST_OPERATOR_MEDIAN": "Median einer Liste",
- "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Werte in einer Liste.",
- "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in Liste",
- "MATH_ONLIST_TOOLTIP_MODE": "Findet den am häufigsten vorkommenden Wert in einer Liste. Falls kein Wert öfter vorkommt als alle anderen, wird die originale Liste zurückgeben",
- "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung einer Liste",
- "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die standardisierte Standardabweichung aller Werte in der Liste",
- "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert einer Liste",
- "MATH_ONLIST_TOOLTIP_RANDOM": "Gebe einen zufälligen Wert aus der Liste zurück.",
+ "MATH_ONLIST_OPERATOR_SUM": "Summe über die Liste",
+ "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Zahlen in einer Liste.",
+ "MATH_ONLIST_OPERATOR_MIN": "Minimalwert der Liste",
+ "MATH_ONLIST_TOOLTIP_MIN": "Ist die kleinste Zahl in einer Liste.",
+ "MATH_ONLIST_OPERATOR_MAX": "Maximalwert der Liste",
+ "MATH_ONLIST_TOOLTIP_MAX": "Ist die größte Zahl in einer Liste.",
+ "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert der Liste",
+ "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Zahlen in einer Liste.",
+ "MATH_ONLIST_OPERATOR_MEDIAN": "Median der Liste",
+ "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Zahlen in einer Liste.",
+ "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in der Liste",
+ "MATH_ONLIST_TOOLTIP_MODE": "Findet die Werte mit dem häufigstem Vorkommen in der Liste.",
+ "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung der Liste",
+ "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die Standardabweichung aller Werte in der Liste.",
+ "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert aus der Liste",
+ "MATH_ONLIST_TOOLTIP_RANDOM": "Gibt einen zufälligen Wert aus der Liste zurück.",
"MATH_MODULO_HELPURL": "https://de.wikipedia.org/wiki/Modulo",
"MATH_MODULO_TITLE": "Rest von %1 ÷ %2",
"MATH_MODULO_TOOLTIP": "Der Rest nach einer Division.",
- "MATH_CONSTRAIN_TITLE": "begrenze %1 von %2 bis %3",
- "MATH_CONSTRAIN_TOOLTIP": "Begrenzt den Wertebereich auf den \"von\"-Wert bis einschließlich zum \"bis\"-Wert. (inklusiv)",
+ "MATH_CONSTRAIN_TITLE": "begrenze %1 zwischen %2 und %3",
+ "MATH_CONSTRAIN_TOOLTIP": "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv).",
"MATH_RANDOM_INT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen",
- "MATH_RANDOM_INT_TITLE": "ganzzahliger Zufallswert zwischen %1 bis %2",
- "MATH_RANDOM_INT_TOOLTIP": "Erzeuge einen ganzzahligen Zufallswert zwischen zwei Werten (inklusiv).",
+ "MATH_RANDOM_INT_TITLE": "ganzzahlige Zufallszahl zwischen %1 und %2",
+ "MATH_RANDOM_INT_TOOLTIP": "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv).",
"MATH_RANDOM_FLOAT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen",
- "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 -1.0)",
- "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeuge eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).",
+ "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 - 1.0)",
+ "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).",
"TEXT_TEXT_HELPURL": "https://de.wikipedia.org/wiki/Zeichenkette",
"TEXT_TEXT_TOOLTIP": "Ein Buchstabe, Text oder Satz.",
"TEXT_JOIN_HELPURL": "",
- "TEXT_JOIN_TITLE_CREATEWITH": "Erstelle Text aus",
+ "TEXT_JOIN_TITLE_CREATEWITH": "erstelle Text aus",
"TEXT_JOIN_TOOLTIP": "Erstellt einen Text durch das Verbinden von mehreren Textelementen.",
"TEXT_CREATE_JOIN_TITLE_JOIN": "verbinden",
"TEXT_CREATE_JOIN_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.",
"TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ein Element zum Text hinzufügen.",
- "TEXT_APPEND_TO": "An",
+ "TEXT_APPEND_TO": "an",
"TEXT_APPEND_APPENDTEXT": "Text anhängen",
"TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" anhängen.",
- "TEXT_LENGTH_TITLE": "Länge %1",
- "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text. (inkl. Leerzeichen)",
- "TEXT_ISEMPTY_TITLE": "%1 ist leer?",
- "TEXT_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn der Text keine Zeichen enthält ist.",
+ "TEXT_LENGTH_TITLE": "Länge von %1",
+ "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).",
+ "TEXT_ISEMPTY_TITLE": "%1 ist leer",
+ "TEXT_ISEMPTY_TOOLTIP": "Ist wahr, falls der Text keine Zeichen enthält ist.",
"TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
- "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs oder 0 zurück.",
+ "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder 0 falls der Suchbegriff nicht gefunden wurde.",
"TEXT_INDEXOF_INPUT_INTEXT": "im Text",
- "TEXT_INDEXOF_OPERATOR_FIRST": "Suche erstes Auftreten des Begriffs",
- "TEXT_INDEXOF_OPERATOR_LAST": "Suche letztes Auftreten des Begriffs",
+ "TEXT_INDEXOF_OPERATOR_FIRST": "suche erstes Auftreten des Begriffs",
+ "TEXT_INDEXOF_OPERATOR_LAST": "suche letztes Auftreten des Begriffs",
"TEXT_INDEXOF_TAIL": "",
"TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
"TEXT_CHARAT_INPUT_INTEXT": "vom Text",
- "TEXT_CHARAT_FROM_START": "Nehme #ten Buchstaben",
- "TEXT_CHARAT_FROM_END": "Nehme #ten Buchstaben von hinten",
- "TEXT_CHARAT_FIRST": "Nehme ersten Buchstaben",
- "TEXT_CHARAT_LAST": "Nehme letzten Buchstaben",
- "TEXT_CHARAT_RANDOM": "Nehme zufälligen Buchstaben",
+ "TEXT_CHARAT_FROM_START": "nehme #ten Buchstaben",
+ "TEXT_CHARAT_FROM_END": "nehme #ten Buchstaben von hinten",
+ "TEXT_CHARAT_FIRST": "nehme ersten Buchstaben",
+ "TEXT_CHARAT_LAST": "nehme letzten Buchstaben",
+ "TEXT_CHARAT_RANDOM": "nehme zufälligen Buchstaben",
"TEXT_CHARAT_TAIL": "",
- "TEXT_CHARAT_TOOLTIP": "Extrahiere einen Buchstaben von einer spezifizierten Position.",
+ "TEXT_CHARAT_TOOLTIP": "Extrahiert einen Buchstaben von einer bestimmten Position.",
"TEXT_GET_SUBSTRING_TOOLTIP": "Gibt den angegebenen Textabschnitt zurück.",
"TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
- "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in Text",
- "TEXT_GET_SUBSTRING_START_FROM_START": "vom #ten Buchstaben",
- "TEXT_GET_SUBSTRING_START_FROM_END": "vom #ten Buchstaben von hinten",
- "TEXT_GET_SUBSTRING_START_FIRST": "vom ersten Buchstaben",
+ "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "im Text",
+ "TEXT_GET_SUBSTRING_START_FROM_START": "nehme Teil ab #tem Buchstaben",
+ "TEXT_GET_SUBSTRING_START_FROM_END": "nehme Teil ab #tem Buchstaben von hinten",
+ "TEXT_GET_SUBSTRING_START_FIRST": "nehme Teil ab erstem Buchstaben",
"TEXT_GET_SUBSTRING_END_FROM_START": "bis zum #ten Buchstaben",
"TEXT_GET_SUBSTRING_END_FROM_END": "bis zum #ten Buchstaben von hinten",
"TEXT_GET_SUBSTRING_END_LAST": "bis zum letzten Buchstaben",
"TEXT_GET_SUBSTRING_TAIL": "",
"TEXT_CHANGECASE_TOOLTIP": "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein.",
- "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "umwandeln in GROSSBUCHSTABEN",
- "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "umwandeln in kleinbuchstaben",
- "TEXT_CHANGECASE_OPERATOR_TITLECASE": "umwandeln in Substantive",
+ "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "wandel um in GROSSBUCHSTABEN",
+ "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "wandel um in kleinbuchstaben",
+ "TEXT_CHANGECASE_OPERATOR_TITLECASE": "wandel um in Substantive",
"TEXT_TRIM_TOOLTIP": "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.",
"TEXT_TRIM_OPERATOR_BOTH": "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)",
"TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeichen vom Anfang (links)",
"TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeichen vom Ende (rechts)",
- "TEXT_PRINT_TITLE": "Ausgabe %1",
- "TEXT_PRINT_TOOLTIP": "Gib den Inhalt einer Variable aus.",
- "TEXT_PROMPT_TYPE_TEXT": "Fragt nach Text mit Hinweis",
- "TEXT_PROMPT_TYPE_NUMBER": "Fragt nach Zahl mit Hinweis",
+ "TEXT_PRINT_TITLE": "gib aus %1",
+ "TEXT_PRINT_TOOLTIP": "Gibt den Text aus.",
+ "TEXT_PROMPT_TYPE_TEXT": "frage nach Text mit Hinweis",
+ "TEXT_PROMPT_TYPE_NUMBER": "frage nach Zahl mit Hinweis",
"TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.",
"TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.",
"LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list",
- "LISTS_CREATE_EMPTY_TITLE": "Erzeuge eine leere Liste",
+ "LISTS_CREATE_EMPTY_TITLE": "erzeuge eine leere Liste",
"LISTS_CREATE_EMPTY_TOOLTIP": "Erzeugt eine leere Liste ohne Inhalt.",
"LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with",
- "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine List mit konfigurierten Elementen.",
- "LISTS_CREATE_WITH_INPUT_WITH": "Erzeuge Liste mit",
+ "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine Liste aus den angegebenen Elementen.",
+ "LISTS_CREATE_WITH_INPUT_WITH": "erzeuge Liste mit",
"LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste",
"LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.",
"LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.",
"LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
"LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen",
- "LISTS_REPEAT_TITLE": "Erzeuge Liste mit Element %1 wiederhole es %2 mal",
+ "LISTS_REPEAT_TITLE": "erzeuge Liste mit %2 mal dem Element %1",
"LISTS_LENGTH_TITLE": "Länge von %1",
"LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.",
- "LISTS_ISEMPTY_TITLE": "%1 ist leer?",
- "LISTS_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn die Liste leer ist.",
- "LISTS_INLIST": "von der Liste",
+ "LISTS_ISEMPTY_TITLE": "%1 ist leer",
+ "LISTS_ISEMPTY_TOOLTIP": "Ist wahr, falls die Liste leer ist.",
+ "LISTS_INLIST": "in der Liste",
"LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
"LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von",
"LISTS_INDEX_OF_LAST": "suche letztes Auftreten von",
- "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.",
+ "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.",
"LISTS_GET_INDEX_GET": "nimm",
"LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne",
"LISTS_GET_INDEX_REMOVE": "entferne",
@@ -264,32 +264,32 @@
"LISTS_GET_INDEX_LAST": "letztes",
"LISTS_GET_INDEX_RANDOM": "zufälliges",
"LISTS_GET_INDEX_TAIL": "",
- "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiere das #1te Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiere das #1te Element aus Ende der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiere das erste Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiere das letzte Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiere ein zufälliges Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiere und entfernt das #1te Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiere und entfernt das #1te Element aus Ende der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiere und entfernt das erste Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiere und entfernt das letzte Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiere und entfernt ein zufälliges Element aus der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element von der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element von Ende der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element von der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element von der Liste.",
- "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element von der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiert das #1te Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiert das #1te Element aus Ende der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiert das erste Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiert das letzte Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiert ein zufälliges Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiert und entfernt das #1te Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiert und entfernt das #1te Element aus Ende der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiert und entfernt das erste Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiert und entfernt das letzte Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiert und entfernt ein zufälliges Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element vom Ende der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element aus der Liste.",
+ "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element aus der Liste.",
"LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
- "LISTS_SET_INDEX_SET": "setze",
- "LISTS_SET_INDEX_INSERT": "füge",
+ "LISTS_SET_INDEX_SET": "setze für",
+ "LISTS_SET_INDEX_INSERT": "füge als",
"LISTS_SET_INDEX_INPUT_TO": "ein",
- "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.",
+ "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzt das Element an der angegebenen Position in der Liste. #1 ist das erste Element.",
"LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.",
"LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setzt das erste Element in der Liste.",
- "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in der Liste.",
+ "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in die Liste.",
"LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt ein zufälliges Element in der Liste.",
- "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.",
- "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.",
+ "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fügt das Element an der angegebenen Position in die Liste ein. #1 ist das erste Element.",
+ "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fügt das Element an der angegebenen Position in die Liste ein. #1 ist das letzte Element.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fügt das Element an den Anfang der Liste an.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fügt das Element ans Ende der Liste an.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fügt das Element zufällig in die Liste ein.",
@@ -309,7 +309,7 @@
"LISTS_SORT_ORDER_DESCENDING": "absteigend",
"LISTS_SORT_TYPE_NUMERIC": "numerisch",
"LISTS_SORT_TYPE_TEXT": "alphabetisch",
- "LISTS_SORT_TYPE_IGNORECASE": "alphabetisch, Schreibung ignorieren",
+ "LISTS_SORT_TYPE_IGNORECASE": "alphabetisch, Großschreibung ignorieren",
"LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists",
"LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen",
"LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen",
@@ -321,12 +321,12 @@
"VARIABLES_GET_TOOLTIP": "Gibt den Wert der Variable zurück.",
"VARIABLES_GET_CREATE_SET": "Erzeuge \"Schreibe %1\"",
"VARIABLES_SET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29",
- "VARIABLES_SET": "Schreibe %1 %2",
+ "VARIABLES_SET": "setze %1 auf %2",
"VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.",
"VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"",
"PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29",
- "PROCEDURES_DEFNORETURN_TITLE": "zu",
- "PROCEDURES_DEFNORETURN_PROCEDURE": "Funktionsblock",
+ "PROCEDURES_DEFNORETURN_TITLE": "",
+ "PROCEDURES_DEFNORETURN_PROCEDURE": "etwas tun",
"PROCEDURES_BEFORE_PARAMS": "mit:",
"PROCEDURES_CALL_BEFORE_PARAMS": "mit:",
"PROCEDURES_DEFNORETURN_DO": "",
@@ -347,7 +347,7 @@
"PROCEDURES_MUTATORARG_TOOLTIP": "Eine Eingabe zur Funktion hinzufügen.",
"PROCEDURES_HIGHLIGHT_DEF": "Markiere Funktionsblock",
"PROCEDURES_CREATE_DO": "Erzeuge \"Aufruf %1\"",
- "PROCEDURES_IFRETURN_TOOLTIP": "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.",
+ "PROCEDURES_IFRETURN_TOOLTIP": "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.",
"PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause",
- "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden."
+ "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden."
}
From b51547826dd36c407967ca6ec1c7c8568ef7b75a Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Fri, 8 Jul 2016 17:26:13 -0700
Subject: [PATCH 12/25] Remove AUTH, CHAT, ME messages in all languages.
---
msg/js/ar.js | 3 ---
msg/js/az.js | 3 ---
msg/js/ba.js | 3 ---
msg/js/bcc.js | 3 ---
msg/js/be-tarask.js | 3 ---
msg/js/bg.js | 3 ---
msg/js/bn.js | 3 ---
msg/js/br.js | 3 ---
msg/js/ca.js | 3 ---
msg/js/cs.js | 3 ---
msg/js/da.js | 3 ---
msg/js/de.js | 3 ---
msg/js/el.js | 3 ---
msg/js/en.js | 3 ---
msg/js/es.js | 3 ---
msg/js/fa.js | 3 ---
msg/js/fi.js | 3 ---
msg/js/fr.js | 3 ---
msg/js/he.js | 3 ---
msg/js/hi.js | 3 ---
msg/js/hrx.js | 3 ---
msg/js/hu.js | 3 ---
msg/js/ia.js | 3 ---
msg/js/id.js | 3 ---
msg/js/is.js | 3 ---
msg/js/it.js | 3 ---
msg/js/ja.js | 3 ---
msg/js/ko.js | 3 ---
msg/js/lb.js | 3 ---
msg/js/lki.js | 3 ---
msg/js/lrc.js | 3 ---
msg/js/lt.js | 3 ---
msg/js/mk.js | 3 ---
msg/js/ms.js | 3 ---
msg/js/nb.js | 3 ---
msg/js/nl.js | 3 ---
msg/js/oc.js | 3 ---
msg/js/pl.js | 3 ---
msg/js/pms.js | 3 ---
msg/js/pt-br.js | 3 ---
msg/js/pt.js | 3 ---
msg/js/ro.js | 3 ---
msg/js/ru.js | 3 ---
msg/js/sc.js | 3 ---
msg/js/sd.js | 3 ---
msg/js/shn.js | 3 ---
msg/js/sk.js | 3 ---
msg/js/sl.js | 3 ---
msg/js/sq.js | 3 ---
msg/js/sr.js | 3 ---
msg/js/sv.js | 3 ---
msg/js/ta.js | 3 ---
msg/js/tcy.js | 3 ---
msg/js/th.js | 3 ---
msg/js/tl.js | 3 ---
msg/js/tlh.js | 3 ---
msg/js/tr.js | 3 ---
msg/js/uk.js | 3 ---
msg/js/vi.js | 3 ---
msg/js/zh-hans.js | 3 ---
msg/js/zh-hant.js | 3 ---
msg/json/ar.json | 2 --
msg/json/az.json | 1 -
msg/json/ba.json | 3 ---
msg/json/bcc.json | 3 ---
msg/json/be-tarask.json | 3 ---
msg/json/bg.json | 3 ---
msg/json/bn.json | 2 --
msg/json/br.json | 3 ---
msg/json/ca.json | 3 ---
msg/json/cs.json | 3 ---
msg/json/da.json | 3 ---
msg/json/de.json | 3 ---
msg/json/el.json | 3 ---
msg/json/en.json | 3 ---
msg/json/es.json | 3 ---
msg/json/fa.json | 3 ---
msg/json/fi.json | 3 ---
msg/json/fr.json | 3 ---
msg/json/he.json | 3 ---
msg/json/hi.json | 3 ---
msg/json/hrx.json | 3 ---
msg/json/hu.json | 3 ---
msg/json/ia.json | 3 ---
msg/json/id.json | 3 ---
msg/json/is.json | 3 ---
msg/json/it.json | 3 ---
msg/json/ja.json | 2 --
msg/json/ko.json | 3 ---
msg/json/lb.json | 2 --
msg/json/lki.json | 3 ---
msg/json/lrc.json | 1 -
msg/json/lt.json | 3 ---
msg/json/mk.json | 3 ---
msg/json/ms.json | 3 ---
msg/json/nb.json | 3 ---
msg/json/nl.json | 3 ---
msg/json/oc.json | 1 -
msg/json/pl.json | 3 ---
msg/json/pms.json | 3 ---
msg/json/pt-br.json | 3 ---
msg/json/pt.json | 3 ---
msg/json/qqq.json | 3 ---
msg/json/ro.json | 3 ---
msg/json/ru.json | 3 ---
msg/json/sc.json | 3 ---
msg/json/sd.json | 2 --
msg/json/shn.json | 3 ---
msg/json/sk.json | 3 ---
msg/json/sl.json | 3 ---
msg/json/sr.json | 3 ---
msg/json/sv.json | 3 ---
msg/json/ta.json | 3 ---
msg/json/tcy.json | 3 ---
msg/json/th.json | 3 ---
msg/json/tlh.json | 2 --
msg/json/tr.json | 3 ---
msg/json/uk.json | 3 ---
msg/json/vi.json | 3 ---
msg/json/zh-hans.json | 3 ---
msg/json/zh-hant.json | 3 ---
msg/messages.js | 8 --------
122 files changed, 359 deletions(-)
diff --git a/msg/js/ar.js b/msg/js/ar.js
index adb016dee..cc28e2e97 100644
--- a/msg/js/ar.js
+++ b/msg/js/ar.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ar');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "اضافة تعليق";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "تغيير قيمة:";
-Blockly.Msg.CHAT = "دردش مع زملائك بالكتابة في هذا الصندوق!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "إخفاء القطع";
Blockly.Msg.COLLAPSE_BLOCK = "إخفاء القطعة";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "يرجع قوس الظل للرقم.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "يرجع الظل لدرجة (لا دائرة نصف قطرية).";
-Blockly.Msg.ME = "أنا";
Blockly.Msg.NEW_VARIABLE = "متغير جديد...";
Blockly.Msg.NEW_VARIABLE_TITLE = "اسم المتغير الجديد:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/az.js b/msg/js/az.js
index a186c6309..7df8892e3 100644
--- a/msg/js/az.js
+++ b/msg/js/az.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.az');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Şərh əlavə et";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "Qiyməti dəyiş:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated
Blockly.Msg.CLEAN_UP = "Blokları təmizlə";
Blockly.Msg.COLLAPSE_ALL = "Blokları yığ";
Blockly.Msg.COLLAPSE_BLOCK = "Bloku yığ";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ədədin arctanqensini qaytarır.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Dərəcənin kosinusunu qaytarır (radianın yox).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Dərəcənin sinusunu qaytar (radianın yox).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Dərəcənin tangensini qaytar (radianın yox).";
-Blockly.Msg.ME = "Mənə";
Blockly.Msg.NEW_VARIABLE = "Yeni dəyişən...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni dəyişənin adı:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ba.js b/msg/js/ba.js
index 4b0f93398..48f7ee4a7 100644
--- a/msg/js/ba.js
+++ b/msg/js/ba.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ba');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Фекер өҫтәргә";
-Blockly.Msg.AUTH = "Зинһар, эшегеҙҙе һаҡлап һәм уның менән артабан уртаҡлашыу мөмкин булһын өсөн, был ҡушымтаны танытып ҡуйығыҙ.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Мәғәнәне үҙгәртегеҙ:";
-Blockly.Msg.CHAT = "Был яланды тултырғанда, хеҙмәттәшегеҙ менән аралашығыҙ";
Blockly.Msg.CLEAN_UP = "Блоктарҙы таҙартырға";
Blockly.Msg.COLLAPSE_ALL = "Блоктарҙы төрөргә";
Blockly.Msg.COLLAPSE_BLOCK = "Блокты төрөргә";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Арктангенсты градуста
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Мөйөштөң косинусын градустарҙа ҡайтара.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Мөйөштөң синусын градустарҙа ҡайтара.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Мөйөштөң тангенсын градустарҙа күрһәтә.";
-Blockly.Msg.ME = "Миңә";
Blockly.Msg.NEW_VARIABLE = "Яңы үҙгәреүсән...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Яңы үҙгәреүсәндең исеме:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/bcc.js b/msg/js/bcc.js
index e1949722c..a584c8a4e 100644
--- a/msg/js/bcc.js
+++ b/msg/js/bcc.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.bcc');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "افزودن نظر";
-Blockly.Msg.AUTH = "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراکگذاری توسط شما داده شود.";
Blockly.Msg.CHANGE_VALUE_TITLE = "تغییر مقدار:";
-Blockly.Msg.CHAT = "با همکارتان با نوشتن در این کادر چت کنید!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "فروپاشی بلوکها";
Blockly.Msg.COLLAPSE_BLOCK = "فروپاشی بلوک";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرکتانژان
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان).";
-Blockly.Msg.ME = "من";
Blockly.Msg.NEW_VARIABLE = "متغیر تازه...";
Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/be-tarask.js b/msg/js/be-tarask.js
index fd9cea44e..5380de17b 100644
--- a/msg/js/be-tarask.js
+++ b/msg/js/be-tarask.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.be.tarask');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Дадаць камэнтар";
-Blockly.Msg.AUTH = "Калі ласка, аўтарызуйце гэтае прыкладаньне, каб можна было захоўваць Вашую працу і мець магчымасьць дзяліцца ёю.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Зьмяніць значэньне:";
-Blockly.Msg.CHAT = "Стасуйцеся са сваім калегам, набіраючы тэкст у гэтым полі!";
Blockly.Msg.CLEAN_UP = "Ачысьціць блёкі";
Blockly.Msg.COLLAPSE_ALL = "Згарнуць блёкі";
Blockly.Msg.COLLAPSE_BLOCK = "Згарнуць блёк";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Вяртае арктангэнс ліку
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Вяртае косынус кута ў градусах.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Вяртае сынус кута ў градусах.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Вяртае тангэнс кута ў градусах.";
-Blockly.Msg.ME = "Я";
Blockly.Msg.NEW_VARIABLE = "Новая зьменная…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Імя новай зьменнай:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/bg.js b/msg/js/bg.js
index 36c1ca314..505dce432 100644
--- a/msg/js/bg.js
+++ b/msg/js/bg.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.bg');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Добави коментар";
-Blockly.Msg.AUTH = "Позволи на приложението да записва и споделя работата ти.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Промени стойността:";
-Blockly.Msg.CHAT = "Говори с колега, като пишеш в това поле!";
Blockly.Msg.CLEAN_UP = "Премахни блокове";
Blockly.Msg.COLLAPSE_ALL = "Скрий блокове";
Blockly.Msg.COLLAPSE_BLOCK = "Скрий блок";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Върни аркустангенс от
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Върни косинус от ъгъл в градуси (не в радиани)";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Върни синус от ъгъл в градуси (не в радиани)";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Върни тангенс от ъгъл в градуси (не в радиани)";
-Blockly.Msg.ME = "Аз";
Blockly.Msg.NEW_VARIABLE = "Нова променлива...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Ново име на променливата:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/bn.js b/msg/js/bn.js
index b6b23179b..45bda37d7 100644
--- a/msg/js/bn.js
+++ b/msg/js/bn.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.bn');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "মন্তব্য যোগ করুন";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "মান পরিবর্তন করুন:";
-Blockly.Msg.CHAT = "এই বাক্সে লিখার মাধ্যমে আপনার সহযোগীর সাথে আলাপ করুন!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; // untranslated
Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block"; // untranslated
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "আমাকে";
Blockly.Msg.NEW_VARIABLE = "নতুন চলক...";
Blockly.Msg.NEW_VARIABLE_TITLE = "নতুন চলকের নাম:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/br.js b/msg/js/br.js
index 180104806..54bbe8a1e 100644
--- a/msg/js/br.js
+++ b/msg/js/br.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.br');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Ouzhpennañ un evezhiadenn";
-Blockly.Msg.AUTH = "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Kemmañ an dalvoudenn :";
-Blockly.Msg.CHAT = "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !";
Blockly.Msg.CLEAN_UP = "Naetaat ar bloc'hoù";
Blockly.Msg.COLLAPSE_ALL = "Bihanaat ar bloc'hoù";
Blockly.Msg.COLLAPSE_BLOCK = "Bihanaat ar bloc'h";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Distreiñ ark tangent un niver";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Distreiñ kosinuz ur c'horn (ket e radianoù)";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Distreiñ sinuz ur c'horn (ket e radianoù)";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Distreiñ tangent ur c'horn (ket e radianoù).";
-Blockly.Msg.ME = "Me";
Blockly.Msg.NEW_VARIABLE = "Argemmenn nevez...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Anv an argemmenn nevez :";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ca.js b/msg/js/ca.js
index d85028f95..8d5bd5aec 100644
--- a/msg/js/ca.js
+++ b/msg/js/ca.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ca');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Afegeix un comentari";
-Blockly.Msg.AUTH = "Si us plau, autoritzeu que aquesta aplicació pugui desar la vostra feina i que la pugueu compartir.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Canvia valor:";
-Blockly.Msg.CHAT = "Xateja amb el teu col·laborador escrivint en aquest quadre!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Contraure blocs";
Blockly.Msg.COLLAPSE_BLOCK = "Contraure bloc";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna l'arctangent d'un nombre.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna el cosinus d'un grau (no radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna el sinus d'un grau (no radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna la tangent d'un grau (no radiant).";
-Blockly.Msg.ME = "Jo";
Blockly.Msg.NEW_VARIABLE = "Nova variable...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nou nom de variable:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/cs.js b/msg/js/cs.js
index 5658659f2..9fcb97f82 100644
--- a/msg/js/cs.js
+++ b/msg/js/cs.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.cs');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Přidat komentář";
-Blockly.Msg.AUTH = "Prosím udělte oprávnění této aplikaci aby jste mohli uložit a sdílet svou práci.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Změnit hodnotu:";
-Blockly.Msg.CHAT = "Psaním do tohoto políčka komunikujte se spolupracovníky!";
Blockly.Msg.CLEAN_UP = "Uspořádat bloky";
Blockly.Msg.COLLAPSE_ALL = "Sbalit bloky";
Blockly.Msg.COLLAPSE_BLOCK = "Sbalit blok";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrátí arkus tangens čísla.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrátí kosinus úhlu ve stupních.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrátí sinus úhlu ve stupních.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrátí tangens úhlu ve stupních.";
-Blockly.Msg.ME = "Já";
Blockly.Msg.NEW_VARIABLE = "Nová proměnná...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nový název proměnné:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/da.js b/msg/js/da.js
index b21e19da1..f64d3d907 100644
--- a/msg/js/da.js
+++ b/msg/js/da.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.da');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Tilføj kommentar";
-Blockly.Msg.AUTH = "Tillad venligst at denne app muliggør at du kan gemme dit arbejde og at du kan dele det.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Skift værdi:";
-Blockly.Msg.CHAT = "Chat med din samarbejdspartner ved at skrive i denne boks!";
Blockly.Msg.CLEAN_UP = "Ryd op i blokke";
Blockly.Msg.COLLAPSE_ALL = "Fold blokkene sammen";
Blockly.Msg.COLLAPSE_BLOCK = "Fold blokken sammen";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnere arcus tangens af et tal.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returnere cosinus af en vinkel (i grader).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returnere sinus af en vinkel (i grader).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returnere tangens af en vinkel (i grader).";
-Blockly.Msg.ME = "Mig";
Blockly.Msg.NEW_VARIABLE = "Ny variabel...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Navn til den nye variabel:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/de.js b/msg/js/de.js
index ce7f95227..dbd1822f6 100644
--- a/msg/js/de.js
+++ b/msg/js/de.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.de');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Kommentar hinzufügen";
-Blockly.Msg.AUTH = "Bitte autorisiere diese App um deine Arbeit speichern und teilen zu können.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Wert ändern:";
-Blockly.Msg.CHAT = "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!";
Blockly.Msg.CLEAN_UP = "Bausteine aufräumen";
Blockly.Msg.COLLAPSE_ALL = "Alle Bausteine zusammenfalten";
Blockly.Msg.COLLAPSE_BLOCK = "Baustein zusammenfalten";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arkustangens des Eingabewertes.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Kosinus des Winkels.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus des Winkels.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens des Winkels.";
-Blockly.Msg.ME = "Ich";
Blockly.Msg.NEW_VARIABLE = "Neue Variable …";
Blockly.Msg.NEW_VARIABLE_TITLE = "Name der neuen Variable:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/el.js b/msg/js/el.js
index 33cd53110..f7c3dd827 100644
--- a/msg/js/el.js
+++ b/msg/js/el.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.el');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Πρόσθεσε Το Σχόλιο";
-Blockly.Msg.AUTH = "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Άλλαξε την τιμή:";
-Blockly.Msg.CHAT = "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Σύμπτυξτε Όλα Τα Μπλοκ";
Blockly.Msg.COLLAPSE_BLOCK = "Σύμπτυξε Το Μπλοκ";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Επιστρέφει το τόξο εφα
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Επιστρέφει το συνημίτονο ενός βαθμού (όχι ακτινίου).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Επιστρέφει το ημίτονο ενός βαθμού (όχι ακτινίου).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Επιστρέφει την εφαπτομένη ενός βαθμού (όχι ακτινίου).";
-Blockly.Msg.ME = "Εγώ";
Blockly.Msg.NEW_VARIABLE = "Νέα μεταβλητή...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Νέο όνομα μεταβλητής:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/en.js b/msg/js/en.js
index d33ae9638..6c586caa3 100644
--- a/msg/js/en.js
+++ b/msg/js/en.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.en');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Add Comment";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks";
Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks";
Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian).";
-Blockly.Msg.ME = "Me";
Blockly.Msg.NEW_VARIABLE = "New variable...";
Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/es.js b/msg/js/es.js
index cfa545cf2..913489e0f 100644
--- a/msg/js/es.js
+++ b/msg/js/es.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.es');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Añadir comentario";
-Blockly.Msg.AUTH = "Autoriza a esta aplicación para guardar tu trabajo y permitir que lo compartas.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar el valor:";
-Blockly.Msg.CHAT = "¡Chatea con tu colaborador escribiendo en este cuadro!";
Blockly.Msg.CLEAN_UP = "Limpiar los bloques";
Blockly.Msg.COLLAPSE_ALL = "Contraer bloques";
Blockly.Msg.COLLAPSE_BLOCK = "Contraer bloque";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Devuelve el arcotangente de un número.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Devuelve el coseno de un grado (no radián).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Devuelve el seno de un grado (no radián).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Devuelve la tangente de un grado (no radián).";
-Blockly.Msg.ME = "Yo";
Blockly.Msg.NEW_VARIABLE = "Variable nueva…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nombre de variable nueva:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/fa.js b/msg/js/fa.js
index f205bffdf..c6c447467 100644
--- a/msg/js/fa.js
+++ b/msg/js/fa.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.fa');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "افزودن نظر";
-Blockly.Msg.AUTH = "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراکگذاری توسط شما داده شود.";
Blockly.Msg.CHANGE_VALUE_TITLE = "تغییر مقدار:";
-Blockly.Msg.CHAT = "با همکارتان با نوشتن در این کادر چت کنید!";
Blockly.Msg.CLEAN_UP = "تمیز کردن بلوکها";
Blockly.Msg.COLLAPSE_ALL = "فروپاشی بلوکها";
Blockly.Msg.COLLAPSE_BLOCK = "فروپاشی بلوک";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرکتانژان
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان).";
-Blockly.Msg.ME = "من";
Blockly.Msg.NEW_VARIABLE = "متغیر تازه...";
Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/fi.js b/msg/js/fi.js
index ab84ec021..62c8c6fc3 100644
--- a/msg/js/fi.js
+++ b/msg/js/fi.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.fi');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Lisää kommentti";
-Blockly.Msg.AUTH = "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Muuta arvoa:";
-Blockly.Msg.CHAT = "Keskustele yhteistyökumppanisi kanssa kirjoittamalla tähän kenttään!";
Blockly.Msg.CLEAN_UP = "Siivoa lohkot";
Blockly.Msg.COLLAPSE_ALL = "Sulje lohkot";
Blockly.Msg.COLLAPSE_BLOCK = "Sulje lohko";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Palauttaa luvun arkustangentin.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Palauttaa asteluvun (ei radiaanin) kosinin.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Palauttaa asteluvun (ei radiaanin) sinin.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Palauttaa asteluvun (ei radiaanin) tangentin.";
-Blockly.Msg.ME = "Minä";
Blockly.Msg.NEW_VARIABLE = "Uusi muuttuja...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Uuden muuttujan nimi:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/fr.js b/msg/js/fr.js
index 2bf8c73d0..0b6ee1395 100644
--- a/msg/js/fr.js
+++ b/msg/js/fr.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.fr');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Ajouter un commentaire";
-Blockly.Msg.AUTH = "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser d'être partagé par vous.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Modifier la valeur :";
-Blockly.Msg.CHAT = "Discutez avec votre collaborateur en tapant dans cette zone !";
Blockly.Msg.CLEAN_UP = "Nettoyer les blocs";
Blockly.Msg.COLLAPSE_ALL = "Réduire les blocs";
Blockly.Msg.COLLAPSE_BLOCK = "Réduire le bloc";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Renvoie l’arctangente d’un nombre.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Renvoie le cosinus d’un angle en degrés (pas en radians).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Renvoie le sinus d’un angle en degrés (pas en radians).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Renvoie la tangente d’un angle en degrés (pas en radians).";
-Blockly.Msg.ME = "Moi";
Blockly.Msg.NEW_VARIABLE = "Nouvelle variable…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nouveau nom de la variable :";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/he.js b/msg/js/he.js
index 15e584fe1..f9821d03b 100644
--- a/msg/js/he.js
+++ b/msg/js/he.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.he');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "הוסף תגובה";
-Blockly.Msg.AUTH = "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך.";
Blockly.Msg.CHANGE_VALUE_TITLE = "שנה ערך:";
-Blockly.Msg.CHAT = "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!";
Blockly.Msg.CLEAN_UP = "סידור בלוקים";
Blockly.Msg.COLLAPSE_ALL = "צמצם קטעי קוד";
Blockly.Msg.COLLAPSE_BLOCK = "צמצם קטע קוד";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "החזרת הקוסינוס של מעלה (לא רדיאן).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "החזרת הסינוס של מעלה (לא רדיאן).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "החזרת הטנגס של מעלה (לא רדיאן).";
-Blockly.Msg.ME = "אותי";
Blockly.Msg.NEW_VARIABLE = "משתנה חדש...";
Blockly.Msg.NEW_VARIABLE_TITLE = "שם המשתנה החדש:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/hi.js b/msg/js/hi.js
index e4ee6427b..75381b197 100644
--- a/msg/js/hi.js
+++ b/msg/js/hi.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.hi');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "टिप्पणी छोड़ें";
-Blockly.Msg.AUTH = "अपने कार्य को सहेजना सक्षम करने और अपने साथ इसे साझा करने हेतु कृपया इस एप्प को अधिकृत करें।";
Blockly.Msg.CHANGE_VALUE_TITLE = "मान परिवर्तित करें:";
-Blockly.Msg.CHAT = "इस सन्दूक में लिखकर हमारे सहयोगी के साथ बातचीत करें!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "ब्लॉक संक्षिप्त करें";
Blockly.Msg.COLLAPSE_BLOCK = "ब्लॉक को संक्षिप्त करें";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "संख्या का आर्कट
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "डिग्री का कोसाइन रिटर्न करें (रेडियन नही)";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "डिग्री का साइन रिटर्न करें (रेडियन नही)";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "डिग्री का टैन्जन्ट रिटर्न करें (रेडियन नही)";
-Blockly.Msg.ME = "मैं";
Blockly.Msg.NEW_VARIABLE = "नया चर...";
Blockly.Msg.NEW_VARIABLE_TITLE = "नए चर का नाम:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/hrx.js b/msg/js/hrx.js
index bbe6bffe4..7f2d7e3f2 100644
--- a/msg/js/hrx.js
+++ b/msg/js/hrx.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.hrx');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Kommentar hinzufüche";
-Blockly.Msg.AUTH = "Weart ännre:";
Blockly.Msg.CHANGE_VALUE_TITLE = "Neie Variable...";
-Blockly.Msg.CHAT = "Sprech mit unsrem Mitoorweiter doorrich renschreiwe von Text hier in den Kaste!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Blocke zusammerfalte";
Blockly.Msg.COLLAPSE_BLOCK = "Block zusammerfalte";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arcustangens von en Ingäbweart.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Cosinus von en Winkel.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus von en Winkel.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens von en Winkel.";
-Blockly.Msg.ME = "Ich";
Blockly.Msg.NEW_VARIABLE = "Neie Variable...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Die neie Variable sei Noome:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/hu.js b/msg/js/hu.js
index 60fa8db0c..2cc8d039e 100644
--- a/msg/js/hu.js
+++ b/msg/js/hu.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.hu');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Megjegyzés hozzáadása";
-Blockly.Msg.AUTH = "Kérjük, engedélyezd az alkalmazásnak munkád elmentését és megosztását.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Érték módosítása:";
-Blockly.Msg.CHAT = "Ebben a mezőben tudsz a közreműködőkkel beszélgetni!";
Blockly.Msg.CLEAN_UP = "Blokkok kiürítése";
Blockly.Msg.COLLAPSE_ALL = "Blokkok összecsukása";
Blockly.Msg.COLLAPSE_BLOCK = "Blokk összecsukása";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A fokban megadott szög arkusz tangens ér
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A fokban megadott szög koszinusz értéke.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A fokban megadott szög szinusz értéke.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A fokban megadott szög tangens értéke.";
-Blockly.Msg.ME = "Én";
Blockly.Msg.NEW_VARIABLE = "Új változó...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Az új változó neve:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ".";
diff --git a/msg/js/ia.js b/msg/js/ia.js
index c44402c48..747ec7a7a 100644
--- a/msg/js/ia.js
+++ b/msg/js/ia.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ia');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Adder commento";
-Blockly.Msg.AUTH = "Per favor autorisa iste application pro permitter de salveguardar tu travalio e pro permitter que tu lo divide con alteres.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar valor:";
-Blockly.Msg.CHAT = "Conversa con tu collaborator scribente in iste quadro!";
Blockly.Msg.CLEAN_UP = "Clarar le blocos";
Blockly.Msg.COLLAPSE_ALL = "Plicar blocos";
Blockly.Msg.COLLAPSE_BLOCK = "Plicar bloco";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retornar le arcotangente de un numero.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retornar le cosino de un grado (non radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retornar le sino de un grado (non radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retornar le tangente de un grado (non radiano).";
-Blockly.Msg.ME = "Io";
Blockly.Msg.NEW_VARIABLE = "Nove variabile...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nomine del nove variabile:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/id.js b/msg/js/id.js
index 45d6bb8de..740902f0a 100644
--- a/msg/js/id.js
+++ b/msg/js/id.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.id');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Tambahkan Komentar";
-Blockly.Msg.AUTH = "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:";
-Blockly.Msg.CHAT = "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!";
Blockly.Msg.CLEAN_UP = "Bersihkan Blok";
Blockly.Msg.COLLAPSE_ALL = "Ciutkan Blok";
Blockly.Msg.COLLAPSE_BLOCK = "Ciutkan Blok";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan atan dari angka.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan cosinus dari derajat (bukan radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan sinus dari derajat (bukan radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan tangen dari derajat (bukan radian).";
-Blockly.Msg.ME = "Saya";
Blockly.Msg.NEW_VARIABLE = "Variabel baru...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nama variabel baru:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/is.js b/msg/js/is.js
index f9969e4e3..49694b352 100644
--- a/msg/js/is.js
+++ b/msg/js/is.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.is');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Skrifa skýringu";
-Blockly.Msg.AUTH = "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því";
Blockly.Msg.CHANGE_VALUE_TITLE = "Breyta gildi:";
-Blockly.Msg.CHAT = "Spjallaðu við félaga með því að skrifa í þennan reit!";
Blockly.Msg.CLEAN_UP = "Hreinsa kubba";
Blockly.Msg.COLLAPSE_ALL = "Loka kubbum";
Blockly.Msg.COLLAPSE_BLOCK = "Loka kubbi";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Skila arkartangensi tölu.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Skila kósínusi horns gefnu í gráðum.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Skila sínusi horns gefnu í gráðum.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Skila tangensi horns gefnu í gráðum.";
-Blockly.Msg.ME = "Mig";
Blockly.Msg.NEW_VARIABLE = "Ný breyta...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Heiti nýrrar breytu:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/it.js b/msg/js/it.js
index 007a7af49..7f5f8bbf7 100644
--- a/msg/js/it.js
+++ b/msg/js/it.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.it');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Aggiungi commento";
-Blockly.Msg.AUTH = "Autorizza questa applicazione per consentire di salvare il tuo lavoro e per essere condiviso.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Modifica valore:";
-Blockly.Msg.CHAT = "Chatta con il tuo collaboratore scrivendo in questo box!";
Blockly.Msg.CLEAN_UP = "Pulisci i blocchi";
Blockly.Msg.COLLAPSE_ALL = "Comprimi blocchi";
Blockly.Msg.COLLAPSE_BLOCK = "Comprimi blocco";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Restituisce l'arco-tangente di un numero."
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Restituisce il coseno di un angolo espresso in gradi (non radianti).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Restituisce il seno di un angolo espresso in gradi (non radianti).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Restituisce la tangente di un angolo espresso in gradi (non radianti).";
-Blockly.Msg.ME = "Me";
Blockly.Msg.NEW_VARIABLE = "Nuova variabile...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nome della nuova variabile:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ja.js b/msg/js/ja.js
index 5a41444f1..b50ef7f91 100644
--- a/msg/js/ja.js
+++ b/msg/js/ja.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ja');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "コメントを追加";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "値を変更します。";
-Blockly.Msg.CHAT = "このボックスに入力して共同編集者とチャットしよう!";
Blockly.Msg.CLEAN_UP = "ブロックの整理";
Blockly.Msg.COLLAPSE_ALL = "ブロックを折りたたむ";
Blockly.Msg.COLLAPSE_BLOCK = "ブロックを折りたたむ";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "番号のarctangent を返すます";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "番号のcosineの次数を返す";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "番号のsineの次数を返す";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "番号のtangentの次数を返す";
-Blockly.Msg.ME = "私に";
Blockly.Msg.NEW_VARIABLE = "新しい変数";
Blockly.Msg.NEW_VARIABLE_TITLE = "新しい変数の、名前";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/ko.js b/msg/js/ko.js
index 9dabfc93a..f1f066be4 100644
--- a/msg/js/ko.js
+++ b/msg/js/ko.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ko');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "댓글 추가";
-Blockly.Msg.AUTH = "당신의 작업을 저장하고 다른 사람과 공유할 수 있도록 이 애플리케이션을 인증해 주십시오.";
Blockly.Msg.CHANGE_VALUE_TITLE = "값 바꾸기:";
-Blockly.Msg.CHAT = "이 상자에 입력하여 당신의 동료와 채팅하세요!";
Blockly.Msg.CLEAN_UP = "블록 정리";
Blockly.Msg.COLLAPSE_ALL = "블록 축소";
Blockly.Msg.COLLAPSE_BLOCK = "블록 축소";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "어떤 수에 대한, atan(arctangent) 값
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "각도의 코사인을 반환합니다. (라디안 아님)";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "각도의 사인을 반환합니다. (라디안 아님)";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "각도의 탄젠트를 반환합니다. (라디안 아님)";
-Blockly.Msg.ME = "나";
Blockly.Msg.NEW_VARIABLE = "새 변수";
Blockly.Msg.NEW_VARIABLE_TITLE = "새 변수 이름:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/lb.js b/msg/js/lb.js
index 2164586eb..7f887c694 100644
--- a/msg/js/lb.js
+++ b/msg/js/lb.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.lb');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Bemierkung derbäisetzen";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "Wäert änneren:";
-Blockly.Msg.CHAT = "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!";
Blockly.Msg.CLEAN_UP = "Bléck opraumen";
Blockly.Msg.COLLAPSE_ALL = "Bléck zesummeklappen";
Blockly.Msg.COLLAPSE_BLOCK = "Block zesummeklappen";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "Mech";
Blockly.Msg.NEW_VARIABLE = "Nei Variabel...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Neie variabelen Numm:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/lki.js b/msg/js/lki.js
index fff84fccc..9a5c227a3 100644
--- a/msg/js/lki.js
+++ b/msg/js/lki.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.lki');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "گةپ دائن";
-Blockly.Msg.AUTH = "لطفا ئئ اپلیکیشن را ثبت کةن و آثارتان فعال کةن تا ذخیره بو و اجازهٔ اشتراک نیائن توسط هؤمة بو";
Blockly.Msg.CHANGE_VALUE_TITLE = "تةغییر مقدار:";
-Blockly.Msg.CHAT = "!وةگةرد هؤمکارةتان وة نام ئئ کادرة گةپ بةن";
Blockly.Msg.CLEAN_UP = "تمیزکردن بلاکةل";
Blockly.Msg.COLLAPSE_ALL = "چؤیچانن/پشکانن بلاکةل";
Blockly.Msg.COLLAPSE_BLOCK = "چؤیچانن/پشکانن بلاک";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرکتانژان
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان).";
-Blockly.Msg.ME = "مإ";
Blockly.Msg.NEW_VARIABLE = "متغیر تازه...";
Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/lrc.js b/msg/js/lrc.js
index a616694e5..dcb7238d2 100644
--- a/msg/js/lrc.js
+++ b/msg/js/lrc.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.lrc');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "نظرتونه اضاف بکید";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "ارزشت آلشت کو:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "کوچک کردن برشتیا";
Blockly.Msg.COLLAPSE_BLOCK = "کوچک کردن برشت";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "مه";
Blockly.Msg.NEW_VARIABLE = "آلشتگر تازه...";
Blockly.Msg.NEW_VARIABLE_TITLE = "نوم آلشتگر تازه:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/lt.js b/msg/js/lt.js
index 9bfa65c0a..60ed8d781 100644
--- a/msg/js/lt.js
+++ b/msg/js/lt.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.lt');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Palikti komentarą";
-Blockly.Msg.AUTH = "Norint išsaugoti (ir dalintis) savo sukurtas programas, reikia prisijungti (autorizuotis).";
Blockly.Msg.CHANGE_VALUE_TITLE = "Keisti reikšmę:";
-Blockly.Msg.CHAT = "Galite susirašinėti su projekto bendradarbiais.";
Blockly.Msg.CLEAN_UP = "Išvalyti blokus";
Blockly.Msg.COLLAPSE_ALL = "Suskleisti blokus";
Blockly.Msg.COLLAPSE_BLOCK = "Suskleisti bloką";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Grąžinti skaičiaus arktangentą.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Grąžinti laipsnio kosinusą (ne radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Grąžinti laipsnio sinusą (ne radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Grąžinti laipsnio tangentą (ne radiano).";
-Blockly.Msg.ME = "Mane";
Blockly.Msg.NEW_VARIABLE = "Naujas kintamasis...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Naujo kintamojo pavadinimas:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/mk.js b/msg/js/mk.js
index b42a5387f..370483a21 100644
--- a/msg/js/mk.js
+++ b/msg/js/mk.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.mk');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Додај коментар:";
-Blockly.Msg.AUTH = "Овластете го извршников за да можете да ја зачувате вашата работа и да можете да ја споделувате.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Смена на вредност:";
-Blockly.Msg.CHAT = "Разговарајте со вашиот соработник во ова поле!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Собери блокови";
Blockly.Msg.COLLAPSE_BLOCK = "Собери блок";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "Мене";
Blockly.Msg.NEW_VARIABLE = "Нова променлива...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Назив на новата променлива:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ms.js b/msg/js/ms.js
index 7ceccd71b..2b4f0a0fd 100644
--- a/msg/js/ms.js
+++ b/msg/js/ms.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ms');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Berikan Komen";
-Blockly.Msg.AUTH = "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:";
-Blockly.Msg.CHAT = "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!";
Blockly.Msg.CLEAN_UP = "Kemaskan Blok";
Blockly.Msg.COLLAPSE_ALL = "Lipat Blok²";
Blockly.Msg.COLLAPSE_BLOCK = "Lipat Blok";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan beberapa nombor arctangent.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan darjah kosinus (bukan radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan darjah sine (bukan radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan darjah tangen (bukan radian).";
-Blockly.Msg.ME = "Saya";
Blockly.Msg.NEW_VARIABLE = "Pembolehubah baru...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nama pembolehubah baru:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/nb.js b/msg/js/nb.js
index 2f09735ff..f240cba10 100644
--- a/msg/js/nb.js
+++ b/msg/js/nb.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.nb');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Legg til kommentar";
-Blockly.Msg.AUTH = "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Bytt verdi:";
-Blockly.Msg.CHAT = "Chat med din medarbeider ved å skrive i dette feltet!";
Blockly.Msg.CLEAN_UP = "Rydd opp Blocks";
Blockly.Msg.COLLAPSE_ALL = "Skjul blokker";
Blockly.Msg.COLLAPSE_BLOCK = "Skjul blokk";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returner arctangens til et tall.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returner cosinus av en vinkel (ikke radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returner sinus av en vinkel (ikke radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returner tangenten av en vinkel (ikke radian).";
-Blockly.Msg.ME = "Jeg";
Blockly.Msg.NEW_VARIABLE = "Ny variabel...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnavn:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/nl.js b/msg/js/nl.js
index 7aee4f671..dc3e79145 100644
--- a/msg/js/nl.js
+++ b/msg/js/nl.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.nl');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Reactie toevoegen";
-Blockly.Msg.AUTH = "Sta deze app toe om uw werk op te slaan het uw werk te delen.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Waarde wijzigen:";
-Blockly.Msg.CHAT = "Chat met iemand die ook aan het werk is via dit venster!";
Blockly.Msg.CLEAN_UP = "Blokken opschonen";
Blockly.Msg.COLLAPSE_ALL = "Blokken samenvouwen";
Blockly.Msg.COLLAPSE_BLOCK = "Blok samenvouwen";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Geeft de arctangens van een getal.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Geeft de cosinus van een graad (geen radialen).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Geeft de sinus van een graad (geen radialen).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Geeft de tangens van een graad (geen radialen).";
-Blockly.Msg.ME = "Ik";
Blockly.Msg.NEW_VARIABLE = "Nieuwe variabele...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nieuwe variabelenaam:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/oc.js b/msg/js/oc.js
index 2947d8b6b..f6552b502 100644
--- a/msg/js/oc.js
+++ b/msg/js/oc.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.oc');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Apondre un comentari";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "Modificar la valor :";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Redusir los blòts";
Blockly.Msg.COLLAPSE_BLOCK = "Redusir lo blòt";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "Ieu";
Blockly.Msg.NEW_VARIABLE = "Variabla novèla…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nom de la novèla variabla :";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/pl.js b/msg/js/pl.js
index b90794487..86b18555e 100644
--- a/msg/js/pl.js
+++ b/msg/js/pl.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.pl');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Dodaj komentarz";
-Blockly.Msg.AUTH = "Autoryzuj ten program, aby można było zapisać Twoją pracę i umożliwić Ci dzielenie się nią z innymi.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Zmień wartość:";
-Blockly.Msg.CHAT = "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!";
Blockly.Msg.CLEAN_UP = "Uporządkuj bloki";
Blockly.Msg.COLLAPSE_ALL = "Zwiń bloki";
Blockly.Msg.COLLAPSE_BLOCK = "Zwiń blok";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Zwróć arcus tangens danej liczby.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Zwróć wartość cosinusa o stopniu (nie w radianach).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Zwróć wartość sinusa o stopniu (nie w radianach).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Zwróć tangens o stopniu (nie w radianach).";
-Blockly.Msg.ME = "Ja";
Blockly.Msg.NEW_VARIABLE = "Nowa zmienna...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nowa nazwa zmiennej:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/pms.js b/msg/js/pms.js
index 4e99b94e7..d62a65244 100644
--- a/msg/js/pms.js
+++ b/msg/js/pms.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.pms');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Gionté un coment";
-Blockly.Msg.AUTH = "Për piasì, ch'a autorisa costa aplicassion a përmëtte ëd salvé sò travaj e a autoriselo a esse partagià da chiel.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Modifiché ël valor:";
-Blockly.Msg.CHAT = "Ch'a ciaciara con sò colaborator an scrivend an costa casela!";
Blockly.Msg.CLEAN_UP = "Dëscancelé ij blòch";
Blockly.Msg.COLLAPSE_ALL = "Arduve ij blòch";
Blockly.Msg.COLLAPSE_BLOCK = "Arduve ël blòch";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A smon l'arch-tangenta d'un nùmer.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A smon ël cosen ëd n'àngol an gré (pa an radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A smon ël sen ëd n'àngol an gré (pa an radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A smon la tangenta ëd n'àngol an gré (pa an radiant).";
-Blockly.Msg.ME = "Mi";
Blockly.Msg.NEW_VARIABLE = "Neuva variàbil...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nòm ëd la neuva variàbil:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/pt-br.js b/msg/js/pt-br.js
index f1db2df45..8dbc3571f 100644
--- a/msg/js/pt-br.js
+++ b/msg/js/pt-br.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.pt.br');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Adicionar comentário";
-Blockly.Msg.AUTH = "Por favor autorize este aplicativo para permitir que o seu trabalho seja gravado e que ele seja compartilhado por você.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Mudar valor:";
-Blockly.Msg.CHAT = "Converse com o seu colaborador digitando nesta caixa!";
Blockly.Msg.CLEAN_UP = "Limpar blocos";
Blockly.Msg.COLLAPSE_ALL = "Recolher blocos";
Blockly.Msg.COLLAPSE_BLOCK = "Recolher bloco";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano).";
-Blockly.Msg.ME = "Eu";
Blockly.Msg.NEW_VARIABLE = "Nova variável...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/pt.js b/msg/js/pt.js
index 0cf0e71eb..0d8f80636 100644
--- a/msg/js/pt.js
+++ b/msg/js/pt.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.pt');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Adicionar Comentário";
-Blockly.Msg.AUTH = "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Alterar valor:";
-Blockly.Msg.CHAT = "Converse com o seu colaborador, ao digitar nesta caixa!";
Blockly.Msg.CLEAN_UP = "Limpar os blocos";
Blockly.Msg.COLLAPSE_ALL = "Recolher Blocos";
Blockly.Msg.COLLAPSE_BLOCK = "Colapsar Bloco";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano).";
-Blockly.Msg.ME = "Eu";
Blockly.Msg.NEW_VARIABLE = "Nova variável...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ro.js b/msg/js/ro.js
index d5db5f024..c9f5f6073 100644
--- a/msg/js/ro.js
+++ b/msg/js/ro.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ro');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Adaugă un comentariu";
-Blockly.Msg.AUTH = "Va rugăm să autorizați această aplicație să permită salvarea activității dumneavoastră și să permită distribuirea acesteia de către dumneavoastră.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Schimbaţi valoarea:";
-Blockly.Msg.CHAT = "Discută cu colaboratorul tău tastând în cadrul acestei zone!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Restrange blocurile";
Blockly.Msg.COLLAPSE_BLOCK = "Restrange blocul";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnează arctangenta unui număr.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Întoarce cosinusul unui grad (nu radianul).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Întoarce cosinusul unui grad (nu radianul).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Întoarce tangenta unui grad (nu radianul).";
-Blockly.Msg.ME = "Eu";
Blockly.Msg.NEW_VARIABLE = "Variabilă nouă...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Noul nume de variabilă:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ru.js b/msg/js/ru.js
index 0cb4e24d7..f419884de 100644
--- a/msg/js/ru.js
+++ b/msg/js/ru.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ru');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Добавить комментарий";
-Blockly.Msg.AUTH = "Пожалуйста, авторизуйте это приложение, чтоб можно было сохранять вашу работу и чтобы дать возможность вам делиться ей.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Измените значение:";
-Blockly.Msg.CHAT = "Общайтесь со своим коллегой, печатая в этом поле!";
Blockly.Msg.CLEAN_UP = "Убрать блоки";
Blockly.Msg.COLLAPSE_ALL = "Свернуть блоки";
Blockly.Msg.COLLAPSE_BLOCK = "Свернуть блок";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Возвращает арктангенс
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Возвращает косинус угла в градусах.";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Возвращает синус угла в градусах.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Возвращает тангенс угла в градусах.";
-Blockly.Msg.ME = "Мне";
Blockly.Msg.NEW_VARIABLE = "Новая переменная…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Имя новой переменной:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sc.js b/msg/js/sc.js
index aeeb71ff3..b15435db9 100644
--- a/msg/js/sc.js
+++ b/msg/js/sc.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sc');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Agiunghe unu cumentu";
-Blockly.Msg.AUTH = "Permiti a custa app de sarvare su traballu tuo e de ti lu fàghere cumpartzire.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Muda valori:";
-Blockly.Msg.CHAT = "Faedda cun su cumpàngiu tuo iscriende inoghe!";
Blockly.Msg.CLEAN_UP = "Lìmpia is brocus";
Blockly.Msg.COLLAPSE_ALL = "Serra e stringi Brocus";
Blockly.Msg.COLLAPSE_BLOCK = "Serra e stringi Brocu";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Torrat su arctangenti de unu numeru.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Torrat su cosinu de unu gradu (no radianti).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Torrat su sinu de unu gradu (no radianti).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Torrat sa tangenti de unu gradu (no radianti).";
-Blockly.Msg.ME = "Deo";
Blockly.Msg.NEW_VARIABLE = "Variabili noa...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nòmini de sa variabili noa:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sd.js b/msg/js/sd.js
index 0f7f05bfa..03f1a1f69 100644
--- a/msg/js/sd.js
+++ b/msg/js/sd.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sd');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "تاثرات ڏيو";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "قدر بدلايو";
-Blockly.Msg.CHAT = "هن دٻيءَ ۾ ٽائيپ ڪري پنهنجي ساٿاريءَ سان ڳالهايو";
Blockly.Msg.CLEAN_UP = "بندشون هٽايو";
Blockly.Msg.COLLAPSE_ALL = "بلاڪَ ڍڪيو";
Blockly.Msg.COLLAPSE_BLOCK = "بلاڪ ڍڪيو";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "آئون";
Blockly.Msg.NEW_VARIABLE = "نئون ڦرڻو";
Blockly.Msg.NEW_VARIABLE_TITLE = "ڦرڻي جو نئون نالو:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/shn.js b/msg/js/shn.js
index 55ab61cca..edcef357e 100644
--- a/msg/js/shn.js
+++ b/msg/js/shn.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.shn');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "သႂ်ႇၶေႃႈၵႂၢမ်း";
-Blockly.Msg.AUTH = "ၶွပ်ႈၸႂ် ပၼ်ၶႂၢင်ႉႁပ်ႉဢဝ် ဢႅပ်ႉၼႆႉ တီႈၼႂ်းၵၢၼ်ၸဝ်ႈၵဝ်ႇသေယဝ်ႉ ၸဝ်ႈၵဝ်ႇ ႁႂ်ႈလႆႈသိမ်း ႁႂ်ႈလႆႈပိုၼ်ပၼ်သေၵမ်း";
Blockly.Msg.CHANGE_VALUE_TITLE = "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ";
-Blockly.Msg.CHAT = "ပေႃႉလိၵ်ႈ ၼႂ်းလွၵ်းၼႆႉသေ ၶျၢတ်ႉၸူး ၵေႃႉႁူမ်ႈႁဵတ်းႁူမ်ႈသၢင်ႈ ၸဝ်ႈၵဝ်ႇ";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "ပလွၵ်ႉတင်းၼမ် လႅဝ်";
Blockly.Msg.COLLAPSE_BLOCK = "ပလွၵ်ႉလႅဝ်";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "ၸဝ်ႈၵဝ်ႇ";
Blockly.Msg.NEW_VARIABLE = "လၢႆႈဢၼ်မႂ်ႇ";
Blockly.Msg.NEW_VARIABLE_TITLE = "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sk.js b/msg/js/sk.js
index e08997513..ac547f541 100644
--- a/msg/js/sk.js
+++ b/msg/js/sk.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sk');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Pridať komentár";
-Blockly.Msg.AUTH = "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Zmeniť hodnotu:";
-Blockly.Msg.CHAT = "Písaním do tohto políčka komunikujte so spolupracovníkmi!";
Blockly.Msg.CLEAN_UP = "Narovnať bloky";
Blockly.Msg.COLLAPSE_ALL = "Zvinúť bloky";
Blockly.Msg.COLLAPSE_BLOCK = "Zvinúť blok";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vráť arkus tangens čísla.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vráť kosínus uhla (v stupňoch).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vráť sínus uhla (v stupňoch).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vráť tangens uhla (v stupňoch).";
-Blockly.Msg.ME = "Ja";
Blockly.Msg.NEW_VARIABLE = "Nová premenná...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Názov novej premennej:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sl.js b/msg/js/sl.js
index e0d12106a..10f9a6bf4 100644
--- a/msg/js/sl.js
+++ b/msg/js/sl.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sl');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Dodaj komentar";
-Blockly.Msg.AUTH = "Prosimo, avtoriziraj to aplikacijo, da boš lahko svoje delo shranil(-a) in delil(-a) z drugimi.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Spremeni vrednost:";
-Blockly.Msg.CHAT = "Klepetaj s sodelavcem tako, da tipkaš v to okno!";
Blockly.Msg.CLEAN_UP = "Ponastavi kocke";
Blockly.Msg.COLLAPSE_ALL = "Skrči kocke";
Blockly.Msg.COLLAPSE_BLOCK = "Skrči kocko";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrne arkus tangens števila.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrne kosinus kota v stopinjah (ne radianih).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrne sinus kota v stopinjah (ne radianih).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrne tangens kota v stopinjah (ne radianih).";
-Blockly.Msg.ME = "Jaz";
Blockly.Msg.NEW_VARIABLE = "Nova spremenljivka...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Ime nove spremenljivke:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sq.js b/msg/js/sq.js
index 607c0579b..e90eab5f2 100644
--- a/msg/js/sq.js
+++ b/msg/js/sq.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sq');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Vendos nje Koment";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "Ndrysho Vlerat:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Mbyll blloqet";
Blockly.Msg.COLLAPSE_BLOCK = "Mbyll bllokun";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kthe tg-1 e nje numeri.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kthe kosinusin e nje grade (jo ne radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kthe kosinusin e nje kendi (jo ne radiant).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kthe tangentin e nje kendi (jo radiant).";
-Blockly.Msg.ME = "Me"; // untranslated
Blockly.Msg.NEW_VARIABLE = "Identifikatorë i ri...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Emri i identifikatorit të ri:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/sr.js b/msg/js/sr.js
index 960f5e369..f3d56ead5 100644
--- a/msg/js/sr.js
+++ b/msg/js/sr.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sr');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Додај коментар";
-Blockly.Msg.AUTH = "Пријавите се молим то је апликација да се окрену свој посао, да побегне и да му се омогући да буде заједничко за вас.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Промените вредност:";
-Blockly.Msg.CHAT = "Комуницирају са својим колегом, уносећи у то поље!";
Blockly.Msg.CLEAN_UP = "Уклоните блокова";
Blockly.Msg.COLLAPSE_ALL = "Скупи блокове";
Blockly.Msg.COLLAPSE_BLOCK = "Скупи блок";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Враћа аркус тангенс бр
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Враћа косинус степена (не радијан).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Враћа синус степена (не радијан).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Враћа тангенс степена (не радијан).";
-Blockly.Msg.ME = "Ми";
Blockly.Msg.NEW_VARIABLE = "Нова променљива…";
Blockly.Msg.NEW_VARIABLE_TITLE = "Име нове променљиве:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/sv.js b/msg/js/sv.js
index b2d93c5be..d1ef48f40 100644
--- a/msg/js/sv.js
+++ b/msg/js/sv.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.sv');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Lägg till kommentar";
-Blockly.Msg.AUTH = "Var god godkänn denna app för att du ska kunna spara och dela den.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Ändra värde:";
-Blockly.Msg.CHAT = "Chatta med din medarbetare genom att skriva i detta fält.";
Blockly.Msg.CLEAN_UP = "Rada upp block";
Blockly.Msg.COLLAPSE_ALL = "Fäll ihop block";
Blockly.Msg.COLLAPSE_BLOCK = "Fäll ihop block";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ger tillbaka arcus tangens (arctan) av ett
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ger tillbaka cosinus för en grad (inte radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ger tillbaka sinus för en grad (inte radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ger tillbaka tangens för en grad (inte radian).";
-Blockly.Msg.ME = "Jag";
Blockly.Msg.NEW_VARIABLE = "Ny variabel...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnamn:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/ta.js b/msg/js/ta.js
index d2d87debf..b77aeefec 100644
--- a/msg/js/ta.js
+++ b/msg/js/ta.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ta');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "கருத்தை சேர்";
-Blockly.Msg.AUTH = "தயவுச்செய்து இச்செயலியை அங்கீகரித்து உங்கள் வேலையைச் சேமித்து பகிரரும்படி அனுமதிக்கவும்.";
Blockly.Msg.CHANGE_VALUE_TITLE = "மதிப்பை மாற்றவும்:";
-Blockly.Msg.CHAT = "இந்தப் பெட்டியில் தட்டச்சு செய்வதன் மூலம் கூட்டுப்பணியாளருடன் உரையாடலாம்!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "உறுப்புகளை மரை";
Blockly.Msg.COLLAPSE_BLOCK = "உறுப்பை மரை";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "மதிப்பின் நேர்
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "டிகிரீ கோசைன் மதிப்பை பின்கொடு";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "டிகிரீ சைன் மதிப்பை பின்கொடு.";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "டிகிரீ டேஞ்சன்டு மதிப்பை பின்கொடு";
-Blockly.Msg.ME = "எனக்கு";
Blockly.Msg.NEW_VARIABLE = "புதிய மாறிலி...";
Blockly.Msg.NEW_VARIABLE_TITLE = "புதிய மாறிலியின் பெயர்:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/tcy.js b/msg/js/tcy.js
index 0c5a39e14..a2939bca4 100644
--- a/msg/js/tcy.js
+++ b/msg/js/tcy.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.tcy');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ";
-Blockly.Msg.AUTH = "ಈರೆನ ಕೆಲಸೊನು ಒರಿಪಾಯರೆ ಬುಕ್ಕೊ ಈರೆನಟ್ಟುಗು ಪಟ್ಟೊನುಯರೆ ಅವಕಾಸೊ.";
Blockly.Msg.CHANGE_VALUE_TITLE = "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ";
-Blockly.Msg.CHAT = "ನಿಕ್ಲೆನ ಸಹಬೋಗಿನೊಟ್ಟುಗೆ ಈ ಪೆಟ್ಟಿಗೆಡ್ ಚಾಟಿಂಗ್ ನಮೂದು ಮಲ್ಪುಲೆ";
Blockly.Msg.CLEAN_UP = "ನಿರ್ಬಂದೊಲೆನ್ ಸ್ವೊಚ್ಚೊ ಮಲ್ಪುಲೆ";
Blockly.Msg.COLLAPSE_ALL = "ಕುಗ್ಗಿಸಾದ್ ನಿರ್ಬಂಧಿಸಾಪುನೆ";
Blockly.Msg.COLLAPSE_BLOCK = "ಕುಗ್ಗಿಸಾದ್ ತಡೆಪತ್ತುನೆ";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "ಸಂಖ್ಯೆದ ಆರ್ಕ್ಟ
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "ಪದವಿದ ಸಹ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "ಪದವಿದ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "ಪದವಿದ ಸ್ಪರ್ಶಕೊನು ಪಿರಕೊರು";
-Blockly.Msg.ME = "ಯಾನ್";
Blockly.Msg.NEW_VARIABLE = "ಪೊಸ ಬದಲಾವಣೆ";
Blockly.Msg.NEW_VARIABLE_TITLE = "ಪುದರ್ದ ಪೊಸ ಬದಲಾವಣೆ:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/th.js b/msg/js/th.js
index ef98e239a..0b8ebf6d0 100644
--- a/msg/js/th.js
+++ b/msg/js/th.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.th');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "ใส่คำอธิบาย";
-Blockly.Msg.AUTH = "กรุณาอนุญาตแอปนี้เพื่อเปิดใช้งาน การบันทึกงานของคุณ และยินยอมให้คุณแบ่งปันงานของคุณได้";
Blockly.Msg.CHANGE_VALUE_TITLE = "เปลี่ยนค่า:";
-Blockly.Msg.CHAT = "คุยกับผู้ร่วมงานของคุณโดยพิมพ์ลงในกล่องนี้!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "ย่อบล็อก";
Blockly.Msg.COLLAPSE_BLOCK = "ย่อบล็อก";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "คืนค่า arctangent ของต
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "คืนค่า cosine ขององศา (ไม่ใช่เรเดียน)";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "คืนค่า sine ขององศา (ไม่ใช่เรเดียน)";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "คืนค่า tangent ขององศา (ไม่ใช่เรเดียน)";
-Blockly.Msg.ME = "ฉัน";
Blockly.Msg.NEW_VARIABLE = "สร้างตัวแปร...";
Blockly.Msg.NEW_VARIABLE_TITLE = "ชื่อตัวแปรใหม่:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/tl.js b/msg/js/tl.js
index 2834e10b5..b8a3bb01d 100644
--- a/msg/js/tl.js
+++ b/msg/js/tl.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.tl');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Dagdag komento";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated
Blockly.Msg.CHANGE_VALUE_TITLE = "pagbago ng value:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "bloke";
Blockly.Msg.COLLAPSE_BLOCK = "bloke";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number.";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian).";
-Blockly.Msg.ME = "Me"; // untranslated
Blockly.Msg.NEW_VARIABLE = "New variable...";
Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/tlh.js b/msg/js/tlh.js
index 5385d7383..5c1cad0f1 100644
--- a/msg/js/tlh.js
+++ b/msg/js/tlh.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.tlh');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "QInHom chel";
-Blockly.Msg.AUTH = "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob.";
Blockly.Msg.CHANGE_VALUE_TITLE = "choH:";
-Blockly.Msg.CHAT = "beqpu'lI'vaD bIjawmeH naDev yIrI'!";
Blockly.Msg.CLEAN_UP = "ngoghmeyvaD tlhegh rurmoH";
Blockly.Msg.COLLAPSE_ALL = "ngoghmey DejmoH";
Blockly.Msg.COLLAPSE_BLOCK = "ngogh DejmoH";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated
-Blockly.Msg.ME = "Me"; // untranslated
Blockly.Msg.NEW_VARIABLE = "lIw chu'...";
Blockly.Msg.NEW_VARIABLE_TITLE = "lIw chu' pong:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/tr.js b/msg/js/tr.js
index ccb1923ce..4b949ccd2 100644
--- a/msg/js/tr.js
+++ b/msg/js/tr.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.tr');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Yorum Ekle";
-Blockly.Msg.AUTH = "Çalışmanızın kaydedilmesi ve sizinle paylaşılmasına izin verilmesi için lütfen bu uygulamaya yetki verin.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Değeri değiştir:";
-Blockly.Msg.CHAT = "Bu kutuya yazarak iş birlikçin ile sohbet et!";
Blockly.Msg.CLEAN_UP = "Blokları temizle";
Blockly.Msg.COLLAPSE_ALL = "Blokları Daralt";
Blockly.Msg.COLLAPSE_BLOCK = "Blok'u Daralt";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Bir sayının ters tanjantını döndür .
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Bir açının kosinüsünü döndür(radyan olarak değil).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Bir açının sinüsünü döndür(radyan olarak değil).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Bir açının tanjantını döndür(radyan olarak değil).";
-Blockly.Msg.ME = "Beni";
Blockly.Msg.NEW_VARIABLE = "Yeni değişken...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni değişken ismi :";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
diff --git a/msg/js/uk.js b/msg/js/uk.js
index 2887c4b4f..1e4aeb8ff 100644
--- a/msg/js/uk.js
+++ b/msg/js/uk.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.uk');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Додати коментар";
-Blockly.Msg.AUTH = "Будь ласка, авторизуйте цю програму, аби можна було зберігати вашу роботу і для надання можливості вам поширювати її.";
Blockly.Msg.CHANGE_VALUE_TITLE = "Змінити значення:";
-Blockly.Msg.CHAT = "Спілкуйтеся з вашими співавторами, набираючи у цьому полі!";
Blockly.Msg.CLEAN_UP = "Вирівняти блоки";
Blockly.Msg.COLLAPSE_ALL = "Згорнути блоки";
Blockly.Msg.COLLAPSE_BLOCK = "Згорнути блок";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Повертає арктангенс чи
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Повертає косинус кута в градусах (не в радіанах).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Повертає синус кута в градусах (не в радіанах).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Повертає тангенс кута в градусах (не в радіанах).";
-Blockly.Msg.ME = "Я";
Blockly.Msg.NEW_VARIABLE = "Нова змінна...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Нова назва змінної:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "-ий.";
diff --git a/msg/js/vi.js b/msg/js/vi.js
index a95546692..f5c1ccc04 100644
--- a/msg/js/vi.js
+++ b/msg/js/vi.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.vi');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "Thêm Chú Giải";
-Blockly.Msg.AUTH = "Vui lòng cho phép ứng dụng được lưu dữ liệu của bạn và tự động chia sẻ bằng tên của bạn";
Blockly.Msg.CHANGE_VALUE_TITLE = "Thay giá trị thành:";
-Blockly.Msg.CHAT = "Trò chuyện với cộng tác viên của bạn bằng cách gõ vào hộp này!";
Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated
Blockly.Msg.COLLAPSE_ALL = "Thu Nhỏ Mọi Mảnh";
Blockly.Msg.COLLAPSE_BLOCK = "Thu Nhỏ Mảnh";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Hoàn trả Arctang của một góc (theo
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Hoàn trả Cos của một góc (theo độ).";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Hoàn trả Sin của một góc (theo độ).";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Hoàn trả Tang của một góc (theo độ).";
-Blockly.Msg.ME = "Tôi";
Blockly.Msg.NEW_VARIABLE = "Biến mới...";
Blockly.Msg.NEW_VARIABLE_TITLE = "Tên của biến mới:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/js/zh-hans.js b/msg/js/zh-hans.js
index cd4f6a6ce..ebdb6b8d9 100644
--- a/msg/js/zh-hans.js
+++ b/msg/js/zh-hans.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.zh.hans');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "添加注释";
-Blockly.Msg.AUTH = "请授权这个应用程序以保存您的作品并共享。";
Blockly.Msg.CHANGE_VALUE_TITLE = "更改值:";
-Blockly.Msg.CHAT = "通过在此框输入与您的合作者沟通!";
Blockly.Msg.CLEAN_UP = "清理块";
Blockly.Msg.COLLAPSE_ALL = "折叠块";
Blockly.Msg.COLLAPSE_BLOCK = "折叠块";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的余弦值(非弧度)。";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。";
-Blockly.Msg.ME = "我";
Blockly.Msg.NEW_VARIABLE = "新变量...";
Blockly.Msg.NEW_VARIABLE_TITLE = "新变量的名称:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "空白";
diff --git a/msg/js/zh-hant.js b/msg/js/zh-hant.js
index 2362d19a5..0083b6e9a 100644
--- a/msg/js/zh-hant.js
+++ b/msg/js/zh-hant.js
@@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.zh.hant');
goog.require('Blockly.Msg');
Blockly.Msg.ADD_COMMENT = "加入註解";
-Blockly.Msg.AUTH = "請授權這個應用程式以保存您的作品並共享。";
Blockly.Msg.CHANGE_VALUE_TITLE = "修改值:";
-Blockly.Msg.CHAT = "與您的合作者洽談藉由在此框輸入!";
Blockly.Msg.CLEAN_UP = "清理積木";
Blockly.Msg.COLLAPSE_ALL = "收合積木";
Blockly.Msg.COLLAPSE_BLOCK = "收合積木";
@@ -267,7 +265,6 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。";
Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的餘弦值(非弧度)。";
Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。";
Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。";
-Blockly.Msg.ME = "我";
Blockly.Msg.NEW_VARIABLE = "新變數...";
Blockly.Msg.NEW_VARIABLE_TITLE = "新變數名稱:";
Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
diff --git a/msg/json/ar.json b/msg/json/ar.json
index 1314e2f32..9e6af93e9 100644
--- a/msg/json/ar.json
+++ b/msg/json/ar.json
@@ -25,8 +25,6 @@
"DISABLE_BLOCK": "عطّل القطعة",
"ENABLE_BLOCK": "أعد تفعيل القطعة",
"HELP": "مساعدة",
- "CHAT": "دردش مع زملائك بالكتابة في هذا الصندوق!",
- "ME": "أنا",
"CHANGE_VALUE_TITLE": "تغيير قيمة:",
"NEW_VARIABLE": "متغير جديد...",
"NEW_VARIABLE_TITLE": "اسم المتغير الجديد:",
diff --git a/msg/json/az.json b/msg/json/az.json
index 00c6b5e44..ec9df30fd 100644
--- a/msg/json/az.json
+++ b/msg/json/az.json
@@ -23,7 +23,6 @@
"DISABLE_BLOCK": "Bloku söndür",
"ENABLE_BLOCK": "Bloku aktivləşdir",
"HELP": "Kömək",
- "ME": "Mənə",
"CHANGE_VALUE_TITLE": "Qiyməti dəyiş:",
"NEW_VARIABLE": "Yeni dəyişən...",
"NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:",
diff --git a/msg/json/ba.json b/msg/json/ba.json
index 5a0c764fc..b212dd811 100644
--- a/msg/json/ba.json
+++ b/msg/json/ba.json
@@ -29,9 +29,6 @@
"HELP": "Ярҙам",
"UNDO": "Кире алырға",
"REDO": "документтарҙы үҙгәртергә",
- "CHAT": "Был яланды тултырғанда, хеҙмәттәшегеҙ менән аралашығыҙ",
- "AUTH": "Зинһар, эшегеҙҙе һаҡлап һәм уның менән артабан уртаҡлашыу мөмкин булһын өсөн, был ҡушымтаны танытып ҡуйығыҙ.",
- "ME": "Миңә",
"CHANGE_VALUE_TITLE": "Мәғәнәне үҙгәртегеҙ:",
"NEW_VARIABLE": "Яңы үҙгәреүсән...",
"NEW_VARIABLE_TITLE": "Яңы үҙгәреүсәндең исеме:",
diff --git a/msg/json/bcc.json b/msg/json/bcc.json
index 2d59f41bc..a3f50cfef 100644
--- a/msg/json/bcc.json
+++ b/msg/json/bcc.json
@@ -19,9 +19,6 @@
"DISABLE_BLOCK": "غیرفعالسازی بلوک",
"ENABLE_BLOCK": "فعالسازی بلوک",
"HELP": "کومک",
- "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!",
- "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراکگذاری توسط شما داده شود.",
- "ME": "من",
"CHANGE_VALUE_TITLE": "تغییر مقدار:",
"NEW_VARIABLE": "متغیر تازه...",
"NEW_VARIABLE_TITLE": "نام متغیر تازه:",
diff --git a/msg/json/be-tarask.json b/msg/json/be-tarask.json
index 7791d1918..f7edf7507 100644
--- a/msg/json/be-tarask.json
+++ b/msg/json/be-tarask.json
@@ -26,9 +26,6 @@
"HELP": "Дапамога",
"UNDO": "Скасаваць",
"REDO": "Паўтарыць",
- "CHAT": "Стасуйцеся са сваім калегам, набіраючы тэкст у гэтым полі!",
- "AUTH": "Калі ласка, аўтарызуйце гэтае прыкладаньне, каб можна было захоўваць Вашую працу і мець магчымасьць дзяліцца ёю.",
- "ME": "Я",
"CHANGE_VALUE_TITLE": "Зьмяніць значэньне:",
"NEW_VARIABLE": "Новая зьменная…",
"NEW_VARIABLE_TITLE": "Імя новай зьменнай:",
diff --git a/msg/json/bg.json b/msg/json/bg.json
index ca8508956..ab3eceed0 100644
--- a/msg/json/bg.json
+++ b/msg/json/bg.json
@@ -25,9 +25,6 @@
"DISABLE_BLOCK": "Деактивирай блок",
"ENABLE_BLOCK": "Активирай блок",
"HELP": "Помощ",
- "CHAT": "Говори с колега, като пишеш в това поле!",
- "AUTH": "Позволи на приложението да записва и споделя работата ти.",
- "ME": "Аз",
"CHANGE_VALUE_TITLE": "Промени стойността:",
"NEW_VARIABLE": "Нова променлива...",
"NEW_VARIABLE_TITLE": "Ново име на променливата:",
diff --git a/msg/json/bn.json b/msg/json/bn.json
index 1c96ff3a2..9c76a58f1 100644
--- a/msg/json/bn.json
+++ b/msg/json/bn.json
@@ -24,8 +24,6 @@
"HELP": "সাহায্য",
"UNDO": "পূর্বাবস্থা",
"REDO": "পুনরায় করুন",
- "CHAT": "এই বাক্সে লিখার মাধ্যমে আপনার সহযোগীর সাথে আলাপ করুন!",
- "ME": "আমাকে",
"CHANGE_VALUE_TITLE": "মান পরিবর্তন করুন:",
"NEW_VARIABLE": "নতুন চলক...",
"NEW_VARIABLE_TITLE": "নতুন চলকের নাম:",
diff --git a/msg/json/br.json b/msg/json/br.json
index ca31c1fda..9c3a20f68 100644
--- a/msg/json/br.json
+++ b/msg/json/br.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Diweredekaat ar bloc'h",
"ENABLE_BLOCK": "Gweredekaat ar bloc'h",
"HELP": "Skoazell",
- "CHAT": "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !",
- "AUTH": "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp.",
- "ME": "Me",
"CHANGE_VALUE_TITLE": "Kemmañ an dalvoudenn :",
"NEW_VARIABLE": "Argemmenn nevez...",
"NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :",
diff --git a/msg/json/ca.json b/msg/json/ca.json
index 3fbab9acb..4a774d069 100644
--- a/msg/json/ca.json
+++ b/msg/json/ca.json
@@ -23,9 +23,6 @@
"DISABLE_BLOCK": "Desactiva bloc",
"ENABLE_BLOCK": "Activa bloc",
"HELP": "Ajuda",
- "CHAT": "Xateja amb el teu col·laborador escrivint en aquest quadre!",
- "AUTH": "Si us plau, autoritzeu que aquesta aplicació pugui desar la vostra feina i que la pugueu compartir.",
- "ME": "Jo",
"CHANGE_VALUE_TITLE": "Canvia valor:",
"NEW_VARIABLE": "Nova variable...",
"NEW_VARIABLE_TITLE": "Nou nom de variable:",
diff --git a/msg/json/cs.json b/msg/json/cs.json
index 29136d340..13b3a2c24 100644
--- a/msg/json/cs.json
+++ b/msg/json/cs.json
@@ -32,9 +32,6 @@
"HELP": "Nápověda",
"UNDO": "Zpět",
"REDO": "Znovu",
- "CHAT": "Psaním do tohoto políčka komunikujte se spolupracovníky!",
- "AUTH": "Prosím udělte oprávnění této aplikaci aby jste mohli uložit a sdílet svou práci.",
- "ME": "Já",
"CHANGE_VALUE_TITLE": "Změnit hodnotu:",
"NEW_VARIABLE": "Nová proměnná...",
"NEW_VARIABLE_TITLE": "Nový název proměnné:",
diff --git a/msg/json/da.json b/msg/json/da.json
index 638c5629b..a5c51515d 100644
--- a/msg/json/da.json
+++ b/msg/json/da.json
@@ -25,9 +25,6 @@
"DISABLE_BLOCK": "Deaktivér blok",
"ENABLE_BLOCK": "Aktivér blok",
"HELP": "Hjælp",
- "CHAT": "Chat med din samarbejdspartner ved at skrive i denne boks!",
- "AUTH": "Tillad venligst at denne app muliggør at du kan gemme dit arbejde og at du kan dele det.",
- "ME": "Mig",
"CHANGE_VALUE_TITLE": "Skift værdi:",
"NEW_VARIABLE": "Ny variabel...",
"NEW_VARIABLE_TITLE": "Navn til den nye variabel:",
diff --git a/msg/json/de.json b/msg/json/de.json
index 366661825..dc5cfe81b 100644
--- a/msg/json/de.json
+++ b/msg/json/de.json
@@ -30,9 +30,6 @@
"HELP": "Hilfe",
"UNDO": "Rückgängig",
"REDO": "Wiederholen",
- "CHAT": "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!",
- "AUTH": "Bitte autorisiere diese App um deine Arbeit speichern und teilen zu können.",
- "ME": "Ich",
"CHANGE_VALUE_TITLE": "Wert ändern:",
"NEW_VARIABLE": "Neue Variable …",
"NEW_VARIABLE_TITLE": "Name der neuen Variable:",
diff --git a/msg/json/el.json b/msg/json/el.json
index 408918a1a..b2a566f8b 100644
--- a/msg/json/el.json
+++ b/msg/json/el.json
@@ -28,9 +28,6 @@
"DISABLE_BLOCK": "Απενεργοποίησε Το Μπλοκ",
"ENABLE_BLOCK": "Ενεργοποίησε Το Μπλοκ",
"HELP": "Βοήθεια",
- "CHAT": "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!",
- "AUTH": "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου.",
- "ME": "Εγώ",
"CHANGE_VALUE_TITLE": "Άλλαξε την τιμή:",
"NEW_VARIABLE": "Νέα μεταβλητή...",
"NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:",
diff --git a/msg/json/en.json b/msg/json/en.json
index 6b05d3a1c..428da7665 100644
--- a/msg/json/en.json
+++ b/msg/json/en.json
@@ -25,9 +25,6 @@
"HELP": "Help",
"UNDO": "Undo",
"REDO": "Redo",
- "CHAT": "Chat with your collaborator by typing in this box!",
- "AUTH": "Please authorize this app to enable your work to be saved and to allow it to be shared by you.",
- "ME": "Me",
"CHANGE_VALUE_TITLE": "Change value:",
"NEW_VARIABLE": "New variable...",
"NEW_VARIABLE_TITLE": "New variable name:",
diff --git a/msg/json/es.json b/msg/json/es.json
index 4afd5e793..09f1222be 100644
--- a/msg/json/es.json
+++ b/msg/json/es.json
@@ -31,9 +31,6 @@
"HELP": "Ayuda",
"UNDO": "Deshacer",
"REDO": "Rehacer",
- "CHAT": "¡Chatea con tu colaborador escribiendo en este cuadro!",
- "AUTH": "Autoriza a esta aplicación para guardar tu trabajo y permitir que lo compartas.",
- "ME": "Yo",
"CHANGE_VALUE_TITLE": "Cambiar el valor:",
"NEW_VARIABLE": "Variable nueva…",
"NEW_VARIABLE_TITLE": "Nombre de variable nueva:",
diff --git a/msg/json/fa.json b/msg/json/fa.json
index fdfdf75f8..3bd802bd8 100644
--- a/msg/json/fa.json
+++ b/msg/json/fa.json
@@ -30,9 +30,6 @@
"HELP": "راهنما",
"UNDO": "واگردانی",
"REDO": "واگردانی",
- "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!",
- "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراکگذاری توسط شما داده شود.",
- "ME": "من",
"CHANGE_VALUE_TITLE": "تغییر مقدار:",
"NEW_VARIABLE": "متغیر تازه...",
"NEW_VARIABLE_TITLE": "نام متغیر تازه:",
diff --git a/msg/json/fi.json b/msg/json/fi.json
index d00ae52d3..815bd26ea 100644
--- a/msg/json/fi.json
+++ b/msg/json/fi.json
@@ -32,9 +32,6 @@
"HELP": "Apua",
"UNDO": "Kumoa",
"REDO": "Tee uudelleen",
- "CHAT": "Keskustele yhteistyökumppanisi kanssa kirjoittamalla tähän kenttään!",
- "AUTH": "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen.",
- "ME": "Minä",
"CHANGE_VALUE_TITLE": "Muuta arvoa:",
"NEW_VARIABLE": "Uusi muuttuja...",
"NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:",
diff --git a/msg/json/fr.json b/msg/json/fr.json
index e4d0b7d73..7e0450fde 100644
--- a/msg/json/fr.json
+++ b/msg/json/fr.json
@@ -31,9 +31,6 @@
"HELP": "Aide",
"UNDO": "Annuler",
"REDO": "Refaire",
- "CHAT": "Discutez avec votre collaborateur en tapant dans cette zone !",
- "AUTH": "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser d'être partagé par vous.",
- "ME": "Moi",
"CHANGE_VALUE_TITLE": "Modifier la valeur :",
"NEW_VARIABLE": "Nouvelle variable…",
"NEW_VARIABLE_TITLE": "Nouveau nom de la variable :",
diff --git a/msg/json/he.json b/msg/json/he.json
index 73ed3b49f..df863597f 100644
--- a/msg/json/he.json
+++ b/msg/json/he.json
@@ -34,9 +34,6 @@
"HELP": "עזרה",
"UNDO": "ביטול",
"REDO": "ביצוע חוזר",
- "CHAT": "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!",
- "AUTH": "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך.",
- "ME": "אותי",
"CHANGE_VALUE_TITLE": "שנה ערך:",
"NEW_VARIABLE": "משתנה חדש...",
"NEW_VARIABLE_TITLE": "שם המשתנה החדש:",
diff --git a/msg/json/hi.json b/msg/json/hi.json
index 62f2f7ac0..dc14f10bb 100644
--- a/msg/json/hi.json
+++ b/msg/json/hi.json
@@ -23,9 +23,6 @@
"DISABLE_BLOCK": "ब्लॉक को अक्षम करें",
"ENABLE_BLOCK": "ब्लॉक को सक्षम करें",
"HELP": "सहायता",
- "CHAT": "इस सन्दूक में लिखकर हमारे सहयोगी के साथ बातचीत करें!",
- "AUTH": "अपने कार्य को सहेजना सक्षम करने और अपने साथ इसे साझा करने हेतु कृपया इस एप्प को अधिकृत करें।",
- "ME": "मैं",
"CHANGE_VALUE_TITLE": "मान परिवर्तित करें:",
"NEW_VARIABLE": "नया चर...",
"NEW_VARIABLE_TITLE": "नए चर का नाम:",
diff --git a/msg/json/hrx.json b/msg/json/hrx.json
index 39a3f37ad..d42be99a9 100644
--- a/msg/json/hrx.json
+++ b/msg/json/hrx.json
@@ -20,9 +20,6 @@
"DISABLE_BLOCK": "Block deaktivieren",
"ENABLE_BLOCK": "Block aktivieren",
"HELP": "Hellef",
- "CHAT": "Sprech mit unsrem Mitoorweiter doorrich renschreiwe von Text hier in den Kaste!",
- "AUTH": "Weart ännre:",
- "ME": "Ich",
"CHANGE_VALUE_TITLE": "Neie Variable...",
"NEW_VARIABLE": "Neie Variable...",
"NEW_VARIABLE_TITLE": "Die neie Variable sei Noome:",
diff --git a/msg/json/hu.json b/msg/json/hu.json
index 2f1e38b4f..8dd2c4699 100644
--- a/msg/json/hu.json
+++ b/msg/json/hu.json
@@ -34,9 +34,6 @@
"HELP": "Súgó",
"UNDO": "Visszavonás",
"REDO": "Újra",
- "CHAT": "Ebben a mezőben tudsz a közreműködőkkel beszélgetni!",
- "AUTH": "Kérjük, engedélyezd az alkalmazásnak munkád elmentését és megosztását.",
- "ME": "Én",
"CHANGE_VALUE_TITLE": "Érték módosítása:",
"NEW_VARIABLE": "Új változó...",
"NEW_VARIABLE_TITLE": "Az új változó neve:",
diff --git a/msg/json/ia.json b/msg/json/ia.json
index 38fb63381..f75e7a35e 100644
--- a/msg/json/ia.json
+++ b/msg/json/ia.json
@@ -25,9 +25,6 @@
"HELP": "Adjuta",
"UNDO": "Disfacer",
"REDO": "Refacer",
- "CHAT": "Conversa con tu collaborator scribente in iste quadro!",
- "AUTH": "Per favor autorisa iste application pro permitter de salveguardar tu travalio e pro permitter que tu lo divide con alteres.",
- "ME": "Io",
"CHANGE_VALUE_TITLE": "Cambiar valor:",
"NEW_VARIABLE": "Nove variabile...",
"NEW_VARIABLE_TITLE": "Nomine del nove variabile:",
diff --git a/msg/json/id.json b/msg/json/id.json
index 65ded998c..4fe972ea4 100644
--- a/msg/json/id.json
+++ b/msg/json/id.json
@@ -29,9 +29,6 @@
"HELP": "Bantuan",
"UNDO": "Urungkan",
"REDO": "Lakukan ulang",
- "CHAT": "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!",
- "AUTH": "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama.",
- "ME": "Saya",
"CHANGE_VALUE_TITLE": "Ubah nilai:",
"NEW_VARIABLE": "Variabel baru...",
"NEW_VARIABLE_TITLE": "Nama variabel baru:",
diff --git a/msg/json/is.json b/msg/json/is.json
index 686749d55..2e8f2451a 100644
--- a/msg/json/is.json
+++ b/msg/json/is.json
@@ -28,9 +28,6 @@
"HELP": "Hjálp",
"UNDO": "Afturkalla",
"REDO": "Endurtaka",
- "CHAT": "Spjallaðu við félaga með því að skrifa í þennan reit!",
- "AUTH": "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því",
- "ME": "Mig",
"CHANGE_VALUE_TITLE": "Breyta gildi:",
"NEW_VARIABLE": "Ný breyta...",
"NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:",
diff --git a/msg/json/it.json b/msg/json/it.json
index 2c88866e5..209677d38 100644
--- a/msg/json/it.json
+++ b/msg/json/it.json
@@ -30,9 +30,6 @@
"HELP": "Aiuto",
"UNDO": "Annulla",
"REDO": "Ripeti",
- "CHAT": "Chatta con il tuo collaboratore scrivendo in questo box!",
- "AUTH": "Autorizza questa applicazione per consentire di salvare il tuo lavoro e per essere condiviso.",
- "ME": "Me",
"CHANGE_VALUE_TITLE": "Modifica valore:",
"NEW_VARIABLE": "Nuova variabile...",
"NEW_VARIABLE_TITLE": "Nome della nuova variabile:",
diff --git a/msg/json/ja.json b/msg/json/ja.json
index aaa16422d..169d27b51 100644
--- a/msg/json/ja.json
+++ b/msg/json/ja.json
@@ -28,8 +28,6 @@
"HELP": "ヘルプ",
"UNDO": "取り消し",
"REDO": "やり直し",
- "CHAT": "このボックスに入力して共同編集者とチャットしよう!",
- "ME": "私に",
"CHANGE_VALUE_TITLE": "値を変更します。",
"NEW_VARIABLE": "新しい変数",
"NEW_VARIABLE_TITLE": "新しい変数の、名前",
diff --git a/msg/json/ko.json b/msg/json/ko.json
index 327721f83..77fe992c4 100644
--- a/msg/json/ko.json
+++ b/msg/json/ko.json
@@ -32,9 +32,6 @@
"HELP": "도움말",
"UNDO": "끄르다",
"REDO": "다시 시도",
- "CHAT": "이 상자에 입력하여 당신의 동료와 채팅하세요!",
- "AUTH": "당신의 작업을 저장하고 다른 사람과 공유할 수 있도록 이 애플리케이션을 인증해 주십시오.",
- "ME": "나",
"CHANGE_VALUE_TITLE": "값 바꾸기:",
"NEW_VARIABLE": "새 변수",
"NEW_VARIABLE_TITLE": "새 변수 이름:",
diff --git a/msg/json/lb.json b/msg/json/lb.json
index 2f24b62c6..ff82c489b 100644
--- a/msg/json/lb.json
+++ b/msg/json/lb.json
@@ -23,8 +23,6 @@
"HELP": "Hëllef",
"UNDO": "Réckgängeg maachen",
"REDO": "Widderhuelen",
- "CHAT": "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!",
- "ME": "Mech",
"CHANGE_VALUE_TITLE": "Wäert änneren:",
"NEW_VARIABLE": "Nei Variabel...",
"NEW_VARIABLE_TITLE": "Neie variabelen Numm:",
diff --git a/msg/json/lki.json b/msg/json/lki.json
index 96528f525..c90e64f13 100644
--- a/msg/json/lki.json
+++ b/msg/json/lki.json
@@ -23,9 +23,6 @@
"DISABLE_BLOCK": "إ کار کةتن(غیرفعالسازی) بلاک",
"ENABLE_BLOCK": "إ کارآشتن(فعال)بلاک",
"HELP": "کؤمةک",
- "CHAT": "!وةگةرد هؤمکارةتان وة نام ئئ کادرة گةپ بةن",
- "AUTH": "لطفا ئئ اپلیکیشن را ثبت کةن و آثارتان فعال کةن تا ذخیره بو و اجازهٔ اشتراک نیائن توسط هؤمة بو",
- "ME": "مإ",
"CHANGE_VALUE_TITLE": "تةغییر مقدار:",
"NEW_VARIABLE": "متغیر تازه...",
"NEW_VARIABLE_TITLE": "نام متغیر تازه:",
diff --git a/msg/json/lrc.json b/msg/json/lrc.json
index 52e432b25..7bbde5d9c 100644
--- a/msg/json/lrc.json
+++ b/msg/json/lrc.json
@@ -20,7 +20,6 @@
"DISABLE_BLOCK": "ناکشتگر کردن برشت",
"ENABLE_BLOCK": "کنشتگر کردن برشت",
"HELP": "هومياری",
- "ME": "مه",
"CHANGE_VALUE_TITLE": "ارزشت آلشت کو:",
"NEW_VARIABLE": "آلشتگر تازه...",
"NEW_VARIABLE_TITLE": "نوم آلشتگر تازه:",
diff --git a/msg/json/lt.json b/msg/json/lt.json
index cf17c429c..b034e797a 100644
--- a/msg/json/lt.json
+++ b/msg/json/lt.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Išjungti bloką",
"ENABLE_BLOCK": "Įjungti bloką",
"HELP": "Pagalba",
- "CHAT": "Galite susirašinėti su projekto bendradarbiais.",
- "AUTH": "Norint išsaugoti (ir dalintis) savo sukurtas programas, reikia prisijungti (autorizuotis).",
- "ME": "Mane",
"CHANGE_VALUE_TITLE": "Keisti reikšmę:",
"NEW_VARIABLE": "Naujas kintamasis...",
"NEW_VARIABLE_TITLE": "Naujo kintamojo pavadinimas:",
diff --git a/msg/json/mk.json b/msg/json/mk.json
index 4cb890cf0..c9f8a866e 100644
--- a/msg/json/mk.json
+++ b/msg/json/mk.json
@@ -20,9 +20,6 @@
"DISABLE_BLOCK": "Исклучи блок",
"ENABLE_BLOCK": "Вклучи блок",
"HELP": "Помош",
- "CHAT": "Разговарајте со вашиот соработник во ова поле!",
- "AUTH": "Овластете го извршников за да можете да ја зачувате вашата работа и да можете да ја споделувате.",
- "ME": "Мене",
"CHANGE_VALUE_TITLE": "Смена на вредност:",
"NEW_VARIABLE": "Нова променлива...",
"NEW_VARIABLE_TITLE": "Назив на новата променлива:",
diff --git a/msg/json/ms.json b/msg/json/ms.json
index 017fa3c27..6f78dc90e 100644
--- a/msg/json/ms.json
+++ b/msg/json/ms.json
@@ -23,9 +23,6 @@
"DISABLE_BLOCK": "Matikan Blok",
"ENABLE_BLOCK": "Hidupkan Blok",
"HELP": "Bantuan",
- "CHAT": "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!",
- "AUTH": "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda.",
- "ME": "Saya",
"CHANGE_VALUE_TITLE": "Ubah nilai:",
"NEW_VARIABLE": "Pembolehubah baru...",
"NEW_VARIABLE_TITLE": "Nama pembolehubah baru:",
diff --git a/msg/json/nb.json b/msg/json/nb.json
index 8a9a1f474..adee7100f 100644
--- a/msg/json/nb.json
+++ b/msg/json/nb.json
@@ -25,9 +25,6 @@
"DISABLE_BLOCK": "Deaktiver blokk",
"ENABLE_BLOCK": "Aktiver blokk",
"HELP": "Hjelp",
- "CHAT": "Chat med din medarbeider ved å skrive i dette feltet!",
- "AUTH": "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det.",
- "ME": "Jeg",
"CHANGE_VALUE_TITLE": "Bytt verdi:",
"NEW_VARIABLE": "Ny variabel...",
"NEW_VARIABLE_TITLE": "Nytt variabelnavn:",
diff --git a/msg/json/nl.json b/msg/json/nl.json
index 323e931d7..d1326a00a 100644
--- a/msg/json/nl.json
+++ b/msg/json/nl.json
@@ -32,9 +32,6 @@
"HELP": "Hulp",
"UNDO": "Ongedaan maken",
"REDO": "Opnieuw",
- "CHAT": "Chat met iemand die ook aan het werk is via dit venster!",
- "AUTH": "Sta deze app toe om uw werk op te slaan het uw werk te delen.",
- "ME": "Ik",
"CHANGE_VALUE_TITLE": "Waarde wijzigen:",
"NEW_VARIABLE": "Nieuwe variabele...",
"NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:",
diff --git a/msg/json/oc.json b/msg/json/oc.json
index 1e505fe20..8a5e5906a 100644
--- a/msg/json/oc.json
+++ b/msg/json/oc.json
@@ -20,7 +20,6 @@
"DISABLE_BLOCK": "Desactivar lo blòt",
"ENABLE_BLOCK": "Activar lo blòt",
"HELP": "Ajuda",
- "ME": "Ieu",
"CHANGE_VALUE_TITLE": "Modificar la valor :",
"NEW_VARIABLE": "Variabla novèla…",
"NEW_VARIABLE_TITLE": "Nom de la novèla variabla :",
diff --git a/msg/json/pl.json b/msg/json/pl.json
index 218b2442d..cda271e14 100644
--- a/msg/json/pl.json
+++ b/msg/json/pl.json
@@ -34,9 +34,6 @@
"HELP": "Pomoc",
"UNDO": "Cofnij",
"REDO": "Ponów",
- "CHAT": "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!",
- "AUTH": "Autoryzuj ten program, aby można było zapisać Twoją pracę i umożliwić Ci dzielenie się nią z innymi.",
- "ME": "Ja",
"CHANGE_VALUE_TITLE": "Zmień wartość:",
"NEW_VARIABLE": "Nowa zmienna...",
"NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:",
diff --git a/msg/json/pms.json b/msg/json/pms.json
index 17ed9bf6e..4c317341f 100644
--- a/msg/json/pms.json
+++ b/msg/json/pms.json
@@ -24,9 +24,6 @@
"HELP": "Agiut",
"UNDO": "Anulé",
"REDO": "Fé torna",
- "CHAT": "Ch'a ciaciara con sò colaborator an scrivend an costa casela!",
- "AUTH": "Për piasì, ch'a autorisa costa aplicassion a përmëtte ëd salvé sò travaj e a autoriselo a esse partagià da chiel.",
- "ME": "Mi",
"CHANGE_VALUE_TITLE": "Modifiché ël valor:",
"NEW_VARIABLE": "Neuva variàbil...",
"NEW_VARIABLE_TITLE": "Nòm ëd la neuva variàbil:",
diff --git a/msg/json/pt-br.json b/msg/json/pt-br.json
index 26b3c98c7..489f5c78c 100644
--- a/msg/json/pt-br.json
+++ b/msg/json/pt-br.json
@@ -37,9 +37,6 @@
"HELP": "Ajuda",
"UNDO": "Desfazer",
"REDO": "Refazer",
- "CHAT": "Converse com o seu colaborador digitando nesta caixa!",
- "AUTH": "Por favor autorize este aplicativo para permitir que o seu trabalho seja gravado e que ele seja compartilhado por você.",
- "ME": "Eu",
"CHANGE_VALUE_TITLE": "Mudar valor:",
"NEW_VARIABLE": "Nova variável...",
"NEW_VARIABLE_TITLE": "Nome da nova variável:",
diff --git a/msg/json/pt.json b/msg/json/pt.json
index 47f40cba4..797f42e45 100644
--- a/msg/json/pt.json
+++ b/msg/json/pt.json
@@ -31,9 +31,6 @@
"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",
"CHANGE_VALUE_TITLE": "Alterar valor:",
"NEW_VARIABLE": "Nova variável...",
"NEW_VARIABLE_TITLE": "Nome da nova variável:",
diff --git a/msg/json/qqq.json b/msg/json/qqq.json
index 4c6c5385c..9f990c30b 100644
--- a/msg/json/qqq.json
+++ b/msg/json/qqq.json
@@ -26,9 +26,6 @@
"HELP": "context menu - Provide helpful information about the selected block.\n{{Identical|Help}}",
"UNDO": "context menu - Undo the previous action.\n{{Identical|Undo}}",
"REDO": "context menu - Undo the previous undo action.\n{{Identical|Redo}}",
- "CHAT": "collaboration instruction - Tell the user that they can talk with other users.",
- "AUTH": "authorization instruction - Ask the user to authorize this app so it can be saved and shared by them.",
- "ME": "First person singular - objective case",
"CHANGE_VALUE_TITLE": "prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value.",
"NEW_VARIABLE": "dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to define a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].",
"NEW_VARIABLE_TITLE": "prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].",
diff --git a/msg/json/ro.json b/msg/json/ro.json
index b3ad25bdb..01365b4e7 100644
--- a/msg/json/ro.json
+++ b/msg/json/ro.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Dezactivaţi bloc",
"ENABLE_BLOCK": "Permite bloc",
"HELP": "Ajutor",
- "CHAT": "Discută cu colaboratorul tău tastând în cadrul acestei zone!",
- "AUTH": "Va rugăm să autorizați această aplicație să permită salvarea activității dumneavoastră și să permită distribuirea acesteia de către dumneavoastră.",
- "ME": "Eu",
"CHANGE_VALUE_TITLE": "Schimbaţi valoarea:",
"NEW_VARIABLE": "Variabilă nouă...",
"NEW_VARIABLE_TITLE": "Noul nume de variabilă:",
diff --git a/msg/json/ru.json b/msg/json/ru.json
index 7c3653a1d..d2a5e34c7 100644
--- a/msg/json/ru.json
+++ b/msg/json/ru.json
@@ -28,9 +28,6 @@
"HELP": "Справка",
"UNDO": "Отменить",
"REDO": "Повторить",
- "CHAT": "Общайтесь со своим коллегой, печатая в этом поле!",
- "AUTH": "Пожалуйста, авторизуйте это приложение, чтоб можно было сохранять вашу работу и чтобы дать возможность вам делиться ей.",
- "ME": "Мне",
"CHANGE_VALUE_TITLE": "Измените значение:",
"NEW_VARIABLE": "Новая переменная…",
"NEW_VARIABLE_TITLE": "Имя новой переменной:",
diff --git a/msg/json/sc.json b/msg/json/sc.json
index ea088b0f2..191118662 100644
--- a/msg/json/sc.json
+++ b/msg/json/sc.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Disabìlita Blocu",
"ENABLE_BLOCK": "Abìlita Blocu",
"HELP": "Agiudu",
- "CHAT": "Faedda cun su cumpàngiu tuo iscriende inoghe!",
- "AUTH": "Permiti a custa app de sarvare su traballu tuo e de ti lu fàghere cumpartzire.",
- "ME": "Deo",
"CHANGE_VALUE_TITLE": "Muda valori:",
"NEW_VARIABLE": "Variabili noa...",
"NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:",
diff --git a/msg/json/sd.json b/msg/json/sd.json
index 87d7f520d..9263ada28 100644
--- a/msg/json/sd.json
+++ b/msg/json/sd.json
@@ -21,8 +21,6 @@
"DISABLE_BLOCK": "بلاڪ کي غيرفعال بڻايو",
"ENABLE_BLOCK": "بلاڪ کي فعال بڻايو",
"HELP": "مدد",
- "CHAT": "هن دٻيءَ ۾ ٽائيپ ڪري پنهنجي ساٿاريءَ سان ڳالهايو",
- "ME": "آئون",
"CHANGE_VALUE_TITLE": "قدر بدلايو",
"NEW_VARIABLE": "نئون ڦرڻو",
"NEW_VARIABLE_TITLE": "ڦرڻي جو نئون نالو:",
diff --git a/msg/json/shn.json b/msg/json/shn.json
index 9fa21e1f3..0f747e58a 100644
--- a/msg/json/shn.json
+++ b/msg/json/shn.json
@@ -20,9 +20,6 @@
"DISABLE_BLOCK": "ဢမ်ႇၸၢင်ႈပလွၵ်ႉ",
"ENABLE_BLOCK": "ၵမ်ႉထႅမ်ပၼ် ပလွၵ်ႉ",
"HELP": "ၸွႆႈထႅမ်",
- "CHAT": "ပေႃႉလိၵ်ႈ ၼႂ်းလွၵ်းၼႆႉသေ ၶျၢတ်ႉၸူး ၵေႃႉႁူမ်ႈႁဵတ်းႁူမ်ႈသၢင်ႈ ၸဝ်ႈၵဝ်ႇ",
- "AUTH": "ၶွပ်ႈၸႂ် ပၼ်ၶႂၢင်ႉႁပ်ႉဢဝ် ဢႅပ်ႉၼႆႉ တီႈၼႂ်းၵၢၼ်ၸဝ်ႈၵဝ်ႇသေယဝ်ႉ ၸဝ်ႈၵဝ်ႇ ႁႂ်ႈလႆႈသိမ်း ႁႂ်ႈလႆႈပိုၼ်ပၼ်သေၵမ်း",
- "ME": "ၸဝ်ႈၵဝ်ႇ",
"CHANGE_VALUE_TITLE": "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ",
"NEW_VARIABLE": "လၢႆႈဢၼ်မႂ်ႇ",
"NEW_VARIABLE_TITLE": "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ",
diff --git a/msg/json/sk.json b/msg/json/sk.json
index 8ddb2604f..06e7a8e0e 100644
--- a/msg/json/sk.json
+++ b/msg/json/sk.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Vypnúť blok",
"ENABLE_BLOCK": "Povoliť blok",
"HELP": "Pomoc",
- "CHAT": "Písaním do tohto políčka komunikujte so spolupracovníkmi!",
- "AUTH": "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu.",
- "ME": "Ja",
"CHANGE_VALUE_TITLE": "Zmeniť hodnotu:",
"NEW_VARIABLE": "Nová premenná...",
"NEW_VARIABLE_TITLE": "Názov novej premennej:",
diff --git a/msg/json/sl.json b/msg/json/sl.json
index cca493eeb..292adb0d9 100644
--- a/msg/json/sl.json
+++ b/msg/json/sl.json
@@ -26,9 +26,6 @@
"HELP": "Pomoč",
"UNDO": "Razveljavi",
"REDO": "Ponovi",
- "CHAT": "Klepetaj s sodelavcem tako, da tipkaš v to okno!",
- "AUTH": "Prosimo, avtoriziraj to aplikacijo, da boš lahko svoje delo shranil(-a) in delil(-a) z drugimi.",
- "ME": "Jaz",
"CHANGE_VALUE_TITLE": "Spremeni vrednost:",
"NEW_VARIABLE": "Nova spremenljivka...",
"NEW_VARIABLE_TITLE": "Ime nove spremenljivke:",
diff --git a/msg/json/sr.json b/msg/json/sr.json
index f1af6fdb5..91fceb823 100644
--- a/msg/json/sr.json
+++ b/msg/json/sr.json
@@ -26,9 +26,6 @@
"HELP": "Помоћ",
"UNDO": "Опозови",
"REDO": "Понови",
- "CHAT": "Комуницирају са својим колегом, уносећи у то поље!",
- "AUTH": "Пријавите се молим то је апликација да се окрену свој посао, да побегне и да му се омогући да буде заједничко за вас.",
- "ME": "Ми",
"CHANGE_VALUE_TITLE": "Промените вредност:",
"NEW_VARIABLE": "Нова променљива…",
"NEW_VARIABLE_TITLE": "Име нове променљиве:",
diff --git a/msg/json/sv.json b/msg/json/sv.json
index ed8acb30f..e7e14e2ac 100644
--- a/msg/json/sv.json
+++ b/msg/json/sv.json
@@ -28,9 +28,6 @@
"HELP": "Hjälp",
"UNDO": "Ångra",
"REDO": "Gör om",
- "CHAT": "Chatta med din medarbetare genom att skriva i detta fält.",
- "AUTH": "Var god godkänn denna app för att du ska kunna spara och dela den.",
- "ME": "Jag",
"CHANGE_VALUE_TITLE": "Ändra värde:",
"NEW_VARIABLE": "Ny variabel...",
"NEW_VARIABLE_TITLE": "Nytt variabelnamn:",
diff --git a/msg/json/ta.json b/msg/json/ta.json
index 03b31352e..5c1476753 100644
--- a/msg/json/ta.json
+++ b/msg/json/ta.json
@@ -25,9 +25,6 @@
"DISABLE_BLOCK": "உறுப்பை இயங்காது செய்",
"ENABLE_BLOCK": "உறுப்பை இயங்குமாரு செய்",
"HELP": "உதவி",
- "CHAT": "இந்தப் பெட்டியில் தட்டச்சு செய்வதன் மூலம் கூட்டுப்பணியாளருடன் உரையாடலாம்!",
- "AUTH": "தயவுச்செய்து இச்செயலியை அங்கீகரித்து உங்கள் வேலையைச் சேமித்து பகிரரும்படி அனுமதிக்கவும்.",
- "ME": "எனக்கு",
"CHANGE_VALUE_TITLE": "மதிப்பை மாற்றவும்:",
"NEW_VARIABLE": "புதிய மாறிலி...",
"NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:",
diff --git a/msg/json/tcy.json b/msg/json/tcy.json
index 279dca556..74afa6c39 100644
--- a/msg/json/tcy.json
+++ b/msg/json/tcy.json
@@ -25,9 +25,6 @@
"HELP": "ಸಹಾಯೊ",
"UNDO": "ದುಂಬುದಲೆಕೊ",
"REDO": "ಪಿರವುದಂಚ",
- "CHAT": "ನಿಕ್ಲೆನ ಸಹಬೋಗಿನೊಟ್ಟುಗೆ ಈ ಪೆಟ್ಟಿಗೆಡ್ ಚಾಟಿಂಗ್ ನಮೂದು ಮಲ್ಪುಲೆ",
- "AUTH": "ಈರೆನ ಕೆಲಸೊನು ಒರಿಪಾಯರೆ ಬುಕ್ಕೊ ಈರೆನಟ್ಟುಗು ಪಟ್ಟೊನುಯರೆ ಅವಕಾಸೊ.",
- "ME": "ಯಾನ್",
"CHANGE_VALUE_TITLE": "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ",
"NEW_VARIABLE": "ಪೊಸ ಬದಲಾವಣೆ",
"NEW_VARIABLE_TITLE": "ಪುದರ್ದ ಪೊಸ ಬದಲಾವಣೆ:",
diff --git a/msg/json/th.json b/msg/json/th.json
index b42784c78..d2ee19352 100644
--- a/msg/json/th.json
+++ b/msg/json/th.json
@@ -23,9 +23,6 @@
"DISABLE_BLOCK": "ปิดใช้งานบล็อก",
"ENABLE_BLOCK": "เปิดใช้งานบล็อก",
"HELP": "ช่วยเหลือ",
- "CHAT": "คุยกับผู้ร่วมงานของคุณโดยพิมพ์ลงในกล่องนี้!",
- "AUTH": "กรุณาอนุญาตแอปนี้เพื่อเปิดใช้งาน การบันทึกงานของคุณ และยินยอมให้คุณแบ่งปันงานของคุณได้",
- "ME": "ฉัน",
"CHANGE_VALUE_TITLE": "เปลี่ยนค่า:",
"NEW_VARIABLE": "สร้างตัวแปร...",
"NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:",
diff --git a/msg/json/tlh.json b/msg/json/tlh.json
index 4413dfd46..8be1d1dac 100644
--- a/msg/json/tlh.json
+++ b/msg/json/tlh.json
@@ -25,8 +25,6 @@
"HELP": "QaH",
"UNDO": "vangHa'",
"REDO": "vangqa'",
- "CHAT": "beqpu'lI'vaD bIjawmeH naDev yIrI'!",
- "AUTH": "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob.",
"CHANGE_VALUE_TITLE": "choH:",
"NEW_VARIABLE": "lIw chu'...",
"NEW_VARIABLE_TITLE": "lIw chu' pong:",
diff --git a/msg/json/tr.json b/msg/json/tr.json
index 884540337..3ce5aa485 100644
--- a/msg/json/tr.json
+++ b/msg/json/tr.json
@@ -35,9 +35,6 @@
"HELP": "Yardım",
"UNDO": "Geri al",
"REDO": "Yinele",
- "CHAT": "Bu kutuya yazarak iş birlikçin ile sohbet et!",
- "AUTH": "Çalışmanızın kaydedilmesi ve sizinle paylaşılmasına izin verilmesi için lütfen bu uygulamaya yetki verin.",
- "ME": "Beni",
"CHANGE_VALUE_TITLE": "Değeri değiştir:",
"NEW_VARIABLE": "Yeni değişken...",
"NEW_VARIABLE_TITLE": "Yeni değişken ismi :",
diff --git a/msg/json/uk.json b/msg/json/uk.json
index 4d2b609d3..fc25fc5b8 100644
--- a/msg/json/uk.json
+++ b/msg/json/uk.json
@@ -29,9 +29,6 @@
"HELP": "Довідка",
"UNDO": "Скасувати",
"REDO": "Повторити",
- "CHAT": "Спілкуйтеся з вашими співавторами, набираючи у цьому полі!",
- "AUTH": "Будь ласка, авторизуйте цю програму, аби можна було зберігати вашу роботу і для надання можливості вам поширювати її.",
- "ME": "Я",
"CHANGE_VALUE_TITLE": "Змінити значення:",
"NEW_VARIABLE": "Нова змінна...",
"NEW_VARIABLE_TITLE": "Нова назва змінної:",
diff --git a/msg/json/vi.json b/msg/json/vi.json
index dba6f3618..4c801fff2 100644
--- a/msg/json/vi.json
+++ b/msg/json/vi.json
@@ -24,9 +24,6 @@
"DISABLE_BLOCK": "Ngưng Tác Dụng",
"ENABLE_BLOCK": "Phục Hồi Tác Dụng",
"HELP": "Trợ Giúp",
- "CHAT": "Trò chuyện với cộng tác viên của bạn bằng cách gõ vào hộp này!",
- "AUTH": "Vui lòng cho phép ứng dụng được lưu dữ liệu của bạn và tự động chia sẻ bằng tên của bạn",
- "ME": "Tôi",
"CHANGE_VALUE_TITLE": "Thay giá trị thành:",
"NEW_VARIABLE": "Biến mới...",
"NEW_VARIABLE_TITLE": "Tên của biến mới:",
diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json
index a99ce5379..670a09d15 100644
--- a/msg/json/zh-hans.json
+++ b/msg/json/zh-hans.json
@@ -32,9 +32,6 @@
"HELP": "帮助",
"UNDO": "撤销",
"REDO": "重做",
- "CHAT": "通过在此框输入与您的合作者沟通!",
- "AUTH": "请授权这个应用程序以保存您的作品并共享。",
- "ME": "我",
"CHANGE_VALUE_TITLE": "更改值:",
"NEW_VARIABLE": "新变量...",
"NEW_VARIABLE_TITLE": "新变量的名称:",
diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json
index 55dcaf179..bcd166754 100644
--- a/msg/json/zh-hant.json
+++ b/msg/json/zh-hant.json
@@ -30,9 +30,6 @@
"HELP": "說明",
"UNDO": "還原",
"REDO": "重試",
- "CHAT": "與您的合作者洽談藉由在此框輸入!",
- "AUTH": "請授權這個應用程式以保存您的作品並共享。",
- "ME": "我",
"CHANGE_VALUE_TITLE": "修改值:",
"NEW_VARIABLE": "新變數...",
"NEW_VARIABLE_TITLE": "新變數名稱:",
diff --git a/msg/messages.js b/msg/messages.js
index a6c001855..691e2ce94 100644
--- a/msg/messages.js
+++ b/msg/messages.js
@@ -93,14 +93,6 @@ Blockly.Msg.UNDO = 'Undo';
/// context menu - Undo the previous undo action.\n{{Identical|Redo}}
Blockly.Msg.REDO = 'Redo';
-// Realtime collaboration.
-/// collaboration instruction - Tell the user that they can talk with other users.
-Blockly.Msg.CHAT = 'Chat with your collaborator by typing in this box!';
-/// authorization instruction - Ask the user to authorize this app so it can be saved and shared by them.
-Blockly.Msg.AUTH = 'Please authorize this app to enable your work to be saved and to allow it to be shared by you.';
-/// First person singular - objective case
-Blockly.Msg.ME = 'Me';
-
// Variable renaming.
/// prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value.
Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:';
From b324efaa86668698daa593402c9794e6ebb1a286 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Fri, 8 Jul 2016 18:58:28 -0700
Subject: [PATCH 13/25] Change tooltip on text/list indexOf blocks to be 0/1
index aware. All languages.
Delete ta:TEXT_INDEXOF_TOOLTIP since that text does not appear to make
sense.
---
blockly_compressed.js | 2 +-
blocks/lists.js | 4 +++-
blocks/text.js | 4 +++-
blocks_compressed.js | 5 +++--
core/blocks.js | 7 +++++++
msg/js/ar.js | 4 ++--
msg/js/az.js | 4 ++--
msg/js/ba.js | 4 ++--
msg/js/bcc.js | 4 ++--
msg/js/be-tarask.js | 4 ++--
msg/js/bg.js | 4 ++--
msg/js/bn.js | 4 ++--
msg/js/br.js | 4 ++--
msg/js/ca.js | 4 ++--
msg/js/cs.js | 4 ++--
msg/js/da.js | 4 ++--
msg/js/de.js | 4 ++--
msg/js/el.js | 4 ++--
msg/js/en.js | 4 ++--
msg/js/es.js | 4 ++--
msg/js/fa.js | 4 ++--
msg/js/fi.js | 4 ++--
msg/js/fr.js | 4 ++--
msg/js/he.js | 4 ++--
msg/js/hi.js | 4 ++--
msg/js/hrx.js | 4 ++--
msg/js/hu.js | 4 ++--
msg/js/ia.js | 4 ++--
msg/js/id.js | 4 ++--
msg/js/is.js | 4 ++--
msg/js/it.js | 4 ++--
msg/js/ja.js | 4 ++--
msg/js/ko.js | 4 ++--
msg/js/lb.js | 4 ++--
msg/js/lki.js | 4 ++--
msg/js/lrc.js | 4 ++--
msg/js/lt.js | 4 ++--
msg/js/mk.js | 4 ++--
msg/js/ms.js | 4 ++--
msg/js/nb.js | 4 ++--
msg/js/nl.js | 4 ++--
msg/js/oc.js | 4 ++--
msg/js/pl.js | 4 ++--
msg/js/pms.js | 4 ++--
msg/js/pt-br.js | 4 ++--
msg/js/pt.js | 4 ++--
msg/js/ro.js | 4 ++--
msg/js/ru.js | 4 ++--
msg/js/sc.js | 4 ++--
msg/js/sd.js | 4 ++--
msg/js/shn.js | 4 ++--
msg/js/sk.js | 4 ++--
msg/js/sl.js | 4 ++--
msg/js/sq.js | 4 ++--
msg/js/sr.js | 4 ++--
msg/js/sv.js | 4 ++--
msg/js/ta.js | 4 ++--
msg/js/tcy.js | 4 ++--
msg/js/th.js | 4 ++--
msg/js/tl.js | 4 ++--
msg/js/tlh.js | 4 ++--
msg/js/tr.js | 4 ++--
msg/js/uk.js | 4 ++--
msg/js/vi.js | 4 ++--
msg/js/zh-hans.js | 4 ++--
msg/js/zh-hant.js | 4 ++--
msg/json/ar.json | 4 ++--
msg/json/az.json | 4 ++--
msg/json/bcc.json | 4 ++--
msg/json/be-tarask.json | 4 ++--
msg/json/bg.json | 4 ++--
msg/json/br.json | 4 ++--
msg/json/ca.json | 4 ++--
msg/json/cs.json | 4 ++--
msg/json/da.json | 4 ++--
msg/json/de.json | 4 ++--
msg/json/el.json | 4 ++--
msg/json/en.json | 4 ++--
msg/json/es.json | 4 ++--
msg/json/fa.json | 4 ++--
msg/json/fi.json | 4 ++--
msg/json/fr.json | 4 ++--
msg/json/he.json | 2 +-
msg/json/hrx.json | 4 ++--
msg/json/hu.json | 4 ++--
msg/json/ia.json | 4 ++--
msg/json/id.json | 4 ++--
msg/json/is.json | 4 ++--
msg/json/it.json | 4 ++--
msg/json/ja.json | 4 ++--
msg/json/ko.json | 4 ++--
msg/json/lki.json | 4 ++--
msg/json/lt.json | 2 +-
msg/json/ms.json | 4 ++--
msg/json/nb.json | 4 ++--
msg/json/nl.json | 4 ++--
msg/json/pl.json | 4 ++--
msg/json/pms.json | 4 ++--
msg/json/pt-br.json | 4 ++--
msg/json/pt.json | 4 ++--
msg/json/qqq.json | 4 ++--
msg/json/ro.json | 4 ++--
msg/json/ru.json | 4 ++--
msg/json/sc.json | 4 ++--
msg/json/sk.json | 4 ++--
msg/json/sl.json | 4 ++--
msg/json/sq.json | 4 ++--
msg/json/sr.json | 4 ++--
msg/json/sv.json | 4 ++--
msg/json/ta.json | 3 +--
msg/json/tcy.json | 4 ++--
msg/json/th.json | 4 ++--
msg/json/tl.json | 4 ++--
msg/json/tr.json | 4 ++--
msg/json/uk.json | 4 ++--
msg/json/vi.json | 4 ++--
msg/json/zh-hans.json | 4 ++--
msg/json/zh-hant.json | 4 ++--
msg/messages.js | 8 ++++----
119 files changed, 244 insertions(+), 233 deletions(-)
diff --git a/blockly_compressed.js b/blockly_compressed.js
index 8337ed485..3a5ae9115 100644
--- a/blockly_compressed.js
+++ b/blockly_compressed.js
@@ -859,7 +859,7 @@ goog.ui.tree.TreeControl.prototype.handleMouseEvent_=function(a){goog.log.fine(t
goog.ui.tree.TreeControl.prototype.handleKeyEvent=function(a){var b;(b=this.typeAhead_.handleNavigation(a)||this.selectedItem_&&this.selectedItem_.onKeyDown(a)||this.typeAhead_.handleTypeAheadChar(a))&&a.preventDefault();return b};goog.ui.tree.TreeControl.prototype.getNodeFromEvent_=function(a){for(var b=a.target;null!=b;){if(a=goog.ui.tree.BaseNode.allNodes[b.id])return a;if(b==this.getElement())break;b=b.parentNode}return null};
goog.ui.tree.TreeControl.prototype.createNode=function(a){return new goog.ui.tree.TreeNode(a||goog.html.SafeHtml.EMPTY,this.getConfig(),this.getDomHelper())};goog.ui.tree.TreeControl.prototype.setNode=function(a){this.typeAhead_.setNodeInMap(a)};goog.ui.tree.TreeControl.prototype.removeNode=function(a){this.typeAhead_.removeNodeFromMap(a)};goog.ui.tree.TreeControl.prototype.clearTypeAhead=function(){this.typeAhead_.clear()};goog.ui.tree.TreeControl.defaultConfig=goog.ui.tree.BaseNode.defaultConfig;
// Copyright 2013 Google Inc. Apache License 2.0
-var Blockly={Blocks:{}};
+var Blockly={Blocks:{}};Blockly.Blocks.ONE_BASED_INDEXING=!0;
// Copyright 2012 Google Inc. Apache License 2.0
Blockly.Workspace=function(a){this.id=Blockly.genUid();Blockly.Workspace.WorkspaceDB_[this.id]=this;this.options=a||{};this.RTL=!!this.options.RTL;this.horizontalLayout=!!this.options.horizontalLayout;this.toolboxPosition=this.options.toolboxPosition;this.topBlocks_=[];this.listeners_=[];this.undoStack_=[];this.redoStack_=[];this.blockDB_=Object.create(null)};Blockly.Workspace.prototype.rendered=!1;Blockly.Workspace.prototype.MAX_UNDO=1024;
Blockly.Workspace.prototype.dispose=function(){this.listeners_.length=0;this.clear();delete Blockly.Workspace.WorkspaceDB_[this.id]};Blockly.Workspace.SCAN_ANGLE=3;Blockly.Workspace.prototype.addTopBlock=function(a){this.topBlocks_.push(a)};Blockly.Workspace.prototype.removeTopBlock=function(a){for(var b=!1,c,d=0;c=this.topBlocks_[d];d++)if(c==a){this.topBlocks_.splice(d,1);b=!0;break}if(!b)throw"Block not present in workspace's list of top-most blocks.";};
diff --git a/blocks/lists.js b/blocks/lists.js
index af0f6624a..7662209f7 100644
--- a/blocks/lists.js
+++ b/blocks/lists.js
@@ -300,7 +300,9 @@ Blockly.Blocks['lists_indexOf'] = {
this.appendValueInput('FIND')
.appendField(new Blockly.FieldDropdown(OPERATORS), 'END');
this.setInputsInline(true);
- this.setTooltip(Blockly.Msg.LISTS_INDEX_OF_TOOLTIP);
+ var tooltip = Blockly.Msg.LISTS_INDEX_OF_TOOLTIP
+ .replace('%1', Blockly.Blocks.ONE_BASED_INDEXING ? '0' : '-1');
+ this.setTooltip(tooltip);
}
};
diff --git a/blocks/text.js b/blocks/text.js
index 030940add..23ff52b32 100644
--- a/blocks/text.js
+++ b/blocks/text.js
@@ -322,7 +322,9 @@ Blockly.Blocks['text_indexOf'] = {
this.appendDummyInput().appendField(Blockly.Msg.TEXT_INDEXOF_TAIL);
}
this.setInputsInline(true);
- this.setTooltip(Blockly.Msg.TEXT_INDEXOF_TOOLTIP);
+ var tooltip = Blockly.Msg.TEXT_INDEXOF_TOOLTIP
+ .replace('%1', Blockly.Blocks.ONE_BASED_INDEXING ? '0' : '-1');
+ this.setTooltip(tooltip);
}
};
diff --git a/blocks_compressed.js b/blocks_compressed.js
index 7c9504022..ac90b8c71 100644
--- a/blocks_compressed.js
+++ b/blocks_compressed.js
@@ -18,7 +18,8 @@ Blockly.Blocks.lists_create_with_item={init:function(){this.setColour(Blockly.Bl
Blockly.Blocks.lists_repeat={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_REPEAT_TITLE,args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.LISTS_REPEAT_HELPURL})}};
Blockly.Blocks.lists_length={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_LENGTH_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_LENGTH_TOOLTIP,helpUrl:Blockly.Msg.LISTS_LENGTH_HELPURL})}};
Blockly.Blocks.lists_isEmpty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_ISEMPTY_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_ISEMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_ISEMPTY_HELPURL})}};
-Blockly.Blocks.lists_indexOf={init:function(){var a=[[Blockly.Msg.LISTS_INDEX_OF_FIRST,"FIRST"],[Blockly.Msg.LISTS_INDEX_OF_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.setOutput(!0,"Number");this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST);this.appendValueInput("FIND").appendField(new Blockly.FieldDropdown(a),"END");this.setInputsInline(!0);this.setTooltip(Blockly.Msg.LISTS_INDEX_OF_TOOLTIP)}};
+Blockly.Blocks.lists_indexOf={init:function(){var a=[[Blockly.Msg.LISTS_INDEX_OF_FIRST,"FIRST"],[Blockly.Msg.LISTS_INDEX_OF_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.setOutput(!0,"Number");this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST);this.appendValueInput("FIND").appendField(new Blockly.FieldDropdown(a),"END");this.setInputsInline(!0);a=Blockly.Msg.LISTS_INDEX_OF_TOOLTIP.replace("%1",
+Blockly.Blocks.ONE_BASED_INDEXING?"0":"-1");this.setTooltip(a)}};
Blockly.Blocks.lists_getIndex={init:function(){var a=[[Blockly.Msg.LISTS_GET_INDEX_GET,"GET"],[Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE,"GET_REMOVE"],[Blockly.Msg.LISTS_GET_INDEX_REMOVE,"REMOVE"]];this.WHERE_OPTIONS=[[Blockly.Msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[Blockly.Msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[Blockly.Msg.LISTS_GET_INDEX_FIRST,"FIRST"],[Blockly.Msg.LISTS_GET_INDEX_LAST,"LAST"],[Blockly.Msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]];this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);
this.setColour(Blockly.Blocks.lists.HUE);a=new Blockly.FieldDropdown(a,function(a){this.sourceBlock_.updateStatement_("REMOVE"==a)});this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST);this.appendDummyInput().appendField(a,"MODE").appendField("","SPACE");this.appendDummyInput("AT");Blockly.Msg.LISTS_GET_INDEX_TAIL&&this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL);this.setInputsInline(!0);this.setOutput(!0);this.updateAt_(!0);
var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE")+"_"+b.getFieldValue("WHERE");return Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_"+a]})},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("statement",!this.outputConnection);var b=this.getInput("AT").type==Blockly.INPUT_VALUE;a.setAttribute("at",b);return a},domToMutation:function(a){var b="true"==a.getAttribute("statement");this.updateStatement_(b);a="false"!=a.getAttribute("at");this.updateAt_(a)},updateStatement_:function(a){a!=
@@ -122,7 +123,7 @@ Blockly.Blocks.text_append={init:function(){this.setHelpUrl(Blockly.Msg.TEXT_APP
Blockly.Blocks.text_length={init:function(){this.jsonInit({message0:Blockly.Msg.TEXT_LENGTH_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",colour:Blockly.Blocks.texts.HUE,tooltip:Blockly.Msg.TEXT_LENGTH_TOOLTIP,helpUrl:Blockly.Msg.TEXT_LENGTH_HELPURL})}};
Blockly.Blocks.text_isEmpty={init:function(){this.jsonInit({message0:Blockly.Msg.TEXT_ISEMPTY_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",colour:Blockly.Blocks.texts.HUE,tooltip:Blockly.Msg.TEXT_ISEMPTY_TOOLTIP,helpUrl:Blockly.Msg.TEXT_ISEMPTY_HELPURL})}};
Blockly.Blocks.text_indexOf={init:function(){var a=[[Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST,"FIRST"],[Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.TEXT_INDEXOF_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.setOutput(!0,"Number");this.appendValueInput("VALUE").setCheck("String").appendField(Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT);this.appendValueInput("FIND").setCheck("String").appendField(new Blockly.FieldDropdown(a),"END");Blockly.Msg.TEXT_INDEXOF_TAIL&&this.appendDummyInput().appendField(Blockly.Msg.TEXT_INDEXOF_TAIL);
-this.setInputsInline(!0);this.setTooltip(Blockly.Msg.TEXT_INDEXOF_TOOLTIP)}};
+this.setInputsInline(!0);a=Blockly.Msg.TEXT_INDEXOF_TOOLTIP.replace("%1",Blockly.Blocks.ONE_BASED_INDEXING?"0":"-1");this.setTooltip(a)}};
Blockly.Blocks.text_charAt={init:function(){this.WHERE_OPTIONS=[[Blockly.Msg.TEXT_CHARAT_FROM_START,"FROM_START"],[Blockly.Msg.TEXT_CHARAT_FROM_END,"FROM_END"],[Blockly.Msg.TEXT_CHARAT_FIRST,"FIRST"],[Blockly.Msg.TEXT_CHARAT_LAST,"LAST"],[Blockly.Msg.TEXT_CHARAT_RANDOM,"RANDOM"]];this.setHelpUrl(Blockly.Msg.TEXT_CHARAT_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.setOutput(!0,"String");this.appendValueInput("VALUE").setCheck("String").appendField(Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT);this.appendDummyInput("AT");
this.setInputsInline(!0);this.updateAt_(!0);this.setTooltip(Blockly.Msg.TEXT_CHARAT_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation"),b=this.getInput("AT").type==Blockly.INPUT_VALUE;a.setAttribute("at",b);return a},domToMutation:function(a){a="false"!=a.getAttribute("at");this.updateAt_(a)},updateAt_:function(a){this.removeInput("AT");this.removeInput("ORDINAL",!0);a?(this.appendValueInput("AT").setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):
this.appendDummyInput("AT");Blockly.Msg.TEXT_CHARAT_TAIL&&(this.removeInput("TAIL",!0),this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_CHARAT_TAIL));var b=new Blockly.FieldDropdown(this.WHERE_OPTIONS,function(b){var d="FROM_START"==b||"FROM_END"==b;if(d!=a){var e=this.sourceBlock_;e.updateAt_(d);e.setFieldValue(b,"WHERE");return null}});this.getInput("AT").appendField(b,"WHERE")}};
diff --git a/core/blocks.js b/core/blocks.js
index 606ef3f0b..aa863e8b2 100644
--- a/core/blocks.js
+++ b/core/blocks.js
@@ -25,3 +25,10 @@
'use strict';
goog.provide('Blockly.Blocks');
+
+/**
+ * Allow for switching between one and zero based indexing for lists and text,
+ * one based by default.
+ */
+Blockly.Blocks.ONE_BASED_INDEXING = true;
+
diff --git a/msg/js/ar.js b/msg/js/ar.js
index cc28e2e97..230d1435b 100644
--- a/msg/js/ar.js
+++ b/msg/js/ar.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "يقوم بإنشاء نسخة من ا
Blockly.Msg.LISTS_INDEX_OF_FIRST = "ابحث على على التواجد الأول للعنصر";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "ابحث على التواجد الأخير للعنصر";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع 0 إذا لم يتم العثور على النص.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص.";
Blockly.Msg.LISTS_INLIST = "في قائمة";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 فارغ";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "في النص";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ابحث عن التواجد الأول للنص";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ابحث عن التواجد الأخير للنص";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع 0 إذا لم يتم العثور على النص.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 فارغ";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "يرجع \"صحيح\" إذا كان النص المقدم فارغ.";
diff --git a/msg/js/az.js b/msg/js/az.js
index 7df8892e3..421a7281f 100644
--- a/msg/js/az.js
+++ b/msg/js/az.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Siyahının təyin olunmuş hissəsinin
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Element ilə ilk rastlaşma indeksini müəyyən edin";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "Element ilə son rastlaşma indeksini müəyyən edin";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, 0 qaytarılır.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, %1 qaytarılır.";
Blockly.Msg.LISTS_INLIST = "siyahıda";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boşdur";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "mətndə";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Bu mətn ilə ilk rastlaşmanı tap:";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Bu mətn ilə son rastlaşmanı tap:";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, 0 qaytarır.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, %1 qaytarır.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 boşdur";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Verilmiş mətn boşdursa, doğru qiymətini qaytarır.";
diff --git a/msg/js/ba.js b/msg/js/ba.js
index 48f7ee4a7..d47472ea1 100644
--- a/msg/js/ba.js
+++ b/msg/js/ba.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "исемлеккә";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 буш";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "текстҡа";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "текстың тәүге инеүен табырға";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Текстың һуңғы инеүен табырға";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 буш";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/bcc.js b/msg/js/bcc.js
index a584c8a4e..f5e7a9614 100644
--- a/msg/js/bcc.js
+++ b/msg/js/bcc.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخصشده
Blockly.Msg.LISTS_INDEX_OF_FIRST = "آخرین رخداد متن را بیاب";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخداد مورد";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر متن موجود نبود.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر متن موجود نبود.";
Blockly.Msg.LISTS_INLIST = "در فهرست";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافهکردن صحیح اگر متن فراهمشده خالی است.";
diff --git a/msg/js/be-tarask.js b/msg/js/be-tarask.js
index 5380de17b..b2ed711e7 100644
--- a/msg/js/be-tarask.js
+++ b/msg/js/be-tarask.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Стварае копію пазнач
Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайсьці першае ўваходжаньне элемэнту";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "знайсьці апошняе ўваходжаньне элемэнту";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае 0, калі элемэнт ня знойдзены.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены.";
Blockly.Msg.LISTS_INLIST = "у сьпісе";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пусты";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тэксьце";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайсьці першае ўваходжаньне тэксту";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайсьці апошняе ўваходжаньне тэксту";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае 0, калі тэкст ня знойдзены.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пусты";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Вяртае значэньне ісьціна, калі тэкст пусты.";
diff --git a/msg/js/bg.js b/msg/js/bg.js
index 505dce432..7dde716a1 100644
--- a/msg/js/bg.js
+++ b/msg/js/bg.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Копира част от списък
Blockly.Msg.LISTS_INDEX_OF_FIRST = "намери първата поява на елемента";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "намери последната поява на елемента";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Връща индекса на първото/последното появяване на елемента в списъка. Връща 0 ако елементът не е намерен.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1 ако елементът не е намерен.";
Blockly.Msg.LISTS_INLIST = "в списъка";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 е празен";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "в текста";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "намери първата поява на текста";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "намери последната поява на текста";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща 0, ако текстът не е намерен.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 е празен";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Връща истина, ако текста е празен.";
diff --git a/msg/js/bn.js b/msg/js/bn.js
index 45bda37d7..65a1c835c 100644
--- a/msg/js/bn.js
+++ b/msg/js/bn.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "আইটেমের প্রথম সংঘটন খুঁজুন";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "আইটেমের শেষ সংঘটন খুঁজুন";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "তালিকার মধ্যে";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 খালি";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 খালি";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "পাঠাবে সত্য যদি সরবরাহকৃত লেখাটি খালি হয়।";
diff --git a/msg/js/br.js b/msg/js/br.js
index 54bbe8a1e..398a3e48e 100644
--- a/msg/js/br.js
+++ b/msg/js/br.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Krouiñ un eilad eus lodenn spisaet ul
Blockly.Msg.LISTS_INDEX_OF_FIRST = "kavout reveziadenn gentañ un elfenn";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "kavout reveziadenn diwezhañ un elfenn";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ 0 ma n'eo ket kavet an destenn.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ %1 ma n'eo ket kavet an destenn.";
Blockly.Msg.LISTS_INLIST = "el listenn";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 zo goullo";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en destenn";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "kavout reveziadenn gentañ an destenn";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "kavout reveziadenn diwezhañ an destenn";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ 0 ma n'eo ket kavet ar chadenn.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ %1 ma n'eo ket kavet ar chadenn.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 zo goullo";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Adkas gwir m'eo goullo an destenn roet.";
diff --git a/msg/js/ca.js b/msg/js/ca.js
index 8d5bd5aec..27887e9cc 100644
--- a/msg/js/ca.js
+++ b/msg/js/ca.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una còpia de la part especificada
Blockly.Msg.LISTS_INDEX_OF_FIRST = "buscar primera aparició d'un element";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "buscar última aparició d'un element";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna 0 si no s'hi troba el text.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna %1 si no s'hi troba el text.";
Blockly.Msg.LISTS_INLIST = "en la llista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 és buida";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trobar la primera aparició del text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trobar l'última aparició del text";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna 0 si no es troba el text.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna %1 si no es troba el text.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 està buit";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna cert si el text proporcionat està buit.";
diff --git a/msg/js/cs.js b/msg/js/cs.js
index 9fcb97f82..ac10ebe54 100644
--- a/msg/js/cs.js
+++ b/msg/js/cs.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Vytvoří kopii určené části seznam
Blockly.Msg.LISTS_INDEX_OF_FIRST = "najít první výskyt položky";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "najít poslední výskyt položky";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrací index prvního/posledního výskytu položky v seznamu. Vrací 0, pokud položka nebyla nalezena.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrací index prvního/posledního výskytu položky v seznamu. Vrací %1, pokud položka nebyla nalezena.";
Blockly.Msg.LISTS_INLIST = "v seznamu";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdné";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v textu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najít první výskyt textu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najít poslední výskyt textu";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu 0.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu %1.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdný";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrátí pravda pokud je zadaný text prázdný.";
diff --git a/msg/js/da.js b/msg/js/da.js
index f64d3d907..7fe69e282 100644
--- a/msg/js/da.js
+++ b/msg/js/da.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Opretter en kopi af den angivne del af
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find første forekomst af elementet";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find sidste forekomst af elementet";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer 0, hvis elementet ikke kan findes.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer %1, hvis elementet ikke kan findes.";
Blockly.Msg.LISTS_INLIST = "i listen";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i teksten";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find første forekomst af teksten";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find sidste forekomst af teksten";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer 0, hvis teksten ikke kan findes.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer %1, hvis teksten ikke kan findes.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sand, hvis den angivne tekst er tom.";
diff --git a/msg/js/de.js b/msg/js/de.js
index dbd1822f6..4973e1143 100644
--- a/msg/js/de.js
+++ b/msg/js/de.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen
Blockly.Msg.LISTS_INDEX_OF_FIRST = "suche erstes Auftreten von";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.LISTS_INDEX_OF_LAST = "suche letztes Auftreten von";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (Index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.";
Blockly.Msg.LISTS_INLIST = "in der Liste";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "suche erstes Auftreten des Begriffs";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "suche letztes Auftreten des Begriffs";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder 0 falls der Suchbegriff nicht gefunden wurde.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr, falls der Text keine Zeichen enthält ist.";
diff --git a/msg/js/el.js b/msg/js/el.js
index f7c3dd827..006fa920f 100644
--- a/msg/js/el.js
+++ b/msg/js/el.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Δημιουργεί ένα αντίγ
Blockly.Msg.LISTS_INDEX_OF_FIRST = "βρες την πρώτη εμφάνιση του στοιχείου";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "Blockly";
Blockly.Msg.LISTS_INDEX_OF_LAST = "βρες την τελευταία εμφάνιση του στοιχείου";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το στοιχείο δεν βρεθεί.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί.";
Blockly.Msg.LISTS_INLIST = "στη λίστα";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "το %1 είναι κενό";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "στο κείμενο";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "βρες την πρώτη εμφάνιση του κειμένου";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "βρες την τελευταία εμφάνιση του κειμένου";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή 0, αν δε βρει το κείμενο.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "το %1 είναι κενό";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.";
diff --git a/msg/js/en.js b/msg/js/en.js
index 6c586caa3..8b02cfdd2 100644
--- a/msg/js/en.js
+++ b/msg/js/en.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.";
Blockly.Msg.LISTS_INLIST = "in list";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty";
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty.";
diff --git a/msg/js/es.js b/msg/js/es.js
index 913489e0f..302819a06 100644
--- a/msg/js/es.js
+++ b/msg/js/es.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia de la parte especificada
Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontrar la primera aparición del elemento";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "encontrar la última aparición del elemento";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve 0 si el elemento no se encuentra.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra.";
Blockly.Msg.LISTS_INLIST = "en la lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vacía";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontrar la primera aparición del texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontrar la última aparición del texto";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve 0 si el texto no se encuentra.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vacío";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Devuelve verdadero si el texto proporcionado está vacío.";
diff --git a/msg/js/fa.js b/msg/js/fa.js
index c6c447467..d7df50865 100644
--- a/msg/js/fa.js
+++ b/msg/js/fa.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخصشده
Blockly.Msg.LISTS_INDEX_OF_FIRST = "یافتن اولین رخداد مورد";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخداد مورد";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر آیتم موجود نبود.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر آیتم موجود نبود.";
Blockly.Msg.LISTS_INLIST = "در فهرست";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافهکردن صحیح اگر متن فراهمشده خالی است.";
diff --git a/msg/js/fi.js b/msg/js/fi.js
index 62c8c6fc3..e2d48da1d 100644
--- a/msg/js/fi.js
+++ b/msg/js/fi.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Luo kopio määrätystä kohden listaa.
Blockly.Msg.LISTS_INDEX_OF_FIRST = "etsi ensimmäinen esiintymä kohteelle";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "etsi viimeinen esiintymä kohteelle";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa 0 jos tekstiä ei löydy.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa %1 jos tekstiä ei löydy.";
Blockly.Msg.LISTS_INLIST = "listassa";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 on tyhjä";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekstistä";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "etsi ensimmäinen esiintymä merkkijonolle";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "etsi viimeinen esiintymä merkkijonolle";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen 0 jos tekstiä ei löytynyt.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen %1 jos tekstiä ei löytynyt.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 on tyhjä";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Palauttaa tosi, jos annettu teksti on tyhjä.";
diff --git a/msg/js/fr.js b/msg/js/fr.js
index 0b6ee1395..6ca583009 100644
--- a/msg/js/fr.js
+++ b/msg/js/fr.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crée une copie de la partie spécifié
Blockly.Msg.LISTS_INDEX_OF_FIRST = "trouver la première occurrence de l’élément";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "trouver la dernière occurrence de l’élément";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie 0 si l'élément n'est pas trouvé.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie %1 si l'élément n'est pas trouvé.";
Blockly.Msg.LISTS_INLIST = "dans la liste";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est vide";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dans le texte";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trouver la première occurrence de la chaîne";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trouver la dernière occurrence de la chaîne";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie 0 si la chaîne n’est pas trouvée.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne n’est pas trouvée.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est vide";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Renvoie vrai si le texte fourni est vide.";
diff --git a/msg/js/he.js b/msg/js/he.js
index f9821d03b..d77af1d25 100644
--- a/msg/js/he.js
+++ b/msg/js/he.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "יוצרת עותק של חלק מסו
Blockly.Msg.LISTS_INDEX_OF_FIRST = "מחזירה את המיקום הראשון של פריט ברשימה";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "מחזירה את המיקום האחרון של פריט ברשימה";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם הפריט אינו נמצא.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא.";
Blockly.Msg.LISTS_INLIST = "ברשימה";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 הוא ריק";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/hi.js b/msg/js/hi.js
index 75381b197..22eca2cfa 100644
--- a/msg/js/hi.js
+++ b/msg/js/hi.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "सूची के बताए गय
Blockly.Msg.LISTS_INDEX_OF_FIRST = "आइटम पहली बार जहाँ आया है उसे ढूढ़े";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "आइटम आखरी बार जहाँ आया है उसे ढूढ़े";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "सूची में";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 खाली है";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "इस टेक्स्ट मे";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "टेक्स्ट पहली बार जहाँ आया है उसे ढूढ़े";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "टेक्स्ट आखरी बार जहाँ आया है उसे ढूढ़े";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 खाली है";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "ट्रू रिटर्न करता है यदि दिया गया टेक्स्ट खाली है।";
diff --git a/msg/js/hrx.js b/msg/js/hrx.js
index 7f2d7e3f2..4de884b76 100644
--- a/msg/js/hrx.js
+++ b/msg/js/hrx.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Generiert en Kopie von en definierte Te
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Such earstes Voarkommniss";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "Such letztes Voarkommniss";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) von en Element in der List Gebt 0 zurück wenn nixs gefunn woard.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) von en Element in der List Gebt %1 zurück wenn nixs gefunn woard.";
Blockly.Msg.LISTS_INLIST = "in der List";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leear?";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Such der Begriff sein earstes Voarkommniss";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Suche der Begriff sein letztes Vorkommniss.";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer 0 zurück.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer %1 zurück.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer?";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist woahr (true), wenn der Text leer ist.";
diff --git a/msg/js/hu.js b/msg/js/hu.js
index 2cc8d039e..19a74e7ec 100644
--- a/msg/js/hu.js
+++ b/msg/js/hu.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A lista adott részéről másolat.";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "listában első előfordulásaː";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "listában utolsó előfordulásaː";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A megadott elem első vagy utolsó előfordulásával tér vissza. 0-val tér vissza, ha nem talál ilyen elemet.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A megadott elem első vagy utolsó előfordulásával tér vissza. %1-val tér vissza, ha nem talál ilyen elemet.";
Blockly.Msg.LISTS_INLIST = "A(z)";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 üres lista?";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "A(z)";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "szövegben az első előfordulásának helye";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "szövegben az utolsó előfordulásának helye";
Blockly.Msg.TEXT_INDEXOF_TAIL = "szövegnek";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A keresett szöveg első vagy utolsó előfordulásával tér vissza. 0 esetén a szövegrészlet nem található.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A keresett szöveg első vagy utolsó előfordulásával tér vissza. %1 esetén a szövegrészlet nem található.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 üres";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Igaz, ha a vizsgált szöveg hossza 0.";
diff --git a/msg/js/ia.js b/msg/js/ia.js
index 747ec7a7a..8a071810f 100644
--- a/msg/js/ia.js
+++ b/msg/js/ia.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea un copia del parte specificate de
Blockly.Msg.LISTS_INDEX_OF_FIRST = "cercar le prime occurrentia del elemento";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "cercar le ultime occurrentia del elemento";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna 0 si le texto non es trovate.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna %1 si le texto non es trovate.";
Blockly.Msg.LISTS_INLIST = "in lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 es vacue";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in le texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "cercar le prime occurrentia del texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "cercar le ultime occurrentia del texto";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna 0 si le texto non es trovate.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna %1 si le texto non es trovate.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es vacue";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna ver si le texto fornite es vacue.";
diff --git a/msg/js/id.js b/msg/js/id.js
index 740902f0a..bbce6f70f 100644
--- a/msg/js/id.js
+++ b/msg/js/id.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Buat salinan bagian tertentu dari list.
Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari kejadian pertama item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian terakhir item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan 0 jika item tidak ditemukan.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item tidak ditemukan.";
Blockly.Msg.LISTS_INLIST = "dalam list";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 kosong";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "temukan kejadian pertama dalam teks";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "temukan kejadian terakhir dalam teks";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 kosong";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan kosong.";
diff --git a/msg/js/is.js b/msg/js/is.js
index 49694b352..587c3314a 100644
--- a/msg/js/is.js
+++ b/msg/js/is.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Býr til afrit af tilteknum hluta lista
Blockly.Msg.LISTS_INDEX_OF_FIRST = "finna fyrsta tilfelli atriðis";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
Blockly.Msg.LISTS_INDEX_OF_LAST = "finna síðasta tilfelli atriðis";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef atriðið finnst ekki.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki.";
Blockly.Msg.LISTS_INLIST = "í lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tómur";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "í texta";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finna fyrsta tilfelli texta";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finna síðasta tilfelli texta";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar 0 ef textinn finnst ekki.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tómur";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Skilar sönnu ef gefni textinn er tómur.";
diff --git a/msg/js/it.js b/msg/js/it.js
index 7f5f8bbf7..7cac28230 100644
--- a/msg/js/it.js
+++ b/msg/js/it.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia della porzione specifica
Blockly.Msg.LISTS_INDEX_OF_FIRST = "trova la prima occorrenza dell'elemento";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "trova l'ultima occorrenza dell'elemento";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce 0 se l'elemento non viene trovato.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato.";
Blockly.Msg.LISTS_INLIST = "nella lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 è vuota";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "nel testo";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trova la prima occorrenza del testo";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trova l'ultima occorrenza del testo";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce 0 se il testo non viene trovato.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 è vuoto";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Restituisce vero se il testo fornito è vuoto.";
diff --git a/msg/js/ja.js b/msg/js/ja.js
index b50ef7f91..49b4da209 100644
--- a/msg/js/ja.js
+++ b/msg/js/ja.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "リストの指定された部分のコ
Blockly.Msg.LISTS_INDEX_OF_FIRST = "最初に見つかった項目を検索します。";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "最後に見つかったアイテムを見つける";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は 0 を返します。";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。";
Blockly.Msg.LISTS_INLIST = "リストで";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 が空";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "テキストで";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "テキストの最初の出現箇所を検索します。";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "テキストの最後に見つかったを検索します。";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は 0 を返します。";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は %1 を返します。";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 が空";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "指定されたテキストが空の場合は、true を返します。";
diff --git a/msg/js/ko.js b/msg/js/ko.js
index f1f066be4..ab1fdb61d 100644
--- a/msg/js/ko.js
+++ b/msg/js/ko.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "목록의 특정 부분에 대한 복
Blockly.Msg.LISTS_INDEX_OF_FIRST = "처음으로 나타난 위치";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
Blockly.Msg.LISTS_INDEX_OF_LAST = "마지막으로 나타난 위치";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "아이템이 나타난 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 0이 반환됩니다.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "아이템이 나타난 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 %1이 반환됩니다.";
Blockly.Msg.LISTS_INLIST = "리스트";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty";
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1이 비어 있습니다";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "문장";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "에서 다음 문장이 처음으로 나타난 위치 찾기 :";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "에서 다음 문장이 마지막으로 나타난 위치 찾기 :";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 0 값을 돌려줌.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 %1 값을 돌려줌.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1이 비어 있습니다";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다.";
diff --git a/msg/js/lb.js b/msg/js/lb.js
index 7f887c694..6b4f2bf73 100644
--- a/msg/js/lb.js
+++ b/msg/js/lb.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "an der Lëscht";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ass eidel";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "am Text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ass eidel";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/lki.js b/msg/js/lki.js
index 9a5c227a3..194a79b1b 100644
--- a/msg/js/lki.js
+++ b/msg/js/lki.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخصشده
Blockly.Msg.LISTS_INDEX_OF_FIRST = "یافتن اولین رخداد مورد";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخداد مورد";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر آیتم موجود نبود.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر آیتم موجود نبود.";
Blockly.Msg.LISTS_INLIST = "در فهرست";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافهکردن صحیح اگر متن فراهمشده خالی است.";
diff --git a/msg/js/lrc.js b/msg/js/lrc.js
index dcb7238d2..3ee399438 100644
--- a/msg/js/lrc.js
+++ b/msg/js/lrc.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "د نوم گه";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 حالیه";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "د متن";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 حالیه";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/lt.js b/msg/js/lt.js
index 60ed8d781..c30d28daa 100644
--- a/msg/js/lt.js
+++ b/msg/js/lt.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "rask pirmą reikšmę";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "rask paskutinę reikšmę";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina 0, jei reikšmės neranda.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina %1, jei reikšmės neranda.";
Blockly.Msg.LISTS_INLIST = "sąraše";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 yra tuščias";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekste";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "rask,kur pirmą kartą paminėta";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "rask,kur paskutinį kartą paminėta";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 yra tuščias";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/mk.js b/msg/js/mk.js
index 370483a21..3dc2d4e92 100644
--- a/msg/js/mk.js
+++ b/msg/js/mk.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "in list"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/ms.js b/msg/js/ms.js
index 2b4f0a0fd..3b6023f5a 100644
--- a/msg/js/ms.js
+++ b/msg/js/ms.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Wujudkan salinan bahagian yang ditentuk
Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari pertama item kejadian";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian akhir item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan 0 jika item berkenaan tidak ditemui.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui.";
Blockly.Msg.LISTS_INLIST = "dalam senarai";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 adalah kosong";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "mencari kejadian pertama teks";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "mencari kejadian terakhir teks";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan 0 Jika teks tidak ditemui.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan %1 Jika teks tidak ditemui.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 adalah kosong";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan adalah kosong.";
diff --git a/msg/js/nb.js b/msg/js/nb.js
index f240cba10..e37163936 100644
--- a/msg/js/nb.js
+++ b/msg/js/nb.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Kopiérer en ønsket del av en liste.";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "finn første forekomst av elementet";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "finn siste forekomst av elementet";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer 0 hvis ikke funnet.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet.";
Blockly.Msg.LISTS_INLIST = "i listen";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i tekst";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finn første forekomst av tekst";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finn siste forekomst av tekst";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer 0 hvis teksten ikke blir funnet.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer %1 hvis teksten ikke blir funnet.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sann hvis den angitte teksten er tom.";
diff --git a/msg/js/nl.js b/msg/js/nl.js
index dc3e79145..bb8e42e2f 100644
--- a/msg/js/nl.js
+++ b/msg/js/nl.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Maakt een kopie van het opgegeven deel
Blockly.Msg.LISTS_INDEX_OF_FIRST = "zoek eerste voorkomen van item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
Blockly.Msg.LISTS_INDEX_OF_LAST = "zoek laatste voorkomen van item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft 0 terug als het item niet is gevonden.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden.";
Blockly.Msg.LISTS_INLIST = "in lijst";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is leeg";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in tekst";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "zoek eerste voorkomen van tekst";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "zoek het laatste voorkomen van tekst";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft 0 terug als de tekst niet gevonden is.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is leeg";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Geeft \"waar\" terug, als de opgegeven tekst leeg is.";
diff --git a/msg/js/oc.js b/msg/js/oc.js
index f6552b502..2ac9ab82c 100644
--- a/msg/js/oc.js
+++ b/msg/js/oc.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "dins la lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dins lo tèxte";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es void";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/pl.js b/msg/js/pl.js
index 86b18555e..aac6292e4 100644
--- a/msg/js/pl.js
+++ b/msg/js/pl.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Tworzy kopię z określoną część li
Blockly.Msg.LISTS_INDEX_OF_FIRST = "znaleźć pierwsze wystąpienie elementu";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "znajduje ostatanie wystąpienie elementu";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość 0, jeśli tekst nie zostanie znaleziony.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość %1, jeśli tekst nie zostanie znaleziony.";
Blockly.Msg.LISTS_INLIST = "na liście";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 jest pusty";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "w tekście";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "znajdź pierwsze wystąpienie tekstu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "znajdź ostatnie wystąpienie tekstu";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość 0, jeśli tekst nie został znaleziony.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość %1, jeśli tekst nie został znaleziony.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 jest pusty";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Zwraca prawda (true), jeśli podany tekst jest pusty.";
diff --git a/msg/js/pms.js b/msg/js/pms.js
index d62a65244..50a4917b5 100644
--- a/msg/js/pms.js
+++ b/msg/js/pms.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A crea na còpia dël tòch ëspessific
Blockly.Msg.LISTS_INDEX_OF_FIRST = "trové la prima ocorensa dl'element";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "trové l'ùltima ocorensa dl'element";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon 0 se l'element a l'é nen trovà.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon %1 se l'element a l'é nen trovà.";
Blockly.Msg.LISTS_INLIST = "ant la lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 a l'é veuid";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ant ël test";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trové la prima ocorensa dël test";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trové l'ùltima ocorensa dël test";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon 0 se ël test a l'é nen trovà.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon %1 se ël test a l'é nen trovà.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 a l'é veuid";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "A smon ver se ël test fornì a l'é veuid.";
diff --git a/msg/js/pt-br.js b/msg/js/pt-br.js
index 8dbc3571f..2598b499a 100644
--- a/msg/js/pt-br.js
+++ b/msg/js/pt-br.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificad
Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna o índice da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.";
Blockly.Msg.LISTS_INLIST = "na lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 é vazia";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "no texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontre a primeira ocorrência do item";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontre a última ocorrência do texto";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 é vazio";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido for vazio.";
diff --git a/msg/js/pt.js b/msg/js/pt.js
index 0d8f80636..68ac03e4a 100644
--- a/msg/js/pt.js
+++ b/msg/js/pt.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificad
Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.";
Blockly.Msg.LISTS_INLIST = "na lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vazia";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "no texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "primeira ocorrência do texto";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "última ocorrência do texto";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vazio";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido estiver vazio.";
diff --git a/msg/js/ro.js b/msg/js/ro.js
index c9f5f6073..a314af4da 100644
--- a/msg/js/ro.js
+++ b/msg/js/ro.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creează o copie a porţiunii specifica
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Găseşte prima apariţie a elementului";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "găseşte ultima apariţie a elementului";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează 0 dacă elementul nu este găsit.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează %1 dacă elementul nu este găsit.";
Blockly.Msg.LISTS_INLIST = "în listă";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 este gol";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "în text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "găseşte prima apariţie a textului";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "găseşte ultima apariţie a textului";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează 0 dacă textul nu este găsit.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 este gol";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnează adevărat dacă textul furnizat este gol.";
diff --git a/msg/js/ru.js b/msg/js/ru.js
index f419884de..713a90d00 100644
--- a/msg/js/ru.js
+++ b/msg/js/ru.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Создаёт копию указан
Blockly.Msg.LISTS_INDEX_OF_FIRST = "найти первое вхождение элемента";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "найти последнее вхождение элемента";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает 0, если элемент не найден.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден.";
Blockly.Msg.LISTS_INLIST = "в списке";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пуст";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "в тексте";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "найти первое вхождение текста";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "найти последнее вхождение текста";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает 0, если текст не найден.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пуст";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Возвращает значение истина, если предоставленный текст пуст.";
diff --git a/msg/js/sc.js b/msg/js/sc.js
index b15435db9..b592a736d 100644
--- a/msg/js/sc.js
+++ b/msg/js/sc.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Fait una copia de sa parti inditada de
Blockly.Msg.LISTS_INDEX_OF_FIRST = "circa prima ocasioni de s'item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "circa urtima ocasioni de s'item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat 0 si s'item non s'agatat.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat %1 si s'item non s'agatat.";
Blockly.Msg.LISTS_INLIST = "in lista";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est buidu";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in su testu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "circa prima ocasioni de su testu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "circa urtima ocasioni de su testu";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat 0 si su testu no ddu agatat.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat %1 si su testu no ddu agatat.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est buidu";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Torrat berus si su testu giau est buidu.";
diff --git a/msg/js/sd.js b/msg/js/sd.js
index 03f1a1f69..14a00eac6 100644
--- a/msg/js/sd.js
+++ b/msg/js/sd.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "فهرست ۾";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/shn.js b/msg/js/shn.js
index edcef357e..1032730a2 100644
--- a/msg/js/shn.js
+++ b/msg/js/shn.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "in list"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/sk.js b/msg/js/sk.js
index ac547f541..cf96de036 100644
--- a/msg/js/sk.js
+++ b/msg/js/sk.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skopíruje určený úsek zoznamu.";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "nájdi prvý výskyt prvku";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "nájdi posledný výskyt prvku";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti 0.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti %1.";
Blockly.Msg.LISTS_INLIST = "v zozname";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdny";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v texte";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "nájdi prvý výskyt textu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "nájdi posledný výskyt textu";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti 0.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti %1.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdny";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vráti hodnotu pravda, ak zadaný text je prázdny.";
diff --git a/msg/js/sl.js b/msg/js/sl.js
index 10f9a6bf4..c56db20a4 100644
--- a/msg/js/sl.js
+++ b/msg/js/sl.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Ustvari nov seznam, kot kopijo določen
Blockly.Msg.LISTS_INDEX_OF_FIRST = "najdi prvo pojavitev elementa";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
Blockly.Msg.LISTS_INDEX_OF_LAST = "najdi zadnjo pojavitev elementa";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne 0.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.";
Blockly.Msg.LISTS_INLIST = "v seznamu";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty";
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prazen";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v besedilu";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najdi prvo pojavitev besedila";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najdi zadnjo pojavitev besedila";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne 0.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prazno";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrne resnično, če je določeno besedilo prazno.";
diff --git a/msg/js/sq.js b/msg/js/sq.js
index e90eab5f2..0f85eb8c1 100644
--- a/msg/js/sq.js
+++ b/msg/js/sq.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Krijon në kopje të pjesës së specif
Blockly.Msg.LISTS_INDEX_OF_FIRST = "gjen ndodhjen e parë të sendit";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "gjen ndodhjen e fundit të sendit";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen 0 nëse teksti nuk është gjetur.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen %1 nëse teksti nuk është gjetur.";
Blockly.Msg.LISTS_INLIST = "në listë";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 është e zbraztë";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ne tekst";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "gjej rastisjen e pare te tekstit";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "gjej rastisjen e fundit te tekstit";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me 0 ne qofte se teksti nuk u gjet.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me %1 ne qofte se teksti nuk u gjet.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 eshte bosh";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kthehet e vertete neqoftese teksti i dhene eshte bosh.";
diff --git a/msg/js/sr.js b/msg/js/sr.js
index f3d56ead5..9620b1b3c 100644
--- a/msg/js/sr.js
+++ b/msg/js/sr.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Прави копију одређен
Blockly.Msg.LISTS_INDEX_OF_FIRST = "пронађи прво појављивање ставке";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "пронађи последње појављивање ставке";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа број првог и/последњег уласка елемента у листу. Враћа 0 Ако елемент није пронађен.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа број првог и/последњег уласка елемента у листу. Враћа %1 Ако елемент није пронађен.";
Blockly.Msg.LISTS_INLIST = "на списку";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 је празан";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексту";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "пронађи прво појављивање текста";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "пронађи последње појављивање текста";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа 0 ако текст није пронађен.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа %1 ако текст није пронађен.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 је празан";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Враћа тачно ако је доставлјени текст празан.";
diff --git a/msg/js/sv.js b/msg/js/sv.js
index d1ef48f40..4fccc4fdd 100644
--- a/msg/js/sv.js
+++ b/msg/js/sv.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skapar en kopia av den specificerade de
Blockly.Msg.LISTS_INDEX_OF_FIRST = "hitta första förekomsten av objektet";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "hitta sista förekomsten av objektet";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka 0 om objektet inte hittas.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka %1 om objektet inte hittas.";
Blockly.Msg.LISTS_INLIST = "i listan";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 är tom";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i texten";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "hitta första förekomsten av texten";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "hitta sista förekomsten av texten";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka 0 om texten inte hittas.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka %1 om texten inte hittas.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 är tom";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerar sant om den angivna texten är tom.";
diff --git a/msg/js/ta.js b/msg/js/ta.js
index b77aeefec..4e5dca0c3 100644
--- a/msg/js/ta.js
+++ b/msg/js/ta.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "குறிப்பட்ட பக
Blockly.Msg.LISTS_INDEX_OF_FIRST = "உரையில் முதல் தோற்ற இடத்தை காட்டு";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "உரையில் கடைசி தோற்ற இடத்தை காட்டு";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் 0 பின்கொடு.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு.";
Blockly.Msg.LISTS_INLIST = "பட்டியலில் உள்ள";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 காலியானது";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "உரையில்";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "உரையில் முதல் தோற்ற இடத்தை பின்கொடு";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 காலியானது";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "காலியானது என்றால் மெய் மதிப்பை பின்கொடு";
diff --git a/msg/js/tcy.js b/msg/js/tcy.js
index a2939bca4..9c6196805 100644
--- a/msg/js/tcy.js
+++ b/msg/js/tcy.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "ಪಟ್ಯೊದ ನಿರ್ದಿ
Blockly.Msg.LISTS_INDEX_OF_FIRST = "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "ಅಕೆರಿಗ್ ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. ೦ ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.";
Blockly.Msg.LISTS_INLIST = "ಪಟ್ಟಿಡ್";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ಕಾಲಿ";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ಪಟ್ಯೊಡು";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ಸುರುಟು ಸಂಭವಿಸಯಿನ ಪಟ್ಯೊನು ನಾಡ್ಲ";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. ೦ ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ಕಾಲಿ";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "ಕೊರ್ನ ಪಟ್ಯೊ ಕಾಲಿಂದ್ ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು";
diff --git a/msg/js/th.js b/msg/js/th.js
index 0b8ebf6d0..fbb56360e 100644
--- a/msg/js/th.js
+++ b/msg/js/th.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "สร้างสำเนาราย
Blockly.Msg.LISTS_INDEX_OF_FIRST = "หาอันแรกที่พบ";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "หาอันสุดท้ายที่พบ";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า 0 ถ้าหาไม่พบ";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ";
Blockly.Msg.LISTS_INLIST = "ในรายการ";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ว่างเปล่า";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ในข้อความ";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "หาข้อความแรกที่พบ";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "หาข้อความสุดท้ายที่พบ";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า 0 ถ้าหาไม่พบ";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ว่าง";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "คืนค่าจริง ถ้าข้อความยังว่าง";
diff --git a/msg/js/tl.js b/msg/js/tl.js
index b8a3bb01d..6eebfa10f 100644
--- a/msg/js/tl.js
+++ b/msg/js/tl.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Gumagawa ng kopya ng tinukoy na bahagi
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Hanapin ang unang pangyayari ng item";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "hanapin ang huling pangyayari ng item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng 0 kung ang item ay hindi makita.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng %1 kung ang item ay hindi makita.";
Blockly.Msg.LISTS_INLIST = "sa list";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ay walang laman";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of first text in the second text. Returns 0 if text is not found.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of first text in the second text. Returns %1 if text is not found.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty.";
diff --git a/msg/js/tlh.js b/msg/js/tlh.js
index 5c1cad0f1..e8caa5e4b 100644
--- a/msg/js/tlh.js
+++ b/msg/js/tlh.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Doch sam wa'DIch";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "Doch sam Qav";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated
Blockly.Msg.LISTS_INLIST = "tetlhDaq";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 chIm'a'";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ghItlhDaq";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ghItlh wa'DIch Sam";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ghItlh Qav Sam";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 chIm'a'";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated
diff --git a/msg/js/tr.js b/msg/js/tr.js
index 4b949ccd2..3127afaed 100644
--- a/msg/js/tr.js
+++ b/msg/js/tr.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Listenin belirli bir kısmının kopyas
Blockly.Msg.LISTS_INDEX_OF_FIRST = "Öğenin ilk varolduğu yeri bul";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "Öğenin son varolduğu yeri bul";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise 0 döndürür.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise %1 döndürür.";
Blockly.Msg.LISTS_INLIST = "Listede";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boş";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "metinde";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Metnin ilk varolduğu yeri bul";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Metnin son varolduğu yeri bul";
Blockly.Msg.TEXT_INDEXOF_TAIL = "";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa 0 döndürür.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa %1 döndürür.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 boş";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Verilen metin boşsa true(doğru) değerini verir.";
diff --git a/msg/js/uk.js b/msg/js/uk.js
index 1e4aeb8ff..0db4abc06 100644
--- a/msg/js/uk.js
+++ b/msg/js/uk.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Створює копію вказан
Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайти перше входження елемента";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "знайти останнє входження елемента";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Повертає індекс першого/останнього входження елемента у списку. Повертає 0, якщо елемент не знайдено.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено.";
Blockly.Msg.LISTS_INLIST = "у списку";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 є порожнім";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексті";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайти перше входження тексту";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайти останнє входження тексту";
Blockly.Msg.TEXT_INDEXOF_TAIL = ".";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Повертає індекс першого/останнього входження першого тексту в другий. Повертає 0, якщо текст не знайдено.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 є порожнім";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Повертає істину, якщо вказаний текст порожній.";
diff --git a/msg/js/vi.js b/msg/js/vi.js
index f5c1ccc04..8bde3fbf8 100644
--- a/msg/js/vi.js
+++ b/msg/js/vi.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Lấy một mảng của danh sách nà
Blockly.Msg.LISTS_INDEX_OF_FIRST = "tìm sự có mặt đầu tiên của vật";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "tìm sự có mặt cuối cùng của vật";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số 0.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1.";
Blockly.Msg.LISTS_INLIST = "trong dánh sách";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 trống rỗng";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "trong văn bản";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "tìm sự có mặt đầu tiên của";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "tìm sự có mặt cuối cùng của";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số 0.";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số %1.";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 trống không";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Hoàn trả “đúng nếu văn bản không có ký tự nào.";
diff --git a/msg/js/zh-hans.js b/msg/js/zh-hans.js
index ebdb6b8d9..262e1b5c5 100644
--- a/msg/js/zh-hans.js
+++ b/msg/js/zh-hans.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "复制列表中指定的部分。";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "找出第一个项出现";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "找出最后一个项出现";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回0。";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。";
Blockly.Msg.LISTS_INLIST = "在列表中";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1是空的";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "自文本";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "寻找第一个出现的文本";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "寻找最后一个出现的文本";
Blockly.Msg.TEXT_INDEXOF_TAIL = "空白";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 0。";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 %1。";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1是空的";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的文本为空,则返回真。";
diff --git a/msg/js/zh-hant.js b/msg/js/zh-hant.js
index 0083b6e9a..40e349e49 100644
--- a/msg/js/zh-hant.js
+++ b/msg/js/zh-hant.js
@@ -116,7 +116,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "複製列表中指定的部分。";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "找出 第一個 項目出現";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "找出 最後一個 項目出現";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 %1。";
Blockly.Msg.LISTS_INLIST = "自列表";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 值為空";
@@ -334,7 +334,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "在字串";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "尋找 第一個 出現的字串";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "尋找 最後一個 出現的字串";
Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 %1。";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 為空";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的字串為空,則返回 真。";
diff --git a/msg/json/ar.json b/msg/json/ar.json
index 9e6af93e9..e4df170aa 100644
--- a/msg/json/ar.json
+++ b/msg/json/ar.json
@@ -192,7 +192,7 @@
"TEXT_LENGTH_TOOLTIP": "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم.",
"TEXT_ISEMPTY_TITLE": "%1 فارغ",
"TEXT_ISEMPTY_TOOLTIP": "يرجع \"صحيح\" إذا كان النص المقدم فارغ.",
- "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع 0 إذا لم يتم العثور على النص.",
+ "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص.",
"TEXT_INDEXOF_INPUT_INTEXT": "في النص",
"TEXT_INDEXOF_OPERATOR_FIRST": "ابحث عن التواجد الأول للنص",
"TEXT_INDEXOF_OPERATOR_LAST": "ابحث عن التواجد الأخير للنص",
@@ -242,7 +242,7 @@
"LISTS_INLIST": "في قائمة",
"LISTS_INDEX_OF_FIRST": "ابحث على على التواجد الأول للعنصر",
"LISTS_INDEX_OF_LAST": "ابحث على التواجد الأخير للعنصر",
- "LISTS_INDEX_OF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع 0 إذا لم يتم العثور على النص.",
+ "LISTS_INDEX_OF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص.",
"LISTS_GET_INDEX_GET": "احصل على",
"LISTS_GET_INDEX_GET_REMOVE": "احصل على و ازل",
"LISTS_GET_INDEX_REMOVE": "ازل",
diff --git a/msg/json/az.json b/msg/json/az.json
index ec9df30fd..d9cd24738 100644
--- a/msg/json/az.json
+++ b/msg/json/az.json
@@ -182,7 +182,7 @@
"TEXT_LENGTH_TOOLTIP": "Verilmiş mətndəki hərflərin(sözlər arası boşluqlar sayılmaqla) sayını qaytarır.",
"TEXT_ISEMPTY_TITLE": "%1 boşdur",
"TEXT_ISEMPTY_TOOLTIP": "Verilmiş mətn boşdursa, doğru qiymətini qaytarır.",
- "TEXT_INDEXOF_TOOLTIP": "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, 0 qaytarır.",
+ "TEXT_INDEXOF_TOOLTIP": "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, %1 qaytarır.",
"TEXT_INDEXOF_INPUT_INTEXT": "mətndə",
"TEXT_INDEXOF_OPERATOR_FIRST": "Bu mətn ilə ilk rastlaşmanı tap:",
"TEXT_INDEXOF_OPERATOR_LAST": "Bu mətn ilə son rastlaşmanı tap:",
@@ -231,7 +231,7 @@
"LISTS_INLIST": "siyahıda",
"LISTS_INDEX_OF_FIRST": "Element ilə ilk rastlaşma indeksini müəyyən edin",
"LISTS_INDEX_OF_LAST": "Element ilə son rastlaşma indeksini müəyyən edin",
- "LISTS_INDEX_OF_TOOLTIP": "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, 0 qaytarılır.",
+ "LISTS_INDEX_OF_TOOLTIP": "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, %1 qaytarılır.",
"LISTS_GET_INDEX_GET": "götür",
"LISTS_GET_INDEX_GET_REMOVE": "götür və sil",
"LISTS_GET_INDEX_REMOVE": "yığışdır",
diff --git a/msg/json/bcc.json b/msg/json/bcc.json
index a3f50cfef..c8b0c3652 100644
--- a/msg/json/bcc.json
+++ b/msg/json/bcc.json
@@ -171,7 +171,7 @@
"TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصلهها) در متن فراهمشده.",
"TEXT_ISEMPTY_TITLE": "%1 خالی است",
"TEXT_ISEMPTY_TOOLTIP": "اضافهکردن صحیح اگر متن فراهمشده خالی است.",
- "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.",
+ "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.",
"TEXT_INDEXOF_INPUT_INTEXT": "در متن",
"TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب",
"TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب",
@@ -220,7 +220,7 @@
"LISTS_INLIST": "در فهرست",
"LISTS_INDEX_OF_FIRST": "آخرین رخداد متن را بیاب",
"LISTS_INDEX_OF_LAST": "یافتن آخرین رخداد مورد",
- "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر متن موجود نبود.",
+ "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر متن موجود نبود.",
"LISTS_GET_INDEX_GET": "گرفتن",
"LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذفکردن",
"LISTS_GET_INDEX_REMOVE": "حذفکردن",
diff --git a/msg/json/be-tarask.json b/msg/json/be-tarask.json
index f7edf7507..a996325db 100644
--- a/msg/json/be-tarask.json
+++ b/msg/json/be-tarask.json
@@ -178,7 +178,7 @@
"TEXT_LENGTH_TOOLTIP": "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце.",
"TEXT_ISEMPTY_TITLE": "%1 пусты",
"TEXT_ISEMPTY_TOOLTIP": "Вяртае значэньне ісьціна, калі тэкст пусты.",
- "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае 0, калі тэкст ня знойдзены.",
+ "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены.",
"TEXT_INDEXOF_INPUT_INTEXT": "у тэксьце",
"TEXT_INDEXOF_OPERATOR_FIRST": "знайсьці першае ўваходжаньне тэксту",
"TEXT_INDEXOF_OPERATOR_LAST": "знайсьці апошняе ўваходжаньне тэксту",
@@ -227,7 +227,7 @@
"LISTS_INLIST": "у сьпісе",
"LISTS_INDEX_OF_FIRST": "знайсьці першае ўваходжаньне элемэнту",
"LISTS_INDEX_OF_LAST": "знайсьці апошняе ўваходжаньне элемэнту",
- "LISTS_INDEX_OF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае 0, калі элемэнт ня знойдзены.",
+ "LISTS_INDEX_OF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены.",
"LISTS_GET_INDEX_GET": "атрымаць",
"LISTS_GET_INDEX_GET_REMOVE": "атрымаць і выдаліць",
"LISTS_GET_INDEX_REMOVE": "выдаліць",
diff --git a/msg/json/bg.json b/msg/json/bg.json
index ab3eceed0..f35a6c2aa 100644
--- a/msg/json/bg.json
+++ b/msg/json/bg.json
@@ -177,7 +177,7 @@
"TEXT_LENGTH_TOOLTIP": "Връща броя на символите (включително и интервалите) в текста.",
"TEXT_ISEMPTY_TITLE": "%1 е празен",
"TEXT_ISEMPTY_TOOLTIP": "Връща истина, ако текста е празен.",
- "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща 0, ако текстът не е намерен.",
+ "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен.",
"TEXT_INDEXOF_INPUT_INTEXT": "в текста",
"TEXT_INDEXOF_OPERATOR_FIRST": "намери първата поява на текста",
"TEXT_INDEXOF_OPERATOR_LAST": "намери последната поява на текста",
@@ -226,7 +226,7 @@
"LISTS_INLIST": "в списъка",
"LISTS_INDEX_OF_FIRST": "намери първата поява на елемента",
"LISTS_INDEX_OF_LAST": "намери последната поява на елемента",
- "LISTS_INDEX_OF_TOOLTIP": "Връща индекса на първото/последното появяване на елемента в списъка. Връща 0 ако елементът не е намерен.",
+ "LISTS_INDEX_OF_TOOLTIP": "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1 ако елементът не е намерен.",
"LISTS_GET_INDEX_GET": "вземи",
"LISTS_GET_INDEX_GET_REMOVE": "вземи и премахни",
"LISTS_GET_INDEX_REMOVE": "премахни",
diff --git a/msg/json/br.json b/msg/json/br.json
index 9c3a20f68..3de8cf8b8 100644
--- a/msg/json/br.json
+++ b/msg/json/br.json
@@ -176,7 +176,7 @@
"TEXT_LENGTH_TOOLTIP": "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet.",
"TEXT_ISEMPTY_TITLE": "%1 zo goullo",
"TEXT_ISEMPTY_TOOLTIP": "Adkas gwir m'eo goullo an destenn roet.",
- "TEXT_INDEXOF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ 0 ma n'eo ket kavet ar chadenn.",
+ "TEXT_INDEXOF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ %1 ma n'eo ket kavet ar chadenn.",
"TEXT_INDEXOF_INPUT_INTEXT": "en destenn",
"TEXT_INDEXOF_OPERATOR_FIRST": "kavout reveziadenn gentañ an destenn",
"TEXT_INDEXOF_OPERATOR_LAST": "kavout reveziadenn diwezhañ an destenn",
@@ -226,7 +226,7 @@
"LISTS_INLIST": "el listenn",
"LISTS_INDEX_OF_FIRST": "kavout reveziadenn gentañ un elfenn",
"LISTS_INDEX_OF_LAST": "kavout reveziadenn diwezhañ un elfenn",
- "LISTS_INDEX_OF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ 0 ma n'eo ket kavet an destenn.",
+ "LISTS_INDEX_OF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ %1 ma n'eo ket kavet an destenn.",
"LISTS_GET_INDEX_GET": "tapout",
"LISTS_GET_INDEX_GET_REMOVE": "tapout ha lemel",
"LISTS_GET_INDEX_REMOVE": "lemel",
diff --git a/msg/json/ca.json b/msg/json/ca.json
index 4a774d069..b2c40454f 100644
--- a/msg/json/ca.json
+++ b/msg/json/ca.json
@@ -175,7 +175,7 @@
"TEXT_LENGTH_TOOLTIP": "Retorna el nombre de lletres (espais inclosos) en el text proporcionat.",
"TEXT_ISEMPTY_TITLE": "%1 està buit",
"TEXT_ISEMPTY_TOOLTIP": "Retorna cert si el text proporcionat està buit.",
- "TEXT_INDEXOF_TOOLTIP": "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna 0 si no es troba el text.",
+ "TEXT_INDEXOF_TOOLTIP": "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna %1 si no es troba el text.",
"TEXT_INDEXOF_INPUT_INTEXT": "en el text",
"TEXT_INDEXOF_OPERATOR_FIRST": "trobar la primera aparició del text",
"TEXT_INDEXOF_OPERATOR_LAST": "trobar l'última aparició del text",
@@ -224,7 +224,7 @@
"LISTS_INLIST": "en la llista",
"LISTS_INDEX_OF_FIRST": "buscar primera aparició d'un element",
"LISTS_INDEX_OF_LAST": "buscar última aparició d'un element",
- "LISTS_INDEX_OF_TOOLTIP": "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna 0 si no s'hi troba el text.",
+ "LISTS_INDEX_OF_TOOLTIP": "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna %1 si no s'hi troba el text.",
"LISTS_GET_INDEX_GET": "recupera",
"LISTS_GET_INDEX_GET_REMOVE": "recupera i esborra",
"LISTS_GET_INDEX_REMOVE": "esborra",
diff --git a/msg/json/cs.json b/msg/json/cs.json
index 13b3a2c24..0dabc4c3c 100644
--- a/msg/json/cs.json
+++ b/msg/json/cs.json
@@ -195,7 +195,7 @@
"TEXT_LENGTH_TOOLTIP": "Vrátí počet písmen (včetně mezer) v zadaném textu.",
"TEXT_ISEMPTY_TITLE": "%1 je prázdný",
"TEXT_ISEMPTY_TOOLTIP": "Vrátí pravda pokud je zadaný text prázdný.",
- "TEXT_INDEXOF_TOOLTIP": "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu 0.",
+ "TEXT_INDEXOF_TOOLTIP": "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu %1.",
"TEXT_INDEXOF_INPUT_INTEXT": "v textu",
"TEXT_INDEXOF_OPERATOR_FIRST": "najít první výskyt textu",
"TEXT_INDEXOF_OPERATOR_LAST": "najít poslední výskyt textu",
@@ -244,7 +244,7 @@
"LISTS_INLIST": "v seznamu",
"LISTS_INDEX_OF_FIRST": "najít první výskyt položky",
"LISTS_INDEX_OF_LAST": "najít poslední výskyt položky",
- "LISTS_INDEX_OF_TOOLTIP": "Vrací index prvního/posledního výskytu položky v seznamu. Vrací 0, pokud položka nebyla nalezena.",
+ "LISTS_INDEX_OF_TOOLTIP": "Vrací index prvního/posledního výskytu položky v seznamu. Vrací %1, pokud položka nebyla nalezena.",
"LISTS_GET_INDEX_GET": "získat",
"LISTS_GET_INDEX_GET_REMOVE": "získat a odstranit",
"LISTS_GET_INDEX_REMOVE": "odstranit",
diff --git a/msg/json/da.json b/msg/json/da.json
index a5c51515d..ce9d241ae 100644
--- a/msg/json/da.json
+++ b/msg/json/da.json
@@ -178,7 +178,7 @@
"TEXT_LENGTH_TOOLTIP": "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst.",
"TEXT_ISEMPTY_TITLE": "%1 er tom",
"TEXT_ISEMPTY_TOOLTIP": "Returnerer sand, hvis den angivne tekst er tom.",
- "TEXT_INDEXOF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer 0, hvis teksten ikke kan findes.",
+ "TEXT_INDEXOF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer %1, hvis teksten ikke kan findes.",
"TEXT_INDEXOF_INPUT_INTEXT": "i teksten",
"TEXT_INDEXOF_OPERATOR_FIRST": "find første forekomst af teksten",
"TEXT_INDEXOF_OPERATOR_LAST": "find sidste forekomst af teksten",
@@ -227,7 +227,7 @@
"LISTS_INLIST": "i listen",
"LISTS_INDEX_OF_FIRST": "find første forekomst af elementet",
"LISTS_INDEX_OF_LAST": "find sidste forekomst af elementet",
- "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer 0, hvis elementet ikke kan findes.",
+ "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer %1, hvis elementet ikke kan findes.",
"LISTS_GET_INDEX_GET": "hent",
"LISTS_GET_INDEX_GET_REMOVE": "hent og fjern",
"LISTS_GET_INDEX_REMOVE": "fjern",
diff --git a/msg/json/de.json b/msg/json/de.json
index dc5cfe81b..c2a6c433f 100644
--- a/msg/json/de.json
+++ b/msg/json/de.json
@@ -193,7 +193,7 @@
"TEXT_ISEMPTY_TITLE": "%1 ist leer",
"TEXT_ISEMPTY_TOOLTIP": "Ist wahr, falls der Text keine Zeichen enthält ist.",
"TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
- "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder 0 falls der Suchbegriff nicht gefunden wurde.",
+ "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.",
"TEXT_INDEXOF_INPUT_INTEXT": "im Text",
"TEXT_INDEXOF_OPERATOR_FIRST": "suche erstes Auftreten des Begriffs",
"TEXT_INDEXOF_OPERATOR_LAST": "suche letztes Auftreten des Begriffs",
@@ -251,7 +251,7 @@
"LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
"LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von",
"LISTS_INDEX_OF_LAST": "suche letztes Auftreten von",
- "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.",
+ "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.",
"LISTS_GET_INDEX_GET": "nimm",
"LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne",
"LISTS_GET_INDEX_REMOVE": "entferne",
diff --git a/msg/json/el.json b/msg/json/el.json
index b2a566f8b..7828d901b 100644
--- a/msg/json/el.json
+++ b/msg/json/el.json
@@ -196,7 +196,7 @@
"TEXT_LENGTH_TOOLTIP": "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο.",
"TEXT_ISEMPTY_TITLE": "το %1 είναι κενό",
"TEXT_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.",
- "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή 0, αν δε βρει το κείμενο.",
+ "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο.",
"TEXT_INDEXOF_INPUT_INTEXT": "στο κείμενο",
"TEXT_INDEXOF_OPERATOR_FIRST": "βρες την πρώτη εμφάνιση του κειμένου",
"TEXT_INDEXOF_OPERATOR_LAST": "βρες την τελευταία εμφάνιση του κειμένου",
@@ -249,7 +249,7 @@
"LISTS_INDEX_OF_HELPURL": "Blockly",
"LISTS_INDEX_OF_FIRST": "βρες την πρώτη εμφάνιση του στοιχείου",
"LISTS_INDEX_OF_LAST": "βρες την τελευταία εμφάνιση του στοιχείου",
- "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το στοιχείο δεν βρεθεί.",
+ "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί.",
"LISTS_GET_INDEX_GET": "πάρε",
"LISTS_GET_INDEX_GET_REMOVE": "πάρε και αφαίρεσε",
"LISTS_GET_INDEX_REMOVE": "αφαίρεσε",
diff --git a/msg/json/en.json b/msg/json/en.json
index 428da7665..6dde1c413 100644
--- a/msg/json/en.json
+++ b/msg/json/en.json
@@ -208,7 +208,7 @@
"TEXT_ISEMPTY_TITLE": "%1 is empty",
"TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.",
"TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text",
- "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.",
+ "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.",
"TEXT_INDEXOF_INPUT_INTEXT": "in text",
"TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text",
"TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text",
@@ -272,7 +272,7 @@
"LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
"LISTS_INDEX_OF_FIRST": "find first occurrence of item",
"LISTS_INDEX_OF_LAST": "find last occurrence of item",
- "LISTS_INDEX_OF_TOOLTIP": "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.",
+ "LISTS_INDEX_OF_TOOLTIP": "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.",
"LISTS_GET_INDEX_GET": "get",
"LISTS_GET_INDEX_GET_REMOVE": "get and remove",
"LISTS_GET_INDEX_REMOVE": "remove",
diff --git a/msg/json/es.json b/msg/json/es.json
index 09f1222be..415c8b11e 100644
--- a/msg/json/es.json
+++ b/msg/json/es.json
@@ -184,7 +184,7 @@
"TEXT_LENGTH_TOOLTIP": "Devuelve el número de letras (incluyendo espacios) en el texto proporcionado.",
"TEXT_ISEMPTY_TITLE": "%1 está vacío",
"TEXT_ISEMPTY_TOOLTIP": "Devuelve verdadero si el texto proporcionado está vacío.",
- "TEXT_INDEXOF_TOOLTIP": "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve 0 si el texto no se encuentra.",
+ "TEXT_INDEXOF_TOOLTIP": "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra.",
"TEXT_INDEXOF_INPUT_INTEXT": "en el texto",
"TEXT_INDEXOF_OPERATOR_FIRST": "encontrar la primera aparición del texto",
"TEXT_INDEXOF_OPERATOR_LAST": "encontrar la última aparición del texto",
@@ -234,7 +234,7 @@
"LISTS_INLIST": "en la lista",
"LISTS_INDEX_OF_FIRST": "encontrar la primera aparición del elemento",
"LISTS_INDEX_OF_LAST": "encontrar la última aparición del elemento",
- "LISTS_INDEX_OF_TOOLTIP": "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve 0 si el elemento no se encuentra.",
+ "LISTS_INDEX_OF_TOOLTIP": "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra.",
"LISTS_GET_INDEX_GET": "obtener",
"LISTS_GET_INDEX_GET_REMOVE": "obtener y eliminar",
"LISTS_GET_INDEX_REMOVE": "eliminar",
diff --git a/msg/json/fa.json b/msg/json/fa.json
index 3bd802bd8..c876657ac 100644
--- a/msg/json/fa.json
+++ b/msg/json/fa.json
@@ -182,7 +182,7 @@
"TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصلهها) در متن فراهمشده.",
"TEXT_ISEMPTY_TITLE": "%1 خالی است",
"TEXT_ISEMPTY_TOOLTIP": "اضافهکردن صحیح اگر متن فراهمشده خالی است.",
- "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.",
+ "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.",
"TEXT_INDEXOF_INPUT_INTEXT": "در متن",
"TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب",
"TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب",
@@ -231,7 +231,7 @@
"LISTS_INLIST": "در فهرست",
"LISTS_INDEX_OF_FIRST": "یافتن اولین رخداد مورد",
"LISTS_INDEX_OF_LAST": "یافتن آخرین رخداد مورد",
- "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر آیتم موجود نبود.",
+ "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر آیتم موجود نبود.",
"LISTS_GET_INDEX_GET": "گرفتن",
"LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذفکردن",
"LISTS_GET_INDEX_REMOVE": "حذفکردن",
diff --git a/msg/json/fi.json b/msg/json/fi.json
index 815bd26ea..5cc7444d0 100644
--- a/msg/json/fi.json
+++ b/msg/json/fi.json
@@ -196,7 +196,7 @@
"TEXT_LENGTH_TOOLTIP": "Palauttaa annetussa tekstissä olevien merkkien määrän (välilyönnit mukaan lukien).",
"TEXT_ISEMPTY_TITLE": "%1 on tyhjä",
"TEXT_ISEMPTY_TOOLTIP": "Palauttaa tosi, jos annettu teksti on tyhjä.",
- "TEXT_INDEXOF_TOOLTIP": "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen 0 jos tekstiä ei löytynyt.",
+ "TEXT_INDEXOF_TOOLTIP": "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen %1 jos tekstiä ei löytynyt.",
"TEXT_INDEXOF_INPUT_INTEXT": "tekstistä",
"TEXT_INDEXOF_OPERATOR_FIRST": "etsi ensimmäinen esiintymä merkkijonolle",
"TEXT_INDEXOF_OPERATOR_LAST": "etsi viimeinen esiintymä merkkijonolle",
@@ -245,7 +245,7 @@
"LISTS_INLIST": "listassa",
"LISTS_INDEX_OF_FIRST": "etsi ensimmäinen esiintymä kohteelle",
"LISTS_INDEX_OF_LAST": "etsi viimeinen esiintymä kohteelle",
- "LISTS_INDEX_OF_TOOLTIP": "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa 0 jos tekstiä ei löydy.",
+ "LISTS_INDEX_OF_TOOLTIP": "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa %1 jos tekstiä ei löydy.",
"LISTS_GET_INDEX_GET": "hae",
"LISTS_GET_INDEX_GET_REMOVE": "hae ja poista",
"LISTS_GET_INDEX_REMOVE": "poista",
diff --git a/msg/json/fr.json b/msg/json/fr.json
index 7e0450fde..2a684b680 100644
--- a/msg/json/fr.json
+++ b/msg/json/fr.json
@@ -187,7 +187,7 @@
"TEXT_LENGTH_TOOLTIP": "Renvoie le nombre de lettres (espaces compris) dans le texte fourni.",
"TEXT_ISEMPTY_TITLE": "%1 est vide",
"TEXT_ISEMPTY_TOOLTIP": "Renvoie vrai si le texte fourni est vide.",
- "TEXT_INDEXOF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie 0 si la chaîne n’est pas trouvée.",
+ "TEXT_INDEXOF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne n’est pas trouvée.",
"TEXT_INDEXOF_INPUT_INTEXT": "dans le texte",
"TEXT_INDEXOF_OPERATOR_FIRST": "trouver la première occurrence de la chaîne",
"TEXT_INDEXOF_OPERATOR_LAST": "trouver la dernière occurrence de la chaîne",
@@ -237,7 +237,7 @@
"LISTS_INLIST": "dans la liste",
"LISTS_INDEX_OF_FIRST": "trouver la première occurrence de l’élément",
"LISTS_INDEX_OF_LAST": "trouver la dernière occurrence de l’élément",
- "LISTS_INDEX_OF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie 0 si l'élément n'est pas trouvé.",
+ "LISTS_INDEX_OF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie %1 si l'élément n'est pas trouvé.",
"LISTS_GET_INDEX_GET": "obtenir",
"LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer",
"LISTS_GET_INDEX_REMOVE": "supprimer",
diff --git a/msg/json/he.json b/msg/json/he.json
index df863597f..d74c63836 100644
--- a/msg/json/he.json
+++ b/msg/json/he.json
@@ -199,7 +199,7 @@
"LISTS_INLIST": "ברשימה",
"LISTS_INDEX_OF_FIRST": "מחזירה את המיקום הראשון של פריט ברשימה",
"LISTS_INDEX_OF_LAST": "מחזירה את המיקום האחרון של פריט ברשימה",
- "LISTS_INDEX_OF_TOOLTIP": "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם הפריט אינו נמצא.",
+ "LISTS_INDEX_OF_TOOLTIP": "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא.",
"LISTS_GET_INDEX_GET": "לקבל",
"LISTS_GET_INDEX_GET_REMOVE": "קבל ומחק",
"LISTS_GET_INDEX_REMOVE": "הסרה",
diff --git a/msg/json/hrx.json b/msg/json/hrx.json
index d42be99a9..df92db83f 100644
--- a/msg/json/hrx.json
+++ b/msg/json/hrx.json
@@ -172,7 +172,7 @@
"TEXT_LENGTH_TOOLTIP": "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)",
"TEXT_ISEMPTY_TITLE": "%1 ist leer?",
"TEXT_ISEMPTY_TOOLTIP": "Ist woahr (true), wenn der Text leer ist.",
- "TEXT_INDEXOF_TOOLTIP": "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer 0 zurück.",
+ "TEXT_INDEXOF_TOOLTIP": "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer %1 zurück.",
"TEXT_INDEXOF_INPUT_INTEXT": "im Text",
"TEXT_INDEXOF_OPERATOR_FIRST": "Such der Begriff sein earstes Voarkommniss",
"TEXT_INDEXOF_OPERATOR_LAST": "Suche der Begriff sein letztes Vorkommniss.",
@@ -221,7 +221,7 @@
"LISTS_INLIST": "in der List",
"LISTS_INDEX_OF_FIRST": "Such earstes Voarkommniss",
"LISTS_INDEX_OF_LAST": "Such letztes Voarkommniss",
- "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) von en Element in der List Gebt 0 zurück wenn nixs gefunn woard.",
+ "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) von en Element in der List Gebt %1 zurück wenn nixs gefunn woard.",
"LISTS_GET_INDEX_GET": "Nehm",
"LISTS_GET_INDEX_GET_REMOVE": "Nehm und entfern",
"LISTS_GET_INDEX_REMOVE": "Entfern",
diff --git a/msg/json/hu.json b/msg/json/hu.json
index 8dd2c4699..dafeaa315 100644
--- a/msg/json/hu.json
+++ b/msg/json/hu.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket).",
"TEXT_ISEMPTY_TITLE": "%1 üres",
"TEXT_ISEMPTY_TOOLTIP": "Igaz, ha a vizsgált szöveg hossza 0.",
- "TEXT_INDEXOF_TOOLTIP": "A keresett szöveg első vagy utolsó előfordulásával tér vissza. 0 esetén a szövegrészlet nem található.",
+ "TEXT_INDEXOF_TOOLTIP": "A keresett szöveg első vagy utolsó előfordulásával tér vissza. %1 esetén a szövegrészlet nem található.",
"TEXT_INDEXOF_INPUT_INTEXT": "A(z)",
"TEXT_INDEXOF_OPERATOR_FIRST": "szövegben az első előfordulásának helye",
"TEXT_INDEXOF_OPERATOR_LAST": "szövegben az utolsó előfordulásának helye",
@@ -238,7 +238,7 @@
"LISTS_INLIST": "A(z)",
"LISTS_INDEX_OF_FIRST": "listában első előfordulásaː",
"LISTS_INDEX_OF_LAST": "listában utolsó előfordulásaː",
- "LISTS_INDEX_OF_TOOLTIP": "A megadott elem első vagy utolsó előfordulásával tér vissza. 0-val tér vissza, ha nem talál ilyen elemet.",
+ "LISTS_INDEX_OF_TOOLTIP": "A megadott elem első vagy utolsó előfordulásával tér vissza. %1-val tér vissza, ha nem talál ilyen elemet.",
"LISTS_GET_INDEX_GET": "listából értéke",
"LISTS_GET_INDEX_GET_REMOVE": "listából kivétele",
"LISTS_GET_INDEX_REMOVE": "listából törlése",
diff --git a/msg/json/ia.json b/msg/json/ia.json
index f75e7a35e..def2224c0 100644
--- a/msg/json/ia.json
+++ b/msg/json/ia.json
@@ -169,7 +169,7 @@
"TEXT_LENGTH_TOOLTIP": "Retorna le numero de litteras (incluse spatios) in le texto fornite.",
"TEXT_ISEMPTY_TITLE": "%1 es vacue",
"TEXT_ISEMPTY_TOOLTIP": "Retorna ver si le texto fornite es vacue.",
- "TEXT_INDEXOF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna 0 si le texto non es trovate.",
+ "TEXT_INDEXOF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna %1 si le texto non es trovate.",
"TEXT_INDEXOF_INPUT_INTEXT": "in le texto",
"TEXT_INDEXOF_OPERATOR_FIRST": "cercar le prime occurrentia del texto",
"TEXT_INDEXOF_OPERATOR_LAST": "cercar le ultime occurrentia del texto",
@@ -218,7 +218,7 @@
"LISTS_INLIST": "in lista",
"LISTS_INDEX_OF_FIRST": "cercar le prime occurrentia del elemento",
"LISTS_INDEX_OF_LAST": "cercar le ultime occurrentia del elemento",
- "LISTS_INDEX_OF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna 0 si le texto non es trovate.",
+ "LISTS_INDEX_OF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna %1 si le texto non es trovate.",
"LISTS_GET_INDEX_GET": "prender",
"LISTS_GET_INDEX_GET_REMOVE": "prender e remover",
"LISTS_GET_INDEX_REMOVE": "remover",
diff --git a/msg/json/id.json b/msg/json/id.json
index 4fe972ea4..d0cc08d18 100644
--- a/msg/json/id.json
+++ b/msg/json/id.json
@@ -196,7 +196,7 @@
"TEXT_LENGTH_TOOLTIP": "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan.",
"TEXT_ISEMPTY_TITLE": "%1 kosong",
"TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar jika teks yang disediakan kosong.",
- "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan.",
+ "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan.",
"TEXT_INDEXOF_INPUT_INTEXT": "dalam teks",
"TEXT_INDEXOF_OPERATOR_FIRST": "temukan kejadian pertama dalam teks",
"TEXT_INDEXOF_OPERATOR_LAST": "temukan kejadian terakhir dalam teks",
@@ -246,7 +246,7 @@
"LISTS_INLIST": "dalam list",
"LISTS_INDEX_OF_FIRST": "cari kejadian pertama item",
"LISTS_INDEX_OF_LAST": "cari kejadian terakhir item",
- "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan 0 jika item tidak ditemukan.",
+ "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item tidak ditemukan.",
"LISTS_GET_INDEX_GET": "dapatkan",
"LISTS_GET_INDEX_GET_REMOVE": "dapatkan dan hapus",
"LISTS_GET_INDEX_REMOVE": "Hapus",
diff --git a/msg/json/is.json b/msg/json/is.json
index 2e8f2451a..8f25aca31 100644
--- a/msg/json/is.json
+++ b/msg/json/is.json
@@ -207,7 +207,7 @@
"TEXT_ISEMPTY_TITLE": "%1 er tómur",
"TEXT_ISEMPTY_TOOLTIP": "Skilar sönnu ef gefni textinn er tómur.",
"TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text",
- "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar 0 ef textinn finnst ekki.",
+ "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki.",
"TEXT_INDEXOF_INPUT_INTEXT": "í texta",
"TEXT_INDEXOF_OPERATOR_FIRST": "finna fyrsta tilfelli texta",
"TEXT_INDEXOF_OPERATOR_LAST": "finna síðasta tilfelli texta",
@@ -266,7 +266,7 @@
"LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
"LISTS_INDEX_OF_FIRST": "finna fyrsta tilfelli atriðis",
"LISTS_INDEX_OF_LAST": "finna síðasta tilfelli atriðis",
- "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef atriðið finnst ekki.",
+ "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki.",
"LISTS_GET_INDEX_GET": "sækja",
"LISTS_GET_INDEX_GET_REMOVE": "sækja og fjarlægja",
"LISTS_GET_INDEX_REMOVE": "fjarlægja",
diff --git a/msg/json/it.json b/msg/json/it.json
index 209677d38..1675f6b44 100644
--- a/msg/json/it.json
+++ b/msg/json/it.json
@@ -182,7 +182,7 @@
"TEXT_LENGTH_TOOLTIP": "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito.",
"TEXT_ISEMPTY_TITLE": "%1 è vuoto",
"TEXT_ISEMPTY_TOOLTIP": "Restituisce vero se il testo fornito è vuoto.",
- "TEXT_INDEXOF_TOOLTIP": "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce 0 se il testo non viene trovato.",
+ "TEXT_INDEXOF_TOOLTIP": "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato.",
"TEXT_INDEXOF_INPUT_INTEXT": "nel testo",
"TEXT_INDEXOF_OPERATOR_FIRST": "trova la prima occorrenza del testo",
"TEXT_INDEXOF_OPERATOR_LAST": "trova l'ultima occorrenza del testo",
@@ -231,7 +231,7 @@
"LISTS_INLIST": "nella lista",
"LISTS_INDEX_OF_FIRST": "trova la prima occorrenza dell'elemento",
"LISTS_INDEX_OF_LAST": "trova l'ultima occorrenza dell'elemento",
- "LISTS_INDEX_OF_TOOLTIP": "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce 0 se l'elemento non viene trovato.",
+ "LISTS_INDEX_OF_TOOLTIP": "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato.",
"LISTS_GET_INDEX_GET": "prendi",
"LISTS_GET_INDEX_GET_REMOVE": "prendi e rimuovi",
"LISTS_GET_INDEX_REMOVE": "rimuovi",
diff --git a/msg/json/ja.json b/msg/json/ja.json
index 169d27b51..4bd9617bc 100644
--- a/msg/json/ja.json
+++ b/msg/json/ja.json
@@ -197,7 +197,7 @@
"TEXT_LENGTH_TOOLTIP": "指定されたテキストの文字 (スペースを含む) の数を返します。",
"TEXT_ISEMPTY_TITLE": "%1 が空",
"TEXT_ISEMPTY_TOOLTIP": "指定されたテキストが空の場合は、true を返します。",
- "TEXT_INDEXOF_TOOLTIP": "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は 0 を返します。",
+ "TEXT_INDEXOF_TOOLTIP": "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は %1 を返します。",
"TEXT_INDEXOF_INPUT_INTEXT": "テキストで",
"TEXT_INDEXOF_OPERATOR_FIRST": "テキストの最初の出現箇所を検索します。",
"TEXT_INDEXOF_OPERATOR_LAST": "テキストの最後に見つかったを検索します。",
@@ -250,7 +250,7 @@
"LISTS_INLIST": "リストで",
"LISTS_INDEX_OF_FIRST": "最初に見つかった項目を検索します。",
"LISTS_INDEX_OF_LAST": "最後に見つかったアイテムを見つける",
- "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は 0 を返します。",
+ "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。",
"LISTS_GET_INDEX_GET": "取得",
"LISTS_GET_INDEX_GET_REMOVE": "取得と削除",
"LISTS_GET_INDEX_REMOVE": "削除",
diff --git a/msg/json/ko.json b/msg/json/ko.json
index 77fe992c4..746a972ad 100644
--- a/msg/json/ko.json
+++ b/msg/json/ko.json
@@ -214,7 +214,7 @@
"TEXT_ISEMPTY_TITLE": "%1이 비어 있습니다",
"TEXT_ISEMPTY_TOOLTIP": "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다.",
"TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text",
- "TEXT_INDEXOF_TOOLTIP": "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 0 값을 돌려줌.",
+ "TEXT_INDEXOF_TOOLTIP": "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 %1 값을 돌려줌.",
"TEXT_INDEXOF_INPUT_INTEXT": "문장",
"TEXT_INDEXOF_OPERATOR_FIRST": "에서 다음 문장이 처음으로 나타난 위치 찾기 :",
"TEXT_INDEXOF_OPERATOR_LAST": "에서 다음 문장이 마지막으로 나타난 위치 찾기 :",
@@ -278,7 +278,7 @@
"LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
"LISTS_INDEX_OF_FIRST": "처음으로 나타난 위치",
"LISTS_INDEX_OF_LAST": "마지막으로 나타난 위치",
- "LISTS_INDEX_OF_TOOLTIP": "아이템이 나타난 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 0이 반환됩니다.",
+ "LISTS_INDEX_OF_TOOLTIP": "아이템이 나타난 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 %1이 반환됩니다.",
"LISTS_GET_INDEX_GET": "가져오기",
"LISTS_GET_INDEX_GET_REMOVE": "잘라 내기",
"LISTS_GET_INDEX_REMOVE": "삭제",
diff --git a/msg/json/lki.json b/msg/json/lki.json
index c90e64f13..29cffc1c7 100644
--- a/msg/json/lki.json
+++ b/msg/json/lki.json
@@ -175,7 +175,7 @@
"TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصلهها) در متن فراهمشده.",
"TEXT_ISEMPTY_TITLE": "%1 خالی است",
"TEXT_ISEMPTY_TOOLTIP": "اضافهکردن صحیح اگر متن فراهمشده خالی است.",
- "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد ۰ باز میگرداند.",
+ "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخداد متن اول در متن دوم بر میگرداند. اگر متن یافت نشد %1 باز میگرداند.",
"TEXT_INDEXOF_INPUT_INTEXT": "در متن",
"TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب",
"TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب",
@@ -224,7 +224,7 @@
"LISTS_INLIST": "در فهرست",
"LISTS_INDEX_OF_FIRST": "یافتن اولین رخداد مورد",
"LISTS_INDEX_OF_LAST": "یافتن آخرین رخداد مورد",
- "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. ۰ بر میگرداند اگر آیتم موجود نبود.",
+ "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخداد مورد در فهرست را بر میگرداند. %1 بر میگرداند اگر آیتم موجود نبود.",
"LISTS_GET_INDEX_GET": "گِرتِن",
"LISTS_GET_INDEX_GET_REMOVE": "گِرتِن و حةذف کردن",
"LISTS_GET_INDEX_REMOVE": "حةذف کردن",
diff --git a/msg/json/lt.json b/msg/json/lt.json
index b034e797a..58ddf6f43 100644
--- a/msg/json/lt.json
+++ b/msg/json/lt.json
@@ -187,7 +187,7 @@
"LISTS_INLIST": "sąraše",
"LISTS_INDEX_OF_FIRST": "rask pirmą reikšmę",
"LISTS_INDEX_OF_LAST": "rask paskutinę reikšmę",
- "LISTS_INDEX_OF_TOOLTIP": "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina 0, jei reikšmės neranda.",
+ "LISTS_INDEX_OF_TOOLTIP": "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina %1, jei reikšmės neranda.",
"LISTS_GET_INDEX_GET": "paimk",
"LISTS_GET_INDEX_GET_REMOVE": "paimk ir ištrink",
"LISTS_GET_INDEX_REMOVE": "pašalinti",
diff --git a/msg/json/ms.json b/msg/json/ms.json
index 6f78dc90e..44a4f794c 100644
--- a/msg/json/ms.json
+++ b/msg/json/ms.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan.",
"TEXT_ISEMPTY_TITLE": "%1 adalah kosong",
"TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar jika teks yang disediakan adalah kosong.",
- "TEXT_INDEXOF_TOOLTIP": "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan 0 Jika teks tidak ditemui.",
+ "TEXT_INDEXOF_TOOLTIP": "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan %1 Jika teks tidak ditemui.",
"TEXT_INDEXOF_INPUT_INTEXT": "dalam teks",
"TEXT_INDEXOF_OPERATOR_FIRST": "mencari kejadian pertama teks",
"TEXT_INDEXOF_OPERATOR_LAST": "mencari kejadian terakhir teks",
@@ -236,7 +236,7 @@
"LISTS_INLIST": "dalam senarai",
"LISTS_INDEX_OF_FIRST": "cari pertama item kejadian",
"LISTS_INDEX_OF_LAST": "cari kejadian akhir item",
- "LISTS_INDEX_OF_TOOLTIP": "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan 0 jika item berkenaan tidak ditemui.",
+ "LISTS_INDEX_OF_TOOLTIP": "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui.",
"LISTS_GET_INDEX_GET": "dapatkan",
"LISTS_GET_INDEX_GET_REMOVE": "dapat dan alihkan",
"LISTS_GET_INDEX_REMOVE": "alihkan",
diff --git a/msg/json/nb.json b/msg/json/nb.json
index adee7100f..99bd64921 100644
--- a/msg/json/nb.json
+++ b/msg/json/nb.json
@@ -193,7 +193,7 @@
"TEXT_LENGTH_TOOLTIP": "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten.",
"TEXT_ISEMPTY_TITLE": "%1 er tom",
"TEXT_ISEMPTY_TOOLTIP": "Returnerer sann hvis den angitte teksten er tom.",
- "TEXT_INDEXOF_TOOLTIP": "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer 0 hvis teksten ikke blir funnet.",
+ "TEXT_INDEXOF_TOOLTIP": "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer %1 hvis teksten ikke blir funnet.",
"TEXT_INDEXOF_INPUT_INTEXT": "i tekst",
"TEXT_INDEXOF_OPERATOR_FIRST": "finn første forekomst av tekst",
"TEXT_INDEXOF_OPERATOR_LAST": "finn siste forekomst av tekst",
@@ -246,7 +246,7 @@
"LISTS_INLIST": "i listen",
"LISTS_INDEX_OF_FIRST": "finn første forekomst av elementet",
"LISTS_INDEX_OF_LAST": "finn siste forekomst av elementet",
- "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer 0 hvis ikke funnet.",
+ "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet.",
"LISTS_GET_INDEX_GET": "hent",
"LISTS_GET_INDEX_GET_REMOVE": "hent og fjern",
"LISTS_GET_INDEX_REMOVE": "fjern",
diff --git a/msg/json/nl.json b/msg/json/nl.json
index d1326a00a..6f204bb22 100644
--- a/msg/json/nl.json
+++ b/msg/json/nl.json
@@ -211,7 +211,7 @@
"TEXT_ISEMPTY_TITLE": "%1 is leeg",
"TEXT_ISEMPTY_TOOLTIP": "Geeft \"waar\" terug, als de opgegeven tekst leeg is.",
"TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text",
- "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft 0 terug als de tekst niet gevonden is.",
+ "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.",
"TEXT_INDEXOF_INPUT_INTEXT": "in tekst",
"TEXT_INDEXOF_OPERATOR_FIRST": "zoek eerste voorkomen van tekst",
"TEXT_INDEXOF_OPERATOR_LAST": "zoek het laatste voorkomen van tekst",
@@ -270,7 +270,7 @@
"LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
"LISTS_INDEX_OF_FIRST": "zoek eerste voorkomen van item",
"LISTS_INDEX_OF_LAST": "zoek laatste voorkomen van item",
- "LISTS_INDEX_OF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft 0 terug als het item niet is gevonden.",
+ "LISTS_INDEX_OF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden.",
"LISTS_GET_INDEX_GET": "haal op",
"LISTS_GET_INDEX_GET_REMOVE": "haal op en verwijder",
"LISTS_GET_INDEX_REMOVE": "verwijder",
diff --git a/msg/json/pl.json b/msg/json/pl.json
index cda271e14..df078a0e6 100644
--- a/msg/json/pl.json
+++ b/msg/json/pl.json
@@ -202,7 +202,7 @@
"TEXT_LENGTH_TOOLTIP": "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście.",
"TEXT_ISEMPTY_TITLE": "%1 jest pusty",
"TEXT_ISEMPTY_TOOLTIP": "Zwraca prawda (true), jeśli podany tekst jest pusty.",
- "TEXT_INDEXOF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość 0, jeśli tekst nie został znaleziony.",
+ "TEXT_INDEXOF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość %1, jeśli tekst nie został znaleziony.",
"TEXT_INDEXOF_INPUT_INTEXT": "w tekście",
"TEXT_INDEXOF_OPERATOR_FIRST": "znajdź pierwsze wystąpienie tekstu",
"TEXT_INDEXOF_OPERATOR_LAST": "znajdź ostatnie wystąpienie tekstu",
@@ -255,7 +255,7 @@
"LISTS_INLIST": "na liście",
"LISTS_INDEX_OF_FIRST": "znaleźć pierwsze wystąpienie elementu",
"LISTS_INDEX_OF_LAST": "znajduje ostatanie wystąpienie elementu",
- "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość 0, jeśli tekst nie zostanie znaleziony.",
+ "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość %1, jeśli tekst nie zostanie znaleziony.",
"LISTS_GET_INDEX_GET": "pobierz",
"LISTS_GET_INDEX_GET_REMOVE": "Pobierz i usuń",
"LISTS_GET_INDEX_REMOVE": "usuń",
diff --git a/msg/json/pms.json b/msg/json/pms.json
index 4c317341f..3710e5f24 100644
--- a/msg/json/pms.json
+++ b/msg/json/pms.json
@@ -176,7 +176,7 @@
"TEXT_LENGTH_TOOLTIP": "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì.",
"TEXT_ISEMPTY_TITLE": "%1 a l'é veuid",
"TEXT_ISEMPTY_TOOLTIP": "A smon ver se ël test fornì a l'é veuid.",
- "TEXT_INDEXOF_TOOLTIP": "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon 0 se ël test a l'é nen trovà.",
+ "TEXT_INDEXOF_TOOLTIP": "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon %1 se ël test a l'é nen trovà.",
"TEXT_INDEXOF_INPUT_INTEXT": "ant ël test",
"TEXT_INDEXOF_OPERATOR_FIRST": "trové la prima ocorensa dël test",
"TEXT_INDEXOF_OPERATOR_LAST": "trové l'ùltima ocorensa dël test",
@@ -226,7 +226,7 @@
"LISTS_INLIST": "ant la lista",
"LISTS_INDEX_OF_FIRST": "trové la prima ocorensa dl'element",
"LISTS_INDEX_OF_LAST": "trové l'ùltima ocorensa dl'element",
- "LISTS_INDEX_OF_TOOLTIP": "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon 0 se l'element a l'é nen trovà.",
+ "LISTS_INDEX_OF_TOOLTIP": "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon %1 se l'element a l'é nen trovà.",
"LISTS_GET_INDEX_GET": "oten-e",
"LISTS_GET_INDEX_GET_REMOVE": "oten-e e eliminé",
"LISTS_GET_INDEX_REMOVE": "eliminé",
diff --git a/msg/json/pt-br.json b/msg/json/pt-br.json
index 489f5c78c..e76d55be9 100644
--- a/msg/json/pt-br.json
+++ b/msg/json/pt-br.json
@@ -189,7 +189,7 @@
"TEXT_LENGTH_TOOLTIP": "Retorna o número de letras (incluindo espaços) no texto fornecido.",
"TEXT_ISEMPTY_TITLE": "%1 é vazio",
"TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido for vazio.",
- "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.",
+ "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.",
"TEXT_INDEXOF_INPUT_INTEXT": "no texto",
"TEXT_INDEXOF_OPERATOR_FIRST": "encontre a primeira ocorrência do item",
"TEXT_INDEXOF_OPERATOR_LAST": "encontre a última ocorrência do texto",
@@ -238,7 +238,7 @@
"LISTS_INLIST": "na lista",
"LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item",
"LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item",
- "LISTS_INDEX_OF_TOOLTIP": "Retorna o índice da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado.",
+ "LISTS_INDEX_OF_TOOLTIP": "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.",
"LISTS_GET_INDEX_GET": "obter",
"LISTS_GET_INDEX_GET_REMOVE": "obter e remover",
"LISTS_GET_INDEX_REMOVE": "remover",
diff --git a/msg/json/pt.json b/msg/json/pt.json
index 797f42e45..011fefd9c 100644
--- a/msg/json/pt.json
+++ b/msg/json/pt.json
@@ -198,7 +198,7 @@
"TEXT_LENGTH_TOOLTIP": "Devolve o número de letras (incluindo espaços) do texto fornecido.",
"TEXT_ISEMPTY_TITLE": "%1 está vazio",
"TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido estiver vazio.",
- "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.",
+ "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.",
"TEXT_INDEXOF_INPUT_INTEXT": "no texto",
"TEXT_INDEXOF_OPERATOR_FIRST": "primeira ocorrência do texto",
"TEXT_INDEXOF_OPERATOR_LAST": "última ocorrência do texto",
@@ -248,7 +248,7 @@
"LISTS_INLIST": "na lista",
"LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item",
"LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item",
- "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado.",
+ "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.",
"LISTS_GET_INDEX_GET": "obter",
"LISTS_GET_INDEX_GET_REMOVE": "obter e remover",
"LISTS_GET_INDEX_REMOVE": "remover",
diff --git a/msg/json/qqq.json b/msg/json/qqq.json
index 9f990c30b..1aad1ae19 100644
--- a/msg/json/qqq.json
+++ b/msg/json/qqq.json
@@ -209,7 +209,7 @@
"TEXT_ISEMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. \n\nParameters:\n* %1 - the piece of text to test for emptiness",
"TEXT_ISEMPTY_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text].",
"TEXT_INDEXOF_HELPURL": "url - Information about finding a character in a piece of text.",
- "TEXT_INDEXOF_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].",
+ "TEXT_INDEXOF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].",
"TEXT_INDEXOF_INPUT_INTEXT": "block text - Title of blocks allowing users to find text. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]].",
"TEXT_INDEXOF_OPERATOR_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]].",
"TEXT_INDEXOF_OPERATOR_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. This would replace 'find first occurrence of text' below. (For more information on how common text is factored out of dropdown menus, see [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) [[File:Blockly-find-text.png]].",
@@ -273,7 +273,7 @@
"LISTS_INDEX_OF_HELPURL": "url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list].",
"LISTS_INDEX_OF_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]",
"LISTS_INDEX_OF_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]",
- "LISTS_INDEX_OF_TOOLTIP": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]",
+ "LISTS_INDEX_OF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]",
"LISTS_GET_INDEX_GET": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get an item from a list] without removing it from the list.",
"LISTS_GET_INDEX_GET_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and remove an item from a list], as opposed to merely getting it without modifying the list.",
"LISTS_GET_INDEX_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#removing-an-item remove an item from a list].\n{{Identical|Remove}}",
diff --git a/msg/json/ro.json b/msg/json/ro.json
index 01365b4e7..a0e0b050b 100644
--- a/msg/json/ro.json
+++ b/msg/json/ro.json
@@ -191,7 +191,7 @@
"TEXT_LENGTH_TOOLTIP": "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat.",
"TEXT_ISEMPTY_TITLE": "%1 este gol",
"TEXT_ISEMPTY_TOOLTIP": "Returnează adevărat dacă textul furnizat este gol.",
- "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează 0 dacă textul nu este găsit.",
+ "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit.",
"TEXT_INDEXOF_INPUT_INTEXT": "în text",
"TEXT_INDEXOF_OPERATOR_FIRST": "găseşte prima apariţie a textului",
"TEXT_INDEXOF_OPERATOR_LAST": "găseşte ultima apariţie a textului",
@@ -241,7 +241,7 @@
"LISTS_INLIST": "în listă",
"LISTS_INDEX_OF_FIRST": "Găseşte prima apariţie a elementului",
"LISTS_INDEX_OF_LAST": "găseşte ultima apariţie a elementului",
- "LISTS_INDEX_OF_TOOLTIP": "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează 0 dacă elementul nu este găsit.",
+ "LISTS_INDEX_OF_TOOLTIP": "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează %1 dacă elementul nu este găsit.",
"LISTS_GET_INDEX_GET": "obţine",
"LISTS_GET_INDEX_GET_REMOVE": "obţine şi elimină",
"LISTS_GET_INDEX_REMOVE": "elimină",
diff --git a/msg/json/ru.json b/msg/json/ru.json
index d2a5e34c7..67f475142 100644
--- a/msg/json/ru.json
+++ b/msg/json/ru.json
@@ -182,7 +182,7 @@
"TEXT_LENGTH_TOOLTIP": "Возвращает число символов (включая пробелы) в заданном тексте.",
"TEXT_ISEMPTY_TITLE": "%1 пуст",
"TEXT_ISEMPTY_TOOLTIP": "Возвращает значение истина, если предоставленный текст пуст.",
- "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает 0, если текст не найден.",
+ "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден.",
"TEXT_INDEXOF_INPUT_INTEXT": "в тексте",
"TEXT_INDEXOF_OPERATOR_FIRST": "найти первое вхождение текста",
"TEXT_INDEXOF_OPERATOR_LAST": "найти последнее вхождение текста",
@@ -232,7 +232,7 @@
"LISTS_INLIST": "в списке",
"LISTS_INDEX_OF_FIRST": "найти первое вхождение элемента",
"LISTS_INDEX_OF_LAST": "найти последнее вхождение элемента",
- "LISTS_INDEX_OF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает 0, если элемент не найден.",
+ "LISTS_INDEX_OF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден.",
"LISTS_GET_INDEX_GET": "взять",
"LISTS_GET_INDEX_GET_REMOVE": "взять и удалить",
"LISTS_GET_INDEX_REMOVE": "удалить",
diff --git a/msg/json/sc.json b/msg/json/sc.json
index 191118662..d64cedaf9 100644
--- a/msg/json/sc.json
+++ b/msg/json/sc.json
@@ -176,7 +176,7 @@
"TEXT_LENGTH_TOOLTIP": "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau.",
"TEXT_ISEMPTY_TITLE": "%1 est buidu",
"TEXT_ISEMPTY_TOOLTIP": "Torrat berus si su testu giau est buidu.",
- "TEXT_INDEXOF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat 0 si su testu no ddu agatat.",
+ "TEXT_INDEXOF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat %1 si su testu no ddu agatat.",
"TEXT_INDEXOF_INPUT_INTEXT": "in su testu",
"TEXT_INDEXOF_OPERATOR_FIRST": "circa prima ocasioni de su testu",
"TEXT_INDEXOF_OPERATOR_LAST": "circa urtima ocasioni de su testu",
@@ -225,7 +225,7 @@
"LISTS_INLIST": "in lista",
"LISTS_INDEX_OF_FIRST": "circa prima ocasioni de s'item",
"LISTS_INDEX_OF_LAST": "circa urtima ocasioni de s'item",
- "LISTS_INDEX_OF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat 0 si s'item non s'agatat.",
+ "LISTS_INDEX_OF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat %1 si s'item non s'agatat.",
"LISTS_GET_INDEX_GET": "piga",
"LISTS_GET_INDEX_GET_REMOVE": "piga e fùlia",
"LISTS_GET_INDEX_REMOVE": "fùlia",
diff --git a/msg/json/sk.json b/msg/json/sk.json
index 06e7a8e0e..0a2d61ea0 100644
--- a/msg/json/sk.json
+++ b/msg/json/sk.json
@@ -179,7 +179,7 @@
"TEXT_LENGTH_TOOLTIP": "Vráti počet písmen (s medzerami) v zadanom texte.",
"TEXT_ISEMPTY_TITLE": "%1 je prázdny",
"TEXT_ISEMPTY_TOOLTIP": "Vráti hodnotu pravda, ak zadaný text je prázdny.",
- "TEXT_INDEXOF_TOOLTIP": "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti 0.",
+ "TEXT_INDEXOF_TOOLTIP": "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti %1.",
"TEXT_INDEXOF_INPUT_INTEXT": "v texte",
"TEXT_INDEXOF_OPERATOR_FIRST": "nájdi prvý výskyt textu",
"TEXT_INDEXOF_OPERATOR_LAST": "nájdi posledný výskyt textu",
@@ -229,7 +229,7 @@
"LISTS_INLIST": "v zozname",
"LISTS_INDEX_OF_FIRST": "nájdi prvý výskyt prvku",
"LISTS_INDEX_OF_LAST": "nájdi posledný výskyt prvku",
- "LISTS_INDEX_OF_TOOLTIP": "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti 0.",
+ "LISTS_INDEX_OF_TOOLTIP": "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti %1.",
"LISTS_GET_INDEX_GET": "zisti",
"LISTS_GET_INDEX_GET_REMOVE": "zisti a odstráň",
"LISTS_GET_INDEX_REMOVE": "odstráň",
diff --git a/msg/json/sl.json b/msg/json/sl.json
index 292adb0d9..c9b0f1985 100644
--- a/msg/json/sl.json
+++ b/msg/json/sl.json
@@ -207,7 +207,7 @@
"TEXT_ISEMPTY_TITLE": "%1 je prazno",
"TEXT_ISEMPTY_TOOLTIP": "Vrne resnično, če je določeno besedilo prazno.",
"TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text",
- "TEXT_INDEXOF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne 0.",
+ "TEXT_INDEXOF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1.",
"TEXT_INDEXOF_INPUT_INTEXT": "v besedilu",
"TEXT_INDEXOF_OPERATOR_FIRST": "najdi prvo pojavitev besedila",
"TEXT_INDEXOF_OPERATOR_LAST": "najdi zadnjo pojavitev besedila",
@@ -268,7 +268,7 @@
"LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
"LISTS_INDEX_OF_FIRST": "najdi prvo pojavitev elementa",
"LISTS_INDEX_OF_LAST": "najdi zadnjo pojavitev elementa",
- "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne 0.",
+ "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.",
"LISTS_GET_INDEX_GET": "vrni",
"LISTS_GET_INDEX_GET_REMOVE": "odstrani in vrni",
"LISTS_GET_INDEX_REMOVE": "odstrani",
diff --git a/msg/json/sq.json b/msg/json/sq.json
index 74b05558e..7a649dcad 100644
--- a/msg/json/sq.json
+++ b/msg/json/sq.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "Pergjigjet me nje numer shkronjash (duke perfshire hapesire) ne tekstin e dhene.",
"TEXT_ISEMPTY_TITLE": "%1 eshte bosh",
"TEXT_ISEMPTY_TOOLTIP": "Kthehet e vertete neqoftese teksti i dhene eshte bosh.",
- "TEXT_INDEXOF_TOOLTIP": "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me 0 ne qofte se teksti nuk u gjet.",
+ "TEXT_INDEXOF_TOOLTIP": "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me %1 ne qofte se teksti nuk u gjet.",
"TEXT_INDEXOF_INPUT_INTEXT": "ne tekst",
"TEXT_INDEXOF_OPERATOR_FIRST": "gjej rastisjen e pare te tekstit",
"TEXT_INDEXOF_OPERATOR_LAST": "gjej rastisjen e fundit te tekstit",
@@ -236,7 +236,7 @@
"LISTS_INLIST": "në listë",
"LISTS_INDEX_OF_FIRST": "gjen ndodhjen e parë të sendit",
"LISTS_INDEX_OF_LAST": "gjen ndodhjen e fundit të sendit",
- "LISTS_INDEX_OF_TOOLTIP": "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen 0 nëse teksti nuk është gjetur.",
+ "LISTS_INDEX_OF_TOOLTIP": "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen %1 nëse teksti nuk është gjetur.",
"LISTS_GET_INDEX_GET": "merr",
"LISTS_GET_INDEX_GET_REMOVE": "merr dhe fshij",
"LISTS_GET_INDEX_REMOVE": "largo",
diff --git a/msg/json/sr.json b/msg/json/sr.json
index 91fceb823..c3c8f0d79 100644
--- a/msg/json/sr.json
+++ b/msg/json/sr.json
@@ -194,7 +194,7 @@
"TEXT_LENGTH_TOOLTIP": "Враћа број слова (уклјучујући размаке) у датом тексту.",
"TEXT_ISEMPTY_TITLE": "%1 је празан",
"TEXT_ISEMPTY_TOOLTIP": "Враћа тачно ако је доставлјени текст празан.",
- "TEXT_INDEXOF_TOOLTIP": "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа 0 ако текст није пронађен.",
+ "TEXT_INDEXOF_TOOLTIP": "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа %1 ако текст није пронађен.",
"TEXT_INDEXOF_INPUT_INTEXT": "у тексту",
"TEXT_INDEXOF_OPERATOR_FIRST": "пронађи прво појављивање текста",
"TEXT_INDEXOF_OPERATOR_LAST": "пронађи последње појављивање текста",
@@ -247,7 +247,7 @@
"LISTS_INLIST": "на списку",
"LISTS_INDEX_OF_FIRST": "пронађи прво појављивање ставке",
"LISTS_INDEX_OF_LAST": "пронађи последње појављивање ставке",
- "LISTS_INDEX_OF_TOOLTIP": "Враћа број првог и/последњег уласка елемента у листу. Враћа 0 Ако елемент није пронађен.",
+ "LISTS_INDEX_OF_TOOLTIP": "Враћа број првог и/последњег уласка елемента у листу. Враћа %1 Ако елемент није пронађен.",
"LISTS_GET_INDEX_GET": "преузми",
"LISTS_GET_INDEX_GET_REMOVE": "преузми и уклони",
"LISTS_GET_INDEX_REMOVE": "уклони",
diff --git a/msg/json/sv.json b/msg/json/sv.json
index e7e14e2ac..810eb8951 100644
--- a/msg/json/sv.json
+++ b/msg/json/sv.json
@@ -195,7 +195,7 @@
"TEXT_LENGTH_TOOLTIP": "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten.",
"TEXT_ISEMPTY_TITLE": "%1 är tom",
"TEXT_ISEMPTY_TOOLTIP": "Returnerar sant om den angivna texten är tom.",
- "TEXT_INDEXOF_TOOLTIP": "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka 0 om texten inte hittas.",
+ "TEXT_INDEXOF_TOOLTIP": "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka %1 om texten inte hittas.",
"TEXT_INDEXOF_INPUT_INTEXT": "i texten",
"TEXT_INDEXOF_OPERATOR_FIRST": "hitta första förekomsten av texten",
"TEXT_INDEXOF_OPERATOR_LAST": "hitta sista förekomsten av texten",
@@ -246,7 +246,7 @@
"LISTS_INLIST": "i listan",
"LISTS_INDEX_OF_FIRST": "hitta första förekomsten av objektet",
"LISTS_INDEX_OF_LAST": "hitta sista förekomsten av objektet",
- "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka 0 om objektet inte hittas.",
+ "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka %1 om objektet inte hittas.",
"LISTS_GET_INDEX_GET": "hämta",
"LISTS_GET_INDEX_GET_REMOVE": "hämta och ta bort",
"LISTS_GET_INDEX_REMOVE": "ta bort",
diff --git a/msg/json/ta.json b/msg/json/ta.json
index 5c1476753..ec0048a55 100644
--- a/msg/json/ta.json
+++ b/msg/json/ta.json
@@ -176,7 +176,6 @@
"TEXT_LENGTH_TOOLTIP": "தொடரில் உள்ள எழுத்துக்களின் (இடைவெளிகளையும் சேர்த்து) எண்ணிகையை பின்கொடு.",
"TEXT_ISEMPTY_TITLE": "%1 காலியானது",
"TEXT_ISEMPTY_TOOLTIP": "காலியானது என்றால் மெய் மதிப்பை பின்கொடு",
- "TEXT_INDEXOF_TOOLTIP": "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.",
"TEXT_INDEXOF_INPUT_INTEXT": "உரையில்",
"TEXT_INDEXOF_OPERATOR_FIRST": "உரையில் முதல் தோற்ற இடத்தை பின்கொடு",
"TEXT_INDEXOF_OPERATOR_LAST": "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு",
@@ -225,7 +224,7 @@
"LISTS_INLIST": "பட்டியலில் உள்ள",
"LISTS_INDEX_OF_FIRST": "உரையில் முதல் தோற்ற இடத்தை காட்டு",
"LISTS_INDEX_OF_LAST": "உரையில் கடைசி தோற்ற இடத்தை காட்டு",
- "LISTS_INDEX_OF_TOOLTIP": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் 0 பின்கொடு.",
+ "LISTS_INDEX_OF_TOOLTIP": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு.",
"LISTS_GET_INDEX_GET": "எடு",
"LISTS_GET_INDEX_GET_REMOVE": "பெற்று நீக்குக",
"LISTS_GET_INDEX_REMOVE": "நீக்குக",
diff --git a/msg/json/tcy.json b/msg/json/tcy.json
index 74afa6c39..618845ea7 100644
--- a/msg/json/tcy.json
+++ b/msg/json/tcy.json
@@ -175,7 +175,7 @@
"TEXT_LENGTH_TOOLTIP": "ಕೊರ್ನ ಪಟ್ಯೊದ ಅಕ್ಷರೊಲೆನ(ಅಂತರೊಲು ಸೇರ್ನಂಚ) ಸಂಖ್ಯೆನ್ ಪಿರಕೊರು.",
"TEXT_ISEMPTY_TITLE": "%1 ಕಾಲಿ",
"TEXT_ISEMPTY_TOOLTIP": "ಕೊರ್ನ ಪಟ್ಯೊ ಕಾಲಿಂದ್ ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು",
- "TEXT_INDEXOF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. ೦ ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.",
+ "TEXT_INDEXOF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.",
"TEXT_INDEXOF_INPUT_INTEXT": "ಪಟ್ಯೊಡು",
"TEXT_INDEXOF_OPERATOR_FIRST": "ಸುರುಟು ಸಂಭವಿಸಯಿನ ಪಟ್ಯೊನು ನಾಡ್ಲ",
"TEXT_INDEXOF_OPERATOR_LAST": "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ",
@@ -224,7 +224,7 @@
"LISTS_INLIST": "ಪಟ್ಟಿಡ್",
"LISTS_INDEX_OF_FIRST": "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ",
"LISTS_INDEX_OF_LAST": "ಅಕೆರಿಗ್ ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್ಲೆ",
- "LISTS_INDEX_OF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. ೦ ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.",
+ "LISTS_INDEX_OF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್ಂಡ ಪಿರಕೊರು.",
"LISTS_GET_INDEX_GET": "ದೆತೊನು",
"LISTS_GET_INDEX_GET_REMOVE": "ದೆತೊನಿಯರ ಬುಕ್ಕೊ ದೆಪ್ಪೆರೆ",
"LISTS_GET_INDEX_REMOVE": "ದೆಪ್ಪುಲೆ",
diff --git a/msg/json/th.json b/msg/json/th.json
index d2ee19352..8aea2db61 100644
--- a/msg/json/th.json
+++ b/msg/json/th.json
@@ -175,7 +175,7 @@
"TEXT_LENGTH_TOOLTIP": "คืนค่าความยาวของข้อความ (รวมช่องว่าง)",
"TEXT_ISEMPTY_TITLE": "%1 ว่าง",
"TEXT_ISEMPTY_TOOLTIP": "คืนค่าจริง ถ้าข้อความยังว่าง",
- "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า 0 ถ้าหาไม่พบ",
+ "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ",
"TEXT_INDEXOF_INPUT_INTEXT": "ในข้อความ",
"TEXT_INDEXOF_OPERATOR_FIRST": "หาข้อความแรกที่พบ",
"TEXT_INDEXOF_OPERATOR_LAST": "หาข้อความสุดท้ายที่พบ",
@@ -224,7 +224,7 @@
"LISTS_INLIST": "ในรายการ",
"LISTS_INDEX_OF_FIRST": "หาอันแรกที่พบ",
"LISTS_INDEX_OF_LAST": "หาอันสุดท้ายที่พบ",
- "LISTS_INDEX_OF_TOOLTIP": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า 0 ถ้าหาไม่พบ",
+ "LISTS_INDEX_OF_TOOLTIP": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ",
"LISTS_GET_INDEX_GET": "เรียกดู",
"LISTS_GET_INDEX_GET_REMOVE": "เรียกดูและเอาออก",
"LISTS_GET_INDEX_REMOVE": "เอาออก",
diff --git a/msg/json/tl.json b/msg/json/tl.json
index 5c1233b99..a4cb69db1 100644
--- a/msg/json/tl.json
+++ b/msg/json/tl.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "Returns the number of letters (including spaces) in the provided text.",
"TEXT_ISEMPTY_TITLE": "%1 is empty",
"TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.",
- "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of first text in the second text. Returns 0 if text is not found.",
+ "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of first text in the second text. Returns %1 if text is not found.",
"TEXT_INDEXOF_INPUT_INTEXT": "in text",
"TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text",
"TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text",
@@ -236,7 +236,7 @@
"LISTS_INLIST": "sa list",
"LISTS_INDEX_OF_FIRST": "Hanapin ang unang pangyayari ng item",
"LISTS_INDEX_OF_LAST": "hanapin ang huling pangyayari ng item",
- "LISTS_INDEX_OF_TOOLTIP": "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng 0 kung ang item ay hindi makita.",
+ "LISTS_INDEX_OF_TOOLTIP": "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng %1 kung ang item ay hindi makita.",
"LISTS_GET_INDEX_GET": "kunin",
"LISTS_GET_INDEX_GET_REMOVE": "kunin at tanggalin",
"LISTS_GET_INDEX_REMOVE": "tanggalin",
diff --git a/msg/json/tr.json b/msg/json/tr.json
index 3ce5aa485..bbd8c955e 100644
--- a/msg/json/tr.json
+++ b/msg/json/tr.json
@@ -203,7 +203,7 @@
"TEXT_LENGTH_TOOLTIP": "Yazı içerisinde verilen harflerin ( harf arasındaki boşluklar dahil) sayısını verir .",
"TEXT_ISEMPTY_TITLE": "%1 boş",
"TEXT_ISEMPTY_TOOLTIP": "Verilen metin boşsa true(doğru) değerini verir.",
- "TEXT_INDEXOF_TOOLTIP": "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa 0 döndürür.",
+ "TEXT_INDEXOF_TOOLTIP": "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa %1 döndürür.",
"TEXT_INDEXOF_INPUT_INTEXT": "metinde",
"TEXT_INDEXOF_OPERATOR_FIRST": "Metnin ilk varolduğu yeri bul",
"TEXT_INDEXOF_OPERATOR_LAST": "Metnin son varolduğu yeri bul",
@@ -256,7 +256,7 @@
"LISTS_INLIST": "Listede",
"LISTS_INDEX_OF_FIRST": "Öğenin ilk varolduğu yeri bul",
"LISTS_INDEX_OF_LAST": "Öğenin son varolduğu yeri bul",
- "LISTS_INDEX_OF_TOOLTIP": "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise 0 döndürür.",
+ "LISTS_INDEX_OF_TOOLTIP": "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise %1 döndürür.",
"LISTS_GET_INDEX_GET": "Al",
"LISTS_GET_INDEX_GET_REMOVE": "al ve kaldır",
"LISTS_GET_INDEX_REMOVE": "kaldır",
diff --git a/msg/json/uk.json b/msg/json/uk.json
index fc25fc5b8..66fcdabfe 100644
--- a/msg/json/uk.json
+++ b/msg/json/uk.json
@@ -187,7 +187,7 @@
"TEXT_LENGTH_TOOLTIP": "Повертає число символів (включно з пропусками) у даному тексті.",
"TEXT_ISEMPTY_TITLE": "%1 є порожнім",
"TEXT_ISEMPTY_TOOLTIP": "Повертає істину, якщо вказаний текст порожній.",
- "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає 0, якщо текст не знайдено.",
+ "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено.",
"TEXT_INDEXOF_INPUT_INTEXT": "у тексті",
"TEXT_INDEXOF_OPERATOR_FIRST": "знайти перше входження тексту",
"TEXT_INDEXOF_OPERATOR_LAST": "знайти останнє входження тексту",
@@ -241,7 +241,7 @@
"LISTS_INLIST": "у списку",
"LISTS_INDEX_OF_FIRST": "знайти перше входження елемента",
"LISTS_INDEX_OF_LAST": "знайти останнє входження елемента",
- "LISTS_INDEX_OF_TOOLTIP": "Повертає індекс першого/останнього входження елемента у списку. Повертає 0, якщо елемент не знайдено.",
+ "LISTS_INDEX_OF_TOOLTIP": "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено.",
"LISTS_GET_INDEX_GET": "отримати",
"LISTS_GET_INDEX_GET_REMOVE": "отримати і вилучити",
"LISTS_GET_INDEX_REMOVE": "вилучити",
diff --git a/msg/json/vi.json b/msg/json/vi.json
index 4c801fff2..5f26b007d 100644
--- a/msg/json/vi.json
+++ b/msg/json/vi.json
@@ -178,7 +178,7 @@
"TEXT_LENGTH_TOOLTIP": "Hoàn trả số lượng ký tự (kể cả khoảng trắng) trong văn bản đầu vào.",
"TEXT_ISEMPTY_TITLE": "%1 trống không",
"TEXT_ISEMPTY_TOOLTIP": "Hoàn trả “đúng nếu văn bản không có ký tự nào.",
- "TEXT_INDEXOF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số 0.",
+ "TEXT_INDEXOF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số %1.",
"TEXT_INDEXOF_INPUT_INTEXT": "trong văn bản",
"TEXT_INDEXOF_OPERATOR_FIRST": "tìm sự có mặt đầu tiên của",
"TEXT_INDEXOF_OPERATOR_LAST": "tìm sự có mặt cuối cùng của",
@@ -229,7 +229,7 @@
"LISTS_INLIST": "trong dánh sách",
"LISTS_INDEX_OF_FIRST": "tìm sự có mặt đầu tiên của vật",
"LISTS_INDEX_OF_LAST": "tìm sự có mặt cuối cùng của vật",
- "LISTS_INDEX_OF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số 0.",
+ "LISTS_INDEX_OF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1.",
"LISTS_GET_INDEX_GET": "lấy thành tố",
"LISTS_GET_INDEX_GET_REMOVE": "lấy và xóa thành tố",
"LISTS_GET_INDEX_REMOVE": "xóa thành tố",
diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json
index 670a09d15..f47e3de7e 100644
--- a/msg/json/zh-hans.json
+++ b/msg/json/zh-hans.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "返回提供文本的字母数(包括空格)。",
"TEXT_ISEMPTY_TITLE": "%1是空的",
"TEXT_ISEMPTY_TOOLTIP": "如果提供的文本为空,则返回真。",
- "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 0。",
+ "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 %1。",
"TEXT_INDEXOF_INPUT_INTEXT": "自文本",
"TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一个出现的文本",
"TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一个出现的文本",
@@ -240,7 +240,7 @@
"LISTS_INLIST": "在列表中",
"LISTS_INDEX_OF_FIRST": "找出第一个项出现",
"LISTS_INDEX_OF_LAST": "找出最后一个项出现",
- "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回0。",
+ "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。",
"LISTS_GET_INDEX_GET": "获得",
"LISTS_GET_INDEX_GET_REMOVE": "取出并移除",
"LISTS_GET_INDEX_REMOVE": "移除",
diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json
index bcd166754..0224f756b 100644
--- a/msg/json/zh-hant.json
+++ b/msg/json/zh-hant.json
@@ -183,7 +183,7 @@
"TEXT_LENGTH_TOOLTIP": "返回這串文字的字元數(含空格) 。",
"TEXT_ISEMPTY_TITLE": "%1 為空",
"TEXT_ISEMPTY_TOOLTIP": "如果提供的字串為空,則返回 真。",
- "TEXT_INDEXOF_TOOLTIP": "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。",
+ "TEXT_INDEXOF_TOOLTIP": "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 %1。",
"TEXT_INDEXOF_INPUT_INTEXT": "在字串",
"TEXT_INDEXOF_OPERATOR_FIRST": "尋找 第一個 出現的字串",
"TEXT_INDEXOF_OPERATOR_LAST": "尋找 最後一個 出現的字串",
@@ -233,7 +233,7 @@
"LISTS_INLIST": "自列表",
"LISTS_INDEX_OF_FIRST": "找出 第一個 項目出現",
"LISTS_INDEX_OF_LAST": "找出 最後一個 項目出現",
- "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。",
+ "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 %1。",
"LISTS_GET_INDEX_GET": "取值",
"LISTS_GET_INDEX_GET_REMOVE": "取出並移除",
"LISTS_GET_INDEX_REMOVE": "移除",
diff --git a/msg/messages.js b/msg/messages.js
index 691e2ce94..740a34d8d 100644
--- a/msg/messages.js
+++ b/msg/messages.js
@@ -539,8 +539,8 @@ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = 'Returns true if the provided text is empty.'
/// url - Information about finding a character in a piece of text.
Blockly.Msg.TEXT_INDEXOF_HELPURL = 'https://github.com/google/blockly/wiki/Text#finding-text';
-/// tooltip - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = 'Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.';
+/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = 'Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.';
/// block text - Title of blocks allowing users to find text. See
/// [https://github.com/google/blockly/wiki/Text#finding-text
/// https://github.com/google/blockly/wiki/Text#finding-text].
@@ -801,10 +801,10 @@ Blockly.Msg.LISTS_INDEX_OF_FIRST = 'find first occurrence of item';
/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list].
/// [[File:Blockly-list-find.png]]
Blockly.Msg.LISTS_INDEX_OF_LAST = 'find last occurrence of item';
-/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list
+/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list
/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list].
/// [[File:Blockly-list-find.png]]
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = 'Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.';
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = 'Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.';
Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/// dropdown - Indicates that the user wishes to
From 5ea49cdf4efa27338f6266c582c5a6f0f8e2db70 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Sat, 9 Jul 2016 04:23:01 -0700
Subject: [PATCH 14/25] Change tooltips on get/set list blocks to be 0/1 index
aware. All languages.
---
blocks/lists.js | 97 ++++++++++++++++++++++++++++++++++++++---
blocks_compressed.js | 60 +++++++++++++------------
core/blocks.js | 1 -
msg/js/ar.js | 17 +++-----
msg/js/az.js | 17 +++-----
msg/js/ba.js | 17 +++-----
msg/js/bcc.js | 17 +++-----
msg/js/be-tarask.js | 17 +++-----
msg/js/bg.js | 17 +++-----
msg/js/bn.js | 17 +++-----
msg/js/br.js | 17 +++-----
msg/js/ca.js | 17 +++-----
msg/js/cs.js | 17 +++-----
msg/js/da.js | 17 +++-----
msg/js/de.js | 17 +++-----
msg/js/el.js | 17 +++-----
msg/js/en.js | 17 +++-----
msg/js/es.js | 17 +++-----
msg/js/fa.js | 17 +++-----
msg/js/fi.js | 17 +++-----
msg/js/fr.js | 17 +++-----
msg/js/he.js | 17 +++-----
msg/js/hi.js | 21 ++++-----
msg/js/hrx.js | 17 +++-----
msg/js/hu.js | 17 +++-----
msg/js/ia.js | 17 +++-----
msg/js/id.js | 17 +++-----
msg/js/is.js | 17 +++-----
msg/js/it.js | 17 +++-----
msg/js/ja.js | 17 +++-----
msg/js/ko.js | 17 +++-----
msg/js/lb.js | 17 +++-----
msg/js/lki.js | 21 ++++-----
msg/js/lrc.js | 17 +++-----
msg/js/lt.js | 17 +++-----
msg/js/mk.js | 17 +++-----
msg/js/ms.js | 17 +++-----
msg/js/nb.js | 17 +++-----
msg/js/nl.js | 17 +++-----
msg/js/oc.js | 17 +++-----
msg/js/pl.js | 17 +++-----
msg/js/pms.js | 17 +++-----
msg/js/pt-br.js | 17 +++-----
msg/js/pt.js | 17 +++-----
msg/js/ro.js | 17 +++-----
msg/js/ru.js | 17 +++-----
msg/js/sc.js | 17 +++-----
msg/js/sd.js | 17 +++-----
msg/js/shn.js | 17 +++-----
msg/js/sk.js | 17 +++-----
msg/js/sl.js | 17 +++-----
msg/js/sq.js | 17 +++-----
msg/js/sr.js | 17 +++-----
msg/js/sv.js | 17 +++-----
msg/js/ta.js | 17 +++-----
msg/js/tcy.js | 17 +++-----
msg/js/th.js | 17 +++-----
msg/js/tl.js | 17 +++-----
msg/js/tlh.js | 17 +++-----
msg/js/tr.js | 17 +++-----
msg/js/uk.js | 17 +++-----
msg/js/vi.js | 17 +++-----
msg/js/zh-hans.js | 17 +++-----
msg/js/zh-hant.js | 17 +++-----
msg/json/ar.json | 17 +++-----
msg/json/az.json | 17 +++-----
msg/json/bcc.json | 17 +++-----
msg/json/be-tarask.json | 17 +++-----
msg/json/bg.json | 17 +++-----
msg/json/br.json | 17 +++-----
msg/json/ca.json | 17 +++-----
msg/json/cs.json | 17 +++-----
msg/json/da.json | 17 +++-----
msg/json/de.json | 19 ++++----
msg/json/el.json | 17 +++-----
msg/json/en.json | 17 +++-----
msg/json/es.json | 17 +++-----
msg/json/fa.json | 17 +++-----
msg/json/fi.json | 17 +++-----
msg/json/fr.json | 17 +++-----
msg/json/he.json | 17 +++-----
msg/json/hi.json | 8 ++--
msg/json/hrx.json | 17 +++-----
msg/json/hu.json | 17 +++-----
msg/json/ia.json | 17 +++-----
msg/json/id.json | 17 +++-----
msg/json/is.json | 17 +++-----
msg/json/it.json | 17 +++-----
msg/json/ja.json | 17 +++-----
msg/json/ko.json | 17 +++-----
msg/json/lki.json | 19 +++-----
msg/json/ms.json | 17 +++-----
msg/json/nb.json | 17 +++-----
msg/json/nl.json | 17 +++-----
msg/json/pl.json | 17 +++-----
msg/json/pms.json | 17 +++-----
msg/json/pt-br.json | 17 +++-----
msg/json/pt.json | 17 +++-----
msg/json/qqq.json | 17 +++-----
msg/json/ro.json | 17 +++-----
msg/json/ru.json | 17 +++-----
msg/json/sc.json | 17 +++-----
msg/json/sk.json | 17 +++-----
msg/json/sl.json | 17 +++-----
msg/json/sq.json | 17 +++-----
msg/json/sr.json | 17 +++-----
msg/json/sv.json | 17 +++-----
msg/json/ta.json | 17 +++-----
msg/json/tcy.json | 17 +++-----
msg/json/th.json | 17 +++-----
msg/json/tl.json | 17 +++-----
msg/json/tr.json | 17 +++-----
msg/json/uk.json | 17 +++-----
msg/json/vi.json | 17 +++-----
msg/json/zh-hans.json | 17 +++-----
msg/json/zh-hant.json | 17 +++-----
msg/messages.js | 43 +++++++-----------
117 files changed, 931 insertions(+), 1194 deletions(-)
diff --git a/blocks/lists.js b/blocks/lists.js
index 7662209f7..0d23db05f 100644
--- a/blocks/lists.js
+++ b/blocks/lists.js
@@ -345,9 +345,58 @@ Blockly.Blocks['lists_getIndex'] = {
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
- var combo = thisBlock.getFieldValue('MODE') + '_' +
- thisBlock.getFieldValue('WHERE');
- return Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_' + combo];
+ var mode = thisBlock.getFieldValue('MODE');
+ var where = thisBlock.getFieldValue('WHERE');
+ var tooltip = '';
+ switch (mode + ' ' + where) {
+ case 'GET FROM_START':
+ case 'GET FROM_END':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;
+ break;
+ case 'GET FIRST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST;
+ break;
+ case 'GET LAST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST;
+ break;
+ case 'GET RANDOM':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;
+ break;
+ case 'GET_REMOVE FROM_START':
+ case 'GET_REMOVE FROM_END':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;
+ break;
+ case 'GET_REMOVE FIRST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST;
+ break;
+ case 'GET_REMOVE LAST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST;
+ break;
+ case 'GET_REMOVE RANDOM':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM;
+ break;
+ case 'REMOVE FROM_START':
+ case 'REMOVE FROM_END':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM;
+ break;
+ case 'REMOVE FIRST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST;
+ break;
+ case 'REMOVE LAST':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST;
+ break;
+ case 'REMOVE RANDOM':
+ tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM;
+ break;
+ }
+ if (where == 'FROM_START') {
+ tooltip += ' ' + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP
+ .replace('%1', Blockly.Blocks.ONE_BASED_INDEXING ? '#1' : '#0');
+ } else if (where == 'FROM_END') {
+ tooltip += ' ' + Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP
+ .replace('%1', '#1'); // The end is always 1-indexed.
+ }
+ return tooltip;
});
},
/**
@@ -472,9 +521,45 @@ Blockly.Blocks['lists_setIndex'] = {
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
- var combo = thisBlock.getFieldValue('MODE') + '_' +
- thisBlock.getFieldValue('WHERE');
- return Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_' + combo];
+ var mode = thisBlock.getFieldValue('MODE');
+ var where = thisBlock.getFieldValue('WHERE');
+ var tooltip = '';
+ switch (mode + ' ' + where) {
+ case 'SET FROM_START':
+ case 'SET FROM_END':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM;
+ break;
+ case 'SET FIRST':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST;
+ break;
+ case 'SET LAST':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST;
+ break;
+ case 'SET RANDOM':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM;
+ break;
+ case 'INSERT FROM_START':
+ case 'INSERT FROM_END':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM;
+ break;
+ case 'INSERT FIRST':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST;
+ break;
+ case 'INSERT LAST':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST;
+ break;
+ case 'INSERT RANDOM':
+ tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM;
+ break;
+ }
+ if (where == 'FROM_START') {
+ tooltip += ' ' + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP
+ .replace('%1', Blockly.Blocks.ONE_BASED_INDEXING ? '#1' : '#0');
+ } else if (where == 'FROM_END') {
+ tooltip += ' ' + Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP
+ .replace('%1', '#1'); // The end is always 1-indexed.
+ }
+ return tooltip;
});
},
/**
diff --git a/blocks_compressed.js b/blocks_compressed.js
index ac90b8c71..b4f2cd6d1 100644
--- a/blocks_compressed.js
+++ b/blocks_compressed.js
@@ -10,7 +10,7 @@ this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_RGB_TOOLTIP)}};
Blockly.Blocks.colour_blend={init:function(){this.setHelpUrl(Blockly.Msg.COLOUR_BLEND_HELPURL);this.setColour(Blockly.Blocks.colour.HUE);this.appendValueInput("COLOUR1").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_TITLE).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR1);this.appendValueInput("COLOUR2").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR2);this.appendValueInput("RATIO").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_RATIO);
this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_BLEND_TOOLTIP)}};Blockly.Blocks.lists={};Blockly.Blocks.lists.HUE=260;Blockly.Blocks.lists_create_empty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_CREATE_EMPTY_TITLE,output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL})}};
Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.itemCount_=3;this.updateShape_();this.setOutput(!0,"Array");this.setMutator(new Blockly.Mutator(["lists_create_with_item"]));this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"),
-10);this.updateShape_()},decompose:function(a){var b=a.newBlock("lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,d=0;d","LT"],["\u2265","LTE"],["<","GT"],["\u2264","GTE"]],b=[["=","EQ"],["\u2260","NEQ"],["<","LT"],["\u2264","LTE"],[">","GT"],["\u2265","GTE"]],a=this.RTL?a:b;this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A");this.appendValueInput("B").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var c=this;this.setTooltip(function(){var a=
c.getFieldValue("OP");return{EQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,NEQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,LT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,LTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,GT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,GTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE}[a]});this.prevBlocks_=[null,null]},onchange:function(a){var b=this.getInputTargetBlock("A"),c=this.getInputTargetBlock("B");if(b&&c&&!b.outputConnection.checkType_(c.outputConnection)){Blockly.Events.setGroup(a.group);for(a=0;a<
-this.prevBlocks_.length;a++){var d=this.prevBlocks_[a];if(d===b||d===c)d.unplug(),d.bumpNeighbours_()}Blockly.Events.setGroup(!1)}this.prevBlocks_[0]=b;this.prevBlocks_[1]=c}};
+this.prevBlocks_.length;a++){var e=this.prevBlocks_[a];if(e===b||e===c)e.unplug(),e.bumpNeighbours_()}Blockly.Events.setGroup(!1)}this.prevBlocks_[0]=b;this.prevBlocks_[1]=c}};
Blockly.Blocks.logic_operation={init:function(){var a=[[Blockly.Msg.LOGIC_OPERATION_AND,"AND"],[Blockly.Msg.LOGIC_OPERATION_OR,"OR"]];this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A").setCheck("Boolean");this.appendValueInput("B").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("OP");return{AND:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND,
OR:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR}[a]})}};Blockly.Blocks.logic_negate={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NEGATE_TITLE,args0:[{type:"input_value",name:"BOOL",check:"Boolean"}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NEGATE_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NEGATE_HELPURL})}};
Blockly.Blocks.logic_boolean={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_dropdown",name:"BOOL",options:[[Blockly.Msg.LOGIC_BOOLEAN_TRUE,"TRUE"],[Blockly.Msg.LOGIC_BOOLEAN_FALSE,"FALSE"]]}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_BOOLEAN_HELPURL})}};
Blockly.Blocks.logic_null={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NULL,output:null,colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NULL_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NULL_HELPURL})}};
Blockly.Blocks.logic_ternary={init:function(){this.setHelpUrl(Blockly.Msg.LOGIC_TERNARY_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.appendValueInput("IF").setCheck("Boolean").appendField(Blockly.Msg.LOGIC_TERNARY_CONDITION);this.appendValueInput("THEN").appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE);this.appendValueInput("ELSE").appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE);this.setOutput(!0);this.setTooltip(Blockly.Msg.LOGIC_TERNARY_TOOLTIP);this.prevParentConnection_=null},onchange:function(a){var b=
-this.getInputTargetBlock("THEN"),c=this.getInputTargetBlock("ELSE"),d=this.outputConnection.targetConnection;if((b||c)&&d)for(var e=0;2>e;e++){var f=1==e?b:c;f&&!f.outputConnection.checkType_(d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours_()):(f.unplug(),f.bumpNeighbours_()),Blockly.Events.setGroup(!1))}this.prevParentConnection_=d}};Blockly.Blocks.loops={};Blockly.Blocks.loops.HUE=120;Blockly.Blocks.controls_repeat_ext={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"input_value",name:"TIMES",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}};
+this.getInputTargetBlock("THEN"),c=this.getInputTargetBlock("ELSE"),e=this.outputConnection.targetConnection;if((b||c)&&e)for(var d=0;2>d;d++){var f=1==d?b:c;f&&!f.outputConnection.checkType_(e)&&(Blockly.Events.setGroup(a.group),e===this.prevParentConnection_?(this.unplug(),e.getSourceBlock().bumpNeighbours_()):(f.unplug(),f.bumpNeighbours_()),Blockly.Events.setGroup(!1))}this.prevParentConnection_=e}};Blockly.Blocks.loops={};Blockly.Blocks.loops.HUE=120;Blockly.Blocks.controls_repeat_ext={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"input_value",name:"TIMES",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}};
Blockly.Blocks.controls_repeat={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"field_number",name:"TIMES",value:10,min:0,precision:1}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}};
Blockly.Blocks.controls_whileUntil={init:function(){var a=[[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE,"WHILE"],[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL,"UNTIL"]];this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL);this.setColour(Blockly.Blocks.loops.HUE);this.appendValueInput("BOOL").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"MODE");this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO);this.setPreviousStatement(!0);this.setNextStatement(!0);
var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE");return{WHILE:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,UNTIL:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}[a]})}};
@@ -86,26 +90,26 @@ Blockly.Blocks.math_random_float={init:function(){this.jsonInit({message0:Blockl
Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);this.setColour(Blockly.Blocks.procedures.HUE);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c=0;c<
this.arguments_.length;c++){if(b["arg_"+this.arguments_[c].toLowerCase()]){a=!0;break}b["arg_"+this.arguments_[c].toLowerCase()]=!0}a?this.setWarningText(Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING):this.setWarningText(null);a="";this.arguments_.length&&(a=Blockly.Msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", "));Blockly.Events.disable();try{this.setFieldValue(a,"PARAMS")}finally{Blockly.Events.enable()}},mutationToDom:function(a){var b=document.createElement("mutation");a&&b.setAttribute("name",
-this.getFieldValue("NAME"));for(var c=0;c
Date: Sat, 9 Jul 2016 11:46:54 -0700
Subject: [PATCH 15/25] Fix highlight being eclipsed by other blocks.
---
core/block_svg.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/core/block_svg.js b/core/block_svg.js
index cfae29027..af19bb4a1 100644
--- a/core/block_svg.js
+++ b/core/block_svg.js
@@ -1413,7 +1413,12 @@ Blockly.BlockSvg.prototype.addSelect = function() {
Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_),
'blocklySelected');
// Move the selected block to the top of the stack.
- this.svgGroup_.parentNode.appendChild(this.svgGroup_);
+ var block = this;
+ do {
+ var root = block.getSvgRoot();
+ root.parentNode.appendChild(root);
+ block = block.getParent();
+ } while (block);
};
/**
From efc2ca3d8289331a53b2028fc0c080ecb1e98547 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Sun, 10 Jul 2016 22:54:57 -0700
Subject: [PATCH 16/25] Add field_number to Block Factory.
---
core/field_number.js | 1 +
demos/blockfactory/blocks.js | 26 +++++++++++++++++++
demos/blockfactory/factory.js | 48 +++++++++++++++++++++++++++++++++--
demos/blockfactory/index.html | 1 +
4 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/core/field_number.js b/core/field_number.js
index b580d737a..cd773cb87 100644
--- a/core/field_number.js
+++ b/core/field_number.js
@@ -44,6 +44,7 @@ goog.require('goog.math');
*/
Blockly.FieldNumber =
function(value, opt_min, opt_max, opt_precision, opt_validator) {
+ value = String(value);
Blockly.FieldNumber.superClass_.constructor.call(this, value, opt_validator);
this.setConstraints(opt_min, opt_max, opt_precision);
};
diff --git a/demos/blockfactory/blocks.js b/demos/blockfactory/blocks.js
index 012c76fe0..db14b1d90 100644
--- a/demos/blockfactory/blocks.js
+++ b/demos/blockfactory/blocks.js
@@ -243,6 +243,32 @@ Blockly.Blocks['field_input'] = {
}
};
+Blockly.Blocks['field_number'] = {
+ // Numeric input.
+ init: function() {
+ this.setColour(160);
+ this.appendDummyInput()
+ .appendField('numeric input')
+ .appendField(new Blockly.FieldNumber(0), 'VALUE')
+ .appendField(',')
+ .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME');
+ this.appendDummyInput()
+ .appendField('min')
+ .appendField(new Blockly.FieldNumber(-Infinity), 'MIN')
+ .appendField('max')
+ .appendField(new Blockly.FieldNumber(Infinity), 'MAX')
+ .appendField('precision')
+ .appendField(new Blockly.FieldNumber(0, 0), 'PRECISION');
+ this.setPreviousStatement(true, 'Field');
+ this.setNextStatement(true, 'Field');
+ this.setTooltip('An input field for the user to enter a number.');
+ this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=319');
+ },
+ onchange: function() {
+ fieldNameCheck(this);
+ }
+};
+
Blockly.Blocks['field_angle'] = {
// Angle input.
init: function() {
diff --git a/demos/blockfactory/factory.js b/demos/blockfactory/factory.js
index 1bfdf6ce9..4af5ff28a 100644
--- a/demos/blockfactory/factory.js
+++ b/demos/blockfactory/factory.js
@@ -309,10 +309,31 @@ function getFieldsJs_(block) {
escapeString(block.getFieldValue('TEXT')) + '), ' +
escapeString(block.getFieldValue('FIELDNAME')));
break;
+ case 'field_number':
+ // Result: new Blockly.FieldNumber(10, 0, 100, 1), 'NUMBER'
+ var args = [
+ Number(block.getFieldValue('VALUE')),
+ Number(block.getFieldValue('MIN')),
+ Number(block.getFieldValue('MAX')),
+ Number(block.getFieldValue('PRECISION'))
+ ];
+ // Remove any trailing arguments that aren't needed.
+ if (args[3] == 0) {
+ args.pop();
+ if (args[2] == Infinity) {
+ args.pop();
+ if (args[1] == -Infinity) {
+ args.pop();
+ }
+ }
+ }
+ fields.push('new Blockly.FieldNumber(' + args.join(', ') + '), ' +
+ escapeString(block.getFieldValue('FIELDNAME')));
+ break;
case 'field_angle':
// Result: new Blockly.FieldAngle(90), 'ANGLE'
fields.push('new Blockly.FieldAngle(' +
- parseFloat(block.getFieldValue('ANGLE')) + '), ' +
+ Number(block.getFieldValue('ANGLE')) + '), ' +
escapeString(block.getFieldValue('FIELDNAME')));
break;
case 'field_checkbox':
@@ -354,7 +375,7 @@ function getFieldsJs_(block) {
}
break;
case 'field_image':
- // Result: new Blockly.FieldImage('http://...', 80, 60)
+ // Result: new Blockly.FieldImage('http://...', 80, 60, '*')
var src = escapeString(block.getFieldValue('SRC'));
var width = Number(block.getFieldValue('WIDTH'));
var height = Number(block.getFieldValue('HEIGHT'));
@@ -391,6 +412,26 @@ function getFieldsJson_(block) {
text: block.getFieldValue('TEXT')
});
break;
+ case 'field_number':
+ var obj = {
+ type: block.type,
+ name: block.getFieldValue('FIELDNAME'),
+ value: parseFloat(block.getFieldValue('VALUE'))
+ };
+ var min = parseFloat(block.getFieldValue('MIN'));
+ if (min > -Infinity) {
+ obj.min = min;
+ }
+ var max = parseFloat(block.getFieldValue('MAX'));
+ if (max < Infinity) {
+ obj.max = max;
+ }
+ var precision = parseFloat(block.getFieldValue('PRECISION'));
+ if (precision) {
+ obj.precision = precision;
+ }
+ fields.push(obj);
+ break;
case 'field_angle':
fields.push({
type: block.type,
@@ -562,6 +603,9 @@ function updateGenerator(block) {
} else if (field instanceof Blockly.FieldDropdown) {
code.push(makeVar('dropdown', name) +
" = block.getFieldValue('" + name + "');");
+ } else if (field instanceof Blockly.FieldNumber) {
+ code.push(makeVar('number', name) +
+ " = block.getFieldValue('" + name + "');");
} else if (field instanceof Blockly.FieldTextInput) {
code.push(makeVar('text', name) +
" = block.getFieldValue('" + name + "');");
diff --git a/demos/blockfactory/index.html b/demos/blockfactory/index.html
index 0377bc587..ce87f88f8 100644
--- a/demos/blockfactory/index.html
+++ b/demos/blockfactory/index.html
@@ -192,6 +192,7 @@
+
From c9437ec7c473e96178535076fe848f1ad1727645 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niklas=20Laxstr=C3=B6m?=
Date: Mon, 11 Jul 2016 08:37:32 +0200
Subject: [PATCH 17/25] Localisation updates from https://translatewiki.net.
---
msg/json/br.json | 10 ++++++++++
msg/json/fi.json | 6 +++---
msg/json/fr.json | 2 +-
msg/json/hi.json | 4 +---
msg/json/lki.json | 2 ++
msg/json/sv.json | 2 +-
msg/json/ta.json | 1 +
msg/json/zh-hans.json | 2 +-
8 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/msg/json/br.json b/msg/json/br.json
index fec13abb6..047b31b20 100644
--- a/msg/json/br.json
+++ b/msg/json/br.json
@@ -24,6 +24,8 @@
"DISABLE_BLOCK": "Diweredekaat ar bloc'h",
"ENABLE_BLOCK": "Gweredekaat ar bloc'h",
"HELP": "Skoazell",
+ "UNDO": "Dizober",
+ "REDO": "Adober",
"CHANGE_VALUE_TITLE": "Kemmañ an dalvoudenn :",
"NEW_VARIABLE": "Argemmenn nevez...",
"NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :",
@@ -266,6 +268,14 @@
"LISTS_GET_SUBLIST_END_FROM_END": "betek # adalek an dibenn",
"LISTS_GET_SUBLIST_END_LAST": "betek ar fin",
"LISTS_GET_SUBLIST_TOOLTIP": "Krouiñ un eilad eus lodenn spisaet ul listenn.",
+ "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with",
+ "LISTS_SORT_TITLE": "Rummañ%1,%2,%3",
+ "LISTS_SORT_TOOLTIP": "Rummañ un eilenn eus ar roll",
+ "LISTS_SORT_ORDER_ASCENDING": "war gresk",
+ "LISTS_SORT_ORDER_DESCENDING": "war zigresk",
+ "LISTS_SORT_TYPE_NUMERIC": "niverel",
+ "LISTS_SORT_TYPE_TEXT": "Dre urzh al lizherenneg",
+ "LISTS_SORT_TYPE_IGNORECASE": "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg",
"LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists",
"LISTS_SPLIT_LIST_FROM_TEXT": "Krouiñ ul listenn diwar an destenn",
"LISTS_SPLIT_TEXT_FROM_LIST": "Krouiñ un destenn diwar al listenn",
diff --git a/msg/json/fi.json b/msg/json/fi.json
index 5c65e5004..132c1bb7e 100644
--- a/msg/json/fi.json
+++ b/msg/json/fi.json
@@ -260,7 +260,7 @@
"LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Palauta ensimmäinen kohde listalta.",
"LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Palauttaa listan viimeisen kohteen.",
"LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Palauttaa satunnaisen kohteen listalta.",
- "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Poistaa ja palauttaa kohteen annetusta kohden listaa.",
+ "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Poistaa ja palauttaa kohteen listan annetusta kohdasta.",
"LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Poistaa ja palauttaa ensimmäisen kohteen listalta.",
"LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Poistaa ja palauttaa viimeisen kohteen listalta.",
"LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Poistaa ja palauttaa satunnaisen kohteen listalta.",
@@ -271,11 +271,11 @@
"LISTS_SET_INDEX_SET": "aseta",
"LISTS_SET_INDEX_INSERT": "lisää kohtaan",
"LISTS_SET_INDEX_INPUT_TO": "kohteeksi",
- "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Asettaa kohteen määrättyyn kohtaa listassa.",
+ "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Asettaa kohteen annettuun kohtaan listassa.",
"LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asettaa listan ensimmäisen kohteen.",
"LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asettaa listan viimeisen kohteen.",
"LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asettaa satunnaisen kohteen listassa.",
- "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisää kohteen listan annettuun kohtaan.",
+ "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisää kohteen annettuun kohtaan listassa.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisää kohteen listan kärkeen.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisää kohteen listan loppuun.",
"LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisää kohteen satunnaiseen kohtaan listassa.",
diff --git a/msg/json/fr.json b/msg/json/fr.json
index 6c0dccc01..b826f36bc 100644
--- a/msg/json/fr.json
+++ b/msg/json/fr.json
@@ -262,7 +262,7 @@
"LISTS_SET_INDEX_SET": "mettre",
"LISTS_SET_INDEX_INSERT": "insérer en",
"LISTS_SET_INDEX_INPUT_TO": "comme",
- "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Fixe l’élément à la position indiquée dans une liste.",
+ "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Met à jour l’élément à la position indiquée dans une liste.",
"LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Fixe le premier élément dans une liste.",
"LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Fixe le dernier élément dans une liste.",
"LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Fixe un élément au hasard dans une liste.",
diff --git a/msg/json/hi.json b/msg/json/hi.json
index c948f3c17..c7486bff5 100644
--- a/msg/json/hi.json
+++ b/msg/json/hi.json
@@ -203,11 +203,9 @@
"LISTS_GET_INDEX_GET_REMOVE": "प्राप्त करे और हटाए",
"LISTS_GET_INDEX_REMOVE": "निकालें",
"LISTS_GET_INDEX_FROM_END": "अंत से #",
- "LISTS_GET_INDEX_FIRST": "पहला",
- "LISTS_GET_INDEX_LAST": "आखिरी",
- "LISTS_GET_INDEX_RANDOM": "रैन्डम",
"LISTS_GET_INDEX_FIRST": "%1 पहला आइटम है।",
"LISTS_GET_INDEX_LAST": "%1 आखरी आइटम है।",
+ "LISTS_GET_INDEX_RANDOM": "रैन्डम",
"LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "सूची का पहला आइटम रिटर्न करता है।",
"LISTS_GET_INDEX_TOOLTIP_GET_LAST": "सूची का आखरी आइटम रिटर्न करता है।",
"LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "सूची से रैन्डम आइटम रिटर्न करता है।",
diff --git a/msg/json/lki.json b/msg/json/lki.json
index 4b9e3c3c5..6f7f92349 100644
--- a/msg/json/lki.json
+++ b/msg/json/lki.json
@@ -267,6 +267,8 @@
"LISTS_SPLIT_LIST_FROM_TEXT": "ساخت لیست إژ متن",
"LISTS_SPLIT_TEXT_FROM_LIST": "ساخت متن إژ لیست",
"LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز",
+ "LISTS_SPLIT_TOOLTIP_SPLIT": "Split text into a list of texts, breaking at each delimiter.",
+ "LISTS_SPLIT_TOOLTIP_JOIN": "Join a list of texts into one text, separated by a delimiter.",
"VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر میگرداند.",
"VARIABLES_GET_CREATE_SET": "درستکردن «تنظیم %1»",
"VARIABLES_SET": "مجموعه %1 به %2",
diff --git a/msg/json/sv.json b/msg/json/sv.json
index 6bff192e4..a9de875cb 100644
--- a/msg/json/sv.json
+++ b/msg/json/sv.json
@@ -246,7 +246,7 @@
"LISTS_INLIST": "i listan",
"LISTS_INDEX_OF_FIRST": "hitta första förekomsten av objektet",
"LISTS_INDEX_OF_LAST": "hitta sista förekomsten av objektet",
- "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka %1 om objektet inte hittas.",
+ "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Returnerar %1 om objektet inte hittas.",
"LISTS_GET_INDEX_GET": "hämta",
"LISTS_GET_INDEX_GET_REMOVE": "hämta och ta bort",
"LISTS_GET_INDEX_REMOVE": "ta bort",
diff --git a/msg/json/ta.json b/msg/json/ta.json
index bddb09675..58b755a6d 100644
--- a/msg/json/ta.json
+++ b/msg/json/ta.json
@@ -176,6 +176,7 @@
"TEXT_LENGTH_TOOLTIP": "தொடரில் உள்ள எழுத்துக்களின் (இடைவெளிகளையும் சேர்த்து) எண்ணிகையை பின்கொடு.",
"TEXT_ISEMPTY_TITLE": "%1 காலியானது",
"TEXT_ISEMPTY_TOOLTIP": "காலியானது என்றால் மெய் மதிப்பை பின்கொடு",
+ "TEXT_INDEXOF_TOOLTIP": "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.",
"TEXT_INDEXOF_INPUT_INTEXT": "உரையில்",
"TEXT_INDEXOF_OPERATOR_FIRST": "உரையில் முதல் தோற்ற இடத்தை பின்கொடு",
"TEXT_INDEXOF_OPERATOR_LAST": "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு",
diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json
index 739e71478..33f576791 100644
--- a/msg/json/zh-hans.json
+++ b/msg/json/zh-hans.json
@@ -186,7 +186,7 @@
"TEXT_LENGTH_TOOLTIP": "返回提供文本的字母数(包括空格)。",
"TEXT_ISEMPTY_TITLE": "%1是空的",
"TEXT_ISEMPTY_TOOLTIP": "如果提供的文本为空,则返回真。",
- "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 %1。",
+ "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回%1。",
"TEXT_INDEXOF_INPUT_INTEXT": "自文本",
"TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一个出现的文本",
"TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一个出现的文本",
From ab03c4f411515844fe0fd58adcf5f5b43fb6095c Mon Sep 17 00:00:00 2001
From: Rodrigo Queiro
Date: Tue, 12 Jul 2016 01:43:29 +0200
Subject: [PATCH 18/25] Remove out-of-date comment (#474)
This comment made sense [before multiple workspace support](https://github.com/google/blockly/blob/67140282a08b10d0beb8d842a2dc35beadc5d5e0/core/blockly.js#L297), where it was near a (Blockly.readOnly || isTargetSvg) check. Now, this logic is implemented in BlockSvg.onMouseDown_() instead.
---
core/workspace_svg.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/core/workspace_svg.js b/core/workspace_svg.js
index 4c2d85661..9d4cab477 100644
--- a/core/workspace_svg.js
+++ b/core/workspace_svg.js
@@ -656,8 +656,6 @@ Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) {
// Right-click.
this.showContextMenu_(e);
} else if (this.scrollbar) {
- // If the workspace is editable, only allow scrolling when gripping empty
- // space. Otherwise, allow scrolling when gripping anywhere.
this.isScrolling = true;
// Record the current mouse position.
this.startDragMouseX = e.clientX;
From 612e0c0aac36294accbe2f4e0f5a38b880d0c094 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Mon, 11 Jul 2016 16:58:56 -0700
Subject: [PATCH 19/25] Reverting three invalid translations.
---
msg/json/lki.json | 2 --
msg/json/ta.json | 1 -
2 files changed, 3 deletions(-)
diff --git a/msg/json/lki.json b/msg/json/lki.json
index 6f7f92349..4b9e3c3c5 100644
--- a/msg/json/lki.json
+++ b/msg/json/lki.json
@@ -267,8 +267,6 @@
"LISTS_SPLIT_LIST_FROM_TEXT": "ساخت لیست إژ متن",
"LISTS_SPLIT_TEXT_FROM_LIST": "ساخت متن إژ لیست",
"LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز",
- "LISTS_SPLIT_TOOLTIP_SPLIT": "Split text into a list of texts, breaking at each delimiter.",
- "LISTS_SPLIT_TOOLTIP_JOIN": "Join a list of texts into one text, separated by a delimiter.",
"VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر میگرداند.",
"VARIABLES_GET_CREATE_SET": "درستکردن «تنظیم %1»",
"VARIABLES_SET": "مجموعه %1 به %2",
diff --git a/msg/json/ta.json b/msg/json/ta.json
index 58b755a6d..bddb09675 100644
--- a/msg/json/ta.json
+++ b/msg/json/ta.json
@@ -176,7 +176,6 @@
"TEXT_LENGTH_TOOLTIP": "தொடரில் உள்ள எழுத்துக்களின் (இடைவெளிகளையும் சேர்த்து) எண்ணிகையை பின்கொடு.",
"TEXT_ISEMPTY_TITLE": "%1 காலியானது",
"TEXT_ISEMPTY_TOOLTIP": "காலியானது என்றால் மெய் மதிப்பை பின்கொடு",
- "TEXT_INDEXOF_TOOLTIP": "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.",
"TEXT_INDEXOF_INPUT_INTEXT": "உரையில்",
"TEXT_INDEXOF_OPERATOR_FIRST": "உரையில் முதல் தோற்ற இடத்தை பின்கொடு",
"TEXT_INDEXOF_OPERATOR_LAST": "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு",
From 823bf3c5da91d595a49665ee335bba97241c9c03 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Tue, 12 Jul 2016 11:24:39 -0700
Subject: [PATCH 20/25] Allow substituted strings in interpolation.
---
core/block.js | 112 ++++++++++++++++++++++++++------------------------
1 file changed, 58 insertions(+), 54 deletions(-)
diff --git a/core/block.js b/core/block.js
index d4640f275..beb411a9d 100644
--- a/core/block.js
+++ b/core/block.js
@@ -1074,61 +1074,65 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) {
var input = null;
do {
var altRepeat = false;
- switch (element['type']) {
- case 'input_value':
- input = this.appendValueInput(element['name']);
- break;
- case 'input_statement':
- input = this.appendStatementInput(element['name']);
- break;
- case 'input_dummy':
- input = this.appendDummyInput(element['name']);
- break;
- case 'field_label':
- field = new Blockly.FieldLabel(element['text'], element['class']);
- break;
- case 'field_input':
- field = new Blockly.FieldTextInput(element['text']);
- if (typeof element['spellcheck'] == 'boolean') {
- field.setSpellcheck(element['spellcheck']);
- }
- break;
- case 'field_angle':
- field = new Blockly.FieldAngle(element['angle']);
- break;
- case 'field_checkbox':
- field = new Blockly.FieldCheckbox(
- element['checked'] ? 'TRUE' : 'FALSE');
- break;
- case 'field_colour':
- field = new Blockly.FieldColour(element['colour']);
- break;
- case 'field_variable':
- field = new Blockly.FieldVariable(element['variable']);
- break;
- case 'field_dropdown':
- field = new Blockly.FieldDropdown(element['options']);
- break;
- case 'field_image':
- field = new Blockly.FieldImage(element['src'],
- element['width'], element['height'], element['alt']);
- break;
- case 'field_number':
- field = new Blockly.FieldNumber(element['value'],
- element['min'], element['max'], element['precision']);
- break;
- case 'field_date':
- if (Blockly.FieldDate) {
- field = new Blockly.FieldDate(element['date']);
+ if (typeof element == 'string') {
+ field = new Blockly.FieldLabel(element);
+ } else {
+ switch (element['type']) {
+ case 'input_value':
+ input = this.appendValueInput(element['name']);
break;
- }
- // Fall through if FieldDate is not compiled in.
- default:
- // Unknown field.
- if (element['alt']) {
- element = element['alt'];
- altRepeat = true;
- }
+ case 'input_statement':
+ input = this.appendStatementInput(element['name']);
+ break;
+ case 'input_dummy':
+ input = this.appendDummyInput(element['name']);
+ break;
+ case 'field_label':
+ field = new Blockly.FieldLabel(element['text'], element['class']);
+ break;
+ case 'field_input':
+ field = new Blockly.FieldTextInput(element['text']);
+ if (typeof element['spellcheck'] == 'boolean') {
+ field.setSpellcheck(element['spellcheck']);
+ }
+ break;
+ case 'field_angle':
+ field = new Blockly.FieldAngle(element['angle']);
+ break;
+ case 'field_checkbox':
+ field = new Blockly.FieldCheckbox(
+ element['checked'] ? 'TRUE' : 'FALSE');
+ break;
+ case 'field_colour':
+ field = new Blockly.FieldColour(element['colour']);
+ break;
+ case 'field_variable':
+ field = new Blockly.FieldVariable(element['variable']);
+ break;
+ case 'field_dropdown':
+ field = new Blockly.FieldDropdown(element['options']);
+ break;
+ case 'field_image':
+ field = new Blockly.FieldImage(element['src'],
+ element['width'], element['height'], element['alt']);
+ break;
+ case 'field_number':
+ field = new Blockly.FieldNumber(element['value'],
+ element['min'], element['max'], element['precision']);
+ break;
+ case 'field_date':
+ if (Blockly.FieldDate) {
+ field = new Blockly.FieldDate(element['date']);
+ break;
+ }
+ // Fall through if FieldDate is not compiled in.
+ default:
+ // Unknown field.
+ if (element['alt']) {
+ element = element['alt'];
+ altRepeat = true;
+ }
+ }
}
} while (altRepeat);
if (field) {
From d3d0ca4fd07f4fe5949605989e469de23ebce72a Mon Sep 17 00:00:00 2001
From: Rodrigo Queiro
Date: Tue, 12 Jul 2016 20:34:02 +0200
Subject: [PATCH 21/25] Record whether the workspace has been dragged (#475)
* Record whether the workspace has been dragged
This fixes #473 by differentiating between a touch on an unmovable block
and using it to drag the workspace.
* Remove isScrolling and add DRAG_BEGIN
Applied after PR review.
---
core/blockly.js | 11 ++++++-----
core/constants.js | 9 ++++++++-
core/flyout.js | 6 +++---
core/workspace_svg.js | 12 ++++++++----
4 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/core/blockly.js b/core/blockly.js
index 029f83d2e..c01e94a25 100644
--- a/core/blockly.js
+++ b/core/blockly.js
@@ -106,9 +106,9 @@ Blockly.clipboardSource_ = null;
/**
* Is the mouse dragging a block?
- * 0 - No drag operation.
- * 1 - Still inside the sticky DRAG_RADIUS.
- * 2 - Freely draggable.
+ * DRAG_NONE - No drag operation.
+ * DRAG_STICKY - Still inside the sticky DRAG_RADIUS.
+ * DRAG_FREE - Freely draggable.
* @private
*/
Blockly.dragMode_ = Blockly.DRAG_NONE;
@@ -190,7 +190,7 @@ Blockly.svgResize = function(workspace) {
Blockly.onMouseUp_ = function(e) {
var workspace = Blockly.getMainWorkspace();
Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN);
- workspace.isScrolling = false;
+ workspace.dragMode_ = Blockly.DRAG_NONE;
// Unbind the touch event if it exists.
if (Blockly.onTouchUpWrapper_) {
Blockly.unbindEvent_(Blockly.onTouchUpWrapper_);
@@ -212,7 +212,7 @@ Blockly.onMouseMove_ = function(e) {
return; // Multi-touch gestures won't have e.clientX.
}
var workspace = Blockly.getMainWorkspace();
- if (workspace.isScrolling) {
+ if (workspace.dragMode_ != Blockly.DRAG_NONE) {
var dx = e.clientX - workspace.startDragMouseX;
var dy = e.clientY - workspace.startDragMouseY;
var metrics = workspace.startDragMetrics;
@@ -231,6 +231,7 @@ Blockly.onMouseMove_ = function(e) {
// Cancel the long-press if the drag has moved too far.
if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) {
Blockly.longStop_();
+ workspace.dragMode_ = Blockly.DRAG_FREE;
}
e.stopPropagation();
e.preventDefault();
diff --git a/core/constants.js b/core/constants.js
index f082905d5..0f327e2d9 100644
--- a/core/constants.js
+++ b/core/constants.js
@@ -154,7 +154,14 @@ Blockly.DRAG_NONE = 0;
Blockly.DRAG_STICKY = 1;
/**
- * ENUM for freely draggable.
+ * ENUM for inside the non-sticky DRAG_RADIUS, for differentiating between
+ * clicks and drags.
+ * @const
+ */
+Blockly.DRAG_BEGIN = 1;
+
+/**
+ * ENUM for freely draggable (outside the DRAG_RADIUS, if one applies).
* @const
*/
Blockly.DRAG_FREE = 2;
diff --git a/core/flyout.js b/core/flyout.js
index 94434ea2e..0647b7219 100644
--- a/core/flyout.js
+++ b/core/flyout.js
@@ -151,9 +151,9 @@ Blockly.Flyout.prototype.height_ = 0;
/**
* Is the flyout dragging (scrolling)?
- * 0 - DRAG_NONE - no drag is ongoing or state is undetermined.
- * 1 - DRAG_STICKY - still within the sticky drag radius.
- * 2 - DRAG_FREE - in scroll mode (never create a new block).
+ * DRAG_NONE - no drag is ongoing or state is undetermined.
+ * DRAG_STICKY - still within the sticky drag radius.
+ * DRAG_FREE - in scroll mode (never create a new block).
* @private
*/
Blockly.Flyout.prototype.dragMode_ = Blockly.DRAG_NONE;
diff --git a/core/workspace_svg.js b/core/workspace_svg.js
index 9d4cab477..b61c43742 100644
--- a/core/workspace_svg.js
+++ b/core/workspace_svg.js
@@ -84,9 +84,12 @@ Blockly.WorkspaceSvg.prototype.isFlyout = false;
/**
* Is this workspace currently being dragged around?
- * @type {boolean}
+ * DRAG_NONE - No drag operation.
+ * DRAG_BEGIN - Still inside the initial DRAG_RADIUS.
+ * DRAG_FREE - Workspace has been dragged further than DRAG_RADIUS.
+ * @private
*/
-Blockly.WorkspaceSvg.prototype.isScrolling = false;
+Blockly.WorkspaceSvg.prototype.dragMode_ = Blockly.DRAG_NONE;
/**
* Current horizontal scrolling offset.
@@ -656,7 +659,7 @@ Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) {
// Right-click.
this.showContextMenu_(e);
} else if (this.scrollbar) {
- this.isScrolling = true;
+ this.dragMode_ = Blockly.DRAG_BEGIN;
// Record the current mouse position.
this.startDragMouseX = e.clientX;
this.startDragMouseY = e.clientY;
@@ -716,7 +719,8 @@ Blockly.WorkspaceSvg.prototype.moveDrag = function(e) {
* @return {boolean} True if currently dragging or scrolling.
*/
Blockly.WorkspaceSvg.prototype.isDragging = function() {
- return Blockly.dragMode_ == Blockly.DRAG_FREE || this.isScrolling;
+ return Blockly.dragMode_ == Blockly.DRAG_FREE ||
+ this.dragMode_ == Blockly.DRAG_FREE;
};
/**
From f12c95f4a959881f81de7a47f7874e8450d5e7f1 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Tue, 12 Jul 2016 11:36:47 -0700
Subject: [PATCH 22/25] Routine recompile.
---
blockly_compressed.js | 44 ++++++++++++++++++++---------------------
blockly_uncompressed.js | 24 +++++++++++-----------
msg/js/br.js | 20 +++++++++----------
msg/js/fi.js | 6 +++---
msg/js/fr.js | 2 +-
msg/js/sv.js | 2 +-
msg/js/zh-hans.js | 2 +-
7 files changed, 49 insertions(+), 51 deletions(-)
diff --git a/blockly_compressed.js b/blockly_compressed.js
index 3a5ae9115..4fefd9d14 100644
--- a/blockly_compressed.js
+++ b/blockly_compressed.js
@@ -1016,9 +1016,9 @@ Blockly.ZoomControls.prototype.dispose=function(){this.svgGroup_&&(goog.dom.remo
Blockly.ZoomControls.prototype.position=function(){var a=this.workspace_.getMetrics();a&&(this.workspace_.RTL?(this.left_=this.MARGIN_SIDE_+Blockly.Scrollbar.scrollbarThickness,a.toolboxPosition==Blockly.TOOLBOX_AT_LEFT&&(this.left_+=a.flyoutWidth,this.workspace_.toolbox_&&(this.left_+=a.absoluteLeft))):(this.left_=a.viewWidth+a.absoluteLeft-this.WIDTH_-this.MARGIN_SIDE_-Blockly.Scrollbar.scrollbarThickness,a.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT&&(this.left_-=a.flyoutWidth)),this.top_=a.viewHeight+
a.absoluteTop-this.HEIGHT_-this.bottom_,a.toolboxPosition==Blockly.TOOLBOX_AT_BOTTOM&&(this.top_-=a.flyoutHeight),this.svgGroup_.setAttribute("transform","translate("+this.left_+","+this.top_+")"))};
// Copyright 2014 Google Inc. Apache License 2.0
-Blockly.WorkspaceSvg=function(a){Blockly.WorkspaceSvg.superClass_.constructor.call(this,a);this.getMetrics=a.getMetrics;this.setMetrics=a.setMetrics;Blockly.ConnectionDB.init(this);this.SOUNDS_=Object.create(null)};goog.inherits(Blockly.WorkspaceSvg,Blockly.Workspace);Blockly.WorkspaceSvg.prototype.resizeHandlerWrapper_=null;Blockly.WorkspaceSvg.prototype.rendered=!0;Blockly.WorkspaceSvg.prototype.isFlyout=!1;Blockly.WorkspaceSvg.prototype.isScrolling=!1;Blockly.WorkspaceSvg.prototype.scrollX=0;
-Blockly.WorkspaceSvg.prototype.scrollY=0;Blockly.WorkspaceSvg.prototype.startScrollX=0;Blockly.WorkspaceSvg.prototype.startScrollY=0;Blockly.WorkspaceSvg.prototype.dragDeltaXY_=null;Blockly.WorkspaceSvg.prototype.scale=1;Blockly.WorkspaceSvg.prototype.trashcan=null;Blockly.WorkspaceSvg.prototype.scrollbar=null;Blockly.WorkspaceSvg.prototype.lastSound_=null;Blockly.WorkspaceSvg.prototype.inverseScreenCTM_=null;Blockly.WorkspaceSvg.prototype.getInverseScreenCTM=function(){return this.inverseScreenCTM_};
-Blockly.WorkspaceSvg.prototype.updateInverseScreenCTM=function(){this.inverseScreenCTM_=this.getParentSvg().getScreenCTM().inverse()};Blockly.WorkspaceSvg.prototype.setResizeHandlerWrapper=function(a){this.resizeHandlerWrapper_=a};
+Blockly.WorkspaceSvg=function(a){Blockly.WorkspaceSvg.superClass_.constructor.call(this,a);this.getMetrics=a.getMetrics;this.setMetrics=a.setMetrics;Blockly.ConnectionDB.init(this);this.SOUNDS_=Object.create(null)};goog.inherits(Blockly.WorkspaceSvg,Blockly.Workspace);Blockly.WorkspaceSvg.prototype.resizeHandlerWrapper_=null;Blockly.WorkspaceSvg.prototype.rendered=!0;Blockly.WorkspaceSvg.prototype.isFlyout=!1;Blockly.WorkspaceSvg.prototype.dragMode_=Blockly.DRAG_NONE;
+Blockly.WorkspaceSvg.prototype.scrollX=0;Blockly.WorkspaceSvg.prototype.scrollY=0;Blockly.WorkspaceSvg.prototype.startScrollX=0;Blockly.WorkspaceSvg.prototype.startScrollY=0;Blockly.WorkspaceSvg.prototype.dragDeltaXY_=null;Blockly.WorkspaceSvg.prototype.scale=1;Blockly.WorkspaceSvg.prototype.trashcan=null;Blockly.WorkspaceSvg.prototype.scrollbar=null;Blockly.WorkspaceSvg.prototype.lastSound_=null;Blockly.WorkspaceSvg.prototype.inverseScreenCTM_=null;
+Blockly.WorkspaceSvg.prototype.getInverseScreenCTM=function(){return this.inverseScreenCTM_};Blockly.WorkspaceSvg.prototype.updateInverseScreenCTM=function(){this.inverseScreenCTM_=this.getParentSvg().getScreenCTM().inverse()};Blockly.WorkspaceSvg.prototype.setResizeHandlerWrapper=function(a){this.resizeHandlerWrapper_=a};
Blockly.WorkspaceSvg.prototype.createDom=function(a){this.svgGroup_=Blockly.createSvgElement("g",{"class":"blocklyWorkspace"},null);a&&(this.svgBackground_=Blockly.createSvgElement("rect",{height:"100%",width:"100%","class":a},this.svgGroup_),"blocklyMainBackground"==a&&(this.svgBackground_.style.fill="url(#"+this.options.gridPattern.id+")"));this.svgBlockCanvas_=Blockly.createSvgElement("g",{"class":"blocklyBlockCanvas"},this.svgGroup_,this);this.svgBubbleCanvas_=Blockly.createSvgElement("g",{"class":"blocklyBubbleCanvas"},
this.svgGroup_,this);a=Blockly.Scrollbar.scrollbarThickness;this.options.hasTrashcan&&(a=this.addTrashcan_(a));this.options.zoomOptions&&this.options.zoomOptions.controls&&(a=this.addZoomControls_(a));Blockly.bindEvent_(this.svgGroup_,"mousedown",this,this.onMouseDown_);var b=this;Blockly.bindEvent_(this.svgGroup_,"touchstart",null,function(a){Blockly.longStart_(a,b)});this.options.zoomOptions&&this.options.zoomOptions.wheel&&Blockly.bindEvent_(this.svgGroup_,"wheel",this,this.onMouseWheel_);this.options.hasCategories?
this.toolbox_=new Blockly.Toolbox(this):this.options.languageTree&&this.addFlyout_();this.updateGridPattern_();this.recordDeleteAreas();return this.svgGroup_};
@@ -1035,10 +1035,10 @@ Blockly.WorkspaceSvg.prototype.paste=function(a){if(this.rendered&&!(a.getElemen
f=0,m;m=k[f];f++)if(m.closest(Blockly.SNAP_RADIUS,new goog.math.Coordinate(c,d)).connection){a=!0;break}a&&(c=this.RTL?c-Blockly.SNAP_RADIUS:c+Blockly.SNAP_RADIUS,d+=2*Blockly.SNAP_RADIUS)}while(a);b.moveBy(c,d)}}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new Blockly.Events.Create(b));b.select()}};
Blockly.WorkspaceSvg.prototype.recordDeleteAreas=function(){this.deleteAreaTrash_=this.trashcan?this.trashcan.getClientRect():null;this.deleteAreaToolbox_=this.flyout_?this.flyout_.getClientRect():this.toolbox_?this.toolbox_.getClientRect():null};
Blockly.WorkspaceSvg.prototype.isDeleteArea=function(a){a=new goog.math.Coordinate(a.clientX,a.clientY);if(this.deleteAreaTrash_){if(this.deleteAreaTrash_.contains(a))return this.trashcan.setOpen_(!0),Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;this.trashcan.setOpen_(!1)}if(this.deleteAreaToolbox_&&this.deleteAreaToolbox_.contains(a))return Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE),!0;Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED);return!1};
-Blockly.WorkspaceSvg.prototype.onMouseDown_=function(a){this.markFocused();Blockly.isTargetInput_(a)||(Blockly.terminateDrag_(),Blockly.hideChaff(),a.target&&a.target.nodeName&&("svg"==a.target.nodeName.toLowerCase()||a.target==this.svgBackground_)&&Blockly.selected&&!this.options.readOnly&&Blockly.selected.unselect(),Blockly.isRightButton(a)?this.showContextMenu_(a):this.scrollbar&&(this.isScrolling=!0,this.startDragMouseX=a.clientX,this.startDragMouseY=a.clientY,this.startDragMetrics=this.getMetrics(),
-this.startScrollX=this.scrollX,this.startScrollY=this.scrollY,"mouseup"in Blockly.bindEvent_.TOUCH_MAP&&(Blockly.onTouchUpWrapper_=Blockly.onTouchUpWrapper_||[],Blockly.onTouchUpWrapper_=Blockly.onTouchUpWrapper_.concat(Blockly.bindEvent_(document,"mouseup",null,Blockly.onMouseUp_))),Blockly.onMouseMoveWrapper_=Blockly.onMouseMoveWrapper_||[],Blockly.onMouseMoveWrapper_=Blockly.onMouseMoveWrapper_.concat(Blockly.bindEvent_(document,"mousemove",null,Blockly.onMouseMove_))),a.stopPropagation(),a.preventDefault())};
-Blockly.WorkspaceSvg.prototype.startDrag=function(a,b){var c=Blockly.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());c.x/=this.scale;c.y/=this.scale;this.dragDeltaXY_=goog.math.Coordinate.difference(b,c)};Blockly.WorkspaceSvg.prototype.moveDrag=function(a){a=Blockly.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return goog.math.Coordinate.sum(this.dragDeltaXY_,a)};
-Blockly.WorkspaceSvg.prototype.isDragging=function(){return Blockly.dragMode_==Blockly.DRAG_FREE||this.isScrolling};Blockly.WorkspaceSvg.prototype.onMouseWheel_=function(a){Blockly.terminateDrag_();var b=0b.bottomRight.x&&(b.bottomRight.x=d.bottomRight.x);d.topLeft.yb.bottomRight.y&&(b.bottomRight.y=d.bottomRight.y)}return{x:b.topLeft.x,y:b.topLeft.y,width:b.bottomRight.x-
b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp_=function(){Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);Blockly.resizeSvgContents(this)};
Blockly.WorkspaceSvg.prototype.showContextMenu_=function(a){function b(a){if(a.isDeletable())l=l.concat(a.getDescendants());else{a=a.getChildren();for(var c=0;cc.width+d.x&&(a=c.width+d.x):ad&&(d=h,e=g)}return e?Blockly.utils.wrapMutate_(a,e,c):b};Blockly.utils.wrapToText_=function(a,b){for(var c=[],d=0;dBlockly.DRAG_RADIUS&&
-Blockly.longStop_();a.stopPropagation();a.preventDefault()}}};
+Blockly.onMouseUp_=function(a){a=Blockly.getMainWorkspace();Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN);a.dragMode_=Blockly.DRAG_NONE;Blockly.onTouchUpWrapper_&&(Blockly.unbindEvent_(Blockly.onTouchUpWrapper_),Blockly.onTouchUpWrapper_=null);Blockly.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.onMouseMoveWrapper_),Blockly.onMouseMoveWrapper_=null)};
+Blockly.onMouseMove_=function(a){if(!(a.touches&&2<=a.touches.length)){var b=Blockly.getMainWorkspace();if(b.dragMode_!=Blockly.DRAG_NONE){var c=a.clientX-b.startDragMouseX,d=a.clientY-b.startDragMouseY,e=b.startDragMetrics,f=b.startScrollX+c,g=b.startScrollY+d,f=Math.min(f,-e.contentLeft),g=Math.min(g,-e.contentTop),f=Math.max(f,e.viewWidth-e.contentLeft-e.contentWidth),g=Math.max(g,e.viewHeight-e.contentTop-e.contentHeight);b.scrollbar.set(-f-e.contentLeft,-g-e.contentTop);Math.sqrt(c*c+d*d)>Blockly.DRAG_RADIUS&&
+(Blockly.longStop_(),b.dragMode_=Blockly.DRAG_FREE);a.stopPropagation();a.preventDefault()}}};
Blockly.onKeyDown_=function(a){if(!Blockly.mainWorkspace.options.readOnly&&!Blockly.isTargetInput_(a)){var b=!1;if(27==a.keyCode)Blockly.hideChaff();else if(8==a.keyCode||46==a.keyCode)a.preventDefault(),Blockly.selected&&Blockly.selected.isDeletable()&&(b=!0);else if(a.altKey||a.ctrlKey||a.metaKey)Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&(67==a.keyCode?(Blockly.hideChaff(),Blockly.copy_(Blockly.selected)):88==a.keyCode&&(Blockly.copy_(Blockly.selected),b=!0)),
86==a.keyCode?Blockly.clipboardXml_&&(Blockly.Events.setGroup(!0),Blockly.clipboardSource_.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1)):90==a.keyCode&&(Blockly.hideChaff(),Blockly.mainWorkspace.undo(a.shiftKey));b&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(Blockly.dragMode_!=Blockly.DRAG_FREE,!0),Blockly.highlightedConnection_&&(Blockly.highlightedConnection_.unhighlight(),Blockly.highlightedConnection_=null),Blockly.Events.setGroup(!1))}};
Blockly.terminateDrag_=function(){Blockly.BlockSvg.terminateDrag();Blockly.Flyout.terminateDrag_()};Blockly.longPid_=0;Blockly.longStart_=function(a,b){Blockly.longStop_();Blockly.longPid_=setTimeout(function(){a.button=2;b.onMouseDown_(a)},Blockly.LONGPRESS)};Blockly.longStop_=function(){Blockly.longPid_&&(clearTimeout(Blockly.longPid_),Blockly.longPid_=0)};
diff --git a/blockly_uncompressed.js b/blockly_uncompressed.js
index bbf6a8a46..8c827c33f 100644
--- a/blockly_uncompressed.js
+++ b/blockly_uncompressed.js
@@ -497,7 +497,7 @@ goog.addDependency("fs/url.js", ['goog.fs.url'], []);
goog.addDependency("fs/url_test.js", ['goog.urlTest'], ['goog.fs.url', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']);
goog.addDependency("functions/functions.js", ['goog.functions'], []);
goog.addDependency("functions/functions_test.js", ['goog.functionsTest'], ['goog.array', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']);
-goog.addDependency("fx/abstractdragdrop.js", ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']);
+goog.addDependency("fx/abstractdragdrop.js", ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']);
goog.addDependency("fx/abstractdragdrop_test.js", ['goog.fx.AbstractDragDropTest'], ['goog.array', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit']);
goog.addDependency("fx/animation.js", ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.fx.Transition', 'goog.fx.TransitionBase', 'goog.fx.anim', 'goog.fx.anim.Animated']);
goog.addDependency("fx/animation_test.js", ['goog.fx.AnimationTest'], ['goog.events', 'goog.fx.Animation', 'goog.testing.MockClock', 'goog.testing.jsunit']);
@@ -594,9 +594,9 @@ goog.addDependency("html/uncheckedconversions_test.js", ['goog.html.uncheckedcon
goog.addDependency("html/utils.js", ['goog.html.utils'], ['goog.string']);
goog.addDependency("html/utils_test.js", ['goog.html.UtilsTest'], ['goog.array', 'goog.dom.TagName', 'goog.html.utils', 'goog.object', 'goog.testing.jsunit']);
goog.addDependency("html/sanitizer/attributewhitelist.js", ['goog.html.sanitizer.AttributeWhitelist'], []);
-goog.addDependency("html/sanitizer/csssanitizer.js", ['goog.html.sanitizer.CssSanitizer'], ['goog.array', 'goog.object', 'goog.string']);
-goog.addDependency("html/sanitizer/csssanitizer_test.js", [], ['goog.array', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssSanitizer', 'goog.string', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product']);
-goog.addDependency("html/sanitizer/htmlsanitizer.js", ['goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.HtmlSanitizerPolicy', 'goog.html.sanitizer.HtmlSanitizerPolicyContext', 'goog.html.sanitizer.HtmlSanitizerPolicyHints'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.functions', 'goog.html.SafeUrl', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.CssSanitizer', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.TagWhitelist', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent']);
+goog.addDependency("html/sanitizer/csssanitizer.js", ['goog.html.sanitizer.CssSanitizer'], ['goog.array', 'goog.html.SafeStyle', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string']);
+goog.addDependency("html/sanitizer/csssanitizer_test.js", [], ['goog.array', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssSanitizer', 'goog.string', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product']);
+goog.addDependency("html/sanitizer/htmlsanitizer.js", ['goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.HtmlSanitizerPolicy', 'goog.html.sanitizer.HtmlSanitizerPolicyContext', 'goog.html.sanitizer.HtmlSanitizerPolicyHints'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.functions', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.CssSanitizer', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.TagWhitelist', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent']);
goog.addDependency("html/sanitizer/htmlsanitizer_test.js", [], ['goog.dom', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.sanitizer.HtmlSanitizer', 'goog.html.testing', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']);
goog.addDependency("html/sanitizer/tagblacklist.js", ['goog.html.sanitizer.TagBlacklist'], []);
goog.addDependency("html/sanitizer/tagwhitelist.js", ['goog.html.sanitizer.TagWhitelist'], []);
@@ -609,8 +609,8 @@ goog.addDependency("i18n/charlistdecompressor_test.js", ['goog.i18n.CharListDeco
goog.addDependency("i18n/charpickerdata.js", ['goog.i18n.CharPickerData'], []);
goog.addDependency("i18n/collation.js", ['goog.i18n.collation'], []);
goog.addDependency("i18n/collation_test.js", ['goog.i18n.collationTest'], ['goog.i18n.collation', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']);
-goog.addDependency("i18n/compactnumberformatsymbols.js", ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_ar_XB', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_XA', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_kk_KZ', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mn_MN', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_ms_MY', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], []);
-goog.addDependency("i18n/compactnumberformatsymbols_ext.js", ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_ce', 'goog.i18n.CompactNumberFormatSymbols_ce_RU', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.CompactNumberFormatSymbols_cu', 'goog.i18n.CompactNumberFormatSymbols_cu_RU', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dsb', 'goog.i18n.CompactNumberFormatSymbols_dsb_DE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_AT', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BI', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CH', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_CY', 'goog.i18n.CompactNumberFormatSymbols_en_DE', 'goog.i18n.CompactNumberFormatSymbols_en_DK', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FI', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IL', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_MY', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NL', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SE', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SI', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_eo_001', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_BR', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_DK', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_gsw_FR', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_NG', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hsb', 'goog.i18n.CompactNumberFormatSymbols_hsb_DE', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lb', 'goog.i18n.CompactNumberFormatSymbols_lb_LU', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lrc', 'goog.i18n.CompactNumberFormatSymbols_lrc_IQ', 'goog.i18n.CompactNumberFormatSymbols_lrc_IR', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_ms_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_SG', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_mzn', 'goog.i18n.CompactNumberFormatSymbols_mzn_IR', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SS', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_prg', 'goog.i18n.CompactNumberFormatSymbols_prg_001', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CH', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GQ', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_LU', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_qu', 'goog.i18n.CompactNumberFormatSymbols_qu_BO', 'goog.i18n.CompactNumberFormatSymbols_qu_EC', 'goog.i18n.CompactNumberFormatSymbols_qu_PE', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_se_SE', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_smn', 'goog.i18n.CompactNumberFormatSymbols_smn_FI', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sw_CD', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_tk', 'goog.i18n.CompactNumberFormatSymbols_tk_TM', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_CN', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_vo', 'goog.i18n.CompactNumberFormatSymbols_vo_001', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yi', 'goog.i18n.CompactNumberFormatSymbols_yi_001', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_yue', 'goog.i18n.CompactNumberFormatSymbols_yue_HK', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW'], []);
+goog.addDependency("i18n/compactnumberformatsymbols.js", ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mo', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_sh', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu'], []);
+goog.addDependency("i18n/compactnumberformatsymbolsext.js", ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_XB', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_ce', 'goog.i18n.CompactNumberFormatSymbols_ce_RU', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dsb', 'goog.i18n.CompactNumberFormatSymbols_dsb_DE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AT', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BI', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CH', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_CY', 'goog.i18n.CompactNumberFormatSymbols_en_DE', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_DK', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FI', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IL', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_MY', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NL', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SE', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SI', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US_POSIX', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_XA', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_DK', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_FR', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_NG', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hsb', 'goog.i18n.CompactNumberFormatSymbols_hsb_DE', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kk_KZ', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lb', 'goog.i18n.CompactNumberFormatSymbols_lb_LU', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lrc', 'goog.i18n.CompactNumberFormatSymbols_lrc_IQ', 'goog.i18n.CompactNumberFormatSymbols_lrc_IR', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn_MN', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_MY', 'goog.i18n.CompactNumberFormatSymbols_ms_SG', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_mzn', 'goog.i18n.CompactNumberFormatSymbols_mzn_IR', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SS', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_qu', 'goog.i18n.CompactNumberFormatSymbols_qu_BO', 'goog.i18n.CompactNumberFormatSymbols_qu_EC', 'goog.i18n.CompactNumberFormatSymbols_qu_PE', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_se_SE', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_smn', 'goog.i18n.CompactNumberFormatSymbols_smn_FI', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw_CD', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_CN', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yi', 'goog.i18n.CompactNumberFormatSymbols_yi_001', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_yue', 'goog.i18n.CompactNumberFormatSymbols_yue_HK', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], ['goog.i18n.CompactNumberFormatSymbols']);
goog.addDependency("i18n/currency.js", ['goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.i18n.currency.CurrencyInfoTier2'], []);
goog.addDependency("i18n/currency_test.js", ['goog.i18n.currencyTest'], ['goog.i18n.NumberFormat', 'goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']);
goog.addDependency("i18n/currencycodemap.js", ['goog.i18n.currencyCodeMap', 'goog.i18n.currencyCodeMapTier2'], []);
@@ -620,8 +620,8 @@ goog.addDependency("i18n/datetimeparse.js", ['goog.i18n.DateTimeParse'], ['goog.
goog.addDependency("i18n/datetimeparse_test.js", ['goog.i18n.DateTimeParseTest'], ['goog.date.Date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_zh', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']);
goog.addDependency("i18n/datetimepatterns.js", ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ky', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_no_NO', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sh', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], []);
goog.addDependency("i18n/datetimepatternsext.js", ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SS', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_XB', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_ast', 'goog.i18n.DateTimePatterns_ast_ES', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_ca_FR', 'goog.i18n.DateTimePatterns_ca_IT', 'goog.i18n.DateTimePatterns_ce', 'goog.i18n.DateTimePatterns_ce_RU', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_da_GL', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dsb', 'goog.i18n.DateTimePatterns_dsb_DE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_001', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AI', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_AT', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BI', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CC', 'goog.i18n.DateTimePatterns_en_CH', 'goog.i18n.DateTimePatterns_en_CK', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_CX', 'goog.i18n.DateTimePatterns_en_CY', 'goog.i18n.DateTimePatterns_en_DE', 'goog.i18n.DateTimePatterns_en_DG', 'goog.i18n.DateTimePatterns_en_DK', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_ER', 'goog.i18n.DateTimePatterns_en_FI', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FK', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IL', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_IO', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MO', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MS', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_MY', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NF', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NL', 'goog.i18n.DateTimePatterns_en_NR', 'goog.i18n.DateTimePatterns_en_NU', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PN', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_RW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SD', 'goog.i18n.DateTimePatterns_en_SE', 'goog.i18n.DateTimePatterns_en_SH', 'goog.i18n.DateTimePatterns_en_SI', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SX', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TK', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TV', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_XA', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_CM', 'goog.i18n.DateTimePatterns_ff_GN', 'goog.i18n.DateTimePatterns_ff_MR', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_DK', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_PM', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_WF', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_fur', 'goog.i18n.DateTimePatterns_fur_IT', 'goog.i18n.DateTimePatterns_fy', 'goog.i18n.DateTimePatterns_fy_NL', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gd', 'goog.i18n.DateTimePatterns_gd_GB', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gsw_FR', 'goog.i18n.DateTimePatterns_gsw_LI', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_IM', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_GH', 'goog.i18n.DateTimePatterns_ha_NE', 'goog.i18n.DateTimePatterns_ha_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hsb', 'goog.i18n.DateTimePatterns_hsb_DE', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk_KZ', 'goog.i18n.DateTimePatterns_kkj', 'goog.i18n.DateTimePatterns_kkj_CM', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_ksh', 'goog.i18n.DateTimePatterns_ksh_DE', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_ky_KG', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lb', 'goog.i18n.DateTimePatterns_lb_LU', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lkt', 'goog.i18n.DateTimePatterns_lkt_US', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lrc', 'goog.i18n.DateTimePatterns_lrc_IQ', 'goog.i18n.DateTimePatterns_lrc_IR', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_ms_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_mzn', 'goog.i18n.DateTimePatterns_mzn_IR', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nb_SJ', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_BQ', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nnh', 'goog.i18n.DateTimePatterns_nnh_CM', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SS', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_os', 'goog.i18n.DateTimePatterns_os_GE', 'goog.i18n.DateTimePatterns_os_RU', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_qu', 'goog.i18n.DateTimePatterns_qu_BO', 'goog.i18n.DateTimePatterns_qu_EC', 'goog.i18n.DateTimePatterns_qu_PE', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_sah', 'goog.i18n.DateTimePatterns_sah_RU', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_se', 'goog.i18n.DateTimePatterns_se_FI', 'goog.i18n.DateTimePatterns_se_NO', 'goog.i18n.DateTimePatterns_se_SE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_smn', 'goog.i18n.DateTimePatterns_smn_FI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sq_XK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Cyrl_XK', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sr_Latn_XK', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_CD', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_MA', 'goog.i18n.DateTimePatterns_ug', 'goog.i18n.DateTimePatterns_ug_CN', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_wae', 'goog.i18n.DateTimePatterns_wae_CH', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yi', 'goog.i18n.DateTimePatterns_yi_001', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_BJ', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_yue', 'goog.i18n.DateTimePatterns_yue_HK', 'goog.i18n.DateTimePatterns_zgh', 'goog.i18n.DateTimePatterns_zgh_MA', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']);
-goog.addDependency("i18n/datetimesymbols.js", ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], []);
-goog.addDependency("i18n/datetimesymbolsext.js", ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_XB', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_ES_VALENCIA', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_ce', 'goog.i18n.DateTimeSymbols_ce_RU', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_Arab', 'goog.i18n.DateTimeSymbols_ckb_Arab_IQ', 'goog.i18n.DateTimeSymbols_ckb_Arab_IR', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_ckb_Latn', 'goog.i18n.DateTimeSymbols_ckb_Latn_IQ', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cu', 'goog.i18n.DateTimeSymbols_cu_RU', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dsb', 'goog.i18n.DateTimeSymbols_dsb_DE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_AT', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BI', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CH', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_CY', 'goog.i18n.DateTimeSymbols_en_DE', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DK', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FI', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IL', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_MY', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NL', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SE', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SI', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_XA', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_eo_001', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_BR', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_CM', 'goog.i18n.DateTimeSymbols_ff_GN', 'goog.i18n.DateTimeSymbols_ff_MR', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_DK', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_FR', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hsb', 'goog.i18n.DateTimeSymbols_hsb_DE', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lb', 'goog.i18n.DateTimeSymbols_lb_LU', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lrc', 'goog.i18n.DateTimeSymbols_lrc_IQ', 'goog.i18n.DateTimeSymbols_lrc_IR', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_ms_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_mzn', 'goog.i18n.DateTimeSymbols_mzn_IR', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SS', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_prg', 'goog.i18n.DateTimeSymbols_prg_001', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CH', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GQ', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_LU', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_qu', 'goog.i18n.DateTimeSymbols_qu_BO', 'goog.i18n.DateTimeSymbols_qu_EC', 'goog.i18n.DateTimeSymbols_qu_PE', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_se_SE', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_smn', 'goog.i18n.DateTimeSymbols_smn_FI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_CD', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tk', 'goog.i18n.DateTimeSymbols_tk_TM', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vo', 'goog.i18n.DateTimeSymbols_vo_001', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yi', 'goog.i18n.DateTimeSymbols_yi_001', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_yue', 'goog.i18n.DateTimeSymbols_yue_HK', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']);
+goog.addDependency("i18n/datetimesymbols.js", ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mo', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], []);
+goog.addDependency("i18n/datetimesymbolsext.js", ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_XB', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_ce', 'goog.i18n.DateTimeSymbols_ce_RU', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dsb', 'goog.i18n.DateTimeSymbols_dsb_DE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_AT', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BI', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CH', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_CY', 'goog.i18n.DateTimeSymbols_en_DE', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DK', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FI', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IL', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_MY', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NL', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SE', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SI', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_US_POSIX', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_XA', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_CM', 'goog.i18n.DateTimeSymbols_ff_GN', 'goog.i18n.DateTimeSymbols_ff_MR', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_DK', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_FR', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hsb', 'goog.i18n.DateTimeSymbols_hsb_DE', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lb', 'goog.i18n.DateTimeSymbols_lb_LU', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lrc', 'goog.i18n.DateTimeSymbols_lrc_IQ', 'goog.i18n.DateTimeSymbols_lrc_IR', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_ms_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_mzn', 'goog.i18n.DateTimeSymbols_mzn_IR', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SS', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_qu', 'goog.i18n.DateTimeSymbols_qu_BO', 'goog.i18n.DateTimeSymbols_qu_EC', 'goog.i18n.DateTimeSymbols_qu_PE', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_se_SE', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_smn', 'goog.i18n.DateTimeSymbols_smn_FI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_CD', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yi', 'goog.i18n.DateTimeSymbols_yi_001', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_yue', 'goog.i18n.DateTimeSymbols_yue_HK', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']);
goog.addDependency("i18n/graphemebreak.js", ['goog.i18n.GraphemeBreak'], ['goog.structs.InversionMap']);
goog.addDependency("i18n/graphemebreak_test.js", ['goog.i18n.GraphemeBreakTest'], ['goog.i18n.GraphemeBreak', 'goog.testing.jsunit']);
goog.addDependency("i18n/messageformat.js", ['goog.i18n.MessageFormat'], ['goog.asserts', 'goog.i18n.NumberFormat', 'goog.i18n.ordinalRules', 'goog.i18n.pluralRules']);
@@ -630,8 +630,8 @@ goog.addDependency("i18n/mime.js", ['goog.i18n.mime', 'goog.i18n.mime.encode'],
goog.addDependency("i18n/mime_test.js", ['goog.i18n.mime.encodeTest'], ['goog.i18n.mime.encode', 'goog.testing.jsunit']);
goog.addDependency("i18n/numberformat.js", ['goog.i18n.NumberFormat', 'goog.i18n.NumberFormat.CurrencyStyle', 'goog.i18n.NumberFormat.Format'], ['goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.currency', 'goog.math']);
goog.addDependency("i18n/numberformat_test.js", ['goog.i18n.NumberFormatTest'], ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_ro', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']);
-goog.addDependency("i18n/numberformatsymbols.js", ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_XB', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_XA', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], []);
-goog.addDependency("i18n/numberformatsymbolsext.js", ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_ce', 'goog.i18n.NumberFormatSymbols_ce_RU', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_Arab', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_Latn', 'goog.i18n.NumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.NumberFormatSymbols_cu', 'goog.i18n.NumberFormatSymbols_cu_RU', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dsb', 'goog.i18n.NumberFormatSymbols_dsb_DE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_AT', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BI', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CH', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_CY', 'goog.i18n.NumberFormatSymbols_en_DE', 'goog.i18n.NumberFormatSymbols_en_DK', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FI', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IL', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_MY', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NL', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SE', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SI', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_eo_001', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_BR', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_CM', 'goog.i18n.NumberFormatSymbols_ff_GN', 'goog.i18n.NumberFormatSymbols_ff_MR', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_DK', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_gsw_FR', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hsb', 'goog.i18n.NumberFormatSymbols_hsb_DE', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_IN', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lb', 'goog.i18n.NumberFormatSymbols_lb_LU', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lrc', 'goog.i18n.NumberFormatSymbols_lrc_IQ', 'goog.i18n.NumberFormatSymbols_lrc_IR', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_SG', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_mzn', 'goog.i18n.NumberFormatSymbols_mzn_IR', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SS', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_prg', 'goog.i18n.NumberFormatSymbols_prg_001', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CH', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GQ', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_LU', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_qu', 'goog.i18n.NumberFormatSymbols_qu_BO', 'goog.i18n.NumberFormatSymbols_qu_EC', 'goog.i18n.NumberFormatSymbols_qu_PE', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_se_SE', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_smn', 'goog.i18n.NumberFormatSymbols_smn_FI', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sw_CD', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tk', 'goog.i18n.NumberFormatSymbols_tk_TM', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_vo', 'goog.i18n.NumberFormatSymbols_vo_001', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yi', 'goog.i18n.NumberFormatSymbols_yi_001', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_yue', 'goog.i18n.NumberFormatSymbols_yue_HK', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW'], ['goog.i18n.NumberFormatSymbols']);
+goog.addDependency("i18n/numberformatsymbols.js", ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu'], []);
+goog.addDependency("i18n/numberformatsymbolsext.js", ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_XB', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_ce', 'goog.i18n.NumberFormatSymbols_ce_RU', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dsb', 'goog.i18n.NumberFormatSymbols_dsb_DE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AT', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BI', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CH', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_CY', 'goog.i18n.NumberFormatSymbols_en_DE', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_DK', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FI', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IL', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_MY', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NL', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SE', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SI', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US_POSIX', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_XA', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_CM', 'goog.i18n.NumberFormatSymbols_ff_GN', 'goog.i18n.NumberFormatSymbols_ff_MR', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_DK', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_FR', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hsb', 'goog.i18n.NumberFormatSymbols_hsb_DE', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_IN', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lb', 'goog.i18n.NumberFormatSymbols_lb_LU', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lrc', 'goog.i18n.NumberFormatSymbols_lrc_IQ', 'goog.i18n.NumberFormatSymbols_lrc_IR', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_ms_SG', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_mzn', 'goog.i18n.NumberFormatSymbols_mzn_IR', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SS', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_qu', 'goog.i18n.NumberFormatSymbols_qu_BO', 'goog.i18n.NumberFormatSymbols_qu_EC', 'goog.i18n.NumberFormatSymbols_qu_PE', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_se_SE', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_smn', 'goog.i18n.NumberFormatSymbols_smn_FI', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw_CD', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yi', 'goog.i18n.NumberFormatSymbols_yi_001', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_yue', 'goog.i18n.NumberFormatSymbols_yue_HK', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zu_ZA'], ['goog.i18n.NumberFormatSymbols']);
goog.addDependency("i18n/ordinalrules.js", ['goog.i18n.ordinalRules'], []);
goog.addDependency("i18n/pluralrules.js", ['goog.i18n.pluralRules'], []);
goog.addDependency("i18n/pluralrules_test.js", ['goog.i18n.pluralRulesTest'], ['goog.i18n.pluralRules', 'goog.testing.jsunit']);
@@ -1419,7 +1419,7 @@ goog.addDependency("ui/serverchart.js", ['goog.ui.ServerChart', 'goog.ui.ServerC
goog.addDependency("ui/serverchart_test.js", ['goog.ui.ServerChartTest'], ['goog.Uri', 'goog.events', 'goog.testing.jsunit', 'goog.ui.ServerChart']);
goog.addDependency("ui/slider.js", ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase']);
goog.addDependency("ui/sliderbase.js", ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel']);
-goog.addDependency("ui/sliderbase_test.js", ['goog.ui.SliderBaseTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Animation', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SliderBase', 'goog.userAgent']);
+goog.addDependency("ui/sliderbase_test.js", ['goog.ui.SliderBaseTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Animation', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SliderBase', 'goog.userAgent']);
goog.addDependency("ui/splitbehavior.js", ['goog.ui.SplitBehavior', 'goog.ui.SplitBehavior.DefaultHandlers'], ['goog.Disposable', 'goog.asserts', 'goog.dispose', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.decorate', 'goog.ui.registry']);
goog.addDependency("ui/splitbehavior_test.js", ['goog.ui.SplitBehaviorTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.CustomButton', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.SplitBehavior', 'goog.ui.decorate']);
goog.addDependency("ui/splitpane.js", ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.userAgent']);
@@ -1572,8 +1572,6 @@ goog.addDependency("vec/mat3f.js", ['goog.vec.mat3f', 'goog.vec.mat3f.Type'], ['
goog.addDependency("vec/mat4.js", ['goog.vec.Mat4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4']);
goog.addDependency("vec/mat4d.js", ['goog.vec.mat4d', 'goog.vec.mat4d.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3d', 'goog.vec.vec4d']);
goog.addDependency("vec/mat4f.js", ['goog.vec.mat4f', 'goog.vec.mat4f.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3f', 'goog.vec.vec4f']);
-goog.addDependency("vec/matrix3.js", ['goog.vec.Matrix3'], []);
-goog.addDependency("vec/matrix4.js", ['goog.vec.Matrix4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4']);
goog.addDependency("vec/quaternion.js", ['goog.vec.Quaternion', 'goog.vec.Quaternion.AnyType'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4']);
goog.addDependency("vec/ray.js", ['goog.vec.Ray'], ['goog.vec.Vec3']);
goog.addDependency("vec/vec.js", ['goog.vec', 'goog.vec.AnyType', 'goog.vec.ArrayType', 'goog.vec.Float32', 'goog.vec.Float64', 'goog.vec.Number'], ['goog.vec.Float32Array', 'goog.vec.Float64Array']);
diff --git a/msg/js/br.js b/msg/js/br.js
index 6336943bd..9b0d9b8db 100644
--- a/msg/js/br.js
+++ b/msg/js/br.js
@@ -138,14 +138,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Termenañ a ra an elfenn genta
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Termenañ a ra an elfenn el lec'h meneget en ul listenn.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Termenañ a ra an elfenn diwezhañ en ul listenn.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Termenañ a ra un elfenn dre zegouezh en ul listenn.";
-Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated
-Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated
-Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated
-Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated
-Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated
-Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated
-Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated
-Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated
+Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with";
+Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "war gresk";
+Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "war zigresk";
+Blockly.Msg.LISTS_SORT_TITLE = "Rummañ%1,%2,%3";
+Blockly.Msg.LISTS_SORT_TOOLTIP = "Rummañ un eilenn eus ar roll";
+Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg";
+Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "niverel";
+Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Dre urzh al lizherenneg";
Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Krouiñ ul listenn diwar an destenn";
Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Krouiñ un destenn diwar al listenn";
@@ -291,7 +291,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Anv ar moned";
Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ouzhpennañ ur moned d'an arc'hwel.";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Monedoù";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ.";
-Blockly.Msg.REDO = "Redo"; // untranslated
+Blockly.Msg.REDO = "Adober";
Blockly.Msg.REMOVE_COMMENT = "Lemel an evezhiadenn kuit";
Blockly.Msg.RENAME_VARIABLE = "Adenvel an argemmenn...";
Blockly.Msg.RENAME_VARIABLE_TITLE = "Adenvel an holl argemmennoù '%1' e :";
@@ -357,7 +357,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Lemel an esaouennoù eus an tu kleiz";
Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Lemel an esaouennoù eus an tu dehou";
Blockly.Msg.TEXT_TRIM_TOOLTIP = "Distreiñ un eilenn eus an destenn gant an esaouennoù lamet eus un tu pe eus an daou du";
Blockly.Msg.TODAY = "Hiziv";
-Blockly.Msg.UNDO = "Undo"; // untranslated
+Blockly.Msg.UNDO = "Dizober";
Blockly.Msg.VARIABLES_DEFAULT_NAME = "elfenn";
Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krouiñ 'termenañ %1'";
Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated
diff --git a/msg/js/fi.js b/msg/js/fi.js
index ccbe24aab..fdfcced34 100644
--- a/msg/js/fi.js
+++ b/msg/js/fi.js
@@ -94,7 +94,7 @@ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Palauta kohde annetusta kohdasta
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Palauttaa listan viimeisen kohteen.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Palauttaa satunnaisen kohteen listalta.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Poistaa ja palauttaa ensimmäisen kohteen listalta.";
-Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Poistaa ja palauttaa kohteen annetusta kohden listaa.";
+Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Poistaa ja palauttaa kohteen listan annetusta kohdasta.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Poistaa ja palauttaa viimeisen kohteen listalta.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Poistaa ja palauttaa satunnaisen kohteen listalta.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Poistaa ensimmäisen kohteen listalta.";
@@ -131,11 +131,11 @@ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "kohteeksi";
Blockly.Msg.LISTS_SET_INDEX_INSERT = "lisää kohtaan";
Blockly.Msg.LISTS_SET_INDEX_SET = "aseta";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Lisää kohteen listan kärkeen.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Lisää kohteen listan annettuun kohtaan.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Lisää kohteen annettuun kohtaan listassa.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Lisää kohteen listan loppuun.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Lisää kohteen satunnaiseen kohtaan listassa.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Asettaa listan ensimmäisen kohteen.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Asettaa kohteen määrättyyn kohtaa listassa.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Asettaa kohteen annettuun kohtaan listassa.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Asettaa listan viimeisen kohteen.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Asettaa satunnaisen kohteen listassa.";
Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated
diff --git a/msg/js/fr.js b/msg/js/fr.js
index 3c14701c9..ededfe911 100644
--- a/msg/js/fr.js
+++ b/msg/js/fr.js
@@ -135,7 +135,7 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insère l’élément à la p
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ajouter l’élément à la fin d’une liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insère l’élément au hasard dans une liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Fixe le premier élément dans une liste.";
-Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Fixe l’élément à la position indiquée dans une liste.";
+Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Met à jour l’élément à la position indiquée dans une liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Fixe le dernier élément dans une liste.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Fixe un élément au hasard dans une liste.";
Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list";
diff --git a/msg/js/sv.js b/msg/js/sv.js
index 1708e5f73..dff16de12 100644
--- a/msg/js/sv.js
+++ b/msg/js/sv.js
@@ -115,7 +115,7 @@ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 är det första objektet.";
Blockly.Msg.LISTS_INDEX_OF_FIRST = "hitta första förekomsten av objektet";
Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
Blockly.Msg.LISTS_INDEX_OF_LAST = "hitta sista förekomsten av objektet";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka %1 om objektet inte hittas.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Returnerar %1 om objektet inte hittas.";
Blockly.Msg.LISTS_INLIST = "i listan";
Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated
Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 är tom";
diff --git a/msg/js/zh-hans.js b/msg/js/zh-hans.js
index 700996e93..cd76b734f 100644
--- a/msg/js/zh-hans.js
+++ b/msg/js/zh-hans.js
@@ -331,7 +331,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "自文本";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "寻找第一个出现的文本";
Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "寻找最后一个出现的文本";
Blockly.Msg.TEXT_INDEXOF_TAIL = "空白";
-Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 %1。";
+Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回%1。";
Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1是空的";
Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的文本为空,则返回真。";
From 7a92facc3a4e0c7fb05999cb38050a20711a0378 Mon Sep 17 00:00:00 2001
From: Neil Fraser
Date: Wed, 13 Jul 2016 16:58:43 -0700
Subject: [PATCH 23/25] Fix angle field.
---
core/field_angle.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/field_angle.js b/core/field_angle.js
index 9cb5675f4..422191730 100644
--- a/core/field_angle.js
+++ b/core/field_angle.js
@@ -205,7 +205,7 @@ Blockly.FieldAngle.prototype.onMouseMove = function(e) {
angle = Math.round(angle / Blockly.FieldAngle.ROUND) *
Blockly.FieldAngle.ROUND;
}
- angle = Blockly.FieldAngle.angleValidator(angle);
+ angle = Blockly.FieldAngle.classValidator(angle);
Blockly.FieldTextInput.htmlInput_.value = angle;
this.setValue(angle);
this.validate_();
From 85f2ae87619c04b234479f8e9da290a3a7483f43 Mon Sep 17 00:00:00 2001
From: Sean Lip
Date: Thu, 14 Jul 2016 11:50:05 -0700
Subject: [PATCH 24/25] Set active descendant correctly for toolbox tree.
Change roles to 'tree' where appropriate.
---
accessible/toolbox.component.js | 16 ++++++++++++----
accessible/workspace.component.js | 2 +-
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/accessible/toolbox.component.js b/accessible/toolbox.component.js
index 081803103..99f9a1bd5 100644
--- a/accessible/toolbox.component.js
+++ b/accessible/toolbox.component.js
@@ -29,10 +29,10 @@ blocklyApp.ToolboxComponent = ng.core
template: `
0" tabIndex="0"
[attr.aria-labelledby]="toolboxTitle.id"
- [attr.aria-activedescendant]="tree.getAttribute('aria-activedescendant') || tree.id + '-node0' "
+ [attr.aria-activedescendant]="getActiveDescId()"
(keydown)="treeService.onKeypress($event, tree)">
-
From cc6252cc0028973516f2a7faf67cd67bce35d4ff Mon Sep 17 00:00:00 2001
From: Sean Lip
Date: Thu, 14 Jul 2016 15:52:58 -0700
Subject: [PATCH 25/25] Set activedescendant correctly on workspace trees.
---
accessible/workspace-tree.component.js | 20 ++++++++++++--------
accessible/workspace.component.js | 4 ++--
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/accessible/workspace-tree.component.js b/accessible/workspace-tree.component.js
index 5c7f4dc5f..83dda119b 100644
--- a/accessible/workspace-tree.component.js
+++ b/accessible/workspace-tree.component.js
@@ -266,14 +266,18 @@ blocklyApp.WorkspaceTreeComponent = ng.core
},
ngAfterViewInit: function() {
// If this is a top-level tree in the workspace, set its id and active
- // descendant.
- if (this.tree && this.isTopLevel && !this.tree.id) {
- this.tree.id = this.utilsService.generateUniqueId();
- }
- if (this.tree && this.isTopLevel &&
- !this.treeService.getActiveDescId(this.tree.id)) {
- this.treeService.setActiveDesc(this.idMap['blockRoot'], this.tree.id);
- }
+ // descendant. (Note that a timeout is needed here in order to trigger
+ // Angular change detection.)
+ var that = this;
+ setTimeout(function() {
+ if (that.tree && that.isTopLevel && !that.tree.id) {
+ that.tree.id = that.utilsService.generateUniqueId();
+ }
+ if (that.tree && that.isTopLevel &&
+ !that.treeService.getActiveDescId(that.tree.id)) {
+ that.treeService.setActiveDesc(that.idMap['blockRoot'], that.tree.id);
+ }
+ });
},
generateAriaLabelledByAttr: function(mainLabel, secondLabel, isDisabled) {
return this.utilsService.generateAriaLabelledByAttr(
diff --git a/accessible/workspace.component.js b/accessible/workspace.component.js
index 1efc6ee7a..42eb84d4e 100644
--- a/accessible/workspace.component.js
+++ b/accessible/workspace.component.js
@@ -75,8 +75,8 @@ blocklyApp.WorkspaceComponent = ng.core
clearWorkspace: function() {
this.workspace.clear();
},
- getActiveDescId: function(tree) {
- return this.treeService.getActiveDescId(tree.id);
+ getActiveDescId: function(treeId) {
+ return this.treeService.getActiveDescId(treeId);
},
onWorkspaceToolbarKeypress: function(e) {
this.treeService.onWorkspaceToolbarKeypress(