Initial commit

This commit is contained in:
zhongjin 2018-07-21 19:30:07 +08:00
commit 4cea5f34c1
453 changed files with 50962 additions and 0 deletions

34
.eslintrc.json Normal file
View File

@ -0,0 +1,34 @@
{
"env": {
"es6": true,
"node": true
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
4,
{
"SwitchCase": 1
}
],
"linebreak-style": [
"error",
"windows"
],
"no-var": "error",
"prefer-const": "error",
"quotes": [
"error",
"single",
{
"avoidEscape": true,
"allowTemplateLiterals": true
}
],
"semi": [
"error",
"always"
]
}
}

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
node_modules
.idea
tmp
admin/i18n/*/flat.txt
admin/i18n/flat.txt
package-lock.json
iob_npm.dode

14
.npmignore Normal file
View File

@ -0,0 +1,14 @@
admin/i18n
gulpfile.js
tasks
test
.travis.yml
doc
.idea
.git
.gitignore
node_modules
appveyor.yml
package-lock.json
iob_npm.dode
CHANGELOG_OLD.md

23
.travis.yml Normal file
View File

@ -0,0 +1,23 @@
os:
- linux
- osx
language: node_js
node_js:
- '4'
- '6'
- '8'
- '10'
before_script:
- export NPMVERSION=$(echo "$($(which npm) -v)"|cut -c1)
- 'if [[ $NPMVERSION == 5 ]]; then npm install -g npm@5; fi'
- npm -v
- npm install winston@2.3.1
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

4
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"javascript.implicitProjectConfig.checkJs": true,
"typescript.tsdk": "node_modules\\typescript\\lib"
}

306
CHANGELOG_OLD.md Normal file
View File

@ -0,0 +1,306 @@
The newest change log is in README.md
### 2.3.4 (2016-08-24)
* (bluefox) fix sayIt Block
### 2.3.2 (2016-08-18)
* (bluefox) add more blockly modules
* (bluefox) add debug mode and verbose mode
### 2.3.1 (2016-08-13)
* (bluefox) modify blockly modules
* (bluefox) give back some response even if state does not exist
* (bluefox) blockly support
### 2.3.0 (2016-07-01)
* (bluefox) export/import of scripts
### 2.2.1 (2016-06-27)
* (bluefox) fix delete state
### 2.2.0 (2016-06-16)
* (bluefox) adapter is compatible with redis
### 2.1.9 (2016-06-09)
* (bluefox) add for script onStop handler
### 2.1.8 (2016-05-31)
* (bluefox) do not show error if regexp ID
### 2.1.7 (2016-05-29)
* (bluefox) keep configured libraries by upgrade (once more)
### 2.1.5 (2016-05-29)
* (bluefox) keep configured libraries by upgrade
### 2.1.4 (2016-05-28)
* (bluefox) catch an error if some system object changed, e.g. _design/history
### 2.1.3 (2016-05-24)
* (bluefox) fix warning with wrong types one more time
### 2.1.2 (2016-05-23)
* (bluefox) fix warning with wrong types
### 2.1.1 (2016-05-21)
* (bluefox) try to fix "Duplicate name" error
* (bluefox) modify readFile/writeFile commands
* (gh-god) fix stop of script and unsubscribe
* (paul53) check type of set value and min, max by setState
### 2.1.0 (2016-05-13)
* (bluefox) add getHistory command
### 2.0.6 (2016-04-17)
* (bluefox) fix error in GUI
### 2.0.5 (2016-04-13)
* (bluefox) do not update script on save
* (bluefox) add lines wrap
### 2.0.4 (2016-03-15)
* (bluefox) sort drop down group selector
* (bluefox) check if object yet exists, when creates group
### 2.0.3 (2016-03-08)
* (bluefox) fix edit of instance
* (bluefox) add instance variable
### 2.0.2 (2016-02-20)
* (bluefox) fix start of scripts on adapter start
* (bluefox) add new scope variable "name" to print name of script: ```log(name) => script.js.common.ScriptName```
### 2.0.1 (2016-02-20)
* (bluefox) fix resize of script window
* (bluefox) delete state even if no object exists
### 2.0.0 (2016-02-19)
* Breaking changes.
* (bluefox) Support of script groups
* (bluefox) global scripts have name script.js.global.ScriptName and not script.js.ScriptName_global
### 1.2.0 (2016-02-11)
* (bluefox) start creation of tests
* (bluefox) add deleteState function
### 1.1.12 (2016-02-05)
* (bluefox) fix adapterSubscribe
### 1.1.11 (2016-02-03)
* (bluefox) do not allow empty IDs in pattern by subscription
### 1.1.10 (2016-02-02)
* (bluefox) fix error by getObject if object does't exist
### 1.1.9 (2016-02-01)
* (bluefox) use v1.0-pre version of node-schedule
### 1.1.8 (2016-01-31)
* (bluefox) try another version of node-schedule
### 1.1.7 (2016-01-31)
* (bluefox) use older node-schedule version 0.5.1
### 1.1.6 (2016-01-31)
* (bluefox) update node-schedule version
### 1.1.5 (2016-01-25)
* (bluefox) fix adapterSubscribe and adapterUnsubscribe
### 1.1.4 (2016-01-22)
* (bluefox) fix error by states to control activity of scripts
### 1.1.2 (2016-01-21)
* (bluefox) fix error by setStateDelayed
* (bluefox) add clearStateDelayed
* (bluefox) add javascript.INSTANCE.scriptEnabled.SCRIPT_NAME state to control activity of scripts
### 1.1.1 (2015-12-16)
* (bluefox) fix error if id is regExp
### 1.1.0 (2015-12-14)
* (bluefox) fix setObject
* (bluefox) implement adapterSubscribe/adapterUnsubscribe
### 1.0.9 (2015-12-08)
* (bluefox) clear enums cache if some enum changed
* (bluefox) add getSubscriptions function
### 1.0.8 (2015-11-30)
* (bluefox) fix error if name is null
### 1.0.7 (2015-11-16)
* (bluefox) Add setObject function
### 1.0.6 (2015-11-15)
* (angelnu) Add getAstroDay and isAstroDay functions.
### 1.0.5 (2015-11-03)
* (bluefox) fix clearSchedule
### 1.0.4 (2015-11-03)
* (bluefox) add unsubscribe
### 1.0.3 (2015-10-30)
* (bluefox) add clearSchedule function (only for non astro function)
### 1.0.2 (2015-10-12)
* (bluefox) allow break the "each" by returning of false value.
### 1.0.1 (2015-10-06)
* (bluefox) enable resize of columns in select ID dialog
### 1.0.0 (2015-10-05)
* (bluefox) fix error with regex and name
* (bluefox) adapter is stable => make 1.0.0
### 0.5.9 (2015-09-26)
* (bluefox) update ace editor
### 0.5.8 (2015-09-23)
* (bluefox) add new function "setStateDelayed"
### 0.5.7 (2015-09-13)
* (bluefox) change createState: if "def" exists, the state will be created with "def" value.
### 0.5.6 (2015-09-10)
* (bluefox) allow set state of object if value was never set
### 0.5.5 (2015-08-23)
* (bluefox) fix error if many additional npm packets
### 0.5.4 (2015-08-17)
* (bluefox) new function getIdByName
### 0.5.3 (2015-08-15)
* (bluefox) fix error with regexp
### 0.5.2 (2015-08-05)
* (bluefox) make edit buttons (in admin tab) visible
* (bluefox) add console.log, console.warn, console.error commands
* (bluefox) update packets
### 0.5.1 (2015-07-27)
* (bluefox) fix error with enums
### 0.5.0 (2015-07-27)
* (bluefox) extend getObject with enum names and add new function getEnums
### 0.4.13 (2015-07-20)
* (bluefox) sort scripts alphabetically and globals at begin
### 0.4.12 (2015-07-17)
* (bluefox) fix error in getObjectEnums
### 0.4.11 (2015-07-13)
* (bluefox) fix error with selector and enums
### 0.4.9 (2015-07-11)
* (bluefox) fix channelName and channelId and optimize matching
### 0.4.8 (2015-06-29)
* (bluefox) fix select dialog
### 0.4.7 (2015-06-28)
* (bluefox) own tab in admin
* (bluefox) cron editor (limited)
### 0.4.6 (2015-06-16)
* (bluefox) global scripts
### 0.4.5 (2015-06-04)
* (bluefox) fix error with schedule and sunday
### 0.4.4 (2015-06-03)
* (bluefox) show error if suncalc cannot calculate time and set time to 23:59:59
### 0.4.3 (2015-06-01)
* (bluefox) show error if suncalc cannot calculate time
### 0.4.2 (2015-05-16)
* (bluefox) fix error with invalid additional packages
### 0.4.0 (2015-05-16)
* (bluefox) allow additionally install other npm packages for javascript
### 0.3.2 (2015-04-30)
* (bluefox) fix warning with createState
### 0.3.1 (2015-04-29)
* (bluefox) fix astro function
### 0.3.0 (2015-03-22)
* (bluefox) extend createState with native and common
* (bluefox) add new convert functions: toInt, toFloat, toBool
### 0.2.6 (2015-03-16)
* (bluefox) convert automatically grad to decimal grad
* (bluefox) fix some errors
### 0.2.5 (2015-03-16)
* (bluefox) enable on('localVar', function ()...)
### 0.2.4 (2015-03-16)
* (bluefox) fix error with astro. Add longitude and latitude to settings.
* (bluefox) fix selector if brackets are wrong
* (bluefox) make possible use "on" instead schedule
### 0.2.3 (2015-03-06)
* (bluefox) extend readme
* (bluefox) add "change: 'any'" condition to trigger on updated value
### 0.2.2 (2015-03-04)
* (bluefox) fix log function
### 0.2.1 (2015-03-02)
* (bluefox) fix sendTo function
### 0.2.0 (2015-02-24)
* (bluefox) add functions to sandbox: formatDate, writeFile, readFile
### 0.1.12 (2015-02-21)
* (bluefox) fix createState and expand it.
### 0.1.11 (2015-01-10)
* (bluefox) fix "on('state1', 'state2');"
### 0.1.10 (2015-01-04)
* (bluefox) catch errors if states deleted
### 0.1.9 (2015-01-04)
* (bluefox) add settings page
### 0.1.8 (2015-01-03)
* (bluefox) enable npm install
### 0.1.7 (2014-12-12)
* (bluefox) check errors if invalid object.
### 0.1.6 (2014-12-08)
* (bluefox) add some log outputs.
### 0.1.5 (2014-11-26)
* (bluefox) fix context of all callbacks.
### 0.1.4 (2014-11-22)
* (bluefox) Support of jquery like selector $. See above for details.
### 0.1.3 (2014-11-16)
* (bluefox) Support of wrapper "cb" for callbacks in script. (Expert mode)
### 0.1.2 (2014-11-15)
* (bluefox) support change, delete and add of the scripts without restart of adapter
### 0.1.1
* (hobbyquaker) fixed typo
### 0.1.0
* (hobbyquaker) require() in scripts works now
* (hobbyquaker) fixes
### 0.0.2
* (hobbyquaker) CoffeeScript support
* (hobbyquaker) fixes
### 0.0.1
* (hobbyquaker) first release

23
LICENSE Normal file
View File

@ -0,0 +1,23 @@
The MIT License (MIT)
Copyright (c) 2014-2018 bluefox <dogafox@gmail.com>,
Copyright (c) 2014 hobbyquaker
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

169
README.md Normal file
View File

@ -0,0 +1,169 @@
![Logo](admin/js.jpeg)
# Javascript Script Engine
==================
[![NPM version](http://img.shields.io/npm/v/yunkong2.javascript.svg)](https://www.npmjs.com/package/yunkong2.javascript)
[![Downloads](https://img.shields.io/npm/dm/yunkong2.javascript.svg)](https://www.npmjs.com/package/yunkong2.javascript)
[![Tests](https://travis-ci.org/yunkong2/yunkong2.javascript.svg?branch=master)](https://travis-ci.org/yunkong2/yunkong2.javascript)
[![NPM](https://nodei.co/npm/yunkong2.javascript.png?downloads=true)](https://nodei.co/npm/yunkong2.javascript/)
Executes Javascript, Typescript and Coffescript Scripts.
[Function documentation](doc/en/javascript.md)
[Benutzung](doc/de/usage.md)
Here you can find description of [blockly](doc/en/blockly.md).
Hier kann man die Beschreibung von [Blockly](doc/de/blockly.md) finden.
Описание по [blockly](doc/ru/blockly.md) можно найти [здесь](doc/ru/blockly.md).
## Changelog
### 3.7.0 (2018-05-05)
* (bluefox) Used VM2 as sandbox. The script errors will be caught.
* (bluefox) refactoring: split into many modules
### 3.6.4 (2018-02-05)
* (bluefox) Pattern error is fixed
### 3.6.3 (2018-01-31)
* (bluefox) Fixing the CSS for CRON dialog
* (bluefox) Fixing the reorder of scripts
### 3.6.1 (2018-01-23)
* (bluefox) Pattern error is fixed
### 3.6.0 (2017-12-28)
* (bluefox) more translations are added
* (bluefox) update blockly engine
### 3.5.1 (2017-11-14)
* (bluefox) fixed: sometimes MSG is not defined
* (dominic.griesel) TypeScript support (preparations)
* (bluefox) add sendToHost call
* (bluefox) protect exec call
* (bluefox) add getStateDelayed function
### 3.4.4 (2017-09-12)
* (soef) typo error in line number correction fixed
### 3.4.1 (2017-08-12)
* (soef) patternMatching optimized
### 3.4.0 (2017-08-06)
* (bluefox) Support of new admin
### 3.3.12 (2017-07-24)
* (bluefox) file and line info added to log outputs
### 3.3.11 (2017-07-18)
* (bluefox) fix build CRON block
### 3.3.9 (2017-06-18)
* (bluefox) Add the toggle blockly block
### 3.3.8 (2017-05-22)
* (Apollon77/bluefox) Accept for subscribes arrays of IDs
### 3.3.6 (2017-05-17)
* (bluefox) add the genitive month for formatDate
### 3.3.4 (2017-04-01)
* (bluefox) Catch error by request if host unavailable
* (bluefox) add "request" to script namespace
### 3.3.3 (2017-03-27)
* (bluefox)Fix stopScript
### 3.3.2 (2017-03-18)
* (bluefox) Support of system coordinates
### 3.3.1 (2017-03-15)
* (bluefox) fix error if no scripts exists
### 3.3.0 (2017-03-14)
* (bluefox) all callbacks in try/catch
### 3.2.8 (2017-03-08)
* (bluefox) Translations
### 3.2.7 (2017-03-03)
* (bluefox) allow creation of states for other javascript instances
### 3.2.6 (2017-02-14)
* (bluefox) Fix import of scripts
* (bluefox) Ask to save before start the script
### 3.2.5 (2017-01-23)
* (bluefox) Extend compareTime function with astro features
### 3.2.4 (2017-01-13)
* (bluefox) fix stopScript
### 3.2.3 (2017-01-05)
* (bluefox) Try to fix error with sayit
### 3.2.2 (2016-12-17)
* (bluefox) Allow with stopScript() to stop itself
### 3.2.1 (2016-11-24)
* (bluefox) Fix error with subscribe for only required states
### 3.2.0 (2016-11-14)
* (bluefox) Fix error with of blocks in adapters
* (bluefox) Support of subscribe for only required states
* (bluefox) add delFile
* (bluefox) fix error with names
### 3.1.0 (2016-10-12)
* (bluefox) Support of blocks in adapters
* (bluefox) Move sendTo blocks into adapters
### 3.0.10 (2016-09-30)
* (bluefox) New blocks: compare time, write state
* (bluefox) Documentation
### 3.0.9 (2016-09-20)
* (bluefox) Bugfixing of blockly
### 3.0.7 (2016-09-09)
* (bluefox) add ack for trigger in blockly
* (bluefox) add block to get info about trigger
* (bluefox) start description of blockly
* (bluefox) add runScript functions
* (bluefox) disable zoom on wheel in blockly
* (bluefox) fix block: time compare
### 3.0.6 (2016-09-07)
* (bluefox) add extendObject function
* (bluefox) add custom sendTo block
* (bluefox) add multiple trigger block
### 3.0.5 (2016-09-03)
* (bluefox) Fix sendTo blocks
### 3.0.4 (2016-09-01)
* (bluefox) Support of convert day of week into text in blockly
### 3.0.3 (2016-08-29)
* (bluefox) Fixed the convert date block
### 3.0.2 (2016-08-28)
* (bluefox) Change name of sandbox debug variable
### 3.0.1 (2016-08-27)
* (bluefox) Fix disabling of script
### 3.0.0 (2016-08-27)
* (bluefox) Beta Release with Blockly
## License
The MIT License (MIT)
Copyright (c) 2014-2018 bluefox <dogafox@gmail.com>,
Copyright (c) 2014 hobbyquaker

62
admin/adminWords.js Normal file
View File

@ -0,0 +1,62 @@
/*global systemDictionary:true */
'use strict';
systemDictionary = {
"Additional npm modules:": { "en": "Additional npm modules", "de": "Zusätzliche NPM-Module", "ru": "Дополнительные NPM Модули", "pt": "Módulos npm adicionais", "nl": "Extra npm-modules", "fr": "Modules NPM supplémentaires", "it": "Moduli aggiuntivi di npm", "es": "Módulos npm adicionales"},
"Astro settings": { "en": "Astro settings", "de": "Astro-Einstellungen", "ru": "Настройки астро-функций", "pt": "Configurações Astro", "nl": "Astro-instellingen", "fr": "Paramètres Astro", "it": "Impostazioni Astro", "es": "Configuración de Astro"},
"Do not subscribe all states on start:": { "en": "Do not subscribe all states on start", "de": "Nicht alle Zustände beim Start abonnieren", "ru": "Оптимизация состояний", "pt": "Não inscreva todos os estados no início", "nl": "Abonneer u niet op alle staten bij het begin", "fr": "Ne souscrivez pas tous les états au début", "it": "Non iscriversi tutti gli stati all'avvio", "es": "No suscriba todos los estados al inicio"},
"Enable command \"exec\":": { "en": "Enable command \"exec\"", "de": "Erlaube das Kommando \"exec\"", "ru": "Разрешить команду \"exec\"", "pt": "Ativar comando \"exec\"", "nl": "Schakel het commando \"exec\" in", "fr": "Activer la commande \"exec\"", "it": "Abilita il comando \"exec\"", "es": "Habilite el comando \"exec\""},
"Enable command \"sendToHost\":": { "en": "Enable command \"sendToHost\"", "de": "Erlaube das Kommando \"sendToHost\"", "ru": "Разрешить команду \"sendToHost\"", "pt": "Ativar comando \"sendToHost\"", "nl": "Schakel het commando \"sendToHost\" in", "fr": "Activer la commande \"sendToHost\"", "it": "Abilita il comando \"sendToHost\"", "es": "Habilitar el comando \"sendToHost\""},
"Enable command \"setObject\":": { "en": "Enable command \"setObject\"", "de": "Erlaube das Kommando \"setObject\"", "ru": "Разрешить команду \"setObject\"", "pt": "Ativar comando \"setObject\"", "nl": "Schakel het commando \"setObject\" in", "fr": "Activer la commande \"setObject\"", "it": "Abilita il comando \"setObject\"", "es": "Habilitar el comando \"setObject\""},
"Help": { "en": "Use form with 49.1245 and <b>not</b> 49°34'0\". Elsewise it will be converted automatically.", "de": "Benutze das Format mit 49.1245 und <b>nicht</b> 49°34'0\", sonst wird es automatisch umgerechnet", "ru": "Используйте формат 49.1245, а <b>не</b> 49°34'0\", иначе градусы автоматически переведутся в нужный формат", "pt": "Use o formulário com 49.1245 e <b>não</b> 49°34'0\". Além disso, ele será convertido automaticamente.", "nl": "Gebruik het formulier met 49.1245 en <b>niet</b> 49°34'0 \". Anders wordt het automatisch geconverteerd.", "fr": "Utilisez le formulaire avec 49.1245 et <b>pas</b> 49°34'0\", sinon il sera converti automatiquement.", "it": "Usa il modulo con 49.1245 e <b> non </b> 49°34'0\". Altrimenti sarà convertito automaticamente.", "es": "Use el formulario con 49.1245 y <b>no</b> 49°34'0 \". De lo contrario, se convertirá automáticamente."},
"Use system settings:": {
"en": "Use system settings",
"de": "Verwenden Sie die Systemeinstellungen",
"ru": "Используйте системные настройки",
"pt": "Use as configurações do sistema",
"nl": "Gebruik systeeminstellingen",
"fr": "Utiliser les paramètres du système",
"it": "Usa le impostazioni di sistema",
"es": "Use la configuración del sistema",
"pl": "Użyj ustawień systemu:"
},
"Module names": {
"en": "Module names",
"de": "Modulnamen",
"ru": "Имена модулей",
"pt": "Nomes de módulos",
"nl": "Module namen",
"fr": "Noms de modules",
"it": "Nomi dei moduli",
"es": "Nombres de módulos",
"pl": "Nazwy modułów"
},
"Add module": {
"en": "Add module",
"de": "Modul hinzufügen",
"ru": "Добавить модуль",
"pt": "Adicionar módulo",
"nl": "Module toevoegen",
"fr": "Ajouter un module",
"it": "Aggiungi modulo",
"es": "Agregar módulo",
"pl": "Dodaj moduł"
},
"Invalid format. Use A°B'C\"D": { "en": "Invalid format. Use A°B'C\"D", "de": "Falsches Format. korrekt: A°B'C\"D", "ru": "Неправильный формат. Используется г°м'с\"Н", "pt": "Formato Inválido. Use A°B'C\"D", "nl": "Ongeldige indeling. Gebruik A°B'C\"D", "fr": "Format invalide. Utilisez A°B'C\"D", "it": "Formato non valido. Utilizzare A°B'C \"D", "es": "Formato inválido. Use A°B'C\"D"},
"Javascript scripts adapter settings": { "en": "Javascript scripts adapter settings", "de": "Adapter-Einstellungen Javascript", "ru": "Настройки скриптов Javascript", "pt": "Configurações do adaptador de scripts Javascript", "nl": "Javascript scripts adapter-instellingen", "fr": "Paramètres de l'adaptateur de scripts Javascript", "it": "Impostazioni della scheda script JavaScript", "es": "Configuración del adaptador de scripts de Javascript"},
"Latitude °:": { "en": "Latitude °", "de": "Breite °", "ru": "Широта °", "pt": "Latitude °", "nl": "Breedtegraad °", "fr": "Latitude °", "it": "Latitudine °", "es": "Latitud °"},
"Longitude °:": { "en": "Longitude °", "de": "Länge °", "ru": "Долгота °", "pt": "Longitude °", "nl": "Lengtegraad °", "fr": "Longitude °", "it": "Longitudine °", "es": "Longitud °"},
"Security relevant": { "en": "Security relevant", "de": "sicherheitsrelevant", "ru": "Безопасность уменшена", "pt": "Segurança relevante", "nl": "Beveiliging relevant", "fr": "Sécurité pertinente", "it": "Sicurezza rilevante", "es": "Seguridad relevante"},
"Settings": { "en": "Settings", "de": "Einstellungen", "ru": "Настройки", "pt": "Configurações", "nl": "instellingen", "fr": "Paramètres", "it": "impostazioni", "es": "Configuraciones"},
"info_enableExec": { "en": "System security relevant", "de": "sicherheitsrelevant für das gesamte System", "ru": "Снижает безопасность системы", "pt": "Segurança do sistema relevante", "nl": "Systeembeveiliging relevant", "fr": "Sécurité du système pertinente", "it": "Sicurezza del sistema rilevante", "es": "Seguridad del sistema relevante"},
"info_enableSendToHost": { "en": "Security relevant", "de": "sicherheitsrelevant", "ru": "Снижает безопасность", "pt": "Segurança relevante", "nl": "Beveiliging relevant", "fr": "Sécurité pertinente", "it": "Sicurezza rilevante", "es": "Seguridad relevante"},
"info_enableSetObject": { "en": "Security relevant", "de": "sicherheitsrelevant", "ru": "Снижает безопасность", "pt": "Segurança relevante", "nl": "Beveiliging relevant", "fr": "Sécurité pertinente", "it": "Sicurezza rilevante", "es": "Seguridad relevante"},
"info_libraries": { "en": "Divided by comma", "de": "Getrennt mit Komma", "ru": "Через запятую", "pt": "Dividido por vírgula", "nl": "Verdeeld door een komma", "fr": "Divisé par une virgule", "it": "Diviso in virgola", "es": "Dividido por coma"},
"tooltip_enableExec": { "en": "Allow calling of exec in scripts", "de": "Erlaube den Aufruf von exec in Skripten", "ru": "Разрешить вызывать exec в скриптах", "pt": "Permitir chamada de exec em scripts", "nl": "Sta het aanroepen van exec in scripts toe", "fr": "Autoriser l'appel d'exec dans les scripts", "it": "Permetti la chiamata di exec negli script", "es": "Permitir llamar al ejecutivo en scripts"},
"tooltip_enableSendToHost": { "en": "Allow to send messages to hosts in scripts", "de": "Erlaube die Versendung von Nachrichten in Skripten", "ru": "Разрешить посылать специальные сообщения в скриптах", "pt": "Permitir enviar mensagens para hosts em scripts", "nl": "Sta toe om berichten naar hosts in scripts te verzenden", "fr": "Autoriser l'envoi de messages aux hôtes dans des scripts", "it": "Consentire di inviare messaggi agli host negli script", "es": "Permitir enviar mensajes a hosts en scripts"},
"tooltip_enableSetObject": { "en": "Allow changes of the system objects in scripts", "de": "Erlaube die Veränderung von Systemobjekten in Skripten", "ru": "Разрешить изменять системные объекты в скриптах", "pt": "Permitir alterações dos objetos do sistema em scripts", "nl": "Wijzigingen van de systeemobjecten in scripts toestaan", "fr": "Autoriser les modifications des objets système dans les scripts", "it": "Consenti modifiche degli oggetti di sistema negli script", "es": "Permitir cambios de los objetos del sistema en scripts"},
"tooltip_latitude": { "en": "Latitude as 5.345 to use astro functions", "de": "Der Breitengrad im Format 5.345 für Astro-Funktion", "ru": "Широта в виде 5.435 для астро функций", "pt": "Latitude como 5.345 para usar funções astro", "nl": "Breedtegraad als 5.345 om astro-functies te gebruiken", "fr": "Latitude comme 5.345 pour utiliser les fonctions astro", "it": "Latitude come 5.345 per utilizzare le funzioni astro", "es": "Latitud como 5.345 para usar funciones astro"},
"tooltip_libraries": { "en": "Additional NPM libraries divided by comma. You can access them with require('name') in scripts.", "de": "Zusätzliche NPM Pakete mit Komma getrennt. Man kann die Pakete mit require('name') benutzen.", "ru": "Дополнительные NPM пакеты через запятую. Их можно использовать в скриптах, как require('name')", "pt": "Bibliotecas NPM adicionais divididas por vírgulas. Você pode acessá-los com o requerimento ('nome') em scripts.", "nl": "Extra NPM-bibliotheken gedeeld door een komma. U kunt ze benaderen met require ('name') in scripts.", "fr": "Bibliothèques NPM supplémentaires divisées par une virgule. Vous pouvez y accéder avec require ('nom') dans les scripts.", "it": "Ulteriori librerie NPM divise per virgola. Puoi accedervi con require ('name') negli script.", "es": "Bibliotecas adicionales de NPM divididas por comas. Puede acceder a ellos con require ('nombre') en las secuencias de comandos."},
"tooltip_longitude": { "en": "Longitude as 5.345 to use astro functions", "de": "Der Längengrad im Format 5.345 für Astro-Funktion", "ru": "Широта в виде 5.435 для астро функций", "pt": "Longitude como 5.345 para usar funções astro", "nl": "Lengtegraad als 5.345 om astro-functies te gebruiken", "fr": "Longitude comme 5.345 pour utiliser les fonctions astro", "it": "Longitudine come 5.345 per utilizzare le funzioni astro", "es": "Longitud como 5.345 para usar funciones astro"},
"tooltip_useSystemGPS": { "en": "Use coordinates from system settings", "de": "Benutze die Koordinaten aus den Systemeinstellungen", "ru": "Использовать координаты из системных настроек", "pt": "Use as coordenadas das configurações do sistema", "nl": "Gebruik coördinaten van systeeminstellingen", "fr": "Utiliser les coordonnées des paramètres du système", "it": "Usa le coordinate dalle impostazioni di sistema", "es": "Usa las coordenadas de la configuración del sistema"},
};

BIN
admin/blockly.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
admin/coffeescript.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,24 @@
.cron-button {
height: 16px;
padding-left: 20px;
margin-left: 5px;
background-repeat: no-repeat;
background-position: center center;
cursor: pointer;
}
.cron-button-save {
background-image: url('img/disk.png');
}
.cron-changed {
padding-top: 5px;
padding-bottom: 5px;
background-color: #fdd;
}
.cron-controls {
margin-left: 10px;
color: #c77;
font-size: 0.9em;
}
.cron-controls > span.cron-loading {
background-image: url('img/loading.gif');
}

520
admin/cron/jquery-cron.js vendored Normal file
View File

@ -0,0 +1,520 @@
/*
* jQuery gentleSelect plugin (version 0.1.4.1)
* http://shawnchin.git.spacen.net/jquery-cron
*
* Copyright (c) 2010-2013 Shawn Chin.
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Requires:
* - jQuery
*
* Usage:
* (JS)
*
* // initialise like this
* var c = $('#cron').cron({
* initial: '9 10 * * *', # Initial value. default = "* * * * *"
* url_set: '/set/', # POST expecting {"cron": "12 10 * * 6"}
* });
*
* // you can update values later
* c.cron("value", "1 2 3 4 *");
*
* // you can also get the current value using the "value" option
* alert(c.cron("value"));
*
* (HTML)
* <div id='cron'></div>
*
* Notes:
* At this stage, we only support a subset of possible cron options.
* For example, each cron entry can only be digits or "*", no commas
* to denote multiple entries. We also limit the allowed combinations:
* - Every minute : * * * * *
* - Every hour : ? * * * *
* - Every day : ? ? * * *
* - Every week : ? ? * * ?
* - Every month : ? ? ? * *
* - Every year : ? ? ? ? *
*/
(function($) {
var defaults = {
initial : "* * * * *",
minuteOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : 30,
columns : 4,
rows : undefined,
title : "Minutes Past the Hour"
},
timeHourOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : 20,
columns : 2,
rows : undefined,
title : "Time: Hour"
},
domOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : 30,
columns : undefined,
rows : 10,
title : "Day of Month"
},
monthOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : 100,
columns : 2,
rows : undefined,
title : undefined
},
dowOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : undefined,
columns : undefined,
rows : undefined,
title : undefined
},
timeMinuteOpts : {
minWidth : 100, // only applies if columns and itemWidth not set
itemWidth : 20,
columns : 4,
rows : undefined,
title : "Time: Minute"
},
effectOpts : {
openSpeed : 400,
closeSpeed : 400,
openEffect : "slide",
closeEffect : "slide",
hideOnMouseOut : true
},
url_set : undefined,
customValues : undefined,
onChange: undefined, // callback function each time value changes
useGentleSelect: false
};
// ------- build some static data -------
var str_opt_dom = "";
var str_opt_month = "";
var str_opt_dow = "";
var str_opt_period = "";
var toDisplay = {};
var combinations = {};
// options for minutes in an hour
var str_opt_mih = "";
for (var i = 0; i < 60; i++) {
var j = (i < 10)? "0":"";
str_opt_mih += "<option value='"+i+"'>" + j + i + "</option>\n";
}
// options for hours in a day
var str_opt_hid = "";
for (var i = 0; i < 24; i++) {
var j = (i < 10)? "0":"";
str_opt_hid += "<option value='"+i+"'>" + j + i + "</option>\n";
}
function buildSelects(options) {
options = options || {};
// options for days of month
if (options.dom){
for (var i = 1; i < 32; i++) {
str_opt_dom += "<option value='"+i+"'>" + options.dom[i] + "</option>\n";
}
} else {
for (var i = 1; i < 32; i++) {
if (i == 1 || i == 21 || i == 31) { var suffix = "st"; }
else if (i == 2 || i == 22) { var suffix = "nd"; }
else if (i == 3 || i == 23) { var suffix = "rd"; }
else { var suffix = "th"; }
str_opt_dom += "<option value='"+i+"'>" + i + suffix + "</option>\n";
}
}
// options for months
var months = options.months || ["January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"];
for (var i = 0; i < months.length; i++) {
str_opt_month += "<option value='"+(i+1)+"'>" + months[i] + "</option>\n";
}
// options for day of week
var days = options.days || ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday"];
for (var i = 0; i < days.length; i++) {
str_opt_dow += "<option value='"+i+"'>" + days[i] + "</option>\n";
}
// options for period
options.periods = options.periods || ["minute", "hour", "day", "week", "month", "year"];
for (var i = 0; i < options.periods.length; i++) {
str_opt_period += "<option value='"+options.periods[i]+"'>" + options.periods[i] + "</option>\n";
}
// display matrix
toDisplay = {};
toDisplay[options.periods[0]] = []; // minute
toDisplay[options.periods[1]] = ["mins"]; // hour
toDisplay[options.periods[2]] = ["time"]; // day
toDisplay[options.periods[3]] = ["dow", "time"]; // week
toDisplay[options.periods[4]] = ["dom", "time"]; // month
toDisplay[options.periods[5]] = ["dom", "month", "time"]; // year
combinations = {};
combinations[options.periods[0]] = /^(\*\s){4}\*$/, // "* * * * *"
combinations[options.periods[1]] = /^\d{1,2}\s(\*\s){3}\*$/, // "? * * * *"
combinations[options.periods[2]] = /^(\d{1,2}\s){2}(\*\s){2}\*$/, // "? ? * * *"
combinations[options.periods[3]] = /^(\d{1,2}\s){2}(\*\s){2}\d{1,2}$/, // "? ? * * ?"
combinations[options.periods[4]] = /^(\d{1,2}\s){3}\*\s\*$/, // "? ? ? * *"
combinations[options.periods[5]] = /^(\d{1,2}\s){4}\*$/ // "? ? ? ? *"
}
// ------------------ internal functions ---------------
function defined(obj) {
if (typeof obj == "undefined") { return false; }
else { return true; }
}
function undefinedOrObject(obj) {
return (!defined(obj) || typeof obj == "object")
}
function getCronType(cron_str, opts) {
// if customValues defined, check for matches there first
if (defined(opts.customValues)) {
for (key in opts.customValues) {
if (cron_str == opts.customValues[key]) { return key; }
}
}
// check format of initial cron value
var valid_cron = /^((\d{1,2}|\*)\s){4}(\d{1,2}|\*)$/
if (typeof cron_str != "string" || !valid_cron.test(cron_str)) {
$.error("cron: invalid initial value");
return undefined;
}
// check actual cron values
var d = cron_str.split(" ");
// mm, hh, DD, MM, DOW
var minval = [ 0, 0, 1, 1, 0];
var maxval = [59, 23, 31, 12, 6];
for (var i = 0; i < d.length; i++) {
if (d[i] == "*") continue;
var v = parseInt(d[i]);
if (defined(v) && v <= maxval[i] && v >= minval[i]) continue;
$.error("cron: invalid value found (col "+(i+1)+") in " + o.initial);
return undefined;
}
// determine combination
for (var t in combinations) {
if (combinations[t].test(cron_str)) { return t; }
}
// unknown combination
$.error("cron: valid but unsupported cron format. sorry.");
return undefined;
}
function hasError(c, o) {
if (!defined(getCronType(o.initial, o))) { return true; }
if (!undefinedOrObject(o.customValues)) { return true; }
// ensure that customValues keys do not coincide with existing fields
if (defined(o.customValues)) {
for (key in o.customValues) {
if (combinations.hasOwnProperty(key)) {
$.error("cron: reserved keyword '" + key +
"' should not be used as customValues key.");
return true;
}
}
}
return false;
}
function getCurrentValue(c) {
var o = c.data('options');
var b = c.data("block");
var min = hour = day = month = dow = "*";
var selectedPeriod = b["period"].find("select").val();
if (selectedPeriod == o.periods[0]) {
// minute
} else if (selectedPeriod == o.periods[1]) {
//hour
min = b["mins"].find("select").val();
} else if (selectedPeriod == o.periods[2]) {
//day
min = b["time"].find("select.cron-time-min").val();
hour = b["time"].find("select.cron-time-hour").val();
} else if (selectedPeriod == o.periods[3]) {
//week
min = b["time"].find("select.cron-time-min").val();
hour = b["time"].find("select.cron-time-hour").val();
dow = b["dow"].find("select").val();
} else if (selectedPeriod == o.periods[4]) {
//month
min = b["time"].find("select.cron-time-min").val();
hour = b["time"].find("select.cron-time-hour").val();
day = b["dom"].find("select").val();
} else if (selectedPeriod == o.periods[5]) {
//year
min = b["time"].find("select.cron-time-min").val();
hour = b["time"].find("select.cron-time-hour").val();
day = b["dom"].find("select").val();
month = b["month"].find("select").val();
} else {
// default
// we assume this only happens when customValues is set
return selectedPeriod;
}
return [min, hour, day, month, dow].join(" ");
}
// ------------------- PUBLIC METHODS -----------------
var methods = {
init : function(opts) {
// init options
var options = opts ? opts : {}; /* default to empty obj */
var o = $.extend([], defaults, options);
var eo = $.extend({}, defaults.effectOpts, options.effectOpts);
$.extend(o, {
minuteOpts : $.extend({}, defaults.minuteOpts, eo, options.minuteOpts),
domOpts : $.extend({}, defaults.domOpts, eo, options.domOpts),
monthOpts : $.extend({}, defaults.monthOpts, eo, options.monthOpts),
dowOpts : $.extend({}, defaults.dowOpts, eo, options.dowOpts),
timeHourOpts : $.extend({}, defaults.timeHourOpts, eo, options.timeHourOpts),
timeMinuteOpts : $.extend({}, defaults.timeMinuteOpts, eo, options.timeMinuteOpts)
});
buildSelects(o);
// error checking
if (hasError(this, o)) { return this; }
// ---- define select boxes in the right order -----
var block = [], custom_periods = "", cv = o.customValues;
if (defined(cv)) { // prepend custom values if specified
for (var key in cv) {
custom_periods += "<option value='" + cv[key] + "'>" + key + "</option>\n";
}
}
block["period"] = $("<span class='cron-period'>"
+ (o.every || "Every") + " <select name='cron-period'>" + custom_periods
+ str_opt_period + "</select> </span>")
.appendTo(this)
.data("root", this);
var select = block["period"].find("select");
select.bind("change.cron", event_handlers.periodChanged)
.data("root", this);
if (o.useGentleSelect) select.gentleSelect(eo);
block["dom"] = $("<span class='cron-block cron-block-dom'>"
+ " " + (o.onThe || "on the") + " <select name='cron-dom'>" + str_opt_dom
+ "</select> </span>")
.appendTo(this)
.data("root", this);
select = block["dom"].find("select").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.domOpts);
block["month"] = $("<span class='cron-block cron-block-month'>"
+ " " + (o.of || "of") + " <select name='cron-month'>" + str_opt_month
+ "</select> </span>")
.appendTo(this)
.data("root", this);
select = block["month"].find("select").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.monthOpts);
block["mins"] = $("<span class='cron-block cron-block-mins'>"
+ " " + (o.at || "at") + " <select name='cron-mins'>" + str_opt_mih
+ "</select> " + o.minuteOpts.title + " </span>")
.appendTo(this)
.data("root", this);
select = block["mins"].find("select").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.minuteOpts);
block["dow"] = $("<span class='cron-block cron-block-dow'>"
+ " " + (o.on || "on") + " <select name='cron-dow'>" + str_opt_dow
+ "</select> </span>")
.appendTo(this)
.data("root", this);
select = block["dow"].find("select").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.dowOpts);
block["time"] = $("<span class='cron-block cron-block-time'>"
+ " " + (o.at || "at") + " <select name='cron-time-hour' class='cron-time-hour'>" + str_opt_hid
+ "</select>:<select name='cron-time-min' class='cron-time-min'>" + str_opt_mih
+ " </span>")
.appendTo(this)
.data("root", this);
select = block["time"].find("select.cron-time-hour").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.timeHourOpts);
select = block["time"].find("select.cron-time-min").data("root", this);
if (o.useGentleSelect) select.gentleSelect(o.timeMinuteOpts);
block["controls"] = $("<span class='cron-controls'>&laquo; save "
+ "<span class='cron-button cron-button-save'></span>"
+ " </span>")
.appendTo(this)
.data("root", this)
.find("span.cron-button-save")
.bind("click.cron", event_handlers.saveClicked)
.data("root", this)
.end();
this.find("select").bind("change.cron-callback", event_handlers.somethingChanged);
this.data("options", o).data("block", block); // store options and block pointer
this.data("current_value", o.initial); // remember base value to detect changes
return methods["value"].call(this, o.initial); // set initial value
},
value : function(cron_str) {
// when no args, act as getter
if (!cron_str) { return getCurrentValue(this); }
var o = this.data('options');
var block = this.data("block");
var useGentleSelect = o.useGentleSelect;
var t = getCronType(cron_str, o);
if (!defined(t)) { return false; }
if (defined(o.customValues) && o.customValues.hasOwnProperty(t)) {
t = o.customValues[t];
} else {
var d = cron_str.split(" ");
var v = {
"mins" : d[0],
"hour" : d[1],
"dom" : d[2],
"month" : d[3],
"dow" : d[4]
};
// update appropriate select boxes
var targets = toDisplay[t];
for (var i = 0; i < targets.length; i++) {
var tgt = targets[i];
if (tgt == "time") {
var btgt = block[tgt].find("select.cron-time-hour").val(v["hour"]);
if (useGentleSelect) btgt.gentleSelect("update");
btgt = block[tgt].find("select.cron-time-min").val(v["mins"]);
if (useGentleSelect) btgt.gentleSelect("update");
} else {;
var btgt = block[tgt].find("select").val(v[tgt]);
if (useGentleSelect) btgt.gentleSelect("update");
}
}
}
// trigger change event
var bp = block["period"].find("select").val(t);
if (useGentleSelect) bp.gentleSelect("update");
bp.trigger("change");
return this;
}
};
var event_handlers = {
periodChanged : function() {
var root = $(this).data("root");
var block = root.data("block"),
opt = root.data("options");
var period = $(this).val();
root.find("span.cron-block").hide(); // first, hide all blocks
if (toDisplay.hasOwnProperty(period)) { // not custom value
var b = toDisplay[$(this).val()];
for (var i = 0; i < b.length; i++) {
block[b[i]].show();
}
}
},
somethingChanged : function() {
root = $(this).data("root");
// if AJAX url defined, show "save"/"reset" button
if (defined(root.data("options").url_set)) {
if (methods.value.call(root) != root.data("current_value")) { // if changed
root.addClass("cron-changed");
root.data("block")["controls"].fadeIn();
} else { // values manually reverted
root.removeClass("cron-changed");
root.data("block")["controls"].fadeOut();
}
} else {
root.data("block")["controls"].hide();
}
// chain in user defined event handler, if specified
var oc = root.data("options").onChange;
if (defined(oc) && $.isFunction(oc)) {
oc.call(root);
}
},
saveClicked : function() {
var btn = $(this);
var root = btn.data("root");
var cron_str = methods.value.call(root);
if (btn.hasClass("cron-loading")) { return; } // in progress
btn.addClass("cron-loading");
$.ajax({
type : "POST",
url : root.data("options").url_set,
data : { "cron" : cron_str },
success : function() {
root.data("current_value", cron_str);
btn.removeClass("cron-loading");
// data changed since "save" clicked?
if (cron_str == methods.value.call(root)) {
root.removeClass("cron-changed");
root.data("block").controls.fadeOut();
}
},
error : function() {
alert("An error occured when submitting your request. Try again?");
btn.removeClass("cron-loading");
}
});
}
};
$.fn.cron = function(method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || ! method) {
return methods.init.apply(this, arguments);
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.cron' );
}
};
})(jQuery);

515
admin/cron2text.js Normal file
View File

@ -0,0 +1,515 @@
/**
* Given a cronspec, return the human-readable string.
* @param {string} cronspec
* @param withSeconds
* @param {Object=} locale
*/
function cronToText(cronspec, withSeconds, locale) {
'use strict';
// Constant array to convert valid names to values
var NAMES = {
JAN: 1, FEB: 2, MAR: 3, APR: 4, MAY: 5, JUN: 6, JUL: 7, AUG: 8,
SEP: 9, OCT: 10, NOV: 11, DEC: 12,
SUN: 1, MON: 2, TUE: 3, WED: 4, THU: 5, FRI: 6, SAT: 7
};
// Parsable replacements for common expressions
var REPLACEMENTS = {
'* * * * * *': '0/1 * * * * *',
'@YEARLY': '0 0 1 1 *',
'@ANNUALLY': '0 0 1 1 *',
'@MONTHLY': '0 0 1 * *',
'@WEEKLY': '0 0 * * 0',
'@DAILY': '0 0 * * *',
'@HOURLY': '0 * * * *'
};
// Contains the index, min, and max for each of the constraints
var FIELDS = {
s: [0, 0, 59], // seconds
m: [1, 0, 59], // minutes
h: [2, 0, 23], // hours
D: [3, 1, 31], // day of month
M: [4, 1, 12], // month
Y: [6, 1970, 2099], // year
d: [5, 1, 7, 1] // day of week
};
/**
* Returns the value + offset if value is a number, otherwise it
* attempts to look up the value in the NAMES table and returns
* that result instead.
*
* @param {Number,String} value: The value that should be parsed
* @param {Number=} offset: Any offset that must be added to the value
* @param {Number=} max
* @returns {Number|null}
*/
function getValue(value) {
var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];
var max = arguments.length <= 2 || arguments[2] === undefined ? 9999 : arguments[2];
return isNaN(value) ? NAMES[value] || null : Math.min(+value + offset, max);
}
/**
* Returns a deep clone of a schedule skipping any day of week
* constraints.
*
* @param {Object} sched: The schedule that will be cloned
* @returns {Object}
*/
function cloneSchedule(sched) {
var clone = {},
field;
for (field in sched) {
if (field !== 'dc' && field !== 'd') {
clone[field] = sched[field].slice(0);
}
}
return clone;
}
/**
* Adds values to the specified constraint in the current schedule.
*
* @param {Object} sched: The schedule to add the constraint to
* @param {String} name: Name of constraint to add
* @param {Number} min: Minimum value for this constraint
* @param {Number} max: Maximum value for this constraint
* @param {Number=} inc: The increment to use between min and max
*/
function add(sched, name, min, max) {
var inc = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4];
var i = min;
if (!sched[name]) {
sched[name] = [];
}
while (i <= max) {
if (sched[name].indexOf(i) < 0) {
sched[name].push(i);
}
i += inc || 1;
}
sched[name].sort(function (a, b) {
return a - b;
});
}
/**
* Adds a hash item (of the form x#y or xL) to the schedule.
*
* @param {Object} schedules: The current schedule array to add to
* @param {Object} curSched: The current schedule to add to
* @param {Number} value: The value to add (x of x#y or xL)
* @param {Number} hash: The hash value to add (y of x#y)
*/
function addHash(schedules, curSched, value, hash) {
// if there are any existing day of week constraints that
// aren't equal to the one we're adding, create a new
// composite schedule
if (curSched.d && !curSched.dc || curSched.dc && curSched.dc.indexOf(hash) < 0) {
schedules.push(cloneSchedule(curSched));
curSched = schedules[schedules.length - 1];
}
add(curSched, 'd', value, value);
add(curSched, 'dc', hash, hash);
}
/**
*
* @param {Object} s: The existing set of schedules
* @param {Object} curSched: The current schedule to add to
* @param {Number} value
*/
function addWeekday(s, curSched, value) {
var except1 = {},
except2 = {};
if (value === 1) {
// cron doesn't pass month boundaries, so if 1st is a
// weekend then we need to use 2nd or 3rd instead
add(curSched, 'D', 1, 3);
add(curSched, 'd', NAMES.MON, NAMES.FRI);
add(except1, 'D', 2, 2);
add(except1, 'd', NAMES.TUE, NAMES.FRI);
add(except2, 'D', 3, 3);
add(except2, 'd', NAMES.TUE, NAMES.FRI);
} else {
// normally you want the closest day, so if v is a
// Saturday, use the previous Friday. If it's a
// sunday, use the following Monday.
add(curSched, 'D', value - 1, value + 1);
add(curSched, 'd', NAMES.MON, NAMES.FRI);
add(except1, 'D', value - 1, value - 1);
add(except1, 'd', NAMES.MON, NAMES.THU);
add(except2, 'D', value + 1, value + 1);
add(except2, 'd', NAMES.TUE, NAMES.FRI);
}
s.exceptions.push(except1);
s.exceptions.push(except2);
}
/**
* Adds a range item (of the form x-y/z) to the schedule.
*
* @param {String} item: The cron expression item to add
* @param {Object} curSched: The current schedule to add to
* @param {String} name: The name to use for this constraint
* @param {Number} min: The min value for the constraint
* @param {Number} max: The max value for the constraint
* @param {Number} offset: The offset to apply to the cron value
*/
function addRange(item, curSched, name, min, max, offset) {
// parse range/x
var incSplit = item.split('/'),
inc = +incSplit[1],
range = incSplit[0];
// parse x-y or * or 0
if (range !== '*' && range !== '0') {
var rangeSplit = range.split('-');
min = getValue(rangeSplit[0], offset, max);
// fix for issue #13, range may be single digit
max = getValue(rangeSplit[1], offset, max) || max;
}
add(curSched, name, min, max, inc);
}
/**
* Parses a particular item within a cron expression.
*
* @param {String} item: The cron expression item to parse
* @param {Object} s: The existing set of schedules
* @param {String} name: The name to use for this constraint
* @param {Number} min: The min value for the constraint
* @param {Number} max: The max value for the constraint
* @param {Number} offset: The offset to apply to the cron value
*/
function parse(item, s, name, min, max, offset) {
var value,
split,
schedules = s.schedules,
curSched = schedules[schedules.length - 1];
// L just means min - 1 (this also makes it work for any field)
if (item === 'L') {
item = (min - 1).toString(10);
}
// parse x
if ((value = getValue(item, offset, max)) !== null) {
add(curSched, name, value, value);
}
// parse xW
else if ((value = getValue(item.replace('W', ''), offset, max)) !== null) {
addWeekday(s, curSched, value);
}
// parse xL
else if ((value = getValue(item.replace('L', ''), offset, max)) !== null) {
addHash(schedules, curSched, value, min - 1);
}
// parse x#y
else if ((split = item.split('#')).length === 2) {
value = getValue(split[0], offset, max);
addHash(schedules, curSched, value, getValue(split[1]));
}
// parse x-y or x-y/z or */z or 0/z
else {
addRange(item, curSched, name, min, max, offset);
}
}
/**
* Returns true if the item is either of the form x#y or xL.
*
* @param {String} item: The expression item to check
*/
function isHash(item) {
return item.indexOf('#') > -1 || item.indexOf('L') > 0;
}
function itemSorter(a, b) {
return isHash(a) && !isHash(b) ? 1 : a - b;
}
/**
* Parses each of the fields in a cron expression. The expression must
* include the seconds field, the year field is optional.
*
* @param {String} expr: The cron expression to parse
*/
function parseExpr(expr) {
var schedule = { schedules: [{}], exceptions: [] },
components = expr.replace(/(\s)+/g, ' ').split(' '),
field,
f,
component,
items;
for (field in FIELDS) {
f = FIELDS[field];
component = components[f[0]];
if (component && component !== '*' && component !== '?') {
// need to sort so that any #'s come last, otherwise
// schedule clones to handle # won't contain all of the
// other constraints
items = component.split(',').sort(itemSorter);
var i,
length = items.length;
for (i = 0; i < length; i++) {
parse(items[i], schedule, field, f[1], f[2], f[3]);
}
}
}
return schedule;
}
/**
* Make cron expression parsable.
*
* @param {String} expr: The cron expression to prepare
*/
function prepareExpr(expr) {
var prepared = expr.toUpperCase();
return REPLACEMENTS[prepared] || prepared;
}
function parseCron(expr, hasSeconds) {
var e = prepareExpr(expr);
return parseExpr(hasSeconds ? e : '0 ' + e);
}
var schedule = parseCron(cronspec, withSeconds);
locale = locale || LOCALE;
function absFloor(number) {
if (number < 0) {
return Math.ceil(number);
} else {
return Math.floor(number);
}
}
function toInt(argumentForCoercion) {
var coercedNumber = +argumentForCoercion,
value = 0;
if (coercedNumber !== 0 && isFinite(coercedNumber)) {
value = absFloor(coercedNumber);
}
return value;
}
function ordinal(number) {
var b = number % 10,
output = (toInt(number % 100 / 10) === 1) ? locale.ORDINALS.th :
(b === 1) ? locale.ORDINALS.st :
(b === 2) ? locale.ORDINALS.nd :
(b === 3) ? locale.ORDINALS.rd : locale.ORDINALS.th;
return number + output;
}
/**
* For an array of numbers, e.g. a list of hours in a schedule,
* return a string listing out all of the values (complete with
* "and" plus ordinal text on the last item).
* @param {Number[]} numbers
* @returns {string}
*/
function numberList(numbers) {
if (numbers.length < 2) {
return ordinal(numbers);
}
var lastVal = numbers.pop();
return numbers.join(', ') + ' ' + locale['and'] + ' ' + ordinal(lastVal);
}
/**
* Parse a number into day of week, or a month name;
* used in dateList below.
* @param {Number|String} value
* @param {String} type
* @returns {String}
*/
function numberToDateName(value, type) {
if (type === 'dow') {
return locale.DOW[value - 1];
} else if (type === 'mon') {
return locale.MONTH[value - 1];
}
}
/**
* From an array of numbers corresponding to dates (given in type: either
* days of the week, or months), return a string listing all the values.
* @param {Number[]} numbers
* @param {String} type
* @returns {String}
*/
function dateList(numbers, type) {
if (numbers.length < 2) {
return numberToDateName('' + numbers[0], type);
}
var lastVal = '' + numbers.pop();
var outputText = '';
for (var i = 0, value; value = numbers[i]; i++) {
if (outputText.length > 0) {
outputText += ', ';
}
outputText += numberToDateName(value, type);
}
return outputText + ' ' + locale['and'] + ' ' + numberToDateName(lastVal, type);
}
/**
* Pad to equivalent of sprintf('%02d').
* @param {Number} x
* @returns {string}
*/
function zeroPad(x) {
return (x < 10) ? '0' + x : x;
}
//----------------
/**
* Given a schedule, generate a friendly sentence description.
* @param {Object} schedule
* @returns {string}
*/
function scheduleToSentence(schedule, withSeconds) {
var outputText = locale.Every + ' ';
if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2 && withSeconds && schedule['s'] && schedule['s'].length <= 2 ) {
// If there are only one or two specified values for
// hour or minute, print them in HH:MM:SS format
var hm = [];
for (var i = 0; i < schedule['h'].length; i++) {
for (var j = 0; j < schedule['m'].length; j++) {
for (var k = 0; k < schedule['s'].length; k++) {
hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]) + ':' + zeroPad(schedule['s'][k]));
}
}
}
if (hm.length < 2) {
outputText = locale['At'] + ' ' + hm[0];
} else {
var lastVal = hm.pop();
outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;
}
if (!schedule['d'] && !schedule['D']) {
outputText += ' ' + locale['every day'] + ' ';
}
} else
if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2) {
// If there are only one or two specified values for
// hour or minute, print them in HH:MM format
var hm = [];
for (var i = 0; i < schedule['h'].length; i++) {
for (var j = 0; j < schedule['m'].length; j++) {
hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]));
}
}
if (hm.length < 2) {
outputText = locale['At'] + ' ' + hm[0];
} else {
var lastVal = hm.pop();
outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;
}
if (!schedule['d'] && !schedule['D']) {
outputText += ' ' + locale['every day'] + ' ';
}
} else {
// Otherwise, list out every specified hour/minute value.
if (schedule['h']) { // runs only at specific hours
if (schedule['m']) { // and only at specific minutes
if (withSeconds) {
if (!schedule['s'] || schedule['s'].length === 60) {
outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
} else {
outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' +numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
}
} else {
outputText += numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
}
} else { // specific hours, but every minute
if (withSeconds) {
if (!schedule['s'] || schedule['s'].length === 60) {
outputText += locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
} else {
outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
}
} else {
outputText += locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];
}
}
} else if (schedule['m']) { // every hour, but specific minutes
if (withSeconds) {
if (!schedule['s'] || schedule['s'].length === 60) {
outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];
} else {
outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];
}
} else {
outputText += numberList(schedule['m']) + ' ' + locale['minute every hour'];
}
} else if (withSeconds) {
if (!schedule['s'] || schedule['s'].length === 60) {
outputText += locale['second'];
} else {
outputText += numberList(schedule['s']) + ' ' + locale['second'];
}
} else { // cronspec has "*" for both hour and minute
outputText += locale['minute'];
}
}
if (schedule['D']) { // runs only on specific day(s) of month
outputText += (locale['on the'] ? ' ' + locale['on the'] + ' ' : ' ') + numberList(schedule['D']);
if (!schedule['M']) {
outputText += ' ' + locale['of every month'];
}
}
if (schedule['d']) { // runs only on specific day(s) of week
if (schedule['D']) {
// if both day fields are specified, cron uses both; superuser.com/a/348372
outputText += ' ' + locale['and every'] + ' ';
} else {
outputText += ' ' + locale['on'] + ' ';
}
outputText += dateList(schedule['d'], 'dow');
}
if (schedule['M']) {
// runs only in specific months; put this output last
outputText += ' ' + locale['in'] + ' ' + dateList(schedule['M'], 'mon');
}
return outputText;
}
return scheduleToSentence(schedule.schedules[0], withSeconds);
}

View File

@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2011
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,148 @@
// Do not edit this file; automatically generated by build.py.
'use strict';
// Copyright 2012 Google Inc. Apache License 2.0
Blockly.Blocks.colour={};Blockly.Blocks.colour.HUE=20;Blockly.Blocks.colour_picker={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_colour",name:"COLOUR",colour:"#ff0000"}],output:"Colour",colour:Blockly.Blocks.colour.HUE,helpUrl:Blockly.Msg.COLOUR_PICKER_HELPURL});var a=this;this.setTooltip(function(){var b=a.getParent();return b&&b.getInputsInline()&&b.tooltip||Blockly.Msg.COLOUR_PICKER_TOOLTIP})}};
Blockly.Blocks.colour_random={init:function(){this.jsonInit({message0:Blockly.Msg.COLOUR_RANDOM_TITLE,output:"Colour",colour:Blockly.Blocks.colour.HUE,tooltip:Blockly.Msg.COLOUR_RANDOM_TOOLTIP,helpUrl:Blockly.Msg.COLOUR_RANDOM_HELPURL})}};
Blockly.Blocks.colour_rgb={init:function(){this.setHelpUrl(Blockly.Msg.COLOUR_RGB_HELPURL);this.setColour(Blockly.Blocks.colour.HUE);this.appendValueInput("RED").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_TITLE).appendField(Blockly.Msg.COLOUR_RGB_RED);this.appendValueInput("GREEN").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_GREEN);this.appendValueInput("BLUE").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_BLUE);
this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_RGB_TOOLTIP)}};
Blockly.Blocks.colour_blend={init:function(){this.setHelpUrl(Blockly.Msg.COLOUR_BLEND_HELPURL);this.setColour(Blockly.Blocks.colour.HUE);this.appendValueInput("COLOUR1").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_TITLE).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR1);this.appendValueInput("COLOUR2").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR2);this.appendValueInput("RATIO").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_RATIO);
this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_BLEND_TOOLTIP)}};Blockly.Blocks.lists={};Blockly.Blocks.lists.HUE=260;Blockly.Blocks.lists_create_empty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_CREATE_EMPTY_TITLE,output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL})}};
Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.itemCount_=3;this.updateShape_();this.setOutput(!0,"Array");this.setMutator(new Blockly.Mutator(["lists_create_with_item"]));this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"),
10);this.updateShape_()},decompose:function(a){var b=a.newBlock("lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,e=0;e<this.itemCount_;e++){var d=a.newBlock("lists_create_with_item");d.initSvg();c.connect(d.previousConnection);c=d.nextConnection}return b},compose:function(a){var b=a.getInputTargetBlock("STACK");for(a=[];b;)a.push(b.valueConnection_),b=b.nextConnection&&b.nextConnection.targetBlock();for(b=0;b<this.itemCount_;b++){var c=this.getInput("ADD"+b).connection.targetConnection;
c&&-1==a.indexOf(c)&&c.disconnect()}this.itemCount_=a.length;this.updateShape_();for(b=0;b<this.itemCount_;b++)Blockly.Mutator.reconnect(a[b],this,"ADD"+b)},saveConnections:function(a){a=a.getInputTargetBlock("STACK");for(var b=0;a;){var c=this.getInput("ADD"+b);a.valueConnection_=c&&c.connection.targetConnection;b++;a=a.nextConnection&&a.nextConnection.targetBlock()}},updateShape_:function(){this.itemCount_&&this.getInput("EMPTY")?this.removeInput("EMPTY"):this.itemCount_||this.getInput("EMPTY")||
this.appendDummyInput("EMPTY").appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE);for(var a=0;a<this.itemCount_;a++)if(!this.getInput("ADD"+a)){var b=this.appendValueInput("ADD"+a);0==a&&b.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH)}for(;this.getInput("ADD"+a);)this.removeInput("ADD"+a),a++}};
Blockly.Blocks.lists_create_with_container={init:function(){this.setColour(Blockly.Blocks.lists.HUE);this.appendDummyInput().appendField(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD);this.appendStatementInput("STACK");this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.lists_create_with_item={init:function(){this.setColour(Blockly.Blocks.lists.HUE);this.appendDummyInput().appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.lists_repeat={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_REPEAT_TITLE,args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.LISTS_REPEAT_HELPURL})}};
Blockly.Blocks.lists_length={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_LENGTH_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_LENGTH_TOOLTIP,helpUrl:Blockly.Msg.LISTS_LENGTH_HELPURL})}};
Blockly.Blocks.lists_isEmpty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_ISEMPTY_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_ISEMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_ISEMPTY_HELPURL})}};
Blockly.Blocks.lists_indexOf={init:function(){var a=[[Blockly.Msg.LISTS_INDEX_OF_FIRST,"FIRST"],[Blockly.Msg.LISTS_INDEX_OF_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.setOutput(!0,"Number");this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST);this.appendValueInput("FIND").appendField(new Blockly.FieldDropdown(a),"END");this.setInputsInline(!0);a=Blockly.Msg.LISTS_INDEX_OF_TOOLTIP.replace("%1",
Blockly.Blocks.ONE_BASED_INDEXING?"0":"-1");this.setTooltip(a)}};
Blockly.Blocks.lists_getIndex={init:function(){var a=[[Blockly.Msg.LISTS_GET_INDEX_GET,"GET"],[Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE,"GET_REMOVE"],[Blockly.Msg.LISTS_GET_INDEX_REMOVE,"REMOVE"]];this.WHERE_OPTIONS=[[Blockly.Msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[Blockly.Msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[Blockly.Msg.LISTS_GET_INDEX_FIRST,"FIRST"],[Blockly.Msg.LISTS_GET_INDEX_LAST,"LAST"],[Blockly.Msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]];this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);
this.setColour(Blockly.Blocks.lists.HUE);a=new Blockly.FieldDropdown(a,function(a){this.sourceBlock_.updateStatement_("REMOVE"==a)});this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST);this.appendDummyInput().appendField(a,"MODE").appendField("","SPACE");this.appendDummyInput("AT");Blockly.Msg.LISTS_GET_INDEX_TAIL&&this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL);this.setInputsInline(!0);this.setOutput(!0);this.updateAt_(!0);
var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE"),e=b.getFieldValue("WHERE"),d="";switch(a+" "+e){case "GET FROM_START":case "GET FROM_END":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;break;case "GET FIRST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST;break;case "GET LAST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST;break;case "GET RANDOM":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;break;case "GET_REMOVE FROM_START":case "GET_REMOVE FROM_END":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;
break;case "GET_REMOVE FIRST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST;break;case "GET_REMOVE LAST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST;break;case "GET_REMOVE RANDOM":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM;break;case "REMOVE FROM_START":case "REMOVE FROM_END":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM;break;case "REMOVE FIRST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST;break;case "REMOVE LAST":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST;
break;case "REMOVE RANDOM":d=Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM}if("FROM_START"==e||"FROM_END"==e)d+=" "+Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1",Blockly.Blocks.ONE_BASED_INDEXING?"#1":"#0");return d})},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("statement",!this.outputConnection);var b=this.getInput("AT").type==Blockly.INPUT_VALUE;a.setAttribute("at",b);return a},domToMutation:function(a){var b="true"==a.getAttribute("statement");
this.updateStatement_(b);a="false"!=a.getAttribute("at");this.updateAt_(a)},updateStatement_:function(a){a!=!this.outputConnection&&(this.unplug(!0,!0),a?(this.setOutput(!1),this.setPreviousStatement(!0),this.setNextStatement(!0)):(this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0)))},updateAt_:function(a){this.removeInput("AT");this.removeInput("ORDINAL",!0);a?(this.appendValueInput("AT").setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):
this.appendDummyInput("AT");var b=new Blockly.FieldDropdown(this.WHERE_OPTIONS,function(b){var e="FROM_START"==b||"FROM_END"==b;if(e!=a){var d=this.sourceBlock_;d.updateAt_(e);d.setFieldValue(b,"WHERE");return null}});this.getInput("AT").appendField(b,"WHERE");Blockly.Msg.LISTS_GET_INDEX_TAIL&&this.moveInputBefore("TAIL",null)}};
Blockly.Blocks.lists_setIndex={init:function(){var a=[[Blockly.Msg.LISTS_SET_INDEX_SET,"SET"],[Blockly.Msg.LISTS_SET_INDEX_INSERT,"INSERT"]];this.WHERE_OPTIONS=[[Blockly.Msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[Blockly.Msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[Blockly.Msg.LISTS_GET_INDEX_FIRST,"FIRST"],[Blockly.Msg.LISTS_GET_INDEX_LAST,"LAST"],[Blockly.Msg.LISTS_GET_INDEX_RANDOM,"RANDOM"]];this.setHelpUrl(Blockly.Msg.LISTS_SET_INDEX_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST);
this.appendDummyInput().appendField(new Blockly.FieldDropdown(a),"MODE").appendField("","SPACE");this.appendDummyInput("AT");this.appendValueInput("TO").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO);this.setInputsInline(!0);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP);this.updateAt_(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE"),e=b.getFieldValue("WHERE"),d="";switch(a+" "+e){case "SET FROM_START":case "SET FROM_END":d=
Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM;break;case "SET FIRST":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST;break;case "SET LAST":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST;break;case "SET RANDOM":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM;break;case "INSERT FROM_START":case "INSERT FROM_END":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM;break;case "INSERT FIRST":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST;break;case "INSERT LAST":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST;
break;case "INSERT RANDOM":d=Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM}if("FROM_START"==e||"FROM_END"==e)d+=" "+Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1",Blockly.Blocks.ONE_BASED_INDEXING?"#1":"#0");return d})},mutationToDom:function(){var a=document.createElement("mutation"),b=this.getInput("AT").type==Blockly.INPUT_VALUE;a.setAttribute("at",b);return a},domToMutation:function(a){a="false"!=a.getAttribute("at");this.updateAt_(a)},updateAt_:function(a){this.removeInput("AT");
this.removeInput("ORDINAL",!0);a?(this.appendValueInput("AT").setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT");var b=new Blockly.FieldDropdown(this.WHERE_OPTIONS,function(b){var e="FROM_START"==b||"FROM_END"==b;if(e!=a){var d=this.sourceBlock_;d.updateAt_(e);d.setFieldValue(b,"WHERE");return null}});this.moveInputBefore("AT","TO");this.getInput("ORDINAL")&&this.moveInputBefore("ORDINAL",
"TO");this.getInput("AT").appendField(b,"WHERE")}};
Blockly.Blocks.lists_getSublist={init:function(){this.WHERE_OPTIONS_1=[[Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START,"FROM_START"],[Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END,"FROM_END"],[Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST,"FIRST"]];this.WHERE_OPTIONS_2=[[Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START,"FROM_START"],[Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END,"FROM_END"],[Blockly.Msg.LISTS_GET_SUBLIST_END_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);
this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST);this.appendDummyInput("AT1");this.appendDummyInput("AT2");Blockly.Msg.LISTS_GET_SUBLIST_TAIL&&this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL);this.setInputsInline(!0);this.setOutput(!0,"Array");this.updateAt_(1,!0);this.updateAt_(2,!0);this.setTooltip(Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation"),b=this.getInput("AT1").type==
Blockly.INPUT_VALUE;a.setAttribute("at1",b);b=this.getInput("AT2").type==Blockly.INPUT_VALUE;a.setAttribute("at2",b);return a},domToMutation:function(a){var b="true"==a.getAttribute("at1");a="true"==a.getAttribute("at2");this.updateAt_(1,b);this.updateAt_(2,a)},updateAt_:function(a,b){this.removeInput("AT"+a);this.removeInput("ORDINAL"+a,!0);b?(this.appendValueInput("AT"+a).setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):
this.appendDummyInput("AT"+a);var c=new Blockly.FieldDropdown(this["WHERE_OPTIONS_"+a],function(c){var d="FROM_START"==c||"FROM_END"==c;if(d!=b){var f=this.sourceBlock_;f.updateAt_(a,d);f.setFieldValue(c,"WHERE"+a);return null}});this.getInput("AT"+a).appendField(c,"WHERE"+a);1==a&&(this.moveInputBefore("AT1","AT2"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","AT2"));Blockly.Msg.LISTS_GET_SUBLIST_TAIL&&this.moveInputBefore("TAIL",null)}};
Blockly.Blocks.lists_sort={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_SORT_TITLE,args0:[{type:"field_dropdown",name:"TYPE",options:[[Blockly.Msg.LISTS_SORT_TYPE_NUMERIC,"NUMERIC"],[Blockly.Msg.LISTS_SORT_TYPE_TEXT,"TEXT"],[Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE,"IGNORE_CASE"]]},{type:"field_dropdown",name:"DIRECTION",options:[[Blockly.Msg.LISTS_SORT_ORDER_ASCENDING,"1"],[Blockly.Msg.LISTS_SORT_ORDER_DESCENDING,"-1"]]},{type:"input_value",name:"LIST",check:"Array"}],output:"Array",colour:Blockly.Blocks.lists.HUE,
tooltip:Blockly.Msg.LISTS_SORT_TOOLTIP,helpUrl:Blockly.Msg.LISTS_SORT_HELPURL})}};
Blockly.Blocks.lists_split={init:function(){var a=this,b=new Blockly.FieldDropdown([[Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT,"SPLIT"],[Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST,"JOIN"]],function(b){a.updateType_(b)});this.setHelpUrl(Blockly.Msg.LISTS_SPLIT_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.appendValueInput("INPUT").setCheck("String").appendField(b,"MODE");this.appendValueInput("DELIM").setCheck("String").appendField(Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER);this.setInputsInline(!0);
this.setOutput(!0,"Array");this.setTooltip(function(){var b=a.getFieldValue("MODE");if("SPLIT"==b)return Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT;if("JOIN"==b)return Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN;throw"Unknown mode: "+b;})},updateType_:function(a){"SPLIT"==a?(this.outputConnection.setCheck("Array"),this.getInput("INPUT").setCheck("String")):(this.outputConnection.setCheck("String"),this.getInput("INPUT").setCheck("Array"))},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("mode",
this.getFieldValue("MODE"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("mode"))}};Blockly.Blocks.logic={};Blockly.Blocks.logic.HUE=210;
Blockly.Blocks.controls_if={init:function(){this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.appendValueInput("IF0").setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);this.appendStatementInput("DO0").appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setMutator(new Blockly.Mutator(["controls_if_elseif","controls_if_else"]));var a=this;this.setTooltip(function(){if(a.elseifCount_||a.elseCount_){if(!a.elseifCount_&&
a.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;if(a.elseifCount_&&!a.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;if(a.elseifCount_&&a.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_4}else return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;return""});this.elseCount_=this.elseifCount_=0},mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;var a=document.createElement("mutation");this.elseifCount_&&a.setAttribute("elseif",this.elseifCount_);this.elseCount_&&a.setAttribute("else",
1);return a},domToMutation:function(a){this.elseifCount_=parseInt(a.getAttribute("elseif"),10)||0;this.elseCount_=parseInt(a.getAttribute("else"),10)||0;this.updateShape_()},decompose:function(a){var b=a.newBlock("controls_if_if");b.initSvg();for(var c=b.nextConnection,e=1;e<=this.elseifCount_;e++){var d=a.newBlock("controls_if_elseif");d.initSvg();c.connect(d.previousConnection);c=d.nextConnection}this.elseCount_&&(a=a.newBlock("controls_if_else"),a.initSvg(),c.connect(a.previousConnection));return b},
compose:function(a){var b=a.nextConnection.targetBlock();this.elseCount_=this.elseifCount_=0;a=[null];for(var c=[null],e=null;b;){switch(b.type){case "controls_if_elseif":this.elseifCount_++;a.push(b.valueConnection_);c.push(b.statementConnection_);break;case "controls_if_else":this.elseCount_++;e=b.statementConnection_;break;default:throw"Unknown block type.";}b=b.nextConnection&&b.nextConnection.targetBlock()}this.updateShape_();for(b=1;b<=this.elseifCount_;b++)Blockly.Mutator.reconnect(a[b],this,
"IF"+b),Blockly.Mutator.reconnect(c[b],this,"DO"+b);Blockly.Mutator.reconnect(e,this,"ELSE")},saveConnections:function(a){a=a.nextConnection.targetBlock();for(var b=1;a;){switch(a.type){case "controls_if_elseif":var c=this.getInput("IF"+b),e=this.getInput("DO"+b);a.valueConnection_=c&&c.connection.targetConnection;a.statementConnection_=e&&e.connection.targetConnection;b++;break;case "controls_if_else":e=this.getInput("ELSE");a.statementConnection_=e&&e.connection.targetConnection;break;default:throw"Unknown block type.";
}a=a.nextConnection&&a.nextConnection.targetBlock()}},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var a=1;this.getInput("IF"+a);)this.removeInput("IF"+a),this.removeInput("DO"+a),a++;for(a=1;a<=this.elseifCount_;a++)this.appendValueInput("IF"+a).setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+a).appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE)}};
Blockly.Blocks.controls_if_if={init:function(){this.setColour(Blockly.Blocks.logic.HUE);this.appendDummyInput().appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF);this.setNextStatement(!0);this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.controls_if_elseif={init:function(){this.setColour(Blockly.Blocks.logic.HUE);this.appendDummyInput().appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.controls_if_else={init:function(){this.setColour(Blockly.Blocks.logic.HUE);this.appendDummyInput().appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE);this.setPreviousStatement(!0);this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.logic_compare={init:function(){var a=[["=","EQ"],["\u2260","NEQ"],[">","LT"],["\u2265","LTE"],["<","GT"],["\u2264","GTE"]],b=[["=","EQ"],["\u2260","NEQ"],["<","LT"],["\u2264","LTE"],[">","GT"],["\u2265","GTE"]],a=this.RTL?a:b;this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A");this.appendValueInput("B").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var c=this;this.setTooltip(function(){var a=
c.getFieldValue("OP");return{EQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,NEQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,LT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,LTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,GT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,GTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE}[a]});this.prevBlocks_=[null,null]},onchange:function(a){var b=this.getInputTargetBlock("A"),c=this.getInputTargetBlock("B");if(b&&c&&!b.outputConnection.checkType_(c.outputConnection)){Blockly.Events.setGroup(a.group);for(a=0;a<
this.prevBlocks_.length;a++){var e=this.prevBlocks_[a];if(e===b||e===c)e.unplug(),e.bumpNeighbours_()}Blockly.Events.setGroup(!1)}this.prevBlocks_[0]=b;this.prevBlocks_[1]=c}};
Blockly.Blocks.logic_operation={init:function(){var a=[[Blockly.Msg.LOGIC_OPERATION_AND,"AND"],[Blockly.Msg.LOGIC_OPERATION_OR,"OR"]];this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A").setCheck("Boolean");this.appendValueInput("B").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("OP");return{AND:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND,
OR:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR}[a]})}};Blockly.Blocks.logic_negate={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NEGATE_TITLE,args0:[{type:"input_value",name:"BOOL",check:"Boolean"}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NEGATE_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NEGATE_HELPURL})}};
Blockly.Blocks.logic_boolean={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_dropdown",name:"BOOL",options:[[Blockly.Msg.LOGIC_BOOLEAN_TRUE,"TRUE"],[Blockly.Msg.LOGIC_BOOLEAN_FALSE,"FALSE"]]}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_BOOLEAN_HELPURL})}};
Blockly.Blocks.logic_null={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NULL,output:null,colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NULL_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NULL_HELPURL})}};
Blockly.Blocks.logic_ternary={init:function(){this.setHelpUrl(Blockly.Msg.LOGIC_TERNARY_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.appendValueInput("IF").setCheck("Boolean").appendField(Blockly.Msg.LOGIC_TERNARY_CONDITION);this.appendValueInput("THEN").appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE);this.appendValueInput("ELSE").appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE);this.setOutput(!0);this.setTooltip(Blockly.Msg.LOGIC_TERNARY_TOOLTIP);this.prevParentConnection_=null},onchange:function(a){var b=
this.getInputTargetBlock("THEN"),c=this.getInputTargetBlock("ELSE"),e=this.outputConnection.targetConnection;if((b||c)&&e)for(var d=0;2>d;d++){var f=1==d?b:c;f&&!f.outputConnection.checkType_(e)&&(Blockly.Events.setGroup(a.group),e===this.prevParentConnection_?(this.unplug(),e.getSourceBlock().bumpNeighbours_()):(f.unplug(),f.bumpNeighbours_()),Blockly.Events.setGroup(!1))}this.prevParentConnection_=e}};Blockly.Blocks.loops={};Blockly.Blocks.loops.HUE=120;Blockly.Blocks.controls_repeat_ext={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"input_value",name:"TIMES",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}};
Blockly.Blocks.controls_repeat={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"field_number",name:"TIMES",value:10,min:0,precision:1}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}};
Blockly.Blocks.controls_whileUntil={init:function(){var a=[[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE,"WHILE"],[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL,"UNTIL"]];this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL);this.setColour(Blockly.Blocks.loops.HUE);this.appendValueInput("BOOL").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"MODE");this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO);this.setPreviousStatement(!0);this.setNextStatement(!0);
var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE");return{WHILE:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,UNTIL:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}[a]})}};
Blockly.Blocks.controls_for={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_FOR_TITLE,args0:[{type:"field_variable",name:"VAR",variable:null},{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"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,helpUrl:Blockly.Msg.CONTROLS_FOR_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_FOR_INPUT_DO);
var a=this;this.setTooltip(function(){return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace("%1",a.getFieldValue("VAR"))})},customContextMenu:function(a){if(!this.isCollapsed()){var b={enabled:!0},c=this.getFieldValue("VAR");b.text=Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1",c);c=goog.dom.createDom("field",null,c);c.setAttribute("name","VAR");c=goog.dom.createDom("block",null,c);c.setAttribute("type","variables_get");b.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(b)}}};
Blockly.Blocks.controls_forEach={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_FOREACH_TITLE,args0:[{type:"field_variable",name:"VAR",variable:null},{type:"input_value",name:"LIST",check:"Array"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,helpUrl:Blockly.Msg.CONTROLS_FOREACH_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT_DO);var a=this;this.setTooltip(function(){return Blockly.Msg.CONTROLS_FOREACH_TOOLTIP.replace("%1",
a.getFieldValue("VAR"))})},customContextMenu:Blockly.Blocks.controls_for.customContextMenu};
Blockly.Blocks.controls_flow_statements={init:function(){var a=[[Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK,"BREAK"],[Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE,"CONTINUE"]];this.setHelpUrl(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL);this.setColour(Blockly.Blocks.loops.HUE);this.appendDummyInput().appendField(new Blockly.FieldDropdown(a),"FLOW");this.setPreviousStatement(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("FLOW");return{BREAK:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK,
CONTINUE:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}[a]})},onchange:function(a){a=!1;var b=this;do{if(-1!=this.LOOP_TYPES.indexOf(b.type)){a=!0;break}b=b.getSurroundParent()}while(b);a?this.setWarningText(null):this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING)},LOOP_TYPES:["controls_repeat","controls_repeat_ext","controls_forEach","controls_for","controls_whileUntil"]};Blockly.Blocks.math={};Blockly.Blocks.math.HUE=230;Blockly.Blocks.math_number={init:function(){this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.appendDummyInput().appendField(new Blockly.FieldNumber("0"),"NUM");this.setOutput(!0,"Number");var a=this;this.setTooltip(function(){var b=a.getParent();return b&&b.getInputsInline()&&b.tooltip||Blockly.Msg.MATH_NUMBER_TOOLTIP})}};
Blockly.Blocks.math_arithmetic={init:function(){this.jsonInit({message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Number"},{type:"field_dropdown",name:"OP",options:[[Blockly.Msg.MATH_ADDITION_SYMBOL,"ADD"],[Blockly.Msg.MATH_SUBTRACTION_SYMBOL,"MINUS"],[Blockly.Msg.MATH_MULTIPLICATION_SYMBOL,"MULTIPLY"],[Blockly.Msg.MATH_DIVISION_SYMBOL,"DIVIDE"],[Blockly.Msg.MATH_POWER_SYMBOL,"POWER"]]},{type:"input_value",name:"B",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,
helpUrl:Blockly.Msg.MATH_ARITHMETIC_HELPURL});var a=this;this.setTooltip(function(){var b=a.getFieldValue("OP");return{ADD:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,MINUS:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,MULTIPLY:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,DIVIDE:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,POWER:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER}[b]})}};
Blockly.Blocks.math_single={init:function(){this.jsonInit({message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[[Blockly.Msg.MATH_SINGLE_OP_ROOT,"ROOT"],[Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE,"ABS"],["-","NEG"],["ln","LN"],["log10","LOG10"],["e^","EXP"],["10^","POW10"]]},{type:"input_value",name:"NUM",check:"Number"}],output:"Number",colour:Blockly.Blocks.math.HUE,helpUrl:Blockly.Msg.MATH_SINGLE_HELPURL});var a=this;this.setTooltip(function(){var b=a.getFieldValue("OP");return{ROOT:Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT,
ABS:Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS,NEG:Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG,LN:Blockly.Msg.MATH_SINGLE_TOOLTIP_LN,LOG10:Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10,EXP:Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP,POW10:Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10}[b]})}};
Blockly.Blocks.math_trig={init:function(){this.jsonInit({message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[[Blockly.Msg.MATH_TRIG_SIN,"SIN"],[Blockly.Msg.MATH_TRIG_COS,"COS"],[Blockly.Msg.MATH_TRIG_TAN,"TAN"],[Blockly.Msg.MATH_TRIG_ASIN,"ASIN"],[Blockly.Msg.MATH_TRIG_ACOS,"ACOS"],[Blockly.Msg.MATH_TRIG_ATAN,"ATAN"]]},{type:"input_value",name:"NUM",check:"Number"}],output:"Number",colour:Blockly.Blocks.math.HUE,helpUrl:Blockly.Msg.MATH_TRIG_HELPURL});var a=this;this.setTooltip(function(){var b=
a.getFieldValue("OP");return{SIN:Blockly.Msg.MATH_TRIG_TOOLTIP_SIN,COS:Blockly.Msg.MATH_TRIG_TOOLTIP_COS,TAN:Blockly.Msg.MATH_TRIG_TOOLTIP_TAN,ASIN:Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN,ACOS:Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS,ATAN:Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN}[b]})}};
Blockly.Blocks.math_constant={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_dropdown",name:"CONSTANT",options:[["\u03c0","PI"],["e","E"],["\u03c6","GOLDEN_RATIO"],["sqrt(2)","SQRT2"],["sqrt(\u00bd)","SQRT1_2"],["\u221e","INFINITY"]]}],output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_CONSTANT_TOOLTIP,helpUrl:Blockly.Msg.MATH_CONSTANT_HELPURL})}};
Blockly.Blocks.math_number_property={init:function(){var a=[[Blockly.Msg.MATH_IS_EVEN,"EVEN"],[Blockly.Msg.MATH_IS_ODD,"ODD"],[Blockly.Msg.MATH_IS_PRIME,"PRIME"],[Blockly.Msg.MATH_IS_WHOLE,"WHOLE"],[Blockly.Msg.MATH_IS_POSITIVE,"POSITIVE"],[Blockly.Msg.MATH_IS_NEGATIVE,"NEGATIVE"],[Blockly.Msg.MATH_IS_DIVISIBLE_BY,"DIVISIBLE_BY"]];this.setColour(Blockly.Blocks.math.HUE);this.appendValueInput("NUMBER_TO_CHECK").setCheck("Number");a=new Blockly.FieldDropdown(a,function(a){this.sourceBlock_.updateShape_("DIVISIBLE_BY"==
a)});this.appendDummyInput().appendField(a,"PROPERTY");this.setInputsInline(!0);this.setOutput(!0,"Boolean");this.setTooltip(Blockly.Msg.MATH_IS_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation"),b="DIVISIBLE_BY"==this.getFieldValue("PROPERTY");a.setAttribute("divisor_input",b);return a},domToMutation:function(a){a="true"==a.getAttribute("divisor_input");this.updateShape_(a)},updateShape_:function(a){var b=this.getInput("DIVISOR");a?b||this.appendValueInput("DIVISOR").setCheck("Number"):
b&&this.removeInput("DIVISOR")}};Blockly.Blocks.math_change={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_CHANGE_TITLE,args0:[{type:"field_variable",name:"VAR",variable:Blockly.Msg.MATH_CHANGE_TITLE_ITEM},{type:"input_value",name:"DELTA",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.math.HUE,helpUrl:Blockly.Msg.MATH_CHANGE_HELPURL});var a=this;this.setTooltip(function(){return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace("%1",a.getFieldValue("VAR"))})}};
Blockly.Blocks.math_round={init:function(){this.jsonInit({message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[[Blockly.Msg.MATH_ROUND_OPERATOR_ROUND,"ROUND"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP,"ROUNDUP"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN,"ROUNDDOWN"]]},{type:"input_value",name:"NUM",check:"Number"}],output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_ROUND_TOOLTIP,helpUrl:Blockly.Msg.MATH_ROUND_HELPURL})}};
Blockly.Blocks.math_on_list={init:function(){var a=[[Blockly.Msg.MATH_ONLIST_OPERATOR_SUM,"SUM"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MIN,"MIN"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MAX,"MAX"],[Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE,"AVERAGE"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN,"MEDIAN"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MODE,"MODE"],[Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV,"STD_DEV"],[Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM,"RANDOM"]],b=this;this.setHelpUrl(Blockly.Msg.MATH_ONLIST_HELPURL);this.setColour(Blockly.Blocks.math.HUE);
this.setOutput(!0,"Number");a=new Blockly.FieldDropdown(a,function(a){b.updateType_(a)});this.appendValueInput("LIST").setCheck("Array").appendField(a,"OP");this.setTooltip(function(){var a=b.getFieldValue("OP");return{SUM:Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM,MIN:Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN,MAX:Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX,AVERAGE:Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE,MEDIAN:Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN,MODE:Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE,STD_DEV:Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV,
RANDOM:Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM}[a]})},updateType_:function(a){"MODE"==a?this.outputConnection.setCheck("Array"):this.outputConnection.setCheck("Number")},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("op",this.getFieldValue("OP"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("op"))}};
Blockly.Blocks.math_modulo={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_MODULO_TITLE,args0:[{type:"input_value",name:"DIVIDEND",check:"Number"},{type:"input_value",name:"DIVISOR",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_MODULO_TOOLTIP,helpUrl:Blockly.Msg.MATH_MODULO_HELPURL})}};
Blockly.Blocks.math_constrain={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_CONSTRAIN_TITLE,args0:[{type:"input_value",name:"VALUE",check:"Number"},{type:"input_value",name:"LOW",check:"Number"},{type:"input_value",name:"HIGH",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_CONSTRAIN_TOOLTIP,helpUrl:Blockly.Msg.MATH_CONSTRAIN_HELPURL})}};
Blockly.Blocks.math_random_int={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_RANDOM_INT_TITLE,args0:[{type:"input_value",name:"FROM",check:"Number"},{type:"input_value",name:"TO",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_RANDOM_INT_TOOLTIP,helpUrl:Blockly.Msg.MATH_RANDOM_INT_HELPURL})}};
Blockly.Blocks.math_random_float={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP,helpUrl:Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL})}};Blockly.Blocks.procedures={};Blockly.Blocks.procedures.HUE=290;
Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);this.setColour(Blockly.Blocks.procedures.HUE);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c=0;c<
this.arguments_.length;c++){if(b["arg_"+this.arguments_[c].toLowerCase()]){a=!0;break}b["arg_"+this.arguments_[c].toLowerCase()]=!0}a?this.setWarningText(Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING):this.setWarningText(null);a="";this.arguments_.length&&(a=Blockly.Msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", "));Blockly.Events.disable();try{this.setFieldValue(a,"PARAMS")}finally{Blockly.Events.enable()}},mutationToDom:function(a){var b=document.createElement("mutation");a&&b.setAttribute("name",
this.getFieldValue("NAME"));for(var c=0;c<this.arguments_.length;c++){var e=document.createElement("arg");e.setAttribute("name",this.arguments_[c]);a&&this.paramIds_&&e.setAttribute("paramId",this.paramIds_[c]);b.appendChild(e)}this.hasStatements_||b.setAttribute("statements","false");return b},domToMutation:function(a){this.arguments_=[];for(var b=0,c;c=a.childNodes[b];b++)"arg"==c.nodeName.toLowerCase()&&this.arguments_.push(c.getAttribute("name"));this.updateParams_();Blockly.Procedures.mutateCallers(this);
this.setStatements_("false"!==a.getAttribute("statements"))},decompose:function(a){var b=a.newBlock("procedures_mutatorcontainer");b.initSvg();this.getInput("RETURN")?b.setFieldValue(this.hasStatements_?"TRUE":"FALSE","STATEMENTS"):b.getInput("STATEMENT_INPUT").setVisible(!1);for(var c=b.getInput("STACK").connection,e=0;e<this.arguments_.length;e++){var d=a.newBlock("procedures_mutatorarg");d.initSvg();d.setFieldValue(this.arguments_[e],"NAME");d.oldLocation=e;c.connect(d.previousConnection);c=d.nextConnection}Blockly.Procedures.mutateCallers(this);
return b},compose:function(a){this.arguments_=[];this.paramIds_=[];for(var b=a.getInputTargetBlock("STACK");b;)this.arguments_.push(b.getFieldValue("NAME")),this.paramIds_.push(b.id),b=b.nextConnection&&b.nextConnection.targetBlock();this.updateParams_();Blockly.Procedures.mutateCallers(this);a=a.getFieldValue("STATEMENTS");if(null!==a&&(a="TRUE"==a,this.hasStatements_!=a))if(a)this.setStatements_(!0),Blockly.Mutator.reconnect(this.statementConnection_,this,"STACK"),this.statementConnection_=null;
else{a=this.getInput("STACK").connection;if(this.statementConnection_=a.targetConnection)a=a.targetBlock(),a.unplug(),a.bumpNeighbours_();this.setStatements_(!1)}},getProcedureDef:function(){return[this.getFieldValue("NAME"),this.arguments_,!1]},getVars:function(){return this.arguments_},renameVar:function(a,b){for(var c=!1,e=0;e<this.arguments_.length;e++)Blockly.Names.equals(a,this.arguments_[e])&&(this.arguments_[e]=b,c=!0);if(c&&(this.updateParams_(),this.mutator.isVisible()))for(var c=this.mutator.workspace_.getAllBlocks(),
e=0,d;d=c[e];e++)"procedures_mutatorarg"==d.type&&Blockly.Names.equals(a,d.getFieldValue("NAME"))&&d.setFieldValue(b,"NAME")},customContextMenu:function(a){var b={enabled:!0},c=this.getFieldValue("NAME");b.text=Blockly.Msg.PROCEDURES_CREATE_DO.replace("%1",c);var e=goog.dom.createDom("mutation");e.setAttribute("name",c);for(var d=0;d<this.arguments_.length;d++)c=goog.dom.createDom("arg"),c.setAttribute("name",this.arguments_[d]),e.appendChild(c);e=goog.dom.createDom("block",null,e);e.setAttribute("type",
this.callType_);b.callback=Blockly.ContextMenu.callbackFactory(this,e);a.push(b);if(!this.isCollapsed())for(d=0;d<this.arguments_.length;d++)b={enabled:!0},c=this.arguments_[d],b.text=Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1",c),e=goog.dom.createDom("field",null,c),e.setAttribute("name","VAR"),e=goog.dom.createDom("block",null,e),e.setAttribute("type","variables_get"),b.callback=Blockly.ContextMenu.callbackFactory(this,e),a.push(b)},callType_:"procedures_callnoreturn"};
Blockly.Blocks.procedures_defreturn={init:function(){var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.appendValueInput("RETURN").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT&&
this.setCommentText(Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT);this.setColour(Blockly.Blocks.procedures.HUE);this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL);this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},setStatements_:Blockly.Blocks.procedures_defnoreturn.setStatements_,updateParams_:Blockly.Blocks.procedures_defnoreturn.updateParams_,mutationToDom:Blockly.Blocks.procedures_defnoreturn.mutationToDom,domToMutation:Blockly.Blocks.procedures_defnoreturn.domToMutation,
decompose:Blockly.Blocks.procedures_defnoreturn.decompose,compose:Blockly.Blocks.procedures_defnoreturn.compose,getProcedureDef:function(){return[this.getFieldValue("NAME"),this.arguments_,!0]},getVars:Blockly.Blocks.procedures_defnoreturn.getVars,renameVar:Blockly.Blocks.procedures_defnoreturn.renameVar,customContextMenu:Blockly.Blocks.procedures_defnoreturn.customContextMenu,callType_:"procedures_callreturn"};
Blockly.Blocks.procedures_mutatorcontainer={init:function(){this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE);this.appendStatementInput("STACK");this.appendDummyInput("STATEMENT_INPUT").appendField(Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS).appendField(new Blockly.FieldCheckbox("TRUE"),"STATEMENTS");this.setColour(Blockly.Blocks.procedures.HUE);this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.procedures_mutatorarg={init:function(){this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_MUTATORARG_TITLE).appendField(new Blockly.FieldTextInput("x",this.validator_),"NAME");this.setPreviousStatement(!0);this.setNextStatement(!0);this.setColour(Blockly.Blocks.procedures.HUE);this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP);this.contextMenu=!1},validator_:function(a){return(a=a.replace(/[\s\xa0]+/g," ").replace(/^ | $/g,""))||null}};
Blockly.Blocks.procedures_callnoreturn={init:function(){this.appendDummyInput("TOPROW").appendField(this.id,"NAME");this.setPreviousStatement(!0);this.setNextStatement(!0);this.setColour(Blockly.Blocks.procedures.HUE);this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL);this.arguments_=[];this.quarkConnections_={};this.quarkIds_=null},getProcedureCall:function(){return this.getFieldValue("NAME")},renameProcedure:function(a,b){Blockly.Names.equals(a,this.getProcedureCall())&&(this.setFieldValue(b,
"NAME"),this.setTooltip((this.outputConnection?Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP:Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP).replace("%1",b)))},setProcedureParameters_:function(a,b){var c=Blockly.Procedures.getDefinition(this.getProcedureCall(),this.workspace),e=c&&c.mutator&&c.mutator.isVisible();e||(this.quarkConnections_={},this.quarkIds_=null);if(b)if(goog.array.equals(this.arguments_,a))this.quarkIds_=b;else{if(b.length!=a.length)throw"Error: paramNames and paramIds must be the same length.";
this.setCollapsed(!1);this.quarkIds_||(this.quarkConnections_={},a.join("\n")==this.arguments_.join("\n")?this.quarkIds_=b:this.quarkIds_=[]);c=this.rendered;this.rendered=!1;for(var d=0;d<this.arguments_.length;d++){var f=this.getInput("ARG"+d);f&&(f=f.connection.targetConnection,this.quarkConnections_[this.quarkIds_[d]]=f,e&&f&&-1==b.indexOf(this.quarkIds_[d])&&(f.disconnect(),f.getSourceBlock().bumpNeighbours_()))}this.arguments_=[].concat(a);this.updateShape_();if(this.quarkIds_=b)for(d=0;d<this.arguments_.length;d++)e=
this.quarkIds_[d],e in this.quarkConnections_&&(f=this.quarkConnections_[e],Blockly.Mutator.reconnect(f,this,"ARG"+d)||delete this.quarkConnections_[e]);(this.rendered=c)&&this.render()}},updateShape_:function(){for(var a=0;a<this.arguments_.length;a++){var b=this.getField("ARGNAME"+a);if(b){Blockly.Events.disable();try{b.setValue(this.arguments_[a])}finally{Blockly.Events.enable()}}else b=new Blockly.FieldLabel(this.arguments_[a]),this.appendValueInput("ARG"+a).setAlign(Blockly.ALIGN_RIGHT).appendField(b,
"ARGNAME"+a).init()}for(;this.getInput("ARG"+a);)this.removeInput("ARG"+a),a++;if(a=this.getInput("TOPROW"))this.arguments_.length?this.getField("WITH")||(a.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS,"WITH"),a.init()):this.getField("WITH")&&a.removeField("WITH")},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("name",this.getProcedureCall());for(var b=0;b<this.arguments_.length;b++){var c=document.createElement("arg");c.setAttribute("name",this.arguments_[b]);
a.appendChild(c)}return a},domToMutation:function(a){var b=a.getAttribute("name");this.renameProcedure(this.getProcedureCall(),b);for(var b=[],c=[],e=0,d;d=a.childNodes[e];e++)"arg"==d.nodeName.toLowerCase()&&(b.push(d.getAttribute("name")),c.push(d.getAttribute("paramId")));this.setProcedureParameters_(b,c)},renameVar:function(a,b){for(var c=0;c<this.arguments_.length;c++)Blockly.Names.equals(a,this.arguments_[c])&&(this.arguments_[c]=b,this.getField("ARGNAME"+c).setValue(b))},onchange:function(a){if(this.workspace&&
!this.workspace.isFlyout)if(a.type==Blockly.Events.CREATE&&-1!=a.ids.indexOf(this.id)){var b=this.getProcedureCall(),b=Blockly.Procedures.getDefinition(b,this.workspace);!b||b.type==this.defType_&&JSON.stringify(b.arguments_)==JSON.stringify(this.arguments_)||(b=null);if(!b){Blockly.Events.setGroup(a.group);a=goog.dom.createDom("xml");b=goog.dom.createDom("block");b.setAttribute("type",this.defType_);var c=this.getRelativeToSurfaceXY(),e=c.y+2*Blockly.SNAP_RADIUS;b.setAttribute("x",c.x+Blockly.SNAP_RADIUS*
(this.RTL?-1:1));b.setAttribute("y",e);c=this.mutationToDom();b.appendChild(c);c=goog.dom.createDom("field");c.setAttribute("name","NAME");c.appendChild(document.createTextNode(this.getProcedureCall()));b.appendChild(c);a.appendChild(b);Blockly.Xml.domToWorkspace(a,this.workspace);Blockly.Events.setGroup(!1)}}else a.type==Blockly.Events.DELETE&&(b=this.getProcedureCall(),b=Blockly.Procedures.getDefinition(b,this.workspace),b||(Blockly.Events.setGroup(a.group),this.dispose(!0,!1),Blockly.Events.setGroup(!1)))},
customContextMenu:function(a){var b={enabled:!0};b.text=Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF;var c=this.getProcedureCall(),e=this.workspace;b.callback=function(){var a=Blockly.Procedures.getDefinition(c,e);a&&a.select()};a.push(b)},defType_:"procedures_defnoreturn"};
Blockly.Blocks.procedures_callreturn={init:function(){this.appendDummyInput("TOPROW").appendField("","NAME");this.setOutput(!0);this.setColour(Blockly.Blocks.procedures.HUE);this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL);this.arguments_=[];this.quarkConnections_={};this.quarkIds_=null},getProcedureCall:Blockly.Blocks.procedures_callnoreturn.getProcedureCall,renameProcedure:Blockly.Blocks.procedures_callnoreturn.renameProcedure,setProcedureParameters_:Blockly.Blocks.procedures_callnoreturn.setProcedureParameters_,
updateShape_:Blockly.Blocks.procedures_callnoreturn.updateShape_,mutationToDom:Blockly.Blocks.procedures_callnoreturn.mutationToDom,domToMutation:Blockly.Blocks.procedures_callnoreturn.domToMutation,renameVar:Blockly.Blocks.procedures_callnoreturn.renameVar,onchange:Blockly.Blocks.procedures_callnoreturn.onchange,customContextMenu:Blockly.Blocks.procedures_callnoreturn.customContextMenu,defType_:"procedures_defreturn"};
Blockly.Blocks.procedures_ifreturn={init:function(){this.appendValueInput("CONDITION").setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);this.setInputsInline(!0);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setColour(Blockly.Blocks.procedures.HUE);this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_IFRETURN_HELPURL);this.hasReturnValue_=!0},
mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("value",Number(this.hasReturnValue_));return a},domToMutation:function(a){this.hasReturnValue_=1==a.getAttribute("value");this.hasReturnValue_||(this.removeInput("VALUE"),this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN))},onchange:function(a){a=!1;var b=this;do{if(-1!=this.FUNCTION_TYPES.indexOf(b.type)){a=!0;break}b=b.getSurroundParent()}while(b);a?("procedures_defnoreturn"==b.type&&
this.hasReturnValue_?(this.removeInput("VALUE"),this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN),this.hasReturnValue_=!1):"procedures_defreturn"!=b.type||this.hasReturnValue_||(this.removeInput("VALUE"),this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN),this.hasReturnValue_=!0),this.setWarningText(null)):this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING)},FUNCTION_TYPES:["procedures_defnoreturn","procedures_defreturn"]};Blockly.Blocks.texts={};Blockly.Blocks.texts.HUE=160;
Blockly.Blocks.text={init:function(){this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.appendDummyInput().appendField(this.newQuote_(!0)).appendField(new Blockly.FieldTextInput(""),"TEXT").appendField(this.newQuote_(!1));this.setOutput(!0,"String");var a=this;this.setTooltip(function(){var b=a.getParent();return b&&b.getInputsInline()&&b.tooltip||Blockly.Msg.TEXT_TEXT_TOOLTIP})},newQuote_:function(a){return new Blockly.FieldImage(a==this.RTL?"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==":
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC",12,12,'"')}};
Blockly.Blocks.text_join={init:function(){this.setHelpUrl(Blockly.Msg.TEXT_JOIN_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.itemCount_=2;this.updateShape_();this.setOutput(!0,"String");this.setMutator(new Blockly.Mutator(["text_create_join_item"]));this.setTooltip(Blockly.Msg.TEXT_JOIN_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"),10);
this.updateShape_()},decompose:function(a){var b=a.newBlock("text_create_join_container");b.initSvg();for(var c=b.getInput("STACK").connection,e=0;e<this.itemCount_;e++){var d=a.newBlock("text_create_join_item");d.initSvg();c.connect(d.previousConnection);c=d.nextConnection}return b},compose:function(a){var b=a.getInputTargetBlock("STACK");for(a=[];b;)a.push(b.valueConnection_),b=b.nextConnection&&b.nextConnection.targetBlock();for(b=0;b<this.itemCount_;b++){var c=this.getInput("ADD"+b).connection.targetConnection;
c&&-1==a.indexOf(c)&&c.disconnect()}this.itemCount_=a.length;this.updateShape_();for(b=0;b<this.itemCount_;b++)Blockly.Mutator.reconnect(a[b],this,"ADD"+b)},saveConnections:function(a){a=a.getInputTargetBlock("STACK");for(var b=0;a;){var c=this.getInput("ADD"+b);a.valueConnection_=c&&c.connection.targetConnection;b++;a=a.nextConnection&&a.nextConnection.targetBlock()}},updateShape_:function(){this.itemCount_&&this.getInput("EMPTY")?this.removeInput("EMPTY"):this.itemCount_||this.getInput("EMPTY")||
this.appendDummyInput("EMPTY").appendField(this.newQuote_(!0)).appendField(this.newQuote_(!1));for(var a=0;a<this.itemCount_;a++)if(!this.getInput("ADD"+a)){var b=this.appendValueInput("ADD"+a);0==a&&b.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH)}for(;this.getInput("ADD"+a);)this.removeInput("ADD"+a),a++},newQuote_:Blockly.Blocks.text.newQuote_};
Blockly.Blocks.text_create_join_container={init:function(){this.setColour(Blockly.Blocks.texts.HUE);this.appendDummyInput().appendField(Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN);this.appendStatementInput("STACK");this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.text_create_join_item={init:function(){this.setColour(Blockly.Blocks.texts.HUE);this.appendDummyInput().appendField(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM);this.setPreviousStatement(!0);this.setNextStatement(!0);this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP);this.contextMenu=!1}};
Blockly.Blocks.text_append={init:function(){this.setHelpUrl(Blockly.Msg.TEXT_APPEND_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.appendValueInput("TEXT").appendField(Blockly.Msg.TEXT_APPEND_TO).appendField(new Blockly.FieldVariable(Blockly.Msg.TEXT_APPEND_VARIABLE),"VAR").appendField(Blockly.Msg.TEXT_APPEND_APPENDTEXT);this.setPreviousStatement(!0);this.setNextStatement(!0);var a=this;this.setTooltip(function(){return Blockly.Msg.TEXT_APPEND_TOOLTIP.replace("%1",a.getFieldValue("VAR"))})}};
Blockly.Blocks.text_length={init:function(){this.jsonInit({message0:Blockly.Msg.TEXT_LENGTH_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",colour:Blockly.Blocks.texts.HUE,tooltip:Blockly.Msg.TEXT_LENGTH_TOOLTIP,helpUrl:Blockly.Msg.TEXT_LENGTH_HELPURL})}};
Blockly.Blocks.text_isEmpty={init:function(){this.jsonInit({message0:Blockly.Msg.TEXT_ISEMPTY_TITLE,args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",colour:Blockly.Blocks.texts.HUE,tooltip:Blockly.Msg.TEXT_ISEMPTY_TOOLTIP,helpUrl:Blockly.Msg.TEXT_ISEMPTY_HELPURL})}};
Blockly.Blocks.text_indexOf={init:function(){var a=[[Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST,"FIRST"],[Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.TEXT_INDEXOF_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.setOutput(!0,"Number");this.appendValueInput("VALUE").setCheck("String").appendField(Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT);this.appendValueInput("FIND").setCheck("String").appendField(new Blockly.FieldDropdown(a),"END");Blockly.Msg.TEXT_INDEXOF_TAIL&&this.appendDummyInput().appendField(Blockly.Msg.TEXT_INDEXOF_TAIL);
this.setInputsInline(!0);a=Blockly.Msg.TEXT_INDEXOF_TOOLTIP.replace("%1",Blockly.Blocks.ONE_BASED_INDEXING?"0":"-1");this.setTooltip(a)}};
Blockly.Blocks.text_charAt={init:function(){this.WHERE_OPTIONS=[[Blockly.Msg.TEXT_CHARAT_FROM_START,"FROM_START"],[Blockly.Msg.TEXT_CHARAT_FROM_END,"FROM_END"],[Blockly.Msg.TEXT_CHARAT_FIRST,"FIRST"],[Blockly.Msg.TEXT_CHARAT_LAST,"LAST"],[Blockly.Msg.TEXT_CHARAT_RANDOM,"RANDOM"]];this.setHelpUrl(Blockly.Msg.TEXT_CHARAT_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.setOutput(!0,"String");this.appendValueInput("VALUE").setCheck("String").appendField(Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT);this.appendDummyInput("AT");
this.setInputsInline(!0);this.updateAt_(!0);var a=this;this.setTooltip(function(){var b=a.getFieldValue("WHERE"),c=Blockly.Msg.TEXT_CHARAT_TOOLTIP;if("FROM_START"==b||"FROM_END"==b)c+=" "+Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP.replace("%1",Blockly.Blocks.ONE_BASED_INDEXING?"#1":"#0");return c})},mutationToDom:function(){var a=document.createElement("mutation"),b=this.getInput("AT").type==Blockly.INPUT_VALUE;a.setAttribute("at",b);return a},domToMutation:function(a){a="false"!=a.getAttribute("at");
this.updateAt_(a)},updateAt_:function(a){this.removeInput("AT");this.removeInput("ORDINAL",!0);a?(this.appendValueInput("AT").setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):this.appendDummyInput("AT");Blockly.Msg.TEXT_CHARAT_TAIL&&(this.removeInput("TAIL",!0),this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_CHARAT_TAIL));var b=new Blockly.FieldDropdown(this.WHERE_OPTIONS,function(b){var e="FROM_START"==
b||"FROM_END"==b;if(e!=a){var d=this.sourceBlock_;d.updateAt_(e);d.setFieldValue(b,"WHERE");return null}});this.getInput("AT").appendField(b,"WHERE")}};
Blockly.Blocks.text_getSubstring={init:function(){this.WHERE_OPTIONS_1=[[Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START,"FROM_START"],[Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END,"FROM_END"],[Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST,"FIRST"]];this.WHERE_OPTIONS_2=[[Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START,"FROM_START"],[Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END,"FROM_END"],[Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST,"LAST"]];this.setHelpUrl(Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);
this.appendValueInput("STRING").setCheck("String").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT);this.appendDummyInput("AT1");this.appendDummyInput("AT2");Blockly.Msg.TEXT_GET_SUBSTRING_TAIL&&this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL);this.setInputsInline(!0);this.setOutput(!0,"String");this.updateAt_(1,!0);this.updateAt_(2,!0);this.setTooltip(Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation"),
b=this.getInput("AT1").type==Blockly.INPUT_VALUE;a.setAttribute("at1",b);b=this.getInput("AT2").type==Blockly.INPUT_VALUE;a.setAttribute("at2",b);return a},domToMutation:function(a){var b="true"==a.getAttribute("at1");a="true"==a.getAttribute("at2");this.updateAt_(1,b);this.updateAt_(2,a)},updateAt_:function(a,b){this.removeInput("AT"+a);this.removeInput("ORDINAL"+a,!0);b?(this.appendValueInput("AT"+a).setCheck("Number"),Blockly.Msg.ORDINAL_NUMBER_SUFFIX&&this.appendDummyInput("ORDINAL"+a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)):
this.appendDummyInput("AT"+a);2==a&&Blockly.Msg.TEXT_GET_SUBSTRING_TAIL&&(this.removeInput("TAIL",!0),this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL));var c=new Blockly.FieldDropdown(this["WHERE_OPTIONS_"+a],function(c){var d="FROM_START"==c||"FROM_END"==c;if(d!=b){var f=this.sourceBlock_;f.updateAt_(a,d);f.setFieldValue(c,"WHERE"+a);return null}});this.getInput("AT"+a).appendField(c,"WHERE"+a);1==a&&this.moveInputBefore("AT1","AT2")}};
Blockly.Blocks.text_changeCase={init:function(){var a=[[Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE,"UPPERCASE"],[Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE,"LOWERCASE"],[Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE,"TITLECASE"]];this.setHelpUrl(Blockly.Msg.TEXT_CHANGECASE_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a),"CASE");this.setOutput(!0,"String");this.setTooltip(Blockly.Msg.TEXT_CHANGECASE_TOOLTIP)}};
Blockly.Blocks.text_trim={init:function(){var a=[[Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH,"BOTH"],[Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT,"LEFT"],[Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT,"RIGHT"]];this.setHelpUrl(Blockly.Msg.TEXT_TRIM_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a),"MODE");this.setOutput(!0,"String");this.setTooltip(Blockly.Msg.TEXT_TRIM_TOOLTIP)}};
Blockly.Blocks.text_print={init:function(){this.jsonInit({message0:Blockly.Msg.TEXT_PRINT_TITLE,args0:[{type:"input_value",name:"TEXT"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.texts.HUE,tooltip:Blockly.Msg.TEXT_PRINT_TOOLTIP,helpUrl:Blockly.Msg.TEXT_PRINT_HELPURL})}};
Blockly.Blocks.text_prompt_ext={init:function(){var a=[[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]];this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);var b=this,a=new Blockly.FieldDropdown(a,function(a){b.updateType_(a)});this.appendValueInput("TEXT").appendField(a,"TYPE");this.setOutput(!0,"String");this.setTooltip(function(){return"TEXT"==b.getFieldValue("TYPE")?Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT:Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER})},
updateType_:function(a){this.outputConnection.setCheck("NUMBER"==a?"Number":"String")},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("type",this.getFieldValue("TYPE"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("type"))}};
Blockly.Blocks.text_prompt={init:function(){var a=[[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT,"TEXT"],[Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER,"NUMBER"]],b=this;this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL);this.setColour(Blockly.Blocks.texts.HUE);a=new Blockly.FieldDropdown(a,function(a){b.updateType_(a)});this.appendDummyInput().appendField(a,"TYPE").appendField(this.newQuote_(!0)).appendField(new Blockly.FieldTextInput(""),"TEXT").appendField(this.newQuote_(!1));this.setOutput(!0,"String");this.setTooltip(function(){return"TEXT"==
b.getFieldValue("TYPE")?Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT:Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER})},newQuote_:Blockly.Blocks.text.newQuote_,updateType_:Blockly.Blocks.text_prompt_ext.updateType_,mutationToDom:Blockly.Blocks.text_prompt_ext.mutationToDom,domToMutation:Blockly.Blocks.text_prompt_ext.domToMutation};Blockly.Blocks.variables={};Blockly.Blocks.variables.HUE=330;
Blockly.Blocks.variables_get={init:function(){this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL);this.setColour(Blockly.Blocks.variables.HUE);this.appendDummyInput().appendField(new Blockly.FieldVariable(Blockly.Msg.VARIABLES_DEFAULT_NAME),"VAR");this.setOutput(!0);this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP);this.contextMenuMsg_=Blockly.Msg.VARIABLES_GET_CREATE_SET},contextMenuType_:"variables_set",customContextMenu:function(a){var b={enabled:!0},c=this.getFieldValue("VAR");b.text=this.contextMenuMsg_.replace("%1",
c);c=goog.dom.createDom("field",null,c);c.setAttribute("name","VAR");c=goog.dom.createDom("block",null,c);c.setAttribute("type",this.contextMenuType_);b.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(b)}};
Blockly.Blocks.variables_set={init:function(){this.jsonInit({message0:Blockly.Msg.VARIABLES_SET,args0:[{type:"field_variable",name:"VAR",variable:Blockly.Msg.VARIABLES_DEFAULT_NAME},{type:"input_value",name:"VALUE"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.variables.HUE,tooltip:Blockly.Msg.VARIABLES_SET_TOOLTIP,helpUrl:Blockly.Msg.VARIABLES_SET_HELPURL});this.contextMenuMsg_=Blockly.Msg.VARIABLES_SET_CREATE_GET},contextMenuType_:"variables_get",customContextMenu:Blockly.Blocks.variables_get.customContextMenu};

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="96px" height="124px">
<style type="text/css">
#background {
fill: none;
}
.arrows {
fill: #000;
stroke: none;
}
.selected>.arrows {
fill: #fff;
}
.checkmark {
fill: #000;
font-family: sans-serif;
font-size: 10pt;
text-anchor: middle;
}
.trash {
fill: #888;
}
.zoom {
fill: none;
stroke: #888;
stroke-width: 2;
stroke-linecap: round;
}
.zoom>.center {
fill: #888;
stroke-width: 0;
}
</style>
<rect id="background" width="96" height="124" x="0" y="0" />
<g>
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" />
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" />
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" />
</g>
<g class="selected" transform="translate(0, 16)">
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" />
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" />
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" />
</g>
<text class="checkmark" x="55.5" y="28">&#10003;</text>
<g class="trash">
<path d="M 2,41 v 6 h 42 v -6 h -10.5 l -3,-3 h -15 l -3,3 z" />
<rect width="36" height="20" x="5" y="50" />
<rect width="36" height="42" x="5" y="50" rx="4" ry="4" />
</g>
<g class="zoom">
<circle r="11.5" cx="16" cy="108" />
<circle r="4.3" cx="16" cy="108" class="center" />
<path d="m 28,108 h3" />
<path d="m 1,108 h3" />
<path d="m 16,120 v3" />
<path d="m 16,93 v3" />
</g>
<g class="zoom">
<circle r="15" cx="48" cy="108" />
<path d="m 48,101.6 v12.8" />
<path d="m 41.6,108 h12.8" />
</g>
<g class="zoom">
<circle r="15" cx="80" cy="108" />
<path d="m 73.6,108 h12.8" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.de');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Kommentar hinzufügen";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Die Variable „%1“ kann nicht gelöscht werden, da sie Teil der Definition der Funktion „%2“ ist.";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Wert ändern:";
/** @export */ Blockly.Msg.CLEAN_UP = "Bausteine aufräumen";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Alle Bausteine zusammenfalten";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Baustein zusammenfalten";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farbe 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "und Farbe 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältnis";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "mische";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://de.wikipedia.org/wiki/Farbe";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Erzeugt eine Farbe aus der Palette.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "zufällige Farbe";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Erzeugt eine Farbe nach dem Zufallsprinzip.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "blau";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "grün";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "https://de.wikipedia.org/wiki/RGB-Farbraum";
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "rot";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "Farbe aus";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://de.wikipedia.org/wiki/Kontrollstruktur";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "die Schleife abbrechen";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sofort mit nächstem Schleifendurchlauf fortfahren";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebende Schleife beenden.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "für jeden Wert %1 aus der Liste %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "zähle %1 von %2 bis %3 in Schritten von %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Eine weitere Bedingung hinzufügen.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufügen, entfernen oder sortieren von Sektionen";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sonst";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sonst falls";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "falls";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Führt eine Anweisung aus, falls eine Bedingung wahr ist.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mache";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhole %1 mal:";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eine Anweisung mehrfach ausführen.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "wiederhole bis";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "wiederhole solange";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Führt Anweisungen aus solange die Bedingung unwahr ist.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Führt Anweisungen aus solange die Bedingung wahr ist.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Alle %1 Bausteine löschen?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Baustein löschen";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Die Variable „%1“ löschen";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1 Verwendungen der Variable „%2“ löschen?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "%1 Bausteine löschen";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Baustein deaktivieren";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Kopieren";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Baustein aktivieren";
/** @export */ Blockly.Msg.EXPAND_ALL = "Alle Bausteine entfalten";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Baustein entfalten";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "externe Eingänge";
/** @export */ Blockly.Msg.HELP = "Hilfe";
/** @export */ Blockly.Msg.INLINE_INPUTS = "interne Eingänge";
/** @export */ Blockly.Msg.IOS_CANCEL = "Abbrechen";
/** @export */ Blockly.Msg.IOS_ERROR = "Fehler";
/** @export */ Blockly.Msg.IOS_OK = "OKAY";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Parameter hinzufügen";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Anweisungen erlauben";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Diese Funktion hat doppelte Parameter.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "PARAMETER";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Hinzufügen";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Variable hinzufügen";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Löschen";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "Du kannst keinen leeren Variablennamen verwenden.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Umbenennen";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Name der Variable";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "erzeuge eine leere Liste";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Erzeugt eine leere Liste ohne Inhalt.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "Liste";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "erzeuge Liste mit";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ein Element zur Liste hinzufügen.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine Liste aus den angegebenen Elementen.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "das erste";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "von hinten das";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "das";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "nimm";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "nimm und entferne";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "das letzte";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "ein zufälliges";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "entferne";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = "Element";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiert das erste Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Extrahiert das Element an der angegebenen Position in der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiert das letzte Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiert ein zufälliges Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiert und entfernt das erste Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Extrahiert und entfernt das Element an der angegebenen Position aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiert und entfernt das letzte Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiert und entfernt ein zufälliges Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das erste Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Entfernt das Element an der angegebenen Position aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt ein zufälliges Element aus der Liste.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "bis von hinten";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "bis";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "bis letztes";
/** @export */ 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";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "nimm Teilliste ab erstes";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "nimm Teilliste ab von hinten";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "nimm Teilliste ab";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "Element";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ist das letzte Element.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ist das erste Element.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "suche erstes Auftreten von";
/** @export */ 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";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "suche letztes Auftreten von";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.";
/** @export */ Blockly.Msg.LISTS_INLIST = "in der Liste";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist wahr, falls die Liste leer ist.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "Länge von %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Anzahl von Elementen in der Liste.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "erzeuge Liste mit %2 mal dem Element %1";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "kehre %1 um";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Kehre eine Kopie einer Liste um.";
/** @export */ 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";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ein";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "füge als";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "setze für";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Fügt das Element an den Anfang der Liste an.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Fügt das Element an der angegebenen Position in die Liste ein.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Fügt das Element ans Ende der Liste an.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Fügt das Element zufällig in die Liste ein.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setzt das erste Element in der Liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setzt das Element an der angegebenen Position in der Liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in die Liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt ein zufälliges Element in der Liste.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "aufsteigend";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "absteigend";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 %3 sortieren";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Eine Kopie einer Liste sortieren.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetisch, Großschreibung ignorieren";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerisch";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetisch";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Liste aus Text erstellen";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Text aus Liste erstellen";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "mit Trennzeichen";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "unwahr";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr oder unwahr";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "wahr";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr, falls beide Werte gleich sind.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr, falls der erste Wert größer als der zweite Wert ist.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr, falls beide Werte unterschiedlich sind.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "nicht %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.";
/** @export */ Blockly.Msg.LOGIC_NULL = "null";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist \"null\".";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "und";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "oder";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr, falls beide Werte wahr sind.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr, falls einer der beiden Werte wahr ist.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "prüfe";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "falls unwahr";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "falls wahr";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://de.wikipedia.org/wiki/Grundrechenart";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Zahlen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zweier Zahlen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zweier Zahlen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zweier Zahlen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist die erste Zahl potenziert mit der zweiten Zahl.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "erhöhe %1 um %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert eine Zahl zu \"%1\".";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://de.wikipedia.org/wiki/Mathematische_Konstante";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 zwischen %2 und %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist teilbar durch";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "ist gerade";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ";
/** @export */ Blockly.Msg.MATH_IS_ODD = "ist ungerade";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "ist positiv";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "ist eine Primzahl";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder unwahr zurück.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "ist eine ganze Zahl";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://de.wikipedia.org/wiki/Modulo";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest nach einer Division.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://de.wikipedia.org/wiki/Zahl";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eine Zahl.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelwert der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalwert der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalwert der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "am häufigsten in der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallswert aus der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standardabweichung der Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe über die Liste";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Durchschnittswert aller Zahlen in einer Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist die größte Zahl in einer Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Median aller Zahlen in einer Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist die kleinste Zahl in einer Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findet die Werte mit dem häufigstem Vorkommen in der Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Gibt einen zufälligen Wert aus der Liste zurück.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die Standardabweichung aller Werte in der Liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summe aller Zahlen in einer Liste.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszahl (0.0 - 1.0)";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzzahlige Zufallszahl zwischen %1 und %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv).";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://de.wikipedia.org/wiki/Runden";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runde";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "runde ab";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "runde auf";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Eine Zahl auf- oder abrunden.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://de.wikipedia.org/wiki/Quadratwurzel";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Betrag";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwurzel";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Betrag einer Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Wert der Exponentialfunktion einer Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natürliche Logarithmus einer Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekadische Logarithmus einer Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert eine Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch eine Zahl.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Quadratwurzel einer Zahl.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://de.wikipedia.org/wiki/Trigonometrie";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arkuskosinus des Eingabewertes.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arkussinus des Eingabewertes.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arkustangens des Eingabewertes.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Kosinus des Winkels.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus des Winkels.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens des Winkels.";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Variable erstellen …";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Name der neuen Variable:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ".";
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Anweisungen erlauben";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Unterprogramm";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Rufe einen Funktionsblock ohne Rückgabewert auf.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://de.wikipedia.org/wiki/Unterprogramm";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Rufe einen Funktionsblock mit Rückgabewert auf.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Erzeuge \"Aufruf %1\"";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beschreibe diese Funktion …";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "etwas tun";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ein Funktionsblock ohne Rückgabewert.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "gib zurück";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ein Funktionsblock mit Rückgabewert.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiere Funktionsblock";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Variable:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Eine Eingabe zur Funktion hinzufügen.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.";
/** @export */ Blockly.Msg.REDO = "Wiederholen";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Kommentar entfernen";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen …";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle \"%1\" Variablen umbenennen in:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "zu %1 Text %2 anhängen";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" anhängen.";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "wandel um in kleinbuchstaben";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "wandel um in Substantive";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "wandel um in GROSSBUCHSTABEN";
/** @export */ 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.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "nimm ersten";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "nimm von hinten";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "nimm";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "nimm letzten";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "nimm zufälligen";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = "Buchstaben";
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "im Text %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiert einen Buchstaben von einer bestimmten Position.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "zähle %1 in %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ein Element zum Text hinzufügen.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinden";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis von hinten";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis letzter";
/** @export */ 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";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "im Text";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "nimm Teil ab erster";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "nimm Teil ab von hinten";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "nimm Teil ab";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "Buchstabe";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt den angegebenen Textabschnitt zurück.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "suche erstes Auftreten des Begriffs";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "suche letztes Auftreten des Begriffs";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "im Text %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr, falls der Text keine Zeichen enthält ist.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "";
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "erstelle Text aus";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt einen Text durch das Verbinden von mehreren Textelementen.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "Länge von %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "gib aus %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Gibt den Text aus.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fragt den Benutzer nach einer Zahl.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fragt den Benutzer nach einem Text.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "frage nach Zahl mit Hinweis";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "frage nach Text mit Hinweis";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "ersetze %1 durch %2 in %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "kehre %1 um";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Kehre die Reihenfolge der Zeichen im Text um.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://de.wikipedia.org/wiki/Zeichenkette";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ein Buchstabe, Text oder Satz.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeichen vom Anfang (links)";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeichen vom Ende (rechts)";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.";
/** @export */ Blockly.Msg.TODAY = "Heute";
/** @export */ Blockly.Msg.UNDO = "Rückgängig";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "etwas";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Erzeuge \"Schreibe %1\"";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29";
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gibt den Wert der Variable zurück.";
/** @export */ Blockly.Msg.VARIABLES_SET = "setze %1 auf %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Erzeuge \"Lese %1\"";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29";
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt den Wert einer Variable.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Eine Variable namens „%1“ ist bereits vorhanden.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Eine Variable namens „%1“ ist bereits für eine andere Variable des Typs „%2“ vorhanden.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.en');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Add Comment";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Can't delete the variable '%1' because it's part of the definition of the function '%2'";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:";
/** @export */ Blockly.Msg.CLEAN_UP = "Clean up Blocks";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colour 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colour 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "ratio";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "blend";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "random colour";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "blue";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "green";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "red";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "colour with";
/** @export */ 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.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with";
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4";
/** @export */ 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.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse";
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "if";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements.";
/** @export */ 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.";
/** @export */ 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.";
/** @export */ 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.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "do";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeat %1 times";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Delete Block";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Delete %1 Blocks";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Disable Block";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Duplicate";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Enable Block";
/** @export */ Blockly.Msg.EXPAND_ALL = "Expand Blocks";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Expand Block";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "External Inputs";
/** @export */ Blockly.Msg.HELP = "Help";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Inline Inputs";
/** @export */ Blockly.Msg.IOS_CANCEL = "Cancel";
/** @export */ Blockly.Msg.IOS_ERROR = "Error";
/** @export */ Blockly.Msg.IOS_OK = "OK";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Add Input";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Allow statements";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "This function has duplicate inputs.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "INPUTS";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Add";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Add Variable";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Delete";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "You can't use an empty variable name.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Rename";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Variable name";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "first";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "get";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "last";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = "";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.";
/** @export */ Blockly.Msg.LISTS_INLIST = "in list";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of";
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "set";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true.";
/** @export */ Blockly.Msg.LOGIC_NULL = "null";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "and";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations";
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "or";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "test";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "if false";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "if true";
/** @export */ 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.";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'.";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant";
/** @export */ 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).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷";
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "is even";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "is negative";
/** @export */ Blockly.Msg.MATH_IS_ODD = "is odd";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "is positive";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "is prime";
/** @export */ 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.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "is whole";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×";
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = "";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "average of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "max of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive.";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-";
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos";
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin";
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan";
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos";
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin";
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Create variable...";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function...";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function.";
/** @export */ Blockly.Msg.REDO = "Redo";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Remove Comment";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Rename variable...";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification";
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "to %1 append text %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'.";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text";
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = "";
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "in text %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "in text %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation";
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification";
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text";
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "print %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends.";
/** @export */ Blockly.Msg.TODAY = "Today";
/** @export */ Blockly.Msg.UNDO = "Undo";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "item";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get";
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable.";
/** @export */ Blockly.Msg.VARIABLES_SET = "set %1 to %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set";
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "A variable named '%1' already exists for another variable of type '%2'.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.es');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Añadir comentario";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "No se puede eliminar la variable \"%1\" porque es parte de la definición de la función \"%2\"";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar el valor:";
/** @export */ Blockly.Msg.CLEAN_UP = "Limpiar los bloques";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Contraer bloques";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Contraer bloque";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "proporción";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "combinar";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Combina dos colores con una proporción determinada (0,01,0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://es.wikipedia.org/wiki/Color";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elige un color de la paleta.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatorio";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Elige un color al azar.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "azul";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "verde";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "rojo";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "colorear con";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un color con cantidades específicas de rojo, verde y azul. Todos los valores deben encontrarse entre 0 y 100.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "romper el bucle";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar con la siguiente iteración del bucle";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Romper el bucle que lo contiene.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Saltar el resto de este bucle, y continuar con la siguiente iteración.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atención: este bloque puede usarse solamente dentro de un bucle.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://es.wikipedia.org/wiki/Foreach";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada elemento %1 en la lista %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada elemento en una lista, establecer la variable '%1' al elemento y luego hacer algunas declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "contar con %1 desde %2 hasta %3 de a %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Hacer que la variable \"%1\" tome los valores desde el número de inicio hasta el número final, contando con el intervalo especificado, y hacer los bloques especificados.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Agregar una condición a este bloque.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Agregar una condición general final a este bloque.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sino";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sino si";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "si";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor es verdadero, entonces hacer algunas declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, hacer el segundo bloque de declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones. Si ninguno de los valores son verdaderos, hacer el último bloque de declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://es.wikipedia.org/wiki/Bucle_for";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "hacer";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 veces";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Hacer algunas declaraciones varias veces.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir hasta";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir mientras";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Mientras un valor sea falso, entonces hacer algunas declaraciones.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Mientras un valor sea verdadero, entonces hacer algunas declaraciones.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "¿Eliminar todos los %1 bloques?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Eliminar bloque";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Borrar la variable \"%1\"";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "¿Borrar %1 usos de la variable \"%2\"?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Eliminar %1 bloques";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Desactivar bloque";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Duplicar";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Activar bloque";
/** @export */ Blockly.Msg.EXPAND_ALL = "Expandir bloques";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Expandir bloque";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas";
/** @export */ Blockly.Msg.HELP = "Ayuda";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Entradas en línea";
/** @export */ Blockly.Msg.IOS_CANCEL = "Cancelar";
/** @export */ Blockly.Msg.IOS_ERROR = "Error";
/** @export */ Blockly.Msg.IOS_OK = "Aceptar";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Añadir entrada";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Permitir declaraciones";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Esta función tiene entradas duplicadas.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "ENTRADAS";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Añadir";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Añadir variable";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Borrar";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "No puedes usar un nombre de variable vacío.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Renombrar";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Nombre de la variable";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear lista vacía";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Devuelve una lista, de longitud 0, sin ningún dato";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear lista con";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Agregar un elemento a la lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crear una lista con cualquier número de elementos.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "primero";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# del final";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "obtener";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtener y eliminar";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "último";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatorio";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eliminar";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Devuelve el primer elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Devuelve el elemento en la posición especificada en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Devuelve el último elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Devuelve un elemento aleatorio en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Elimina y devuelve el primer elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Elimina y devuelve el elemento en la posición especificada en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Elimina y devuelve el último elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Elimina y devuelve un elemento aleatorio en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Elimina el primer elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Elimina el elemento en la posición especificada en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Elimina el último elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Elimina un elemento aleatorio en una lista.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "hasta # del final";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "hasta #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "hasta el último";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtener sublista desde el primero";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtener sublista desde # del final";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtener sublista desde #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia de la parte especificada de una lista.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 es el último elemento.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 es el primer elemento.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontrar la primera aparición del elemento";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "encontrar la última aparición del elemento";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra.";
/** @export */ Blockly.Msg.LISTS_INLIST = "en la lista";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vacía";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Devuelve verdadero si la lista está vacía.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "longitud de %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Devuelve la longitud de una lista.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con el elemento %1 repetido %2 veces";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista que consta de un valor dado repetido el número de veces especificado.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "invertir %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Invertir una copia de una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set"; // untranslated
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "insertar en";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "establecer";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserta el elemento al inicio de una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserta el elemento en la posición especificada en una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Añade el elemento al final de una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserta el elemento aleatoriamente en una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Establece el primer elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Establece el elemento en la posición especificada en una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Establece el último elemento de una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Establece un elemento aleatorio en una lista.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "orden %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordenar una copia de una lista.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabético, ignorar mayúscula/minúscula";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérico";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabético";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "hacer lista a partir de texto";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "hacer texto a partir de lista";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unir una lista de textos en un solo texto, separado por un delimitador.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir el texto en una lista de textos, separando en cada delimitador.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitador";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Devuelve verdadero o falso.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadero";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://es.wikipedia.org/wiki/Desigualdad_matemática";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Devuelve verdadero si ambas entradas son iguales.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Devuelve verdadero si la primera entrada es mayor que la segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Devuelve verdadero si la primera entrada es mayor o igual a la segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Devuelve verdadero si la primera entrada es menor que la segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Devuelve verdadero si la primera entrada es menor que o igual a la segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Devuelve verdadero si ambas entradas son distintas.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "no %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Devuelve verdadero si la entrada es falsa. Devuelve falso si la entrada es verdadera.";
/** @export */ Blockly.Msg.LOGIC_NULL = "nulo";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Devuelve nulo.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "y";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "o";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Devuelve verdadero si ambas entradas son verdaderas.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Devuelve verdadero si al menos una de las entradas es verdadera.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "prueba";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si es falso";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si es verdadero";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Comprueba la condición en \"prueba\". Si la condición es verdadera, devuelve el valor \"si es verdadero\"; de lo contrario, devuelve el valor \"si es falso\".";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://es.wikipedia.org/wiki/Aritmética";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Devuelve la suma de ambos números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Devuelve el cociente de ambos números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Devuelve la diferencia de ambos números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Devuelve el producto de ambos números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Devuelve el primer número elevado a la potencia del segundo.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "añadir %2 a %1";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Añadir un número a la variable «%1».";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Devuelve una de las constantes comunes: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinito).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 entre %2 y %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limitar un número entre los límites especificados (inclusive).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es divisible por";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "es par";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "es negativo";
/** @export */ Blockly.Msg.MATH_IS_ODD = "es impar";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "es positivo";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "es primo";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "es entero";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Devuelve el resto al dividir los dos números.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://es.wikipedia.org/wiki/Número";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un número.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "promedio de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "máximo de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mínimo de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento aleatorio de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desviación estándar de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma de la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Devuelve el promedio (media aritmética) de los valores numéricos en la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Devuelve el número más grande en la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Devuelve la mediana en la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Devuelve el número más pequeño en la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Devuelve una lista de los elementos más comunes en la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Devuelve un elemento aleatorio de la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Devuelve la desviación estándar de la lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Devuelve la suma de todos los números en la lista.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracción aleatoria";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Devuelve una fracción aleatoria entre 0,0 (ambos inclusive) y 1.0 (exclusivo).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "entero aleatorio de %1 a %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Devuelve un entero aleatorio entre los dos límites especificados, inclusive.";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://es.wikipedia.org/wiki/Redondeo";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "redondear";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "redondear a la baja";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "redondear al alza";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Redondear un número al alza o a la baja.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "raíz cuadrada";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Devuelve el valor absoluto de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Devuelve e a la potencia de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Devuelve el logaritmo natural de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Devuelve el logaritmo base 10 de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Devuelve la negación de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Devuelve 10 a la potencia de un número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Devuelve la raíz cuadrada de un número.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://es.wikipedia.org/wiki/Función_trigonométrica";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Devuelve el arcocoseno de un número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Devuelve el arcoseno de un número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Devuelve el arcotangente de un número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Devuelve el coseno de un grado (no radián).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Devuelve el seno de un grado (no radián).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Devuelve la tangente de un grado (no radián).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Crear variable…";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Nombre de variable nueva:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declaraciones";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1'.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1' y usa su salida.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe esta función...";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "hacer algo";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una función sin salida.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "devuelve";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una función con una salida.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advertencia: Esta función tiene parámetros duplicados.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definición de la función";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si un valor es verdadero, entonces devuelve un segundo valor.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advertencia: Este bloque solo puede ser utilizado dentro de la definición de una función.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nombre de entrada:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Añadir una entrada a la función.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Añadir, eliminar o reordenar entradas para esta función.";
/** @export */ Blockly.Msg.REDO = "Rehacer";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Eliminar comentario";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Renombrar la variable…";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Renombrar todas las variables «%1» a:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "a %1 añade el texto %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Añadir texto a la variable '%1'.";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúsculas";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "a Mayúsculas Cada Palabra";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a MAYÚSCULAS";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Devuelve una copia del texto en un tamaño diferente.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "obtener la primera letra";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "obtener la letra # del final";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "obtener la letra #";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "obtener la última letra";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "obtener letra aleatoria";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "en el texto %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Devuelve la letra en la posición especificada.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "contar %1 en %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Cuantas veces aparece un texto dentro de otro texto.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Agregar un elemento al texto.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque de texto.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "hasta la letra # del final";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "hasta la letra #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "hasta la última letra";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en el texto";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtener subcadena desde la primera letra";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtener subcadena desde la letra # del final";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtener subcadena desde la letra #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Devuelve una porción determinada del texto.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontrar la primera aparición del texto";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontrar la última aparición del texto";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "en el texto %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vacío";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Devuelve verdadero si el texto proporcionado está vacío.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation"; // untranslated
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear texto con";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crear un fragmento de texto al unir cualquier número de elementos.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "longitud de %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Devuelve el número de letras (espacios incluidos) del texto proporcionado.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "imprimir %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprimir el texto, número u otro valor especificado.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Solicitar al usuario un número.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Solicitar al usuario un texto.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "solicitar número con el mensaje";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "solicitar texto con el mensaje";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "reemplazar %1 con %2 en %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Reemplazar todas las veces que un texto dentro de otro texto.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "invertir %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Invierte el orden de los caracteres en el texto.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://es.wikipedia.org/wiki/Cadena_de_caracteres";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una letra, palabra o línea de texto.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "quitar espacios de ambos lados de";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "quitar espacios iniciales de";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "quitar espacios finales de";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Devuelve una copia del texto sin los espacios de uno o ambos extremos.";
/** @export */ Blockly.Msg.TODAY = "Hoy";
/** @export */ Blockly.Msg.UNDO = "Deshacer";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'establecer %1'";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Devuelve el valor de esta variable.";
/** @export */ Blockly.Msg.VARIABLES_SET = "establecer %1 a %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'obtener %1'";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Establece esta variable para que sea igual a la entrada.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Ya existe una variable llamada \"%1\".";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Ya existe una variable nombrada \"%1\" para otra variable del tipo \"%2\".";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.fr');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Ajouter un commentaire";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Impossible de supprimer la variable '%1' parce quelle fait partie de la définition de la fonction '%2'";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Modifier la valeur :";
/** @export */ Blockly.Msg.CLEAN_UP = "Nettoyer les blocs";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Réduire les blocs";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Réduire le bloc";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "couleur 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "couleur 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "taux";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "mélanger";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fr.wikipedia.org/wiki/Couleur";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choisir une couleur dans la palette.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "couleur aléatoire";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choisir une couleur au hasard.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "bleu";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "vert";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "rouge";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "colorier en";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "quitter la boucle";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "passer à litération de boucle suivante";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir de la boucle englobante.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauter le reste de cette boucle, et poursuivre avec litération suivante.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention : Ce bloc ne devrait être utilisé que dans une boucle.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "pour chaque élément %1 dans la liste %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pour chaque élément dune liste, assigner la valeur de lélément à la variable '%1', puis exécuter des instructions.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "compter avec %1 de %2 à %3 par %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faire prendre à la variable « %1» les valeurs depuis le nombre de début jusquau nombre de fin, en sincrémentant du pas spécifié, et exécuter les instructions spécifiées.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ajouter une condition au bloc si.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ajouter une condition finale fourre-tout au bloc si.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc si.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sinon";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sinon si";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "si";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si une valeur est vraie, alors exécuter certains ordres.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si une valeur est vraie, alors exécuter le premier bloc dordres. Sinon, exécuter le second bloc dordres.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si la première valeur est vraie, alors exécuter le premier bloc dordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc dordres.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si la première valeur est vraie, alors exécuter le premier bloc dordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc dordres. Si aucune des valeurs nest vraie, exécuter le dernier bloc dordres.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://fr.wikipedia.org/wiki/Boucle_for";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faire";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "répéter %1 fois";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exécuter des instructions plusieurs fois.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "répéter jusquà";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "répéter tant que";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Tant quune valeur est fausse, alors exécuter des instructions.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Tant quune valeur est vraie, alors exécuter des instructions.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Supprimer ces %1 blocs?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Supprimer le bloc";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Supprimer la variable '%1'";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Supprimer %1 utilisations de la variable '%2'?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Supprimer %1 blocs";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Désactiver le bloc";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Dupliquer";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Activer le bloc";
/** @export */ Blockly.Msg.EXPAND_ALL = "Développer les blocs";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Développer le bloc";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Entrées externes";
/** @export */ Blockly.Msg.HELP = "Aide";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Entrées en ligne";
/** @export */ Blockly.Msg.IOS_CANCEL = "Annuler";
/** @export */ Blockly.Msg.IOS_ERROR = "Erreur";
/** @export */ Blockly.Msg.IOS_OK = "OK";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Ajouter une entrée";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Ordres autorisés";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Cette fonction a des entrées dupliquées.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "ENTRÉES";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Ajouter";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Ajouter une variable";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Supprimer";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "Vous ne pouvez pas utiliser un nom de variable vide.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Renommer";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Nom de la variable";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "créer une liste vide";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "créer une liste avec";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ajouter un élément à la liste.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Créer une liste avec un nombre quelconque déléments.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "premier";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# depuis la fin";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "obtenir";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtenir et supprimer";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "dernier";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aléatoire";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "supprimer";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Renvoie le premier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Renvoie lélément à la position indiquée dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Renvoie le dernier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Renvoie un élément au hasard dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Supprime et renvoie le premier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Supprime et renvoie lélément à la position indiquée dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Supprime et renvoie le dernier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Supprime et renvoie un élément au hasard dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Supprime le premier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Supprime lélément à la position indiquée dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Supprime le dernier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Supprime un élément au hasard dans une liste.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "jusquà # depuis la fin";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "jusquà #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "jusquà la fin";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtenir la sous-liste depuis le début";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtenir la sous-liste depuis # depuis la fin";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtenir la sous-liste depuis #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crée une copie de la partie spécifiée dune liste.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 est le dernier élément.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 est le premier élément.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "trouver la première occurrence de lélément";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "trouver la dernière occurrence de lélément";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Renvoie lindex de la première/dernière occurrence de lélément dans la liste. Renvoie %1 si l'élément n'est pas trouvé.";
/** @export */ Blockly.Msg.LISTS_INLIST = "dans la liste";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est vide";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Renvoie vrai si la liste est vide.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "longueur de %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Renvoie la longueur dune liste.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "créer une liste avec lélément %1 répété %2 fois";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "inverser %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Inverser la copie dune liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set"; // untranslated
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "comme";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "insérer en";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "mettre";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insère lélément au début dune liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insère lélément à la position indiquée dans une liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ajouter lélément à la fin dune liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insère lélément au hasard dans une liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Fixe le premier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Met à jour lélément à la position indiquée dans une liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Fixe le dernier élément dans une liste.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Fixe un élément au hasard dans une liste.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "croissant";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "décroissant";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "trier %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Trier une copie dune liste.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabétique, en ignorant la casse";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérique";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabétique";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "créer une liste depuis le texte";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "créer un texte depuis la liste";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Réunir une liste de textes en un seul, en les séparant par un séparateur.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Couper un texte en une liste de textes, en coupant à chaque séparateur.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "avec le séparateur";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "faux";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Renvoie soit vrai soit faux.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vrai";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Renvoyer vrai si les deux entrées sont égales.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Renvoyer vrai si la première entrée est plus grande que la seconde.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Renvoyer vrai si la première entrée est plus grande ou égale à la seconde.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Renvoyer vrai si la première entrée est plus petite que la seconde.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renvoyer vrai si les deux entrées sont différentes.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Renvoie vrai si lentrée est fausse. Renvoie faux si lentrée est vraie.";
/** @export */ Blockly.Msg.LOGIC_NULL = "nul";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Renvoie nul.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "et";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "ou";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Renvoyer vrai si les deux entrées sont vraies.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Renvoyer vrai si au moins une des entrées est vraie.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "test";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si faux";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si vrai";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Vérifier la condition dans 'test'. Si elle est vraie, renvoie la valeur 'si vrai'; sinon renvoie la valeur 'si faux'.";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://fr.wikipedia.org/wiki/Arithmetique";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Renvoie la somme des deux nombres.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Renvoie le quotient des deux nombres.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Renvoie la différence des deux nombres.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Renvoie le produit des deux nombres.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Renvoie le premier nombre élevé à la puissance du second.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "incrémenter %1 de %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ajouter un nombre à la variable '%1'.";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Renvoie une des constantes courantes : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infini).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "contraindre %1 entre %2 et %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Contraindre un nombre à être entre les limites spécifiées (incluses).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "est divisible par";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "est pair";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "est négatif";
/** @export */ Blockly.Msg.MATH_IS_ODD = "est impair";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "est positif";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "est premier";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Vérifier si un nombre est pair, impair, premier, entier, positif, négatif, ou sil est divisible par un certain nombre. Renvoie vrai ou faux.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "est entier";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "reste de %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Renvoyer le reste de la division euclidienne des deux nombres.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://fr.wikipedia.org/wiki/Nombre";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "moyenne de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "médiane de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "majoritaires de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "élément aléatoire de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "écart-type de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somme de la liste";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Renvoyer le plus grand nombre dans la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Renvoyer le nombre médian de la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Renvoyer le plus petit nombre dans la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Renvoyer un élément dans la liste au hasard.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Renvoyer lécart-type de la liste.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Renvoyer la somme de tous les nombres dans la liste.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fraction aléatoire";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Renvoyer une fraction aléatoire entre 0.0 (inclus) et 1.0 (exclus).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "entier aléatoire entre %1 et %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Renvoyer un entier aléatoire entre les deux limites spécifiées, incluses.";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrondir";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrondir par défaut";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrondir par excès";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrondir un nombre au-dessus ou au-dessous.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://fr.wikipedia.org/wiki/Racine_carree";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "valeur absolue";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "racine carrée";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Renvoie la valeur absolue dun nombre.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Renvoie e à la puissance dun nombre.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Renvoie le logarithme naturel dun nombre.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Renvoie le logarithme décimal dun nombre.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Renvoie lopposé dun nombre";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Renvoie 10 à la puissance dun nombre.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Renvoie la racine carrée dun nombre.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Renvoie larccosinus dun nombre.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Renvoie larcsinus dun nombre.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Renvoie larctangente dun nombre.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Renvoie le cosinus dun angle en degrés (pas en radians).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Renvoie le sinus dun angle en degrés (pas en radians).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Renvoie la tangente dun angle en degrés (pas en radians).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Créer une variable...";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Nouveau nom de la variable :";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "autoriser les ordres";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "avec :";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fr.wikipedia.org/wiki/Sous-programme";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Exécuter la fonction '%1' définie par lutilisateur.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fr.wikipedia.org/wiki/Sous-programme";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Exécuter la fonction '%1' définie par lutilisateur et utiliser son résultat.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "avec :";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Créer '%1'";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Décrire cette fonction…";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faire quelque chose";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "pour";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crée une fonction sans sortie.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retour";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crée une fonction avec une sortie.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention : Cette fonction a des paramètres en double.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Surligner la définition de la fonction";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si une valeur est vraie, alors renvoyer une seconde valeur.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention : Ce bloc pourrait nêtre utilisé que dans une définition de fonction.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de lentrée :";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ajouter une entrée à la fonction.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrées";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ajouter, supprimer, ou réarranger les entrées de cette fonction.";
/** @export */ Blockly.Msg.REDO = "Refaire";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Supprimer un commentaire";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Renommer la variable…";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Renommer toutes les variables « %1 » en :";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "ajouter le texte %2 à %1";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Ajouter du texte à la variable '%1'.";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "en minuscules";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "en Majuscule Au Début De Chaque Mot";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "en MAJUSCULES";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Renvoyer une copie du texte dans une autre casse.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "obtenir la première lettre";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "obtenir la lettre # depuis la fin";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "obtenir la lettre #";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "obtenir la dernière lettre";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "obtenir une lettre au hasard";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "dans le texte %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Renvoie la lettre à la position indiquée.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "nombre %1 sur %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Compter combien de fois un texte donné apparait dans un autre.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ajouter un élément au texte.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "joindre";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "jusquà la lettre # depuis la fin";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "jusquà la lettre #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "jusquà la dernière lettre";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dans le texte";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtenir la sous-chaîne depuis la première lettre";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtenir la sous-chaîne depuis la lettre # depuis la fin";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtenir la sous-chaîne depuis la lettre #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Renvoie une partie indiquée du texte.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trouver la première occurrence de la chaîne";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trouver la dernière occurrence de la chaîne";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "dans le texte %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Renvoie lindex de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne nest pas trouvée.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est vide";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Renvoie vrai si le texte fourni est vide.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation"; // untranslated
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "créer un texte avec";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Créer un morceau de texte en agrégeant un nombre quelconque déléments.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "longueur de %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Renvoie le nombre de lettres (espaces compris) dans le texte fourni.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "afficher %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Afficher le texte, le nombre ou une autre valeur spécifié.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Demander un nombre à lutilisateur.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Demander un texte à lutilisateur.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "invite pour un nombre avec un message";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "invite pour un texte avec un message";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "remplacer %1 par %2 dans %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Remplacer toutes les occurrences dun texte par un autre.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "inverser %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Inverse lordre des caractères dans le texte.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Une lettre, un mot ou une ligne de texte.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "supprimer les espaces des deux côtés";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "supprimer les espaces du côté gauche";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "supprimer les espaces du côté droit";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Renvoyer une copie du texte avec les espaces supprimés dun bout ou des deux.";
/** @export */ Blockly.Msg.TODAY = "Aujourd'hui";
/** @export */ Blockly.Msg.UNDO = "Annuler";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "élément";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Créer 'fixer %1'";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Renvoie la valeur de cette variable.";
/** @export */ Blockly.Msg.VARIABLES_SET = "fixer %1 à %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Créer 'obtenir %1'";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Fixe cette variable pour quelle soit égale à la valeur de lentrée.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Une variable appelée '%1' existe déjà.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Une variable nommée '%1' existe déjà pour une autre variable de type '%2'.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.it');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Aggiungi commento";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Non si può cancellare la variabile '%1' perché è parte della definizione della funzione '%2'";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Modifica valore:";
/** @export */ Blockly.Msg.CLEAN_UP = "Pulisci i blocchi";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Comprimi blocchi";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Comprimi blocco";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colore 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colore 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "rapporto";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "miscela";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mescola due colori insieme con un determinato rapporto (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://it.wikipedia.org/wiki/Colore";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Scegli un colore dalla tavolozza.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "colore casuale";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Scegli un colore a caso.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "blu";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "verde";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "rosso";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "colora con";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un colore con la quantità specificata di rosso, verde e blu. Tutti i valori devono essere compresi tra 0 e 100.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "esce dal ciclo";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "prosegui con la successiva iterazione del ciclo";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Esce dal ciclo.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Salta il resto di questo ciclo e prosegue con la successiva iterazione.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attenzioneː Questo blocco può essere usato solo in un ciclo.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "per ogni elemento %1 nella lista %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Per ogni elemento in una lista, imposta la variabile '%1' pari all'elemento e quindi esegue alcune istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "conta con %1 da %2 a %3 per %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fa sì che la variabile '%1' prenda tutti i valori a partire dal numero di partenza fino a quello di arrivo, con passo pari all'intervallo specificato, ed esegue il blocco indicato.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aggiungi una condizione al blocco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aggiungi una condizione finale pigliatutto al blocco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Aggiungi, elimina o riordina le sezioni per riconfigurare questo blocco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "altrimenti";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "altrimenti se";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "se";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se un valore è vero allora esegue alcune istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se un valore è vero allora esegue il primo blocco di istruzioni. Altrimenti esegue il secondo blocco di istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni. Se nessuno dei valori è vero esegue l'ultimo blocco di istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://it.wikipedia.org/wiki/Ciclo_for";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fai";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "ripeti %1 volte";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Esegue alcune istruzione diverse volte.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ripeti fino a che";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ripeti mentre";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Finché un valore è falso, esegue alcune istruzioni.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Finché un valore è vero, esegue alcune istruzioni.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Cancellare tutti i %1 blocchi?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Cancella blocco";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Cancella la variabile '%1'";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Cancella %1 usi della variabile '%2'?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Cancella %1 blocchi";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Disattiva blocco";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Duplica";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Attiva blocco";
/** @export */ Blockly.Msg.EXPAND_ALL = "Espandi blocchi";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Espandi blocco";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Ingressi esterni";
/** @export */ Blockly.Msg.HELP = "Aiuto";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Ingressi in linea";
/** @export */ Blockly.Msg.IOS_CANCEL = "Annulla";
/** @export */ Blockly.Msg.IOS_ERROR = "Errore";
/** @export */ Blockly.Msg.IOS_OK = "OK";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Aggiungi input";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Consenti dichiarazioni";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Questa funzione ha entrate duplicate.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "INPUTS";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Aggiungi";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Aggiungi variabile";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Cancella";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "Non puoi utilizzare un nome di variabile vuoto.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Rinomina";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Nome variabile";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crea lista vuota";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Restituisce una lista, di lunghezza 0, contenente nessun record di dati";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare il blocco lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crea lista con";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Aggiunge un elemento alla lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crea una lista con un certo numero di elementi.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "primo";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dalla fine";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "prendi";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "prendi e rimuovi";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "ultimo";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "casuale";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "rimuovi";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Restituisce il primo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Restituisce l'elemento nella posizione indicata della lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Restituisce l'ultimo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Restituisce un elemento casuale in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Rimuove e restituisce il primo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Rimuove e restituisce l'elemento nella posizione indicata in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Restituisce e rimuove l'ultimo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Restituisce e rimuove un elemento casuale in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Rimuove il primo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Rimuove l'elemento nella posizione indicata in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Rimuove l'ultimo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Rimuove un elemento casuale in una lista.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "da # dalla fine";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fino a #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "dagli ultimi";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "prendi sotto-lista dall'inizio";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "prendi sotto-lista da # dalla fine";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "prendi sotto-lista da #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia della porzione specificata di una lista.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 corrisponde all'ultimo elemento.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 corrisponde al primo elemento.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "trova la prima occorrenza dell'elemento";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "trova l'ultima occorrenza dell'elemento";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato.";
/** @export */ Blockly.Msg.LISTS_INLIST = "nella lista";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 è vuota";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Restituisce vero se la lista è vuota.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "lunghezza di %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Restituisce la lunghezza della lista";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "crea una lista con l'elemento %1 ripetuto %2 volte";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista costituita dal valore indicato ripetuto per il numero di volte specificato.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "inverti %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Inverti una copia di un elenco.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set"; // untranslated
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "come";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserisci in";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "imposta";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserisci l'elemento all'inizio della lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserisci un elemento nella posizione indicata in una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Aggiungi un elemento alla fine di una lista";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserisce l'elemento casualmente in una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Imposta il primo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Imposta l'elemento nella posizione indicata di una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Imposta l'ultimo elemento in una lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Imposta un elemento casuale in una lista.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "crescente";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "decrescente";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "ordinamento %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordina una copia di un elenco.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetico, ignorare differenze maiuscole e minuscole";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerico";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetico";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "crea lista da testo";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crea testo da lista";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unisci una lista di testi in un unico testo, separato da un delimitatore.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitatore";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Restituisce vero o falso.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vero";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://it.wikipedia.org/wiki/Disuguaglianza";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Restituisce vero se gli input sono uno uguale all'altro.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Restituisce vero se il primo input è maggiore o uguale al secondo.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Restituisce uguale se il primo input è maggiore o uguale al secondo input.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Restituisce vero se il primo input è minore del secondo.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Restituisce vero se il primo input è minore o uguale al secondo.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Restituisce vero se gli input non sono uno uguale all'altro.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Restituisce vero se l'input è falso. Restituisce falso se l'input è vero.";
/** @export */ Blockly.Msg.LOGIC_NULL = "nullo";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Restituisce valore nullo.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "e";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "o";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Restituisce vero se entrambi gli input sono veri.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Restituisce vero se almeno uno degli input è vero.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "test";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se vero";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verifica la condizione in 'test'. Se questa è vera restituisce il valore 'se vero' altrimenti restituisce il valore 'se falso'.";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://it.wikipedia.org/wiki/Aritmetica";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Restituisce la somma dei due numeri.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Restituisce il quoziente dei due numeri.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Restituisce la differenza dei due numeri.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Restituisce il prodotto dei due numeri.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Restituisce il primo numero elevato alla potenza del secondo numero.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://it.wikipedia.org/wiki/Addizione";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "cambia %1 di %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aggiunge un numero alla variabile '%1'.";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://it.wikipedia.org/wiki/Costante_matematica";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Restituisce una delle costanti comuniː π (3.141…), e (2.718…), φ (1.618…), radq(2) (1.414…), radq(½) (0.707…) o ∞ (infinito).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "costringi %1 da %2 a %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Costringe un numero all'interno dei limiti indicati (compresi).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "è divisibile per";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "è pari";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "è negativo";
/** @export */ Blockly.Msg.MATH_IS_ODD = "è dispari";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "è positivo";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "è primo";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se un numero è pari, dispari, primo, intero, positivo, negativo o se è divisibile per un certo numero. Restituisce vero o falso.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "è intero";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://it.wikipedia.org/wiki/Resto";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "resto di %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Restituisce il resto della divisione di due numeri.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://it.wikipedia.org/wiki/Numero";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un numero.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "massimo della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimo della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento casuale della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviazione standard della lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somma la lista";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Restituisce la media (media aritmetica) dei valori numerici nella lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Restituisce il più grande numero della lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Restituisce il valore mediano della lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Restituisce il più piccolo numero della lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Restituisce una lista degli elementi più frequenti nella lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Restituisce un elemento casuale della lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Restituisce la deviazione standard della lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Restituisce la somma si tutti i numeri nella lista.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "frazione casuale";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Restituisce una frazione compresa fra 0.0 (incluso) e 1.0 (escluso).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "intero casuale da %1 a %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Restituisce un numero intero casuale compreso tra i due limiti indicati (inclusi).";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://it.wikipedia.org/wiki/Arrotondamento";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrotonda";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrotonda verso il basso";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrotonda verso l'alto";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrotonda un numero verso l'alto o verso il basso.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://it.wikipedia.org/wiki/Radice_quadrata";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assoluto";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "radice quadrata";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Restituisce il valore assoluto del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Restituisce e elevato alla potenza del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Restituisce il logaritmo naturale del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Restituisce il logaritmo in base 10 del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Restituisce l'opposto del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Restituisce 10 elevato alla potenza del numero.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Restituisce la radice quadrata del numero.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://it.wikipedia.org/wiki/Funzione_trigonometrica";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Restituisce l'arco-coseno di un numero.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Restituisce l'arco-seno di un numero.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Restituisce l'arco-tangente di un numero.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Restituisce il coseno di un angolo espresso in gradi (non radianti).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Restituisce il seno di un angolo espresso in gradi (non radianti).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Restituisce la tangente di un angolo espresso in gradi (non radianti).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Crea variabile...";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Nome della nuova variabile:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "consenti dichiarazioni";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "conː";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione (informatica)";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1'.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione (informatica)";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1' ed usa il suo output.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "conː";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Crea '%1'";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descrivi questa funzione...";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fai qualcosa";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "per";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una funzione senza output.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ritorna";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funzione con un output.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attenzioneː Questa funzione ha parametri duplicati.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenzia definizione di funzione";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valore è vero allora restituisce un secondo valore.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome inputː";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aggiungi un input alla funzione.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina input alla funzione.";
/** @export */ Blockly.Msg.REDO = "Ripeti";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Rimuovi commento";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Rinomina variabile...";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Rinomina tutte le variabili '%1' in:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "a %1 aggiungi il testo %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Aggiunge del testo alla variabile '%1'.";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "in minuscolo";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "con Iniziali Maiuscole";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "in MAIUSCOLO";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Restituisce una copia del testo in un diverso formato maiuscole/minuscole.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "prendi la prima lettera";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "prendi la lettera # dalla fine";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "prendi la lettera #";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "prendi l'ultima lettera";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "prendi lettera casuale";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "nel testo %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Restituisce la lettera nella posizione indicata.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "conta %1 in %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Aggiungi un elemento al testo.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unisci";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare questo blocco testo.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "alla lettera # dalla fine";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "alla lettera #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "all'ultima lettera";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "nel testo";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "prendi sotto-stringa dalla prima lettera";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "prendi sotto-stringa dalla lettera # dalla fine";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "prendi sotto-stringa dalla lettera #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Restituisce la porzione di testo indicata.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trova la prima occorrenza del testo";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trova l'ultima occorrenza del testo";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "nel testo %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 è vuoto";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Restituisce vero se il testo fornito è vuoto.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation"; // untranslated
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crea testo con";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crea un blocco di testo unendo un certo numero di elementi.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "lunghezza di %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "scrivi %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scrive il testo, numero o altro valore indicato.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Richiedi un numero all'utente.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Richiede del testo da parte dell'utente.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "richiedi numero con messaggio";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "richiedi testo con messaggio";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "sostituisci %1 con %2 in %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "sostituisci tutte le occorrenze di un certo testo con qualche altro testo.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "inverti %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Inverte l'ordine dei caratteri nel testo.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://it.wikipedia.org/wiki/Stringa_(informatica)";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lettera, una parola o una linea di testo.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "rimuovi spazi da entrambi gli estremi";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "rimuovi spazi a sinistra";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "rimuovi spazi a destra";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Restituisce una copia del testo con gli spazi rimossi ad uno o entrambe le estremità.";
/** @export */ Blockly.Msg.TODAY = "Oggi";
/** @export */ Blockly.Msg.UNDO = "Annulla";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'imposta %1'";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Restituisce il valore di una variabile.";
/** @export */ Blockly.Msg.VARIABLES_SET = "imposta %1 a %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crea 'prendi %1'";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Imposta questa variabile ad essere pari all'input.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Una variabile denominata '%1' esiste già.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Una variabile nominata \"%1\" esiste già per un'altra variabile del tipo \"%2\".";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.nl');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Reactie toevoegen";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "De variabele \"%1\" kan niet verwijderd worden omdat die onderdeel uitmaakt van de definitie van de functie \"%2\"";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Waarde wijzigen:";
/** @export */ Blockly.Msg.CLEAN_UP = "Blokken opschonen";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Blokken samenvouwen";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Blok samenvouwen";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kleur 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kleur 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "verhouding";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "mengen";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://nl.wikipedia.org/wiki/Kleur";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Kies een kleur in het palet.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "willekeurige kleur";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Kies een willekeurige kleur.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "blauw";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "groen";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "rood";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "kleuren met";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "uit lus breken";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "doorgaan met de volgende iteratie van de lus";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "uit de bovenliggende lus breken";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "De rest van deze lus overslaan en doorgaan met de volgende herhaling.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden in een lus.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "voor ieder item %1 in lijst %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with";
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "rekenen met %1 van %2 tot %3 in stappen van %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Voeg een voorwaarde toe aan het als-blok.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Voeg een laatste, vang-alles conditie toe aan het als-statement.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse";
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "anders";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "anders als";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "als";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Als een waarde waar is, voer dan opdrachten uit.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Als een waarde waar is, voert dan het eerste blok met opdrachten uit. Voer andere het tweede blok met opdrachten uit.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Als de eerste waarde waar is, voer dan het eerste blok met opdrachten uit. Voer anders, als de tweede waarde waar is, het tweede blok met opdrachten uit.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Als de eerste waarde \"waar\" is, voer dan het eerste blok uit. Voer anders wanneer de tweede waarde \"waar\" is, het tweede blok uit. Als geen van beide waarden waar zijn, voer dan het laatste blok uit.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://nl.wikipedia.org/wiki/Repetitie_(informatica)#For_en_Foreach";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "voer uit";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 keer herhalen";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Voer een aantal opdrachten meerdere keren uit.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "herhalen totdat";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "herhalen zolang";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Terwijl een waarde waar is de volgende opdrachten uitvoeren.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Alle %1 blokken verwijderen?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Blok verwijderen";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Verwijder de variabele \"%1\"";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1 gebruiken van de variabele \"%2\" verwijderen?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "%1 blokken verwijderen";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Blok uitschakelen";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Duplicaat";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Blok inschakelen";
/** @export */ Blockly.Msg.EXPAND_ALL = "Blokken uitvouwen";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Blok uitvouwen";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Externe invoer";
/** @export */ Blockly.Msg.HELP = "Hulp";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Inline invoer";
/** @export */ Blockly.Msg.IOS_CANCEL = "Annuleren";
/** @export */ Blockly.Msg.IOS_ERROR = "Fout";
/** @export */ Blockly.Msg.IOS_OK = "OK";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Invoer toevoegen";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Statements toestaan";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Deze functie heeft dubbele invoeren.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "INVOER";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Toevoegen";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Variabele toevoegen";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Verwijderen";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "U kunt geen lege variabelenaam gebruiken.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Hernoemen";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Variabelenaam";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "maak een lege lijst";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Geeft een lijst terug met lengte 0, zonder items";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lijst";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "maak een lijst met";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Voeg iets toe aan de lijst.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Maak een lijst met een willekeurig aantal items.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "eerste";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# van einde";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "haal op";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "haal op en verwijder";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "laatste";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "willekeurig";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "verwijder";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Geeft het eerste item in een lijst terug.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Geeft het item op de opgegeven positie in een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Geeft het laatste item in een lijst terug.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Geeft een willekeurig item uit een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Geeft het laatste item in een lijst terug en verwijdert het.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Geeft het laatste item uit een lijst terug en verwijdert het.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Geeft een willekeurig item in een lijst terug en verwijdert het.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Verwijdert het eerste item in een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Verwijdert het item op de opgegeven positie in een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Verwijdert het laatste item uit een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Verwijdert een willekeurig item uit een lijst.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "naar # vanaf einde";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "naar item";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "naar laatste";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "haal sublijst op vanaf eerste";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "haal sublijst op van positie vanaf einde";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "haal sublijst op vanaf positie";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Maakt een kopie van het opgegeven deel van de lijst.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Item %1 is het laatste item.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Item %1 is het eerste item.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "zoek eerste voorkomen van item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "zoek laatste voorkomen van item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden.";
/** @export */ Blockly.Msg.LISTS_INLIST = "in lijst";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is leeg";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Geeft waar terug als de lijst leeg is.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of";
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "lengte van %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Geeft de lengte van een lijst terug.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "Maak lijst met item %1, %2 keer herhaald";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "%1 omkeren";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Keert een kopie van een lijst om.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "als";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "tussenvoegen op";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "stel in";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Voegt het item toe aan het begin van de lijst.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Voegt het item op een opgegeven positie in een lijst in.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Voeg het item aan het einde van een lijst toe.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Voegt het item op een willekeurige positie in de lijst in.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Stelt het eerste item in een lijst in.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Zet het item op de opgegeven positie in de lijst.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Stelt het laatste item van een lijst in.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Stelt een willekeurig item uit de lijst in.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "oplopend";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "aflopend";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "sorteer %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Sorteer een kopie van een lijst.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetisch, negeer hoofd-/kleine letters";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeriek";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetisch";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lijst maken van tekst";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tekst maken van lijst";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Tekst splitsen in een lijst van teksten op basis van een scheidingsteken.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "met scheidingsteken";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "onwaar";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Geeft \"waar\" of \"onwaar\" terug.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "waar";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Geeft \"waar\", als beide waarden gelijk aan elkaar zijn.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "niet %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is.";
/** @export */ Blockly.Msg.LOGIC_NULL = "niets";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Geeft niets terug.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "en";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations";
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "of";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Geeft waar als beide waarden waar zijn.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Geeft \"waar\" terug als in ieder geval één van de waarden waar is.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "test";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "als onwaar";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "als waar";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug.";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://nl.wikipedia.org/wiki/Rekenen";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Geeft de som van 2 getallen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Geeft de gedeelde waarde van twee getallen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Geeft het verschil van de twee getallen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Geeft het product terug van de twee getallen.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Geeft het eerste getal tot de macht van het tweede getal.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "%1 wijzigen met %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Voegt een getal toe aan variabele \"%1\".";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://nl.wikipedia.org/wiki/Wiskundige_constante";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Geeft een van de vaak voorkomende constante waardes: π (3.141…), e (2.718…), φ (1.618…), √2 (1.414…), √½ (0.707…), of ∞ (oneindig).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "beperk %1 van minimaal %2 tot maximaal %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Beperk een getal tussen de twee opgegeven limieten (inclusief).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷";
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is deelbaar door";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "is even";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "is negatief";
/** @export */ Blockly.Msg.MATH_IS_ODD = "is oneven";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "is positief";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "is priemgetal";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Test of een getal even, oneven, een priemgetal, geheel, positief of negatief is, of deelbaar is door een bepaald getal. Geeft \"waar\" of \"onwaar\".";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "is geheel getal";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://nl.wikipedia.org/wiki/Modulair_rekenen";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "restgetal van %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Geeft het restgetal van het resultaat van de deling van de twee getallen.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×";
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Een getal.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gemiddelde van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "hoogste uit lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediaan van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "laagste uit lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modi van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "willekeurige item van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standaarddeviatie van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "som van lijst";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Geeft het gemiddelde terug van de numerieke waardes in een lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Geeft het grootste getal in een lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Geeft de mediaan in de lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Geeft het kleinste getal uit een lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Geeft een lijst van de meest voorkomende onderdelen in de lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Geeft een willekeurig item uit de lijst terug.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Geeft de standaardafwijking van de lijst.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Geeft de som van alle getallen in de lijst.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "willekeurige fractie";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "willekeurig geheel getal van %1 tot %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Geeft een willekeurig getal tussen de 2 opgegeven limieten in, inclusief.";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://nl.wikipedia.org/wiki/Afronden";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "afronden";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "naar beneden afronden";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "omhoog afronden";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Rondt een getal af omhoog of naar beneden.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://nl.wikipedia.org/wiki/Vierkantswortel";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluut";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "wortel";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Geeft de absolute waarde van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Geeft e tot de macht van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Geeft het natuurlijk logaritme van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Geeft het logaritme basis 10 van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Geeft de negatief van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Geeft 10 tot de macht van een getal.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Geeft de wortel van een getal.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-";
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos";
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin";
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "arctan";
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos";
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://nl.wikipedia.org/wiki/Goniometrische_functie";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin";
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Geeft de arccosinus van een getal.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Geeft de arcsinus van een getal.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Geeft de arctangens van een getal.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Geeft de cosinus van een graad (geen radialen).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Geeft de sinus van een graad (geen radialen).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Geeft de tangens van een graad (geen radialen).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Variabele maken...";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Nieuwe variabelenaam:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "statements toestaan";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "met:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit en gebruik de uitvoer.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "met:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Maak \"%1\"";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Deze functie beschrijven...";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "doe iets";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "om";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Maakt een functie zonder uitvoer.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "uitvoeren";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Maakt een functie met een uitvoer.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Waarschuwing: deze functie heeft parameters met dezelfde naam.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentueer functiedefinitie";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "invoernaam:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Een invoer aan de functie toevoegen.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ingangen";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Invoer van deze functie toevoegen, verwijderen of herordenen.";
/** @export */ Blockly.Msg.REDO = "Opnieuw";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Opmerking verwijderen";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Variabele hernoemen...";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle variabelen \"%1\" hernoemen naar:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification";
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "voor%1 voeg tekst toe van %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Voeg tekst toe aan de variabele \"%1\".";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "naar kleine letters";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "naar Hoofdletter Per Woord";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "naar HOOFDLETTERS";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Geef een kopie van de tekst met veranderde hoofdletters terug.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "haal eerste letter op";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "haal letter # op vanaf einde";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "haal letter # op";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text";
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "haal laatste letter op";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "haal willekeurige letter op";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "in tekst %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Geeft de letter op de opgegeven positie terug.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings"; // untranslated
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "%1 in %2 tellen";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Tel hoe vaak bepaalde tekst voorkomt in andere tekst.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Voegt een item aan de tekst toe.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "samenvoegen";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "van letter # tot einde";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "naar letter #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "naar laatste letter";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in tekst";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "haal subtekst op van eerste letter";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "haal subtekst op vanaf letter # vanaf einde";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "haal subtekst op vanaf letter #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Geeft het opgegeven onderdeel van de tekst terug.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "zoek eerste voorkomen van tekst";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "zoek het laatste voorkomen van tekst";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "in tekst %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is leeg";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Geeft \"waar\" terug, als de opgegeven tekst leeg is.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation";
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "maak tekst met";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Maakt een stuk tekst door één of meer items samen te voegen.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification";
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "lengte van %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text";
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "tekst weergeven: %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukt de opgegeven tekst, getal of een andere waarde af.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Vraagt de gebruiker om een getal in te voeren.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Vraagt de gebruiker om invoer.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "vraagt de gebruiker om een getal met de tekst";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "vraagt om invoer met bericht";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings"; // untranslated
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "vervang %1 door %2 in %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Vervang alle voorkomens van tekst in een andere tekst.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "%1 omkeren";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Keert de volgorde van de tekens in de tekst om.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://nl.wikipedia.org/wiki/String_%28informatica%29";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Een letter, woord of een regel tekst.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "spaties van beide kanten afhalen van";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "spaties van de linkerkant verwijderen van";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "spaties van de rechterkant verwijderen van";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten.";
/** @export */ Blockly.Msg.TODAY = "Vandaag";
/** @export */ Blockly.Msg.UNDO = "Ongedaan maken";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "item";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Maak \"verander %1\"";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get";
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Geeft de waarde van deze variabele.";
/** @export */ Blockly.Msg.VARIABLES_SET = "stel %1 in op %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Maak 'opvragen van %1'";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set";
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Verandert de waarde van de variabele naar de waarde van de invoer.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Er bestaat al een variabele met de naam \"%1\".";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Een variabele met de naam '%1' bestaat al voor een andere variabele van type '%2'.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.pt');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Adicionar Comentário";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Não se pode eliminar a variável '%1' porque faz parte da definição da função '%2'";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Alterar valor:";
/** @export */ Blockly.Msg.CLEAN_UP = "Limpar Blocos";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Ocultar Blocos";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Ocultar Bloco";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "cor 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "cor 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/";
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "proporção";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "misturar";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mistura duas cores com a proporção indicada (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "http://pt.wikipedia.org/wiki/Cor";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolha uma cor da paleta de cores.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "cor aleatória";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolha uma cor aleatoriamente.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "azul";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "verde";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "vermelho";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "pinte com";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sair do ciclo";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar com a próxima iteração do ciclo";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sair do ciclo que está contido.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ignorar o resto deste ciclo, e continuar com a próxima iteração.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atenção: Este bloco só pode ser usado dentro de um ciclo.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada item %1 na lista %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada item numa lista, define a variável \"%1\" para o item e então faz algumas instruções.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "contar com %1 de %2 até %3 por %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faz com que a variável \"%1\" assuma os valores desde o número inicial até ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Acrescente uma condição ao bloco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Acrescente uma condição de excepação final para o bloco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Acrescente, remova ou reordene secções para reconfigurar este bloco se.";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "senão";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "senão se";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "se";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se um valor é verdadeiro, então realize alguns passos.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se um valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções. Se nenhum dos blocos for verdadeiro, realize o último bloco de instruções.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faça";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 vez";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Faça algumas instruções várias vezes.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir até";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir enquanto";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Enquanto um valor for falso, então faça algumas instruções.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Enquanto um valor for verdadeiro, então faça algumas instruções.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Eliminar todos os %1 blocos?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Eliminar Bloco";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Eliminar a variável '%1'";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Eliminar %1 utilizações da variável '%2'?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Eliminar %1 Blocos";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Desativar Bloco";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Duplicar";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Ativar Bloco";
/** @export */ Blockly.Msg.EXPAND_ALL = "Expandir Blocos";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Expandir Bloco";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Entradas Externas";
/** @export */ Blockly.Msg.HELP = "Ajuda";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Entradas Em Linhas";
/** @export */ Blockly.Msg.IOS_CANCEL = "Cancelar";
/** @export */ Blockly.Msg.IOS_ERROR = "Erro";
/** @export */ Blockly.Msg.IOS_OK = "Aceitar";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Adicionar entrada";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Permitir declarações";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "Essa função tem entradas duplicadas.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "ENTRADAS";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Adicionar";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Adicionar Variável";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Eliminar";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "Você não pode usar um nome de variável vazio.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Renomear";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Nome da variável";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "criar lista vazia";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna uma lista, de tamanho 0, contendo nenhum registo";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Acrescente, remova ou reordene as seções para reconfigurar este bloco lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "criar lista com";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Acrescenta um item à lista.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Cria uma lista com qualquer número de itens.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "primeiro";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# a partir do final";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "obter";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obter e remover";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "último";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatório";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna o primeiro item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Retorna o item na posição especificada da lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna o último item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna um item aleatório de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna o primeiro item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Remove e retorna o item na posição especificada de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna o último item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna um item aleatório de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove o primeiro item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Remove o item de uma posição especifica da lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove o último item de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove um item aleatório de uma lista.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "até #, a partir do final";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "até #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "para o último";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtem sublista da primeira lista";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtem sublista de # a partir do final";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtem sublista de #";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificada de uma lista.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 é o último item.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 é o primeiro item.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.";
/** @export */ Blockly.Msg.LISTS_INLIST = "na lista";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vazia";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retona verdadeiro se a lista estiver vazia.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "tamanho de %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna o tamanho de uma lista.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "criar lista com o item %1 repetido %2 vezes";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Cria uma lista constituída por um dado valor repetido o número de vezes especificado.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "inverter %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Inverter uma cópia da lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set"; // untranslated
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir em";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "definir";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere o item no início da lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insere o item numa posição especificada numa lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Insere o item no final da lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere o item numa posição aleatória de uma lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Define o primeiro item de uma lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Define o item na posição especificada de uma lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "ordenar %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordenar uma cópia de uma lista.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabética, ignorar maiúsculas/minúsculas";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérica";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabética";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fazer lista a partir de texto";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer texto a partir da lista";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Juntar uma lista de textos num único texto, separado por um delimitador.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir o texto numa lista de textos, separando-o em cada delimitador.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "com delimitador";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna verdadeiro ou falso.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadeiro";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "http://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retorna verdadeiro se ambas as entradas forem iguais entre si.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retorna verdadeiro se ambas as entradas forem diferentes entre si.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "não %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retorna verdadeiro se a entrada for falsa. Retorna falso se a entrada for verdadeira.";
/** @export */ Blockly.Msg.LOGIC_NULL = "nulo";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "http://en.wikipedia.org/wiki/Nullable_type";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nulo.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "e";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "ou";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retorna verdadeiro se ambas as entradas forem verdadeiras.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retorna verdadeiro se pelo menos uma das estradas for verdadeira.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "http://en.wikipedia.org/wiki/%3F:";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se verdadeiro";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\".";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "http://pt.wikipedia.org/wiki/Aritm%C3%A9tica";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retorna a soma de dois números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retorna o quociente da divisão de dois números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retorna a diferença de dois números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retorna o produto de dois números.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retorna o primeiro número elevado à potência do segundo número.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "http://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "alterar %1 por %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Soma um número à variável \"%1\".";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "http://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "restringe %1 inferior %2 superior %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Restringe um número entre os limites especificados (inclusive).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷";
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "é divisível por";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "é par";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "é negativo";
/** @export */ Blockly.Msg.MATH_IS_ODD = "é impar";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "é positivo";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "é primo";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se um número é par, impar, primo, inteiro, positivo, negativo, ou se é divisível por outro número. Retorna verdadeiro ou falso.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "é inteiro";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "http://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "resto da divisão de %1 ÷ %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Retorna o resto da divisão de dois números.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×";
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "http://pt.wikipedia.org/wiki/N%C3%BAmero";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Um número.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "média de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maior de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "menor de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item aleatório de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desvio padrão de uma lista";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma da lista";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retorna a média aritmética dos valores números da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retorna o maior número da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retorna a mediana da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retorna o menor número da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retorna a lista de item(ns) mais comum(ns) da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retorna um elemento aleatório da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retorna o desvio padrão dos números da lista.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retorna a soma de todos os números da lista.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fração aleatória";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Insere uma fração aleatória entre 0.0 (inclusive) e 1.0 (exclusive).";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "inteiro aleatório entre %1 e %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retorna um número inteiro entre os dois limites especificados, inclusive.";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "http://pt.wikipedia.org/wiki/Arredondamento";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arredonda";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arredonda para baixo";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arredonda para cima";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Arredonda um número para cima ou para baixo.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "http://pt.wikipedia.org/wiki/Raiz_quadrada";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "raíz quadrada";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retorna o valor absoluto de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retorna o número e elevado à potência de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retorna o logarítmo natural de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retorna o logarítmo em base 10 de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retorna o oposto de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retorna 10 elevado à potência de um número.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retorna a raiz quadrada de um número.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-";
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos";
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin";
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan";
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos";
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "http://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin";
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retorna o arco cosseno de um número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retorna o arco seno de um número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano).";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Criar variável…";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declarações";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "com:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa a função \"%1\".";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função \"%1\" e usa o seu retorno.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\"";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descreva esta função...";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faz algo";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Cria uma função que não tem retorno.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Cria uma função que possui um valor de retorno.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenção: Esta função tem parâmetros duplicados.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definição da função";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "se o valor é verdadeiro, então retorna um segundo valor.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adicionar uma entrada para a função.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adicionar, remover ou reordenar as entradas para esta função.";
/** @export */ Blockly.Msg.REDO = "Refazer";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Remover Comentário";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Renomear variável...";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "para %1 acrescentar texto %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Acrescentar um pedaço de texto à variável \"%1\".";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "para minúsculas";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "para Iniciais Maiúsculas";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "para MAIÚSCULAS";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retorna uma cópia do texto em formato diferente.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "obter primeira letra";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "obter letra nº a partir do final";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "obter letra nº";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "obter última letra";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "obter letra aleatória";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "in text %1 %2"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna a letra na posição especificada.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "contar %1 em %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Conte quantas vezes um certo texto aparece dentro de algum outro texto.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acrescentar um item ao texto.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "até letra nº a partir do final";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "até letra nº";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "até última letra";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "no texto";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obter subsequência a partir da primeira letra";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obter subsequência de tamanho # a partir do final";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obter subsequência de tamanho #";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Retorna a parte especificada do texto.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "primeira ocorrência do texto";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "última ocorrência do texto";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "no texto %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vazio";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido estiver vazio.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation"; // untranslated
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "criar texto com";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Criar um pedaço de texto juntando qualquer número de itens.";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "tamanho de %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Devolve o número de letras (incluindo espaços) do texto fornecido.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "imprime %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprime o texto, número ou outro valor especificado.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pede ao utilizador um número.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pede ao utilizador um texto.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pede um número com a mensagem";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Pede um texto com a mensagem";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "substituir %1 por %2 em %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Substituir todas as ocorrências de um certo texto dentro de algum outro texto.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Inverte a ordem dos caracteres no texto.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Uma letra, palavra ou linha de texto.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "remover espaços de ambos os lados";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas as extremidades.";
/** @export */ Blockly.Msg.TODAY = "Hoje";
/** @export */ Blockly.Msg.UNDO = "Desfazer";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "item";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\"";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna o valor desta variável.";
/** @export */ Blockly.Msg.VARIABLES_SET = "definir %1 para %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Criar \"obter %1\"";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Define esta variável para o valor inserido.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Já existe uma variável com o nome de '%1'.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "A variable named '%1' already exists for another variable of type '%2'."; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

View File

@ -0,0 +1,425 @@
// This file was automatically generated. Do not modify.
'use strict';
goog.provide('Blockly.Msg.ru');
goog.require('Blockly.Msg');
/** @export */ Blockly.Msg.ADD_COMMENT = "Добавить комментарий";
/** @export */ Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = "Невозможно удалить переменную '%1', поскольку она является частью определения функции '%2'";
/** @export */ Blockly.Msg.CHANGE_VALUE_TITLE = "Измените значение:";
/** @export */ Blockly.Msg.CLEAN_UP = "Убрать блоки";
/** @export */ Blockly.Msg.COLLAPSE_ALL = "Свернуть блоки";
/** @export */ Blockly.Msg.COLLAPSE_BLOCK = "Свернуть блок";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR1 = "цвет 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_COLOUR2 = "цвет 2";
/** @export */ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated
/** @export */ Blockly.Msg.COLOUR_BLEND_RATIO = "доля цвета 1";
/** @export */ Blockly.Msg.COLOUR_BLEND_TITLE = "смешать";
/** @export */ Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Смешивает два цвета в заданном соотношении (0.0 - 1.0).";
/** @export */ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ru.wikipedia.org/wiki/Цвет";
/** @export */ Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Выберите цвет из палитры.";
/** @export */ Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RANDOM_TITLE = "случайный цвет";
/** @export */ Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Выбирает цвет случайным образом.";
/** @export */ Blockly.Msg.COLOUR_RGB_BLUE = "синего";
/** @export */ Blockly.Msg.COLOUR_RGB_GREEN = "зелёного";
/** @export */ Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated
/** @export */ Blockly.Msg.COLOUR_RGB_RED = "красного";
/** @export */ Blockly.Msg.COLOUR_RGB_TITLE = "цвет из";
/** @export */ Blockly.Msg.COLOUR_RGB_TOOLTIP = "Создаёт цвет с указанной пропорцией красного, зеленого и синего. Все значения должны быть между 0 и 100.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "выйти из цикла";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "перейти к следующему шагу цикла";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Прерывает этот цикл.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Пропускает остаток цикла и переходит к следующему шагу.";
/** @export */ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Предупреждение: этот блок может использоваться только внутри цикла.";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#for-each"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TITLE = "для каждого элемента %1 в списке %2";
/** @export */ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для каждого элемента в списке, присваивает переменной '%1' значение элемента и выполняет указанные команды.";
/** @export */ Blockly.Msg.CONTROLS_FOR_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#count-with"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_FOR_TITLE = "цикл по %1 от %2 до %3 с шагом %4";
/** @export */ Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Присваивает переменной '%1' значения от начального до конечного с заданным шагом и выполняет указанные команды.";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Добавляет условие к блоку \"если\"";
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Добавить заключительный подблок для случая, когда все условия ложны.";
/** @export */ Blockly.Msg.CONTROLS_IF_HELPURL = "https://git.spacen.net/google/blockly/wiki/IfElse"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\".";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "иначе";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "иначе если";
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_IF = "если";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Если условие истинно, выполняет команды.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Если условие истинно, выполняет первый блок команд. Иначе выполняется второй блок команд.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Если первое условие истинно, то выполняет первый блок команд. Иначе, если второе условие истинно, выполняет второй блок команд.";
/** @export */ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Если первое условие истинно, то выполняет первый блок команд. В противном случае, если второе условие истинно, выполняет второй блок команд. Если ни одно из условий не истинно, выполняет последний блок команд.";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ru.wikipedia.org/wiki/Цикл_(программирование)";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "выполнить";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TITLE = "повторить %1 раз";
/** @export */ Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Выполняет некоторые команды несколько раз.";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://git.spacen.net/google/blockly/wiki/Loops#repeat"; // untranslated
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторять, пока не";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторять, пока";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Пока значение ложно, выполняет команды";
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Пока значение истинно, выполняет команды.";
/** @export */ Blockly.Msg.DELETE_ALL_BLOCKS = "Удалить все блоки (%1)?";
/** @export */ Blockly.Msg.DELETE_BLOCK = "Удалить блок";
/** @export */ Blockly.Msg.DELETE_VARIABLE = "Удалить переменную '%1'";
/** @export */ Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Удалить %1 использований переменной '%2'?";
/** @export */ Blockly.Msg.DELETE_X_BLOCKS = "Удалить %1 блоков";
/** @export */ Blockly.Msg.DISABLE_BLOCK = "Отключить блок";
/** @export */ Blockly.Msg.DUPLICATE_BLOCK = "Дублировать";
/** @export */ Blockly.Msg.ENABLE_BLOCK = "Включить блок";
/** @export */ Blockly.Msg.EXPAND_ALL = "Развернуть блоки";
/** @export */ Blockly.Msg.EXPAND_BLOCK = "Развернуть блок";
/** @export */ Blockly.Msg.EXTERNAL_INPUTS = "Вставки снаружи";
/** @export */ Blockly.Msg.HELP = "Справка";
/** @export */ Blockly.Msg.INLINE_INPUTS = "Вставки внутри";
/** @export */ Blockly.Msg.IOS_CANCEL = "Отмена";
/** @export */ Blockly.Msg.IOS_ERROR = "Ошибка";
/** @export */ Blockly.Msg.IOS_OK = "ОК";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = "+ Добавить входную переменную";
/** @export */ Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = "Разрешить операторы";
/** @export */ Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = "У этой функции есть дублирующиеся входные переменные.";
/** @export */ Blockly.Msg.IOS_PROCEDURES_INPUTS = "ВХОД";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = "Добавить";
/** @export */ Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = "+ Добавить переменную";
/** @export */ Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = "Удалить";
/** @export */ Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = "Вы не можете использовать пустое имя переменной.";
/** @export */ Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = "Переименовать";
/** @export */ Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = "Имя переменной";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-empty-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "создать пустой список";
/** @export */ Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Возвращает список длины 0, не содержащий данных";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "список";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Добавьте, удалите, переставьте элементы для переделки блока списка.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "создать список из";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Добавляет элемент к списку.";
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Создаёт список с любым числом элементов.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FIRST = "первый";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ с конца";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET = "взять";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "взять и удалить";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_LAST = "последний";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "произвольный";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_REMOVE = "удалить";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Возвращает первый элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Возвращает элемент в указанной позиции списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Возвращает последний элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Возвращает случайный элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Удаляет и возвращает первый элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Удаляет и возвращает элемент в указанной позиции списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Удаляет и возвращает последний элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Удаляет и возвращает случайный элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Удаляет первый элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Удаляет элемент в указанной позиции списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Удаляет последний элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Удаляет случайный элемент списка.";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "по № с конца";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "по №";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "по последний";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "взять подсписок с первого";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "взять подсписок сс конца";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "взять подсписок с №";
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Создаёт копию указанной части списка.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 - последний элемент.";
/** @export */ Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 - первый элемент.";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_FIRST = "найти первое вхождение элемента";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated
/** @export */ Blockly.Msg.LISTS_INDEX_OF_LAST = "найти последнее вхождение элемента";
/** @export */ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден.";
/** @export */ Blockly.Msg.LISTS_INLIST = "в списке";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#is-empty"; // untranslated
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пуст";
/** @export */ Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Возвращает значение истина, если список пуст.";
/** @export */ Blockly.Msg.LISTS_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#length-of"; // untranslated
/** @export */ Blockly.Msg.LISTS_LENGTH_TITLE = "длина %1";
/** @export */ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Возвращает длину списка.";
/** @export */ Blockly.Msg.LISTS_REPEAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#create-list-with"; // untranslated
/** @export */ Blockly.Msg.LISTS_REPEAT_TITLE = "создать список из элемента %1, повторяющегося %2 раз";
/** @export */ Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Создаёт список, состоящий из заданного числа копий элемента.";
/** @export */ Blockly.Msg.LISTS_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#reversing-a-list";
/** @export */ Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "изменить порядок на обратный %1";
/** @export */ Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Изменить порядок списка на обратный.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#in-list--set"; // untranslated
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "=";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INSERT = "вставить в";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_SET = "присвоить";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вставляет элемент в начало списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Вставляет элемент в указанной позиции списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Добавляет элемент в конец списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Вставляет элемент в случайное место в списке.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Присваивает значение первому элементу списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Присваивает значение элементу в указанной позиции списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Присваивает значение последнему элементу списка.";
/** @export */ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Присваивает значение случайному элементу списка.";
/** @export */ Blockly.Msg.LISTS_SORT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#sorting-a-list";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "по возрастанию";
/** @export */ Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "по убыванию";
/** @export */ Blockly.Msg.LISTS_SORT_TITLE = "сортировать %1 %2 %3";
/** @export */ Blockly.Msg.LISTS_SORT_TOOLTIP = "Сортировать копию списка.";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "по алфавиту, без учёта регистра";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "числовая";
/** @export */ Blockly.Msg.LISTS_SORT_TYPE_TEXT = "по алфавиту";
/** @export */ Blockly.Msg.LISTS_SPLIT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
/** @export */ Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "сделать список из текста";
/** @export */ Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "собрать текст из списка";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Соединяет список текстов в один текст с разделителями.";
/** @export */ Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Разбивает текст в список текстов, по разделителям.";
/** @export */ Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "с разделителем";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ложь";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#values"; // untranslated
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Возвращает значение истина или ложь.";
/** @export */ Blockly.Msg.LOGIC_BOOLEAN_TRUE = "истина";
/** @export */ Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ru.wikipedia.org/wiki/Неравенство";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Возвращает положительное значение, если вводы равны.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Возвращает значение истина, если первая вставка больше второй.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Возвращает значение истина, если первая вставка больше или равна второй.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Возвращает положительное значение, если первый ввод меньше второго.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Возвращает значение истина, если первая вставка меньше или равна второй.";
/** @export */ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Возвращает положительное значение, если вводы не равны.";
/** @export */ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#not"; // untranslated
/** @export */ Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1";
/** @export */ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Возвращает значение истина, если вставка ложна. Возвращает значение ложь, если вставка истинна.";
/** @export */ Blockly.Msg.LOGIC_NULL = "ничто";
/** @export */ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type";
/** @export */ Blockly.Msg.LOGIC_NULL_TOOLTIP = "Возвращает ничто.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_AND = "и";
/** @export */ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://git.spacen.net/google/blockly/wiki/Logic#logical-operations"; // untranslated
/** @export */ Blockly.Msg.LOGIC_OPERATION_OR = "или";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Возвращает значение истина, если обе вставки истинны.";
/** @export */ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Возвращает значение истина, если хотя бы одна из вставок истинна.";
/** @export */ Blockly.Msg.LOGIC_TERNARY_CONDITION = "выбрать по";
/** @export */ Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ru.wikipedia.org/wiki/Тернарная_условная_операция";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "если ложь";
/** @export */ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "если истина";
/** @export */ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Проверяет условие выбора. Если условие истинно, возвращает первое значение, в противном случае возвращает второе значение.";
/** @export */ Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated
/** @export */ Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ru.wikipedia.org/wiki/Арифметика";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Возвращает сумму двух чисел.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Возвращает частное от деления первого числа на второе.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Возвращает разность двух чисел.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Возвращает произведение двух чисел.";
/** @export */ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Возвращает первое число, возведённое в степень второго числа.";
/** @export */ Blockly.Msg.MATH_CHANGE_HELPURL = "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82";
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE = "увеличить %1 на %2";
/** @export */ Blockly.Msg.MATH_CHANGE_TOOLTIP = "Добавляет число к переменной '%1'.";
/** @export */ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ru.wikipedia.org/wiki/Математическая_константа";
/** @export */ Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Возвращает одну из распространённых констант: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (бесконечность).";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничить %1 снизу %2 сверху %3";
/** @export */ Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничивает число нижней и верхней границами (включительно).";
/** @export */ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated
/** @export */ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "делится на";
/** @export */ Blockly.Msg.MATH_IS_EVEN = "чётное";
/** @export */ Blockly.Msg.MATH_IS_NEGATIVE = "отрицательное";
/** @export */ Blockly.Msg.MATH_IS_ODD = "нечётное";
/** @export */ Blockly.Msg.MATH_IS_POSITIVE = "положительное";
/** @export */ Blockly.Msg.MATH_IS_PRIME = "простое";
/** @export */ Blockly.Msg.MATH_IS_TOOLTIP = "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь.";
/** @export */ Blockly.Msg.MATH_IS_WHOLE = "целое";
/** @export */ Blockly.Msg.MATH_MODULO_HELPURL = "https://ru.wikipedia.org/wiki/Деление_с_остатком";
/** @export */ Blockly.Msg.MATH_MODULO_TITLE = "остаток от %1 : %2";
/** @export */ Blockly.Msg.MATH_MODULO_TOOLTIP = "Возвращает остаток от деления двух чисел.";
/** @export */ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated
/** @export */ Blockly.Msg.MATH_NUMBER_HELPURL = "https://ru.wikipedia.org/wiki/Число";
/** @export */ Blockly.Msg.MATH_NUMBER_TOOLTIP = "Число.";
/** @export */ Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "среднее арифметическое списка";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "наибольшее в списке";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медиана списка";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "наименьшее в списке";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "моды списка";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случайный элемент списка";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартное отклонение списка";
/** @export */ Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумма списка";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Возвращает среднее арифметическое списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Возвращает наибольшее число списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Возвращает медиану списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Возвращает наименьшее число списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Возвращает список наиболее часто встречающихся элементов списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Возвращает случайный элемент списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Возвращает стандартное отклонение списка.";
/** @export */ Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Возвращает сумму всех чисел в списке.";
/** @export */ Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "случайное число от 0 (включительно) до 1";
/** @export */ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Возвращает случайное число от 0.0 (включительно) до 1.0.";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TITLE = "случайное целое число от %1 для %2";
/** @export */ Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Возвращает случайное число между двумя заданными пределами (включая и их).";
/** @export */ Blockly.Msg.MATH_ROUND_HELPURL = "https://ru.wikipedia.org/wiki/Округление";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "округлить";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "округлить к меньшему";
/** @export */ Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "округлить к большему";
/** @export */ Blockly.Msg.MATH_ROUND_TOOLTIP = "Округляет число до большего или меньшего.";
/** @export */ Blockly.Msg.MATH_SINGLE_HELPURL = "https://ru.wikipedia.org/wiki/Квадратный_корень";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль";
/** @export */ Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратный корень";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Возвращает модуль числа";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Возвращает е в указанной степени.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Возвращает натуральный логарифм числа.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Возвращает десятичный логарифм числа.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Возвращает противоположное число.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Возвращает 10 в указанной степени.";
/** @export */ Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Возвращает квадратный корень числа.";
/** @export */ Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_HELPURL = "https://ru.wikipedia.org/wiki/Тригонометрическиеункции";
/** @export */ Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Возвращает арккосинус (в градусах).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Возвращает арксинус (в градусах).";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Возвращает арктангенс (в градусах)";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Возвращает косинус угла в градусах.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Возвращает синус угла в градусах.";
/** @export */ Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Возвращает тангенс угла в градусах.";
/** @export */ Blockly.Msg.NEW_VARIABLE = "Создать переменную…";
/** @export */ Blockly.Msg.NEW_VARIABLE_TITLE = "Имя новой переменной:";
/** @export */ Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "разрешить операторы";
/** @export */ Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "с:";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ru.wikipedia.org/wiki/Подпрограмма";
/** @export */ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1'.";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ru.wikipedia.org/wiki/Подпрограмма";
/** @export */ Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение.";
/** @export */ Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "с:";
/** @export */ Blockly.Msg.PROCEDURES_CREATE_DO = "Создать вызов '%1'";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишите эту функцию…";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "выполнить что-то";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "чтобы";
/** @export */ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Создаёт процедуру, не возвращающую значение.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вернуть";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Создаёт процедуру, возвращающую значение.";
/** @export */ Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: эта функция имеет повторяющиеся параметры.";
/** @export */ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Выделить определение процедуры";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Если первое значение истинно, возвращает второе значение.";
/** @export */ Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Этот блок может использоваться только внутри определения функции.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "имя параметра:";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавить входной параметр в функцию.";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "параметры";
/** @export */ Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добавить, удалить или изменить порядок входных параметров для этой функции.";
/** @export */ Blockly.Msg.REDO = "Повторить";
/** @export */ Blockly.Msg.REMOVE_COMMENT = "Удалить комментарий";
/** @export */ Blockly.Msg.RENAME_VARIABLE = "Переименовать переменную…";
/** @export */ Blockly.Msg.RENAME_VARIABLE_TITLE = "Переименовать все переменные '%1' в:";
/** @export */ Blockly.Msg.TEXT_APPEND_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_APPEND_TITLE = "к %1 добавить текст %2";
/** @export */ Blockly.Msg.TEXT_APPEND_TOOLTIP = "Добавить текст к переменной «%1».";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#adjusting-text-case"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "в строчные буквы";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "в Заглавные Начальные Буквы";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "в ЗАГЛАВНЫЕ БУКВЫ";
/** @export */ Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Возвращает копию текста с ЗАГЛАВНЫМИ или строчными буквами.";
/** @export */ Blockly.Msg.TEXT_CHARAT_FIRST = "взять первую букву";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_END = "взять букву № с конца";
/** @export */ Blockly.Msg.TEXT_CHARAT_FROM_START = "взять букву №";
/** @export */ Blockly.Msg.TEXT_CHARAT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_LAST = "взять последнюю букву";
/** @export */ Blockly.Msg.TEXT_CHARAT_RANDOM = "взять случайную букву";
/** @export */ Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_CHARAT_TITLE = "в тексте %1 %2";
/** @export */ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Возвращает букву в указанной позиции.";
/** @export */ Blockly.Msg.TEXT_COUNT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#counting-substrings";
/** @export */ Blockly.Msg.TEXT_COUNT_MESSAGE0 = "подсчитать количество %1 в %2";
/** @export */ Blockly.Msg.TEXT_COUNT_TOOLTIP = "Подсчитать, сколько раз отрывок текста появляется в другом тексте.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Добавить элемент к тексту.";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "соединить";
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки текстового блока.";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "по букву № с конца";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "по букву №";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "по последнюю букву";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "в тексте";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "взять подстроку с первой буквы";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "взять подстроку с буквы № с конца";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "взять подстроку с буквы №";
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated
/** @export */ Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Возвращает указанную часть текста.";
/** @export */ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#finding-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "найти первое вхождение текста";
/** @export */ Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "найти последнее вхождение текста";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TITLE = "в тексте %1 %2 %3";
/** @export */ Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден.";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пуст";
/** @export */ Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Возвращает значение истина, если предоставленный текст пуст.";
/** @export */ Blockly.Msg.TEXT_JOIN_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-creation"; // untranslated
/** @export */ Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "создать текст из";
/** @export */ Blockly.Msg.TEXT_JOIN_TOOLTIP = "Создаёт фрагмент текста, объединяя любое число элементов";
/** @export */ Blockly.Msg.TEXT_LENGTH_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#text-modification"; // untranslated
/** @export */ Blockly.Msg.TEXT_LENGTH_TITLE = "длина %1";
/** @export */ Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Возвращает число символов (включая пробелы) в заданном тексте.";
/** @export */ Blockly.Msg.TEXT_PRINT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#printing-text"; // untranslated
/** @export */ Blockly.Msg.TEXT_PRINT_TITLE = "напечатать %1";
/** @export */ Blockly.Msg.TEXT_PRINT_TOOLTIP = "Печатает текст, число или другой объект.";
/** @export */ Blockly.Msg.TEXT_PROMPT_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запросить у пользователя число.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запросить у пользователя текст.";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запросить число с подсказкой";
/** @export */ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запросить текст с подсказкой";
/** @export */ Blockly.Msg.TEXT_REPLACE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#replacing-substrings";
/** @export */ Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "заменить %1 на %2 в %3";
/** @export */ Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Заменить все вхождения некоторого текста другим текстом.";
/** @export */ Blockly.Msg.TEXT_REVERSE_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#reversing-text";
/** @export */ Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "изменить порядок на обратный %1";
/** @export */ Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Меняет порядок символов в тексте на обратный.";
/** @export */ Blockly.Msg.TEXT_TEXT_HELPURL = "https://ru.wikipedia.org/wiki/Строковый_тип";
/** @export */ Blockly.Msg.TEXT_TEXT_TOOLTIP = "Буква, слово или строка текста.";
/** @export */ Blockly.Msg.TEXT_TRIM_HELPURL = "https://git.spacen.net/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "обрезать пробелы с двух сторон";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "обрезать пробелы слева";
/** @export */ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "обрезать пробелы справа";
/** @export */ Blockly.Msg.TEXT_TRIM_TOOLTIP = "Возвращает копию текста с пробелами, удалёнными с одного или обоих концов.";
/** @export */ Blockly.Msg.TODAY = "Сегодня";
/** @export */ Blockly.Msg.UNDO = "Отменить";
/** @export */ Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент";
/** @export */ Blockly.Msg.VARIABLES_GET_CREATE_SET = "Создать блок \"присвоить\" для %1";
/** @export */ Blockly.Msg.VARIABLES_GET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#get"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_GET_TOOLTIP = "Возвращает значение этой переменной.";
/** @export */ Blockly.Msg.VARIABLES_SET = "присвоить %1 = %2";
/** @export */ Blockly.Msg.VARIABLES_SET_CREATE_GET = "Создать вставку %1";
/** @export */ Blockly.Msg.VARIABLES_SET_HELPURL = "https://git.spacen.net/google/blockly/wiki/Variables#set"; // untranslated
/** @export */ Blockly.Msg.VARIABLES_SET_TOOLTIP = "Присваивает переменной значение вставки.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Переменная с именем '%1' уже существует.";
/** @export */ Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = "Название переменной '%1' уже используется другой переменной типа '%2'.";
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE;
/** @export */ Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF;
/** @export */ Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE;
/** @export */ Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO;
/** @export */ Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF;
/** @export */ Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL;
/** @export */ Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO;
/** @export */ Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME;
/** @export */ Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST;
/** @export */ Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT;
/** @export */ Blockly.Msg.MATH_HUE = "230";
/** @export */ Blockly.Msg.LOOPS_HUE = "120";
/** @export */ Blockly.Msg.LISTS_HUE = "260";
/** @export */ Blockly.Msg.LOGIC_HUE = "210";
/** @export */ Blockly.Msg.VARIABLES_HUE = "330";
/** @export */ Blockly.Msg.TEXTS_HUE = "160";
/** @export */ Blockly.Msg.PROCEDURES_HUE = "290";
/** @export */ Blockly.Msg.COLOUR_HUE = "20";

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,208 @@
'use strict';
goog.provide('Blockly.JavaScript.Action');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Action');
Blockly.Action = {
HUE: 330,
blocks: {}
};
// --- action exec --------------------------------------------------
Blockly.Action.blocks['exec'] =
'<block type="exec">'
+ ' <value name="COMMAND">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">text</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="LOG">'
+ ' </value>'
+ ' <value name="WITH_STATEMENT">'
+ ' </value>'
+ ' <mutation with_statement="false"></mutation>'
+ '</block>';
Blockly.Blocks['exec'] = {
init: function() {
this.appendDummyInput('TEXT')
.appendField(Blockly.Words['exec'][systemLang]);
this.appendValueInput('COMMAND')
.appendField(Blockly.Words['exec_command'][systemLang]);
this.appendDummyInput('WITH_STATEMENT')
.appendField(Blockly.Words['exec_statement'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function (option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_STATEMENT');
this.appendDummyInput('LOG')
.appendField(Blockly.Words['exec_log'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['exec_log_none'][systemLang], ''],
[Blockly.Words['exec_log_info'][systemLang], 'log'],
[Blockly.Words['exec_log_debug'][systemLang], 'debug'],
[Blockly.Words['exec_log_warn'][systemLang], 'warn'],
[Blockly.Words['exec_log_error'][systemLang], 'error']
]), 'LOG');
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.Action.HUE);
this.setTooltip(Blockly.Words['exec_tooltip'][systemLang]);
this.setHelpUrl(getHelp('exec_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('with_statement', this.getFieldValue('WITH_STATEMENT') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('with_statement') == 'true');
},
updateShape_: function(withStatement) {
// Add or remove a statement Input.
var inputExists = this.getInput('STATEMENT');
if (withStatement) {
if (!inputExists) {
this.appendStatementInput('STATEMENT');
}
} else if (inputExists) {
this.removeInput('STATEMENT');
}
}
};
Blockly.JavaScript['exec'] = function(block) {
var logLevel = block.getFieldValue('LOG');
var value_command = Blockly.JavaScript.valueToCode(block, 'COMMAND', Blockly.JavaScript.ORDER_ATOMIC);
var withStatement = block.getFieldValue('WITH_STATEMENT');
var logText;
if (logLevel) {
logText = 'console.' + logLevel + '("exec: " + ' + value_command + ');\n'
} else {
logText = '';
}
if (withStatement === 'TRUE') {
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
if (statement) {
return 'exec(' + value_command + ', function (error, result, stderr) {\n ' + statement + '});\n' +
logText;
} else {
return 'exec(' + value_command + ');\n' +
logText;
}
} else {
return 'exec(' + value_command + ');\n' +
logText;
}
};
// --- action request --------------------------------------------------
Blockly.Action.blocks['request'] =
'<block type="request">'
+ ' <value name="URL">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">text</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="LOG">'
+ ' </value>'
+ ' <value name="WITH_STATEMENT">'
+ ' </value>'
+ ' <mutation with_statement="false"></mutation>'
+ '</block>';
Blockly.Blocks['request'] = {
init: function() {
this.appendDummyInput('TEXT')
.appendField(Blockly.Words['request'][systemLang]);
this.appendValueInput('URL')
.appendField(Blockly.Words['request_url'][systemLang]);
this.appendDummyInput('WITH_STATEMENT')
.appendField(Blockly.Words['request_statement'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function (option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_STATEMENT');
this.appendDummyInput('LOG')
.appendField(Blockly.Words['request_log'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['request_log_none'][systemLang], ''],
[Blockly.Words['request_log_info'][systemLang], 'log'],
[Blockly.Words['request_log_debug'][systemLang], 'debug'],
[Blockly.Words['request_log_warn'][systemLang], 'warn'],
[Blockly.Words['request_log_error'][systemLang], 'error']
]), 'LOG');
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.Action.HUE);
this.setTooltip(Blockly.Words['request_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['request_help'][systemLang]);
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('with_statement', this.getFieldValue('WITH_STATEMENT') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('with_statement') == 'true');
},
updateShape_: function(withStatement) {
// Add or remove a statement Input.
var inputExists = this.getInput('STATEMENT');
if (withStatement) {
if (!inputExists) {
this.appendStatementInput('STATEMENT');
}
} else if (inputExists) {
this.removeInput('STATEMENT');
}
}
};
Blockly.JavaScript['request'] = function(block) {
var logLevel = block.getFieldValue('LOG');
var URL = Blockly.JavaScript.valueToCode(block, 'URL', Blockly.JavaScript.ORDER_ATOMIC);
var withStatement = block.getFieldValue('WITH_STATEMENT');
var logText;
if (logLevel) {
logText = 'console.' + logLevel + '("request: " + ' + URL + ');\n'
} else {
logText = '';
}
if (withStatement === 'TRUE') {
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
if (statement) {
return 'try {\n require("request")(' + URL + ', function (error, response, result) {\n ' + statement + ' }).on("error", function (e) {console.error(e);});\n} catch (e) { console.error(e); }\n' +
logText;
} else {
return 'try {\n require("request")(' + URL + ').on("error", function (e) {console.error(e);});\n} catch (e) { console.error(e); }\n' +
logText;
}
} else {
return 'try {\n require("request")(' + URL + ').on("error", function (e) {console.error(e);});\n} catch (e) { console.error(e); }\n' +
logText;
}
};

View File

@ -0,0 +1,336 @@
'use strict';
goog.provide('Blockly.JavaScript.Convert');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Convert');
Blockly.Convert = {
HUE: 280,
blocks: {}
};
Blockly.Blocks.Convert = {};
Blockly.JavaScript.Convert = {};
// --- to Number --------------------------------------------------
Blockly.Convert.blocks['convert_tonumber'] =
'<block type="convert_tonumber">'
+ ' <value name="VALUE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_tonumber = {
init: function () {
this.setColour(Blockly.Convert.HUE);
this.appendValueInput("VALUE")
.appendField(Blockly.Words['convert_tonumber'][systemLang]);
this.setOutput(true, "Number");
this.setTooltip(Blockly.Words['convert_tonumber_tooltip'][systemLang]);
}
};
Blockly.JavaScript.convert_tonumber = function (a) {
return ["parseFloat(" + Blockly.JavaScript.valueToCode(a, "VALUE", Blockly.JavaScript.ORDER_ATOMIC) + ")", Blockly.JavaScript.ORDER_ATOMIC];
};
// --- to Boolean --------------------------------------------------
Blockly.Convert.blocks['convert_toboolean'] =
'<block type="convert_toboolean">'
+ ' <value name="VALUE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_toboolean = {
init: function () {
this.setColour(Blockly.Convert.HUE);
this.appendValueInput("VALUE").appendField(Blockly.Words['convert_toboolean'][systemLang]);
this.setOutput(true, "Boolean");
this.setTooltip(Blockly.Words['convert_toboolean_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_toboolean = function (a) {
return ["(function (){var val = " + Blockly.JavaScript.valueToCode(a, "VALUE", Blockly.JavaScript.ORDER_ATOMIC) + "; if (val === 'true') return true; if (val === 'false') return false; return !!val;})()", Blockly.JavaScript.ORDER_ATOMIC];
};
// --- to String --------------------------------------------------
Blockly.Convert.blocks['convert_tostring'] =
'<block type="convert_tostring">'
+ ' <value name="VALUE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_tostring = {
init: function () {
this.setColour(Blockly.Convert.HUE);
this.appendValueInput("VALUE").appendField(Blockly.Words['convert_tostring'][systemLang]);
this.setOutput(true, "String");
this.setTooltip(Blockly.Words['convert_tostring_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_tostring = function (a) {
return ["('' + " + Blockly.JavaScript.valueToCode(a, "VALUE", Blockly.JavaScript.ORDER_ATOMIC) + ")", Blockly.JavaScript.ORDER_ATOMIC];
};
// --- get type --------------------------------------------------
Blockly.Convert.blocks['convert_type'] =
'<block type="convert_type">'
+ ' <value name="ITEM">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_type = {
init: function () {
this.setColour(Blockly.Convert.HUE);
this.appendValueInput('ITEM')
.appendField(Blockly.Words['convert_type'][systemLang]);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['convert_type_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_type = function (a) {
return ['typeof ' + Blockly.JavaScript.valueToCode(a, 'ITEM', Blockly.JavaScript.ORDER_ATOMIC), Blockly.JavaScript.ORDER_ATOMIC];
};
// --- to Date --------------------------------------------------
Blockly.Convert.blocks['convert_to_date'] =
'<block type="convert_to_date">'
+ ' <value name="VALUE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_to_date = {
init: function () {
this.appendValueInput('VALUE')
.appendField(Blockly.Words['convert_to_date'][systemLang]);
this.setColour(Blockly.Convert.HUE);
this.setOutput(true, 'Date');
this.setTooltip(Blockly.Words['convert_to_date_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_to_date = function (a) {
return ['getDateObject(' + Blockly.JavaScript.valueToCode(a, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC) + ').getTime()', Blockly.JavaScript.ORDER_ATOMIC];
};
// --- from Date --------------------------------------------------
Blockly.Convert.blocks['convert_from_date'] =
'<block type="convert_from_date">'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="OPTION">'
+ ' </value>'
+ ' <mutation format="false" language="false"></mutation>'
+ ' <value name="FORMAT">'
+ ' </value>'
+ ' <value name="LANGUAGE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_from_date = {
init: function () {
this.setColour(Blockly.Convert.HUE);
this.appendValueInput('VALUE')
.appendField(Blockly.Words['convert_from_date'][systemLang]);
this.appendDummyInput('OPTION')
.appendField(Blockly.Words['convert_to'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['time_get_object'][systemLang] , 'object'],
[Blockly.Words['time_get_ms'][systemLang] , 'ms'],
[Blockly.Words['time_get_s'][systemLang] , 's'],
[Blockly.Words['time_get_sid'][systemLang] , 'sid'],
[Blockly.Words['time_get_m'][systemLang] , 'm'],
[Blockly.Words['time_get_mid'][systemLang] , 'mid'],
[Blockly.Words['time_get_h'][systemLang] , 'h'],
[Blockly.Words['time_get_d'][systemLang] , 'd'],
[Blockly.Words['time_get_M'][systemLang] , 'M'],
[Blockly.Words['time_get_Mt'][systemLang] , 'Mt'],
[Blockly.Words['time_get_Mts'][systemLang] , 'Mts'],
[Blockly.Words['time_get_y'][systemLang] , 'y'],
[Blockly.Words['time_get_fy'][systemLang] , 'fy'],
[Blockly.Words['time_get_wdt'][systemLang] , 'wdt'],
[Blockly.Words['time_get_wdts'][systemLang] , 'wdts'],
[Blockly.Words['time_get_wd'][systemLang] , 'wd'],
[Blockly.Words['time_get_custom'][systemLang] , 'custom'],
[Blockly.Words['time_get_yyyy.mm.dd'][systemLang] , [Blockly.Words['time_get_yyyy.mm.dd'] .format]],
[Blockly.Words['time_get_yyyy/mm/dd'][systemLang] , [Blockly.Words['time_get_yyyy/mm/dd'] .format]],
[Blockly.Words['time_get_yy.mm.dd'][systemLang] , [Blockly.Words['time_get_yy.mm.dd'] .format]],
[Blockly.Words['time_get_yy/mm/dd'][systemLang] , [Blockly.Words['time_get_yy/mm/dd'] .format]],
[Blockly.Words['time_get_dd.mm.yyyy'][systemLang] , [Blockly.Words['time_get_dd.mm.yyyy'] .format]],
[Blockly.Words['time_get_dd/mm/yyyy'][systemLang] , [Blockly.Words['time_get_dd/mm/yyyy'] .format]],
[Blockly.Words['time_get_dd.mm.yy'][systemLang] , [Blockly.Words['time_get_dd.mm.yy'] .format]],
[Blockly.Words['time_get_dd/mm/yy'][systemLang] , [Blockly.Words['time_get_dd/mm/yy'] .format]],
[Blockly.Words['time_get_mm/dd/yyyy'][systemLang] , [Blockly.Words['time_get_mm/dd/yyyy'] .format]],
[Blockly.Words['time_get_mm/dd/yy'][systemLang] , [Blockly.Words['time_get_mm/dd/yy'] .format]],
[Blockly.Words['time_get_dd.mm'][systemLang] , [Blockly.Words['time_get_dd.mm'] .format]],
[Blockly.Words['time_get_dd/mm'][systemLang] , [Blockly.Words['time_get_dd/mm'] .format]],
[Blockly.Words['time_get_mm.dd'][systemLang] , [Blockly.Words['time_get_mm.dd'] .format]],
[Blockly.Words['time_get_mm/dd'][systemLang] , [Blockly.Words['time_get_mm/dd'] .format]],
[Blockly.Words['time_get_hh_mm'][systemLang] , [Blockly.Words['time_get_hh_mm'] .format]],
[Blockly.Words['time_get_hh_mm_ss'][systemLang] , [Blockly.Words['time_get_hh_mm_ss'] .format]],
[Blockly.Words['time_get_hh_mm_ss.sss'][systemLang] , [Blockly.Words['time_get_hh_mm_ss.sss'].format]]
], function (option) {
this.sourceBlock_.updateShape_(option === 'custom', option === 'wdts' || option === 'wdt' || option === 'Mt' || option === 'Mts');
}), 'OPTION');
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Words['convert_from_date_tooltip'][systemLang])
},
mutationToDom: function() {
var container = document.createElement('mutation');
var option = this.getFieldValue('OPTION');
container.setAttribute('format', option === 'custom' ? 'true' : 'false');
container.setAttribute('language', option === 'wdt' || option === 'wdts' || option === 'Mt' || option === 'Mts' ? 'true' : 'false');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('format') === 'true', xmlElement.getAttribute('language') === 'true');
},
updateShape_: function(isFormat, isLanguage) {
// Add or remove a delay Input.
var inputExists = this.getInput('FORMAT');
if (isFormat) {
if (!inputExists) {
this.appendDummyInput('FORMAT')
.appendField(' ')
.appendField(new Blockly.FieldTextInput(Blockly.Words['time_get_default_format'][systemLang]), 'FORMAT');
}
} else if (inputExists) {
this.removeInput('FORMAT');
}
inputExists = this.getInput('LANGUAGE');
if (isLanguage) {
if (!inputExists) {
var languages;
if (systemLang === 'en') {
languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
} else if (systemLang === 'de') {
languages = [['auf deutsch', 'de'], ['in english', 'en'], ['на русском', 'ru']];
} else if (systemLang === 'ru') {
languages = [['на русском', 'ru'], ['in english', 'en'], ['auf deutsch', 'de']];
} else {
languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
}
this.appendDummyInput('LANGUAGE')
.appendField(new Blockly.FieldDropdown(languages), 'LANGUAGE');
}
} else if (inputExists) {
this.removeInput('LANGUAGE');
}
}
};
Blockly.JavaScript.convert_from_date = function (block) {
var option = block.getFieldValue('OPTION');
var format = block.getFieldValue('FORMAT');
var lang = block.getFieldValue('LANGUAGE');
var value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var code;
if (option === 'object') {
code = 'getDateObject(' + value + ').getTime()';
} else if (option === 'ms') {
code = 'getDateObject(' + value + ').getMilliseconds()';
} else if (option === 's') {
code = 'getDateObject(' + value + ').getSeconds()';
} else if (option === 'sid') {
code = '(function () {var v = getDateObject(' + value + '); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})()';
} else if (option === 'm') {
code = '(getDateObject(' + value + ').getMinutes())';
} else if (option === 'mid') {
code = '(function () {var v = getDateObject(' + value + '); return v.getHours() * 60 + v.getMinutes();})()';
} else if (option === 'h') {
code = 'getDateObject(' + value + ').getHours()';
} else if (option === 'd') {
code = 'getDateObject(' + value + ').getDate()';
} else if (option === 'M') {
code = '(getDateObject(' + value + ').getMonth() + 1)';
} else if (option === 'Mt') {
code = 'formatDate(getDateObject(' + value + '), "OO", "' + lang + '")';
} else if (option === 'Mts') {
code = 'formatDate(getDateObject(' + value + '), "O", "' + lang + '")';
} else if (option === 'y') {
code = 'getDateObject(' + value + ').getYear()';
} else if (option === 'fy') {
code = 'getDateObject(' + value + ').getFullYear()';
} else if (option === 'wdt') {
code = 'formatDate(getDateObject(' + value + ').getDay(), "WW", "' + lang + '")';
} else if (option === 'wdts') {
code = 'formatDate(getDateObject(' + value + ').getDay(), "W", "' + lang + '")';
} else if (option === 'wd') {
code = 'getDateObject(' + value + ').getDay()';
} else if (option === 'custom') {
code = 'formatDate(getDateObject(' + value + '), "' + format + '")';
} else {
code = 'formatDate(getDateObject(' + value + '), "' + option + '")';
}
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
// --- json2object --------------------------------------------------
Blockly.Convert.blocks['convert_json2object'] =
'<block type="convert_json2object">'
+ ' <value name="VALUE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_json2object = {
init: function () {
this.appendValueInput('VALUE')
.appendField(Blockly.Words['convert_json2object'][systemLang]);
this.setColour(Blockly.Convert.HUE);
this.setOutput(true);
this.setTooltip(Blockly.Words['convert_json2object_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_json2object = function (a) {
return ['(function () { try {return JSON.parse(' + Blockly.JavaScript.valueToCode(a, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC) + ');} catch(e) {return {};}})()', Blockly.JavaScript.ORDER_ATOMIC];
};
// --- object2json --------------------------------------------------
Blockly.Convert.blocks['convert_object2json'] =
'<block type="convert_object2json">'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="PRETTIFY">'
+ ' </value>'
+ '</block>';
Blockly.Blocks.convert_object2json = {
init: function () {
this.appendValueInput('VALUE')
.appendField(Blockly.Words['convert_object2json'][systemLang]);
this.appendDummyInput('PRETTIFY')
.appendField(Blockly.Words['convert_object2json_prettify'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE'), 'PRETTIFY');
this.setColour(Blockly.Convert.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['convert_object2json_tooltip'][systemLang])
}
};
Blockly.JavaScript.convert_object2json = function (block) {
var prettify = block.getFieldValue('PRETTIFY');
return ['JSON.stringify(' + Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC) + (prettify == 'TRUE' ? ', null, 2' : '') + ')', Blockly.JavaScript.ORDER_ATOMIC];
};

View File

@ -0,0 +1,337 @@
if (Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.indexOf('procedures_defcustomreturn') === -1) {
Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('procedures_defcustomreturn');
}
if (Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.indexOf('procedures_defcustomnoreturn') === -1) {
Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('procedures_defcustomnoreturn');
}
// derived from core/procedures.js
/**
* Find all user-created procedure definitions in a workspace.
* @param {!Blockly.Workspace} root Root workspace.
* @return {!Array.<!Array.<!Array>>} Pair of arrays, the
* first contains procedures without return variables, the second with.
* Each procedure is defined by a three-element list of name, parameter
* list, and return value boolean.
*/
Blockly.Procedures.allProcedures = function(root) {
var blocks = root.getAllBlocks();
var proceduresReturn = [];
var proceduresNoReturn = [];
var proceduresCustomReturn = [];
var proceduresCustomNoReturn = [];
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].getProcedureDef) {
var tuple = blocks[i].getProcedureDef();
if (tuple) {
if (tuple[3]) {
if (tuple[2]) {
proceduresCustomReturn.push(tuple);
} else {
proceduresCustomNoReturn.push(tuple);
}
} else {
if (tuple[2]) {
proceduresReturn.push(tuple);
} else {
proceduresNoReturn.push(tuple);
}
}
}
}
}
proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_);
proceduresReturn.sort(Blockly.Procedures.procTupleComparator_);
return [proceduresNoReturn, proceduresReturn, proceduresCustomNoReturn, proceduresCustomReturn];
};
/**
* Construct the blocks required by the flyout for the procedure category.
* @param {!Blockly.Workspace} workspace The workspace contianing procedures.
* @return {!Array.<!Element>} Array of XML block elements.
*/
Blockly.Procedures.flyoutCategory = function(workspace) {
var xmlList = [];
var block;
if (Blockly.Blocks['procedures_defnoreturn']) {
// <block type="procedures_defnoreturn" gap="16"></block>
block = goog.dom.createDom('block');
block.setAttribute('type', 'procedures_defnoreturn');
block.setAttribute('gap', 16);
xmlList.push(block);
}
if (Blockly.Blocks['procedures_defreturn']) {
// <block type="procedures_defreturn" gap="16"></block>
block = goog.dom.createDom('block');
block.setAttribute('type', 'procedures_defreturn');
block.setAttribute('gap', 16);
xmlList.push(block);
}
if (Blockly.Blocks['procedures_ifreturn']) {
// <block type="procedures_ifreturn" gap="16"></block>
block = goog.dom.createDom('block');
block.setAttribute('type', 'procedures_ifreturn');
block.setAttribute('gap', 16);
xmlList.push(block);
}
if (Blockly.Blocks['procedures_defcustomnoreturn']) {
// <block type="procedures_defnoreturn" gap="16"></block>
block = goog.dom.createDom('block');
block.setAttribute('type', 'procedures_defcustomnoreturn');
block.setAttribute('gap', 16);
xmlList.push(block);
}
if (Blockly.Blocks['procedures_defcustomreturn']) {
// <block type="procedures_defnoreturn" gap="16"></block>
block = goog.dom.createDom('block');
block.setAttribute('type', 'procedures_defcustomreturn');
block.setAttribute('gap', 16);
xmlList.push(block);
}
if (xmlList.length) {
// Add slightly larger gap between system blocks and user calls.
xmlList[xmlList.length - 1].setAttribute('gap', 24);
}
function populateProcedures(procedureList, templateName) {
for (var i = 0; i < procedureList.length; i++) {
var name = procedureList[i][0];
var args = procedureList[i][1];
// <block type="procedures_callnoreturn" gap="16">
// <mutation name="do something">
// <arg name="x"></arg>
// </mutation>
// </block>
var block = goog.dom.createDom('block');
block.setAttribute('type', templateName);
block.setAttribute('gap', 16);
var mutation = goog.dom.createDom('mutation');
mutation.setAttribute('name', name);
block.appendChild(mutation);
for (var j = 0; j < args.length; j++) {
var arg = goog.dom.createDom('arg');
arg.setAttribute('name', args[j]);
mutation.appendChild(arg);
}
xmlList.push(block);
}
}
var tuple = Blockly.Procedures.allProcedures(workspace);
populateProcedures(tuple[0], 'procedures_callnoreturn');
populateProcedures(tuple[1], 'procedures_callreturn');
populateProcedures(tuple[2], 'procedures_callcustomnoreturn');
populateProcedures(tuple[3], 'procedures_callcustomreturn');
return xmlList;
};
// ---------------------- custom function with return ------------------------------
Blockly.Words['procedures_defcustomreturn_name'] = {'en': 'JS function with return', 'de': 'JS-Funktion mit Ergebnis', 'ru': 'JS функция с результатом'};
Blockly.Blocks['procedures_defcustomreturn'] = {
/**
* Block for defining a procedure with a return value.
* @this Blockly.Block
*/
init: function() {
var nameField = new Blockly.FieldTextInput(
Blockly.Words['procedures_defcustomreturn_name'][systemLang],
Blockly.Procedures.rename);
nameField.setSpellcheck(false);
this.appendDummyInput()
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE)
.appendField(nameField, 'NAME')
.appendField('', 'PARAMS');
this.appendDummyInput('SCRIPT')
.appendField(new Blockly.FieldScript(btoa('return 0;')), 'SCRIPT');
this.setMutator(new Blockly.Mutator(['procedures_mutatorarg']));
if (Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT) {
this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);
}
this.setInputsInline(true);
this.setColour(Blockly.Blocks.procedures.HUE);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP);
this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL);
this.arguments_ = [];
this.setStatements_(false);
this.statementConnection_ = null;
},
setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
updateParams_: Blockly.Blocks['procedures_defreturn'].updateParams_,
mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_defreturn'].domToMutation,
/**
* Populate the mutator's dialog with this block's components.
* @param {!Blockly.Workspace} workspace Mutator's workspace.
* @return {!Blockly.Block} Root block in mutator.
* @this Blockly.Block
*/
decompose: function(workspace) {
var containerBlock = workspace.newBlock('procedures_mutatorcontainer');
containerBlock.initSvg();
// Check/uncheck the allow statement box.
containerBlock.getInput('STATEMENT_INPUT').setVisible(false);
// Parameter list.
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.arguments_.length; i++) {
var paramBlock = workspace.newBlock('procedures_mutatorarg');
paramBlock.initSvg();
paramBlock.setFieldValue(this.arguments_[i], 'NAME');
// Store the old location.
paramBlock.oldLocation = i;
connection.connect(paramBlock.previousConnection);
connection = paramBlock.nextConnection;
}
// Initialize procedure's callers with blank IDs.
Blockly.Procedures.mutateCallers(this);
return containerBlock;
},
/**
* Reconfigure this block based on the mutator dialog's components.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
compose: function(containerBlock) {
// Parameter list.
this.arguments_ = [];
this.paramIds_ = [];
var paramBlock = containerBlock.getInputTargetBlock('STACK');
while (paramBlock) {
this.arguments_.push(paramBlock.getFieldValue('NAME'));
this.paramIds_.push(paramBlock.id);
paramBlock = paramBlock.nextConnection &&
paramBlock.nextConnection.targetBlock();
}
this.updateParams_();
Blockly.Procedures.mutateCallers(this);
},
/**
* Return the signature of this procedure definition.
* @return {!Array} Tuple containing three elements:
* - the name of the defined procedure,
* - a list of all its arguments,
* - that it DOES NOT have a return value.
* @this Blockly.Block
*/
getProcedureDef: function() {
return [this.getFieldValue('NAME'), this.arguments_, true, true];
},
getVars: Blockly.Blocks['procedures_defreturn'].getVars,
renameVar: Blockly.Blocks['procedures_defreturn'].renameVar,
customContextMenu: Blockly.Blocks['procedures_defreturn'].customContextMenu,
callType_: 'procedures_callcustomreturn'
};
Blockly.JavaScript['procedures_defcustomreturn'] = function(block) {
// Define a procedure with a return value.
var funcName = Blockly.JavaScript.variableDB_.getName(block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
var args = [];
for (var i = 0; i < block.arguments_.length; i++) {
args[i] = Blockly.JavaScript.variableDB_.getName(block.arguments_[i], Blockly.Variables.NAME_TYPE);
}
var script = atob(block.getFieldValue('SCRIPT'));
var lines = script.split('\n');
for (var l = 0; l < lines.length; l++) {
lines[l] = ' ' + lines[l];
}
var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' +
lines.join('\n') + '\n}';
code = Blockly.JavaScript.scrub_(block, code);
// Add % so as not to collide with helper functions in definitions list.
Blockly.JavaScript.definitions_['%' + funcName] = code;
return null;
};
Blockly.Blocks['procedures_callcustomreturn'] = {
init: Blockly.Blocks['procedures_callreturn'].init,
getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
renameVar: Blockly.Blocks['procedures_callreturn'].renameVar,
onchange: Blockly.Blocks['procedures_callreturn'].onchange,
customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
defType_: 'procedures_defcustomreturn'
};
Blockly.JavaScript['procedures_callcustomreturn'] = Blockly.JavaScript['procedures_callreturn'];
// ---------------------- custom function with no return ------------------------------
Blockly.Words['procedures_defcustomnoreturn_name'] = {'en': 'Javascript function', 'de': 'Javascript-Funktion', 'ru': 'Javascript функция'};
Blockly.Blocks['procedures_defcustomnoreturn'] = {
init: function() {
var nameField = new Blockly.FieldTextInput(
Blockly.Words['procedures_defcustomnoreturn_name'][systemLang],
Blockly.Procedures.rename);
nameField.setSpellcheck(false);
this.appendDummyInput()
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE)
.appendField(nameField, 'NAME')
.appendField('', 'PARAMS');
this.appendDummyInput('SCRIPT')
.appendField(new Blockly.FieldScript(''), 'SCRIPT');
this.setMutator(new Blockly.Mutator(['procedures_mutatorarg']));
if (Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT) {
this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);
}
this.setInputsInline(true);
this.setColour(Blockly.Blocks.procedures.HUE);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP);
this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL);
this.arguments_ = [];
this.setStatements_(false);
this.statementConnection_ = null;
},
setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_,
updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_,
mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation,
decompose: Blockly.Blocks['procedures_defcustomreturn'].decompose,
compose: Blockly.Blocks['procedures_defcustomreturn'].compose,
getProcedureDef: function() {
return [this.getFieldValue('NAME'), this.arguments_, false, true];
},
getVars: Blockly.Blocks['procedures_defnoreturn'].getVars,
renameVar: Blockly.Blocks['procedures_defnoreturn'].renameVar,
customContextMenu: Blockly.Blocks['procedures_defnoreturn'].customContextMenu,
callType_: 'procedures_callcustomnoreturn'
};
Blockly.JavaScript['procedures_defcustomnoreturn'] = Blockly.JavaScript['procedures_defcustomreturn'];
Blockly.Blocks['procedures_callcustomnoreturn'] = {
init: Blockly.Blocks['procedures_callnoreturn'].init,
getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall,
renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure,
setProcedureParameters_: Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_,
updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_,
mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom,
domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation,
renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar,
onchange: Blockly.Blocks['procedures_callnoreturn'].onchange,
customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu,
defType_: 'procedures_defcustomnoreturn'
};
Blockly.JavaScript['procedures_callcustomnoreturn'] = Blockly.JavaScript['procedures_callnoreturn'];

View File

@ -0,0 +1,334 @@
'use strict';
goog.provide('Blockly.JavaScript.Sendto');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Sendto');
Blockly.Sendto = {
HUE: 310,
blocks: {}
};
// --- sendTo Custom --------------------------------------------------
Blockly.Sendto.blocks['sendto_custom'] =
'<block type="sendto_custom">'
+ ' <value name="INSTANCE">'
+ ' </value>'
+ ' <value name="COMMAND">'
+ ' </value>'
+ ' <value name="LOG">'
+ ' </value>'
+ ' <value name="WITH_STATEMENT">'
+ ' </value>'
+ ' <mutation with_statement="false" items="parameter1"></mutation>'
+ '</block>';
Blockly.Blocks['sendto_custom_container'] = {
/**
* Mutator block for container.
* @this Blockly.Block
*/
init: function () {
this.setColour(Blockly.Sendto.HUE);
this.appendDummyInput()
.appendField(Blockly.Words['sendto_custom_arguments'][systemLang]);
this.appendStatementInput('STACK');
this.setTooltip(Blockly.Words['sendto_custom_arg_tooltip'][systemLang]);
this.contextMenu = false;
}
};
Blockly.Blocks['sendto_custom_item'] = {
/**
* Mutator block for add items.
* @this Blockly.Block
*/
init: function () {
this.setColour(Blockly.Sendto.HUE);
this.appendDummyInput('NAME')
.appendField(Blockly.Words['sendto_custom_argument'][systemLang]);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Words['sendto_custom_arg_tooltip'][systemLang]);
this.contextMenu = false;
}
};
Blockly.Blocks['sendto_custom'] = {
/**
* Block for creating a string made up of any number of elements of any type.
* @this Blockly.Block
*/
init: function () {
var options = [];
if (typeof main !== 'undefined' && main.instances) {
for (var i = 0; i < main.instances.length; i++) {
if (main.objects[main.instances[i]].common.messagebox) {
var id = main.instances[i].substring('system.adapter.'.length);
options.push([id, id]);
}
}
/*for (var h = 0; h < scripts.hosts.length; h++) {
options.push([scripts.hosts[h], scripts.hosts[h]]);
}*/
this.appendDummyInput('INSTANCE')
.appendField(Blockly.Words['sendto_custom'][systemLang])
.appendField(new Blockly.FieldDropdown(options), 'INSTANCE');
} else {
this.appendDummyInput('INSTANCE')
.appendField(Blockly.Words['sendto_custom'][systemLang])
.appendField(new Blockly.FieldTextInput('adapter.0'), 'INSTANCE');
}
this.appendDummyInput('COMMAND')
.appendField(Blockly.Words['sendto_custom_command'][systemLang])
.appendField(new Blockly.FieldTextInput('send'), 'COMMAND');
this.setColour(Blockly.Sendto.HUE);
this.itemCount_ = 1;
this.updateShape_();
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setMutator(new Blockly.Mutator(['sendto_custom_item']));
this.setTooltip(Blockly.Words['sendto_custom_tooltip'][systemLang]);
this.setHelpUrl(getHelp('sendto_custom_help'));
},
/**
* Create XML to represent number of text inputs.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement('mutation');
var names = [];
for (var i = 0; i < this.itemCount_; i++) {
var input = this.getInput('ARG' + i);
names[i] = input.fieldRow[0].getValue();
}
container.setAttribute('items', names.join(','));
container.setAttribute('with_statement', this.getFieldValue('WITH_STATEMENT') === 'TRUE');
return container;
},
/**
* Parse XML to restore the text inputs.
* @param {!Element} xmlElement XML storage element.
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
var names = xmlElement.getAttribute('items').split(',');
this.itemCount_ = names.length;
this.updateShape_(names, xmlElement.getAttribute('with_statement') == 'true');
},
/**
* Populate the mutator's dialog with this block's components.
* @param {!Blockly.Workspace} workspace Mutator's workspace.
* @return {!Blockly.Block} Root block in mutator.
* @this Blockly.Block
*/
decompose: function (workspace) {
var containerBlock = workspace.newBlock('sendto_custom_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('sendto_custom_item');
itemBlock.initSvg();
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
/**
* Reconfigure this block based on the mutator dialog's components.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
compose: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
var names = [];
while (itemBlock) {
connections.push(itemBlock.valueConnection_);
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
// Disconnect any children that don't belong.
for (var i = 0; i < this.itemCount_; i++) {
var input = this.getInput('ARG' + i);
var connection = input.connection.targetConnection;
names[i] = input.fieldRow[0].getValue();
if (connection && connections.indexOf(connection) === -1) {
connection.disconnect();
}
}
this.itemCount_ = connections.length;
if (this.itemCount_ < 1) this.itemCount_ = 1;
this.updateShape_(names);
// Reconnect any child blocks.
for (var j = 0; j < this.itemCount_; j++) {
Blockly.Mutator.reconnect(connections[j], this, 'ARG' + j);
}
},
getArgNames_: function () {
var names = [];
for (var n = 0; n < this.itemCount_; n++) {
var input = this.getInput('ARG' + n);
names.push(input.fieldRow[0].getValue());
}
return names;
},
/**
* Store pointers to any connected child blocks.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
saveConnections: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('ARG' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
itemBlock = itemBlock.nextConnection && itemBlock.nextConnection.targetBlock();
i++;
}
},
/**
* Modify this block to have the correct number of inputs.
* @private
* @this Blockly.Block
*/
updateShape_: function (names, withStatement) {
this.removeInput('LOG');
this.removeInput('WITH_STATEMENT');
names = names || [];
var _input;
// Add new inputs.
for (var i = 0; i < this.itemCount_; i++) {
_input = this.getInput('ARG' + i);
if (!_input) {
_input = this.appendValueInput('ARG' + i);
if (!names[i]) names[i] = Blockly.Words['sendto_custom_argument'][systemLang] + (i + 1);
_input.appendField(new Blockly.FieldTextInput(names[i]));
var _shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.outputConnection.connect(_input.connection);
_shadow.initSvg();
_shadow.render();
//console.log('New ' + names[i]);
} else {
_input.fieldRow[0].setValue(names[i]);
//console.log('Exist ' + names[i]);
if (!_input.connection.isConnected()) {
console.log('Create ' + names[i]);
var shadow = this.workspace.newBlock('text');
shadow.setShadow(true);
shadow.outputConnection.connect(_input.connection);
shadow.initSvg();
shadow.render();
}
}
}
// Remove deleted inputs.
var blocks = [];
while (_input = this.getInput('ARG' + i)) {
var b = _input.connection.targetBlock();
if (b && b.isShadow()) {
blocks.push(b);
}
this.removeInput('ARG' + i);
i++;
}
if (blocks.length) {
var ws = this.workspace;
setTimeout(function () {
for(var b = 0; b < blocks.length; b++) {
ws.removeTopBlock(blocks[b]);
}
}, 100);
}
this.appendDummyInput('WITH_STATEMENT')
.appendField(Blockly.Words['request_statement'][systemLang])
.appendField(new Blockly.FieldCheckbox(withStatement ? 'TRUE': 'FALSE', function (option) {
var withStatement = (option == true);
this.sourceBlock_.updateShape_(this.sourceBlock_.getArgNames_(), withStatement);
}), 'WITH_STATEMENT');
this.appendDummyInput('LOG')
.appendField(Blockly.Words['sendto_log'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['sendto_log_none'][systemLang], ''],
[Blockly.Words['sendto_log_info'][systemLang], 'log'],
[Blockly.Words['sendto_log_debug'][systemLang], 'debug'],
[Blockly.Words['sendto_log_warn'][systemLang], 'warn'],
[Blockly.Words['sendto_log_error'][systemLang], 'error']
]), 'LOG');
// Add or remove a statement Input.
var inputExists = this.getInput('STATEMENT');
if (withStatement) {
if (!inputExists) {
this.appendStatementInput('STATEMENT');
}
} else if (inputExists) {
this.removeInput('STATEMENT');
}
}
};
Blockly.JavaScript['sendto_custom'] = function (block) {
var instance = block.getFieldValue('INSTANCE');
var logLevel = block.getFieldValue('LOG');
var command = block.getFieldValue('COMMAND');
var withStatement = block.getFieldValue('WITH_STATEMENT');
var args = [];
var logText;
if (logLevel) {
logText = 'console.' + logLevel + '("' + instance + ': " + "' + (args.length ? args.join(',') + '\n' : '') + '");\n'
} else {
logText = '';
}
var statement;
if (withStatement === 'TRUE') {
statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
}
for (var n = 0; n < block.itemCount_; n++) {
var input = this.getInput('ARG' + n);
var val = Blockly.JavaScript.valueToCode(block, 'ARG' + n, Blockly.JavaScript.ORDER_COMMA);
// if JSON
if (val && val[0] === "'" && val[1] === '{') {
val = val.substring(1, val.length - 1);
}
args.push('\n "' + input.fieldRow[0].getValue() + '": ' + val);
if (block.itemCount_ === 1 && !input.fieldRow[0].getValue()) {
if (statement) {
return 'sendTo("' + instance + '", "' + command + '", ' + val + ', function (result) {\n ' + statement + ' });\n' + logText;
} else {
return 'sendTo("' + instance + '", "' + command + '", ' + val + ');\n' + logText;
}
}
}
if (statement) {
return 'sendTo("' + instance + '", "' + command + '", {' + (args.length ? args.join(',') + '\n' : '') + '}, function (result) {\n ' + statement + ' });\n' + logText;
} else {
return 'sendTo("' + instance + '", "' + command + '", {' + (args.length ? args.join(',') + '\n' : '') + '});\n' + logText;
}
};

View File

@ -0,0 +1,788 @@
'use strict';
goog.provide('Blockly.JavaScript.System');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('System');
function getHelp(word) {
return 'https://git.spacen.net/yunkong2/yunkong2.javascript/blob/master/README.md#' + Blockly.Words[word][systemLang];
}
Blockly.System = {
HUE: 210,
blocks: {}
};
// --- Debug output --------------------------------------------------
Blockly.System.blocks['debug'] =
'<block type="debug">'
+ ' <value name="TEXT">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">test</field>'
+ ' </shadow>'
+ ' </value>'
+ '</block>';
Blockly.Blocks['debug'] = {
init: function() {
this.appendValueInput('TEXT')
.setCheck(null)
.appendField(Blockly.Words['debug'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([['info', 'log'], ['debug', 'debug'], ['warning', 'warn'], ['error', 'error']]), 'Severity');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['debug_tooltip'][systemLang]);
this.setHelpUrl(getHelp('debug_help'));
}
};
Blockly.JavaScript['debug'] = function(block) {
var value_text = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC);
var dropdown_severity = block.getFieldValue('Severity');
return 'console.' + dropdown_severity + '(' + value_text + ');\n';
};
// --- comment --------------------------------------------------
Blockly.System.blocks['comment'] =
'<block type="comment">'
+ ' <value name="COMMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['comment'] = {
init: function() {
this.appendDummyInput('COMMENT')
.appendField(new Blockly.FieldTextInput(Blockly.Words['comment'][systemLang]), 'COMMENT');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour('#FFFF00');
this.setTooltip(Blockly.Words['comment_tooltip'][systemLang]);
}
};
Blockly.JavaScript['comment'] = function(block) {
var comment = block.getFieldValue('COMMENT');
return '// ' + comment + '\n';
};
// --- control -----------------------------------------------------------
Blockly.System.blocks['control'] =
'<block type="control">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['control'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['control'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID('Object ID', main.initSelectId(), main.objects), 'OID');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['control_with'][systemLang]);
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['control_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['control_tooltip'][systemLang]);
this.setHelpUrl(getHelp('control_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['control_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['control'] = function(block) {
var valueObjectID = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
valueDelay *= 60000;
} else if (unit === 'sec') {
valueDelay *= 1000;
}
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
var code;
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code = 'setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ', ' + valueDelay + ', ' + clearRunning + ');\n';
} else {
code = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ');\n';
}
return code;
};
// --- toggle -----------------------------------------------------------
Blockly.System.blocks['toggle'] =
'<block type="toggle">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['toggle'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['toggle'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID('Object ID', main.initSelectId(), main.objects), 'OID');
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['toggle_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['toggle_tooltip'][systemLang]);
this.setHelpUrl(getHelp('toggle_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['toggle_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['toggle_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['toggle'] = function(block) {
var valueObjectID = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
valueDelay *= 60000;
} else if (unit === 'sec') {
valueDelay *= 1000;
}
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
var objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean';
var code;
var setCommand;
if (objectType === 'number') {
var max = 100;
var min = 0;
if (main.objects[valueObjectID].common.max !== undefined) {
max = parseFloat(main.objects[valueObjectID].common.max);
}
if (main.objects[valueObjectID].common.min !== undefined) {
min = parseFloat(main.objects[valueObjectID].common.min);
}
setCommand = ' setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? (state.val == ' + min + ' ? ' + max + ' : ' + min + ') : ' + max + ');\n';
} else {
setCommand = ' setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true);\n';
}
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code =
'getState("' + valueObjectID + '", function (err, state) {\n' +
' setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true, ' + valueDelay + ', ' + clearRunning + ');\n' +
'});\n';
} else {
code =
'getState("' + valueObjectID + '", function (err, state) {\n' +
setCommand +
'});\n';
}
return code;
};
// --- update -----------------------------------------------------------
Blockly.System.blocks['update'] =
'<block type="update">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['update'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['update'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID("Object ID", main.initSelectId(), main.objects), 'OID');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['update_with'][systemLang]);
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['update_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
this.sourceBlock_.updateShape_(option == true);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['update_tooltip'][systemLang]);
this.setHelpUrl(getHelp('update_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['update_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['update'] = function(block) {
var value_objectid = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var value_value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var value_delay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
value_delay *= 60000;
} else if (unit === 'sec') {
value_delay *= 1000;
}
var objectname = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
var code;
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code = 'setStateDelayed("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true, ' + value_delay + ', ' + clearRunning + ');\n';
} else {
code = 'setState("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true);\n';
}
return code;
};
// --- direct binding -----------------------------------------------------------
Blockly.System.blocks['direct'] =
'<block type="direct">'
+ ' <value name="OID_SRC">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID 1</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="OID_DST">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID 2</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="ONLY_CHANGES">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['direct'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['direct'][systemLang]);
this.appendValueInput('OID_SRC')
.setCheck('String')
.appendField(Blockly.Words['direct_oid_src'][systemLang]);
this.appendValueInput('OID_DST')
.setCheck('String')
.appendField(Blockly.Words['direct_oid_dst'][systemLang]);
this.appendDummyInput('ONLY_CHANGES')
.appendField(Blockly.Words['direct_only_changes'][systemLang])
.appendField(new Blockly.FieldCheckbox('TRUE'), 'ONLY_CHANGES');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['direct_tooltip'][systemLang]);
this.setHelpUrl(getHelp('direct_help'));
}
};
Blockly.JavaScript['direct'] = function(block) {
var oidSrc = Blockly.JavaScript.valueToCode(block, 'OID_SRC', Blockly.JavaScript.ORDER_ATOMIC);
var onlyChanges = block.getFieldValue('ONLY_CHANGES');
var oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
return 'on({id: ' + oidSrc + ', change: "' + (onlyChanges == 'TRUE' ? 'ne' : 'any') + '"}, function (obj) {\n setState(' + oidDest + ', obj.state.val);\n});';
};
// --- control ex -----------------------------------------------------------
Blockly.System.blocks['control_ex'] =
'<block type="control_ex">'
+ ' <value name="OID">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' <shadow type="logic_boolean">'
+ ' <field name="BOOL">TRUE</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="TYPE">'
+ ' </value>'
+ ' <value name="DELAY_MS">'
+ ' <shadow type="math_number">'
+ ' <field name="NUM">0</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['control_ex'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['control_ex'][systemLang]);
this.appendValueInput('OID')
.setCheck('String')
.appendField(Blockly.Words['field_oid_OID'][systemLang]);
this.appendDummyInput('TYPE')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ex_control'][systemLang], 'false'],
[Blockly.Words['control_ex_update'][systemLang], 'true']
]), 'TYPE');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['control_ex_value'][systemLang]);
this.appendValueInput('DELAY_MS')
.setCheck('Number')
.appendField(Blockly.Words['control_ex_delay'][systemLang]);
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_ex_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['control_tooltip'][systemLang]);
this.setHelpUrl(getHelp('control_help'));
}
};
Blockly.JavaScript['control_ex'] = function(block) {
var valueObjectID = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
var value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var type = block.getFieldValue('TYPE') === 'true';
return 'setStateDelayed(' + valueObjectID + ', ' + value + ', ' + type + ', parseInt(' + valueDelay + ', 10), ' + clearRunning + ');\n';
};
// --- create state --------------------------------------------------
Blockly.System.blocks['create'] =
'<block type="create">'
+ ' <value name="NAME">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['create'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['create'][systemLang]);
this.appendDummyInput('NAME')
.appendField(new Blockly.FieldTextInput(Blockly.Words['create_jsState'][systemLang]), 'NAME');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['create_tooltip'][systemLang]);
this.setHelpUrl(getHelp('create_help'));
}
};
Blockly.JavaScript['create'] = function(block) {
var name = block.getFieldValue('NAME');
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'createState("' + name + '", function () {\n' + statement + '});\n';
};
// --- get value --------------------------------------------------
Blockly.System.blocks['get_value'] =
'<block type="get_value">'
+ ' <value name="ATTR">'
+ ' </value>'
+ ' <value name="OID">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_value'] = {
// Checkbox.
init: function() {
this.appendDummyInput('ATTR')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['get_value_val'][systemLang], 'val'],
[Blockly.Words['get_value_ack'][systemLang], 'ack'],
[Blockly.Words['get_value_ts'][systemLang], 'ts'],
[Blockly.Words['get_value_lc'][systemLang], 'lc'],
[Blockly.Words['get_value_q'][systemLang] , 'q'],
[Blockly.Words['get_value_from'][systemLang], 'from']
]), 'ATTR');
this.appendDummyInput()
.appendField(Blockly.Words['get_value_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID(Blockly.Words['get_value_default'][systemLang], main.initSelectId(), main.objects), 'OID');
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_value_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_value_help'));
}
};
Blockly.JavaScript['get_value'] = function(block) {
var oid = block.getFieldValue('OID');
var attr = block.getFieldValue('ATTR');
return ['getState("' + oid + '").' + attr, Blockly.JavaScript.ORDER_ATOMIC];
};
// --- get value async--------------------------------------------------
Blockly.System.blocks['get_value_async'] =
'<block type="get_value_async">'
+ ' <value name="ATTR">'
+ ' </value>'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_value_async'] = {
// Checkbox.
init: function() {
this.appendDummyInput('ATTR')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['get_value_val'][systemLang], 'val'],
[Blockly.Words['get_value_ack'][systemLang], 'ack'],
[Blockly.Words['get_value_ts'][systemLang], 'ts'],
[Blockly.Words['get_value_lc'][systemLang], 'lc'],
[Blockly.Words['get_value_q'][systemLang] , 'q'],
[Blockly.Words['get_value_from'][systemLang], 'from']
]), 'ATTR');
this.appendDummyInput()
.appendField(Blockly.Words['get_value_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID(Blockly.Words['get_value_default'][systemLang], main.initSelectId(), main.objects), 'OID');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_value_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_value_help'));
}
};
Blockly.JavaScript['get_value_async'] = function(block) {
var oid = block.getFieldValue('OID');
var attr = block.getFieldValue('ATTR');
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'getState("' + oid + '", function (err, state) {\n var value = state.' + attr + ';\n' + statement + '});\n';
};
// --- select OID --------------------------------------------------
Blockly.System.blocks['field_oid'] =
'<block type="field_oid">'
+ ' <value name="TEXT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['field_oid'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['field_oid_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID('default', main.initSelectId(), main.objects), 'oid');
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['field_oid_tooltip'][systemLang]);
}
};
Blockly.JavaScript['field_oid'] = function(block) {
var oid = block.getFieldValue('oid');
return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC]
};
// --- get attribute --------------------------------------------------
Blockly.System.blocks['get_attr'] =
'<block type="get_attr">'
+ ' <value name="PATH">'
+ ' <shadow type="text">'
+ ' <field name="PATH">attr1.attr2</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="OBJECT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_attr'] = {
init: function() {
this.appendValueInput('PATH')
.setCheck(null)
.appendField(Blockly.Words['get_attr_path'][systemLang]);
// this.appendDummyInput()
this.appendValueInput('OBJECT')
.appendField(Blockly.Words['get_attr_by'][systemLang]);
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_attr_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_attr_help'));
}
};
Blockly.JavaScript['get_attr'] = function(block) {
var path = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC);
var obj = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC);
return ['getAttr(' + obj + ', ' + path + ')', Blockly.JavaScript.ORDER_ATOMIC];
};
// --- Text new line --------------------------------------------------
Blockly.Blocks['text_newline'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['text_newline'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([['\\n', '\\n'], ['\\r\\n', '\\r\\n'], ['\\r', '\\r']]), 'Type');
this.setInputsInline(true);
this.setColour(Blockly.Blocks.texts.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['text_newline_tooltip'][systemLang]);
}
};
Blockly.JavaScript['text_newline'] = function(block) {
var dropdown_type = block.getFieldValue('Type');
return ['\'' + dropdown_type + '\'', Blockly.JavaScript.ORDER_ATOMIC]
};
// --- Round Number to n decimal places -------------------------------
Blockly.Blocks['math_rndfixed'] = {
init: function() {
this.appendValueInput('x')
.setCheck('Number')
.appendField(Blockly.Words['math_rndfixed_round'][systemLang]);
this.appendDummyInput()
.appendField(Blockly.Words['math_rndfixed_to'][systemLang])
.appendField(new Blockly.FieldNumber(0, 1, 25), 'n')
.appendField(Blockly.Words['math_rndfixed_decplcs'][systemLang]);
this.setInputsInline(true);
this.setColour(Blockly.Blocks.math.HUE);
this.setOutput(true, 'Number');
this.setTooltip(Blockly.Words['math_rndfixed_tooltip'][systemLang]);
}
};
Blockly.JavaScript['math_rndfixed'] = function(block) {
var x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
const exp = Math.pow(10, block.getFieldValue('n'));
return ['Math.round(' + x + '*' + exp + ')/' + exp, Blockly.JavaScript.ORDER_ATOMIC];
};

View File

@ -0,0 +1,469 @@
'use strict';
goog.provide('Blockly.JavaScript.Time');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Time');
Blockly.Time = {
HUE: 270,
blocks: {}
};
// if time greater, less, between
// --- time compare --------------------------------------------------
Blockly.Time.blocks['time_compare_ex'] =
'<block type="time_compare_ex">'
+ ' <value name="OPTION">'
+ ' </value>'
+ ' <value name="USE_ACTUAL_TIME">'
+ ' </value>'
+ ' <value name="START_TIME">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">12:00</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <mutation end_time="false" actual_time="true"></mutation>'
+ ' <value name="END_TIME">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">18:00</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="CUSTOM_TIME">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">14:00</field>'
+ ' </shadow>'
+ ' </value>'
+ '</block>';
Blockly.Blocks['time_compare_ex'] = {
init: function() {
this.appendDummyInput('TIME_TEXT')
.appendField(Blockly.Words['time_compare_ex'][systemLang]);
this.appendDummyInput('USE_ACTUAL_TIME')
.appendField(new Blockly.FieldCheckbox('TRUE', function (option) {
this.sourceBlock_.updateShape_(undefined, option);
}), 'USE_ACTUAL_TIME');
this.appendDummyInput()
.appendField(Blockly.Words['time_compare_is_ex'][systemLang]);
this.appendDummyInput('OPTION')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['time_compare_lt'][systemLang], '<'],
[Blockly.Words['time_compare_le'][systemLang], '<='],
[Blockly.Words['time_compare_gt'][systemLang], '>'],
[Blockly.Words['time_compare_ge'][systemLang], '>='],
[Blockly.Words['time_compare_eq'][systemLang], '=='],
[Blockly.Words['time_compare_bw'][systemLang], 'between'],
[Blockly.Words['time_compare_nb'][systemLang], 'not between']
], function (option) {
this.sourceBlock_.updateShape_((option === 'between' || option === 'not between'));
}), 'OPTION');
this.appendDummyInput()
.appendField(' ');
this.appendValueInput('START_TIME');
this.setInputsInline(true);
//this.setPreviousStatement(true, null);
//this.setNextStatement(true, null);
this.setOutput(true, 'Boolean');
this.setColour(Blockly.Time.HUE);
this.setTooltip(Blockly.Words['time_compare_ex_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['time_compare_ex_help'][systemLang]);
},
mutationToDom: function() {
var container = document.createElement('mutation');
var option = this.getFieldValue('OPTION');
var use_actual_time = this.getFieldValue('USE_ACTUAL_TIME');
container.setAttribute('end_time', (option === 'between' || option === 'not between') ? 'true' : 'false');
container.setAttribute('actual_time', (use_actual_time === 'TRUE') ? 'true' : 'false');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('end_time') === 'true', xmlElement.getAttribute('actual_time') === 'true');
},
updateShape_: function(isBetween, useActualTime) {
if (isBetween === undefined) {
isBetween = (this.getFieldValue('OPTION') === 'between' || this.getFieldValue('OPTION') === 'not between');
}
// Add or remove a delay Input.
var inputExists = this.getInput('END_TIME');
if (isBetween) {
if (!inputExists) {
inputExists = this.getInput('CUSTOM_TIME');
if (inputExists) {
this.removeInput('CUSTOM_TIME');
this.removeInput('CUSTOM_TEXT');
}
this.appendDummyInput('AND')
.appendField(Blockly.Words['time_compare_and'][systemLang]);
var input = this.appendValueInput('END_TIME');
var shadow = this.workspace.newBlock('text');
shadow.setShadow(true);
shadow.outputConnection.connect(input.connection);
shadow.setFieldValue('18:00', 'TEXT');
shadow.initSvg();
shadow.render();
}
} else if (inputExists) {
this.removeInput('END_TIME');
this.removeInput('AND');
}
if (useActualTime === undefined) {
useActualTime = this.getFieldValue('USE_ACTUAL_TIME') === 'TRUE';
}
inputExists = this.getInput('CUSTOM_TIME');
if (!useActualTime) {
this.getInput('TIME_TEXT').fieldRow[0].setText(Blockly.Words['time_compare_custom_ex'][systemLang]);
if (!inputExists) {
this.appendDummyInput('CUSTOM_TEXT')
.appendField(Blockly.Words['time_compare_ex_custom'][systemLang]);
this.appendValueInput('CUSTOM_TIME');
}
} else if (inputExists) {
this.getInput('TIME_TEXT').fieldRow[0].setText(Blockly.Words['time_compare_ex'][systemLang]);
this.removeInput('CUSTOM_TIME');
this.removeInput('CUSTOM_TEXT');
}
}
};
Blockly.JavaScript['time_compare_ex'] = function(block) {
var option = block.getFieldValue('OPTION');
var start_time = Blockly.JavaScript.valueToCode(block, 'START_TIME', Blockly.JavaScript.ORDER_ATOMIC);
var end_time = Blockly.JavaScript.valueToCode(block, 'END_TIME', Blockly.JavaScript.ORDER_ATOMIC);
var time = Blockly.JavaScript.valueToCode(block, 'CUSTOM_TIME', Blockly.JavaScript.ORDER_ATOMIC);
if (!end_time) end_time = null;
if (!time) time = null;
return ['compareTime(' + start_time + ', ' + end_time + ', "' + option + '", ' + time + ')', Blockly.JavaScript.ORDER_ATOMIC];
};
// if time greater, less, between
// --- time compare --------------------------------------------------
Blockly.Time.blocks['time_compare'] =
'<block type="time_compare">'
+ ' <value name="OPTION">'
+ ' </value>'
+ ' <value name="START_TIME">'
+ ' </value>'
+ ' <mutation end_time="false"></mutation>'
+ ' <value name="END_TIME">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['time_compare'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['time_compare'][systemLang]);
this.appendDummyInput('OPTION')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['time_compare_lt'][systemLang], "<"],
[Blockly.Words['time_compare_le'][systemLang], "<="],
[Blockly.Words['time_compare_gt'][systemLang], ">"],
[Blockly.Words['time_compare_ge'][systemLang], ">="],
[Blockly.Words['time_compare_eq'][systemLang], "=="],
[Blockly.Words['time_compare_bw'][systemLang], "between"],
[Blockly.Words['time_compare_nb'][systemLang], "not between"]
], function (option) {
this.sourceBlock_.updateShape_((option === 'between' || option === 'not between'));
}), 'OPTION');
this.appendDummyInput()
.appendField(' ');
this.appendDummyInput('START_TIME')
.appendField(new Blockly.FieldTextInput('12:00'), 'START_TIME');
this.setInputsInline(true);
//this.setPreviousStatement(true, null);
//this.setNextStatement(true, null);
this.setOutput(true, 'Boolean');
this.setColour(Blockly.Time.HUE);
this.setTooltip(Blockly.Words['time_compare_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['time_compare_help'][systemLang]);
},
mutationToDom: function() {
var container = document.createElement('mutation');
var option = this.getFieldValue('OPTION');
container.setAttribute('end_time', (option === 'between' || option === 'not between') ? 'true' : 'false');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('end_time') === 'true');
},
updateShape_: function(isBetween) {
// Add or remove a delay Input.
var inputExists = this.getInput('END_TIME');
if (isBetween) {
if (!inputExists) {
this.appendDummyInput('AND')
.appendField(Blockly.Words['time_compare_and'][systemLang]);
this.appendDummyInput('END_TIME')
.appendField(new Blockly.FieldTextInput('18:00'), 'END_TIME');
}
} else if (inputExists) {
this.removeInput('END_TIME');
this.removeInput('AND');
}
}
};
Blockly.JavaScript['time_compare'] = function(block) {
var option = block.getFieldValue('OPTION');
var start_time = block.getFieldValue('START_TIME');
var end_time = block.getFieldValue('END_TIME');
if (!end_time) end_time = null;
return ['compareTime("' + start_time + '", "' + end_time + '", "' + option + '")', Blockly.JavaScript.ORDER_ATOMIC];
};
// --- get time --------------------------------------------------
Blockly.Words['time_get_yyyy.mm.dd'] .format = 'YYYY.MM.DD';
Blockly.Words['time_get_yyyy/mm/dd'] .format = 'YYYY/MM/DD';
Blockly.Words['time_get_yy.mm.dd'] .format = 'YY.MM.DD';
Blockly.Words['time_get_yy/mm/dd'] .format = 'YY/MM/DD';
Blockly.Words['time_get_dd.mm.yyyy'] .format = 'DD.MM.YYYY';
Blockly.Words['time_get_dd/mm/yyyy'] .format = 'DD/MM/YYYY';
Blockly.Words['time_get_dd.mm.yy'] .format = 'DD.MM.YY';
Blockly.Words['time_get_dd/mm/yy'] .format = 'DD/MM/YY';
Blockly.Words['time_get_mm/dd/yyyy'] .format = 'MM/DD/YYYY';
Blockly.Words['time_get_mm/dd/yy'] .format = 'MM/DD/YY';
Blockly.Words['time_get_dd.mm'] .format = 'DD.MM.';
Blockly.Words['time_get_dd/mm'] .format = 'DD/MM';
Blockly.Words['time_get_mm.dd'] .format = 'MM.DD';
Blockly.Words['time_get_mm/dd'] .format = 'MM/DD';
Blockly.Words['time_get_hh_mm'] .format = 'hh:mm';
Blockly.Words['time_get_hh_mm_ss'] .format = 'hh:mm:ss';
Blockly.Words['time_get_hh_mm_ss.sss'].format = 'hh:mm:ss.sss';
Blockly.Time.blocks['time_get'] =
'<block type="time_get">'
+ ' <value name="OPTION">'
+ ' </value>'
+ ' <mutation format="false" language="false"></mutation>'
+ ' <value name="FORMAT">'
+ ' </value>'
+ ' <value name="LANGUAGE">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['time_get'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['time_get'][systemLang]);
this.appendDummyInput('OPTION')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['time_get_object'][systemLang] , 'object'],
[Blockly.Words['time_get_ms'][systemLang] , 'ms'],
[Blockly.Words['time_get_s'][systemLang] , 's'],
[Blockly.Words['time_get_sid'][systemLang] , 'sid'],
[Blockly.Words['time_get_m'][systemLang] , 'm'],
[Blockly.Words['time_get_mid'][systemLang] , 'mid'],
[Blockly.Words['time_get_h'][systemLang] , 'h'],
[Blockly.Words['time_get_d'][systemLang] , 'd'],
[Blockly.Words['time_get_M'][systemLang] , 'M'],
[Blockly.Words['time_get_Mt'][systemLang] , 'Mt'],
[Blockly.Words['time_get_Mts'][systemLang] , 'Mts'],
[Blockly.Words['time_get_y'][systemLang] , 'y'],
[Blockly.Words['time_get_fy'][systemLang] , 'fy'],
[Blockly.Words['time_get_wdt'][systemLang] , 'wdt'],
[Blockly.Words['time_get_wdts'][systemLang] , 'wdts'],
[Blockly.Words['time_get_wd'][systemLang] , 'wd'],
[Blockly.Words['time_get_custom'][systemLang] , 'custom'],
[Blockly.Words['time_get_yyyy.mm.dd'][systemLang] , [Blockly.Words['time_get_yyyy.mm.dd'] .format]],
[Blockly.Words['time_get_yyyy/mm/dd'][systemLang] , [Blockly.Words['time_get_yyyy/mm/dd'] .format]],
[Blockly.Words['time_get_yy.mm.dd'][systemLang] , [Blockly.Words['time_get_yy.mm.dd'] .format]],
[Blockly.Words['time_get_yy/mm/dd'][systemLang] , [Blockly.Words['time_get_yy/mm/dd'] .format]],
[Blockly.Words['time_get_dd.mm.yyyy'][systemLang] , [Blockly.Words['time_get_dd.mm.yyyy'] .format]],
[Blockly.Words['time_get_dd/mm/yyyy'][systemLang] , [Blockly.Words['time_get_dd/mm/yyyy'] .format]],
[Blockly.Words['time_get_dd.mm.yy'][systemLang] , [Blockly.Words['time_get_dd.mm.yy'] .format]],
[Blockly.Words['time_get_dd/mm/yy'][systemLang] , [Blockly.Words['time_get_dd/mm/yy'] .format]],
[Blockly.Words['time_get_mm/dd/yyyy'][systemLang] , [Blockly.Words['time_get_mm/dd/yyyy'] .format]],
[Blockly.Words['time_get_mm/dd/yy'][systemLang] , [Blockly.Words['time_get_mm/dd/yy'] .format]],
[Blockly.Words['time_get_dd.mm'][systemLang] , [Blockly.Words['time_get_dd.mm'] .format]],
[Blockly.Words['time_get_dd/mm'][systemLang] , [Blockly.Words['time_get_dd/mm'] .format]],
[Blockly.Words['time_get_mm.dd'][systemLang] , [Blockly.Words['time_get_mm.dd'] .format]],
[Blockly.Words['time_get_mm/dd'][systemLang] , [Blockly.Words['time_get_mm/dd'] .format]],
[Blockly.Words['time_get_hh_mm'][systemLang] , [Blockly.Words['time_get_hh_mm'] .format]],
[Blockly.Words['time_get_hh_mm_ss'][systemLang] , [Blockly.Words['time_get_hh_mm_ss'] .format]],
[Blockly.Words['time_get_hh_mm_ss.sss'][systemLang] , [Blockly.Words['time_get_hh_mm_ss.sss'].format]]
], function (option) {
this.sourceBlock_.updateShape_(option === 'custom', option === 'wdt' || option === 'wdts' || option === 'Mt' || option === 'Mts');
}), 'OPTION');
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.Time.HUE);
this.setTooltip(Blockly.Words['time_get_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['time_get_help'][systemLang]);
},
mutationToDom: function() {
var container = document.createElement('mutation');
var option = this.getFieldValue('OPTION');
container.setAttribute('format', option === 'custom' ? 'true' : 'false');
container.setAttribute('language', option === 'wdt' || option === 'wdts' || option === 'Mt' || option === 'Mts' ? 'true' : 'false');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('format') === 'true', xmlElement.getAttribute('language') === 'true');
},
updateShape_: function(isFormat, isLanguage) {
// Add or remove a delay Input.
var inputExists = this.getInput('FORMAT');
if (isFormat) {
if (!inputExists) {
this.appendDummyInput('FORMAT')
.appendField(' ')
.appendField(new Blockly.FieldTextInput(Blockly.Words['time_get_default_format'][systemLang]), 'FORMAT');
}
} else if (inputExists) {
this.removeInput('FORMAT');
}
inputExists = this.getInput('LANGUAGE');
if (isLanguage) {
if (!inputExists) {
var languages;
if (systemLang === 'en') {
languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
} else if (systemLang === 'de') {
languages = [['auf deutsch', 'de'], ['in english', 'en'], ['на русском', 'ru']];
} else if (systemLang === 'ru') {
languages = [['на русском', 'ru'], ['in english', 'en'], ['auf deutsch', 'de']];
} else {
languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
}
this.appendDummyInput('LANGUAGE')
.appendField(new Blockly.FieldDropdown(languages), 'LANGUAGE');
}
} else if (inputExists) {
this.removeInput('LANGUAGE');
}
}
};
Blockly.JavaScript['time_get'] = function(block) {
var option = block.getFieldValue('OPTION');
var format = block.getFieldValue('FORMAT');
var lang = block.getFieldValue('LANGUAGE');
var code;
if (option === 'object') {
code = '(new Date().getTime())';
} else if (option === 'ms') {
code = '(new Date().getMilliseconds())';
} else if (option === 's') {
code = '(new Date().getSeconds())';
} else if (option === 'sid') {
code = '(new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds())';
} else if (option === 'm') {
code = '(new Date().getMinutes())';
} else if (option === 'mid') {
code = '(function () {var v = new Date(); return v.getHours() * 60 + v.getMinutes();})()';
} else if (option === 'h') {
code = '(new Date().getHours())';
} else if (option === 'd') {
code = '(new Date().getDate())';
} else if (option === 'M') {
code = '(new Date().getMonth() + 1)';
} else if (option === 'Mt') {
code = 'formatDate(new Date(), "OO", "' + lang + '")';
} else if (option === 'Mts') {
code = 'formatDate(new Date(), "O", "' + lang + '")';
} else if (option === 'y') {
code = '(new Date().getYear())';
} else if (option === 'fy') {
code = '(new Date().getFullYear())';
} else if (option === 'wdt') {
code = 'formatDate(new Date(), "WW", "' + lang + '")';
} else if (option === 'wdts') {
code = 'formatDate(new Date(), "W", "' + lang + '")';
} else if (option === 'wd') {
code = '(new Date().getDay() === 0 ? 7 : new Date().getDay())';
} else if (option === 'custom') {
code = 'formatDate(new Date(), "' + format + '")';
} else {
code = 'formatDate(new Date(), "' + option + '")';
}
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
// --- get astro time --------------------------------------------------
Blockly.Time.blocks['time_astro'] =
'<block type="time_astro">'
+ ' <value name="TYPE">'
+ ' </value>'
+ ' <value name="OFFSET">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['time_astro'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['time_astro'][systemLang]);
this.appendDummyInput('TYPE')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['astro_sunriseText'][systemLang], 'sunrise'],
[Blockly.Words['astro_sunriseEndText'][systemLang], 'sunriseEnd'],
[Blockly.Words['astro_goldenHourEndText'][systemLang], 'goldenHourEnd'],
[Blockly.Words['astro_solarNoonText'][systemLang], 'solarNoon'],
[Blockly.Words['astro_goldenHourText'][systemLang], 'goldenHour'],
[Blockly.Words['astro_sunsetStartText'][systemLang], 'sunsetStart'],
[Blockly.Words['astro_sunsetText'][systemLang], 'sunset'],
[Blockly.Words['astro_duskText'][systemLang], 'dusk'],
[Blockly.Words['astro_nauticalDuskText'][systemLang], 'nauticalDusk'],
[Blockly.Words['astro_nightText'][systemLang], 'night'],
[Blockly.Words['astro_nightEndText'][systemLang], 'nightEnd'],
[Blockly.Words['astro_nauticalDawnText'][systemLang], 'nauticalDawn'],
[Blockly.Words['astro_dawnText'][systemLang], 'dawn'],
[Blockly.Words['astro_nadirText'][systemLang], 'nadir']
]), 'TYPE');
this.appendDummyInput('OFFSET')
.appendField(Blockly.Words['time_astro_offset'][systemLang])
.appendField(new Blockly.FieldTextInput('0'), 'OFFSET');
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.Time.HUE);
this.setTooltip(Blockly.Words['time_astro_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['time_astro_help'][systemLang]);
}
};
Blockly.JavaScript['time_astro'] = function(block) {
var type = block.getFieldValue('TYPE');
var offset = parseFloat(block.getFieldValue('OFFSET'));
return ['getAstroDate("' + type + '", undefined, ' + offset + ')', Blockly.JavaScript.ORDER_ATOMIC];
};

View File

@ -0,0 +1,289 @@
'use strict';
goog.provide('Blockly.JavaScript.Timeouts');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Timeouts');
Blockly.Timeouts = {
HUE: 70,
blocks: {}
};
/**
* Ensure two identically-named procedures don't exist.
* @param {string} name Proposed procedure name.
* @param {!Blockly.Block} block Block to disambiguate.
* @return {string} Non-colliding name.
*/
Blockly.Timeouts.findLegalName = function(name, block) {
if (block.isInFlyout) {
// Flyouts can have multiple procedures called 'do something'.
return name;
}
while (!Blockly.Timeouts.isLegalName_(name, block.workspace, block)) {
// Collision with another procedure.
var r = name.match(/^(.*?)(\d+)$/);
if (!r) {
name += '2';
} else {
name = r[1] + (parseInt(r[2], 10) + 1);
}
}
return name;
};
/**
* Does this procedure have a legal name? Illegal names include names of
* procedures already defined.
* @param {string} name The questionable name.
* @param {!Blockly.Workspace} workspace The workspace to scan for collisions.
* @param {Blockly.Block=} opt_exclude Optional block to exclude from
* comparisons (one doesn't want to collide with oneself).
* @return {boolean} True if the name is legal.
* @private
*/
Blockly.Timeouts.isLegalName_ = function(name, workspace, opt_exclude) {
var blocks = workspace.getAllBlocks();
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
if (blocks[i] == opt_exclude) {
continue;
}
if (blocks[i].isTimeout_ || blocks[i].isInterval_) {
var blockName = blocks[i].getFieldValue('NAME');
if (Blockly.Names.equals(blockName, name)) {
return false;
}
}
}
return true;
};
/**
* Rename a procedure. Called by the editable field.
* @param {string} name The proposed new name.
* @return {string} The accepted name.
* @this {!Blockly.Field}
*/
Blockly.Timeouts.rename = function (name) {
// Strip leading and trailing whitespace. Beyond this, all names are legal.
name = name.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
return Blockly.Timeouts.findLegalName(name, this.sourceBlock_);
};
// --- setTimeout -----------------------------------------------------------
Blockly.Timeouts.blocks['timeouts_settimeout'] =
'<block type="timeouts_settimeout">'
+ ' <value name="NAME">'
+ ' </value>'
+ ' <value name="DELAY">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['timeouts_settimeout'] = {
init: function() {
var nameField = new Blockly.FieldTextInput(
Blockly.Timeouts.findLegalName('timeout', this),
Blockly.Timeouts.rename);
nameField.setSpellcheck(false);
this.appendDummyInput()
.appendField(Blockly.Words['timeouts_settimeout'][systemLang])
.appendField(nameField, 'NAME')
.appendField(Blockly.Words['timeouts_settimeout_in'][systemLang])
.appendField(new Blockly.FieldTextInput(1000), "DELAY")
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['timeouts_settimeout_ms'][systemLang], 'ms'],
[Blockly.Words['timeouts_settimeout_sec'][systemLang], 'sec'],
[Blockly.Words['timeouts_settimeout_min'][systemLang], 'min']
]), 'UNIT')
.appendField(Blockly.Words['timeouts_settimeout_ms'][systemLang]);
this.appendStatementInput("STATEMENT")
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Timeouts.HUE);
this.setTooltip(Blockly.Words['timeouts_settimeout_tooltip'][systemLang]);
this.setHelpUrl(getHelp('timeouts_settimeout_help'));
},
isTimeout_: true,
getVars: function () {
return [this.getFieldValue('NAME')];
}
};
Blockly.JavaScript['timeouts_settimeout'] = function(block) {
var delay = block.getFieldValue('DELAY');
var name = block.getFieldValue('NAME');
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
delay *= 60000;
} else if (unit === 'sec') {
delay *= 1000;
}
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return name + ' = setTimeout(function () {\n' + statements_name + '}, ' + delay + ');\n';
};
// --- clearTimeout -----------------------------------------------------------
Blockly.Timeouts.getAllTimeouts = function (workspace) {
var blocks = workspace.getAllBlocks();
var result = [];
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].isTimeout_) {
result.push([blocks[i].getFieldValue('NAME'), blocks[i].getFieldValue('NAME')]);
}
}
if (!result.length) result.push(['', '']);
return result;
};
Blockly.Timeouts.blocks['timeouts_cleartimeout'] =
'<block type="timeouts_cleartimeout">'
+ ' <value name="NAME">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['timeouts_cleartimeout'] = {
init: function() {
this.appendDummyInput('NAME')
.appendField(Blockly.Words['timeouts_cleartimeout'][systemLang])
.appendField(new Blockly.FieldDropdown(function () {
return Blockly.Timeouts.getAllTimeouts(scripts.blocklyWorkspace);
}), 'NAME');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.Timeouts.HUE);
this.setTooltip(Blockly.Words['timeouts_cleartimeout_tooltip'][systemLang]);
this.setHelpUrl(getHelp('timeouts_cleartimeout_help'));
}
};
Blockly.JavaScript['timeouts_cleartimeout'] = function(block) {
var name = block.getFieldValue('NAME');
return '(function () {if (' + name + ') {clearTimeout(' + name + '); ' + name + ' = null;}})();\n';
};
// --- setInterval -----------------------------------------------------------
Blockly.Timeouts.blocks['timeouts_setinterval'] =
'<block type="timeouts_setinterval">'
+ ' <value name="NAME">'
+ ' </value>'
+ ' <value name="INTERVAL">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['timeouts_setinterval'] = {
init: function() {
var nameField = new Blockly.FieldTextInput(
Blockly.Timeouts.findLegalName(Blockly.Words['timeouts_setinterval_name'][systemLang], this),
Blockly.Timeouts.rename);
nameField.setSpellcheck(false);
this.appendDummyInput()
.appendField(Blockly.Words['timeouts_setinterval'][systemLang])
.appendField(nameField, 'NAME')
.appendField(Blockly.Words['timeouts_setinterval_in'][systemLang])
.appendField(new Blockly.FieldTextInput(1000), "INTERVAL")
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['timeouts_settimeout_ms'][systemLang], 'ms'],
[Blockly.Words['timeouts_settimeout_sec'][systemLang], 'sec'],
[Blockly.Words['timeouts_settimeout_min'][systemLang], 'min']
]), 'UNIT')
.appendField(Blockly.Words['timeouts_setinterval_ms'][systemLang]);
this.appendStatementInput("STATEMENT")
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Timeouts.HUE);
this.setTooltip(Blockly.Words['timeouts_setinterval_tooltip'][systemLang]);
this.setHelpUrl(getHelp('timeouts_setinterval_help'));
},
isInterval_: true,
getVars: function () {
return [this.getFieldValue('NAME')];
}
};
Blockly.JavaScript['timeouts_setinterval'] = function(block) {
var delay = block.getFieldValue('INTERVAL');
var name = block.getFieldValue('NAME');
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
delay *= 60000;
} else if (unit === 'sec') {
delay *= 1000;
}
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return name + ' = setInterval(function () {\n' + statements_name + '}, ' + delay + ');\n';
};
// --- clearInterval -----------------------------------------------------------
Blockly.Timeouts.blocks['timeouts_clearinterval'] =
'<block type="timeouts_clearinterval">'
+ ' <value name="NAME">'
+ ' </value>'
+ '</block>';
Blockly.Timeouts.getAllIntervals = function (workspace) {
var blocks = workspace.getAllBlocks();
var result = [];
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].isInterval_) {
result.push([blocks[i].getFieldValue('NAME'), blocks[i].getFieldValue('NAME')]);
}
}
if (!result.length) result.push(['', '']);
return result;
};
Blockly.Blocks['timeouts_clearinterval'] = {
init: function() {
this.appendDummyInput("NAME")
.appendField(Blockly.Words['timeouts_clearinterval'][systemLang])
.appendField(new Blockly.FieldDropdown(function () {
return Blockly.Timeouts.getAllIntervals(scripts.blocklyWorkspace);
}), "NAME");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.Timeouts.HUE);
this.setTooltip(Blockly.Words['timeouts_clearinterval_tooltip'][systemLang]);
this.setHelpUrl(getHelp('timeouts_clearinterval_help'));
}
};
Blockly.JavaScript['timeouts_clearinterval'] = function(block) {
var name = block.getFieldValue('NAME');
return '(function () {if (' + name + ') {clearInterval(' + name + '); ' + name + ' = null;}})();\n';
};

View File

@ -0,0 +1,857 @@
'use strict';
goog.provide('Blockly.JavaScript.Trigger');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('Trigger');
Blockly.Trigger = {
HUE: 330,
blocks: {}
};
// --- ON Extended-----------------------------------------------------------
Blockly.Trigger.blocks['on_ext'] =
'<block type="on_ext">'
+ ' <value name="CONDITION">'
+ ' </value>'
+ ' <value name="ACK_CONDITION">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['on_ext_oid_container'] = {
/**
* Mutator block for container.
* @this Blockly.Block
*/
init: function() {
this.setColour(Blockly.Trigger.HUE);
this.appendDummyInput()
.appendField(Blockly.Words['on_ext_on'][systemLang]);
this.appendStatementInput('STACK');
this.setTooltip(Blockly.Words['on_ext_on_tooltip'][systemLang]);
this.contextMenu = false;
}
};
Blockly.Blocks['on_ext_oid'] = {
/**
* Mutator block for add items.
* @this Blockly.Block
*/
init: function() {
this.setColour(Blockly.Trigger.HUE);
this.appendDummyInput('OID')
.appendField(Blockly.Words['on_ext_oid'][systemLang]);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Words['on_ext_oid_tooltip'][systemLang]);
this.contextMenu = false;
}
};
Blockly.Blocks['on_ext'] = {
init: function() {
this.itemCount_ = 1;
this.updateShape_();
this.setMutator(new Blockly.Mutator(['on_ext_oid']));
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['on_ext_tooltip'][systemLang]);
this.setHelpUrl(getHelp('on_help'));
},
/**
* Create XML to represent number of text inputs.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement('mutation');
container.setAttribute('items', this.itemCount_);
return container;
},
/**
* Parse XML to restore the text inputs.
* @param {!Element} xmlElement XML storage element.
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
this.updateShape_();
},
/**
* Populate the mutator's dialog with this block's components.
* @param {!Blockly.Workspace} workspace Mutator's workspace.
* @return {!Blockly.Block} Root block in mutator.
* @this Blockly.Block
*/
decompose: function (workspace) {
var containerBlock = workspace.newBlock('on_ext_oid_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('on_ext_oid');
itemBlock.initSvg();
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
/**
* Reconfigure this block based on the mutator dialog's components.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
compose: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
while (itemBlock) {
connections.push(itemBlock.valueConnection_);
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
// Disconnect any children that don't belong.
for (var i = 0; i < this.itemCount_; i++) {
var connection = this.getInput('OID' + i).connection.targetConnection;
if (connection && connections.indexOf(connection) === -1) {
connection.disconnect();
}
}
this.itemCount_ = connections.length;
if (this.itemCount_ < 1) this.itemCount_ = 1;
this.updateShape_();
// Reconnect any child blocks.
for (var i = 0; i < this.itemCount_; i++) {
Blockly.Mutator.reconnect(connections[i], this, 'OID' + i);
}
},
/**
* Store pointers to any connected child blocks.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
saveConnections: function(containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('OID' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
i++;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
},
/**
* Modify this block to have the correct number of inputs.
* @private
* @this Blockly.Block
*/
updateShape_: function() {
this.removeInput('CONDITION');
this.removeInput('ACK_CONDITION');
var input;
for (var j = 0; input = this.inputList[j]; j++) {
if (input.name === 'STATEMENT') {
this.inputList.splice(j, 1);
break;
}
}
// Add new inputs.
for (var i = 0; i < this.itemCount_; i++) {
var _input = this.getInput('OID' + i);
if (!_input) {
_input = this.appendValueInput('OID' + i);
if (i === 0) {
_input.appendField(Blockly.Words['on_ext'][systemLang]);
}
var shadow = this.workspace.newBlock('field_oid');
shadow.setShadow(true);
shadow.outputConnection.connect(_input.connection);
shadow.initSvg();
shadow.render();
} else {
if (!_input.connection.isConnected()) {
var shadow = this.workspace.newBlock('field_oid');
shadow.setShadow(true);
shadow.outputConnection.connect(_input.connection);
shadow.initSvg();
shadow.render();
}
}
}
// Remove deleted inputs.
while (this.getInput('OID' + i)) {
this.removeInput('OID' + i);
i++;
}
this.appendDummyInput('CONDITION')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['on_onchange'][systemLang], 'ne'],
[Blockly.Words['on_any'][systemLang], 'any'],
[Blockly.Words['on_gt'][systemLang], 'gt'],
[Blockly.Words['on_ge'][systemLang], 'ge'],
[Blockly.Words['on_lt'][systemLang], 'lt'],
[Blockly.Words['on_le'][systemLang], 'le'],
[Blockly.Words['on_true'][systemLang], 'true'],
[Blockly.Words['on_false'][systemLang], 'false']
]), 'CONDITION');
this.appendDummyInput('ACK_CONDITION')
.appendField(Blockly.Words['on_ack'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['on_ack_any'][systemLang], ''],
[Blockly.Words['on_ack_true'][systemLang], 'true'],
[Blockly.Words['on_ack_false'][systemLang], 'false']
]), 'ACK_CONDITION');
if (input) {
this.inputList.push(input);
}
else {
this.appendStatementInput('STATEMENT')
.setCheck(null)
}
}
};
Blockly.JavaScript['on_ext'] = function(block) {
var dropdown_condition = block.getFieldValue('CONDITION');
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
var ack_condition = block.getFieldValue('ACK_CONDITION');
var val;
if (dropdown_condition === 'true' || dropdown_condition === 'false') {
val = 'val: ' + dropdown_condition;
} else {
val = 'change: "' + dropdown_condition + '"';
}
var oids = [];
var firstID;
for (var n = 0; n < block.itemCount_; n++) {
var id = Blockly.JavaScript.valueToCode(block, 'OID' + n, Blockly.JavaScript.ORDER_COMMA);
if (id) {
firstID = id;
id = id.replace(/\./g, '\\\\.').replace(/\(/g, '\\\\(').replace(/\)/g, '\\\\)').replace(/\[/g, '\\\\[');
if (oids.indexOf(id) === -1) oids.push(id);
}
}
var oid;
if (oids.length === 1) {
oid = firstID;
} else {
oid = 'new RegExp(' + (oids.join(' + "|" + ') || '') + ')';
}
var code = 'on({id: ' + oid + ', ' + val + (ack_condition ? ', ack: ' + ack_condition : '') + '}, function (obj) {\n ' +
(oids.length === 1 ? 'var value = obj.state.val;\n var oldValue = obj.oldState.val;\n' : '') +
statements_name + '});\n';
return code;
};
// --- ON -----------------------------------------------------------
Blockly.Trigger.blocks['on'] =
'<block type="on">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="CONDITION">'
+ ' </value>'
+ ' <value name="ACK_CONDITION">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['on'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['on'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID('Object ID', main.initSelectId(), main.objects), 'OID');
this.appendDummyInput('CONDITION')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['on_onchange'][systemLang], 'ne'],
[Blockly.Words['on_any'][systemLang], 'any'],
[Blockly.Words['on_gt'][systemLang], 'gt'],
[Blockly.Words['on_ge'][systemLang], 'ge'],
[Blockly.Words['on_lt'][systemLang], 'lt'],
[Blockly.Words['on_le'][systemLang], 'le'],
[Blockly.Words['on_true'][systemLang], 'true'],
[Blockly.Words['on_false'][systemLang], 'false']
]), 'CONDITION');
this.appendDummyInput('ACK_CONDITION')
.appendField(Blockly.Words['on_ack'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['on_ack_any'][systemLang], ''],
[Blockly.Words['on_ack_true'][systemLang], 'true'],
[Blockly.Words['on_ack_false'][systemLang], 'false']
]), 'ACK_CONDITION');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['on_tooltip'][systemLang]);
this.setHelpUrl(getHelp('on_help'));
}
};
Blockly.JavaScript['on'] = function(block) {
var value_objectid = block.getFieldValue('OID');
var dropdown_condition = block.getFieldValue('CONDITION');
var ack_condition = block.getFieldValue('ACK_CONDITION');
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
var objectname = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var val;
if (dropdown_condition === 'true' || dropdown_condition === 'false') {
val = 'val: ' + dropdown_condition;
} else {
val = 'change: "' + dropdown_condition + '"';
}
var code = 'on({id: "' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + val + (ack_condition ? ', ack: ' + ack_condition : '') + '}, function (obj) {\n var value = obj.state.val;\n var oldValue = obj.oldState.val;\n' + statements_name + '});\n';
return code;
};
// --- get info about event -----------------------------------------------------------
Blockly.Trigger.blocks['on_source'] =
'<block type="on_source">'
+ ' <value name="ATTR">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['on_source'] = {
/**
* Block for conditionally returning a value from a procedure.
* @this Blockly.Block
*/
init: function() {
this.appendDummyInput('ATTR')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['on_source_id'][systemLang], 'id'],
[Blockly.Words['on_source_name'][systemLang], 'common.name'],
[Blockly.Words['on_source_desc'][systemLang], 'common.desc'],
[Blockly.Words['on_source_channel_id'][systemLang], 'channelId'],
[Blockly.Words['on_source_channel_name'][systemLang], 'channelName'],
[Blockly.Words['on_source_device_id'][systemLang], 'deviceId'],
[Blockly.Words['on_source_device_name'][systemLang], 'deviceName'],
[Blockly.Words['on_source_state_val'][systemLang], 'state.val'],
[Blockly.Words['on_source_state_ts'][systemLang], 'state.ts'],
[Blockly.Words['on_source_state_q'][systemLang], 'state.q'],
[Blockly.Words['on_source_state_from'][systemLang], 'state.from'],
[Blockly.Words['on_source_state_ack'][systemLang], 'state.ack'],
[Blockly.Words['on_source_state_lc'][systemLang], 'state.lc'],
[Blockly.Words['on_source_oldstate_val'][systemLang], 'oldState.val'],
[Blockly.Words['on_source_oldstate_ts'][systemLang], 'oldState.ts'],
[Blockly.Words['on_source_oldstate_q'][systemLang], 'oldState.q'],
[Blockly.Words['on_source_oldstate_from'][systemLang], 'oldState.from'],
[Blockly.Words['on_source_oldstate_ack'][systemLang], 'oldState.ack'],
[Blockly.Words['on_source_oldstate_lc'][systemLang], 'oldState.lc']
]), 'ATTR');
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['on_source_tooltip'][systemLang]);
this.setHelpUrl(getHelp('on_help'));
},
/**
* Called whenever anything on the workspace changes.
* Add warning if this flow block is not nested inside a loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function(e) {
var legal = false;
// Is the block nested in a trigger?
var block = this;
do {
if (this.FUNCTION_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Words['on_source_warning'][systemLang]);
}
},
/**
* List of block types that are functions and thus do not need warnings.
* To add a new function type add this to your code:
* Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func');
*/
FUNCTION_TYPES: ['on', 'on_ext']
};
Blockly.JavaScript['on_source'] = function(block) {
var attr = block.getFieldValue('ATTR');
var parts = attr.split('.');
if (parts.length > 1) {
attr = '(obj.' + parts[0] + ' ? obj.' + attr + ' : "")';
} else {
attr = 'obj.' + attr;
}
return [attr, Blockly.JavaScript.ORDER_ATOMIC];
};
// --- SCHEDULE -----------------------------------------------------------
Blockly.Trigger.blocks['schedule'] =
'<block type="schedule">'
+ ' <value name="SCHEDULE">'
//+ ' <shadow type="text">'
//+ ' <field name="TEXT">test</field>'
//+ ' </shadow>'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['schedule'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['schedule'][systemLang]);
this.appendDummyInput('SCHEDULE')
.appendField(new Blockly.FieldCRON('* * * * *'), 'SCHEDULE');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['schedule_tooltip'][systemLang]);
this.setHelpUrl(getHelp('schedule_help'));
}
};
Blockly.JavaScript['schedule'] = function(block) {
var schedule = block.getFieldValue('SCHEDULE');
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'schedule("' + schedule +'", function () {\n' + statements_name + '});\n';
};
// --- ASTRO -----------------------------------------------------------
Blockly.Trigger.blocks['astro'] =
'<block type="astro">'
+ ' <value name="TYPE">'
//+ ' <shadow type="text">'
//+ ' <field name="TEXT">test</field>'
//+ ' </shadow>'
+ ' </value>'
+ ' <value name="OFFSET">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['astro'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['astro'][systemLang]);
this.appendDummyInput("TYPE")
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['astro_sunriseText'][systemLang], "sunrise"],
[Blockly.Words['astro_sunriseEndText'][systemLang], "sunriseEnd"],
[Blockly.Words['astro_goldenHourEndText'][systemLang], "goldenHourEnd"],
[Blockly.Words['astro_solarNoonText'][systemLang], "solarNoon"],
[Blockly.Words['astro_goldenHourText'][systemLang], "goldenHour"],
[Blockly.Words['astro_sunsetStartText'][systemLang], "sunsetStart"],
[Blockly.Words['astro_sunsetText'][systemLang], "sunset"],
[Blockly.Words['astro_duskText'][systemLang], "dusk"],
[Blockly.Words['astro_nauticalDuskText'][systemLang], "nauticalDusk"],
[Blockly.Words['astro_nightText'][systemLang], "night"],
[Blockly.Words['astro_nightEndText'][systemLang], "nightEnd"],
[Blockly.Words['astro_nauticalDawnText'][systemLang], "nauticalDawn"],
[Blockly.Words['astro_dawnText'][systemLang], "dawn"],
[Blockly.Words['astro_nadirText'][systemLang], "nadir"]
]), 'TYPE');
this.appendDummyInput()
.appendField(Blockly.Words['astro_offset'][systemLang]);
this.appendDummyInput("OFFSET")
.appendField(new Blockly.FieldTextInput("0"), "OFFSET");
this.appendDummyInput()
.appendField(Blockly.Words['astro_minutes'][systemLang]);
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['astro_tooltip'][systemLang]);
this.setHelpUrl(getHelp('astro_help'));
}
};
Blockly.JavaScript['astro'] = function(block) {
var astrotype = block.getFieldValue('TYPE');
var offset = parseInt(block.getFieldValue('OFFSET'), 10);
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'schedule({astro: "' + astrotype + '", shift: ' + offset + '}, function () {\n' + statements_name + '});\n';
};
// --- set named schedule -----------------------------------------------------------
Blockly.Trigger.blocks['schedule_create'] =
'<block type="schedule_create">'
+ ' <value name="NAME">'
+ ' </value>'
+ ' <value name="SCHEDULE">'
+ ' <shadow type="field_cron">'
+ ' <field name="CRON">* * * * *</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
/**
* Ensure two identically-named procedures don't exist.
* @param {string} name Proposed procedure name.
* @param {!Blockly.Block} block Block to disambiguate.
* @return {string} Non-colliding name.
*/
Blockly.Trigger.findLegalName = function(name, block) {
if (block.isInFlyout) {
// Flyouts can have multiple procedures called 'do something'.
return name;
}
while (!Blockly.Trigger.isLegalName_(name, block.workspace, block)) {
// Collision with another procedure.
var r = name.match(/^(.*?)(\d+)$/);
if (!r) {
name += '2';
} else {
name = r[1] + (parseInt(r[2], 10) + 1);
}
}
return name;
};
/**
* Does this procedure have a legal name? Illegal names include names of
* procedures already defined.
* @param {string} name The questionable name.
* @param {!Blockly.Workspace} workspace The workspace to scan for collisions.
* @param {Blockly.Block=} opt_exclude Optional block to exclude from
* comparisons (one doesn't want to collide with oneself).
* @return {boolean} True if the name is legal.
* @private
*/
Blockly.Trigger.isLegalName_ = function(name, workspace, opt_exclude) {
var blocks = workspace.getAllBlocks();
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
if (blocks[i] == opt_exclude) {
continue;
}
if (blocks[i].isSchedule_) {
var blockName = blocks[i].getFieldValue('NAME');
if (Blockly.Names.equals(blockName, name)) {
return false;
}
}
}
return true;
};
/**
* Rename a procedure. Called by the editable field.
* @param {string} name The proposed new name.
* @return {string} The accepted name.
* @this {!Blockly.Field}
*/
Blockly.Trigger.rename = function (name) {
// Strip leading and trailing whitespace. Beyond this, all names are legal.
name = name.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
return Blockly.Trigger.findLegalName(name, this.sourceBlock_);
};
Blockly.Blocks['schedule_create'] = {
init: function() {
var nameField = new Blockly.FieldTextInput(
Blockly.Trigger.findLegalName('schedule', this),
Blockly.Trigger.rename);
nameField.setSpellcheck(false);
this.appendDummyInput('NAME')
.appendField(Blockly.Words['schedule_create'][systemLang])
.appendField(nameField, 'NAME');
this.appendValueInput('SCHEDULE')
.appendField(Blockly.Words['schedule_text'][systemLang]);
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['schedule_create_tooltip'][systemLang]);
this.setHelpUrl(getHelp('schedule_create_help'));
},
isSchedule_: true,
getVars: function () {
return [this.getFieldValue('NAME')];
}
};
Blockly.JavaScript['schedule_create'] = function(block) {
var name = block.getFieldValue('NAME');
var schedule = Blockly.JavaScript.valueToCode(block, 'SCHEDULE', Blockly.JavaScript.ORDER_ATOMIC);
var statements_name = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return name + ' = schedule(' + schedule + ', function () {\n' + statements_name + '});\n';
};
// --- clearSchedule -----------------------------------------------------------
Blockly.Trigger.getAllSchedules = function (workspace) {
var blocks = workspace.getAllBlocks();
var result = [];
// Iterate through every block and check the name.
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].isSchedule_) {
result.push([blocks[i].getFieldValue('NAME'), blocks[i].getFieldValue('NAME')]);
}
}
if (!result.length) result.push(['', '']);
return result;
};
Blockly.Trigger.blocks['schedule_clear'] =
'<block type="schedule_clear">'
+ ' <value name="NAME">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['schedule_clear'] = {
init: function() {
this.appendDummyInput('NAME')
.appendField(Blockly.Words['schedule_clear'][systemLang])
.appendField(new Blockly.FieldDropdown(function () {
return Blockly.Trigger.getAllSchedules(scripts.blocklyWorkspace);
}), 'NAME');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.Trigger.HUE);
this.setTooltip(Blockly.Words['schedule_clear_tooltip'][systemLang]);
this.setHelpUrl(getHelp('schedule_clear_help'));
}
};
Blockly.JavaScript['schedule_clear'] = function(block) {
var name = block.getFieldValue('NAME');
return '(function () {if (' + name + ') {clearSchedule(' + name + '); ' + name + ' = null;}})();\n';
};
// --- CRON dialog --------------------------------------------------
Blockly.Trigger.blocks['field_cron'] =
'<block type="field_cron">'
+ ' <value name="CRON">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['field_cron'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['field_cron_CRON'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldCRON('* * * * *'), 'CRON');
this.setInputsInline(true);
this.setColour(Blockly.Trigger.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['field_cron_tooltip'][systemLang]);
}
};
Blockly.JavaScript['field_cron'] = function(block) {
var oid = block.getFieldValue('CRON');
return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC]
};
// --- CRON builder --------------------------------------------------
Blockly.Trigger.blocks['cron_builder'] =
'<block type="cron_builder">'
+ ' <value name="LINE">'
+ ' </value>'
+ ' <value name="MINUTES">'
+ ' </value>'
+ ' <value name="HOURS">'
+ ' </value>'
+ ' <value name="DAYS">'
+ ' </value>'
+ ' <value name="MONTHS">'
+ ' </value>'
+ ' <value name="WEEKDAYS">'
+ ' </value>'
+ ' <value name="WITH_SECONDS">'
+ ' </value>'
+ ' <mutation seconds="false"></mutation>'
+ '</block>';
Blockly.Blocks['cron_builder'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['cron_builder_CRON'][systemLang]);
this.appendDummyInput('LINE')
.appendField(Blockly.Words['cron_builder_line'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function (option) {
this.sourceBlock_.setInputsInline(option == true);
}), 'LINE');
var _input = this.appendValueInput('DOW')
.appendField(Blockly.Words['cron_builder_dow'][systemLang]);
var _shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
_input = this.appendValueInput('MONTHS')
.appendField(Blockly.Words['cron_builder_month'][systemLang]);
_shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
_input = this.appendValueInput('DAYS')
.appendField(Blockly.Words['cron_builder_day'][systemLang]);
_shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
_input = this.appendValueInput('HOURS')
.appendField(Blockly.Words['cron_builder_hour'][systemLang]);
_shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
_input = this.appendValueInput('MINUTES')
.appendField(Blockly.Words['cron_builder_minutes'][systemLang]);
_shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
this.appendDummyInput('WITH_SECONDS')
.appendField(Blockly.Words['cron_builder_with_seconds'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function (option) {
var withSeconds = (option == true);
this.sourceBlock_.updateShape_(withSeconds);
}), 'WITH_SECONDS');
this.seconds_ = false;
this.as_line_ = false;
this.setInputsInline(this.as_line_);
this.setColour(Blockly.Trigger.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['field_cron_tooltip'][systemLang]);
},
/**
* Create XML to represent number of text inputs.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement('mutation');
container.setAttribute('seconds', this.seconds_);
container.setAttribute('as_line', this.as_line_);
return container;
},
/**
* Parse XML to restore the text inputs.
* @param {!Element} xmlElement XML storage element.
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
this.seconds_ = xmlElement.getAttribute('seconds') === 'true';
this.as_line_ = xmlElement.getAttribute('as_line') === 'true';
this.setInputsInline(this.as_line_);
this.updateShape_(this.seconds_);
},
updateShape_: function(withSeconds) {
this.seconds_ = withSeconds;
// Add or remove a statement Input.
var inputExists = this.getInput('SECONDS');
if (withSeconds) {
if (!inputExists) {
var _input = this.appendValueInput('SECONDS');
_input.appendField(Blockly.Words['cron_builder_seconds'][systemLang]);
var _shadow = this.workspace.newBlock('text');
_shadow.setShadow(true);
_shadow.setFieldValue('*', 'TEXT');
_shadow.outputConnection.connect(_input.connection);
_shadow.initSvg();
_shadow.render();
}
} else if (inputExists) {
this.removeInput('SECONDS');
}
}
};
Blockly.JavaScript['cron_builder'] = function(block) {
var dow = Blockly.JavaScript.valueToCode(block, 'DOW', Blockly.JavaScript.ORDER_ATOMIC);
var months = Blockly.JavaScript.valueToCode(block, 'MONTHS', Blockly.JavaScript.ORDER_ATOMIC);
var days = Blockly.JavaScript.valueToCode(block, 'DAYS', Blockly.JavaScript.ORDER_ATOMIC);
var hours = Blockly.JavaScript.valueToCode(block, 'HOURS', Blockly.JavaScript.ORDER_ATOMIC);
var minutes = Blockly.JavaScript.valueToCode(block, 'MINUTES', Blockly.JavaScript.ORDER_ATOMIC);
var seconds = Blockly.JavaScript.valueToCode(block, 'SECONDS', Blockly.JavaScript.ORDER_ATOMIC);
var withSeconds = block.getFieldValue('WITH_SECONDS');
var code = ((withSeconds === 'TRUE') ? seconds + '.trim() + \' \' + ' : '') + minutes + '.trim() + \' \' + ' + hours + '.trim() + \' \' + ' + days + '.trim() + \' \' + ' + months + '.trim() + \' \' + ' + dow + '.trim()';
return [code, Blockly.JavaScript.ORDER_ATOMIC]
};

View File

@ -0,0 +1,400 @@
if (typeof Blockly === 'undefined') {
var Blockly = {};
}
// translations
Blockly.Words = {};
// --- ACTION --------------------------------------------------
Blockly.Words['Action'] = {'en': 'Actions', 'de': 'Aktionen', 'ru': 'Действия', 'pt': 'Ações', 'nl': 'Acties', 'fr': 'Actes', 'it': 'Azioni', 'es': 'Comportamiento'};
// --- action exec --------------------------------------------------
Blockly.Words['exec'] = {'en': 'exec', 'de': 'exec', 'ru': 'exec', 'pt': 'exec', 'nl': 'exec', 'fr': 'exec', 'it': 'exec', 'es': 'ejecutivo'};
Blockly.Words['exec_statement'] = {'en': 'with results', 'de': 'mit Ergebnissen', 'ru': 'анализировать результаты', 'pt': 'com resultados', 'nl': 'met resultaten', 'fr': 'avec des résultats', 'it': 'con risultati', 'es': 'con resultados'};
Blockly.Words['exec_command'] = {'en': 'command', 'de': 'Befehl', 'ru': 'команда', 'pt': 'comando', 'nl': 'opdracht', 'fr': 'commander', 'it': 'comando', 'es': 'mando'};
Blockly.Words['exec_tooltip'] = {'en': 'Execute some command', 'de': 'Einen System-Befehl ausführen', 'ru': 'Выполнить системную команду', 'pt': 'Execute algum comando', 'nl': 'Voer een commando uit', 'fr': 'Exécuter une commande', 'it': 'Esegui un comando', 'es': 'Ejecuta algún comando'};
Blockly.Words['exec_help'] = {'en': 'exec---execute-some-os-command-like-cp-file1-file2', 'de': 'exec---execute-some-os-command-like-cp-file1-file2', 'ru': 'exec---execute-some-os-command-like-cp-file1-file2', 'pt': 'exec---execute-some-os-command-like-cp-file1-file2', 'nl': 'exec---execute-some-os-command-like-cp-file1-file2', 'fr': 'exec---execute-some-os-command-like-cp-file1-file2', 'it': 'exec---execute-some-os-command-like-cp-file1-file2', 'es': 'exec---execute-some-os-command-like-cp-file1-file2'};
Blockly.Words['exec_log'] = {'en': 'log level', 'de': 'Loglevel', 'ru': 'Протокол', 'pt': 'nível de log', 'nl': 'Log niveau', 'fr': 'niveau de journalisation', 'it': 'livello di registro', 'es': 'nivel de registro'};
Blockly.Words['exec_log_none'] = {'en': 'none', 'de': 'keins', 'ru': 'нет', 'pt': 'Nenhum', 'nl': 'geen', 'fr': 'aucun', 'it': 'nessuna', 'es': 'ninguna'};
Blockly.Words['exec_log_info'] = {'en': 'info', 'de': 'info', 'ru': 'инфо', 'pt': 'informação', 'nl': 'info', 'fr': 'Info', 'it': 'Informazioni', 'es': 'información'};
Blockly.Words['exec_log_debug'] = {'en': 'debug', 'de': 'debug', 'ru': 'debug', 'pt': 'depurar', 'nl': 'debug', 'fr': 'déboguer', 'it': 'mettere a punto', 'es': 'depurar'};
Blockly.Words['exec_log_warn'] = {'en': 'warning', 'de': 'warning', 'ru': 'warning', 'pt': 'Atenção', 'nl': 'waarschuwing', 'fr': 'Attention', 'it': 'avvertimento', 'es': 'advertencia'};
Blockly.Words['exec_log_error'] = {'en': 'error', 'de': 'error', 'ru': 'ошибка', 'pt': 'erro', 'nl': 'fout', 'fr': 'Erreur', 'it': 'errore', 'es': 'error'};
// --- action request --------------------------------------------------
Blockly.Words['request'] = {'en': 'request', 'de': 'request', 'ru': 'request', 'pt': 'pedido', 'nl': 'verzoek', 'fr': 'demande', 'it': 'richiesta', 'es': 'solicitud'};
Blockly.Words['request_url'] = {'en': 'URL', 'de': 'URL', 'ru': 'URL', 'pt': 'URL', 'nl': 'URL', 'fr': 'URL', 'it': 'URL', 'es': 'URL'};
Blockly.Words['request_statement'] = {'en': 'with results', 'de': 'mit Ergebnissen', 'ru': 'анализировать результаты', 'pt': 'com resultados', 'nl': 'met resultaten', 'fr': 'avec des résultats', 'it': 'con risultati', 'es': 'con resultados'};
Blockly.Words['request_tooltip'] = {'en': 'Request URL', 'de': 'URL abfragen', 'ru': 'Запросить URL', 'pt': 'URL do pedido', 'nl': 'Verzoek om URL', 'fr': 'Demander une URL', 'it': 'URL di richiesta', 'es': 'URL de solicitud'};
Blockly.Words['request_help'] = {'en': 'https://git.spacen.net/request/request', 'de': 'https://git.spacen.net/request/request', 'ru': 'https://git.spacen.net/request/request', 'pt': 'https://git.spacen.net/request/request', 'nl': 'https://git.spacen.net/request/request', 'fr': 'https://git.spacen.net/request/request', 'it': 'https://git.spacen.net/request/request', 'es': 'https://git.spacen.net/request/request'};
Blockly.Words['request_log'] = {'en': 'log level', 'de': 'Loglevel', 'ru': 'Протокол', 'pt': 'nível de log', 'nl': 'Log niveau', 'fr': 'niveau de journalisation', 'it': 'livello di registro', 'es': 'nivel de registro'};
Blockly.Words['request_log_none'] = {'en': 'none', 'de': 'keins', 'ru': 'нет', 'pt': 'Nenhum', 'nl': 'geen', 'fr': 'aucun', 'it': 'nessuna', 'es': 'ninguna'};
Blockly.Words['request_log_info'] = {'en': 'info', 'de': 'info', 'ru': 'инфо', 'pt': 'informação', 'nl': 'info', 'fr': 'Info', 'it': 'Informazioni', 'es': 'información'};
Blockly.Words['request_log_debug'] = {'en': 'debug', 'de': 'debug', 'ru': 'debug', 'pt': 'depurar', 'nl': 'debug', 'fr': 'déboguer', 'it': 'mettere a punto', 'es': 'depurar'};
Blockly.Words['request_log_warn'] = {'en': 'warning', 'de': 'warning', 'ru': 'warning', 'pt': 'Atenção', 'nl': 'waarschuwing', 'fr': 'Attention', 'it': 'avvertimento', 'es': 'advertencia'};
Blockly.Words['request_log_error'] = {'en': 'error', 'de': 'error', 'ru': 'ошибка', 'pt': 'erro', 'nl': 'fout', 'fr': 'Erreur', 'it': 'errore', 'es': 'error'};
// --- CONVERT --------------------------------------------------
Blockly.Words['Convert'] = {'en': 'Convert', 'de': 'Konvertierung', 'ru': 'Конвертация', 'pt': 'Converter', 'nl': 'Converteren', 'fr': 'Convertir', 'it': 'Convertire', 'es': 'Convertir'};
// --- convert convert --------------------------------------------------
Blockly.Words['convert_tonumber'] = {'en': 'toNumber', 'de': 'nach Zahl', 'ru': 'в число', 'pt': 'enumerar', 'nl': 'toNumber', 'fr': 'toNumber', 'it': 'ToNumber', 'es': 'Al numero'};
Blockly.Words['convert_tonumber_tooltip'] = {'en': 'Cast input to number', 'de': 'Wandle Eingang nach Zahl', 'ru': 'Преобразовать вход в число', 'pt': 'Transmitir entrada para o número', 'nl': 'Cast input naar nummer', 'fr': 'Transmettre l\'entrée au numéro', 'it': 'Trasmetti l\'input al numero', 'es': 'Emitir entrada al número'};
Blockly.Words['convert_toboolean'] = {'en': 'toBoolean', 'de': 'nach Logikwert', 'ru': 'в булево значение', 'pt': 'toBoolean', 'nl': 'toBoolean', 'fr': 'toBooléen', 'it': 'toBoolean', 'es': 'toBoolean'};
Blockly.Words['convert_toboolean_tooltip'] = {'en': 'Cast input to boolean', 'de': 'Wandle Input nach Logikwert', 'ru': 'Преобразовать вход в булево значение', 'pt': 'Transmitir entrada para booleano', 'nl': 'Cast input naar boolean', 'fr': 'Transmettre l\'entrée au booléen', 'it': 'Trasmetti l\'input a booleano', 'es': 'Enviar entrada a boolean'};
Blockly.Words['convert_tostring'] = {'en': 'toString', 'de': 'nach String', 'ru': 'в строку', 'pt': 'para sequenciar', 'nl': 'toString', 'fr': 'toString', 'it': 'accordare', 'es': 'Encadenar'};
Blockly.Words['convert_tostring_tooltip'] = {'en': 'Cast input to number', 'de': 'Wandle Input nach String', 'ru': 'Преобразовать вход в строку', 'pt': 'Transmitir entrada para o número', 'nl': 'Cast input naar nummer', 'fr': 'Transmettre l\'entrée au numéro', 'it': 'Trasmetti l\'input al numero', 'es': 'Emitir entrada al número'};
Blockly.Words['convert_type'] = {'en': 'type of', 'de': 'Typ von', 'ru': 'взять тип', 'pt': 'tipo de', 'nl': 'soort van', 'fr': 'Type de', 'it': 'tipo di', 'es': 'tipo de'};
Blockly.Words['convert_type_tooltip'] = {'en': 'Returns type of input', 'de': 'Typ von Input', 'ru': 'Взять тип входа', 'pt': 'Retorna o tipo de entrada', 'nl': 'Retourneert het type invoer', 'fr': 'Renvoie le type d\'entrée', 'it': 'Restituisce il tipo di input', 'es': 'Devuelve tipo de entrada'};
Blockly.Words['convert_to_date'] = {'en': 'to Date/Time', 'de': 'nach Datum/Zeit', 'ru': 'в дату/время', 'pt': 'até a data/hora', 'nl': 'tot datum/tijd', 'fr': 'à date/heure', 'it': 'alla data/ora', 'es': 'hasta la fecha/hora'};
Blockly.Words['convert_to_date_tooltip'] = {'en': 'Cast input to date', 'de': 'Wandle Input nach Datum', 'ru': 'Преобразовать вход в дату', 'pt': 'Entrada em destaque até à data', 'nl': 'Cast input tot op heden', 'fr': 'Diffuser l\'entrée à ce jour', 'it': 'Trasmetti l\'input fino alla data', 'es': 'Emitir entrada hasta la fecha'};
Blockly.Words['convert_from_date'] = {'en': 'date/time', 'de': 'Datum/Zeit', 'ru': 'дату/время', 'pt': 'data hora', 'nl': 'datum Tijd', 'fr': 'date/heure', 'it': 'appuntamento', 'es': 'fecha y hora'};
Blockly.Words['convert_to'] = {'en': 'to', 'de': 'nach', 'ru': 'в', 'pt': 'para', 'nl': 'naar', 'fr': 'à', 'it': 'a', 'es': 'a'};
Blockly.Words['convert_from_date_tooltip'] = {'en': 'Cast input from date', 'de': 'erzeuge Input aus Datum', 'ru': 'Преобразовать вход из даты', 'pt': 'Entrada de elenco a partir da data', 'nl': 'Cast-invoer vanaf datum', 'fr': 'Transmettre l\'entrée de la date', 'it': 'Trasmetti input dalla data', 'es': 'Emitir entrada desde la fecha'};
Blockly.Words['convert_json2object'] = {'en': 'JSON to object', 'de': 'JSON nach Objekt', 'ru': 'JSON в объект', 'pt': 'JSON para objetar', 'nl': 'JSON om bezwaar aan te tekenen', 'fr': 'JSON à objet', 'it': 'JSON per obiettare', 'es': 'JSON para objetar'};
Blockly.Words['convert_json2object_tooltip'] = {'en': 'Parse JSON string', 'de': 'Parse JSON', 'ru': 'Преобразовать JSON в объект', 'pt': 'Parse JSON string', 'nl': 'Ontleed JSON-tekenreeks', 'fr': 'Parse JSON chaîne', 'it': 'Analizza la stringa JSON', 'es': 'Cadena Parson JSON'};
Blockly.Words['convert_object2json'] = {'en': 'object to JSON', 'de': 'Objekt nach JSON', 'ru': 'объект в JSON', 'pt': 'Objeto para JSON', 'nl': 'bezwaar tegen JSON', 'fr': 'objet à JSON', 'it': 'oggetto a JSON', 'es': 'objetar a JSON'};
Blockly.Words['convert_object2json_tooltip'] = {'en': 'Strinify object', 'de': 'Objekt nach JSON', 'ru': 'Преобразовать объект в JSON', 'pt': 'Strinify objeto', 'nl': 'Strinify-object', 'fr': 'Strinify objet', 'it': 'Strinificare l\'oggetto', 'es': 'Objeto Strinify'};
Blockly.Words['convert_object2json_prettify'] = {'en': 'prettify', 'de': 'formatieren', 'ru': 'форматировать', 'pt': 'embelezar', 'nl': 'leuk maken', 'fr': 'enjoliver', 'it': 'abbellire', 'es': 'embellecer'};
// --- SENDTO --------------------------------------------------
Blockly.Words['Sendto'] = {'en': 'Sendto', 'de': 'Sendto', 'ru': 'Sendto', 'pt': 'Enviar para', 'nl': 'Verzenden naar', 'fr': 'Envoyer à', 'it': 'Inviare a', 'es': 'Enviar a'};
// --- sendto sendto --------------------------------------------------
Blockly.Words['sendto_message'] = {'en': 'message', 'de': 'Meldung', 'ru': 'сообщение', 'pt': 'mensagem', 'nl': 'bericht', 'fr': 'message', 'it': 'Messaggio', 'es': 'mensaje'};
Blockly.Words['sendto_custom'] = {'en': 'sendTo', 'de': 'sendTo', 'ru': 'sendTo', 'pt': 'enviar para', 'nl': 'verzenden naar', 'fr': 'envoyer à', 'it': 'inviare a', 'es': 'enviar a'};
Blockly.Words['sendto_custom_tooltip'] = {'en': 'Text to speech', 'de': 'Text zu Sprache', 'ru': 'Произнести сообщение', 'pt': 'Texto para fala', 'nl': 'Tekst naar spraak', 'fr': 'Texte pour parler', 'it': 'Sintesi vocale', 'es': 'Texto a voz'};
Blockly.Words['sendto_custom_help'] = {'en': 'sendto', 'de': 'sendto', 'ru': 'sendto', 'pt': 'enviar para', 'nl': 'verzenden naar', 'fr': 'envoyer à', 'it': 'inviare a', 'es': 'enviar a'};
Blockly.Words['sendto_custom_arguments'] = {'en': 'parameters', 'de': 'Parameter', 'ru': 'параметры', 'pt': 'parâmetros', 'nl': 'parameters', 'fr': 'paramètres', 'it': 'parametri', 'es': 'parámetros'};
Blockly.Words['sendto_custom_command'] = {'en': 'command', 'de': 'Befehl', 'ru': 'команда', 'pt': 'comando', 'nl': 'opdracht', 'fr': 'commander', 'it': 'comando', 'es': 'mando'};
Blockly.Words['sendto_custom_argument'] = {'en': 'parameter', 'de': 'Parameter', 'ru': 'параметр', 'pt': 'parâmetro', 'nl': 'parameter', 'fr': 'paramètre', 'it': 'parametro', 'es': 'parámetro'};
Blockly.Words['sendto_custom_arg_tooltip'] = {'en': 'Add parameter to sendTo object.', 'de': 'Parameter zum sendTo-Objekt hinzufügen', 'ru': 'Добавить параметр к sendTo объекту', 'pt': 'Adicione o parâmetro ao objeto sendTo.', 'nl': 'Parameter toevoegen aan het object sendTo.', 'fr': 'Ajouter un paramètre à l\'objet sendTo.', 'it': 'Aggiungi parametro all\'oggetto sendTo.', 'es': 'Agregar parámetro al objeto sendTo.'};
Blockly.Words['sendto_log'] = {'en': 'log level', 'de': 'Loglevel', 'ru': 'Протокол', 'pt': 'nível de log', 'nl': 'Log niveau', 'fr': 'niveau de journalisation', 'it': 'livello di registro', 'es': 'nivel de registro'};
Blockly.Words['sendto_log_none'] = {'en': 'none', 'de': 'keins', 'ru': 'нет', 'pt': 'Nenhum', 'nl': 'geen', 'fr': 'aucun', 'it': 'nessuna', 'es': 'ninguna'};
Blockly.Words['sendto_log_info'] = {'en': 'info', 'de': 'info', 'ru': 'инфо', 'pt': 'informação', 'nl': 'info', 'fr': 'Info', 'it': 'Informazioni', 'es': 'información'};
Blockly.Words['sendto_log_debug'] = {'en': 'debug', 'de': 'debug', 'ru': 'debug', 'pt': 'depurar', 'nl': 'debug', 'fr': 'déboguer', 'it': 'mettere a punto', 'es': 'depurar'};
Blockly.Words['sendto_log_warn'] = {'en': 'warning', 'de': 'warning', 'ru': 'warning', 'pt': 'Atenção', 'nl': 'waarschuwing', 'fr': 'Attention', 'it': 'avvertimento', 'es': 'advertencia'};
Blockly.Words['sendto_log_error'] = {'en': 'error', 'de': 'error', 'ru': 'ошибка', 'pt': 'erro', 'nl': 'fout', 'fr': 'Erreur', 'it': 'errore', 'es': 'error'};
// --- SYSTEM --------------------------------------------------
Blockly.Words['System'] = {'en': 'System', 'de': 'System', 'ru': 'Системные', 'pt': 'Sistema', 'nl': 'Systeem', 'fr': 'Système', 'it': 'Sistema', 'es': 'Sistema'};
// --- system debug --------------------------------------------------
Blockly.Words['debug'] = {'en': 'debug output', 'de': 'debug output', 'ru': 'debug output', 'pt': 'saída de depuração', 'nl': 'debug output', 'fr': 'sortie de débogage', 'it': 'uscita di debug', 'es': 'salida de depuración'};
Blockly.Words['debug_tooltip'] = {'en': 'Debug', 'de': 'Debug', 'ru': 'Debug', 'pt': 'Depurar', 'nl': 'debug', 'fr': 'Déboguer', 'it': 'mettere a punto', 'es': 'Depurar'};
Blockly.Words['debug_help'] = {'en': 'log---gives-out-the-message-into-log', 'de': 'log---gives-out-the-message-into-log', 'ru': 'log---gives-out-the-message-into-log', 'pt': 'log---gives-out-the-message-into-log', 'nl': 'log---gives-out-the-message-into-log', 'fr': 'log---gives-out-the-message-into-log', 'it': 'log---gives-out-the-message-into-log', 'es': 'log---gives-out-the-message-into-log'};
// --- system comment --------------------------------------------------
Blockly.Words['comment'] = {'en': 'comment', 'de': 'Kommentar', 'ru': 'описание', 'pt': 'Comente', 'nl': 'commentaar', 'fr': 'commentaire', 'it': 'commento', 'es': 'comentario'};
Blockly.Words['comment_tooltip'] = {'en': 'Enter comment to explain the code', 'de': 'Debug', 'ru': 'Debug', 'pt': 'Digite o comentário para explicar o código', 'nl': 'Voer een opmerking in om de code uit te leggen', 'fr': 'Entrez un commentaire pour expliquer le code', 'it': 'Inserisci il commento per spiegare il codice', 'es': 'Ingrese un comentario para explicar el código'};
// --- system control --------------------------------------------------
Blockly.Words['control'] = {'en': 'сontrol', 'de': 'steuere', 'ru': 'установить', 'pt': 'controlar', 'nl': 'сontrol', 'fr': 'contrôle', 'it': 'сontrol', 'es': 'ontrol'};
Blockly.Words['control_tooltip'] = {'en': 'Control state', 'de': 'Steuere Zustand', 'ru': 'Установить состояние', 'pt': 'Estado de controle', 'nl': 'Controlestatus', 'fr': 'Etat de contrôle', 'it': 'Stato di controllo', 'es': 'Estado de control'};
Blockly.Words['control_help'] = {'en': 'setstate', 'de': 'setstate', 'ru': 'setstate', 'pt': 'settate', 'nl': 'setstate', 'fr': 'setstate', 'it': 'setstate', 'es': 'setstate'};
Blockly.Words['control_with'] = {'en': 'with', 'de': 'mit', 'ru': 'на', 'pt': 'com', 'nl': 'met', 'fr': 'avec', 'it': 'con', 'es': 'con'};
Blockly.Words['control_delay'] = {'en': 'with delay', 'de': 'mit Verzögerung', 'ru': 'с задержкой', 'pt': 'com atraso', 'nl': 'met vertraging', 'fr': 'avec du retard', 'it': 'con ritardo', 'es': 'con retraso'};
Blockly.Words['control_ms'] = {'en': 'ms', 'de': 'ms', 'ru': 'мс', 'pt': 'Senhora', 'nl': 'Mevrouw', 'fr': 'Mme', 'it': 'Signorina', 'es': 'Sra'};
Blockly.Words['control_sec'] = {'en': 'sec', 'de': 'Sek', 'ru': 'сек.', 'pt': 'seg', 'nl': 'sec', 'fr': 'seconde', 'it': 'secondo', 'es': 'segundo'};
Blockly.Words['control_min'] = {'en': 'min', 'de': 'Min', 'ru': 'мин.', 'pt': 'min', 'nl': 'min', 'fr': 'min', 'it': 'min', 'es': 'min'};
Blockly.Words['control_clear_running'] = {'en': ', clear running', 'de': ', löschen falls läuft', 'ru': ', остановить уже запущенный', 'pt': ', corrida clara', 'nl': ', helder rennen', 'fr': ', course libre', 'it': ', chiara corsa', 'es': ', claro funcionamiento'};
// --- system toggle --------------------------------------------------
Blockly.Words['toggle'] = {'en': 'toggle', 'de': 'umschalten', 'ru': 'переключить', 'pt': 'alternancia', 'nl': 'toggle', 'fr': 'basculer', 'it': 'ginocchiera', 'es': 'palanca'};
Blockly.Words['toggle_tooltip'] = {'en': 'Toggle the state', 'de': 'Schalte Zustand um', 'ru': 'Изменить состояние', 'pt': 'Alternar o estado', 'nl': 'Schakel de staat in', 'fr': 'Basculer l\'état', 'it': 'Attiva/disattiva lo stato', 'es': 'Alternar el estado'};
Blockly.Words['toggle_help'] = {'en': 'setstate', 'de': 'setstate', 'ru': 'setstate', 'pt': 'settate', 'nl': 'setstate', 'fr': 'setstate', 'it': 'setstate', 'es': 'setstate'};
Blockly.Words['toggle_with'] = {'en': 'with', 'de': 'mit', 'ru': 'на', 'pt': 'com', 'nl': 'met', 'fr': 'avec', 'it': 'con', 'es': 'con'};
Blockly.Words['toggle_delay'] = {'en': 'with delay', 'de': 'mit Verzögerung', 'ru': 'с задержкой', 'pt': 'com atraso', 'nl': 'met vertraging', 'fr': 'avec du retard', 'it': 'con ritardo', 'es': 'con retraso'};
Blockly.Words['toggle_ms'] = {'en': 'in ms', 'de': 'in ms', 'ru': 'в мс', 'pt': 'em ms', 'nl': 'in ms', 'fr': 'en ms', 'it': 'in ms', 'es': 'en ms'};
Blockly.Words['toggle_clear_running'] = {'en': ', clear running', 'de': ', löschen falls läuft', 'ru': ', остановить уже запущенный', 'pt': ', corrida clara', 'nl': ', helder rennen', 'fr': ', course libre', 'it': ', chiara corsa', 'es': ', claro funcionamiento'};
// --- system update --------------------------------------------------
Blockly.Words['update'] = {'en': 'update', 'de': 'aktualisiere', 'ru': 'обновить', 'pt': 'atualizar', 'nl': 'bijwerken', 'fr': 'mettre à jour', 'it': 'aggiornare', 'es': 'actualizar'};
Blockly.Words['update_tooltip'] = {'en': 'Update state', 'de': 'Zustand aktualisieren', 'ru': 'Обновить состояние', 'pt': 'Estado de atualização', 'nl': 'Status bijwerken', 'fr': 'Mettre à jour', 'it': 'Stato di aggiornamento', 'es': 'Actualizar estado'};
Blockly.Words['update_help'] = {'en': 'setstate', 'de': 'setstate', 'ru': 'setstate', 'pt': 'settate', 'nl': 'setstate', 'fr': 'setstate', 'it': 'setstate', 'es': 'setstate'};
Blockly.Words['update_with'] = {'en': 'with', 'de': 'mit', 'ru': 'с', 'pt': 'com', 'nl': 'met', 'fr': 'avec', 'it': 'con', 'es': 'con'};
Blockly.Words['update_delay'] = {'en': 'with delay', 'de': 'mit Verzögerung', 'ru': 'с задержкой', 'pt': 'com atraso', 'nl': 'met vertraging', 'fr': 'avec du retard', 'it': 'con ritardo', 'es': 'con retraso'};
Blockly.Words['update_ms'] = {'en': 'in ms', 'de': 'in ms', 'ru': 'в мс', 'pt': 'em ms', 'nl': 'in ms', 'fr': 'en ms', 'it': 'in ms', 'es': 'en ms'};
// --- system direct --------------------------------------------------
Blockly.Words['direct'] = {'en': 'bind', 'de': 'binde', 'ru': 'связять', 'pt': 'ligar', 'nl': 'binden', 'fr': 'lier', 'it': 'legare', 'es': 'enlazar'};
Blockly.Words['direct_tooltip'] = {'en': 'Bind two states with each other', 'de': 'Binde zwei Zustände miteinander', 'ru': 'Связать два состояния между собой', 'pt': 'Vincule dois estados uns com os outros', 'nl': 'Bind twee toestanden met elkaar', 'fr': 'Liez deux états l\'un à l\'autre', 'it': 'Associare due stati tra loro', 'es': 'Enlazar dos estados entre sí'};
Blockly.Words['direct_help'] = {'en': 'setstate', 'de': 'setstate', 'ru': 'setstate', 'pt': 'settate', 'nl': 'setstate', 'fr': 'setstate', 'it': 'setstate', 'es': 'setstate'};
Blockly.Words['direct_oid_src'] = {'en': '', 'de': '', 'ru': '', 'pt': '', 'nl': '', 'fr': '', 'it': '', 'es': ''};
Blockly.Words['direct_only_changes'] = {'en': 'only changes', 'de': 'nur Änderungen', 'ru': 'только изменения', 'pt': 'apenas muda', 'nl': 'alleen veranderingen', 'fr': 'seulement des changements', 'it': 'solo cambiamenti', 'es': 'solo cambios'};
Blockly.Words['direct_oid_dst'] = {'en': 'with', 'de': 'mit', 'ru': 'c', 'pt': 'com', 'nl': 'met', 'fr': 'avec', 'it': 'con', 'es': 'con'};
// --- system control --------------------------------------------------
Blockly.Words['control_ex'] = {'en': 'write', 'de': 'schreibe', 'ru': 'записать', 'pt': 'Escreva', 'nl': 'schrijven', 'fr': 'écrire', 'it': 'Scrivi', 'es': 'escribir'};
Blockly.Words['control_ex_tooltip'] = {'en': 'Control state', 'de': 'Steuere Zustand', 'ru': 'Установить состояние', 'pt': 'Estado de controle', 'nl': 'Controlestatus', 'fr': 'Etat de contrôle', 'it': 'Stato di controllo', 'es': 'Estado de control'};
Blockly.Words['control_ex_control'] = {'en': 'сontrol', 'de': 'steuere', 'ru': 'установить', 'pt': 'controlar', 'nl': 'сontrol', 'fr': 'contrôle', 'it': 'сontrol', 'es': 'ontrol'};
Blockly.Words['control_ex_update'] = {'en': 'update', 'de': 'aktualisiere', 'ru': 'обновить', 'pt': 'atualizar', 'nl': 'bijwerken', 'fr': 'mettre à jour', 'it': 'aggiornare', 'es': 'actualizar'};
Blockly.Words['control_ex_delay'] = {'en': 'delay in ms', 'de': 'Verzögerung in ms', 'ru': 'Задержка в мс', 'pt': 'atraso em ms', 'nl': 'vertraging in ms', 'fr': 'retarder en ms', 'it': 'ritardo in ms', 'es': 'retraso en ms'};
Blockly.Words['control_ex_value'] = {'en': 'value', 'de': 'Wert', 'ru': 'значение', 'pt': 'valor', 'nl': 'waarde', 'fr': 'valeur', 'it': 'valore', 'es': 'valor'};
Blockly.Words['control_ex_clear_running'] = {'en': 'clear running', 'de': 'löschen falls läuft', 'ru': 'остановить уже запущенный', 'pt': 'corrida clara', 'nl': 'vrijlopen', 'fr': 'clair course', 'it': 'corsa libera', 'es': 'funcionamiento claro'};
// --- system create --------------------------------------------------
Blockly.Words['create'] = {'en': 'create state', 'de': 'Zustand erzeugen', 'ru': 'создать состояние', 'pt': 'criar estado', 'nl': 'creëer staat', 'fr': 'créer un état', 'it': 'creare stato', 'es': 'crear estado'};
Blockly.Words['create_jsState'] = {'en': 'jsState', 'de': 'jsState', 'ru': 'jsState', 'pt': 'jsState', 'nl': 'jsState', 'fr': 'jsState', 'it': 'jsState', 'es': 'jsState'};
Blockly.Words['create_tooltip'] = {'en': 'create state', 'de': 'Zustand erzeugen', 'ru': 'создать состояние', 'pt': 'criar estado', 'nl': 'creëer staat', 'fr': 'créer un état', 'it': 'creare stato', 'es': 'crear estado'};
Blockly.Words['create_help'] = {'en': 'createstate', 'de': 'createstate', 'ru': 'createstate', 'pt': 'criar', 'nl': 'createstate', 'fr': 'créature', 'it': 'createstate', 'es': 'crear estado'};
// --- system get --------------------------------------------------
Blockly.Words['get_value'] = {'en': 'Get state value', 'de': 'Zustandswert nehmen', 'ru': 'Взять значение состояния', 'pt': 'Obter valor do estado', 'nl': 'Krijg statuswaarde', 'fr': 'Obtenir la valeur de l\'état', 'it': 'Ottieni valore statale', 'es': 'Obtener valor de estado'};
Blockly.Words['get_value_OID'] = {'en': 'of Object ID', 'de': 'vom Objekt ID', 'ru': 'у объекта', 'pt': 'de ID do objeto', 'nl': 'van Object ID', 'fr': 'd\'identifiant d\'objet', 'it': 'di ID oggetto', 'es': 'de Object ID'};
Blockly.Words['get_value_tooltip'] = {'en': 'Select object ID with dialog', 'de': 'Objekt ID mit Dialog selektieren', 'ru': 'Выбрать ID объекта', 'pt': 'Selecione ID do objeto com diálogo', 'nl': 'Selecteer object-ID met dialoogvenster', 'fr': 'Sélectionnez l\'ID d\'objet avec la boîte de dialogue', 'it': 'Seleziona ID oggetto con finestra di dialogo', 'es': 'Seleccionar ID de objeto con diálogo'};
Blockly.Words['get_value_help'] = {'en': 'getstate', 'de': 'getstate', 'ru': 'getstate', 'pt': 'obter', 'nl': 'getstate', 'fr': 'getstate', 'it': 'GetState', 'es': 'Gettate'};
Blockly.Words['get_value_default'] = {'en': 'select ID', 'de': 'ID auswählen', 'ru': 'Выбрать ID', 'pt': 'selecione ID', 'nl': 'selecteer ID', 'fr': 'sélectionnez ID', 'it': 'seleziona ID', 'es': 'seleccionar ID'};
Blockly.Words['get_value_val'] = {'en': 'Value', 'de': 'Wert', 'ru': 'Значение', 'pt': 'Valor', 'nl': 'Waarde', 'fr': 'Valeur', 'it': 'Valore', 'es': 'Valor'};
Blockly.Words['get_value_ack'] = {'en': 'Acknowledge', 'de': 'anerkannt', 'ru': 'Подтверждение', 'pt': 'Reconhecer', 'nl': 'Erkennen', 'fr': 'Reconnaître', 'it': 'Riconoscere', 'es': 'Reconocer'};
Blockly.Words['get_value_ts'] = {'en': 'Timestamp', 'de': 'Zeitstempel', 'ru': 'Время', 'pt': 'Timestamp', 'nl': 'tijdstempel', 'fr': 'Horodatage', 'it': 'timestamp', 'es': 'Marca de tiempo'};
Blockly.Words['get_value_lc'] = {'en': 'Last change ', 'de': 'Letze Änderung', 'ru': 'Последнее изменеие', 'pt': 'Última mudança', 'nl': 'Laatste wijziging', 'fr': 'Dernier changement', 'it': 'Ultima modifica', 'es': 'Ultimo cambio'};
Blockly.Words['get_value_q'] = {'en': 'Quality', 'de': 'Qualität', 'ru': 'Качество', 'pt': 'Qualidade', 'nl': 'Kwaliteit', 'fr': 'Qualité', 'it': 'Qualità', 'es': 'Calidad'};
Blockly.Words['get_value_from'] = {'en': 'Source', 'de': 'Quelle', 'ru': 'Происхождение', 'pt': 'Fonte', 'nl': 'Bron', 'fr': 'La source', 'it': 'fonte', 'es': 'Fuente'};
Blockly.Words['get_value_async'] = {'en': 'Get state value', 'de': 'Zustandswert nehmen', 'ru': 'Взять значение состояния', 'pt': 'Obter valor do estado', 'nl': 'Krijg statuswaarde', 'fr': 'Obtenir la valeur de l\'état', 'it': 'Ottieni valore statale', 'es': 'Obtener valor de estado'};
// --- system field --------------------------------------------------
Blockly.Words['field_oid'] = {'en': 'Select OID', 'de': 'Zustand erzeugen', 'ru': 'создать состояние', 'pt': 'Selecione OID', 'nl': 'Selecteer OID', 'fr': 'Sélectionnez OID', 'it': 'Seleziona OID', 'es': 'Seleccionar OID'};
Blockly.Words['field_oid_OID'] = {'en': 'Object ID', 'de': 'Objekt ID', 'ru': 'ID объекта', 'pt': 'ID do objeto', 'nl': 'Object ID', 'fr': 'ID de l\'objet', 'it': 'ID oggetto', 'es': 'ID del objeto'};
Blockly.Words['field_oid_tooltip'] = {'en': 'Select object ID with dialog', 'de': 'Objekt ID mit Dialog selektieren', 'ru': 'Выбрать ID объекта', 'pt': 'Selecione ID do objeto com diálogo', 'nl': 'Selecteer object-ID met dialoogvenster', 'fr': 'Sélectionnez l\'ID d\'objet avec la boîte de dialogue', 'it': 'Seleziona ID oggetto con finestra di dialogo', 'es': 'Seleccionar ID de objeto con diálogo'};
// --- get attribute --------------------------------------------------
Blockly.Words['get_attr'] = {
"en": "Get attribute",
"de": "Attribut erhalten",
"ru": "Получить атрибут",
"pt": "Obter atributo",
"nl": "Attribuut ophalen",
"fr": "Obtenir l'attribut",
"it": "Ottieni attributo",
"es": "Obtener atributo",
"pl": "Uzyskaj atrybut"
};
Blockly.Words['get_attr_path'] = {
"en": "Attribute",
"de": "Attribut",
"ru": "Атрибут",
"pt": "Atributo",
"nl": "Attribuut",
"fr": "Attribut",
"it": "Attributo",
"es": "Atributo",
"pl": "Atrybut"
};
Blockly.Words['get_attr_by'] = {'en': 'of Object', 'de': 'vom Objekt', 'ru': 'у объекта', 'pt': 'do objeto', 'nl': 'van Object', 'fr': 'd\'objet', 'it': 'di oggetto', 'es': 'de Object'};
Blockly.Words['get_attr_tooltip'] = {
"en": "Get attribute of object or JSON by path, like: 'attr1.attr'",
"de": "Erhalte Attribut des Objekts oder JSON nach Pfad, wie: 'attr1.attr'",
"ru": "Получить атрибут объекта или JSON по пути, например: 'attr1.attr'",
"pt": "Obter atributo de objeto ou JSON por caminho, como: 'attr1.attr'",
"nl": "Krijg een attribuut van het object of JSON per pad, zoals: 'attr1.attr'",
"fr": "Obtenir l'attribut d'objet ou JSON par chemin, comme: 'attr1.attr'",
"it": "Ottieni attributo di oggetto o JSON per percorso, ad esempio: 'attr1.attr'",
"es": "Obtenga el atributo de objeto o JSON por ruta, como: 'attr1.attr'",
"pl": "Uzyskaj atrybut obiektu lub JSON według ścieżki, na przykład: \"attr1.attr\""
};
Blockly.Words['get_attr_help'] = {'en': 'getattr', 'de': 'getattr', 'ru': 'getattr', 'pt': 'getattr', 'nl': 'getattr', 'fr': 'getattr', 'it': 'getattr', 'es': 'getattr'};
// --- text new line --------------------------------------------------
Blockly.Words['text_newline'] = {'en': 'New line', 'de': 'Neue Zeile', 'ru': 'Новая строка', 'pt': 'Nova linha', 'nl': 'Nieuwe lijn', 'fr': 'Nouvelle ligne', 'it': 'Nuova linea', 'es': 'Nueva línea', 'pl': 'Nowa linia'};
Blockly.Words['text_newline_tooltip'] = {'en': 'Places new line in text', 'de': 'Platziert eine neue Zeile im Text', 'ru': 'Размещение новой строки в тексте', 'pt': 'Coloca nova linha no texto', 'nl': 'Plaatst nieuwe regel in tekst', 'fr': 'Place une nouvelle ligne dans le texte', 'it': 'Inserisce una nuova riga nel testo', 'es': 'Coloca una nueva línea en el texto', 'pl': 'Umieszcza nową linię w tekście'};
// --- round to n digits ----------------------------------------------
Blockly.Words['math_rndfixed_round'] = {'en': 'Round', 'de': 'Runde', 'ru': 'Раунд', 'pt': 'Arredondar', 'nl': 'Afronden', 'fr': 'Arrondir', 'it': 'Arrotondare', 'es': 'Redondea', 'pl': 'Zaokrąglaj'};
Blockly.Words['math_rndfixed_to'] = {'en': 'to', 'de': 'auf', 'ru': 'в', 'pt': 'para', 'nl': 'naar', 'fr': 'à', 'it': 'a', 'es': 'a', 'pl': 'do'};
Blockly.Words['math_rndfixed_decplcs'] = {'en': 'decimal places', 'de': 'Nachkommastellen', 'ru': 'десятичные знаки', 'pt': 'casas decimais', 'nl': 'plaatsen na de komma', 'fr': 'décimales', 'it': 'decimali', 'es': 'lugares decimales', 'pl': 'miejsca dziesiętne'};
Blockly.Words['math_rndfixed_tooltip'] = {'en': 'Rounds value to n decimal places', 'de': 'Rundet den Wert auf n Dezimalstellen', 'ru': 'Значение раундов до n знаков после запятой', 'pt': 'Arredonda o valor para n casas decimais', 'nl': 'Rondt waarde af naar n decimale plaatsen', 'fr': 'Arrondit la valeur à n décimales', 'it': 'Arrotonda il valore in n posizioni decimali', 'es': 'Redondea el valor a n lugares decimales','pl': 'Zaokrągla wartość do n miejsc po przecinku'};
// --- TIME --------------------------------------------------
Blockly.Words['Time'] = {'en': 'Date and Time', 'de': 'Datum und Zeit', 'ru': 'Дата и время', 'pt': 'Data e hora', 'nl': 'Datum en tijd', 'fr': 'Date et l\'heure', 'it': 'Data e ora', 'es': 'Fecha y hora'};
// --- time time --------------------------------------------------
Blockly.Words['time_compare_ex'] = {'en': 'Actual time', 'de': 'Aktuelle Zeit', 'ru': 'Текущее время', 'pt': 'Tempo real', 'nl': 'Werkelijke tijd', 'fr': 'Heure actuelle', 'it': 'Tempo reale', 'es': 'Tiempo actual'};
Blockly.Words['time_compare_custom_ex'] = {'en': 'Custom time', 'de': 'Zeit', 'ru': 'Время', 'pt': 'Tempo personalizado', 'nl': 'Aangepaste tijd', 'fr': 'Temps personnalisé', 'it': 'Tempo personalizzato', 'es': 'Hora personalizada'};
Blockly.Words['time_compare_is_ex'] = {'en': 'is', 'de': 'ist', 'ru': ' ', 'pt': 'é', 'nl': 'is', 'fr': 'est', 'it': 'è', 'es': 'es'};
Blockly.Words['time_compare_ex_custom'] = {'en': 'time', 'de': 'Zeit', 'ru': 'Время', 'pt': 'Tempo', 'nl': 'tijd', 'fr': 'temps', 'it': 'tempo', 'es': 'hora'};
Blockly.Words['time_compare_ex_tooltip'] = {'en': 'Compare time', 'de': 'Zeit vergleichen', 'ru': 'Сравнить время', 'pt': 'Compare o tempo', 'nl': 'Vergelijk tijd', 'fr': 'Comparer le temps', 'it': 'Confronta il tempo', 'es': 'Compara el tiempo'};
Blockly.Words['time_compare_ex_help'] = {'en': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'de': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'ru': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'pt': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'nl': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'fr': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'it': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'es': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md'};
Blockly.Words['time_compare'] = {'en': 'Actual time is', 'de': 'Aktuelle Zeit ist', 'ru': 'Время ', 'pt': 'O horário real é', 'nl': 'De werkelijke tijd is', 'fr': 'L\'heure actuelle est', 'it': 'Il tempo reale è', 'es': 'El tiempo real es'};
Blockly.Words['time_compare_tooltip'] = {'en': 'Compare current time', 'de': 'Vergleiche mit aktueller Zeit', 'ru': 'Сравнить текущее время', 'pt': 'Compare a hora atual', 'nl': 'Vergelijk de huidige tijd', 'fr': 'Comparer l\'heure actuelle', 'it': 'Confronta l\'ora corrente', 'es': 'Compara la hora actual'};
Blockly.Words['time_compare_help'] = {'en': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'de': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'ru': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'pt': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'nl': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'fr': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'it': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'es': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md'};
Blockly.Words['time_compare_lt'] = {'en': 'less than', 'de': 'kleiner als', 'ru': 'меньше чем', 'pt': 'menos que', 'nl': 'minder dan', 'fr': 'moins que', 'it': 'meno di', 'es': 'menos que'};
Blockly.Words['time_compare_le'] = {'en': 'equal to or less than', 'de': 'gleich oder kleiner als', 'ru': 'равно или меньше чем', 'pt': 'igual ou inferior a', 'nl': 'gelijk aan of minder dan', 'fr': 'égal ou inférieur à', 'it': 'uguale o inferiore a', 'es': 'igual o menor que'};
Blockly.Words['time_compare_gt'] = {'en': 'greater than', 'de': 'größer als', 'ru': 'больше чем', 'pt': 'Melhor que', 'nl': 'groter dan', 'fr': 'plus grand que', 'it': 'più grande di', 'es': 'mas grande que'};
Blockly.Words['time_compare_ge'] = {'en': 'equal to or greater than', 'de': 'gleich oder größer als', 'ru': 'равно или больше чем', 'pt': 'igual ou maior do que', 'nl': 'gelijk aan of groter dan', 'fr': 'égal ou supérieur à', 'it': 'uguale o maggiore di', 'es': 'igual o mayor que'};
Blockly.Words['time_compare_eq'] = {'en': 'equal to', 'de': 'gleich mit', 'ru': 'равно', 'pt': 'igual a', 'nl': 'gelijk aan', 'fr': 'égal à', 'it': 'uguale a', 'es': 'igual a'};
Blockly.Words['time_compare_bw'] = {'en': 'between', 'de': 'zwischen', 'ru': 'между', 'pt': 'entre', 'nl': 'tussen', 'fr': 'entre', 'it': 'fra', 'es': 'Entre'};
Blockly.Words['time_compare_nb'] = {'en': 'not between', 'de': 'nicht zwischen', 'ru': 'не между', 'pt': 'não entre', 'nl': 'niet tussen', 'fr': 'pas entre', 'it': 'non in mezzo', 'es': 'no entre'};
Blockly.Words['time_compare_and'] = {'en': 'and', 'de': 'und', 'ru': 'и', 'pt': 'e', 'nl': 'en', 'fr': 'et', 'it': 'e', 'es': 'y'};
Blockly.Words['time_get'] = {'en': 'Actual time as', 'de': 'Aktuelle Zeit als', 'ru': 'Время ', 'pt': 'Tempo real como', 'nl': 'Werkelijke tijd als', 'fr': 'Heure réelle sous', 'it': 'Tempo reale come', 'es': 'Tiempo real como'};
Blockly.Words['time_get_default_format'] = {'en': 'YYYY.MM.DD hh:mm:ss.sss', 'de': 'JJJJ.MM.TT SS:mm:ss.sss', 'ru': 'ГГГГ.ММ.ДД чч:мм:сс.ссс', 'pt': 'AAAA.MM.DD hh: mm: ss.sss', 'nl': 'JJJJ.MM.DD uu: mm: ss.sss', 'fr': 'YYYY.MM.DD hh: mm: ss.sss', 'it': 'YYYY.MM.DD hh: mm: ss.sss', 'es': 'YYYY.MM.DD hh: mm: ss.sss'};
Blockly.Words['time_get_anyInstance'] = {'en': 'all instances', 'de': 'Alle Instanzen', 'ru': 'На все драйвера', 'pt': 'todas as instâncias', 'nl': 'alle instanties', 'fr': 'toutes les instances', 'it': 'tutte le istanze', 'es': 'todas las instancias'};
Blockly.Words['time_get_tooltip'] = {'en': 'Send message to telegram', 'de': 'Sende eine Meldung über Telegram', 'ru': 'Послать сообщение через Telegram', 'pt': 'Enviar mensagem para telegrama', 'nl': 'Stuur bericht naar telegram', 'fr': 'Envoyer un message au télégramme', 'it': 'Invia un messaggio al telegramma', 'es': 'Enviar mensaje a telegrama'};
Blockly.Words['time_get_help'] = {'en': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'de': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'ru': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'pt': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'nl': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'fr': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'it': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'es': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md'};
Blockly.Words['time_get_object'] = {'en': 'Date object', 'de': 'Datum-Objekt', 'ru': 'как объект', 'pt': 'Data objeto', 'nl': 'Datum object', 'fr': 'Objet de date', 'it': 'Data oggetto', 'es': 'Objeto de fecha'};
Blockly.Words['time_get_ms'] = {'en': 'milliseconds', 'de': 'Millisekunden', 'ru': 'миллисекунды', 'pt': 'milissegundos', 'nl': 'milliseconden', 'fr': 'millisecondes', 'it': 'millisecondi', 'es': 'milisegundos'};
Blockly.Words['time_get_s'] = {'en': 'seconds', 'de': 'Sekunden', 'ru': 'секунды', 'pt': 'segundos', 'nl': 'seconden', 'fr': 'secondes', 'it': 'secondi', 'es': 'segundos'};
Blockly.Words['time_get_m'] = {'en': 'minutes', 'de': 'Minuten', 'ru': 'минуты', 'pt': 'minutos', 'nl': 'notulen', 'fr': 'minutes', 'it': 'minuti', 'es': 'minutos'};
Blockly.Words['time_get_mid'] = {'en': 'minutes in day', 'de': 'Minuten seit Tagsanfang', 'ru': 'кол-во минут с начала дня', 'pt': 'minutos do dia', 'nl': 'minuten in dag', 'fr': 'minutes dans la journée', 'it': 'minuti al giorno', 'es': 'minutos en el día'};
Blockly.Words['time_get_sid'] = {'en': 'seconds in day', 'de': 'Sekunden seit Tagsanfang', 'ru': 'кол-во секунд с начала дня', 'pt': 'segundos no dia', 'nl': 'seconden in dag', 'fr': 'secondes dans la journée', 'it': 'secondi nel giorno', 'es': 'segundos en el día'};
Blockly.Words['time_get_h'] = {'en': 'hours', 'de': 'Stunden', 'ru': 'часы', 'pt': 'horas', 'nl': 'uur', 'fr': 'heures', 'it': 'ore', 'es': 'horas'};
Blockly.Words['time_get_d'] = {'en': 'day of month', 'de': 'Monatsdatum', 'ru': 'день месяца', 'pt': 'dia do mês', 'nl': 'dag van de maand', 'fr': 'jour du mois', 'it': 'giorno del mese', 'es': 'dia del mes'};
Blockly.Words['time_get_M'] = {'en': 'month as number', 'de': 'Monat als Nummer', 'ru': 'месяц числом', 'pt': 'mês como número', 'nl': 'maand als nummer', 'fr': 'mois en nombre', 'it': 'mese come numero', 'es': 'mes como número'};
Blockly.Words['time_get_Mt'] = {'en': 'month as text', 'de': 'Monat als Text', 'ru': 'месяц словом', 'pt': 'mês como texto', 'nl': 'maand als tekst', 'fr': 'mois comme texte', 'it': 'mese come testo', 'es': 'mes como texto'};
Blockly.Words['time_get_Mts'] = {'en': 'month as short text', 'de': 'Monat als Kurztext', 'ru': 'месяц коротким словом', 'pt': 'mês como texto curto', 'nl': 'maand als korte tekst', 'fr': 'mois comme texte court', 'it': 'mese come breve testo', 'es': 'mes como texto corto'};
Blockly.Words['time_get_y'] = {'en': 'short year', 'de': 'Jahr, kurz', 'ru': 'короткий год', 'pt': 'ano curto', 'nl': 'kort jaar', 'fr': 'année courte', 'it': 'breve anno', 'es': 'año corto'};
Blockly.Words['time_get_fy'] = {'en': 'full year', 'de': 'Jahr, voll', 'ru': 'полный год', 'pt': 'ano completo', 'nl': 'Volledig jaar', 'fr': 'année complète', 'it': 'anno pieno', 'es': 'Año completo'};
Blockly.Words['time_get_wdt'] = {'en': 'week day text', 'de': 'Wochentag als Text', 'ru': 'день недели словом', 'pt': 'texto do dia da semana', 'nl': 'weekdag tekst', 'fr': 'texte de la semaine', 'it': 'testo del giorno della settimana', 'es': 'texto del día de la semana'};
Blockly.Words['time_get_wdts'] = {'en': 'short week day', 'de': 'Wochentag als Kurztext', 'ru': 'короткий день недели', 'pt': 'dia da semana curto', 'nl': 'korte weekdag', 'fr': 'jour de la semaine courte', 'it': 'breve giorno della settimana', 'es': 'día corto de la semana'};
Blockly.Words['time_get_wd'] = {'en': 'week day as number', 'de': 'Wochentag als Nummer', 'ru': 'день недели числом', 'pt': 'dia da semana como número', 'nl': 'weekdag als nummer', 'fr': 'jour de la semaine en nombre', 'it': 'giorno della settimana come numero', 'es': 'día de la semana como número'};
Blockly.Words['time_get_custom'] = {'en': 'custom format', 'de': 'anwenderformatiert', 'ru': 'произвольный формат', 'pt': 'formato personalizado', 'nl': 'aangepast formaat', 'fr': 'format personnalisé', 'it': 'formato personalizzato', 'es': 'formato personalizado'};
Blockly.Words['time_get_yyyy.mm.dd'] = {'en': 'yyyy.mm.dd', 'de': 'JJJJ.MM.TT', 'ru': 'ГГГГ.ММ.ДД', 'pt': 'aaaa.mm.dd', 'nl': 'jjjj.mm.dd', 'fr': 'aaaa.mm.jj', 'it': 'yyyy.MM.dd', 'es': 'aaaa.mm.dd'};
Blockly.Words['time_get_yyyy/mm/dd'] = {'en': 'yyyy/mm/dd', 'de': 'JJJJ/MM/TT', 'ru': 'ГГГГ/ММ/ДД', 'pt': 'aaaa/mm/dd', 'nl': 'yyyy/mm/dd', 'fr': 'aaaa/mm/jj', 'it': 'aaaa/mm/gg', 'es': 'aaaa/mm/dd'};
Blockly.Words['time_get_yy.mm.dd'] = {'en': 'yy.mm.dd', 'de': 'JJ.MM.TT', 'ru': 'ГГ.ММ.ДД', 'pt': 'yy.mm.dd', 'nl': 'JJ.MM.DD', 'fr': 'yy.mm.dd', 'it': 'yy.mm.dd', 'es': 'yy.mm.dd'};
Blockly.Words['time_get_yy/mm/dd'] = {'en': 'yy/mm/dd', 'de': 'JJ/MM/TT', 'ru': 'ГГ/ММ/ДД', 'pt': 'aa/mm/dd', 'nl': 'yy/mm/dd', 'fr': 'aa/mm/jj', 'it': 'aa/mm/dd', 'es': 'aa/mm/dd'};
Blockly.Words['time_get_dd.mm.yyyy'] = {'en': 'dd.mm.yyyy', 'de': 'TT.MM.JJJJ', 'ru': 'ДД.ММ.ГГГГ', 'pt': 'dd.mm.yyyy', 'nl': 'dd.mm.yyyy', 'fr': 'jj.mm.aaaa', 'it': 'gg.mm.aaaa', 'es': 'dd.mm.yyyy'};
Blockly.Words['time_get_dd/mm/yyyy'] = {'en': 'dd/mm/yyyy', 'de': 'TT/MM/JJJJ', 'ru': 'ДД/ММ/ГГГГ', 'pt': 'dd/mm/aaaa', 'nl': 'dd/mm/yyyy', 'fr': 'jj/mm/aaaa', 'it': 'gg/mm/aaaa', 'es': 'dd/mm/aaaa'};
Blockly.Words['time_get_dd.mm.yy'] = {'en': 'dd.mm.yy', 'de': 'TT.MM.JJ', 'ru': 'ДД.ММ.ГГ', 'pt': 'dd.mm.yy', 'nl': 'dd.mm.jj', 'fr': 'jj.mm.aa', 'it': 'dd.mm.yy', 'es': 'dd.mm.yy'};
Blockly.Words['time_get_dd/mm/yy'] = {'en': 'dd/mm/yy', 'de': 'TT/MM/JJ', 'ru': 'ДД/ММ/ГГ', 'pt': 'dd/mm/aa', 'nl': 'dd/mm/jj', 'fr': 'jj/mm/aa', 'it': 'gg/mm/aa', 'es': 'dd/mm/aa'};
Blockly.Words['time_get_mm/dd/yyyy'] = {'en': 'mm/dd/yyyy', 'de': 'MM/TT/JJJJ', 'ru': 'ММ/ДД/ГГГГ', 'pt': 'mm/dd/aaaa', 'nl': 'mm/dd/yyyy', 'fr': 'mm/jj/aaaa', 'it': 'mm/gg/aaaa', 'es': 'mm/dd/aaaa'};
Blockly.Words['time_get_mm/dd/yy'] = {'en': 'mm/dd/yy', 'de': 'MM/TT/JJ', 'ru': 'ММ/ДД/yy', 'pt': 'mm/dd/aaa', 'nl': 'MM/DD/JJ', 'fr': 'mm/jj/aa', 'it': 'mm/gg/aa', 'es': 'mm/dd/aa'};
Blockly.Words['time_get_dd.mm'] = {'en': 'dd.mm.', 'de': 'TT.MM.', 'ru': 'ДД.ММ.', 'pt': 'dd.mm.', 'nl': 'DD.MM.', 'fr': 'jj.mm.', 'it': 'GG.MM.', 'es': 'dd.mm.'};
Blockly.Words['time_get_dd/mm'] = {'en': 'dd/mm', 'de': 'TT/MM', 'ru': 'ДД/ММ', 'pt': 'dd/mm', 'nl': 'dd/mm', 'fr': 'jj/mm', 'it': 'gg/mm', 'es': 'dd/mm'};
Blockly.Words['time_get_mm.dd'] = {'en': 'mm.dd', 'de': 'MM.TT', 'ru': 'ММ.ДД', 'pt': 'mm.dd', 'nl': 'mm.dd', 'fr': 'mm.dd', 'it': 'mm.dd', 'es': 'mm.dd'};
Blockly.Words['time_get_mm/dd'] = {'en': 'mm/dd', 'de': 'MM/TT', 'ru': 'ММ/ДД', 'pt': 'mm/dd', 'nl': 'MM/DD', 'fr': 'mm/jj', 'it': 'mm/gg', 'es': 'mm/dd'};
Blockly.Words['time_get_hh_mm'] = {'en': 'hh:mm', 'de': 'SS:mm', 'ru': 'чч:мм', 'pt': 'hh:mm', 'nl': 'hh:mm', 'fr': 'hh:mm', 'it': 'hh:mm', 'es': 'hh: mm'};
Blockly.Words['time_get_hh_mm_ss'] = {'en': 'hh:mm:ss', 'de': 'SS:mm:ss', 'ru': 'чч:мм:сс', 'pt': 'hh:mm:ss', 'nl': 'hh:mm:ss', 'fr': 'hh:mm:ss', 'it': 'hh:mm:ss', 'es': 'hh: mm: ss'};
Blockly.Words['time_get_hh_mm_ss.sss'] = {'en': 'hh:mm:ss.sss', 'de': 'SS:mm:ss.sss', 'ru': 'чч:мм:сс.ссс', 'pt': 'hh:mm:ss.sss', 'nl': 'hh:mm:ss.sss', 'fr': 'hh:mm:ss.sss', 'it': 'hh:mm:ss.sss', 'es': 'hh: mm: ss.sss'};
Blockly.Words['time_astro'] = {'en': 'Actual time of', 'de': 'Aktuelle Zeit von', 'ru': 'Время ', 'pt': 'Tempo real de', 'nl': 'Huidige tijd van', 'fr': 'Heure réelle de', 'it': 'Tempo reale di', 'es': 'Tiempo real de'};
Blockly.Words['time_astro_offset'] = {'en': 'Offset (minutes)', 'de': 'Offset (Minuten)', 'ru': 'Сдвиг в минутах ', 'pt': 'Offset (minutos)', 'nl': 'Offset (minuten)', 'fr': 'Décalage (minutes)', 'it': 'Offset (minuti)', 'es': 'Desplazamiento (minutos)'};
Blockly.Words['time_astro_default_format'] = {'en': 'YYYY.MM.DD hh:mm:ss.sss', 'de': 'JJJJ.MM.TT SS:mm:ss.sss', 'ru': 'ГГГГ.ММ.ДД чч:мм:сс.ссс', 'pt': 'AAAA.MM.DD hh:mm:ss.sss', 'nl': 'JJJJ.MM.DD uu:mm:ss.sss', 'fr': 'YYYY.MM.DD hh:mm:ss.sss', 'it': 'YYYY.MM.DD hh:mm:ss.sss', 'es': 'YYYY.MM.DD hh: mm: ss.sss'};
Blockly.Words['time_astro_tooltip'] = {'en': 'Get actual time or ', 'de': 'Sende eine Meldung über Telegram', 'ru': 'Послать сообщение через Telegram', 'pt': 'Receba o tempo real ou', 'nl': 'Krijg actuele tijd of', 'fr': 'Obtenez le temps réel ou', 'it': 'Ottieni tempo reale o', 'es': 'Obtenga tiempo real o'};
Blockly.Words['time_astro_help'] = {'en': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'de': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'ru': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'pt': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'nl': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'fr': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'it': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md', 'es': 'https://git.spacen.net/yunkong2/yunkong2.telegram/blob/master/README.md'};
// --- TIMEOUTS --------------------------------------------------
Blockly.Words['Timeouts'] = {'en': 'Timeouts', 'de': 'Timeouts', 'ru': 'Timeouts', 'pt': 'Tempo limite', 'nl': 'Time-outs', 'fr': 'Délais', 'it': 'Timeout', 'es': 'Tiempos de espera'};
// --- timeouts timeouts --------------------------------------------------
Blockly.Words['timeouts_settimeout'] = {'en': 'Execution', 'de': 'Ausführen', 'ru': 'Выполнить', 'pt': 'Execução', 'nl': 'Executie', 'fr': 'Exécution', 'it': 'Esecuzione', 'es': 'Ejecución'};
Blockly.Words['timeouts_settimeout_name'] = {'en': 'timeout', 'de': 'Verzögerung', 'ru': 'Пауза', 'pt': 'tempo esgotado', 'nl': 'time-out', 'fr': 'temps libre', 'it': 'tempo scaduto', 'es': 'se acabó el tiempo'};
Blockly.Words['timeouts_settimeout_in'] = {'en': 'in', 'de': 'in', 'ru': 'через', 'pt': 'dentro', 'nl': 'in', 'fr': 'dans', 'it': 'in', 'es': 'en'};
Blockly.Words['timeouts_settimeout_ms'] = {'en': 'ms', 'de': 'ms', 'ru': 'мс', 'pt': 'Senhora', 'nl': 'Mevrouw', 'fr': 'Mme', 'it': 'Signorina', 'es': 'Sra'};
Blockly.Words['timeouts_settimeout_sec'] = {'en': 'sec', 'de': 'Sek', 'ru': 'сек.', 'pt': 'seg', 'nl': 'sec', 'fr': 'seconde', 'it': 'secondo', 'es': 'segundo'};
Blockly.Words['timeouts_settimeout_min'] = {'en': 'min', 'de': 'Min', 'ru': 'мин.', 'pt': 'min', 'nl': 'min', 'fr': 'min', 'it': 'min', 'es': 'min'};
Blockly.Words['timeouts_settimeout_tooltip'] = {'en': 'Delay execution', 'de': 'Ausführung verzögern', 'ru': 'Сделать паузу', 'pt': 'Atrasar a execução', 'nl': 'Vertraag uitvoering', 'fr': 'Retarder l\'exécution', 'it': 'Ritardare l\'esecuzione', 'es': 'Demora de ejecución'};
Blockly.Words['timeouts_settimeout_help'] = {'en': 'settimeout', 'de': 'settimeout', 'ru': 'settimeout', 'pt': 'settimeout', 'nl': 'setTimeout', 'fr': 'settimeout', 'it': 'setTimeout', 'es': 'settimeout'};
Blockly.Words['timeouts_cleartimeout'] = {'en': 'clear', 'de': 'stop', 'ru': 'остановить', 'pt': 'Claro', 'nl': 'duidelijk', 'fr': 'clair', 'it': 'chiaro', 'es': 'claro'};
Blockly.Words['timeouts_cleartimeout_tooltip'] = {'en': 'Clear delay execution', 'de': 'Ausführungsverzögerung anhalten', 'ru': 'Отменить выполнение с паузой', 'pt': 'Execução de atraso clara', 'nl': 'Duidelijke uitvoering van vertragingen', 'fr': 'Effacer l\'exécution du délai', 'it': 'Cancella l\'esecuzione del ritardo', 'es': 'Ejecución de retraso claro'};
Blockly.Words['timeouts_cleartimeout_help'] = {'en': 'cleartimeout', 'de': 'cleartimeout', 'ru': 'cleartimeout', 'pt': 'cleartimeout', 'nl': 'clearTimeout', 'fr': 'cleartimeout', 'it': 'clearTimeout', 'es': 'cleartimeout'};
Blockly.Words['timeouts_setinterval'] = {'en': 'Execution', 'de': 'Ausführen', 'ru': 'Выполнить', 'pt': 'Execução', 'nl': 'Executie', 'fr': 'Exécution', 'it': 'Esecuzione', 'es': 'Ejecución'};
Blockly.Words['timeouts_setinterval_name'] = {'en': 'interval', 'de': 'Intervall', 'ru': 'интервал', 'pt': 'intervalo', 'nl': 'interval', 'fr': 'intervalle', 'it': 'intervallo', 'es': 'intervalo'};
Blockly.Words['timeouts_setinterval_in'] = {'en': 'every', 'de': 'alle', 'ru': 'каждые', 'pt': 'cada', 'nl': 'elk', 'fr': 'chaque', 'it': 'ogni', 'es': 'cada'};
Blockly.Words['timeouts_setinterval_ms'] = {'en': 'ms', 'de': 'ms', 'ru': 'мс', 'pt': 'Senhora', 'nl': 'Mevrouw', 'fr': 'Mme', 'it': 'Signorina', 'es': 'Sra'};
Blockly.Words['timeouts_setinterval_tooltip'] = {'en': 'Cyclic execution', 'de': 'Zyklische Ausführung', 'ru': 'Выполнять постоянно через интервал', 'pt': 'Execução cíclica', 'nl': 'Cyclische uitvoering', 'fr': 'Exécution cyclique', 'it': 'Esecuzione ciclica', 'es': 'Ejecución cíclica'};
Blockly.Words['timeouts_setinterval_help'] = {'en': 'setinterval', 'de': 'setinterval', 'ru': 'setinterval', 'pt': 'setinterval', 'nl': 'setInterval', 'fr': 'setinterval', 'it': 'setInterval', 'es': 'setinterval'};
Blockly.Words['timeouts_clearinterval'] = {'en': 'clear interval', 'de': 'stop zyklische Ausführung', 'ru': 'остановить постоянное выполнение', 'pt': 'intervalo claro', 'nl': 'interval wissen', 'fr': 'intervalle clair', 'it': 'intervallo chiaro', 'es': 'intervalo claro'};
Blockly.Words['timeouts_clearinterval_tooltip'] = {'en': 'Clear interval execution', 'de': 'Ausführungsintervall anhalten', 'ru': 'Отменить цикличное выполнение с интервалом', 'pt': 'Execução de intervalo claro', 'nl': 'Interval-uitvoering wissen', 'fr': 'Effacer l\'intervalle d\'exécution', 'it': 'Cancella l\'esecuzione dell\'intervallo', 'es': 'Ejecución de intervalo claro'};
Blockly.Words['timeouts_clearinterval_help'] = {'en': 'clearinterval', 'de': 'clearinterval', 'ru': 'clearinterval', 'pt': 'clearinterval', 'nl': 'clearInterval', 'fr': 'clearinterval', 'it': 'clearInterval', 'es': 'clearinterval'};
// --- TRIGGER --------------------------------------------------
Blockly.Words['Trigger'] = {'en': 'Trigger', 'de': 'Trigger', 'ru': 'События', 'pt': 'Desencadear', 'nl': 'In gang zetten', 'fr': 'Déclencheur', 'it': 'Grilletto', 'es': 'Desencadenar'};
// --- trigger on --------------------------------------------------
Blockly.Words['on_onchange'] = {'en': 'was changed', 'de': 'wurde geändert', 'ru': 'изменился', 'pt': 'foi alterado', 'nl': 'was veranderd', 'fr': 'a été changé', 'it': 'era cambiato', 'es': 'fue cambiado'};
Blockly.Words['on_any'] = {'en': 'was updated', 'de': 'wurde aktualisiert', 'ru': 'обновился', 'pt': 'foi atualizado', 'nl': 'is geupdated', 'fr': 'a été mis à jour', 'it': 'è stato aggiornato', 'es': 'fue actualizado'};
Blockly.Words['on_gt'] = {'en': 'is greater than last', 'de': 'ist größer als letztes', 'ru': 'больше прошлого', 'pt': 'é maior do que o último', 'nl': 'is groter dan de vorige', 'fr': 'est plus grand que le dernier', 'it': 'è più grande dell\'ultimo', 'es': 'es mayor que el último'};
Blockly.Words['on_ge'] = {'en': 'is greater or equal than last', 'de': 'ist gleich oder größer als letztes', 'ru': 'больше или равен прошлому', 'pt': 'é maior ou igual que a última', 'nl': 'is groter of gelijk dan de vorige', 'fr': 'est supérieur ou égal à la dernière', 'it': 'è maggiore o uguale alla precedente', 'es': 'es mayor o igual que el último'};
Blockly.Words['on_lt'] = {'en': 'is less than last', 'de': 'ist kleiner als letztes', 'ru': 'меньше прошлого', 'pt': 'é menos do que o último', 'nl': 'is minder dan de vorige', 'fr': 'est moins que la dernière', 'it': 'è inferiore all\'ultima', 'es': 'es menos que el último'};
Blockly.Words['on_le'] = {'en': 'is less or equal than last', 'de': 'ist gleich oder kleiner als letztes', 'ru': 'меньше или равен прошлому', 'pt': 'é menor ou igual que a última', 'nl': 'is minder of gelijk dan de vorige', 'fr': 'est inférieur ou égal à la dernière', 'it': 'è inferiore o uguale all\'ultima', 'es': 'es menor o igual que el último'};
Blockly.Words['on_eq'] = {'en': 'is same as last', 'de': 'ist gleich wie letztes', 'ru': 'равен прошлому', 'pt': 'é o mesmo que o último', 'nl': 'is hetzelfde als het laatst', 'fr': 'est le même que le dernier', 'it': 'è lo stesso dell\'ultimo', 'es': 'es lo mismo que el último'};
Blockly.Words['on_true'] = {'en': 'is true', 'de': 'ist wahr', 'ru': 'равен true', 'pt': 'é verdade', 'nl': 'is waar', 'fr': 'est vrai', 'it': 'è vero', 'es': 'es verdad'};
Blockly.Words['on_false'] = {'en': 'is false', 'de': 'ist unwahr', 'ru': 'равен false', 'pt': 'é falso', 'nl': 'is fout', 'fr': 'c\'est faux', 'it': 'è falso', 'es': 'Es falso'};
Blockly.Words['on_help'] = {'en': 'on---subscribe-on-changes-or-updates-of-some-state', 'de': 'on---subscribe-on-changes-or-updates-of-some-state', 'ru': 'on---subscribe-on-changes-or-updates-of-some-state', 'pt': 'on---subscribe-on-changes-or-updates-of-some-state', 'nl': 'on---subscribe-on-changes-or-updates-of-some-state', 'fr': 'on---subscribe-on-changes-or-updates-of-some-state', 'it': 'on---subscribe-on-changes-or-updates-of-some-state', 'es': 'on---subscribe-on-changes-or-updates-of-some-state'};
Blockly.Words['on_ack'] = {'en': 'Ack is', 'de': 'anerkannt ist', 'ru': 'Подтверждение', 'pt': 'Ack é', 'nl': 'Ack is', 'fr': 'Ack est', 'it': 'Ack è', 'es': 'Ack es'};
Blockly.Words['on_ack_any'] = {'en': 'any', 'de': 'egal', 'ru': 'не важно', 'pt': 'qualquer', 'nl': 'ieder', 'fr': 'tout', 'it': 'qualunque', 'es': 'alguna'};
Blockly.Words['on_ack_true'] = {'en': 'update', 'de': 'Update', 'ru': 'обновление', 'pt': 'atualizar', 'nl': 'bijwerken', 'fr': 'mettre à jour', 'it': 'aggiornare', 'es': 'actualizar'};
Blockly.Words['on_ack_false'] = {'en': 'command', 'de': 'Befehl', 'ru': 'команда', 'pt': 'comando', 'nl': 'opdracht', 'fr': 'commander', 'it': 'comando', 'es': 'mando'};
Blockly.Words['on_ext'] = {'en': 'Event: if objects', 'de': 'Falls Objekt', 'ru': 'Событие: если объект', 'pt': 'Evento: se objetos', 'nl': 'Evenement: als objecten', 'fr': 'Evénement: si des objets', 'it': 'Evento: se oggetti', 'es': 'Evento: si los objetos'};
Blockly.Words['on_ext_tooltip'] = {'en': 'If some state changed or updated', 'de': 'Bei Zustandsänderung', 'ru': 'При изменении или обновлении состояния', 'pt': 'Se algum estado mudou ou atualizou', 'nl': 'Als een bepaalde staat is gewijzigd of bijgewerkt', 'fr': 'Si un état a été modifié ou mis à jour', 'it': 'Se qualche stato è cambiato o aggiornato', 'es': 'Si algún estado cambió o se actualizó'};
Blockly.Words['on_ext_oid'] = {'en': 'object ID', 'de': 'Objekt ID', 'ru': 'ID объекта', 'pt': 'ID do objeto', 'nl': 'object-ID', 'fr': 'ID d\'objet', 'it': 'ID oggetto', 'es': 'ID de objeto'};
Blockly.Words['on_ext_oid_tooltip'] = {'en': 'Object ID', 'de': 'Objekt ID', 'ru': 'ID объекта', 'pt': 'ID do objeto', 'nl': 'Object ID', 'fr': 'ID de l\'objet', 'it': 'ID oggetto', 'es': 'ID del objeto'};
Blockly.Words['on_ext_on'] = {'en': 'trigger on', 'de': 'falls Trigger auf', 'ru': 'если cобытие', 'pt': 'gatilho', 'nl': 'trigger aan', 'fr': 'déclencher', 'it': 'innesco su', 'es': 'desencadenar'};
Blockly.Words['on_ext_on_tooltip'] = {'en': 'trigger on', 'de': 'falls Trigger auf', 'ru': 'если cобытие', 'pt': 'gatilho', 'nl': 'trigger aan', 'fr': 'déclencher', 'it': 'innesco su', 'es': 'desencadenar'};
Blockly.Words['on'] = {'en': 'Event: if object', 'de': 'falls Objekt', 'ru': 'Событие: если объект', 'pt': 'Evento: se objeto', 'nl': 'Evenement: als object', 'fr': 'Evénement: si objet', 'it': 'Evento: se oggetto', 'es': 'Evento: si el objeto'};
Blockly.Words['on_tooltip'] = {'en': 'If some state changed or updated', 'de': 'Bei Zustandsänderung', 'ru': 'При изменении или обновлении состояния', 'pt': 'Se algum estado mudou ou atualizou', 'nl': 'Als een bepaalde staat is gewijzigd of bijgewerkt', 'fr': 'Si un état a été modifié ou mis à jour', 'it': 'Se qualche stato è cambiato o aggiornato', 'es': 'Si algún estado cambió o se actualizó'};
Blockly.Words['on_source'] = {'en': 'get', 'de': 'Nehme', 'ru': 'взять', 'pt': 'obter', 'nl': 'krijgen', 'fr': 'obtenir', 'it': 'ottenere', 'es': 'obtener'};
Blockly.Words['on_source_of'] = {'en': 'of trigger', 'de': 'von Trigger', 'ru': 'триггера', 'pt': 'de gatilho', 'nl': 'van trigger', 'fr': 'de déclenchement', 'it': 'di innesco', 'es': 'de gatillo'};
Blockly.Words['on_source_tooltip'] = {'en': 'Get information about event', 'de': 'Hole die Information über Ereignis', 'ru': 'Получить информацию о событии', 'pt': 'Obter informações sobre o evento', 'nl': 'Krijg informatie over het evenement', 'fr': 'Obtenir des informations sur l\'événement', 'it': 'Ottieni informazioni sull\'evento', 'es': 'Obtener información sobre el evento'};
Blockly.Words['on_source_id'] = {'en': 'object ID', 'de': 'Objekt ID', 'ru': 'ID объекта', 'pt': 'ID do objeto', 'nl': 'object-ID', 'fr': 'ID d\'objet', 'it': 'ID oggetto', 'es': 'ID de objeto'};
Blockly.Words['on_source_name'] = {'en': 'name', 'de': 'Name', 'ru': 'имя', 'pt': 'nome', 'nl': 'naam', 'fr': 'prénom', 'it': 'nome', 'es': 'nombre'};
Blockly.Words['on_source_desc'] = {'en': 'description', 'de': 'Beschreibung', 'ru': 'описание', 'pt': 'descrição', 'nl': 'Beschrijving', 'fr': 'la description', 'it': 'descrizione', 'es': 'descripción'};
Blockly.Words['on_source_channel_id'] = {'en': 'channel ID', 'de': 'Kanal ID', 'ru': 'ID канала', 'pt': 'ID do canal', 'nl': 'Kanaal Nr', 'fr': 'Identifiant de la chaine', 'it': 'Canale ID', 'es': 'Canal ID'};
Blockly.Words['on_source_channel_name'] = {'en': 'channel name', 'de': 'Kanalname ID', 'ru': 'имя канала', 'pt': 'nome do canal', 'nl': 'kanaal naam', 'fr': 'nom du canal', 'it': 'nome del canale', 'es': 'Nombre del Canal'};
Blockly.Words['on_source_device_id'] = {'en': 'device ID', 'de': 'Gerät ID', 'ru': 'ID устройства', 'pt': 'ID de dispositivo', 'nl': 'apparaat ID', 'fr': 'Reference de l\'appareil', 'it': 'ID del dispositivo', 'es': 'ID del dispositivo'};
Blockly.Words['on_source_device_name'] = {'en': 'device name', 'de': 'Gerätename', 'ru': 'имя устройства', 'pt': 'nome do dispositivo', 'nl': 'toestelnaam', 'fr': 'nom de l\'appareil', 'it': 'nome del dispositivo', 'es': 'nombre del dispositivo'};
Blockly.Words['on_source_state_val'] = {'en': 'state value', 'de': 'Wert', 'ru': 'значение', 'pt': 'valor do estado', 'nl': 'staatswaarde', 'fr': 'valeur d\'état', 'it': 'valore di stato', 'es': 'valor de estado'};
Blockly.Words['on_source_state_ts'] = {'en': 'state timestamp', 'de': 'Zeitstempel', 'ru': 'время', 'pt': 'timestamp de estado', 'nl': 'staat tijdstempel', 'fr': 'horodatage de l\'état', 'it': 'timestamp di stato', 'es': 'marca de tiempo del estado'};
Blockly.Words['on_source_state_q'] = {'en': 'state quality', 'de': 'Qualität', 'ru': 'качество', 'pt': 'qualidade do estado', 'nl': 'staat kwaliteit', 'fr': 'qualité de l\'état', 'it': 'qualità dello stato', 'es': 'calidad del estado'};
Blockly.Words['on_source_state_from'] = {'en': 'origin of value', 'de': 'Ursprung', 'ru': 'происхождение', 'pt': 'origem do valor', 'nl': 'oorsprong van waarde', 'fr': 'origine de la valeur', 'it': 'origine del valore', 'es': 'origen del valor'};
Blockly.Words['on_source_state_ack'] = {'en': 'is command or update', 'de': 'Befehl oder Aktualisierung', 'ru': 'команда или обновление', 'pt': 'é comando ou atualização', 'nl': 'is commando of update', 'fr': 'est la commande ou la mise à jour', 'it': 'è comando o aggiornamento', 'es': 'es comando o actualización'};
Blockly.Words['on_source_state_lc'] = {'en': 'last change of state', 'de': 'letzte Änderung', 'ru': 'последнее изменение', 'pt': 'última mudança de estado', 'nl': 'laatste verandering van staat', 'fr': 'dernier changement d\'état', 'it': 'ultimo cambio di stato', 'es': 'último cambio de estado'};
Blockly.Words['on_source_oldstate_val'] = {'en': 'previous value', 'de': 'vorheriger Wert', 'ru': 'предыдущее значение', 'pt': 'valor anterior', 'nl': 'vorige waarde', 'fr': 'valeur précédente', 'it': 'valore precedente', 'es': 'valor anterior'};
Blockly.Words['on_source_oldstate_ts'] = {'en': 'previous timestamp', 'de': 'vorheriger Zeitstempel', 'ru': 'предыдущее время', 'pt': 'timestamp anterior', 'nl': 'vorige timestamp', 'fr': 'Horodatage précédent', 'it': 'timestamp precedente', 'es': 'fecha y hora anterior'};
Blockly.Words['on_source_oldstate_q'] = {'en': 'previous quality', 'de': 'vorherige Quialität', 'ru': 'предыдущее качество', 'pt': 'qualidade anterior', 'nl': 'vorige kwaliteit', 'fr': 'qualité précédente', 'it': 'qualità precedente', 'es': 'calidad previa'};
Blockly.Words['on_source_oldstate_from'] = {'en': 'previous origin', 'de': 'vorherige Ursprung', 'ru': 'предыдущее происхождение', 'pt': 'origem anterior', 'nl': 'vorige oorsprong', 'fr': 'origine précédente', 'it': 'origine precedente', 'es': 'origen anterior'};
Blockly.Words['on_source_oldstate_ack'] = {'en': 'previous command or update', 'de': 'vorheriges Ack', 'ru': 'предыдущее команда или обновление', 'pt': 'comando ou atualização anterior', 'nl': 'vorige opdracht of update', 'fr': 'commande précédente ou mise à jour', 'it': 'comando precedente o aggiornamento', 'es': 'comando anterior o actualización'};
Blockly.Words['on_source_oldstate_lc'] = {'en': 'previous last change', 'de': 'vorherige letzte Änderung', 'ru': 'предыдущее последнее изменение', 'pt': 'última mudança anterior', 'nl': 'vorige laatste wijziging', 'fr': 'précédent dernier changement', 'it': 'precedente ultima modifica', 'es': 'último cambio anterior'};
Blockly.Words['on_source_warning'] = {'en': 'This block must be used only inside of event block', 'de': 'Dieser Block darf nur innerhalb "Falls Objekt" Block verwendet werden', 'ru': 'Этот блок можно использовать только внутри блока "Событие"', 'pt': 'Este bloco deve ser usado apenas dentro do bloco de eventos', 'nl': 'Dit blok mag alleen binnen het gebeurtenisblok worden gebruikt', 'fr': 'Ce bloc doit être utilisé uniquement à l\'intérieur du bloc d\'événements', 'it': 'Questo blocco deve essere utilizzato solo all\'interno del blocco eventi', 'es': 'Este bloque debe usarse solo dentro del bloque de evento'};
// --- trigger schedule --------------------------------------------------
Blockly.Words['schedule'] = {'en': 'schedule', 'de': 'Zeitplan', 'ru': 'Cron расписание', 'pt': 'cronograma', 'nl': 'planning', 'fr': 'programme', 'it': 'programma', 'es': 'programar'};
Blockly.Words['schedule_tooltip'] = {'en': 'Do something on cron schedule', 'de': 'Ausführen nach Zeitplan', 'ru': 'Выполнять по расписанию', 'pt': 'Faça algo no cron schedule', 'nl': 'Doe iets op cron-schema', 'fr': 'Faire quelque chose sur le calendrier cron', 'it': 'Fai qualcosa su cron schedule', 'es': 'Hacer algo en el cronograma cron'};
Blockly.Words['schedule_help'] = {'en': 'schedule', 'de': 'schedule', 'ru': 'schedule', 'pt': 'cronograma', 'nl': 'planning', 'fr': 'programme', 'it': 'programma', 'es': 'programar'};
// --- trigger astro --------------------------------------------------
Blockly.Words['astro'] = {'en': 'astro', 'de': 'Astro', 'ru': 'Астро', 'pt': 'astro', 'nl': 'astro', 'fr': 'astro', 'it': 'astro', 'es': 'astro'};
Blockly.Words['astro_tooltip'] = {'en': 'Do something on astrological event', 'de': 'Ausführen nach Astro-Ereignis', 'ru': 'Выполнять по астро-событию', 'pt': 'Faça algo no evento astrológico', 'nl': 'Doe iets over astrologische gebeurtenissen', 'fr': 'Faire quelque chose sur l\'événement astrologique', 'it': 'Fai qualcosa sull\'evento astrologico', 'es': 'Haz algo en el evento astrológico'};
Blockly.Words['astro_offset'] = {'en': ', offset', 'de': ', Versatz', 'ru': ', сдвиг', 'pt': ', offset', 'nl': ', offset', 'fr': ', décalage', 'it': ', compensare', 'es': ', compensar'};
Blockly.Words['astro_minutes'] = {'en': 'minutes', 'de': 'Minuten', 'ru': 'минут', 'pt': 'minutos', 'nl': 'notulen', 'fr': 'minutes', 'it': 'minuti', 'es': 'minutos'};
Blockly.Words['astro_sunriseText'] = {'en': 'sunrise', 'de': 'Sonnenaufgang', 'ru': 'восход солнца', 'pt': 'nascer do sol', 'nl': 'zonsopkomst', 'fr': 'lever du soleil', 'it': 'Alba', 'es': 'amanecer'};
Blockly.Words['astro_sunriseEndText'] = {'en': 'sunrise end', 'de': 'Sonnenaufgang-Ende', 'ru': 'конец восхода', 'pt': 'fim do nascer do sol', 'nl': 'zonsopgang einde', 'fr': 'fin du lever du soleil', 'it': 'alba fine', 'es': 'salida del sol'};
Blockly.Words['astro_goldenHourEndText'] = {'en': 'golden hour end', 'de': '"Golden hour"-Ende', 'ru': 'конец золотого часа', 'pt': 'hora da hora dourada', 'nl': 'gouden uureinde', 'fr': 'fin de l\'heure d\'or', 'it': 'ora d\'oro fine', 'es': 'hora dorada'};
Blockly.Words['astro_solarNoonText'] = {'en': 'solar noon', 'de': 'Sonnenmittag', 'ru': 'солнечеый полдень', 'pt': 'meio-dia solar', 'nl': 'zonne middag', 'fr': 'midi solaire', 'it': 'mezzogiorno solare', 'es': 'mediodía solar'};
Blockly.Words['astro_goldenHourText'] = {'en': 'golden hour', 'de': '"Golden hour"', 'ru': 'золотой час', 'pt': 'Hora dourada', 'nl': 'gouden uur', 'fr': 'heure d\'or', 'it': 'ora d\'oro', 'es': 'hora dorada'};
Blockly.Words['astro_sunsetStartText'] = {'en': 'sunset start', 'de': 'Sonnenuntergang-Anfang', 'ru': 'начало захода солнца', 'pt': 'começo do por do sol', 'nl': 'zonsondergang start', 'fr': 'coucher de soleil début', 'it': 'inizio del tramonto', 'es': 'puesta de sol'};
Blockly.Words['astro_sunsetText'] = {'en': 'sunset', 'de': 'Sonnenuntergang', 'ru': 'конец захода солнца', 'pt': 'por do sol', 'nl': 'zonsondergang', 'fr': 'le coucher du soleil', 'it': 'tramonto', 'es': 'puesta de sol'};
Blockly.Words['astro_duskText'] = {'en': 'dusk', 'de': 'Abenddämmerung', 'ru': 'сумерки', 'pt': 'crepúsculo', 'nl': 'schemer', 'fr': 'crépuscule', 'it': 'crepuscolo', 'es': 'oscuridad'};
Blockly.Words['astro_nauticalDuskText'] = {'en': 'nautical dusk', 'de': 'Nautische Abenddämmerung', 'ru': 'навигационные сумерки', 'pt': 'crepúsculo náutico', 'nl': 'nautische schemering', 'fr': 'crépuscule nautique', 'it': 'crepuscolo nautico', 'es': 'anochecer náutico'};
Blockly.Words['astro_nightText'] = {'en': 'night', 'de': 'Nacht', 'ru': 'ночь', 'pt': 'noite', 'nl': 'nacht', 'fr': 'nuit', 'it': 'notte', 'es': 'noche'};
Blockly.Words['astro_nightEndText'] = {'en': 'night end', 'de': 'Nachtsende', 'ru': 'конец ночи', 'pt': 'final da noite', 'nl': 'einde van de nacht', 'fr': 'fin de nuit', 'it': 'fine della notte', 'es': 'fin de noche'};
Blockly.Words['astro_nauticalDawnText'] = {'en': 'nautical dawn', 'de': 'Nautische Morgendämmerung', 'ru': 'навигационный рассвет', 'pt': 'amanhecer náutico', 'nl': 'nautische dageraad', 'fr': 'aube nautique', 'it': 'alba nautica', 'es': 'amanecer náutico'};
Blockly.Words['astro_dawnText'] = {'en': 'dawn', 'de': 'Morgendämmerung', 'ru': 'рассвет', 'pt': 'alvorecer', 'nl': 'dageraad', 'fr': 'Aube', 'it': 'alba', 'es': 'amanecer'};
Blockly.Words['astro_nadirText'] = {'en': 'nadir', 'de': 'Nadir', 'ru': 'надир', 'pt': 'nadir', 'nl': 'nadir', 'fr': 'nadir', 'it': 'nadir', 'es': 'nadir'};
Blockly.Words['astro_help'] = {'en': 'astro--function', 'de': 'astro--function', 'ru': 'astro--function', 'pt': 'astro--function', 'nl': 'astro--function', 'fr': 'astro--function', 'it': 'astro--function', 'es': 'astro--function'};
// --- trigger schedule --------------------------------------------------
Blockly.Words['schedule_create'] = {'en': 'schedule', 'de': 'Zeitplan', 'ru': 'Расписание', 'pt': 'cronograma', 'nl': 'planning', 'fr': 'programme', 'it': 'programma', 'es': 'programar'};
Blockly.Words['schedule_create_name'] = {'en': 'schedule', 'de': 'Zeitplan', 'ru': 'Расписание', 'pt': 'cronograma', 'nl': 'planning', 'fr': 'programme', 'it': 'programma', 'es': 'programar'};
Blockly.Words['schedule_text'] = {'en': 'cron rule', 'de': 'CRON Regel', 'ru': 'cron правило', 'pt': 'regra cron', 'nl': 'cron-regel', 'fr': 'règle cron', 'it': 'regola cron', 'es': 'regla cron'};
Blockly.Words['schedule_create_tooltip'] = {'en': 'Delay execution', 'de': 'Ausführung verzögern', 'ru': 'Сделать паузу', 'pt': 'Atrasar a execução', 'nl': 'Vertraag uitvoering', 'fr': 'Retarder l\'exécution', 'it': 'Ritardare l\'esecuzione', 'es': 'Demora de ejecución'};
Blockly.Words['schedule_create_help'] = {'en': 'settimeout', 'de': 'settimeout', 'ru': 'settimeout', 'pt': 'settimeout', 'nl': 'setTimeout', 'fr': 'settimeout', 'it': 'setTimeout', 'es': 'settimeout'};
Blockly.Words['schedule_clear'] = {'en': 'clear', 'de': 'stop', 'ru': 'остановить', 'pt': 'Claro', 'nl': 'duidelijk', 'fr': 'clair', 'it': 'chiaro', 'es': 'claro'};
Blockly.Words['schedule_clear_tooltip'] = {'en': 'Clear delay execution', 'de': 'Ausführungsverzögerung anhalten', 'ru': 'Отменить выполнение с паузой', 'pt': 'Execução de atraso clara', 'nl': 'Duidelijke uitvoering van vertragingen', 'fr': 'Effacer l\'exécution du délai', 'it': 'Cancella l\'esecuzione del ritardo', 'es': 'Ejecución de retraso claro'};
Blockly.Words['schedule_clear_help'] = {'en': 'cleartimeout', 'de': 'cleartimeout', 'ru': 'cleartimeout', 'pt': 'cleartimeout', 'nl': 'clearTimeout', 'fr': 'cleartimeout', 'it': 'clearTimeout', 'es': 'cleartimeout'};
// --- trigger field --------------------------------------------------
Blockly.Words['field_cron'] = {'en': 'CRON', 'de': 'CRON', 'ru': 'CRON', 'pt': 'CRON', 'nl': 'CRON', 'fr': 'CRON', 'it': 'CRON', 'es': 'CRON'};
Blockly.Words['field_cron_CRON'] = {'en': 'CRON', 'de': 'CRON', 'ru': 'CRON', 'pt': 'CRON', 'nl': 'CRON', 'fr': 'CRON', 'it': 'CRON', 'es': 'CRON'};
Blockly.Words['field_cron_tooltip'] = {'en': 'Create CRON rule with dialog', 'de': 'Erzeuge CRON Regel mit Dialog', 'ru': 'Создать CRON правило с помощью диалога', 'pt': 'Criar regra CRON com diálogo', 'nl': 'Maak CRON-regel met dialoogvenster', 'fr': 'Créer une règle CRON avec dialogue', 'it': 'Crea una regola CRON con finestra di dialogo', 'es': 'Crear regla CRON con diálogo'};
// --- trigger cron --------------------------------------------------
Blockly.Words['cron_builder'] = {'en': 'CRON', 'de': 'CRON', 'ru': 'CRON', 'pt': 'CRON', 'nl': 'CRON', 'fr': 'CRON', 'it': 'CRON', 'es': 'CRON'};
Blockly.Words['cron_builder_CRON'] = {'en': 'CRON', 'de': 'CRON', 'ru': 'CRON', 'pt': 'CRON', 'nl': 'CRON', 'fr': 'CRON', 'it': 'CRON', 'es': 'CRON'};
Blockly.Words['cron_builder_tooltip'] = {'en': 'Create CRON rule with dialog', 'de': 'Erzeuge CRON Regel mit Dialog', 'ru': 'Создать CRON правило с помощью диалога', 'pt': 'Criar regra CRON com diálogo', 'nl': 'Maak CRON-regel met dialoogvenster', 'fr': 'Créer une règle CRON avec dialogue', 'it': 'Crea una regola CRON con finestra di dialogo', 'es': 'Crear regla CRON con diálogo'};
Blockly.Words['cron_builder_with_seconds'] = {'en': 'with seconds', 'de': 'mit Sekunden', 'ru': 'с секундами', 'pt': 'com segundos', 'nl': 'met seconden', 'fr': 'avec secondes', 'it': 'con secondi', 'es': 'con segundos'};
Blockly.Words['cron_builder_dow'] = {'en': 'day of week', 'de': 'Wochentag', 'ru': 'день недели', 'pt': 'dia da semana', 'nl': 'dag van de week', 'fr': 'jour de la semaine', 'it': 'giorno della settimana', 'es': 'día de la semana'};
Blockly.Words['cron_builder_month'] = {'en': 'month', 'de': 'Monat', 'ru': 'месяц', 'pt': 'mês', 'nl': 'maand', 'fr': 'mois', 'it': 'mese', 'es': 'mes'};
Blockly.Words['cron_builder_day'] = {'en': 'date', 'de': 'Datum', 'ru': 'число', 'pt': 'encontro', 'nl': 'datum', 'fr': 'rendez-vous amoureux', 'it': 'Data', 'es': 'fecha'};
Blockly.Words['cron_builder_hour'] = {'en': 'hour', 'de': 'Stunde', 'ru': 'час', 'pt': 'hora', 'nl': 'uur', 'fr': 'heure', 'it': 'ora', 'es': 'hora'};
Blockly.Words['cron_builder_minutes'] = {'en': 'minutes', 'de': 'Minuten', 'ru': 'минуты', 'pt': 'minutos', 'nl': 'notulen', 'fr': 'minutes', 'it': 'minuti', 'es': 'minutos'};
Blockly.Words['cron_builder_seconds'] = {'en': 'seconds', 'de': 'Sekunden', 'ru': 'секунды', 'pt': 'segundos', 'nl': 'seconden', 'fr': 'secondes', 'it': 'secondi', 'es': 'segundos'};
Blockly.Words['cron_builder_line'] = {'en': 'as line', 'de': 'Als Linie', 'ru': 'в линию', 'pt': 'como linha', 'nl': 'als lijn', 'fr': 'en ligne', 'it': 'come linea', 'es': 'como línea'};

View File

@ -0,0 +1,204 @@
/**
* @license
* Visual Blocks Editor
*
* Copyright 2012 Google Inc.
* https://developers.google.com/blockly/
*
* 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 Text input field.
* @author fraser@google.com (Neil Fraser)
*/
'use strict';
goog.provide('Blockly.FieldCRON');
goog.require('Blockly.Field');
goog.require('Blockly.Msg');
goog.require('goog.asserts');
goog.require('goog.dom');
goog.require('goog.userAgent');
/**
* Class for an editable text field.
* @param {string} text The initial content of the field.
* @param {Function=} opt_validator An optional function that is called
* to validate any constraints on what the user entered. Takes the new
* text as an argument and returns either the accepted text, a replacement
* text, or null to abort the change.
* @extends {Blockly.Field}
* @constructor
*/
Blockly.FieldCRON = function(text) {
Blockly.FieldCRON.superClass_.constructor.call(this, text);
};
goog.inherits(Blockly.FieldCRON, Blockly.Field);
/**
* Point size of text. Should match blocklyText's font-size in CSS.
*/
Blockly.FieldCRON.FONTSIZE = 11;
/**
* Mouse cursor style when over the hotspot that initiates the editor.
*/
Blockly.FieldCRON.prototype.CURSOR = 'pointer';
/**
* Allow browser to spellcheck this field.
* @private
*/
Blockly.FieldCRON.prototype.spellcheck_ = false;
/**
* Close the input widget if this input is being deleted.
*/
Blockly.FieldCRON.prototype.dispose = function() {
Blockly.WidgetDiv.hideIfOwner(this);
Blockly.FieldCRON.superClass_.dispose.call(this);
};
/**
* Set the text in this field.
* @param {?string} text New text.
* @override
*/
Blockly.FieldCRON.prototype.setValue = function(text) {
if (text === null) {
return; // No change if null.
}
Blockly.Field.prototype.setValue.call(this, text);
};
/**
* Show the inline free-text editor on top of the text.
* @param {boolean=} opt_quietInput True if editor should be created without
* focus. Defaults to false.
* @private
*/
Blockly.FieldCRON.prototype.showEditor_ = function(opt_quietInput) {
this.workspace_ = this.sourceBlock_.workspace;
var that = this;
scripts.showCronDialog(that.getValue(), function (newId) {
if (newId !== undefined && newId !== null) that.setValue(newId);
});
};
/**
* Handle a change to the editor.
* @param {!Event} e Keyboard event.
* @private
*/
Blockly.FieldCRON.prototype.onHtmlInputChange_ = function(e) {
var htmlInput = Blockly.FieldCRON.htmlInput_;
// Update source block.
var text = htmlInput.value;
if (text !== htmlInput.oldValue_) {
htmlInput.oldValue_ = text;
this.setValue(text);
this.validate_();
} else if (goog.userAgent.WEBKIT) {
// Cursor key. Render the source block to show the caret moving.
// Chrome only (version 26, OS X).
this.sourceBlock_.render();
}
this.resizeEditor_();
Blockly.svgResize(this.sourceBlock_.workspace);
};
/**
* Check to see if the contents of the editor validates.
* Style the editor accordingly.
* @private
*/
Blockly.FieldCRON.prototype.validate_ = function() {
var valid = true;
goog.asserts.assertObject(Blockly.FieldCRON.htmlInput_);
var htmlInput = Blockly.FieldCRON.htmlInput_;
if (htmlInput.value) {
Blockly.addClass_(htmlInput, 'blocklyInvalidInput');
} else {
Blockly.removeClass_(htmlInput, 'blocklyInvalidInput');
}
};
/**
* Resize the editor and the underlying block to fit the text.
* @private
*/
Blockly.FieldCRON.prototype.resizeEditor_ = function() {
var div = Blockly.WidgetDiv.DIV;
var bBox = this.fieldGroup_.getBBox();
div.style.width = bBox.width * this.workspace_.scale + 'px';
div.style.height = bBox.height * this.workspace_.scale + 'px';
var xy = this.getAbsoluteXY_();
// In RTL mode block fields and LTR input fields the left edge moves,
// whereas the right edge is fixed. Reposition the editor.
if (this.sourceBlock_.RTL) {
var borderBBox = this.getScaledBBox_();
xy.x += borderBBox.width;
xy.x -= div.offsetWidth;
}
// Shift by a few pixels to line up exactly.
xy.y += 1;
if (goog.userAgent.GECKO && Blockly.WidgetDiv.DIV.style.top) {
// Firefox mis-reports the location of the border by a pixel
// once the WidgetDiv is moved into position.
xy.x -= 1;
xy.y -= 1;
}
if (goog.userAgent.WEBKIT) {
xy.y -= 3;
}
div.style.left = xy.x + 'px';
div.style.top = xy.y + 'px';
};
/**
* Close the editor, save the results, and dispose of the editable
* text field's elements.
* @return {!Function} Closure to call on destruction of the WidgetDiv.
* @private
*/
Blockly.FieldCRON.prototype.widgetDispose_ = function() {
var thisField = this;
return function() {
var htmlInput = Blockly.FieldCRON.htmlInput_;
// Save the edit (if it validates).
var text = htmlInput.value;
thisField.setValue(text);
thisField.sourceBlock_.rendered && thisField.sourceBlock_.render();
Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_);
thisField.workspace_.removeChangeListener(
htmlInput.onWorkspaceChangeWrapper_);
Blockly.FieldCRON.htmlInput_ = null;
// Delete style properties.
var style = Blockly.WidgetDiv.DIV.style;
style.width = 'auto';
style.height = 'auto';
style.fontSize = '';
};
};

View File

@ -0,0 +1,259 @@
/**
* @license
* Visual Blocks Editor
*
* Copyright 2012 Google Inc.
* https://developers.google.com/blockly/
*
* 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 Text input field.
* @author fraser@google.com (Neil Fraser)
*/
'use strict';
goog.provide('Blockly.FieldOID');
goog.require('Blockly.Field');
goog.require('Blockly.Msg');
goog.require('goog.asserts');
goog.require('goog.dom');
goog.require('goog.userAgent');
/**
* Class for an editable text field.
* @param {string} text The initial content of the field.
* @param {Function=} opt_validator An optional function that is called
* to validate any constraints on what the user entered. Takes the new
* text as an argument and returns either the accepted text, a replacement
* text, or null to abort the change.
* @extends {Blockly.Field}
* @constructor
*/
Blockly.FieldOID = function(text, oid_dialog, objects) {
Blockly.FieldOID.superClass_.constructor.call(this, text, oid_dialog);
this.oid_dialog = oid_dialog;
this.objects = objects;
};
goog.inherits(Blockly.FieldOID, Blockly.Field);
/**
* Point size of text. Should match blocklyText's font-size in CSS.
*/
Blockly.FieldOID.FONTSIZE = 11;
/**
* Mouse cursor style when over the hotspot that initiates the editor.
*/
Blockly.FieldOID.prototype.CURSOR = 'pointer';
/**
* Allow browser to spellcheck this field.
* @private
*/
Blockly.FieldOID.prototype.spellcheck_ = false;
/**
* Close the input widget if this input is being deleted.
*/
Blockly.FieldOID.prototype.dispose = function() {
Blockly.WidgetDiv.hideIfOwner(this);
Blockly.FieldOID.superClass_.dispose.call(this);
};
/**
* Set the text in this field.
* @param {?string} text New text.
* @override
*/
Blockly.FieldOID.prototype.setValue = function(text) {
if (text === null) {
return; // No change if null.
}
Blockly.Field.prototype.setValue.call(this, text);
};
/**
* Show the inline free-text editor on top of the text.
* @param {boolean=} opt_quietInput True if editor should be created without
* focus. Defaults to false.
* @private
*/
Blockly.FieldOID.prototype.showEditor_ = function(opt_quietInput) {
this.workspace_ = this.sourceBlock_.workspace;
var that = this;
this.oid_dialog.selectId('show', that.getValue(), function (newId) {
that.setValue(newId);
});
};
/**
* Handle key down to the editor.
* @param {!Event} e Keyboard event.
* @private
*/
/*Blockly.FieldOID.prototype.onHtmlInputKeyDown_ = function(e) {
var htmlInput = Blockly.FieldOID.htmlInput_;
var tabKey = 9, enterKey = 13, escKey = 27;
if (e.keyCode == enterKey) {
Blockly.WidgetDiv.hide();
} else if (e.keyCode == escKey) {
htmlInput.value = htmlInput.defaultValue;
Blockly.WidgetDiv.hide();
} else if (e.keyCode == tabKey) {
Blockly.WidgetDiv.hide();
this.sourceBlock_.tab(this, !e.shiftKey);
e.preventDefault();
}
};*/
/**
* Handle a change to the editor.
* @param {!Event} e Keyboard event.
* @private
*/
Blockly.FieldOID.prototype.onHtmlInputChange_ = function(e) {
var htmlInput = Blockly.FieldOID.htmlInput_;
// Update source block.
var text = htmlInput.value;
if (text !== htmlInput.oldValue_) {
htmlInput.oldValue_ = text;
this.setValue(text);
this.validate_();
} else if (goog.userAgent.WEBKIT) {
// Cursor key. Render the source block to show the caret moving.
// Chrome only (version 26, OS X).
this.sourceBlock_.render();
}
this.resizeEditor_();
Blockly.svgResize(this.sourceBlock_.workspace);
};
/**
* Update the text node of this field to display the current text.
* @private
*/
Blockly.FieldOID.prototype.updateTextNode_ = function() {
if (!this.textElement_) {
// Not rendered yet.
return;
}
var text = this.objects && this.objects[this.text_] && this.objects[this.text_].common && this.objects[this.text_].common.name ? this.objects[this.text_].common.name : this.text_;
if (text.length > this.maxDisplayLength) {
// Truncate displayed string and add an ellipsis ('...').
text = text.substring(0, this.maxDisplayLength - 2) + '\u2026';
}
// Empty the text element.
goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_));
// Replace whitespace with non-breaking spaces so the text doesn't collapse.
text = text.replace(/\s/g, Blockly.Field.NBSP);
if (this.sourceBlock_.RTL && text) {
// The SVG is LTR, force text to be RTL.
text += '\u200F';
}
if (!text) {
// Prevent the field from disappearing if empty.
text = Blockly.Field.NBSP;
}
var textNode = document.createTextNode(text);
this.textElement_.appendChild(textNode);
// Cached width is obsolete. Clear it.
this.size_.width = 0;
};
/**
* Check to see if the contents of the editor validates.
* Style the editor accordingly.
* @private
*/
Blockly.FieldOID.prototype.validate_ = function() {
var valid = true;
goog.asserts.assertObject(Blockly.FieldOID.htmlInput_);
var htmlInput = Blockly.FieldOID.htmlInput_;
if (htmlInput.value) {
Blockly.addClass_(htmlInput, 'blocklyInvalidInput');
} else {
Blockly.removeClass_(htmlInput, 'blocklyInvalidInput');
}
};
/**
* Resize the editor and the underlying block to fit the text.
* @private
*/
Blockly.FieldOID.prototype.resizeEditor_ = function() {
var div = Blockly.WidgetDiv.DIV;
var bBox = this.fieldGroup_.getBBox();
div.style.width = bBox.width * this.workspace_.scale + 'px';
div.style.height = bBox.height * this.workspace_.scale + 'px';
var xy = this.getAbsoluteXY_();
// In RTL mode block fields and LTR input fields the left edge moves,
// whereas the right edge is fixed. Reposition the editor.
if (this.sourceBlock_.RTL) {
var borderBBox = this.getScaledBBox_();
xy.x += borderBBox.width;
xy.x -= div.offsetWidth;
}
// Shift by a few pixels to line up exactly.
xy.y += 1;
if (goog.userAgent.GECKO && Blockly.WidgetDiv.DIV.style.top) {
// Firefox mis-reports the location of the border by a pixel
// once the WidgetDiv is moved into position.
xy.x -= 1;
xy.y -= 1;
}
if (goog.userAgent.WEBKIT) {
xy.y -= 3;
}
div.style.left = xy.x + 'px';
div.style.top = xy.y + 'px';
};
/**
* Close the editor, save the results, and dispose of the editable
* text field's elements.
* @return {!Function} Closure to call on destruction of the WidgetDiv.
* @private
*/
Blockly.FieldOID.prototype.widgetDispose_ = function() {
var thisField = this;
return function() {
var htmlInput = Blockly.FieldOID.htmlInput_;
// Save the edit (if it validates).
var text = htmlInput.value;
thisField.setValue(text);
thisField.sourceBlock_.rendered && thisField.sourceBlock_.render();
Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_);
thisField.workspace_.removeChangeListener(
htmlInput.onWorkspaceChangeWrapper_);
Blockly.FieldOID.htmlInput_ = null;
// Delete style properties.
var style = Blockly.WidgetDiv.DIV.style;
style.width = 'auto';
style.height = 'auto';
style.fontSize = '';
};
};

View File

@ -0,0 +1,179 @@
/**
* @license
* Visual Blocks Editor
*
* Copyright 2012 Google Inc.
* https://developers.google.com/blockly/
*
* 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 Text input field.
* @author fraser@google.com (Neil Fraser)
*/
'use strict';
goog.provide('Blockly.FieldScript');
goog.require('Blockly.Field');
goog.require('Blockly.Msg');
goog.require('goog.asserts');
goog.require('goog.dom');
goog.require('goog.userAgent');
/**
* Class for an editable text field.
* @param {string} text The initial content of the field.
* @param {Function=} opt_validator An optional function that is called
* to validate any constraints on what the user entered. Takes the new
* text as an argument and returns either the accepted text, a replacement
* text, or null to abort the change.
* @extends {Blockly.Field}
* @constructor
*/
Blockly.FieldScript = function(text) {
Blockly.FieldScript.superClass_.constructor.call(this, text);
};
goog.inherits(Blockly.FieldScript, Blockly.Field);
/**
* Point size of text. Should match blocklyText's font-size in CSS.
*/
Blockly.FieldScript.FONTSIZE = 11;
/**
* Mouse cursor style when over the hotspot that initiates the editor.
*/
Blockly.FieldScript.prototype.CURSOR = 'pointer';
/**
* Allow browser to spellcheck this field.
* @private
*/
Blockly.FieldScript.prototype.spellcheck_ = false;
/**
* Close the input widget if this input is being deleted.
*/
Blockly.FieldScript.prototype.dispose = function() {
Blockly.WidgetDiv.hideIfOwner(this);
Blockly.FieldScript.superClass_.dispose.call(this);
};
/**
* Set the text in this field.
* @param {?string} text New text.
* @override
*/
Blockly.FieldScript.prototype.setValue = function (text) {
if (text === null) {
return; // No change if null.
}
Blockly.Field.prototype.setValue.call(this, text);
};
/**
* Show the inline free-text editor on top of the text.
* @param {boolean=} opt_quietInput True if editor should be created without
* focus. Defaults to false.
* @private
*/
Blockly.FieldScript.prototype.showEditor_ = function(opt_quietInput) {
this.workspace_ = this.sourceBlock_.workspace;
var that = this;
var base64 = that.getValue();
var args = null;
var isReturn = false;
if (this.sourceBlock_ && this.sourceBlock_.arguments_) {
args = this.sourceBlock_.arguments_;
}
if (this.sourceBlock_.getProcedureDef) {
var options = this.sourceBlock_.getProcedureDef();
isReturn = options[2];
}
scripts.showScriptDialog(atob(base64 || ''), args, isReturn, function (newScript) {
if (newScript !== undefined && newScript !== null) that.setValue(btoa(newScript));
});
};
/**
* Draws the border with the correct width.
* Saves the computed width in a property.
* @private
*/
Blockly.FieldScript.prototype.render_ = function() {
var width = 10;
if (this.visible_) {
if (this.borderRect_) {
this.borderRect_.setAttribute('width', width + Blockly.BlockSvg.SEP_SPACE_X);
}
} else {
width = 0;
}
this.size_.width = width;
};
/**
* Update the text node of this field to display the current text.
* @private
*/
Blockly.FieldScript.prototype.updateTextNode_ = function() {
if (!this.textElement_) {
// Not rendered yet.
return;
}
// Empty the text element.
goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_));
var textNode = document.createTextNode('...');
this.textElement_.appendChild(textNode);
// Cached width is obsolete. Clear it.
this.size_.width = 10;
};
/**
* Close the editor, save the results, and dispose of the editable
* text field's elements.
* @return {!Function} Closure to call on destruction of the WidgetDiv.
* @private
*/
/*Blockly.FieldScript.prototype.widgetDispose_ = function() {
var thisField = this;
return function() {
var htmlInput = Blockly.FieldScript.htmlInput_;
// Save the edit (if it validates).
var text = htmlInput.value;
thisField.setValue(text);
thisField.sourceBlock_.rendered && thisField.sourceBlock_.render();
Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_);
Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_);
thisField.workspace_.removeChangeListener(
htmlInput.onWorkspaceChangeWrapper_);
Blockly.FieldScript.htmlInput_ = null;
// Delete style properties.
var style = Blockly.WidgetDiv.DIV.style;
style.width = 'auto';
style.height = 'auto';
style.fontSize = '';
};
};*/

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Code",
blocks: "Bausteine",
linkTooltip: "Speichern und auf Bausteine verlinken.",
runTooltip: "Das Programm ausführen, das von den Bausteinen im Arbeitsbereich definiert ist.",
badCode: "Programmfehler:\n%1",
timeout: "Die maximalen Ausführungswiederholungen wurden überschritten.",
trashTooltip: "Alle Bausteine verwerfen.",
catLogic: "Logik",
catLoops: "Schleifen",
catMath: "Mathematik",
catText: "Text",
catLists: "Listen",
catColour: "Farbe",
catVariables: "Variablen",
catFunctions: "Funktionen",
listVariable: "Liste",
textVariable: "Text",
httpRequestError: "Mit der Anfrage gab es ein Problem.",
linkAlert: "Teile deine Bausteine mit diesem Link:\n\n%1",
hashError: "„%1“ stimmt leider mit keinem gespeicherten Programm überein.",
xmlError: "Deine gespeicherte Datei konnte nicht geladen werden. Vielleicht wurde sie mit einer anderen Version von Blockly erstellt.",
badXml: "Fehler beim Parsen von XML:\n%1\n\nWähle 'OK' zum Verwerfen deiner Änderungen oder 'Abbrechen' zum weiteren Bearbeiten des XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Code",
blocks: "Blocks",
linkTooltip: "Save and link to blocks.",
runTooltip: "Run the program defined by the blocks in the workspace.",
badCode: "Program error:\n%1",
timeout: "Maximum execution iterations exceeded.",
trashTooltip: "Discard all blocks.",
catLogic: "Logic",
catLoops: "Loops",
catMath: "Math",
catText: "Text",
catLists: "Lists",
catColour: "Colour",
catVariables: "Variables",
catFunctions: "Functions",
listVariable: "list",
textVariable: "text",
httpRequestError: "There was a problem with the request.",
linkAlert: "Share your blocks with this link:\n\n%1",
hashError: "Sorry, '%1' doesn't correspond with any saved program.",
xmlError: "Could not load your saved file. Perhaps it was created with a different version of Blockly?",
badXml: "Error parsing XML:\n%1\n\nSelect 'OK' to abandon your changes or 'Cancel' to further edit the XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Código",
blocks: "Bloques",
linkTooltip: "Guarda conexión a los bloques.",
runTooltip: "Ejecute el programa definido por los bloques en el área de trabajo.",
badCode: "Error del programa:\n%1",
timeout: "Se excedio el máximo de iteraciones ejecutadas permitidas.",
trashTooltip: "Descartar todos los bloques.",
catLogic: "Lógica",
catLoops: "Secuencias",
catMath: "Matemáticas",
catText: "Texto",
catLists: "Listas",
catColour: "Color",
catVariables: "Variables",
catFunctions: "Funciones",
listVariable: "lista",
textVariable: "texto",
httpRequestError: "Hubo un problema con la petición.",
linkAlert: "Comparte tus bloques con este enlace:\n\n%1",
hashError: "«%1» no corresponde con ningún programa guardado.",
xmlError: "No se pudo cargar el archivo guardado. ¿Quizá fue creado con otra versión de Blockly?",
badXml: "Error de análisis XML:\n%1\n\nSelecciona OK para abandonar tus cambios o Cancelar para seguir editando el XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Code",
blocks: "Blocs",
linkTooltip: "Sauvegarder et lier aux blocs.",
runTooltip: "Lancer le programme défini par les blocs dans lespace de travail.",
badCode: "Erreur du programme :\n%1",
timeout: "Nombre maximum ditérations dexécution dépassé.",
trashTooltip: "Jeter tous les blocs.",
catLogic: "Logique",
catLoops: "Boucles",
catMath: "Math",
catText: "Texte",
catLists: "Listes",
catColour: "Couleur",
catVariables: "Variables",
catFunctions: "Fonctions",
listVariable: "liste",
textVariable: "texte",
httpRequestError: "Il y a eu un problème avec la demande.",
linkAlert: "Partagez vos blocs grâce à ce lien:\n\n%1",
hashError: "Désolé, '%1' ne correspond à aucun programme sauvegardé.",
xmlError: "Impossible de charger le fichier de sauvegarde. Peut être a t-il été créé avec une autre version de Blockly?",
badXml: "Erreur danalyse du XML :\n%1\n\nSélectionner 'OK' pour abandonner vos modifications ou 'Annuler' pour continuer à modifier le XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Codice",
blocks: "Blocchi",
linkTooltip: "Salva e collega ai blocchi.",
runTooltip: "Esegui il programma definito dai blocchi nell'area di lavoro.",
badCode: "Errore programma:\n%1",
timeout: "È stato superato il numero massimo consentito di interazioni eseguite.",
trashTooltip: "Elimina tutti i blocchi.",
catLogic: "Logica",
catLoops: "Cicli",
catMath: "Matematica",
catText: "Testo",
catLists: "Elenchi",
catColour: "Colore",
catVariables: "Variabili",
catFunctions: "Funzioni",
listVariable: "elenco",
textVariable: "testo",
httpRequestError: "La richiesta non è stata soddisfatta.",
linkAlert: "Condividi i tuoi blocchi con questo collegamento:\n\n%1",
hashError: "Mi spiace, '%1' non corrisponde ad alcun programma salvato.",
xmlError: "Non è stato possibile caricare il documento. Forse è stato creato con una versione diversa di Blockly?",
badXml: "Errore durante l'analisi XML:\n%1\n\nSeleziona 'OK' per abbandonare le modifiche o 'Annulla' per continuare a modificare l'XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Code",
blocks: "Blokken",
linkTooltip: "Opslaan en koppelen naar blokken.",
runTooltip: "Voer het programma uit dat met de blokken in de werkruimte is gemaakt.",
badCode: "Programmafout:\n%1",
timeout: "Het maximale aantal iteraties is overschreden.",
trashTooltip: "Alle blokken verwijderen",
catLogic: "Logica",
catLoops: "Lussen",
catMath: "Formules",
catText: "Tekst",
catLists: "Lijsten",
catColour: "Kleur",
catVariables: "Variabelen",
catFunctions: "Functies",
listVariable: "lijst",
textVariable: "tekst",
httpRequestError: "Er is een probleem opgetreden tijdens het verwerken van het verzoek.",
linkAlert: "Deel uw blokken via deze koppeling:\n\n%1",
hashError: "\"%1\" komt helaas niet overeen met een opgeslagen bestand.",
xmlError: "Uw opgeslagen bestand kan niet geladen worden. Is het misschien gemaakt met een andere versie van Blockly?",
badXml: "Fout tijdens het verwerken van de XML:\n%1\n\nSelecteer \"OK\" om uw wijzigingen te negeren of \"Annuleren\" om de XML verder te bewerken."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Código",
blocks: "Blocos",
linkTooltip: "Salvar e ligar aos blocos.",
runTooltip: "Execute o programa definido pelos blocos na área de trabalho.",
badCode: "Erro no programa:\n%1",
timeout: "Máximo de iterações de execução excedido.",
trashTooltip: "Descartar todos os blocos.",
catLogic: "Lógica",
catLoops: "Laços",
catMath: "Matemática",
catText: "Texto",
catLists: "Listas",
catColour: "Cor",
catVariables: "Variáveis",
catFunctions: "Funções",
listVariable: "lista",
textVariable: "texto",
httpRequestError: "Houve um problema com a requisição.",
linkAlert: "Compartilhe seus blocos com este link:\n\n%1",
hashError: "Desculpe, '%1' não corresponde a um programa salvo.",
xmlError: "Não foi possível carregar seu arquivo salvo. Talvez ele tenha sido criado com uma versão diferente do Blockly?",
badXml: "Erro de análise XML:\n%1\n\nSelecione 'OK' para abandonar suas mudanças ou 'Cancelar' para editar o XML."
};

View File

@ -0,0 +1,24 @@
var MSG = {
title: "Код",
blocks: "Блоки",
linkTooltip: "Сохранить и показать ссылку на блоки.",
runTooltip: "Запустить программу, заданную блоками в рабочей области.",
badCode: "Ошибка программы:\n%1",
timeout: "Превышено максимальное количество итераций.",
trashTooltip: "Удалить все блоки.",
catLogic: "Логические",
catLoops: "Циклы",
catMath: "Математика",
catText: "Текст",
catLists: "Списки",
catColour: "Цвет",
catVariables: "Переменные",
catFunctions: "Функции",
listVariable: "список",
textVariable: "текст",
httpRequestError: "Произошла проблема при запросе.",
linkAlert: "Поделитесь своими блоками по этой ссылке:\n\n%1",
hashError: "К сожалению, «%1» не соответствует ни одному сохраненному файлу Блокли.",
xmlError: "Не удалось загрузить ваш сохраненный файл. Возможно, он был создан в другой версии Блокли?",
badXml: "Ошибка синтаксического анализа XML:\n%1\n\nВыберите 'ОК', чтобы отказаться от изменений или 'Cancel' для дальнейшего редактирования XML."
};

197
admin/index.html Normal file
View File

@ -0,0 +1,197 @@
<html>
<head>
<!-- these 4 files always have to be included -->
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
<!-- these two file always have to be included -->
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<script type="text/javascript" src="../../js/translate.js"></script>
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
<script type="text/javascript" src="adminWords.js"></script>
<style>
.title {
white-space: nowrap;
}
.admin-text {
white-space: nowrap;
}
</style>
<!-- you have to define 2 functions in the global scope: -->
<script type="text/javascript">
function setValue(id, value, onChange) {
var $value = $('#' + id + '.value');
if ($value.attr('type') === 'checkbox') {
$value.prop('checked', value).change(function() {
var id = $(this).attr('id');
if (id === 'useSystemGPS') showHideSettings();
onChange();
});
} else {
$value.val(value).change(function() {
onChange();
}).keyup(function() {
onChange();
});
}
}
function showHideSettings() {
if ($('#useSystemGPS').prop('checked')) {
$('#tr_latitude').hide();
$('#tr_longitude').hide();
} else {
$('#tr_latitude').show();
$('#tr_longitude').show();
}
}
// the function loadSettings has to exist ...
function load(settings, onChange) {
if (settings.useSystemGPS === undefined) {
settings.useSystemGPS = (systemConfig.common.longitude && systemConfig.common.latitude);
}
if (settings.enableSendToHost === undefined) {
settings.enableSendToHost = false;
}
if (settings.enableExec === undefined) {
settings.enableExec = false;
}
$('.value').each(function () {
var id = $(this).attr('id');
setValue(id, settings[id] || '', onChange);
});
showHideSettings();
onChange(false);
}
function convertGrad(obj, attr) {
// Extract ° " and '
var m = obj[attr].match(/([0-9]+)°(\s*)(([0-9]+)')?(\s*)(([0-9]+)")?(\s*)([A-Z]+)?/);
if (m) {
var grad = m[1];
var min = m[4];
var sec = m[7];
var dir = m[9];
if (grad !== undefined && grad !== null) {
// Graddez = Grad + ( Minuten * 60 + Sekunden ) / 3600
var result = parseInt(grad, 10);
if (min !== undefined && min !== null) {
result += parseInt(min, 10) / 60;
if (sec !== undefined && sec !== null) {
result += parseInt(sec, 10) / 3600;
}
}
if (dir) {
dir = dir.toLowerCase();
if (dir === 's' || dir === 'w') {
result = (-1) * result;
}
}
obj[attr] = result.toFixed(6);
return true;
} else {
return false;
}
} else {
showMessage(_('Invalid format. Use A°B\'C"D'));
return false;
}
}
// ... and the function save has to exist.
// you have to make sure the callback is called with the settings object as first param!
function save(callback) {
var obj = {};
$('.value').each(function () {
var $this = $(this);
if ($this.attr('type') === 'checkbox') {
obj[$this.attr('id')] = $this.prop('checked');
} else {
obj[$this.attr('id')] = $this.val();
}
});
if (obj.latitude.indexOf('°') !== -1) {
if (!convertGrad(obj, 'latitude')) {
return;
}
$('#latitude').val(obj.latitude);
}
if (obj.longitude.indexOf('°') !== -1) {
if (!convertGrad(obj, 'longitude')) {
return;
}
$('#longitude').val(obj.longitude);
}
callback(obj);
}
</script>
</head>
<body>
<!-- you have to put your config page in a div with id adapter-container -->
<div id="adapter-container">
<table><tr>
<td><img src="js.png" style="width: 64px"/></td>
<td style="padding-top: 20px;padding-left: 10px"><h3 class="translate">Javascript scripts adapter settings</h3></td>
</tr></table>
<table style="width: calc(100% - 20px); padding: 5px;">
<tr>
<td colspan="4"><h4 class="translate" style="width: 100%">Settings</h4></td>
</tr>
<tr>
<td style="width: 100px"><label for="libraries" class="translate">Additional npm modules:</label></td>
<td class="admin-icon"></td>
<td style="width: 100%"><textarea id="libraries" class="value" style="width: 100%; resize: vertical;"></textarea></td>
<td class="admin-text" style="width: 150px"></td>
</tr>
<tr>
<td><label for="enableSetObject" class="translate">Enable command "setObject":</label></td>
<td class="admin-icon"></td>
<td><input id="enableSetObject" class="value" type="checkbox"/></td>
<td class="admin-text"></td>
</tr>
<tr>
<td><label for="enableSendToHost" class="translate">Enable command "sendToHost":</label></td>
<td class="admin-icon"></td>
<td><input id="enableSendToHost" class="value" type="checkbox"/></td>
<td class="admin-text"></td>
</tr>
<tr>
<td><label for="enableExec" class="translate">Enable command "exec":</label></td>
<td class="admin-icon"></td>
<td><input id="enableExec" class="value" type="checkbox"/></td>
<td class="admin-text"></td>
</tr>
<tr><td colspan="4" style="height:10px"></td></tr>
<tr>
<td colspan="4"><h4 class="translate" style="width: 100%">Astro settings</h4></td>
</tr>
<tr>
<td><label for="useSystemGPS" class="translate">Use system settings:</label></td><td class="admin-icon"></td><td><input id="useSystemGPS" type="checkbox" class="value" /></td><td class="admin-text"></td>
</tr>
<tr id="tr_latitude">
<td><label for="latitude" class="translate">Latitude °:</label></td><td class="admin-icon"></td><td><input id="latitude" class="value" /></td><td class="admin-text"></td>
</tr>
<tr id="tr_longitude">
<td><label for="longitude" class="translate">Longitude °:</label></td><td class="admin-icon"></td><td><input id="longitude" class="value" /></td><td class="admin-text"></td>
</tr>
<tr>
<td><label for="subscribe" class="translate">Do not subscribe all states on start:</label></td><td class="admin-icon"></td><td><input type="checkbox" id="subscribe" class="value" /></td><td class="admin-text"></td>
</tr>
</table>
<p class="translate">Help</p>
</div>
</body>
</html>

323
admin/index_m.html Normal file
View File

@ -0,0 +1,323 @@
<html>
<head>
<!-- Materialze style -->
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
<script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../js/translate.js"></script>
<script type="text/javascript" src="../../lib/js/materialize.js"></script>
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
<script type="text/javascript" src="adminWords.js"></script>
<!-- you have to define 2 functions in the global scope: -->
<script type="text/javascript">
var gSettings;
var mapTimer;
var mapLoaded;
function setValue(id, value, onChange) {
var $value = $('#' + id + '.value');
if ($value.attr('type') === 'checkbox') {
$value.prop('checked', value).on('change', function() {
var id = $(this).attr('id');
if (id === 'useSystemGPS') {
showHideSettings();
}
gSettings[id] = $(this).prop('checked');
onChange();
});
} else {
$value.val(value).on('change', function() {
var id = $(this).attr('id');
gSettings[id] = $(this).val();
if (id === 'longitude' || id === 'latitude') {
updateMap();
}
onChange();
}).on('keyup', function() {
$(this).trigger('change');
});
}
}
function initMap() {
mapLoaded = true;
updateMap(true);
}
function updateMap(immediately) {
if (!mapLoaded) return;
if (!immediately) {
clearTimeout(mapTimer);
mapTimer = setTimeout(function () {
updateMap(true);
}, 1000);
return;
}
if (mapTimer) {
clearTimeout(mapTimer);
mapTimer = null;
}
var lng;
var lat;
if (gSettings.useSystemGPS) {
if (systemConfig && systemConfig.common && (systemConfig.common.longitude || systemConfig.common.latitude)) {
lng = systemConfig.common.longitude;
lat = systemConfig.common.latitude;
}
} else {
lng = gSettings.longitude;
lat = gSettings.latitude;
}
lng = lng || 0;
lat = lat || 0;
if (lat || lng) {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 14,
center: {lat: parseFloat(lat), lng: parseFloat(lng)}
});
var marker = new google.maps.Marker({
position: {lat: parseFloat(lat), lng: parseFloat(lng)},
map: map,
title: _('Your home')
});
}
}
function showHideSettings() {
updateMap();
if ($('#useSystemGPS').prop('checked')) {
$('.local-coords').hide();
} else {
$('.local-coords').show();
}
}
function load(settings, onChange) {
var key1 = 'AIzaSyCIrBRZfZAE';
var key2 = '_0C1OplAUy7OXhiWLoZc3eY';
var key = key1 + key2;
// load google API
$.ajax({
// please do not miss use this api key!
url: 'https://maps.googleapis.com/maps/api/js?key=' + key + '&signed_in=true&callback=initMap',
dataType: 'script',
cache: true
});
if (settings.useSystemGPS === undefined) {
settings.useSystemGPS = (systemConfig.common.longitude && systemConfig.common.latitude);
}
if (settings.enableSendToHost === undefined) {
settings.enableSendToHost = false;
}
if (settings.enableExec === undefined) {
settings.enableExec = false;
}
gSettings = settings;
$('.value').each(function () {
var id = $(this).attr('id');
setValue(id, settings[id] || '', onChange);
});
showHideSettings();
list2chips('.libraries', settings.libraries || '', onChange);
$('.tab-astro').on('click', function () {
updateMap();
});
onChange(false);
if (M) M.updateTextFields();
}
function list2chips(selector, list, onChange) {
var chips = list.split(/[,;\s]+/);
var data = [];
for (var c = 0; c < chips.length; c++) {
if (chips[c] && chips[c].trim()) {
data.push({tag: chips[c].trim()});
}
}
$(selector).chips({
data: data,
placeholder: _('Module names'),
secondaryPlaceholder: _('Add module'),
onChipAdd: onChange,
onChipDelete: onChange
});
}
function chips2list(selector) {
var data = $(selector).chips('getData');
var text = [];
for (var lib = 0; lib < data.length; lib++) {
text.push(data[lib].tag);
}
return text.join(' ');
}
function convertGrad(obj, attr) {
// Extract ° " and '
var m = obj[attr].match(/([0-9]+)°(\s*)(([0-9]+)')?(\s*)(([0-9]+)")?(\s*)([A-Z]+)?/);
if (m) {
var grad = m[1];
var min = m[4];
var sec = m[7];
var dir = m[9];
if (grad !== undefined && grad !== null) {
// Graddez = Grad + ( Minuten * 60 + Sekunden ) / 3600
var result = parseInt(grad, 10);
if (min !== undefined && min !== null) {
result += parseInt(min, 10) / 60;
if (sec !== undefined && sec !== null) {
result += parseInt(sec, 10) / 3600;
}
}
if (dir) {
dir = dir.toLowerCase();
if (dir === 's' || dir === 'w') {
result = (-1) * result;
}
}
obj[attr] = result.toFixed(6);
return true;
} else {
return false;
}
} else {
showMessage(_('Invalid format. Use A°B\'C"D'));
return false;
}
}
function save(callback) {
var obj = {};
$('.value').each(function () {
var $this = $(this);
if ($this.attr('type') === 'checkbox') {
obj[$this.attr('id')] = $this.prop('checked');
} else {
obj[$this.attr('id')] = $this.val();
}
});
obj.libraries = chips2list('.libraries');
if (obj.latitude.indexOf('°') !== -1) {
if (!convertGrad(obj, 'latitude')) {
return;
}
$('#latitude').val(obj.latitude);
}
if (obj.longitude.indexOf('°') !== -1) {
if (!convertGrad(obj, 'longitude')) {
return;
}
$('#longitude').val(obj.longitude);
}
callback(obj);
}
</script>
<style>
.top-padding {
padding: 1rem;
}
#map {
width: 100%;
height: calc(100% - 60px);
}
</style>
</head>
<body>
<!-- you have to put your config page in a div with id adapter-container -->
<div class="m adapter-container">
<div class="row">
<div class="col s12">
<ul class="tabs">
<li class="tab col s5"><a href="#tab-main" class="translate active">Main settings</a></li>
<li class="tab col s5 tab-astro"><a href="#tab-astro" class="translate">Astro settings</a></li>
</ul>
</div>
<div id="tab-main" class="col s12 page">
<div class="row">
<div class="col s6 m4 l2">
<img src="js.png" class="logo">
</div>
</div>
<div class="row">
<div class="col s12">
<label class="translate">Additional npm modules:</label>
<div class="chips libraries"></div>
</div>
</div>
<div class="row">
<div class="input-field col s12 m6">
<input id="enableSetObject" class="value" type="checkbox"/>
<span for="enableSetObject" class="translate">Enable command "setObject":</span>
</div>
<div class="input-field col s12 m6">
<input id="enableSendToHost" class="value" type="checkbox"/>
<span for="enableSendToHost" class="translate">Enable command "sendToHost":</span>
</div>
<div class="input-field col s12 m6">
<input id="enableExec" class="value" type="checkbox"/>
<span for="enableExec" class="translate">Enable command "exec":</span>
</div>
<div class="input-field col s12 m6">
<input type="checkbox" id="subscribe" class="value" />
<span for="subscribe" class="translate">Do not subscribe all states on start:</span>
</div>
</div>
</div>
<div id="tab-astro" class="col s12 page">
<div class="row top-padding">
<div class="col s12 m6">
<div class="row">
<div class="input-field col s12">
<input id="useSystemGPS" type="checkbox" class="value filled-in" />
<span for="useSystemGPS" class="translate">Use system settings:</span>
</div>
</div>
<div class="row local-coords">
<div class="input-field col s12">
<input id="latitude" type="text" class="value" />
<label for="latitude" class="translate">Latitude °:</label>
</div>
</div>
<div class="row local-coords">
<div class="input-field col s12">
<input id="longitude" type="text" class="value" />
<label for="longitude" class="translate">Longitude °:</label>
</div>
</div>
<div class="row local-coords">
<div class="col s12">
<p class="translate">Help</p>
</div>
</div>
</div>
<div class="col s12 m6 map">
<div id="map"></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,631 @@
/*
* jQuery treetable Plugin 3.2.0
* http://ludo.cubicphuse.nl/jquery-treetable
*
* Copyright 2013, Ludo van den Boom
* Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function($) {
var Node, Tree, methods;
Node = (function() {
function Node(row, tree, settings) {
var parentId;
this.row = row;
this.tree = tree;
this.settings = settings;
// TODO Ensure id/parentId is always a string (not int)
this.id = this.row.data(this.settings.nodeIdAttr);
// TODO Move this to a setParentId function?
parentId = this.row.data(this.settings.parentIdAttr);
if (parentId != null && parentId !== "") {
this.parentId = parentId;
}
this.treeCell = $(this.row.children(this.settings.columnElType)[this.settings.column]);
this.expander = $(this.settings.expanderTemplate);
this.indenter = $(this.settings.indenterTemplate);
this.children = [];
this.initialized = false;
this.treeCell.prepend(this.indenter);
}
Node.prototype.addChild = function(child) {
return this.children.push(child);
};
Node.prototype.ancestors = function() {
var ancestors, node;
node = this;
ancestors = [];
while (node = node.parentNode()) {
ancestors.push(node);
}
return ancestors;
};
Node.prototype.collapse = function() {
if (this.collapsed()) {
return this;
}
this.row.removeClass("expanded").addClass("collapsed");
this._hideChildren();
this.expander.attr("title", this.settings.stringExpand);
if (this.initialized && this.settings.onNodeCollapse != null) {
this.settings.onNodeCollapse.apply(this);
}
return this;
};
Node.prototype.collapsed = function() {
return this.row.hasClass("collapsed");
};
// TODO destroy: remove event handlers, expander, indenter, etc.
Node.prototype.expand = function() {
if (this.expanded()) {
return this;
}
this.row.removeClass("collapsed").addClass("expanded");
if (this.initialized && this.settings.onNodeExpand != null) {
this.settings.onNodeExpand.apply(this);
}
if ($(this.row).is(":visible")) {
this._showChildren();
}
this.expander.attr("title", this.settings.stringCollapse);
return this;
};
Node.prototype.expanded = function() {
return this.row.hasClass("expanded");
};
Node.prototype.hide = function() {
this._hideChildren();
this.row.hide();
return this;
};
Node.prototype.isBranchNode = function() {
if(this.children.length > 0 || this.row.data(this.settings.branchAttr) === true) {
return true;
} else {
return false;
}
};
Node.prototype.updateBranchLeafClass = function(){
this.row.removeClass('branch');
this.row.removeClass('leaf');
this.row.addClass(this.isBranchNode() ? 'branch' : 'leaf');
};
Node.prototype.level = function() {
return this.ancestors().length;
};
Node.prototype.parentNode = function() {
if (this.parentId != null) {
return this.tree[this.parentId];
} else {
return null;
}
};
Node.prototype.removeChild = function(child) {
var i = $.inArray(child, this.children);
return this.children.splice(i, 1)
};
Node.prototype.render = function() {
var handler,
settings = this.settings,
target;
if (settings.expandable === true && this.isBranchNode()) {
handler = function(e) {
$(this).parents("table").treetable("node", $(this).parents("tr").data(settings.nodeIdAttr)).toggle();
return e.preventDefault();
};
this.indenter.html(this.expander);
target = settings.clickableNodeNames === true ? this.treeCell : this.expander;
target.off("click.treetable").on("click.treetable", handler);
target.off("keydown.treetable").on("keydown.treetable", function(e) {
if (e.keyCode == 13) {
handler.apply(this, [e]);
}
});
}
//this.indenter[0].style.paddingLeft = "" + (this.level() * settings.indent) + "px";
// iob
this.indenter[0].style.marginLeft = "" + (this.level() * settings.indent) + "px";
return this;
};
Node.prototype.reveal = function() {
if (this.parentId != null) {
this.parentNode().reveal();
}
return this.expand();
};
Node.prototype.setParent = function(node) {
if (this.parentId != null) {
this.tree[this.parentId].removeChild(this);
}
this.parentId = node.id;
this.row.data(this.settings.parentIdAttr, node.id);
return node.addChild(this);
};
Node.prototype.show = function() {
if (!this.initialized) {
this._initialize();
}
this.row.show();
if (this.expanded()) {
this._showChildren();
}
return this;
};
Node.prototype.toggle = function() {
if (this.expanded()) {
this.collapse();
} else {
this.expand();
}
return this;
};
Node.prototype._hideChildren = function() {
var child, _i, _len, _ref, _results;
_ref = this.children;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
child = _ref[_i];
_results.push(child.hide());
}
return _results;
};
Node.prototype._initialize = function() {
var settings = this.settings;
this.render();
if (settings.expandable === true && settings.initialState === "collapsed") {
this.collapse();
} else {
this.expand();
}
if (settings.onNodeInitialized != null) {
settings.onNodeInitialized.apply(this);
}
return this.initialized = true;
};
Node.prototype._showChildren = function() {
var child, _i, _len, _ref, _results;
_ref = this.children;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
child = _ref[_i];
_results.push(child.show());
}
return _results;
};
return Node;
})();
Tree = (function() {
function Tree(table, settings) {
this.table = table;
this.settings = settings;
this.tree = {};
// Cache the nodes and roots in simple arrays for quick access/iteration
this.nodes = [];
this.roots = [];
}
Tree.prototype.collapseAll = function() {
var node, _i, _len, _ref, _results;
_ref = this.nodes;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
node = _ref[_i];
_results.push(node.collapse());
}
return _results;
};
Tree.prototype.expandAll = function() {
var node, _i, _len, _ref, _results;
_ref = this.nodes;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
node = _ref[_i];
_results.push(node.expand());
}
return _results;
};
Tree.prototype.findLastNode = function (node) {
if (node.children.length > 0) {
return this.findLastNode(node.children[node.children.length - 1]);
} else {
return node;
}
};
Tree.prototype.loadRows = function(rows) {
var node, row, i;
if (rows != null) {
for (i = 0; i < rows.length; i++) {
row = $(rows[i]);
if (row.data(this.settings.nodeIdAttr) != null) {
node = new Node(row, this.tree, this.settings);
this.nodes.push(node);
this.tree[node.id] = node;
if (node.parentId != null && this.tree[node.parentId]) {
this.tree[node.parentId].addChild(node);
} else {
this.roots.push(node);
}
}
}
}
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i].updateBranchLeafClass();
}
return this;
};
Tree.prototype.move = function(node, destination) {
// Conditions:
// 1: +node+ should not be inserted as a child of +node+ itself.
// 2: +destination+ should not be the same as +node+'s current parent (this
// prevents +node+ from being moved to the same location where it already
// is).
// 3: +node+ should not be inserted in a location in a branch if this would
// result in +node+ being an ancestor of itself.
var nodeParent = node.parentNode();
if (node !== destination && destination.id !== node.parentId && $.inArray(node, destination.ancestors()) === -1) {
node.setParent(destination);
this._moveRows(node, destination);
// Re-render parentNode if this is its first child node, and therefore
// doesn't have the expander yet.
if (node.parentNode().children.length === 1) {
node.parentNode().render();
}
}
if(nodeParent){
nodeParent.updateBranchLeafClass();
}
if(node.parentNode()){
node.parentNode().updateBranchLeafClass();
}
node.updateBranchLeafClass();
return this;
};
Tree.prototype.removeNode = function(node) {
// Recursively remove all descendants of +node+
this.unloadBranch(node);
// Remove node from DOM (<tr>)
node.row.remove();
// Remove node from parent children list
if (node.parentId != null) {
node.parentNode().removeChild(node);
}
// Clean up Tree object (so Node objects are GC-ed)
delete this.tree[node.id];
this.nodes.splice($.inArray(node, this.nodes), 1);
return this;
}
Tree.prototype.render = function() {
var root, _i, _len, _ref;
_ref = this.roots;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
root = _ref[_i];
// Naming is confusing (show/render). I do not call render on node from
// here.
root.show();
}
return this;
};
Tree.prototype.sortBranch = function(node, sortFun) {
// First sort internal array of children
node.children.sort(sortFun);
// Next render rows in correct order on page
this._sortChildRows(node);
return this;
};
Tree.prototype.unloadBranch = function(node) {
// Use a copy of the children array to not have other functions interfere
// with this function if they manipulate the children array
// (eg removeNode).
var children = node.children.slice(0),
i;
for (i = 0; i < children.length; i++) {
this.removeNode(children[i]);
}
// Reset node's collection of children
node.children = [];
node.updateBranchLeafClass();
return this;
};
Tree.prototype._moveRows = function(node, destination) {
var children = node.children, i;
node.row.insertAfter(destination.row);
node.render();
// Loop backwards through children to have them end up on UI in correct
// order (see #112)
for (i = children.length - 1; i >= 0; i--) {
this._moveRows(children[i], node);
}
};
// Special _moveRows case, move children to itself to force sorting
Tree.prototype._sortChildRows = function(parentNode) {
return this._moveRows(parentNode, parentNode);
};
return Tree;
})();
// jQuery Plugin
methods = {
init: function(options, force) {
var settings;
settings = $.extend({
branchAttr: "ttBranch",
clickableNodeNames: false,
column: 0,
columnElType: "td", // i.e. 'td', 'th' or 'td,th'
expandable: false,
expanderTemplate: "<a href='#'>&nbsp;</a>",
indent: 19,
indenterTemplate: "<span class='indenter'></span>",
initialState: "collapsed",
nodeIdAttr: "ttId", // maps to data-tt-id
parentIdAttr: "ttParentId", // maps to data-tt-parent-id
stringExpand: "Expand",
stringCollapse: "Collapse",
// Events
onInitialized: null,
onNodeCollapse: null,
onNodeExpand: null,
onNodeInitialized: null
}, options);
return this.each(function() {
var el = $(this), tree;
if (force || el.data("treetable") === undefined) {
tree = new Tree(this, settings);
tree.loadRows(this.rows).render();
el.addClass("treetable").data("treetable", tree);
if (settings.onInitialized != null) {
settings.onInitialized.apply(tree);
}
}
return el;
});
},
destroy: function() {
return this.each(function() {
return $(this).removeData("treetable").removeClass("treetable");
});
},
collapseAll: function() {
this.data("treetable").collapseAll();
return this;
},
collapseNode: function(id) {
var node = this.data("treetable").tree[id];
if (node) {
node.collapse();
} else {
throw new Error("Unknown node '" + id + "'");
}
return this;
},
expandAll: function() {
this.data("treetable").expandAll();
return this;
},
expandNode: function(id) {
var node = this.data("treetable").tree[id];
if (node) {
if (!node.initialized) {
node._initialize();
}
node.expand();
} else {
throw new Error("Unknown node '" + id + "'");
}
return this;
},
loadBranch: function(node, rows) {
var settings = this.data("treetable").settings,
tree = this.data("treetable").tree;
// TODO Switch to $.parseHTML
rows = $(rows);
if (node == null) { // Inserting new root nodes
this.append(rows);
} else {
var lastNode = this.data("treetable").findLastNode(node);
rows.insertAfter(lastNode.row);
}
this.data("treetable").loadRows(rows);
// Make sure nodes are properly initialized
rows.filter("tr").each(function() {
tree[$(this).data(settings.nodeIdAttr)].show();
});
if (node != null) {
// Re-render parent to ensure expander icon is shown (#79)
node.render().expand();
}
return this;
},
move: function(nodeId, destinationId) {
var destination, node;
node = this.data("treetable").tree[nodeId];
destination = this.data("treetable").tree[destinationId];
this.data("treetable").move(node, destination);
return this;
},
node: function(id) {
return this.data("treetable").tree[id];
},
removeNode: function(id) {
var node = this.data("treetable").tree[id];
if (node) {
this.data("treetable").removeNode(node);
} else {
throw new Error("Unknown node '" + id + "'");
}
return this;
},
reveal: function(id) {
var node = this.data("treetable").tree[id];
if (node) {
node.reveal();
} else {
throw new Error("Unknown node '" + id + "'");
}
return this;
},
sortBranch: function(node, columnOrFunction) {
var settings = this.data("treetable").settings,
prepValue,
sortFun;
columnOrFunction = columnOrFunction || settings.column;
sortFun = columnOrFunction;
if ($.isNumeric(columnOrFunction)) {
sortFun = function(a, b) {
var extractValue, valA, valB;
extractValue = function(node) {
var val = node.row.find("td:eq(" + columnOrFunction + ")").text();
// Ignore trailing/leading whitespace and use uppercase values for
// case insensitive ordering
return $.trim(val).toUpperCase();
}
valA = extractValue(a);
valB = extractValue(b);
if (valA < valB) return -1;
if (valA > valB) return 1;
return 0;
};
}
this.data("treetable").sortBranch(node, sortFun);
return this;
},
unloadBranch: function(node) {
this.data("treetable").unloadBranch(node);
return this;
}
};
$.fn.treetable = function(method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
return $.error("Method " + method + " does not exist on jQuery.treetable");
}
};
// Expose classes to world
this.TreeTable || (this.TreeTable = {});
this.TreeTable.Node = Node;
this.TreeTable.Tree = Tree;
})(jQuery);

View File

@ -0,0 +1,248 @@
table.treetable {
border: 1px solid #888;
border-collapse: collapse;
font-size: 0.82rem;
line-height: 1.5rem;
margin: .6em 0 1.8em 0;
width: 100%;
font-family: "Segoe UI", Tahoma, Arial, "Courier New", serif;
font-weight: normal;
}
table.treetable caption {
font-size: 0.82rem;
font-weight: bold;
margin-bottom: .2em;
}
table.treetable thead {
background: #fff;
font-size: .9em;
}
table.treetable > tbody > tr > td {
border: 1px solid #e0e0e0 !important;
border-top: 0 !important;
/*xxx*/
white-space: nowrap;
position: relative;
}
table.treetable thead tr th {
border: 1px solid #b8b5b5;
font-weight: normal;
padding: .1em 1em .1em 1em;
text-align: left;
}
table.treetable tbody tr td {
cursor: default;
padding: .0em 0.5em;
}
table.treetable span.indenter,
table.treetable .treetable-list span.indenter {
background-position: center left;
background-repeat: no-repeat;
padding: .2em 0 .2em 1.5em;
}
table.treetable span.file {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC);
}
table.treetable span.folder
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC);
}
table.treetable tr.collapsed span.indenter a,
table.treetable .treetable-list span.indenter a {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAACEElEQVQ4T42S72sScRzH/cuKop64EUgjtD2Q9ctGP1gsKGq0hXtSUhTRg4hRD7JROrZIEVbXYtPbMvWueXrmz+aWtum8UHf+2Om77/cuFaOgD7y4J6/Xl7vPfXV05LwNlHLKhlJmuvv8GdHYFa9hO2qFKtOhckN2oFlfRrtVgFLl0cjPoJK9j920FdnILWQEK8o7drRqi1pII9RcXdrNL2i362hDgaLsoZB9gVRgFF9XxyH6bvw96sWiGu2kniPhPQ1x6RIizNX/iarIJZ8iujKMyNKFf0eKvKB+436TR0uR8D32BGFmGDxzFhxzUYvolqjckt8Q2Yl6xYGaRBYj06iEXOwxhHfHwXtOgnObexE9uSPXpFeoSy9RL7shVz5iU7jdF6XYEahRTXISXqtytTCDUv4h4QGKW/cQ91sQdA+Ccw2Bd5l+R+kJNIi8V3wG6ccjVaYU0neQF6YQWxlB0DWI0LwB3NyQFuWjl7uiKn+7q/59SicKuPT4NK/HmlMPgTH1ouKGDdux6W6QXZ9EPHgdwUUTvI7D8M0eAWs/qkU5brQrUjbDk0hwN5HwX0Hcew5Bj4FEh8DOHsSq/YAWZUIWVd4KTyHJTSDxeRwJ9jyS7BlyE8wIeY71RRvsmLZ20WdEdNkI4QOBnNQh/N4I/9uBvtdTgz+HXEoLobLOnELAPYC1hRPwzZlTBINm6HS/ACb+az/hqY6BAAAAAElFTkSuQmCC');
}
table.treetable tr.expanded span.indenter a {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAABX0lEQVQ4T3WSvUvDUBTF85c5CDr4saiDdQmdVBBxEArqplsXV/+AuthstYMQJ/N0aeNgmkHT2MEEh37gkBhQr5ybvtcXQi8cAi/ndzn3cg1UEtcJ+grqNAov1Hfi5Rr6NfrsnRObUTBnyQ0RJZRFV2x+dU/pN70riNLWDASEB+iPflhhd5d854TScbMAfbhHZUiCgaiSZx9zZ7wBhtBsLuQ72znUqbE5G19z9DexV4bkbC92hVz7gOPwnPElL0dBGFwC6ArIszfIvTXZBDOELap4gCSAGN+JU4DkyuPeIUXuPs/LkAQQA+q0V+m5VWGDNEfdKo0mwynUPysA2Bgg19ri2WCG+mJnBqGTDkjoqbnCMWEOxSYLEBopSAK4hgdrkURjiSGY38Uay7SDHEJeHcDwgB4bC+S1lxVQgLBGHUDmeVBwv04DMT0lXAA6SOnx9HcF6IUjxRIcyyz/VGUY/w2QXGJSXNpXAAAAAElFTkSuQmCC');
}
table.treetable tr.branch {
background-color: #f9f9f9;
}
table.treetable tr.selected {
background-color: #3875d7;
/* color: #fff; */
}
table.treetable tr span.indenter a {
outline: none; /* Expander shows outline after upgrading to 3.0 (#141) */
}
table.treetable tr.accept {
background-color: #a3bce4;
color: #fff;
}
table.treetable tr.collapsed.accept td span.indenter a {
background-image: url(data:image/x-png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFpJREFUeNpi/P//PwMlgHHADWD4//8/NtyAQxwD45KAAQdKDfj//////fgMIsYAZIMw1DKREFwODAwM/4kNRKq64AADA4MjFDOQ6gKyY4HodMA49PMCxQYABgAVYHsjyZ1x7QAAAABJRU5ErkJggg==);
}
table.treetable tr.expanded.accept td span.indenter a {
background-image: url(data:image/x-png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFtJREFUeNpi/P//PwMlgImBQsA44C6giQENDAwM//HgBmLCAF/AMBLjBUeixf///48L7/+PCvZjU4fPAAc0AxywqcMXCwegGJ1NckL6jx5wpKYDxqGXEkkCgAEAmrqBIejdgngAAAAASUVORK5CYII=);
}
table.treetable tbody tr td {
border: 1px solid #EDEDED;
}
table.treetable tbody span.fancytree-node,
table.treetable table.fancytree-ext-table tbody span.fancytree-node:hover {
border: none;
background: 0 0;
}
table.treetable tbody tr:hover {
background-color: #E5F3FB;
outline: #70C0E7 solid 1px;
}
table.treetable tbody tr.focused span.title {
outline: #000 dotted 1px;
}
table.treetable tbody tr.active:hover,table.treetable tbody tr.selected:hover {
background-color: #CBE8F6;
outline: #26A0DA solid 1px;
}
table.treetable tbody tr.active {
background-color: #F7F7F7;
outline: #DEDEDE solid 1px;
}
table.treetable tbody tr.selected {
background-color: #CBE8F6;
outline: #26A0DA solid 1px;
}
table.treetable table.treetable.fancytree-treefocus tbody tr.fancytree-active {
background-color: #CBE8F6;
outline: #26A0DA solid 1px;
}
table.treetable table.treetable.fancytree-treefocus tbody tr.fancytree-selected {
background-color: #CBE8F6;
}
table.treetable span.indenter,
table.treetable .treetable-list span.indenter {
display: inline-block;
margin: 0;
padding: 0;
text-align: right;
/* Disable text selection of nodes (for better D&D UX) */
user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-webkit-user-select: none;
/* Force content-box box model for indenter (Bootstrap compatibility) */
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
width: 19px;
}
table.treetable span.indenter a,
table.treetable .treetable-list span.indenter a {
background-position: left center;
background-repeat: no-repeat;
display: inline-block;
text-decoration: none;
width: 19px;
}
table.treetable .filtered-out {
display: none !important;
}
table.treetable .treetable-counter {
color: gray;
font-size: 0.8em;
position: absolute;
right: 2px;
top: 1px;
}
table.treetable .treetable-filter {
width: calc(100% - 24px);
padding: 0 5px 0 0;
font-size: 12px;
border: 0;
line-height: 1.5em;
}
table.treetable .treetable-th-name {
padding: .1em .1em;
}
table.treetable .filter-clear {
width: 18px;
height: 18px;
border: 0;
background: #fff;
}
table.treetable .branch.collapsed span.fancytree-expander {
background-position: 0 -80px;
}
table.treetable .branch.expanded span.fancytree-expander {
background-position: -32px -80px;
}
table.treetable .leaf span.fancytree-expander {
background: none;
}
table.treetable .treetable-buttons {
text-align: center;
}
table.treetable .treetable-enum {
font-weight: normal;
}
table.treetable .treetable-enum span.fancytree-icon {
background-position: -32px -16px;
}
table.treetable .treetable-enum.treetable-root {
font-weight: bold;
}
table.treetable .treetable-member {
font-style: italic;
}
table.treetable .treetable-member span.fancytree-icon {
background-image: url(fancytree/state.png);
background-size: 100%;
height: 24px;
width: 24px;
}
table.treetable .treetable-channel span.fancytree-icon {
background-position: -32px -16px;
}
.treetable-list {
font-family: "Segoe UI", Tahoma, Arial, "Courier New", serif;
padding: 0;
font-size: 0.82rem;
}
.treetable-list .treetable-list-item {
list-style-type: none;
cursor: ns-resize;
line-height: 1.5rem;
border: 1px solid #e0e0e0;
background: #efefef;
padding-left: 5px;
}
.treetable-list .treetable-list-folder {
list-style-type: none;
font-weight: bold;
line-height: 1.5rem;
cursor: not-allowed;
color: #000080;
border: 1px solid #e0e0e0;
background: white;
}
.treetable-list span.fancytree-expander {
background-position: -32px -80px;
}
.treetable-list .treetable-list-folder span.fancytree-icon {
background-position: -32px -16px;
}

15
admin/jquery.cron.css Normal file
View File

@ -0,0 +1,15 @@
#cron-input {
margin-bottom: 10px;
}
.cron-preview-every {
padding-bottom: 10px;
}
.cron-tab-page {
padding-top: 0em !important;
padding-left: 0em !important;
padding-right: 0em !important;
padding-bottom: 0em !important;
}
.cron-tabs {
background: white;
}

730
admin/jquery.cron.js Normal file
View File

@ -0,0 +1,730 @@
$.fn.cron = function(options, setValue) {
var el = this;
if (options === 'value') {
if (setValue !== undefined) {
$(el).find('.cron-input').val(setValue).trigger('change');
} else {
return $(el).find('.cron-input').val();
}
return this;
}
var types = [
'second',
'minute',
'hour',
'day',
'month',
'week'
];
var everyText = [
'Every %s seconds',
'Every %s minutes',
'Every %s hours',
'Every %s days',
'Every %s months'
];
if (typeof systemDictionary !== 'undefined' && !systemDictionary['Every %s seconds']) {
for (var w in jQueryCronWords) {
systemDictionary[w] = jQueryCronWords[w];
}
}
// Write the HTML template to the document
$(el).html(tmpl);
if (typeof translateAll !== 'undefined') translateAll();
var cronArr;
var updateInput = false;
if (options && typeof options.value === 'string') {
if (!options.value) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
cronArr = null;
} else {
cronArr = options.value.split(' ');
if (cronArr.length === 5) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
cronArr.unshift('*');
} else {
$(el).find('.cron-checkbox-seconds').prop('checked', true);
}
}
} else {
cronArr = ['*', '*', '*', '*', '*', '*'];
$(el).find('.cron-checkbox-seconds').prop('checked', false);
}
$(el).find('.cron-main-tab').tabs();
$(el).find('.cron-tabs').tabs({
activate: function (event, ui) {
if ($(el).find('.cron-input').is(':focus') || updateInput) return;
cronArr = cronArr || ['*', '*', '*', '*', '*', '*'];
switch ($(ui.newTab).attr('id')) {
// Seconds
case 'cron-button-second-every':
cronArr[0] = '*';
break;
case 'cron-button-second-n':
cronArr[0] = '*/' + $(el).find('.cron-tab-second .cron-slider').slider('value');
break;
case 'cron-button-second-each':
cronArr[0] = '*';
$(el).find('.cron-tabs-second-format').html('');
drawEachSecond();
break;
// Minutes
case 'cron-button-minute-every':
cronArr[1] = '*';
break;
case 'cron-button-minute-n':
cronArr[1] = '*/' + $(el).find('.cron-tab-minute .cron-slider').slider('value');
break;
case 'cron-button-minute-each':
cronArr[1] = '*';
$(el).find('.cron-tabs-minute-format').html('');
drawEachMinute();
break;
// Hours
case 'cron-button-hour-every':
cronArr[2] = '*';
break;
case 'cron-button-hour-n':
cronArr[2] = '*/' + $(el).find('.cron-tab-hour .cron-slider').slider('value');
break;
case 'cron-button-hour-each':
cronArr[2] = '*';
$(el).find('.cron-tabs-hour-format').html('');
drawEachHour();
break;
// Days
case 'cron-button-day-every':
cronArr[3] = '*';
break;
case 'cron-button-day-each':
cronArr[3] = '*';
$(el).find('.cron-tabs-day-format').html('');
drawEachDay();
break;
// Months
case 'cron-button-month-every':
cronArr[4] = '*';
break;
case 'cron-button-month-each':
cronArr[4] = '*';
$(el).find('.cron-tabs-month-format').html('');
drawEachMonth();
break;
// Weeks
case 'cron-button-week-every':
cronArr[5] = '*';
break;
case 'cron-button-week-each':
cronArr[5] = '*';
$(el).find('.cron-tabs-week-format').html('');
drawEachWeekday();
break;
}
drawCron();
}
});
$(el).find('.cron-tab-second .cron-slider').slider({
min: 1,
max: 59,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-tab-minute .cron-slider').slider({
min: 1,
max: 59,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-tab-hour .cron-slider').slider({
min: 1,
max: 23,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-checkbox-seconds').change(function () {
if ($(this).prop('checked')) {
$(el).find('.cron-main-tab').tabs('option', 'disabled', []);
$(el).find('.cron-main-tab').tabs('option', 'active', 0);
} else {
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
}
drawCron();
});
if (!$(el).find('.cron-checkbox-seconds').prop('checked')) {
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
}
$(el).find('.cron-input').change(function () {
$(this).focus();
cronArr = text2cron($(this).val());
detectSettings($(this).val());
}).keyup(function () {
$(this).trigger('change');
});
function text2cron(value) {
if (value === undefined) {
value = $(el).find('.cron-input').val();
}
value = value.trim();
if (!value) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
return null;
}
var arr = value.split(' ');
if (arr.length === 5) {
arr.unshift('*');
$(el).find('.cron-checkbox-seconds').prop('checked', false);
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
} else {
$(el).find('.cron-checkbox-seconds').prop('checked', true);
$(el).find('.cron-main-tab').tabs('option', 'disabled', []);
}
return arr;
}
function cron2text(arr) {
if (!arr) arr = cronArr;
if (!arr) {
return '';
}
arr = JSON.parse(JSON.stringify(arr || ['*', '*', '*', '*', '*', '*']));
if (!$(el).find('.cron-checkbox-seconds').prop('checked')) {
arr.shift();
}
for (var a = 0; a < arr.length; a++) {
if (arr[a] === '*/1') arr[a] = '*';
}
return arr.join(' ');
}
function correctCasus(text, seconds) {
text = text.replace('Каждую(ый) минуту', 'Каждую минуту');
text = text.replace('Каждую(ый) минут(у)', 'Каждую минуту');
text = text.replace('Каждую(ый) час', 'Каждый час');
text = text.replace('Каждую(ый) секунду', 'Каждую секунду');
text = text.replace(/ (\d{1,2}) числа/, ' $1го числа');
text = text.replace(/ (\d{1,2}) в Январе/, ' $1го числа в Январе');
text = text.replace(/ (\d{1,2}) в Феврале/, ' $1го числа в Феврале');
text = text.replace(/ (\d{1,2}) в Марте/, ' $1го числа в Марте');
text = text.replace(/ (\d{1,2}) в Апреле/, ' $1го числа в Апреле');
text = text.replace(/ (\d{1,2}) в Майе/, ' $1го числа в Майе');
text = text.replace(/ (\d{1,2}) в Июне/, ' $1го числа в Июне');
text = text.replace(/ (\d{1,2}) в Июле/, ' $1го числа в Июле');
text = text.replace(/ (\d{1,2}) в Августе/, ' $1го числа в Августе');
text = text.replace(/ (\d{1,2}) в Сентябре/, ' $1го числа в Сентябре');
text = text.replace(/ (\d{1,2}) в Октябре/, ' $1го числа в Октябре');
text = text.replace(/ (\d{1,2}) в Ноябре/, ' $1го числа в Ноябре');
text = text.replace(/ (\d{1,2}) в Декабре/, ' $1го числа в Декабре');
text = text.replace('Каждую(ый) 0 минуту', 'Каждые ноль минут');
text = text.replace(/Каждую\(ый\) ([\d\sи,]+) минуту/, 'Каждую $1 минуту');
text = text.replace(/каждой\(го\) ([\d\sи,]+) минуту/, 'каждой $1 минуты');
text = text.replace('каждой(го) минут(у)', 'каждой минуты');
text = text.replace(' 0 часа(ов)', ' 0 часов');
text = text.replace(' 1 часа(ов)', ' 1 час');
text = text.replace(' 2 часа(ов)', ' 2 часа');
text = text.replace(' 3 часа(ов)', ' 3 часа');
text = text.replace(' 4 часа(ов)', ' 4 часа');
text = text.replace(/ (\d{1,2}) часа\(ов\)/, ' $1 часов');
text = text.replace('Jede(r) Sekunde', 'Jede Sekunde');
text = text.replace(/Jede\(r\) ([\d\sund,]+) Sekunde/, 'Jede $1 Sekunde');
text = text.replace('Jede(r) Minute', 'Jede Minute');
text = text.replace('Jede Minuten', 'Jede Minute');
text = text.replace('Jede Stunde', 'Jede Stunde');
text = text.replace('Jede(r) Stunde', 'Jede Stunde');
text = text.replace(/Jede\(r\) ([\d\sund,]+) Minute/, 'Jede $1 Minute');
text = text.replace('Jede Sekunde in Minuten', 'Jede Sekunde in jeder Minute');
return text
}
function drawCron() {
var newCron = cron2text();
$(el).find('.cron-input').val(newCron);
updateDescription(newCron);
}
function updateDescription(value) {
if (!value) {
$(el).find('.cron-text').html(_('never'));
return;
}
var text = cronToText(value, $(el).find('.cron-checkbox-seconds').prop('checked'), JQUERY_CRON_LOCALE[systemLang]);
text = correctCasus(text, $(el).find('.cron-checkbox-seconds').prop('checked') ? cronArr[0] : null);
$(el).find('.cron-text').html(text);
}
function detectSettings(value) {
updateInput = true;
cronArr = text2cron(value);
for (var c = 0; c < (cronArr ? cronArr.length : 6); c++) {
detect(cronArr, c);
}
updateDescription(value);
updateInput = false;
}
// 5-7,9-11 => 5,6,7,9,10,11
function convertMinusIntoArray(value) {
var parts = value.toString().split(',');
for (var p = 0; p < parts.length; p++) {
var items = parts[p].trim().split('-');
if (items.length > 1) {
parts[p] = [];
for (var i = parseInt(items[0], 10); i <= parseInt(items[1], 10); i++) {
parts[p].push(i);
}
parts[p] = parts[p].join(',');
}
}
var value = parts.join(',');
var values = value.split(',');
values.sort(function (a, b) {
a = parseInt(a, 10);
b = parseInt(b, 10);
return a - b;
});
// remove double entries
for (p = values.length - 1; p >= 0; p--) {
if (values[p] === values[p + 1]) {
values.splice(p + 1, 1);
}
}
return values.join(',');
}
// 5,6,7,9,10,11 => 5-7,9-11
function convertArrayIntoMinus(value) {
value = convertMinusIntoArray(value);
var parts = value.split(',');
var newParts = [];
var start = parts[0];
var end = parts[0];
for (var p = 1; p < parts.length; p++) {
if (parts[p] - 1 !== parseInt(parts[p - 1], 10)) {
if (start === end) {
newParts.push(start)
} else if (end - 1 == start) {
newParts.push(start + ',' + end);
}else {
newParts.push(start + '-' + end);
}
start = parts[p];
end = parts[p];
} else {
end = parts[p];
}
}
if (start === end) {
newParts.push(start)
} else if (end - 1 == start) {
newParts.push(start + ',' + end);
} else {
newParts.push(start + '-' + end);
}
return newParts.join(',');
}
function detect(values, index) {
var $tab = $(el).find('.cron-tab-' + types[index]);
if (!values) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
return;
}
values[index] = values[index] || '*';
var changed = true;
if (values[index].indexOf('/') !== -1) {
var parts_ = values[index].split('/');
var value = parseInt(parts_[1], 10) || 1;
if ($tab.find('.cron-slider').slider('value') != value) {
$tab.find('.cron-slider').slider('value', parseInt(parts_[1], 10) || 1);
changed = true;
}
if ($tab.find('.cron-tabs').tabs('option', 'active') != 1) {
$tab.find('.cron-tabs').tabs('option', 'active', 1);
changed = true;
}
$tab.find('.cron-preview-every').html(_(everyText[index], parseInt(parts_[1], 10) || 1));
} else if (values[index].indexOf('*') !== -1) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
} else {
var parts = convertMinusIntoArray(values[index]).split(',');
if ($tab.find('.cron-tabs li').length === 3) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 2) {
$tab.find('.cron-tabs').tabs('option', 'active', 2);
changed = true;
}
} else {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 1) {
$tab.find('.cron-tabs').tabs('option', 'active', 1);
changed = true;
}
}
var selected = false;
$tab.find('.cron-tabs-format input[type="checkbox"]').each(function () {
var index = $(this).data('index').toString();
var value = parts.indexOf(index) !== -1;
if (value != $(this).prop('checked')) {
$(this).prop('checked', parts.indexOf(index) !== -1);
$(this).button('refresh');
changed = true;
}
if (value) selected = true;
});
if (!selected) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
}
if (changed) $(el).find('.cron-main-tab').tabs('option', 'active', index);
}
}
function processSlider(elem, ui) {
var arg = $(elem).data('arg');
cronArr[arg] = '*/' + ui.value;
$(el).find('.cron-tab-' + types[arg] + ' .cron-preview-every').html(ui.value === 1 ? _('CRON Every ' + types[arg]) : _('CRON Every') + ' ' + ui.value + ' ' + _('CRON ' + types[arg] + 's'));
drawCron();
}
function processEachChange(elem) {
var newItem = $(elem).data('index').toString();
var arg = $(elem).data('arg');
if (!cronArr) cronArr = ['*', '*', '*', '*', '*', '*'];
if (cronArr[arg] === '*') {
cronArr[arg] = newItem;
} else {
// if value already in list, toggle it off
var list = convertMinusIntoArray(cronArr[arg]).split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[arg] = list.join(',');
} else {
// else toggle it on
cronArr[arg] = cronArr[arg] + ',' + newItem;
}
cronArr[arg] = convertArrayIntoMinus(cronArr[arg]);
if(cronArr[arg] === '') cronArr[arg] = '*';
}
drawCron();
}
function padded(val) {
if (typeof val === 'string' && val.length === 1) {
val = '0' + val;
} else if (val < 10) {
val = '0' + val;
} else {
val = val.toString();
}
return val;
}
function draw(type, drawFunc) {
var $format = $(el).find('.cron-tab-' + type + ' .cron-tabs-format');
$format.html(drawFunc());
$format.find('input').button();
$format.buttonset();
$format.find('input[type="checkbox"]').click(function () {
processEachChange(this);
});
}
function drawEachSecond() {
draw('second', function () {
var text = '';
// seconds
for (var i = 0; i < 60; i++) {
text += '<input type="checkbox" id="cron-second-check' + i + '" data-index="' + i + '" data-arg="0"><label for="cron-second-check' + i + '">' + padded(i) + '</label>';
if (i !== 0 && ((i + 1) % 10 === 0)) text += '<br/>';
}
return text;
});
}
function drawEachMinute () {
draw('minute', function () {
var text = '';
// minutes
for (var i = 0; i < 60; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-minute-check' + i + '" data-index="' + i + '" data-arg="1"><label for="cron-minute-check' + i + '">' + padded + '</label>';
if (i !== 0 && (((i + 1) % 10) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachHour() {
draw('hour', function () {
var text = '';
// hours
for (var i = 0; i < 24; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-hour-check' + i + '" data-index="' + i + '" data-arg="2"><label for="cron-hour-check' + i + '">' + padded + '</label>';
if (i !== 0 && (((i + 1) % 12) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachDay () {
draw('day', function () {
var text = '';
// days
for (var i = 1; i < 32; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-day-check' + i + '" data-index="' + i + '" data-arg="3"><label for="cron-day-check' + i + '">' + padded + '</label>';
if (i !== 0 && ((i % 7) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachMonth () {
draw('month', function () {
var text = '';
// months
var months = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
for (var i = 0; i < months.length; i++) {
text += '<input type="checkbox" id="cron-month-check' + (i + 1) + '" data-index="' + (i + 1) + '" data-arg="4"><label for="cron-month-check' + (i + 1) + '">' + _(months[i]) + '</label>';
}
return text;
});
}
function drawEachWeekday () {
draw('week', function () {
var text = '';
// weeks
var days = [
{id: 1, name: 'Monday'},
{id: 2, name: 'Tuesday'},
{id: 3, name: 'Wednesday'},
{id: 4, name: 'Thursday'},
{id: 5, name: 'Friday'},
{id: 6, name: 'Saturday'},
{id: 0, name: 'Sunday'}
];
for (var i = 0; i < days.length; i++) {
text += '<input type="checkbox" id="cron-week-check' + days[i].id + '" data-index="' + days[i].id + '" data-arg="5"><label for="cron-week-check' + days[i].id + '">' + _(days[i].name) + '</label>';
}
return text;
});
}
drawEachSecond();
drawEachMinute();
drawEachHour();
drawEachDay();
drawEachMonth();
drawEachWeekday();
drawCron();
};
// HTML Template for plugin
var tmpl = '<input type="text" class="cron-input" value="* * * * * *" size="80"/>\
<br/>\
<div class="cron-text"></div><br>\
<div><span class="translate">Use seconds:</span><input type="checkbox" class="cron-checkbox-seconds"></div>\
<div class="cron-main-tab">\
<ul>\
<li><a href="#cron-tabs-second" class="translate">Second</a></li>\
<li><a href="#cron-tabs-minute" class="translate">Minute</a></li>\
<li><a href="#cron-tabs-hour" class="translate">Hour</a></li>\
<li><a href="#cron-tabs-day" class="translate">Day of Month</a></li>\
<li><a href="#cron-tabs-month" class="translate">Month</a></li>\
<li><a href="#cron-tabs-week" class="translate">Day of Week</a></li>\
</ul>\
<div id="cron-tabs-second" class="cron-tab-page cron-tab-second">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-second-every"><a href="#cron-tabs-second-every" class="translate">CRON Every second</a></li>\
<li id="cron-button-second-n"><a href="#cron-tabs-second-n" class="translate">Every n seconds</a></li>\
<li id="cron-button-second-each"><a href="#cron-tabs-second-each" class="translate">Each selected second</a></li>\
</ul>\
<div id="cron-tabs-second-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every second</div>\
</div>\
<div id="cron-tabs-second-n">\
<div class="cron-preview-every translate">CRON Every second</div>\
<div class="cron-slider" data-arg="0"></div>\
</div>\
<div id="cron-tabs-second-each" class="cron-preview-n">\
<div class="translate">Each selected second</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-minute" class="cron-tab-page cron-tab-minute">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-minute-every"><a href="#cron-tabs-minute-every" class="translate">CRON Every minute</a></li>\
<li id="cron-button-minute-n"><a href="#cron-tabs-minute-n" class="translate">Every n minutes</a></li>\
<li id="cron-button-minute-each"><a href="#cron-tabs-minute-each" class="translate">Each selected minute</a></li>\
</ul>\
<div id="cron-tabs-minute-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every minute</div>\
</div>\
<div id="cron-tabs-minute-n">\
<div class="cron-preview-every translate">CRON Every minute</div>\
<div class="cron-slider" data-arg="1"></div>\
</div>\
<div id="cron-tabs-minute-each" class="cron-preview-n">\
<div class="translate">Each selected minute</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-hour" class="cron-tab-page cron-tab-hour">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-hour-every"><a href="#cron-tabs-hour-every" class="translate">CRON Every hour</a></li>\
<li id="cron-button-hour-n"><a href="#cron-tabs-hour-n" class="translate">Every n hours</a></li>\
<li id="cron-button-hour-each"><a href="#cron-tabs-hour-each" class="translate">Each selected hour</a></li>\
</ul>\
<div id="cron-tabs-hour-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every hour</div>\
</div>\
<div id="cron-tabs-hour-n">\
<div class="cron-preview-every translate">CRON Every hour</div>\
<div class="cron-slider" data-arg="2"></div>\
</div>\
<div id="cron-tabs-hour-each" class="cron-preview-n">\
<div class="translate">Each selected hour</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-day" class="cron-tab-page cron-tab-day">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-day-every"><a href="#cron-tabs-day-every" class="translate">CRON Every day</a></li>\
<li id="cron-button-day-each"><a href="#cron-tabs-day-each" class="translate">Each selected day</a></li>\
</ul>\
<div id="cron-tabs-day-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every day</div>\
</div>\
<div id="cron-tabs-day-each" class="cron-preview-n">\
<div class="translate">Each selected day</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-month" class="cron-tab-page cron-tab-month">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-month-every"><a href="#cron-tabs-month-every" class="translate">CRON Every month</a></li>\
<li id="cron-button-month-each"><a href="#cron-tabs-month-each" class="translate">Each selected month</a></li>\
</ul>\
<div id="cron-tabs-month-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every month</div>\
</div>\
<div id="cron-tabs-month-each" class="cron-preview-n">\
<div class="translate">Each selected month</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-week" class="cron-tab-page cron-tab-week">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-week-every"><a href="#cron-tabs-week-every" class="translate">CRON Every week day</a></li>\
<li id="cron-button-week-each"><a href="#cron-tabs-week-each" class="translate">Each selected week day</a></li>\
</ul>\
<div id="cron-tabs-week-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every week day</div>\
</div>\
<div id="cron-tabs-week-each" class="cron-preview-n">\
<div class="translate">Each selected week day</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
</div>';

394
admin/jquery.cron.locale.js Normal file
View File

@ -0,0 +1,394 @@
var JQUERY_CRON_LOCALE = {};
JQUERY_CRON_LOCALE.en = {
ORDINALS: {
th: 'th',
st: 'st',
nd: 'nd',
rd: 'rd'
},
MONTH: [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
],
DOW: [
'Sun',
'Mon',
'Tue',
'Wed',
'Thu',
'Fri',
'Sat'
],
'Every': 'Every', // start of expression
'and': 'and', // 1, 2, 3 and 15th
'every day': 'every day',
'minute past the': 'minute past the',
'hour': 'hour',
'minute': 'minute',
'minute of': 'minute of',
'second': 'second',
'second in minute': 'second in minute',
'second of every': 'second of every',
'minute every hour': 'minute every hour',
'on the': 'on the',
'of every month': 'of every month',
'and every': 'and every',
'At': 'At',
'on': 'on', // on sun, mon
'in': 'in' // in jan, apr
};
JQUERY_CRON_LOCALE.de = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Januar',
'Februar',
'März',
'April',
'Mai',
'Juni',
'Juli',
'August',
'September',
'Oktober',
'November',
'Dezember'
],
DOW: [
'Sonntag',
'Montag',
'Dienstag',
'Mittwoch',
'Donnerstag',
'Freitag',
'Samstag'
],
'Every': 'Jede(r)', // start of expression
'and': 'und', // 1, 2, 3 and 15th
'every day': 'jeden Tag',
'minute past the': 'Minuten nach',
'hour': 'Stunde',
'minute': 'Minute',
'minute of': 'Minuten von',
'second': 'Sekunde',
'second in minute': 'Sekunde in der Minute',
'second of every': 'Sekunde in',
'minute every hour': 'Minute jede Stunde',
'on the': 'am',
'of every month': 'im jeden Monat',
'and every': 'und am jeden',
'At': 'Um',
'on': 'am', // on sun, mon
'in': 'im' // in jan, apr
};
JQUERY_CRON_LOCALE.ru = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Январе',
'Феврале',
'Марте',
'Апреле',
'Майе',
'Июне',
'Июле',
'Августе',
'Сентябре',
'Октябре',
'Ноябре',
'Декабре'
],
DOW: [
'воскресение',
'понедельник',
'вторник',
'среду',
'четверг',
'пятницу',
'субботу'
],
'Every': 'Каждую(ый)', // start of expression
'and': 'и', // 1, 2, 3 and 15th
'every day': 'каждый день',
'minute past the': 'минуту в',
'hour': 'часа(ов)',
'minute': 'минуту',
'minute of': 'минут(у) в',
'second': 'секунду',
'second in minute': 'секунду в минуте',
'second of every': 'секунду каждой(го)',
'minute every hour': 'минуту каждый час',
'on the': '',
'of every month': 'числа каждого месяца',
'and every': 'и каждый',
'At': 'В',
'on': 'в', // on sun, mon
'in': 'в' // in jan, apr
};
JQUERY_CRON_LOCALE.fr = {
ORDINALS: {
th: 'th',
st: 'st',
nd: 'nd',
rd: 'rd'
},
MONTH: [
'Fév',
'Mar',
'Avr',
'Mai',
'Jun',
'Juil',
'Aug',
'Sep',
'Oct',
'Nov',
'Déc'
],
DOW: [
'Dim',
'Lun',
'Mar',
'Mer',
'Jeu',
'Ven',
'Sam'
],
'Every': 'Chaque',
'and': 'et',
'every day': 'tous les jours',
'minute past the': 'minute après le',
'hour': 'heure',
'minute': 'minute',
'minute of': 'minute de',
'second': 'seconde',
'second in minute': 'seconde en minute',
'second of every': 'deuxième de tous',
'minute every hour':'minute toutes les heures',
'on the': 'sur le',
'of every month': 'de chaque mois',
'and every': 'et tous',
'At': 'À',
'on': 'sur',
'in': 'dans'
};
JQUERY_CRON_LOCALE.it = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Jan',
'Feb',
'Mar',
'Apr',
'Pot',
'Giu',
'Lug',
'Aug',
'Sep',
'Oct',
'Nov',
'Dic'
],
DOW: [
'Dom',
'Mon',
'Mar',
'Mer',
'Gio',
'Ve',
'Sat'
],
'Every': 'Ogni',
'and': 'e',
'every day': 'ogni giorno',
'minute past the': 'minuto dopo',
'hour': 'ora',
'minute': 'Minuto',
'minute of': 'minuto di',
'second': 'secondo',
'second in minute': "secondo in minuto",
'second of every': 'secondo di ogni',
'minute every hour': 'minuto ogni ora',
'on the': 'sul',
'of every month': 'di ogni mese',
'and every': 'e ogni',
'At': 'A',
'on': 'sopra',
'in': 'in'
};
JQUERY_CRON_LOCALE.pt = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Jan',
'Feb',
'Mar',
'Abr',
'Pod',
'Jun',
'Jul',
'Ago',
'Sep',
'Oct',
'Nov',
'Dec'
],
DOW: [
'Dom',
'Seg',
'Ter',
'Qua',
'Qui',
'Sex',
'Sen'
],
'Every': 'Cada',
'and': 'e',
'every day': 'todo dia',
'minute past the': 'minuto após o',
'hour': 'hora',
'minute': 'minuto',
'minute of': 'minuto de',
'second': 'segundo',
'second in minute': 'segundo em minuto',
'second of every': 'segundo de cada',
'minute every hour': 'minuto a cada hora',
'on the': 'no',
'of every month': 'de todos os meses',
'and every': 'e todos',
'At': 'At',
'on': 'em',
'in': 'dentro'
};
JQUERY_CRON_LOCALE.es = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Ene',
'Feb',
'Mar',
'Abr',
'Mayo',
'Jun',
'Jul',
'Ago',
'Sep',
'Oct',
'Nov',
'Dic'
],
DOW: [
'Sol',
'Lun',
'Mar',
'Mie',
'Jue',
'Vie',
'Sab'
],
'Every': 'Cada',
'and': 'y',
'every day': 'cada día',
'minute past the': 'minuto pasado el',
'hour': 'hora',
'minute': 'minuto',
'minute of': 'minuto de',
'second': 'segundo',
'second in minute': 'segundo en minuto',
'second of every': 'segundo de cada',
'minute every hour': 'minuto cada hora',
'on the': 'sobre el',
'of every month': 'de cada mes',
'and every': 'y cada',
'At': 'A',
'on': 'en',
'in': 'en'
};
JQUERY_CRON_LOCALE.nl = {
ORDINALS: {
th: '',
st: '',
nd: '',
rd: ''
},
MONTH: [
'Jan',
'Feb',
'Mar',
'Apr',
'Mei',
'Jun',
'Jul',
'Aug',
'Sep',
'Okt',
'Nov',
'Dec'
],
DOW: [
'Zon',
'Mon',
'Di',
'Wo',
'Don',
'Vrij',
'Za'
],
'Every': 'Elke',
'and': 'en',
'every day': 'elke dag',
'minute past the': 'minuut voorbij de',
'hour': 'uur',
'minute': 'minuut',
'minute of': 'minuut van',
'second': 'tweede',
'second in minute': 'tweede in minuut',
'second of every': 'tweede van alles',
'minute every hour': 'minuut elk uur',
'on the': 'op de',
'of every month': 'van elke maand',
'and every': 'en elke',
'At': 'Op',
'on': 'op',
'in': 'in'
};

View File

@ -0,0 +1,63 @@
/*global jQueryCronWords:true */
'use strict';
var jQueryCronWords = {
"April": { "en": "April", "de": "April", "ru": "Апр", "pt": "Abril", "nl": "April", "fr": "Avril", "it": "Aprile", "es": "Abril"},
"Aug": { "en": "Aug", "de": "Aug", "ru": "Авг", "pt": "Ago", "nl": "Augustus", "fr": "Août", "it": "Agosto", "es": "Ago"},
"CRON Every": { "en": "Every", "de": "Alle", "ru": "Каждые", "pt": "Cada", "nl": "Elk", "fr": "Chaque", "it": "Ogni", "es": "Cada"},
"CRON Every day": { "en": "Every day", "de": "Jeden Tag", "ru": "Каждый день", "pt": "Todo dia", "nl": "Elke dag", "fr": "Tous les jours", "it": "Ogni giorno", "es": "Cada día"},
"CRON Every hour": { "en": "Every hour", "de": "Jede Stunde", "ru": "Каждый час", "pt": "Toda hora", "nl": "Elk uur", "fr": "Toutes les heures", "it": "Ogni ora", "es": "Cada hora"},
"CRON Every minute": { "en": "Every minute", "de": "Jede Minute", "ru": "Каждую минуту", "pt": "Todo minuto", "nl": "Elke minuut", "fr": "Chaque minute", "it": "Ogni minuto", "es": "Cada minuto"},
"CRON Every month": { "en": "Every month", "de": "Jeden Monat", "ru": "Каждый месяц", "pt": "Todo mês", "nl": "Elke maand", "fr": "Chaque mois", "it": "Ogni mese", "es": "Cada mes"},
"CRON Every second": { "en": "Every second", "de": "Jede Sekunde", "ru": "Каждую секунду", "pt": "Todo segundo", "nl": "Elke seconde", "fr": "Chaque seconde", "it": "Ogni secondo", "es": "Cada segundo"},
"CRON Every week day": { "en": "Every week day", "de": "Jeden Wochentag", "ru": "Каждый день недели", "pt": "Todos os dias da semana", "nl": "Elke weekdag", "fr": "Tous les jours de la semaine", "it": "Ogni giorno della settimana", "es": "Todos los días de la semana"},
"CRON day": { "en": "day", "de": "Tag", "ru": "день", "pt": "dia", "nl": "dag", "fr": "journée", "it": "giorno", "es": "día"},
"CRON days": { "en": "days", "de": "Tage", "ru": "дней", "pt": "dias", "nl": "Dagen", "fr": "journées", "it": "giorni", "es": "dias"},
"CRON hour": { "en": "hour", "de": "Stunde", "ru": "час", "pt": "hora", "nl": "uur", "fr": "heure", "it": "ora", "es": "hora"},
"CRON hours": { "en": "hours", "de": "Stunden", "ru": "часа(ов)", "pt": "horas", "nl": "Uren", "fr": "heures", "it": "ore", "es": "horas"},
"CRON minute": { "en": "minute", "de": "Minute", "ru": "минуту", "pt": "minuto", "nl": "minuut", "fr": "minute", "it": "Minuto", "es": "minuto"},
"CRON minutes": { "en": "minutes", "de": "Minuten", "ru": "минут(ы)", "pt": "minutos", "nl": "notulen", "fr": "minutes", "it": "minuti", "es": "minutos"},
"CRON month": { "en": "month", "de": "Monate", "ru": "месяц", "pt": "mês", "nl": "maand", "fr": "mois", "it": "mese", "es": "mes"},
"CRON months": { "en": "months", "de": "Monate", "ru": "месяца", "pt": "meses", "nl": "maanden", "fr": "mois", "it": "mesi", "es": "meses"},
"CRON second": { "en": "second", "de": "Sekunde", "ru": "секунду", "pt": "segundo", "nl": "tweede", "fr": "seconde", "it": "secondo", "es": "segundo"},
"CRON seconds": { "en": "seconds", "de": "Sekunden", "ru": "секунд(ы)", "pt": "segundos", "nl": "Seconden", "fr": "secondes", "it": "secondi", "es": "segundos"},
"Clear": { "en": "Clear", "de": "Löschen", "ru": "Clear", "pt": "Claro", "nl": "Duidelijk", "fr": "Clair", "it": "Chiaro", "es": "Claro"},
"Day of Month": { "en": "Day of Month", "de": "Monatstag", "ru": "День месяца", "pt": "Dia do mês", "nl": "Dag van de maand", "fr": "Jour du mois", "it": "Giorno del mese", "es": "Dia del mes"},
"Day of Week": { "en": "Day of Week", "de": "Wochentag", "ru": "Дни недели", "pt": "Dia da semana", "nl": "Dag van de week", "fr": "Jour de la semaine", "it": "Giorno della settimana", "es": "Día de la semana"},
"Dec": { "en": "Dec", "de": "Dez", "ru": "Дек", "pt": "Dec", "nl": "DEC", "fr": "Déc", "it": "Dec", "es": "Dic"},
"Each day": { "en": "Each Day", "de": "Jeden Tag", "ru": "Каждый день", "pt": "Cada dia", "nl": "Elke dag", "fr": "Chaque jour", "it": "Ogni giorno", "es": "Cada día"},
"Each month": { "en": "Each Month", "de": "Jeden Monat", "ru": "Каждый месяц", "pt": "Cada mês", "nl": "Elke maand", "fr": "Chaque mois", "it": "Ogni mese", "es": "Cada mes"},
"Each selected day": { "en": "Each selected Day", "de": "Jeden ausgewählten Tag", "ru": "Каждый выбранный день", "pt": "Cada dia selecionado", "nl": "Elke geselecteerde dag", "fr": "Chaque jour sélectionné", "it": "Ogni giorno selezionato", "es": "Cada día seleccionado"},
"Each selected hour": { "en": "Each Selected Hour", "de": "Jede ausgewählte Stunde", "ru": "Каждый выбранный час", "pt": "Cada Hora Selecionada", "nl": "Elk geselecteerd uur", "fr": "Chaque heure sélectionnée", "it": "Ogni ora selezionata", "es": "Cada hora seleccionada"},
"Each selected minute": { "en": "Each selected minute", "de": "Jede ausgewählte Minute", "ru": "Каждую выбранную минуту", "pt": "Cada minuto selecionado", "nl": "Elke geselecteerde minuut", "fr": "Chaque minute sélectionnée", "it": "Ogni minuto selezionato", "es": "Cada minuto seleccionado"},
"Each selected month": { "en": "Each selected month", "de": "Jeden ausgewählten Monat", "ru": "Каждый выбранный месяц", "pt": "Cada mês selecionado", "nl": "Elke geselecteerde maand", "fr": "Chaque mois sélectionné", "it": "Ogni mese selezionato", "es": "Cada mes seleccionado"},
"Each selected second": { "en": "Each selected second", "de": "Jede ausgewählte Sekunde", "ru": "Каждую выбранную секунду", "pt": "Cada segundo selecionado", "nl": "Elke geselecteerde seconde", "fr": "Chaque seconde sélectionnée", "it": "Ogni secondo selezionato", "es": "Cada segundo seleccionado"},
"Each selected week day": { "en": "Each selected week day", "de": "Jeden ausgewählten Wochentag", "ru": "Каждый выбранный день недели", "pt": "Cada dia da semana selecionado", "nl": "Elke geselecteerde weekdag", "fr": "Chaque jour de la semaine sélectionné", "it": "Ogni giorno della settimana selezionato", "es": "Cada día de la semana seleccionado"},
"Each week day": { "en": "Each Week", "de": "Jeden Wochentag", "ru": "Каждую неделю", "pt": "Cada semana", "nl": "Elke week", "fr": "Chaque semaine", "it": "Ogni settimana", "es": "Cada semana"},
"Every %s seconds": { "en": "Every %s seconds", "de": "Alle %s Sekunden", "ru": "Каждые %s секунд(ы)", "pt": "Todos os% s segundos", "nl": "Elke% s seconden", "fr": "Chaque seconde% s", "it": "Ogni% s secondi", "es": "Cada% s segundos"},
"Every n hours": { "en": "Every n Hours", "de": "Alle N Stunden", "ru": "Каждые N часов", "pt": "Todas as horas", "nl": "Every n Hours", "fr": "Toutes les n heures", "it": "Ogni n ore", "es": "Cada n horas"},
"Every n minutes": { "en": "Every n minutes", "de": "Alle N Minuten", "ru": "Каждые N минут", "pt": "A cada n minutos", "nl": "Elke n minuten", "fr": "Toutes les n minutes", "it": "Ogni n minuti", "es": "Cada n minutos"},
"Every n seconds": { "en": "Every n seconds", "de": "Alle N Sekunden", "ru": "Каждые N секунд", "pt": "Cada n segundos", "nl": "Elke n seconden", "fr": "Toutes les n secondes", "it": "Ogni n secondi", "es": "Cada n segundos"},
"Feb": { "en": "Feb", "de": "Feb", "ru": "Фев", "pt": "Feb", "nl": "Februari", "fr": "Fév", "it": "Febbraio", "es": "Feb"},
"Friday": { "en": "Friday", "de": "Freitag", "ru": "Пятница", "pt": "Sexta-feira", "nl": "Vrijdag", "fr": "Vendredi", "it": "Venerdì", "es": "Viernes"},
"Hour": { "en": "Hour", "de": "Stunde", "ru": "Часы", "pt": "Hora", "nl": "Uur", "fr": "Heure", "it": "Ora", "es": "Hora"},
"Jan": { "en": "Jan", "de": "Jan", "ru": "Янв", "pt": "Jan", "nl": "Jan", "fr": "Jan", "it": "Jan", "es": "Ene"},
"July": { "en": "July", "de": "Juli", "ru": "Июль", "pt": "Julho", "nl": "Juli", "fr": "Juillet", "it": "Luglio", "es": "Julio"},
"June": { "en": "June", "de": "Juni", "ru": "Июнь", "pt": "Junho", "nl": "Juni", "fr": "Juin", "it": "Giugno", "es": "Junio"},
"March": { "en": "March", "de": "März", "ru": "Март", "pt": "Marcha", "nl": "Maart", "fr": "Mars", "it": "Marzo", "es": "Marzo"},
"May": { "en": "May", "de": "Mai", "ru": "Mай", "pt": "Pode", "nl": "Mei", "fr": "Mai", "it": "Potrebbe", "es": "Mayo"},
"Minute": { "en": "Minute", "de": "Minuten", "ru": "Минуты", "pt": "Minuto", "nl": "Minuut", "fr": "Minute", "it": "Minuto", "es": "Minuto"},
"Monday": { "en": "Monday", "de": "Montag", "ru": "Понедельник", "pt": "Segunda-feira", "nl": "Maandag", "fr": "Lundi", "it": "Lunedi", "es": "Lunes"},
"Month": { "en": "Month", "de": "Monate", "ru": "Месяцы", "pt": "Mês", "nl": "Maand", "fr": "Mois", "it": "Mese", "es": "Mes"},
"Nov": { "en": "Nov", "de": "Nov", "ru": "Ноя", "pt": "Nov", "nl": "November", "fr": "Nov", "it": "Novembre", "es": "Nov"},
"Oct": { "en": "Oct", "de": "Okt", "ru": "Окт", "pt": "Oct", "nl": "Oct", "fr": "Oct", "it": "Ottobre", "es": "Oct"},
"Saturday": { "en": "Saturday", "de": "Samstag", "ru": "Суббота", "pt": "Sábado", "nl": "Zaterdag", "fr": "Samedi", "it": "Sabato", "es": "Sábado"},
"Second": { "en": "Second", "de": "Sekunden", "ru": "Секунды", "pt": "Segundo", "nl": "Tweede", "fr": "Seconde", "it": "Secondo", "es": "Segundo"},
"Sept": { "en": "Sept", "de": "Sept", "ru": "Сен", "pt": "Sept", "nl": "September", "fr": "Sept", "it": "Settembre", "es": "Sept"},
"Sunday": { "en": "Sunday", "de": "Sonntag", "ru": "Воскресение", "pt": "Domingo", "nl": "Zondag", "fr": "Dimanche", "it": "Domenica", "es": "Domingo"},
"Thursday": { "en": "Thursday", "de": "Donnerstag", "ru": "Четверг", "pt": "Quinta-feira", "nl": "Donderdag", "fr": "Jeudi", "it": "Giovedi", "es": "Jueves"},
"Tuesday": { "en": "Tuesday", "de": "Dienstag", "ru": "Вторник", "pt": "Terça", "nl": "Dinsdag", "fr": "Mardi", "it": "Martedì", "es": "Martes"},
"Use seconds:": { "en": "Use seconds:", "de": "Sekunden benutzen:", "ru": "Задействовать секунды:", "pt": "Use segundos:", "nl": "Gebruik seconden:", "fr": "Utiliser les secondes:", "it": "Usa secondi:", "es": "Usar segundos:"},
"Wednesday": { "en": "Wednesday", "de": "Mittwoch", "ru": "Среда", "pt": "Quarta-feira", "nl": "Woensdag", "fr": "Mercredi", "it": "Mercoledì", "es": "Miércoles"},
"never": { "en": "Never", "de": "Nie", "ru": "Никогда", "pt": "Nunca", "nl": "Nooit", "fr": "Jamais", "it": "Mai", "es": "Nunca"},
};

BIN
admin/js.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
admin/js.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1 @@
(self.webpackJsonp=self.webpackJsonp||[]).push([[0],{152:function(n,e){function o(n){var e=new Error('Cannot find module "'+n+'".');throw e.code="MODULE_NOT_FOUND",e}o.keys=function(){return[]},o.resolve=o,n.exports=o,o.id=152}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(self.webpackJsonp=self.webpackJsonp||[]).push([[3],{151:function(e,n,r){"use strict";r.r(n),r.d(n,"conf",function(){return t}),r.d(n,"language",function(){return s});var t={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},s={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=><!~?&%|+\-*\/\^\.,\:]+/,escapes:/\\(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\@[a-zA-Z_]\w*/,"variable.predefined"],[/[a-zA-Z_]\w*/,{cases:{this:"variable.predefined","@keywords":{token:"keyword.$0"},"@default":""}}],[/[ \t\r\n]+/,""],[/###/,"comment","@comment"],[/#.*$/,"comment"],["///",{token:"regexp",next:"@hereregexp"}],[/^(\s*)(@regEx)/,["","regexp"]],[/(\()(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\,)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\=)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\:)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\[)(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\!)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\&)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\|)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\?)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\{)(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\;)(\s*)(@regEx)/,["","","regexp"]],[/}/,{cases:{"$S2==interpolatedstring":{token:"string",next:"@pop"},"@default":"@brackets"}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/0[0-7]+(?!\d)/,"number.octal"],[/\d+/,"number"],[/[,.]/,"delimiter"],[/"""/,"string",'@herestring."""'],[/'''/,"string","@herestring.'''"],[/"/,{cases:{"@eos":"string","@default":{token:"string",next:'@string."'}}}],[/'/,{cases:{"@eos":"string","@default":{token:"string",next:"@string.'"}}}]],string:[[/[^"'\#\\]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/\./,"string.escape.invalid"],[/#{/,{cases:{'$S2=="':{token:"string",next:"root.interpolatedstring"},"@default":"string"}}],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/#/,"string"]],herestring:[[/("""|''')/,{cases:{"$1==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/[^#\\'"]+/,"string"],[/['"]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/#{/,{token:"string.quote",next:"root.interpolatedstring"}],[/#/,"string"]],comment:[[/[^#]+/,"comment"],[/###/,"comment","@pop"],[/#/,"comment"]],hereregexp:[[/[^\\\/#]+/,"regexp"],[/\\./,"regexp"],[/#.*$/,"comment"],["///[igm]*",{token:"regexp",next:"@pop"}],[/\//,"regexp"]]}}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5549
admin/monaco-editor/monaco.d.ts vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

6725
admin/query-builder/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,6 @@
/*!
* jQuery QueryBuilder 2.4.3
* Copyright 2014-2017 Damien "Mistic" Sorel (http://www.strangeplanet.fr)
* Licensed under MIT (http://opensource.org/licenses/MIT)
*/
.query-builder .rule-container,.query-builder .rule-placeholder,.query-builder .rules-group-container{position:relative;margin:4px 0;border-radius:5px;padding:5px;border:1px solid #EEE;background:rgba(255,255,255,.9)}.query-builder .drag-handle,.query-builder .error-container,.query-builder .rule-container .rule-filter-container,.query-builder .rule-container .rule-operator-container,.query-builder .rule-container .rule-value-container{display:inline-block;margin:0 5px 0 0;vertical-align:middle}.query-builder .rules-group-container{padding:10px 10px 6px;border:1px solid #DCC896;background:rgba(250,240,210,.5)}.query-builder .rules-group-header{margin-bottom:10px}.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder .rules-group-header .group-conditions input[name$=_cond]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.query-builder .rules-group-header .group-conditions .btn.readonly{border-radius:3px}.query-builder .rules-list{list-style:none;padding:0 0 0 15px;margin:0}.query-builder .rule-value-container{border-left:1px solid #DDD;padding-left:5px}.query-builder .rule-value-container label{margin-bottom:0;font-weight:400}.query-builder .rule-value-container label.block{display:block}.query-builder .rule-value-container input[type=number],.query-builder .rule-value-container input[type=text],.query-builder .rule-value-container select{padding:1px}.query-builder .error-container{display:none;cursor:help;color:red}.query-builder .has-error{background-color:#FDD;border-color:#F99}.query-builder .has-error .error-container{display:inline-block!important}.query-builder .dragging::after,.query-builder .dragging::before,.query-builder .rules-list>:last-child::after{display:none}.query-builder .rules-list>::after,.query-builder .rules-list>::before{content:'';position:absolute;left:-10px;width:10px;height:calc(50% + 4px);border-color:#CCC;border-style:solid}.query-builder .rules-list>::before{top:-4px;border-width:0 0 2px 2px}.query-builder .rules-list>::after{top:50%;border-width:0 0 0 2px}.query-builder .rules-list>:first-child::before{top:-12px;height:calc(50% + 14px)}.query-builder .rules-list>:last-child::before{border-radius:0 0 0 4px}.query-builder.bt-checkbox-glyphicons .checkbox input[type=checkbox]:checked+label::after{font-family:'Glyphicons Halflings';content:'\e013'}.query-builder.bt-checkbox-glyphicons .checkbox label::after{padding-left:4px;padding-top:2px;font-size:9px}.query-builder .error-container+.tooltip .tooltip-inner{color:#F99!important}.query-builder p.filter-description{margin:5px 0 0;background:#D9EDF7;border:1px solid #BCE8F1;color:#31708F;border-radius:5px;padding:2.5px 5px;font-size:.8em}.query-builder .rules-group-header [data-invert]{margin-left:5px}.query-builder .drag-handle{cursor:move;vertical-align:middle;margin-left:5px}.query-builder .dragging{position:fixed;opacity:.5;z-index:100}.query-builder .rule-placeholder{border:1px dashed #BBB;opacity:.7}

File diff suppressed because one or more lines are too long

BIN
admin/rule.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

721
admin/tab.html Normal file
View File

@ -0,0 +1,721 @@
<html>
<head>
<!-- these 4 files always have to be included -->
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/default/jquery-ui.min.css"/>
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/default/jquery-ui.structure.min.css"/>
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/default/jquery-ui.theme.min.css"/>
<link rel="stylesheet" type="text/css" href="../../lib/css/fancytree/ui.fancytree.min.css"/>
<link rel="stylesheet" type="text/css" href="jquery.cron.css"/>
<link rel="stylesheet" type="text/css" href="jquery-treetable/jquery.treetable.theme.css"/>
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<script type="text/javascript" src="../../lib/js/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="../../lib/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../lib/js/loStorage.js"></script>
<!-- original editor -->
<!--script type="text/javascript" src="../../lib/js/ace-1.2.0/ace.js"></script>
<script type="text/javascript" src="../../lib/js/ace-1.2.0/ext-language_tools.js"></script-->
<!-- improved VSCode editor -->
<script type="text/javascript" src="monaco-editor/monaco-editor.bundle.js"></script>
<script type="text/javascript" src="../../lib/js/translate.js"></script>
<script type="text/javascript" src="words.js"></script>
<script type="text/javascript" src="../../lib/js/jquery.fancytree-all.min.js"></script>
<script type="text/javascript" src="../../lib/js/colResizable-1.6.min.js"></script>
<script type="text/javascript" src="google-blockly/blockly_compressed.js"></script>
<script type="text/javascript" src="google-blockly/blocks_compressed.js"></script>
<script type="text/javascript" src="google-blockly/javascript_compressed.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_words.js"></script>
<script type="text/javascript" src="google-blockly/own/field_oid.js"></script>
<script type="text/javascript" src="google-blockly/own/field_cron.js"></script>
<script type="text/javascript" src="google-blockly/own/field_script.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_system.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_action.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_sendto.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_time.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_convert.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_trigger.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_procedures.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_timeout.js"></script>
<script type="text/javascript" src="../../lib/js/selectID.js"></script>
<script type="text/javascript" src="jquery-treetable/jquery.treetable.js"></script>
<script type="text/javascript" src="treeTable.js"></script>
<script type="text/javascript" src="cron2text.js"></script>
<script type="text/javascript" src="jquery.cron.words.js"></script>
<script type="text/javascript" src="jquery.cron.locale.js"></script>
<script type="text/javascript" src="jquery.cron.js"></script>
<link href="query-builder/bootstrap.css" rel="stylesheet">
<link href="query-builder/query-builder.default.min.css" rel="stylesheet">
<script src="query-builder/query-builder.standalone.min.js"></script>
<style>
body {
font-size: 11px;
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited, .ui-state-hover a, .ui-state-hover a:link, .ui-state-hover a:visited {
outline: none;
}
.ui-jqgrid tr.jqgrow td {
font-size: 12px;
}
.ui-jqgrid .ui-pg-input {
height: 20px !important;
}
.ui-jqgrid-titlebar-close {
display: none !important;
}
#edit-script-source {
font-size: 12px;
width: 600px;
height: 240px;
padding:0;
margin:0;
border: 1px solid grey;
outline: none;
box-shadow: none;
resize:none;
}
.no-space {
border: 0 !important;
margin: 0;
padding: 0;
border-spacing: 0;
border-image-width: 0;
}
#script-main .ui-resizable-e {
cursor: e-resize;
width: 4px;
right: 0;
top: 0;
bottom: 0;
background-color: gray;
}
#script-main .ui-resizable-s {
cursor: s-resize;
height: 4px;
right: 0;
left: 0;
bottom: 0;
background-color: gray;
}
.warn, .error, .info, .debug {
font-size: small;
font-family: Arial;
}
.info {
color: black;
}
.warn {
color: orange;
}
.error {
color: red;
}
.debug {
color: darkgray;
}
.import-drop-zone {
width: calc(100% - 6px);
height: calc(100% - 6px);
position: absolute;
opacity: 0.95;
top: 0;
left: 0;
background: #eee;
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
z-index: 1;
font-size: 32px;
font-weight: bold;
text-align: center;
border: 3px dashed black;
border-radius: 15px;
}
.import-dropzone-error {
background: #faa !important;
color: #f00;
}
.import-text-drop {
width: calc(100% - 6px);
height: 150px;
padding-top: 20px;
text-align: center;
cursor: pointer;
border: 3px dashed #c6c6c6;
border-radius: 15px;
color: #c6c6c6;
}
.import-text-drop-plus {
position: absolute;
top: 30px;
left: calc(50% - 40px);
font-size: 100px;
font-weight: bold;
opacity: 0.2;
}
.fancytree-force-folder span.fancytree-icon{
background-position: -32px -16px;
}
.dialog-new-script-button {
cursor: pointer;
}
.main-toolbar-table {
height: 30px;
width: 100%;
padding: 0;
border-spacing: 3px 0;
margin-bottom: 5px;
position: relative;
left: -2px;
}
table.main-toolbar-table > tbody > tr > td {
padding: 0;
width: 24px !important;
height: 24px !important;
}
table.main-toolbar-table > tbody > tr > td:last-child {
width: 100% !important;
text-align: right;
white-space: nowrap;
font-size: 0.75em;
font-weight: normal;
}
table.main-toolbar-table > tbody > tr > td > button {
width: 24px;
height: 24px;
}
table.main-toolbar-table > tr > td {
padding: 10px !important;
}
/*loader*/
@keyframes colors {
0% { stroke: #17572b; }
25% { stroke: #1B9A59; }
50% { stroke: #009a63; }
75% { stroke: #6a9a00; }
100% { stroke: #00f060; }
}
@keyframes dash {
0% { stroke-dashoffset: 187px; }
50% {
stroke-dashoffset: 47px;
transform: rotate(135deg);
}
100% {
stroke-dashoffset: 187px;
transform: rotate(450deg);
}
}
@keyframes rotator {
0% { transform: rotate(0deg); }
100% { transform: rotate(270deg); }
}
#connecting {
left: 0;
top: 0;
width: 100%;
height: 100%;
position: fixed;
background: rgba(0, 0, 0, 0.3);
z-index: 20000;
}
#connecting .connecting-div {
left: 40%;
top: 40%;
width: 20%;
height: 20%;
position: absolute;
}
#connecting .connecting-div .spinner {
animation: rotator 1.4s linear infinite;
}
#connecting .connecting-div .path {
stroke-dasharray: 187px;
stroke-dashoffset: 0;
transform-origin: center;
animation: dash 1.4s ease-in-out infinite, colors 5.2s ease-in-out infinite;
}
.cron-slider {
background: #dadada;
border-radius: 2px;
}
</style>
</head>
<body>
<div id="script-main" style="width: 100%; height: 100%; display: flex; flex-direction: row; flex-wrap: nowrap">
<div id="grid-scripts" style="height: 100%; width: 30%; padding-right: 8px; overflow-x: hidden; background: #efefef">
<!-- Loading indicator -->
<div id="connecting">
<div class="connecting-div">
<svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">
<circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
</svg>
</div>
</div>
</div>
<div id="editor-scripts" style="height: calc(100% - 8px); width: calc(70% - 15px); flex-direction: column; flex-wrap: nowrap; display: none">
<div style="height: 80%; width: 100%; padding-bottom: 8px; overflow: hidden;" class="ui-widget" id="editor-scripts-textarea">
<table style="width: 100%; height: 100%">
<tr>
<td colspan="2">
<table style="width: calc(100% - 20px); border: 0;"><tr>
<td style="width: 500px;">
<label style="display: inline-block; padding-right: 5px" for="edit-script-group" class="translate">name</label>
<select style="display: inline-block" id="edit-script-group"></select><label style="display: inline-block;" for="edit-script-name">/</label><input style="display: inline-block; width: 200px" id="edit-script-name"/>
</td>
<td id="script-buttons" style="width: calc(100% - 410px);">
<label for="edit-script-debug" style="display: inline-block; padding-left: 25px" class="translate">debug</label>
<input id="edit-script-debug" type="checkbox" />
<label for="edit-script-verbose" style="display: inline-block; padding-left: 15px" class="translate">verbose</label>
<input id="edit-script-verbose" type="checkbox" />
<select style="float: right" id="edit-script-engine-type"></select>
<label for="edit-script-engine-type" style="float: right; padding-right: 5px" class="translate">engine type</label>
</td>
</tr></table>
</td>
</tr>
<tr>
<td colspan="2">
<table style="width: 100%"><tr>
<td><button id="script-edit-button-save"></button></td>
<td><button id="script-edit-button-cancel"></button></td>
<td class="edit-wrap-lines"><input id="edit-wrap-lines" type="checkbox"/></td>
<td class="edit-wrap-lines"><label class="translate" for="edit-wrap-lines">Wrap&nbsp;lines</label></td>
<td style="width: 100%"><span style="display: none; font-weight: bold; padding-left: 20px; text-decoration: none" id="global_hint"><a href="https://git.spacen.net/yunkong2/yunkong2.javascript#global-functions" target="_blank" class="translate" style="text-decoration: none; color: #40bf40">global_hint</a></span></td>
<td><button id="edit-export-blocks" class="translate script-edit"></button></td>
<td><button id="edit-import-blocks" class="translate script-edit"></button></td>
<td><button id="edit-check-blocks" class="translate script-edit" style="white-space: nowrap;">Check blocks</button></td>
<td><button id="show-blockly-id" class="translate script-edit">Show code</button></td>
<td><button class="translate script-edit edit-cron-id">Cron</button></td>
<td><button id="edit-insert-id" class="translate script-edit">Insert ID</button></td>
</tr></table>
</td>
</tr>
<tr style="height: 100%;" class="script-edit">
<td colspan="2" style="height: 100%; width: 100%; position: relative">
<div style="position: absolute; top: 0; bottom: 0; width: 10px" id="height-editor"></div>
<div id="script-editor" style="height: 100%; width: 100%"></div>
<div id="blockly-editor" style="height: 100%; width: 100%; overflow: hidden"></div>
<div id="builder-widgets" class="bootstrap" style="height: 100%; width: 100%; overflow: hidden"></div>
</td>
</tr>
</table>
</div>
<div style="height: 20%; width: 100%; display: flex; flex-direction: row; flex-wrap: nowrap" id="script-output-tab" class="script-edit">
<div style="width: 30px">
<table>
<tr><td class="translate" style="font-family: arial, sans-serif; font-weight: bold">Log</td></tr>
<tr><td><button id="script-output-clear"></button></td></tr>
<tr><td><button id="script-output-down"></button></td></tr>
</table>
</div>
<div style="overflow-x: auto; overflow-y: auto; width: calc(100% - 30px)">
<table style="width: 100%">
<thead>
<col width="80px"/>
<col width="50px"/>
<col width="*"/>
</thead>
<tbody id="script-output" ></tbody>
</table>
</div>
</div>
</div>
</div>
<div id="dialog-script" style="display: none">
<table style="height: 100%; width: 100%;">
<tr>
<td>
<button class="translate edit-cron-id">Cron</button>
<button id="dialog-edit-insert-id" class="translate">Insert ID</button>
<label class="translate" for="dialog-edit-wrap-lines" style="padding-left: 20px; display: inline-block;">Wrap&nbsp;lines</label>
<input id="dialog-edit-wrap-lines" type="checkbox"/>
</td>
</tr>
<tr style="height: 100%;">
<td style="height: 100%;">
<div style="height: 100%; width: 100%" id="dialog-script-editor"></div>
</td>
</tr>
</table>
</div>
<div id="dialog-new-group" style="display: none">
<table style="width: 100%">
<tr>
<td><label for="edit-new-group-name" class="translate">new group name</label></td>
<td><input style="display: inline-block; width: 200px" id="edit-new-group-name"></td>
</tr>
<tr>
<td><label for="edit-new-group-group" class="translate">Create in:</label></td>
<td><select id="edit-new-group-group"></select></td>
</tr>
</table>
</div>
<div id="dialog-message" title="Message" style="display: none">
<p>
<span id="dialog-message-icon" class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 50px 0;"></span>
<span id="dialog-message-text"></span>
</p>
</div>
<div id="dialog-confirm" title="Question" style="display: none">
<p>
<span id="dialog-confirm-icon" class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 50px 0;"></span>
<span id="dialog-confirm-text"></span>
</p>
</div>
<div id="dialog-new-script" title="Select type" style="display: none; width: 550px; height: 170px">
<table style="width: 100%"><tr>
<td style="text-align: center"><img src="blockly.png" data-type="Blockly" class="dialog-new-script-button" /></td>
<td style="text-align: center"><img src="js.png" data-type="Javascript/js" class="dialog-new-script-button" /></td>
<td style="text-align: center"><img src="typescript.png" data-type="TypeScript/ts" class="dialog-new-script-button" /></td>
<!--td style="text-align: center"><img src="coffeescript.png" data-type="Coffeescript/coffee" class="dialog-new-script-button" /></td-->
<!--td style="text-align: center"><img src="rule.png" data-type="Rule" class="dialog-new-script-button" /></td-->
</tr>
</table>
</div>
<div id="dialog-select-member" style="display:none"></div>
<div id="dialog-cron" style="display: none">
<div id="div-cron"></div>
</div>
<div id="dialog-export-blockly" style="display: none">
<textarea id="dialog-export-blockly-textarea" style="width: 99%; height: 98%; font-size: 11px; resize: none;" readonly></textarea>
</div>
<div style="display: none; overflow: hidden; text-align: center;" id="dialog_import_scripts" title="import scripts" class="translateT">
<div class="import-drop-zone" style="display: none">
<div style="padding-top: 20%" class="translate import-drop-text"></div>
<input type="file" class="import-drop-file" style="display: none">
</div>
<div class="import-text-drop">
<span class="import-file-name translate">Drop files here or click to select one</span>
<span class="import-text-drop-plus">+</span>
</div>
<button id="start_import_scripts" class="translateB" style="margin: 20px">import&nbsp;scripts</button>
</div>
<xml id="toolbox" style="display: none">
<category><block>%%CUSTOM_BLOCKS%%</block></category>
<sep></sep>
<category name="{catLogic}" colour="0">
<block type="controls_if"></block>
<block type="logic_compare"></block>
<block type="logic_operation"></block>
<block type="logic_negate"></block>
<block type="logic_boolean"></block>
<block type="logic_null"></block>
<block type="logic_ternary"></block>
</category>
<category name="{catLoops}" colour="120">
<block type="controls_repeat_ext">
<value name="TIMES">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
</block>
<block type="controls_whileUntil"></block>
<block type="controls_for">
<value name="FROM">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="TO">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
<value name="BY">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="controls_forEach"></block>
<block type="controls_flow_statements"></block>
</category>
<category name="{catMath}" colour="230">
<block type="math_number"></block>
<block type="math_arithmetic">
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="math_single">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">9</field>
</shadow>
</value>
</block>
<block type="math_trig">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">45</field>
</shadow>
</value>
</block>
<block type="math_constant"></block>
<block type="math_number_property">
<value name="NUMBER_TO_CHECK">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
</block>
<block type="math_change">
<value name="DELTA">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="math_round">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">3.1</field>
</shadow>
</value>
</block>
<block type="math_rndfixed">
<value name="x">
<shadow type="math_number">
<field name="NUM">3.1234</field>
</shadow>
</value>
<value name="n">
<shadow type="math_number">
<field name="NUM">2</field>
</shadow>
</value>
</block>
<block type="math_on_list"></block>
<block type="math_modulo">
<value name="DIVIDEND">
<shadow type="math_number">
<field name="NUM">64</field>
</shadow>
</value>
<value name="DIVISOR">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
</block>
<block type="math_constrain">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">50</field>
</shadow>
</value>
<value name="LOW">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="HIGH">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="math_random_int">
<value name="FROM">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="TO">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="math_random_float"></block>
</category>
<category name="{catText}" colour="160">
<block type="text"></block>
<block type="text_newline"></block>
<block type="text_join"></block>
<block type="text_append">
<value name="TEXT">
<shadow type="text"></shadow>
</value>
</block>
<block type="text_length">
<value name="VALUE">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_isEmpty">
<value name="VALUE">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
</value>
</block>
<block type="text_indexOf">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
<value name="FIND">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_charAt">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
</block>
<block type="text_getSubstring">
<value name="STRING">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
</block>
<block type="text_changeCase">
<value name="TEXT">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_trim">
<value name="TEXT">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
</category>
<category name="{catLists}" colour="260">
<block type="lists_create_with">
<mutation items="0"></mutation>
</block>
<block type="lists_create_with"></block>
<block type="lists_repeat">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">5</field>
</shadow>
</value>
</block>
<block type="lists_length"></block>
<block type="lists_isEmpty"></block>
<block type="lists_indexOf">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_getIndex">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_setIndex">
<value name="LIST">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_getSublist">
<value name="LIST">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_split">
<value name="DELIM">
<shadow type="text">
<field name="TEXT">,</field>
</shadow>
</value>
</block>
<block type="lists_sort"></block>
</category>
<category name="{catColour}" colour="20">
<block type="colour_picker"></block>
<block type="colour_random"></block>
<block type="colour_rgb">
<value name="RED">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
<value name="GREEN">
<shadow type="math_number">
<field name="NUM">50</field>
</shadow>
</value>
<value name="BLUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
</block>
<block type="colour_blend">
<value name="COLOUR1">
<shadow type="colour_picker">
<field name="COLOUR">#ff0000</field>
</shadow>
</value>
<value name="COLOUR2">
<shadow type="colour_picker">
<field name="COLOUR">#3333ff</field>
</shadow>
</value>
<value name="RATIO">
<shadow type="math_number">
<field name="NUM">0.5</field>
</shadow>
</value>
</block>
</category>
<sep></sep>
<category name="{catVariables}" colour="330" custom="VARIABLE"></category>
<category name="{catFunctions}" colour="290" custom="PROCEDURE"></category>
</xml>
<script type="text/javascript" src="tab.js"></script>
</body>
</html>

3469
admin/tab.js Normal file

File diff suppressed because it is too large Load Diff

719
admin/tab_m.html Normal file
View File

@ -0,0 +1,719 @@
<html>
<head>
<!-- these 4 files always have to be included -->
<link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
<link rel="stylesheet" type="text/css" href="../../lib/css/fancytree/ui.fancytree.min.css"/>
<link rel="stylesheet" type="text/css" href="jquery.cron.css"/>
<link rel="stylesheet" type="text/css" href="jquery-treetable/jquery.treetable.theme.css"/>
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<script type="text/javascript" src="../../lib/js/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="../../lib/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../lib/js/loStorage.js"></script>
<!-- original editor -->
<script type="text/javascript" src="../../lib/js/ace-1.2.0/ace.js"></script>
<!-- improved VSCode editor -->
<script type="text/javascript" src="monaco-editor/monaco-editor.bundle.js"></script>
<script type="text/javascript" src="../../lib/js/translate.js"></script>
<script type="text/javascript" src="words.js"></script>
<script type="text/javascript" src="../../lib/js/jquery.fancytree-all.min.js"></script>
<script type="text/javascript" src="../../lib/js/colResizable-1.6.min.js"></script>
<script type="text/javascript" src="google-blockly/blockly_compressed.js"></script>
<script type="text/javascript" src="google-blockly/blocks_compressed.js"></script>
<script type="text/javascript" src="google-blockly/javascript_compressed.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_words.js"></script>
<script type="text/javascript" src="google-blockly/own/field_oid.js"></script>
<script type="text/javascript" src="google-blockly/own/field_cron.js"></script>
<script type="text/javascript" src="google-blockly/own/field_script.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_system.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_action.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_sendto.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_time.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_convert.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_trigger.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_procedures.js"></script>
<script type="text/javascript" src="google-blockly/own/blocks_timeout.js"></script>
<script type="text/javascript" src="../../lib/js/selectID.js"></script>
<script type="text/javascript" src="jquery-treetable/jquery.treetable.js"></script>
<script type="text/javascript" src="treeTable.js"></script>
<script type="text/javascript" src="cron2text.js"></script>
<script type="text/javascript" src="jquery.cron.words.js"></script>
<script type="text/javascript" src="jquery.cron.locale.js"></script>
<script type="text/javascript" src="jquery.cron.js"></script>
<link href="query-builder/bootstrap.css" rel="stylesheet">
<link href="query-builder/query-builder.default.min.css" rel="stylesheet">
<script src="query-builder/query-builder.standalone.min.js"></script>
<style>
body {
font-size: 11px;
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited, .ui-state-hover a, .ui-state-hover a:link, .ui-state-hover a:visited {
outline: none;
}
.ui-jqgrid tr.jqgrow td {
font-size: 12px;
}
.ui-jqgrid .ui-pg-input {
height: 20px !important;
}
.ui-jqgrid-titlebar-close {
display: none !important;
}
#edit-script-source {
font-size: 12px;
width: 600px;
height: 240px;
padding:0;
margin:0;
border: 1px solid grey;
outline: none;
box-shadow: none;
resize:none;
}
.no-space {
border: 0 !important;
margin: 0;
padding: 0;
border-spacing: 0;
border-image-width: 0;
}
#script-main .ui-resizable-e {
cursor: e-resize;
width: 4px;
right: 0;
top: 0;
bottom: 0;
background-color: gray;
}
#script-main .ui-resizable-s {
cursor: s-resize;
height: 4px;
right: 0;
left: 0;
bottom: 0;
background-color: gray;
}
.warn, .error, .info, .debug {
font-size: small;
font-family: Arial;
}
.info {
color: black;
}
.warn {
color: orange;
}
.error {
color: red;
}
.debug {
color: darkgray;
}
.import-drop-zone {
width: calc(100% - 6px);
height: calc(100% - 6px);
position: absolute;
opacity: 0.95;
top: 0;
left: 0;
background: #eee;
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
z-index: 1;
font-size: 32px;
font-weight: bold;
text-align: center;
border: 3px dashed black;
border-radius: 15px;
}
.import-dropzone-error {
background: #faa !important;
color: #f00;
}
.import-text-drop {
width: calc(100% - 6px);
height: 150px;
padding-top: 20px;
text-align: center;
cursor: pointer;
border: 3px dashed #c6c6c6;
border-radius: 15px;
color: #c6c6c6;
}
.import-text-drop-plus {
position: absolute;
top: 30px;
left: calc(50% - 40px);
font-size: 100px;
font-weight: bold;
opacity: 0.2;
}
.fancytree-force-folder span.fancytree-icon{
background-position: -32px -16px;
}
.dialog-new-script-button {
cursor: pointer;
}
.main-toolbar-table {
height: 30px;
width: 100%;
padding: 0;
border-spacing: 3px 0;
margin-bottom: 5px;
position: relative;
left: -2px;
}
table.main-toolbar-table > tbody > tr > td {
padding: 0;
width: 24px !important;
height: 24px !important;
}
table.main-toolbar-table > tbody > tr > td:last-child {
width: 100% !important;
text-align: right;
white-space: nowrap;
font-size: 0.75em;
font-weight: normal;
}
table.main-toolbar-table > tbody > tr > td > button {
width: 24px;
height: 24px;
}
table.main-toolbar-table > tr > td {
padding: 10px !important;
}
/*loader*/
@keyframes colors {
0% { stroke: #17572b; }
25% { stroke: #1B9A59; }
50% { stroke: #009a63; }
75% { stroke: #6a9a00; }
100% { stroke: #00f060; }
}
@keyframes dash {
0% { stroke-dashoffset: 187px; }
50% {
stroke-dashoffset: 47px;
transform: rotate(135deg);
}
100% {
stroke-dashoffset: 187px;
transform: rotate(450deg);
}
}
@keyframes rotator {
0% { transform: rotate(0deg); }
100% { transform: rotate(270deg); }
}
#connecting {
left: 0;
top: 0;
width: 100%;
height: 100%;
position: fixed;
background: rgba(0, 0, 0, 0.3);
z-index: 20000;
}
#connecting .connecting-div {
left: 40%;
top: 40%;
width: 20%;
height: 20%;
position: absolute;
}
#connecting .connecting-div .spinner {
animation: rotator 1.4s linear infinite;
}
#connecting .connecting-div .path {
stroke-dasharray: 187px;
stroke-dashoffset: 0;
transform-origin: center;
animation: dash 1.4s ease-in-out infinite, colors 5.2s ease-in-out infinite;
}
.cron-slider {
background: #dadada;
border-radius: 2px;
}
</style>
</head>
<body>
<div id="script-main" style="width: 100%; height: 100%; display: flex; flex-direction: row; flex-wrap: nowrap">
<div id="grid-scripts" style="height: 100%; width: 30%; padding-right: 8px; overflow-x: hidden; background: #efefef">
<!-- Loading indicator -->
<div id="connecting">
<div class="connecting-div">
<svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">
<circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
</svg>
</div>
</div>
</div>
<div id="editor-scripts" style="height: calc(100% - 8px); width: calc(70% - 15px); flex-direction: column; flex-wrap: nowrap; display: none">
<div style="height: 80%; width: 100%; padding-bottom: 8px; overflow: hidden;" class="ui-widget" id="editor-scripts-textarea">
<table style="width: 100%; height: 100%">
<tr>
<td colspan="2">
<table style="width: calc(100% - 20px); border: 0;"><tr>
<td style="width: 410px;">
<label style="display: inline-block; padding-right: 5px" for="edit-script-group" class="translate">name</label>
<select style="display: inline-block" id="edit-script-group"></select>
<input style="display: inline-block; width: 200px" id="edit-script-name">
</td>
<td id="script-buttons" style="width: calc(100% - 410px);">
<label for="edit-script-debug" style="display: inline-block; padding-left: 25px" class="translate">debug</label>
<input id="edit-script-debug" type="checkbox" />
<label for="edit-script-verbose" style="display: inline-block; padding-left: 15px" class="translate">verbose</label>
<input id="edit-script-verbose" type="checkbox" />
<select style="float: right" id="edit-script-engine-type"></select>
<label for="edit-script-engine-type" style="float: right; padding-right: 5px" class="translate">engine type</label>
</td>
</tr></table>
</td>
</tr>
<tr>
<td colspan="2">
<table style="width: 100%"><tr>
<td><button id="script-edit-button-save"></button></td>
<td><button id="script-edit-button-cancel"></button></td>
<td class="edit-wrap-lines"><input id="edit-wrap-lines" type="checkbox"/></td>
<td class="edit-wrap-lines"><label class="translate" for="edit-wrap-lines">Wrap&nbsp;lines</label></td>
<td style="width: 100%"><span style="display: none; font-weight: bold; padding-left: 20px; text-decoration: none" id="global_hint"><a href="https://git.spacen.net/yunkong2/yunkong2.javascript#global-functions" target="_blank" class="translate" style="text-decoration: none; color: #40bf40">global_hint</a></span></td>
<td><button id="edit-export-blocks" class="translate script-edit"></button></td>
<td><button id="edit-import-blocks" class="translate script-edit"></button></td>
<td><button id="edit-check-blocks" class="translate script-edit" style="white-space: nowrap;">Check blocks</button></td>
<td><button id="show-blockly-id" class="translate script-edit">Show code</button></td>
<td><button class="translate script-edit edit-cron-id">Cron</button></td>
<td><button id="edit-insert-id" class="translate script-edit">Insert ID</button></td>
</tr></table>
</td>
</tr>
<tr style="height: 100%;" class="script-edit">
<td colspan="2" style="height: 100%; width: 100%; position: relative">
<div style="position: absolute; top: 0; bottom: 0; width: 10px" id="height-editor"></div>
<div id="script-editor" style="height: 100%; width: 100%"></div>
<div id="blockly-editor" style="height: 100%; width: 100%; overflow: hidden"></div>
<div id="builder-widgets" class="bootstrap" style="height: 100%; width: 100%; overflow: hidden"></div>
</td>
</tr>
</table>
</div>
<div style="height: 20%; width: 100%; display: flex; flex-direction: row; flex-wrap: nowrap" id="script-output-tab" class="script-edit">
<div style="width: 30px">
<table>
<tr><td class="translate" style="font-family: arial, sans-serif; font-weight: bold">Log</td></tr>
<tr><td><button id="script-output-clear"></button></td></tr>
<tr><td><button id="script-output-down"></button></td></tr>
</table>
</div>
<div style="overflow-x: auto; overflow-y: auto; width: calc(100% - 30px)">
<table style="width: 100%">
<thead>
<col width="80px"/>
<col width="50px"/>
<col width="*"/>
</thead>
<tbody id="script-output" ></tbody>
</table>
</div>
</div>
</div>
</div>
<div id="dialog-script" style="display: none">
<table style="height: 100%; width: 100%;">
<tr>
<td>
<button class="translate edit-cron-id">Cron</button>
<button id="dialog-edit-insert-id" class="translate">Insert ID</button>
<label class="translate" for="dialog-edit-wrap-lines" style="padding-left: 20px; display: inline-block;">Wrap&nbsp;lines</label>
<input id="dialog-edit-wrap-lines" type="checkbox"/>
</td>
</tr>
<tr style="height: 100%;">
<td style="height: 100%;">
<div style="height: 100%; width: 100%" id="dialog-script-editor"></div>
</td>
</tr>
</table>
</div>
<div id="dialog-new-group" style="display: none">
<table style="width: 100%">
<tr>
<td><label for="edit-new-group-name" class="translate">new group name</label></td>
<td><input style="display: inline-block; width: 200px" id="edit-new-group-name"></td>
</tr>
<tr>
<td><label for="edit-new-group-group" class="translate">Create in:</label></td>
<td><select id="edit-new-group-group"></select></td>
</tr>
</table>
</div>
<div id="dialog-message" title="Message" style="display: none">
<p>
<span id="dialog-message-icon" class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 50px 0;"></span>
<span id="dialog-message-text"></span>
</p>
</div>
<div id="dialog-confirm" title="Question" style="display: none">
<p>
<span id="dialog-confirm-icon" class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 50px 0;"></span>
<span id="dialog-confirm-text"></span>
</p>
</div>
<div id="dialog-new-script" title="Select type" style="display: none; width: 550px; height: 170px">
<table style="width: 100%"><tr>
<td style="text-align: center"><img src="blockly.png" data-type="Blockly" class="dialog-new-script-button" /></td>
<td style="text-align: center"><img src="js.png" data-type="Javascript/js" class="dialog-new-script-button" /></td>
<td style="text-align: center"><img src="typescript.png" data-type="TypeScript/ts" class="dialog-new-script-button" /></td>
<!--td style="text-align: center"><img src="coffeescript.png" data-type="Coffeescript/coffee" class="dialog-new-script-button" /></td-->
<!--td style="text-align: center"><img src="rule.png" data-type="Rule" class="dialog-new-script-button" /></td-->
</tr>
</table>
</div>
<div id="dialog-select-member" style="display:none"></div>
<div id="dialog-cron" style="display: none">
<div id="div-cron"></div>
</div>
<div id="dialog-export-blockly" style="display: none">
<textarea id="dialog-export-blockly-textarea" style="width: 99%; height: 98%; font-size: 11px; resize: none;" readonly></textarea>
</div>
<div style="display: none; overflow: hidden; text-align: center;" id="dialog_import_scripts" title="import scripts" class="translateT">
<div class="import-drop-zone" style="display: none">
<div style="padding-top: 20%" class="translate import-drop-text"></div>
<input type="file" class="import-drop-file" style="display: none">
</div>
<div class="import-text-drop">
<span class="import-file-name translate">Drop files here or click to select one</span>
<span class="import-text-drop-plus">+</span>
</div>
<button id="start_import_scripts" class="translateB" style="margin: 20px">import&nbsp;scripts</button>
</div>
<xml id="toolbox" style="display: none">
<category><block>%%CUSTOM_BLOCKS%%</block></category>
<sep></sep>
<category name="{catLogic}" colour="0">
<block type="controls_if"></block>
<block type="logic_compare"></block>
<block type="logic_operation"></block>
<block type="logic_negate"></block>
<block type="logic_boolean"></block>
<block type="logic_null"></block>
<block type="logic_ternary"></block>
</category>
<category name="{catLoops}" colour="120">
<block type="controls_repeat_ext">
<value name="TIMES">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
</block>
<block type="controls_whileUntil"></block>
<block type="controls_for">
<value name="FROM">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="TO">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
<value name="BY">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="controls_forEach"></block>
<block type="controls_flow_statements"></block>
</category>
<category name="{catMath}" colour="230">
<block type="math_number"></block>
<block type="math_arithmetic">
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="math_single">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">9</field>
</shadow>
</value>
</block>
<block type="math_trig">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">45</field>
</shadow>
</value>
</block>
<block type="math_constant"></block>
<block type="math_number_property">
<value name="NUMBER_TO_CHECK">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
</block>
<block type="math_change">
<value name="DELTA">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="math_round">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">3.1</field>
</shadow>
</value>
</block>
<block type="math_rndfixed">
<value name="x">
<shadow type="math_number">
<field name="NUM">3.1234</field>
</shadow>
</value>
<value name="n">
<shadow type="math_number">
<field name="NUM">2</field>
</shadow>
</value>
</block>
<block type="math_on_list"></block>
<block type="math_modulo">
<value name="DIVIDEND">
<shadow type="math_number">
<field name="NUM">64</field>
</shadow>
</value>
<value name="DIVISOR">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
</block>
<block type="math_constrain">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">50</field>
</shadow>
</value>
<value name="LOW">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="HIGH">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="math_random_int">
<value name="FROM">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="TO">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="math_random_float"></block>
</category>
<category name="{catText}" colour="160">
<block type="text"></block>
<block type="text_newline"></block>
<block type="text_join"></block>
<block type="text_append">
<value name="TEXT">
<shadow type="text"></shadow>
</value>
</block>
<block type="text_length">
<value name="VALUE">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_isEmpty">
<value name="VALUE">
<shadow type="text">
<field name="TEXT"></field>
</shadow>
</value>
</block>
<block type="text_indexOf">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
<value name="FIND">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_charAt">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
</block>
<block type="text_getSubstring">
<value name="STRING">
<block type="variables_get">
<field name="VAR">{textVariable}</field>
</block>
</value>
</block>
<block type="text_changeCase">
<value name="TEXT">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
<block type="text_trim">
<value name="TEXT">
<shadow type="text">
<field name="TEXT">abc</field>
</shadow>
</value>
</block>
</category>
<category name="{catLists}" colour="260">
<block type="lists_create_with">
<mutation items="0"></mutation>
</block>
<block type="lists_create_with"></block>
<block type="lists_repeat">
<value name="NUM">
<shadow type="math_number">
<field name="NUM">5</field>
</shadow>
</value>
</block>
<block type="lists_length"></block>
<block type="lists_isEmpty"></block>
<block type="lists_indexOf">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_getIndex">
<value name="VALUE">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_setIndex">
<value name="LIST">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_getSublist">
<value name="LIST">
<block type="variables_get">
<field name="VAR">{listVariable}</field>
</block>
</value>
</block>
<block type="lists_split">
<value name="DELIM">
<shadow type="text">
<field name="TEXT">,</field>
</shadow>
</value>
</block>
<block type="lists_sort"></block>
</category>
<category name="{catColour}" colour="20">
<block type="colour_picker"></block>
<block type="colour_random"></block>
<block type="colour_rgb">
<value name="RED">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
<value name="GREEN">
<shadow type="math_number">
<field name="NUM">50</field>
</shadow>
</value>
<value name="BLUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
</block>
<block type="colour_blend">
<value name="COLOUR1">
<shadow type="colour_picker">
<field name="COLOUR">#ff0000</field>
</shadow>
</value>
<value name="COLOUR2">
<shadow type="colour_picker">
<field name="COLOUR">#3333ff</field>
</shadow>
</value>
<value name="RATIO">
<shadow type="math_number">
<field name="NUM">0.5</field>
</shadow>
</value>
</block>
</category>
<sep></sep>
<category name="{catVariables}" colour="330" custom="VARIABLE"></category>
<category name="{catFunctions}" colour="290" custom="PROCEDURE"></category>
</xml>
<script type="text/javascript" src="tab.js"></script>
</body>
</html>

846
admin/treeTable.js Normal file
View File

@ -0,0 +1,846 @@
(function ($) {
'use strict';
if ($.fn.treeTable) return;
function nodeExpand() {
var id = this.id;
var $table = this.row.parent().parent(); // table > tbody > tr
var options = $table.data('options');
if (options.name) {
options.expanded = options.expanded || [];
if (options.expanded.indexOf(id) === -1) {
options.expanded.push(id);
if (typeof Storage !== 'undefined') {
window.localStorage.setItem(options.name + '-treetable', JSON.stringify(options.expanded));
}
}
}
var parentNode = $table.treetable('node', id);
}
function nodeCollapse() {
var id = this.id;
var $table = this.row.parent().parent(); // table > tbody > tr
var options = $table.data('options');
if (options.name && options.expanded) {
var pos = options.expanded.indexOf(id);
if (pos !== -1) {
options.expanded.splice(pos, 1);
if (typeof Storage !== 'undefined') {
window.localStorage.setItem(options.name + '-treetable', JSON.stringify(options.expanded));
}
}
}
var parentNode = $table.treetable('node', id);
}
function filter($table, word) {
if (word) {
word = word.toLowerCase();
var options = $table.data('options');
$table.find('tr').each(function () {
if ($(this).hasClass('tree-table-main-header')) return;
if (!$(this).data('tt-branch') && $(this).find('td:first-child').text().indexOf(word) === -1) {
$(this).addClass('filtered-out');
} else {
$(this).removeClass('filtered-out');
}
});
var branch = '';
var isOneVisible = false;
// hide branches without children
$table.find('tr').each(function () {
if ($(this).data('tt-branch')) {
if (branch) {
if (!isOneVisible) {
$table.find('tr[data-tt-id="' + branch + '"]').addClass('filtered-out');
} else {
$table.find('tr[data-tt-id="' + branch + '"]').removeClass('filtered-out');
}
}
isOneVisible = false;
branch = $(this).data('tt-id');
} else if (branch) {
if (!$(this).hasClass('filtered-out')) isOneVisible = true;
}
});
if (branch) {
if (!isOneVisible) {
$table.find('tr[data-tt-id="' + branch + '"]').addClass('filtered-out');
} else {
$table.find('tr[data-tt-id="' + branch + '"]').removeClass('filtered-out');
}
}
} else {
$table.find('tr').removeClass('filtered-out');
}
}
function processMoveTasks(options, tasks, callback) {
if (!tasks || !tasks.length) {
callback && callback();
return;
}
var task = tasks.shift();
options.moveId && options.moveId(task.oldId, task.newId, function (err) {
setTimeout(function () {
processMoveTasks(options, tasks, callback);
}, 50);
});
}
function buildList(options, noButtons) {
var table = noButtons ? '' : '<div class="treetablelist-buttons"><button class="treetable-list-btn-ok"></button><button class="treetable-list-btn-cancel"></button></div>';
table += '<ul class="treetable-list">';
var rows = options.rows;
for (var i = 0; i < rows.length; i++) {
var parents = 0;
var current = rows[i];
while (current.parent) {
var found = false;
for (var j = 0; j < rows.length; j++) {
if (rows[j].id === current.parent) {
current = rows[j];
found = true;
break;
}
}
if (!found) break;
parents++;
}
var title = rows[i].title;
if (typeof title === 'object') {
title = title[systemLang] || title.en;
}
var isNotFolder = rows[i].instance === undefined ? 0 : 1;
table += '<li data-id="' + rows[i].id + '" class="' + (!isNotFolder ? 'treetable-list-folder' : 'treetable-list-item') + '" style="margin-left: ' + (parents * 19) + 'px; width: calc(100% - ' + (parents * 15 + 2 + isNotFolder * 7) + 'px);' +
(rows[i].id === 'script.js.global' ? 'color: rgb(0, 128, 0);' : '') + '">' +
(!isNotFolder ? '<span class="fancytree-expander"></span>' : '') + '<span class="fancytree-icon"></span>' + title + '</li>';
}
table += '</ul>';
var $dlg = $(this);
var $table = $(table);
$dlg.find('.treetablelist-buttons').remove();
$dlg.find('.treetable-list').remove();
$dlg.find('.tree-table-buttons').remove();
$dlg.find('.tree-table-main').remove();
$dlg.prepend($table);
var $buttons = $($table[0]);
var $list = $($table[1]);
$list.sortable({
cancel: '.treetable-list-folder',
axis: 'y'
}).data('options', options);
var that = this;
$buttons.find('.treetable-list-btn-ok').button({
icons: {primary: 'ui-icon-check'},
text: false
})
.css({width: 24, height: 24})
.on('click', function () {
// analyse new structure
var currentFolder = '';
var tasks = [];
$list.find('li').each(function () {
var id = $(this).data('id');
if ($(this).hasClass('treetable-list-folder')) {
currentFolder = id;
} else {
var parts = id.split('.');
var name = parts.pop();
if (parts.join('.') !== currentFolder) {
tasks.push({oldId: id, newId: currentFolder + '.' + name});
}
}
});
processMoveTasks(options, tasks, function () {
buildTable.call(that, options);
});
});
$buttons.find('.treetable-list-btn-cancel').button({
icons: {primary: 'ui-icon-cancel'},
text: false
})
.css({width: 24, height: 24})
.on('click', function () {
buildTable.call(that, options);
});
}
function getIconFromObj(obj, imgPath, classes) {
var icon = '';
var alt = '';
var isCommon = obj && obj.common;
if (isCommon) {
if (isCommon.icon) {
if (!isCommon.icon.match(/^data:image\//)) {
if (isCommon.icon.indexOf('.') !== -1) {
var instance;
if (obj.type === 'instance') {
icon = '/adapter/' + obj.common.name + '/' + obj.common.icon;
} else if (obj._id.match(/^system\.adapter\./)) {
instance = obj._id.split('.', 3);
if (obj.common.icon[0] === '/') {
instance[2] += obj.common.icon;
} else {
instance[2] += '/' + obj.common.icon;
}
icon = '/adapter/' + instance[2];
} else {
instance = obj._id.split('.', 2);
if (obj.common.icon[0] === '/') {
instance[0] += obj.common.icon;
} else {
instance[0] += '/' + obj.common.icon;
}
icon = '/adapter/' + instance[0];
}
} else {
return '<i class="material-icons ' + (classes || 'treetable-icon') + '">' + isCommon.icon + '</i>';
}
} else {
icon = isCommon.icon;
}
alt = obj.type;
} else {
imgPath = imgPath || 'lib/css/fancytree/';
if (obj.type === 'device') {
icon = imgPath + 'device.png';
alt = 'device';
} else if (obj.type === 'channel') {
icon = imgPath + 'channel.png';
alt = 'channel';
} else if (obj.type === 'state') {
icon = imgPath + 'state.png';
alt = 'state';
}
}
}
if (icon) return '<img class="' + (classes || 'treetable-icon') + '" src="' + icon + '" alt="' + alt + '" />';
return '';
}
// https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color
/*function invertColor(hex) {
if (hex.indexOf('#') === 0) {
hex = hex.slice(1);
}
// convert 3-digit hex to 6-digits.
if (hex.length === 3) {
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
}
if (hex.length !== 6) {
return false;
}
var r = parseInt(hex.slice(0, 2), 16),
g = parseInt(hex.slice(2, 4), 16),
b = parseInt(hex.slice(4, 6), 16);
// http://stackoverflow.com/a/3943023/112731
return (r * 0.299 + g * 0.587 + b * 0.114) <= 186;
}*/
function getUsersGroups(objects, groups) {
var usersGroups = {};
for (var g = 0; g < groups.length; g++) {
if (objects[groups[g]] && objects[groups[g]].common && objects[groups[g]].common.members) {
var users = objects[groups[g]].common.members;
for (var u = 0; u < users.length; u++) {
usersGroups[users[u]] = usersGroups[users[u]] || [];
var name = objects[groups[g]].common.name;
if (name && typeof name === 'object') {
name = name[systemLang] || 'en';
}
usersGroups[users[u]].push({id: groups[g], name: name || id.replace('system.group.', '')});
}
}
}
return usersGroups;
}
function buildTable(options) {
var table = '';
// detect materialize
var buttonTag = !options.isMaterial ? 'button' : 'a';
if (options.panelButtons) {
table += '<div class="row tree-table-buttons m">';
for (var z = 0; z < options.panelButtons.length; z++) {
table += '<' + buttonTag + ' class="btn-floating waves-effect waves-light blue btn-custom-' + z + '" title="' + (options.panelButtons[z].title || '') + '" ' + (options.panelButtons[z].id ? 'id="' + options.panelButtons[z].id + '"' : '') + '>';
// detect materialize
if (options.isMaterial) {
table += '<i class="material-icons">' + (options.panelButtons[z].icon || '') + '</i>';
}
table += '</' + buttonTag + '>';
}
if (options.moveId) {
table += '<' + buttonTag + ' class="btn-floating waves-effect waves-light blue treetable-sort" title="' + _('reorder') + '">';
// detect materialize
if (options.isMaterial) {
table += '<i class="material-icons">import_export</i>';
}
table += '</' + buttonTag + '>';
}
table += '</div>';
}
// build header
table += '<div class="row tree-table-body"><table class="tree-table-main">';
table += ' <thead>';
table += ' <tr class="tree-table-main-header">';
var withMembers = false;
for (var ch = 0; ch < options.columns.length; ch++) {
if (options.columns[ch] === 'members') {
withMembers = true;
continue;
}
if (options.columns[ch] === 'name') {
table += ' <th' + (options.widths && options.widths[ch] ? ' class="treetable-th-name" style="width: ' + options.widths[ch] + '"' : '') + '>';
table += ' <input placeholder="' + _('name') + '" class="filter_name treetable-filter" />';
table += ' <button data-id="filter_name" role="button" class="filter-clear"></button>';
table += ' </th>';
} else {
table += ' <th' + (options.widths && options.widths[ch] ? ' style="width: ' + options.widths[ch] + '"' : '') + '>' + _(options.columns[ch]) + '</th>';
}
}
if (options.buttons) {
table += ' <th' + (options.buttonsWidth ? ' style="width: ' + options.buttonsWidth + '"' : '') + '></th>';
}
table += ' </tr>';
table += '</thead>';
// build body
table += '<tbody>';
// <tr data-tt-id="system.adapter.0" data-tt-branch='true'>
var rows = [];
var rootEx = options.root ? new RegExp('^' + options.root.replace(/\./g, '\\.') + '\\.') : null;
var instances = options.columns.indexOf('instance') !== -1 ? [] : null;
for (var id in options.objects) {
if (!options.objects.hasOwnProperty(id)) continue;
var m;
if (instances && (
(options.objects[id].type === 'instance' && (m = id.match(/^system\.adapter\.javascript\.(\d+)$/))) ||
(options.objects[id].type === 'script' && options.objects[id].common && (m = options.objects[id].common.engine.match(/^system\.adapter\.javascript\.(\d+)$/)))
)) {
if (instances.indexOf(m[1]) === -1) {
instances.push(m[1]);
}
}
if (rootEx && !rootEx.test(id)) continue;
var common = options.objects[id].common;
var obj = {
id: id,
parent: null,
_class: 'treetable-' + options.objects[id].type
};
if (options.objects[id].type === 'channel') {
obj.folder = true;
}
for (var cb = 0; cb < options.columns.length; cb++) {
if (options.columns[cb] === 'instance') {
if (options.objects[id].type === 'script') {
obj.instance = common ? common.engine.split('.').pop() : 0;
}
} else if (common && options.columns[cb] !== 'id') {
var val = common[options.columns[cb]];
if (val !== undefined) {
obj[options.columns[cb]] = val;
}
}
}
if (options.members) {
obj.members = common.members;
}
if (options.colors) {
obj.color = common.color;
}
rows.push(obj);
}
// sort
rows.sort(function (a, b) {
if (a.id > b.id) return 1;
if (a.id < b.id) return -1;
return 0;
});
// find parents and extend members
for (var pp = 0; pp < rows.length; pp++) {
// find parent:
var parts = rows[pp].id.split('.');
var title = parts.pop();
var parent = parts.join('.');
rows[pp].title = title;
for (var p = 0; p < rows.length; p++) {
if (rows[p].id === parent) {
rows[pp].parent = parent;
rows[p].children = rows[p].children || [];
rows[p].children.push(pp);
break;
}
}
if (parts.length === 1) {
rows[pp]._class += ' treetable-root'
}
}
for (var ppp = 0; ppp < rows.length; ppp++) {
rows[ppp].realChildren = rows[ppp].children ? !!rows[ppp].children.length : false;
}
if (options.groups) {
var users = getUsersGroups(options.objects, options.groups);
for (var g = rows.length - 1; g >= 0; g--) {
rows[g].groups = users[rows[g].id] || [];
}
}
if (withMembers) {
for (var k = rows.length - 1; k >= 0; k--) {
// extend members
if (rows[k].members) {
rows[k].children = rows[k].children || [];
var members = Object.assign([], rows[k].members);
members.sort();
for (var mm = 0; mm < members.length; mm++) {
obj = {
id: members[mm],
title: members[mm],
parent: rows[k].id,
_class: 'treetable-member'
};
rows[k].children.push(members[mm]);
if (options.objects[obj.id]) {
var ccommon = options.objects[obj.id].common;
if (ccommon) {
for (var ccb = 0; ccb < options.columns.length; ccb++) {
var attr = options.columns[ccb];
if (attr === 'members' || attr === 'id' || attr === 'title' || attr === 'icon') continue;
var vval = ccommon[options.columns[ccb]];
if (vval !== undefined) {
obj[attr] = vval;
}
}
if (options.colors) {
obj.color = common.color;
}
}
}
rows.splice(k + 1, 0, obj);
}
delete rows[k].members;
}
}
}
var instSelect = '';
for (var i = 0; i < rows.length; i++) {
// title
table += '<tr data-tt-id="' + rows[i].id + '"' + (!!rows[i].children ? ' data-tt-branch="true"' : '') + (rows[i].parent ? ' data-tt-parent-id="' + rows[i].parent + '"' : '') + ' class="';
if (rows[i]._class) {
table += rows[i]._class + ' ';
}
if (options.draggable) {
table += options.draggable + ' ';
}
if (rows[i].children && rows[i].children.length) {
table += 'not-empty';
} else {
table += 'is-empty';
}
table += '">';
for (var c = 0; c < options.columns.length; c++) {
var aattr = options.columns[c];
if (options.columns[c] === 'members') {
continue;
}
var style = '';
var _class = (options.classes && options.classes[c]) || '';
if (aattr === 'groups') {
_class += ' m';
}
if (!c && rows[i].hasOwnProperty('children')) {
_class += ' treetable-folder fancytree-exp-c fancytree-has-children fancytree-ico-cf';
if (rows[i].id === 'script.js.global') {
style += ' color: rgb(0, 128, 0);'; // green
} else {
style += ' color: rgb(0, 0, 128);'
}
table += '<td style="' + style + '" class="' + _class + '">';
if (rows[i].children && rows[i].children.length) {
table += '<span class="treetable-counter">' + rows[i].children.length + '</span>';
}
} else {
table += '<td style="' + style + '" class="' + _class + '">';
}
if (!c && options.colors && rows[i].color) {
table += '<div style="background: ' + rows[i].color + '" class="treetable-color"></div>';
}
if (!c && options.icons) {
table += getIconFromObj(options.objects[rows[i].id], options.imgPath) || '<div class="treetable-icon-empty">&nbsp;</div>';
}
if (aattr === 'enabled') {
table += '<input data-attr="' + aattr + '" data-id="' + rows[i].id + '" class="treetable-input" type="checkbox" ' + (rows[i][aattr] ? 'checked' : '') + ' ' + (options.readOnly && options.readOnly[c] !== false ? 'disabled' : '') + '>';
} else
if (aattr === 'groups') {
for (var gg = 0; gg < rows[i].groups.length; gg++) {
var gId = rows[i].groups[gg].id;
table += '<div class="chip">' + getIconFromObj(options.objects[gId], null, '') + rows[i].groups[gg].name + '</div>'; //<i class="close material-icons" data-group="' + rows[i].groups[gg].id + '" data-user="' + rows[i].id + '">close</i></div>';
}
} else
// edit instance
if (aattr === 'instance') {
if (rows[i].instance !== undefined && instances.length > 1) {
instSelect = '<select class="treetable-instance" data-id="' + rows[i].id + '">';
for (var ii = 0; ii < instances.length; ii++) {
instSelect += '<option value="' + instances[ii] + '" ' + (instances[ii] === rows[i].instance ? 'selected' : '') + '>' + instances[ii] + '</option>';
}
instSelect += '</select>';
table += instSelect;
} else {
table += '<span>' + (rows[i].instance === undefined ? '' : rows[i].instance) + '</span>';
}
} else if (aattr === 'icon') {
table += getIconFromObj(options.objects[rows[i].id], options.imgPath);
} else {
var vall = rows[i][aattr] || '';
if (vall && typeof vall === 'object' && vall.en) {
vall = vall[systemLang] || vall.en;
}
table += '<span>' + vall + '</span>';
}
table += '</td>';
}
// add buttons
if (options.buttons) {
table += '<td class="treetable-buttons" style="' + (options.buttonsStyle || '') + '">';
var text = '';
for (var jj = 0; jj < options.buttons.length; jj++) {
if (false && options.buttons[jj].match && !options.buttons[jj].match(rows[i].id, rows[i].parent)) {
text += '<div class="treetable-button-empty">&nbsp;</div>';
} else {
text += '<' + buttonTag + ' data-id="' + rows[i].id + '" class="select-button-' + jj + ' select-button-custom td-button" style="margin-right: 3px;'+ '" data-parent="' + rows[i].parent + '" data-children="' + !!rows[i].realChildren + '" title="' + (options.buttons[jj].title || '') + '">';
// detect materialize
if (window.M && window.M.toast) {
text += '<i class="material-icons">' + (options.buttons[jj].icon || '') + '</i>';
}
text += '</' + buttonTag + '>';
}
}
table += text + '</td>';
}
table += '</tr>';
}
table += '</body>';
var $dlg = $(this);
var $table = $(table);
$dlg.find('span:first-child').remove();
$dlg.find('.treetablelist-buttons').remove();
$dlg.find('.treetable-list').remove();
$dlg.find('.tree-table-buttons').remove();
$dlg.find('.tree-table-main').remove();
$dlg.prepend($table);
options.rows = rows;
var $treeTable = $($table[1]).find('>table');
var $buttons = $($table[0]);
$treeTable.data('options', options);
$treeTable.treetable({
expandable: true,
clickableNodeNames: true,
expanderTemplate: '',
indenterTemplate: '<span class="fancytree-expander"></span><span class="fancytree-icon"></span>',
onNodeExpand: nodeExpand,
onNodeCollapse: nodeCollapse,
stringCollapse: _('collapse'),
stringExpand: _('expand')
});
var $tbody = $treeTable.find('tbody');
$tbody.on('click', 'tr', function() {
$('.selected').not(this).removeClass('selected');
$(this).addClass('selected');
var $table = $(this).parent().parent();
var options = $table.data('options');
var id = $(this).data('tt-id');
options.onChange && options.onChange($(this).data('tt-id'), options.oldId);
options.oldId = id;
});
if (options.buttons) {
for (var b = 0; b < options.buttons.length; b++) {
var $btn = $tbody.find('.select-button-' + b).button(options.buttons[b]).on('click', function () {
var cb = $(this).data('callback');
if (cb) {
cb.call($(this), $(this).data('id'), $(this).data('children'), $(this).data('parent'));
}
}).data('callback', options.buttons[b].click).attr('title', options.buttons[b].title || '');
if ($btn.length === 0) continue;
if (options.buttons[b].width) $btn.css({width: options.buttons[b].width});
if (options.buttons[b].height) $btn.css({height: options.buttons[b].height});
if (options.buttons[b].match) {
$btn.each(function () {
options.buttons[b].match.call($(this), $(this).data('id'));
});
}
}
}
if (options.panelButtons) {
for (var zz = 0; zz < options.panelButtons.length; zz++) {
var $zz = $buttons.find('.btn-custom-' + zz);
$zz
.on('click', options.panelButtons[zz].click)
.attr('title', options.panelButtons[zz].title || '');
// detect materialize
if (!options.isMaterial) {
$zz
.button(options.panelButtons[zz])
.css({width: 24, height: 24})
}
}
}
$treeTable.find('.filter_name').on('change', function () {
var timer = $(this).data('timer');
if (timer) {
clearTimeout(timer);
}
var $this = $(this);
$this.data('timer', setTimeout(function () {
$this.data('timer', null);
var val = $table.find('.filter_name').val();
if (val) {
$this.addClass('input-not-empty');
} else {
$this.removeClass('input-not-empty');
}
filter($($table[1]), $table.find('.filter_name').val());
}));
}).on('keyup', function () {
$(this).trigger('change');
});
$treeTable.find('.filter-clear')
.button({icons: {primary: 'ui-icon-close'}, text: false})
.on('click', function () {
var name = $(this).data('id');
$table.find('.' + name).val('').trigger('change');
});
var that = this;
$buttons.find('.treetable-sort')
.button({icons: {primary: 'ui-icon-arrowthick-2-n-s'}, text: false})
.css({width: 24, height: 24})
.on('click', function () {
buildList.call(that, options);
});
if (options.onEdit) {
$treeTable.find('.treetable-instance').on('change', function () {
options.onEdit($(this).data('id'), 'instance', $(this).val());
});
$treeTable.find('.treetable-input').on('change', function (e) {
e.stopPropagation();
var val;
if ($(this).attr('type') === 'checkbox') {
val = $(this).prop('checked');
} else {
val = $(this).val();
}
var id = $(this).data('id');
if (options.onEdit) {
if (options.onEdit(id, $(this).data('attr'), val) === false) {
// todo support more types
$(this).prop('checked', true);
}
}
}).on('keyup', function () {
$(this).trigger('change');
});
} else {
$treeTable.find('.treetable-instance').prop('disabled', true)
}
if (typeof options.onReady === 'function') {
options.onReady($treeTable);
}
}
function reInit() {
var $table = $(this).find('.tree-table-main');
// remember selected
var id = $table.find('.selected').data('tt-id');
var expanded = $table.find('.expanded');
var exIDs = [];
expanded.each(function (el) {
exIDs.push($(this).data('tt-id'));
});
var nameFilter = $table.find('.filter_name').val();
var options = $table.data('options');
buildTable.call(this, options);
$table = $(this).find('.tree-table-main');
for (var e = 0; e < exIDs.length; e++) {
try {
$table.treetable('expandNode', exIDs[e]);
} catch (e) {
}
}
if (id) {
var node = $table.treetable('node', id);
node && $table.treetable('reveal', id);
node && node.row && node.row.addClass('selected');
}
if (nameFilter) $table.find('.filter_name').val(nameFilter).trigger('change');
}
var methods = {
init: function (options) {
options.imgPath = options.imgPath || 'lib/css/fancytree/';
for (var i = 0; i < this.length; i++) {
buildTable.call(this[i], options);
if (typeof Storage !== 'undefined') {
var exIDs = window.localStorage.getItem(options.name + '-treetable');
if (exIDs) {
exIDs = JSON.parse(exIDs);
var $table = $(this[i]).find('.tree-table-main');
for (var e = 0; e < exIDs.length; e++) {
try {
$table.treetable('expandNode', exIDs[e]);
} catch (e) {
}
}
}
}
}
return this;
},
destroy: function () {
for (var i = 0; i < this.length; i++) {
var $table = $(this[i]).find('.tree-table-main');
if ($table.length && $table.data('options')) {
$table.data('options', null);
$(this[i]).html('');
}
}
},
expand: function (id) {
for (var i = 0; i < this.length; i++) {
var $table = $(this[i]).find('.tree-table-main');
try {
if (id) {
$table.treetable('expandNode', id);
} else {
$table.treetable('expandAll', id);
}
} catch (e) {
}
}
},
collapse: function (id) {
for (var i = 0; i < this.length; i++) {
var $table = $(this[i]).find('.tree-table-main');
try {
if (id) {
$table.treetable('collapseNode', id);
} else {
$table.treetable('collapseAll');
}
} catch (e) {
}
}
},
show: function (currentId, filter, onSuccess) {
if (typeof filter === 'function') {
onSuccess = filter;
filter = undefined;
}
if (typeof currentId === 'function') {
onSuccess = currentId;
currentId = undefined;
}
for (var i = 0; i < this.length; i++) {
var $table = $(this[i]).find('.tree-table-main');
$table.find('.selected').removeClass('selected');
try {
$table.treetable('reveal', currentId);
} catch (e) {
}
var node = $table.treetable('node', currentId);
node && node.row.addClass('selected');
}
onSuccess && onSuccess();
return this;
},
reinit: function () {
for (var i = 0; i < this.length; i++) {
reInit.call(this[i]);
}
return this;
},
'object': function (id, obj) {
for (var i = 0; i < this.length; i++) {
var $table = $(this[i]).find('.tree-table-main');
if ($table.updateTimer) {
clearTimeout($table.updateTimer);
}
var options = $table.data('options');
if (options && options.root && !id.match('^' + options.root.replace(/\./g, '\\.') + '\\.')) continue;
var elem = this[i];
// do not update too often. de-bounce it
(function (_elem, _$table) {
_$table.updateTimer = setTimeout(function () {
reInit.call(_elem);
}, 300);
})(elem, $table);
}
return this;
}
};
$.fn.treeTable = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method "' + method + '" not found in jQuery.treeTable');
}
};
})(jQuery);

BIN
admin/typescript.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

124
admin/words.js Normal file
View File

@ -0,0 +1,124 @@
// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n
/*global systemDictionary:true */
'use strict';
systemDictionary = {
"Acknowledged": { "en": "Acknowledged", "de": "Bestätigt", "ru": "Подтверждён", "pt": "Reconhecido", "nl": "Erkend", "fr": "Reconnu", "it": "Riconosciuto", "es": "Admitido"},
"Activated. Click to stop.": { "en": "Activated. Click to stop.", "de": "Aktiviert. Klicken zum Stoppen.", "ru": "Активно. Нажать для старта.", "pt": "Ativado. Clique para parar.", "nl": "Geactiveerd. Klik om te stoppen.", "fr": "Activé Cliquez pour arrêter.", "it": "Attivato. Clicca per interrompere.", "es": "Activado. Haga clic para detener."},
"All": { "en": "All", "de": "Alle", "ru": "все", "pt": "Todos", "nl": "Alle", "fr": "Tout", "it": "Tutti", "es": "Todas"},
"Are you sure to delete group <span style=\"color: blue\">%s</span> and <span style=\"color: red\">all</span> scripts in it?": {"en": "Are you sure to delete group <span style=\"color: blue\">%s</span> and <span style=\"color: red\">all</span> scripts in it?", "de": "Soll die Gruppe <span style=\"color: blue\">%s</span> und <span style=\"color: red\">alle</span> enthaltenen Skripte wirklich gelöscht werden?", "ru": "Are you sure to delete group <span style=\"color: blue\">%s</span> and <span style=\"color: red\">all</span> scripts in it?", "pt": "Você tem certeza de excluir os scripts do grupo <span style = \"color: blue\">% s </ span> e <span style = \"color: red\"> todos os scripts </ span> nele?", "nl": "Weet u zeker dat u <span style = \"color: blue\">% s </ span> en <span style = \"color: red\"> all </ span> scripts daarin moet verwijderen?", "fr": "Voulez-vous vraiment supprimer les scripts <span style = \"color: blue\">% s </ span> et <span style = \"color: red\"> all </ span> du groupe?", "it": "Sei sicuro di eliminare il gruppo <span style = \"color: blue\">% s </ span> e <span style = \"color: red\"> tutti gli script </ span> in esso contenuti?", "es": "¿Seguro que eliminará los scripts de grupo <span style = \"color: blue\">% s </ span> y <span style = \"color: red\"> all </ span> en él?"},
"Are you sure to delete script %s?": { "en": "Are you sure to delete script <span style=\"color: blue\">%s</span>?", "de": "Soll das Skript <span style=\"color: blue\">%s</span> wirklich gelöscht werden?", "ru": "Вы точно хотите удалить скрипт <span style=\"color: blue\">%s</span>?", "pt": "Tem certeza de excluir o script <span style = \"color: blue\">% s </ span>?", "nl": "Weet u zeker dat u het script <span style = \"color: blue\">% s </ span> wilt verwijderen?", "fr": "Êtes-vous sûr de vouloir supprimer le script <span style = \"color: blue\">% s </ span>?", "it": "Sei sicuro di eliminare lo script <span style = \"color: blue\">% s </ span>?", "es": "¿Seguro que borrarás el script <span style = \"color: blue\">% s </ span>?"},
"Cancel": { "en": "Cancel", "de": "Abbrechen", "ru": "Отмена", "pt": "Cancelar", "nl": "Annuleer", "fr": "Annuler", "it": "Annulla", "es": "Cancelar"},
"Check blocks": { "en": "Check blocks", "de": "Blöcke prüfen", "ru": "Проверить блоки", "pt": "Verificar blocos", "nl": "Controleer blokken", "fr": "Vérifier les blocs", "it": "Controllare i blocchi", "es": "Bloques de control"},
"Clear": { "en": "Clear", "de": "Löschen", "ru": "Сбросить", "pt": "Claro", "nl": "Duidelijk", "fr": "Clair", "it": "Chiaro", "es": "Claro"},
"Clear output": { "en": "Clear output", "de": "Ausgabe löschen", "ru": "Очистить выврд", "pt": "Limpar saída", "nl": "Uitvoer wissen", "fr": "Effacer la sortie", "it": "Uscita chiara", "es": "Salida clara"},
"Convert to Blockly": { "en": "Looks like it is a blockly script. Convert to Blockly?", "de": "Sieht wie ein Blockly Skript aus. Zu Blockly konvertieren?", "ru": "Похоже, что это Blockly скрипт. Поменять тип на Blockly?", "pt": "Parece que é um script bloqueado. Converter em Bloqueio?", "nl": "Het lijkt erop dat het een blokkerig script is. Converteer naar Blockly?", "fr": "On dirait que c'est un script blockly. Convertir en bloc?", "it": "Sembra che sia uno script di blocco. Converti in Blockly?", "es": "Parece que es un script blockly. Convertir a Blockly?"},
"Convert?": { "en": "Convert?", "de": "Konvertieren?", "ru": "Поменять тип на Blockly?", "pt": "Converter?", "nl": "Converteren?", "fr": "Convertir?", "it": "Convertire?", "es": "¿Convertir?"},
"Create in:": { "en": "Create in:", "de": "Erzeugen in:", "ru": "Создать в группе:", "pt": "Criar em:", "nl": "Creëer in:", "fr": "Créer dans:", "it": "Crea in:", "es": "Crear en:"},
"Create new group": { "en": "Create new group", "de": "Neue Gruppe erzeugen", "ru": "Создать новую группу", "pt": "Criar novo grupo", "nl": "Maak een nieuwe groep", "fr": "Créer un nouveau groupe", "it": "Crea nuovo gruppo", "es": "Crear nuevo grupo"},
"Cron": { "en": "Cron", "de": "Cron", "ru": "Cron", "pt": "Cron", "nl": "cron", "fr": "Cron", "it": "cron", "es": "Cron"},
"Cron expression": { "en": "Cron expression", "de": "Cron-Ausdruck", "ru": "Cron-Выражение", "pt": "Expressão de Cron", "nl": "Cron-expressie", "fr": "Cron expression", "it": "Espressione Cron", "es": "Expresión de Cron"},
"Day of Month": { "en": "Day of Month", "de": "Tag im Monat", "ru": "День месяца", "pt": "Dia do mês", "nl": "Dag van de maand", "fr": "Jour du mois", "it": "Giorno del mese", "es": "Dia del mes"},
"Deactivated. Click to start.": { "en": "Deactivated. Click to start.", "de": "Deaktiviert. Klicken zum Starten.", "ru": "Неактивно. Нажать для старта.", "pt": "Desativado. Clique para começar.", "nl": "Gedeactiveerd. Klik om te starten.", "fr": "Désactivé Cliquez pour commencer", "it": "Disattivato. Clicca per iniziare.", "es": "Desactivado Haga clic para comenzar."},
"Discard": { "en": "Discard", "de": "Verwerfen", "ru": "Не сохранять", "pt": "Descartar", "nl": "afdanken", "fr": "Jeter", "it": "Scartare", "es": "Descarte"},
"Do you want to save script %s?": { "en": "Do you want to save script %s?", "de": "Erst %s speichern?", "ru": "Прежде чем запустить, сохранить %s?", "pt": "Deseja salvar o script% s?", "nl": "Wilt u script% s opslaan?", "fr": "Voulez-vous enregistrer le script% s?", "it": "Vuoi salvare lo script% s?", "es": "¿Desea guardar el script% s?"},
"Drop files here or click to select one": { "en": "Drop files here or click to select one...", "de": "Datei hereinziehen oder klicken um eine auszuwählen...", "ru": "Перетащите файл сюда или нажмите, что бы выбрать...", "pt": "Solte arquivos aqui ou clique para selecionar um ...", "nl": "Zet hier bestanden neer of klik om er een te selecteren ...", "fr": "Déposez des fichiers ici ou cliquez pour en sélectionner un ...", "it": "Trascina i file qui o fai clic per selezionarne uno ...", "es": "Suelta los archivos aquí o haz clic para seleccionar uno ..."},
"Drop the files here": { "en": "Drop the files here", "de": "Hier hinzufügen", "ru": "Добавить...", "pt": "Solte os arquivos aqui", "nl": "Zet de bestanden hier neer", "fr": "Déposez les fichiers ici", "it": "Rilascia i file qui", "es": "Suelta los archivos aquí"},
"Edit": { "en": "Edit", "de": "Editieren", "ru": "Редактировать", "pt": "Editar", "nl": "Bewerk", "fr": "modifier", "it": "modificare", "es": "Editar"},
"Edit script": { "en": "Edit script", "de": "Skript editieren", "ru": "Редактировать скрипт", "pt": "Editar script", "nl": "Bewerk script", "fr": "Modifier le script", "it": "Modifica script", "es": "Script de edición"},
"Error": { "en": "Error", "de": "Fehler", "ru": "Ошибка", "pt": "Erro", "nl": "Fout", "fr": "Erreur", "it": "Errore", "es": "Error"},
"Every": { "en": "Every", "de": "Jede(n)", "ru": "Каждую(ый)", "pt": "Cada", "nl": "elk", "fr": "Chaque", "it": "Ogni", "es": "Cada"},
"Existing scripts will be overwritten. Are you sure?": {"en": "Existing scripts will be overwritten. Are you sure?", "de": "Aktuelle Skripte werden überschrieben. Sicher?", "ru": "Существующие скрипты будут переписаны. Вы уверены?", "pt": "Os scripts existentes serão substituídos. Você tem certeza?", "nl": "Bestaande scripts worden overschreven. Weet je het zeker?", "fr": "Les scripts existants seront écrasés. Êtes-vous sûr?", "it": "Gli script esistenti verranno sovrascritti. Sei sicuro?", "es": "Los guiones existentes serán sobrescritos. ¿Estás seguro?"},
"Export": { "en": "Export all scripts", "de": "Export von allen Skripten", "ru": "Экспорт всех скриптов", "pt": "Exporte todos os scripts", "nl": "Exporteer alle scripts", "fr": "Exporter tous les scripts", "it": "Esporta tutti gli script", "es": "Exportar todos los scripts"},
"Export blocks": { "en": "Export blocks", "de": "Blöcke exportieren", "ru": "Экспорт блоков", "pt": "Exportar blocos", "nl": "Blokken exporteren", "fr": "Exporter des blocs", "it": "Esporta blocchi", "es": "Bloques de exportación"},
"Export selected blocks": { "en": "Export selected blocks", "de": "Export ausgewählter Blöcke", "ru": "Экспорт выбранных блоков", "pt": "Exportar blocos selecionados", "nl": "Geselecteerde blokken exporteren", "fr": "Exporter les blocs sélectionnés", "it": "Esporta blocchi selezionati", "es": "Exportar bloques seleccionados"},
"From": { "en": "From: ", "de": "Von", "ru": "От", "pt": "A partir de:", "nl": "Van:", "fr": "De:", "it": "A partire dal:", "es": "De:"},
"ID": { "en": "ID", "de": "ID", "ru": "ID", "pt": "identidade", "nl": "ID kaart", "fr": "ID", "it": "ID", "es": "CARNÉ DE IDENTIDAD"},
"Import": { "en": "Import all scripts", "de": "Import von allen Skripten", "ru": "Импорт всех скриптов", "pt": "Importar todos os scripts", "nl": "Importeer alle scripts", "fr": "Importer tous les scripts", "it": "Importa tutti gli script", "es": "Importar todos los scripts"},
"Import blocks": { "en": "Import blocks", "de": "Blöcke importieren", "ru": "Импорт блоков", "pt": "Blocos de importação", "nl": "Blokken importeren", "fr": "Importer des blocs", "it": "Importa blocchi", "es": "Bloques de importación"},
"Import selected blocks": { "en": "Import of blocks", "de": "Import von Blöcken", "ru": "Импорт блоков", "pt": "Importação de blocos", "nl": "Import van blokken", "fr": "Importation de blocs", "it": "Importazione di blocchi", "es": "Importación de bloques"},
"Insert": { "en": "Insert", "de": "Einfügen", "ru": "Вставить", "pt": "Inserir", "nl": "invoegen", "fr": "Insérer", "it": "Inserire", "es": "Insertar"},
"Insert ID": { "en": "Insert&nbsp;ID", "de": "ID&nbsp;einfügen", "ru": "Вставить&nbsp;ID", "pt": "Inserir & nbsp; ID", "nl": "Plaats & nbsp; ID", "fr": "Insérer & nbsp; ID", "it": "Inserisci & nbsp; ID", "es": "Insertar & nbsp; ID"},
"Instance": { "en": "Instance", "de": "Wird ausgeführt von ", "ru": "Выполняется в ", "pt": "Instância", "nl": "Aanleg", "fr": "Exemple", "it": "Esempio", "es": "Ejemplo"},
"Invalid file extenstion!": { "en": "Invalid file extenstion!", "de": "Ungültige Dateinamenserweiterung!", "ru": "Неправильный тип файла!", "pt": "Extensão de arquivo inválida!", "nl": "Ongeldige bestandsextensie!", "fr": "Extension de fichier invalide!", "it": "Estensione del file non valida!", "es": "Extensión de archivo inválida!"},
"Kb": { "en": "Kb", "de": "Kb", "ru": "Кб", "pt": "Kb", "nl": "Kb", "fr": "Kb", "it": "kb", "es": "Kb"},
"Last changed": { "en": "Last changed", "de": "Letzte Änderung", "ru": "Изменён", "pt": "Última modificação", "nl": "Laatst gewijzigd", "fr": "Dernière modification", "it": "Ultima modifica", "es": "Último cambio"},
"Loading...": { "en": "Processing...", "de": "Verarbeite...", "ru": "Обработка...", "pt": "Em processamento...", "nl": "Verwerken...", "fr": "En traitement...", "it": "In lavorazione...", "es": "Tratamiento..."},
"Log": { "en": "Log", "de": "Log", "ru": "Лог", "pt": "Registro", "nl": "Log", "fr": "Bûche", "it": "Login", "es": "Iniciar sesión"},
"Mb": { "en": "Kb", "de": "Mb", "ru": "Мб", "pt": "Kb", "nl": "Kb", "fr": "Kb", "it": "kb", "es": "Kb"},
"Members": { "en": "Members", "de": "Mitglieder", "ru": "Members", "pt": "Membros", "nl": "leden", "fr": "Membres", "it": "Utenti", "es": "Miembros"},
"Message": { "en": "Message", "de": "Meldung", "ru": "Сообщение", "pt": "mensagem", "nl": "Bericht", "fr": "Message", "it": "Messaggio", "es": "Mensaje"},
"Minutes Past the Hour": { "en": "Minutes Past the Hour", "de": "Minuten nach voller Stunde", "ru": "минут после полного часа", "pt": "Minutos Passados a Hora", "nl": "Minuten voorbij het uur", "fr": "Minutes passées l'heure", "it": "Minuti passato l'ora", "es": "Minutos después de la hora"},
"Name": { "en": "Name", "de": "Name", "ru": "Имя", "pt": "Nome", "nl": "Naam", "fr": "prénom", "it": "Nome", "es": "Nombre"},
"New group": { "en": "New group", "de": "Neue Gruppe", "ru": "Новая группа", "pt": "Novo grupo", "nl": "Nieuwe groep", "fr": "Nouveau groupe", "it": "Nuovo gruppo", "es": "Nuevo grupo"},
"New script": { "en": "New script", "de": "Neues Skript", "ru": "Новый скрипт", "pt": "Novo script", "nl": "Nieuw script", "fr": "Nouveau script", "it": "Nuovo script", "es": "Nueva secuencia de comandos"},
"Object %s yet exists": { "en": "Object <span style=\"color: red\">\"%s\"</span> already exists", "de": "Objekt <span style=\"color: red\">\"%s\"</span> existiert bereits", "ru": "Объект <span style=\"color: red\">\"%s\"</span> уже существует", "pt": "O objeto <span style = \"color: red\"> \"% s\" </ span> já existe", "nl": "Object <span style = \"color: red\"> \"% s\" </ span> bestaat al", "fr": "L'objet <span style = \"color: red\"> \"% s\" </ span> existe déjà", "it": "Object <span style = \"color: red\"> \"% s\" </ span> esiste già", "es": "El objeto <span style = \"color: red\"> \"% s\" </ span> ya existe"},
"Ok": { "en": "Ok", "de": "Ok", "ru": "Ok", "pt": "Está bem", "nl": "OK", "fr": "D'accord", "it": "Ok", "es": "De acuerdo"},
"Processing...": { "en": "Processing...", "de": "Verarbeite...", "ru": "Обработка...", "pt": "Em processamento...", "nl": "Verwerken...", "fr": "En traitement...", "it": "In lavorazione...", "es": "Tratamiento..."},
"Role": { "en": "Role", "de": "Rolle", "ru": "Роль", "pt": "Função", "nl": "Rol", "fr": "Rôle", "it": "Ruolo", "es": "Papel"},
"Room": { "en": "Room", "de": "Raum", "ru": "Комната", "pt": "Quarto", "nl": "Kamer", "fr": "Chambre", "it": "Camera", "es": "Habitación"},
"Save": { "en": "Save", "de": "Speichern", "ru": "Сохранить", "pt": "Salve ", "nl": "Opslaan", "fr": "sauvegarder", "it": "Salvare", "es": "Salvar"},
"Save?": { "en": "Save?", "de": "Speichern?", "ru": "Сохранить?", "pt": "Salve ?", "nl": "Opslaan?", "fr": "Sauvegarder?", "it": "Salvare?", "es": "¿Salvar?"},
"Script": { "en": "Script", "de": "Skript", "ru": "Скрипт", "pt": "Roteiro", "nl": "Script", "fr": "Scénario", "it": "copione", "es": "Guión"},
"Script changes are not saved. Discard?": { "en": "Script changes are not saved. Discard?", "de": "Änderungen sind nicht gespeichert. Verwerfen?", "ru": "Изменения не сохранены. Игнорировать?", "pt": "As alterações de script não são salvas. Descartar?", "nl": "Scriptwijzigingen worden niet opgeslagen. Gooi?", "fr": "Les modifications de script ne sont pas enregistrées. Jeter?", "it": "Le modifiche allo script non vengono salvate. Scartare?", "es": "Los cambios de script no se guardan. ¿Descarte?"},
"Script not saved": { "en": "Script not saved!", "de": "Skript ist nicht gespeichert!", "ru": "Скрипт не сохранён!", "pt": "Script não salvo!", "nl": "Script niet opgeslagen!", "fr": "Script non enregistré!", "it": "Script non salvato!", "es": "¡Script no guardado!"},
"Scripts": { "en": "Scripts", "de": "Skripte", "ru": "Скрипты", "pt": "Scripts", "nl": "scripts", "fr": "Scripts", "it": "Script", "es": "Guiones"},
"Scroll down": { "en": "Scroll down", "de": "Nach unten scrollen", "ru": "Вниз", "pt": "Rolar para baixo", "nl": "Naar beneden scrollen", "fr": "Défiler vers le bas", "it": "Scorri verso il basso", "es": "Desplazarse hacia abajo"},
"Select": { "en": "Select", "de": "Auswählen", "ru": "Выбрать", "pt": "Selecione", "nl": "kiezen", "fr": "Sélectionner", "it": "Selezionare", "es": "Seleccionar"},
"Select ID": { "en": "Select ID", "de": "ID auswählen", "ru": "Выбрать ID", "pt": "Selecione ID", "nl": "Selecteer ID", "fr": "Sélectionnez ID", "it": "Seleziona ID", "es": "Seleccione ID"},
"Set CRON": { "en": "Set", "de": "Übernehmen", "ru": "Перенять", "pt": "Conjunto", "nl": "set", "fr": "Ensemble", "it": "Impostato", "es": "Conjunto"},
"Show blockly": { "en": "Show Blockly", "de": "Zeige Blockly", "ru": "Показать Blockly", "pt": "Show Blockly", "nl": "Blokkerig weergeven", "fr": "Afficher le bloc", "it": "Mostra Blockly", "es": "Mostrar Blockly"},
"Show code": { "en": "Show code", "de": "Zeige Code", "ru": "Показать код", "pt": "Mostrar código", "nl": "Toon code", "fr": "Afficher le code", "it": "Mostra codice", "es": "Mostrar código"},
"Time stamp": { "en": "Time stamp", "de": "Zeitstempel", "ru": "Время", "pt": "Marca de horário", "nl": "Tijdstempel", "fr": "Horodatage", "it": "Data e ora", "es": "Marca de tiempo"},
"Time: Hour": { "en": "Time: Hour", "de": "Zeit: Stunde", "ru": "Время: Час", "pt": "Hora: Hora", "nl": "Tijd: uur", "fr": "Heure: Heure", "it": "Tempo: ora", "es": "Hora: Hora"},
"Time: Minute": { "en": "Time: Minute", "de": "Zeit: Minute", "ru": "Время: Минуты", "pt": "Hora: Minuto", "nl": "Tijd: minuut", "fr": "Heure: Minute", "it": "Tempo: minuto", "es": "Tiempo: Minuto"},
"Type": { "en": "Type", "de": "Typ", "ru": "Тип", "pt": "Tipo", "nl": "Type", "fr": "Type", "it": "genere", "es": "Tipo"},
"Value": { "en": "Value", "de": "Wert", "ru": "Значение", "pt": "Valor", "nl": "Waarde", "fr": "Valeur", "it": "Valore", "es": "Valor"},
"Wrap&nbsp;lines": { "en": "Wrap&nbsp;lines", "de": "Zeilenumbruch", "ru": "Перенос&nbsp;строк", "pt": "Enrolar & nbsp; linhas", "nl": "Wrap & nbsp; lijnen", "fr": "Wrap & nbsp; lignes", "it": "Wrap & nbsp; linee", "es": "Ajustar & nbsp; líneas"},
"You cannot go back!": { "en": "You cannot switch back to Blockly after this operation. Are you sure? (Use 'Show code' button to check the generated code)", "de": "Nach diesem Vorgang ist es nicht möglich zurück auf Blockly zu schalten. Sind Sie sich sicher? (Benutze 'Zeige Code'-Button um Code zu prüfen)", "ru": "Нельзя поменять тип скрипта обратно на Blockly. Вы уверены? (Используйте кнопку 'Показать код', что бы проверить код)", "pt": "Você não pode voltar para Bloquear após essa operação. Você tem certeza? (Use o botão \"Mostrar código\" para verificar o código gerado)", "nl": "U kunt na deze bewerking niet terugschakelen naar Blockly. Weet je het zeker? (Gebruik de knop 'Code weergeven' om de gegenereerde code te controleren)", "fr": "Vous ne pouvez pas revenir à Blockly après cette opération. Êtes-vous sûr? (Utilisez le bouton 'Afficher le code' pour vérifier le code généré)", "it": "Non è possibile tornare a Blockly dopo questa operazione. Sei sicuro? (Usa il pulsante 'Mostra codice' per controllare il codice generato)", "es": "No puede volver a Blockly después de esta operación. ¿Estás seguro? (Use el botón 'Mostrar código' para verificar el código generado)"},
"at": { "en": "at", "de": "um", "ru": "в", "pt": "em", "nl": "op", "fr": "à", "it": "a", "es": "a"},
"bytes": { "en": "bytes", "de": "Bytes", "ru": "байт", "pt": "bytes", "nl": "bytes", "fr": "octets", "it": "byte", "es": "bytes"},
"cancel": { "en": "Cancel", "de": "Abbrechen", "ru": "отменить", "pt": "Cancelar", "nl": "Annuleer", "fr": "Annuler", "it": "Annulla", "es": "Cancelar"},
"collapse": { "en": "collapse", "de": "Zuklappen", "ru": "свернуть", "pt": "colapso", "nl": "ineenstorting", "fr": "effondrer", "it": "crollo", "es": "colapso"},
"common": { "en": "Common", "de": "Allgemein", "ru": "Общие", "pt": "Comum", "nl": "Gemeenschappelijk", "fr": "Commun", "it": "Comune", "es": "Común"},
"copy": { "en": "copy", "de": "kopieren", "ru": "копировать", "pt": "cópia de", "nl": "kopiëren", "fr": "copie", "it": "copia", "es": "dupdo"},
"daysofmonth": { "en": "0th,1st,2nd,3rd,4th,5th,6th,7th,8th,9th,10th,11th,12th,13th,14th,15th,16th,17th,18th,19th,20th,21st,22nd,23rd,24th,25th,26ht,27th,28ht,29ht,30th,31st", "de": "0en,1en,2en,3en,4en,5en,6en,7en,8en,9en,10en,11en,12en,13en,14en,15en,16en,17en,18en,19en,20en,21en,22en,23en,24en,25en,26en,27en,28en,29en,30en,31en", "ru": "0,1го,2го,3го,4го,5го,6го,7го,8го,9го,10го,11го,12го,13го,14го,15го,16го,17го,18го,19го,20го,21го,22го,23го,24го,25го,26го,27го,28го,29го,30го,31го", "pt": "0th, 1st, 2nd, 3rd, 4th, 5th, 6th, 7th, 8th, 9th, 10th, 11th, 12th, 13th, 14th, 15th, 16th, 17th, 18th, 19th, 20th, 21st, 22nd, 23rd, 24th, 25º, 26ht, 27, 28ht, 29ht, 30th, 31st", "nl": "0, 1e, 2e, 3e, 4e, 5e, 6e, 7e, 8e, 9e, 10e, 11e, 12e, 13e, 14e, 15e, 16e, 17e, 18e, 19e, 20e, 21e, 22e, 23e, 24e, 25 26ht, 27, 28ht, 29ht, 30ste, 31ste", "fr": "0ème, 1er, 2ème, 3ème, 4ème, 5ème, 6ème, 7ème, 8ème, 9ème, 10ème, 11ème, 12ème, 13ème, 14ème, 15ème, 16ème, 17ème, 18ème, 19ème, 20ème, 21ème, 22ème, 23ème, 24ème, 25ème, 26ème, 27ème, 28ème, 29ème, 30ème, 31ème", "it": "0a, 1 °, 2 °, 3 °, 4 °, 5 °, 6 °, 7 °, 8 °, 9 °, 10 °, 11 °, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26ht, 27, 28ht, 29ht, 30, 31", "es": "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25th, 26ht, 27th, 28ht, 29ht, 30th, 31st"},
"daysofweek": { "en": "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", "de": "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", "ru": "Воскресение,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота", "pt": "Domingo segunda terça quarta quinta sexta sábado", "nl": "Zondag maandag dinsdag woensdag donderdag vrijdag zaterdag", "fr": "Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi", "it": "Domenica lunedì martedì mercoledì giovedì venerdì sabato", "es": "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"},
"debug": { "en": "Debug", "de": "Debug", "ru": "Debug", "pt": "Depurar", "nl": "debug", "fr": "Déboguer", "it": "mettere a punto", "es": "Depurar"},
"debug_help": { "en": "setState, writeFile will be disabled", "de": "setState, writeFile werden deaktiviert", "ru": "setState, writeFile будут отключены", "pt": "setState, writeFile será desativado", "nl": "setState, writeFile zal worden uitgeschakeld", "fr": "setState, writeFile sera désactivé", "it": "setState, writeFile sarà disabilitato", "es": "setState, writeFile se deshabilitará"},
"delete": { "en": "delete", "de": "löschen", "ru": "удалить", "pt": "excluir", "nl": "verwijderen", "fr": "effacer", "it": "Elimina", "es": "borrar"},
"delete script": { "en": "delete script", "de": "Skript löschen", "ru": "Удалить скрипт", "pt": "apagar o script", "nl": "verwijder script", "fr": "supprimer le script", "it": "cancella script", "es": "borrar script"},
"edit": { "en": "edit", "de": "ändern", "ru": "редактировать", "pt": "editar", "nl": "Bewerk", "fr": "modifier", "it": "modificare", "es": "editar"},
"edit file": { "en": "edit file", "de": "Datei editieren", "ru": "Редактировать", "pt": "editar arquivo", "nl": "bestand bewerken", "fr": "modifier le fichier", "it": "modifica file", "es": "editar archivo"},
"edit script": { "en": "edit script", "de": "Skript bearbeiten", "ru": "Редактироветь скрипт", "pt": "editar script", "nl": "bewerk script", "fr": "modifier le script", "it": "modifica script", "es": "editar script"},
"enabled": { "en": "enabled", "de": "Aktiviert", "ru": "активно", "pt": "ativado", "nl": "ingeschakeld", "fr": "activée", "it": "abilitato", "es": "habilitado"},
"engine": { "en": "engine", "de": "Ausführen mit", "ru": "Движок", "pt": "motor", "nl": "motor", "fr": "moteur", "it": "motore", "es": "motor"},
"engine type": { "en": "engine type", "de": "Enginetyp", "ru": "Тип движка", "pt": "tipo de motor", "nl": "motor type", "fr": "type de moteur", "it": "tipo di motore", "es": "tipo de motor"},
"expand": { "en": "expand", "de": "Aufmachen", "ru": "раскрыть", "pt": "expandir", "nl": "uitbreiden", "fr": "développer", "it": "espandere", "es": "expandir"},
"false": { "en": "false", "de": "false", "ru": "нет", "pt": "falso", "nl": "vals", "fr": "faux", "it": "falso", "es": "falso"},
"global": { "en": "global", "de": "Global", "ru": "глобальный", "pt": "global", "nl": "globaal", "fr": "global", "it": "globale", "es": "global"},
"global_hint": { "en": "Global script! (click here for help)", "de": "Globales Skript (klicke hier für Hilfe)", "ru": "Глобальный скрипт (описание)", "pt": "Script global! (clique aqui para obter ajuda)", "nl": "Wereldwijd script! (klik hier voor hulp)", "fr": "Script global! (cliquez ici pour de l'aide)", "it": "Script globale! (clicca qui per aiuto)", "es": "¡Guión global! (haga clic aquí para obtener ayuda)"},
"import scripts": { "en": "Import scripts", "de": "Skriptimport", "ru": "Импортировать скрипты", "pt": "Importar scripts", "nl": "Scripts importeren", "fr": "Importer des scripts", "it": "Importa script", "es": "Importar guiones"},
"import&nbsp;scripts": { "en": "Import&nbsp;scripts", "de": "Skriptimport", "ru": "Импортировать&nbsp;скрипты", "pt": "Importar & nbsp; scripts", "nl": "Import & nbsp; scripts", "fr": "Importer & nbsp; scripts", "it": "Import & nbsp; script", "es": "Importar & nbsp; scripts"},
"instance": { "en": "Inst.", "de": "Inst.", "ru": "Инст.", "pt": "Inst.", "nl": "Inst.", "fr": "Inst.", "it": "Inst.", "es": "Inst."},
"months": { "en": "January,February,March,April,May,June,July,August,September,October,November,December", "de": "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", "ru": "Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь", "pt": "Janeiro, fevereiro, março, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro", "nl": "Januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december", "fr": "Janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre", "it": "Gennaio, febbraio, marzo, aprile, maggio, giugno, luglio, agosto, settembre, ottobre, novembre, dicembre", "es": "Enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre"},
"name": { "en": "name", "de": "Name", "ru": "Имя", "pt": "nome", "nl": "naam", "fr": "prénom", "it": "nome", "es": "nombre"},
"new group name": { "en": "New group name:", "de": "Neuer Gruppenname", "ru": "Имя новой группы", "pt": "Novo nome do grupo:", "nl": "Nieuwe groepsnaam:", "fr": "Nouveau nom de groupe:", "it": "Nuovo nome del gruppo:", "es": "Nuevo nombre de grupo:"},
"new script": { "en": "new script", "de": "Neues Skript", "ru": "Новый скрипт", "pt": "novo script", "nl": "nieuw script", "fr": "nouveau script", "it": "nuovo script", "es": "nueva secuencia de comandos"},
"no blocks found": { "en": "No blocks found", "de": "Keine Blöcke gefunden", "ru": "Блоков нет", "pt": "Nenhum bloco encontrado", "nl": "Geen blokken gevonden", "fr": "Aucun bloc trouvé", "it": "Nessun blocco trovato", "es": "No se encontraron bloques"},
"no group": { "en": "NO GROUP", "de": "KEINE GRUPPE", "ru": "В корне", "pt": "SEM GRUPO", "nl": "GEEN GROEP", "fr": "Aucun groupe", "it": "NESSUN GRUPPO", "es": "NO GRUPO"},
"not properly connected": { "en": "This block is not properly connected to other blocks.", "de": "Dieser Block ist mit anderen nicht richtig verbunden.", "ru": "Этот блок неправильно соединён или не соединён с другими блоками", "pt": "Este bloco não está conectado corretamente a outros blocos.", "nl": "Dit blok is niet correct verbonden met andere blokken.", "fr": "Ce bloc n'est pas correctement connecté à d'autres blocs.", "it": "Questo blocco non è collegato correttamente ad altri blocchi.", "es": "Este bloque no está conectado correctamente a otros bloques."},
"of": { "en": "of", "de": "von", "ru": " ", "pt": "do", "nl": "van", "fr": "de", "it": "di", "es": "de"},
"ok": { "en": "Ok", "de": "Ok", "ru": "Ok", "pt": "Está bem", "nl": "OK", "fr": "D'accord", "it": "Ok", "es": "De acuerdo"},
"on": { "en": "on", "de": "am", "ru": " ", "pt": "em", "nl": "op", "fr": "sur", "it": "sopra", "es": "en"},
"on the": { "en": "on the", "de": "am", "ru": " ", "pt": "no", "nl": "op de", "fr": "sur le", "it": "sul", "es": "sobre el"},
"periods": { "en": "minute,hour,day,week,month,year", "de": "Minute,Stunde,Tag,Woche,Monat,Jahr", "ru": "минуту,час,день,неделю,месяц,год", "pt": "minuto, hora, dia, semana, mês, ano", "nl": "minuut, uur, dag, week, maand, jaar", "fr": "minute, heure, jour, semaine, mois, année", "it": "minuto, ora, giorno, settimana, mese, anno", "es": "minuto, hora, día, semana, mes, año"},
"permissionError": { "en": "Permission error", "de": "Zugriffsfehler", "ru": "Ошибка доступа", "pt": "Erro de permissão", "nl": "Toestemmingsfout", "fr": "Erreur d'autorisation", "it": "Errore di autorizzazione", "es": "Error de permiso"},
"reorder": { "en": "reorder", "de": "Neu ordnen", "ru": "Поменять порядок", "pt": "reordenar", "nl": "herschikken", "fr": "réorganiser", "it": "riordinare", "es": "reordenar"},
"restart script": { "en": "restart script", "de": "Skript neustarten", "ru": "Перезапустить скрипт", "pt": "reiniciar o script", "nl": "herstart script", "fr": "redémarrer le script", "it": "riavviare lo script", "es": "script de reinicio"},
"scripts_group": { "en": "Scripts", "de": "Skripte", "ru": "Скрипты", "pt": "Scripts", "nl": "scripts", "fr": "Scripts", "it": "Script", "es": "Guiones"},
"true": { "en": "true", "de": "ja", "ru": "да", "pt": "verdade", "nl": "waar", "fr": "vrai", "it": "vero", "es": "cierto"},
"verbose": { "en": "Verbose", "de": "Hilfe-Ausgaben", "ru": "Вывод отладки", "pt": "Verbo", "nl": "breedsprakig", "fr": "Verbeux", "it": "verboso", "es": "Verboso"},
"verbose_help": { "en": "Output of additional information for some functions.", "de": "Macht zusätzliche Ausgaben für einige Funktionen.", "ru": "Вывод дополнительной информации в лог для некоторых функций.", "pt": "Saída de informações adicionais para algumas funções.", "nl": "Uitvoer van aanvullende informatie voor sommige functies.", "fr": "Sortie d'informations supplémentaires pour certaines fonctions.", "it": "Output di informazioni aggiuntive per alcune funzioni.", "es": "Salida de información adicional para algunas funciones."},
"warning on this block": { "en": "Please fix the warning on this block.", "de": "Bitte die Warnung an diesem Block korrigieren.", "ru": "Исправте проблему с этим блоком", "pt": "Corrija o aviso neste bloco.", "nl": "Corrigeer de waarschuwing in dit blok.", "fr": "Veuillez corriger l'avertissement sur ce bloc.", "it": "Si prega di correggere l'avviso su questo blocco.", "es": "Por favor arregla la advertencia en este bloque."},
};

BIN
admin/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

25
appveyor.yml Normal file
View File

@ -0,0 +1,25 @@
version: 'test-{build}'
environment:
matrix:
- nodejs_version: '4'
- nodejs_version: '6'
- nodejs_version: '8'
- nodejs_version: '10'
platform:
- x86
- x64
clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%'
install:
- ps: 'Install-Product node $env:nodejs_version $env:platform'
- ps: '$NpmVersion = (npm -v).Substring(0,1)'
- ps: 'if($NpmVersion -eq 5) { npm install -g npm@5 }'
- ps: npm --version
- npm install
- npm install winston@2.3.1
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
test_script:
- echo %cd%
- node --version
- npm --version
- npm test
build: 'off'

2292
doc/de/blockly.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Some files were not shown because too many files have changed in this diff Show More