diff --git a/appengine/redirect.html b/appengine/redirect.html
index b35021f47..63d892d71 100644
--- a/appengine/redirect.html
+++ b/appengine/redirect.html
@@ -90,6 +90,8 @@ if (loc.match('/demos/fixed/')) {
loc = 'https://google.github.io/blockly-samples/examples/pitch-field-demo/';
} else if (loc.match('/demos/mirror/')) {
loc = 'https://google.github.io/blockly-samples/examples/mirror-demo/';
+} else if (loc.match('/demos/plane/')) {
+ loc = 'https://google.github.io/blockly-samples/examples/plane-demo/';
}
location = loc;
diff --git a/demos/index.html b/demos/index.html
index d97b89c51..28d6e2f1d 100644
--- a/demos/index.html
+++ b/demos/index.html
@@ -197,18 +197,6 @@
-
-
-
-
-
- |
-
-
- Using Closure Templates to support 35 languages.
- |
-
-
|
diff --git a/demos/plane/README.txt b/demos/plane/README.txt
deleted file mode 100644
index 944448fd6..000000000
--- a/demos/plane/README.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-This Blockly demo uses Closure Templates to create a multilingual application.
-Any changes to the template.soy file require a recompile. Here is the command
-to generate a quick English version for debugging:
-
-java -jar soy/SoyToJsSrcCompiler.jar --outputPathFormat generated/en.js --srcs template.soy
-
-To generate a full set of language translations, first extract all the strings
-from template.soy using this command:
-
-java -jar soy/SoyMsgExtractor.jar --outputFile xlf/extracted_msgs.xlf template.soy
-
-This generates xlf/extracted_msgs.xlf, which may then be used by any
-XLIFF-compatible translation console to generate a set of files with the
-translated strings. These should be placed in the xlf directory.
-
-Finally, generate all the language versions with this command:
-
-java -jar soy/SoyToJsSrcCompiler.jar --locales ar,be-tarask,br,ca,da,de,el,en,es,fa,fr,he,hrx,hu,ia,is,it,ja,ko,ms,nb,nl,pl,pms,pt-br,ro,ru,sc,sv,th,tr,uk,vi,zh-hans,zh-hant --messageFilePathFormat xlf/translated_msgs_{LOCALE}.xlf --outputPathFormat "generated/{LOCALE}.js" template.soy
-
-This is the process that Google uses for maintaining Blockly Games in 50+
-languages. The XLIFF format is simple enough that it is trivial to write a
-Python script to reformat it into some other format (such as JSON) for
-compatibility with other translation consoles.
-
-For more information, see message translation for Closure Templates:
-https://developers.google.com/closure/templates/docs/translation
diff --git a/demos/plane/blocks.js b/demos/plane/blocks.js
deleted file mode 100644
index c3c094a87..000000000
--- a/demos/plane/blocks.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @license
- * Copyright 2013 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Blocks for Blockly's Plane Seat Calculator application.
- */
-'use strict';
-
-Blockly.Blocks['plane_set_seats'] = {
- // Block seat variable setter.
- init: function() {
- this.setHelpUrl(Blockly.Msg['VARIABLES_SET_HELPURL']);
- this.setColour(330);
- this.appendValueInput('VALUE')
- .appendField(Plane.getMsg('Plane_setSeats'));
- this.setTooltip(Blockly.Msg['VARIABLES_SET_TOOLTIP']);
- this.setDeletable(false);
- }
-};
-
-Blockly.JavaScript['plane_set_seats'] = function(block) {
- // Generate JavaScript for seat variable setter.
- var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
- Blockly.JavaScript.ORDER_ASSIGNMENT) || 'NaN';
- return argument0 + ';';
-};
-
-Blockly.Blocks['plane_get_rows'] = {
- // Block for row variable getter.
- init: function() {
- this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']);
- this.setColour(330);
- this.appendDummyInput()
- .appendField(Plane.getMsg('Plane_getRows')
- .replace('%1', Plane.rows1st), 'title');
- this.setOutput(true, 'Number');
- },
- customUpdate: function() {
- this.setFieldValue(
- Plane.getMsg('Plane_getRows')
- .replace('%1', Plane.rows1st), 'title');
- }
-};
-
-Blockly.JavaScript['plane_get_rows'] = function(block) {
- // Generate JavaScript for row variable getter.
- return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER];
-};
-
-Blockly.Blocks['plane_get_rows1st'] = {
- // Block for first class row variable getter.
- init: function() {
- this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']);
- this.setColour(330);
- this.appendDummyInput()
- .appendField(Plane.getMsg('Plane_getRows1')
- .replace('%1', Plane.rows1st), 'title');
- this.setOutput(true, 'Number');
- },
- customUpdate: function() {
- this.setFieldValue(
- Plane.getMsg('Plane_getRows1')
- .replace('%1', Plane.rows1st), 'title');
- }
-};
-
-Blockly.JavaScript['plane_get_rows1st'] = function(block) {
- // Generate JavaScript for first class row variable getter.
- return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER];
-};
-
-Blockly.Blocks['plane_get_rows2nd'] = {
- // Block for second class row variable getter.
- init: function() {
- this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']);
- this.setColour(330);
- this.appendDummyInput()
- .appendField(Plane.getMsg('Plane_getRows2')
- .replace('%1', Plane.rows2nd), 'title');
- this.setOutput(true, 'Number');
- },
- customUpdate: function() {
- this.setFieldValue(
- Plane.getMsg('Plane_getRows2')
- .replace('%1', Plane.rows2nd), 'title');
- }
-};
-
-Blockly.JavaScript['plane_get_rows2nd'] = function(block) {
- // Generate JavaScript for second class row variable getter.
- return ['Plane.rows2nd', Blockly.JavaScript.ORDER_MEMBER];
-};
diff --git a/demos/plane/generated/ar.js b/demos/plane/generated/ar.js
deleted file mode 100644
index ac760fb11..000000000
--- a/demos/plane/generated/ar.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// This file was automatically generated from template.soy.
-// Please don't edit this file by hand.
-
-/**
- * @fileoverview Templates in namespace planepage.
- */
-
-if (typeof planepage == 'undefined') { var planepage = {}; }
-
-
-planepage.messages = function(opt_data, opt_ignored, opt_ijData) {
- return ' \u0627\u0644\u0635\u0641\u0648\u0641: %1\u0627\u0644\u0635\u0641\u0648\u0641 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: (%1)\u0627\u0644\u0645\u0642\u0627\u0639\u062F: %1\u061F\u0627\u0644\u0645\u0642\u0627\u0639\u062F = ';
-};
-if (goog.DEBUG) {
- planepage.messages.soyTemplateName = 'planepage.messages';
-}
-
-
-planepage.start = function(opt_data, opt_ignored, opt_ijData) {
- var output = planepage.messages(null, null, opt_ijData) + 'Blockly > Demos > \u0622\u0644\u0629 \u062D\u0627\u0633\u0628\u0629 \u0644\u0645\u0642\u0639\u062F \u0627\u0644\u0637\u0627\u0626\u0631\u0629 ';
- var iLimit47 = opt_ijData.maxLevel + 1;
- for (var i47 = 1; i47 < iLimit47; i47++) {
- output += ' ' + ((i47 == opt_ijData.level) ? '' + soy.$$escapeHtml(i47) + '' : (i47 < opt_ijData.level) ? '' + soy.$$escapeHtml(i47) + '' : '' + soy.$$escapeHtml(i47) + '');
- }
- output += ' | |
-
-
-
-
-
- |