Merge pull request #1 from sensebox/add-arduino-generator

add arduino code generator
This commit is contained in:
Delucse 2020-07-23 12:05:54 +02:00 committed by GitHub
commit d1d7a447bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 2699 additions and 26 deletions

140
package-lock.json generated
View File

@ -1393,14 +1393,6 @@
"react-transition-group": "^4.4.0"
}
},
"@material-ui/icons": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz",
"integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==",
"requires": {
"@babel/runtime": "^7.4.4"
}
},
"@material-ui/styles": {
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz",
@ -3053,6 +3045,108 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
},
"bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"optional": true,
"requires": {
"file-uri-to-path": "1.0.0"
}
},
"blockly": {
"version": "3.20200625.2",
"resolved": "https://registry.npmjs.org/blockly/-/blockly-3.20200625.2.tgz",
"integrity": "sha512-+0aUynP4kAFjg+m9uSyctWB+KwT3/BDmqy4Fm7vwWq7cuMtgIsqqA8VGb6INVpFx9WZUXSZ5enFAco6CM85bpA==",
"requires": {
"jsdom": "^15.2.1"
},
"dependencies": {
"cssom": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
"integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
},
"cssstyle": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
"requires": {
"cssom": "~0.3.6"
},
"dependencies": {
"cssom": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
}
}
},
"jsdom": {
"version": "15.2.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz",
"integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==",
"requires": {
"abab": "^2.0.0",
"acorn": "^7.1.0",
"acorn-globals": "^4.3.2",
"array-equal": "^1.0.0",
"cssom": "^0.4.1",
"cssstyle": "^2.0.0",
"data-urls": "^1.1.0",
"domexception": "^1.0.1",
"escodegen": "^1.11.1",
"html-encoding-sniffer": "^1.0.2",
"nwsapi": "^2.2.0",
"parse5": "5.1.0",
"pn": "^1.1.0",
"request": "^2.88.0",
"request-promise-native": "^1.0.7",
"saxes": "^3.1.9",
"symbol-tree": "^3.2.2",
"tough-cookie": "^3.0.1",
"w3c-hr-time": "^1.0.1",
"w3c-xmlserializer": "^1.1.2",
"webidl-conversions": "^4.0.2",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
"whatwg-url": "^7.0.0",
"ws": "^7.0.0",
"xml-name-validator": "^3.0.0"
}
},
"parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
"integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
},
"tough-cookie": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
"integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
"requires": {
"ip-regex": "^2.1.0",
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"whatwg-url": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
},
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
}
}
},
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@ -5826,6 +5920,12 @@
"schema-utils": "^2.5.0"
}
},
"file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"optional": true
},
"filesize": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz",
@ -7432,7 +7532,11 @@
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"optional": true
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
}
}
},
@ -8599,6 +8703,12 @@
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
},
"nan": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
"integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
"optional": true
},
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@ -13209,7 +13319,11 @@
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"optional": true
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
"glob-parent": {
"version": "3.1.0",
@ -13522,7 +13636,11 @@
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"optional": true
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
"get-caller-file": {
"version": "1.0.3",

View File

@ -10,6 +10,7 @@
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.5.0",
"@testing-library/user-event": "^7.2.1",
"blockly": "^3.20200625.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-redux": "^7.2.0",

View File

@ -27,7 +27,7 @@ function App() {
<Router>
<div className="wrapper">
<Navbar />
<div style={{margin: '0 22px'}}>
<div style={{ margin: '0 22px' }}>
<Routes />
</div>
<Footer />

View File

@ -0,0 +1,6 @@
#blocklyDiv {
height: 90vH;
width: 50%;
position: absolute;
bottom: 0;
}

View File

@ -0,0 +1,75 @@
/**
* @license
*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Blockly React Component.
* @author samelh@google.com (Sam El-Husseini)
*/
import React from 'react';
import './BlocklyComponent.css';
import Blockly from 'blockly/core';
//import locale from 'blockly/msg/en';
import 'blockly/blocks';
//Blockly.setLocale(locale);
class BlocklyComponent extends React.Component {
constructor(props) {
super(props);
this.blocklyDiv = React.createRef();
this.toolbox = React.createRef();
}
componentDidMount() {
const { initialXml, children, ...rest } = this.props;
this.primaryWorkspace = Blockly.inject(
this.blocklyDiv.current,
{
toolbox: this.toolbox.current,
...rest
},
);
if (initialXml) {
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(initialXml), this.primaryWorkspace);
}
}
get workspace() {
return this.primaryWorkspace;
}
setXml(xml) {
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), this.primaryWorkspace);
}
render() {
const { children } = this.props;
return <React.Fragment>
<div ref={this.blocklyDiv} id="blocklyDiv" />
<xml xmlns="https://developers.google.com/blockly/xml" is="blockly" style={{ display: 'none' }} ref={this.toolbox}>
{children}
</xml>
</React.Fragment>;
}
}
export default BlocklyComponent;

View File

@ -0,0 +1,4 @@
import './loops';
import './sensebox';
import './logic';
import './sensebox-sensors';

View File

@ -0,0 +1,61 @@
import { defineBlocksWithJsonArray } from 'blockly';
import Blockly from 'blockly/core';
defineBlocksWithJsonArray([
// If/else block that does not use a mutator.
{
type: 'control_if',
message0: '%{BKY_CONTROLS_IF_MSG_IF} %1',
args0: [
{
type: 'input_value',
name: 'IF0',
check: 'Boolean'
}
],
message1: '%{BKY_CONTROLS_IF_MSG_THEN} %1',
args1: [
{
type: 'input_statement',
name: 'DO0'
}
],
previousStatement: null,
nextStatement: null,
colour: '#b063c5',
tooltip: '%{BKYCONTROLS_IF_TOOLTIP_2}',
helpUrl: '%{BKY_CONTROLS_IF_HELPURL}',
extensions: ['controls_if_tooltip']
},
{
type: 'controls_ifelse',
message0: '%{BKY_CONTROLS_IF_MSG_IF} %1',
args0: [
{
type: 'input_value',
name: 'IF0',
check: 'Boolean'
}
],
message1: '%{BKY_CONTROLS_IF_MSG_THEN} %1',
args1: [
{
type: 'input_statement',
name: 'DO0'
}
],
message2: '%{BKY_CONTROLS_IF_MSG_ELSE} %1',
args2: [
{
type: 'input_statement',
name: 'ELSE'
}
],
previousStatement: null,
nextStatement: null,
colour: '#b063c5',
tooltip: '%{BKYCONTROLS_IF_TOOLTIP_2}',
helpUrl: '%{BKY_CONTROLS_IF_HELPURL}',
extensions: ['controls_if_tooltip']
}
]);

View File

@ -0,0 +1,51 @@
import Blockly from 'blockly';
Blockly.defineBlocksWithJsonArray([
{
type: 'controls_for',
message0: 'count with %1 from %2 to %3 by adding %4',
args0: [
{
type: 'field_variable',
name: 'VAR',
variable: null,
variableTypes: ['Number'],
defaultType: 'Number',
createNewVariable: true,
showOnlyVariableAssigned: false,
},
{
type: 'input_value',
name: 'FROM',
check: 'Number',
align: 'RIGHT',
},
{
type: 'input_value',
name: 'TO',
check: 'Number',
align: 'RIGHT',
},
{
type: 'input_value',
name: 'BY',
check: 'Number',
align: 'RIGHT',
},
],
message1: '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',
args1: [
{
type: 'input_statement',
name: 'DO',
},
],
inputsInline: false,
previousStatement: null,
nextStatement: null,
helpUrl: '%{BKY_CONTROLS_FOR_HELPURL}',
extensions: ['contextMenu_newGetVariableBlock', 'controls_for_tooltip'],
},
]);

View File

@ -0,0 +1,20 @@
import Blockly from 'blockly';
Blockly.Blocks['sensebox_sensor_temp_hum'] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_temp_hum);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_hum, "Humidity"]]), "NAME");
this.setOutput(true, "Number");
this.setColour(120);
this.setTooltip(Blockly.Msg.senseBox_temp_hum_tip);
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
},
getBlockType: function () {
return Blockly.Types.DECIMAL;
},
};

View File

@ -0,0 +1,16 @@
import Blockly from 'blockly';
Blockly.Blocks["sensebox_telegram"] = {
init: function () {
this.setColour(120);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_telegram_init);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("telegram")
.appendField(new Blockly.FieldTextInput("token"), "telegram_token");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};

View File

@ -0,0 +1,71 @@
/**
* @license
*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Sample React Blockly Field.
* This shows you how to create a custom Blockly field that renders a React
* component inside of the dropdown div when shown.
* @author samelh@google.com (Sam El-Husseini)
*/
import React from 'react';
import ReactDOM from 'react-dom';
import * as Blockly from 'blockly/core';
class BlocklyReactField extends Blockly.Field {
static fromJson(options) {
return new BlocklyReactField(options['text']);
}
showEditor_() {
this.div_ = Blockly.DropDownDiv.getContentDiv();
ReactDOM.render(this.render(),
this.div_);
var border = this.sourceBlock_.getColourBorder();
border = border.colourBorder || border.colourLight;
Blockly.DropDownDiv.setColour(this.sourceBlock_.getColour(), border);
Blockly.DropDownDiv.showPositionedByField(
this, this.dropdownDispose_.bind(this));
}
dropdownDispose_() {
ReactDOM.unmountComponentAtNode(this.div_);
}
render() {
return <FieldRenderComponent />
}
}
class FieldRenderComponent extends React.Component {
render() {
return <div style={{ color: '#fff' }}>
Hello from React!
</div>;
}
}
Blockly.fieldRegistry.register('field_react_component', BlocklyReactField);
export default BlocklyReactField;

View File

@ -0,0 +1,62 @@
/**
* @license
*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview React date field that uses the react-datepicker package.
* @author samelh@google.com (Sam El-Husseini)
*/
import React from 'react';
import * as Blockly from 'blockly/core';
import BlocklyReactField from './BlocklyReactField';
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
class ReactDateField extends BlocklyReactField {
static fromJson(options) {
return new ReactDateField(new Date(options['date']));
}
onDateSelected_ = (date) => {
this.setValue(new Date(date));
Blockly.DropDownDiv.hideIfOwner(this, true);
}
getText_() {
return this.value_.toLocaleDateString();
};
fromXml(fieldElement) {
this.setValue(new Date(fieldElement.textContent));
}
render() {
return <DatePicker
selected={this.value_}
onChange={this.onDateSelected_}
inline />
}
}
Blockly.fieldRegistry.register('field_react_date', ReactDateField);
export default ReactDateField;

View File

@ -0,0 +1,311 @@
/**
* @license
*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Define generation methods for custom blocks.
* @author samelh@google.com (Sam El-Husseini)
*/
// More on generating code:
// https://developers.google.com/blockly/guides/create-custom-blocks/generating-code
import * as Blockly from 'blockly/core';
import * as _ from 'lodash';
/**
* Arduino code generator.
* @type !Blockly.Generator
*/
Blockly['Arduino'] = new Blockly.Generator('Arduino');
/**
* List of illegal variable names.
* This is not intended to be a security feature. Blockly is 100% client-side,
* so bypassing this list is trivial. This is intended to prevent users from
* accidentally clobbering a built-in object or function.
* @private
*/
Blockly['Arduino'].addReservedWords(
// http://arduino.cc/en/Reference/HomePage
'setup,loop,if,else,for,switch,case,while,' +
'do,break,continue,return,goto,define,include,' +
'HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,' +
'interger, constants,floating,point,void,bookean,char,' +
'unsigned,byte,int,word,long,float,double,string,String,array,' +
'static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead,' +
'analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn,' +
'pulseIn,millis,micros,delay,delayMicroseconds,min,max,abs,constrain,' +
'map,pow,sqrt,sin,cos,tan,randomSeed,random,lowByte,highByte,bitRead,' +
'bitWrite,bitSet,bitClear,ultraSonicDistance,parseDouble,setNeoPixelColor,' +
'bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts',
'short',
'isBtnPressed'
);
/**
* Order of operation ENUMs.
*
*/
Blockly['Arduino'].ORDER_ATOMIC = 0; // 0 "" ...
Blockly['Arduino'].ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .
Blockly['Arduino'].ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr
Blockly['Arduino'].ORDER_MULTIPLICATIVE = 3; // * / % ~/
Blockly['Arduino'].ORDER_ADDITIVE = 4; // + -
Blockly['Arduino'].ORDER_LOGICAL_NOT = 4.4; // !
Blockly['Arduino'].ORDER_SHIFT = 5; // << >>
Blockly['Arduino'].ORDER_MODULUS = 5.3; // %
Blockly['Arduino'].ORDER_RELATIONAL = 6; // is is! >= > <= <
Blockly['Arduino'].ORDER_EQUALITY = 7; // === !== === !==
Blockly['Arduino'].ORDER_BITWISE_AND = 8; // &
Blockly['Arduino'].ORDER_BITWISE_XOR = 9; // ^
Blockly['Arduino'].ORDER_BITWISE_OR = 10; // |
Blockly['Arduino'].ORDER_LOGICAL_AND = 11; // &&
Blockly['Arduino'].ORDER_LOGICAL_OR = 12; // ||
Blockly['Arduino'].ORDER_CONDITIONAL = 13; // expr ? expr : expr
Blockly['Arduino'].ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
Blockly['Arduino'].ORDER_COMMA = 18; // ,
Blockly['Arduino'].ORDER_NONE = 99; // (...)
/**
* Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
*/
Blockly['Arduino'].init = function (workspace) {
// Create a dictionary of definitions to be printed before the code.
Blockly['Arduino'].libraries_ = Object.create(null);
// creates a list of code to be setup before the setup block
Blockly['Arduino'].setupCode_ = Object.create(null);
// Create a dictionary mapping desired function names in definitions_
// to actual function names (to avoid collisions with user functions).
Blockly['Arduino'].functionNames_ = Object.create(null);
Blockly['Arduino'].variablesInitCode_ = '';
if (!Blockly['Arduino'].variableDB_) {
Blockly['Arduino'].variableDB_ = new Blockly.Names(
Blockly['Arduino'].RESERVED_WORDS_
);
} else {
Blockly['Arduino'].variableDB_.reset();
}
Blockly['Arduino'].variableDB_.setVariableMap(workspace.getVariableMap());
// We don't have developer variables for now
// // Add developer variables (not created or named by the user).
// var devVarList = Blockly.Variables.allDeveloperVariables(workspace);
// for (var i = 0; i < devVarList.length; i++) {
// defvars.push(Blockly['Arduino'].variableDB_.getName(devVarList[i],
// Blockly.Names.DEVELOPER_VARIABLE_TYPE));
// }
const doubleVariables = workspace.getVariablesOfType('Number');
let i = 0;
let variableCode = '';
for (i = 0; i < doubleVariables.length; i += 1) {
variableCode +=
'double ' +
Blockly['Arduino'].variableDB_.getName(
doubleVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
' = 0; \n\n';
}
const stringVariables = workspace.getVariablesOfType('String');
for (i = 0; i < stringVariables.length; i += 1) {
variableCode +=
'String ' +
Blockly['Arduino'].variableDB_.getName(
stringVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
' = ""; \n\n';
}
const booleanVariables = workspace.getVariablesOfType('Boolean');
for (i = 0; i < booleanVariables.length; i += 1) {
variableCode +=
'boolean ' +
Blockly['Arduino'].variableDB_.getDistinctName(
booleanVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
' = false; \n\n';
}
const colourVariables = workspace.getVariablesOfType('Colour');
for (i = 0; i < colourVariables.length; i += 1) {
variableCode +=
'RGB ' +
Blockly['Arduino'].variableDB_.getName(
colourVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
' = {0, 0, 0}; \n\n';
}
Blockly['Arduino'].variablesInitCode_ = variableCode;
};
/**
* Prepend the generated code with the variable definitions.
* @param {string} code Generated code.
* @return {string} Completed code.
*/
Blockly['Arduino'].finish = function (code) {
let libraryCode = '';
let functionsCode = '';
let devVariables = '\n';
for (const key in Blockly['Arduino'].libraries_) {
libraryCode += Blockly['Arduino'].libraries_[key] + '\n';
}
for (const key in Blockly['Arduino'].functionNames_) {
functionsCode += Blockly['Arduino'].functionNames_[key] + '\n';
}
if (!_.isEmpty(Blockly['Arduino'].setupCode_['bluetooth_setup'])) {
devVariables += 'String bluetoothMessageDEV = ""; \n';
}
if (!_.isEmpty(Blockly['Arduino'].setupCode_['serial_begin'])) {
devVariables += 'String serialMessageDEV = ""; \n';
}
if (!_.isEmpty(Blockly['Arduino'].functionNames_['double_to_string_debug'])) {
devVariables += 'boolean stopDebugging = false; \n';
}
let setupCode = '';
let preSetupCode = '';
for (const key in Blockly['Arduino'].setupCode_) {
preSetupCode += Blockly['Arduino'].setupCode_[key] || '';
}
setupCode = '\nvoid setup() { \n' + preSetupCode + '\n}\n';
let loopCode = '\nvoid loop() { \n' + code + '\n}\n';
// Convert the definitions dictionary into a list.
code =
devVariables +
'\n' +
libraryCode +
'\n' +
Blockly['Arduino'].variablesInitCode_ +
'\n' +
functionsCode +
'\n' +
setupCode +
'\n' +
loopCode
;
// Clean up temporary data.
delete Blockly['Arduino'].definitions_;
delete Blockly['Arduino'].functionNames_;
delete Blockly['Arduino'].variablesInitCode_;
delete Blockly['Arduino'].libraries_;
Blockly['Arduino'].variableDB_.reset();
return code;
};
/**
* Naked values are top-level blocks with outputs that aren't plugged into
* anything. A trailing semicolon is needed to make this legal.
* @param {string} line Line of generated code.
* @return {string} Legal line of code.
*/
Blockly['Arduino'].scrubNakedValue = function (line) {
return line + ';\n';
};
/**
* Encode a string as a properly escaped Arduino string, complete with
* quotes.
* @param {string} string Text to encode.
* @return {string} Arduino string.
* @private
*/
Blockly['Arduino'].quote_ = function (string) {
// Can't use goog.string.quote since Google's style guide recommends
// JS string literals use single quotes.
string = string
.replace(/\\/g, '\\\\')
.replace(/\n/g, '\\\n')
.replace(/'/g, "\\'");
return '"' + string + '"';
};
/**
* Common tasks for generating Arduino from blocks.
* Handles comments for the specified block and any connected value blocks.
* Calls any statements following this block.
* @param {!Blockly.Block} block The current block.
* @param {string} code The Arduino code created for this block.
* @param {boolean=} opt_thisOnly True to generate code for only this statement.
* @return {string} Arduino code with comments and subsequent blocks added.
* @private
*/
Blockly['Arduino'].scrub_ = function (block, code) {
let commentCode = '';
// Only collect comments for blocks that aren't inline.
if (!block.outputConnection || !block.outputConnection.targetConnection) {
// Collect comment for this block.
let comment = block.getCommentText();
//@ts-ignore
comment = comment ? Blockly.utils.string.wrap(
comment,
Blockly['Arduino'].COMMENT_WRAP - 3
) : null;
if (comment) {
if (block.getProcedureDef) {
// Use a comment block for function comments.
commentCode +=
'/**\n' +
Blockly['Arduino'].prefixLines(comment + '\n', ' * ') +
' */\n';
} else {
commentCode += Blockly['Arduino'].prefixLines(comment + '\n', '// ');
}
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
for (let i = 0; i < block.inputList.length; i++) {
if (block.inputList[i].type === Blockly.INPUT_VALUE) {
const childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
const comment = Blockly['Arduino'].allNestedComments(childBlock);
if (comment) {
commentCode += Blockly['Arduino'].prefixLines(comment, '// ');
}
}
}
}
}
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
const nextCode = Blockly['Arduino'].blockToCode(nextBlock);
return commentCode + code + nextCode;
};

View File

@ -0,0 +1,5 @@
import './generator';
import './loops';
import './sensebox';
import './logic';

View File

@ -0,0 +1,98 @@
import * as Blockly from 'blockly/core';
import { Block } from 'blockly';
Blockly.Arduino['logic_boolean'] = function (Block) {
// Boolean values true and false.
const code = Block.getFieldValue('BOOL') === 'TRUE' ? 'true' : 'false';
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino['logic_compare'] = function (Block) {
// Comparison operator.
const OPERATORS = {
EQ: '==',
NEQ: '!=',
LT: '<',
LTE: '<=',
GT: '>',
GTE: '>='
};
const operator = OPERATORS[Block.getFieldValue('OP')];
const order =
operator === '==' || operator === '!='
? Blockly.Arduino.ORDER_EQUALITY
: Blockly.Arduino.ORDER_RELATIONAL;
const argument0 = Blockly.Arduino.valueToCode(Block, 'A', order) || '0';
const argument1 = Blockly.Arduino.valueToCode(Block, 'B', order) || '0';
const code = '( ' + argument0 + ' ' + operator + ' ' + argument1 + ')';
return [code, order];
};
Blockly.Arduino['logic_operation'] = function (Block) {
// Operations 'and', 'or'.
const operator = Block.getFieldValue('OP') === 'AND' ? '&&' : '||';
const order =
operator === '&&'
? Blockly.Arduino.ORDER_LOGICAL_AND
: Blockly.Arduino.ORDER_LOGICAL_OR;
let argument0 = Blockly.Arduino.valueToCode(Block, 'A', order);
let argument1 = Blockly.Arduino.valueToCode(Block, 'B', order);
if (!argument0 && !argument1) {
// If there are no arguments, then the return value is false.
argument0 = 'false';
argument1 = 'false';
} else {
// Single missing arguments have no effect on the return value.
const defaultArgument = operator === '&&' ? 'true' : 'false';
if (!argument0) {
argument0 = defaultArgument;
}
if (!argument1) {
argument1 = defaultArgument;
}
}
const code = argument0 + ' ' + operator + ' ' + argument1;
return [code, order];
};
Blockly.Arduino['control_if'] = function (Block) {
// If/elseif/else condition.
let n = 0;
let code = '',
branchCode,
conditionCode;
do {
conditionCode =
Blockly.Arduino.valueToCode(
Block,
'IF' + n,
Blockly.Arduino.ORDER_NONE
) || 'false';
branchCode = Blockly.Arduino.statementToCode(Block, 'DO' + n);
code +=
(n > 0 ? ' else ' : '') +
'if (' +
conditionCode +
') {\n' +
branchCode +
'}';
++n;
} while (Block.getInput('IF' + n));
if (Block.getInput('ELSE')) {
branchCode = Blockly.Arduino.statementToCode(Block, 'ELSE');
code += ' else {\n' + branchCode + '}';
}
return code + '\n';
};
Blockly.Arduino['controls_ifelse'] = Blockly.Arduino['control_if'];
Blockly.Arduino['logic_negate'] = function (Block) {
// Negation.
const order = Blockly.Arduino.ORDER_UNARY_PREFIX;
const argument0 = Blockly.Arduino.valueToCode(Block, 'BOOL', order) || 'true';
const code = '!' + argument0;
return [code, order];
};

View File

@ -0,0 +1,116 @@
import * as Blockly from 'blockly/core';
import { Block } from 'blockly';
Blockly['Arduino']['controls_repeat_ext'] = function (Block) {
// Repeat n times.
const repeats =
Blockly['Arduino'].valueToCode(
Block,
'TIMES',
Blockly['Arduino'].ORDER_ASSIGNMENT
) || '0';
let branch = Blockly['Arduino'].statementToCode(Block, 'DO');
branch = Blockly['Arduino'].addLoopTrap(branch, Block.id);
let code = '';
const loopVar = 'simple_loop_variable';
code +=
'for (' +
loopVar +
' = 1; ' +
loopVar +
' <= ' +
repeats +
'; ' +
loopVar +
' += 1) {\n' +
branch +
'}\n';
return code;
};
Blockly['Arduino']['controls_for'] = function (Block) {
const loopIndexVariable = Blockly.mainWorkspace.getVariableById(
Block.getFieldValue('VAR')
).name;
const branch = Blockly['Arduino'].statementToCode(Block, 'DO');
const startNumber =
Blockly['Arduino'].valueToCode(
Block,
'FROM',
Blockly['Arduino'].ORDER_ASSIGNMENT
) || '0';
const toNumber =
Blockly['Arduino'].valueToCode(
Block,
'TO',
Blockly['Arduino'].ORDER_ASSIGNMENT
) || '0';
let byNumber = Math.abs(
parseInt(
Blockly['Arduino'].valueToCode(
Block,
'BY',
Blockly['Arduino'].ORDER_ASSIGNMENT
)
)
);
byNumber = byNumber === 0 ? 1 : byNumber;
const addingSub = startNumber < toNumber ? ' +' : ' -';
const sign = startNumber < toNumber ? ' <= ' : ' >= ';
return (
'for (' +
loopIndexVariable +
' = ' +
startNumber +
'; ' +
loopIndexVariable +
sign +
toNumber +
'; ' +
loopIndexVariable +
addingSub +
'= ' +
byNumber +
') {\n' +
branch +
'}\n'
);
};
Blockly['Arduino']['controls_whileUntil'] = function (Block) {
// Do while/until loop.
const until = Block.getFieldValue('MODE') === 'UNTIL';
let argument0 =
Blockly['Arduino'].valueToCode(
Block,
'BOOL',
Blockly['Arduino'].ORDER_LOGICAL_AND
) || 'false';
let branch = Blockly['Arduino'].statementToCode(Block, 'DO');
branch = Blockly['Arduino'].addLoopTrap(branch, Block.id);
if (until) {
argument0 = '!' + argument0;
}
return '\twhile (' + argument0 + ') {\n' + branch + '\t}\n';
};
Blockly['Arduino']['controls_flow_statements'] = function (Block) {
// Flow statements: continue, break.
switch (Block.getFieldValue('FLOW')) {
case 'BREAK':
return 'break;\n';
case 'CONTINUE':
return 'continue;\n';
}
throw Error('Unknown flow statement.');
};

View File

@ -0,0 +1,6 @@
import * as Blockly from 'blockly/core';
import { Block } from 'blockly';
Blockly.Arduino['sensebox_telegram'] = function (Block) {
};

View File

@ -0,0 +1,19 @@
import * as Blockly from 'blockly/core';
import { Block } from 'blockly';
/**
* Telegram Bot by re:edu
*/
Blockly.Arduino['sensebox_telegram'] = function (Block) {
let token = Block.getFieldValue('telegram_token');
Blockly['Arduino'].libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
Blockly['Arduino'].libraries_['library_telegram'] = `#include <UniversalTelegramBot.h>`
Blockly['Arduino'].functionNames_['WiFiSSLClient'] = 'WiFiSSLClient client;';
Blockly['Arduino'].functionNames_['telegram_objects'] = `#define BOTtoken "${token}" // your Bot Token (Get from Botfather)
UniversalTelegramBot bot(BOTtoken, client);`
let code = 'testcode';
return code;
};

View File

@ -0,0 +1,59 @@
/**
* @license
*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview XML wrappers for block, category, value, field and shadow.
* @author samelh@google.com (Sam El-Husseini)
*/
import React from 'react';
import BlocklyComponent from './BlocklyComponent';
export default BlocklyComponent;
const Block = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("block", props, children);
};
const Category = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("category", props, children);
};
const Value = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("value", props, children);
};
const Field = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("field", props, children);
};
const Shadow = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("shadow", props, children);
};
export { Block, Category, Value, Field, Shadow }

View File

@ -0,0 +1,770 @@
import * as Blockly from 'blockly/core';
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.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.COLOUR_BLEND_COLOUR1 = "Farbe 1";
Blockly.Msg.COLOUR_BLEND_COLOUR2 = "mit 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_PICKER_HELPURL = "https://de.wikipedia.org/wiki/Farbe";
Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wähle 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_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 = "Erstelle 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_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_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_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_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_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_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_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.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.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.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_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_ITEM_TOOLTIP = "Ein Element zur Liste hinzufügen.";
Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine List mit konfigurierten 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";
Blockly.Msg.LISTS_GET_INDEX_GET = "nimm";
Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "nimm und entferne";
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_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";
Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "erhalte Unterliste vom Anfang";
Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "erhalte Unterliste von # von hinten";
Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "erhalte Unterliste von #";
Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "";
Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.";
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_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_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_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_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_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_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_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";
Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Liste aus Text erstellen";
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_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_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_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_NULL = "null";
Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert";
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_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.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_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_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_DIVISION_SYMBOL = "÷"; // untranslated
Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist teilbar durch";
Blockly.Msg.MATH_IS_EVEN = "ist gerade";
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_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";
Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest nach einer Division.";
Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×";
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_POWER_SYMBOL = "^";
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_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_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_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_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_SUBTRACTION_SYMBOL = "-";
Blockly.Msg.MATH_TRIG_ACOS = "acos";
Blockly.Msg.MATH_TRIG_ASIN = "asin";
Blockly.Msg.MATH_TRIG_ATAN = "atan";
Blockly.Msg.MATH_TRIG_COS = "cos";
Blockly.Msg.MATH_TRIG_HELPURL = "https://de.wikipedia.org/wiki/Trigonometrie";
Blockly.Msg.MATH_TRIG_SIN = "sin";
Blockly.Msg.MATH_TRIG_TAN = "tan";
Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arkuskosinus des Eingabewertes.";
Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arkussinus des Eingabewertes.";
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 = "";
Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Aussagen erlauben";
Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:";
Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Rufe einen Funktionsblock ohne Rückgabewert auf.";
Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Rufe einen Funktionsblock mit Rückgabewert auf.";
Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:";
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_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";
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_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_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_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_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_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_TAIL = "";
Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiere einen Buchstaben von einer spezifizierten 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.";
Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis zum #ten Buchstaben von hinten";
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_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_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_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_JOIN_HELPURL = "";
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_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_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_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
Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)";
Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeichen vom Anfang (links)";
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_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_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.";
Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
// Ardublockly strings
Blockly.Msg.ARD_ANALOGREAD = "lese analogen Pin#";
Blockly.Msg.ARD_ANALOGREAD_TIP = "Gibt einen Wert zwischen 0 und 1024 zurüch";
Blockly.Msg.ARD_ANALOGWRITE = "setzte analogen Pin#";
Blockly.Msg.ARD_ANALOGWRITE_TIP = "Schreibe analogen Wert zwischen 0 und 255 an einen spezifischen PWM Port";
Blockly.Msg.ARD_BUILTIN_LED = "eingebaute LED";
Blockly.Msg.ARD_BUILTIN_LED_TIP = "Schaltet die interne LED An oder Aus";
Blockly.Msg.ARD_COMPONENT_WARN1 = "A %1 configuration block with the same %2 name must be added to use this block!";
Blockly.Msg.ARD_DEFINE = "Definiere";
Blockly.Msg.ARD_DIGITALREAD = "lesen digitalen Pin#";
Blockly.Msg.ARD_DIGITALREAD_TIP = "Lese Wert an digitalen Pin: HIGH(1) oder LOW(0)";
Blockly.Msg.ARD_DIGITALWRITE = "setzte digitalen Pin#";
Blockly.Msg.ARD_DIGITALWRITE_TIP = "Schreibe digitalen Wert HIGH (1) oder LOW(0) an spezifischen Port";
Blockly.Msg.ARD_FUN_RUN_LOOP = "Endlosschleife()";
Blockly.Msg.ARD_FUN_RUN_SETUP = "Setup()";
Blockly.Msg.ARD_FUN_RUN_TIP = "Definiert die setup() und loop() Funktionen";
Blockly.Msg.ARD_HIGH = "HIGH";
Blockly.Msg.ARD_HIGHLOW_TIP = "Setzt einen Status auf HIGH oder LOWSet a pin state logic High or Low.";
Blockly.Msg.ARD_LOW = "LOW";
Blockly.Msg.ARD_MAP = "Verteile Wert";
Blockly.Msg.ARD_MAP_FROMMIN = "von Minimum";
Blockly.Msg.ARD_MAP_FROMMAX = "bis maximum";
Blockly.Msg.ARD_MAP_TOMIN = "auf Minimum";
Blockly.Msg.ARD_MAP_TOMAX = "bis Maximum";
Blockly.Msg.ARD_MAP_TIP = "Verteilt Werte zwischen [0-1024] zu andere.";
Blockly.Msg.ARD_MAP_VAL = "Wert zu [0-";
Blockly.Msg.ARD_NOTONE = "Schalte Ton aus an Pin";
Blockly.Msg.ARD_NOTONE_PIN = "keinen Ton an Pin";
Blockly.Msg.ARD_NOTONE_PIN_TIP = "Stoppe die Tonerzeugung an Pin";
Blockly.Msg.ARD_NOTONE_TIP = "Schaltet den Ton am ausgewählten Pin aus";
Blockly.Msg.ARD_PIN_WARN1 = "Pin %1 wird benötigt für %2 als Pin %3. Bereitsgenutzt als %4.";
Blockly.Msg.ARD_PULSETIMEOUT_TIP = "Misst die Laufzeit eines Impulses am ausgewählten Pin, wenn die Zeit ist in Microsekunden.";
Blockly.Msg.ARD_PULSE_READ = "Misst %1 Impuls an Pin #%2";
Blockly.Msg.ARD_PULSE_READ_TIMEOUT = "Misst %1 Impuls an Pin #%2 (Unterbrechung nach %3 μs)";
Blockly.Msg.ARD_PULSE_TIP = "Misst die Zeit eines Impulses an dem ausgewählten Pin.";
Blockly.Msg.ARD_SERIAL_BPS = "bps";
Blockly.Msg.ARD_SERIAL_PRINT = "schreibe";
Blockly.Msg.ARD_SERIAL_PRINT_NEWLINE = "neue Zeile hinzufügen";
Blockly.Msg.ARD_SERIAL_PRINT_TIP = "Prints data to the console/serial port as human-readable ASCII text."; // untranslated
Blockly.Msg.ARD_SERIAL_PRINT_WARN = "A setup block for %1 must be added to the workspace to use this block!"; // untranslated
Blockly.Msg.ARD_SERIAL_SETUP = "Setup";
Blockly.Msg.ARD_SERIAL_SETUP_TIP = "Selects the speed for a specific Serial peripheral"; // untranslated
Blockly.Msg.ARD_SERIAL_SPEED = ": Übertragungsgeschwindigkeit zu";
Blockly.Msg.ARD_SERVO_READ = "liest SERVO an PIN#";
Blockly.Msg.ARD_SERVO_READ_TIP = "Liest den Winkel des Servomotors aus";
Blockly.Msg.ARD_SERVO_WRITE = "setzt SERVO an Pin";
Blockly.Msg.ARD_SERVO_WRITE_DEG_180 = "Winkel (0~180)";
Blockly.Msg.ARD_SERVO_WRITE_TIP = "Set a Servo to an specified angle"; // untranslated
Blockly.Msg.ARD_SERVO_WRITE_TO = ""; // untranslated
Blockly.Msg.ARD_SETTONE = "Spiele Ton an Pin"; // untranslated
Blockly.Msg.ARD_SPI_SETUP = "Setup";
Blockly.Msg.ARD_SPI_SETUP_CONF = "Konfiguration:";
Blockly.Msg.ARD_SPI_SETUP_DIVIDE = "clock divide"; // untranslated
Blockly.Msg.ARD_SPI_SETUP_LSBFIRST = "LSBFIRST"; // untranslated
Blockly.Msg.ARD_SPI_SETUP_MODE = "SPI mode (idle - edge)"; // untranslated
Blockly.Msg.ARD_SPI_SETUP_MODE0 = "0 (LOW - Fallend)";
Blockly.Msg.ARD_SPI_SETUP_MODE1 = "1 (LOW - Steigend)";
Blockly.Msg.ARD_SPI_SETUP_MODE2 = "2 (HIGH - Fallend)";
Blockly.Msg.ARD_SPI_SETUP_MODE3 = "3 (HIGH - Steigend)";
Blockly.Msg.ARD_SPI_SETUP_MSBFIRST = "MSBFIRST"; // untranslated
Blockly.Msg.ARD_SPI_SETUP_SHIFT = "data shift"; // untranslated
Blockly.Msg.ARD_SPI_SETUP_TIP = "Configures the SPI peripheral."; // untranslated
Blockly.Msg.ARD_SPI_TRANSRETURN_TIP = "Send a SPI message to an specified slave device and get data back."; // untranslated
Blockly.Msg.ARD_SPI_TRANS_NONE = "none"; // untranslated
Blockly.Msg.ARD_SPI_TRANS_SLAVE = "to slave pin"; // untranslated
Blockly.Msg.ARD_SPI_TRANS_TIP = "Send a SPI message to an specified slave device."; // untranslated
Blockly.Msg.ARD_SPI_TRANS_VAL = "transfer"; // untranslated
Blockly.Msg.ARD_SPI_TRANS_WARN1 = "A setup block for %1 must be added to the workspace to use this block!"; // untranslated
Blockly.Msg.ARD_SPI_TRANS_WARN2 = "Old pin value %1 is no longer available."; // untranslated
Blockly.Msg.ARD_STEPPER_COMPONENT = "stepper"; // untranslated
Blockly.Msg.ARD_STEPPER_DEFAULT_NAME = "MyStepper"; // untranslated
Blockly.Msg.ARD_STEPPER_FOUR_PINS = "4"; // untranslated
Blockly.Msg.ARD_STEPPER_MOTOR = "stepper motor:"; // untranslated
Blockly.Msg.ARD_STEPPER_NUMBER_OF_PINS = "Number of pins"; // untranslated
Blockly.Msg.ARD_STEPPER_PIN1 = "pin1#"; // untranslated
Blockly.Msg.ARD_STEPPER_PIN2 = "pin2#"; // untranslated
Blockly.Msg.ARD_STEPPER_PIN3 = "pin3#"; // untranslated
Blockly.Msg.ARD_STEPPER_PIN4 = "pin4#"; // untranslated
Blockly.Msg.ARD_STEPPER_REVOLVS = "how many steps per revolution"; // untranslated
Blockly.Msg.ARD_STEPPER_SETUP = "Setup stepper motor"; // untranslated
Blockly.Msg.ARD_STEPPER_SETUP_TIP = "Configures a stepper motor pinout and other settings."; // untranslated
Blockly.Msg.ARD_STEPPER_SPEED = "set speed (rpm) to"; // untranslated
Blockly.Msg.ARD_STEPPER_STEP = "move stepper"; // untranslated
Blockly.Msg.ARD_STEPPER_STEPS = "steps"; // untranslated
Blockly.Msg.ARD_STEPPER_STEP_TIP = "Turns the stepper motor a specific number of steps."; // untranslated
Blockly.Msg.ARD_STEPPER_TWO_PINS = "2"; // untranslated
Blockly.Msg.ARD_TIME_DELAY = "Warte";
Blockly.Msg.ARD_TIME_DELAY_MICROS = "Mikrosekunden";
Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP = "Warte eine spezifischen Zeit in Microsekunden";
Blockly.Msg.ARD_TIME_DELAY_TIP = "Warte spezifische Zeit in Millisekunden";
Blockly.Msg.ARD_TIME_INF = "Warte für immer (Beende Programm)";
Blockly.Msg.ARD_TIME_INF_TIP = "Stoppt das Programm.";
Blockly.Msg.ARD_TIME_MICROS = "Bereits vergangen Zeit (Mikrosekunden)";
Blockly.Msg.ARD_TIME_MICROS_TIP = "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden"; // untranslated
Blockly.Msg.ARD_TIME_MILLIS = "Bereits vergangen Zeit (Millisekunden)";
Blockly.Msg.ARD_TIME_MILLIS_TIP = "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden"; // untranslated
Blockly.Msg.ARD_TIME_MS = "Millisekunden";
Blockly.Msg.ARD_TONEFREQ = "mit Frequenz";
Blockly.Msg.ARD_TONE_FREQ = "Frequenz";
Blockly.Msg.ARD_TONE_PIN = "Ton PIN#";
Blockly.Msg.ARD_TONE_PIN_TIP = "Erzeugt einen Ton an Pin";
Blockly.Msg.ARD_TONE_TIP = "Erzeugt einen Ton an Pin mit einer spezifischen Frequenz zwischen 31 - 65535";
Blockly.Msg.ARD_TONE_WARNING = "Frequenz muss zwischen 31 - 65535 liegen";
Blockly.Msg.ARD_TYPE_ARRAY = "Array";
Blockly.Msg.ARD_TYPE_BOOL = "Boolean";
Blockly.Msg.ARD_TYPE_CHAR = "Zeichen";
Blockly.Msg.ARD_TYPE_CHILDBLOCKMISSING = "ChildBlockMissing"; // untranslated
Blockly.Msg.ARD_TYPE_DECIMAL = "Dezimalzahl";
Blockly.Msg.ARD_TYPE_LONG = "große Zahl";
Blockly.Msg.ARD_TYPE_NULL = "Null";
Blockly.Msg.ARD_TYPE_NUMBER = "Zahl";
Blockly.Msg.ARD_TYPE_SHORT = "kurze Zahl";
Blockly.Msg.ARD_TYPE_TEXT = "Text";
Blockly.Msg.ARD_TYPE_UNDEF = "Undefiniert";
Blockly.Msg.ARD_VAR_AS = "als";
Blockly.Msg.ARD_VAR_AS_TIP = "Wert einem spezififischen Datentyp zuordnen";
Blockly.Msg.ARD_WRITE_TO = "zu";
Blockly.Msg.NEW_INSTANCE = "Neue Instanz...";
Blockly.Msg.NEW_INSTANCE_TITLE = "Neue Instanz mit Name:";
Blockly.Msg.RENAME_INSTANCE = "Instanz umbenennen...";
Blockly.Msg.RENAME_INSTANCE_TITLE = "Benenne alle '%1' Instanzen zu:";
/*senseBox Blockly Translations*/
Blockly.Msg.senseBox_basic_blue = "Blau";
Blockly.Msg.senseBox_basic_green = "Grün";
Blockly.Msg.senseBox_basic_red = "Rot";
Blockly.Msg.senseBox_basic_state = "Status";
Blockly.Msg.senseBox_off = "Aus";
Blockly.Msg.senseBox_on = "Ein";
Blockly.Msg.senseBox_sensor = "Sensoren"
Blockly.Msg.senseBox_output_filename = "Daten";
Blockly.Msg.senseBox_output_format = "Format:";
Blockly.Msg.senseBox_sd_create_file = "Erstelle Datei auf SD-Karte";
Blockly.Msg.senseBox_sd_write_file = " Schreibe Daten auf SD-Karte";
Blockly.Msg.senseBox_sd_open_file = "Öffne eine Datei auf der SD-Karte";
Blockly.Msg.sensebox_sd_filename = "Daten";
Blockly.Msg.senseBox_SD_COMPONENT = "SD-Block";
Blockly.Msg.senseBox_sd_decimals = "Dezimalen";
Blockly.Msg.senseBox_output_linebreak = "Zeilenumbruch";
Blockly.Msg.senseBox_output_networkid = "NetzwerkID";
Blockly.Msg.senseBox_output_password = "Passwort";
Blockly.Msg.senseBox_output_safetosd = "Auf SD Karte speichern";
Blockly.Msg.senseBox_output_safetosd_tip = "Speichert Messwerte auf SD Karte"
Blockly.Msg.senseBox_output_serialprint = "Auf Kommandozeile ausgeben";
Blockly.Msg.senseBox_serial_tip = "Gibt Messwerte oder Daten auf dem Seriellen Monitor der Arduino IDE aus. Praktisch um ohne Display zu arbeiten";
Blockly.Msg.senseBox_output_timestamp = "Zeitstempel";
Blockly.Msg.senseBox_button = "Button";
Blockly.Msg.senseBox_button_tip = "Liest den Zustand des Buttons";
Blockly.Msg.senseBox_led = "LED an digitalen";
Blockly.Msg.senseBox_led_tip = "Einfache LED. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden";
Blockly.Msg.senseBox_piezo = "Piezo an digital";
Blockly.Msg.senseBox_piezo_tip = "Piezo an digital PIN. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden";
Blockly.Msg.senseBox_foto = "Fotowiderstand";
Blockly.Msg.senseBox_foto_tip = "Fotowiderstand";
Blockly.Msg.senseBox_hum = "Luftfeuchtigkeit in %";
Blockly.Msg.senseBox_hum_tip = "Luftfeuchtigkeit";
Blockly.Msg.senseBox_ir = "Infrarot Abstandssensor";
Blockly.Msg.senseBox_ir_tip = "Infrarot Abstandssensor";
Blockly.Msg.senseBox_lux = "Helligkeitssensor";
Blockly.Msg.senseBox_lux_tip = "Helligkeitssensor";
Blockly.Msg.senseBox_poti = "Potenziometer";
Blockly.Msg.senseBox_poti_tip = "Potenziometer";
Blockly.Msg.senseBox_pressure_sensor = "Luftdruck-/Temperatursensor (BMP280)";
Blockly.Msg.senseBox_pressure = "Luftdruck in Pa";
Blockly.Msg.senseBox_pressure_dimension = "Luftdruck in Pa";
Blockly.Msg.senseBox_pressure_tip = "Luftdrucksensor";
Blockly.Msg.senseBox_pressure_referencePressure = "Luftdruck auf NN";
Blockly.Msg.senseBox_pressure_referencePressure_dim = "hPa";
Blockly.Msg.senseBox_sound = "Mikrofon";
Blockly.Msg.senseBox_sound_tip = "Gibt den Messwert des Mikrofons in Volt zurück";
Blockly.Msg.senseBox_rgb_led = "RGB-LED"
Blockly.Msg.senseBox_rgb_led_tip = "RGB-LED benötigt einen digitalen Pin und eine Stromkreis ";
Blockly.Msg.senseBox_temp = "Temperatur in °C";
Blockly.Msg.senseBox_temp_hum = "Temperatur-/Luftfeuchtigkeitssensor (HDC1080)";
Blockly.Msg.senseBox_temp_hum_tip = "Sensor misst Temperatur und Luftfeuchtigkeit";
Blockly.Msg.senseBox_ultrasonic = "Ultraschall-Abstandssensor an Port";
Blockly.Msg.senseBox_ultrasonic_port_A = "A";
Blockly.Msg.senseBox_ultrasonic_port_B = "B";
Blockly.Msg.senseBox_ultrasonic_port_C = "C";
Blockly.Msg.senseBox_ultrasonic_tip = "Misst die Distanz mithilfe von Ultraschall in cm";
Blockly.Msg.senseBox_value = "Messwert:";
Blockly.Msg.senseBox_uv_light = "Helligkeit-/UV-Sensor";
Blockly.Msg.senseBox_uv_light_tip = "Sensor misst UV-Licht oder die Helligkeit";
Blockly.Msg.senseBox_uv = "UV-Intensität in µW/cm²";
Blockly.Msg.senseBox_light = "Beleuchtungsstärke in Lux";
Blockly.Msg.senseBox_bmx055_compass = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_accelerometer = "Beschleunigungssensor";
Blockly.Msg.senseBox_bmx055_accelerometer_range = "Messbereich";
Blockly.Msg.senseBox_bmx055_accelerometer_range_2g = "2g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_4g = "4g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_8g = "8g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_16g = "16g";
Blockly.Msg.senseBox_bmx055_accelerometer_direction = "Richtung";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_x = "X-Achse";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_y = "Y-Achse";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_z = "Z-Achse";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_total = "Gesamt";
Blockly.Msg.senseBox_bmx055_gyroscope = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_accelerometer_tip = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_compass_tip = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_gyroscope_tip = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_x = "X-Richtung";
Blockly.Msg.senseBox_bmx055_y = "Y-Richtung";
Blockly.Msg.senseBox_wifi_connect = "Verbinde mit WLAN";
Blockly.Msg.senseBox_wifi_ssid = "Netzwerkname";
Blockly.Msg.senseBox_wifi_tip = "stellt eine WLAN verbindung her";
Blockly.Msg.senseBox_wifi_startap = "Initialisiere WLAN Access Point";
Blockly.Msg.senseBox_osem_connection_tip = "stellt eine WLAN verbindung her";
Blockly.Msg.senseBox_send_to_osem_tip = "sende Messwert an";
Blockly.Msg.senseBox_send_to_osem = "Sende Messwert an die openSenseMap";
Blockly.Msg.senseBox_osem_connection = "Verbinde mit openSenseMap:";
Blockly.Msg.senseBox_osem_host = "opensensemap.org";
Blockly.Msg.senseBox_osem_host_workshop = "workshop.opensensemap.org";
Blockly.Msg.senseBox_osem_connection = "Verbinde mit openSenseMap";
Blockly.Msg.senseBox_osem_exposure = "Typ";
Blockly.Msg.senseBox_osem_stationary = "Stationär";
Blockly.Msg.senseBox_osem_mobile = "Mobil";
Blockly.Msg.senseBox_sds011 = "Feinstaubsensor";
Blockly.Msg.senseBox_sds011_dimension = "in µg/m³ an";
Blockly.Msg.senseBox_sds011_pm25 = "PM2.5";
Blockly.Msg.senseBox_sds011_pm10 = "PM10";
Blockly.Msg.senseBox_sds011_tip = "Misst die Feinstaubbelastung";
Blockly.Msg.senseBox_sds011_serial1 = "Serial1";
Blockly.Msg.senseBox_sds011_serial2 = "Serial2";
/*Display*/
Blockly.Msg.senseBox_display_beginDisplay = "Display initialisieren";
Blockly.Msg.senseBox_display_clearDisplay_tip = "Starten die Ausgabe auf dem Display";
Blockly.Msg.senseBox_display_clearDisplay = "Display löschen";
Blockly.Msg.senseBox_display_clearDisplay_tip = "Löscht den Inhalt des Displays";
Blockly.Msg.senseBox_display_printDisplay = "Schreibe Text/Zahl";
Blockly.Msg.senseBox_display_printDisplay_tip = "zeigt Wert auf dem Display an.";
Blockly.Msg.senseBox_display_printDisplay_x = "x-Koordinate";
Blockly.Msg.senseBox_display_printDisplay_y = "y-Koordinate";
Blockly.Msg.senseBox_display_printDisplay_value = "Wert";
Blockly.Msg.senseBox_display_setSize = "Schriftgröße";
Blockly.Msg.senseBox_display_setSize_tip = "Ändere die Schriftgröße auf einen Wert zwischen 1 und 10.";
Blockly.Msg.senseBox_display_color = "Schriftfarbe";
Blockly.Msg.senseBox_display_white = "Weiß";
Blockly.Msg.senseBox_display_black = "Schwarz";
Blockly.Msg.sensebox_display_show = "Zeige auf dem Display";
Blockly.Msg.sensebox_display_show_tip = "Zeigt den Nachfolgenden Inhalt auf dem Bildschirm";
Blockly.Msg.senseBox_dipslay_plotTitle = "Titel";
Blockly.Msg.senseBox_display_plotDisplay = "Zeichne Diagramm";
Blockly.Msg.senseBox_display_plotXLabel = "X-Achsen Beschriftung";
Blockly.Msg.senseBox_display_plotYLabel = "Y-Achsen Beschriftung";
Blockly.Msg.senseBox_display_plotXRange1 = "X-Wertebereich Anfang";
Blockly.Msg.senseBox_display_plotXRange2 = "X-Wertebereich Ende";
Blockly.Msg.senseBox_display_plotYRange1 = "Y-Wertebereich Anfang";
Blockly.Msg.senseBox_display_plotYRange2 = "Y-Wertebereich Ende";
Blockly.Msg.senseBox_display_plotXTick = "X-Linienabstand";
Blockly.Msg.senseBox_display_plotYTick = "Y-Linienabstand";
Blockly.Msg.senseBox_display_plotTimeFrame = "Zeitabschnitt";
Blockly.Msg.sensebox_display_fillCircle = "Zeichne Punkt";
Blockly.Msg.sensebox_display_fillCircle_radius = "Radius";
Blockly.Msg.sensebox_display_drawRectangle = "Zeichne Rechteck";
Blockly.Msg.sensebox_display_drawRectangle_width = "Breite";
Blockly.Msg.sensebox_display_drawRectangle_height = "Höhe";
Blockly.Msg.senseBox_display_filled = "Ausgefüllt"
// GPS
Blockly.Msg.senseBox_gps_getValues = "GPS Modul";
Blockly.Msg.senseBox_gps_getValues_tip = "ruft das GPS Signal ab";
Blockly.Msg.senseBox_gps_lat = "Breitengrad";
Blockly.Msg.senseBox_gps_lng = "Längengrad";
Blockly.Msg.senseBox_gps_alt = "Höhe über NN in m";
Blockly.Msg.senseBox_gps_speed = "Geschwindigkeit in km/h";
Blockly.Msg.senseBox_gps_date = "Datum";
Blockly.Msg.senseBox_gps_time = "Uhrzeit";
Blockly.Msg.senseBox_gps_timeStamp = "Zeitstempel (RFC 3339)";
// openSenseMap
Blockly.Msg.senseBox_send_mobile_to_osem = "Sende Messwert und Standort an die openSenseMap";
Blockly.Msg.senseBox_send_mobile_to_osem_tip = "Sende Messwert und Standort an die openSenseMap";
Blockly.Msg.senseBox_interval_timer = "Messintervall";
Blockly.Msg.senseBox_interval = "ms"
Blockly.Msg.senseBox_interval_timer_tip = "Intervall";
Blockly.Msg.senseBox_soil = "Bodenfeuchte";
Blockly.Msg.senseBox_watertemperature = "Wassertemperatur"
// Cases
Blockly.Msg.cases_do = "Führe aus";
Blockly.Msg.cases_condition = "Fall (Variable) = ";
Blockly.Msg.cases_switch = "Variable";
Blockly.Msg.cases_add = "Fall";
//Button
Blockly.Msg.senseBox_button_isPressed = "ist gedrückt";
Blockly.Msg.senseBox_button_switch = "als Schalter";
Blockly.Msg.senseBox_button_wasPressed = "wurde gedrückt";
//Webserver
Blockly.Msg.senseBox_ip_address = "IP-Adresse";
Blockly.Msg.senseBox_ip_address_tip = "Gibt die IP-Adresse als Zeichenkette zurück.";
Blockly.Msg.senseBox_init_http_server_tip = "Initialisiert einen http-Server auf dem angegebenen Port";
Blockly.Msg.senseBox_init_http_server = "HTTP-Server initialisieren";
Blockly.Msg.senseBox_http_on_client_connect = "Wenn Client verbunden ist:";
Blockly.Msg.senseBox_http_on_client_connect_tip = "Überprüft, ob ein Client verbunden ist und führt in diesem Fall die angegebene Anweisung aus";
Blockly.Msg.senseBox_http_method = "Methode";
Blockly.Msg.senseBox_http_method_tip = "Methode des aktuellen HTTP-Requests";
Blockly.Msg.senseBox_http_uri = "URI";
Blockly.Msg.senseBox_http_uri_tip = "URI der angeforderten Ressource der aktuellen HTTP-Anfrage";
Blockly.Msg.senseBox_http_user_agent = "User-Agent";
Blockly.Msg.senseBox_http_user_agent_tip = "Der Benutzer-Agent sendet zusammen mit der aktuellen HTTP-Anfrage";
Blockly.Msg.senseBox_http_protocol_version = "HTTP Version";
Blockly.Msg.senseBox_http_protocol_version_tip = "The HTTP Version of the current HTTP request";
Blockly.Msg.senseBox_http_success_tip = "Senden einer erfolgreichen HTTP-Antwort mit Inhalt";
Blockly.Msg.senseBox_http_not_found_tip = "Senden einer vordefinierten 404 HTTP-Antwort.";
Blockly.Msg.senseBox_http_success = "Erfolgreiche";
Blockly.Msg.senseBox_http_success_l2 = "HTTP-Antwort";
Blockly.Msg.senseBox_http_success_buildhtml = "HTML:"
Blockly.Msg.senseBox_http_not_found = "404 Fehler";
Blockly.Msg.senseBox_html_document = "HTML";
Blockly.Msg.senseBox_html_header = "<head>";
Blockly.Msg.senseBox_html_header_end = "</head>";
Blockly.Msg.senseBox_html_body = "<body>";
Blockly.Msg.senseBox_html_body_end = "</body>";
Blockly.Msg.senseBox_html_general_tag_tip = "Ein allgemeiner HTML-Tag-Baustein.";
Blockly.Msg.senseBox_html_document_tip = "Ein Block zum Erzeugen eines HTML-Dokuments...";
Blockly.Msg.senseBox_tag_first_mutator_tip = "Mögliche Erweiterungen zu diesem Block...";
Blockly.Msg.senseBox_tag_optional_mutator_tip = "Mehr Tags zum Block hinzufügen";
Blockly.Msg.senseBox_sd_web_readHTML = "Lese HTML von SD Karte";
Blockly.Msg.sensebox_web_readHTML_filename = "Datei:";
Blockly.Msg.senseBox_bme680 = "Umweltsensor (BME680)";
Blockly.Msg.senseBox_bme680_tip = "Gibt Messwerte des BME680 zurück";
Blockly.Msg.senseBox_bme680_warning = "Achtung. Gas (VOC) kann nicht gleichzeitig mit anderen Parametern gemessen werden"
Blockly.Msg.senseBox_gas = "Gas (VOC)";
Blockly.Msg.sensebox_soil_smt50 = "Bodenfeuchte/-temperatur (SMT50)";
// LoRa
Blockly.Msg.senseBox_LoRa_connect = "Zu TTN senden";
Blockly.Msg.senseBox_LoRa_device_id = "Device EUI (lsb)";
Blockly.Msg.senseBox_LoRa_app_id = "Application EUI (lsb)";
Blockly.Msg.senseBox_LoRa_app_key = "App Key (msb)";
Blockly.Msg.senseBox_LoRa_nwskey_id = "Network Session Key (msb)";
Blockly.Msg.senseBox_LoRa_appskey_id = "App Session Key (msb)";
Blockly.Msg.senseBox_LoRa_devaddr_id = "Device Adress";
Blockly.Msg.senseBox_LoRa_interval = "Intervall in Minuten"
Blockly.Msg.senseBox_measurement = "Messung";
Blockly.Msg.senseBox_measurements = "Messungen";
Blockly.Msg.senseBox_LoRa_send_message = "Sende als Lora Nachricht";
Blockly.Msg.senseBox_LoRa_send_cayenne = "Sende als Cayenne Nachricht";
Blockly.Msg.senseBox_LoRa_cayenne_temperature = "Temperatur";
Blockly.Msg.senseBox_LoRa_cayenne_channel = "Kanal";
Blockly.Msg.senseBox_LoRa_cayenne_humidity = "Luftfeuchtigkeit"
Blockly.Msg.senseBox_LoRa_cayenne_pressure = "Luftdruck";
Blockly.Msg.senseBox_LoRa_cayenne_luminosity = "Helligkeit";
Blockly.Msg.senseBox_LoRa_cayenne_analog = "Analoger Wert";
Blockly.Msg.senseBox_LoRa_cayenne_x = "X Wert";
Blockly.Msg.senseBox_LoRa_cayenne_y = "Y Wert";
Blockly.Msg.senseBox_LoRa_cayenne_z = "Z Wert";
Blockly.Msg.senseBox_LoRa_cayenne_lat = "Breitengrad";
Blockly.Msg.senseBox_LoRa_cayenne_lng = "Längengrad";
Blockly.Msg.senseBox_LoRa_cayenne_alt = "Höhe";
Blockly.Msg.senseBox_LoRa_cayenne_tip = "Sende Daten als Cayenne Payload Format"
Blockly.Msg.senseBox_LoRa_cayenne_gps_tip = "Sende GPS";
Blockly.Msg.senseBox_LoRa_cayenne_temperature_tip = "Sendet Temperaturwert mit einer Nachkommastelle";
Blockly.Msg.senseBox_LoRa_cayenne_pressure_tip = "Sendet Luftdruck mit einer Nachkommastelle";
Blockly.Msg.senseBox_LoRa_cayenne_luminosity_tip = "Sendet Helligkeitswert";
Blockly.Msg.senseBox_LoRa_cayenne_analog_tip = "Sendet einen Dezimalwert mit einer Nachkommastelle";
Blockly.Msg.senseBox_LoRa_message_tip = "Sende eine Nachricht über LoRa";
Blockly.Msg.senseBox_LoRa_sensor_tip = "Sende eine Sensorwert mit einer bestimmten Anzahl an Bytes";
Blockly.Msg.senseBox_LoRa_init_abp_tip = "Initialisiere die LoRa übertragung. Kopiere die ID's im lsb Format";
Blockly.Msg.senseBox_LoRa_init_otaa_tip = "Initialisiere die LoRa übertragung. Kopiere die ID's im lsb Format";
//BME680
Blockly.Msg.senseBox_bme680 = "Umweltsensor (BME680)";
Blockly.Msg.senseBox_bme_iaq = "Innenraumluftqualität (IAQ)";
Blockly.Msg.senseBox_bme_iaq_accuracy = "Kalibrierungswert";
Blockly.Msg.senseBox_bme_co2 = "CO2 Äquivalent";
Blockly.Msg.senseBox_bme_breatheVocEquivalent = "Atemluft VOC Äquivalent";
Blockly.Msg.senseBox_bme_tip = "Gibt Messwerte des BME680 zurück";
Blockly.Msg.senseBox_gas = "Gas (VOC)";
Blockly.Msg.sensebox_soil_stm50 = "Bodenfeuchte/-temperatur (SMT50)";
//Telegram
Blockly.Msg.senseBox_telegram_init = "Telegram Bot initialisieren"
Blockly.Msg.senseBox_telegram_token = "Token"
Blockly.Msg.senseBox_telegram_do = "Telegram mache"
Blockly.Msg.senseBox_telegram_do_on_message = "bei Nachricht"
Blockly.Msg.senseBox_telegram_message = "Nachricht"
Blockly.Msg.senseBox_telegram_send = "Sende Nachricht"

View File

@ -0,0 +1,751 @@
import * as Blockly from 'blockly/core';
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";
Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colour 1";
Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colour 2";
Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
Blockly.Msg.COLOUR_BLEND_RATIO = "ratio";
Blockly.Msg.COLOUR_BLEND_TITLE = "blend";
Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0).";
Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color";
Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette.";
Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com";
Blockly.Msg.COLOUR_RANDOM_TITLE = "random colour";
Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random.";
Blockly.Msg.COLOUR_RGB_BLUE = "blue";
Blockly.Msg.COLOUR_RGB_GREEN = "green";
Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
Blockly.Msg.COLOUR_RGB_RED = "red";
Blockly.Msg.COLOUR_RGB_TITLE = "colour with";
Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop.";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration.";
Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop.";
Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each";
Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2";
Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements.";
Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with";
Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4";
Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks.";
Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block.";
Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block.";
Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse";
Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block.";
Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else";
Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if";
Blockly.Msg.CONTROLS_IF_MSG_IF = "if";
Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements.";
Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements.";
Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements.";
Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements.";
Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop";
Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "do";
Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeat %1 times";
Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times.";
Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat";
Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until";
Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while";
Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements.";
Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements.";
Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?";
Blockly.Msg.DELETE_BLOCK = "Delete Block";
Blockly.Msg.DELETE_X_BLOCKS = "Delete %1 Blocks";
Blockly.Msg.DISABLE_BLOCK = "Disable Block";
Blockly.Msg.DUPLICATE_BLOCK = "Duplicate";
Blockly.Msg.ENABLE_BLOCK = "Enable Block";
Blockly.Msg.EXPAND_ALL = "Expand Blocks";
Blockly.Msg.EXPAND_BLOCK = "Expand Block";
Blockly.Msg.EXTERNAL_INPUTS = "External Inputs";
Blockly.Msg.HELP = "Help";
Blockly.Msg.INLINE_INPUTS = "Inline Inputs";
Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list";
Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list";
Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records";
Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list";
Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block.";
Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with";
Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with";
Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list.";
Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items.";
Blockly.Msg.LISTS_GET_INDEX_FIRST = "first";
Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end";
Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#";
Blockly.Msg.LISTS_GET_INDEX_GET = "get";
Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove";
Blockly.Msg.LISTS_GET_INDEX_LAST = "last";
Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random";
Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove";
Blockly.Msg.LISTS_GET_INDEX_TAIL = "";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list.";
Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list.";
Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end";
Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #";
Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last";
Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist";
Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first";
Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end";
Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #";
Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "";
Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list.";
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_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";
Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty.";
Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of";
Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1";
Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list.";
Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with";
Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times";
Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times.";
Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set";
Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as";
Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at";
Blockly.Msg.LISTS_SET_INDEX_SET = "set";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list.";
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list.";
Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list";
Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending";
Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending";
Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3";
Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list.";
Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case";
Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric";
Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic";
Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text";
Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list";
Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter.";
Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter.";
Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter";
Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false";
Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values";
Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false.";
Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true";
Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other.";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input.";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input.";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input.";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input.";
Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other.";
Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not";
Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1";
Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true.";
Blockly.Msg.LOGIC_NULL = "null";
Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type";
Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null.";
Blockly.Msg.LOGIC_OPERATION_AND = "and";
Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations";
Blockly.Msg.LOGIC_OPERATION_OR = "or";
Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true.";
Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true.";
Blockly.Msg.LOGIC_TERNARY_CONDITION = "test";
Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:";
Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "if false";
Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "if true";
Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.";
Blockly.Msg.MATH_ADDITION_SYMBOL = "+";
Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic";
Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers.";
Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers.";
Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers.";
Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers.";
Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number.";
Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter";
Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2";
Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'.";
Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant";
Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).";
Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29";
Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3";
Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive).";
Blockly.Msg.MATH_DIVISION_SYMBOL = "÷";
Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by";
Blockly.Msg.MATH_IS_EVEN = "is even";
Blockly.Msg.MATH_IS_NEGATIVE = "is negative";
Blockly.Msg.MATH_IS_ODD = "is odd";
Blockly.Msg.MATH_IS_POSITIVE = "is positive";
Blockly.Msg.MATH_IS_PRIME = "is prime";
Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false.";
Blockly.Msg.MATH_IS_WHOLE = "is whole";
Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation";
Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2";
Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers.";
Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×";
Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number";
Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number.";
Blockly.Msg.MATH_ONLIST_HELPURL = "";
Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "average of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "max of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list";
Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list";
Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list.";
Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list.";
Blockly.Msg.MATH_POWER_SYMBOL = "^";
Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction";
Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).";
Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2";
Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive.";
Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding";
Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round";
Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down";
Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up";
Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down.";
Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root";
Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute";
Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root";
Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number.";
Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number.";
Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-";
Blockly.Msg.MATH_TRIG_ACOS = "acos";
Blockly.Msg.MATH_TRIG_ASIN = "asin";
Blockly.Msg.MATH_TRIG_ATAN = "atan";
Blockly.Msg.MATH_TRIG_COS = "cos";
Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions";
Blockly.Msg.MATH_TRIG_SIN = "sin";
Blockly.Msg.MATH_TRIG_TAN = "tan";
Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number.";
Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number.";
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 = "";
Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements";
Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:";
Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'.";
Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output.";
Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:";
Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'";
Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function...";
Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something";
Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to";
Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output.";
Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return";
Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output.";
Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters.";
Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition";
Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value.";
Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition.";
Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:";
Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function.";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs";
Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function.";
Blockly.Msg.REDO = "Redo";
Blockly.Msg.REMOVE_COMMENT = "Remove Comment";
Blockly.Msg.RENAME_VARIABLE = "Rename variable...";
Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:";
Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text";
Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification";
Blockly.Msg.TEXT_APPEND_TO = "to";
Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'.";
Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case";
Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case";
Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case";
Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE";
Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case.";
Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter";
Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end";
Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #";
Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text";
Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text";
Blockly.Msg.TEXT_CHARAT_LAST = "get last letter";
Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter";
Blockly.Msg.TEXT_CHARAT_TAIL = "";
Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position.";
Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text.";
Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join";
Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block.";
Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end";
Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #";
Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter";
Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text";
Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text";
Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter";
Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end";
Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #";
Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "";
Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text.";
Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text";
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_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.";
Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation";
Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with";
Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items.";
Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification";
Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1";
Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text.";
Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text";
Blockly.Msg.TEXT_PRINT_TITLE = "print %1";
Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value.";
Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user";
Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number.";
Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text.";
Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message";
Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message";
Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)";
Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text.";
Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces";
Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of";
Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of";
Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of";
Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends.";
Blockly.Msg.TODAY = "Today";
Blockly.Msg.UNDO = "Undo";
Blockly.Msg.VARIABLES_DEFAULT_NAME = "item";
Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'";
Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get";
Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable.";
Blockly.Msg.VARIABLES_SET = "set %1 to %2";
Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'";
Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set";
Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input.";
Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
// Ardublockly strings
Blockly.Msg.ARD_ANALOGREAD = "read analog pin#";
Blockly.Msg.ARD_ANALOGREAD_TIP = "Return value between 0 and 1024";
Blockly.Msg.ARD_ANALOGWRITE = "set analog pin#";
Blockly.Msg.ARD_ANALOGWRITE_TIP = "Write analog value between 0 and 255 to a specific PWM Port";
Blockly.Msg.ARD_BUILTIN_LED = "set built-in LED";
Blockly.Msg.ARD_BUILTIN_LED_TIP = "Light on or off for the built-in LED of the Arduino";
Blockly.Msg.ARD_COMPONENT_WARN1 = "A %1 configuration block with the same %2 name must be added to use this block!";
Blockly.Msg.ARD_DEFINE = "Define";
Blockly.Msg.ARD_DIGITALREAD = "read digital pin#";
Blockly.Msg.ARD_DIGITALREAD_TIP = "Read digital value on a pin: HIGH or LOW";
Blockly.Msg.ARD_DIGITALWRITE = "set digitial pin#";
Blockly.Msg.ARD_DIGITALWRITE_TIP = "Write digital value HIGH or LOW to a specific Port";
Blockly.Msg.ARD_FUN_RUN_LOOP = "Arduino loop forever:";
Blockly.Msg.ARD_FUN_RUN_SETUP = "Arduino run first:";
Blockly.Msg.ARD_FUN_RUN_TIP = "Defines the Arduino setup() and loop() functions.";
Blockly.Msg.ARD_HIGH = "HIGH";
Blockly.Msg.ARD_HIGHLOW_TIP = "Set a pin state logic High or Low.";
Blockly.Msg.ARD_LOW = "LOW";
Blockly.Msg.ARD_MAP = "Map Value";
Blockly.Msg.ARD_MAP_FROMMAX = "from Max";
Blockly.Msg.ARD_MAP_FROMMIN = "from Min";
Blockly.Msg.ARD_MAP_TIP = "Re-maps a number from [0-1024] to another.";
Blockly.Msg.ARD_MAP_TOMAX = "to Max";
Blockly.Msg.ARD_MAP_TOMIN = "to Min";
Blockly.Msg.ARD_MAP_VAL = "value to [0-";
Blockly.Msg.ARD_NOTONE = "Turn off tone on pin #";
Blockly.Msg.ARD_NOTONE_PIN = "No tone PIN#";
Blockly.Msg.ARD_NOTONE_PIN_TIP = "Stop generating a tone on a pin";
Blockly.Msg.ARD_NOTONE_TIP = "Turns the tone off on the selected pin";
Blockly.Msg.ARD_PIN_WARN1 = "Pin %1 is needed for %2 as pin %3. Already used as %4.";
Blockly.Msg.ARD_PULSETIMEOUT_TIP = "Measures the duration of a pulse on the selected pin, if it is within the time-out in microseconds.";
Blockly.Msg.ARD_PULSE_READ = "measure %1 pulse on pin #%2";
Blockly.Msg.ARD_PULSE_READ_TIMEOUT = "measure %1 pulse on pin #%2 (timeout after %3 μs)";
Blockly.Msg.ARD_PULSE_TIP = "Measures the duration of a pulse on the selected pin.";
Blockly.Msg.ARD_SERIAL_BPS = "bps";
Blockly.Msg.ARD_SERIAL_PRINT = "print";
Blockly.Msg.ARD_SERIAL_PRINT_NEWLINE = "add new line";
Blockly.Msg.ARD_SERIAL_PRINT_TIP = "Prints data to the console/serial port as human-readable ASCII text.";
Blockly.Msg.ARD_SERIAL_PRINT_WARN = "A setup block for %1 must be added to the workspace to use this block!";
Blockly.Msg.ARD_SERIAL_SETUP = "Setup";
Blockly.Msg.ARD_SERIAL_SETUP_TIP = "Selects the speed for a specific Serial peripheral";
Blockly.Msg.ARD_SERIAL_SPEED = ": speed to";
Blockly.Msg.ARD_SERVO_READ = "read SERVO from PIN#";
Blockly.Msg.ARD_SERVO_READ_TIP = "Read a Servo angle";
Blockly.Msg.ARD_SERVO_WRITE = "set SERVO from Pin";
Blockly.Msg.ARD_SERVO_WRITE_DEG_180 = "Degrees (0~180)";
Blockly.Msg.ARD_SERVO_WRITE_TIP = "Set a Servo to an specified angle";
Blockly.Msg.ARD_SERVO_WRITE_TO = "to";
Blockly.Msg.ARD_SETTONE = "Set tone on pin #";
Blockly.Msg.ARD_SPI_SETUP = "Setup";
Blockly.Msg.ARD_SPI_SETUP_CONF = "configuration:";
Blockly.Msg.ARD_SPI_SETUP_DIVIDE = "clock divide";
Blockly.Msg.ARD_SPI_SETUP_LSBFIRST = "LSBFIRST";
Blockly.Msg.ARD_SPI_SETUP_MODE = "SPI mode (idle - edge)";
Blockly.Msg.ARD_SPI_SETUP_MODE0 = "0 (Low - Falling)";
Blockly.Msg.ARD_SPI_SETUP_MODE1 = "1 (Low - Rising)";
Blockly.Msg.ARD_SPI_SETUP_MODE2 = "2 (High - Falling)";
Blockly.Msg.ARD_SPI_SETUP_MODE3 = "3 (High - Rising)";
Blockly.Msg.ARD_SPI_SETUP_MSBFIRST = "MSBFIRST";
Blockly.Msg.ARD_SPI_SETUP_SHIFT = "data shift";
Blockly.Msg.ARD_SPI_SETUP_TIP = "Configures the SPI peripheral.";
Blockly.Msg.ARD_SPI_TRANSRETURN_TIP = "Send a SPI message to an specified slave device and get data back.";
Blockly.Msg.ARD_SPI_TRANS_NONE = "none";
Blockly.Msg.ARD_SPI_TRANS_SLAVE = "to slave pin";
Blockly.Msg.ARD_SPI_TRANS_TIP = "Send a SPI message to an specified slave device.";
Blockly.Msg.ARD_SPI_TRANS_VAL = "transfer";
Blockly.Msg.ARD_SPI_TRANS_WARN1 = "A setup block for %1 must be added to the workspace to use this block!";
Blockly.Msg.ARD_SPI_TRANS_WARN2 = "Old pin value %1 is no longer available.";
Blockly.Msg.ARD_STEPPER_COMPONENT = "stepper";
Blockly.Msg.ARD_STEPPER_DEFAULT_NAME = "MyStepper";
Blockly.Msg.ARD_STEPPER_FOUR_PINS = "4";
Blockly.Msg.ARD_STEPPER_MOTOR = "stepper motor:";
Blockly.Msg.ARD_STEPPER_NUMBER_OF_PINS = "Number of pins";
Blockly.Msg.ARD_STEPPER_PIN1 = "pin1#";
Blockly.Msg.ARD_STEPPER_PIN2 = "pin2#";
Blockly.Msg.ARD_STEPPER_PIN3 = "pin3#";
Blockly.Msg.ARD_STEPPER_PIN4 = "pin4#";
Blockly.Msg.ARD_STEPPER_REVOLVS = "how many steps per revolution";
Blockly.Msg.ARD_STEPPER_SETUP = "Setup stepper motor";
Blockly.Msg.ARD_STEPPER_SETUP_TIP = "Configures a stepper motor pinout and other settings.";
Blockly.Msg.ARD_STEPPER_SPEED = "set speed (rpm) to";
Blockly.Msg.ARD_STEPPER_STEP = "move stepper";
Blockly.Msg.ARD_STEPPER_STEPS = "steps";
Blockly.Msg.ARD_STEPPER_STEP_TIP = "Turns the stepper motor a specific number of steps.";
Blockly.Msg.ARD_STEPPER_TWO_PINS = "2";
Blockly.Msg.ARD_TIME_DELAY = "wait";
Blockly.Msg.ARD_TIME_DELAY_MICROS = "microseconds";
Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP = "Wait specific time in microseconds";
Blockly.Msg.ARD_TIME_DELAY_TIP = "Wait specific time in milliseconds";
Blockly.Msg.ARD_TIME_INF = "wait forever (end program)";
Blockly.Msg.ARD_TIME_INF_TIP = "Wait indefinitely, stopping the program.";
Blockly.Msg.ARD_TIME_MICROS = "current elapsed Time (microseconds)";
Blockly.Msg.ARD_TIME_MICROS_TIP = "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer";
Blockly.Msg.ARD_TIME_MILLIS = "current elapsed Time (milliseconds)";
Blockly.Msg.ARD_TIME_MILLIS_TIP = "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer";
Blockly.Msg.ARD_TIME_MS = "milliseconds";
Blockly.Msg.ARD_TONEFREQ = "at frequency";
Blockly.Msg.ARD_TONE_FREQ = "frequency";
Blockly.Msg.ARD_TONE_PIN = "Tone PIN#";
Blockly.Msg.ARD_TONE_PIN_TIP = "Generate audio tones on a pin";
Blockly.Msg.ARD_TONE_TIP = "Sets tone on pin to specified frequency within range 31 - 65535";
Blockly.Msg.ARD_TONE_WARNING = "Frequency must be in range 31 - 65535";
Blockly.Msg.ARD_TYPE_ARRAY = "Array";
Blockly.Msg.ARD_TYPE_BOOL = "Boolean";
Blockly.Msg.ARD_TYPE_CHAR = "Character";
Blockly.Msg.ARD_TYPE_CHILDBLOCKMISSING = "ChildBlockMissing";
Blockly.Msg.ARD_TYPE_DECIMAL = "Decimal";
Blockly.Msg.ARD_TYPE_LONG = "Large Number";
Blockly.Msg.ARD_TYPE_NULL = "Null";
Blockly.Msg.ARD_TYPE_NUMBER = "Number";
Blockly.Msg.ARD_TYPE_SHORT = "Short Number";
Blockly.Msg.ARD_TYPE_TEXT = "Text";
Blockly.Msg.ARD_TYPE_UNDEF = "Undefined";
Blockly.Msg.ARD_VAR_AS = "as";
Blockly.Msg.ARD_VAR_AS_TIP = "Sets a value to a specific type";
Blockly.Msg.ARD_WRITE_TO = "to";
Blockly.Msg.NEW_INSTANCE = "New instance...";
Blockly.Msg.NEW_INSTANCE_TITLE = "New instance name:";
Blockly.Msg.RENAME_INSTANCE = "Rename instance...";
Blockly.Msg.RENAME_INSTANCE_TITLE = "Rename all '%1' instances to:";
Blockly.Msg.cases_add = "Case";
Blockly.Msg.cases_condition = "Case (Variable) = ";
Blockly.Msg.cases_do = "Do";
Blockly.Msg.cases_switch = "Variable";
Blockly.Msg.senseBox_LoRa_app_id = "Application EUI (lsb)";
Blockly.Msg.senseBox_LoRa_app_key = "App Key (msb)";
Blockly.Msg.senseBox_LoRa_appskey_id = "App Session Key (msb)";
Blockly.Msg.senseBox_LoRa_cayenne_alt = "Altitude";
Blockly.Msg.senseBox_LoRa_cayenne_analog = "Analog Value";
Blockly.Msg.senseBox_LoRa_cayenne_analog_tip = "Send a value with one decimal";
Blockly.Msg.senseBox_LoRa_cayenne_channel = "Channel";
Blockly.Msg.senseBox_LoRa_cayenne_gps_tip = "Send GPS Data";
Blockly.Msg.senseBox_LoRa_cayenne_gyros_tip = "Send a value from the Gyroscope";
Blockly.Msg.senseBox_LoRa_cayenne_humidity = "Humidity";
Blockly.Msg.senseBox_LoRa_cayenne_humidity_tip = "Send temperature with one decimal";
Blockly.Msg.senseBox_LoRa_cayenne_lat = "Latitude";
Blockly.Msg.senseBox_LoRa_cayenne_lng = "Longitude";
Blockly.Msg.senseBox_LoRa_cayenne_luminosity = "Luminosity";
Blockly.Msg.senseBox_LoRa_cayenne_luminosity_tip = "Send luminosity";
Blockly.Msg.senseBox_LoRa_cayenne_pressure = "Pressure";
Blockly.Msg.senseBox_LoRa_cayenne_pressure_tip = "Send pressure with one decimal";
Blockly.Msg.senseBox_LoRa_cayenne_temperature = "Temperature";
Blockly.Msg.senseBox_LoRa_cayenne_temperature_tip = "Send temperature with one decimal";
Blockly.Msg.senseBox_LoRa_cayenne_tip = "Send Data as Cayenne Payload Format";
Blockly.Msg.senseBox_LoRa_cayenne_x = "X Value";
Blockly.Msg.senseBox_LoRa_cayenne_y = "Y Value";
Blockly.Msg.senseBox_LoRa_cayenne_z = "Z Value";
Blockly.Msg.senseBox_LoRa_connect = "Send to TTN";
Blockly.Msg.senseBox_LoRa_devaddr_id = "Device Adress";
Blockly.Msg.senseBox_LoRa_device_id = "Device EUI (lsb)";
Blockly.Msg.senseBox_LoRa_init_abp_tip = "Initialise the LoRa tranismission. Copy ID's as lsb";
Blockly.Msg.senseBox_LoRa_init_otaa_tip = "Initialise the LoRa tranismission. Copy ID's as lsb";
Blockly.Msg.senseBox_LoRa_interval = "Transmission interval in minutes";
Blockly.Msg.senseBox_LoRa_message_tip = "Send a message with LoRa";
Blockly.Msg.senseBox_LoRa_nwskey_id = "Network Session Key (msb)";
Blockly.Msg.senseBox_LoRa_send_cayenne = "Send as Cayenne Payload";
Blockly.Msg.senseBox_LoRa_send_message = "Send as Lora Message";
Blockly.Msg.senseBox_LoRa_sensor_tip = "Send a value with a specific number of bytes";
Blockly.Msg.senseBox_SD_COMPONENT = "SD-Block";
Blockly.Msg.senseBox_basic_blue = "Blue";
Blockly.Msg.senseBox_basic_green = "Gree";
Blockly.Msg.senseBox_basic_red = "Red";
Blockly.Msg.senseBox_basic_state = "Status";
Blockly.Msg.senseBox_bme680 = "Environmental sensor (BME680)";
Blockly.Msg.senseBox_bme680_tip = "Returns values from the BME680";
Blockly.Msg.senseBox_bme680_warning = "Warning. Gas (VOC) cannot be measured simultaneously with other parameters.";
Blockly.Msg.senseBox_bme_breatheVocEquivalent = "Breathe VOC Equivalent";
Blockly.Msg.senseBox_bme_co2 = "CO2 Equivalent";
Blockly.Msg.senseBox_bme_iaq = "Indoor Air Quality (IAQ)";
Blockly.Msg.senseBox_bme_iaq_accuracy = "Calibration Value";
Blockly.Msg.senseBox_bme_tip = "Returns values from the BME680";
Blockly.Msg.senseBox_bmx055_accelerometer = "Accelerometer";
Blockly.Msg.senseBox_bmx055_accelerometer_direction = "Direction";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_total = "Total";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_x = "X-Axis";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_y = "Y-Axis";
Blockly.Msg.senseBox_bmx055_accelerometer_direction_z = "Z-Axis";
Blockly.Msg.senseBox_bmx055_accelerometer_range = "Range";
Blockly.Msg.senseBox_bmx055_accelerometer_range_16g = "16g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_2g = "2g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_4g = "4g";
Blockly.Msg.senseBox_bmx055_accelerometer_range_8g = "8g";
Blockly.Msg.senseBox_bmx055_accelerometer_tip = "Measuring the acceleration";
Blockly.Msg.senseBox_bmx055_compass = "Compass";
Blockly.Msg.senseBox_bmx055_compass_tip = "Gives the ";
Blockly.Msg.senseBox_bmx055_gyroscope = "Gyroscope";
Blockly.Msg.senseBox_bmx055_gyroscope_tip = "Lage Sensor";
Blockly.Msg.senseBox_bmx055_x = "X-Direction";
Blockly.Msg.senseBox_bmx055_y = "Y-Direction";
Blockly.Msg.senseBox_button = "Button";
Blockly.Msg.senseBox_button_isPressed = "is Pressed";
Blockly.Msg.senseBox_button_switch = "as Switch";
Blockly.Msg.senseBox_button_tip = "Button";
Blockly.Msg.senseBox_button_wasPressed = "was Pressed";
Blockly.Msg.senseBox_display_beginDisplay = "Initialize Display";
Blockly.Msg.senseBox_display_beginDisplay_tip = "Starts the display";
Blockly.Msg.senseBox_display_black = "Black";
Blockly.Msg.senseBox_display_clearDisplay = "Clear Display";
Blockly.Msg.senseBox_display_clearDisplay_tip = "Clear the display content";
Blockly.Msg.senseBox_display_color = "Font color";
Blockly.Msg.senseBox_display_filled = "filled";
Blockly.Msg.senseBox_display_plotDisplay = "Plot Diagram";
Blockly.Msg.senseBox_display_plotTimeFrame = "TimeFrame";
Blockly.Msg.senseBox_display_plotTitle = "Title";
Blockly.Msg.senseBox_display_plotXLabel = "X-Axis Label";
Blockly.Msg.senseBox_display_plotXRange1 = "X-Range Begin";
Blockly.Msg.senseBox_display_plotXRange2 = "X-Range End";
Blockly.Msg.senseBox_display_plotXTick = "X-Tick";
Blockly.Msg.senseBox_display_plotYLabel = "Y-Axis Label";
Blockly.Msg.senseBox_display_plotYRange1 = "Y-Range Begin";
Blockly.Msg.senseBox_display_plotYRange2 = "Y-Range End";
Blockly.Msg.senseBox_display_plotYTick = "Y-Tick";
Blockly.Msg.senseBox_display_printDisplay = "Write Text/Number";
Blockly.Msg.senseBox_display_printDisplay_tip = "Prints Values to the Display, set X and Y Location";
Blockly.Msg.senseBox_display_printDisplay_value = "value";
Blockly.Msg.senseBox_display_printDisplay_x = "x-coordinates";
Blockly.Msg.senseBox_display_printDisplay_y = "y-coordinates";
Blockly.Msg.senseBox_display_setSize = "set font size to";
Blockly.Msg.senseBox_display_setSize_tip = "Change the font size. Set a Value between 1-10.";
Blockly.Msg.senseBox_display_white = "White";
Blockly.Msg.senseBox_foto = "Light Dependent Resistor";
Blockly.Msg.senseBox_foto_tip = "simple light depending resistor, gives values between 0 and 1023";
Blockly.Msg.senseBox_gas = "Gas (VOC)";
Blockly.Msg.senseBox_gps_alt = "altitude";
Blockly.Msg.senseBox_gps_begin = "initialize GPS";
Blockly.Msg.senseBox_gps_begin_tip = "initialize GPS Sensor";
Blockly.Msg.senseBox_gps_date = "date";
Blockly.Msg.senseBox_gps_getValues = "GPS-Module";
Blockly.Msg.senseBox_gps_getValues_tip = "gets the specific Value from the GPS Sensor";
Blockly.Msg.senseBox_gps_lat = "latitude";
Blockly.Msg.senseBox_gps_lng = "longitude";
Blockly.Msg.senseBox_gps_speed = "speed";
Blockly.Msg.senseBox_gps_time = "time";
Blockly.Msg.senseBox_gps_timeStamp = "timestamp (RFC 3339)";
Blockly.Msg.senseBox_html_body = "<body>";
Blockly.Msg.senseBox_html_body_end = "</body>";
Blockly.Msg.senseBox_html_document = "HTML";
Blockly.Msg.senseBox_html_document_tip = "A block for generating a HTML document.";
Blockly.Msg.senseBox_html_general_tag_tip = "A general HTML tag building block.";
Blockly.Msg.senseBox_html_header = "<head>";
Blockly.Msg.senseBox_html_header_end = "</head>";
Blockly.Msg.senseBox_http_method = "Method";
Blockly.Msg.senseBox_http_method_tip = "Method of the current HTTP request";
Blockly.Msg.senseBox_http_not_found = "404 Not found";
Blockly.Msg.senseBox_http_not_found_tip = "Send a predefined 404 HTTP response.";
Blockly.Msg.senseBox_http_on_client_connect = "If client is connected:";
Blockly.Msg.senseBox_http_on_client_connect_tip = "Checks if a client is connected and executes given statement in that case.";
Blockly.Msg.senseBox_http_protocol_version = "HTTP Version";
Blockly.Msg.senseBox_http_protocol_version_tip = "The HTTP Version of the current HTTP request";
Blockly.Msg.senseBox_http_success = "Succesful";
Blockly.Msg.senseBox_http_success_l2 = "HTTP reponse";
Blockly.Msg.senseBox_http_success_tip = "Send a successful HTTP response with content.";
Blockly.Msg.senseBox_http_uri = "URI";
Blockly.Msg.senseBox_http_uri_tip = "URI of requested resource of the current HTTP request";
Blockly.Msg.senseBox_http_user_agent = "User-Agent";
Blockly.Msg.senseBox_http_user_agent_tip = "The User-Agent send along with the current HTTP request";
Blockly.Msg.senseBox_hum = "humidity in %";
Blockly.Msg.senseBox_hum_tip = "Measures humidity in %";
Blockly.Msg.senseBox_init_http_server = "Initialize HTTP-Server";
Blockly.Msg.senseBox_init_http_server_tip = "Initializes a http server on the specified port.";
Blockly.Msg.senseBox_interval = "ms";
Blockly.Msg.senseBox_interval_timer = "Measuring interval";
Blockly.Msg.senseBox_interval_timer_tip = "Setup an Intervall";
Blockly.Msg.senseBox_ip_address = "IP-Address";
Blockly.Msg.senseBox_ip_address_tip = "Returns the IP address as a string.";
Blockly.Msg.senseBox_ir = "infrared distance sensor";
Blockly.Msg.senseBox_ir_tip = "infrared distance sensor can measure the distance between 10 and 80 cm";
Blockly.Msg.senseBox_led = "LED connected to digital";
Blockly.Msg.senseBox_led_tip = "simple LED. Don't forget the resistor";
Blockly.Msg.senseBox_light = "Illuminance in Lux";
Blockly.Msg.senseBox_lux = "lightsensor";
Blockly.Msg.senseBox_lux_tip = "Light Sensor can measure the illuminance in lux";
Blockly.Msg.senseBox_measurement = "Measurement";
Blockly.Msg.senseBox_measurements = "Measurements";
Blockly.Msg.senseBox_off = "off";
Blockly.Msg.senseBox_on = "on";
Blockly.Msg.senseBox_osem_connection = "Connect to openSenseMap";
Blockly.Msg.senseBox_osem_connection_tip = "";
Blockly.Msg.senseBox_osem_exposure = "Type";
Blockly.Msg.senseBox_osem_host = "opensensemap.org";
Blockly.Msg.senseBox_osem_host_workshop = "workshop.opensensemap.org";
Blockly.Msg.senseBox_osem_mobile = "Mobile";
Blockly.Msg.senseBox_osem_stationary = "Stationary";
Blockly.Msg.senseBox_output_filename = "filename";
Blockly.Msg.senseBox_output_format = "format:";
Blockly.Msg.senseBox_output_linebreak = "linebreak";
Blockly.Msg.senseBox_output_networkid = "networkID";
Blockly.Msg.senseBox_output_password = "Password";
Blockly.Msg.senseBox_output_safetosd = "safe to sd";
Blockly.Msg.senseBox_output_safetosd_tip = "Save Measurment to SD-Card";
Blockly.Msg.senseBox_output_serialprint = "Print on Serial Monitor";
Blockly.Msg.senseBox_output_timestamp = "timestamp";
Blockly.Msg.senseBox_piezo_tip = "simple piezo to make sound";
Blockly.Msg.senseBox_poti = "Potentiometer";
Blockly.Msg.senseBox_poti_tip = "Potentiometer";
Blockly.Msg.senseBox_pressure = "Airpressure in Pa";
Blockly.Msg.senseBox_pressure_referencePressure = "Pressure at Sea Level";
Blockly.Msg.senseBox_pressure_referencePressure_dim = "hPa";
Blockly.Msg.senseBox_pressure_sensor = "Airpressure/Temperature Sensor (BMP280)";
Blockly.Msg.senseBox_pressure_tip = "airpressure sensor can measure the airpressure in Pa";
Blockly.Msg.senseBox_rgb_led = "RGB-LED";
Blockly.Msg.senseBox_rgb_led_tip = "RGB-LED";
Blockly.Msg.senseBox_sd_create_file = "Create file on SD-Card";
Blockly.Msg.senseBox_sd_decimals = "decimals";
Blockly.Msg.senseBox_sd_open_file = "Open a file from SD-Card";
Blockly.Msg.senseBox_sd_web_readHTML = "Read HTML from SD Card";
Blockly.Msg.senseBox_sd_write_file = " Write Data to SD-Card";
Blockly.Msg.senseBox_sds011 = "Fine Particular Sensor";
Blockly.Msg.senseBox_sds011_dimension = "in µg/m³ at";
Blockly.Msg.senseBox_sds011_pm10 = "PM10";
Blockly.Msg.senseBox_sds011_pm25 = "PM2.5";
Blockly.Msg.senseBox_sds011_serial1 = "Serial1";
Blockly.Msg.senseBox_sds011_serial2 = "Serial2";
Blockly.Msg.senseBox_sds011_tip = "Measuring the fine particular concentration";
Blockly.Msg.senseBox_send_mobile_to_osem = "Send measurement and location to openSenseMap";
Blockly.Msg.senseBox_send_mobile_to_osem_tip = "Send Value and Location to openSenseMap";
Blockly.Msg.senseBox_send_to_osem = "Send measurement to openSenseMap";
Blockly.Msg.senseBox_send_to_osem_tip = "sends the measurement to openSenseMap. Make shure to enter the correct BoxID and SensorID";
Blockly.Msg.senseBox_sensor = "Sensors";
Blockly.Msg.senseBox_serial_tip = "prints the values to the serial monitor in the arduino IDE. Good way to have a fast and easy feedback for your programm";
Blockly.Msg.senseBox_soil = "Soil Moisture";
Blockly.Msg.senseBox_sound = "Microphone";
Blockly.Msg.senseBox_sound_tip = "This block returns the measured value of the microphone in volts.";
Blockly.Msg.senseBox_tag_first_mutator_tip = "Mandatory children to this block.";
Blockly.Msg.senseBox_tag_optional_mutator_tip = "Add more children to the block.";
Blockly.Msg.senseBox_telegram_do = "Telegram do";
Blockly.Msg.senseBox_telegram_do_on_message = "on message";
Blockly.Msg.senseBox_telegram_init = "Initialize Telegram Bot";
Blockly.Msg.senseBox_telegram_message = "Message";
Blockly.Msg.senseBox_telegram_send = "Send Message";
Blockly.Msg.senseBox_telegram_token = "Token";
Blockly.Msg.senseBox_temp = "Temperature in °C";
Blockly.Msg.senseBox_temp_hum = "Temperature/Humidity Sensor (HDC1080)";
Blockly.Msg.senseBox_temp_hum_tip = "Sensor measuring temperature and humidity";
Blockly.Msg.senseBox_ultrasonic = "Ultrasonic distance sensor at Port";
Blockly.Msg.senseBox_ultrasonic_echo = "Echo";
Blockly.Msg.senseBox_ultrasonic_port_A = "A";
Blockly.Msg.senseBox_ultrasonic_port_B = "B";
Blockly.Msg.senseBox_ultrasonic_port_C = "C";
Blockly.Msg.senseBox_ultrasonic_tip = "ultrasonic distance sensor";
Blockly.Msg.senseBox_ultrasonic_trigger = "Trigger";
Blockly.Msg.senseBox_uv = "UV-Light in µW/cm²";
Blockly.Msg.senseBox_uv_light = "Light Visible + UV";
Blockly.Msg.senseBox_uv_light_tip = "Sensor measuring the UV-light and the illuminance";
Blockly.Msg.senseBox_value = "value:";
Blockly.Msg.senseBox_watertemperature = "Water Temperature";
Blockly.Msg.senseBox_wifi_connect = "Connect to Wifi";
Blockly.Msg.senseBox_wifi_ssid = "Networkname";
Blockly.Msg.senseBox_wifi_startap = "Initialize Wifi Access Point";
Blockly.Msg.senseBox_wifi_tip = "Establishes a wifi connection";
Blockly.Msg.sensebox_display_drawRectangle = "Draw Rectangle";
Blockly.Msg.sensebox_display_drawRectangle_height = "height";
Blockly.Msg.sensebox_display_drawRectangle_width = "width";
Blockly.Msg.sensebox_display_fillCircle = "Draw Point";
Blockly.Msg.sensebox_display_fillCircle_radius = "Radius";
Blockly.Msg.sensebox_display_show = "Print on Display";
Blockly.Msg.sensebox_display_show_tip = "Print on Display";
Blockly.Msg.sensebox_sd_filename = "data";
Blockly.Msg.sensebox_soil_smt50 = "Soil Moisture and Temperature (SMT50)";
Blockly.Msg.sensebox_web_readHTML_filename = "File:";

View File

@ -3,12 +3,68 @@ import React, { Component } from 'react';
import WorkspaceStats from './WorkspaceStats';
import WorkspaceFunc from './WorkspaceFunc';
class Home extends Component {
import BlocklyComponent, { Block, Value, Field, Shadow, Category } from './Blockly';
import * as Blockly from 'blockly/core';
import * as De from './Blockly/msg/de'; // de locale files
//import * as En from './Blockly/msg/en'; // de locale files
import './Blockly/blocks/index';
import './Blockly/generator/index';
class Home extends React.Component {
constructor(props) {
super(props);
this.simpleWorkspace = React.createRef();
this.state = { generatedCode: 'Click text' }
}
componentDidMount() {
let workspace = Blockly.getMainWorkspace();
workspace.addChangeListener(this.generateCode);
}
generateCode = () => {
var code = Blockly.Arduino.workspaceToCode(this.workspace);
console.log(code);
this.setState({ generatedCode: code })
}
render() {
return (
<div>
<WorkspaceStats />
<WorkspaceFunc />
<BlocklyComponent ref={this.simpleWorkspace}
readOnly={false} trashcan={true} media={'media/'}
move={{
scrollbars: true,
drag: true,
wheel: true
}}
initialXml={''}>
<Category name="loops" >
<Block type="controls_for" />
<Block type="controls_repeat_ext" />
<Block type="controls_whileUntil" />
</Category>
<Category name="senseBox" colour="120" >
<Category name="Sensoren" colour="120" >
<Block type="sensebox_sensor_temp_hum"></Block>
</Category>
<Block type="sensebox_telegram" />
</Category>
<Category name="Logic" colour="#b063c5">
<Block type="control_if"></Block>
<Block type="controls_ifelse"></Block>
<Block type="logic_compare"></Block>
<Block type="logic_operation"></Block>
<Block type="logic_negate"></Block>
<Block type="logic_boolean"></Block>
</Category>
</BlocklyComponent>
<WorkspaceFunc generateCode={this.generateCode} />
</div>
);
};

View File

@ -1,4 +1,4 @@
import React, {Component} from 'react';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
@ -12,29 +12,26 @@ import Dialog from '@material-ui/core/Dialog';
class WorkspaceFunc extends Component {
state={
state = {
title: '',
content: '',
open: false
}
getArdurinoCode = () => {
var code = window.Ardublockly.generateArduino();
this.setState({title: 'Ardurino Code', content: code, open: true});
}
getXMLCode = () => {
var code = window.Ardublockly.generateXml();
this.setState({title: 'XML Code', content: code, open: true});
this.setState({ title: 'XML Code', content: code, open: true });
}
toggleDialog = () => {
this.setState({open: !this.state});
this.setState({ open: !this.state });
}
render() {
return (
<div style={{marginTop: '20px'}}>
<div style={{ marginTop: '20px' }}>
<Dialog onClose={this.toggleDialog} open={this.state.open}>
<DialogTitle>{this.state.title}</DialogTitle>
<DialogContent dividers>
@ -46,13 +43,13 @@ class WorkspaceFunc extends Component {
</Button>
</DialogActions>
</Dialog>
<Button style={{marginRight: '10px'}} variant="contained" color="primary" onClick={()=>this.getArdurinoCode()}>
<Button style={{ marginRight: '10px' }} variant="contained" color="primary" onClick={() => this.props.generateCode()}>
Get Adurino Code
</Button>
<Button style={{marginRight: '10px'}} variant="contained" color="primary" onClick={()=>this.getXMLCode()}>
<Button style={{ marginRight: '10px' }} variant="contained" color="primary" onClick={() => this.getXMLCode()}>
Get XML Code
</Button>
<Button variant="contained" color="primary" onClick={()=>{var blocks = this.props.newWorkspace; console.log(blocks);}}>
<Button variant="contained" color="primary" onClick={() => { var blocks = this.props.newWorkspace; console.log(blocks); }}>
Get workspace
</Button>
<MaxBlocks />